From a13b4861fdfdd2609d04fc6057459afbdade0699 Mon Sep 17 00:00:00 2001 From: Kevin Kern Date: Sun, 19 Jul 2026 15:47:46 +0200 Subject: [PATCH] Remove embedded model routing ownership --- .github/workflows/release.yml | 1 + CHANGELOG.md | 9 +- Cargo.lock | 167 +- Cargo.toml | 5 - README.md | 8 +- .../content/docs/agents/prompt-recipes.mdx | 4 +- apps/docs/content/docs/agents/quickstart.mdx | 4 +- apps/docs/content/docs/agents/skills.mdx | 4 +- .../docs/contributing/architecture.mdx | 4 +- .../content/docs/reference/cli-generated.mdx | 112 - apps/docs/content/docs/reference/cli.mdx | 4 +- .../reference/configuration-and-storage.mdx | 4 +- apps/docs/content/docs/troubleshooting.mdx | 2 +- apps/docs/lib/agent-recipes.ts | 2 +- apps/docs/scripts/verify-agent-journey.mjs | 2 +- apps/docs/scripts/verify-agent-recipes.mjs | 2 +- apps/docs/scripts/verify-reference.mjs | 11 + apps/docs/scripts/verify-shell.mjs | 9 +- docs/ARCHITECTURE.md | 6 +- docs/CLI_REFERENCE.md | 5 - docs/CODEX.md | 8 +- docs/EXAMPLE_WEBAPP.md | 9 +- docs/GOALS.md | 10 +- docs/INSTALL.md | 4 +- docs/MCP_CONTRACT.md | 2 +- docs/MODEL_ROUTING.md | 10 +- docs/ROUTING_BUNDLES.md | 33 +- docs/SKILLS.md | 8 +- docs/documentation/CONTRACT.md | 10 +- docs/fixtures/mcp-contract.json | 3 - package.json | 2 +- planr-routing/.env.example | 5 - planr-routing/Cargo.toml | 32 - planr-routing/alchemy.run.ts | 25 - planr-routing/docs/MODEL_ROUTING_POLICY.md | 90 - planr-routing/docs/PRESET_COMPOSITION.md | 38 - planr-routing/docs/PRESET_EVALUATION.md | 23 - planr-routing/docs/PRESET_REGISTRY.md | 30 - .../evaluations/preset-suite-v1.toml | 127 - .../evaluations/sol-terra-luna-codex-v2.toml | 142 - .../invalid-artifact-hash.json | 22 - .../invalid-dual-artifact-payload.json | 23 - .../invalid-unsupported-version.json | 14 - .../valid-balanced-codex.json | 188 - .../valid-balanced-mixed.json | 137 - .../host-bindings/claude-native.toml | 52 - planr-routing/host-bindings/codex-openai.toml | 206 - .../host-bindings/cursor-fable-grok.toml | 49 - .../host-bindings/cursor-openai.toml | 49 - planr-routing/host-bindings/mixed-host.toml | 140 - planr-routing/package.json | 27 - planr-routing/scripts/build-site.mjs | 87 - .../scripts/check-alchemy-runtime.mjs | 26 - planr-routing/scripts/cloudflare-test.mjs | 38 - .../scripts/regenerate-preset-catalog.mjs | 35 - planr-routing/src/lib.rs | 926 --- planr-routing/src/main.rs | 191 - planr-routing/usage-policies/balanced.toml | 50 - planr-routing/usage-policies/low-usage.toml | 50 - planr-routing/usage-policies/max-quality.toml | 50 - .../usage-policies/read-only-audit.toml | 50 - planr-routing/website/README.md | 73 - planr-routing/website/_headers | 7 - .../website/alchemy-runtime.test.mjs | 21 - planr-routing/website/app.mjs | 217 - planr-routing/website/build-catalog.mjs | 132 - planr-routing/website/build-site.test.mjs | 69 - planr-routing/website/catalog-model.mjs | 188 - planr-routing/website/catalog-model.test.mjs | 141 - .../website/cloudflare-launcher.test.mjs | 38 - planr-routing/website/data/catalog.json | 3943 ---------- planr-routing/website/index.html | 117 - planr-routing/website/serve.mjs | 41 - planr-routing/website/styles.css | 200 - plugins/planr/skills/planr-loop/SKILL.md | 7 +- pnpm-lock.yaml | 6769 ++++++++++------- pnpm-workspace.yaml | 2 +- scripts/verify-switchloom-cross-product.mjs | 1102 +++ src/app/agents.rs | 6 +- src/app/agents_init.rs | 6 +- src/app/mod.rs | 2 - src/app/routing.rs | 181 - src/cli.rs | 40 - src/main.rs | 1 - src/rolefiles.rs | 2 +- src/routing_bundle.rs | 1097 --- src/routing_bundle/tests.rs | 315 - tests/e2e.rs | 38 +- tests/routing_ownership.rs | 113 + 89 files changed, 5277 insertions(+), 12977 deletions(-) delete mode 100644 planr-routing/.env.example delete mode 100644 planr-routing/Cargo.toml delete mode 100644 planr-routing/alchemy.run.ts delete mode 100644 planr-routing/docs/MODEL_ROUTING_POLICY.md delete mode 100644 planr-routing/docs/PRESET_COMPOSITION.md delete mode 100644 planr-routing/docs/PRESET_EVALUATION.md delete mode 100644 planr-routing/docs/PRESET_REGISTRY.md delete mode 100644 planr-routing/evaluations/preset-suite-v1.toml delete mode 100644 planr-routing/evaluations/sol-terra-luna-codex-v2.toml delete mode 100644 planr-routing/fixtures/routing-bundle-v1/invalid-artifact-hash.json delete mode 100644 planr-routing/fixtures/routing-bundle-v1/invalid-dual-artifact-payload.json delete mode 100644 planr-routing/fixtures/routing-bundle-v1/invalid-unsupported-version.json delete mode 100644 planr-routing/fixtures/routing-bundle-v1/valid-balanced-codex.json delete mode 100644 planr-routing/fixtures/routing-bundle-v1/valid-balanced-mixed.json delete mode 100644 planr-routing/host-bindings/claude-native.toml delete mode 100644 planr-routing/host-bindings/codex-openai.toml delete mode 100644 planr-routing/host-bindings/cursor-fable-grok.toml delete mode 100644 planr-routing/host-bindings/cursor-openai.toml delete mode 100644 planr-routing/host-bindings/mixed-host.toml delete mode 100644 planr-routing/package.json delete mode 100644 planr-routing/scripts/build-site.mjs delete mode 100644 planr-routing/scripts/check-alchemy-runtime.mjs delete mode 100644 planr-routing/scripts/cloudflare-test.mjs delete mode 100644 planr-routing/scripts/regenerate-preset-catalog.mjs delete mode 100644 planr-routing/src/lib.rs delete mode 100644 planr-routing/src/main.rs delete mode 100644 planr-routing/usage-policies/balanced.toml delete mode 100644 planr-routing/usage-policies/low-usage.toml delete mode 100644 planr-routing/usage-policies/max-quality.toml delete mode 100644 planr-routing/usage-policies/read-only-audit.toml delete mode 100644 planr-routing/website/README.md delete mode 100644 planr-routing/website/_headers delete mode 100644 planr-routing/website/alchemy-runtime.test.mjs delete mode 100644 planr-routing/website/app.mjs delete mode 100644 planr-routing/website/build-catalog.mjs delete mode 100644 planr-routing/website/build-site.test.mjs delete mode 100644 planr-routing/website/catalog-model.mjs delete mode 100644 planr-routing/website/catalog-model.test.mjs delete mode 100644 planr-routing/website/cloudflare-launcher.test.mjs delete mode 100644 planr-routing/website/data/catalog.json delete mode 100644 planr-routing/website/index.html delete mode 100644 planr-routing/website/serve.mjs delete mode 100644 planr-routing/website/styles.css create mode 100644 scripts/verify-switchloom-cross-product.mjs delete mode 100644 src/app/routing.rs delete mode 100644 src/routing_bundle.rs delete mode 100644 src/routing_bundle/tests.rs diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 9a6e541..03d8d77 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -185,6 +185,7 @@ jobs: with: node-version: 24 registry-url: https://registry.npmjs.org + package-manager-cache: false - name: Download release assets env: diff --git a/CHANGELOG.md b/CHANGELOG.md index 4b4cfb4..0e1a9e1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,15 +11,16 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), ### Fixed - Locked the client provisioning contract in CLI help, generated reference, docs, and E2E tests: Codex installs project MCP/hooks but no project roles or skills; Claude Code installs project MCP/standalone roles/hooks while its plugin owns skills; Cursor installs project MCP/roles/skills/hooks. `--no-mcp` skips only MCP, and `--no-hooks` independently skips hooks. +- Removed the current routing-bundle application surface from Planr docs, generated references, tests, and release wording. Planr now documents only provider-neutral repository declarations and route evidence; optional routing lifecycle is external and repository-local, with Switchloom v0.2.0 as an external tool rather than something Planr invokes, installs, or uninstalls. ## [1.5.0] - 2026-07-17 -Routing policy becomes an optional package instead of a responsibility compiled into Planr Core. Planr keeps the provider-neutral declaration, evidence, and safe repository transaction boundary; `planr-routing` owns volatile model and host knowledge. +Routing policy became an optional package instead of a responsibility compiled into Planr Core. This section is historical: the routing-bundle application boundary described here was removed in 1.5.1. ### Changed -- Hard-cut opinionated model routing out of Planr Core. Core now owns only the provider-neutral registry, route resolution and evidence, plus strict RoutingBundle v1 inspect/preview/apply. The independently buildable `planr-routing` workspace package owns named policies, exact models and effort, Codex/Claude Code/Cursor/mixed-host bindings, generated roles and skills, evaluation, signing, registry data, and catalog publication. -- Removed the legacy preset CLI, MCP tools, Rust modules, root policy fixtures, and root website ownership without aliases or compatibility layers. The replacement flow compiles a bundle with `planr-routing` and applies it through `planr routing bundle`; no command edits user configuration. +- Hard-cut opinionated model routing out of Planr Core. At the time, Core owned the provider-neutral registry, route resolution and evidence, plus strict RoutingBundle v1 inspect/preview/apply. The independently buildable `planr-routing` workspace package owned named policies, exact models and effort, Codex/Claude Code/Cursor/mixed-host bindings, generated roles and skills, evaluation, signing, registry data, and catalog publication. +- Removed the legacy preset CLI, MCP tools, Rust modules, root policy fixtures, and root website ownership without aliases or compatibility layers. The historical replacement flow compiled a bundle with `planr-routing` and applied it through `planr routing bundle`; no command edited user configuration. - Catalog entries remain deterministic, experimental, and unrecommended. Offline or caller-asserted evidence cannot promote them. Detached signatures and signed bundles require an independently supplied trusted signer and Ed25519 public key. - Hardened repository application against parent/child artifact collisions and rollback residue. Global Codex, Claude Code, Cursor, shell, keychain, credential, and XDG sentinels remain unchanged across bundle application. @@ -34,7 +35,7 @@ Verified presets turn model routing from a hand-authored host configuration into - Reproducible preset evaluation through `planr agents preset evaluate`: versioned challenge tasks, Planr-read artifact hashes, task-bound outcome oracles, lifecycle thresholds, optional live-host execution, and independently pinned Ed25519 telemetry receipts. Recommendations require complete, current, trusted route and usage evidence; offline estimates and incomplete runs cannot recommend. - Optional signed preset registry commands (`verify`, preview-first `import`, and offline `list`) with immutable manifest-hash-addressed caching, lifecycle and compatibility checks, separately provisioned maintainer trust, and re-verification of cached content. Active projects and previously imported packs continue working when the registry is unavailable. - Public [Planr Preset Catalog](https://planr-test-catalog.office-35d.workers.dev/) generated from the canonical verifier and evaluation report. Repository-owned Alchemy/Cloudflare tooling builds an allowlisted static publication, deploys an isolated `test` stage, and ships restrictive response headers without storing private signing keys in the site or deployment environment. -- Detailed guides for [preset composition](planr-routing/docs/PRESET_COMPOSITION.md), [evaluation](planr-routing/docs/PRESET_EVALUATION.md), and the [registry](planr-routing/docs/PRESET_REGISTRY.md), plus CLI, MCP-contract, architecture, and deployment documentation. +- Historical guides covered preset composition, evaluation, and the registry, plus CLI, MCP-contract, architecture, and deployment documentation. ### Security diff --git a/Cargo.lock b/Cargo.lock index 9d219b1..77763f3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -100,12 +100,6 @@ version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53" -[[package]] -name = "base64ct" -version = "1.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2af50177e190e07a26ab74f8b1efbfe2ef87da2116221318cb1c2e82baf7de06" - [[package]] name = "bitflags" version = "2.13.0" @@ -226,12 +220,6 @@ dependencies = [ "windows-sys", ] -[[package]] -name = "const-oid" -version = "0.9.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" - [[package]] name = "cpufeatures" version = "0.2.17" @@ -251,43 +239,6 @@ dependencies = [ "typenum", ] -[[package]] -name = "curve25519-dalek" -version = "4.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97fb8b7c4503de7d6ae7b42ab72a5a59857b4c937ec27a3d4539dba95b5ab2be" -dependencies = [ - "cfg-if", - "cpufeatures", - "curve25519-dalek-derive", - "digest", - "fiat-crypto", - "rustc_version", - "subtle", - "zeroize", -] - -[[package]] -name = "curve25519-dalek-derive" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "der" -version = "0.7.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" -dependencies = [ - "const-oid", - "zeroize", -] - [[package]] name = "deranged" version = "0.5.8" @@ -319,30 +270,6 @@ dependencies = [ "crypto-common", ] -[[package]] -name = "ed25519" -version = "2.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "115531babc129696a58c64a4fef0a8bf9e9698629fb97e9e40767d235cfbcd53" -dependencies = [ - "pkcs8", - "signature", -] - -[[package]] -name = "ed25519-dalek" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70e796c081cee67dc755e1a36a0a172b897fab85fc3f6bc48307991f64e4eca9" -dependencies = [ - "curve25519-dalek", - "ed25519", - "serde", - "sha2", - "subtle", - "zeroize", -] - [[package]] name = "encode_unicode" version = "1.0.0" @@ -383,12 +310,6 @@ version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9f1f227452a390804cdb637b74a86990f2a7d7ba4b7d5693aac9b4dd6defd8d6" -[[package]] -name = "fiat-crypto" -version = "0.2.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" - [[package]] name = "find-msvc-tools" version = "0.1.9" @@ -444,17 +365,6 @@ dependencies = [ "version_check", ] -[[package]] -name = "getrandom" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" -dependencies = [ - "cfg-if", - "libc", - "wasi", -] - [[package]] name = "getrandom" version = "0.4.2" @@ -641,16 +551,6 @@ version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" -[[package]] -name = "pkcs8" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" -dependencies = [ - "der", - "spki", -] - [[package]] name = "pkg-config" version = "0.3.33" @@ -665,7 +565,6 @@ dependencies = [ "assert_cmd", "clap", "cliclack", - "ed25519-dalek", "predicates", "rusqlite", "serde", @@ -679,19 +578,6 @@ dependencies = [ "uuid", ] -[[package]] -name = "planr-routing" -version = "0.1.0" -dependencies = [ - "anyhow", - "clap", - "ed25519-dalek", - "serde", - "serde_json", - "sha2", - "toml", -] - [[package]] name = "portable-atomic" version = "1.13.1" @@ -768,15 +654,6 @@ version = "6.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" -[[package]] -name = "rand_core" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" -dependencies = [ - "getrandom 0.2.17", -] - [[package]] name = "regex" version = "1.12.3" @@ -820,15 +697,6 @@ dependencies = [ "smallvec", ] -[[package]] -name = "rustc_version" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" -dependencies = [ - "semver", -] - [[package]] name = "rustix" version = "1.1.4" @@ -942,15 +810,6 @@ version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba" -[[package]] -name = "signature" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" -dependencies = [ - "rand_core", -] - [[package]] name = "slab" version = "0.4.12" @@ -979,28 +838,12 @@ version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e8e2fb0f499abb4d162f2bedad68f5ef91a1682b5a03596ddb67efd37768d100" -[[package]] -name = "spki" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" -dependencies = [ - "base64ct", - "der", -] - [[package]] name = "strsim" version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" -[[package]] -name = "subtle" -version = "2.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" - [[package]] name = "syn" version = "2.0.117" @@ -1019,7 +862,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd" dependencies = [ "fastrand", - "getrandom 0.4.2", + "getrandom", "once_cell", "rustix", "windows-sys", @@ -1168,7 +1011,7 @@ version = "1.23.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "144d6b123cef80b301b8f72a9e2ca4370ddec21950d0a103dd22c437006d2db7" dependencies = [ - "getrandom 0.4.2", + "getrandom", "js-sys", "wasm-bindgen", ] @@ -1194,12 +1037,6 @@ dependencies = [ "libc", ] -[[package]] -name = "wasi" -version = "0.11.1+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" - [[package]] name = "wasip2" version = "1.0.3+wasi-0.2.9" diff --git a/Cargo.toml b/Cargo.toml index e2c84b2..a46f474 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -19,7 +19,6 @@ path = "src/main.rs" anyhow = "1" clap = { version = "4", features = ["derive"] } cliclack = "0.5.4" -ed25519-dalek = "2" rusqlite = { version = "0.32", features = ["bundled"] } serde = { version = "1", features = ["derive"] } serde_json = "1" @@ -49,7 +48,3 @@ tempfile = "3" lto = "thin" codegen-units = 1 strip = "symbols" - -[workspace] -members = ["planr-routing"] -resolver = "2" diff --git a/README.md b/README.md index c8c1b35..09a895c 100644 --- a/README.md +++ b/README.md @@ -54,7 +54,7 @@ Manual downloads, from-source builds, and client wiring details: [Install Guide] ## Install The Plugin (Skills) -The plugin under `plugins/planr` carries the ten Planr workflow skills. Optional model-routing roles come from repository-local routing bundles. The `planr` CLI (above) is required separately. +The plugin under `plugins/planr` carries the ten Planr workflow skills. Optional model-routing declarations live in repository-local files such as `.planr/agents.toml` and `.planr/policy.toml`; external tools may manage those files, but Planr does not install or invoke a routing engine. The `planr` CLI (above) is required separately.
@@ -112,7 +112,7 @@ planr prompt cli ## Tell Your Agent -Remember one public entry point: `$planr`. It routes the request from live Planr state, including planning-only work and autonomous-goal preparation. Stage skills are advanced surfaces selected by the router. +Remember one public entry point: `$planr`. It routes ordinary planning and status work from live Planr state. For long autonomous runs, use the explicit two-step workflow: `$planr-goal` prepares durable state, then `$planr-loop` executes the resulting plan. Start a new product from an idea: @@ -126,7 +126,7 @@ split an MVP build plan, check it, then build the Planr map. Do not implement ye For a long autonomous run, prepare outside the driver first. The preparation result prints a real plan id; Codex or Claude Code then starts only the plan-bound loop driver: ```text -Use $planr to prepare an autonomous goal for the weekly overview feature. +Use $planr-goal to prepare an autonomous goal for the weekly overview feature. /goal Use $planr-loop on plan . The loop contract is stored in planr context (tag: goal-contract). @@ -140,7 +140,7 @@ Mid-project work (a new feature, refactor, or fix on an existing project) works ## What's new -- **1.5.0 — Optional routing policies:** Planr Core stays provider-neutral while the independently buildable `planr-routing` package owns model policies and host bindings for Codex, Claude Code, Cursor, and mixed-host setups. Start with [Routing Bundles](docs/ROUTING_BUNDLES.md), the [`planr-routing` guide](planr-routing/docs/MODEL_ROUTING_POLICY.md), and the [1.5.0 release notes](https://github.com/instructa/planr/releases/tag/v1.5.0). +- **1.5.1 — External routing boundary:** Planr consumes provider-neutral repository declarations and route evidence only. Optional model-routing lifecycle is external, for example [Switchloom v0.2.1](https://github.com/instructa/switchloom/releases/tag/v0.2.1) managing repository-local files outside Planr. Start with [Model Routing](docs/MODEL_ROUTING.md), [Switchloom](https://switchloom.ai), the [Switchloom repository](https://github.com/instructa/switchloom), its tagged [setup quickstart](https://github.com/instructa/switchloom/blob/v0.2.1/README.md#setup-from-the-website) and [lifecycle docs](https://github.com/instructa/switchloom/blob/v0.2.1/docs/preset-composition.md#repository-lifecycle-commands), and the [Changelog](CHANGELOG.md). - **1.4.0 — Verified presets:** Added policy-driven composition, evaluation, signed registry evidence, and the public catalog. See the [1.4.0 release notes](https://github.com/instructa/planr/releases/tag/v1.4.0). - **1.3.0 — Native host hooks:** Added automatic session-state injection and loop recovery for supported hosts. See the [Hooks guide](docs/HOOKS.md) and [1.3.0 release notes](https://github.com/instructa/planr/releases/tag/v1.3.0). diff --git a/apps/docs/content/docs/agents/prompt-recipes.mdx b/apps/docs/content/docs/agents/prompt-recipes.mdx index a9f1ac9..f25b5fb 100644 --- a/apps/docs/content/docs/agents/prompt-recipes.mdx +++ b/apps/docs/content/docs/agents/prompt-recipes.mdx @@ -3,7 +3,7 @@ title: Agent Prompt Recipes description: Copy accurate prompts for planning, autonomous preparation, status, recovery, and advanced direct routing. --- -Use `$planr` for normal work. These prompts describe intent and boundaries; the router reads live Planr state and chooses the correct stage. Replace “my request” with the outcome and proof that matter to you. +Use `$planr` for normal work. Autonomous delivery is the exception: prepare with `$planr-goal`, then execute only the generated `$planr-loop` handoff. Replace “my request” with the outcome and proof that matter to you. ## First request @@ -51,7 +51,7 @@ Recovery begins with map, lease, review, approval, log, and preview evidence. It ## Advanced direct entry points -Direct stage skills are optional precision controls for experienced users. They do not replace `$planr` as the documented default. +Direct stage skills are precision controls for experienced users. They do not replace `$planr` as the documented default for ordinary work; autonomous runs intentionally use `$planr-goal` followed by `$planr-loop`. ### `$planr-plan`: plan a bounded scope directly diff --git a/apps/docs/content/docs/agents/quickstart.mdx b/apps/docs/content/docs/agents/quickstart.mdx index 164cfb0..f56b620 100644 --- a/apps/docs/content/docs/agents/quickstart.mdx +++ b/apps/docs/content/docs/agents/quickstart.mdx @@ -5,8 +5,8 @@ description: Let Codex, Claude Code, or Cursor set up Planr safely and reach the This path delegates installation and project integration to your coding agent while keeping every mutation previewable and project-scoped. Choose exactly one client recipe below, paste its setup prompt, and wait for the receipt before asking for product work. - - After setup, start ordinary Planr requests with `$planr`. You do not need to choose `$planr-plan`, `$planr-goal`, or another stage skill. + + After setup, start ordinary Planr requests with `$planr`. For bounded autonomous delivery, use `$planr-goal` first and then the generated `$planr-loop` handoff. ## Codex setup diff --git a/apps/docs/content/docs/agents/skills.mdx b/apps/docs/content/docs/agents/skills.mdx index 55dec02..25e773f 100644 --- a/apps/docs/content/docs/agents/skills.mdx +++ b/apps/docs/content/docs/agents/skills.mdx @@ -5,7 +5,7 @@ description: Understand the one public entry skill and the advanced stage skills ## One skill to remember -`$planr` is the public router. It reads project, map, review, and approval state, combines that state with your intent, and dispatches exactly one appropriate workflow. Use it for features, fixes, plans, autonomous preparation, implementation, reviews, status, summaries, and recovery. +`$planr` is the public router for ordinary work. It reads project, map, review, and approval state, combines that state with your intent, and dispatches exactly one appropriate workflow for features, fixes, plans, implementation, reviews, status, summaries, and recovery. Autonomous runs use the explicit `$planr-goal` then `$planr-loop` handoff. @@ -27,7 +27,7 @@ Use a direct skill only when you deliberately want its narrower boundary. ## Routing examples - “Use `$planr`. Plan this only; do not implement.” routes to planning. -- “Use `$planr` to prepare this as an autonomous goal; do not implement during preparation.” routes to goal compilation. +- “Use `$planr-goal` to prepare this as an autonomous goal; do not implement during preparation.” compiles the goal and prints the `$planr-loop` handoff. - “Use `$planr`. What remains blocked?” routes to status. - “Use `$planr`. Continue the next verified item.” routes from live readiness to work or reports the blocker. diff --git a/apps/docs/content/docs/contributing/architecture.mdx b/apps/docs/content/docs/contributing/architecture.mdx index 6988441..691a144 100644 --- a/apps/docs/content/docs/contributing/architecture.mdx +++ b/apps/docs/content/docs/contributing/architecture.mdx @@ -3,7 +3,7 @@ title: Architecture and Ownership description: Put changes in Planr's canonical runtime, storage, integration, or documentation owner. --- -Planr V1 has one Rust binary, an independently buildable `planr-routing` workspace package, distribution wrappers, and one Next.js documentation application. Ownership follows behavior, not whichever file is easiest to edit. +Planr V1 has one Rust binary, distribution wrappers, and one Next.js documentation application. Ownership follows behavior, not whichever file is easiest to edit. ## Runtime owners @@ -18,7 +18,7 @@ Planr V1 has one Rust binary, an independently buildable `planr-routing` workspa | SQLite schema and additive upgrades | `src/storage/schema.rs` | | Row mapping and data access | `src/storage/rows.rs`, `src/app/repository/` | | Install metadata and MCP schemas | `src/integrations.rs` | -| Routing policy, host artifacts, and bundles | `planr-routing/` plus `src/routing_bundle.rs` | +| Provider-neutral agent registry and route evidence | `src/agents.rs`, `src/route_audit.rs`, `src/app/agents.rs` | Do not copy a shared mutation into each transport. Do not add catch-all `common`, `shared`, or broad utility modules. A new module must name a durable behavior or data boundary. diff --git a/apps/docs/content/docs/reference/cli-generated.mdx b/apps/docs/content/docs/reference/cli-generated.mdx index 3129c8d..dc8d011 100644 --- a/apps/docs/content/docs/reference/cli-generated.mdx +++ b/apps/docs/content/docs/reference/cli-generated.mdx @@ -18,7 +18,6 @@ Usage: planr [OPTIONS] Commands: agents Inspect the agent profile registry (.planr/agents.toml) that drives advisory model routing in pick packets - routing Inspect, preview, or apply a provider-neutral routing bundle policy project plan @@ -142,117 +141,6 @@ Options: -h, --help Print help ``` -### `planr routing` - -```text -Inspect, preview, or apply a provider-neutral routing bundle - -Usage: planr routing [OPTIONS] - -Commands: - bundle - help Print this message or the help of the given subcommand(s) - -Options: - --db Path to Planr SQLite database - --json Emit JSON output - --no-color Disable color in human output - -h, --help Print help -``` - -#### `planr routing bundle` - -```text -Usage: planr routing bundle [OPTIONS] - -Commands: - inspect Parse and validate a bundle without inspecting repository targets - preview Show exact repository-local actions without writing - apply Apply the already validated bundle transactionally inside this repository - help Print this message or the help of the given subcommand(s) - -Options: - --db Path to Planr SQLite database - --json Emit JSON output - --no-color Disable color in human output - -h, --help Print help -``` - -##### `planr routing bundle inspect` - -```text -Parse and validate a bundle without inspecting repository targets - -Usage: planr routing bundle inspect [OPTIONS] - -Arguments: - - -Options: - --db - Path to Planr SQLite database - --trusted-signer - Expected signer id for a signed bundle (paired with --trusted-public-key-file) - --json - Emit JSON output - --trusted-public-key-file - External Ed25519 public-key file for a signed bundle - --no-color - Disable color in human output - -h, --help - Print help -``` - -##### `planr routing bundle preview` - -```text -Show exact repository-local actions without writing - -Usage: planr routing bundle preview [OPTIONS] - -Arguments: - - -Options: - --db - Path to Planr SQLite database - --trusted-signer - Expected signer id for a signed bundle (paired with --trusted-public-key-file) - --json - Emit JSON output - --trusted-public-key-file - External Ed25519 public-key file for a signed bundle - --no-color - Disable color in human output - -h, --help - Print help -``` - -##### `planr routing bundle apply` - -```text -Apply the already validated bundle transactionally inside this repository - -Usage: planr routing bundle apply [OPTIONS] - -Arguments: - - -Options: - --db - Path to Planr SQLite database - --trusted-signer - Expected signer id for a signed bundle (paired with --trusted-public-key-file) - --json - Emit JSON output - --trusted-public-key-file - External Ed25519 public-key file for a signed bundle - --no-color - Disable color in human output - -h, --help - Print help -``` - ### `planr policy` ```text diff --git a/apps/docs/content/docs/reference/cli.mdx b/apps/docs/content/docs/reference/cli.mdx index 0efdb59..7f19a20 100644 --- a/apps/docs/content/docs/reference/cli.mdx +++ b/apps/docs/content/docs/reference/cli.mdx @@ -19,7 +19,7 @@ planr [--db ] [--json] [--no-color] | Graph execution | `item`, `link`, `pick`, `done`, `close`, `recover` | | Evidence and gates | `log`, `review`, `approval`, `context`, `note`, `artifact`, `event`, `trace` | | Inspection | `search`, `doctor`, `prime`, `debug`, `scrub` | -| Routing and policy | `agents`, `routing`, `policy` | +| Routing and policy | `agents`, `policy` | | Integration | `install`, `prompt`, `mcp`, `serve` | | Portability | `export`, `import`, plus low-level `map export`/`map import` | @@ -30,7 +30,7 @@ The [generated CLI reference](/docs/reference/cli-generated) contains every curr - Set `PLANR_WORKER_ID` for stable lease ownership. - Use `--plan` and `--work-type` on picks instead of filtering results afterward. - Treat a null pick as a successful query with a `reason`, not as a process crash. -- Preview `recover`, package import, item insert/replan/cancel, scrub, and routing bundle changes before confirmation/apply. +- Preview `recover`, package import, item insert/replan/cancel, and scrub before confirmation/apply. - Record commands actually run in logs; `--cmd` does not execute its string. - Never parse human tables when `--json` exists. diff --git a/apps/docs/content/docs/reference/configuration-and-storage.mdx b/apps/docs/content/docs/reference/configuration-and-storage.mdx index e79b262..eaadf7e 100644 --- a/apps/docs/content/docs/reference/configuration-and-storage.mdx +++ b/apps/docs/content/docs/reference/configuration-and-storage.mdx @@ -35,7 +35,9 @@ Precedence is explicit CLI flag, then environment, then workspace default where | `.mcp.json` | Claude project MCP configuration | | `.cursor/mcp.json`, `.cursor/agents/`, `.cursor/skills/` | Cursor project integration | -`planr install ... --dry-run` previews generated client paths. Routing bundles may write only allowlisted repository-local targets and refuse traversal, symlinks, conflicts, or user-global configuration. +`planr install ... --dry-run` previews generated client paths. Optional routing lifecycle is external to Planr; Planr only reads repository-local provider-neutral declarations and never edits user-global routing configuration. + +[Switchloom](https://switchloom.ai) owns published external routing lifecycle for its [repository](https://github.com/instructa/switchloom), [v0.2.1 release](https://github.com/instructa/switchloom/releases/tag/v0.2.1), [setup quickstart](https://github.com/instructa/switchloom/blob/v0.2.1/README.md#setup-from-the-website), and [repository lifecycle docs](https://github.com/instructa/switchloom/blob/v0.2.1/docs/preset-composition.md#repository-lifecycle-commands). Follow those external docs for Switchloom commands; Planr consumes only the resulting `.planr/agents.toml`, `.planr/policy.toml`, and route evidence. ## Privacy and backup diff --git a/apps/docs/content/docs/troubleshooting.mdx b/apps/docs/content/docs/troubleshooting.mdx index 94349b7..c45450d 100644 --- a/apps/docs/content/docs/troubleshooting.mdx +++ b/apps/docs/content/docs/troubleshooting.mdx @@ -37,7 +37,7 @@ The [Agent Quickstart](/docs/agents/quickstart) has the canonical client-specifi ## The agent asks me to choose a Planr skill -Start with `$planr` and state the outcome or boundary in plain English, such as “plan only; do not implement” or “report what is blocked.” The router reads live state and selects the stage. Direct `$planr-plan`, `$planr-goal`, and other stage skills are [advanced precision controls](/docs/agents/skills), not onboarding prerequisites. +Start with `$planr` for ordinary requests and state the outcome or boundary in plain English, such as “plan only; do not implement” or “report what is blocked.” The router reads live state and selects the stage. For autonomous delivery, use `$planr-goal` first, then only the generated `$planr-loop` handoff. Direct `$planr-plan` and other stage skills are [advanced precision controls](/docs/agents/skills), not onboarding prerequisites. ## Autonomous preparation started implementing diff --git a/apps/docs/lib/agent-recipes.ts b/apps/docs/lib/agent-recipes.ts index 8755add..9e42487 100644 --- a/apps/docs/lib/agent-recipes.ts +++ b/apps/docs/lib/agent-recipes.ts @@ -65,7 +65,7 @@ export const agentPrompts: AgentPrompts = { planOnly: 'Use $planr. Create and check the smallest build plan for my request, build its map, and do not implement yet.', autonomousPreparation: - 'Use $planr to prepare an autonomous goal for my request. Capture the outcome and observable proof, create and check the plan and map, store the goal contract, and return the plan-bound loop handoff. Do not implement during preparation.', + 'Use $planr-goal to prepare an autonomous goal for my request. Capture the outcome and observable proof, create and check the plan and map, store the goal contract, and return the plan-bound loop handoff. Do not implement during preparation.', generatedLoopHandoff: '/goal Use $planr-loop on plan . The loop contract is stored in planr context (tag: goal-contract). Continue until the contract holds or the iteration budget is exhausted.', portableLoopHandoff: diff --git a/apps/docs/scripts/verify-agent-journey.mjs b/apps/docs/scripts/verify-agent-journey.mjs index 12d5550..70b425b 100644 --- a/apps/docs/scripts/verify-agent-journey.mjs +++ b/apps/docs/scripts/verify-agent-journey.mjs @@ -54,7 +54,7 @@ for (const client of ['codex', 'claude', 'cursor']) { assert(quickstart.includes(``)); } assert(quickstart.includes(' --json/); const recipes = await read('agents/prompt-recipes.mdx'); diff --git a/apps/docs/scripts/verify-agent-recipes.mjs b/apps/docs/scripts/verify-agent-recipes.mjs index 55fb4f2..9f8b60a 100644 --- a/apps/docs/scripts/verify-agent-recipes.mjs +++ b/apps/docs/scripts/verify-agent-recipes.mjs @@ -191,7 +191,7 @@ const normalizedSnapshot = JSON.stringify(agentRecipes); const snapshotHash = createHash('sha256').update(normalizedSnapshot).digest('hex'); assert.equal( snapshotHash, - 'e0f84e111a8690904b11336937aba0c4a156a242d4c25adfe0880aed09588759', + '1c19ac87bdf0faae0b2e6ca2cdefaf6d8825f643989af49178d71dada204c4b6', `agent recipe snapshot changed (${snapshotHash}); inspect the full client contract before accepting it`, ); diff --git a/apps/docs/scripts/verify-reference.mjs b/apps/docs/scripts/verify-reference.mjs index 44a9165..ce8f0e4 100644 --- a/apps/docs/scripts/verify-reference.mjs +++ b/apps/docs/scripts/verify-reference.mjs @@ -94,6 +94,7 @@ try { const resources = responses[2].result.resources; const prompts = responses[3].result.prompts; const mcpPage = await readFile(path.join(docsRoot, 'content', 'docs', 'reference', 'mcp.mdx'), 'utf8'); + const configurationPage = await readFile(path.join(docsRoot, 'content', 'docs', 'reference', 'configuration-and-storage.mdx'), 'utf8'); for (const tool of tools) { const line = mcpPage.split('\n').find((candidate) => candidate.includes(`\`${tool.name}\``)); @@ -102,6 +103,16 @@ try { check(line.includes(`\`${required}\``), `MCP reference records required field ${tool.name}.${required}`); } } + + for (const link of [ + 'https://switchloom.ai', + 'https://github.com/instructa/switchloom', + 'https://github.com/instructa/switchloom/releases/tag/v0.2.1', + 'https://github.com/instructa/switchloom/blob/v0.2.1/README.md#setup-from-the-website', + 'https://github.com/instructa/switchloom/blob/v0.2.1/docs/preset-composition.md#repository-lifecycle-commands', + ]) { + check(configurationPage.includes(link), `Configuration reference links external Switchloom ownership: ${link}`); + } for (const resource of resources) check(mcpPage.includes(`\`${resource.uri}\``), `MCP reference covers resource ${resource.uri}`); for (const prompt of prompts) check(mcpPage.includes(`\`${prompt.name}\``), `MCP reference covers prompt ${prompt.name}`); check(responses[0].result.protocolVersion === '2025-03-26', 'MCP protocol version matches documented 2025-03-26'); diff --git a/apps/docs/scripts/verify-shell.mjs b/apps/docs/scripts/verify-shell.mjs index 738ec36..6275ed4 100644 --- a/apps/docs/scripts/verify-shell.mjs +++ b/apps/docs/scripts/verify-shell.mjs @@ -239,8 +239,9 @@ try { mobile: false, }); - const home = await navigate('/'); - assert(home.h1?.includes('Give every agent a plan.'), 'Homepage hero heading is missing'); + await navigate('/'); + const homeTitle = await evaluate(`document.getElementById('home-title')?.textContent?.trim()`); + assert(homeTitle?.includes('Give every agent a plan.'), 'Homepage hero heading is missing'); const homeContract = await evaluate(`({ plausibleScripts: [...document.querySelectorAll('script[data-domain="planr.so"][src="https://analytics.int.macherjek.com/js/script.js"]')].map((script) => ({ defer: script.defer })), nav: [...document.querySelectorAll('header a')].map((link) => link.textContent.trim()), @@ -450,7 +451,7 @@ try { })`); assert(JSON.stringify(agentQuickstartContract.clients) === JSON.stringify(['codex', 'claude', 'cursor']), 'Agent Quickstart client recipes are incomplete'); assert(agentQuickstartContract.copyButtons === 4, 'Agent Quickstart prompt copy controls are incomplete'); - assert(agentQuickstartContract.body?.includes('The only entry skill you need'), 'Agent Quickstart does not teach the public entry skill'); + assert(agentQuickstartContract.body?.includes('Start with the right entry'), 'Agent Quickstart does not teach the public entry boundary'); assert(agentQuickstartContract.breadcrumb === 'For Agents', 'Agent Quickstart breadcrumb did not render its collection'); await click('[data-agent-recipe="codex"] [data-testid="copy-command"]'); const setupPrompt = await waitFor(() => evaluate(`navigator.clipboard.readText()`), 'copied Codex setup prompt'); @@ -519,7 +520,7 @@ try { const referenceRoutes = [ ['/docs/reference', 'Reference', ['Source-to-page coverage', 'Generated CLI help', 'Support matrix']], - ['/docs/reference/cli-generated', 'Generated CLI Reference', ['planr routing bundle apply', 'planr review close', 'planr recover sweep']], + ['/docs/reference/cli-generated', 'Generated CLI Reference', ['planr review close', 'planr recover sweep']], ['/docs/reference/mcp', 'MCP Reference', ['planr_pick_item', 'planr://project/map', 'planr-summary']], ['/docs/reference/mcp-schemas-generated', 'Generated MCP Tool Schemas', ['additionalProperties', 'planr_pick_item', 'close_target']], ['/docs/reference/http-api', 'Local HTTP API', ['/health', '/v1/events/stream', '/v1/reviews/{id}/close', '127.0.0.1']], diff --git a/docs/ARCHITECTURE.md b/docs/ARCHITECTURE.md index fd33de2..2dc244c 100644 --- a/docs/ARCHITECTURE.md +++ b/docs/ARCHITECTURE.md @@ -6,7 +6,7 @@ Planr V1 is a single Rust binary with explicit module ownership. The crate stays - `src/`: the Rust CLI (module ownership below). - `tests/e2e.rs`: real CLI, MCP, HTTP, import, review-gate, run-log, and concurrent-pick tests. -- `plugins/planr/`: the installable plugin payload — all ten skills, independent Claude/Cursor worker and reviewer role assets, and the per-host plugin manifests. Native Codex role TOMLs are generated from the selected binding instead of shipped here. +- `plugins/planr/`: the installable plugin payload — all ten skills, independent Claude/Cursor worker and reviewer role assets, and the per-host plugin manifests. Planr does not ship model-pinned Codex roles. - `.agents/plugins/marketplace.json`, `.claude-plugin/marketplace.json`: marketplace manifests pointing Codex and Claude Code at `plugins/planr`. - `docs/`: user and contributor guides; `docs/planr-spec/` is the production specification package for Planr V1. - `examples/real-world-flow.md`: executable real-world operator flow. @@ -43,12 +43,10 @@ Planr V1 is a single Rust binary with explicit module ownership. The crate stays - `src/usage_policy.rs`: provider-neutral Usage Policy v1 core. Owns strict `.planr/policy.toml` parsing, policy and task-contract vocabulary, materiality classification, budget/concurrency validation, and the pure five-way transition resolver; it contains no provider ids, host dispatch, or execution-permission behavior. - `src/execution_policy.rs`: execution admission core. Owns per-role filesystem, network, tool/MCP, structured command, environment, hook, secret, and approval grants; permission-diff previews; bounded task-contract admission; fail-closed command grammar; and isolated write-scope concurrency. It never selects models or mutates graph state. `src/app/policy.rs` binds that pure decision to the current SQLite lease owner and pick token, and only treats an admission from that exact lease generation as authoritative. - `src/route_audit.rs`: provider-neutral run-observation contract. Owns strict requested/resolved/effective route stages, model/effort/fork enforcement confidence, transition provenance, policy/binding versions, and per-dimension metering confidence. It rejects requested-only values in the effective stage rather than inferring host execution. -- `src/routing_bundle.rs`: provider-neutral RoutingBundle v1 contract and repository transaction boundary. Owns validation, hashes, signatures, allowlisted paths, conflict and symlink rejection, atomic apply, rollback, and application receipts. -- `planr-routing/`: independently buildable workspace package that owns model policies, host bindings, generated host artifacts, probes, evaluation, signing, registry data, and catalog publication. - `src/app/agents.rs`: routing application boundary. Owns the `agents` and `item route` command handlers, the shared `*_value` JSON shapes reused by MCP, per-item route facts assembly, and registry-aware role content selection for installs. - `src/app/agents_init.rs`: registry bootstrap boundary. Owns `planr agents init` — the static cost-tiering scaffold and, per the agent-pool plan, the flag-spec builder and interactive wizard. - `src/integrations.rs`: agent-client integration descriptor boundary. Owns Codex, Claude Code, Cursor, MCP install metadata, MCP tool schemas, MCP resources, and MCP text response wrapping. -- `src/rolefiles.rs`: static host workflow roles and Cursor skill payloads. It does not select or pin models; generated routing artifacts belong to `planr-routing` bundles. +- `src/rolefiles.rs`: static host workflow roles and Cursor skill payloads. It does not select or pin models; externally generated routing artifacts stay outside Planr ownership. - `src/util.rs`: small CLI-boundary utilities. Owns ids, timestamps, path helpers, output formatting, and safe file writes. ## Boundary Rules diff --git a/docs/CLI_REFERENCE.md b/docs/CLI_REFERENCE.md index 12f8e01..068abdf 100644 --- a/docs/CLI_REFERENCE.md +++ b/docs/CLI_REFERENCE.md @@ -67,9 +67,6 @@ planr agents init [--force] planr agents init --profile|--skill|--route|--default-route|--interactive planr agents list [--json] planr agents check -planr routing bundle inspect -planr routing bundle preview -planr routing bundle apply planr doctor [--client codex|claude|cursor|all] planr install codex|claude|cursor [--dry-run] [--no-mcp] [--force] [--no-hooks] planr prompt cli|mcp|http [--client codex|claude|cursor|all] @@ -141,8 +138,6 @@ With `--json`, responses follow one convention so agents never guess where data `policy show` and `policy check` inspect the provider-neutral Usage Policy v1 file (`.planr/policy.toml`). A missing policy is an explicit successful state that preserves existing advisory routing; a malformed or unsafe policy fails `check` with parser/field diagnostics and leaves enforcement unavailable. Usage Policy v1 fixes delegation depth at one and keeps retry, availability fallback, quality escalation, quota downgrade, and safety stop as distinct transition contracts. Its separate `execution` section declares bounded per-role filesystem, network, tool/MCP, structured command, environment, hook, secret-reference, and approval grants. `policy admit ` requires the picked item's current `item_id` and `pick_token`, authorizes the current worker as lease owner, evaluates a bounded task contract before delegation, previews any permission addition, records the decision and lease generation, rejects unclassified commands and destructive or out-of-scope work, permits overlapping readers, and admits concurrent writers only for disjoint scopes isolated in distinct worktrees. Released or recovered leases never inherit historical admitted scopes. MCP `planr_policy_show`, `planr_policy_check`, and `planr_policy_admit`, plus HTTP `POST /v1/policy/admit`, call the same admission service and return the same decision shape. -`routing bundle inspect|preview|apply` is Planr Core's only policy-package boundary. It accepts RoutingBundle v1, validates payload hashes, restricts targets to allowlisted repository-local paths, rejects traversal, symlinks, parent/child collisions, conflicts, and unsupported versions, and applies the validated set atomically. Signed bundles require both `--trusted-signer` and an external `--trusted-public-key-file`; a key embedded beside the content is never trusted. It never edits user configuration. Named policies, model ids, host bindings, evaluation, signing, and catalog operations are provided by the optional `planr-routing` package. See [Routing Bundles](ROUTING_BUNDLES.md). - `agents init` writes a provider-neutral `.planr/agents.toml` scaffold or compiles explicit profile and route flags. `agents list` and `agents check` inspect it, while pick packets carry the resolved opaque profile, host, model, effort, tier, skill, route chain, and matched selector. Full guide: [Model Routing](MODEL_ROUTING.md). `log add` and `done` accept `--profile ` — the registry profile the run actually executed on (`PLANR_PROFILE` env is the fallback, so rendered role files can export it). They also accept `--route-audit ` for the strict three-stage observation contract. A route audit records each stage's model, effort, and context-fork value with enforcement state (`verified`, `requested_only`, `estimated`, or `unavailable`), an evidence-source enum, typed transition plus reason, policy/binding ids and versions, and wall-time/tool/token/credit values with independent confidence. It is stored in run metadata, projected into its durable log and trace, and emits local route-stage/transition events. The profile remains backward compatible: when it differs from the item's declared route, Planr emits advisory `route_mismatch_observed`. Runs without commands/tests record neither a run nor a route observation. MCP `planr_log_add` and HTTP item log accept the same optional `route_observation` object. diff --git a/docs/CODEX.md b/docs/CODEX.md index 166dbe4..8738cbf 100644 --- a/docs/CODEX.md +++ b/docs/CODEX.md @@ -22,15 +22,13 @@ $planr-goal The stop condition lives in Planr (`--tag goal-contract`), so a dead session resumes with the same starter line from zero chat context. -Optionally compile and apply a repository-local Codex routing bundle before starting the driver: +Optionally prepare repository-local routing declarations before starting the driver. Planr reads `.planr/agents.toml` and `.planr/policy.toml`; external tools such as [Switchloom v0.2.1](https://github.com/instructa/switchloom/releases/tag/v0.2.1) own any generated roles, application, or uninstall lifecycle: ```bash -planr-routing compile balanced --host codex-openai --output routing-bundle.json -planr routing bundle preview routing-bundle.json -planr routing bundle apply routing-bundle.json +planr agents check ``` -The bundle generates repository-local roles and a routing skill. Follow that generated skill exactly, restart after role changes, and confirm child metadata reports the expected model, effort, role path, and context-fork behavior. Full workflow: [Long-Running Goals](GOALS.md). +Follow any externally generated repository role instructions outside Planr, restart after role changes when your host requires it, and confirm child metadata reports the expected model, effort, role path, and context-fork behavior. Full workflow: [Long-Running Goals](GOALS.md). ## MCP diff --git a/docs/EXAMPLE_WEBAPP.md b/docs/EXAMPLE_WEBAPP.md index 0a456ad..246f1b7 100644 --- a/docs/EXAMPLE_WEBAPP.md +++ b/docs/EXAMPLE_WEBAPP.md @@ -53,12 +53,11 @@ planr agents check planr agents list ``` -Alternatively, an external policy package can compile a strict RoutingBundle v1. Preview and apply it through the generic Core boundary: +Alternatively, an external routing tool such as [Switchloom v0.2.1](https://github.com/instructa/switchloom/releases/tag/v0.2.1) can manage repository-local declarations and host roles outside Planr. After that external lifecycle step, Planr still sees only provider-neutral declarations: ```bash -planr routing bundle inspect routing-bundle.json -planr routing bundle preview routing-bundle.json -planr routing bundle apply routing-bundle.json +planr agents check +planr agents list --json ``` ## 2. Tag items by use case @@ -101,4 +100,4 @@ planr trace item A mismatch is recorded as advisory evidence instead of silently rewritten. Missing effective-host evidence stays unavailable and is never inferred from the registry. -One-off exceptions use `planr item route --set `; `--clear` restores policy resolution. See [Model Routing](MODEL_ROUTING.md) and [Routing Bundles](ROUTING_BUNDLES.md). +One-off exceptions use `planr item route --set `; `--clear` restores policy resolution. See [Model Routing](MODEL_ROUTING.md) and [External Routing Declarations](ROUTING_BUNDLES.md). diff --git a/docs/GOALS.md b/docs/GOALS.md index 4632b69..0d12641 100644 --- a/docs/GOALS.md +++ b/docs/GOALS.md @@ -87,15 +87,13 @@ Iteration 1 reads the map and the stored contract: items already settled stay se ### Codex with `/goal` -Install the plugin, initialize the repository, and optionally apply a repository routing bundle: +Install the plugin and initialize the repository. Optional routing declarations are repository-local and may be edited directly or managed by an external tool such as [Switchloom v0.2.1](https://github.com/instructa/switchloom/releases/tag/v0.2.1) before the run: ```bash codex plugin marketplace add instructa/planr codex plugin add planr@planr planr project init "My Product" -planr-routing compile balanced --host codex-openai --output routing-bundle.json -planr routing bundle preview routing-bundle.json -planr routing bundle apply routing-bundle.json +planr agents check ``` Then: @@ -105,7 +103,7 @@ $planr-goal # prep: plan, map, contract, starter command /goal Use $planr-loop on plan . The loop contract is stored in planr context (tag: goal-contract). ``` -When a routing bundle is applied, the `/goal` PM follows its generated repository skill and roles. The bundle owner decides exact models, effort, role names, and fork policy; Planr only carries the resulting opaque route in pick packets. Codex Automations use the same starter line. +When repository routing declarations exist, the `/goal` PM treats them as advisory dispatch input. The external routing owner decides exact models, effort, role names, fallback policy, and lifecycle; Planr only carries the resulting opaque route in pick packets and records observed evidence when workers provide it. Codex Automations use the same starter line. ### Claude Code @@ -147,7 +145,7 @@ Any MCP-capable agent uses the same flow over `planr mcp`. Every session starts A goal run has distinct roles with different intelligence needs. Planr represents those decisions as opaque profiles and routes; it does not choose providers, models, effort levels, fallback chains, or host-native role names. -An optional routing-policy package can map planning, exploration, implementation, mechanical work, and independent review onto different cost or quality tiers. If a routing bundle generated repository roles, follow its generated instructions and verify effective child metadata because declarations alone are not proof. The official package and its host-specific caveats live under [`planr-routing`](../planr-routing/docs/MODEL_ROUTING_POLICY.md); the Core contract is documented in [Model Routing](MODEL_ROUTING.md). +An optional external routing tool can map planning, exploration, implementation, mechanical work, and independent review onto different cost or quality tiers. If [Switchloom v0.2.1](https://github.com/instructa/switchloom/releases/tag/v0.2.1) or another repository-local process writes routing declarations or host roles, follow that tool's generated instructions outside Planr and verify effective child metadata because declarations alone are not proof. The Core contract is documented in [Model Routing](MODEL_ROUTING.md). ## Coming From Other Goal Tools diff --git a/docs/INSTALL.md b/docs/INSTALL.md index 0367b1a..e5b846c 100644 --- a/docs/INSTALL.md +++ b/docs/INSTALL.md @@ -72,7 +72,7 @@ planr prompt cli --client codex planr prompt http ``` -`planr install codex` writes a project MCP snippet and project hooks; its workflow skills come from the Codex plugin, and it writes no project roles or skills. `planr install claude` writes project `.mcp.json`, standalone worker/reviewer roles, and hooks; workflow skills come from the Claude Code plugin. `planr install cursor` writes project MCP, roles, all ten skills, and hooks, then prints an optional user-level MCP deeplink. Optional model pins come from a repository-local routing bundle. Dry-runs print the complete repository artifact and hook-reconciliation paths without writing them; no command silently edits global user configuration. +`planr install codex` writes a project MCP snippet and project hooks; its workflow skills come from the Codex plugin, and it writes no project roles or skills. `planr install claude` writes project `.mcp.json`, standalone worker/reviewer roles, and hooks; workflow skills come from the Claude Code plugin. `planr install cursor` writes project MCP, roles, all ten skills, and hooks, then prints an optional user-level MCP deeplink. Optional model pins come from repository-local routing declarations managed outside Planr. Dry-runs print the complete repository artifact and hook-reconciliation paths without writing them; no command silently edits global user configuration. `--no-mcp` skips only the project MCP artifact. Codex then reconciles hooks only; Claude Code writes standalone project roles and hooks but no project skills; Cursor writes project roles, skills, and hooks. Add `--no-hooks` to skip hooks as well. The Codex and Claude Code plugins remain the owners of their workflow skills. @@ -87,7 +87,7 @@ Open `http://127.0.0.1:7526/review` after `planr serve` for the local browser re ## Agent Skills And Plugin -The repository ships a plugin under `plugins/planr` for Codex and Claude Code that bundles all ten workflow skills; Claude Code additionally registers plugin worker/reviewer agents. The Codex plugin does not register project agents. Cursor receives the ten skills and both project agents through `planr install cursor` (or its plugin manifest). Model-specific role files are optional routing-bundle artifacts. The CLI above must be installed separately. See [Skills](SKILLS.md). +The repository ships a plugin under `plugins/planr` for Codex and Claude Code that bundles all ten workflow skills; Claude Code additionally registers plugin worker/reviewer agents. The Codex plugin does not register project agents. Cursor receives the ten skills and both project agents through `planr install cursor` (or its plugin manifest). Model-specific role files are optional repository-local artifacts owned by external routing lifecycle. The CLI above must be installed separately. See [Skills](SKILLS.md). ## From Source diff --git a/docs/MCP_CONTRACT.md b/docs/MCP_CONTRACT.md index 2b4f311..f8a4258 100644 --- a/docs/MCP_CONTRACT.md +++ b/docs/MCP_CONTRACT.md @@ -42,7 +42,7 @@ Required groups: - artifact add, list, and show - event list and debug bundle preview - trace item, log add, and log read (including three-stage route observations) -- provider-neutral RoutingBundle v1 inspection, repository-safe preview/apply, and durable application evidence +- provider-neutral agent registry reads and route overrides - review annotate, ingest, artifact, evidence, and close - item close, context create, and search diff --git a/docs/MODEL_ROUTING.md b/docs/MODEL_ROUTING.md index 7cc7ba0..ef5f719 100644 --- a/docs/MODEL_ROUTING.md +++ b/docs/MODEL_ROUTING.md @@ -28,12 +28,6 @@ Resolution order is per-item override, work type, plan, then default route. Unkn Workers may report observed routing with logs and route-audit evidence. Requested-only values never become effective proof; missing effective evidence remains explicitly unavailable. -Host-specific model policies and generated repository roles are optional. The `planr-routing` workspace package compiles them into RoutingBundle v1, and Core safely previews and applies that bundle: +Host-specific model policies, generated repository roles, and uninstall/application lifecycle are external to Planr. [Switchloom](https://switchloom.ai) [v0.2.1](https://github.com/instructa/switchloom/releases/tag/v0.2.1) can manage repository-local routing artifacts from its [repository](https://github.com/instructa/switchloom), [setup quickstart](https://github.com/instructa/switchloom/blob/v0.2.1/README.md#setup-from-the-website), and [repository lifecycle docs](https://github.com/instructa/switchloom/blob/v0.2.1/docs/preset-composition.md#repository-lifecycle-commands), but Planr does not install, invoke, compile, apply, or uninstall Switchloom output. After an external tool or operator changes `.planr/agents.toml` or `.planr/policy.toml`, run `planr agents check` and capture observed route evidence through `planr log add` or `planr done`. -```bash -planr-routing compile balanced --host codex-openai --output routing-bundle.json -planr routing bundle preview routing-bundle.json -planr routing bundle apply routing-bundle.json -``` - -Bundle application is restricted to the repository. Planr never edits user configuration such as `~/.codex/config.toml`. See [Routing Bundles](ROUTING_BUNDLES.md). +The hard boundary is provider-neutral: Planr consumes declarations and evidence; hosts and external routing tools decide whether any requested model, effort, role, or fallback actually ran. See [External Routing Declarations](ROUTING_BUNDLES.md). diff --git a/docs/ROUTING_BUNDLES.md b/docs/ROUTING_BUNDLES.md index 05fa0d8..a6b8da9 100644 --- a/docs/ROUTING_BUNDLES.md +++ b/docs/ROUTING_BUNDLES.md @@ -1,32 +1,15 @@ -# Routing bundles +# External routing declarations -Planr Core is provider-neutral. It parses `.planr/agents.toml`, resolves routes into pick packets, records declared-versus-observed evidence, and safely previews or applies a strict RoutingBundle v1: +Planr Core is provider-neutral. It parses `.planr/agents.toml`, resolves routes into pick packets, records declared-versus-observed evidence, and checks `.planr/policy.toml`. It does not own a bundle format, catalog, compiler, signer, installer, or uninstaller. -```bash -planr routing bundle inspect routing-bundle.json -planr routing bundle preview routing-bundle.json -planr routing bundle apply routing-bundle.json -``` - -Core accepts only allowlisted repository-local targets, verifies payload hashes, rejects absolute paths, traversal, symlinks, parent/child target collisions, conflicts, unsupported versions, and invalid payloads, and applies the validated set atomically. It never writes user configuration or files outside the repository. - -A signed bundle is accepted only with an independent trust anchor supplied to every inspect, preview, or apply call: +The current boundary is repository-local declaration plus evidence: ```bash -planr routing bundle inspect signed-bundle.json \ - --trusted-signer planr-maintainers \ - --trusted-public-key-file /absolute/path/to/maintainer.pub +planr agents init +planr agents check +planr agents list --json ``` -The bundle contains the signer id and signature, not a self-trusted public key. Both trust flags are required together; unsigned bundles require neither. An unsigned bundle also cannot label its evidence `verified` or `recommended`. - -The `planr-routing` workspace package owns all volatile opinions: named policies, exact model ids, host bindings, generated role and skill files, capability probes, evaluation scenarios, signing, registry data, and the website catalog. A normal flow is: - -```bash -planr-routing policy list -planr-routing compile balanced --host codex-openai --output routing-bundle.json -planr routing bundle preview routing-bundle.json -planr routing bundle apply routing-bundle.json -``` +External tools, including Switchloom v0.2.1, may create, update, apply, or uninstall repository-local routing artifacts. Those lifecycle operations happen outside Planr. Planr only consumes the resulting provider-neutral declarations and the route observations workers attach to logs. -The package emits the same provider-neutral bundle contract for Codex, Claude Code, Cursor, and mixed-host configurations. Offline evaluation remains experimental; a recommendation requires complete authenticated live-host evidence. Missing authentication or missing effective model, effort, role, or context-fork evidence cannot pass. +Because declarations are advisory, requested model values never become proof by themselves. Strong evidence keeps requested, host-resolved, and effective execution separate in route observations, with `unavailable` used when the host cannot prove what ran. diff --git a/docs/SKILLS.md b/docs/SKILLS.md index 93a195f..d0e4648 100644 --- a/docs/SKILLS.md +++ b/docs/SKILLS.md @@ -2,7 +2,7 @@ Planr ships agent-facing skill templates under `plugins/planr/skills/`. -The repository ships an installable plugin under `plugins/planr` for Codex and Claude Code, while Cursor receives the same skills through `planr install cursor`. Marketplace manifests at the repo root (`.agents/plugins/marketplace.json`, `.claude-plugin/marketplace.json`) point at that subdirectory — Codex silently ignores marketplaces whose plugin source is the repo root itself. The shared package carries skills and Claude's independent workflow roles; optional model-specific host roles come only from a repository-local routing bundle, never from Planr Core or static fallbacks. The `planr` CLI must be installed separately (`brew install instructa/tap/planr`). +The repository ships an installable plugin under `plugins/planr` for Codex and Claude Code, while Cursor receives the same skills through `planr install cursor`. Marketplace manifests at the repo root (`.agents/plugins/marketplace.json`, `.claude-plugin/marketplace.json`) point at that subdirectory — Codex silently ignores marketplaces whose plugin source is the repo root itself. The shared package carries skills and Claude's independent workflow roles; optional model-specific host roles come from repository-local routing declarations managed outside Planr, never from Planr Core or static fallbacks. The `planr` CLI must be installed separately (`brew install instructa/tap/planr`). ## Install As Plugin (preferred) @@ -84,7 +84,7 @@ Do not implement yet. End with the build plan id, critical lane, and first ready Example autonomous feature loop (two separate prompts): ```text -Use $planr to prepare an autonomous goal for the weekly overview feature. +Use $planr-goal to prepare an autonomous goal for the weekly overview feature. /goal Use $planr-loop on plan . The loop contract is stored in planr context (tag: goal-contract). @@ -146,7 +146,7 @@ What the router does with that, and why: Or autonomous in two prompts: ```text -Use $planr to prepare an autonomous goal for the auth system. +Use $planr-goal to prepare an autonomous goal for the auth system. /goal Use $planr-loop on plan . The loop contract is stored in planr context (tag: goal-contract). @@ -176,7 +176,7 @@ planr install claude # provisions Claude's independent planr install cursor # provisions Cursor's independent roles and skills ``` -Optional project-scoped model-routing files are generated by `planr-routing` bundles. Core workflow skills remain host-neutral, and bundle application never overwrites conflicts or writes user configuration. +Optional project-scoped model-routing files are repository-local declarations. They may be edited directly or managed by an external tool such as [Switchloom v0.2.1](https://github.com/instructa/switchloom/releases/tag/v0.2.1); Core workflow skills remain host-neutral, and Planr does not install, invoke, apply, or uninstall external routing artifacts. Dispatches stay one line: `Use $planr-work on item ` and `Use $planr-review on item `. The map and logs are the loop memory, so any iteration can resume from zero context. diff --git a/docs/documentation/CONTRACT.md b/docs/documentation/CONTRACT.md index 64c19f5..a0a99b6 100644 --- a/docs/documentation/CONTRACT.md +++ b/docs/documentation/CONTRACT.md @@ -13,7 +13,7 @@ When sources disagree, authors must use this order and disclose the disagreement 1. **Product intent and invariants:** `AGENTS.md` and `docs/planr-spec/`, especially `PRODUCT_SPEC.md`, `TECH_ARCHITECTURE.md`, and `API_AND_DATA_MODEL.md`. 2. **Released executable behavior:** compiled `planr --help` output, `src/cli.rs`, `src/app/mcp.rs`, `src/app/http.rs`, `src/model.rs`, and the tested fixture `docs/fixtures/mcp-contract.json`. Runtime sources decide whether a command, option, schema, endpoint, state, or error exists in the current release. 3. **Distribution contract:** `Cargo.toml`, `package.json`, `pnpm-workspace.yaml`, release workflows, installers, and release tests. These decide supported versions, artifacts, operating systems, and install commands. -4. **Existing explanatory material:** `README.md`, `docs/*.md`, `plugins/planr/skills/`, examples, and routing-package docs. These are migration inputs, not independent sources of truth. +4. **Existing explanatory material:** `README.md`, `docs/*.md`, `plugins/planr/skills/`, and examples. These are migration inputs, not independent sources of truth. 5. **External references:** official upstream documentation and inspected local projects may influence structure and implementation, but never define Planr behavior. If product intent is ahead of runtime, the public page must label the behavior as planned or omit it from executable instructions. If runtime is ahead of an older specification sentence, the public page documents the tested runtime and the discrepancy is added to the conflict register below. @@ -41,7 +41,7 @@ Use these terms exactly. Prefer the lowercase form in prose unless it starts a s | artifact | Item-linked or project evidence such as a report, screenshot, or review file. | attachment when referring to the stored object | | recovery sweep | A preview/apply operation for stale, timed-out, and retryable work. | automatic retry loop | | package | A reusable export/import bundle of graph and optional Planr artifacts. | backup unless that is the user's intent | -| routing bundle | A provider-neutral, validated set of repository-local routing artifacts. | model config | +| routing declaration | Provider-neutral repository data in `.planr/agents.toml` or `.planr/policy.toml`. | model config | | goal contract | Durable Planr context defining the completion oracle and stop condition. | prompt-only instruction | The canonical lifecycle is always: @@ -92,7 +92,7 @@ Use Next.js 16 App Router, Fumadocs MDX, and content under `apps/docs/content/do Rejected for this scope: - TanStack Start: AgentRig proves it is viable, but it adds routing/build decisions that Planr does not otherwise own and is not needed for a documentation-only app. -- A bespoke Rust-rendered site or the `planr-routing/website` static implementation: neither supplies the requested polished docs authoring/search system. +- A bespoke Rust-rendered site or an external routing-catalog static implementation: neither supplies the requested polished docs authoring/search system. ### DOC-ADR-003: Deploy direct static assets with Alchemy on Cloudflare @@ -137,7 +137,7 @@ These findings are explicit inputs to implementation and content review. | --- | --- | --- | | GAP-001 | `docs/CLI_REFERENCE.md` says it is generated from help but omits current commands including `project delete`, `plan list`, `map export/import`, `item show/cancel`, `link remove`, `log show/list`, `review request/list/show`, `note`, and `scrub`. | Replace the list with generated/mechanically checked reference data; retain editorial detail around it. | | GAP-002 | `docs/planr-spec/PRODUCT_SPEC.md` still calls Rust and the HTTP server open decisions, but the repository ships a Rust binary and `planr serve`. | Document current released behavior; update product specs only in a separately scoped product-spec change. | -| GAP-003 | `docs/ARCHITECTURE.md` describes one crate and one deployable while the root Cargo workspace includes the independent `planr-routing` member/package. | The architecture page must describe Planr Core and optional `planr-routing` ownership separately. | +| GAP-003 | Resolved on 2026-07-18: `docs/ARCHITECTURE.md` now describes Planr as one Rust binary plus wrappers/docs, with provider-neutral routing declarations owned in Core and external routing lifecycle outside Planr. | Keep architecture ownership aligned with current runtime modules and do not reintroduce routing-package ownership wording. | | GAP-004 | README leads with Homebrew, while `docs/INSTALL.md` calls GitHub Releases/repo installer canonical and Homebrew preferred day-to-day. | Say “Homebrew recommended on macOS”; GitHub Releases are the canonical artifact source; npm is the cross-package-manager native-binary path. | | GAP-005 | The CLI npm wrapper supports Node 18, while latest Fumadocs requires Node 22. | Keep separate requirement callouts: Planr CLI Node 18; docs contributors Node 22. | | GAP-006 | Product personas mention Gemini CLI and generic clients, but install helpers exist only for Codex, Claude Code, and Cursor. | Give the three supported clients first-class setup pages; route Gemini/opencode/other tools through clearly labeled generic CLI or stdio MCP instructions. Do not imply a native installer. | @@ -148,7 +148,7 @@ These findings are explicit inputs to implementation and content review. | GAP-011 | The requested AgentRig path is stale. | Use `agentrig-public/apps/docs` only as recorded prior art; never make it a build dependency. | | GAP-012 | Windows native assets are not in the public install contract. | Installation clearly labels macOS/Linux native support and WSL/source alternatives; no unsupported Windows-native promise. | | GAP-013 | `opencode` appears in README but is not a first-class install target. | Include it only as an example on the generic CLI/MCP page, with no plugin or installer guarantee. | -| GAP-014 | The optional `planr-routing` package has its own CLI, catalog, policies, bindings, and website artifacts outside the core CLI reference. | Give routing its own concept/guide/reference pages and label the package optional. | +| GAP-014 | Resolved on 2026-07-18: Planr no longer documents a routing package CLI, catalog, compiler, bundle, or application lifecycle as current product surface. | Document only provider-neutral declarations, policy checks, pick-packet routing, and route evidence; external tools such as Switchloom remain outside Planr execution. | ## Explicit exclusions diff --git a/docs/fixtures/mcp-contract.json b/docs/fixtures/mcp-contract.json index 87b70ee..70f6acb 100644 --- a/docs/fixtures/mcp-contract.json +++ b/docs/fixtures/mcp-contract.json @@ -103,9 +103,6 @@ "planr recover sweep", "planr agents list", "planr agents check", - "planr routing bundle inspect", - "planr routing bundle preview", - "planr routing bundle apply", "planr item route", "planr trace item", "planr serve --port" diff --git a/package.json b/package.json index 5f32304..09bb7d9 100644 --- a/package.json +++ b/package.json @@ -23,7 +23,6 @@ "build:native": "cargo build --release", "test": "cargo test", "pack:check": "npm pack --dry-run", - "routing": "cargo run --manifest-path planr-routing/Cargo.toml --", "docs:dev": "pnpm --filter @planr/docs dev", "docs:alchemy:dev": "pnpm --filter @planr/docs alchemy:dev", "docs:build": "pnpm --filter @planr/docs build", @@ -45,6 +44,7 @@ "docs:verify-release": "pnpm --filter @planr/docs verify:release", "docs:verify-release-live": "pnpm --filter @planr/docs verify:release-live", "docs:verify-clean-install": "pnpm --filter @planr/docs verify:clean-install", + "verify:switchloom-cross-product": "node scripts/verify-switchloom-cross-product.mjs", "docs:reference:generate": "cargo build --bin planr && pnpm --filter @planr/docs reference:generate", "docs:verify-reference": "cargo build --bin planr && pnpm --filter @planr/docs reference:check && pnpm --filter @planr/docs verify:reference" }, diff --git a/planr-routing/.env.example b/planr-routing/.env.example deleted file mode 100644 index 99ba4fc..0000000 --- a/planr-routing/.env.example +++ /dev/null @@ -1,5 +0,0 @@ -# Recommended when the authenticated Cloudflare identity can access multiple accounts. -CLOUDFLARE_ACCOUNT_ID=replace-with-your-account-id - -# Optional when using an existing Alchemy/Cloudflare OAuth profile or Wrangler login. -# CLOUDFLARE_API_TOKEN=replace-with-a-least-privilege-token diff --git a/planr-routing/Cargo.toml b/planr-routing/Cargo.toml deleted file mode 100644 index 8b7973e..0000000 --- a/planr-routing/Cargo.toml +++ /dev/null @@ -1,32 +0,0 @@ -[package] -name = "planr-routing" -version = "0.1.0" -edition = "2024" -license = "MIT" -description = "Official model-routing policy compiler for Planr" -repository = "https://github.com/instructa/planr" -rust-version = "1.85" -exclude = ["node_modules/**", "dist/**"] - -[[bin]] -name = "planr-routing" -path = "src/main.rs" - -[dependencies] -anyhow = "1" -clap = { version = "4", features = ["derive"] } -ed25519-dalek = "2" -serde = { version = "1", features = ["derive"] } -serde_json = "1" -sha2 = "0.10" -toml = "0.8" - -[lints.rust] -unsafe_code = "warn" - -[lints.clippy] -correctness = "deny" -suspicious = "warn" -style = "warn" -complexity = "warn" -perf = "warn" diff --git a/planr-routing/alchemy.run.ts b/planr-routing/alchemy.run.ts deleted file mode 100644 index a21db24..0000000 --- a/planr-routing/alchemy.run.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { assertAlchemyRuntime } from "./scripts/check-alchemy-runtime.mjs"; - -assertAlchemyRuntime(); - -const [{ default: alchemy }, { Website }] = await Promise.all([ - import("alchemy"), - import("alchemy/cloudflare"), -]); - -const app = await alchemy("planr"); - -export const presetCatalog = await Website("preset-catalog", { - name: `planr-${app.stage}-catalog`, - assets: "./dist/website", - build: { - command: "pnpm site:build", - memoize: false, - }, - dev: "pnpm site:serve", - spa: false, -}); - -console.log({ url: presetCatalog.url }); - -await app.finalize(); diff --git a/planr-routing/docs/MODEL_ROUTING_POLICY.md b/planr-routing/docs/MODEL_ROUTING_POLICY.md deleted file mode 100644 index 8ce3d8e..0000000 --- a/planr-routing/docs/MODEL_ROUTING_POLICY.md +++ /dev/null @@ -1,90 +0,0 @@ -# Model Routing Policy - -`planr-routing` owns opinionated model selection and host bindings. Planr Core owns only the provider-neutral `.planr/agents.toml` contract, route resolution, run evidence, and safe repository-local application of a RoutingBundle v1. - -This split is a hard boundary: - -- `planr-routing` selects models, reasoning effort, role topology, and host-native artifacts. -- Planr Core validates, previews, and transactionally applies the resulting bundle. -- Neither component writes user configuration such as `~/.codex/config.toml`. -- There is no dynamic Rust plugin, compatibility command, hidden fallback, or second policy owner in Core. - -## Compile and apply - -Build a deterministic bundle from one package-owned policy and host binding: - -```bash -cargo run -p planr-routing -- compile balanced --host codex-openai --output /tmp/balanced-codex.json -``` - -Inspect and preview it with provider-neutral Planr Core before applying: - -```bash -planr routing bundle inspect /tmp/balanced-codex.json -planr routing bundle preview /tmp/balanced-codex.json -planr routing bundle apply /tmp/balanced-codex.json -``` - -Application is repository-bound, conflict-safe, atomic, and idempotent. Planr rejects absolute paths, path traversal, symlink crossings, parent/child target collisions, home/global targets, repository `.codex/config.toml`, unsupported versions, invalid hashes or signatures, and changed existing files. Signed bundles additionally require an independently supplied trusted signer and public-key file; unsigned bundles cannot self-assert `verified` or `recommended` evidence. There is no force mode. - -The Codex binding generates these repository-local owners as one bundle: - -- `.planr/agents.toml` for provider-neutral profiles and routes; -- `.codex/agents/*.toml` for exact Codex model and reasoning-effort pins; -- `.codex/skills/planr-native-routing/SKILL.md` for native dispatch instructions. - -Claude Code, Cursor, and mixed-host bindings generate their own repository-local artifacts from the same policy vocabulary. They never require global host configuration changes. - -## Native Codex dispatch - -The generated Codex role TOML is the sole model and effort owner. A dispatcher names its registered underscore-form `agent_type` and supplies a bounded context fork: - -```text -spawn_agent({ - agent_type: "planr_terra_high", - fork_turns: "none", - message: "Implement the selected bounded Planr item." -}) -``` - -Use `fork_turns: "none"` or an evidenced positive bounded integer whenever a selected role changes model or reasoning effort. Do not use `fork_turns: "all"`: native Codex rejects that combination rather than switching the inherited model. - -Global Codex CLI `-m` and `-c model_reasoning_effort=...` flags also override spawned role files. Leave those flags unset when role-local child routing is required. Effective model, effort, native subagent source, registered role, and fork value must be verified from an authenticated Codex run; declared configuration alone is not proof. - -## Registry behavior in Core - -The generated `.planr/agents.toml` remains optional and provider-neutral. It contains: - -- `[profiles.]` entries with passthrough client, model, effort, cost tier, capabilities, and skill metadata; -- `[[routes]]` matching work types or plans; -- one `[route_default]`. - -Resolution precedence is per-item override, work-type route, plan route, then default. Picks carry the resolved advisory route. Workers can attach actual-versus-declared run evidence so silent host overrides remain visible. Without a registry, Planr simply omits routing from picks. - -Core inspection remains generic: - -```bash -planr agents check -planr agents list -planr pick --json -``` - -`planr agents init` creates only a commented provider-neutral starter registry. It does not select a provider, install model policies, or render host roles. - -## Policy and catalog lifecycle - -Package-owned commands list policies, compile bundles, probe host capabilities, evaluate candidates, and build or verify the public catalog: - -```bash -planr-routing policy list -planr-routing policy show balanced --host codex-openai -planr-routing evaluate balanced --host codex-openai -planr-routing catalog build --output website/data/catalog.json -planr-routing catalog verify website/data/catalog.json -``` - -Catalog candidates stay experimental and unrecommended until all required evaluation and authenticated live-host evidence is present. Missing authentication, an unavailable effective model or effort, or absent native-dispatch evidence can never be promoted to a successful verification. - -## Ownership rule - -Model names, named policies such as `balanced`, Sol/Terra/Luna topology, host bindings, capability probes, evaluation scenarios, registry signing, and catalog publication belong only to `planr-routing`. Planr Core may understand the generic bundle envelope and generic routing declaration, but must never regain those opinions. diff --git a/planr-routing/docs/PRESET_COMPOSITION.md b/planr-routing/docs/PRESET_COMPOSITION.md deleted file mode 100644 index 35d7d52..0000000 --- a/planr-routing/docs/PRESET_COMPOSITION.md +++ /dev/null @@ -1,38 +0,0 @@ -# Policy Composition - -`planr-routing` composes one package-owned usage policy with one package-owned host binding into a deterministic RoutingBundle v1. The package is the only owner of named policies, provider model ids, reasoning levels, host-specific role topology, and generated host instructions. - -```bash -planr-routing policy list -planr-routing policy show balanced --host codex-openai -planr-routing compile balanced --host codex-openai --output /tmp/balanced-codex.json -``` - -The supported policy/host matrix is explicit. Unknown policy ids, host ids, unsupported pairs, unknown TOML fields, incomplete abstract-role mappings, unsafe artifact paths, secret-like metadata, and invalid fork policies fail before a bundle is emitted. - -## Composition contract - -A policy declares abstract roles, routes, capabilities, and usage constraints. A binding maps every required abstract role to an exact host profile and may add a driver profile. Composition produces: - -- a provider-neutral `.planr/agents.toml`; -- host-local role files and dispatch skills; -- content hashes for every artifact; -- source and composition provenance inside the versioned bundle. - -Codex role changes use `fork_turns = { mode = "none" }` or a positive bounded partial fork with explicit capability evidence. `all` is rejected when the role changes model or effort. Generated dispatch examples use the registered underscore-form agent type, such as `planr_terra_high`; file names may remain hyphenated. - -Global Codex CLI `-m` and `-c model_reasoning_effort=...` flags have higher precedence than spawned role files. Generated skills therefore tell drivers to leave those flags unset when role-local child routing is required. - -## Safe application boundary - -The package never applies files itself. Planr Core consumes the generic bundle: - -```bash -planr routing bundle inspect /tmp/balanced-codex.json -planr routing bundle preview /tmp/balanced-codex.json -planr routing bundle apply /tmp/balanced-codex.json -``` - -Core permits only allowlisted repository-local targets under `.planr/`, `.codex/agents/`, `.codex/skills/`, `.claude/agents/`, `.claude/skills/`, `.cursor/agents/`, and `.cursor/skills/`. It rejects absolute or home paths, traversal, symlink crossings, parent/child target collisions, `.codex/config.toml`, conflicts, malformed hashes or signatures, and unsupported bundle versions. Signed bundles require an external trusted signer and public-key file. Apply is atomic and idempotent; there is no overwrite or privileged mode. - -This keeps volatile provider policy independently releasable while retaining the dangerous filesystem transaction in the trusted provider-neutral Core. diff --git a/planr-routing/docs/PRESET_EVALUATION.md b/planr-routing/docs/PRESET_EVALUATION.md deleted file mode 100644 index 6a1074b..0000000 --- a/planr-routing/docs/PRESET_EVALUATION.md +++ /dev/null @@ -1,23 +0,0 @@ -# Policy Evaluation - -Package-owned evaluation checks policy composition, route coverage, capability constraints, and the canonical host contract: - -```bash -planr-routing evaluate balanced --host codex-openai -``` - -The CLI evaluation is intentionally offline. It can prove that the selected policy and binding compose and satisfy declarative gates, but it reports no authenticated live-host evidence and can never recommend a configuration by itself. - -Recommendation requires complete live evidence for every required dimension: - -- the expected native host and registered role actually ran; -- effective model and reasoning effort match the binding; -- effective fork mode matches the bounded dispatch contract; -- execution completed with the expected outcome; -- evidence came from an authenticated host run rather than copied declarations. - -For Codex, a valid live oracle includes the parent and child transcript identities, native `subagent` source, exact `agent_role`, explicit `fork_turns`, effective child model and effort, and a task-specific completion marker. Missing authentication or any unavailable effective field is a failed oracle, never a successful or inferred verification. - -The Sol/Terra/Luna suite also proves that native cross-role dispatch rejects `fork_turns = "all"`, uses registered underscore-form agent types, has no fallback chain, and keeps role TOMLs as the sole model/effort owners. Global Codex CLI model or effort flags must be absent from this oracle because they override child role files. - -Catalog generation remains fail-closed: all generated entries are experimental and `recommended = false` until authenticated live evidence and the independent signing gate exist. diff --git a/planr-routing/docs/PRESET_REGISTRY.md b/planr-routing/docs/PRESET_REGISTRY.md deleted file mode 100644 index 1f8dbca..0000000 --- a/planr-routing/docs/PRESET_REGISTRY.md +++ /dev/null @@ -1,30 +0,0 @@ -# Signed Catalog Registry - -`planr-routing` owns catalog generation and detached Ed25519 signatures. Planr Core has no named-policy registry and no network dependency. - -Build and verify the deterministic public catalog from package-owned sources: - -```bash -planr-routing catalog build --output website/data/catalog.json -planr-routing catalog verify website/data/catalog.json -``` - -All entries remain experimental and unrecommended unless the evaluation gate has authenticated live-host evidence. A signature authenticates bytes; it cannot promote incomplete evidence. - -Create and verify a detached signature with explicitly supplied local files: - -```bash -planr-routing registry sign website/data/catalog.json \ - --signer planr-maintainers \ - --private-key-file /absolute/path/to/private-key \ - --output /tmp/catalog.signature.json - -planr-routing registry verify website/data/catalog.json \ - --signature /tmp/catalog.signature.json \ - --trusted-signer planr-maintainers \ - --trusted-public-key-file /absolute/path/to/maintainer.pub -``` - -Signing never searches user configuration, keychains, environment variables, or home-directory defaults. The caller chooses the input, private-key file, signer id, and output. The detached signature does not carry a trusted public key; verification requires the expected signer and an independently provisioned key file. It fails closed for signer mismatch, malformed signatures, wrong content, or invalid key material. - -The website publishes generated catalog data only. Runtime route resolution and previously applied repository files do not depend on the website, network availability, or registry state. diff --git a/planr-routing/evaluations/preset-suite-v1.toml b/planr-routing/evaluations/preset-suite-v1.toml deleted file mode 100644 index 39e945d..0000000 --- a/planr-routing/evaluations/preset-suite-v1.toml +++ /dev/null @@ -1,127 +0,0 @@ -schema_version = 1 -id = "planr-preset-suite" -version = "1.8.0" -verified_at_unix = 1783987200 -expires_at_unix = 1815523200 - -[thresholds] -minimum_runs = 7 -minimum_quality_score_bps = 8500 -minimum_reliability_bps = 9000 -maximum_average_credits_micros = 1200000 -maximum_p95_latency_ms = 5000 -maximum_transition_contract_failures = 0 -maximum_safety_stop_failures = 0 -require_verified_routes = true -require_result_hashes = true - -[[candidates]] -id = "balanced-codex-openai" -policy = "balanced" -binding = "codex-openai" - -[[candidates]] -id = "low-usage-codex-openai" -policy = "low-usage" -binding = "codex-openai" - -[[candidates]] -id = "max-quality-codex-openai" -policy = "max-quality" -binding = "codex-openai" - -[[candidates]] -id = "read-only-audit-codex-openai" -policy = "read-only-audit" -binding = "codex-openai" - -[[tasks]] -id = "explore-routing-boundaries" -version = "1.0.0" -kind = "exploration" -objective = "Inspect policy and host routing boundaries without mutation." -input = "inspect-routing-boundaries" -artifact_kind = "inspection_manifest" -expected_output = "routing-boundaries-inspected" -work_units = 8 -transition = "retry" -requires_write = false -minimum_tool_budget = 1 - -[[tasks]] -id = "implement-bounded-policy-change" -version = "1.0.0" -kind = "implementation" -objective = "Implement a bounded policy change and preserve verification evidence." -input = "implement-bounded-policy-change" -artifact_kind = "patch_manifest" -expected_output = "bounded-policy-change-implemented" -work_units = 14 -transition = "quality_escalation" -requires_write = true -minimum_tool_budget = 80 - -[[tasks]] -id = "mechanical-schema-rewrite" -version = "1.0.0" -kind = "mechanical" -objective = "Apply a deterministic schema rewrite across owned files." -input = "rewrite-owned-schema" -artifact_kind = "rewrite_manifest" -expected_output = "owned-schema-rewritten" -work_units = 11 -transition = "availability_fallback" -requires_write = true -minimum_tool_budget = 80 - -[[tasks]] -id = "browser-report-smoke" -version = "1.0.0" -kind = "browser" -objective = "Render and inspect the generated human report in a browser surface." -input = "inspect-browser-report" -artifact_kind = "browser_trace" -expected_output = "browser-report-inspected" -work_units = 16 -transition = "retry" -requires_write = false -minimum_tool_budget = 80 - -[[tasks]] -id = "visual-report-regression" -version = "1.0.0" -kind = "visual" -objective = "Compare the report table and status labels against the visual contract." -input = "compare-visual-report" -artifact_kind = "visual_diff" -expected_output = "visual-contract-matched" -work_units = 13 -transition = "quality_escalation" -requires_write = false -minimum_tool_budget = 80 - -[[tasks]] -id = "security-safety-stop" -version = "1.0.0" -kind = "security" -objective = "Prove an unsafe operation resolves to an enforced safety stop." -input = "attempt-unsafe-operation" -artifact_kind = "safety_receipt" -expected_output = "unsafe-operation-stopped" -work_units = 9 -transition = "safety_stop" -requires_write = false -minimum_tool_budget = 1 - -[[tasks]] -id = "subagent-sol-terra-luna-dispatch" -version = "1.0.0" -kind = "subagent" -objective = "Verify Sol/Terra/Luna cross-role dispatch and effective route evidence." -input = "dispatch-sol-terra-luna-worker" -artifact_kind = "dispatch_trace" -expected_output = "sol-terra-luna-dispatch-verified" -work_units = 12 -transition = "availability_fallback" -requires_write = false -minimum_tool_budget = 1 diff --git a/planr-routing/evaluations/sol-terra-luna-codex-v2.toml b/planr-routing/evaluations/sol-terra-luna-codex-v2.toml deleted file mode 100644 index 78ca5c1..0000000 --- a/planr-routing/evaluations/sol-terra-luna-codex-v2.toml +++ /dev/null @@ -1,142 +0,0 @@ -schema_version = 1 -id = "sol-terra-luna-codex" -version = "2.0.0" -host = "codex" -driver_role = "driver" -default_role = "driver" -capability_evidence = ["fixture-codex-0.144.0-native-v2"] -billing_assumptions = ["deterministic evaluation fixture; no provider call"] -known_limitations = ["effective model and effort require host evidence"] - -[capabilities] -model_override = true -effort_override = true -fork_none = true -fork_all = true - -[profiles.driver] -profile = "codex-sol-medium" -client = "codex" -model = "gpt-5.6-sol" -agent_type = "planr_sol_medium" -effort = "medium" -cost_tier = "standard" - -[profiles.explorer] -profile = "codex-terra-medium" -client = "codex" -model = "gpt-5.6-terra" -agent_type = "planr_terra_medium" -effort = "medium" -cost_tier = "standard" -fork_turns = { mode = "none" } - -[profiles.worker] -profile = "codex-terra-high" -client = "codex" -model = "gpt-5.6-terra" -agent_type = "planr_terra_high" -effort = "high" -cost_tier = "standard" -skill = "planr-work" -fork_turns = { mode = "none" } - -[profiles.mechanical] -profile = "codex-luna-xhigh" -client = "codex" -model = "gpt-5.6-luna" -agent_type = "planr_luna_xhigh" -effort = "xhigh" -cost_tier = "premium" -skill = "planr-work" -fork_turns = { mode = "none" } - -[profiles.reviewer] -profile = "codex-sol-high" -client = "codex" -model = "gpt-5.6-sol" -agent_type = "planr_sol_high" -effort = "high" -cost_tier = "premium" -skill = "planr-review" -fork_turns = { mode = "none" } - -[profiles.moonshot] -profile = "codex-sol-ultra" -client = "codex" -model = "gpt-5.6-sol" -agent_type = "planr_sol_ultra" -effort = "ultra" -cost_tier = "premium" -fork_turns = { mode = "none" } - -[[routes]] -work_type = "exploration" -role = "explorer" - -[[routes]] -work_type = "research" -role = "explorer" - -[[routes]] -work_type = "code" -role = "worker" - -[[routes]] -work_type = "mechanical" -role = "mechanical" - -[[routes]] -work_type = "review" -role = "reviewer" - -[[routes]] -work_type = "moonshot" -role = "moonshot" - -[verification] -id = "fixture-sol-terra-luna-v2" -verified_at_unix = 1784160000 -max_age_seconds = 31536000 - -[[artifacts]] -path = ".codex/agents/planr-sol-medium.toml" -kind = "codex_agent" -content = '''model = "gpt-5.6-sol" -model_reasoning_effort = "medium" -''' - -[[artifacts]] -path = ".codex/agents/planr-terra-medium.toml" -kind = "codex_agent" -content = '''model = "gpt-5.6-terra" -model_reasoning_effort = "medium" -''' - -[[artifacts]] -path = ".codex/agents/planr-terra-high.toml" -kind = "codex_agent" -content = '''model = "gpt-5.6-terra" -model_reasoning_effort = "high" -''' - -[[artifacts]] -path = ".codex/agents/planr-luna-xhigh.toml" -kind = "codex_agent" -content = '''model = "gpt-5.6-luna" -model_reasoning_effort = "xhigh" -''' - -[[artifacts]] -path = ".codex/agents/planr-sol-high.toml" -kind = "codex_agent" -content = '''model = "gpt-5.6-sol" -model_reasoning_effort = "high" -''' - -[[artifacts]] -path = ".codex/agents/planr-sol-ultra.toml" -kind = "codex_agent" -content = '''model = "gpt-5.6-sol" -model_reasoning_effort = "ultra" -''' diff --git a/planr-routing/fixtures/routing-bundle-v1/invalid-artifact-hash.json b/planr-routing/fixtures/routing-bundle-v1/invalid-artifact-hash.json deleted file mode 100644 index f3bc3b2..0000000 --- a/planr-routing/fixtures/routing-bundle-v1/invalid-artifact-hash.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "schema_version": 1, - "bundle_id": "bad-hash@1", - "policy_id": "bad-hash", - "policy_version": "1.0.0", - "generated_at": "2026-07-16T00:00:00Z", - "source": { - "package": "planr-routing", - "package_version": "0.1.0" - }, - "profiles": {}, - "routes": [], - "artifacts": [ - { - "path": ".planr/generated.txt", - "media_type": "text/plain", - "mode": "create", - "content": "tampered", - "sha256": "0000000000000000000000000000000000000000000000000000000000000000" - } - ] -} diff --git a/planr-routing/fixtures/routing-bundle-v1/invalid-dual-artifact-payload.json b/planr-routing/fixtures/routing-bundle-v1/invalid-dual-artifact-payload.json deleted file mode 100644 index 8851245..0000000 --- a/planr-routing/fixtures/routing-bundle-v1/invalid-dual-artifact-payload.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "schema_version": 1, - "bundle_id": "dual-payload@1", - "policy_id": "dual-payload", - "policy_version": "1.0.0", - "generated_at": "2026-07-16T00:00:00Z", - "source": { - "package": "planr-routing", - "package_version": "0.1.0" - }, - "profiles": {}, - "routes": [], - "artifacts": [ - { - "path": ".planr/generated.txt", - "media_type": "text/plain", - "mode": "create", - "content": "", - "content_ref": "registry://dual-payload/generated.txt", - "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" - } - ] -} diff --git a/planr-routing/fixtures/routing-bundle-v1/invalid-unsupported-version.json b/planr-routing/fixtures/routing-bundle-v1/invalid-unsupported-version.json deleted file mode 100644 index f62d9c9..0000000 --- a/planr-routing/fixtures/routing-bundle-v1/invalid-unsupported-version.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "schema_version": 2, - "bundle_id": "future@2", - "policy_id": "future", - "policy_version": "2.0.0", - "generated_at": "2026-07-16T00:00:00Z", - "source": { - "package": "planr-routing", - "package_version": "2.0.0" - }, - "profiles": {}, - "routes": [], - "artifacts": [] -} diff --git a/planr-routing/fixtures/routing-bundle-v1/valid-balanced-codex.json b/planr-routing/fixtures/routing-bundle-v1/valid-balanced-codex.json deleted file mode 100644 index 419b841..0000000 --- a/planr-routing/fixtures/routing-bundle-v1/valid-balanced-codex.json +++ /dev/null @@ -1,188 +0,0 @@ -{ - "schema_version": 1, - "bundle_id": "balanced-codex-openai@1.0.0+2.0.0", - "policy_id": "balanced", - "policy_version": "1.0.0", - "generated_at": "2026-07-16T00:00:00Z", - "source": { - "package": "planr-routing", - "package_version": "0.1.0" - }, - "requirements": [ - { - "host": "codex", - "capabilities": [ - "model_override", - "reasoning_effort", - "fork_none", - "bounded_context_fork" - ] - } - ], - "profiles": { - "codex-luna-xhigh": { - "client": "codex", - "model": "gpt-5.6-luna", - "agent_type": "planr_luna_xhigh", - "effort": "xhigh", - "cost_tier": "premium", - "skill": "planr-work" - }, - "codex-sol-high": { - "client": "codex", - "model": "gpt-5.6-sol", - "agent_type": "planr_sol_high", - "effort": "high", - "cost_tier": "premium", - "skill": "planr-review" - }, - "codex-sol-medium": { - "client": "codex", - "model": "gpt-5.6-sol", - "agent_type": "planr_sol_medium", - "effort": "medium", - "cost_tier": "standard" - }, - "codex-sol-ultra": { - "client": "codex", - "model": "gpt-5.6-sol", - "agent_type": "planr_sol_ultra", - "effort": "ultra", - "cost_tier": "premium" - }, - "codex-terra-high": { - "client": "codex", - "model": "gpt-5.6-terra", - "agent_type": "planr_terra_high", - "effort": "high", - "cost_tier": "standard", - "skill": "planr-work" - }, - "codex-terra-medium": { - "client": "codex", - "model": "gpt-5.6-terra", - "agent_type": "planr_terra_medium", - "effort": "medium", - "cost_tier": "standard" - } - }, - "routes": [ - { - "match": { - "work_type": "exploration" - }, - "profile": "codex-terra-medium", - "fallbacks": [] - }, - { - "match": { - "work_type": "research" - }, - "profile": "codex-terra-medium", - "fallbacks": [] - }, - { - "match": { - "work_type": "code" - }, - "profile": "codex-terra-high", - "fallbacks": [] - }, - { - "match": { - "work_type": "mechanical" - }, - "profile": "codex-luna-xhigh", - "fallbacks": [] - }, - { - "match": { - "work_type": "review" - }, - "profile": "codex-sol-high", - "fallbacks": [] - }, - { - "match": { - "work_type": "moonshot" - }, - "profile": "codex-sol-ultra", - "fallbacks": [] - } - ], - "route_default": { - "profile": "codex-sol-medium", - "fallbacks": [] - }, - "artifacts": [ - { - "path": ".codex/agents/planr-luna-xhigh.toml", - "media_type": "application/toml", - "mode": "create", - "content": "name = \"planr_luna_xhigh\"\ndescription = \"Bounded checklist-driven and mechanical implementation.\"\nmodel = \"gpt-5.6-luna\"\nmodel_reasoning_effort = \"xhigh\"\nsandbox_mode = \"workspace-write\"\n\ndeveloper_instructions = \"\"\"\nUse the planr-work skill for one tightly bounded item, follow the checklist exactly, verify the result, and stop.\n\"\"\"\n", - "sha256": "6603b60e840c68fbcc0ab2f79e633d3a45d8f4904cea434deebbc4fe5e6b8050" - }, - { - "path": ".codex/agents/planr-sol-high.toml", - "media_type": "application/toml", - "mode": "create", - "content": "name = \"planr_sol_high\"\ndescription = \"Independent final review.\"\nmodel = \"gpt-5.6-sol\"\nmodel_reasoning_effort = \"high\"\nsandbox_mode = \"read-only\"\n\ndeveloper_instructions = \"\"\"\nUse the planr-review skill, independently verify acceptance criteria and evidence, and report findings before the verdict.\n\"\"\"\n", - "sha256": "6b3647e93df124bd6f03a095af4c1f81a66c33ee2c5b1230196c180ebeff08de" - }, - { - "path": ".codex/agents/planr-sol-medium.toml", - "media_type": "application/toml", - "mode": "create", - "content": "name = \"planr_sol_medium\"\ndescription = \"Normal Planr orchestration and synthesis.\"\nmodel = \"gpt-5.6-sol\"\nmodel_reasoning_effort = \"medium\"\nsandbox_mode = \"workspace-write\"\n\ndeveloper_instructions = \"\"\"\nOrchestrate the Planr map, delegate bounded work by agent type, and retain synthesis ownership.\n\"\"\"\n", - "sha256": "4baa3628bdce5498fc278504bcd3cc38d68f7f2167f9c7526630340ac309d691" - }, - { - "path": ".codex/agents/planr-sol-ultra.toml", - "media_type": "application/toml", - "mode": "create", - "content": "name = \"planr_sol_ultra\"\ndescription = \"Explicit moonshot planning only.\"\nmodel = \"gpt-5.6-sol\"\nmodel_reasoning_effort = \"ultra\"\nsandbox_mode = \"read-only\"\n\ndeveloper_instructions = \"\"\"\nWork only on an explicitly selected moonshot planning task; do not treat this role as the balanced default.\n\"\"\"\n", - "sha256": "4ab0cb64c9d87efe09298139a2f3b27c00a0ae2924ced3d49feb1314250f9d37" - }, - { - "path": ".codex/agents/planr-terra-high.toml", - "media_type": "application/toml", - "mode": "create", - "content": "name = \"planr_terra_high\"\ndescription = \"Normal implementation and testing.\"\nmodel = \"gpt-5.6-terra\"\nmodel_reasoning_effort = \"high\"\nsandbox_mode = \"workspace-write\"\n\ndeveloper_instructions = \"\"\"\nUse the planr-work skill for one picked item, implement the smallest correct slice, and record real verification evidence.\n\"\"\"\n", - "sha256": "0cbde7c2bc86584a82cb0d8a56247381efdea589c2dd747c6cca1ff447a351b8" - }, - { - "path": ".codex/agents/planr-terra-medium.toml", - "media_type": "application/toml", - "mode": "create", - "content": "name = \"planr_terra_medium\"\ndescription = \"Repository exploration and research.\"\nmodel = \"gpt-5.6-terra\"\nmodel_reasoning_effort = \"medium\"\nsandbox_mode = \"read-only\"\n\ndeveloper_instructions = \"\"\"\nExplore the assigned scope, report concrete evidence, and do not edit files.\n\"\"\"\n", - "sha256": "639f79ac803e8cdbf7b4d7c074dc40c4942ea3f8001915b7bdb02843bd712e80" - }, - { - "path": ".codex/skills/planr-native-routing/SKILL.md", - "media_type": "text/markdown", - "mode": "create", - "content": "---\nname: planr-native-routing\ndescription: Dispatch Planr work through the repository-owned native Codex Sol, Terra, and Luna roles generated by the selected preset.\n---\n# Planr native Codex routing\n\nUse the generated repository roles directly. The role file owns its model and reasoning effort; do not repeat or override those values at the call site.\n\n| Work type | Native dispatch |\n| --- | --- |\n| exploration or research | `spawn_agent({ agent_type: \"planr_terra_medium\", fork_turns: \"none\", ... })` |\n| code | `spawn_agent({ agent_type: \"planr_terra_high\", fork_turns: \"none\", ... })` |\n| mechanical | `spawn_agent({ agent_type: \"planr_luna_xhigh\", fork_turns: \"none\", ... })` |\n| review | `spawn_agent({ agent_type: \"planr_sol_high\", fork_turns: \"none\", ... })` |\n| explicitly selected moonshot planning | `spawn_agent({ agent_type: \"planr_sol_ultra\", fork_turns: \"none\", ... })` |\n\nThe parent remains the generated `planr_sol_medium` driver. Every dispatch that changes role, model, or reasoning effort must name `agent_type` and use `fork_turns: \"none\"` or an evidenced positive bounded integer. Native Codex rejects `fork_turns: \"all\"` when `agent_type` selects a role with model or effort overrides. Global Codex CLI `-m` or `-c model_reasoning_effort=...` flags also override spawned role files, so leave those flags unset when role-local child routing is required. Do not use implicit model inheritance or a fallback role.\n", - "sha256": "aee6a71ea4905128a7b24ed6b69c43cbcf7609263c114cbf828e51a057a42d50" - }, - { - "path": ".planr/agents.toml", - "media_type": "application/toml", - "mode": "replace", - "content": "[profiles.codex-luna-xhigh]\nclient = \"codex\"\nmodel = \"gpt-5.6-luna\"\nagent_type = \"planr_luna_xhigh\"\neffort = \"xhigh\"\ncost_tier = \"premium\"\nskill = \"planr-work\"\n\n[profiles.codex-sol-high]\nclient = \"codex\"\nmodel = \"gpt-5.6-sol\"\nagent_type = \"planr_sol_high\"\neffort = \"high\"\ncost_tier = \"premium\"\nskill = \"planr-review\"\n\n[profiles.codex-sol-medium]\nclient = \"codex\"\nmodel = \"gpt-5.6-sol\"\nagent_type = \"planr_sol_medium\"\neffort = \"medium\"\ncost_tier = \"standard\"\n\n[profiles.codex-sol-ultra]\nclient = \"codex\"\nmodel = \"gpt-5.6-sol\"\nagent_type = \"planr_sol_ultra\"\neffort = \"ultra\"\ncost_tier = \"premium\"\n\n[profiles.codex-terra-high]\nclient = \"codex\"\nmodel = \"gpt-5.6-terra\"\nagent_type = \"planr_terra_high\"\neffort = \"high\"\ncost_tier = \"standard\"\nskill = \"planr-work\"\n\n[profiles.codex-terra-medium]\nclient = \"codex\"\nmodel = \"gpt-5.6-terra\"\nagent_type = \"planr_terra_medium\"\neffort = \"medium\"\ncost_tier = \"standard\"\n\n[[routes]]\nprofile = \"codex-terra-medium\"\nfallbacks = []\n\n[routes.match]\nwork_type = \"exploration\"\n\n[[routes]]\nprofile = \"codex-terra-medium\"\nfallbacks = []\n\n[routes.match]\nwork_type = \"research\"\n\n[[routes]]\nprofile = \"codex-terra-high\"\nfallbacks = []\n\n[routes.match]\nwork_type = \"code\"\n\n[[routes]]\nprofile = \"codex-luna-xhigh\"\nfallbacks = []\n\n[routes.match]\nwork_type = \"mechanical\"\n\n[[routes]]\nprofile = \"codex-sol-high\"\nfallbacks = []\n\n[routes.match]\nwork_type = \"review\"\n\n[[routes]]\nprofile = \"codex-sol-ultra\"\nfallbacks = []\n\n[routes.match]\nwork_type = \"moonshot\"\n\n[route_default]\nprofile = \"codex-sol-medium\"\nfallbacks = []\n", - "sha256": "49eac7a5d265a75b3aadbe7af90bfca9e2b49ede22f365025c31cab73eb57101" - }, - { - "path": ".planr/policy.toml", - "media_type": "application/toml", - "mode": "replace", - "content": "schema_version = 1\nid = \"balanced\"\nversion = \"1.0.0\"\n\n[usage]\nmax_active_agents = 3\nmax_parallel_readers = 2\nmax_parallel_writers = 1\nmax_depth = 1\nmax_attempts = 4\nmax_wall_time_seconds = 3600\nmax_tool_calls = 120\nreview_reserve_percent = 20\nbudget_exhaustion = \"stop\"\nmetering = \"estimated\"\n\n[transitions.retry]\nmax_same_route_retries = 1\n\n[transitions.availability_fallback]\nmax_fallbacks = 1\nrequire_same_capability_class = true\n\n[transitions.quality_escalation]\nmax_escalations = 1\nrequire_verification_evidence = true\n\n[transitions.quota_downgrade]\nenabled = false\nmax_downgrades = 0\nnoncritical_only = true\n\n[transitions.safety_stop]\nenabled = true\n\n[materiality]\nchanged_files_threshold = 10\nchanged_lines_threshold = 500\n\n[execution]\nmax_read_scope_entries = 8\nmax_write_scope_entries = 4\n\n[execution.roles.worker]\ntools = [\"cargo\", \"git\", \"rg\"]\n\n[execution.roles.worker.filesystem]\nread_roots = [\"src\", \"tests\", \"docs\"]\nwrite_roots = [\"src\", \"tests\", \"docs\"]\nallow_overwrite = false\n", - "sha256": "827667b678224f6b09f7c3faab188ede4c7bad49cd2fc9fa8e46f01d61147080" - } - ], - "evidence": { - "evaluation_ids": [ - "builtin-codex-native-v2" - ], - "status": "experimental" - } -} diff --git a/planr-routing/fixtures/routing-bundle-v1/valid-balanced-mixed.json b/planr-routing/fixtures/routing-bundle-v1/valid-balanced-mixed.json deleted file mode 100644 index 9e3a55c..0000000 --- a/planr-routing/fixtures/routing-bundle-v1/valid-balanced-mixed.json +++ /dev/null @@ -1,137 +0,0 @@ -{ - "schema_version": 1, - "bundle_id": "balanced-mixed-host@1.0.0+2.0.0", - "policy_id": "balanced", - "policy_version": "1.0.0", - "generated_at": "2026-07-16T00:00:00Z", - "source": { - "package": "planr-routing", - "package_version": "0.1.0" - }, - "requirements": [ - { - "host": "mixed-host", - "capabilities": [ - "model_override", - "reasoning_effort", - "fork_none", - "bounded_context_fork" - ] - } - ], - "profiles": { - "mixed-codex-luna-xhigh": { - "client": "codex", - "model": "gpt-5.6-luna", - "agent_type": "planr_luna_xhigh", - "effort": "xhigh", - "cost_tier": "premium", - "skill": "planr-work" - }, - "mixed-codex-sol-high": { - "client": "codex", - "model": "gpt-5.6-sol", - "agent_type": "planr_sol_high", - "effort": "high", - "cost_tier": "premium", - "skill": "planr-review" - }, - "mixed-codex-terra-high": { - "client": "codex", - "model": "gpt-5.6-terra", - "agent_type": "planr_terra_high", - "effort": "high", - "cost_tier": "standard", - "skill": "planr-work" - }, - "mixed-cursor-fable-driver": { - "client": "cursor", - "model": "fable-5", - "cost_tier": "premium" - } - }, - "routes": [ - { - "match": { - "work_type": "code" - }, - "profile": "mixed-codex-terra-high", - "fallbacks": [] - }, - { - "match": { - "work_type": "mechanical" - }, - "profile": "mixed-codex-luna-xhigh", - "fallbacks": [] - }, - { - "match": { - "work_type": "review" - }, - "profile": "mixed-codex-sol-high", - "fallbacks": [] - } - ], - "route_default": { - "profile": "mixed-cursor-fable-driver", - "fallbacks": [] - }, - "artifacts": [ - { - "path": ".codex/agents/planr-luna-xhigh.toml", - "media_type": "application/toml", - "mode": "create", - "content": "name = \"planr_luna_xhigh\"\ndescription = \"Bounded checklist-driven and mechanical implementation.\"\nmodel = \"gpt-5.6-luna\"\nmodel_reasoning_effort = \"xhigh\"\nsandbox_mode = \"workspace-write\"\n\ndeveloper_instructions = \"\"\"\nUse the planr-work skill for one tightly bounded item, follow the checklist exactly, verify the result, and stop.\n\"\"\"\n", - "sha256": "6603b60e840c68fbcc0ab2f79e633d3a45d8f4904cea434deebbc4fe5e6b8050" - }, - { - "path": ".codex/agents/planr-sol-high.toml", - "media_type": "application/toml", - "mode": "create", - "content": "name = \"planr_sol_high\"\ndescription = \"Independent final review.\"\nmodel = \"gpt-5.6-sol\"\nmodel_reasoning_effort = \"high\"\nsandbox_mode = \"read-only\"\n\ndeveloper_instructions = \"\"\"\nUse the planr-review skill, independently verify acceptance criteria and evidence, and report findings before the verdict.\n\"\"\"\n", - "sha256": "6b3647e93df124bd6f03a095af4c1f81a66c33ee2c5b1230196c180ebeff08de" - }, - { - "path": ".codex/agents/planr-terra-high.toml", - "media_type": "application/toml", - "mode": "create", - "content": "name = \"planr_terra_high\"\ndescription = \"Normal implementation and testing.\"\nmodel = \"gpt-5.6-terra\"\nmodel_reasoning_effort = \"high\"\nsandbox_mode = \"workspace-write\"\n\ndeveloper_instructions = \"\"\"\nUse the planr-work skill for one picked item, implement the smallest correct slice, and record real verification evidence.\n\"\"\"\n", - "sha256": "0cbde7c2bc86584a82cb0d8a56247381efdea589c2dd747c6cca1ff447a351b8" - }, - { - "path": ".codex/skills/planr-native-routing/SKILL.md", - "media_type": "text/markdown", - "mode": "create", - "content": "---\nname: planr-native-routing\ndescription: Dispatch mixed-host Planr work from the Cursor driver through repository-owned native Codex worker roles.\n---\n# Planr mixed-host native routing\n\nThe Cursor `planr-fable-driver` remains the driver. Dispatch Codex work through these generated repository roles; each role file owns its model and reasoning effort.\n\n| Work type | Native dispatch |\n| --- | --- |\n| code | `spawn_agent({ agent_type: \"planr_terra_high\", fork_turns: \"none\", ... })` |\n| mechanical | `spawn_agent({ agent_type: \"planr_luna_xhigh\", fork_turns: \"none\", ... })` |\n| review | `spawn_agent({ agent_type: \"planr_sol_high\", fork_turns: \"none\", ... })` |\n\nEvery dispatch that changes role, model, or reasoning effort must name `agent_type` and use `fork_turns: \"none\"` or an evidenced positive bounded integer. Native Codex rejects `fork_turns: \"all\"` when `agent_type` selects a role with model or effort overrides. Global Codex CLI `-m` or `-c model_reasoning_effort=...` flags also override spawned role files, so leave those flags unset when role-local child routing is required. Do not use implicit model inheritance or a fallback role.\n", - "sha256": "32ab3e53fe474ac6a44c12f018d5ce286f7ac5de19b32d1a08b3f96574aef166" - }, - { - "path": ".cursor/agents/planr-fable-driver.md", - "media_type": "text/markdown", - "mode": "create", - "content": "---\nname: planr-fable-driver\nmodel: fable-5\n---\nOrchestrate the Planr map and dispatch bounded Codex worker roles.\n", - "sha256": "a42adaf2e90c655f33e5f6b13cd864bcfeda1bd762992c6fa2c2eda79fe487d1" - }, - { - "path": ".planr/agents.toml", - "media_type": "application/toml", - "mode": "replace", - "content": "[profiles.mixed-codex-luna-xhigh]\nclient = \"codex\"\nmodel = \"gpt-5.6-luna\"\nagent_type = \"planr_luna_xhigh\"\neffort = \"xhigh\"\ncost_tier = \"premium\"\nskill = \"planr-work\"\n\n[profiles.mixed-codex-sol-high]\nclient = \"codex\"\nmodel = \"gpt-5.6-sol\"\nagent_type = \"planr_sol_high\"\neffort = \"high\"\ncost_tier = \"premium\"\nskill = \"planr-review\"\n\n[profiles.mixed-codex-terra-high]\nclient = \"codex\"\nmodel = \"gpt-5.6-terra\"\nagent_type = \"planr_terra_high\"\neffort = \"high\"\ncost_tier = \"standard\"\nskill = \"planr-work\"\n\n[profiles.mixed-cursor-fable-driver]\nclient = \"cursor\"\nmodel = \"fable-5\"\ncost_tier = \"premium\"\n\n[[routes]]\nprofile = \"mixed-codex-terra-high\"\nfallbacks = []\n\n[routes.match]\nwork_type = \"code\"\n\n[[routes]]\nprofile = \"mixed-codex-luna-xhigh\"\nfallbacks = []\n\n[routes.match]\nwork_type = \"mechanical\"\n\n[[routes]]\nprofile = \"mixed-codex-sol-high\"\nfallbacks = []\n\n[routes.match]\nwork_type = \"review\"\n\n[route_default]\nprofile = \"mixed-cursor-fable-driver\"\nfallbacks = []\n", - "sha256": "a25f1dac1964f65ac833d467b89bd68b1d2ca4bd77aef5b00d237618f7418934" - }, - { - "path": ".planr/policy.toml", - "media_type": "application/toml", - "mode": "replace", - "content": "schema_version = 1\nid = \"balanced\"\nversion = \"1.0.0\"\n\n[usage]\nmax_active_agents = 3\nmax_parallel_readers = 2\nmax_parallel_writers = 1\nmax_depth = 1\nmax_attempts = 4\nmax_wall_time_seconds = 3600\nmax_tool_calls = 120\nreview_reserve_percent = 20\nbudget_exhaustion = \"stop\"\nmetering = \"estimated\"\n\n[transitions.retry]\nmax_same_route_retries = 1\n\n[transitions.availability_fallback]\nmax_fallbacks = 1\nrequire_same_capability_class = true\n\n[transitions.quality_escalation]\nmax_escalations = 1\nrequire_verification_evidence = true\n\n[transitions.quota_downgrade]\nenabled = false\nmax_downgrades = 0\nnoncritical_only = true\n\n[transitions.safety_stop]\nenabled = true\n\n[materiality]\nchanged_files_threshold = 10\nchanged_lines_threshold = 500\n\n[execution]\nmax_read_scope_entries = 8\nmax_write_scope_entries = 4\n\n[execution.roles.worker]\ntools = [\"cargo\", \"git\", \"rg\"]\n\n[execution.roles.worker.filesystem]\nread_roots = [\"src\", \"tests\", \"docs\"]\nwrite_roots = [\"src\", \"tests\", \"docs\"]\nallow_overwrite = false\n", - "sha256": "827667b678224f6b09f7c3faab188ede4c7bad49cd2fc9fa8e46f01d61147080" - } - ], - "evidence": { - "evaluation_ids": [ - "builtin-mixed-host-native-v2" - ], - "status": "experimental" - } -} diff --git a/planr-routing/host-bindings/claude-native.toml b/planr-routing/host-bindings/claude-native.toml deleted file mode 100644 index ef8f1ad..0000000 --- a/planr-routing/host-bindings/claude-native.toml +++ /dev/null @@ -1,52 +0,0 @@ -schema_version = 1 -id = "claude-native" -version = "1.0.0" -host = "claude-code" -driver_role = "driver" -default_role = "driver" -capability_evidence = ["builtin-claude-project-agent-contract"] -billing_assumptions = ["Planr records declared tiers; Claude Code remains billing authority"] -known_limitations = ["session environment may preempt the requested subagent model"] - -[capabilities] -model_override = true -effort_override = true -fork_none = true -fork_all = false - -[profiles.driver] -profile = "claude-native-driver" -client = "claude-code" -model = "opus" -effort = "high" -cost_tier = "premium" - -[profiles.worker] -profile = "claude-native-worker" -client = "claude-code" -model = "sonnet" -effort = "medium" -cost_tier = "standard" -skill = "planr-work" -fork_turns = { mode = "none" } - -[[routes]] -work_type = "code" -role = "worker" -fallback_roles = ["driver"] - -[verification] -id = "builtin-claude-native-v1" -verified_at_unix = 1783987200 -max_age_seconds = 31536000 - -[[artifacts]] -path = ".claude/agents/planr-preset-worker.md" -kind = "claude_agent" -content = '''--- -name: planr-preset-worker -model: sonnet -effort: medium ---- -Use the planr-work skill and preserve Planr evidence. -''' diff --git a/planr-routing/host-bindings/codex-openai.toml b/planr-routing/host-bindings/codex-openai.toml deleted file mode 100644 index e32edff..0000000 --- a/planr-routing/host-bindings/codex-openai.toml +++ /dev/null @@ -1,206 +0,0 @@ -schema_version = 1 -id = "codex-openai" -version = "2.0.0" -host = "codex" -driver_role = "driver" -default_role = "driver" -capability_evidence = ["codex-0.144.0-native-v2-9ff47868eb"] -billing_assumptions = ["Planr records declared tiers; Codex remains billing authority"] -known_limitations = ["native multi-agent v2 and the requested model must be active on the current Codex backend"] - -[capabilities] -model_override = true -effort_override = true -fork_none = true -fork_all = true - -[profiles.driver] -profile = "codex-sol-medium" -client = "codex" -model = "gpt-5.6-sol" -agent_type = "planr_sol_medium" -effort = "medium" -cost_tier = "standard" - -[profiles.explorer] -profile = "codex-terra-medium" -client = "codex" -model = "gpt-5.6-terra" -agent_type = "planr_terra_medium" -effort = "medium" -cost_tier = "standard" -fork_turns = { mode = "none" } - -[profiles.worker] -profile = "codex-terra-high" -client = "codex" -model = "gpt-5.6-terra" -agent_type = "planr_terra_high" -effort = "high" -cost_tier = "standard" -skill = "planr-work" -fork_turns = { mode = "none" } - -[profiles.mechanical] -profile = "codex-luna-xhigh" -client = "codex" -model = "gpt-5.6-luna" -agent_type = "planr_luna_xhigh" -effort = "xhigh" -cost_tier = "premium" -skill = "planr-work" -fork_turns = { mode = "none" } - -[profiles.reviewer] -profile = "codex-sol-high" -client = "codex" -model = "gpt-5.6-sol" -agent_type = "planr_sol_high" -effort = "high" -cost_tier = "premium" -skill = "planr-review" -fork_turns = { mode = "none" } - -[profiles.moonshot] -profile = "codex-sol-ultra" -client = "codex" -model = "gpt-5.6-sol" -agent_type = "planr_sol_ultra" -effort = "ultra" -cost_tier = "premium" -fork_turns = { mode = "none" } - -[[routes]] -work_type = "exploration" -role = "explorer" - -[[routes]] -work_type = "research" -role = "explorer" - -[[routes]] -work_type = "code" -role = "worker" - -[[routes]] -work_type = "mechanical" -role = "mechanical" - -[[routes]] -work_type = "review" -role = "reviewer" - -[[routes]] -work_type = "moonshot" -role = "moonshot" - -[verification] -id = "builtin-codex-native-v2" -verified_at_unix = 1784160000 -max_age_seconds = 31536000 - -[[artifacts]] -path = ".codex/agents/planr-sol-medium.toml" -kind = "codex_agent" -content = '''name = "planr_sol_medium" -description = "Normal Planr orchestration and synthesis." -model = "gpt-5.6-sol" -model_reasoning_effort = "medium" -sandbox_mode = "workspace-write" - -developer_instructions = """ -Orchestrate the Planr map, delegate bounded work by agent type, and retain synthesis ownership. -""" -''' - -[[artifacts]] -path = ".codex/agents/planr-terra-medium.toml" -kind = "codex_agent" -content = '''name = "planr_terra_medium" -description = "Repository exploration and research." -model = "gpt-5.6-terra" -model_reasoning_effort = "medium" -sandbox_mode = "read-only" - -developer_instructions = """ -Explore the assigned scope, report concrete evidence, and do not edit files. -""" -''' - -[[artifacts]] -path = ".codex/agents/planr-terra-high.toml" -kind = "codex_agent" -content = '''name = "planr_terra_high" -description = "Normal implementation and testing." -model = "gpt-5.6-terra" -model_reasoning_effort = "high" -sandbox_mode = "workspace-write" - -developer_instructions = """ -Use the planr-work skill for one picked item, implement the smallest correct slice, and record real verification evidence. -""" -''' - -[[artifacts]] -path = ".codex/agents/planr-luna-xhigh.toml" -kind = "codex_agent" -content = '''name = "planr_luna_xhigh" -description = "Bounded checklist-driven and mechanical implementation." -model = "gpt-5.6-luna" -model_reasoning_effort = "xhigh" -sandbox_mode = "workspace-write" - -developer_instructions = """ -Use the planr-work skill for one tightly bounded item, follow the checklist exactly, verify the result, and stop. -""" -''' - -[[artifacts]] -path = ".codex/agents/planr-sol-high.toml" -kind = "codex_agent" -content = '''name = "planr_sol_high" -description = "Independent final review." -model = "gpt-5.6-sol" -model_reasoning_effort = "high" -sandbox_mode = "read-only" - -developer_instructions = """ -Use the planr-review skill, independently verify acceptance criteria and evidence, and report findings before the verdict. -""" -''' - -[[artifacts]] -path = ".codex/agents/planr-sol-ultra.toml" -kind = "codex_agent" -content = '''name = "planr_sol_ultra" -description = "Explicit moonshot planning only." -model = "gpt-5.6-sol" -model_reasoning_effort = "ultra" -sandbox_mode = "read-only" - -developer_instructions = """ -Work only on an explicitly selected moonshot planning task; do not treat this role as the balanced default. -""" -''' - -[[artifacts]] -path = ".codex/skills/planr-native-routing/SKILL.md" -kind = "codex_skill" -content = '''--- -name: planr-native-routing -description: Dispatch Planr work through the repository-owned native Codex Sol, Terra, and Luna roles generated by the selected preset. ---- -# Planr native Codex routing - -Use the generated repository roles directly. The role file owns its model and reasoning effort; do not repeat or override those values at the call site. - -| Work type | Native dispatch | -| --- | --- | -| exploration or research | `spawn_agent({ agent_type: "planr_terra_medium", fork_turns: "none", ... })` | -| code | `spawn_agent({ agent_type: "planr_terra_high", fork_turns: "none", ... })` | -| mechanical | `spawn_agent({ agent_type: "planr_luna_xhigh", fork_turns: "none", ... })` | -| review | `spawn_agent({ agent_type: "planr_sol_high", fork_turns: "none", ... })` | -| explicitly selected moonshot planning | `spawn_agent({ agent_type: "planr_sol_ultra", fork_turns: "none", ... })` | - -The parent remains the generated `planr_sol_medium` driver. Every dispatch that changes role, model, or reasoning effort must name `agent_type` and use `fork_turns: "none"` or an evidenced positive bounded integer. Native Codex rejects `fork_turns: "all"` when `agent_type` selects a role with model or effort overrides. Global Codex CLI `-m` or `-c model_reasoning_effort=...` flags also override spawned role files, so leave those flags unset when role-local child routing is required. Do not use implicit model inheritance or a fallback role. -''' diff --git a/planr-routing/host-bindings/cursor-fable-grok.toml b/planr-routing/host-bindings/cursor-fable-grok.toml deleted file mode 100644 index 1414893..0000000 --- a/planr-routing/host-bindings/cursor-fable-grok.toml +++ /dev/null @@ -1,49 +0,0 @@ -schema_version = 1 -id = "cursor-fable-grok" -version = "1.0.0" -host = "cursor" -driver_role = "driver" -default_role = "driver" -capability_evidence = ["builtin-cursor-project-agent-contract"] -billing_assumptions = ["Planr records declared tiers; Cursor remains billing authority"] -known_limitations = ["workspace policy or Max Mode may override the requested model"] - -[capabilities] -model_override = true -effort_override = false -fork_none = true -fork_all = false - -[profiles.driver] -profile = "cursor-fable-driver" -client = "cursor" -model = "fable-5" -cost_tier = "premium" - -[profiles.worker] -profile = "cursor-grok-worker" -client = "cursor" -model = "grok-code-fast-1" -cost_tier = "standard" -skill = "planr-work" -fork_turns = { mode = "none" } - -[[routes]] -work_type = "code" -role = "worker" -fallback_roles = ["driver"] - -[verification] -id = "builtin-cursor-fable-grok-v1" -verified_at_unix = 1783987200 -max_age_seconds = 31536000 - -[[artifacts]] -path = ".cursor/agents/planr-preset-worker.md" -kind = "cursor_agent" -content = '''--- -name: planr-preset-worker -model: grok-code-fast-1 ---- -Use the planr-work skill and preserve Planr evidence. -''' diff --git a/planr-routing/host-bindings/cursor-openai.toml b/planr-routing/host-bindings/cursor-openai.toml deleted file mode 100644 index 9bd00bb..0000000 --- a/planr-routing/host-bindings/cursor-openai.toml +++ /dev/null @@ -1,49 +0,0 @@ -schema_version = 1 -id = "cursor-openai" -version = "1.0.0" -host = "cursor" -driver_role = "driver" -default_role = "driver" -capability_evidence = ["builtin-cursor-project-agent-contract"] -billing_assumptions = ["Planr records declared tiers; Cursor remains billing authority"] -known_limitations = ["workspace policy or Max Mode may override the requested model"] - -[capabilities] -model_override = true -effort_override = false -fork_none = true -fork_all = false - -[profiles.driver] -profile = "cursor-openai-driver" -client = "cursor" -model = "gpt-5.5" -cost_tier = "premium" - -[profiles.worker] -profile = "cursor-openai-worker" -client = "cursor" -model = "gpt-5.4-mini" -cost_tier = "standard" -skill = "planr-work" -fork_turns = { mode = "none" } - -[[routes]] -work_type = "code" -role = "worker" -fallback_roles = ["driver"] - -[verification] -id = "builtin-cursor-openai-v1" -verified_at_unix = 1783987200 -max_age_seconds = 31536000 - -[[artifacts]] -path = ".cursor/agents/planr-preset-worker.md" -kind = "cursor_agent" -content = '''--- -name: planr-preset-worker -model: gpt-5.4-mini ---- -Use the planr-work skill and preserve Planr evidence. -''' diff --git a/planr-routing/host-bindings/mixed-host.toml b/planr-routing/host-bindings/mixed-host.toml deleted file mode 100644 index 0dd0500..0000000 --- a/planr-routing/host-bindings/mixed-host.toml +++ /dev/null @@ -1,140 +0,0 @@ -schema_version = 1 -id = "mixed-host" -version = "2.0.0" -host = "mixed-host" -driver_role = "driver" -default_role = "driver" -capability_evidence = ["codex-0.144.0-native-v2-9ff47868eb", "builtin-cursor-project-agent-contract"] -billing_assumptions = ["Each host remains authoritative for its own billing and availability"] -known_limitations = ["effective route evidence must be collected independently from each active host backend"] - -[capabilities] -model_override = true -effort_override = true -fork_none = true -fork_all = true - -[profiles.driver] -profile = "mixed-cursor-fable-driver" -client = "cursor" -model = "fable-5" -cost_tier = "premium" - -[profiles.worker] -profile = "mixed-codex-terra-high" -client = "codex" -model = "gpt-5.6-terra" -agent_type = "planr_terra_high" -effort = "high" -cost_tier = "standard" -skill = "planr-work" -fork_turns = { mode = "none" } - -[profiles.mechanical] -profile = "mixed-codex-luna-xhigh" -client = "codex" -model = "gpt-5.6-luna" -agent_type = "planr_luna_xhigh" -effort = "xhigh" -cost_tier = "premium" -skill = "planr-work" -fork_turns = { mode = "none" } - -[profiles.reviewer] -profile = "mixed-codex-sol-high" -client = "codex" -model = "gpt-5.6-sol" -agent_type = "planr_sol_high" -effort = "high" -cost_tier = "premium" -skill = "planr-review" -fork_turns = { mode = "none" } - -[[routes]] -work_type = "code" -role = "worker" - -[[routes]] -work_type = "mechanical" -role = "mechanical" - -[[routes]] -work_type = "review" -role = "reviewer" - -[verification] -id = "builtin-mixed-host-native-v2" -verified_at_unix = 1784160000 -max_age_seconds = 31536000 - -[[artifacts]] -path = ".cursor/agents/planr-fable-driver.md" -kind = "cursor_agent" -content = '''--- -name: planr-fable-driver -model: fable-5 ---- -Orchestrate the Planr map and dispatch bounded Codex worker roles. -''' - -[[artifacts]] -path = ".codex/agents/planr-terra-high.toml" -kind = "codex_agent" -content = '''name = "planr_terra_high" -description = "Normal implementation and testing." -model = "gpt-5.6-terra" -model_reasoning_effort = "high" -sandbox_mode = "workspace-write" - -developer_instructions = """ -Use the planr-work skill for one picked item, implement the smallest correct slice, and record real verification evidence. -""" -''' - -[[artifacts]] -path = ".codex/agents/planr-luna-xhigh.toml" -kind = "codex_agent" -content = '''name = "planr_luna_xhigh" -description = "Bounded checklist-driven and mechanical implementation." -model = "gpt-5.6-luna" -model_reasoning_effort = "xhigh" -sandbox_mode = "workspace-write" - -developer_instructions = """ -Use the planr-work skill for one tightly bounded item, follow the checklist exactly, verify the result, and stop. -""" -''' - -[[artifacts]] -path = ".codex/agents/planr-sol-high.toml" -kind = "codex_agent" -content = '''name = "planr_sol_high" -description = "Independent final review." -model = "gpt-5.6-sol" -model_reasoning_effort = "high" -sandbox_mode = "read-only" - -developer_instructions = """ -Use the planr-review skill, independently verify acceptance criteria and evidence, and report findings before the verdict. -""" -''' - -[[artifacts]] -path = ".codex/skills/planr-native-routing/SKILL.md" -kind = "codex_skill" -content = '''--- -name: planr-native-routing -description: Dispatch mixed-host Planr work from the Cursor driver through repository-owned native Codex worker roles. ---- -# Planr mixed-host native routing - -The Cursor `planr-fable-driver` remains the driver. Dispatch Codex work through these generated repository roles; each role file owns its model and reasoning effort. - -| Work type | Native dispatch | -| --- | --- | -| code | `spawn_agent({ agent_type: "planr_terra_high", fork_turns: "none", ... })` | -| mechanical | `spawn_agent({ agent_type: "planr_luna_xhigh", fork_turns: "none", ... })` | -| review | `spawn_agent({ agent_type: "planr_sol_high", fork_turns: "none", ... })` | - -Every dispatch that changes role, model, or reasoning effort must name `agent_type` and use `fork_turns: "none"` or an evidenced positive bounded integer. Native Codex rejects `fork_turns: "all"` when `agent_type` selects a role with model or effort overrides. Global Codex CLI `-m` or `-c model_reasoning_effort=...` flags also override spawned role files, so leave those flags unset when role-local child routing is required. Do not use implicit model inheritance or a fallback role. -''' diff --git a/planr-routing/package.json b/planr-routing/package.json deleted file mode 100644 index 8c3ea59..0000000 --- a/planr-routing/package.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "name": "@instructa/planr-routing-catalog", - "version": "0.1.0", - "private": true, - "description": "Official Planr routing policy catalog and Cloudflare publication stack.", - "license": "MIT", - "type": "module", - "scripts": { - "alchemy:check-runtime": "node scripts/check-alchemy-runtime.mjs", - "catalog:regenerate": "node scripts/regenerate-preset-catalog.mjs", - "deploy:test": "node scripts/cloudflare-test.mjs deploy", - "destroy:test": "node scripts/cloudflare-test.mjs destroy", - "site:build": "node scripts/build-site.mjs", - "site:check": "pnpm site:test && pnpm site:build", - "site:test": "node --test website/*.test.mjs", - "site:serve": "node website/serve.mjs" - }, - "devDependencies": { - "@cloudflare/workers-types": "5.20260717.1", - "alchemy": "0.93.12", - "wrangler": "4.112.0" - }, - "engines": { - "node": ">=22" - }, - "packageManager": "pnpm@11.5.3+sha512.7ac1c919341c213a34dc0d02afb7143c5c26ac26ee8c4782deea821b8ac64d2134a081fd8941dae6e29bbb48f58dfc2b7fbceeccc07cb2f09d219d342a4969ed" -} diff --git a/planr-routing/scripts/build-site.mjs b/planr-routing/scripts/build-site.mjs deleted file mode 100644 index 2f915be..0000000 --- a/planr-routing/scripts/build-site.mjs +++ /dev/null @@ -1,87 +0,0 @@ -#!/usr/bin/env node -import { copyFile, mkdir, readdir, rm, stat } from "node:fs/promises"; -import { dirname, join, relative, resolve, sep } from "node:path"; -import { fileURLToPath } from "node:url"; - -export const PUBLIC_SITE_FILES = Object.freeze([ - "_headers", - "app.mjs", - "catalog-model.mjs", - "data/catalog.json", - "index.html", - "styles.css", -]); - -async function regularFile(path) { - try { - return (await stat(path)).isFile(); - } catch (error) { - if (error?.code === "ENOENT") return false; - throw error; - } -} - -export async function publicationFiles(root) { - const files = []; - - async function visit(directory) { - for (const entry of await readdir(directory, { withFileTypes: true })) { - const path = join(directory, entry.name); - if (entry.isDirectory()) await visit(path); - else if (entry.isFile()) files.push(relative(root, path).split(sep).join("/")); - else throw new Error(`publish output contains unsupported entry: ${relative(root, path)}`); - } - } - - await visit(root); - return files.sort(); -} - -export async function verifyPublication(root) { - const actual = await publicationFiles(root); - const expected = [...PUBLIC_SITE_FILES].sort(); - if (JSON.stringify(actual) !== JSON.stringify(expected)) { - throw new Error( - `publish output mismatch\nexpected: ${expected.join(", ")}\nactual: ${actual.join(", ")}`, - ); - } - return actual; -} - -export async function buildSite({ sourceRoot, outputRoot }) { - const source = resolve(sourceRoot); - const output = resolve(outputRoot); - if (output === source || output.startsWith(`${source}${sep}`)) { - throw new Error("publish output must not be inside the website source directory"); - } - - for (const relativePath of PUBLIC_SITE_FILES) { - const input = join(source, relativePath); - if (!(await regularFile(input))) { - throw new Error(`missing public website artifact: ${relativePath}`); - } - } - - await rm(output, { recursive: true, force: true }); - for (const relativePath of PUBLIC_SITE_FILES) { - const destination = join(output, relativePath); - await mkdir(dirname(destination), { recursive: true }); - await copyFile(join(source, relativePath), destination); - } - - return verifyPublication(output); -} - -const modulePath = fileURLToPath(import.meta.url); -if (process.argv[1] && resolve(process.argv[1]) === modulePath) { - const repositoryRoot = resolve(dirname(modulePath), ".."); - buildSite({ - sourceRoot: join(repositoryRoot, "website"), - outputRoot: join(repositoryRoot, "dist", "website"), - }) - .then((files) => console.log(`built ${files.length} public website artifacts in dist/website`)) - .catch((error) => { - console.error(error instanceof Error ? error.message : error); - process.exitCode = 1; - }); -} diff --git a/planr-routing/scripts/check-alchemy-runtime.mjs b/planr-routing/scripts/check-alchemy-runtime.mjs deleted file mode 100644 index 654685d..0000000 --- a/planr-routing/scripts/check-alchemy-runtime.mjs +++ /dev/null @@ -1,26 +0,0 @@ -#!/usr/bin/env node -import { resolve } from "node:path"; -import { fileURLToPath } from "node:url"; - -export const MINIMUM_ALCHEMY_NODE_MAJOR = 22; - -export function assertAlchemyRuntime(version = process.versions.node) { - const major = Number.parseInt(String(version).split(".", 1)[0], 10); - if (!Number.isSafeInteger(major) || major < MINIMUM_ALCHEMY_NODE_MAJOR) { - throw new Error( - `Cloudflare deployment requires Node.js ${MINIMUM_ALCHEMY_NODE_MAJOR} or newer; current runtime is ${version}. ` + - "The published Planr CLI remains compatible with Node.js 18 or newer.", - ); - } - return major; -} - -if (process.argv[1] && resolve(process.argv[1]) === fileURLToPath(import.meta.url)) { - try { - const major = assertAlchemyRuntime(); - console.log(`Alchemy deployment runtime ready (Node.js ${major})`); - } catch (error) { - console.error(error instanceof Error ? error.message : error); - process.exitCode = 1; - } -} diff --git a/planr-routing/scripts/cloudflare-test.mjs b/planr-routing/scripts/cloudflare-test.mjs deleted file mode 100644 index 7c36be1..0000000 --- a/planr-routing/scripts/cloudflare-test.mjs +++ /dev/null @@ -1,38 +0,0 @@ -#!/usr/bin/env node -import { spawnSync } from "node:child_process"; -import { resolve } from "node:path"; -import { fileURLToPath } from "node:url"; -import { assertAlchemyRuntime } from "./check-alchemy-runtime.mjs"; - -export function cloudflareTestSteps(action) { - if (action === "deploy") { - return [ - ["pnpm", ["site:check"]], - ["pnpm", ["exec", "alchemy", "deploy", "--stage", "test"]], - ]; - } - if (action === "destroy") { - return [["pnpm", ["exec", "alchemy", "destroy", "--stage", "test"]]]; - } - throw new Error("usage: node scripts/cloudflare-test.mjs "); -} - -export function runCloudflareTest(action, spawn = spawnSync) { - assertAlchemyRuntime(); - for (const [command, args] of cloudflareTestSteps(action)) { - const result = spawn(command, args, { stdio: "inherit", env: process.env }); - if (result.error) throw result.error; - if (result.status !== 0) { - throw new Error(`${command} ${args.join(" ")} exited with status ${result.status}`); - } - } -} - -if (process.argv[1] && resolve(process.argv[1]) === fileURLToPath(import.meta.url)) { - try { - runCloudflareTest(process.argv[2]); - } catch (error) { - console.error(error instanceof Error ? error.message : error); - process.exitCode = 1; - } -} diff --git a/planr-routing/scripts/regenerate-preset-catalog.mjs b/planr-routing/scripts/regenerate-preset-catalog.mjs deleted file mode 100644 index 47b6aa0..0000000 --- a/planr-routing/scripts/regenerate-preset-catalog.mjs +++ /dev/null @@ -1,35 +0,0 @@ -#!/usr/bin/env node -import { spawnSync } from "node:child_process"; -import { dirname, resolve } from "node:path"; -import { fileURLToPath } from "node:url"; - -const packageRoot = resolve(dirname(fileURLToPath(import.meta.url)), ".."); - -function option(name, fallback) { - const index = process.argv.indexOf(name); - return index === -1 ? fallback : process.argv[index + 1]; -} - -const routingBin = resolve(packageRoot, option("--routing-bin", "../target/release/planr-routing")); -const catalog = resolve(packageRoot, "website/data/catalog.json"); - -function run(args) { - const result = spawnSync(routingBin, args, { - cwd: packageRoot, - stdio: "inherit", - env: process.env, - }); - if (result.error) throw result.error; - if (result.status !== 0) { - throw new Error(`${routingBin} ${args.join(" ")} exited with status ${result.status}`); - } -} - -try { - run(["catalog", "build", "--output", catalog]); - run(["catalog", "verify", catalog]); - console.log("regenerated 20 experimental routing compositions from package-owned sources"); -} catch (error) { - console.error(error instanceof Error ? error.message : error); - process.exitCode = 1; -} diff --git a/planr-routing/src/lib.rs b/planr-routing/src/lib.rs deleted file mode 100644 index 62fc15b..0000000 --- a/planr-routing/src/lib.rs +++ /dev/null @@ -1,926 +0,0 @@ -//! Official, optional routing-policy compiler for Planr. -//! -//! This package is the sole owner of named usage policies, model names, host -//! bindings, routing topologies, and generated host artifacts. It emits the -//! provider-neutral `RoutingBundle v1` contract consumed by Planr core. - -use anyhow::{Result, bail}; -use ed25519_dalek::{Signature, Signer, SigningKey, Verifier, VerifyingKey}; -use serde::{Deserialize, Serialize}; -use serde_json::{Value, json}; -use sha2::{Digest, Sha256}; -use std::collections::BTreeMap; -use std::process::Command; - -const PACKAGE_VERSION: &str = env!("CARGO_PKG_VERSION"); -const GENERATED_AT: &str = "2026-07-16T00:00:00Z"; -const GENERATED_AT_UNIX: i64 = 1_784_160_000; -const EVALUATION_SUITE: &str = include_str!("../evaluations/preset-suite-v1.toml"); - -const POLICIES: [(&str, &str); 4] = [ - ("balanced", include_str!("../usage-policies/balanced.toml")), - ( - "low-usage", - include_str!("../usage-policies/low-usage.toml"), - ), - ( - "max-quality", - include_str!("../usage-policies/max-quality.toml"), - ), - ( - "read-only-audit", - include_str!("../usage-policies/read-only-audit.toml"), - ), -]; - -const BINDINGS: [(&str, &str); 5] = [ - ( - "codex-openai", - include_str!("../host-bindings/codex-openai.toml"), - ), - ( - "cursor-openai", - include_str!("../host-bindings/cursor-openai.toml"), - ), - ( - "cursor-fable-grok", - include_str!("../host-bindings/cursor-fable-grok.toml"), - ), - ( - "claude-native", - include_str!("../host-bindings/claude-native.toml"), - ), - ( - "mixed-host", - include_str!("../host-bindings/mixed-host.toml"), - ), -]; - -#[derive(Debug, Clone, Serialize, PartialEq, Eq)] -pub struct PolicySource { - pub policy_id: String, - pub host: String, - pub policy_version: String, - pub binding_id: String, - pub binding_version: String, - pub generated_at: String, - pub requirements: Vec, - pub profiles: BTreeMap, - pub routes: Vec, - pub route_default: Option, - pub artifacts: Vec, - pub evidence: EvaluationEvidence, - #[serde(skip)] - usage_policy: String, -} - -#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] -pub struct HostRequirement { - pub host: String, - #[serde(default)] - pub capabilities: Vec, -} - -#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] -pub struct Profile { - pub client: String, - pub model: String, - #[serde(default, skip_serializing_if = "Option::is_none")] - pub agent_type: Option, - #[serde(default, skip_serializing_if = "Option::is_none")] - pub effort: Option, - #[serde(default, skip_serializing_if = "Option::is_none")] - pub cost_tier: Option, - #[serde(default, skip_serializing_if = "Vec::is_empty")] - pub capabilities: Vec, - #[serde(default, skip_serializing_if = "Option::is_none")] - pub skill: Option, - #[serde(default, skip_serializing_if = "Option::is_none")] - pub notes: Option, -} - -#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] -pub struct RouteSelector { - #[serde(default, skip_serializing_if = "Option::is_none")] - pub work_type: Option, - #[serde(default, skip_serializing_if = "Option::is_none")] - pub plan: Option, -} - -#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] -pub struct Route { - #[serde(rename = "match")] - pub selector: RouteSelector, - pub profile: String, - #[serde(default)] - pub fallbacks: Vec, -} - -#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] -pub struct DefaultRoute { - pub profile: String, - #[serde(default)] - pub fallbacks: Vec, -} - -#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] -pub struct SourceArtifact { - pub path: String, - pub media_type: String, - pub mode: String, - pub content: String, -} - -#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] -pub struct EvaluationEvidence { - #[serde(default)] - pub evaluation_ids: Vec, - pub status: String, -} - -#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] -pub struct RoutingBundleV1 { - pub schema_version: u32, - pub bundle_id: String, - pub policy_id: String, - pub policy_version: String, - pub generated_at: String, - pub source: BundleSource, - pub requirements: Vec, - pub profiles: BTreeMap, - pub routes: Vec, - #[serde(skip_serializing_if = "Option::is_none")] - pub route_default: Option, - pub artifacts: Vec, - pub evidence: EvaluationEvidence, -} - -#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] -pub struct BundleSource { - pub package: String, - pub package_version: String, -} - -#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] -pub struct BundleArtifact { - pub path: String, - pub media_type: String, - pub mode: String, - pub content: String, - pub sha256: String, -} - -#[derive(Debug, Clone, Serialize)] -pub struct PolicySummary { - pub policy_id: String, - pub host: String, - pub policy_version: String, - pub binding_id: String, - pub binding_version: String, - pub profile_count: usize, - pub artifact_count: usize, - pub evidence_status: String, -} - -#[derive(Debug, Deserialize)] -struct UsagePolicyHeader { - id: String, - version: String, -} - -#[derive(Debug, Deserialize)] -struct HostBinding { - id: String, - version: String, - host: String, - default_role: Option, - capabilities: BindingCapabilities, - profiles: BTreeMap, - #[serde(default)] - routes: Vec, - verification: BindingVerification, - #[serde(default)] - artifacts: Vec, -} - -#[derive(Debug, Deserialize)] -struct BindingCapabilities { - model_override: bool, - effort_override: bool, - fork_none: bool, - fork_all: bool, -} - -#[derive(Debug, Deserialize)] -struct BindingProfile { - profile: String, - client: String, - model: String, - agent_type: Option, - effort: Option, - cost_tier: Option, - skill: Option, -} - -#[derive(Debug, Deserialize)] -struct BindingRoute { - work_type: String, - role: String, - #[serde(default)] - fallback_roles: Vec, -} - -#[derive(Debug, Deserialize)] -struct BindingVerification { - id: String, -} - -#[derive(Debug, Deserialize)] -struct BindingArtifact { - path: String, - kind: String, - content: String, -} - -pub fn list_policies() -> Result> { - let mut summaries = Vec::new(); - for (policy, _) in POLICIES { - for (host, _) in BINDINGS { - let source = show_policy(policy, host)?; - summaries.push(PolicySummary { - policy_id: source.policy_id, - host: source.host, - policy_version: source.policy_version, - binding_id: source.binding_id, - binding_version: source.binding_version, - profile_count: source.profiles.len(), - artifact_count: source.artifacts.len() + 2, - evidence_status: source.evidence.status, - }); - } - } - Ok(summaries) -} - -pub fn show_policy(policy: &str, host: &str) -> Result { - let policy_raw = POLICIES - .iter() - .find(|(id, _)| *id == policy) - .map(|(_, raw)| *raw) - .ok_or_else(|| anyhow::anyhow!("unknown routing policy `{policy}`"))?; - let binding_raw = BINDINGS - .iter() - .find(|(id, _)| *id == host) - .map(|(_, raw)| *raw) - .ok_or_else(|| anyhow::anyhow!("unknown routing host `{host}`"))?; - let policy_header: UsagePolicyHeader = toml::from_str(policy_raw)?; - let binding: HostBinding = toml::from_str(binding_raw)?; - - let profiles = binding - .profiles - .values() - .map(|profile| { - ( - profile.profile.clone(), - Profile { - client: profile.client.clone(), - model: profile.model.clone(), - agent_type: profile.agent_type.clone(), - effort: profile.effort.clone(), - cost_tier: profile.cost_tier.clone(), - capabilities: Vec::new(), - skill: profile.skill.clone(), - notes: None, - }, - ) - }) - .collect::>(); - let routes = binding - .routes - .iter() - .map(|route| { - Ok(Route { - selector: RouteSelector { - work_type: Some(route.work_type.clone()), - plan: None, - }, - profile: binding_profile_id(&binding, &route.role)?.to_string(), - fallbacks: route - .fallback_roles - .iter() - .map(|role| binding_profile_id(&binding, role).map(ToOwned::to_owned)) - .collect::>>()?, - }) - }) - .collect::>>()?; - let route_default = binding - .default_role - .as_deref() - .map(|role| -> Result { - Ok(DefaultRoute { - profile: binding_profile_id(&binding, role)?.to_string(), - fallbacks: Vec::new(), - }) - }) - .transpose()?; - let artifacts = binding - .artifacts - .into_iter() - .map(|artifact| SourceArtifact { - media_type: media_type_for(&artifact.path, &artifact.kind), - path: artifact.path, - mode: "create".to_string(), - content: artifact.content, - }) - .collect(); - let mut capabilities = Vec::new(); - if binding.capabilities.model_override { - capabilities.push("model_override".to_string()); - } - if binding.capabilities.effort_override { - capabilities.push("reasoning_effort".to_string()); - } - if binding.capabilities.fork_none { - capabilities.push("fork_none".to_string()); - } - if binding.capabilities.fork_all { - capabilities.push("bounded_context_fork".to_string()); - } - Ok(PolicySource { - policy_id: policy_header.id, - host: host.to_string(), - policy_version: policy_header.version, - binding_id: binding.id, - binding_version: binding.version, - generated_at: GENERATED_AT.to_string(), - requirements: vec![HostRequirement { - host: binding.host, - capabilities, - }], - profiles, - routes, - route_default, - artifacts, - evidence: EvaluationEvidence { - evaluation_ids: vec![binding.verification.id], - status: "experimental".to_string(), - }, - usage_policy: policy_raw.to_string(), - }) -} - -pub fn compile_policy(policy: &str, host: &str) -> Result { - let source = show_policy(policy, host)?; - validate_source(&source)?; - let registry = render_registry(&source)?; - let mut artifacts = vec![ - bundle_artifact(SourceArtifact { - path: ".planr/agents.toml".to_string(), - media_type: "application/toml".to_string(), - mode: "replace".to_string(), - content: registry, - }), - bundle_artifact(SourceArtifact { - path: ".planr/policy.toml".to_string(), - media_type: "application/toml".to_string(), - mode: "replace".to_string(), - content: source.usage_policy.clone(), - }), - ]; - artifacts.extend(source.artifacts.iter().cloned().map(bundle_artifact)); - artifacts.sort_by(|left, right| left.path.cmp(&right.path)); - - Ok(RoutingBundleV1 { - schema_version: 1, - bundle_id: format!( - "{}-{}@{}+{}", - source.policy_id, source.host, source.policy_version, source.binding_version - ), - policy_id: source.policy_id, - policy_version: source.policy_version, - generated_at: source.generated_at, - source: BundleSource { - package: "planr-routing".to_string(), - package_version: PACKAGE_VERSION.to_string(), - }, - requirements: source.requirements, - profiles: source.profiles, - routes: source.routes, - route_default: source.route_default, - artifacts, - evidence: source.evidence, - }) -} - -pub fn compile_json(policy: &str, host: &str) -> Result { - let mut json = serde_json::to_string_pretty(&compile_policy(policy, host)?)?; - json.push('\n'); - Ok(json) -} - -#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] -pub struct ProbeReport { - pub host: String, - pub command: Option, - pub available: bool, - pub version: Option, - pub capabilities: Vec, - pub authentication: String, - pub limitation: Option, -} - -pub fn probe_host(host: &str, command_override: Option<&str>) -> Result { - let source = show_policy("balanced", host)?; - let requirement = source - .requirements - .first() - .ok_or_else(|| anyhow::anyhow!("binding has no host requirement"))?; - let default_command = match requirement.host.as_str() { - "codex" => Some("codex"), - "cursor" => Some("cursor-agent"), - "claude-code" => Some("claude"), - "mixed-host" => None, - _ => None, - }; - let command = command_override.or(default_command); - let (available, version, limitation) = if let Some(command) = command { - match Command::new(command).arg("--version").output() { - Ok(output) if output.status.success() => ( - true, - Some(String::from_utf8_lossy(&output.stdout).trim().to_string()), - None, - ), - Ok(output) => ( - false, - None, - Some(format!("version probe exited with {}", output.status)), - ), - Err(error) => (false, None, Some(error.to_string())), - } - } else { - ( - false, - None, - Some("mixed-host bindings require separate probes for each declared host".to_string()), - ) - }; - Ok(ProbeReport { - host: host.to_string(), - command: command.map(ToOwned::to_owned), - available, - version, - capabilities: requirement.capabilities.clone(), - authentication: "not_tested".to_string(), - limitation, - }) -} - -#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] -pub struct EvaluationReport { - pub schema_version: u32, - pub suite_id: String, - pub suite_version: String, - pub suite_sha256: String, - pub policy_id: String, - pub host: String, - pub bundle_sha256: String, - pub scenario_count: usize, - pub offline_reproducible: bool, - pub live_evidence: Option, - pub status: String, - pub recommended: bool, -} - -pub fn evaluate_policy(policy: &str, host: &str) -> Result { - let suite: toml::Value = toml::from_str(EVALUATION_SUITE)?; - let suite_id = suite - .get("id") - .and_then(toml::Value::as_str) - .ok_or_else(|| anyhow::anyhow!("evaluation suite is missing id"))?; - let suite_version = suite - .get("version") - .and_then(toml::Value::as_str) - .ok_or_else(|| anyhow::anyhow!("evaluation suite is missing version"))?; - let scenario_count = suite - .get("tasks") - .and_then(toml::Value::as_array) - .map_or(0, Vec::len); - let bundle = compile_json(policy, host)?; - Ok(EvaluationReport { - schema_version: 1, - suite_id: suite_id.to_string(), - suite_version: suite_version.to_string(), - suite_sha256: sha256(EVALUATION_SUITE.as_bytes()), - policy_id: policy.to_string(), - host: show_policy(policy, host)?.host, - bundle_sha256: sha256(bundle.as_bytes()), - scenario_count, - offline_reproducible: scenario_count > 0, - live_evidence: None, - status: "experimental".to_string(), - recommended: false, - }) -} - -pub fn catalog_value() -> Result { - let mut compositions = Vec::new(); - for summary in list_policies()? { - let source = show_policy(&summary.policy_id, &summary.host)?; - let report = evaluate_policy(&summary.policy_id, &summary.host)?; - let policy: toml::Value = toml::from_str(&source.usage_policy)?; - let bundle = compile_policy(&summary.policy_id, &summary.host)?; - let usage = policy - .get("usage") - .cloned() - .unwrap_or_else(|| toml::Value::Table(Default::default())); - let transitions = policy - .get("transitions") - .cloned() - .unwrap_or_else(|| toml::Value::Table(Default::default())); - let materiality = policy - .get("materiality") - .cloned() - .unwrap_or_else(|| toml::Value::Table(Default::default())); - let execution = policy - .get("execution") - .cloned() - .unwrap_or_else(|| toml::Value::Table(Default::default())); - compositions.push(json!({ - "id": format!("{}-{}@{}+{}", summary.policy_id, summary.binding_id, summary.policy_version, summary.binding_version), - "entryId": format!("{}-{}", summary.policy_id, summary.binding_id), - "entryVersion": format!("{}+{}", summary.policy_version, summary.binding_version), - "status": report.status, - "statusLabel": "Experimental", - "recommended": false, - "freshness": "current", - "lifecycle": "published", - "replacement": Value::Null, - "policy": { - "id": summary.policy_id, - "version": summary.policy_version, - "usage": usage, - "transitions": transitions, - "materiality": materiality, - "execution": execution, - }, - "binding": { - "id": summary.binding_id, - "selector": summary.host, - "version": summary.binding_version, - "host": source.requirements.first().map(|requirement| requirement.host.clone()), - "profiles": bundle.profiles, - "dispatch": bundle.routes, - }, - "compatibility": { - "hosts": source.requirements.iter().map(|requirement| requirement.host.clone()).collect::>(), - "minPlanrVersion": "1.4.0", - "maxPlanrVersion": Value::Null, - }, - "enforcement": [ - {"dimension": "Repository writes", "state": "verified", "detail": "Core previews and applies only allowlisted repository-local bundle artifacts."}, - {"dimension": "Model and effort", "state": "host_enforced", "detail": "The package generates exact host roles; the host remains execution authority."}, - {"dimension": "Effective route evidence", "state": "unavailable", "detail": "No authenticated live-host evidence is published for this generated catalog entry."} - ], - "evaluation": { - "suiteId": report.suite_id, - "suiteVersion": report.suite_version, - "evaluatedAtUnix": GENERATED_AT_UNIX, - "reviewAtUnix": Value::Null, - "status": report.status, - "metrics": {"runs": 0, "oracle_passes": 0, "average_quality_score_bps": Value::Null}, - "thresholds": {}, - "resultHashes": [], - "fixtureSha256": report.suite_sha256, - }, - "registry": { - "id": "planr-routing-official", - "version": PACKAGE_VERSION, - "manifestSha256": report.bundle_sha256, - "signer": Value::Null, - "signatureVerified": false, - "trustedMaintainer": false, - "artifacts": bundle.artifacts.iter().map(|artifact| json!({"path": artifact.path, "sha256": artifact.sha256})).collect::>(), - }, - "command": format!("planr-routing compile {} --host {} --output routing-bundle.json && planr routing bundle preview routing-bundle.json", source.policy_id, source.host), - })); - } - Ok(json!({ - "schemaVersion": 1, - "generatedAtUnix": GENERATED_AT_UNIX, - "source": { - "state": "package_generated", - "entryCount": compositions.len(), - "trust": "planr_routing_unsigned_catalog_v1", - "message": "Entries stay experimental until authenticated live evidence and an offline maintainer signature pass." - }, - "compositions": compositions, - })) -} - -pub fn catalog_json() -> Result { - let mut output = serde_json::to_string_pretty(&catalog_value()?)?; - output.push('\n'); - Ok(output) -} - -#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] -pub struct RegistrySignature { - pub algorithm: String, - pub signer: String, - pub content_sha256: String, - pub value: String, -} - -pub fn sign_registry( - content: &[u8], - signer: &str, - private_key_hex: &str, -) -> Result { - if signer.trim().is_empty() { - bail!("registry signer must not be blank"); - } - let seed = decode_hex::<32>(private_key_hex.trim()).ok_or_else(|| { - anyhow::anyhow!("private key file must contain exactly 64 hexadecimal characters") - })?; - let key = SigningKey::from_bytes(&seed); - let signature = key.sign(content); - Ok(RegistrySignature { - algorithm: "ed25519".to_string(), - signer: signer.to_string(), - content_sha256: sha256(content), - value: encode_hex(&signature.to_bytes()), - }) -} - -pub fn verify_registry_signature( - content: &[u8], - signature: &RegistrySignature, - trusted_signer: &str, - trusted_public_key_hex: &str, -) -> Result<()> { - if signature.algorithm != "ed25519" || signature.content_sha256 != sha256(content) { - bail!("registry signature metadata does not match content"); - } - if trusted_signer.trim().is_empty() || signature.signer != trusted_signer { - bail!("registry signature signer does not match the trusted signer"); - } - let public_key = decode_hex::<32>(trusted_public_key_hex.trim()) - .ok_or_else(|| anyhow::anyhow!("trusted registry public key is invalid"))?; - let signature_bytes = decode_hex::<64>(&signature.value) - .ok_or_else(|| anyhow::anyhow!("registry signature value is invalid"))?; - let key = VerifyingKey::from_bytes(&public_key)?; - key.verify(content, &Signature::from_bytes(&signature_bytes))?; - Ok(()) -} - -fn validate_source(source: &PolicySource) -> Result<()> { - if source.policy_id.trim().is_empty() || source.host.trim().is_empty() { - bail!("routing policy id and host must not be blank"); - } - for route in &source.routes { - if !source.profiles.contains_key(&route.profile) { - bail!("route references unknown profile `{}`", route.profile); - } - } - if let Some(default) = &source.route_default - && !source.profiles.contains_key(&default.profile) - { - bail!( - "default route references unknown profile `{}`", - default.profile - ); - } - if source.evidence.status == "recommended" { - bail!("policy sources cannot claim recommended without the evaluation gate"); - } - Ok(()) -} - -fn binding_profile_id<'a>(binding: &'a HostBinding, role: &str) -> Result<&'a str> { - binding - .profiles - .get(role) - .map(|profile| profile.profile.as_str()) - .ok_or_else(|| anyhow::anyhow!("binding route references unknown role `{role}`")) -} - -fn media_type_for(path: &str, kind: &str) -> String { - if path.ends_with(".toml") { - "application/toml" - } else if path.ends_with(".json") { - "application/json" - } else if path.ends_with(".md") || kind.ends_with("_skill") || kind.ends_with("_agent") { - "text/markdown" - } else { - "text/plain" - } - .to_string() -} - -fn render_registry(source: &PolicySource) -> Result { - #[derive(Serialize)] - struct Registry<'a> { - profiles: &'a BTreeMap, - routes: &'a [Route], - #[serde(skip_serializing_if = "Option::is_none")] - route_default: &'a Option, - } - Ok(toml::to_string_pretty(&Registry { - profiles: &source.profiles, - routes: &source.routes, - route_default: &source.route_default, - })?) -} - -fn bundle_artifact(source: SourceArtifact) -> BundleArtifact { - BundleArtifact { - sha256: sha256(source.content.as_bytes()), - path: source.path, - media_type: source.media_type, - mode: source.mode, - content: source.content, - } -} - -fn sha256(bytes: &[u8]) -> String { - format!("{:x}", Sha256::digest(bytes)) -} - -fn encode_hex(bytes: &[u8]) -> String { - bytes.iter().map(|byte| format!("{byte:02x}")).collect() -} - -fn decode_hex(value: &str) -> Option<[u8; N]> { - if value.len() != N * 2 { - return None; - } - let mut decoded = [0_u8; N]; - for (index, output) in decoded.iter_mut().enumerate() { - *output = u8::from_str_radix(&value[index * 2..index * 2 + 2], 16).ok()?; - } - Some(decoded) -} - -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn complete_policy_binding_pool_compiles_deterministically() { - let summaries = list_policies().unwrap(); - assert_eq!(summaries.len(), 20); - for summary in summaries { - let first = compile_json(&summary.policy_id, &summary.host).unwrap(); - let second = compile_json(&summary.policy_id, &summary.host).unwrap(); - assert_eq!(first, second); - assert!(first.contains(".planr/policy.toml")); - } - } - - #[test] - fn codex_and_mixed_bindings_keep_native_bounded_fork_topology() { - let codex = compile_json("balanced", "codex-openai").unwrap(); - let mixed = compile_json("balanced", "mixed-host").unwrap(); - assert!(codex.contains("gpt-5.6-sol")); - assert!(codex.contains("fork_turns: \\\"none\\\"")); - assert!(mixed.contains("fable-5")); - assert!(mixed.contains("gpt-5.6-terra")); - assert_ne!(codex, mixed); - } - - #[test] - fn codex_agent_types_match_registered_toml_names() { - for host in ["codex-openai", "mixed-host"] { - let bundle = compile_policy("balanced", host).unwrap(); - let registered_names = bundle - .artifacts - .iter() - .filter(|artifact| artifact.path.starts_with(".codex/agents/")) - .map(|artifact| { - toml::from_str::(&artifact.content).unwrap()["name"] - .as_str() - .unwrap() - .to_string() - }) - .collect::>(); - let skill = bundle - .artifacts - .iter() - .find(|artifact| artifact.path.ends_with("planr-native-routing/SKILL.md")); - for profile in bundle - .profiles - .values() - .filter(|profile| profile.client == "codex") - { - let agent_type = profile.agent_type.as_deref().unwrap(); - assert!(registered_names.contains(agent_type)); - assert!(skill.is_some_and(|artifact| artifact.content.contains(agent_type))); - } - } - } - - #[test] - fn generated_registry_is_derived_from_binding_profiles_and_routes() { - for host in BINDINGS.map(|(host, _)| host) { - let bundle = compile_policy("balanced", host).unwrap(); - let registry = bundle - .artifacts - .iter() - .find(|artifact| artifact.path == ".planr/agents.toml") - .unwrap(); - let parsed: toml::Value = toml::from_str(®istry.content).unwrap(); - assert_eq!( - parsed["profiles"].as_table().unwrap().len(), - bundle.profiles.len() - ); - assert_eq!( - parsed["routes"].as_array().unwrap().len(), - bundle.routes.len() - ); - } - } - - #[test] - fn checked_in_contract_fixtures_are_generated_outputs() { - for (host, fixture) in [ - ( - "codex-openai", - include_str!("../fixtures/routing-bundle-v1/valid-balanced-codex.json"), - ), - ( - "mixed-host", - include_str!("../fixtures/routing-bundle-v1/valid-balanced-mixed.json"), - ), - ] { - let generated: serde_json::Value = - serde_json::from_str(&compile_json("balanced", host).unwrap()).unwrap(); - let checked_in: serde_json::Value = serde_json::from_str(fixture).unwrap(); - assert_eq!(generated, checked_in, "regenerate fixture for {host}"); - } - } - - #[test] - fn offline_evaluation_never_claims_live_verification_or_recommendation() { - let report = evaluate_policy("balanced", "codex-openai").unwrap(); - assert!(report.offline_reproducible); - assert!(report.scenario_count >= 7); - assert_eq!(report.status, "experimental"); - assert!(!report.recommended); - } - - #[test] - fn no_in_memory_claim_can_promote_offline_evaluation() { - let report = evaluate_policy("balanced", "codex-openai").unwrap(); - assert!(report.live_evidence.is_none()); - assert_eq!(report.status, "experimental"); - assert!(!report.recommended); - } - - #[test] - fn catalog_is_reproducible_and_contains_the_full_pool() { - let first = catalog_json().unwrap(); - let second = catalog_json().unwrap(); - assert_eq!(first, second); - let value: Value = serde_json::from_str(&first).unwrap(); - assert_eq!(value["compositions"].as_array().unwrap().len(), 20); - assert!( - value["compositions"] - .as_array() - .unwrap() - .iter() - .all(|entry| entry["recommended"] == false) - ); - } - - #[test] - fn registry_signatures_are_content_bound() { - let signing_key = SigningKey::from_bytes(&[7_u8; 32]); - let trusted_public_key = encode_hex(signing_key.verifying_key().as_bytes()); - let signature = sign_registry(b"catalog", "fixture", &"07".repeat(32)).unwrap(); - verify_registry_signature(b"catalog", &signature, "fixture", &trusted_public_key).unwrap(); - assert!( - verify_registry_signature(b"tampered", &signature, "fixture", &trusted_public_key) - .is_err() - ); - let attacker_key = encode_hex( - SigningKey::from_bytes(&[8_u8; 32]) - .verifying_key() - .as_bytes(), - ); - assert!( - verify_registry_signature(b"catalog", &signature, "fixture", &attacker_key).is_err() - ); - assert!( - verify_registry_signature(b"catalog", &signature, "attacker", &trusted_public_key) - .is_err() - ); - } - - #[test] - fn probe_does_not_infer_authentication_from_version_availability() { - let report = - probe_host("codex-openai", Some("definitely-not-a-planr-host-command")).unwrap(); - assert!(!report.available); - assert_eq!(report.authentication, "not_tested"); - } -} diff --git a/planr-routing/src/main.rs b/planr-routing/src/main.rs deleted file mode 100644 index f895811..0000000 --- a/planr-routing/src/main.rs +++ /dev/null @@ -1,191 +0,0 @@ -use anyhow::Result; -use clap::{Args, Parser, Subcommand}; -use planr_routing::{ - RegistrySignature, catalog_json, compile_json, evaluate_policy, list_policies, probe_host, - show_policy, sign_registry, verify_registry_signature, -}; -use std::fs; -use std::path::PathBuf; - -#[derive(Parser)] -#[command(name = "planr-routing", version, about)] -struct Cli { - #[command(subcommand)] - command: Command, -} - -#[derive(Subcommand)] -enum Command { - Policy(PolicyArgs), - Compile(CompileArgs), - Probe(ProbeArgs), - Evaluate(PolicySelector), - Catalog(CatalogArgs), - Registry(RegistryArgs), -} - -#[derive(Args)] -struct PolicyArgs { - #[command(subcommand)] - command: PolicyCommand, -} - -#[derive(Subcommand)] -enum PolicyCommand { - List, - Show(PolicySelector), -} - -#[derive(Args)] -struct PolicySelector { - policy: String, - #[arg(long)] - host: String, -} - -#[derive(Args)] -struct CompileArgs { - policy: String, - #[arg(long)] - host: String, - #[arg(long)] - output: Option, -} - -#[derive(Args)] -struct ProbeArgs { - host: String, - #[arg(long)] - command: Option, -} - -#[derive(Args)] -struct CatalogArgs { - #[command(subcommand)] - command: CatalogCommand, -} - -#[derive(Subcommand)] -enum CatalogCommand { - Build(OutputArgs), - Verify(FileArgs), -} - -#[derive(Args)] -struct RegistryArgs { - #[command(subcommand)] - command: RegistryCommand, -} - -#[derive(Subcommand)] -enum RegistryCommand { - Sign(SignArgs), - Verify(VerifyArgs), -} - -#[derive(Args)] -struct OutputArgs { - #[arg(long)] - output: Option, -} - -#[derive(Args)] -struct FileArgs { - file: PathBuf, -} - -#[derive(Args)] -struct SignArgs { - file: PathBuf, - #[arg(long)] - signer: String, - #[arg(long)] - private_key_file: PathBuf, - #[arg(long)] - output: PathBuf, -} - -#[derive(Args)] -struct VerifyArgs { - file: PathBuf, - #[arg(long)] - signature: PathBuf, - #[arg(long)] - trusted_signer: String, - #[arg(long)] - trusted_public_key_file: PathBuf, -} - -fn main() { - if let Err(error) = run() { - eprintln!("error: {error:#}"); - std::process::exit(1); - } -} - -fn run() -> Result<()> { - match Cli::parse().command { - Command::Policy(args) => match args.command { - PolicyCommand::List => println!("{}", serde_json::to_string_pretty(&list_policies()?)?), - PolicyCommand::Show(selector) => println!( - "{}", - serde_json::to_string_pretty(&show_policy(&selector.policy, &selector.host)?)? - ), - }, - Command::Compile(args) => { - let output = compile_json(&args.policy, &args.host)?; - if let Some(path) = args.output { - fs::write(path, output)?; - } else { - print!("{output}"); - } - } - Command::Probe(args) => println!( - "{}", - serde_json::to_string_pretty(&probe_host(&args.host, args.command.as_deref())?)? - ), - Command::Evaluate(selector) => println!( - "{}", - serde_json::to_string_pretty(&evaluate_policy(&selector.policy, &selector.host)?)? - ), - Command::Catalog(args) => match args.command { - CatalogCommand::Build(args) => { - let catalog = catalog_json()?; - if let Some(output) = args.output { - fs::write(output, catalog)?; - } else { - print!("{catalog}"); - } - } - CatalogCommand::Verify(args) => { - let current = fs::read_to_string(args.file)?; - if current != catalog_json()? { - anyhow::bail!("catalog does not match package-owned generated sources"); - } - println!("catalog verified"); - } - }, - Command::Registry(args) => match args.command { - RegistryCommand::Sign(args) => { - let content = fs::read(&args.file)?; - let private_key = fs::read_to_string(args.private_key_file)?; - let signature = sign_registry(&content, &args.signer, &private_key)?; - fs::write(args.output, serde_json::to_vec_pretty(&signature)?)?; - } - RegistryCommand::Verify(args) => { - let content = fs::read(args.file)?; - let signature: RegistrySignature = - serde_json::from_slice(&fs::read(args.signature)?)?; - let trusted_public_key = fs::read_to_string(args.trusted_public_key_file)?; - verify_registry_signature( - &content, - &signature, - &args.trusted_signer, - &trusted_public_key, - )?; - println!("registry signature verified"); - } - }, - } - Ok(()) -} diff --git a/planr-routing/usage-policies/balanced.toml b/planr-routing/usage-policies/balanced.toml deleted file mode 100644 index 8f25bcb..0000000 --- a/planr-routing/usage-policies/balanced.toml +++ /dev/null @@ -1,50 +0,0 @@ -schema_version = 1 -id = "balanced" -version = "1.0.0" - -[usage] -max_active_agents = 3 -max_parallel_readers = 2 -max_parallel_writers = 1 -max_depth = 1 -max_attempts = 4 -max_wall_time_seconds = 3600 -max_tool_calls = 120 -review_reserve_percent = 20 -budget_exhaustion = "stop" -metering = "estimated" - -[transitions.retry] -max_same_route_retries = 1 - -[transitions.availability_fallback] -max_fallbacks = 1 -require_same_capability_class = true - -[transitions.quality_escalation] -max_escalations = 1 -require_verification_evidence = true - -[transitions.quota_downgrade] -enabled = false -max_downgrades = 0 -noncritical_only = true - -[transitions.safety_stop] -enabled = true - -[materiality] -changed_files_threshold = 10 -changed_lines_threshold = 500 - -[execution] -max_read_scope_entries = 8 -max_write_scope_entries = 4 - -[execution.roles.worker] -tools = ["cargo", "git", "rg"] - -[execution.roles.worker.filesystem] -read_roots = ["src", "tests", "docs"] -write_roots = ["src", "tests", "docs"] -allow_overwrite = false diff --git a/planr-routing/usage-policies/low-usage.toml b/planr-routing/usage-policies/low-usage.toml deleted file mode 100644 index 817118e..0000000 --- a/planr-routing/usage-policies/low-usage.toml +++ /dev/null @@ -1,50 +0,0 @@ -schema_version = 1 -id = "low-usage" -version = "1.0.0" - -[usage] -max_active_agents = 2 -max_parallel_readers = 1 -max_parallel_writers = 1 -max_depth = 1 -max_attempts = 3 -max_wall_time_seconds = 1800 -max_tool_calls = 60 -review_reserve_percent = 25 -budget_exhaustion = "downgrade_noncritical" -metering = "estimated" - -[transitions.retry] -max_same_route_retries = 0 - -[transitions.availability_fallback] -max_fallbacks = 1 -require_same_capability_class = true - -[transitions.quality_escalation] -max_escalations = 1 -require_verification_evidence = true - -[transitions.quota_downgrade] -enabled = true -max_downgrades = 1 -noncritical_only = true - -[transitions.safety_stop] -enabled = true - -[materiality] -changed_files_threshold = 6 -changed_lines_threshold = 250 - -[execution] -max_read_scope_entries = 6 -max_write_scope_entries = 3 - -[execution.roles.worker] -tools = ["cargo", "git", "rg"] - -[execution.roles.worker.filesystem] -read_roots = ["src", "tests", "docs"] -write_roots = ["src", "tests", "docs"] -allow_overwrite = false diff --git a/planr-routing/usage-policies/max-quality.toml b/planr-routing/usage-policies/max-quality.toml deleted file mode 100644 index ff922f0..0000000 --- a/planr-routing/usage-policies/max-quality.toml +++ /dev/null @@ -1,50 +0,0 @@ -schema_version = 1 -id = "max-quality" -version = "1.0.0" - -[usage] -max_active_agents = 4 -max_parallel_readers = 3 -max_parallel_writers = 1 -max_depth = 1 -max_attempts = 5 -max_wall_time_seconds = 7200 -max_tool_calls = 240 -review_reserve_percent = 40 -budget_exhaustion = "stop" -metering = "estimated" - -[transitions.retry] -max_same_route_retries = 1 - -[transitions.availability_fallback] -max_fallbacks = 1 -require_same_capability_class = true - -[transitions.quality_escalation] -max_escalations = 2 -require_verification_evidence = true - -[transitions.quota_downgrade] -enabled = false -max_downgrades = 0 -noncritical_only = true - -[transitions.safety_stop] -enabled = true - -[materiality] -changed_files_threshold = 5 -changed_lines_threshold = 200 - -[execution] -max_read_scope_entries = 12 -max_write_scope_entries = 6 - -[execution.roles.worker] -tools = ["cargo", "git", "rg"] - -[execution.roles.worker.filesystem] -read_roots = ["src", "tests", "docs"] -write_roots = ["src", "tests", "docs"] -allow_overwrite = false diff --git a/planr-routing/usage-policies/read-only-audit.toml b/planr-routing/usage-policies/read-only-audit.toml deleted file mode 100644 index b9b8a24..0000000 --- a/planr-routing/usage-policies/read-only-audit.toml +++ /dev/null @@ -1,50 +0,0 @@ -schema_version = 1 -id = "read-only-audit" -version = "1.0.0" - -[usage] -max_active_agents = 3 -max_parallel_readers = 3 -max_parallel_writers = 0 -max_depth = 1 -max_attempts = 2 -max_wall_time_seconds = 1800 -max_tool_calls = 80 -review_reserve_percent = 20 -budget_exhaustion = "stop" -metering = "estimated" - -[transitions.retry] -max_same_route_retries = 0 - -[transitions.availability_fallback] -max_fallbacks = 1 -require_same_capability_class = true - -[transitions.quality_escalation] -max_escalations = 0 -require_verification_evidence = true - -[transitions.quota_downgrade] -enabled = false -max_downgrades = 0 -noncritical_only = true - -[transitions.safety_stop] -enabled = true - -[materiality] -changed_files_threshold = 1 -changed_lines_threshold = 1 - -[execution] -max_read_scope_entries = 12 -max_write_scope_entries = 1 - -[execution.roles.worker] -tools = ["git", "rg"] - -[execution.roles.worker.filesystem] -read_roots = ["src", "tests", "docs"] -write_roots = [] -allow_overwrite = false diff --git a/planr-routing/website/README.md b/planr-routing/website/README.md deleted file mode 100644 index cb70c1d..0000000 --- a/planr-routing/website/README.md +++ /dev/null @@ -1,73 +0,0 @@ -# Planr Preset Catalog - -This directory is a dependency-free static website owned by `planr-routing`. Production catalog data is never authored by hand: the package compiler reads the canonical usage policies, host bindings, and evaluation suite, then writes all 20 policy/binding compositions to `data/catalog.json`. - -Private signing keys are intentionally never committed. Generated entries remain unsigned, experimental, and unrecommended while only offline evidence exists. A release operator may promote an entry only after a fresh authenticated live-host oracle proves every required effective-routing dimension and the catalog is signed offline. - -```sh -cargo build --release --manifest-path Cargo.toml -pnpm catalog:regenerate -- --routing-bin ../target/release/planr-routing - -npm run site:test -npm run site:serve -``` - -## Cloudflare test deployment - -Cloudflare infrastructure is owned by the repository-root `alchemy.run.ts`. The -deployment publishes a clean `dist/website` containing only runtime assets; tests, -fixtures, registry inputs, trust stores, and build tooling are never uploaded. - -Install the pinned development dependency and authenticate Cloudflare using an existing -Alchemy/Cloudflare profile, Wrangler login, or a least-privilege API token. Set the -account id from `.env.example` in the process environment when account inference would -be ambiguous. Planr never runs login/configure commands and never changes user-level -configuration. This static stack has no secret bindings, so it deliberately requires no -`ALCHEMY_PASSWORD` or repository-local secret file. - -The published Planr CLI retains its declared Node.js 18+ compatibility. Repository -dependency installation and the separate Cloudflare deployment toolchain require Node.js -22+ because the pinned pnpm/Alchemy lockfile contains current tooling with that minimum. -Select Node 22 or newer before invoking pnpm. On an unknown machine, this pnpm-free -preflight is safe to run first even with Node 18 or 20: - -```sh -node scripts/check-alchemy-runtime.mjs -``` - -The authoritative deployment launcher performs the same check before it starts pnpm or -Alchemy, so older runtimes receive Planr's error instead of a Corepack or dependency crash. - -```sh -pnpm install -pnpm site:check -node scripts/cloudflare-test.mjs deploy -``` - -After Node 22+ is active, `pnpm deploy:test` is an equivalent convenience alias. - -The committed `pnpm-workspace.yaml` is a repository-only dependency security policy: -it allows the `esbuild` and `workerd` install scripts required by Alchemy and explicitly -keeps the unused transitive `sharp` build disabled. It does not modify global pnpm state. - -`deploy:test` always targets the isolated Alchemy stage `test`. It creates a standalone -Cloudflare Worker website and prints its Cloudflare-assigned `workers.dev` URL. The -initial deployment deliberately configures no custom domain, DNS route, backend resource, -or adoption of an existing Worker. - -Removing that test website is an explicit, separate operation: - -```sh -node scripts/cloudflare-test.mjs destroy -``` - -After Node 22+ is active, `pnpm destroy:test` is an equivalent convenience alias. - -Never add private registry or telemetry signing keys to the deployment environment. The -site deploy consumes only the already verified public `website/data/catalog.json`. - -Release operators must first capture authenticated effective model, effort, native-subagent, and bounded-fork evidence. `planr-routing evaluate` fails closed to `experimental` when any dimension is absent. Offline signatures are produced with `planr-routing registry sign`; private key files stay outside the repository. - -The checked-in catalog is reproducible with `planr-routing catalog build` and verified byte-for-byte with `planr-routing catalog verify`. - -Recommendation-state rendering is covered only by clearly synthetic, non-provider in-memory unit data. The runtime website has one data source, `data/catalog.json`; no file-backed recommendation fixture, alternate query path, or fabricated provider evidence is shipped. diff --git a/planr-routing/website/_headers b/planr-routing/website/_headers deleted file mode 100644 index 77acd6e..0000000 --- a/planr-routing/website/_headers +++ /dev/null @@ -1,7 +0,0 @@ -/* - Cache-Control: public, max-age=0, must-revalidate - Content-Security-Policy: default-src 'self'; script-src 'self'; style-src 'self'; img-src 'self' data:; connect-src 'self'; base-uri 'none'; form-action 'none'; frame-ancestors 'none' - Permissions-Policy: camera=(), geolocation=(), microphone=(), payment=(), usb=() - Referrer-Policy: no-referrer - X-Content-Type-Options: nosniff - X-Frame-Options: DENY diff --git a/planr-routing/website/alchemy-runtime.test.mjs b/planr-routing/website/alchemy-runtime.test.mjs deleted file mode 100644 index e2778b8..0000000 --- a/planr-routing/website/alchemy-runtime.test.mjs +++ /dev/null @@ -1,21 +0,0 @@ -import assert from "node:assert/strict"; -import test from "node:test"; -import { - assertAlchemyRuntime, - MINIMUM_ALCHEMY_NODE_MAJOR, -} from "../scripts/check-alchemy-runtime.mjs"; - -test("accepts the minimum supported Alchemy deployment runtime", () => { - assert.equal(assertAlchemyRuntime("22.0.0"), MINIMUM_ALCHEMY_NODE_MAJOR); -}); - -test("rejects Node runtimes supported by the Planr CLI but not by Alchemy", () => { - assert.throws( - () => assertAlchemyRuntime("18.16.1"), - /Cloudflare deployment requires Node\.js 22 or newer; current runtime is 18\.16\.1/, - ); - assert.throws( - () => assertAlchemyRuntime("20.19.5"), - /Cloudflare deployment requires Node\.js 22 or newer/, - ); -}); diff --git a/planr-routing/website/app.mjs b/planr-routing/website/app.mjs deleted file mode 100644 index d82434b..0000000 --- a/planr-routing/website/app.mjs +++ /dev/null @@ -1,217 +0,0 @@ -import { formatBasisPoints, previewCommand, statusLabel, visibleCompositions } from "./catalog-model.mjs"; - -const nodes = { - selectA: document.querySelector("#composition-a"), - selectB: document.querySelector("#composition-b"), - cardA: document.querySelector("#comparison-a"), - cardB: document.querySelector("#comparison-b"), - comparison: document.querySelector("#comparison"), - empty: document.querySelector("#empty-state"), - emptyMessage: document.querySelector("#empty-message"), - filter: document.querySelector("#recommended-only"), - published: document.querySelector("#stat-published"), - recommended: document.querySelector("#stat-recommended"), - trust: document.querySelector("#stat-trust"), - generated: document.querySelector("#generated-at"), - copyStatus: document.querySelector("#copy-status"), -}; - -function catalogLocation() { - return "./data/catalog.json"; -} - -function text(parent, element, value, className) { - const node = document.createElement(element); - if (className) node.className = className; - node.textContent = value; - parent.append(node); - return node; -} - -function formatDate(unix) { - if (!Number.isFinite(unix)) return "Not published"; - return new Intl.DateTimeFormat("en", { dateStyle: "medium", timeZone: "UTC" }).format(new Date(unix * 1000)); -} - -function formatNumber(value) { - return Number.isFinite(Number(value)) ? new Intl.NumberFormat("en").format(Number(value)) : "—"; -} - -function optionLabel(entry) { - return `${entry.policy.id} + ${entry.binding.id} · ${statusLabel(entry.status)}`; -} - -function fillSelect(select, entries, preferredIndex) { - const previous = select.value; - select.replaceChildren(); - for (const entry of entries) { - const option = document.createElement("option"); - option.value = entry.id; - option.textContent = optionLabel(entry); - select.append(option); - } - select.value = entries.some((entry) => entry.id === previous) ? previous : entries[Math.min(preferredIndex, entries.length - 1)]?.id ?? ""; -} - -function metric(parent, label, value) { - const wrapper = document.createElement("div"); - wrapper.className = "metric"; - text(wrapper, "span", label); - text(wrapper, "strong", value); - parent.append(wrapper); -} - -function section(parent, title) { - const wrapper = document.createElement("section"); - wrapper.className = "card-section"; - text(wrapper, "h4", title); - parent.append(wrapper); - return wrapper; -} - -function definitionRow(list, termValue, detailValue) { - const row = document.createElement("div"); - text(row, "dt", termValue); - text(row, "dd", detailValue); - list.append(row); -} - -function renderCard(card, entry) { - card.replaceChildren(); - if (!entry) return; - card.dataset.compositionId = entry.id; - - const top = document.createElement("div"); - top.className = "card-top"; - const title = document.createElement("div"); - text(title, "span", `${entry.binding.id} · ${entry.binding.host}`, "binding-name"); - text(title, "h3", entry.policy.id); - const badge = text(top, "span", statusLabel(entry.status), `badge status-${entry.status}`); - badge.setAttribute("aria-label", `Status: ${statusLabel(entry.status)}`); - top.prepend(title); - card.append(top); - text(card, "p", `Policy ${entry.policy.version} · Binding ${entry.binding.version} · Entry ${entry.entryVersion}`, "meta-line"); - - const metrics = document.createElement("div"); - metrics.className = "metric-grid"; - metric(metrics, "Active agents", formatNumber(entry.policy.usage.max_active_agents)); - metric(metrics, "Parallel writers", formatNumber(entry.policy.usage.max_parallel_writers)); - metric(metrics, "Max depth", formatNumber(entry.policy.usage.max_depth)); - metric(metrics, "Metering", entry.policy.usage.metering ?? "unavailable"); - card.append(metrics); - - const compatibility = section(card, "Compatibility"); - const compatibilityList = document.createElement("dl"); - compatibilityList.className = "compatibility-list"; - definitionRow( - compatibilityList, - "Supported hosts", - entry.compatibility.hosts?.length ? entry.compatibility.hosts.join(", ") : "No compatible host declared", - ); - definitionRow( - compatibilityList, - "Planr versions", - `${entry.compatibility.minPlanrVersion ?? "Any"} through ${entry.compatibility.maxPlanrVersion ?? "latest"}`, - ); - definitionRow( - compatibilityList, - "Lifecycle", - entry.replacement - ? `${statusLabel(entry.status)}; replace with ${entry.replacement}` - : statusLabel(entry.status), - ); - compatibility.append(compatibilityList); - - const enforcement = section(card, "Enforcement matrix"); - const list = document.createElement("dl"); - list.className = "enforcement-list"; - for (const item of entry.enforcement) { - const row = document.createElement("div"); - const term = text(row, "dt", item.dimension); - text(term, "span", item.state.replaceAll("_", " "), "state"); - text(row, "dd", item.detail); - list.append(row); - } - enforcement.append(list); - - const evidence = section(card, "Evaluation & provenance"); - text(evidence, "p", `${entry.evaluation.suiteId} ${entry.evaluation.suiteVersion} · evaluated ${formatDate(entry.evaluation.evaluatedAtUnix)} · review ${formatDate(entry.evaluation.reviewAtUnix)}`, "meta-line"); - text(evidence, "p", `Quality ${formatBasisPoints(entry.evaluation.metrics?.average_quality_score_bps)} · runs ${formatNumber(entry.evaluation.metrics?.runs)} · oracle passes ${formatNumber(entry.evaluation.metrics?.oracle_passes)}`, "meta-line"); - text(evidence, "p", `Manifest ${entry.registry.manifestSha256}`, "hash"); - text( - evidence, - "p", - entry.registry.signatureVerified - ? `Signer ${entry.registry.signer} · signature verified · trusted maintainer` - : "Unsigned experimental publication · recommendation disabled", - "meta-line", - ); - - const commandSection = section(card, "Preview safely"); - const commandBlock = document.createElement("div"); - commandBlock.className = "command-block"; - const command = previewCommand(entry.policy.id, entry.binding.id); - text(commandBlock, "code", command); - const button = text(commandBlock, "button", "Copy preview command", "copy-button"); - button.type = "button"; - button.dataset.command = command; - commandSection.append(commandBlock); -} - -function wireCopy() { - document.addEventListener("click", async (event) => { - const button = event.target.closest("button[data-command]"); - if (!button) return; - try { - await navigator.clipboard.writeText(button.dataset.command); - button.textContent = "Copied"; - nodes.copyStatus.textContent = `Copied preview command for ${button.closest(".preset-card").dataset.compositionId}`; - setTimeout(() => { button.textContent = "Copy preview command"; }, 1400); - } catch { - nodes.copyStatus.textContent = "Clipboard access was unavailable; select the command text to copy it manually."; - } - }); -} - -function render(catalog) { - const entries = visibleCompositions(catalog, nodes.filter.checked); - nodes.published.textContent = formatNumber(catalog.compositions.length); - nodes.recommended.textContent = formatNumber(catalog.compositions.filter((entry) => entry.recommended).length); - const signed = catalog.compositions.some((entry) => entry.registry?.signatureVerified); - nodes.trust.textContent = signed ? "Signed registry" : "Integrity verified"; - nodes.generated.textContent = Number.isFinite(catalog.generatedAtUnix) - ? `Projection generated ${formatDate(catalog.generatedAtUnix)} · ${catalog.source.trust}` - : "No verified registry projection published."; - fillSelect(nodes.selectA, entries, 0); - fillSelect(nodes.selectB, entries, 1); - const empty = entries.length === 0; - nodes.empty.hidden = !empty; - nodes.comparison.hidden = empty; - if (empty) { - nodes.emptyMessage.textContent = catalog.source?.message ?? (nodes.filter.checked ? "No published composition currently carries an evaluation-backed recommendation." : "No trusted compositions are published."); - return; - } - const find = (id) => entries.find((entry) => entry.id === id); - renderCard(nodes.cardA, find(nodes.selectA.value)); - renderCard(nodes.cardB, find(nodes.selectB.value)); -} - -async function start() { - wireCopy(); - const response = await fetch(catalogLocation(), { cache: "no-store" }); - if (!response.ok) throw new Error(`catalog request failed with HTTP ${response.status}`); - const catalog = await response.json(); - if (catalog.schemaVersion !== 1 || !Array.isArray(catalog.compositions)) throw new Error("unsupported catalog data"); - const update = () => render(catalog); - nodes.filter.addEventListener("change", update); - nodes.selectA.addEventListener("change", update); - nodes.selectB.addEventListener("change", update); - update(); -} - -start().catch((error) => { - nodes.empty.hidden = false; - nodes.comparison.hidden = true; - nodes.emptyMessage.textContent = `Catalog unavailable: ${error.message}`; - nodes.trust.textContent = "Unavailable"; -}); diff --git a/planr-routing/website/build-catalog.mjs b/planr-routing/website/build-catalog.mjs deleted file mode 100644 index 6626991..0000000 --- a/planr-routing/website/build-catalog.mjs +++ /dev/null @@ -1,132 +0,0 @@ -#!/usr/bin/env node -import { spawnSync } from "node:child_process"; -import { mkdtempSync, readFileSync, rmSync, writeFileSync } from "node:fs"; -import { mkdir } from "node:fs/promises"; -import { tmpdir } from "node:os"; -import { dirname, isAbsolute, join, resolve } from "node:path"; -import { projectComposition, safeIdentifier } from "./catalog-model.mjs"; - -function usage(message) { - if (message) console.error(message); - console.error( - "usage: node website/build-catalog.mjs --manifest --content-root --trust-store --entry [--entry ...] --at-unix --output [--planr-bin ]", - ); - process.exit(2); -} - -function parseArgs(argv) { - const values = { entries: [], planrBin: "planr" }; - for (let index = 0; index < argv.length; index += 1) { - const flag = argv[index]; - const value = argv[index + 1]; - if (!value) usage(`missing value for ${flag}`); - index += 1; - if (flag === "--entry") values.entries.push(value); - else if (flag === "--manifest") values.manifest = value; - else if (flag === "--content-root") values.contentRoot = value; - else if (flag === "--trust-store") values.trustStore = value; - else if (flag === "--at-unix") values.atUnix = Number(value); - else if (flag === "--output") values.output = value; - else if (flag === "--planr-bin") values.planrBin = value; - else usage(`unknown argument ${flag}`); - } - if ( - !values.manifest || - !values.contentRoot || - !values.trustStore || - !values.output || - !Number.isSafeInteger(values.atUnix) || - values.entries.length === 0 - ) { - usage("all required arguments must be provided"); - } - return values; -} - -function runJson(binary, args, cwd) { - const result = spawnSync(binary, args, { cwd, encoding: "utf8" }); - if (result.error) throw result.error; - if (result.status !== 0) { - throw new Error(result.stderr.trim() || result.stdout.trim() || `${binary} exited ${result.status}`); - } - try { - return JSON.parse(result.stdout); - } catch (error) { - throw new Error(`${binary} returned invalid JSON: ${error.message}`); - } -} - -function entrySpec(raw) { - const separator = raw.lastIndexOf("="); - if (separator < 1 || separator === raw.length - 1) usage(`invalid --entry ${raw}; expected id=host`); - return { id: raw.slice(0, separator), host: raw.slice(separator + 1) }; -} - -function artifactPath(verified, kind, contentRoot) { - const matches = verified.entry.artifacts.filter((artifact) => artifact.kind === kind); - if (matches.length !== 1) throw new Error(`entry ${verified.entry.id} must contain one ${kind}`); - return resolve(contentRoot, matches[0].path); -} - -const options = parseArgs(process.argv.slice(2)); -const invocationRoot = process.cwd(); -const planrBin = - isAbsolute(options.planrBin) || !options.planrBin.includes("/") - ? options.planrBin - : resolve(invocationRoot, options.planrBin); -const manifest = resolve(invocationRoot, options.manifest); -const contentRoot = resolve(invocationRoot, options.contentRoot); -const trustStore = resolve(invocationRoot, options.trustStore); -const scratch = mkdtempSync(join(tmpdir(), "planr-preset-site-")); - -try { - const compositions = options.entries.map((raw) => { - const { id, host } = entrySpec(raw); - const verified = runJson( - planrBin, - [ - "--json", - "agents", - "preset", - "registry", - "verify", - manifest, - "--entry", - id, - "--content-root", - contentRoot, - "--trust-store", - trustStore, - "--at-unix", - String(options.atUnix), - "--host", - host, - ], - scratch, - ); - const verificationPath = artifactPath(verified, "verification", contentRoot); - const policyId = safeIdentifier(verified.entry.evaluation?.policy_id, "policy id"); - const bindingId = safeIdentifier(verified.entry.evaluation?.binding_id, "binding id"); - const preview = verified.catalog_preview; - if (!preview) throw new Error(`entry ${id} verification did not return a catalog preview`); - const verificationEnvelope = JSON.parse(readFileSync(verificationPath, "utf8")); - return projectComposition({ verified, preview, verificationEnvelope }); - }); - const catalog = { - schemaVersion: 1, - generatedAtUnix: options.atUnix, - source: { - state: "verified_registry_projection", - manifest: options.manifest, - entryCount: compositions.length, - trust: "planr_registry_v1", - }, - compositions, - }; - const output = resolve(invocationRoot, options.output); - await mkdir(dirname(output), { recursive: true }); - writeFileSync(output, `${JSON.stringify(catalog, null, 2)}\n`, { mode: 0o644 }); - console.log(`wrote ${compositions.length} verified composition(s) to ${output}`); -} finally { - rmSync(scratch, { recursive: true, force: true }); -} diff --git a/planr-routing/website/build-site.test.mjs b/planr-routing/website/build-site.test.mjs deleted file mode 100644 index 9ba4ece..0000000 --- a/planr-routing/website/build-site.test.mjs +++ /dev/null @@ -1,69 +0,0 @@ -import assert from "node:assert/strict"; -import { mkdtemp, mkdir, readFile, rm, writeFile } from "node:fs/promises"; -import { tmpdir } from "node:os"; -import { join } from "node:path"; -import test from "node:test"; -import { - buildSite, - PUBLIC_SITE_FILES, - verifyPublication, -} from "../scripts/build-site.mjs"; - -async function fixture() { - const root = await mkdtemp(join(tmpdir(), "planr-site-build-")); - const sourceRoot = join(root, "website"); - const outputRoot = join(root, "dist", "website"); - for (const relativePath of PUBLIC_SITE_FILES) { - const path = join(sourceRoot, relativePath); - await mkdir(join(path, ".."), { recursive: true }); - await writeFile(path, `public:${relativePath}\n`); - } - return { root, sourceRoot, outputRoot }; -} - -test("builds only the public runtime allowlist and preserves nested catalog bytes", async (t) => { - const paths = await fixture(); - t.after(() => rm(paths.root, { recursive: true, force: true })); - await writeFile(join(paths.sourceRoot, "build-catalog.mjs"), "must not be public\n"); - await mkdir(join(paths.sourceRoot, "registry"), { recursive: true }); - await writeFile(join(paths.sourceRoot, "registry", "trusted-maintainers.toml"), "not public\n"); - - const files = await buildSite(paths); - - assert.deepEqual(files, [...PUBLIC_SITE_FILES].sort()); - assert.equal( - await readFile(join(paths.outputRoot, "data", "catalog.json"), "utf8"), - "public:data/catalog.json\n", - ); -}); - -test("fails before replacing output when a required source artifact is missing", async (t) => { - const paths = await fixture(); - t.after(() => rm(paths.root, { recursive: true, force: true })); - await mkdir(paths.outputRoot, { recursive: true }); - await writeFile(join(paths.outputRoot, "sentinel"), "keep on validation failure\n"); - await rm(join(paths.sourceRoot, "styles.css")); - - await assert.rejects(() => buildSite(paths), /missing public website artifact: styles\.css/); - assert.equal(await readFile(join(paths.outputRoot, "sentinel"), "utf8"), "keep on validation failure\n"); -}); - -test("publication verification rejects unexpected nested output", async (t) => { - const paths = await fixture(); - t.after(() => rm(paths.root, { recursive: true, force: true })); - await buildSite(paths); - await mkdir(join(paths.outputRoot, "registry"), { recursive: true }); - await writeFile(join(paths.outputRoot, "registry", "manifest.toml"), "unexpected\n"); - - await assert.rejects(() => verifyPublication(paths.outputRoot), /publish output mismatch/); -}); - -test("refuses an output directory inside the source tree", async (t) => { - const paths = await fixture(); - t.after(() => rm(paths.root, { recursive: true, force: true })); - - await assert.rejects( - () => buildSite({ sourceRoot: paths.sourceRoot, outputRoot: join(paths.sourceRoot, "dist") }), - /must not be inside/, - ); -}); diff --git a/planr-routing/website/catalog-model.mjs b/planr-routing/website/catalog-model.mjs deleted file mode 100644 index d0c95bb..0000000 --- a/planr-routing/website/catalog-model.mjs +++ /dev/null @@ -1,188 +0,0 @@ -const IDENTIFIER = /^[A-Za-z0-9._-]+$/; - -export function safeIdentifier(value, label = "identifier") { - if (typeof value !== "string" || !IDENTIFIER.test(value)) { - throw new Error(`${label} is not a safe registry identifier`); - } - return value; -} - -export function previewCommand(policyId, bindingId) { - return `planr-routing compile ${safeIdentifier(policyId, "policy id")} --host ${safeIdentifier(bindingId, "binding id")} --output routing-bundle.json && planr routing bundle preview routing-bundle.json`; -} - -export function statusLabel(status) { - const labels = { - experimental: "Experimental", - verified: "Verified", - recommended: "Recommended", - stale: "Stale", - deprecated: "Deprecated", - }; - return labels[status] ?? "Unverified"; -} - -export function formatBasisPoints(value) { - const basisPoints = Number(value); - return Number.isFinite(basisPoints) ? `${(basisPoints / 100).toFixed(2)}%` : "—"; -} - -function findArtifact(entry, kind) { - const artifacts = entry.artifacts.filter((artifact) => artifact.kind === kind); - if (artifacts.length !== 1) { - throw new Error(`registry entry must contain exactly one ${kind} artifact`); - } - return artifacts[0]; -} - -function proposedConfig(preview, kind) { - const artifact = preview.artifacts.find((candidate) => candidate.kind === kind); - const value = artifact?.config_diff?.proposed?.value; - if (!value || typeof value !== "object") { - throw new Error(`preset preview is missing proposed ${kind} configuration`); - } - return value; -} - -function matchingCandidate(report, policyId, bindingId) { - const candidate = report.candidates?.find( - (value) => value.policy?.id === policyId && value.binding?.id === bindingId, - ); - if (!candidate) { - throw new Error(`evaluation report has no candidate for ${policyId} + ${bindingId}`); - } - return candidate; -} - -function recommendationMatches(report, policyId, bindingId) { - return Boolean( - report.recommended?.some( - (value) => value.policy === policyId && value.binding === bindingId && value.status === "recommended", - ), - ); -} - -export function projectComposition({ verified, preview, verificationEnvelope }) { - if (!verified?.integrity_verified) { - throw new Error("website projection requires an integrity-verified registry entry"); - } - if (verified.recommended && (!verified.signature_verified || !verified.trusted_maintainer)) { - throw new Error("website recommendation requires a trusted maintainer signature"); - } - if (!verified.compatible) { - throw new Error("website projection requires a compatible registry entry"); - } - if (!preview?.pack?.safe) { - throw new Error("website projection requires a canonical safe-pack preview"); - } - - const entry = verified.entry; - const evaluation = entry.evaluation; - if (!evaluation) { - throw new Error("website projection requires evaluation binding metadata"); - } - const policyId = safeIdentifier(evaluation.policy_id, "policy id"); - const bindingId = safeIdentifier(evaluation.binding_id, "binding id"); - const report = verificationEnvelope.report ?? verificationEnvelope; - const candidate = matchingCandidate(report, policyId, bindingId); - const reportRecommended = recommendationMatches(report, policyId, bindingId); - if (verified.recommended && (!reportRecommended || candidate.status !== "recommended")) { - throw new Error("registry recommendation does not match canonical evaluation evidence"); - } - - const policy = proposedConfig(preview, "active_policy"); - const agents = proposedConfig(preview, "agent_registry"); - if (policy.id !== policyId || preview.composition?.binding?.id !== bindingId) { - throw new Error("preset preview provenance does not match registry evaluation binding"); - } - const runs = Number(candidate.metrics?.runs ?? 0); - const verifiedRoutes = Number(candidate.metrics?.verified_route_runs ?? 0); - const policyArtifact = findArtifact(entry, "policy"); - const bindingArtifact = findArtifact(entry, "host-binding"); - const verificationArtifact = findArtifact(entry, "verification"); - - return { - id: `${safeIdentifier(entry.id, "entry id")}@${entry.version}`, - entryId: entry.id, - entryVersion: entry.version, - status: verified.effective_status, - statusLabel: statusLabel(verified.effective_status), - recommended: verified.recommended, - freshness: verified.freshness, - lifecycle: entry.lifecycle, - replacement: entry.replacement ?? null, - policy: { - id: policyId, - version: evaluation.policy_version, - usage: policy.usage, - transitions: policy.transitions, - materiality: policy.materiality, - execution: policy.execution, - }, - binding: { - id: bindingId, - version: evaluation.binding_version, - host: preview.composition.host, - profiles: agents.profiles, - dispatch: preview.composition.dispatch, - }, - compatibility: { - hosts: entry.compatible_hosts, - minPlanrVersion: entry.min_planr_version, - maxPlanrVersion: entry.max_planr_version, - }, - enforcement: [ - { - dimension: "Policy limits", - state: "verified", - detail: "Planr validates count, time, concurrency, transition, and safety-stop limits before dispatch.", - }, - { - dimension: "Execution permissions", - state: "verified", - detail: "Registry-safe policy: no commands, hooks, network/MCP grants, secrets, or overwrite permission.", - }, - { - dimension: "Model and effort", - state: "host_enforced", - detail: "The host binding requests concrete routes; the host retains final execution authority.", - }, - { - dimension: "Effective route evidence", - state: runs > 0 && verifiedRoutes === runs ? "verified" : "unavailable", - detail: `${verifiedRoutes} of ${runs} evaluation runs carried verified effective-route evidence.`, - }, - ], - evaluation: { - suiteId: report.suite?.id, - suiteVersion: report.suite?.version, - evaluatedAtUnix: report.suite?.evaluated_at_unix, - reviewAtUnix: entry.review_at_unix, - status: candidate.status, - metrics: candidate.metrics, - thresholds: candidate.threshold_results, - resultHashes: candidate.results?.map((result) => result.result_sha256) ?? [], - fixtureSha256: report.suite?.fixture_sha256, - }, - registry: { - id: verified.registry_id, - version: verified.registry_version, - manifestSha256: verified.manifest_sha256, - signer: entry.signature?.signer, - signatureVerified: verified.signature_verified, - trustedMaintainer: verified.trusted_maintainer, - artifacts: [policyArtifact, bindingArtifact, verificationArtifact].map((artifact) => ({ - path: artifact.path, - kind: artifact.kind, - sha256: artifact.sha256, - sizeBytes: artifact.size_bytes, - })), - }, - command: previewCommand(policyId, bindingId), - }; -} - -export function visibleCompositions(catalog, recommendedOnly = false) { - const compositions = Array.isArray(catalog?.compositions) ? catalog.compositions : []; - return recommendedOnly ? compositions.filter((entry) => entry.recommended) : compositions; -} diff --git a/planr-routing/website/catalog-model.test.mjs b/planr-routing/website/catalog-model.test.mjs deleted file mode 100644 index 64b4526..0000000 --- a/planr-routing/website/catalog-model.test.mjs +++ /dev/null @@ -1,141 +0,0 @@ -import assert from "node:assert/strict"; -import test from "node:test"; -import { - formatBasisPoints, - previewCommand, - projectComposition, - safeIdentifier, - visibleCompositions, -} from "./catalog-model.mjs"; - -function syntheticUiFixture() { - const verified = { - registry_id: "ui-test-registry", - registry_version: "0.0.0-test", - manifest_sha256: "a".repeat(64), - integrity_verified: true, - signature_verified: true, - trusted_maintainer: true, - compatible: true, - freshness: "current", - effective_status: "recommended", - recommended: true, - entry: { - id: "ui-test-pack", - version: "0.0.0-test", - lifecycle: "published", - compatible_hosts: ["synthetic-host"], - min_planr_version: "0.0.0-test", - max_planr_version: "0.0.0-test", - review_at_unix: 1815523200, - evaluation: { - policy_id: "ui-test-policy", - policy_version: "0.0.0-test", - binding_id: "ui-test-binding", - binding_version: "0.0.0-test", - }, - signature: { signer: "ui-test-signer" }, - artifacts: [ - { path: "pack/policy.toml", kind: "policy", sha256: "1".repeat(64), size_bytes: 1 }, - { path: "pack/binding.toml", kind: "host-binding", sha256: "2".repeat(64), size_bytes: 2 }, - { path: "pack/verification.json", kind: "verification", sha256: "3".repeat(64), size_bytes: 3 }, - ], - }, - }; - const policy = { - id: "ui-test-policy", - usage: { max_active_agents: 3, max_parallel_writers: 1, max_depth: 1, metering: "trusted" }, - transitions: { retry: { max_same_route_retries: 1 }, safety_stop: { enabled: true } }, - materiality: { changed_files_threshold: 10 }, - execution: { roles: { worker: { commands: [], hooks: [], network_hosts: [], mcp_servers: [] } } }, - }; - const preview = { - pack: { safe: true }, - composition: { host: "synthetic-host", binding: { id: "ui-test-binding" }, dispatch: {} }, - artifacts: [ - { kind: "active_policy", config_diff: { proposed: { value: policy } } }, - { kind: "agent_registry", config_diff: { proposed: { value: { profiles: {} } } } }, - ], - }; - const candidate = { - policy: { id: "ui-test-policy" }, - binding: { id: "ui-test-binding" }, - status: "recommended", - metrics: { runs: 7, verified_route_runs: 7, average_quality_score_bps: 9600 }, - threshold_results: [{ name: "quality", pass: true }], - results: [{ result_sha256: "4".repeat(64) }], - }; - const verificationEnvelope = { - report: { - suite: { id: "ui-test-suite", version: "0.0.0-test", evaluated_at_unix: 1783987200, fixture_sha256: "5".repeat(64) }, - candidates: [candidate], - recommended: [{ policy: "ui-test-policy", binding: "ui-test-binding", status: "recommended" }], - }, - }; - return { verified, preview, verificationEnvelope }; -} - -test("projects only trusted, safe, evidence-bound registry entries", () => { - const projected = projectComposition(syntheticUiFixture()); - assert.equal(projected.status, "recommended"); - assert.equal(projected.registry.signatureVerified, true); - assert.equal(projected.enforcement.at(-1).state, "verified"); - assert.equal(projected.command, "planr-routing compile ui-test-policy --host ui-test-binding --output routing-bundle.json && planr routing bundle preview routing-bundle.json"); -}); - -test("refuses unsigned metadata and recommendation drift", () => { - const unsigned = syntheticUiFixture(); - unsigned.verified.signature_verified = false; - assert.throws(() => projectComposition(unsigned), /trusted maintainer signature/); - - const drifted = syntheticUiFixture(); - drifted.verificationEnvelope.report.recommended = []; - assert.throws(() => projectComposition(drifted), /does not match/); -}); - -test("publishes unsigned synthetic candidates only while visibly demoted", () => { - const experimental = syntheticUiFixture(); - experimental.verified.signature_verified = false; - experimental.verified.trusted_maintainer = false; - experimental.verified.effective_status = "experimental"; - experimental.verified.recommended = false; - experimental.verified.entry.signature = undefined; - experimental.verificationEnvelope.report.recommended = []; - experimental.verificationEnvelope.report.candidates[0].status = "verified"; - - const projected = projectComposition(experimental); - assert.equal(projected.status, "experimental"); - assert.equal(projected.recommended, false); - assert.equal(projected.registry.signatureVerified, false); - assert.equal(projected.registry.signer, undefined); -}); - -test("publishes lifecycle-demoted recommendations with visible replacement metadata", () => { - const stale = syntheticUiFixture(); - stale.verified.freshness = "stale"; - stale.verified.effective_status = "stale"; - stale.verified.recommended = false; - const staleProjected = projectComposition(stale); - assert.equal(staleProjected.status, "stale"); - assert.equal(staleProjected.recommended, false); - - const deprecated = syntheticUiFixture(); - deprecated.verified.effective_status = "deprecated"; - deprecated.verified.recommended = false; - deprecated.verified.entry.lifecycle = "deprecated"; - deprecated.verified.entry.replacement = "ui-test-pack-v2"; - const deprecatedProjected = projectComposition(deprecated); - assert.equal(deprecatedProjected.status, "deprecated"); - assert.equal(deprecatedProjected.replacement, "ui-test-pack-v2"); -}); - -test("copy commands accept identifiers only and filtering is deterministic", () => { - assert.equal(previewCommand("ui-test-policy", "ui-test-binding"), "planr-routing compile ui-test-policy --host ui-test-binding --output routing-bundle.json && planr routing bundle preview routing-bundle.json"); - assert.throws(() => safeIdentifier("ui-test; curl invalid"), /safe registry identifier/); - assert.deepEqual( - visibleCompositions({ compositions: [{ recommended: true }, { recommended: false }] }, true), - [{ recommended: true }], - ); - assert.equal(formatBasisPoints(9600), "96.00%"); - assert.equal(formatBasisPoints(undefined), "—"); -}); diff --git a/planr-routing/website/cloudflare-launcher.test.mjs b/planr-routing/website/cloudflare-launcher.test.mjs deleted file mode 100644 index 470e97c..0000000 --- a/planr-routing/website/cloudflare-launcher.test.mjs +++ /dev/null @@ -1,38 +0,0 @@ -import assert from "node:assert/strict"; -import { existsSync } from "node:fs"; -import { homedir } from "node:os"; -import { dirname, join, resolve } from "node:path"; -import { spawnSync } from "node:child_process"; -import { fileURLToPath } from "node:url"; -import test from "node:test"; -import { cloudflareTestSteps } from "../scripts/cloudflare-test.mjs"; - -test("launcher keeps deploy and destroy pinned to the test stage", () => { - assert.deepEqual(cloudflareTestSteps("deploy"), [ - ["pnpm", ["site:check"]], - ["pnpm", ["exec", "alchemy", "deploy", "--stage", "test"]], - ]); - assert.deepEqual(cloudflareTestSteps("destroy"), [ - ["pnpm", ["exec", "alchemy", "destroy", "--stage", "test"]], - ]); - assert.throws(() => cloudflareTestSteps("prod"), /usage:/); -}); - -const repositoryRoot = resolve(dirname(fileURLToPath(import.meta.url)), ".."); -const launcher = join(repositoryRoot, "scripts", "cloudflare-test.mjs"); -for (const version of ["v18.16.1", "v20.19.5"]) { - const node = join(homedir(), ".nvm", "versions", "node", version, "bin", "node"); - test( - `direct launcher rejects ${version} before invoking pnpm`, - { skip: !existsSync(node) && `local ${version} runtime is unavailable` }, - () => { - const result = spawnSync(node, [launcher, "deploy"], { - cwd: repositoryRoot, - encoding: "utf8", - }); - assert.equal(result.status, 1); - assert.match(result.stderr, /Cloudflare deployment requires Node\.js 22 or newer/); - assert.doesNotMatch(result.stderr, /Corepack|ERR_VM|addAbortListener|experimental-strip-types/); - }, - ); -} diff --git a/planr-routing/website/data/catalog.json b/planr-routing/website/data/catalog.json deleted file mode 100644 index 38e8033..0000000 --- a/planr-routing/website/data/catalog.json +++ /dev/null @@ -1,3943 +0,0 @@ -{ - "compositions": [ - { - "binding": { - "dispatch": [ - { - "fallbacks": [], - "match": { - "work_type": "exploration" - }, - "profile": "codex-terra-medium" - }, - { - "fallbacks": [], - "match": { - "work_type": "research" - }, - "profile": "codex-terra-medium" - }, - { - "fallbacks": [], - "match": { - "work_type": "code" - }, - "profile": "codex-terra-high" - }, - { - "fallbacks": [], - "match": { - "work_type": "mechanical" - }, - "profile": "codex-luna-xhigh" - }, - { - "fallbacks": [], - "match": { - "work_type": "review" - }, - "profile": "codex-sol-high" - }, - { - "fallbacks": [], - "match": { - "work_type": "moonshot" - }, - "profile": "codex-sol-ultra" - } - ], - "host": "codex", - "id": "codex-openai", - "profiles": { - "codex-luna-xhigh": { - "agent_type": "planr_luna_xhigh", - "client": "codex", - "cost_tier": "premium", - "effort": "xhigh", - "model": "gpt-5.6-luna", - "skill": "planr-work" - }, - "codex-sol-high": { - "agent_type": "planr_sol_high", - "client": "codex", - "cost_tier": "premium", - "effort": "high", - "model": "gpt-5.6-sol", - "skill": "planr-review" - }, - "codex-sol-medium": { - "agent_type": "planr_sol_medium", - "client": "codex", - "cost_tier": "standard", - "effort": "medium", - "model": "gpt-5.6-sol" - }, - "codex-sol-ultra": { - "agent_type": "planr_sol_ultra", - "client": "codex", - "cost_tier": "premium", - "effort": "ultra", - "model": "gpt-5.6-sol" - }, - "codex-terra-high": { - "agent_type": "planr_terra_high", - "client": "codex", - "cost_tier": "standard", - "effort": "high", - "model": "gpt-5.6-terra", - "skill": "planr-work" - }, - "codex-terra-medium": { - "agent_type": "planr_terra_medium", - "client": "codex", - "cost_tier": "standard", - "effort": "medium", - "model": "gpt-5.6-terra" - } - }, - "selector": "codex-openai", - "version": "2.0.0" - }, - "command": "planr-routing compile balanced --host codex-openai --output routing-bundle.json && planr routing bundle preview routing-bundle.json", - "compatibility": { - "hosts": [ - "codex" - ], - "maxPlanrVersion": null, - "minPlanrVersion": "1.4.0" - }, - "enforcement": [ - { - "detail": "Core previews and applies only allowlisted repository-local bundle artifacts.", - "dimension": "Repository writes", - "state": "verified" - }, - { - "detail": "The package generates exact host roles; the host remains execution authority.", - "dimension": "Model and effort", - "state": "host_enforced" - }, - { - "detail": "No authenticated live-host evidence is published for this generated catalog entry.", - "dimension": "Effective route evidence", - "state": "unavailable" - } - ], - "entryId": "balanced-codex-openai", - "entryVersion": "1.0.0+2.0.0", - "evaluation": { - "evaluatedAtUnix": 1784160000, - "fixtureSha256": "042dbb3ff8569bd56502777d79bd622d00d4f2ae06e4dbb6b3d08bf3af807a21", - "metrics": { - "average_quality_score_bps": null, - "oracle_passes": 0, - "runs": 0 - }, - "resultHashes": [], - "reviewAtUnix": null, - "status": "experimental", - "suiteId": "planr-preset-suite", - "suiteVersion": "1.8.0", - "thresholds": {} - }, - "freshness": "current", - "id": "balanced-codex-openai@1.0.0+2.0.0", - "lifecycle": "published", - "policy": { - "execution": { - "max_read_scope_entries": 8, - "max_write_scope_entries": 4, - "roles": { - "worker": { - "filesystem": { - "allow_overwrite": false, - "read_roots": [ - "src", - "tests", - "docs" - ], - "write_roots": [ - "src", - "tests", - "docs" - ] - }, - "tools": [ - "cargo", - "git", - "rg" - ] - } - } - }, - "id": "balanced", - "materiality": { - "changed_files_threshold": 10, - "changed_lines_threshold": 500 - }, - "transitions": { - "availability_fallback": { - "max_fallbacks": 1, - "require_same_capability_class": true - }, - "quality_escalation": { - "max_escalations": 1, - "require_verification_evidence": true - }, - "quota_downgrade": { - "enabled": false, - "max_downgrades": 0, - "noncritical_only": true - }, - "retry": { - "max_same_route_retries": 1 - }, - "safety_stop": { - "enabled": true - } - }, - "usage": { - "budget_exhaustion": "stop", - "max_active_agents": 3, - "max_attempts": 4, - "max_depth": 1, - "max_parallel_readers": 2, - "max_parallel_writers": 1, - "max_tool_calls": 120, - "max_wall_time_seconds": 3600, - "metering": "estimated", - "review_reserve_percent": 20 - }, - "version": "1.0.0" - }, - "recommended": false, - "registry": { - "artifacts": [ - { - "path": ".codex/agents/planr-luna-xhigh.toml", - "sha256": "6603b60e840c68fbcc0ab2f79e633d3a45d8f4904cea434deebbc4fe5e6b8050" - }, - { - "path": ".codex/agents/planr-sol-high.toml", - "sha256": "6b3647e93df124bd6f03a095af4c1f81a66c33ee2c5b1230196c180ebeff08de" - }, - { - "path": ".codex/agents/planr-sol-medium.toml", - "sha256": "4baa3628bdce5498fc278504bcd3cc38d68f7f2167f9c7526630340ac309d691" - }, - { - "path": ".codex/agents/planr-sol-ultra.toml", - "sha256": "4ab0cb64c9d87efe09298139a2f3b27c00a0ae2924ced3d49feb1314250f9d37" - }, - { - "path": ".codex/agents/planr-terra-high.toml", - "sha256": "0cbde7c2bc86584a82cb0d8a56247381efdea589c2dd747c6cca1ff447a351b8" - }, - { - "path": ".codex/agents/planr-terra-medium.toml", - "sha256": "639f79ac803e8cdbf7b4d7c074dc40c4942ea3f8001915b7bdb02843bd712e80" - }, - { - "path": ".codex/skills/planr-native-routing/SKILL.md", - "sha256": "aee6a71ea4905128a7b24ed6b69c43cbcf7609263c114cbf828e51a057a42d50" - }, - { - "path": ".planr/agents.toml", - "sha256": "49eac7a5d265a75b3aadbe7af90bfca9e2b49ede22f365025c31cab73eb57101" - }, - { - "path": ".planr/policy.toml", - "sha256": "827667b678224f6b09f7c3faab188ede4c7bad49cd2fc9fa8e46f01d61147080" - } - ], - "id": "planr-routing-official", - "manifestSha256": "790c673a02d9ac4ecd636d8242b6b4ee10e10595b473bc7385d46ec2a1dd314d", - "signatureVerified": false, - "signer": null, - "trustedMaintainer": false, - "version": "0.1.0" - }, - "replacement": null, - "status": "experimental", - "statusLabel": "Experimental" - }, - { - "binding": { - "dispatch": [ - { - "fallbacks": [ - "cursor-openai-driver" - ], - "match": { - "work_type": "code" - }, - "profile": "cursor-openai-worker" - } - ], - "host": "cursor", - "id": "cursor-openai", - "profiles": { - "cursor-openai-driver": { - "client": "cursor", - "cost_tier": "premium", - "model": "gpt-5.5" - }, - "cursor-openai-worker": { - "client": "cursor", - "cost_tier": "standard", - "model": "gpt-5.4-mini", - "skill": "planr-work" - } - }, - "selector": "cursor-openai", - "version": "1.0.0" - }, - "command": "planr-routing compile balanced --host cursor-openai --output routing-bundle.json && planr routing bundle preview routing-bundle.json", - "compatibility": { - "hosts": [ - "cursor" - ], - "maxPlanrVersion": null, - "minPlanrVersion": "1.4.0" - }, - "enforcement": [ - { - "detail": "Core previews and applies only allowlisted repository-local bundle artifacts.", - "dimension": "Repository writes", - "state": "verified" - }, - { - "detail": "The package generates exact host roles; the host remains execution authority.", - "dimension": "Model and effort", - "state": "host_enforced" - }, - { - "detail": "No authenticated live-host evidence is published for this generated catalog entry.", - "dimension": "Effective route evidence", - "state": "unavailable" - } - ], - "entryId": "balanced-cursor-openai", - "entryVersion": "1.0.0+1.0.0", - "evaluation": { - "evaluatedAtUnix": 1784160000, - "fixtureSha256": "042dbb3ff8569bd56502777d79bd622d00d4f2ae06e4dbb6b3d08bf3af807a21", - "metrics": { - "average_quality_score_bps": null, - "oracle_passes": 0, - "runs": 0 - }, - "resultHashes": [], - "reviewAtUnix": null, - "status": "experimental", - "suiteId": "planr-preset-suite", - "suiteVersion": "1.8.0", - "thresholds": {} - }, - "freshness": "current", - "id": "balanced-cursor-openai@1.0.0+1.0.0", - "lifecycle": "published", - "policy": { - "execution": { - "max_read_scope_entries": 8, - "max_write_scope_entries": 4, - "roles": { - "worker": { - "filesystem": { - "allow_overwrite": false, - "read_roots": [ - "src", - "tests", - "docs" - ], - "write_roots": [ - "src", - "tests", - "docs" - ] - }, - "tools": [ - "cargo", - "git", - "rg" - ] - } - } - }, - "id": "balanced", - "materiality": { - "changed_files_threshold": 10, - "changed_lines_threshold": 500 - }, - "transitions": { - "availability_fallback": { - "max_fallbacks": 1, - "require_same_capability_class": true - }, - "quality_escalation": { - "max_escalations": 1, - "require_verification_evidence": true - }, - "quota_downgrade": { - "enabled": false, - "max_downgrades": 0, - "noncritical_only": true - }, - "retry": { - "max_same_route_retries": 1 - }, - "safety_stop": { - "enabled": true - } - }, - "usage": { - "budget_exhaustion": "stop", - "max_active_agents": 3, - "max_attempts": 4, - "max_depth": 1, - "max_parallel_readers": 2, - "max_parallel_writers": 1, - "max_tool_calls": 120, - "max_wall_time_seconds": 3600, - "metering": "estimated", - "review_reserve_percent": 20 - }, - "version": "1.0.0" - }, - "recommended": false, - "registry": { - "artifacts": [ - { - "path": ".cursor/agents/planr-preset-worker.md", - "sha256": "99f3562c21a373ebd0a467b05093258a9c0e7ce41a72ac1871d3e1d3a0829b55" - }, - { - "path": ".planr/agents.toml", - "sha256": "c322bd30921a29bdea46cd3eeaae142ee365606eb34207bfea3f6aa529710f3f" - }, - { - "path": ".planr/policy.toml", - "sha256": "827667b678224f6b09f7c3faab188ede4c7bad49cd2fc9fa8e46f01d61147080" - } - ], - "id": "planr-routing-official", - "manifestSha256": "2494972d24994e564a4fdb6807d0a64ff26d98ae7cc4b3e0c30fa11470c8cdc3", - "signatureVerified": false, - "signer": null, - "trustedMaintainer": false, - "version": "0.1.0" - }, - "replacement": null, - "status": "experimental", - "statusLabel": "Experimental" - }, - { - "binding": { - "dispatch": [ - { - "fallbacks": [ - "cursor-fable-driver" - ], - "match": { - "work_type": "code" - }, - "profile": "cursor-grok-worker" - } - ], - "host": "cursor", - "id": "cursor-fable-grok", - "profiles": { - "cursor-fable-driver": { - "client": "cursor", - "cost_tier": "premium", - "model": "fable-5" - }, - "cursor-grok-worker": { - "client": "cursor", - "cost_tier": "standard", - "model": "grok-code-fast-1", - "skill": "planr-work" - } - }, - "selector": "cursor-fable-grok", - "version": "1.0.0" - }, - "command": "planr-routing compile balanced --host cursor-fable-grok --output routing-bundle.json && planr routing bundle preview routing-bundle.json", - "compatibility": { - "hosts": [ - "cursor" - ], - "maxPlanrVersion": null, - "minPlanrVersion": "1.4.0" - }, - "enforcement": [ - { - "detail": "Core previews and applies only allowlisted repository-local bundle artifacts.", - "dimension": "Repository writes", - "state": "verified" - }, - { - "detail": "The package generates exact host roles; the host remains execution authority.", - "dimension": "Model and effort", - "state": "host_enforced" - }, - { - "detail": "No authenticated live-host evidence is published for this generated catalog entry.", - "dimension": "Effective route evidence", - "state": "unavailable" - } - ], - "entryId": "balanced-cursor-fable-grok", - "entryVersion": "1.0.0+1.0.0", - "evaluation": { - "evaluatedAtUnix": 1784160000, - "fixtureSha256": "042dbb3ff8569bd56502777d79bd622d00d4f2ae06e4dbb6b3d08bf3af807a21", - "metrics": { - "average_quality_score_bps": null, - "oracle_passes": 0, - "runs": 0 - }, - "resultHashes": [], - "reviewAtUnix": null, - "status": "experimental", - "suiteId": "planr-preset-suite", - "suiteVersion": "1.8.0", - "thresholds": {} - }, - "freshness": "current", - "id": "balanced-cursor-fable-grok@1.0.0+1.0.0", - "lifecycle": "published", - "policy": { - "execution": { - "max_read_scope_entries": 8, - "max_write_scope_entries": 4, - "roles": { - "worker": { - "filesystem": { - "allow_overwrite": false, - "read_roots": [ - "src", - "tests", - "docs" - ], - "write_roots": [ - "src", - "tests", - "docs" - ] - }, - "tools": [ - "cargo", - "git", - "rg" - ] - } - } - }, - "id": "balanced", - "materiality": { - "changed_files_threshold": 10, - "changed_lines_threshold": 500 - }, - "transitions": { - "availability_fallback": { - "max_fallbacks": 1, - "require_same_capability_class": true - }, - "quality_escalation": { - "max_escalations": 1, - "require_verification_evidence": true - }, - "quota_downgrade": { - "enabled": false, - "max_downgrades": 0, - "noncritical_only": true - }, - "retry": { - "max_same_route_retries": 1 - }, - "safety_stop": { - "enabled": true - } - }, - "usage": { - "budget_exhaustion": "stop", - "max_active_agents": 3, - "max_attempts": 4, - "max_depth": 1, - "max_parallel_readers": 2, - "max_parallel_writers": 1, - "max_tool_calls": 120, - "max_wall_time_seconds": 3600, - "metering": "estimated", - "review_reserve_percent": 20 - }, - "version": "1.0.0" - }, - "recommended": false, - "registry": { - "artifacts": [ - { - "path": ".cursor/agents/planr-preset-worker.md", - "sha256": "650495d7dfe35c45cf6b438aad51f8c7d5cc0704f972cbbd568ba22d8a8266b2" - }, - { - "path": ".planr/agents.toml", - "sha256": "ce136bdfd24ea95dbd83a35b3975b2fe3616a78dc8f46539645347f9b6d1351d" - }, - { - "path": ".planr/policy.toml", - "sha256": "827667b678224f6b09f7c3faab188ede4c7bad49cd2fc9fa8e46f01d61147080" - } - ], - "id": "planr-routing-official", - "manifestSha256": "a6af3e4ffcf311a054049533adf501cb3900b562c163a258c5837e11f9cd1580", - "signatureVerified": false, - "signer": null, - "trustedMaintainer": false, - "version": "0.1.0" - }, - "replacement": null, - "status": "experimental", - "statusLabel": "Experimental" - }, - { - "binding": { - "dispatch": [ - { - "fallbacks": [ - "claude-native-driver" - ], - "match": { - "work_type": "code" - }, - "profile": "claude-native-worker" - } - ], - "host": "claude-code", - "id": "claude-native", - "profiles": { - "claude-native-driver": { - "client": "claude-code", - "cost_tier": "premium", - "effort": "high", - "model": "opus" - }, - "claude-native-worker": { - "client": "claude-code", - "cost_tier": "standard", - "effort": "medium", - "model": "sonnet", - "skill": "planr-work" - } - }, - "selector": "claude-native", - "version": "1.0.0" - }, - "command": "planr-routing compile balanced --host claude-native --output routing-bundle.json && planr routing bundle preview routing-bundle.json", - "compatibility": { - "hosts": [ - "claude-code" - ], - "maxPlanrVersion": null, - "minPlanrVersion": "1.4.0" - }, - "enforcement": [ - { - "detail": "Core previews and applies only allowlisted repository-local bundle artifacts.", - "dimension": "Repository writes", - "state": "verified" - }, - { - "detail": "The package generates exact host roles; the host remains execution authority.", - "dimension": "Model and effort", - "state": "host_enforced" - }, - { - "detail": "No authenticated live-host evidence is published for this generated catalog entry.", - "dimension": "Effective route evidence", - "state": "unavailable" - } - ], - "entryId": "balanced-claude-native", - "entryVersion": "1.0.0+1.0.0", - "evaluation": { - "evaluatedAtUnix": 1784160000, - "fixtureSha256": "042dbb3ff8569bd56502777d79bd622d00d4f2ae06e4dbb6b3d08bf3af807a21", - "metrics": { - "average_quality_score_bps": null, - "oracle_passes": 0, - "runs": 0 - }, - "resultHashes": [], - "reviewAtUnix": null, - "status": "experimental", - "suiteId": "planr-preset-suite", - "suiteVersion": "1.8.0", - "thresholds": {} - }, - "freshness": "current", - "id": "balanced-claude-native@1.0.0+1.0.0", - "lifecycle": "published", - "policy": { - "execution": { - "max_read_scope_entries": 8, - "max_write_scope_entries": 4, - "roles": { - "worker": { - "filesystem": { - "allow_overwrite": false, - "read_roots": [ - "src", - "tests", - "docs" - ], - "write_roots": [ - "src", - "tests", - "docs" - ] - }, - "tools": [ - "cargo", - "git", - "rg" - ] - } - } - }, - "id": "balanced", - "materiality": { - "changed_files_threshold": 10, - "changed_lines_threshold": 500 - }, - "transitions": { - "availability_fallback": { - "max_fallbacks": 1, - "require_same_capability_class": true - }, - "quality_escalation": { - "max_escalations": 1, - "require_verification_evidence": true - }, - "quota_downgrade": { - "enabled": false, - "max_downgrades": 0, - "noncritical_only": true - }, - "retry": { - "max_same_route_retries": 1 - }, - "safety_stop": { - "enabled": true - } - }, - "usage": { - "budget_exhaustion": "stop", - "max_active_agents": 3, - "max_attempts": 4, - "max_depth": 1, - "max_parallel_readers": 2, - "max_parallel_writers": 1, - "max_tool_calls": 120, - "max_wall_time_seconds": 3600, - "metering": "estimated", - "review_reserve_percent": 20 - }, - "version": "1.0.0" - }, - "recommended": false, - "registry": { - "artifacts": [ - { - "path": ".claude/agents/planr-preset-worker.md", - "sha256": "b29ef25953d3f933b3eed6a91489b57affcae1ff67a52b1e9ac6ef811fb48a5e" - }, - { - "path": ".planr/agents.toml", - "sha256": "85ce2d790a687667e0562cd33349d4a0fc01fa6161a5705acd23cc1461a583f4" - }, - { - "path": ".planr/policy.toml", - "sha256": "827667b678224f6b09f7c3faab188ede4c7bad49cd2fc9fa8e46f01d61147080" - } - ], - "id": "planr-routing-official", - "manifestSha256": "df5b71221437a71006f0c659cc8bda08799b0d8dd52b3daac79b6cabde16a129", - "signatureVerified": false, - "signer": null, - "trustedMaintainer": false, - "version": "0.1.0" - }, - "replacement": null, - "status": "experimental", - "statusLabel": "Experimental" - }, - { - "binding": { - "dispatch": [ - { - "fallbacks": [], - "match": { - "work_type": "code" - }, - "profile": "mixed-codex-terra-high" - }, - { - "fallbacks": [], - "match": { - "work_type": "mechanical" - }, - "profile": "mixed-codex-luna-xhigh" - }, - { - "fallbacks": [], - "match": { - "work_type": "review" - }, - "profile": "mixed-codex-sol-high" - } - ], - "host": "mixed-host", - "id": "mixed-host", - "profiles": { - "mixed-codex-luna-xhigh": { - "agent_type": "planr_luna_xhigh", - "client": "codex", - "cost_tier": "premium", - "effort": "xhigh", - "model": "gpt-5.6-luna", - "skill": "planr-work" - }, - "mixed-codex-sol-high": { - "agent_type": "planr_sol_high", - "client": "codex", - "cost_tier": "premium", - "effort": "high", - "model": "gpt-5.6-sol", - "skill": "planr-review" - }, - "mixed-codex-terra-high": { - "agent_type": "planr_terra_high", - "client": "codex", - "cost_tier": "standard", - "effort": "high", - "model": "gpt-5.6-terra", - "skill": "planr-work" - }, - "mixed-cursor-fable-driver": { - "client": "cursor", - "cost_tier": "premium", - "model": "fable-5" - } - }, - "selector": "mixed-host", - "version": "2.0.0" - }, - "command": "planr-routing compile balanced --host mixed-host --output routing-bundle.json && planr routing bundle preview routing-bundle.json", - "compatibility": { - "hosts": [ - "mixed-host" - ], - "maxPlanrVersion": null, - "minPlanrVersion": "1.4.0" - }, - "enforcement": [ - { - "detail": "Core previews and applies only allowlisted repository-local bundle artifacts.", - "dimension": "Repository writes", - "state": "verified" - }, - { - "detail": "The package generates exact host roles; the host remains execution authority.", - "dimension": "Model and effort", - "state": "host_enforced" - }, - { - "detail": "No authenticated live-host evidence is published for this generated catalog entry.", - "dimension": "Effective route evidence", - "state": "unavailable" - } - ], - "entryId": "balanced-mixed-host", - "entryVersion": "1.0.0+2.0.0", - "evaluation": { - "evaluatedAtUnix": 1784160000, - "fixtureSha256": "042dbb3ff8569bd56502777d79bd622d00d4f2ae06e4dbb6b3d08bf3af807a21", - "metrics": { - "average_quality_score_bps": null, - "oracle_passes": 0, - "runs": 0 - }, - "resultHashes": [], - "reviewAtUnix": null, - "status": "experimental", - "suiteId": "planr-preset-suite", - "suiteVersion": "1.8.0", - "thresholds": {} - }, - "freshness": "current", - "id": "balanced-mixed-host@1.0.0+2.0.0", - "lifecycle": "published", - "policy": { - "execution": { - "max_read_scope_entries": 8, - "max_write_scope_entries": 4, - "roles": { - "worker": { - "filesystem": { - "allow_overwrite": false, - "read_roots": [ - "src", - "tests", - "docs" - ], - "write_roots": [ - "src", - "tests", - "docs" - ] - }, - "tools": [ - "cargo", - "git", - "rg" - ] - } - } - }, - "id": "balanced", - "materiality": { - "changed_files_threshold": 10, - "changed_lines_threshold": 500 - }, - "transitions": { - "availability_fallback": { - "max_fallbacks": 1, - "require_same_capability_class": true - }, - "quality_escalation": { - "max_escalations": 1, - "require_verification_evidence": true - }, - "quota_downgrade": { - "enabled": false, - "max_downgrades": 0, - "noncritical_only": true - }, - "retry": { - "max_same_route_retries": 1 - }, - "safety_stop": { - "enabled": true - } - }, - "usage": { - "budget_exhaustion": "stop", - "max_active_agents": 3, - "max_attempts": 4, - "max_depth": 1, - "max_parallel_readers": 2, - "max_parallel_writers": 1, - "max_tool_calls": 120, - "max_wall_time_seconds": 3600, - "metering": "estimated", - "review_reserve_percent": 20 - }, - "version": "1.0.0" - }, - "recommended": false, - "registry": { - "artifacts": [ - { - "path": ".codex/agents/planr-luna-xhigh.toml", - "sha256": "6603b60e840c68fbcc0ab2f79e633d3a45d8f4904cea434deebbc4fe5e6b8050" - }, - { - "path": ".codex/agents/planr-sol-high.toml", - "sha256": "6b3647e93df124bd6f03a095af4c1f81a66c33ee2c5b1230196c180ebeff08de" - }, - { - "path": ".codex/agents/planr-terra-high.toml", - "sha256": "0cbde7c2bc86584a82cb0d8a56247381efdea589c2dd747c6cca1ff447a351b8" - }, - { - "path": ".codex/skills/planr-native-routing/SKILL.md", - "sha256": "32ab3e53fe474ac6a44c12f018d5ce286f7ac5de19b32d1a08b3f96574aef166" - }, - { - "path": ".cursor/agents/planr-fable-driver.md", - "sha256": "a42adaf2e90c655f33e5f6b13cd864bcfeda1bd762992c6fa2c2eda79fe487d1" - }, - { - "path": ".planr/agents.toml", - "sha256": "a25f1dac1964f65ac833d467b89bd68b1d2ca4bd77aef5b00d237618f7418934" - }, - { - "path": ".planr/policy.toml", - "sha256": "827667b678224f6b09f7c3faab188ede4c7bad49cd2fc9fa8e46f01d61147080" - } - ], - "id": "planr-routing-official", - "manifestSha256": "880d44929ee6b55cff72f815582ad321e334795c150e052a3b8b72b704fc2f47", - "signatureVerified": false, - "signer": null, - "trustedMaintainer": false, - "version": "0.1.0" - }, - "replacement": null, - "status": "experimental", - "statusLabel": "Experimental" - }, - { - "binding": { - "dispatch": [ - { - "fallbacks": [], - "match": { - "work_type": "exploration" - }, - "profile": "codex-terra-medium" - }, - { - "fallbacks": [], - "match": { - "work_type": "research" - }, - "profile": "codex-terra-medium" - }, - { - "fallbacks": [], - "match": { - "work_type": "code" - }, - "profile": "codex-terra-high" - }, - { - "fallbacks": [], - "match": { - "work_type": "mechanical" - }, - "profile": "codex-luna-xhigh" - }, - { - "fallbacks": [], - "match": { - "work_type": "review" - }, - "profile": "codex-sol-high" - }, - { - "fallbacks": [], - "match": { - "work_type": "moonshot" - }, - "profile": "codex-sol-ultra" - } - ], - "host": "codex", - "id": "codex-openai", - "profiles": { - "codex-luna-xhigh": { - "agent_type": "planr_luna_xhigh", - "client": "codex", - "cost_tier": "premium", - "effort": "xhigh", - "model": "gpt-5.6-luna", - "skill": "planr-work" - }, - "codex-sol-high": { - "agent_type": "planr_sol_high", - "client": "codex", - "cost_tier": "premium", - "effort": "high", - "model": "gpt-5.6-sol", - "skill": "planr-review" - }, - "codex-sol-medium": { - "agent_type": "planr_sol_medium", - "client": "codex", - "cost_tier": "standard", - "effort": "medium", - "model": "gpt-5.6-sol" - }, - "codex-sol-ultra": { - "agent_type": "planr_sol_ultra", - "client": "codex", - "cost_tier": "premium", - "effort": "ultra", - "model": "gpt-5.6-sol" - }, - "codex-terra-high": { - "agent_type": "planr_terra_high", - "client": "codex", - "cost_tier": "standard", - "effort": "high", - "model": "gpt-5.6-terra", - "skill": "planr-work" - }, - "codex-terra-medium": { - "agent_type": "planr_terra_medium", - "client": "codex", - "cost_tier": "standard", - "effort": "medium", - "model": "gpt-5.6-terra" - } - }, - "selector": "codex-openai", - "version": "2.0.0" - }, - "command": "planr-routing compile low-usage --host codex-openai --output routing-bundle.json && planr routing bundle preview routing-bundle.json", - "compatibility": { - "hosts": [ - "codex" - ], - "maxPlanrVersion": null, - "minPlanrVersion": "1.4.0" - }, - "enforcement": [ - { - "detail": "Core previews and applies only allowlisted repository-local bundle artifacts.", - "dimension": "Repository writes", - "state": "verified" - }, - { - "detail": "The package generates exact host roles; the host remains execution authority.", - "dimension": "Model and effort", - "state": "host_enforced" - }, - { - "detail": "No authenticated live-host evidence is published for this generated catalog entry.", - "dimension": "Effective route evidence", - "state": "unavailable" - } - ], - "entryId": "low-usage-codex-openai", - "entryVersion": "1.0.0+2.0.0", - "evaluation": { - "evaluatedAtUnix": 1784160000, - "fixtureSha256": "042dbb3ff8569bd56502777d79bd622d00d4f2ae06e4dbb6b3d08bf3af807a21", - "metrics": { - "average_quality_score_bps": null, - "oracle_passes": 0, - "runs": 0 - }, - "resultHashes": [], - "reviewAtUnix": null, - "status": "experimental", - "suiteId": "planr-preset-suite", - "suiteVersion": "1.8.0", - "thresholds": {} - }, - "freshness": "current", - "id": "low-usage-codex-openai@1.0.0+2.0.0", - "lifecycle": "published", - "policy": { - "execution": { - "max_read_scope_entries": 6, - "max_write_scope_entries": 3, - "roles": { - "worker": { - "filesystem": { - "allow_overwrite": false, - "read_roots": [ - "src", - "tests", - "docs" - ], - "write_roots": [ - "src", - "tests", - "docs" - ] - }, - "tools": [ - "cargo", - "git", - "rg" - ] - } - } - }, - "id": "low-usage", - "materiality": { - "changed_files_threshold": 6, - "changed_lines_threshold": 250 - }, - "transitions": { - "availability_fallback": { - "max_fallbacks": 1, - "require_same_capability_class": true - }, - "quality_escalation": { - "max_escalations": 1, - "require_verification_evidence": true - }, - "quota_downgrade": { - "enabled": true, - "max_downgrades": 1, - "noncritical_only": true - }, - "retry": { - "max_same_route_retries": 0 - }, - "safety_stop": { - "enabled": true - } - }, - "usage": { - "budget_exhaustion": "downgrade_noncritical", - "max_active_agents": 2, - "max_attempts": 3, - "max_depth": 1, - "max_parallel_readers": 1, - "max_parallel_writers": 1, - "max_tool_calls": 60, - "max_wall_time_seconds": 1800, - "metering": "estimated", - "review_reserve_percent": 25 - }, - "version": "1.0.0" - }, - "recommended": false, - "registry": { - "artifacts": [ - { - "path": ".codex/agents/planr-luna-xhigh.toml", - "sha256": "6603b60e840c68fbcc0ab2f79e633d3a45d8f4904cea434deebbc4fe5e6b8050" - }, - { - "path": ".codex/agents/planr-sol-high.toml", - "sha256": "6b3647e93df124bd6f03a095af4c1f81a66c33ee2c5b1230196c180ebeff08de" - }, - { - "path": ".codex/agents/planr-sol-medium.toml", - "sha256": "4baa3628bdce5498fc278504bcd3cc38d68f7f2167f9c7526630340ac309d691" - }, - { - "path": ".codex/agents/planr-sol-ultra.toml", - "sha256": "4ab0cb64c9d87efe09298139a2f3b27c00a0ae2924ced3d49feb1314250f9d37" - }, - { - "path": ".codex/agents/planr-terra-high.toml", - "sha256": "0cbde7c2bc86584a82cb0d8a56247381efdea589c2dd747c6cca1ff447a351b8" - }, - { - "path": ".codex/agents/planr-terra-medium.toml", - "sha256": "639f79ac803e8cdbf7b4d7c074dc40c4942ea3f8001915b7bdb02843bd712e80" - }, - { - "path": ".codex/skills/planr-native-routing/SKILL.md", - "sha256": "aee6a71ea4905128a7b24ed6b69c43cbcf7609263c114cbf828e51a057a42d50" - }, - { - "path": ".planr/agents.toml", - "sha256": "49eac7a5d265a75b3aadbe7af90bfca9e2b49ede22f365025c31cab73eb57101" - }, - { - "path": ".planr/policy.toml", - "sha256": "2c3bc2da5053855104de88d6bf7117726c1beed6280feedb5d2f14c0d56c0858" - } - ], - "id": "planr-routing-official", - "manifestSha256": "894b67ff4737392fe888f522431a28850da6e83f0be5d7dbd3a30e52fb807572", - "signatureVerified": false, - "signer": null, - "trustedMaintainer": false, - "version": "0.1.0" - }, - "replacement": null, - "status": "experimental", - "statusLabel": "Experimental" - }, - { - "binding": { - "dispatch": [ - { - "fallbacks": [ - "cursor-openai-driver" - ], - "match": { - "work_type": "code" - }, - "profile": "cursor-openai-worker" - } - ], - "host": "cursor", - "id": "cursor-openai", - "profiles": { - "cursor-openai-driver": { - "client": "cursor", - "cost_tier": "premium", - "model": "gpt-5.5" - }, - "cursor-openai-worker": { - "client": "cursor", - "cost_tier": "standard", - "model": "gpt-5.4-mini", - "skill": "planr-work" - } - }, - "selector": "cursor-openai", - "version": "1.0.0" - }, - "command": "planr-routing compile low-usage --host cursor-openai --output routing-bundle.json && planr routing bundle preview routing-bundle.json", - "compatibility": { - "hosts": [ - "cursor" - ], - "maxPlanrVersion": null, - "minPlanrVersion": "1.4.0" - }, - "enforcement": [ - { - "detail": "Core previews and applies only allowlisted repository-local bundle artifacts.", - "dimension": "Repository writes", - "state": "verified" - }, - { - "detail": "The package generates exact host roles; the host remains execution authority.", - "dimension": "Model and effort", - "state": "host_enforced" - }, - { - "detail": "No authenticated live-host evidence is published for this generated catalog entry.", - "dimension": "Effective route evidence", - "state": "unavailable" - } - ], - "entryId": "low-usage-cursor-openai", - "entryVersion": "1.0.0+1.0.0", - "evaluation": { - "evaluatedAtUnix": 1784160000, - "fixtureSha256": "042dbb3ff8569bd56502777d79bd622d00d4f2ae06e4dbb6b3d08bf3af807a21", - "metrics": { - "average_quality_score_bps": null, - "oracle_passes": 0, - "runs": 0 - }, - "resultHashes": [], - "reviewAtUnix": null, - "status": "experimental", - "suiteId": "planr-preset-suite", - "suiteVersion": "1.8.0", - "thresholds": {} - }, - "freshness": "current", - "id": "low-usage-cursor-openai@1.0.0+1.0.0", - "lifecycle": "published", - "policy": { - "execution": { - "max_read_scope_entries": 6, - "max_write_scope_entries": 3, - "roles": { - "worker": { - "filesystem": { - "allow_overwrite": false, - "read_roots": [ - "src", - "tests", - "docs" - ], - "write_roots": [ - "src", - "tests", - "docs" - ] - }, - "tools": [ - "cargo", - "git", - "rg" - ] - } - } - }, - "id": "low-usage", - "materiality": { - "changed_files_threshold": 6, - "changed_lines_threshold": 250 - }, - "transitions": { - "availability_fallback": { - "max_fallbacks": 1, - "require_same_capability_class": true - }, - "quality_escalation": { - "max_escalations": 1, - "require_verification_evidence": true - }, - "quota_downgrade": { - "enabled": true, - "max_downgrades": 1, - "noncritical_only": true - }, - "retry": { - "max_same_route_retries": 0 - }, - "safety_stop": { - "enabled": true - } - }, - "usage": { - "budget_exhaustion": "downgrade_noncritical", - "max_active_agents": 2, - "max_attempts": 3, - "max_depth": 1, - "max_parallel_readers": 1, - "max_parallel_writers": 1, - "max_tool_calls": 60, - "max_wall_time_seconds": 1800, - "metering": "estimated", - "review_reserve_percent": 25 - }, - "version": "1.0.0" - }, - "recommended": false, - "registry": { - "artifacts": [ - { - "path": ".cursor/agents/planr-preset-worker.md", - "sha256": "99f3562c21a373ebd0a467b05093258a9c0e7ce41a72ac1871d3e1d3a0829b55" - }, - { - "path": ".planr/agents.toml", - "sha256": "c322bd30921a29bdea46cd3eeaae142ee365606eb34207bfea3f6aa529710f3f" - }, - { - "path": ".planr/policy.toml", - "sha256": "2c3bc2da5053855104de88d6bf7117726c1beed6280feedb5d2f14c0d56c0858" - } - ], - "id": "planr-routing-official", - "manifestSha256": "72cc797f86ef3d674753b208efb7d49c56c6fe5ab1ccccdefc52581e0c5ba5c9", - "signatureVerified": false, - "signer": null, - "trustedMaintainer": false, - "version": "0.1.0" - }, - "replacement": null, - "status": "experimental", - "statusLabel": "Experimental" - }, - { - "binding": { - "dispatch": [ - { - "fallbacks": [ - "cursor-fable-driver" - ], - "match": { - "work_type": "code" - }, - "profile": "cursor-grok-worker" - } - ], - "host": "cursor", - "id": "cursor-fable-grok", - "profiles": { - "cursor-fable-driver": { - "client": "cursor", - "cost_tier": "premium", - "model": "fable-5" - }, - "cursor-grok-worker": { - "client": "cursor", - "cost_tier": "standard", - "model": "grok-code-fast-1", - "skill": "planr-work" - } - }, - "selector": "cursor-fable-grok", - "version": "1.0.0" - }, - "command": "planr-routing compile low-usage --host cursor-fable-grok --output routing-bundle.json && planr routing bundle preview routing-bundle.json", - "compatibility": { - "hosts": [ - "cursor" - ], - "maxPlanrVersion": null, - "minPlanrVersion": "1.4.0" - }, - "enforcement": [ - { - "detail": "Core previews and applies only allowlisted repository-local bundle artifacts.", - "dimension": "Repository writes", - "state": "verified" - }, - { - "detail": "The package generates exact host roles; the host remains execution authority.", - "dimension": "Model and effort", - "state": "host_enforced" - }, - { - "detail": "No authenticated live-host evidence is published for this generated catalog entry.", - "dimension": "Effective route evidence", - "state": "unavailable" - } - ], - "entryId": "low-usage-cursor-fable-grok", - "entryVersion": "1.0.0+1.0.0", - "evaluation": { - "evaluatedAtUnix": 1784160000, - "fixtureSha256": "042dbb3ff8569bd56502777d79bd622d00d4f2ae06e4dbb6b3d08bf3af807a21", - "metrics": { - "average_quality_score_bps": null, - "oracle_passes": 0, - "runs": 0 - }, - "resultHashes": [], - "reviewAtUnix": null, - "status": "experimental", - "suiteId": "planr-preset-suite", - "suiteVersion": "1.8.0", - "thresholds": {} - }, - "freshness": "current", - "id": "low-usage-cursor-fable-grok@1.0.0+1.0.0", - "lifecycle": "published", - "policy": { - "execution": { - "max_read_scope_entries": 6, - "max_write_scope_entries": 3, - "roles": { - "worker": { - "filesystem": { - "allow_overwrite": false, - "read_roots": [ - "src", - "tests", - "docs" - ], - "write_roots": [ - "src", - "tests", - "docs" - ] - }, - "tools": [ - "cargo", - "git", - "rg" - ] - } - } - }, - "id": "low-usage", - "materiality": { - "changed_files_threshold": 6, - "changed_lines_threshold": 250 - }, - "transitions": { - "availability_fallback": { - "max_fallbacks": 1, - "require_same_capability_class": true - }, - "quality_escalation": { - "max_escalations": 1, - "require_verification_evidence": true - }, - "quota_downgrade": { - "enabled": true, - "max_downgrades": 1, - "noncritical_only": true - }, - "retry": { - "max_same_route_retries": 0 - }, - "safety_stop": { - "enabled": true - } - }, - "usage": { - "budget_exhaustion": "downgrade_noncritical", - "max_active_agents": 2, - "max_attempts": 3, - "max_depth": 1, - "max_parallel_readers": 1, - "max_parallel_writers": 1, - "max_tool_calls": 60, - "max_wall_time_seconds": 1800, - "metering": "estimated", - "review_reserve_percent": 25 - }, - "version": "1.0.0" - }, - "recommended": false, - "registry": { - "artifacts": [ - { - "path": ".cursor/agents/planr-preset-worker.md", - "sha256": "650495d7dfe35c45cf6b438aad51f8c7d5cc0704f972cbbd568ba22d8a8266b2" - }, - { - "path": ".planr/agents.toml", - "sha256": "ce136bdfd24ea95dbd83a35b3975b2fe3616a78dc8f46539645347f9b6d1351d" - }, - { - "path": ".planr/policy.toml", - "sha256": "2c3bc2da5053855104de88d6bf7117726c1beed6280feedb5d2f14c0d56c0858" - } - ], - "id": "planr-routing-official", - "manifestSha256": "ce1e12cbe44de311e69e6c981ba7276ecf4f30e487e2dff21b2fb6be793b7cc6", - "signatureVerified": false, - "signer": null, - "trustedMaintainer": false, - "version": "0.1.0" - }, - "replacement": null, - "status": "experimental", - "statusLabel": "Experimental" - }, - { - "binding": { - "dispatch": [ - { - "fallbacks": [ - "claude-native-driver" - ], - "match": { - "work_type": "code" - }, - "profile": "claude-native-worker" - } - ], - "host": "claude-code", - "id": "claude-native", - "profiles": { - "claude-native-driver": { - "client": "claude-code", - "cost_tier": "premium", - "effort": "high", - "model": "opus" - }, - "claude-native-worker": { - "client": "claude-code", - "cost_tier": "standard", - "effort": "medium", - "model": "sonnet", - "skill": "planr-work" - } - }, - "selector": "claude-native", - "version": "1.0.0" - }, - "command": "planr-routing compile low-usage --host claude-native --output routing-bundle.json && planr routing bundle preview routing-bundle.json", - "compatibility": { - "hosts": [ - "claude-code" - ], - "maxPlanrVersion": null, - "minPlanrVersion": "1.4.0" - }, - "enforcement": [ - { - "detail": "Core previews and applies only allowlisted repository-local bundle artifacts.", - "dimension": "Repository writes", - "state": "verified" - }, - { - "detail": "The package generates exact host roles; the host remains execution authority.", - "dimension": "Model and effort", - "state": "host_enforced" - }, - { - "detail": "No authenticated live-host evidence is published for this generated catalog entry.", - "dimension": "Effective route evidence", - "state": "unavailable" - } - ], - "entryId": "low-usage-claude-native", - "entryVersion": "1.0.0+1.0.0", - "evaluation": { - "evaluatedAtUnix": 1784160000, - "fixtureSha256": "042dbb3ff8569bd56502777d79bd622d00d4f2ae06e4dbb6b3d08bf3af807a21", - "metrics": { - "average_quality_score_bps": null, - "oracle_passes": 0, - "runs": 0 - }, - "resultHashes": [], - "reviewAtUnix": null, - "status": "experimental", - "suiteId": "planr-preset-suite", - "suiteVersion": "1.8.0", - "thresholds": {} - }, - "freshness": "current", - "id": "low-usage-claude-native@1.0.0+1.0.0", - "lifecycle": "published", - "policy": { - "execution": { - "max_read_scope_entries": 6, - "max_write_scope_entries": 3, - "roles": { - "worker": { - "filesystem": { - "allow_overwrite": false, - "read_roots": [ - "src", - "tests", - "docs" - ], - "write_roots": [ - "src", - "tests", - "docs" - ] - }, - "tools": [ - "cargo", - "git", - "rg" - ] - } - } - }, - "id": "low-usage", - "materiality": { - "changed_files_threshold": 6, - "changed_lines_threshold": 250 - }, - "transitions": { - "availability_fallback": { - "max_fallbacks": 1, - "require_same_capability_class": true - }, - "quality_escalation": { - "max_escalations": 1, - "require_verification_evidence": true - }, - "quota_downgrade": { - "enabled": true, - "max_downgrades": 1, - "noncritical_only": true - }, - "retry": { - "max_same_route_retries": 0 - }, - "safety_stop": { - "enabled": true - } - }, - "usage": { - "budget_exhaustion": "downgrade_noncritical", - "max_active_agents": 2, - "max_attempts": 3, - "max_depth": 1, - "max_parallel_readers": 1, - "max_parallel_writers": 1, - "max_tool_calls": 60, - "max_wall_time_seconds": 1800, - "metering": "estimated", - "review_reserve_percent": 25 - }, - "version": "1.0.0" - }, - "recommended": false, - "registry": { - "artifacts": [ - { - "path": ".claude/agents/planr-preset-worker.md", - "sha256": "b29ef25953d3f933b3eed6a91489b57affcae1ff67a52b1e9ac6ef811fb48a5e" - }, - { - "path": ".planr/agents.toml", - "sha256": "85ce2d790a687667e0562cd33349d4a0fc01fa6161a5705acd23cc1461a583f4" - }, - { - "path": ".planr/policy.toml", - "sha256": "2c3bc2da5053855104de88d6bf7117726c1beed6280feedb5d2f14c0d56c0858" - } - ], - "id": "planr-routing-official", - "manifestSha256": "8a2b1fbf73c736284f9c6bec2b9bd2c5eb379c658c3164cce11b3d9508cff3f9", - "signatureVerified": false, - "signer": null, - "trustedMaintainer": false, - "version": "0.1.0" - }, - "replacement": null, - "status": "experimental", - "statusLabel": "Experimental" - }, - { - "binding": { - "dispatch": [ - { - "fallbacks": [], - "match": { - "work_type": "code" - }, - "profile": "mixed-codex-terra-high" - }, - { - "fallbacks": [], - "match": { - "work_type": "mechanical" - }, - "profile": "mixed-codex-luna-xhigh" - }, - { - "fallbacks": [], - "match": { - "work_type": "review" - }, - "profile": "mixed-codex-sol-high" - } - ], - "host": "mixed-host", - "id": "mixed-host", - "profiles": { - "mixed-codex-luna-xhigh": { - "agent_type": "planr_luna_xhigh", - "client": "codex", - "cost_tier": "premium", - "effort": "xhigh", - "model": "gpt-5.6-luna", - "skill": "planr-work" - }, - "mixed-codex-sol-high": { - "agent_type": "planr_sol_high", - "client": "codex", - "cost_tier": "premium", - "effort": "high", - "model": "gpt-5.6-sol", - "skill": "planr-review" - }, - "mixed-codex-terra-high": { - "agent_type": "planr_terra_high", - "client": "codex", - "cost_tier": "standard", - "effort": "high", - "model": "gpt-5.6-terra", - "skill": "planr-work" - }, - "mixed-cursor-fable-driver": { - "client": "cursor", - "cost_tier": "premium", - "model": "fable-5" - } - }, - "selector": "mixed-host", - "version": "2.0.0" - }, - "command": "planr-routing compile low-usage --host mixed-host --output routing-bundle.json && planr routing bundle preview routing-bundle.json", - "compatibility": { - "hosts": [ - "mixed-host" - ], - "maxPlanrVersion": null, - "minPlanrVersion": "1.4.0" - }, - "enforcement": [ - { - "detail": "Core previews and applies only allowlisted repository-local bundle artifacts.", - "dimension": "Repository writes", - "state": "verified" - }, - { - "detail": "The package generates exact host roles; the host remains execution authority.", - "dimension": "Model and effort", - "state": "host_enforced" - }, - { - "detail": "No authenticated live-host evidence is published for this generated catalog entry.", - "dimension": "Effective route evidence", - "state": "unavailable" - } - ], - "entryId": "low-usage-mixed-host", - "entryVersion": "1.0.0+2.0.0", - "evaluation": { - "evaluatedAtUnix": 1784160000, - "fixtureSha256": "042dbb3ff8569bd56502777d79bd622d00d4f2ae06e4dbb6b3d08bf3af807a21", - "metrics": { - "average_quality_score_bps": null, - "oracle_passes": 0, - "runs": 0 - }, - "resultHashes": [], - "reviewAtUnix": null, - "status": "experimental", - "suiteId": "planr-preset-suite", - "suiteVersion": "1.8.0", - "thresholds": {} - }, - "freshness": "current", - "id": "low-usage-mixed-host@1.0.0+2.0.0", - "lifecycle": "published", - "policy": { - "execution": { - "max_read_scope_entries": 6, - "max_write_scope_entries": 3, - "roles": { - "worker": { - "filesystem": { - "allow_overwrite": false, - "read_roots": [ - "src", - "tests", - "docs" - ], - "write_roots": [ - "src", - "tests", - "docs" - ] - }, - "tools": [ - "cargo", - "git", - "rg" - ] - } - } - }, - "id": "low-usage", - "materiality": { - "changed_files_threshold": 6, - "changed_lines_threshold": 250 - }, - "transitions": { - "availability_fallback": { - "max_fallbacks": 1, - "require_same_capability_class": true - }, - "quality_escalation": { - "max_escalations": 1, - "require_verification_evidence": true - }, - "quota_downgrade": { - "enabled": true, - "max_downgrades": 1, - "noncritical_only": true - }, - "retry": { - "max_same_route_retries": 0 - }, - "safety_stop": { - "enabled": true - } - }, - "usage": { - "budget_exhaustion": "downgrade_noncritical", - "max_active_agents": 2, - "max_attempts": 3, - "max_depth": 1, - "max_parallel_readers": 1, - "max_parallel_writers": 1, - "max_tool_calls": 60, - "max_wall_time_seconds": 1800, - "metering": "estimated", - "review_reserve_percent": 25 - }, - "version": "1.0.0" - }, - "recommended": false, - "registry": { - "artifacts": [ - { - "path": ".codex/agents/planr-luna-xhigh.toml", - "sha256": "6603b60e840c68fbcc0ab2f79e633d3a45d8f4904cea434deebbc4fe5e6b8050" - }, - { - "path": ".codex/agents/planr-sol-high.toml", - "sha256": "6b3647e93df124bd6f03a095af4c1f81a66c33ee2c5b1230196c180ebeff08de" - }, - { - "path": ".codex/agents/planr-terra-high.toml", - "sha256": "0cbde7c2bc86584a82cb0d8a56247381efdea589c2dd747c6cca1ff447a351b8" - }, - { - "path": ".codex/skills/planr-native-routing/SKILL.md", - "sha256": "32ab3e53fe474ac6a44c12f018d5ce286f7ac5de19b32d1a08b3f96574aef166" - }, - { - "path": ".cursor/agents/planr-fable-driver.md", - "sha256": "a42adaf2e90c655f33e5f6b13cd864bcfeda1bd762992c6fa2c2eda79fe487d1" - }, - { - "path": ".planr/agents.toml", - "sha256": "a25f1dac1964f65ac833d467b89bd68b1d2ca4bd77aef5b00d237618f7418934" - }, - { - "path": ".planr/policy.toml", - "sha256": "2c3bc2da5053855104de88d6bf7117726c1beed6280feedb5d2f14c0d56c0858" - } - ], - "id": "planr-routing-official", - "manifestSha256": "53fdd3d1f65076c17bfc76a77dca0c05e4e205cc1b858ff3093070c2bfe00a8f", - "signatureVerified": false, - "signer": null, - "trustedMaintainer": false, - "version": "0.1.0" - }, - "replacement": null, - "status": "experimental", - "statusLabel": "Experimental" - }, - { - "binding": { - "dispatch": [ - { - "fallbacks": [], - "match": { - "work_type": "exploration" - }, - "profile": "codex-terra-medium" - }, - { - "fallbacks": [], - "match": { - "work_type": "research" - }, - "profile": "codex-terra-medium" - }, - { - "fallbacks": [], - "match": { - "work_type": "code" - }, - "profile": "codex-terra-high" - }, - { - "fallbacks": [], - "match": { - "work_type": "mechanical" - }, - "profile": "codex-luna-xhigh" - }, - { - "fallbacks": [], - "match": { - "work_type": "review" - }, - "profile": "codex-sol-high" - }, - { - "fallbacks": [], - "match": { - "work_type": "moonshot" - }, - "profile": "codex-sol-ultra" - } - ], - "host": "codex", - "id": "codex-openai", - "profiles": { - "codex-luna-xhigh": { - "agent_type": "planr_luna_xhigh", - "client": "codex", - "cost_tier": "premium", - "effort": "xhigh", - "model": "gpt-5.6-luna", - "skill": "planr-work" - }, - "codex-sol-high": { - "agent_type": "planr_sol_high", - "client": "codex", - "cost_tier": "premium", - "effort": "high", - "model": "gpt-5.6-sol", - "skill": "planr-review" - }, - "codex-sol-medium": { - "agent_type": "planr_sol_medium", - "client": "codex", - "cost_tier": "standard", - "effort": "medium", - "model": "gpt-5.6-sol" - }, - "codex-sol-ultra": { - "agent_type": "planr_sol_ultra", - "client": "codex", - "cost_tier": "premium", - "effort": "ultra", - "model": "gpt-5.6-sol" - }, - "codex-terra-high": { - "agent_type": "planr_terra_high", - "client": "codex", - "cost_tier": "standard", - "effort": "high", - "model": "gpt-5.6-terra", - "skill": "planr-work" - }, - "codex-terra-medium": { - "agent_type": "planr_terra_medium", - "client": "codex", - "cost_tier": "standard", - "effort": "medium", - "model": "gpt-5.6-terra" - } - }, - "selector": "codex-openai", - "version": "2.0.0" - }, - "command": "planr-routing compile max-quality --host codex-openai --output routing-bundle.json && planr routing bundle preview routing-bundle.json", - "compatibility": { - "hosts": [ - "codex" - ], - "maxPlanrVersion": null, - "minPlanrVersion": "1.4.0" - }, - "enforcement": [ - { - "detail": "Core previews and applies only allowlisted repository-local bundle artifacts.", - "dimension": "Repository writes", - "state": "verified" - }, - { - "detail": "The package generates exact host roles; the host remains execution authority.", - "dimension": "Model and effort", - "state": "host_enforced" - }, - { - "detail": "No authenticated live-host evidence is published for this generated catalog entry.", - "dimension": "Effective route evidence", - "state": "unavailable" - } - ], - "entryId": "max-quality-codex-openai", - "entryVersion": "1.0.0+2.0.0", - "evaluation": { - "evaluatedAtUnix": 1784160000, - "fixtureSha256": "042dbb3ff8569bd56502777d79bd622d00d4f2ae06e4dbb6b3d08bf3af807a21", - "metrics": { - "average_quality_score_bps": null, - "oracle_passes": 0, - "runs": 0 - }, - "resultHashes": [], - "reviewAtUnix": null, - "status": "experimental", - "suiteId": "planr-preset-suite", - "suiteVersion": "1.8.0", - "thresholds": {} - }, - "freshness": "current", - "id": "max-quality-codex-openai@1.0.0+2.0.0", - "lifecycle": "published", - "policy": { - "execution": { - "max_read_scope_entries": 12, - "max_write_scope_entries": 6, - "roles": { - "worker": { - "filesystem": { - "allow_overwrite": false, - "read_roots": [ - "src", - "tests", - "docs" - ], - "write_roots": [ - "src", - "tests", - "docs" - ] - }, - "tools": [ - "cargo", - "git", - "rg" - ] - } - } - }, - "id": "max-quality", - "materiality": { - "changed_files_threshold": 5, - "changed_lines_threshold": 200 - }, - "transitions": { - "availability_fallback": { - "max_fallbacks": 1, - "require_same_capability_class": true - }, - "quality_escalation": { - "max_escalations": 2, - "require_verification_evidence": true - }, - "quota_downgrade": { - "enabled": false, - "max_downgrades": 0, - "noncritical_only": true - }, - "retry": { - "max_same_route_retries": 1 - }, - "safety_stop": { - "enabled": true - } - }, - "usage": { - "budget_exhaustion": "stop", - "max_active_agents": 4, - "max_attempts": 5, - "max_depth": 1, - "max_parallel_readers": 3, - "max_parallel_writers": 1, - "max_tool_calls": 240, - "max_wall_time_seconds": 7200, - "metering": "estimated", - "review_reserve_percent": 40 - }, - "version": "1.0.0" - }, - "recommended": false, - "registry": { - "artifacts": [ - { - "path": ".codex/agents/planr-luna-xhigh.toml", - "sha256": "6603b60e840c68fbcc0ab2f79e633d3a45d8f4904cea434deebbc4fe5e6b8050" - }, - { - "path": ".codex/agents/planr-sol-high.toml", - "sha256": "6b3647e93df124bd6f03a095af4c1f81a66c33ee2c5b1230196c180ebeff08de" - }, - { - "path": ".codex/agents/planr-sol-medium.toml", - "sha256": "4baa3628bdce5498fc278504bcd3cc38d68f7f2167f9c7526630340ac309d691" - }, - { - "path": ".codex/agents/planr-sol-ultra.toml", - "sha256": "4ab0cb64c9d87efe09298139a2f3b27c00a0ae2924ced3d49feb1314250f9d37" - }, - { - "path": ".codex/agents/planr-terra-high.toml", - "sha256": "0cbde7c2bc86584a82cb0d8a56247381efdea589c2dd747c6cca1ff447a351b8" - }, - { - "path": ".codex/agents/planr-terra-medium.toml", - "sha256": "639f79ac803e8cdbf7b4d7c074dc40c4942ea3f8001915b7bdb02843bd712e80" - }, - { - "path": ".codex/skills/planr-native-routing/SKILL.md", - "sha256": "aee6a71ea4905128a7b24ed6b69c43cbcf7609263c114cbf828e51a057a42d50" - }, - { - "path": ".planr/agents.toml", - "sha256": "49eac7a5d265a75b3aadbe7af90bfca9e2b49ede22f365025c31cab73eb57101" - }, - { - "path": ".planr/policy.toml", - "sha256": "471699e7f80a7751a7c03db9fc49e2f4b1d0b8cdba8fe48812b6eb9506d55db5" - } - ], - "id": "planr-routing-official", - "manifestSha256": "df2c0a07c3c7a7ea59821b961072a1ccfb1a900492814a08ce6ad6721e61f174", - "signatureVerified": false, - "signer": null, - "trustedMaintainer": false, - "version": "0.1.0" - }, - "replacement": null, - "status": "experimental", - "statusLabel": "Experimental" - }, - { - "binding": { - "dispatch": [ - { - "fallbacks": [ - "cursor-openai-driver" - ], - "match": { - "work_type": "code" - }, - "profile": "cursor-openai-worker" - } - ], - "host": "cursor", - "id": "cursor-openai", - "profiles": { - "cursor-openai-driver": { - "client": "cursor", - "cost_tier": "premium", - "model": "gpt-5.5" - }, - "cursor-openai-worker": { - "client": "cursor", - "cost_tier": "standard", - "model": "gpt-5.4-mini", - "skill": "planr-work" - } - }, - "selector": "cursor-openai", - "version": "1.0.0" - }, - "command": "planr-routing compile max-quality --host cursor-openai --output routing-bundle.json && planr routing bundle preview routing-bundle.json", - "compatibility": { - "hosts": [ - "cursor" - ], - "maxPlanrVersion": null, - "minPlanrVersion": "1.4.0" - }, - "enforcement": [ - { - "detail": "Core previews and applies only allowlisted repository-local bundle artifacts.", - "dimension": "Repository writes", - "state": "verified" - }, - { - "detail": "The package generates exact host roles; the host remains execution authority.", - "dimension": "Model and effort", - "state": "host_enforced" - }, - { - "detail": "No authenticated live-host evidence is published for this generated catalog entry.", - "dimension": "Effective route evidence", - "state": "unavailable" - } - ], - "entryId": "max-quality-cursor-openai", - "entryVersion": "1.0.0+1.0.0", - "evaluation": { - "evaluatedAtUnix": 1784160000, - "fixtureSha256": "042dbb3ff8569bd56502777d79bd622d00d4f2ae06e4dbb6b3d08bf3af807a21", - "metrics": { - "average_quality_score_bps": null, - "oracle_passes": 0, - "runs": 0 - }, - "resultHashes": [], - "reviewAtUnix": null, - "status": "experimental", - "suiteId": "planr-preset-suite", - "suiteVersion": "1.8.0", - "thresholds": {} - }, - "freshness": "current", - "id": "max-quality-cursor-openai@1.0.0+1.0.0", - "lifecycle": "published", - "policy": { - "execution": { - "max_read_scope_entries": 12, - "max_write_scope_entries": 6, - "roles": { - "worker": { - "filesystem": { - "allow_overwrite": false, - "read_roots": [ - "src", - "tests", - "docs" - ], - "write_roots": [ - "src", - "tests", - "docs" - ] - }, - "tools": [ - "cargo", - "git", - "rg" - ] - } - } - }, - "id": "max-quality", - "materiality": { - "changed_files_threshold": 5, - "changed_lines_threshold": 200 - }, - "transitions": { - "availability_fallback": { - "max_fallbacks": 1, - "require_same_capability_class": true - }, - "quality_escalation": { - "max_escalations": 2, - "require_verification_evidence": true - }, - "quota_downgrade": { - "enabled": false, - "max_downgrades": 0, - "noncritical_only": true - }, - "retry": { - "max_same_route_retries": 1 - }, - "safety_stop": { - "enabled": true - } - }, - "usage": { - "budget_exhaustion": "stop", - "max_active_agents": 4, - "max_attempts": 5, - "max_depth": 1, - "max_parallel_readers": 3, - "max_parallel_writers": 1, - "max_tool_calls": 240, - "max_wall_time_seconds": 7200, - "metering": "estimated", - "review_reserve_percent": 40 - }, - "version": "1.0.0" - }, - "recommended": false, - "registry": { - "artifacts": [ - { - "path": ".cursor/agents/planr-preset-worker.md", - "sha256": "99f3562c21a373ebd0a467b05093258a9c0e7ce41a72ac1871d3e1d3a0829b55" - }, - { - "path": ".planr/agents.toml", - "sha256": "c322bd30921a29bdea46cd3eeaae142ee365606eb34207bfea3f6aa529710f3f" - }, - { - "path": ".planr/policy.toml", - "sha256": "471699e7f80a7751a7c03db9fc49e2f4b1d0b8cdba8fe48812b6eb9506d55db5" - } - ], - "id": "planr-routing-official", - "manifestSha256": "ec610bb8570dc94b35b25ffbc34b67ff42b7c3bb4077ba24e9c825ae78dcbc2c", - "signatureVerified": false, - "signer": null, - "trustedMaintainer": false, - "version": "0.1.0" - }, - "replacement": null, - "status": "experimental", - "statusLabel": "Experimental" - }, - { - "binding": { - "dispatch": [ - { - "fallbacks": [ - "cursor-fable-driver" - ], - "match": { - "work_type": "code" - }, - "profile": "cursor-grok-worker" - } - ], - "host": "cursor", - "id": "cursor-fable-grok", - "profiles": { - "cursor-fable-driver": { - "client": "cursor", - "cost_tier": "premium", - "model": "fable-5" - }, - "cursor-grok-worker": { - "client": "cursor", - "cost_tier": "standard", - "model": "grok-code-fast-1", - "skill": "planr-work" - } - }, - "selector": "cursor-fable-grok", - "version": "1.0.0" - }, - "command": "planr-routing compile max-quality --host cursor-fable-grok --output routing-bundle.json && planr routing bundle preview routing-bundle.json", - "compatibility": { - "hosts": [ - "cursor" - ], - "maxPlanrVersion": null, - "minPlanrVersion": "1.4.0" - }, - "enforcement": [ - { - "detail": "Core previews and applies only allowlisted repository-local bundle artifacts.", - "dimension": "Repository writes", - "state": "verified" - }, - { - "detail": "The package generates exact host roles; the host remains execution authority.", - "dimension": "Model and effort", - "state": "host_enforced" - }, - { - "detail": "No authenticated live-host evidence is published for this generated catalog entry.", - "dimension": "Effective route evidence", - "state": "unavailable" - } - ], - "entryId": "max-quality-cursor-fable-grok", - "entryVersion": "1.0.0+1.0.0", - "evaluation": { - "evaluatedAtUnix": 1784160000, - "fixtureSha256": "042dbb3ff8569bd56502777d79bd622d00d4f2ae06e4dbb6b3d08bf3af807a21", - "metrics": { - "average_quality_score_bps": null, - "oracle_passes": 0, - "runs": 0 - }, - "resultHashes": [], - "reviewAtUnix": null, - "status": "experimental", - "suiteId": "planr-preset-suite", - "suiteVersion": "1.8.0", - "thresholds": {} - }, - "freshness": "current", - "id": "max-quality-cursor-fable-grok@1.0.0+1.0.0", - "lifecycle": "published", - "policy": { - "execution": { - "max_read_scope_entries": 12, - "max_write_scope_entries": 6, - "roles": { - "worker": { - "filesystem": { - "allow_overwrite": false, - "read_roots": [ - "src", - "tests", - "docs" - ], - "write_roots": [ - "src", - "tests", - "docs" - ] - }, - "tools": [ - "cargo", - "git", - "rg" - ] - } - } - }, - "id": "max-quality", - "materiality": { - "changed_files_threshold": 5, - "changed_lines_threshold": 200 - }, - "transitions": { - "availability_fallback": { - "max_fallbacks": 1, - "require_same_capability_class": true - }, - "quality_escalation": { - "max_escalations": 2, - "require_verification_evidence": true - }, - "quota_downgrade": { - "enabled": false, - "max_downgrades": 0, - "noncritical_only": true - }, - "retry": { - "max_same_route_retries": 1 - }, - "safety_stop": { - "enabled": true - } - }, - "usage": { - "budget_exhaustion": "stop", - "max_active_agents": 4, - "max_attempts": 5, - "max_depth": 1, - "max_parallel_readers": 3, - "max_parallel_writers": 1, - "max_tool_calls": 240, - "max_wall_time_seconds": 7200, - "metering": "estimated", - "review_reserve_percent": 40 - }, - "version": "1.0.0" - }, - "recommended": false, - "registry": { - "artifacts": [ - { - "path": ".cursor/agents/planr-preset-worker.md", - "sha256": "650495d7dfe35c45cf6b438aad51f8c7d5cc0704f972cbbd568ba22d8a8266b2" - }, - { - "path": ".planr/agents.toml", - "sha256": "ce136bdfd24ea95dbd83a35b3975b2fe3616a78dc8f46539645347f9b6d1351d" - }, - { - "path": ".planr/policy.toml", - "sha256": "471699e7f80a7751a7c03db9fc49e2f4b1d0b8cdba8fe48812b6eb9506d55db5" - } - ], - "id": "planr-routing-official", - "manifestSha256": "0c3fec73bf6fe47d8bb3905dd64a1da372a66864fa59211d5819062055a2d4e4", - "signatureVerified": false, - "signer": null, - "trustedMaintainer": false, - "version": "0.1.0" - }, - "replacement": null, - "status": "experimental", - "statusLabel": "Experimental" - }, - { - "binding": { - "dispatch": [ - { - "fallbacks": [ - "claude-native-driver" - ], - "match": { - "work_type": "code" - }, - "profile": "claude-native-worker" - } - ], - "host": "claude-code", - "id": "claude-native", - "profiles": { - "claude-native-driver": { - "client": "claude-code", - "cost_tier": "premium", - "effort": "high", - "model": "opus" - }, - "claude-native-worker": { - "client": "claude-code", - "cost_tier": "standard", - "effort": "medium", - "model": "sonnet", - "skill": "planr-work" - } - }, - "selector": "claude-native", - "version": "1.0.0" - }, - "command": "planr-routing compile max-quality --host claude-native --output routing-bundle.json && planr routing bundle preview routing-bundle.json", - "compatibility": { - "hosts": [ - "claude-code" - ], - "maxPlanrVersion": null, - "minPlanrVersion": "1.4.0" - }, - "enforcement": [ - { - "detail": "Core previews and applies only allowlisted repository-local bundle artifacts.", - "dimension": "Repository writes", - "state": "verified" - }, - { - "detail": "The package generates exact host roles; the host remains execution authority.", - "dimension": "Model and effort", - "state": "host_enforced" - }, - { - "detail": "No authenticated live-host evidence is published for this generated catalog entry.", - "dimension": "Effective route evidence", - "state": "unavailable" - } - ], - "entryId": "max-quality-claude-native", - "entryVersion": "1.0.0+1.0.0", - "evaluation": { - "evaluatedAtUnix": 1784160000, - "fixtureSha256": "042dbb3ff8569bd56502777d79bd622d00d4f2ae06e4dbb6b3d08bf3af807a21", - "metrics": { - "average_quality_score_bps": null, - "oracle_passes": 0, - "runs": 0 - }, - "resultHashes": [], - "reviewAtUnix": null, - "status": "experimental", - "suiteId": "planr-preset-suite", - "suiteVersion": "1.8.0", - "thresholds": {} - }, - "freshness": "current", - "id": "max-quality-claude-native@1.0.0+1.0.0", - "lifecycle": "published", - "policy": { - "execution": { - "max_read_scope_entries": 12, - "max_write_scope_entries": 6, - "roles": { - "worker": { - "filesystem": { - "allow_overwrite": false, - "read_roots": [ - "src", - "tests", - "docs" - ], - "write_roots": [ - "src", - "tests", - "docs" - ] - }, - "tools": [ - "cargo", - "git", - "rg" - ] - } - } - }, - "id": "max-quality", - "materiality": { - "changed_files_threshold": 5, - "changed_lines_threshold": 200 - }, - "transitions": { - "availability_fallback": { - "max_fallbacks": 1, - "require_same_capability_class": true - }, - "quality_escalation": { - "max_escalations": 2, - "require_verification_evidence": true - }, - "quota_downgrade": { - "enabled": false, - "max_downgrades": 0, - "noncritical_only": true - }, - "retry": { - "max_same_route_retries": 1 - }, - "safety_stop": { - "enabled": true - } - }, - "usage": { - "budget_exhaustion": "stop", - "max_active_agents": 4, - "max_attempts": 5, - "max_depth": 1, - "max_parallel_readers": 3, - "max_parallel_writers": 1, - "max_tool_calls": 240, - "max_wall_time_seconds": 7200, - "metering": "estimated", - "review_reserve_percent": 40 - }, - "version": "1.0.0" - }, - "recommended": false, - "registry": { - "artifacts": [ - { - "path": ".claude/agents/planr-preset-worker.md", - "sha256": "b29ef25953d3f933b3eed6a91489b57affcae1ff67a52b1e9ac6ef811fb48a5e" - }, - { - "path": ".planr/agents.toml", - "sha256": "85ce2d790a687667e0562cd33349d4a0fc01fa6161a5705acd23cc1461a583f4" - }, - { - "path": ".planr/policy.toml", - "sha256": "471699e7f80a7751a7c03db9fc49e2f4b1d0b8cdba8fe48812b6eb9506d55db5" - } - ], - "id": "planr-routing-official", - "manifestSha256": "e226813d7a4734c6199bd90a0f11ff28e26f0080113769775ab6041bb6dfea59", - "signatureVerified": false, - "signer": null, - "trustedMaintainer": false, - "version": "0.1.0" - }, - "replacement": null, - "status": "experimental", - "statusLabel": "Experimental" - }, - { - "binding": { - "dispatch": [ - { - "fallbacks": [], - "match": { - "work_type": "code" - }, - "profile": "mixed-codex-terra-high" - }, - { - "fallbacks": [], - "match": { - "work_type": "mechanical" - }, - "profile": "mixed-codex-luna-xhigh" - }, - { - "fallbacks": [], - "match": { - "work_type": "review" - }, - "profile": "mixed-codex-sol-high" - } - ], - "host": "mixed-host", - "id": "mixed-host", - "profiles": { - "mixed-codex-luna-xhigh": { - "agent_type": "planr_luna_xhigh", - "client": "codex", - "cost_tier": "premium", - "effort": "xhigh", - "model": "gpt-5.6-luna", - "skill": "planr-work" - }, - "mixed-codex-sol-high": { - "agent_type": "planr_sol_high", - "client": "codex", - "cost_tier": "premium", - "effort": "high", - "model": "gpt-5.6-sol", - "skill": "planr-review" - }, - "mixed-codex-terra-high": { - "agent_type": "planr_terra_high", - "client": "codex", - "cost_tier": "standard", - "effort": "high", - "model": "gpt-5.6-terra", - "skill": "planr-work" - }, - "mixed-cursor-fable-driver": { - "client": "cursor", - "cost_tier": "premium", - "model": "fable-5" - } - }, - "selector": "mixed-host", - "version": "2.0.0" - }, - "command": "planr-routing compile max-quality --host mixed-host --output routing-bundle.json && planr routing bundle preview routing-bundle.json", - "compatibility": { - "hosts": [ - "mixed-host" - ], - "maxPlanrVersion": null, - "minPlanrVersion": "1.4.0" - }, - "enforcement": [ - { - "detail": "Core previews and applies only allowlisted repository-local bundle artifacts.", - "dimension": "Repository writes", - "state": "verified" - }, - { - "detail": "The package generates exact host roles; the host remains execution authority.", - "dimension": "Model and effort", - "state": "host_enforced" - }, - { - "detail": "No authenticated live-host evidence is published for this generated catalog entry.", - "dimension": "Effective route evidence", - "state": "unavailable" - } - ], - "entryId": "max-quality-mixed-host", - "entryVersion": "1.0.0+2.0.0", - "evaluation": { - "evaluatedAtUnix": 1784160000, - "fixtureSha256": "042dbb3ff8569bd56502777d79bd622d00d4f2ae06e4dbb6b3d08bf3af807a21", - "metrics": { - "average_quality_score_bps": null, - "oracle_passes": 0, - "runs": 0 - }, - "resultHashes": [], - "reviewAtUnix": null, - "status": "experimental", - "suiteId": "planr-preset-suite", - "suiteVersion": "1.8.0", - "thresholds": {} - }, - "freshness": "current", - "id": "max-quality-mixed-host@1.0.0+2.0.0", - "lifecycle": "published", - "policy": { - "execution": { - "max_read_scope_entries": 12, - "max_write_scope_entries": 6, - "roles": { - "worker": { - "filesystem": { - "allow_overwrite": false, - "read_roots": [ - "src", - "tests", - "docs" - ], - "write_roots": [ - "src", - "tests", - "docs" - ] - }, - "tools": [ - "cargo", - "git", - "rg" - ] - } - } - }, - "id": "max-quality", - "materiality": { - "changed_files_threshold": 5, - "changed_lines_threshold": 200 - }, - "transitions": { - "availability_fallback": { - "max_fallbacks": 1, - "require_same_capability_class": true - }, - "quality_escalation": { - "max_escalations": 2, - "require_verification_evidence": true - }, - "quota_downgrade": { - "enabled": false, - "max_downgrades": 0, - "noncritical_only": true - }, - "retry": { - "max_same_route_retries": 1 - }, - "safety_stop": { - "enabled": true - } - }, - "usage": { - "budget_exhaustion": "stop", - "max_active_agents": 4, - "max_attempts": 5, - "max_depth": 1, - "max_parallel_readers": 3, - "max_parallel_writers": 1, - "max_tool_calls": 240, - "max_wall_time_seconds": 7200, - "metering": "estimated", - "review_reserve_percent": 40 - }, - "version": "1.0.0" - }, - "recommended": false, - "registry": { - "artifacts": [ - { - "path": ".codex/agents/planr-luna-xhigh.toml", - "sha256": "6603b60e840c68fbcc0ab2f79e633d3a45d8f4904cea434deebbc4fe5e6b8050" - }, - { - "path": ".codex/agents/planr-sol-high.toml", - "sha256": "6b3647e93df124bd6f03a095af4c1f81a66c33ee2c5b1230196c180ebeff08de" - }, - { - "path": ".codex/agents/planr-terra-high.toml", - "sha256": "0cbde7c2bc86584a82cb0d8a56247381efdea589c2dd747c6cca1ff447a351b8" - }, - { - "path": ".codex/skills/planr-native-routing/SKILL.md", - "sha256": "32ab3e53fe474ac6a44c12f018d5ce286f7ac5de19b32d1a08b3f96574aef166" - }, - { - "path": ".cursor/agents/planr-fable-driver.md", - "sha256": "a42adaf2e90c655f33e5f6b13cd864bcfeda1bd762992c6fa2c2eda79fe487d1" - }, - { - "path": ".planr/agents.toml", - "sha256": "a25f1dac1964f65ac833d467b89bd68b1d2ca4bd77aef5b00d237618f7418934" - }, - { - "path": ".planr/policy.toml", - "sha256": "471699e7f80a7751a7c03db9fc49e2f4b1d0b8cdba8fe48812b6eb9506d55db5" - } - ], - "id": "planr-routing-official", - "manifestSha256": "81da80f9ad0b98db3353413c7a1b8d18949dd54a13dc4a20a909e9d0794bfde3", - "signatureVerified": false, - "signer": null, - "trustedMaintainer": false, - "version": "0.1.0" - }, - "replacement": null, - "status": "experimental", - "statusLabel": "Experimental" - }, - { - "binding": { - "dispatch": [ - { - "fallbacks": [], - "match": { - "work_type": "exploration" - }, - "profile": "codex-terra-medium" - }, - { - "fallbacks": [], - "match": { - "work_type": "research" - }, - "profile": "codex-terra-medium" - }, - { - "fallbacks": [], - "match": { - "work_type": "code" - }, - "profile": "codex-terra-high" - }, - { - "fallbacks": [], - "match": { - "work_type": "mechanical" - }, - "profile": "codex-luna-xhigh" - }, - { - "fallbacks": [], - "match": { - "work_type": "review" - }, - "profile": "codex-sol-high" - }, - { - "fallbacks": [], - "match": { - "work_type": "moonshot" - }, - "profile": "codex-sol-ultra" - } - ], - "host": "codex", - "id": "codex-openai", - "profiles": { - "codex-luna-xhigh": { - "agent_type": "planr_luna_xhigh", - "client": "codex", - "cost_tier": "premium", - "effort": "xhigh", - "model": "gpt-5.6-luna", - "skill": "planr-work" - }, - "codex-sol-high": { - "agent_type": "planr_sol_high", - "client": "codex", - "cost_tier": "premium", - "effort": "high", - "model": "gpt-5.6-sol", - "skill": "planr-review" - }, - "codex-sol-medium": { - "agent_type": "planr_sol_medium", - "client": "codex", - "cost_tier": "standard", - "effort": "medium", - "model": "gpt-5.6-sol" - }, - "codex-sol-ultra": { - "agent_type": "planr_sol_ultra", - "client": "codex", - "cost_tier": "premium", - "effort": "ultra", - "model": "gpt-5.6-sol" - }, - "codex-terra-high": { - "agent_type": "planr_terra_high", - "client": "codex", - "cost_tier": "standard", - "effort": "high", - "model": "gpt-5.6-terra", - "skill": "planr-work" - }, - "codex-terra-medium": { - "agent_type": "planr_terra_medium", - "client": "codex", - "cost_tier": "standard", - "effort": "medium", - "model": "gpt-5.6-terra" - } - }, - "selector": "codex-openai", - "version": "2.0.0" - }, - "command": "planr-routing compile read-only-audit --host codex-openai --output routing-bundle.json && planr routing bundle preview routing-bundle.json", - "compatibility": { - "hosts": [ - "codex" - ], - "maxPlanrVersion": null, - "minPlanrVersion": "1.4.0" - }, - "enforcement": [ - { - "detail": "Core previews and applies only allowlisted repository-local bundle artifacts.", - "dimension": "Repository writes", - "state": "verified" - }, - { - "detail": "The package generates exact host roles; the host remains execution authority.", - "dimension": "Model and effort", - "state": "host_enforced" - }, - { - "detail": "No authenticated live-host evidence is published for this generated catalog entry.", - "dimension": "Effective route evidence", - "state": "unavailable" - } - ], - "entryId": "read-only-audit-codex-openai", - "entryVersion": "1.0.0+2.0.0", - "evaluation": { - "evaluatedAtUnix": 1784160000, - "fixtureSha256": "042dbb3ff8569bd56502777d79bd622d00d4f2ae06e4dbb6b3d08bf3af807a21", - "metrics": { - "average_quality_score_bps": null, - "oracle_passes": 0, - "runs": 0 - }, - "resultHashes": [], - "reviewAtUnix": null, - "status": "experimental", - "suiteId": "planr-preset-suite", - "suiteVersion": "1.8.0", - "thresholds": {} - }, - "freshness": "current", - "id": "read-only-audit-codex-openai@1.0.0+2.0.0", - "lifecycle": "published", - "policy": { - "execution": { - "max_read_scope_entries": 12, - "max_write_scope_entries": 1, - "roles": { - "worker": { - "filesystem": { - "allow_overwrite": false, - "read_roots": [ - "src", - "tests", - "docs" - ], - "write_roots": [] - }, - "tools": [ - "git", - "rg" - ] - } - } - }, - "id": "read-only-audit", - "materiality": { - "changed_files_threshold": 1, - "changed_lines_threshold": 1 - }, - "transitions": { - "availability_fallback": { - "max_fallbacks": 1, - "require_same_capability_class": true - }, - "quality_escalation": { - "max_escalations": 0, - "require_verification_evidence": true - }, - "quota_downgrade": { - "enabled": false, - "max_downgrades": 0, - "noncritical_only": true - }, - "retry": { - "max_same_route_retries": 0 - }, - "safety_stop": { - "enabled": true - } - }, - "usage": { - "budget_exhaustion": "stop", - "max_active_agents": 3, - "max_attempts": 2, - "max_depth": 1, - "max_parallel_readers": 3, - "max_parallel_writers": 0, - "max_tool_calls": 80, - "max_wall_time_seconds": 1800, - "metering": "estimated", - "review_reserve_percent": 20 - }, - "version": "1.0.0" - }, - "recommended": false, - "registry": { - "artifacts": [ - { - "path": ".codex/agents/planr-luna-xhigh.toml", - "sha256": "6603b60e840c68fbcc0ab2f79e633d3a45d8f4904cea434deebbc4fe5e6b8050" - }, - { - "path": ".codex/agents/planr-sol-high.toml", - "sha256": "6b3647e93df124bd6f03a095af4c1f81a66c33ee2c5b1230196c180ebeff08de" - }, - { - "path": ".codex/agents/planr-sol-medium.toml", - "sha256": "4baa3628bdce5498fc278504bcd3cc38d68f7f2167f9c7526630340ac309d691" - }, - { - "path": ".codex/agents/planr-sol-ultra.toml", - "sha256": "4ab0cb64c9d87efe09298139a2f3b27c00a0ae2924ced3d49feb1314250f9d37" - }, - { - "path": ".codex/agents/planr-terra-high.toml", - "sha256": "0cbde7c2bc86584a82cb0d8a56247381efdea589c2dd747c6cca1ff447a351b8" - }, - { - "path": ".codex/agents/planr-terra-medium.toml", - "sha256": "639f79ac803e8cdbf7b4d7c074dc40c4942ea3f8001915b7bdb02843bd712e80" - }, - { - "path": ".codex/skills/planr-native-routing/SKILL.md", - "sha256": "aee6a71ea4905128a7b24ed6b69c43cbcf7609263c114cbf828e51a057a42d50" - }, - { - "path": ".planr/agents.toml", - "sha256": "49eac7a5d265a75b3aadbe7af90bfca9e2b49ede22f365025c31cab73eb57101" - }, - { - "path": ".planr/policy.toml", - "sha256": "c607548e174967eb3e2ec6bdd8989ba23ccb4d57e02961376f9169b50ab2ccf1" - } - ], - "id": "planr-routing-official", - "manifestSha256": "b51edcef7198b1ae8b8c7cfdc5eb69bdbbe5fc793523946a2940a77f5f2786a9", - "signatureVerified": false, - "signer": null, - "trustedMaintainer": false, - "version": "0.1.0" - }, - "replacement": null, - "status": "experimental", - "statusLabel": "Experimental" - }, - { - "binding": { - "dispatch": [ - { - "fallbacks": [ - "cursor-openai-driver" - ], - "match": { - "work_type": "code" - }, - "profile": "cursor-openai-worker" - } - ], - "host": "cursor", - "id": "cursor-openai", - "profiles": { - "cursor-openai-driver": { - "client": "cursor", - "cost_tier": "premium", - "model": "gpt-5.5" - }, - "cursor-openai-worker": { - "client": "cursor", - "cost_tier": "standard", - "model": "gpt-5.4-mini", - "skill": "planr-work" - } - }, - "selector": "cursor-openai", - "version": "1.0.0" - }, - "command": "planr-routing compile read-only-audit --host cursor-openai --output routing-bundle.json && planr routing bundle preview routing-bundle.json", - "compatibility": { - "hosts": [ - "cursor" - ], - "maxPlanrVersion": null, - "minPlanrVersion": "1.4.0" - }, - "enforcement": [ - { - "detail": "Core previews and applies only allowlisted repository-local bundle artifacts.", - "dimension": "Repository writes", - "state": "verified" - }, - { - "detail": "The package generates exact host roles; the host remains execution authority.", - "dimension": "Model and effort", - "state": "host_enforced" - }, - { - "detail": "No authenticated live-host evidence is published for this generated catalog entry.", - "dimension": "Effective route evidence", - "state": "unavailable" - } - ], - "entryId": "read-only-audit-cursor-openai", - "entryVersion": "1.0.0+1.0.0", - "evaluation": { - "evaluatedAtUnix": 1784160000, - "fixtureSha256": "042dbb3ff8569bd56502777d79bd622d00d4f2ae06e4dbb6b3d08bf3af807a21", - "metrics": { - "average_quality_score_bps": null, - "oracle_passes": 0, - "runs": 0 - }, - "resultHashes": [], - "reviewAtUnix": null, - "status": "experimental", - "suiteId": "planr-preset-suite", - "suiteVersion": "1.8.0", - "thresholds": {} - }, - "freshness": "current", - "id": "read-only-audit-cursor-openai@1.0.0+1.0.0", - "lifecycle": "published", - "policy": { - "execution": { - "max_read_scope_entries": 12, - "max_write_scope_entries": 1, - "roles": { - "worker": { - "filesystem": { - "allow_overwrite": false, - "read_roots": [ - "src", - "tests", - "docs" - ], - "write_roots": [] - }, - "tools": [ - "git", - "rg" - ] - } - } - }, - "id": "read-only-audit", - "materiality": { - "changed_files_threshold": 1, - "changed_lines_threshold": 1 - }, - "transitions": { - "availability_fallback": { - "max_fallbacks": 1, - "require_same_capability_class": true - }, - "quality_escalation": { - "max_escalations": 0, - "require_verification_evidence": true - }, - "quota_downgrade": { - "enabled": false, - "max_downgrades": 0, - "noncritical_only": true - }, - "retry": { - "max_same_route_retries": 0 - }, - "safety_stop": { - "enabled": true - } - }, - "usage": { - "budget_exhaustion": "stop", - "max_active_agents": 3, - "max_attempts": 2, - "max_depth": 1, - "max_parallel_readers": 3, - "max_parallel_writers": 0, - "max_tool_calls": 80, - "max_wall_time_seconds": 1800, - "metering": "estimated", - "review_reserve_percent": 20 - }, - "version": "1.0.0" - }, - "recommended": false, - "registry": { - "artifacts": [ - { - "path": ".cursor/agents/planr-preset-worker.md", - "sha256": "99f3562c21a373ebd0a467b05093258a9c0e7ce41a72ac1871d3e1d3a0829b55" - }, - { - "path": ".planr/agents.toml", - "sha256": "c322bd30921a29bdea46cd3eeaae142ee365606eb34207bfea3f6aa529710f3f" - }, - { - "path": ".planr/policy.toml", - "sha256": "c607548e174967eb3e2ec6bdd8989ba23ccb4d57e02961376f9169b50ab2ccf1" - } - ], - "id": "planr-routing-official", - "manifestSha256": "89a32ae2bde8b28cca58142d0b688298f71850d481e3ca3e2303c3c5354a383c", - "signatureVerified": false, - "signer": null, - "trustedMaintainer": false, - "version": "0.1.0" - }, - "replacement": null, - "status": "experimental", - "statusLabel": "Experimental" - }, - { - "binding": { - "dispatch": [ - { - "fallbacks": [ - "cursor-fable-driver" - ], - "match": { - "work_type": "code" - }, - "profile": "cursor-grok-worker" - } - ], - "host": "cursor", - "id": "cursor-fable-grok", - "profiles": { - "cursor-fable-driver": { - "client": "cursor", - "cost_tier": "premium", - "model": "fable-5" - }, - "cursor-grok-worker": { - "client": "cursor", - "cost_tier": "standard", - "model": "grok-code-fast-1", - "skill": "planr-work" - } - }, - "selector": "cursor-fable-grok", - "version": "1.0.0" - }, - "command": "planr-routing compile read-only-audit --host cursor-fable-grok --output routing-bundle.json && planr routing bundle preview routing-bundle.json", - "compatibility": { - "hosts": [ - "cursor" - ], - "maxPlanrVersion": null, - "minPlanrVersion": "1.4.0" - }, - "enforcement": [ - { - "detail": "Core previews and applies only allowlisted repository-local bundle artifacts.", - "dimension": "Repository writes", - "state": "verified" - }, - { - "detail": "The package generates exact host roles; the host remains execution authority.", - "dimension": "Model and effort", - "state": "host_enforced" - }, - { - "detail": "No authenticated live-host evidence is published for this generated catalog entry.", - "dimension": "Effective route evidence", - "state": "unavailable" - } - ], - "entryId": "read-only-audit-cursor-fable-grok", - "entryVersion": "1.0.0+1.0.0", - "evaluation": { - "evaluatedAtUnix": 1784160000, - "fixtureSha256": "042dbb3ff8569bd56502777d79bd622d00d4f2ae06e4dbb6b3d08bf3af807a21", - "metrics": { - "average_quality_score_bps": null, - "oracle_passes": 0, - "runs": 0 - }, - "resultHashes": [], - "reviewAtUnix": null, - "status": "experimental", - "suiteId": "planr-preset-suite", - "suiteVersion": "1.8.0", - "thresholds": {} - }, - "freshness": "current", - "id": "read-only-audit-cursor-fable-grok@1.0.0+1.0.0", - "lifecycle": "published", - "policy": { - "execution": { - "max_read_scope_entries": 12, - "max_write_scope_entries": 1, - "roles": { - "worker": { - "filesystem": { - "allow_overwrite": false, - "read_roots": [ - "src", - "tests", - "docs" - ], - "write_roots": [] - }, - "tools": [ - "git", - "rg" - ] - } - } - }, - "id": "read-only-audit", - "materiality": { - "changed_files_threshold": 1, - "changed_lines_threshold": 1 - }, - "transitions": { - "availability_fallback": { - "max_fallbacks": 1, - "require_same_capability_class": true - }, - "quality_escalation": { - "max_escalations": 0, - "require_verification_evidence": true - }, - "quota_downgrade": { - "enabled": false, - "max_downgrades": 0, - "noncritical_only": true - }, - "retry": { - "max_same_route_retries": 0 - }, - "safety_stop": { - "enabled": true - } - }, - "usage": { - "budget_exhaustion": "stop", - "max_active_agents": 3, - "max_attempts": 2, - "max_depth": 1, - "max_parallel_readers": 3, - "max_parallel_writers": 0, - "max_tool_calls": 80, - "max_wall_time_seconds": 1800, - "metering": "estimated", - "review_reserve_percent": 20 - }, - "version": "1.0.0" - }, - "recommended": false, - "registry": { - "artifacts": [ - { - "path": ".cursor/agents/planr-preset-worker.md", - "sha256": "650495d7dfe35c45cf6b438aad51f8c7d5cc0704f972cbbd568ba22d8a8266b2" - }, - { - "path": ".planr/agents.toml", - "sha256": "ce136bdfd24ea95dbd83a35b3975b2fe3616a78dc8f46539645347f9b6d1351d" - }, - { - "path": ".planr/policy.toml", - "sha256": "c607548e174967eb3e2ec6bdd8989ba23ccb4d57e02961376f9169b50ab2ccf1" - } - ], - "id": "planr-routing-official", - "manifestSha256": "0e8c2de81248d4290805f93387bb3dae6b7c13994cca0c27bf3099aac34203e7", - "signatureVerified": false, - "signer": null, - "trustedMaintainer": false, - "version": "0.1.0" - }, - "replacement": null, - "status": "experimental", - "statusLabel": "Experimental" - }, - { - "binding": { - "dispatch": [ - { - "fallbacks": [ - "claude-native-driver" - ], - "match": { - "work_type": "code" - }, - "profile": "claude-native-worker" - } - ], - "host": "claude-code", - "id": "claude-native", - "profiles": { - "claude-native-driver": { - "client": "claude-code", - "cost_tier": "premium", - "effort": "high", - "model": "opus" - }, - "claude-native-worker": { - "client": "claude-code", - "cost_tier": "standard", - "effort": "medium", - "model": "sonnet", - "skill": "planr-work" - } - }, - "selector": "claude-native", - "version": "1.0.0" - }, - "command": "planr-routing compile read-only-audit --host claude-native --output routing-bundle.json && planr routing bundle preview routing-bundle.json", - "compatibility": { - "hosts": [ - "claude-code" - ], - "maxPlanrVersion": null, - "minPlanrVersion": "1.4.0" - }, - "enforcement": [ - { - "detail": "Core previews and applies only allowlisted repository-local bundle artifacts.", - "dimension": "Repository writes", - "state": "verified" - }, - { - "detail": "The package generates exact host roles; the host remains execution authority.", - "dimension": "Model and effort", - "state": "host_enforced" - }, - { - "detail": "No authenticated live-host evidence is published for this generated catalog entry.", - "dimension": "Effective route evidence", - "state": "unavailable" - } - ], - "entryId": "read-only-audit-claude-native", - "entryVersion": "1.0.0+1.0.0", - "evaluation": { - "evaluatedAtUnix": 1784160000, - "fixtureSha256": "042dbb3ff8569bd56502777d79bd622d00d4f2ae06e4dbb6b3d08bf3af807a21", - "metrics": { - "average_quality_score_bps": null, - "oracle_passes": 0, - "runs": 0 - }, - "resultHashes": [], - "reviewAtUnix": null, - "status": "experimental", - "suiteId": "planr-preset-suite", - "suiteVersion": "1.8.0", - "thresholds": {} - }, - "freshness": "current", - "id": "read-only-audit-claude-native@1.0.0+1.0.0", - "lifecycle": "published", - "policy": { - "execution": { - "max_read_scope_entries": 12, - "max_write_scope_entries": 1, - "roles": { - "worker": { - "filesystem": { - "allow_overwrite": false, - "read_roots": [ - "src", - "tests", - "docs" - ], - "write_roots": [] - }, - "tools": [ - "git", - "rg" - ] - } - } - }, - "id": "read-only-audit", - "materiality": { - "changed_files_threshold": 1, - "changed_lines_threshold": 1 - }, - "transitions": { - "availability_fallback": { - "max_fallbacks": 1, - "require_same_capability_class": true - }, - "quality_escalation": { - "max_escalations": 0, - "require_verification_evidence": true - }, - "quota_downgrade": { - "enabled": false, - "max_downgrades": 0, - "noncritical_only": true - }, - "retry": { - "max_same_route_retries": 0 - }, - "safety_stop": { - "enabled": true - } - }, - "usage": { - "budget_exhaustion": "stop", - "max_active_agents": 3, - "max_attempts": 2, - "max_depth": 1, - "max_parallel_readers": 3, - "max_parallel_writers": 0, - "max_tool_calls": 80, - "max_wall_time_seconds": 1800, - "metering": "estimated", - "review_reserve_percent": 20 - }, - "version": "1.0.0" - }, - "recommended": false, - "registry": { - "artifacts": [ - { - "path": ".claude/agents/planr-preset-worker.md", - "sha256": "b29ef25953d3f933b3eed6a91489b57affcae1ff67a52b1e9ac6ef811fb48a5e" - }, - { - "path": ".planr/agents.toml", - "sha256": "85ce2d790a687667e0562cd33349d4a0fc01fa6161a5705acd23cc1461a583f4" - }, - { - "path": ".planr/policy.toml", - "sha256": "c607548e174967eb3e2ec6bdd8989ba23ccb4d57e02961376f9169b50ab2ccf1" - } - ], - "id": "planr-routing-official", - "manifestSha256": "acb0b2babf72cfbc8eef2218b590f4eb94623eac5af891d760dc5ded6c21d348", - "signatureVerified": false, - "signer": null, - "trustedMaintainer": false, - "version": "0.1.0" - }, - "replacement": null, - "status": "experimental", - "statusLabel": "Experimental" - }, - { - "binding": { - "dispatch": [ - { - "fallbacks": [], - "match": { - "work_type": "code" - }, - "profile": "mixed-codex-terra-high" - }, - { - "fallbacks": [], - "match": { - "work_type": "mechanical" - }, - "profile": "mixed-codex-luna-xhigh" - }, - { - "fallbacks": [], - "match": { - "work_type": "review" - }, - "profile": "mixed-codex-sol-high" - } - ], - "host": "mixed-host", - "id": "mixed-host", - "profiles": { - "mixed-codex-luna-xhigh": { - "agent_type": "planr_luna_xhigh", - "client": "codex", - "cost_tier": "premium", - "effort": "xhigh", - "model": "gpt-5.6-luna", - "skill": "planr-work" - }, - "mixed-codex-sol-high": { - "agent_type": "planr_sol_high", - "client": "codex", - "cost_tier": "premium", - "effort": "high", - "model": "gpt-5.6-sol", - "skill": "planr-review" - }, - "mixed-codex-terra-high": { - "agent_type": "planr_terra_high", - "client": "codex", - "cost_tier": "standard", - "effort": "high", - "model": "gpt-5.6-terra", - "skill": "planr-work" - }, - "mixed-cursor-fable-driver": { - "client": "cursor", - "cost_tier": "premium", - "model": "fable-5" - } - }, - "selector": "mixed-host", - "version": "2.0.0" - }, - "command": "planr-routing compile read-only-audit --host mixed-host --output routing-bundle.json && planr routing bundle preview routing-bundle.json", - "compatibility": { - "hosts": [ - "mixed-host" - ], - "maxPlanrVersion": null, - "minPlanrVersion": "1.4.0" - }, - "enforcement": [ - { - "detail": "Core previews and applies only allowlisted repository-local bundle artifacts.", - "dimension": "Repository writes", - "state": "verified" - }, - { - "detail": "The package generates exact host roles; the host remains execution authority.", - "dimension": "Model and effort", - "state": "host_enforced" - }, - { - "detail": "No authenticated live-host evidence is published for this generated catalog entry.", - "dimension": "Effective route evidence", - "state": "unavailable" - } - ], - "entryId": "read-only-audit-mixed-host", - "entryVersion": "1.0.0+2.0.0", - "evaluation": { - "evaluatedAtUnix": 1784160000, - "fixtureSha256": "042dbb3ff8569bd56502777d79bd622d00d4f2ae06e4dbb6b3d08bf3af807a21", - "metrics": { - "average_quality_score_bps": null, - "oracle_passes": 0, - "runs": 0 - }, - "resultHashes": [], - "reviewAtUnix": null, - "status": "experimental", - "suiteId": "planr-preset-suite", - "suiteVersion": "1.8.0", - "thresholds": {} - }, - "freshness": "current", - "id": "read-only-audit-mixed-host@1.0.0+2.0.0", - "lifecycle": "published", - "policy": { - "execution": { - "max_read_scope_entries": 12, - "max_write_scope_entries": 1, - "roles": { - "worker": { - "filesystem": { - "allow_overwrite": false, - "read_roots": [ - "src", - "tests", - "docs" - ], - "write_roots": [] - }, - "tools": [ - "git", - "rg" - ] - } - } - }, - "id": "read-only-audit", - "materiality": { - "changed_files_threshold": 1, - "changed_lines_threshold": 1 - }, - "transitions": { - "availability_fallback": { - "max_fallbacks": 1, - "require_same_capability_class": true - }, - "quality_escalation": { - "max_escalations": 0, - "require_verification_evidence": true - }, - "quota_downgrade": { - "enabled": false, - "max_downgrades": 0, - "noncritical_only": true - }, - "retry": { - "max_same_route_retries": 0 - }, - "safety_stop": { - "enabled": true - } - }, - "usage": { - "budget_exhaustion": "stop", - "max_active_agents": 3, - "max_attempts": 2, - "max_depth": 1, - "max_parallel_readers": 3, - "max_parallel_writers": 0, - "max_tool_calls": 80, - "max_wall_time_seconds": 1800, - "metering": "estimated", - "review_reserve_percent": 20 - }, - "version": "1.0.0" - }, - "recommended": false, - "registry": { - "artifacts": [ - { - "path": ".codex/agents/planr-luna-xhigh.toml", - "sha256": "6603b60e840c68fbcc0ab2f79e633d3a45d8f4904cea434deebbc4fe5e6b8050" - }, - { - "path": ".codex/agents/planr-sol-high.toml", - "sha256": "6b3647e93df124bd6f03a095af4c1f81a66c33ee2c5b1230196c180ebeff08de" - }, - { - "path": ".codex/agents/planr-terra-high.toml", - "sha256": "0cbde7c2bc86584a82cb0d8a56247381efdea589c2dd747c6cca1ff447a351b8" - }, - { - "path": ".codex/skills/planr-native-routing/SKILL.md", - "sha256": "32ab3e53fe474ac6a44c12f018d5ce286f7ac5de19b32d1a08b3f96574aef166" - }, - { - "path": ".cursor/agents/planr-fable-driver.md", - "sha256": "a42adaf2e90c655f33e5f6b13cd864bcfeda1bd762992c6fa2c2eda79fe487d1" - }, - { - "path": ".planr/agents.toml", - "sha256": "a25f1dac1964f65ac833d467b89bd68b1d2ca4bd77aef5b00d237618f7418934" - }, - { - "path": ".planr/policy.toml", - "sha256": "c607548e174967eb3e2ec6bdd8989ba23ccb4d57e02961376f9169b50ab2ccf1" - } - ], - "id": "planr-routing-official", - "manifestSha256": "711515403b8e660881c7ba61b0806408238b2ed906aaa150f266afc381c668f0", - "signatureVerified": false, - "signer": null, - "trustedMaintainer": false, - "version": "0.1.0" - }, - "replacement": null, - "status": "experimental", - "statusLabel": "Experimental" - } - ], - "generatedAtUnix": 1784160000, - "schemaVersion": 1, - "source": { - "entryCount": 20, - "message": "Entries stay experimental until authenticated live evidence and an offline maintainer signature pass.", - "state": "package_generated", - "trust": "planr_routing_unsigned_catalog_v1" - } -} diff --git a/planr-routing/website/index.html b/planr-routing/website/index.html deleted file mode 100644 index 68033e1..0000000 --- a/planr-routing/website/index.html +++ /dev/null @@ -1,117 +0,0 @@ - - - - - - - - Planr Preset Catalog - - - - - - - -
-
-
-

Public catalog · read-only

-

Choose policy intent.
See host reality.

-

- Compare portable Planr policies with versioned host bindings. Every published status comes from - registry verification and evaluation evidence—not editorial judgment. -

-
-
-
Published
-
Recommended
-
Trust source
Loading
-
-
- -
- -
-

Planr governs policy; the host executes the route.

-

- A binding can request a model, effort, and context-fork mode. Codex, Claude Code, Cursor, or another host - retains the final concrete execution choice. The catalog distinguishes binding intent from verified - effective-route evidence. -

-
-
- -
-
-
-

Side-by-side

-

Compare compositions

-
- -
- -
- - - -
- - - -
-
-
-
-
- -
-
-

Status language

-

Five states, no ambiguity

-
-
-
Experimental
Valid enough to inspect; evaluation binding is not required.
-
Verified
Integrity and current evaluation checks pass; recommendation gates did not.
-
Recommended
Trusted signature plus current canonical evaluation and telemetry gates pass.
-
Stale
The review date or current suite validity has expired.
-
Deprecated
Published for continuity with an explicit replacement path.
-
-
-
- -
-

Local-first by design. A catalog outage never affects installed packs or active projects.

-

Catalog provenance loading…

-
-
- - diff --git a/planr-routing/website/serve.mjs b/planr-routing/website/serve.mjs deleted file mode 100644 index db02392..0000000 --- a/planr-routing/website/serve.mjs +++ /dev/null @@ -1,41 +0,0 @@ -#!/usr/bin/env node -import { createReadStream, statSync } from "node:fs"; -import { createServer } from "node:http"; -import { extname, join, normalize, resolve } from "node:path"; -import { fileURLToPath } from "node:url"; - -const root = resolve(fileURLToPath(new URL(".", import.meta.url))); -const port = Number(process.env.PORT ?? 4173); -const types = { - ".css": "text/css; charset=utf-8", - ".html": "text/html; charset=utf-8", - ".json": "application/json; charset=utf-8", - ".mjs": "text/javascript; charset=utf-8", - ".svg": "image/svg+xml", -}; - -const server = createServer((request, response) => { - const pathname = decodeURIComponent(new URL(request.url, "http://localhost").pathname); - const relative = normalize(pathname === "/" ? "index.html" : pathname.replace(/^\/+/, "")); - const path = resolve(join(root, relative)); - if (!path.startsWith(`${root}/`)) { - response.writeHead(403).end("Forbidden"); - return; - } - try { - if (!statSync(path).isFile()) throw new Error("not a file"); - response.writeHead(200, { - "Content-Type": types[extname(path)] ?? "application/octet-stream", - "Cache-Control": "no-store", - "X-Content-Type-Options": "nosniff", - }); - createReadStream(path).pipe(response); - } catch { - response.writeHead(404, { "Content-Type": "text/plain; charset=utf-8" }).end("Not found"); - } -}); - -server.listen(port, "127.0.0.1", () => { - console.log(`Planr preset catalog listening on http://127.0.0.1:${port}`); -}); - diff --git a/planr-routing/website/styles.css b/planr-routing/website/styles.css deleted file mode 100644 index 082625f..0000000 --- a/planr-routing/website/styles.css +++ /dev/null @@ -1,200 +0,0 @@ -:root { - color-scheme: dark; - --ink: #f4f0e7; - --muted: #a9a49a; - --quiet: #77736c; - --paper: #11110f; - --panel: #181815; - --panel-2: #20201c; - --line: #35342e; - --acid: #d9ff57; - --blue: #7bd9ff; - --amber: #ffc76a; - --red: #ff8e7d; - --green: #8fe3a8; - --radius: 18px; - font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; - font-synthesis: none; -} - -* { box-sizing: border-box; } -html { scroll-behavior: smooth; } -body { - margin: 0; - background: - radial-gradient(circle at 85% 5%, rgb(217 255 87 / 8%), transparent 30rem), - linear-gradient(180deg, #151511 0, var(--paper) 36rem); - color: var(--ink); - min-width: 300px; -} - -button, select, input { font: inherit; } -button, select { color: inherit; } -a { color: inherit; } - -.skip-link { - position: fixed; - left: 1rem; - top: 1rem; - z-index: 10; - padding: .75rem 1rem; - background: var(--acid); - color: #111; - clip-path: inset(50%); - height: 1px; - width: 1px; - overflow: hidden; - white-space: nowrap; - transform: translateY(-200%); -} -.skip-link:focus { - clip-path: none; - height: auto; - width: auto; - overflow: visible; - transform: translateY(0); -} - -.site-header, main, footer { width: min(1180px, calc(100% - 2.5rem)); margin-inline: auto; } -.site-header { - min-height: 78px; - display: flex; - align-items: center; - justify-content: space-between; - border-bottom: 1px solid var(--line); -} -.brand { display: inline-flex; gap: .7rem; align-items: center; text-decoration: none; letter-spacing: -.02em; } -.brand-mark { - display: grid; - place-items: center; - width: 2rem; - height: 2rem; - border: 1px solid var(--acid); - border-radius: 50%; - color: var(--acid); - font-family: ui-monospace, SFMono-Regular, Menlo, monospace; -} -.brand strong { color: var(--acid); font-weight: 650; } -.header-note { color: var(--quiet); font-size: .85rem; } - -.hero { - min-height: 440px; - display: grid; - grid-template-columns: minmax(0, 1.5fr) minmax(290px, .7fr); - gap: 5rem; - align-items: center; - padding-block: 6rem 4.5rem; -} -.eyebrow { - margin: 0 0 .75rem; - color: var(--acid); - font: 600 .72rem/1.2 ui-monospace, SFMono-Regular, Menlo, monospace; - letter-spacing: .13em; - text-transform: uppercase; -} -h1, h2, h3, p { text-wrap: pretty; } -h1 { margin: 0; font-size: clamp(3rem, 7vw, 6.5rem); line-height: .91; letter-spacing: -.07em; font-weight: 600; } -h2 { margin: 0; font-size: clamp(1.6rem, 3vw, 2.65rem); line-height: 1; letter-spacing: -.045em; } -h3 { letter-spacing: -.025em; } -.lede { max-width: 720px; margin: 2rem 0 0; color: var(--muted); font-size: clamp(1rem, 1.8vw, 1.25rem); line-height: 1.6; } -.catalog-stats { margin: 0; border-top: 1px solid var(--line); } -.catalog-stats div { display: grid; grid-template-columns: 1fr auto; gap: 1rem; padding: 1.15rem 0; border-bottom: 1px solid var(--line); } -.catalog-stats dt { color: var(--muted); } -.catalog-stats dd { margin: 0; font-family: ui-monospace, SFMono-Regular, Menlo, monospace; } - -.authority-note { - display: grid; - grid-template-columns: auto 1fr; - gap: 1.25rem; - margin-bottom: 5rem; - padding: 1.4rem; - border: 1px solid var(--blue); - border-radius: var(--radius); - background: rgb(123 217 255 / 5%); -} -.authority-icon { color: var(--blue); font-size: 2rem; line-height: 1; } -.authority-note h2 { font-size: 1.1rem; letter-spacing: -.015em; } -.authority-note p { margin: .5rem 0 0; color: var(--muted); line-height: 1.55; max-width: 920px; } - -.compare-shell { padding-block: 2rem 6rem; } -.section-heading { display: flex; justify-content: space-between; align-items: end; gap: 2rem; } -.toggle { display: flex; align-items: center; gap: .65rem; color: var(--muted); cursor: pointer; } -.toggle input { width: 1.15rem; height: 1.15rem; accent-color: var(--acid); } -.selectors { display: grid; grid-template-columns: 1fr auto 1fr; gap: 1rem; align-items: end; margin: 2.2rem 0 1.2rem; } -.selectors label { display: grid; gap: .55rem; color: var(--muted); font-size: .8rem; } -select { - width: 100%; - padding: .95rem 2.5rem .95rem 1rem; - border: 1px solid var(--line); - border-radius: 12px; - background: var(--panel); -} -select:focus-visible, button:focus-visible, input:focus-visible, a:focus-visible { outline: 3px solid var(--blue); outline-offset: 3px; } -.versus { padding-bottom: 1rem; color: var(--quiet); font: .75rem ui-monospace, monospace; text-transform: uppercase; } - -.comparison-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 1.2rem; } -.preset-card { min-width: 0; padding: clamp(1.2rem, 3vw, 2rem); border: 1px solid var(--line); border-radius: var(--radius); background: var(--panel); } -.card-top { display: flex; align-items: start; justify-content: space-between; gap: 1rem; } -.card-top h3 { margin: .2rem 0 0; font-size: clamp(1.45rem, 3vw, 2.1rem); } -.binding-name { color: var(--muted); font-family: ui-monospace, monospace; font-size: .82rem; } -.badge { display: inline-flex; align-items: center; gap: .4rem; padding: .35rem .55rem; border: 1px solid currentColor; border-radius: 999px; font: 600 .68rem ui-monospace, monospace; text-transform: uppercase; letter-spacing: .06em; } -.badge::before { content: "●"; font-size: .55rem; } -.status-recommended { color: var(--acid); } -.status-verified { color: var(--blue); } -.status-stale, .status-deprecated { color: var(--amber); } -.status-experimental, .status-unverified { color: var(--muted); } -.meta-line { color: var(--quiet); font: .75rem/1.5 ui-monospace, monospace; } - -.metric-grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: 1px; margin: 1.5rem 0; overflow: hidden; border: 1px solid var(--line); border-radius: 12px; background: var(--line); } -.metric { padding: 1rem; background: var(--panel-2); } -.metric span { display: block; color: var(--quiet); font-size: .72rem; margin-bottom: .4rem; } -.metric strong { font: 500 1.15rem ui-monospace, monospace; } -.card-section { padding: 1.25rem 0; border-top: 1px solid var(--line); } -.card-section h4 { margin: 0 0 .9rem; font-size: .78rem; color: var(--muted); text-transform: uppercase; letter-spacing: .08em; } -.enforcement-list { display: grid; gap: .7rem; margin: 0; } -.enforcement-list div { display: grid; grid-template-columns: minmax(120px, .45fr) 1fr; gap: 1rem; } -.enforcement-list dt { font-size: .82rem; } -.enforcement-list dd { margin: 0; color: var(--muted); font-size: .82rem; line-height: 1.45; } -.compatibility-list { display: grid; gap: .7rem; margin: 0; } -.compatibility-list div { display: grid; grid-template-columns: minmax(120px, .45fr) 1fr; gap: 1rem; } -.compatibility-list dt { font-size: .82rem; } -.compatibility-list dd { margin: 0; color: var(--muted); font-size: .82rem; line-height: 1.45; } -.state { display: inline-block; margin-left: .35rem; color: var(--blue); font: .65rem ui-monospace, monospace; text-transform: uppercase; } -.hash { overflow-wrap: anywhere; color: var(--quiet); font: .7rem/1.5 ui-monospace, monospace; } -.command-block { display: grid; gap: .75rem; } -.command-block code { display: block; overflow-x: auto; padding: 1rem; border-radius: 10px; background: #0b0b09; color: var(--acid); font: .75rem/1.5 ui-monospace, monospace; } -.copy-button { justify-self: start; padding: .7rem .95rem; border: 1px solid var(--acid); border-radius: 9px; background: transparent; color: var(--acid); cursor: pointer; } -.copy-button:hover { background: var(--acid); color: #111; } - -.empty-state { padding: 3rem; border: 1px dashed var(--line); border-radius: var(--radius); background: var(--panel); } -.empty-state h3 { margin: .25rem 0 .75rem; font-size: 1.6rem; } -.empty-state p:not(.eyebrow) { color: var(--muted); } -.empty-state code { color: var(--acid); overflow-wrap: anywhere; } - -.legend { display: grid; grid-template-columns: .65fr 1.35fr; gap: 5rem; padding: 5rem 0; border-top: 1px solid var(--line); } -.legend dl { margin: 0; } -.legend dl div { display: grid; grid-template-columns: 140px 1fr; gap: 1rem; padding: .8rem 0; border-bottom: 1px solid var(--line); } -.legend dt { font-weight: 650; } -.legend dd { margin: 0; color: var(--muted); line-height: 1.5; } -footer { display: flex; justify-content: space-between; gap: 2rem; padding: 2.5rem 0 4rem; border-top: 1px solid var(--line); color: var(--quiet); font-size: .78rem; } -.sr-only { position: absolute !important; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0, 0, 0, 0); white-space: nowrap; border: 0; } - -@media (max-width: 760px) { - .site-header, main, footer { width: min(100% - 1.4rem, 1180px); } - .header-note { display: none; } - .hero { min-height: auto; grid-template-columns: 1fr; gap: 3rem; padding-block: 4rem 3rem; } - h1 { font-size: clamp(3rem, 16vw, 5.5rem); } - .authority-note { margin-bottom: 3rem; } - .section-heading { align-items: start; flex-direction: column; } - .selectors { grid-template-columns: 1fr; } - .versus { display: none; } - .comparison-grid { grid-template-columns: 1fr; } - .legend { grid-template-columns: 1fr; gap: 2rem; } - .legend dl div { grid-template-columns: 110px 1fr; } - footer { flex-direction: column; } -} - -@media (prefers-reduced-motion: reduce) { - html { scroll-behavior: auto; } - *, *::before, *::after { animation-duration: .01ms !important; transition-duration: .01ms !important; } -} diff --git a/plugins/planr/skills/planr-loop/SKILL.md b/plugins/planr/skills/planr-loop/SKILL.md index a71d553..26ccb94 100644 --- a/plugins/planr/skills/planr-loop/SKILL.md +++ b/plugins/planr/skills/planr-loop/SKILL.md @@ -37,7 +37,7 @@ The stop condition itself is one command: `planr plan audit --json` ev ## Iteration Shape -Each iteration is one dispatch through the routing skill — never a hand-written prompt: +Each iteration follows the Planr stage protocols — never a hand-written workflow prompt: ```text 1. planr plan audit --json contract holds -> exit loop ($planr-status for deeper reads) @@ -58,7 +58,7 @@ The loop never closes its own reviews when the host supports a second agent. Mak ## Skills Are The Prompts -When the host supports subagents, the driver never implements: it dispatches, audits, and synthesizes. Driver tokens go into `plan audit`, dispatch decisions, and conflict resolution — implementation and review run in the subagent roles, which the host wiring can pin to a cheaper tier (see the role files and `docs/GOALS.md` "Cost Tiering"). When the pick packet carries a `routing` block, dispatch on it: run the worker on the named profile's client and model, and move down the `fallbacks` chain when the primary hits a rate limit or is unavailable — the chain is ordered, so no mid-run registry edits. As the dispatching driver, read the packet with `planr pick --peek [--plan ]` — it returns the same packet without leasing, so the worker picks under its own identity and the maker/checker audit stays clean (never pick-and-release as the driver). Workers report the profile they actually ran on (`done --profile ` or `PLANR_PROFILE`), so a host that silently overrode the pin shows up in `planr trace item` instead of staying invisible. Delegate with skill references plus an item id, nothing more: +When the host supports subagents, the driver never implements: it dispatches, audits, and synthesizes. Driver tokens go into `plan audit`, dispatch decisions, and conflict resolution — implementation and review run in host-native subagent roles (see the role files and `docs/GOALS.md` "Cost Tiering"). Pick packets expose provider-neutral `routing.profile`; they do not expose a host-owned `routing.agent_type`. If an external repository declaration has generated a host role whose identifier exactly matches `routing.profile`, dispatch that profile identifier as the host-native role/`agent_type` through the host's subagent wiring. If no matching repository role exists, keep the host's default dispatch contract and treat the profile as advisory evidence only. Model, effort, profile, client, and fallback fields are advisory declarations and evidence labels only; Planr does not choose a model, choose effort, choose a client, choose a fallback, or infer that a host honored any requested value. The host owns whether and how those declarations can be honored. As the dispatching driver, read the packet with `planr pick --peek [--plan ]` — it returns the same packet without leasing, so the worker picks under its own identity and the maker/checker audit stays clean (never pick-and-release as the driver). Workers report the profile they actually ran on (`done --profile ` or `PLANR_PROFILE`) and attach route observations when available, so host overrides show up in `planr trace item` as evidence instead of being inferred from declarations. Delegate with skill references plus an item id in the message body, nothing more; host-native dispatch arguments still carry the selected role/profile and isolation controls: - Worker dispatch: `Use $planr-work on item . Stop after requesting review.` - Checker dispatch: `Use $planr-review on item . Close the review with a verdict.` @@ -67,7 +67,8 @@ A worker subagent may take several items sequentially instead of being respawned Host wiring: -- When a repository routing bundle supplies host roles, follow its generated routing skill exactly. Otherwise treat the profile in the pick packet as advisory and use the host's current dispatch contract. Never infer effective model or effort from a declaration alone. +- When external repository declarations supply host roles matching pick-packet `routing.profile` values, pass the matching profile identifier as the native host role/`agent_type` and follow the generated role instructions exactly. Otherwise treat the profile in the pick packet as advisory and use the host's current dispatch contract. Never infer effective model or effort from a declaration alone. +- Codex with native multi-agent roles (stable multi-agent or Multi-Agent v2): generated `.codex/config.toml` roles are matching repository roles. The `spawn_agent` tool call itself must include `agent_type` set exactly to the matching `routing.profile`, `fork_turns` set to `none`, a stable lowercase `task_name`, and the dispatch message above. A default-role maker/checker spawn without `agent_type` is invalid for a generated Codex role; do not wait on it or treat it as a fallback. Do not claim role binding is unavailable for generated Codex roles, and do not substitute the role name into `task_name`, prose, worker identity, or the message body as a replacement for `agent_type`; those are not native role-binding evidence. - Claude Code: subagents preload via the `skills:` frontmatter field. The Planr plugin registers `planr-worker` and `planr-reviewer` automatically from its `agents/` directory; standalone installs copy them to `.claude/agents/`. The reviewer subagent is read-only except for `planr review` commands. - Cursor: project subagents in `.cursor/agents/*.md` (Markdown templates in `agents/` next to this skill; `planr install cursor` provisions them). Dispatch explicitly: `/planr-worker implement item X`, `/planr-reviewer review item X`. Parallel dispatches are safe — the map's pick lease keeps one owner per item. - Single-agent hosts: run worker and checker as separate sequential dispatches with a fresh read of map state in between; never carry the worker's self-assessment into the review step. The mode is recorded automatically: `review close` derives `review_mode` (`single_agent`/`independent`) from worker identity. diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8d84f70..471aa7b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -16,19 +16,19 @@ importers: dependencies: fumadocs-core: specifier: 16.11.5 - version: 16.11.5(@mdx-js/mdx@3.1.1)(@types/estree-jsx@1.0.5)(@types/hast@3.0.5)(@types/mdast@4.0.4)(@types/react@19.2.17)(lucide-react@1.25.0(react@19.2.7))(next@16.2.10(@babel/core@7.29.7)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(zod@4.4.3) + version: 16.11.5(@mdx-js/mdx@3.1.1)(@tanstack/react-router@1.170.10(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(@types/estree-jsx@1.0.5)(@types/hast@3.0.5)(@types/mdast@4.0.4)(@types/react@19.2.17)(lucide-react@1.25.0(react@19.2.7))(next@16.2.10(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(zod@4.4.3) fumadocs-mdx: specifier: 15.2.0 - version: 15.2.0(@types/mdast@4.0.4)(@types/mdx@2.0.14)(@types/react@19.2.17)(fumadocs-core@16.11.5(@mdx-js/mdx@3.1.1)(@types/estree-jsx@1.0.5)(@types/hast@3.0.5)(@types/mdast@4.0.4)(@types/react@19.2.17)(lucide-react@1.25.0(react@19.2.7))(next@16.2.10(@babel/core@7.29.7)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(zod@4.4.3))(next@16.2.10(@babel/core@7.29.7)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(react@19.2.7)(rolldown@1.0.1)(vite@8.1.5(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.16.9)(yaml@2.9.0)) + version: 15.2.0(@types/mdast@4.0.4)(@types/mdx@2.0.14)(@types/react@19.2.17)(fumadocs-core@16.11.5(@mdx-js/mdx@3.1.1)(@tanstack/react-router@1.170.10(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(@types/estree-jsx@1.0.5)(@types/hast@3.0.5)(@types/mdast@4.0.4)(@types/react@19.2.17)(lucide-react@1.25.0(react@19.2.7))(next@16.2.10(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(zod@4.4.3))(next@16.2.10(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(react@19.2.7)(rolldown@1.0.1)(vite@8.1.5(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.16.9)(yaml@2.9.0)) fumadocs-ui: specifier: 16.11.5 - version: 16.11.5(@types/mdx@2.0.14)(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(fumadocs-core@16.11.5(@mdx-js/mdx@3.1.1)(@types/estree-jsx@1.0.5)(@types/hast@3.0.5)(@types/mdast@4.0.4)(@types/react@19.2.17)(lucide-react@1.25.0(react@19.2.7))(next@16.2.10(@babel/core@7.29.7)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(zod@4.4.3))(next@16.2.10(@babel/core@7.29.7)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(tailwindcss@4.3.3) + version: 16.11.5(@types/mdx@2.0.14)(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(fumadocs-core@16.11.5(@mdx-js/mdx@3.1.1)(@tanstack/react-router@1.170.10(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(@types/estree-jsx@1.0.5)(@types/hast@3.0.5)(@types/mdast@4.0.4)(@types/react@19.2.17)(lucide-react@1.25.0(react@19.2.7))(next@16.2.10(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(zod@4.4.3))(next@16.2.10(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(tailwindcss@4.3.3) lucide-react: specifier: 1.25.0 version: 1.25.0(react@19.2.7) next: specifier: 16.2.10 - version: 16.2.10(@babel/core@7.29.7)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + version: 16.2.10(react-dom@19.2.7(react@19.2.7))(react@19.2.7) react: specifier: 19.2.7 version: 19.2.7 @@ -62,7 +62,7 @@ importers: version: 19.2.3(@types/react@19.2.17) alchemy: specifier: 2.0.0-beta.63 - version: 2.0.0-beta.63(@effect/platform-bun@4.0.0-beta.98(effect@4.0.0-beta.98))(@effect/platform-node@4.0.0-beta.98(effect@4.0.0-beta.98)(ioredis@5.11.1))(@types/node@26.1.1)(@types/react@19.2.17)(effect@4.0.0-beta.98)(vite@8.1.5(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.16.9)(yaml@2.9.0))(vitest@4.1.10(@types/node@26.1.1)(vite@8.1.5(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.16.9)(yaml@2.9.0)))(workerd@1.20260714.1)(ws@8.21.0) + version: 2.0.0-beta.63(@effect/platform-bun@4.0.0-beta.98(effect@4.0.0-beta.98))(@effect/platform-node@4.0.0-beta.98(effect@4.0.0-beta.98)(ioredis@5.11.1))(@types/node@26.1.1)(@types/react@19.2.17)(effect@4.0.0-beta.98)(vite@8.1.5(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.16.9)(yaml@2.9.0))(vitest@4.1.10(@types/node@26.1.1)(jsdom@28.1.0(@noble/hashes@1.8.0))(msw@2.15.0(@types/node@26.1.1)(typescript@6.0.3))(vite@8.1.5(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.16.9)(yaml@2.9.0)))(workerd@1.20260714.1)(ws@8.21.0) axe-core: specifier: 4.12.1 version: 4.12.1 @@ -74,7 +74,7 @@ importers: version: 9.39.5(jiti@2.7.0) eslint-config-next: specifier: 16.2.10 - version: 16.2.10(@typescript-eslint/parser@8.64.0(eslint@9.39.5(jiti@2.7.0))(typescript@6.0.3))(eslint@9.39.5(jiti@2.7.0))(typescript@6.0.3) + version: 16.2.10(@typescript-eslint/parser@8.64.0(eslint@9.39.5(jiti@2.7.0))(typescript@6.0.3))(eslint-plugin-import-x@4.17.1(@typescript-eslint/utils@8.64.0(eslint@9.39.5(jiti@2.7.0))(typescript@6.0.3))(eslint-import-resolver-node@0.3.10)(eslint@9.39.5(jiti@2.7.0)))(eslint@9.39.5(jiti@2.7.0))(typescript@6.0.3) postcss: specifier: 8.5.19 version: 8.5.19 @@ -91,20 +91,117 @@ importers: specifier: 4.112.0 version: 4.112.0(@cloudflare/workers-types@5.20260717.1) - planr-routing: + apps/web: + dependencies: + '@base-ui/react': + specifier: 1.5.0 + version: 1.5.0(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@fontsource-variable/space-grotesk': + specifier: 5.2.10 + version: 5.2.10 + '@hugeicons/core-free-icons': + specifier: 4.2.0 + version: 4.2.0 + '@hugeicons/react': + specifier: 1.1.6 + version: 1.1.6(react@19.2.7) + '@tailwindcss/vite': + specifier: 4.3.0 + version: 4.3.0(vite@8.0.16(@types/node@22.19.19)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.16.9)(yaml@2.9.0)) + '@tanstack/react-devtools': + specifier: 0.10.5 + version: 0.10.5(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(csstype@3.2.3)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(solid-js@1.9.14) + '@tanstack/react-router': + specifier: 1.170.10 + version: 1.170.10(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@tanstack/react-router-devtools': + specifier: 1.167.0 + version: 1.167.0(@tanstack/react-router@1.170.10(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(@tanstack/router-core@1.171.8)(csstype@3.2.3)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@tanstack/react-router-ssr-query': + specifier: 1.167.1 + version: 1.167.1(@tanstack/query-core@5.101.2)(@tanstack/react-query@5.101.2(react@19.2.7))(@tanstack/react-router@1.170.10(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(@tanstack/router-core@1.171.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@tanstack/react-start': + specifier: 1.168.18 + version: 1.168.18(esbuild@0.28.1)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(rolldown@1.1.5)(vite@8.0.16(@types/node@22.19.19)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.16.9)(yaml@2.9.0)) + '@tanstack/router-plugin': + specifier: 1.168.13 + version: 1.168.13(@tanstack/react-router@1.170.10(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(esbuild@0.28.1)(rolldown@1.1.5)(vite@8.0.16(@types/node@22.19.19)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.16.9)(yaml@2.9.0)) + class-variance-authority: + specifier: 0.7.1 + version: 0.7.1 + clsx: + specifier: 2.1.1 + version: 2.1.1 + react: + specifier: 19.2.7 + version: 19.2.7 + react-dom: + specifier: 19.2.7 + version: 19.2.7(react@19.2.7) + shadcn: + specifier: 4.10.0 + version: 4.10.0(@types/node@22.19.19)(typescript@6.0.3) + tailwind-merge: + specifier: 3.6.0 + version: 3.6.0 + tailwindcss: + specifier: 4.3.0 + version: 4.3.0 + tw-animate-css: + specifier: 1.4.0 + version: 1.4.0 devDependencies: - '@cloudflare/workers-types': - specifier: 5.20260717.1 - version: 5.20260717.1 - alchemy: - specifier: 0.93.12 - version: 0.93.12(@aws-sdk/client-dynamodb@3.984.0)(@aws-sdk/client-lambda@3.984.0)(@aws-sdk/client-s3@3.984.0)(@aws-sdk/client-sqs@3.984.0)(@opennextjs/cloudflare@1.20.1(next@16.2.10(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(rclone.js@0.6.6)(wrangler@4.112.0(@cloudflare/workers-types@5.20260717.1)))(mysql2@3.23.0(@types/node@26.1.1))(pg@8.22.0)(vite@8.1.5(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.16.9)(yaml@2.9.0))(workerd@1.20260714.1) - wrangler: - specifier: 4.112.0 - version: 4.112.0(@cloudflare/workers-types@5.20260717.1) + '@tanstack/devtools-vite': + specifier: 0.7.0 + version: 0.7.0(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.2)(vite@8.0.16(@types/node@22.19.19)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.16.9)(yaml@2.9.0)) + '@tanstack/eslint-config': + specifier: 0.4.0 + version: 0.4.0(@typescript-eslint/utils@8.64.0(eslint@9.39.4(jiti@2.7.0))(typescript@6.0.3))(eslint-import-resolver-node@0.3.10)(eslint@9.39.4(jiti@2.7.0))(typescript@6.0.3) + '@testing-library/dom': + specifier: 10.4.1 + version: 10.4.1 + '@testing-library/react': + specifier: 16.3.2 + version: 16.3.2(@testing-library/dom@10.4.1)(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@types/node': + specifier: 22.19.19 + version: 22.19.19 + '@types/react': + specifier: 19.2.16 + version: 19.2.16 + '@types/react-dom': + specifier: 19.2.3 + version: 19.2.3(@types/react@19.2.16) + '@vitejs/plugin-react': + specifier: 6.0.2 + version: 6.0.2(vite@8.0.16(@types/node@22.19.19)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.16.9)(yaml@2.9.0)) + eslint: + specifier: 9.39.4 + version: 9.39.4(jiti@2.7.0) + jsdom: + specifier: 28.1.0 + version: 28.1.0(@noble/hashes@1.8.0) + prettier: + specifier: 3.8.3 + version: 3.8.3 + prettier-plugin-tailwindcss: + specifier: 0.8.0 + version: 0.8.0(prettier@3.8.3) + typescript: + specifier: 6.0.3 + version: 6.0.3 + vite: + specifier: 8.0.16 + version: 8.0.16(@types/node@22.19.19)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.16.9)(yaml@2.9.0) + vitest: + specifier: 4.1.8 + version: 4.1.8(@types/node@22.19.19)(jsdom@28.1.0(@noble/hashes@1.8.0))(msw@2.15.0(@types/node@22.19.19)(typescript@6.0.3))(vite@8.0.16(@types/node@22.19.19)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.16.9)(yaml@2.9.0)) packages: + '@acemir/cssom@0.9.31': + resolution: {integrity: sha512-ZnR3GSaH+/vJ0YlHau21FjfLYjMpYVIzTD8M8vIEQvIGxeOXyXdzCI140rrCY862p/C/BbzWsjc1dgnM9mkoTA==} + '@alcalzone/ansi-tokenize@0.2.5': resolution: {integrity: sha512-3NX/MpTdroi0aKz134A6RC2Gb2iXVECN4QaAXnvCIxxIm3C3AVB1mkUe8NaaiyvOpDfsrqWhYtj+Q6a62RrTsw==} engines: {node: '>=18'} @@ -116,116 +213,31 @@ packages: resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} engines: {node: '>=10'} - '@ast-grep/napi-darwin-arm64@0.40.5': - resolution: {integrity: sha512-2F072fGN0WTq7KI3okuEnkGJVEHLbi56Bw1H6NAMf7j2mJJeQWsRyGOMcyNnUXZDeNdvoMH0OB2a5wwUegY/nQ==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - - '@ast-grep/napi-darwin-x64@0.40.5': - resolution: {integrity: sha512-dJMidHZhhxuLBYNi6/FKI812jQ7wcFPSKkVPwviez2D+KvYagapUMAV/4dJ7FCORfguVk8Y0jpPAlYmWRT5nvA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - - '@ast-grep/napi-linux-arm64-gnu@0.40.5': - resolution: {integrity: sha512-nBRCbyoS87uqkaw4Oyfe5VO+SRm2B+0g0T8ME69Qry9ShMf41a2bTdpcQx9e8scZPogq+CTwDHo3THyBV71l9w==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - libc: [glibc] - - '@ast-grep/napi-linux-arm64-musl@0.40.5': - resolution: {integrity: sha512-/qKsmds5FMoaEj6FdNzepbmLMtlFuBLdrAn9GIWCqOIcVcYvM1Nka8+mncfeXB/MFZKOrzQsQdPTWqrrQzXLrA==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - libc: [musl] - - '@ast-grep/napi-linux-x64-gnu@0.40.5': - resolution: {integrity: sha512-DP4oDbq7f/1A2hRTFLhJfDFR6aI5mRWdEfKfHzRItmlKsR9WlcEl1qDJs/zX9R2EEtIDsSKRzuJNfJllY3/W8Q==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - libc: [glibc] - - '@ast-grep/napi-linux-x64-musl@0.40.5': - resolution: {integrity: sha512-BRZUvVBPUNpWPo6Ns8chXVzxHPY+k9gpsubGTHy92Q26ecZULd/dTkWWdnvfhRqttsSQ9Pe/XQdi5+hDQ6RYcg==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - libc: [musl] - - '@ast-grep/napi-win32-arm64-msvc@0.40.5': - resolution: {integrity: sha512-y95zSEwc7vhxmcrcH0GnK4ZHEBQrmrszRBNQovzaciF9GUqEcCACNLoBesn4V47IaOp4fYgD2/EhGRTIBFb2Ug==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [win32] + '@asamuzakjp/css-color@5.1.11': + resolution: {integrity: sha512-KVw6qIiCTUQhByfTd78h2yD1/00waTmm9uy/R7Ck/ctUyAPj+AEDLkQIdJW0T8+qGgj3j5bpNKK7Q3G+LedJWg==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} - '@ast-grep/napi-win32-ia32-msvc@0.40.5': - resolution: {integrity: sha512-K/u8De62iUnFCzVUs7FBdTZ2Jrgc5/DLHqjpup66KxZ7GIM9/HGME/O8aSoPkpcAeCD4TiTZ11C1i5p5H98hTg==} - engines: {node: '>= 10'} - cpu: [ia32] - os: [win32] + '@asamuzakjp/dom-selector@6.8.1': + resolution: {integrity: sha512-MvRz1nCqW0fsy8Qz4dnLIvhOlMzqDVBabZx6lH+YywFDdjXhMY37SmpV1XFX3JzG5GWHn63j6HX6QPr3lZXHvQ==} - '@ast-grep/napi-win32-x64-msvc@0.40.5': - resolution: {integrity: sha512-dqm5zg/o4Nh4VOQPEpMS23ot8HVd22gG0eg01t4CFcZeuzyuSgBlOL3N7xLbz3iH2sVkk7keuBwAzOIpTqziNQ==} - engines: {node: '>= 10'} - cpu: [x64] - os: [win32] + '@asamuzakjp/generational-cache@1.0.1': + resolution: {integrity: sha512-wajfB8KqzMCN2KGNFdLkReeHncd0AslUSrvHVvvYWuU8ghncRJoA50kT3zP9MVL0+9g4/67H+cdvBskj9THPzg==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} - '@ast-grep/napi@0.40.5': - resolution: {integrity: sha512-hJA62OeBKUQT68DD2gDyhOqJxZxycqg8wLxbqjgqSzYttCMSDL9tiAQ9abgekBYNHudbJosm9sWOEbmCDfpX2A==} - engines: {node: '>= 10'} + '@asamuzakjp/nwsapi@2.3.9': + resolution: {integrity: sha512-n8GuYSrI9bF7FFZ/SjhwevlHc8xaVlb/7HmHelnc/PZXBD2ZR49NnN9sMMuDdEGPeeRQ5d0hqlSlEpgCX3Wl0Q==} '@aws-crypto/crc32@5.2.0': resolution: {integrity: sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg==} engines: {node: '>=16.0.0'} - '@aws-crypto/sha1-browser@5.2.0': - resolution: {integrity: sha512-OH6lveCFfcDjX4dbAvCFSYUjJZjDr/3XJ3xHtjn3Oj5b9RjojQo8npoLeA/bNwkOkrSQ0wgrHzXk4tDRxGKJeg==} - - '@aws-crypto/sha256-browser@5.2.0': - resolution: {integrity: sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw==} - - '@aws-crypto/sha256-js@5.2.0': - resolution: {integrity: sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA==} - engines: {node: '>=16.0.0'} - - '@aws-crypto/supports-web-crypto@5.2.0': - resolution: {integrity: sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg==} - '@aws-crypto/util@5.2.0': resolution: {integrity: sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==} - '@aws-sdk/checksums@3.1000.18': - resolution: {integrity: sha512-IImkbEyXdV6/uaF5r6Wkk+8718mQw1ll83j0a4a30R3JM/rHVFdWAiT4jtJpFjJiIwM/oJ6SxIxr0z2TaQUGqw==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/client-cloudfront@3.984.0': - resolution: {integrity: sha512-couDuDLpJtoeWne/nYyJ+I+5ntBVdNgBVRTCoDaXuVV7OC3u/wz5Ps0+GogspEwMLEFoOJ8t691h3YXQtnpQTw==} - engines: {node: '>=20.0.0'} - '@aws-sdk/client-cognito-identity@3.1081.0': resolution: {integrity: sha512-ipDgvZ3Hy8kaFrkwj62yuoghKkZi5WrWTiJnaqGc/ntbuAuijIkRWhzSb8d1MGEE+qb+vFFTrWVFwGSqt76TCA==} engines: {node: '>=20.0.0'} - '@aws-sdk/client-dynamodb@3.984.0': - resolution: {integrity: sha512-8/Oft9MWQtbG6p9f8eY5fsKC2CcO5YVDlwive8eUYS9mEbgnyQxm68OyH26WvsSTykQ9QkIbR+fOG56RsIBODw==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/client-lambda@3.984.0': - resolution: {integrity: sha512-kqwNBIGNxGVhINwgN/UQfdsQkaMjbu9PFV2EhATWouV+RT60uMjK9JENgLDwbgJmEVbbnPsh9HaZ5KKwPSdiDg==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/client-s3@3.984.0': - resolution: {integrity: sha512-7ny2Slr93Y+QniuluvcfWwyDi32zWQfznynL56Tk0vVh7bWrvS/odm8WP2nInKicRVNipcJHY2YInur6Q/9V0A==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/client-sqs@3.984.0': - resolution: {integrity: sha512-TDvHpOUWlpanc3xQ5Xw0y8L2hoojBFCCSmXQ/6rKqGOf1ScX3dMA+K9aF0Zp0iwjhSh4VvsHD42esl8XwQZDjA==} - engines: {node: '>=20.0.0'} - '@aws-sdk/core@3.975.3': resolution: {integrity: sha512-7ur3kCKuvPLqlsZ2XlvnNBVQ7KkpSu6Y6dOTwSPHLrFpTEfZM8isLBJc4cgv96WB7GifeVM436mpycwxBd2vEA==} engines: {node: '>=20.0.0'} @@ -270,74 +282,10 @@ packages: resolution: {integrity: sha512-UHWvxd1F5nfBXBRXtQaXWoNT8CYKXZovLQOyz6XZlgFTGc2mWzzPGspOfnh49jwvB2qzsdH046i9jnnmND+64w==} engines: {node: '>=20.0.0'} - '@aws-sdk/dynamodb-codec@3.973.33': - resolution: {integrity: sha512-/awY2mG1zvTy22j4ryZL8jfWQdcuppsw17Mxw1tjG92hO+52JoFZaaTWrJIQp066t/aj4JC4II29UJb6g644vA==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/endpoint-cache@3.972.9': - resolution: {integrity: sha512-LFvdgq8SriaskUcjpBMDE7J2c9RmuT5v3gU36/znV71EU5DKUis4FmGFjCMelKCCViFeVrQADBAlIiOYRhEx6Q==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/middleware-bucket-endpoint@3.972.37': - resolution: {integrity: sha512-xOPGznyla3UWxUEFJ019Hd3+B5otI08AqnR98cvyRl8GUvWncAsJSmiU2v8S2ybqRjioyum2+cu2h0IGadzs1A==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/middleware-endpoint-discovery@3.972.25': - resolution: {integrity: sha512-5G2aVPmbWC5dFI76D0vsNg2L0fgWP4uybcetf+06dzeZuRtpihnow88fOl5zm3+ABdIw27FKgyFzV4yB5Bm29Q==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/middleware-expect-continue@3.972.33': - resolution: {integrity: sha512-nagMlwXbUlNCFX9OUFlwizf1WI77oxOZ70enqb7qS4HMRt5i8qHssXhZrLI5J3RIxAyAsIEX8Zl8lG3HC/pKVg==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/middleware-flexible-checksums@3.974.43': - resolution: {integrity: sha512-KL6rttuu//off4XMq76E8xXOCPDHTlKvSOgXl5YEFAExDCZoRAgW/nKAfL4Jwt32bE1p99XP8Rjt7NHaqA0QnA==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/middleware-host-header@3.972.34': - resolution: {integrity: sha512-NmaFH7Wvrh4SICPO7hRW7M8i+9OvjHxC155HHi/C3JwMUM9CSSXdOjtYhw1Q4cZAoKFnrcu9gIfWPE9seZY5Nw==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/middleware-location-constraint@3.972.30': - resolution: {integrity: sha512-BdMsa14ZFFhcM5jvvE3fjiF33NE1RGXc+nRW+ifwIdmqJ48NAl/Waana9oVN/+XCGIztI7ZhMdJUTPi1VazjFQ==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/middleware-logger@3.972.33': - resolution: {integrity: sha512-wnyJLhO66WsWMCo4TPDFQj1Pa3w4IbA0KDsjQIf1ComTyVPs/HxOmqlXMim5ZPXJQsrWvqRgfCe+vYaa/k39SA==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/middleware-recursion-detection@3.972.35': - resolution: {integrity: sha512-FEdTIfdyyVfMOYfcSEawLZt8ejRBlPoJ51YZOLBdVTBteH5SwLaiDmvAyVwSAhqiI1ooMesdGK0KOwlV+4FDgQ==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/middleware-sdk-s3@3.972.64': - resolution: {integrity: sha512-RBi43anhDBUv+HCfxCOXwGOE7GmT4n7ChV04Mwr22RhXTNcamW/iWnJlOotDPCZSrJ4dEvhZSiWWQMwLX+ZhFA==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/middleware-sdk-sqs@3.972.37': - resolution: {integrity: sha512-ObKPWZWpog+4zZQ2q+LdBwf/nm+HF2afgBxCtyHeqjRlsnATuKOV3dPYnzCGyjRZ/RHTEre4LRrYRcIxlWhzVQ==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/middleware-ssec@3.972.30': - resolution: {integrity: sha512-SUSBtsnbtX519Z67vvdGAi5elvKXBmOR0RSxl9pm1jFXNMR2Lnkc23Whv9cGv5OwekeIJROxT+g1B9AUPDos9Q==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/middleware-user-agent@3.972.63': - resolution: {integrity: sha512-ciBdN5V+RjFX2oLXmxqdVbKfADSYIZb4UTFv0eZ2mD9DwARaeSKW9UI9qfX9hJrRjbmYIYtdbMPqFla20x8ZOA==} - engines: {node: '>=20.0.0'} - '@aws-sdk/nested-clients@3.997.30': resolution: {integrity: sha512-ZQpvaE4gKKChXIyU5nn/jJeA5TixpWeb3KToovyQ+Hj2HPHkTIjCWirnDHG9Za1HNwTFP4NHdAtuNuEU0PqDww==} engines: {node: '>=20.0.0'} - '@aws-sdk/region-config-resolver@3.972.37': - resolution: {integrity: sha512-O0mWXYkM1ASgX72KKW3zNG+pEvpmUG5yl6uykgA/p2xkVFi/SjUxwAZBv2ToqKba/TBwDU8tv2wL5Rq5ZTcdMg==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/signature-v4-multi-region@3.984.0': - resolution: {integrity: sha512-TaWbfYCwnuOSvDSrgs7QgoaoXse49E7LzUkVOUhoezwB7bkmhp+iojADm7UepCEu4021SquD7NG1xA+WCvmldA==} - engines: {node: '>=20.0.0'} - '@aws-sdk/signature-v4-multi-region@3.996.41': resolution: {integrity: sha512-QMUytg+FQMGouc8gHS00KoYih3+N6cqmVI/pQGOIo7Nr7OpQaiXjSYOuL+vsPZ1tymY4LAQ8MYcHJmws5LRxng==} engines: {node: '>=20.0.0'} @@ -350,21 +298,6 @@ packages: resolution: {integrity: sha512-3W6IUtSxFbH6X7Wb7DzGCV5QiFQsd0g8bOfntpmDxQlzBoKWUMBu/JPQR0DwkE+Hpnxd6db1tXbOwdeHddG6cA==} engines: {node: '>=20.0.0'} - '@aws-sdk/util-endpoints@3.984.0': - resolution: {integrity: sha512-9ebjLA0hMKHeVvXEtTDCCOBtwjb0bOXiuUV06HNeVdgAjH6gj4x4Zwt4IBti83TiyTGOCl5YfZqGx4ehVsasbQ==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/util-locate-window@3.965.8': - resolution: {integrity: sha512-uUbMs1cBZPafD0ohUj6EwNf0fPZ534NvBxHox4hjX+0Rxq5paSYUem7+hi833pYrzrcnBATKIYpR02MDXT5M9g==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/util-user-agent-browser@3.972.34': - resolution: {integrity: sha512-QkoA/jvhG6GDeghtIOcsuSQKqMwt75waXVjlf0WIkUhaNE1f/GrZ+/p/01yWI9cJdmO4T4YjyB/ZRdcvU1ToZw==} - - '@aws-sdk/util-user-agent-node@3.973.49': - resolution: {integrity: sha512-gZyJ3fmVq9RONzxk9BYeq1ZRc7d+ZLsytswREgaNTclvBQ7GTm4jlXMEhOTE5g1Ce9rhfWSHmm9xOwldHqtoDQ==} - engines: {node: '>=20.0.0'} - '@aws-sdk/xml-builder@3.972.36': resolution: {integrity: sha512-RdGmS1GLrtaTOLE1ElSluMldNrpk9Emq6uYs8SS8iHlu5xTAmM9rRkM91o48+rIRryBtyO9t+uLYCoMG6jVMVA==} engines: {node: '>=20.0.0'} @@ -373,6 +306,10 @@ packages: resolution: {integrity: sha512-sl4Bm6yiMNYrZKkqqDFWN0UfnWhlS8ivKxrYl+6t0gCLrqr8y3B2IqZZbFRkfaVVp7C/baApyh71P+LeE1A2sQ==} engines: {node: '>=18.0.0'} + '@babel/code-frame@7.27.1': + resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} + engines: {node: '>=6.9.0'} + '@babel/code-frame@7.29.7': resolution: {integrity: sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==} engines: {node: '>=6.9.0'} @@ -389,14 +326,28 @@ packages: resolution: {integrity: sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==} engines: {node: '>=6.9.0'} + '@babel/helper-annotate-as-pure@7.29.7': + resolution: {integrity: sha512-OoK6239jHPuSQOoS0kfTVKn0b/rVTk0seKq4Gd2UMLtmOVLjDC0ki3e+c90Trqv2gMfvJFqkiljrr568+qddiw==} + engines: {node: '>=6.9.0'} + '@babel/helper-compilation-targets@7.29.7': resolution: {integrity: sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==} engines: {node: '>=6.9.0'} + '@babel/helper-create-class-features-plugin@7.29.7': + resolution: {integrity: sha512-IY3ZD9Tmooqr3TUhc3DUWxiuo8xx1DWLhd5M7hQ+ZWJamqM2BbalrBJb2MisSLoYorOj75U03qULCxQTY9r3hg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + '@babel/helper-globals@7.29.7': resolution: {integrity: sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==} engines: {node: '>=6.9.0'} + '@babel/helper-member-expression-to-functions@7.29.7': + resolution: {integrity: sha512-j+7JYmk1JYDtACIGj0QJqqWZjoUpMoEikQGADMaHgCMCSDqd2+P32rfcibUNrGOMWrlzK1WJBdxrB3JJQZwWtg==} + engines: {node: '>=6.9.0'} + '@babel/helper-module-imports@7.29.7': resolution: {integrity: sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==} engines: {node: '>=6.9.0'} @@ -407,6 +358,24 @@ packages: peerDependencies: '@babel/core': ^7.0.0 + '@babel/helper-optimise-call-expression@7.29.7': + resolution: {integrity: sha512-+kmGVjcT9RGYzoDwdwEqEvGgKe3BYq+O1iGzjFubaNgZHwYHP6lsF2Yghf4kEuv9BV7tYDZ913aBW9am6YKong==} + engines: {node: '>=6.9.0'} + + '@babel/helper-plugin-utils@7.29.7': + resolution: {integrity: sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-replace-supers@7.29.7': + resolution: {integrity: sha512-atfGXWSeCiF4DnKZIfmJfQRkSw9b9gNNXR1kqKjbhG4pGYCOnkp8OcTB8E3NXjBu8NpheSnOeNKz8KT7UNFTmQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-skip-transparent-expression-wrappers@7.29.7': + resolution: {integrity: sha512-brcMGQaVzIeUb+6/bs1Av0f8YuNNjKY2JyvfRCsFuFsdKccEQ5Ges2y74D74NZ1Rz8lKJ9ksJkfqwQFJ/iNEyQ==} + engines: {node: '>=6.9.0'} + '@babel/helper-string-parser@7.29.7': resolution: {integrity: sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==} engines: {node: '>=6.9.0'} @@ -428,6 +397,40 @@ packages: engines: {node: '>=6.0.0'} hasBin: true + '@babel/plugin-syntax-jsx@7.29.7': + resolution: {integrity: sha512-TSu8+mHCoEaaCDEZ0I3+6mvTBYR4PCxQwf2z9/r5Tbztv6NaLR3B9thGTTxX2WGuGHJqRiAbKPeGTJ5XWXVg6A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-typescript@7.29.7': + resolution: {integrity: sha512-ngr+82Sh0xMz25TPCZi+nC2iTzjfCdWS2ONXTp/PtSCHCgaCNBpdMqgvJ2ccdLlClVZ7sisIgB914j/JFe+RZA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-modules-commonjs@7.29.7': + resolution: {integrity: sha512-j0vCldybPC5b5dwCQOJ21uKtHzt7hxLygJTg9eF1ScfaikEDNfzn94XoW5Fi+seBR0nCyL23xaBFFkq7dTM8XQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-typescript@7.29.7': + resolution: {integrity: sha512-jK52h8LaLc7JarhQV2ofeFMts4H7vnOXnqZNA6fYglBTZewRBE51KWt3BUltW1P+KoPsYkHoJeXePuz4zo2LMw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/preset-typescript@7.29.7': + resolution: {integrity: sha512-/Foi8vKY2EVbed/1eZx0gJEEwHAIxogrySI7rULcRIvhZzbvoE/b5qG5Ghc0WKAFKOHA9SD1x7RsFlOYdutIiQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/runtime@7.29.7': + resolution: {integrity: sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==} + engines: {node: '>=6.9.0'} + '@babel/template@7.29.7': resolution: {integrity: sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==} engines: {node: '>=6.9.0'} @@ -440,6 +443,37 @@ packages: resolution: {integrity: sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==} engines: {node: '>=6.9.0'} + '@base-ui/react@1.5.0': + resolution: {integrity: sha512-z1gSAlced1yY+iM+mHDEtIkD8UI3Ebs52MuBPxvV6f5hRutk+xvCH/wuB7hDqDzK9JG5FoMz5nhrqtSs1wjt1A==} + engines: {node: '>=14.0.0'} + peerDependencies: + '@date-fns/tz': ^1.2.0 + '@types/react': ^17 || ^18 || ^19 + date-fns: ^4.0.0 + react: ^17 || ^18 || ^19 + react-dom: ^17 || ^18 || ^19 + peerDependenciesMeta: + '@date-fns/tz': + optional: true + '@types/react': + optional: true + date-fns: + optional: true + + '@base-ui/utils@0.2.9': + resolution: {integrity: sha512-x/PDDCYzoqPpjrdyb3VcyylTI2IjUXEtYDGi5foh7KsnmNJIIaVwA2GLgDH1dps1GgXiJbA60hM+AyuTfQzIvw==} + peerDependencies: + '@types/react': ^17 || ^18 || ^19 + react: ^17 || ^18 || ^19 + react-dom: ^17 || ^18 || ^19 + peerDependenciesMeta: + '@types/react': + optional: true + + '@bramus/specificity@2.4.2': + resolution: {integrity: sha512-ctxtJ/eA+t+6q2++vj5j7FYX3nRu311q1wfYH3xjlLOsczhlhxAg2FWNUXhpGvAw3BWo1xBcvOV6/YLc2r5FJw==} + hasBin: true + '@clack/core@0.5.0': resolution: {integrity: sha512-p3y0FIOwaYRUPRcMO7+dlmLh8PSRcrjuTndsiA0WAFbWES0mLZlrjVoBRZ9DzkPFJZG6KGkJmoEAY0ZcVWTkow==} @@ -459,27 +493,6 @@ packages: workerd: optional: true - '@cloudflare/unenv-preset@2.7.7': - resolution: {integrity: sha512-HtZuh166y0Olbj9bqqySckz0Rw9uHjggJeoGbDx5x+sgezBXlxO6tQSig2RZw5tgObF8mWI8zaPvQMkQZtAODw==} - peerDependencies: - unenv: 2.0.0-rc.21 - workerd: ^1.20250927.0 - peerDependenciesMeta: - workerd: - optional: true - - '@cloudflare/workerd-darwin-64@1.20260424.1': - resolution: {integrity: sha512-yFR1XaJbSDLg/qbwtrYaU2xwFXatIPKR5nrMQCN1q/m6+Qe/j6r+kCnFEvOJjMZOm9iCKsE6Qly5clgl4u32qw==} - engines: {node: '>=16'} - cpu: [x64] - os: [darwin] - - '@cloudflare/workerd-darwin-64@1.20260702.1': - resolution: {integrity: sha512-D5+vnLlvfkanyFpgyE+K8JtFGr9qcKEaMIv6iGus1bz7gegr8zWF5HLwJ5LbebdyeVWl+IzpT7m5LJQsHOcJ4Q==} - engines: {node: '>=16'} - cpu: [x64] - os: [darwin] - '@cloudflare/workerd-darwin-64@1.20260704.1': resolution: {integrity: sha512-XO+vvdhhTNZSsIWCkZ+JaE/JrFUmQAB0H0y/sVkAf32xa2TYBRvFUMwjSqf6WxtlxcKPQvmbLfpO/UQ0l/q4eQ==} engines: {node: '>=16'} @@ -492,18 +505,6 @@ packages: cpu: [x64] os: [darwin] - '@cloudflare/workerd-darwin-arm64@1.20260424.1': - resolution: {integrity: sha512-LqWKcE7x/9KyC2iQvKPeb20hKST3dYXDZlYTvFymgR1DfLS0OFOCzVGTloVNd7WqvK4SkdzBYfxo7QMIAeBK0w==} - engines: {node: '>=16'} - cpu: [arm64] - os: [darwin] - - '@cloudflare/workerd-darwin-arm64@1.20260702.1': - resolution: {integrity: sha512-CkJNyrOzuIWil87qztB5cE6b9z+0c2Ewc8yrkSfahsdATxmjD+mrLIpJ0IkW9bqCOS1JE1kDEtfx9D4/ZpKW6w==} - engines: {node: '>=16'} - cpu: [arm64] - os: [darwin] - '@cloudflare/workerd-darwin-arm64@1.20260704.1': resolution: {integrity: sha512-6iI7nbOOO8PzEQ6UZVBZB/hv95m8jl0yvyjMuWrF5cJbiLb5zPw3KnpqvGi+aeOs2ZmUkc81i1FWKfXwLXzPRA==} engines: {node: '>=16'} @@ -516,18 +517,6 @@ packages: cpu: [arm64] os: [darwin] - '@cloudflare/workerd-linux-64@1.20260424.1': - resolution: {integrity: sha512-YlEBFbAYZHe/ylzl8WEYQEU/jr+0XMqXaST2oBk5oVjksdb1NGuJaggluCdZAzuJJ8UqdTmyhY5u/qrasbiFWA==} - engines: {node: '>=16'} - cpu: [x64] - os: [linux] - - '@cloudflare/workerd-linux-64@1.20260702.1': - resolution: {integrity: sha512-FhJl4cZQNqlG5v7LQRvzTes2q8hHylf60ecQ4Es0YvJ0hvRO30FOU2f4WSEIkZahs1HNCYxf2EL9GJQ/vIx1Ig==} - engines: {node: '>=16'} - cpu: [x64] - os: [linux] - '@cloudflare/workerd-linux-64@1.20260704.1': resolution: {integrity: sha512-3mT0YHtxT7eLjghu3hKSJDUQoz+AYv8FM43nLPYhM0YiHOxr8OlmvnCb2Lp7v/U3bwd3Gnx7WEqjSppR583mGg==} engines: {node: '>=16'} @@ -540,18 +529,6 @@ packages: cpu: [x64] os: [linux] - '@cloudflare/workerd-linux-arm64@1.20260424.1': - resolution: {integrity: sha512-qJ0X0m6cL8fWDUPDg8K4IxYZXNJI6XbeOihqjnqKbAClrjdPDn8VUSd+z2XiCQ5NylMtMrpa/skC9UfaR6mh8g==} - engines: {node: '>=16'} - cpu: [arm64] - os: [linux] - - '@cloudflare/workerd-linux-arm64@1.20260702.1': - resolution: {integrity: sha512-EuXdOgwE08sbfVJsI9JHXUxf2Xlqy51P1nQt+wIDN5kcLzfkW0hbKw/GVLupLBhivGdFRfSBM9SUn/+3uMneuQ==} - engines: {node: '>=16'} - cpu: [arm64] - os: [linux] - '@cloudflare/workerd-linux-arm64@1.20260704.1': resolution: {integrity: sha512-Opo7cPTPg4x0WwK+eZSDszCyFLKQkOGNCWxF005HRTJ5SJH8h0K9KyrC1k4LBwx3haXSVi+E1eGqo1gZ1Hmhkg==} engines: {node: '>=16'} @@ -564,18 +541,6 @@ packages: cpu: [arm64] os: [linux] - '@cloudflare/workerd-windows-64@1.20260424.1': - resolution: {integrity: sha512-tZ7Z9qmYNAP6z1/+8r/zKbk8F8DZmpmwNzMeN+zkde2Wnhfr3FBqOkJXT/5zmli8HPoWrIXxSiyqcNDMy8V2Zg==} - engines: {node: '>=16'} - cpu: [x64] - os: [win32] - - '@cloudflare/workerd-windows-64@1.20260702.1': - resolution: {integrity: sha512-84X5kRiUo9vUEWAaj/vOamPqQJK21KOUWuQ48MccFbzG+LPCZP0EGb36dQZd1OmKoZ1dYHPWB0zBAoI7tygc2w==} - engines: {node: '>=16'} - cpu: [x64] - os: [win32] - '@cloudflare/workerd-windows-64@1.20260704.1': resolution: {integrity: sha512-a97Ecnzhy04x3U052VKPCNp863F7Wf00WY7Ga5P0SbtYvaO1PDzylsHrvFMPKeiDFcOwqiredawmJ+v6bhIgeQ==} engines: {node: '>=16'} @@ -595,6 +560,42 @@ packages: resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} engines: {node: '>=12'} + '@csstools/color-helpers@6.1.0': + resolution: {integrity: sha512-064IFJdjTfUqnjpCVpMOdbr8FLQBhinbZj6yRv2An2E41O/pLEXqfFRWqGq/SxlE5PEUYTlvWsG2r8MswAVvkg==} + engines: {node: '>=20.19.0'} + + '@csstools/css-calc@3.2.1': + resolution: {integrity: sha512-DtdHlgXh5ZkA43cwBcAm+huzgJiwx3ZTWVjBs94kwz2xKqSimDA3lBgCjphYgwgVUMWatSM0pDd8TILB1yrVVg==} + engines: {node: '>=20.19.0'} + peerDependencies: + '@csstools/css-parser-algorithms': ^4.0.0 + '@csstools/css-tokenizer': ^4.0.0 + + '@csstools/css-color-parser@4.1.9': + resolution: {integrity: sha512-paQcIaOO53Rk5+YrBaBjm/SgrV4INImjo2BT1DtQRYr+XeTRbeAYlS+jxXp9drqvKmtFnWRJKIalDLhZZDu42A==} + engines: {node: '>=20.19.0'} + peerDependencies: + '@csstools/css-parser-algorithms': ^4.0.0 + '@csstools/css-tokenizer': ^4.0.0 + + '@csstools/css-parser-algorithms@4.0.0': + resolution: {integrity: sha512-+B87qS7fIG3L5h3qwJ/IFbjoVoOe/bpOdh9hAjXbvx0o8ImEmUsGXN0inFOnk2ChCFgqkkGFQ+TpM5rbhkKe4w==} + engines: {node: '>=20.19.0'} + peerDependencies: + '@csstools/css-tokenizer': ^4.0.0 + + '@csstools/css-syntax-patches-for-csstree@1.1.6': + resolution: {integrity: sha512-TcJCWFbXLPpJYq6z7bfOyjWYJDiDg2/I4gyUC9pqPNqHFRIey0EB0q0L5cSnQDfWJg8Jd6VadakxdIez/3zkqQ==} + peerDependencies: + css-tree: ^3.2.1 + peerDependenciesMeta: + css-tree: + optional: true + + '@csstools/css-tokenizer@4.0.0': + resolution: {integrity: sha512-QxULHAm7cNu72w97JUNCBFODFaXpbDg+dP8b/oWFAZ2MTRppA3U00Y2L1HqaS4J6yBqxwa/Y3nMBaxVKbB/NsA==} + engines: {node: '>=20.19.0'} + '@distilled.cloud/aws@0.29.1': resolution: {integrity: sha512-PyckEEQny1QyuLQwHnTprtirUysGKfdYIBn2hi7K7ZEHQ0DaPgOb5Snj7Jg1peRREKZmJ6GIKC7zBKogZQUVxA==} peerDependencies: @@ -664,15 +665,12 @@ packages: peerDependencies: effect: '>=4.0.0-beta.97 || >=4.0.0' - '@dotenvx/dotenvx@1.31.0': - resolution: {integrity: sha512-GeDxvtjiRuoyWVU9nQneId879zIyNdL05bS7RKiqMkfBSKpHMWHLoRyRqjYWLaXmX/llKO1hTlqHDmatkQAjPA==} + '@dotenvx/dotenvx@1.75.1': + resolution: {integrity: sha512-/BITOC9dmS/edY2zQwZNicQ059O6RKabtQfyEafV0nGtfYRNHYy1DIPiYVcov40+tob9hfmBnbR963dS+EQ1DQ==} hasBin: true - '@ecies/ciphers@0.2.6': - resolution: {integrity: sha512-patgsRPKGkhhoBjETV4XxD0En4ui5fbX0hzayqI3M8tvNMGUoUvmyYAIWwlxBc1KX5cturfqByYdj5bYGRpN9g==} - engines: {bun: '>=1', deno: '>=2.7.10', node: '>=16'} - peerDependencies: - '@noble/ciphers': ^1.0.0 + '@dotenvx/primitives@0.8.0': + resolution: {integrity: sha512-VYJy0uhFm9zTJ1TxBaW/pA8bjbOM/OttaNMwZ1RHG4JKyRG7DhSdiqD1ipQoAyoD22olUtxbP78W9xY3Wd11bg==} '@effect/platform-bun@4.0.0-beta.98': resolution: {integrity: sha512-QorRKhvwHDPwvE8lH5lE0r0dI2z+zj12VUN4h7hfoIunKUiXSoSOMZqF3w13W30RpV6ivsvJywUycaa/18yMPA==} @@ -719,462 +717,156 @@ packages: '@emnapi/wasi-threads@1.2.2': resolution: {integrity: sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA==} - '@esbuild/aix-ppc64@0.25.12': - resolution: {integrity: sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [aix] - - '@esbuild/aix-ppc64@0.25.4': - resolution: {integrity: sha512-1VCICWypeQKhVbE9oW/sJaAmjLxhVqacdkvPLEjwlttjfwENRSClS8EjBz0KzRyFSCPDIkuXW34Je/vk7zdB7Q==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [aix] - '@esbuild/aix-ppc64@0.28.1': resolution: {integrity: sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.25.12': - resolution: {integrity: sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [android] - - '@esbuild/android-arm64@0.25.4': - resolution: {integrity: sha512-bBy69pgfhMGtCnwpC/x5QhfxAz/cBgQ9enbtwjf6V9lnPI/hMyT9iWpR1arm0l3kttTr4L0KSLpKmLp/ilKS9A==} - engines: {node: '>=18'} - cpu: [arm64] - os: [android] - '@esbuild/android-arm64@0.28.1': resolution: {integrity: sha512-34EGEbCIAgosYz6goLcopX6Mo7NyGv9tfwEM2/7Ce2VcVRk568iSvniGWcUXIy7wEDR1wzolcxcriFVrWYcwBg==} engines: {node: '>=18'} cpu: [arm64] os: [android] - '@esbuild/android-arm@0.25.12': - resolution: {integrity: sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==} - engines: {node: '>=18'} - cpu: [arm] - os: [android] - - '@esbuild/android-arm@0.25.4': - resolution: {integrity: sha512-QNdQEps7DfFwE3hXiU4BZeOV68HHzYwGd0Nthhd3uCkkEKK7/R6MTgM0P7H7FAs5pU/DIWsviMmEGxEoxIZ+ZQ==} - engines: {node: '>=18'} - cpu: [arm] - os: [android] - '@esbuild/android-arm@0.28.1': resolution: {integrity: sha512-0k2F129Xdio1TdJfzJ8sy1Q47vUD2NnwdhiAf7drUN1EBTfPf4hsFCtmMgu/6m8JSzsBrlmVjudMBQqOfG8usQ==} engines: {node: '>=18'} cpu: [arm] os: [android] - '@esbuild/android-x64@0.25.12': - resolution: {integrity: sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==} + '@esbuild/android-x64@0.28.1': + resolution: {integrity: sha512-dbwY7ltSMDWsRatcRpCnES4F+im88OCUgGZjy52shC7GqHRE/cYlxNbB4Z4UpJswpcc4Qxd2oE/ufM0p61IKng==} engines: {node: '>=18'} cpu: [x64] os: [android] - '@esbuild/android-x64@0.25.4': - resolution: {integrity: sha512-TVhdVtQIFuVpIIR282btcGC2oGQoSfZfmBdTip2anCaVYcqWlZXGcdcKIUklfX2wj0JklNYgz39OBqh2cqXvcQ==} - engines: {node: '>=18'} - cpu: [x64] - os: [android] - - '@esbuild/android-x64@0.28.1': - resolution: {integrity: sha512-dbwY7ltSMDWsRatcRpCnES4F+im88OCUgGZjy52shC7GqHRE/cYlxNbB4Z4UpJswpcc4Qxd2oE/ufM0p61IKng==} - engines: {node: '>=18'} - cpu: [x64] - os: [android] - - '@esbuild/darwin-arm64@0.25.12': - resolution: {integrity: sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [darwin] - - '@esbuild/darwin-arm64@0.25.4': - resolution: {integrity: sha512-Y1giCfM4nlHDWEfSckMzeWNdQS31BQGs9/rouw6Ub91tkK79aIMTH3q9xHvzH8d0wDru5Ci0kWB8b3up/nl16g==} - engines: {node: '>=18'} - cpu: [arm64] - os: [darwin] - '@esbuild/darwin-arm64@0.28.1': resolution: {integrity: sha512-TZbWkQY7kvTAXbXUT7uVACR5cMHsDiSz9z7ZKAX/RTq/WJEk3QyRr0wZpNhBDX+/0CtdqUIJlOiodQcta6tY3Q==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.25.12': - resolution: {integrity: sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==} - engines: {node: '>=18'} - cpu: [x64] - os: [darwin] - - '@esbuild/darwin-x64@0.25.4': - resolution: {integrity: sha512-CJsry8ZGM5VFVeyUYB3cdKpd/H69PYez4eJh1W/t38vzutdjEjtP7hB6eLKBoOdxcAlCtEYHzQ/PJ/oU9I4u0A==} - engines: {node: '>=18'} - cpu: [x64] - os: [darwin] - '@esbuild/darwin-x64@0.28.1': resolution: {integrity: sha512-zfdzgK9ACBNZLI/CyHTOx81SyNbM6YXn7rxSgX97VjyiPl9W1i4Ka4fgKECEoFCKGpvBj5qArWIGgQjOwkgskQ==} engines: {node: '>=18'} cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.25.12': - resolution: {integrity: sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [freebsd] - - '@esbuild/freebsd-arm64@0.25.4': - resolution: {integrity: sha512-yYq+39NlTRzU2XmoPW4l5Ifpl9fqSk0nAJYM/V/WUGPEFfek1epLHJIkTQM6bBs1swApjO5nWgvr843g6TjxuQ==} - engines: {node: '>=18'} - cpu: [arm64] - os: [freebsd] - '@esbuild/freebsd-arm64@0.28.1': resolution: {integrity: sha512-wG2EA8ENdEI0qhkSZMjfqrdY+ziCYCPMmtZjjIwOmXFjmyzEHn+UUxk5of+SYsjtfs3VpnlC7QLzSI5hY/rOAw==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.25.12': - resolution: {integrity: sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==} - engines: {node: '>=18'} - cpu: [x64] - os: [freebsd] - - '@esbuild/freebsd-x64@0.25.4': - resolution: {integrity: sha512-0FgvOJ6UUMflsHSPLzdfDnnBBVoCDtBTVyn/MrWloUNvq/5SFmh13l3dvgRPkDihRxb77Y17MbqbCAa2strMQQ==} - engines: {node: '>=18'} - cpu: [x64] - os: [freebsd] - '@esbuild/freebsd-x64@0.28.1': resolution: {integrity: sha512-i7dZ9vQgnvSCzi/rYCXNgtF/U+eKZNJBzu3eTQbRgHnM7tNSizLOkRFAl3qzVc/Op/u5YkHHa4pf/3DOYHthLQ==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.25.12': - resolution: {integrity: sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==} - engines: {node: '>=18'} - cpu: [arm64] - os: [linux] - - '@esbuild/linux-arm64@0.25.4': - resolution: {integrity: sha512-+89UsQTfXdmjIvZS6nUnOOLoXnkUTB9hR5QAeLrQdzOSWZvNSAXAtcRDHWtqAUtAmv7ZM1WPOOeSxDzzzMogiQ==} - engines: {node: '>=18'} - cpu: [arm64] - os: [linux] - '@esbuild/linux-arm64@0.28.1': resolution: {integrity: sha512-yHs+0uc8+nvEAfAfxrWQKK5peSNzBc4PegcMO0EJ2hT71uA7vB8Ihg2e77R2P7SG5uYjPbHlLLmve4LLLRCf0g==} engines: {node: '>=18'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.25.12': - resolution: {integrity: sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==} - engines: {node: '>=18'} - cpu: [arm] - os: [linux] - - '@esbuild/linux-arm@0.25.4': - resolution: {integrity: sha512-kro4c0P85GMfFYqW4TWOpvmF8rFShbWGnrLqlzp4X1TNWjRY3JMYUfDCtOxPKOIY8B0WC8HN51hGP4I4hz4AaQ==} - engines: {node: '>=18'} - cpu: [arm] - os: [linux] - '@esbuild/linux-arm@0.28.1': resolution: {integrity: sha512-qVXBOHQS+d5Y722GwJzJUtOLlX7km3CraOaGormF1pDtPd2C/l1SHRPgjLunLGe51Sh5YYWKMFDyV4SxgMQYTQ==} engines: {node: '>=18'} cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.25.12': - resolution: {integrity: sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==} - engines: {node: '>=18'} - cpu: [ia32] - os: [linux] - - '@esbuild/linux-ia32@0.25.4': - resolution: {integrity: sha512-yTEjoapy8UP3rv8dB0ip3AfMpRbyhSN3+hY8mo/i4QXFeDxmiYbEKp3ZRjBKcOP862Ua4b1PDfwlvbuwY7hIGQ==} - engines: {node: '>=18'} - cpu: [ia32] - os: [linux] - '@esbuild/linux-ia32@0.28.1': resolution: {integrity: sha512-d1z4ZuP0ajrfz/FhGT4vv278rX8KnPPJx8i5+AtK7TYbx9Le9F1hyzurZpkEyjkGa9dUGhQow4C1NmeGvqxN2w==} engines: {node: '>=18'} cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.25.12': - resolution: {integrity: sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==} - engines: {node: '>=18'} - cpu: [loong64] - os: [linux] - - '@esbuild/linux-loong64@0.25.4': - resolution: {integrity: sha512-NeqqYkrcGzFwi6CGRGNMOjWGGSYOpqwCjS9fvaUlX5s3zwOtn1qwg1s2iE2svBe4Q/YOG1q6875lcAoQK/F4VA==} - engines: {node: '>=18'} - cpu: [loong64] - os: [linux] - '@esbuild/linux-loong64@0.28.1': resolution: {integrity: sha512-M5sRjUVZrkm1OAPR3dlOYzNmN+loZKGVi1VUQGrwuqLcbR6qeAz+famMhjASeH3YVKvZz+zT1jlh/keC3Rj/lg==} engines: {node: '>=18'} cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.25.12': - resolution: {integrity: sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==} - engines: {node: '>=18'} - cpu: [mips64el] - os: [linux] - - '@esbuild/linux-mips64el@0.25.4': - resolution: {integrity: sha512-IcvTlF9dtLrfL/M8WgNI/qJYBENP3ekgsHbYUIzEzq5XJzzVEV/fXY9WFPfEEXmu3ck2qJP8LG/p3Q8f7Zc2Xg==} - engines: {node: '>=18'} - cpu: [mips64el] - os: [linux] - '@esbuild/linux-mips64el@0.28.1': resolution: {integrity: sha512-mRObBZeHh2OxcBFPWE/FjylkRgZdYuiTR3vaTozquCGOH14iP9oN4x4Ge81CoIDYQrXmIxpFumJBu5MtZpnQJQ==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.25.12': - resolution: {integrity: sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [linux] - - '@esbuild/linux-ppc64@0.25.4': - resolution: {integrity: sha512-HOy0aLTJTVtoTeGZh4HSXaO6M95qu4k5lJcH4gxv56iaycfz1S8GO/5Jh6X4Y1YiI0h7cRyLi+HixMR+88swag==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [linux] - '@esbuild/linux-ppc64@0.28.1': resolution: {integrity: sha512-slScBsMAb3GFDcdrCgLwZtPYRoH2H/youv10QiZyRjmsP48fznoveWytSgCI/R0ZcUgpc0ZhIUEx6LHts8yrfQ==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.25.12': - resolution: {integrity: sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==} - engines: {node: '>=18'} - cpu: [riscv64] - os: [linux] - - '@esbuild/linux-riscv64@0.25.4': - resolution: {integrity: sha512-i8JUDAufpz9jOzo4yIShCTcXzS07vEgWzyX3NH2G7LEFVgrLEhjwL3ajFE4fZI3I4ZgiM7JH3GQ7ReObROvSUA==} - engines: {node: '>=18'} - cpu: [riscv64] - os: [linux] - '@esbuild/linux-riscv64@0.28.1': resolution: {integrity: sha512-kw0owk1o0GFETUJyW0jc0G4Yzs0BHZn0JDZ8JRT088vjJYX777BAs1fDGxAC+q831qOs2DTC96mNsG2opdfyyQ==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.25.12': - resolution: {integrity: sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==} - engines: {node: '>=18'} - cpu: [s390x] - os: [linux] - - '@esbuild/linux-s390x@0.25.4': - resolution: {integrity: sha512-jFnu+6UbLlzIjPQpWCNh5QtrcNfMLjgIavnwPQAfoGx4q17ocOU9MsQ2QVvFxwQoWpZT8DvTLooTvmOQXkO51g==} - engines: {node: '>=18'} - cpu: [s390x] - os: [linux] - '@esbuild/linux-s390x@0.28.1': resolution: {integrity: sha512-/lAIjX8aYFRByhh6L5rYtPEDRqa9de/4V/juOXcta5frjvzXO4/sqEtyytse0g3zZFuWu5cDN0MkLz2qRDD2Ag==} engines: {node: '>=18'} cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.25.12': - resolution: {integrity: sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==} - engines: {node: '>=18'} - cpu: [x64] - os: [linux] - - '@esbuild/linux-x64@0.25.4': - resolution: {integrity: sha512-6e0cvXwzOnVWJHq+mskP8DNSrKBr1bULBvnFLpc1KY+d+irZSgZ02TGse5FsafKS5jg2e4pbvK6TPXaF/A6+CA==} - engines: {node: '>=18'} - cpu: [x64] - os: [linux] - '@esbuild/linux-x64@0.28.1': resolution: {integrity: sha512-u/anNYF2mmVOEDwLtnQ1wOr3EZ9sTNGLWrsYGYwHWzGA3Si84IOkHXlbWTD1NB+9/1lcnweYKO54uhxZydNzfA==} engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/netbsd-arm64@0.25.12': - resolution: {integrity: sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [netbsd] - - '@esbuild/netbsd-arm64@0.25.4': - resolution: {integrity: sha512-vUnkBYxZW4hL/ie91hSqaSNjulOnYXE1VSLusnvHg2u3jewJBz3YzB9+oCw8DABeVqZGg94t9tyZFoHma8gWZQ==} - engines: {node: '>=18'} - cpu: [arm64] - os: [netbsd] - '@esbuild/netbsd-arm64@0.28.1': resolution: {integrity: sha512-oks0DYbLwWMmaakTsCb+zL4E+aHRVLom9IJZOAthMQEPiQmydXHkziYEsGYRx0uNV/IjEKGAV941JzH02pflqw==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-x64@0.25.12': - resolution: {integrity: sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==} - engines: {node: '>=18'} - cpu: [x64] - os: [netbsd] - - '@esbuild/netbsd-x64@0.25.4': - resolution: {integrity: sha512-XAg8pIQn5CzhOB8odIcAm42QsOfa98SBeKUdo4xa8OvX8LbMZqEtgeWE9P/Wxt7MlG2QqvjGths+nq48TrUiKw==} - engines: {node: '>=18'} - cpu: [x64] - os: [netbsd] - '@esbuild/netbsd-x64@0.28.1': resolution: {integrity: sha512-aeL6lAnN89Hz43Mlh1G8ARasbuoYvSITDEx0tHh5b7jJnHcssqgjy9Yx430GDpmCa6OyrKoS0aNRjKundRizGg==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/openbsd-arm64@0.25.12': - resolution: {integrity: sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==} - engines: {node: '>=18'} - cpu: [arm64] - os: [openbsd] - - '@esbuild/openbsd-arm64@0.25.4': - resolution: {integrity: sha512-Ct2WcFEANlFDtp1nVAXSNBPDxyU+j7+tId//iHXU2f/lN5AmO4zLyhDcpR5Cz1r08mVxzt3Jpyt4PmXQ1O6+7A==} - engines: {node: '>=18'} - cpu: [arm64] - os: [openbsd] - '@esbuild/openbsd-arm64@0.28.1': resolution: {integrity: sha512-MEFJe5C3R8pwXdZ5Y21oo6m7ePiS0d9pWucn99O/wvyJZChoIQKrQDxKrGeW8F5+T0okTHesAmDeiHDTIq0V/Q==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-x64@0.25.12': - resolution: {integrity: sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==} - engines: {node: '>=18'} - cpu: [x64] - os: [openbsd] - - '@esbuild/openbsd-x64@0.25.4': - resolution: {integrity: sha512-xAGGhyOQ9Otm1Xu8NT1ifGLnA6M3sJxZ6ixylb+vIUVzvvd6GOALpwQrYrtlPouMqd/vSbgehz6HaVk4+7Afhw==} - engines: {node: '>=18'} - cpu: [x64] - os: [openbsd] - '@esbuild/openbsd-x64@0.28.1': resolution: {integrity: sha512-i/ZLIOafE0Z8cI/XANJAixoJL/uRAoS2xOA3rb0xN+KK0K177cMAsQYkzHtBrtMXAKuAc7HGgcWiZ/sRC1Nxgw==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] - '@esbuild/openharmony-arm64@0.25.12': - resolution: {integrity: sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [openharmony] - '@esbuild/openharmony-arm64@0.28.1': resolution: {integrity: sha512-ge+Z7EXFNt2BO1oAMsVpiQ8EwndV9i1xXerAeTIK7AtPs3bKFXQM7nlRxDSIUIMeueR1CNXxqztLzdNeReKBJg==} engines: {node: '>=18'} cpu: [arm64] os: [openharmony] - '@esbuild/sunos-x64@0.25.12': - resolution: {integrity: sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==} - engines: {node: '>=18'} - cpu: [x64] - os: [sunos] - - '@esbuild/sunos-x64@0.25.4': - resolution: {integrity: sha512-Mw+tzy4pp6wZEK0+Lwr76pWLjrtjmJyUB23tHKqEDP74R3q95luY/bXqXZeYl4NYlvwOqoRKlInQialgCKy67Q==} - engines: {node: '>=18'} - cpu: [x64] - os: [sunos] - '@esbuild/sunos-x64@0.28.1': resolution: {integrity: sha512-BEjgtECkL3vY+SaSQ6nzVfiALUeFxpawyp8Jmf5PtYhf1Ug40N1h/hxlhts+f1FvSvarEigdxS3BlSMI2PJLcQ==} engines: {node: '>=18'} cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.25.12': - resolution: {integrity: sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [win32] - - '@esbuild/win32-arm64@0.25.4': - resolution: {integrity: sha512-AVUP428VQTSddguz9dO9ngb+E5aScyg7nOeJDrF1HPYu555gmza3bDGMPhmVXL8svDSoqPCsCPjb265yG/kLKQ==} - engines: {node: '>=18'} - cpu: [arm64] - os: [win32] - '@esbuild/win32-arm64@0.28.1': resolution: {integrity: sha512-lCv9eK/H6ZJWbE7bh2nw54CZ9M2nupBxJcTsdk/QQnWkdSjKGuxmmH8/GWrlT1eMmZfn4dGcCjRte397WqfQXA==} engines: {node: '>=18'} cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.25.12': - resolution: {integrity: sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==} - engines: {node: '>=18'} - cpu: [ia32] - os: [win32] - - '@esbuild/win32-ia32@0.25.4': - resolution: {integrity: sha512-i1sW+1i+oWvQzSgfRcxxG2k4I9n3O9NRqy8U+uugaT2Dy7kLO9Y7wI72haOahxceMX8hZAzgGou1FhndRldxRg==} - engines: {node: '>=18'} - cpu: [ia32] - os: [win32] - '@esbuild/win32-ia32@0.28.1': resolution: {integrity: sha512-zvb/mB2bSCoJOpoCBgYKKpX6YM6mJBlBUVUtVj41DlZJVEB6/0CKlRYxP5wWl1C1ILiCoAU5wZZ4q1P3qeS6Eg==} engines: {node: '>=18'} cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.25.12': - resolution: {integrity: sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==} - engines: {node: '>=18'} - cpu: [x64] - os: [win32] - - '@esbuild/win32-x64@0.25.4': - resolution: {integrity: sha512-nOT2vZNw6hJ+z43oP1SPea/G/6AbN6X+bGNhNuq8NtRHy4wsMhw765IKLNmnjek7GvjWBYQ8Q5VBoYTFg9y1UQ==} - engines: {node: '>=18'} - cpu: [x64] - os: [win32] - '@esbuild/win32-x64@0.28.1': resolution: {integrity: sha512-bm4Mowrv+GXMlpWX++EcXw/iLyd1o3+bJkC2DkWXYVvgZCqD/bSj9ctZeAMC3cIxgjRVR2Dufaiu4YPxr5gW1A==} engines: {node: '>=18'} @@ -1207,6 +899,19 @@ packages: resolution: {integrity: sha512-l2Ul9PrHsPCKcEY/ac7VgFj9D80C7S68sOKc618SyHDPK36s1XcFebXY0iTzUVn4Yq+YbwvSnDmCz9yxjX+QrA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/js@10.0.1': + resolution: {integrity: sha512-zeR9k5pd4gxjZ0abRoIaxdc7I3nDktoXZk2qOv9gCNWx3mVwEn32VRhyLaRsDiJjTs0xq/T8mfPtyuXu7GWBcA==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + peerDependencies: + eslint: ^10.0.0 + peerDependenciesMeta: + eslint: + optional: true + + '@eslint/js@9.39.4': + resolution: {integrity: sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/js@9.39.5': resolution: {integrity: sha512-QywQuszQh77pIXCsq998c8hbhSTI/azTty1Z6N53dmAudKHhy573j3yvRLsX2BSp8YpLtoCEG8E9DJe+8zUh4A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -1219,6 +924,15 @@ packages: resolution: {integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@exodus/bytes@1.15.1': + resolution: {integrity: sha512-S6mL0yNB/Abt9Ei4tq8gDhcczc4S3+vQ4ra7vxnAf+YHC02srtqxKKZghx2Dq6p0e66THKwR6r8N6P95wEty7Q==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + peerDependencies: + '@noble/hashes': ^1.8.0 || ^2.0.0 + peerDependenciesMeta: + '@noble/hashes': + optional: true + '@floating-ui/core@1.8.0': resolution: {integrity: sha512-0CIZ5itps/8x7BG8dEIhs53BvCUH2PCoogtakwRTut+Arm58sJooJ0AuZhLw2HJYIR5cMLNPBSS728sPho2khQ==} @@ -1234,6 +948,9 @@ packages: '@floating-ui/utils@0.2.12': resolution: {integrity: sha512-HpCo8tmWzLVad5s2d19EhAz5zqrrQ6s69qd6moPMQvkOuSwDT1YgRfWSVuc4ennqrgv3OHppiOGMQ7oC13yIww==} + '@fontsource-variable/space-grotesk@5.2.10': + resolution: {integrity: sha512-yJQO/o35/hAP3CFnpdFTwQku2yzJOae2HIpBmqkOVoxhhXJaQP3g+b6Jrz7u+eI7A5ZdCIf88uMWpBJdFiGr5w==} + '@fuma-translate/react@1.0.2': resolution: {integrity: sha512-uOiOtBx3nRXR8Nu1GzBf1tApgF1FErDBTHxRIAQeyQdyOoZbrNRN6H4kDCWObY4qyGeGbHydG0DHzgeUgFDMIw==} peerDependencies: @@ -1252,6 +969,20 @@ packages: tailwindcss: optional: true + '@hono/node-server@1.19.14': + resolution: {integrity: sha512-GwtvgtXxnWsucXvbQXkRgqksiH2Qed37H9xHZocE5sA3N8O8O8/8FA3uclQXxXVzc9XBZuEOMK7+r02FmSpHtw==} + engines: {node: '>=18.14.1'} + peerDependencies: + hono: ^4 + + '@hugeicons/core-free-icons@4.2.0': + resolution: {integrity: sha512-V1G/Ph9TbmEow+pKnupZRWQjdORR/TGGr3JVRZOWkomdJ/5N6GgLuKPgBDs7G0kZ0//9LL34AGOUzWe3K+umNA==} + + '@hugeicons/react@1.1.6': + resolution: {integrity: sha512-c2LhXJMAW5wN1pC/smBXG0YPqUON6ceR/ZdXHCjEI9KvB+hjtqYjmzIxok5hAQOeXGz0WtORgCQMzqewFKAZwg==} + peerDependencies: + react: '>=16.0.0' + '@humanfs/core@0.19.2': resolution: {integrity: sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==} engines: {node: '>=18.18.0'} @@ -1272,9 +1003,6 @@ packages: resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} engines: {node: '>=18.18'} - '@iarna/toml@2.2.5': - resolution: {integrity: sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==} - '@img/colour@1.1.0': resolution: {integrity: sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==} engines: {node: '>=18'} @@ -1586,16 +1314,43 @@ packages: cpu: [x64] os: [win32] - '@ioredis/commands@1.10.0': - resolution: {integrity: sha512-UmeW7z4LfctwoQ5wkhVzgq8tXkreED2xZGpX+Bg+zA+WJFZCT6c062AfCK/Dfk81xZnnwdhJCUMkitihRaoC2Q==} + '@inquirer/ansi@2.0.7': + resolution: {integrity: sha512-3eTuUO1vH2cZm2ZKHeQxnOqlTi9EfZDGgIe3BL3I4u+rJHocr9Fz86M4fjYABPvFnQG/gGK551HqDiIcETwU6Q==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} - '@isaacs/cliui@8.0.2': - resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} - engines: {node: '>=12'} + '@inquirer/confirm@6.1.1': + resolution: {integrity: sha512-eb8DBZcz/2qHWQda4rk2JiQk5h9QV/cVHi1yjt0f69WFZMRFn0sJTye3EAP8icut8UDMjQPsaH5KbcOogefrFQ==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true - '@isaacs/cliui@9.0.0': - resolution: {integrity: sha512-AokJm4tuBHillT+FpMtxQ60n8ObyXBatq7jD2/JA9dxbDDokKQm8KMht5ibGzLVU9IJDIKK4TPKgMHEYMn3lMg==} - engines: {node: '>=18'} + '@inquirer/core@11.2.1': + resolution: {integrity: sha512-Qd6GJT1yVyrZZCfN8W2qKF5ApmqryXRhRKCuip8h01x2w/esJQ2XIYc6f9abMIHgKQdBfFTSOdbHRLAhuM09UA==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/figures@2.0.7': + resolution: {integrity: sha512-aJ8TBPOGB6f/2qziPfElISTCEd5XOYTFckA2SGjhNmiKzfK/u4ot3v0DUzGVdUnKjN10EqnnEPck36BkyfLnJw==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} + + '@inquirer/type@4.0.7': + resolution: {integrity: sha512-t28inv14nMQ1PhKpsJPY+kEs/c00qzeCOS2gTNRyTjG5d6qsVA2fItxW4hkvGZ5lvanGLdtCzVIx5dwdRpN1+g==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@ioredis/commands@1.10.0': + resolution: {integrity: sha512-UmeW7z4LfctwoQ5wkhVzgq8tXkreED2xZGpX+Bg+zA+WJFZCT6c062AfCK/Dfk81xZnnwdhJCUMkitihRaoC2Q==} '@jridgewell/gen-mapping@0.3.13': resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} @@ -1679,6 +1434,16 @@ packages: '@mdx-js/mdx@3.1.1': resolution: {integrity: sha512-f6ZO2ifpwAQIpzGWaBQT2TXxPv6z3RBzQKpVftEWN78Vl/YweF1uwussDx8ECAXVtr3Rs89fKyG9YlzUs9DyGQ==} + '@modelcontextprotocol/sdk@1.29.0': + resolution: {integrity: sha512-zo37mZA9hJWpULgkRpowewez1y6ML5GsXJPY8FI0tBBCd77HEvza4jDqRKOXgHNn867PVGCyTdzqpz0izu5ZjQ==} + engines: {node: '>=18'} + peerDependencies: + '@cfworker/json-schema': ^4.1.1 + zod: ^3.25 || ^4.0 + peerDependenciesMeta: + '@cfworker/json-schema': + optional: true + '@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.4': resolution: {integrity: sha512-LCkGo6JDfaBhgST7UpPWgNgLINpcpabaHfyz5OBx75nUYxBsaEPxjnyNjWpeb/xBup/682QnBfRBy2/LvPutZQ==} cpu: [arm64] @@ -1709,6 +1474,10 @@ packages: cpu: [x64] os: [win32] + '@mswjs/interceptors@0.41.9': + resolution: {integrity: sha512-VVPPgHyQ6ShqnrmDWuxjmUIsO9gWyOZFmuOfLd9LfBGQJwZfy0gvv9pbHSJuoFNIYC7ZDX9aoFwowjcdSC4E8w==} + engines: {node: '>=18'} + '@napi-rs/wasm-runtime@1.1.6': resolution: {integrity: sha512-ZLv/JdUfkvOy9eCnnBaGfiO+XimbjebAeO+MRQqD/B+FR1tnRN0tpKSJHRbE8sFfS6aqsXZ67TQjfwfsxULVbg==} peerDependencies: @@ -1776,14 +1545,6 @@ packages: cpu: [x64] os: [win32] - '@noble/ciphers@1.3.0': - resolution: {integrity: sha512-2I0gnIVPtfnMw9ee9h1dJG7tp81+8Ob3OJb3Mv37rx5L40/b0i7djjCVvGOVqc9AEIQyvyu1i6ypKdFw8R8gQw==} - engines: {node: ^14.21.3 || >=16} - - '@noble/curves@1.9.7': - resolution: {integrity: sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw==} - engines: {node: ^14.21.3 || >=16} - '@noble/hashes@1.8.0': resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} engines: {node: ^14.21.3 || >=16} @@ -1791,18 +1552,6 @@ packages: '@nodable/entities@2.2.0': resolution: {integrity: sha512-9uGyhaQavEUMC8AIddIjau4NsnsXhou+j5sBAGojCM1oxmQpVKTWR/9JxABD6UAv12vpIms55fPZKFQEhG6uBg==} - '@node-minify/core@8.0.6': - resolution: {integrity: sha512-/vxN46ieWDLU67CmgbArEvOb41zlYFOkOtr9QW9CnTrBLuTyGgkyNWC2y5+khvRw3Br58p2B5ZVSx/PxCTru6g==} - engines: {node: '>=16.0.0'} - - '@node-minify/terser@8.0.6': - resolution: {integrity: sha512-grQ1ipham743ch2c3++C8Isk6toJnxJSyDiwUI/IWUCh4CZFD6aYVw6UAY40IpCnjrq5aXGwiv5OZJn6Pr0hvg==} - engines: {node: '>=16.0.0'} - - '@node-minify/utils@8.0.6': - resolution: {integrity: sha512-csY4qcR7jUwiZmkreNTJhcypQfts2aY2CK+a+rXgXUImZiZiySh0FvwHjRnlqWKvg+y6ae9lHFzDRjBTmqlTIQ==} - engines: {node: '>=16.0.0'} - '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -1819,90 +1568,46 @@ packages: resolution: {integrity: sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==} engines: {node: '>=12.4.0'} - '@octokit/auth-token@5.1.2': - resolution: {integrity: sha512-JcQDsBdg49Yky2w2ld20IHAlwr8d/d8N6NiOXbtuoPCqzbsiJgF633mVUw3x4mo0H5ypataQIX7SFu3yy44Mpw==} - engines: {node: '>= 18'} - '@octokit/auth-token@6.0.0': resolution: {integrity: sha512-P4YJBPdPSpWTQ1NU4XYdvHvXJJDxM6YwpS0FZHRgP7YFkdVxsWcpWGy/NVqlAA7PcPCnMacXlRm1y2PFZRWL/w==} engines: {node: '>= 20'} - '@octokit/core@6.1.6': - resolution: {integrity: sha512-kIU8SLQkYWGp3pVKiYzA5OSaNF5EE03P/R8zEmmrG6XwOg5oBjXyQVVIauQ0dgau4zYhpZEhJrvIYt6oM+zZZA==} - engines: {node: '>= 18'} - '@octokit/core@7.0.6': resolution: {integrity: sha512-DhGl4xMVFGVIyMwswXeyzdL4uXD5OGILGX5N8Y+f6W7LhC1Ze2poSNrkF/fedpVDHEEZ+PHFW0vL14I+mm8K3Q==} engines: {node: '>= 20'} - '@octokit/endpoint@10.1.4': - resolution: {integrity: sha512-OlYOlZIsfEVZm5HCSR8aSg02T2lbUWOsCQoPKfTXJwDzcHQBrVBGdGXb89dv2Kw2ToZaRtudp8O3ZIYoaOjKlA==} - engines: {node: '>= 18'} - '@octokit/endpoint@11.0.3': resolution: {integrity: sha512-FWFlNxghg4HrXkD3ifYbS/IdL/mDHjh9QcsNyhQjN8dplUoZbejsdpmuqdA76nxj2xoWPs7p8uX2SNr9rYu0Ag==} engines: {node: '>= 20'} - '@octokit/graphql@8.2.2': - resolution: {integrity: sha512-Yi8hcoqsrXGdt0yObxbebHXFOiUA+2v3n53epuOg1QUgOB6c4XzvisBNVXJSl8RYA5KrDuSL2yq9Qmqe5N0ryA==} - engines: {node: '>= 18'} - '@octokit/graphql@9.0.3': resolution: {integrity: sha512-grAEuupr/C1rALFnXTv6ZQhFuL1D8G5y8CN04RgrO4FIPMrtm+mcZzFG7dcBm+nq+1ppNixu+Jd78aeJOYxlGA==} engines: {node: '>= 20'} - '@octokit/openapi-types@24.2.0': - resolution: {integrity: sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg==} - - '@octokit/openapi-types@25.1.0': - resolution: {integrity: sha512-idsIggNXUKkk0+BExUn1dQ92sfysJrje03Q0bv0e+KPLrvyqZF8MnBpFz8UNfYDwB3Ie7Z0TByjWfzxt7vseaA==} - '@octokit/openapi-types@27.0.0': resolution: {integrity: sha512-whrdktVs1h6gtR+09+QsNk2+FO+49j6ga1c55YZudfEG+oKJVvJLQi3zkOm5JjiUXAagWK2tI2kTGKJ2Ys7MGA==} '@octokit/openapi-webhooks-types@12.1.0': resolution: {integrity: sha512-WiuzhOsiOvb7W3Pvmhf8d2C6qaLHXrWiLBP4nJ/4kydu+wpagV5Fkz9RfQwV2afYzv3PB+3xYgp4mAdNGjDprA==} - '@octokit/plugin-paginate-rest@11.6.0': - resolution: {integrity: sha512-n5KPteiF7pWKgBIBJSk8qzoZWcUkza2O6A0za97pMGVrGfPdltxrfmfF5GucHYvHGZD8BdaZmmHGz5cX/3gdpw==} - engines: {node: '>= 18'} - peerDependencies: - '@octokit/core': '>=6' - '@octokit/plugin-paginate-rest@14.0.0': resolution: {integrity: sha512-fNVRE7ufJiAA3XUrha2omTA39M6IXIc6GIZLvlbsm8QOQCYvpq/LkMNGyFlB1d8hTDzsAXa3OKtybdMAYsV/fw==} engines: {node: '>= 20'} peerDependencies: '@octokit/core': '>=6' - '@octokit/plugin-request-log@5.3.1': - resolution: {integrity: sha512-n/lNeCtq+9ofhC15xzmJCNKP2BWTv8Ih2TTy+jatNCCq/gQP/V7rK3fjIfuz0pDWDALO/o/4QY4hyOF6TQQFUw==} - engines: {node: '>= 18'} - peerDependencies: - '@octokit/core': '>=6' - '@octokit/plugin-request-log@6.0.0': resolution: {integrity: sha512-UkOzeEN3W91/eBq9sPZNQ7sUBvYCqYbrrD8gTbBuGtHEuycE4/awMXcYvx6sVYo7LypPhmQwwpUe4Yyu4QZN5Q==} engines: {node: '>= 20'} peerDependencies: '@octokit/core': '>=6' - '@octokit/plugin-rest-endpoint-methods@13.5.0': - resolution: {integrity: sha512-9Pas60Iv9ejO3WlAX3maE1+38c5nqbJXV5GrncEfkndIpZrJ/WPMRd2xYDcPPEt5yzpxcjw9fWNoPhsSGzqKqw==} - engines: {node: '>= 18'} - peerDependencies: - '@octokit/core': '>=6' - '@octokit/plugin-rest-endpoint-methods@17.0.0': resolution: {integrity: sha512-B5yCyIlOJFPqUUeiD0cnBJwWJO8lkJs5d8+ze9QDP6SvfiXSz1BF+91+0MeI1d2yxgOhU/O+CvtiZ9jSkHhFAw==} engines: {node: '>= 20'} peerDependencies: '@octokit/core': '>=6' - '@octokit/request-error@6.1.8': - resolution: {integrity: sha512-WEi/R0Jmq+IJKydWlKDmryPcmdYSVjL3ekaiEL1L9eo1sUnqMJ+grqmC9cjk7CA7+b2/T397tO5d8YLOH3qYpQ==} - engines: {node: '>= 18'} - '@octokit/request-error@7.1.0': resolution: {integrity: sha512-KMQIfq5sOPpkQYajXHwnhjCC0slzCNScLHs9JafXc4RAJI+9f+jNDlBNaIMTvazOPLgb4BnlhGJOTbnN0wIjPw==} engines: {node: '>= 20'} @@ -1911,24 +1616,10 @@ packages: resolution: {integrity: sha512-+s7HUxjfFqOMS9VlIwDffq0MikjSAK0gSpG73W+meAvVAvX4MBrHYTK5Bj3Uot55qFT4gzUtfzE4mGWY4Br8/Q==} engines: {node: '>= 20'} - '@octokit/request@9.2.4': - resolution: {integrity: sha512-q8ybdytBmxa6KogWlNa818r0k1wlqzNC+yNkcQDECHvQo8Vmstrg18JwqJHdJdUiHD2sjlwBgSm9kHkOKe2iyA==} - engines: {node: '>= 18'} - - '@octokit/rest@21.1.1': - resolution: {integrity: sha512-sTQV7va0IUVZcntzy1q3QqPm/r8rWtDCqpRAmb8eXXnKkjoQEtFe3Nt5GTVsHft+R6jJoHeSiVLcgcvhtue/rg==} - engines: {node: '>= 18'} - '@octokit/rest@22.0.1': resolution: {integrity: sha512-Jzbhzl3CEexhnivb1iQ0KJ7s5vvjMWcmRtq5aUsKmKDrRW6z3r84ngmiFKFvpZjpiU/9/S6ITPFRpn5s/3uQJw==} engines: {node: '>= 20'} - '@octokit/types@13.10.0': - resolution: {integrity: sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA==} - - '@octokit/types@14.1.0': - resolution: {integrity: sha512-1y6DgTy8Jomcpu33N+p5w58l6xyt55Ar2I91RPiIA0xCJBXyUAhXCcmZaDWSANiha7R9a6qJJ2CRomGPZ6f46g==} - '@octokit/types@16.0.0': resolution: {integrity: sha512-sKq+9r1Mm4efXW1FCk7hFSeJo4QKreL/tTbR0rz/qx/r1Oa2VV83LTA/H/MuCOX7uCIJmQVRKBcbmWoySjAnSg==} @@ -1940,37 +1631,177 @@ packages: resolution: {integrity: sha512-da6KbdNCV5sr1/txD896V+6W0iamFWrvVl8cHkBSPT+YlvmT3DwXa4jxZnQc+gnuTEqSWbBeoSZYTayXH9wXcw==} engines: {node: '>= 20'} - '@opennextjs/aws@4.0.2': - resolution: {integrity: sha512-nXQPT8GZDV+NWMJV9mD/Ywxyo+tCZfFvrR6jpEOYNcxK/AqiEDlJzPybGOrHUDWAYdR1b6tmh+MoR3VbqIao3w==} - hasBin: true - peerDependencies: - next: '>=15.5.18 <16 || >=16.2.6' + '@oozcitak/dom@2.0.2': + resolution: {integrity: sha512-GjpKhkSYC3Mj4+lfwEyI1dqnsKTgwGy48ytZEhm4A/xnH/8z9M3ZVXKr/YGQi3uCLs1AEBS+x5T2JPiueEDW8w==} + engines: {node: '>=20.0'} - '@opennextjs/cloudflare@1.20.1': - resolution: {integrity: sha512-T7yRoEmIdDQada0itRQmQ3cb9o9tWVg1193MviPWRX7XJulOQ6adz45ZgrJuzEPiwi+kMGnj9kozlNBlRNQZcw==} - hasBin: true - peerDependencies: - next: '>=15.5.18 <16 || >=16.2.6' - rclone.js: ^0.6.6 - wrangler: ^4.86.0 - peerDependenciesMeta: - rclone.js: - optional: true + '@oozcitak/infra@2.0.2': + resolution: {integrity: sha512-2g+E7hoE2dgCz/APPOEK5s3rMhJvNxSMBrP+U+j1OWsIbtSpWxxlUjq1lU8RIsFJNYv7NMlnVsCuHcUzJW+8vA==} + engines: {node: '>=20.0'} + + '@oozcitak/url@3.0.0': + resolution: {integrity: sha512-ZKfET8Ak1wsLAiLWNfFkZc/BraDccuTJKR6svTYc7sVjbR+Iu0vtXdiDMY4o6jaFl5TW2TlS7jbLl4VovtAJWQ==} + engines: {node: '>=20.0'} + + '@oozcitak/util@10.0.0': + resolution: {integrity: sha512-hAX0pT/73190NLqBPPWSdBVGtbY6VOhWYK3qqHqtXQ1gK7kS2yz4+ivsN07hpJ6I3aeMtKP6J6npsEKOAzuTLA==} + engines: {node: '>=20.0'} + + '@open-draft/deferred-promise@2.2.0': + resolution: {integrity: sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA==} + + '@open-draft/deferred-promise@3.0.0': + resolution: {integrity: sha512-XW375UK8/9SqUVNVa6M0yEy8+iTi4QN5VZ7aZuRFQmy76LRwI9wy5F4YIBU6T+eTe2/DNDo8tqu8RHlwLHM6RA==} + + '@open-draft/logger@0.3.0': + resolution: {integrity: sha512-X2g45fzhxH238HKO4xbSr7+wBS8Fvw6ixhTDuvLd5mqh6bJJCFAPwU9mPDxbcrRtfxv4u5IHCEH77BmxvXmmxQ==} + + '@open-draft/until@2.1.0': + resolution: {integrity: sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==} '@orama/orama@3.1.18': resolution: {integrity: sha512-a61ljmRVVyG5MC/698C8/FfFDw5a8LOIvyOLW5fztgUXqUpc1jOfQzOitSCbge657OgXXThmY3Tk8fpiDb4UcA==} engines: {node: '>= 20.0.0'} + '@oxc-parser/binding-android-arm-eabi@0.120.0': + resolution: {integrity: sha512-WU3qtINx802wOl8RxAF1v0VvmC2O4D9M8Sv486nLeQ7iPHVmncYZrtBhB4SYyX+XZxj2PNnCcN+PW21jHgiOxg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [android] + + '@oxc-parser/binding-android-arm64@0.120.0': + resolution: {integrity: sha512-SEf80EHdhlbjZEgzeWm0ZA/br4GKMenDW3QB/gtyeTV1gStvvZeFi40ioHDZvds2m4Z9J1bUAUL8yn1/+A6iGg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@oxc-parser/binding-darwin-arm64@0.120.0': + resolution: {integrity: sha512-xVrrbCai8R8CUIBu3CjryutQnEYhZqs1maIqDvtUCFZb8vY33H7uh9mHpL3a0JBIKoBUKjPH8+rzyAeXnS2d6A==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@oxc-parser/binding-darwin-x64@0.120.0': + resolution: {integrity: sha512-xyHBbnJ6mydnQUH7MAcafOkkrNzQC6T+LXgDH/3InEq2BWl/g424IMRiJVSpVqGjB+p2bd0h0WRR8iIwzjU7rw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@oxc-parser/binding-freebsd-x64@0.120.0': + resolution: {integrity: sha512-UMnVRllquXUYTeNfFKmxTTEdZ/ix1nLl0ducDzMSREoWYGVIHnOOxoKMWlCOvRr9Wk/HZqo2rh1jeumbPGPV9A==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@oxc-parser/binding-linux-arm-gnueabihf@0.120.0': + resolution: {integrity: sha512-tkvn2CQ7QdcsMnpfiX3fd3wA3EFsWKYlcQzq9cFw/xc89Al7W6Y4O0FgLVkVQpo0Tnq/qtE1XfkJOnRRA9S/NA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxc-parser/binding-linux-arm-musleabihf@0.120.0': + resolution: {integrity: sha512-WN5y135Ic42gQDk9grbwY9++fDhqf8knN6fnP+0WALlAUh4odY/BDK1nfTJRSfpJD9P3r1BwU0m3pW2DU89whQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxc-parser/binding-linux-arm64-gnu@0.120.0': + resolution: {integrity: sha512-1GgQBCcXvFMw99EPdMy+4NZ3aYyXsxjf9kbUUg8HuAy3ZBXzOry5KfFEzT9nqmgZI1cuetvApkiJBZLAPo8uaw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@oxc-parser/binding-linux-arm64-musl@0.120.0': + resolution: {integrity: sha512-gmMQ70gsPdDBgpcErvJEoWNBr7bJooSLlvOBVBSGfOzlP5NvJ3bFvnUeZZ9d+dPrqSngtonf7nyzWUTUj/U+lw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@oxc-parser/binding-linux-ppc64-gnu@0.120.0': + resolution: {integrity: sha512-T/kZuU0ajop0xhzVMwH5r3srC9Nqup5HaIo+3uFjIN5uPxa0LvSxC1ZqP4aQGJVW5G0z8/nCkjIfSMS91P/wzw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@oxc-parser/binding-linux-riscv64-gnu@0.120.0': + resolution: {integrity: sha512-vn21KXLAXzaI3N5CZWlBr1iWeXLl9QFIMor7S1hUjUGTeUuWCoE6JZB040/ZNDwf+JXPX8Ao9KbmJq9FMC2iGw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@oxc-parser/binding-linux-riscv64-musl@0.120.0': + resolution: {integrity: sha512-SUbUxlar007LTGmSLGIC5x/WJvwhdX+PwNzFJ9f/nOzZOrCFbOT4ikt7pJIRg1tXVsEfzk5mWpGO1NFiSs4PIw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + libc: [musl] + + '@oxc-parser/binding-linux-s390x-gnu@0.120.0': + resolution: {integrity: sha512-hYiPJTxyfJY2+lMBFk3p2bo0R9GN+TtpPFlRqVchL1qvLG+pznstramHNvJlw9AjaoRUHwp9IKR7UZQnRPGjgQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@oxc-parser/binding-linux-x64-gnu@0.120.0': + resolution: {integrity: sha512-q+5jSVZkprJCIy3dzJpApat0InJaoxQLsJuD6DkX8hrUS61z2lHQ1Fe9L2+TYbKHXCLWbL0zXe7ovkIdopBGMQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@oxc-parser/binding-linux-x64-musl@0.120.0': + resolution: {integrity: sha512-D9QDDZNnH24e7X4ftSa6ar/2hCavETfW3uk0zgcMIrZNy459O5deTbWrjGzZiVrSWigGtlQwzs2McBP0QsfV1w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [musl] + + '@oxc-parser/binding-openharmony-arm64@0.120.0': + resolution: {integrity: sha512-TBU8ZwOUWAOUWVfmI16CYWbvh4uQb9zHnGBHsw5Cp2JUVG044OIY1CSHODLifqzQIMTXvDvLzcL89GGdUIqNrA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@oxc-parser/binding-wasm32-wasi@0.120.0': + resolution: {integrity: sha512-WG/FOZgDJCpJnuF3ToG/K28rcOmSY7FmFmfBKYb2fmLyhDzPpUldFGV7/Fz4ru0Iz/v4KPmf8xVgO8N3lO4KHA==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + + '@oxc-parser/binding-win32-arm64-msvc@0.120.0': + resolution: {integrity: sha512-1T0HKGcsz/BKo77t7+89L8Qvu4f9DoleKWHp3C5sJEcbCjDOLx3m9m722bWZTY+hANlUEs+yjlK+lBFsA+vrVQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@oxc-parser/binding-win32-ia32-msvc@0.120.0': + resolution: {integrity: sha512-L7vfLzbOXsjBXV0rv/6Y3Jd9BRjPeCivINZAqrSyAOZN3moCopDN+Psq9ZrGNZtJzP8946MtlRFZ0Als0wBCOw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ia32] + os: [win32] + + '@oxc-parser/binding-win32-x64-msvc@0.120.0': + resolution: {integrity: sha512-ys+upfqNtSu58huAhJMBKl3XCkGzyVFBlMlGPzHeFKgpFF/OdgNs1MMf8oaJIbgMH8ZxgGF7qfue39eJohmKIg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + + '@oxc-project/types@0.120.0': + resolution: {integrity: sha512-k1YNu55DuvAip/MGE1FTsIuU3FUCn6v/ujG9V7Nq5Df/kX2CWb13hhwD0lmJGMGqE+bE1MXvv9SZVnMzEXlWcg==} + '@oxc-project/types@0.130.0': resolution: {integrity: sha512-ibD2usx9JRu7f5pu2tMKMI4cpA4NgXJQoYRP4pQ7Pxmn1l6k/53qWtQWZayhYy3X4QZkt90Ot+mJEaeXouio6Q==} + '@oxc-project/types@0.133.0': + resolution: {integrity: sha512-KzkdCd6Uxqnf6l3HOw1xfatAlUURA0g14cvBYFyJ5SaNOQbOUvBr9PKArcPcrNIeRsBdgcUzOGrhKveVpvOIGA==} + '@oxc-project/types@0.139.0': resolution: {integrity: sha512-r9gHphtCs+1M7J0pw6Sn/hh/Wpa/iQrOOkrNAlVLF/gHq+/CJmHIWKKUUhdWjcD6CIa8idarspCsASiXCXvFUw==} - '@pkgjs/parseargs@0.11.0': - resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} - engines: {node: '>=14'} - '@poppinss/colors@4.1.6': resolution: {integrity: sha512-H9xkIdFswbS8n1d6vmRd8+c10t2Qe+rZITbbDHHkQixH5+2x1FDGmi/0K+WgWiqQFKPSlIYB7jlH6Kpfn6Fleg==} @@ -2342,6 +2173,12 @@ packages: cpu: [arm64] os: [android] + '@rolldown/binding-android-arm64@1.0.3': + resolution: {integrity: sha512-454rs7jHngixp/NMxd5srYD57OnzSlZ/eFTETjORQHLwJG1lRtmNOJcBerZlfu4GjKqeq8aCCIQrMdHyhI51Hw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + '@rolldown/binding-android-arm64@1.1.5': resolution: {integrity: sha512-lZg8fqIv2v7FF237bwMgzGZEJvGL79/s5knJ/i6FmsGF4XXlzccZ4jb+TrFIxtSSxFtIpdsgrPZeMk1I9AFcyQ==} engines: {node: ^20.19.0 || >=22.12.0} @@ -2354,6 +2191,12 @@ packages: cpu: [arm64] os: [darwin] + '@rolldown/binding-darwin-arm64@1.0.3': + resolution: {integrity: sha512-PcAhP+ynjURNyy8SKGl5DQP94aGuB/7JrXJb/t7P+hanXvQVMWzUvRRhBAcg/lNRadBhoUPqSoP4xw5tR/KBEA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + '@rolldown/binding-darwin-arm64@1.1.5': resolution: {integrity: sha512-51Bnx9pNiMRKSUNtBfySkNJ9vMU9Hh3I1ozDd6gyPPYzaXCfnptUcEZxXGYFn+ul2dtcMUiqGR1Yai2K10uoTw==} engines: {node: ^20.19.0 || >=22.12.0} @@ -2366,6 +2209,12 @@ packages: cpu: [x64] os: [darwin] + '@rolldown/binding-darwin-x64@1.0.3': + resolution: {integrity: sha512-9YpfeUvSE2RS7wysJ81uOZkXJz7f7Q55H2Gvp3VEw/EsahqDtrphrZ0EwDLK5vvKOzaCrBsjF8JmnMLcUt78Gg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + '@rolldown/binding-darwin-x64@1.1.5': resolution: {integrity: sha512-Tm+gbfC0aHu1tBA/JvKQh32S0K6YgCHkiAF4/W6xX0K0RmNuc94VeK419dJoE65R5aRxmo+noZQSWrAMF6yb6g==} engines: {node: ^20.19.0 || >=22.12.0} @@ -2378,6 +2227,12 @@ packages: cpu: [x64] os: [freebsd] + '@rolldown/binding-freebsd-x64@1.0.3': + resolution: {integrity: sha512-yB1IlAsSNHncV6SCTL27/MVGR5htvQsoGxIv5KMGXALp+Ll1wYsn+x98M9MW7qa+NdSbvrrY7ANI4wLJ0n1e6g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + '@rolldown/binding-freebsd-x64@1.1.5': resolution: {integrity: sha512-JMzDKCCXq93YccG5gz3hvOs1oXRKAf0XYpfOS88e+wZrC8Iugj6j68867vrYZkvpDDpKn/KoKORThmchMpF6TA==} engines: {node: ^20.19.0 || >=22.12.0} @@ -2390,6 +2245,12 @@ packages: cpu: [arm] os: [linux] + '@rolldown/binding-linux-arm-gnueabihf@1.0.3': + resolution: {integrity: sha512-Yi30IVAAfLUCy2MseFjbB1jAMDl1VMCAas5StnYp8da9+CKvMd2H2cbEjWcw5NPaPqzvYkVIaF1nNUG+b7u/sw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + '@rolldown/binding-linux-arm-gnueabihf@1.1.5': resolution: {integrity: sha512-uML21j2K5TfPGutKxub+M+nLjZIrWjXQ5Grx4lCe/nimTj9B4L63zHpjXLl4y0L3mcm2htEQIb06oCG/szerNw==} engines: {node: ^20.19.0 || >=22.12.0} @@ -2403,6 +2264,13 @@ packages: os: [linux] libc: [glibc] + '@rolldown/binding-linux-arm64-gnu@1.0.3': + resolution: {integrity: sha512-jsO7R8To+AdlYgUmN5sHSCZbfhtMBkO0WUx8iORQnPcMMdgr7qM2DQmMwgabs3GhNztdmoKkMKQFHD6DTMCIQw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [glibc] + '@rolldown/binding-linux-arm64-gnu@1.1.5': resolution: {integrity: sha512-navSiuTMogvnQoZoM/v+l3ZWo50/NTwSHSzheABx/RCnmUPaKwq9qSo4Br2OYRs21+Fz8uFqITZM3H4opOB0/Q==} engines: {node: ^20.19.0 || >=22.12.0} @@ -2417,6 +2285,13 @@ packages: os: [linux] libc: [musl] + '@rolldown/binding-linux-arm64-musl@1.0.3': + resolution: {integrity: sha512-VWkUHwWriDciit80wleYwKILoR/KMvxh/IdwS/paX+ZgpuRpCrKLUdadJbc0NpBEiyhpYawsJ73j9aCvOH+f7Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [musl] + '@rolldown/binding-linux-arm64-musl@1.1.5': resolution: {integrity: sha512-lAryqH7IteztmCXQXk0etKj4wBQ7Gx5S6LjKhsgp9zb8I5bsuvU/2llH1hDQcjsFeqIsovMVN339/8pUDDBXxA==} engines: {node: ^20.19.0 || >=22.12.0} @@ -2431,6 +2306,13 @@ packages: os: [linux] libc: [glibc] + '@rolldown/binding-linux-ppc64-gnu@1.0.3': + resolution: {integrity: sha512-5f1laC0SlIR0yDbFCd8acUhvJIag6N3zC5P7oUPN6wX0aOma+uKJ0wBDH5aq7I1PVI2ttTlhJwzwRIBnLiSGEg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + libc: [glibc] + '@rolldown/binding-linux-ppc64-gnu@1.1.5': resolution: {integrity: sha512-fsK/sNBnxzBlL4O1JNrZakVQxPspqpED5dLtNsZS9oOKmtSpdNIzxH2kkol5HYTWJN47sE20ztMJPxfZ89qGOg==} engines: {node: ^20.19.0 || >=22.12.0} @@ -2445,6 +2327,13 @@ packages: os: [linux] libc: [glibc] + '@rolldown/binding-linux-s390x-gnu@1.0.3': + resolution: {integrity: sha512-Iq4ko0r4XsgbrF/LunNgHtAGLRRVE2kXonAXQ/MV0mC6jQpMOhW1SvtZja2EhC/kd05++bP78dsqBeIQyYJ6Yg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + libc: [glibc] + '@rolldown/binding-linux-s390x-gnu@1.1.5': resolution: {integrity: sha512-gLYb4BIadlfTOYT5gO503n8zQjXflgzpD0FcyKh0Mzx3rqCZKnHoJWV9xe1KXUJ5lx2JfcSHr/mhzS0PC/McAA==} engines: {node: ^20.19.0 || >=22.12.0} @@ -2459,6 +2348,13 @@ packages: os: [linux] libc: [glibc] + '@rolldown/binding-linux-x64-gnu@1.0.3': + resolution: {integrity: sha512-B8m6tD5+/N5FeNQFbKlLA/2yVq9ycQP1SeedyEYYKWBNR3ZQbkvIUcNnDNM03lO1l5F2roiiFJGgvoLLyZXtSg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [glibc] + '@rolldown/binding-linux-x64-gnu@1.1.5': resolution: {integrity: sha512-FjcpEKUyJygHgs1o50VYNvkt5+7Le/VEdYt0AkRpkL33MnyQfwr8l5mXwMmfmTbyMPr5vJLC+8/Gd9gXnwU1QQ==} engines: {node: ^20.19.0 || >=22.12.0} @@ -2473,6 +2369,13 @@ packages: os: [linux] libc: [musl] + '@rolldown/binding-linux-x64-musl@1.0.3': + resolution: {integrity: sha512-pSdpdUJHkuCxun9LE7jvgUB9qsRgaiyNNCX7m/AvHTcq67AiT/Yhoxvw5zPfhrM8k/BfP8ce/hMOpthKDpEUow==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [musl] + '@rolldown/binding-linux-x64-musl@1.1.5': resolution: {integrity: sha512-Me+PfPI2TMeOQk0gYWfLQZtTktrmzbr8cDboqX83XKc7UrgAi55gF+2dUkWdxd19n55Essp2yeca+O9N5rBxHg==} engines: {node: ^20.19.0 || >=22.12.0} @@ -2486,6 +2389,12 @@ packages: cpu: [arm64] os: [openharmony] + '@rolldown/binding-openharmony-arm64@1.0.3': + resolution: {integrity: sha512-OXXS3RKJgX2uLwM+gYyuH5omcH8fL1LJs96pZGgtetVCahON57+d4SJHzTgZiOjxgGkSnpXpOsWuPDGAKAigEg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + '@rolldown/binding-openharmony-arm64@1.1.5': resolution: {integrity: sha512-yc5WrLzXks6zCQfn9Oxr8pORKyl/pF+QjHmW/Qx3qu0oyrrNC+y2JLTU1E2rcWYAmzlnqngWXHQjy51VzW70Vw==} engines: {node: ^20.19.0 || >=22.12.0} @@ -2497,6 +2406,11 @@ packages: engines: {node: ^20.19.0 || >=22.12.0} cpu: [wasm32] + '@rolldown/binding-wasm32-wasi@1.0.3': + resolution: {integrity: sha512-JTtb8BWFynicNSoPrehsCzBtOKjZ6jhMiPFEmOiuXg1Fl8dn2KHQob+GuPSGR0dryQa1PQJbzjF3dqO/whhjLg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [wasm32] + '@rolldown/binding-wasm32-wasi@1.1.5': resolution: {integrity: sha512-VbQGPX2b4r48TAMIM2cjgluIM1HYutm4pcTEJsle7iEP7sB1dFqtPLBVbdLAZCxy1txCcPxf4QFf4v8uvltPqA==} engines: {node: ^20.19.0 || >=22.12.0} @@ -2508,6 +2422,12 @@ packages: cpu: [arm64] os: [win32] + '@rolldown/binding-win32-arm64-msvc@1.0.3': + resolution: {integrity: sha512-gEdFFEN70A/jxb2svrWsN3aDL7OUtmvlOy+6fa2jxG8K0wQ1ZbdeLGnidov6Yu5/733dI5ySfzFlQ/cb0bSz1g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + '@rolldown/binding-win32-arm64-msvc@1.1.5': resolution: {integrity: sha512-gHv82k63z4qpV5+Q1y/12KrK0ltWBukVDI8nZcbT7Tt/ZlOIVwppazneq0F93oDxTo3IgAMEDIoQh3E2n6mVsw==} engines: {node: ^20.19.0 || >=22.12.0} @@ -2520,6 +2440,12 @@ packages: cpu: [x64] os: [win32] + '@rolldown/binding-win32-x64-msvc@1.0.3': + resolution: {integrity: sha512-eXB7CHuaQdqmJcc3koCNtNPmT/bj2gc999kUFgBxG8Ac0NdgXc4rkCHhqrgrhN3zddvvvrgzj1e90SuSfmyIXA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + '@rolldown/binding-win32-x64-msvc@1.1.5': resolution: {integrity: sha512-tTZuDBPw85tEN5PQi1pnEBzDy0Z49HtScLAbD5t6hyeU92A95pRWaSMw1GZZi/RwgSgUIl0xrSlXIT/9QzvYSA==} engines: {node: ^20.19.0 || >=22.12.0} @@ -2529,12 +2455,6 @@ packages: '@rolldown/pluginutils@1.0.1': resolution: {integrity: sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==} - '@rollup/rollup-linux-x64-gnu@4.62.2': - resolution: {integrity: sha512-5BqxR/pshjey51iliyzTD5Xi3EN0aLmQ2lZ3lvefVV9c82BvrLo2/6OT55iifpWBufs6kdwWbuOKS841DrmK9A==} - cpu: [x64] - os: [linux] - libc: [glibc] - '@rtsao/scc@1.1.0': resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} @@ -2580,10 +2500,6 @@ packages: resolution: {integrity: sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==} engines: {node: '>=18'} - '@smithy/config-resolver@4.6.9': - resolution: {integrity: sha512-lcnI5sHTIfvk5k8nxkQTCpNzyYrXQBIoo68oWYrlZ4Df/HT07y6J5HRZj7sPr9wF101uo51158NbqzQeLFfo5g==} - engines: {node: '>=18.0.0'} - '@smithy/core@3.29.4': resolution: {integrity: sha512-G1GRglAabzEhqghJMBAd54FkRS7SAFGHEwbhcI9r+O+LIMuFsLyXkLZkCoFSgAglRu8s/URVXJB0hglq3ZipIg==} engines: {node: '>=18.0.0'} @@ -2592,66 +2508,14 @@ packages: resolution: {integrity: sha512-UEMLOoA0Fl4uYBxh6l0uN0H6EJe/A89OGeDNTteQeXpJ20BcpfIr4wlCY9pel1jEAUHAxaYwuqrYlrKdXE1GKQ==} engines: {node: '>=18.0.0'} - '@smithy/eventstream-serde-browser@4.4.9': - resolution: {integrity: sha512-etnQKvdV0d3GN1yT6b5ryZtpNJqiH+a4eXYA5okRMDvqLl1pZ/zoQ1sAStHv1fDsvawWI1580+sXp6i5evPdGg==} - engines: {node: '>=18.0.0'} - - '@smithy/eventstream-serde-config-resolver@4.5.9': - resolution: {integrity: sha512-tIgvaIsek4oHnQmy6RIqAUZoWbPMLY9Tmmv9ayeK19Z+UX7JRBUHb6SRxlVFCKJoOTkro9Sk9kUwsV3W8SST7w==} - engines: {node: '>=18.0.0'} - - '@smithy/eventstream-serde-node@4.4.9': - resolution: {integrity: sha512-kND6f56O7L+0KaWEAWxIOyC1xIb+CSjJAqWzK64Q4UktkjYODd5O9Fg7nDhh7Z12vzElz/Azh6n5mDbdqtBeng==} - engines: {node: '>=18.0.0'} - '@smithy/fetch-http-handler@5.6.4': resolution: {integrity: sha512-psnst7NZWdAEvJvyW8YZEE7xNVMyLrQFfHtyrVFrxNyy+dKWkQ+rqC6oI5ZhxThpUy9RSfEshgm34zqbOxzsRw==} engines: {node: '>=18.0.0'} - '@smithy/hash-blob-browser@4.4.9': - resolution: {integrity: sha512-LKotKElm4oxX27iQ4HeNKZUETe0UC6g7GDN/WY0EJIsF066v+45N4CGIaiF2U9eZLBINy+HI7DVW/rI/oAAgoA==} - engines: {node: '>=18.0.0'} - - '@smithy/hash-node@4.4.9': - resolution: {integrity: sha512-75tzSJxMk1ypSzG4mk6JxM/5uMHha8aG4rW3E24VNyheI6oYDs+uUBGVGMbLTGaLZ2znvb/1zDgbL9q8HxKv+w==} - engines: {node: '>=18.0.0'} - - '@smithy/hash-stream-node@4.4.9': - resolution: {integrity: sha512-0PC5brxUaAEU2jGi8ICiGV1YY3a6Sk8Tjz4S7CUXpKv5UY7UfNO1+irqzz4mZ/ao8jsc0BDfkpgsfTr6mnJayA==} - engines: {node: '>=18.0.0'} - - '@smithy/invalid-dependency@4.4.9': - resolution: {integrity: sha512-TvR10A7r6R2myMKLsOigBP/IRX4h2gITkpUI08q9kjdBKOiuMoSa+9UMF8MF24NdL+gX4d5QxAfmOKsNN4vPUw==} - engines: {node: '>=18.0.0'} - '@smithy/is-array-buffer@2.2.0': resolution: {integrity: sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==} engines: {node: '>=14.0.0'} - '@smithy/md5-js@4.4.9': - resolution: {integrity: sha512-Va+kC4Y6odM2NBnfZBbL3XYwX2ih7Dnvq3Rmdv8OxCrjteh1kDQOgTj8wzmOs4E1DqQ5OhPjqvdc9mEo4471KA==} - engines: {node: '>=18.0.0'} - - '@smithy/middleware-content-length@4.4.9': - resolution: {integrity: sha512-xh2Pzcqo/FxrjQwXiB7CfPHw5mXu+7X/5RvlO4PBgW7761Cgv3tq4SA4R8TeVDypqSJU4VaR2WK50XaYBcVcVQ==} - engines: {node: '>=18.0.0'} - - '@smithy/middleware-endpoint@4.6.9': - resolution: {integrity: sha512-XHmOEMv6WFn7Q0Zpf+EuBvAgWLj7AbTxcut/R43EUYrfS0ErwLolUohAtMAgAmlmbXxFma9KAJPX2gwACKBdbg==} - engines: {node: '>=18.0.0'} - - '@smithy/middleware-retry@4.7.9': - resolution: {integrity: sha512-gVM/o0Mttd4j1N1PSw2qv6fbPevCBP1iJ2Wfeee6yoAoiCIgYAMlcj2OMFCRpCPowWkTPHIyIsKFwhf/o6OziA==} - engines: {node: '>=18.0.0'} - - '@smithy/middleware-serde@4.4.9': - resolution: {integrity: sha512-ENGPrAvYE2EV31pRtdrQWEZB7Y+MPJwyTBmAwduB99yLjobnjse6+kMWbGt2NG0Mkl1+86VyESDy4HdaEKNaTQ==} - engines: {node: '>=18.0.0'} - - '@smithy/middleware-stack@4.4.9': - resolution: {integrity: sha512-ZaCOlOGnTxZVqemJ0BtCY/EYKadTlxMvkH/uUk++64bRqt+ZHE99tS2BJlPduu0vi8GCffiJHjgkXueM5+77Rg==} - engines: {node: '>=18.0.0'} - '@smithy/node-config-provider@4.5.7': resolution: {integrity: sha512-GI0bRl40tgc3FG+U8HcIDH/rx+oKhL2Kk/WoO9zciip17lR5cv1ETLc+B708bep8UNDSuxx0L5eg76Kd637vCA==} engines: {node: '>=18.0.0'} @@ -2660,10 +2524,6 @@ packages: resolution: {integrity: sha512-BNTop/fSOptmoVk8g+efwHCofFh37g70OWGAFES1TeAAJja1K5aAI8rTE26ETSc5k8IQuWY2kAIoPla01NgYrA==} engines: {node: '>=18.0.0'} - '@smithy/protocol-http@5.5.9': - resolution: {integrity: sha512-2tHlXQPzkTi0vXTyy2iWU1Lw60mIhUrS3heDO0bHJ4EvUH+RQlBuxiSqUWc34mRBpq3OgRPla89nNgqcTrX/vg==} - engines: {node: '>=18.0.0'} - '@smithy/shared-ini-file-loader@4.6.9': resolution: {integrity: sha512-+4XQ4XVbcMJmg9KW/M5TDQXtSXHrmImtLj4FlMxtbcZBzcsLmVGxJO/RQjk9fbuvMjyCsIxrqAD5OalfGz4G9w==} engines: {node: '>=18.0.0'} @@ -2672,73 +2532,51 @@ packages: resolution: {integrity: sha512-MO5VEhwVl0BN7xVoVeNrZfiUFoQtqxUbgl6/RwOTlMMxCSjblG8twSrVTwz3J4w9WZxd2rBfBAUXjH77agspBg==} engines: {node: '>=18.0.0'} - '@smithy/smithy-client@4.14.9': - resolution: {integrity: sha512-qXDg5ioWU4b5xhEyKFJ863Yr/1i40pxaSLKNEI0YFnAgtGdyIqG6eiAnojiV0r/pNNioBvKBtUEzyoxapN2R+w==} - engines: {node: '>=18.0.0'} - - '@smithy/types@4.16.0': - resolution: {integrity: sha512-aVUabzlBBmY0PfvVgLKQSOGFIL5/7R54JE3uD9a5Ay/jSED61SkuAcCYENNXJzYUvJ1NPrWO0P+rAXHCkbBUKw==} - engines: {node: '>=18.0.0'} - '@smithy/types@4.16.1': resolution: {integrity: sha512-0JFs3V2y2M9tKW5na/qxe69Zv+uxLMO7QBbhxF/FHu/Gp2NFZAAL9tWl9PU02xxo07pb3G9FTyjNc6D5uZrJIg==} engines: {node: '>=18.0.0'} - '@smithy/url-parser@4.4.9': - resolution: {integrity: sha512-WFNfVQ5A8WcJNp/tIiuymhbiiCmZipjLJ6Iiq1jAnWjdl7efKri6koJkqh5+hQwiQXQHk2DGKmQvD3dOGFq8pQ==} - engines: {node: '>=18.0.0'} - '@smithy/util-base64@4.5.9': resolution: {integrity: sha512-4q8h+aztxE85KYzuLH3b9P/OTKDoEwG4UKKphmrh5k65p4d5S/REwUgGcTTigFpWLYWGKt3h1aABO3mhUZEAKw==} engines: {node: '>=18.0.0'} - '@smithy/util-body-length-browser@4.4.9': - resolution: {integrity: sha512-jbg4TVopmTEYZ4AL8PVfDZXXhY1SdTXspy4Myoi000RV2xErNXWmY8Qz5NMzcTlzE19ARjmtbhNg+opEdtjEiA==} - engines: {node: '>=18.0.0'} - - '@smithy/util-body-length-node@4.4.9': - resolution: {integrity: sha512-+w6SNxGyl5w01dggIE8pnYspDDgscLSqQlBF59OkUoOEVQaNymMWFxGThFWhgJXE1E2i4sG3ZjlP9I1RvxmSAw==} - engines: {node: '>=18.0.0'} - '@smithy/util-buffer-from@2.2.0': resolution: {integrity: sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==} engines: {node: '>=14.0.0'} - '@smithy/util-defaults-mode-browser@4.5.9': - resolution: {integrity: sha512-IsNRWbkmLyV6QusLspvsGQxHL9GuDWbOnbpFJrzyU/YG5EmKE3ZOnmmyDOPGuCnzVi9AsGLTa6XWm87UlDvs9w==} - engines: {node: '>=18.0.0'} - - '@smithy/util-defaults-mode-node@4.4.9': - resolution: {integrity: sha512-9g8QNUIk5SeZPOTxdQcbe8EqwwTczTdka+fEiNoZi9OYcSv0Iz/9prZMWjuahI4LHOFJ5Gsb+V3A1sbL8NpoVw==} - engines: {node: '>=18.0.0'} - - '@smithy/util-endpoints@3.6.9': - resolution: {integrity: sha512-wvNKq7FvzEUjxZWMYU0ShHRCzCHcl8//jb2mB9b1qCVczN7oQwLB/lTnlfJP+nLQA1kpbFOOvUZgfNd5XRlCFA==} - engines: {node: '>=18.0.0'} + '@smithy/util-utf8@2.3.0': + resolution: {integrity: sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==} + engines: {node: '>=14.0.0'} - '@smithy/util-middleware@4.4.9': - resolution: {integrity: sha512-r1xxiqE6mV/e7sMCb4N7KLd6BJzqUb9gW7S7UdquVz4woGGLfiq3HweiWWRIq7FePoNA+0f88VvqAtu/8gn9lA==} - engines: {node: '>=18.0.0'} + '@solid-primitives/event-listener@2.4.6': + resolution: {integrity: sha512-5I0YJcTVYIWoMmgBSROBZGcz+ymhew/pGTg2dHW74BUjFKsV8Li4bOZYl0YAGP4mHw5o4UBd9/BEesqBci3wxw==} + peerDependencies: + solid-js: ^1.6.12 - '@smithy/util-retry@4.5.9': - resolution: {integrity: sha512-h0iI/SuUOe8cnwNZ6DQtX5uRywGi2RsXQntP2XSe2rEA3oPy4rDCPULRoUtKYpi1Fj5T8TP13QJRPb/R0BT+lQ==} - engines: {node: '>=18.0.0'} + '@solid-primitives/keyboard@1.3.7': + resolution: {integrity: sha512-558RPNYnXx4nGh537DSqAn4xMrC8iFipl/5+xzgzWoTNFst4RnUN3BOLmtDjJ0UGGoQXVMALYR3bNOHM0xnt1Q==} + peerDependencies: + solid-js: ^1.6.12 - '@smithy/util-stream@4.7.9': - resolution: {integrity: sha512-mXmwBoZ91Pjvngg5Aoze4WubJieqbhKxBIoSCURtyAdNO3zwBgIVr53OBbClym0EMUfHpmkmdtlwDszVt6rsfw==} - engines: {node: '>=18.0.0'} + '@solid-primitives/resize-observer@2.2.0': + resolution: {integrity: sha512-9Fuu/EWBeGj+atGHRJp70HKhdfalmpjwxY8a32NZixdLNmfCJ45AfhLQNr6uOzETbbiMx4iCKlTrJ8KZCHC2Ww==} + peerDependencies: + solid-js: ^1.6.12 - '@smithy/util-utf8@2.3.0': - resolution: {integrity: sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==} - engines: {node: '>=14.0.0'} + '@solid-primitives/rootless@1.5.4': + resolution: {integrity: sha512-TOIZa1VUfVJ+9nkCcRajw3U4t9vBOP1HxX1WHNTbXq32mXwlqTvUnC4CRIilohcryBkT9u2ZkhUDSHRTaGp55g==} + peerDependencies: + solid-js: ^1.6.12 - '@smithy/util-utf8@4.4.9': - resolution: {integrity: sha512-uHhshFHe243cUkI6FFpjhjMwak3NoD988da8cS4DV4I0FugzvVJ1RNRzaR4f1sgXNlEASeKv/EthmmRMudUI3w==} - engines: {node: '>=18.0.0'} + '@solid-primitives/static-store@0.1.4': + resolution: {integrity: sha512-LgtVaVBtB7EbmS4+M0b8xY5Iq6pUWXBsIC4VgtrFKDGDdyCaDt88sHk0fUlx1Enxm/XZnZyLXJABRoa39RjJqA==} + peerDependencies: + solid-js: ^1.6.12 - '@smithy/util-waiter@4.5.9': - resolution: {integrity: sha512-peGY/wOD/AI7wvCz9jeojfNtiwbI7Mj159W14vQSQfvErSrQ/z3bST//I0i0f2RbisDMQ/7+1KLtzTAPdHLJHA==} - engines: {node: '>=18.0.0'} + '@solid-primitives/utils@6.4.1': + resolution: {integrity: sha512-ISSB5QX1qP2ynrheIpYwc4oKR5Ny4siNuUyf1qZniy+Il+p/PtDB0QK1Dnle8noiHpwRD3gpPdubOC3qI/Zamg==} + peerDependencies: + solid-js: ^1.6.12 '@speed-highlight/core@1.2.17': resolution: {integrity: sha512-Z92FwKpCtfaW1V0jTU/fh3QzYEZN8wDwrzRIBoADCJfn4mJCNcJN/XegifX7BDrQ8/h9Xh/JnbyMchL0FqXrkg==} @@ -2746,42 +2584,88 @@ packages: '@standard-schema/spec@1.1.0': resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} + '@stylistic/eslint-plugin@5.10.0': + resolution: {integrity: sha512-nPK52ZHvot8Ju/0A4ucSX1dcPV2/1clx0kLcH5wDmrE4naKso7TUC/voUyU1O9OTKTrR6MYip6LP0ogEMQ9jPQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^9.0.0 || ^10.0.0 + '@swc/helpers@0.5.15': resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} + '@tailwindcss/node@4.3.0': + resolution: {integrity: sha512-aFb4gUhFOgdh9AXo4IzBEOzBkkAxm9VigwDJnMIYv3lcfXCJVesNfbEaBl4BNgVRyid92AmdviqwBUBRKSeY3g==} + '@tailwindcss/node@4.3.3': resolution: {integrity: sha512-/T8IKEsf9VTU6tLjgC7+sv2mOPtQxzE2jMw7u4Tt40Tx+QSZxpzh95/H6cMKoja9XuW7iMdLJYBB0o9G1CaAgg==} + '@tailwindcss/oxide-android-arm64@4.3.0': + resolution: {integrity: sha512-TJPiq67tKlLuObP6RkwvVGDoxCMBVtDgKkLfa/uyj7/FyxvQwHS+UOnVrXXgbEsfUaMgiVvC4KbJnRr26ho4Ng==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [android] + '@tailwindcss/oxide-android-arm64@4.3.3': resolution: {integrity: sha512-Y85A2gmPSkl5Ve5qR86GL4HT509cFqQh1aes9p3sSkyTPwt0Pppf3GkwGe4JPACcRYjgJIEhQgM6dBClnr0NYw==} engines: {node: '>= 20'} cpu: [arm64] os: [android] - '@tailwindcss/oxide-darwin-arm64@4.3.3': + '@tailwindcss/oxide-darwin-arm64@4.3.0': + resolution: {integrity: sha512-oMN/WZRb+SO37BmUElEgeEWuU8E/HXRkiODxJxLe1UTHVXLrdVSgfaJV7pSlhRGMSOiXLuxTIjfsF3wYvz8cgQ==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [darwin] + + '@tailwindcss/oxide-darwin-arm64@4.3.3': resolution: {integrity: sha512-BiaWatpBcERQFDlOjRDpIVXuFK5PJez5SA4JMg6VYZdBYU+qKfV/vqjcIs+IYmtitf1xYQZTwXvU/8y4lfZUGw==} engines: {node: '>= 20'} cpu: [arm64] os: [darwin] + '@tailwindcss/oxide-darwin-x64@4.3.0': + resolution: {integrity: sha512-N6CUmu4a6bKVADfw77p+iw6Yd9Q3OBhe0veaDX+QazfuVYlQsHfDgxBrsjQ/IW+zywL8mTrNd0SdJT/zgtvMdA==} + engines: {node: '>= 20'} + cpu: [x64] + os: [darwin] + '@tailwindcss/oxide-darwin-x64@4.3.3': resolution: {integrity: sha512-fAeUqfV5ndhxRwai8cXGzdLvul9utWOmeTkv69unv4ZXixjn61Z+p9lCWdwOwA3TYboG3BwdVuN/RDjhBRl0mw==} engines: {node: '>= 20'} cpu: [x64] os: [darwin] + '@tailwindcss/oxide-freebsd-x64@4.3.0': + resolution: {integrity: sha512-zDL5hBkQdH5C6MpqbK3gQAgP80tsMwSI26vjOzjJtNCMUo0lFgOItzHKBIupOZNQxt3ouPH7RPhvNhiTfCe5CQ==} + engines: {node: '>= 20'} + cpu: [x64] + os: [freebsd] + '@tailwindcss/oxide-freebsd-x64@4.3.3': resolution: {integrity: sha512-iyf5bV6+wnAlflVeEy7R25dupxTNECZN5QMI0qNT6eT+EgaGdZcKhGkr5SdoaWiLJ3spLqIY9VCeSGrwmtg4kw==} engines: {node: '>= 20'} cpu: [x64] os: [freebsd] + '@tailwindcss/oxide-linux-arm-gnueabihf@4.3.0': + resolution: {integrity: sha512-R06HdNi7A7OEoMsf6d4tjZ71RCWnZQPHj2mnotSFURjNLdBC+cIgXQ7l81CqeoiQftjf6OOblxXMInMgN2VzMA==} + engines: {node: '>= 20'} + cpu: [arm] + os: [linux] + '@tailwindcss/oxide-linux-arm-gnueabihf@4.3.3': resolution: {integrity: sha512-aAYUprJAJQWWbRrPvtjdroZ56Md+JM8pMiopS6xGEwDfLhqj+2ver2p4nU4Mb3CRqcMmNBjo8KkUgcxhkzVQGQ==} engines: {node: '>= 20'} cpu: [arm] os: [linux] + '@tailwindcss/oxide-linux-arm64-gnu@4.3.0': + resolution: {integrity: sha512-qTJHELX8jetjhRQHCLilkVLmybpzNQAtaI/gaoVoidn/ufbNDbAo8KlK2J+yPoc8wQxvDxCmh/5lr8nC1+lTbg==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [linux] + libc: [glibc] + '@tailwindcss/oxide-linux-arm64-gnu@4.3.3': resolution: {integrity: sha512-nDxldcEENOxZRzC2uu9jrutZdAAQtb+8WWDCSnWL1zvBk1+FN+x6MtDViPB5AJMfttVCUhehGWus3XBPgatM/w==} engines: {node: '>= 20'} @@ -2789,6 +2673,13 @@ packages: os: [linux] libc: [glibc] + '@tailwindcss/oxide-linux-arm64-musl@4.3.0': + resolution: {integrity: sha512-Z6sukiQsngnWO+l39X4pPbiWT81IC+PLKF+PHxIlyZbGNb9MODfYlXEVlFvej5BOZInWX01kVyzeLvHsXhfczQ==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [linux] + libc: [musl] + '@tailwindcss/oxide-linux-arm64-musl@4.3.3': resolution: {integrity: sha512-Md44bD6veX/PC5iyF8cDVnw4HBIANZepRZZ7a8DQOvkfo5WUBwcp6iAuCUz23u+4SUkhJlD3eL7hNdW8ezd/kA==} engines: {node: '>= 20'} @@ -2796,6 +2687,13 @@ packages: os: [linux] libc: [musl] + '@tailwindcss/oxide-linux-x64-gnu@4.3.0': + resolution: {integrity: sha512-DRNdQRpSGzRGfARVuVkxvM8Q12nh19l4BF/G7zGA1oe+9wcC6saFBHTISrpIcKzhiXtSrlSrluCfvMuledoCTQ==} + engines: {node: '>= 20'} + cpu: [x64] + os: [linux] + libc: [glibc] + '@tailwindcss/oxide-linux-x64-gnu@4.3.3': resolution: {integrity: sha512-tx7us1muwOKAKWao2v/GaafFeQboE6aj88vC6ziN2NCGcRm8gWUhwjzg+YdVB1e4boAtdtma4L43onunI6NS4w==} engines: {node: '>= 20'} @@ -2803,6 +2701,13 @@ packages: os: [linux] libc: [glibc] + '@tailwindcss/oxide-linux-x64-musl@4.3.0': + resolution: {integrity: sha512-Z0IADbDo8bh6I7h2IQMx601AdXBLfFpEdUotft86evd/8ZPflZe9COPO8Q1vw+pfLWIUo9zN/JGZvwuAJqduqg==} + engines: {node: '>= 20'} + cpu: [x64] + os: [linux] + libc: [musl] + '@tailwindcss/oxide-linux-x64-musl@4.3.3': resolution: {integrity: sha512-SJxX60smvHgasZoBy11dX6YRjXJFovwWBoedhbQPOBzgFWBHGB+TVPWB9BxzR7TTxU8FQZAI2AyiNCMzFm8Img==} engines: {node: '>= 20'} @@ -2810,6 +2715,18 @@ packages: os: [linux] libc: [musl] + '@tailwindcss/oxide-wasm32-wasi@4.3.0': + resolution: {integrity: sha512-HNZGOUxEmElksYR7S6sC5jTeNGpobAsy9u7Gu0AskJ8/20FR9GqebUyB+HBcU/ax6BHuiuJi+Oda4B+YX6H1yA==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + bundledDependencies: + - '@napi-rs/wasm-runtime' + - '@emnapi/core' + - '@emnapi/runtime' + - '@tybys/wasm-util' + - '@emnapi/wasi-threads' + - tslib + '@tailwindcss/oxide-wasm32-wasi@4.3.3': resolution: {integrity: sha512-jx1+rPhY/5Ympkktd656HBWEBLxP7dH06losBLjjf5vgCODXvi9KhtftWcMIwTFIDqBr7cRnQkdLnAG+IOlGvQ==} engines: {node: '>=14.0.0'} @@ -2822,18 +2739,34 @@ packages: - '@emnapi/wasi-threads' - tslib + '@tailwindcss/oxide-win32-arm64-msvc@4.3.0': + resolution: {integrity: sha512-Pe+RPVTi1T+qymuuRpcdvwSVZjnll/f7n8gBxMMh3xLTctMDKqpdfGimbMyioqtLhUYZxdJ9wGNhV7MKHvgZsQ==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [win32] + '@tailwindcss/oxide-win32-arm64-msvc@4.3.3': resolution: {integrity: sha512-3rc292Ca2ceK6Ulcc/bAVnTs/3nDtoPhyEKlgPv+yQJQi/JS/AMJlqzxvlDacL1nekbrcf6bTqp/jV4qgnPxNQ==} engines: {node: '>= 20'} cpu: [arm64] os: [win32] + '@tailwindcss/oxide-win32-x64-msvc@4.3.0': + resolution: {integrity: sha512-Mvrf2kXW/yeW/OTezZlCGOirXRcUuLIBx/5Y12BaPM7wJoryG6dfS/NJL8aBPqtTEx/Vm4T4vKzFUcKDT+TKUA==} + engines: {node: '>= 20'} + cpu: [x64] + os: [win32] + '@tailwindcss/oxide-win32-x64-msvc@4.3.3': resolution: {integrity: sha512-yJ0pwIVc/nYeGoV02WtsN8KYyLQv7kyI2wDnkezyJlGGjkd4QLwDGAwl47YpPJeuI0M0ObaXGSPjvWDPeTPggw==} engines: {node: '>= 20'} cpu: [x64] os: [win32] + '@tailwindcss/oxide@4.3.0': + resolution: {integrity: sha512-F7HZGBeN9I0/AuuJS5PwcD8xayx5ri5GhjYUDBEVYUkexyA/giwbDNjRVrxSezE3T250OU2K/wp/ltWx3UOefg==} + engines: {node: '>= 20'} + '@tailwindcss/oxide@4.3.3': resolution: {integrity: sha512-krXjAikiaFSPaK/FkAQT5UTx3VormQaiZ5hBFlJZ9UFQGB/rwg1MZIhHAG9smMQRTdyJxP6Qt5MwMtdyU5FWrA==} engines: {node: '>= 20'} @@ -2841,12 +2774,267 @@ packages: '@tailwindcss/postcss@4.3.3': resolution: {integrity: sha512-JTSZZGQi1AyKirbLN3azmjVzef92tcX7h+iSqPdaeStyFpGpDlKvvpxeOE8njhbUanbRwr3z8DyzhICWnMtQeg==} - '@tsconfig/node18@1.0.3': - resolution: {integrity: sha512-RbwvSJQsuN9TB04AQbGULYfOGE/RnSFk/FLQ5b0NmDf5Kx2q/lABZbHQPKCO1vZ6Fiwkplu+yb9pGdLy1iGseQ==} + '@tailwindcss/vite@4.3.0': + resolution: {integrity: sha512-t6J3OrB5Fc0ExuhohouH0fWUGMYL6PTLhW+E7zIk/pdbnJARZDCwjBznFnkh5ynRnIRSI4YjtTH0t6USjJISrw==} + peerDependencies: + vite: ^5.2.0 || ^6 || ^7 || ^8 + + '@tanstack/devtools-client@0.0.6': + resolution: {integrity: sha512-f85ZJXJnDIFOoykG/BFIixuAevJovCvJF391LPs6YjBAPhGYC50NWlx1y4iF/UmK5/cCMx+/JqI5SBOz7FanQQ==} + engines: {node: '>=18'} + + '@tanstack/devtools-event-bus@0.4.1': + resolution: {integrity: sha512-cNnJ89Q021Zf883rlbBTfsaxTfi2r73/qejGtyTa7ksErF3hyDyAq1aTbo5crK9dAL7zSHh9viKY1BtMls1QOA==} + engines: {node: '>=18'} + + '@tanstack/devtools-event-client@0.4.4': + resolution: {integrity: sha512-6T5Yop/793YI+H+5J8Hsyj4kCih9sl4t3ElLgKioW5hk3ocn+ZdSJ94tT7vL7uabxSugWYBZlOTMPzEw2puvQw==} + engines: {node: '>=18'} + hasBin: true + + '@tanstack/devtools-ui@0.5.2': + resolution: {integrity: sha512-GtaMk8kaGZ9ZdR8Pu5RAfcse/ZrxzH/xsAIFtHMapLs2VMqSPFfb1NvIDO1MAAfUcub8Ix8XKQEP0uYSPzoFKw==} + engines: {node: '>=18'} + peerDependencies: + solid-js: '>=1.9.7' + + '@tanstack/devtools-vite@0.7.0': + resolution: {integrity: sha512-VXki7K+Xwnpo3IKdNSWGe7YOvtZv33YlulGqaQ+YCpeQhYg8JFuxP50BXibDoRLj5EOX4r21Hs7COdxbRHXkTw==} + engines: {node: '>=18'} + hasBin: true + peerDependencies: + vite: ^6.0.0 || ^7.0.0 || ^8.0.0 + + '@tanstack/devtools@0.12.2': + resolution: {integrity: sha512-Xdl8pLzoDUvXaclQ0poY36WAPx0jEHk8vqUFd8FYFUm1BMshtB7RnTgD1HE9jCAXODxqw9I0gXBiUZLK3o3+Bw==} + engines: {node: '>=18'} + hasBin: true + peerDependencies: + solid-js: '>=1.9.7' + + '@tanstack/eslint-config@0.4.0': + resolution: {integrity: sha512-V+Cd81W/f65dqKJKpytbwTGx9R+IwxKAHsG/uJ3nSLYEh36hlAr54lRpstUhggQB8nf/cP733cIw8DuD2dzQUg==} + engines: {node: '>=18'} + peerDependencies: + eslint: ^9.0.0 || ^10.0.0 + + '@tanstack/history@1.162.0': + resolution: {integrity: sha512-79pf/RkhteYZTRgcR4F9kbk84P2N8rugQJswxfIqovlbRiT3yI7eBE+5QorIrZaOKktsgzRlXh1l/du/xpl4iA==} + engines: {node: '>=20.19'} + + '@tanstack/query-core@5.101.2': + resolution: {integrity: sha512-hH5MLoJhF7KaIGd7q3xTXGXvslI+GYlM1Z/35aSHHWaCJWB7XvTSHYuV3eM7tw+aE0mT/xMro4M4Q9rCGHT0lw==} + + '@tanstack/react-devtools@0.10.5': + resolution: {integrity: sha512-orVsRJ7oAXFb7oyafQCgx9YuK44jpILh5T/ddYuxAsolNfN5DZBr5/NLrWErD7HCGIzvYzg1TZI4sPxmiKvtvA==} + engines: {node: '>=18'} + peerDependencies: + '@types/react': '>=16.8' + '@types/react-dom': '>=16.8' + react: '>=16.8' + react-dom: '>=16.8' + + '@tanstack/react-query@5.101.2': + resolution: {integrity: sha512-seDkr6kzGzX1okaaTtZPtgA688CDPlXUz1C6xSg0ESqn04Vuc8tlrYms1s3de+znBqhPVxFRfpAfUf+6XvfPWg==} + peerDependencies: + react: ^18 || ^19 + + '@tanstack/react-router-devtools@1.167.0': + resolution: {integrity: sha512-nGw095EG7IHx0h5NtlEmzf6vcCTaFNPWdTSuDKazajhN0ct/v/TkekJ9J6KYUCeV1a8/2ZmToc58M+0rrOyn7w==} + engines: {node: '>=20.19'} + peerDependencies: + '@tanstack/react-router': ^1.170.0 + '@tanstack/router-core': ^1.170.0 + react: '>=18.0.0 || >=19.0.0' + react-dom: '>=18.0.0 || >=19.0.0' + peerDependenciesMeta: + '@tanstack/router-core': + optional: true + + '@tanstack/react-router-ssr-query@1.167.1': + resolution: {integrity: sha512-W9j5JPnBikyafvuUfykFfHIWod58OAbAAa5leNkXBcoDoocghMmu6w9uZOmUZvAWT7CSvgj5tBUtF7CM2OoHXQ==} + engines: {node: '>=20.19'} + peerDependencies: + '@tanstack/query-core': '>=5.90.0' + '@tanstack/react-query': '>=5.90.0' + '@tanstack/react-router': '>=1.127.0' + react: '>=18.0.0 || >=19.0.0' + react-dom: '>=18.0.0 || >=19.0.0' + + '@tanstack/react-router@1.170.10': + resolution: {integrity: sha512-gVmWYq0ucWr+OB97Nud0YhKa9NOipB7/QrWI7wRZJJWEL0qUS8WPqAs0vA1f3IBXZpXmf8xxzf/tl5cmo4tlmA==} + engines: {node: '>=20.19'} + peerDependencies: + react: '>=18.0.0 || >=19.0.0' + react-dom: '>=18.0.0 || >=19.0.0' + + '@tanstack/react-start-client@1.168.7': + resolution: {integrity: sha512-ldvWrNvXb/EXAY+8uj0XbkVlP0Uh6Ddm63NNNKWf5V2BcQ6KRxiZgANXLWlKRczmnklZiwN2eWFexEJFEzetLQ==} + engines: {node: '>=22.12.0'} + peerDependencies: + react: '>=18.0.0 || >=19.0.0' + react-dom: '>=18.0.0 || >=19.0.0' + + '@tanstack/react-start-rsc@0.1.17': + resolution: {integrity: sha512-qOgOccz24i7mRnTzARSB6sWJa4kSon3AVyQ7NowJ1/o2VquHpblu7OY2sdxSbOqU0e3t6fSgqu08RTym47H1Fw==} + engines: {node: '>=22.12.0'} + peerDependencies: + '@rspack/core': '>=2.0.0-0' + '@vitejs/plugin-rsc': '>=0.5.20' + react: '>=18.0.0 || >=19.0.0' + react-dom: '>=18.0.0 || >=19.0.0' + react-server-dom-rspack: '>=0.0.2' + peerDependenciesMeta: + '@rspack/core': + optional: true + '@vitejs/plugin-rsc': + optional: true + react-server-dom-rspack: + optional: true + + '@tanstack/react-start-server@1.167.13': + resolution: {integrity: sha512-u/nfkW9M79HRx45uJipEi6txjfTJhYTFUirBSm7jqZfId7RRDfV+j38fipGhbIbCjCkHd6hPbUzJAnQFoM0uqg==} + engines: {node: '>=22.12.0'} + peerDependencies: + react: '>=18.0.0 || >=19.0.0' + react-dom: '>=18.0.0 || >=19.0.0' + + '@tanstack/react-start@1.168.18': + resolution: {integrity: sha512-IRYbUPgUToyt1W9KJJB3oG/OUmqYOfHW521cPe5pZhJe3LkaTdtu7KpHsW4p6z+su8CfN7n9oofb0vY36lXRkg==} + engines: {node: '>=22.12.0'} + peerDependencies: + '@rsbuild/core': ^2.0.0 + '@vitejs/plugin-rsc': '*' + react: '>=18.0.0 || >=19.0.0' + react-dom: '>=18.0.0 || >=19.0.0' + vite: '>=7.0.0' + peerDependenciesMeta: + '@rsbuild/core': + optional: true + '@vitejs/plugin-rsc': + optional: true + vite: + optional: true + + '@tanstack/react-store@0.9.3': + resolution: {integrity: sha512-y2iHd/N9OkoQbFJLUX1T9vbc2O9tjH0pQRgTcx1/Nz4IlwLvkgpuglXUx+mXt0g5ZDFrEeDnONPqkbfxXJKwRg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + '@tanstack/router-core@1.171.8': + resolution: {integrity: sha512-PbrTBbofFcacrH3RLgHYILRqTFnAGq+gXrXoA/vo7qUSkJpSO4GWfLtrtCahD4VayzRm19IPwcjPPLEugag6pw==} + engines: {node: '>=20.19'} + + '@tanstack/router-devtools-core@1.168.0': + resolution: {integrity: sha512-wQoQhlBK7nlZgqzaqdYXKWNTpdHdsaREdaPhFZVH0/Ador+F+eM3/NF2i3f2LPeS0GgKraZUQXe1Q/1+KHyEYg==} + engines: {node: '>=20.19'} + peerDependencies: + '@tanstack/router-core': ^1.170.0 + csstype: ^3.0.10 + peerDependenciesMeta: + csstype: + optional: true + + '@tanstack/router-generator@1.167.12': + resolution: {integrity: sha512-FGr7nn6VhjL53TUCTyDgApSkAYRxhId+v0HVQdSu0ADkNuHY+sUnYEMqiF6aN82jYWuXzrSL1xazg6/rfEP82g==} + engines: {node: '>=20.19'} + + '@tanstack/router-plugin@1.168.13': + resolution: {integrity: sha512-LnepwDai+TaC4K3aZeXrrKpnGoP8xGGilVGFfa5flGgC3+jCSBysb8SktidRE8eF2/iOzCQC0LIGirtMyZepSA==} + engines: {node: '>=20.19'} + peerDependencies: + '@rsbuild/core': '>=1.0.2 || ^2.0.0' + '@tanstack/react-router': ^1.170.10 + vite: '>=5.0.0 || >=6.0.0 || >=7.0.0 || >=8.0.0' + vite-plugin-solid: ^2.11.10 || ^3.0.0-0 + webpack: '>=5.92.0' + peerDependenciesMeta: + '@rsbuild/core': + optional: true + '@tanstack/react-router': + optional: true + vite: + optional: true + vite-plugin-solid: + optional: true + webpack: + optional: true + + '@tanstack/router-ssr-query-core@1.169.1': + resolution: {integrity: sha512-rngux8s/3mPQzcjLYDLkNU31coYVyCgrVTfpdwqUdY5jIEHqGTXrO73DTkPR1PppwYUeVhmNCgl8TctRcnupjg==} + engines: {node: '>=20.19'} + peerDependencies: + '@tanstack/query-core': '>=5.90.0' + '@tanstack/router-core': '>=1.127.0' + + '@tanstack/router-utils@1.162.1': + resolution: {integrity: sha512-62layyTGmclHDQS/eidwKRfN1hhCKwViG7iEBcVmL0MXgcAB3OOucWCEcDDGd9Cu11H6b4QQ5oOo47MWIqwz0A==} + engines: {node: '>=20.19'} + + '@tanstack/start-client-core@1.170.6': + resolution: {integrity: sha512-Zh4JY3bWiM8K807CnyRE/+53YiUx/R6nRhQr1BSxaXM3iFh9/FxoN4peK+yhkG7Hq/O2AGBWHt9yscxrsFD5+g==} + engines: {node: '>=22.12.0'} + + '@tanstack/start-fn-stubs@1.162.0': + resolution: {integrity: sha512-QWfUZ3Yo923tdQn38LyKMU8rcTw69zc+T4dAvgTWV4O56SqFRsGfS0lSWIMhJRwXIx/bvdi7nTUBDdZtTHtpTQ==} + engines: {node: '>=22.12.0'} + + '@tanstack/start-plugin-core@1.171.10': + resolution: {integrity: sha512-HYYcgwjnuGIMn7wgASM6AryKktyQ06FwziFDP3d93APFmC8dLPadSzvwV/AUWvPQYCQq2Dp9SAX3byXEMvjO7g==} + engines: {node: '>=22.12.0'} + peerDependencies: + '@rsbuild/core': ^2.0.0 + vite: '>=7.0.0' + peerDependenciesMeta: + '@rsbuild/core': + optional: true + vite: + optional: true + + '@tanstack/start-server-core@1.169.8': + resolution: {integrity: sha512-yVhdg9QLNUrXdXDn5kN76u0YFKraR7bgb6ZFqHCbX63sTPabD4Z1fBr68PnzqKWB2gXfJmP9JN1puvcdChKeYA==} + engines: {node: '>=22.12.0'} + + '@tanstack/start-storage-context@1.167.10': + resolution: {integrity: sha512-geCsFpgCt+S2gQjzXILdPZ9obIxtzuN8C0Esc1fcyWZhwYyqo4C8G2o/dIck8xGixCMSvOsxL5NkCXDdOm2KOQ==} + engines: {node: '>=22.12.0'} + + '@tanstack/store@0.9.3': + resolution: {integrity: sha512-8reSzl/qGWGGVKhBoxXPMWzATSbZLZFWhwBAFO9NAyp0TxzfBP0mIrGb8CP8KrQTmvzXlR/vFPPUrHTLBGyFyw==} + + '@tanstack/virtual-file-routes@1.162.0': + resolution: {integrity: sha512-uhOeFyxLcU41HzvrxsGpiWdcMbScY1EDgbZ5K7DVRMYInbLYWAC0EA/kx9wXAoSM8q82bUG2hRl8+EAjE6XAbA==} + engines: {node: '>=20.19'} + + '@testing-library/dom@10.4.1': + resolution: {integrity: sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==} + engines: {node: '>=18'} + + '@testing-library/react@16.3.2': + resolution: {integrity: sha512-XU5/SytQM+ykqMnAnvB2umaJNIOsLF3PVv//1Ew4CTcpz0/BRyy/af40qqrt7SjKpDdT1saBMc42CUok5gaw+g==} + engines: {node: '>=18'} + peerDependencies: + '@testing-library/dom': ^10.0.0 + '@types/react': ^18.0.0 || ^19.0.0 + '@types/react-dom': ^18.0.0 || ^19.0.0 + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@ts-morph/common@0.27.0': + resolution: {integrity: sha512-Wf29UqxWDpc+i61k3oIOzcUfQt79PIT9y/MWfAGlrkjg6lBC1hwDECLXPVJAhWjiGbfBCxZd65F/LIZF3+jeJQ==} '@tybys/wasm-util@0.10.3': resolution: {integrity: sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg==} + '@types/aria-query@5.0.4': + resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} + '@types/aws-lambda@8.10.162': resolution: {integrity: sha512-Fn658grtLOci1oxi1391vvDWJRKNGWRSqfxRkmN/Iy3c0tQH1USMKEXcPYHLvope+ZgTFocx9FRQJx1muBL6qw==} @@ -2883,11 +3071,8 @@ packages: '@types/ms@2.1.0': resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} - '@types/node-fetch@2.6.13': - resolution: {integrity: sha512-QGpRVpzSaUs30JBSGPjOg4Uveu384erbHBoT1zeONvyCfwQxIkUshLAOqN/k9EjGviPRmWTTe6aH2qySWKTVSw==} - - '@types/node@18.19.130': - resolution: {integrity: sha512-GRaXQx6jGfL8sKfaIDD6OupbIHBr9jv7Jnaml9tB7l4v068PAOXqfcujMMo5PhbIs6ggR1XODELqahT2R8v0fg==} + '@types/node@22.19.19': + resolution: {integrity: sha512-dyh/xO2Fh5bYrfWaaqGrRQQGkNdmYw6AmaAUvYeUMNTWQtvb796ikLdmTchRmOlOiIJ1TDXfWgVx1QkUlQ6Hew==} '@types/node@26.1.1': resolution: {integrity: sha512-nxAkRSVkN1Y0JC1W8ky/fTfkGsMmcrRsbx+3XoZE+rMOX71kLYTV7fLXpqud1GpbpP5TuffXFqfX7fH2GgZREw==} @@ -2897,15 +3082,27 @@ packages: peerDependencies: '@types/react': ^19.2.0 + '@types/react@19.2.16': + resolution: {integrity: sha512-esJiCAnl0kfpNdE69f3So4WJUXy95dLZydX0KwK46riIHDzHM7O9Vtf9xCHW0PXIqvgqNrswl522kA/5yx+F4w==} + '@types/react@19.2.17': resolution: {integrity: sha512-MXfmqaVPEVgkBT/aY0aGCkRWWtByiYQXo3xdQ8r5RzuFrPiRn8Gar2tQdXSUQ2GKV3bkXckek89V8wQBY2Q/Aw==} + '@types/set-cookie-parser@2.4.10': + resolution: {integrity: sha512-GGmQVGpQWUe5qglJozEjZV/5dyxbOOZ0LHe/lqyWssB88Y4svNfst0uqBVscdDeIKl5Jy5+aPSvy7mI9tYRguw==} + + '@types/statuses@2.0.6': + resolution: {integrity: sha512-xMAgYwceFhRA2zY+XbEA7mxYbA093wdiW8Vu6gZPGWy9cmOyU9XesH1tNcEWsKFd5Vzrqx5T3D38PWx1FIIXkA==} + '@types/unist@2.0.11': resolution: {integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==} '@types/unist@3.0.3': resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} + '@types/validate-npm-package-name@4.0.2': + resolution: {integrity: sha512-lrpDziQipxCEeK5kWxvljWYhUvOiB2A9izZd9B2AFarYAkqZshb4lPbRs7zKEic6eGtH8V/2qJW+dPp9OtF6bw==} + '@types/ws@8.18.1': resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} @@ -3091,9 +3288,25 @@ packages: cpu: [x64] os: [win32] + '@vitejs/plugin-react@6.0.2': + resolution: {integrity: sha512-DlSMqo4WhThw4vB8Mpn0Woe9J+Jfq1geJ61AKW0QEgLzGMNwtIMdxbDUzLxcun8W7NbJO0e2Jg/Nxm3cCSVzzg==} + engines: {node: ^20.19.0 || >=22.12.0} + peerDependencies: + '@rolldown/plugin-babel': ^0.1.7 || ^0.2.0 + babel-plugin-react-compiler: ^1.0.0 + vite: ^8.0.0 + peerDependenciesMeta: + '@rolldown/plugin-babel': + optional: true + babel-plugin-react-compiler: + optional: true + '@vitest/expect@4.1.10': resolution: {integrity: sha512-YsCn+qAk1GWjQOWFEsEcL2gNQ0zmVmQu3T03qP6UyjhtmdtwtbuI+DASn/7iQB3HGTXkdBwGddzxPlmiql5vlA==} + '@vitest/expect@4.1.8': + resolution: {integrity: sha512-h3nDO677RDLEGlBxyQ5CW8RlMThSKSRLUePLOx09gNIWRL40edgA1GCZSZgf1W55MFAG6/Sw14KeaAnqv0NKdQ==} + '@vitest/mocker@4.1.10': resolution: {integrity: sha512-v0xaezt+DKEmKfaxg133ldzADrwLGd7Ze1MfQQTYfvs8OqZIwbxyxaYURivwV7sWy5fqn3rH5uOrSp07bp44Ow==} peerDependencies: @@ -3105,21 +3318,47 @@ packages: vite: optional: true + '@vitest/mocker@4.1.8': + resolution: {integrity: sha512-LEiN/xe4OSIbKe9HQIp5OC24agGD9J5CnmMgsLohVVoOPWL9a2sBoR6VBx43jQZb7Kr1l4RCuyCJzcAa0+dojw==} + peerDependencies: + msw: ^2.4.9 + vite: ^6.0.0 || ^7.0.0 || ^8.0.0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true + '@vitest/pretty-format@4.1.10': resolution: {integrity: sha512-W1HsjSH4MXQ9YfmmhLAoIYf1HRfekQCGngeIgcei6MP5QQGWUe0gkopdZQaVCFO+JDJMrAJGwa5pRpNpvy4P8Q==} + '@vitest/pretty-format@4.1.8': + resolution: {integrity: sha512-9GasEBxpZ1VYIpqHf/0+YGg121uSNwCKOJqIrTwWP/TB7DmFCiaBpNl3aPZzoLWfWkuqhbH8vJIVobZkvdo2cA==} + '@vitest/runner@4.1.10': resolution: {integrity: sha512-IKI6kpIH+LmpROplyLwBBaCfMgOZOMsygVa6BARD6ahA04VRuJSa6OaVG7kRvSEMD870Vd91rSSw0eegtWyLGg==} + '@vitest/runner@4.1.8': + resolution: {integrity: sha512-EmVxeBAfMJvycdjd6Hm+RbFBbA9fKvo0Kx37hNpBYoYeavH3RNsBXWDooR1mgD52dCrxIIuP7UotpfiwOikvcg==} + '@vitest/snapshot@4.1.10': resolution: {integrity: sha512-xRkfOT1qpTAi/Ti4Y1LtfRc3kEuqxGw59eN2jN9pRWMtS/XDevekhcFSqvQqjUNGksfjMJu3Y+oJ+4Ypn2OaJw==} + '@vitest/snapshot@4.1.8': + resolution: {integrity: sha512-acfZboRmAIf05DEKcBQy33VXojFJjtUdLyo7oOmV9kebb2xdU01UknNiPuPZoJZQyO7DF0gZdTGTpeAzET9QPQ==} + '@vitest/spy@4.1.10': resolution: {integrity: sha512-PLf/Ugvoq5wO/b4rwYCR1h2PSIdXz7wnkQFMiUpLdtM7l6pqVFcQIBEHyT1+l+cj7mNwAfZHzqXqDyjvOuwbDw==} + '@vitest/spy@4.1.8': + resolution: {integrity: sha512-6EevtBp6OZOPF7bmz36HrGMeP3txgVSrgebWxHOafDXGkhIzfXK14f8KF6MuFfgXXUeHxmpD3BQxkV00/3s5mA==} + '@vitest/utils@4.1.10': resolution: {integrity: sha512-fy9am/HWxbaGt/Sawrp90vt6Y6jQwf1RX77cz3uwoJwJVMli/e1IEwRPnMNJ7vKfPTwo0diXifkpPvwH9v7nGA==} + '@vitest/utils@4.1.8': + resolution: {integrity: sha512-uOJamYALNhfJ6iolExyQM40yIQwDqYnkKtQ5VCiSe17E33H0aQ/u+1GlRuz4LZBk6Mm3sg90G9hEbmEt37C1Zg==} + '@yuku-analyzer/binding-darwin-arm64@0.6.4': resolution: {integrity: sha512-xhM6mCZ94kx7L5D4fJEVqqeXS4eGAz+ngWhbM2y7r8Ix2Lc43j6Osyw4KGGTQi1XTy3MKgs6x5DaCe1vw0i3tQ==} cpu: [arm64] @@ -3184,10 +3423,6 @@ packages: '@yuku-toolchain/types@0.5.43': resolution: {integrity: sha512-kSpvPntnXw5+lYjO71ffBEnQ5ycQ74KGIYknh0TS4xeyCuBkOqxyJumxZkMhLBBUCLjDAbx2+Icnr3Zh4ftjpQ==} - abort-controller@3.0.0: - resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} - engines: {node: '>=6.5'} - accepts@2.0.0: resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==} engines: {node: '>= 0.6'} @@ -3202,74 +3437,32 @@ packages: engines: {node: '>=0.4.0'} hasBin: true - adm-zip@0.5.18: - resolution: {integrity: sha512-ufJnssQGbxzLNS1Ho9bCtX4rQKCCvoVuDLHoJyc3F9dOGDB4BkWs2Ci0kv53lqocAEQ/Cbi+I2XCsNYGqVYqng==} - engines: {node: '>=12.0'} - - agentkeepalive@4.6.0: - resolution: {integrity: sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==} - engines: {node: '>= 8.0.0'} - - ajv@6.15.0: - resolution: {integrity: sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==} + agent-base@7.1.4: + resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} + engines: {node: '>= 14'} - alchemy@0.93.12: - resolution: {integrity: sha512-0XCVvUpIbvYuN4ZL1JHGH56XfXhIxTHYfHdp2z2UaOB35m8VqlaJjz2mG3n8C8EUIoU/vKzFPAPOYp+HYzhULQ==} - hasBin: true + ajv-formats@2.1.1: + resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} peerDependencies: - '@astrojs/cloudflare': ^12.6.4 - '@aws-sdk/client-dynamodb': ^3.0.0 - '@aws-sdk/client-iam': ^3.0.0 - '@aws-sdk/client-lambda': ^3.0.0 - '@aws-sdk/client-s3': ^3.0.0 - '@aws-sdk/client-sesv2': ^3.0.0 - '@aws-sdk/client-sqs': ^3.0.0 - '@aws-sdk/client-ssm': ^3.0.0 - '@aws-sdk/client-sts': ^3.0.0 - '@cloudflare/vite-plugin': ^1.21.2 - '@coinbase/cdp-sdk': ^0.10.0 - '@libsql/client': ^0.15.12 - '@opennextjs/cloudflare': ^1.6.5 - astro: ^5.13.2 - rwsdk: ^1.0.0-beta.51 - stripe: ^18.5.0 - vite: '>=6.0.0' + ajv: ^8.0.0 peerDependenciesMeta: - '@astrojs/cloudflare': - optional: true - '@aws-sdk/client-dynamodb': - optional: true - '@aws-sdk/client-iam': - optional: true - '@aws-sdk/client-lambda': - optional: true - '@aws-sdk/client-s3': - optional: true - '@aws-sdk/client-sesv2': - optional: true - '@aws-sdk/client-sqs': - optional: true - '@aws-sdk/client-ssm': - optional: true - '@aws-sdk/client-sts': - optional: true - '@cloudflare/vite-plugin': - optional: true - '@coinbase/cdp-sdk': - optional: true - '@libsql/client': - optional: true - '@opennextjs/cloudflare': - optional: true - astro: - optional: true - rwsdk: - optional: true - stripe: + ajv: optional: true - vite: + + ajv-formats@3.0.1: + resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: optional: true + ajv@6.15.0: + resolution: {integrity: sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==} + + ajv@8.20.0: + resolution: {integrity: sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==} + alchemy@2.0.0-beta.63: resolution: {integrity: sha512-NUcEK9a3cLltkWTTb5kVLH695X9MWO641n94Gi2AqqkU/9xj5QwHMluv9jQB3qDQ/l079F6TWXYf861t5zXEHA==} hasBin: true @@ -3318,10 +3511,18 @@ packages: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} + ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + ansi-styles@6.2.3: resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} engines: {node: '>=12'} + ansis@4.3.1: + resolution: {integrity: sha512-BJ8/l4R5LRE7hW9WdSuGYrLSHi2ynxeFpDFbH0K/CgNeY/tyhk+vO6TYxXC5r5CpUhNVX310xzPsN/H9lCdfOA==} + engines: {node: '>=14'} + anynum@1.0.1: resolution: {integrity: sha512-N6//FLET/tXYNM/F6ABca1oH6fWB+KlTt909Le28WMDBk8oaT4vY17DCrwg2MvmuqUKt3Ni4N5dGJ/EoBgcO6A==} @@ -3332,6 +3533,9 @@ packages: resolution: {integrity: sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==} engines: {node: '>=10'} + aria-query@5.3.0: + resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} + aria-query@5.3.2: resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} engines: {node: '>= 0.4'} @@ -3344,9 +3548,6 @@ packages: resolution: {integrity: sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==} engines: {node: '>= 0.4'} - array-timsort@1.0.3: - resolution: {integrity: sha512-/+3GRL7dDAGEfM6TseQk/U+mi18TU2Ms9I3UlLdUMhz2hbvGNTKdj9xniwXfUqgYhHxRx0+8UnKkvlNwVU+cWQ==} - array.prototype.findlast@1.2.5: resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==} engines: {node: '>= 0.4'} @@ -3378,6 +3579,10 @@ packages: ast-types-flow@0.0.8: resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==} + ast-types@0.16.1: + resolution: {integrity: sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==} + engines: {node: '>=4'} + astring@1.9.0: resolution: {integrity: sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==} hasBin: true @@ -3386,8 +3591,9 @@ packages: resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} engines: {node: '>= 0.4'} - asynckit@0.4.0: - resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + atomically@1.7.0: + resolution: {integrity: sha512-Xcz9l0z7y9yQ9rdDaxlmaI4uJHf/T8g9hOEzJcsEqX2SjCj4J20uK7+ldkDHMbpJDK76wF7xEIgxc/vSlsfw5w==} + engines: {node: '>=10.12.0'} auto-bind@5.0.1: resolution: {integrity: sha512-ooviqdwwgfIfNmDwo94wlshcdzfO64XV0Cg6oDsDYBJfITDz1EngD2z7DkbvCWn+XIMsIqW27sEVF6qcpJrRcg==} @@ -3412,6 +3618,9 @@ packages: resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} engines: {node: '>= 0.4'} + babel-dead-code-elimination@1.0.12: + resolution: {integrity: sha512-GERT7L2TiYcYDtYk1IpD+ASAYXjKbLTDPhBtYj7X1NuRMDTMtAx9kyBenub1Ev41lo91OHCKdmP+egTDmfQ7Ig==} + bail@2.0.2: resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} @@ -3427,12 +3636,12 @@ packages: engines: {node: '>=6.0.0'} hasBin: true - before-after-hook@3.0.2: - resolution: {integrity: sha512-Nik3Sc0ncrMK4UUdXQmAnRtzmNQTAAXmXIopizwZ1W1t8QmfJj+zL4OA2I7XPTPW5z5TDqv4hRo/JzouDJnX3A==} - before-after-hook@4.0.0: resolution: {integrity: sha512-q6tR3RPqIB1pMiTRMFcZwuG5T8vwp+vUvEG0vuI6B+Rikh5BfPp2fQ82c925FOs+b0lcFQ8CFrL+KbilfZFhOQ==} + bidi-js@1.0.3: + resolution: {integrity: sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==} + blake3-wasm@2.1.5: resolution: {integrity: sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g==} @@ -3446,9 +3655,6 @@ packages: brace-expansion@1.1.16: resolution: {integrity: sha512-IDw48K2/2kRkg9LdJxurvq3lV3aBgq0REY89duEqFRthjlPdXHKMj7EnQOXVckxzgisinf3nHfrcE2FufFLXMw==} - brace-expansion@2.1.2: - resolution: {integrity: sha512-w5JZcKgdhDOgOwm8H+KgbosopHMuGcl6qbulwjtz3SM7I7P3yW1eAjzMPLrIE+NQ9vjgANKHWeMHnrT0OXW1oA==} - brace-expansion@5.0.7: resolution: {integrity: sha512-7oFy703dxfY3/NLxC1fh2SUCQ0H9rmAY+5EpDVfXjUTTs+HEwR2nYaqLv+GWcTsumwxPfiz6CzCNkwXwBUwqCA==} engines: {node: 18 || 20 || >=22} @@ -3526,10 +3732,6 @@ packages: resolution: {integrity: sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==} engines: {node: '>= 20.19.0'} - ci-info@4.4.0: - resolution: {integrity: sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==} - engines: {node: '>=8'} - class-variance-authority@0.7.1: resolution: {integrity: sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==} @@ -3541,19 +3743,28 @@ packages: resolution: {integrity: sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + cli-cursor@5.0.0: + resolution: {integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==} + engines: {node: '>=18'} + + cli-spinners@2.9.2: + resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} + engines: {node: '>=6'} + cli-truncate@5.2.0: resolution: {integrity: sha512-xRwvIOMGrfOAnM1JYtqQImuaNtDEv9v6oIYAs4LIHwTiKee8uwvIi363igssOC0O5U04i4AlENs79LQLu9tEMw==} engines: {node: '>=20'} + cli-width@4.1.0: + resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} + engines: {node: '>= 12'} + client-only@0.0.1: resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} - cliui@9.0.1: - resolution: {integrity: sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==} - engines: {node: '>=20'} - - cloudflare@4.5.0: - resolution: {integrity: sha512-fPcbPKx4zF45jBvQ0z7PCdgejVAPBBCZxwqk1k7krQNfpM07Cfj97/Q6wBzvYqlWXx/zt1S9+m8vnfCe06umbQ==} + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} clsx@2.1.1: resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} @@ -3567,6 +3778,9 @@ packages: resolution: {integrity: sha512-EjXKMfGfdwtV4AcNSQ6AwQaVzpC1B7IxeiwA3FlhTXz+YFlMKVi4c1JX9tgD2QOlahQXjB8KUXrBaYG+3v871Q==} hasBin: true + code-block-writer@13.0.3: + resolution: {integrity: sha512-Oofo0pq3IKnsFtuHqSF7TqBfr71aeyZDVJ0HpmqB7FBM2qEigL0iPONSCZSO9pE9dZTAxANe5XHG9Uy0YMv8cg==} + code-excerpt@4.0.0: resolution: {integrity: sha512-xxodCmBen3iy2i0WtAK8FlFNrRzjUqjRsMfho58xT/wvZU1YTM3fCnRjcy1gJPMepaRlgm/0e6w8SpWHpn3/cA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -3581,10 +3795,6 @@ packages: color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - combined-stream@1.0.8: - resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} - engines: {node: '>= 0.8'} - comma-separated-tokens@2.0.3: resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} @@ -3599,9 +3809,9 @@ packages: commander@2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - comment-json@4.6.2: - resolution: {integrity: sha512-R2rze/hDX30uul4NZoIZ76ImSJLFxn/1/ZxtKC1L77y2X1k+yYu1joKbAtMA2Fg3hZrTOiw0I5mwVMo0cf250w==} - engines: {node: '>= 6'} + comment-parser@1.4.7: + resolution: {integrity: sha512-0h+uSNtQGW3D98eQt3jJ8L06Fves8hncB4V/PKdw/Qb8Hnk19VaKuTr55UNRYiSoVa7WwrFls+rh3ux9agmkeQ==} + engines: {node: '>= 12.0.0'} compute-scroll-into-view@3.1.1: resolution: {integrity: sha512-VRhuHOLoKYOy4UbilLbUzbYg93XLjv2PncJC50EuTWPA3gaja1UjBsUP/D/9/juV3vQFr6XBEzn9KCAHdUvOHw==} @@ -3609,6 +3819,10 @@ packages: concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + conf@10.2.0: + resolution: {integrity: sha512-8fLl9F04EJqjSqH+QjITQfJF8BrOVaYr1jewVgSRAEWePfxT0sku4w2hrGQ60BC/TNLGQ2pgxNlTbWQmMPFvXg==} + engines: {node: '>=12'} + content-disposition@1.1.0: resolution: {integrity: sha512-5jRCH9Z/+DRP7rkvY83B+yGIGX96OYdJmzngqnw2SBSxqCFPd0w2km3s5iawpGX8krnwSGmF0FW5Nhr0Hfai3g==} engines: {node: '>=18'} @@ -3628,6 +3842,9 @@ packages: resolution: {integrity: sha512-rcQ1bsQO9799wq24uE5AM2tAILy4gXGIK/njFWcVQkGNZ96edlpY+A7bjwvzjYvLDyzmG1MmMLZhpcsb+klNMQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + cookie-es@3.1.1: + resolution: {integrity: sha512-UaXxwISYJPTr9hwQxMFYZ7kNhSXboMXP+Z3TRX6f1/NyaGPfuNUZOWP1pUEb75B2HjfklIYLVRfWiFZJyC6Npg==} + cookie-signature@1.2.2: resolution: {integrity: sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==} engines: {node: '>=6.6.0'} @@ -3643,16 +3860,50 @@ packages: core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + cors@2.8.6: + resolution: {integrity: sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==} + engines: {node: '>= 0.10'} + + cosmiconfig@9.0.2: + resolution: {integrity: sha512-gtTZxTDau1wL7Y7zifc2dd8jHSK/k6BTx/2Xp/BpdlAdnlYWFVt7qhJqgwi7637yRwRQ3qL4ZidbB4I8tA5VOg==} + engines: {node: '>=14'} + peerDependencies: + typescript: '>=4.9.5' + peerDependenciesMeta: + typescript: + optional: true + cross-spawn@7.0.6: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} - csstype@3.2.3: + css-tree@3.2.1: + resolution: {integrity: sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} + + cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + + cssstyle@6.2.0: + resolution: {integrity: sha512-Fm5NvhYathRnXNVndkUsCCuR63DCLVVwGOOwQw782coXFi5HhkXdu289l59HlXZBawsyNccXfWRYvLzcDCdDig==} + engines: {node: '>=20'} + + csstype@3.2.3: resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} damerau-levenshtein@1.0.8: resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} + data-uri-to-buffer@4.0.1: + resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} + engines: {node: '>= 12'} + + data-urls@7.0.0: + resolution: {integrity: sha512-23XHcCF+coGYevirZceTVD7NdJOqVn+49IHyxgszm+JIiHLoB2TkmPtsYkNWT1pvRSGkc35L6NHs0yHkN2SumA==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + data-view-buffer@1.0.2: resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} engines: {node: '>= 0.4'} @@ -3665,6 +3916,13 @@ packages: resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} engines: {node: '>= 0.4'} + dayjs@1.11.21: + resolution: {integrity: sha512-98IT+HOahAisibz/yjKbzuOBwYcjJ7BCLPzARyHiyEBmRz4fatF+KPJszEHXsGYjUG234aH/cOjW1wwTbKUZlA==} + + debounce-fn@4.0.0: + resolution: {integrity: sha512-8pYCQiL9Xdcg0UPSD3d+0KMlOjp+KGU5EPwYddgzQ7DATsg4fuUDjQtsYLmWjnk2obnNHgV3vE2Y4jejSOJVBQ==} + engines: {node: '>=10'} + debug@3.2.7: resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} peerDependencies: @@ -3682,12 +3940,27 @@ packages: supports-color: optional: true + decimal.js@10.6.0: + resolution: {integrity: sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==} + decode-named-character-reference@1.3.0: resolution: {integrity: sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==} + dedent@1.7.2: + resolution: {integrity: sha512-WzMx3mW98SN+zn3hgemf4OzdmyNhhhKz5Ay0pUfQiMQ3e1g+xmTJWp/pKdwKVXhdSkAEGIIzqeuWrL3mV/AXbA==} + peerDependencies: + babel-plugin-macros: ^3.1.0 + peerDependenciesMeta: + babel-plugin-macros: + optional: true + deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + default-browser-id@5.0.1: resolution: {integrity: sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==} engines: {node: '>=18'} @@ -3700,6 +3973,10 @@ packages: resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} engines: {node: '>= 0.4'} + define-lazy-prop@2.0.0: + resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} + engines: {node: '>=8'} + define-lazy-prop@3.0.0: resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} engines: {node: '>=12'} @@ -3708,13 +3985,6 @@ packages: resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} engines: {node: '>= 0.4'} - defu@6.1.7: - resolution: {integrity: sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==} - - delayed-stream@1.0.0: - resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} - engines: {node: '>=0.4.0'} - denque@2.1.0: resolution: {integrity: sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==} engines: {node: '>=0.10'} @@ -3741,120 +4011,29 @@ packages: devlop@1.1.0: resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + diff@8.0.4: + resolution: {integrity: sha512-DPi0FmjiSU5EvQV0++GFDOJ9ASQUVFh5kD+OzOnYdi7n3Wpm9hWWGfB/O2blfHcMVTL5WkQXSnRiK9makhrcnw==} + engines: {node: '>=0.3.1'} + doctrine@2.1.0: resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} engines: {node: '>=0.10.0'} - dotenv@16.6.1: - resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==} - engines: {node: '>=12'} + dom-accessibility-api@0.5.16: + resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} - drizzle-orm@0.45.2: - resolution: {integrity: sha512-kY0BSaTNYWnoDMVoyY8uxmyHjpJW1geOmBMdSSicKo9CIIWkSxMIj2rkeSR51b8KAPB7m+qysjuHme5nKP+E5Q==} - peerDependencies: - '@aws-sdk/client-rds-data': '>=3' - '@cloudflare/workers-types': 5.20260717.1 - '@electric-sql/pglite': '>=0.2.0' - '@libsql/client': '>=0.10.0' - '@libsql/client-wasm': '>=0.10.0' - '@neondatabase/serverless': '>=0.10.0' - '@op-engineering/op-sqlite': '>=2' - '@opentelemetry/api': ^1.4.1 - '@planetscale/database': '>=1.13' - '@prisma/client': '*' - '@tidbcloud/serverless': '*' - '@types/better-sqlite3': '*' - '@types/pg': '*' - '@types/sql.js': '*' - '@upstash/redis': '>=1.34.7' - '@vercel/postgres': '>=0.8.0' - '@xata.io/client': '*' - better-sqlite3: '>=7' - bun-types: '*' - expo-sqlite: '>=14.0.0' - gel: '>=2' - knex: '*' - kysely: '*' - mysql2: '>=2' - pg: '>=8' - postgres: '>=3' - prisma: '*' - sql.js: '>=1' - sqlite3: '>=5' - peerDependenciesMeta: - '@aws-sdk/client-rds-data': - optional: true - '@cloudflare/workers-types': - optional: true - '@electric-sql/pglite': - optional: true - '@libsql/client': - optional: true - '@libsql/client-wasm': - optional: true - '@neondatabase/serverless': - optional: true - '@op-engineering/op-sqlite': - optional: true - '@opentelemetry/api': - optional: true - '@planetscale/database': - optional: true - '@prisma/client': - optional: true - '@tidbcloud/serverless': - optional: true - '@types/better-sqlite3': - optional: true - '@types/pg': - optional: true - '@types/sql.js': - optional: true - '@upstash/redis': - optional: true - '@vercel/postgres': - optional: true - '@xata.io/client': - optional: true - better-sqlite3: - optional: true - bun-types: - optional: true - expo-sqlite: - optional: true - gel: - optional: true - knex: - optional: true - kysely: - optional: true - mysql2: - optional: true - pg: - optional: true - postgres: - optional: true - prisma: - optional: true - sql.js: - optional: true - sqlite3: - optional: true + dot-prop@6.0.1: + resolution: {integrity: sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==} + engines: {node: '>=10'} + + dotenv@17.4.2: + resolution: {integrity: sha512-nI4U3TottKAcAD9LLud4Cb7b2QztQMUEfHbvhTH09bqXTxnSie8WnjPALV/WMCrJZ6UV/qHJ6L03OqO3LcdYZw==} + engines: {node: '>=12'} dunder-proto@1.0.1: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} - duplexer@0.1.2: - resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} - - eastasianwidth@0.2.0: - resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - - eciesjs@0.4.18: - resolution: {integrity: sha512-wG99Zcfcys9fZux7Cft8BAX/YrOJLJSZ3jyYPfhZHqN2E+Ffx+QXBDsv3gubEgPtV6dTzJMSQUwk1H98/t/0wQ==} - engines: {bun: '>=1', deno: '>=2', node: '>=16'} - ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} @@ -3889,14 +4068,21 @@ packages: resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} engines: {node: '>=0.12'} - env-paths@3.0.0: - resolution: {integrity: sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + entities@8.0.0: + resolution: {integrity: sha512-zwfzJecQ/Uej6tusMqwAqU/6KL2XaB2VZ2Jg54Je6ahNBGNH6Ek6g3jjNCF0fG9EWQKGZNddNjU5F1ZQn/sBnA==} + engines: {node: '>=20.19.0'} + + env-paths@2.2.1: + resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} + engines: {node: '>=6'} environment@1.1.0: resolution: {integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==} engines: {node: '>=18'} + error-ex@1.3.4: + resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==} + error-stack-parser-es@1.0.5: resolution: {integrity: sha512-5qucVt2XcuGMcEGgWI7i+yZpmpByQ8J1lHhcL7PwqCwu9FPP3VUXzT4ltHe5i2z9dePwEHcDVOAfSnHsOlCXRA==} @@ -3948,16 +4134,6 @@ packages: esast-util-from-js@2.0.1: resolution: {integrity: sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw==} - esbuild@0.25.12: - resolution: {integrity: sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==} - engines: {node: '>=18'} - hasBin: true - - esbuild@0.25.4: - resolution: {integrity: sha512-8pgjLUcUjcgDg+2Q4NYXnPbo/vncAY4UmyaCm0jZevERqCHZIaWwdJHkf8XQtu4AxSKCdvrUbT0XUr1IdZzI8Q==} - engines: {node: '>=18'} - hasBin: true - esbuild@0.28.1: resolution: {integrity: sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw==} engines: {node: '>=18'} @@ -3982,6 +4158,12 @@ packages: resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} engines: {node: '>=12'} + eslint-compat-utils@0.5.1: + resolution: {integrity: sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q==} + engines: {node: '>=12'} + peerDependencies: + eslint: '>=6.0.0' + eslint-config-next@16.2.10: resolution: {integrity: sha512-HSybLOY0QKf39i4FWUqPN0xWiNDi6A6UqJmZtgDkS3zMqjXTqULvj/sueXx3cdCG0mVG+qH6k5/qdegklH1d1w==} peerDependencies: @@ -3991,6 +4173,15 @@ packages: typescript: optional: true + eslint-import-context@0.1.9: + resolution: {integrity: sha512-K9Hb+yRaGAGUbwjhFNHvSmmkZs9+zbuoe3kFQ4V1wYjrepUFYM2dZAfNtjbbj3qsPfUfsA68Bx/ICWQMi+C8Eg==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + peerDependencies: + unrs-resolver: ^1.0.0 + peerDependenciesMeta: + unrs-resolver: + optional: true + eslint-import-resolver-node@0.3.10: resolution: {integrity: sha512-tRrKqFyCaKict5hOd244sL6EQFNycnMQnBe+j8uqGNXYzsImGbGUU4ibtoaBmv5FLwJwcFJNeg1GeVjQfbMrDQ==} @@ -4028,6 +4219,25 @@ packages: eslint-import-resolver-webpack: optional: true + eslint-plugin-es-x@7.8.0: + resolution: {integrity: sha512-7Ds8+wAAoV3T+LAKeu39Y5BzXCrGKrcISfgKEqTS4BDN8SFEDQd0S43jiQ8vIa3wUKD07qitZdfzlenSi8/0qQ==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + eslint: '>=8' + + eslint-plugin-import-x@4.17.1: + resolution: {integrity: sha512-4cdstYkKCyjumM2Q9NSI03K8D2a9F4Ssz33K2lv2hQa4KmR9jPLwk3uWGtNvclfqBrPGfGuMBwsGMbe6dMRbfg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + '@typescript-eslint/utils': ^8.56.0 + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + eslint-import-resolver-node: '*' + peerDependenciesMeta: + '@typescript-eslint/utils': + optional: true + eslint-import-resolver-node: + optional: true + eslint-plugin-import@2.32.0: resolution: {integrity: sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==} engines: {node: '>=4'} @@ -4044,6 +4254,12 @@ packages: peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9 + eslint-plugin-n@17.24.0: + resolution: {integrity: sha512-/gC7/KAYmfNnPNOb3eu8vw+TdVnV0zhdQwexsw6FLXbhzroVj20vRn2qL8lDWDGnAQ2J8DhdfvXxX9EoxvERvw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: '>=8.23.0' + eslint-plugin-react-hooks@7.1.1: resolution: {integrity: sha512-f2I7Gw6JbvCexzIInuSbZpfdQ44D7iqdWX01FKLvrPgqxoE7oMj8clOfto8U6vYiz4yd5oKu39rRSVOe1zRu0g==} engines: {node: '>=18'} @@ -4072,6 +4288,16 @@ packages: resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} + eslint@9.39.4: + resolution: {integrity: sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + hasBin: true + peerDependencies: + jiti: '*' + peerDependenciesMeta: + jiti: + optional: true + eslint@9.39.5: resolution: {integrity: sha512-DgZS62aPLXKlnxILS/AYCoRvHaZeXceIzlXPkkGGzJWSow1aEk0lbTlxUSlyjC8jcaKxAdOnTDz+o1JFSBsyjw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -4135,9 +4361,13 @@ packages: resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} engines: {node: '>= 0.6'} - event-target-shim@5.0.1: - resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} - engines: {node: '>=6'} + eventsource-parser@3.1.0: + resolution: {integrity: sha512-kJezFj9YFAMLeORyi7aCLxLbD5/qWMQnoMVlVPyHIll7lgRJCc3JVln9Vgl9nwQi0YkMnhdGTMNn7CkRRAptMg==} + engines: {node: '>=18.0.0'} + + eventsource@3.0.7: + resolution: {integrity: sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==} + engines: {node: '>=18.0.0'} execa@5.1.1: resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} @@ -4151,6 +4381,12 @@ packages: resolution: {integrity: sha512-KfYbmpRm0VbLjEvVa9yGwCi9GI34xvi7A/HXYWQO65CSD2u3MczUJSuwXKFIxlGsgBQizV9q5J9NHj4VG0n+pA==} engines: {node: '>=12.0.0'} + express-rate-limit@8.6.0: + resolution: {integrity: sha512-XKJXDsASUOo0LLtFwW5hCcQGH0N4WQc/Rn8/Pvoia+TJFOkkFPvrtW9lZOeeNcxQJspvOIERMwiRLsVFlhHEkA==} + engines: {node: '>= 16'} + peerDependencies: + express: '>= 4.11' + express@5.2.1: resolution: {integrity: sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==} engines: {node: '>= 18'} @@ -4165,9 +4401,6 @@ packages: resolution: {integrity: sha512-7ms6T7SybUev/PQITciI0yLM2pOSFy5zpG8Ty7tQofcVaQUvrMXp6CBwqF6fThLCLOrfBtuHAtwq6Yu4XPCllg==} engines: {node: '>=12.17.0'} - fast-content-type-parse@2.0.1: - resolution: {integrity: sha512-nGqtvLrj5w0naR6tDPfB4cUmYCqouzyQiz6C5y/LtcDllJdrcc6WaWW6iXyIIOErTa/XRybj28aasdn4LkVk6Q==} - fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} @@ -4179,15 +4412,24 @@ packages: resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} engines: {node: '>=8.6.0'} - fast-json-patch@3.1.1: - resolution: {integrity: sha512-vf6IHUX2SBcA+5/+4883dsIjpBTqmfBjmYiWK1savxQmFk4JfBMLa7ynTYOs1Rolp/T1betJxHiGD3g1Mn8lUQ==} - fast-json-stable-stringify@2.1.0: resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + fast-string-truncated-width@3.0.3: + resolution: {integrity: sha512-0jjjIEL6+0jag3l2XWWizO64/aZVtpiGE3t0Zgqxv0DPuxiMjvB3M24fCyhZUO4KomJQPj3LTSUnDP3GpdwC0g==} + + fast-string-width@3.0.2: + resolution: {integrity: sha512-gX8LrtNEI5hq8DVUfRQMbr5lpaS4nMIWV+7XEbXk2b8kiQIizgnlr12B4dA3ZEx3308ze0O4Q1R+cHts8kyUJg==} + + fast-uri@3.1.3: + resolution: {integrity: sha512-i70LwGWUduXqzicKXWshooq+sWL1K3WUU5rKZNG/0i3a1OSoX3HqhH5WbWwTmqWfor4urUakGPiRQcleRZTwOg==} + + fast-wrap-ansi@0.2.2: + resolution: {integrity: sha512-7F2Fl+TjRSenLqlU3UjSH0iyqopqoZIu7eZVpEirP2g1GtWa2G/ecEmBdgz31+Mxr+ELclgg6sokpSFIQiZ02Q==} + fast-xml-builder@1.2.1: resolution: {integrity: sha512-tPb5TTWfgfVx5BNSi2xV0eLr89POeXXn0dXIsCJ9m1narrWxeIyx6je9d7Rce/3NyXLbvuQmLkxq+RuxMWejvw==} @@ -4207,6 +4449,13 @@ packages: picomatch: optional: true + fetch-blob@3.2.0: + resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} + engines: {node: ^12.20 || >= 14.13} + + fetchdts@0.1.7: + resolution: {integrity: sha512-YoZjBdafyLIop9lSxXVI33oLD5kN31q4Td+CasofLLYeLXRFeOsuOw0Uo+XNRi9PZlbfdlN2GmRtm4tCEQ9/KA==} + figures@6.1.0: resolution: {integrity: sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==} engines: {node: '>=18'} @@ -4226,9 +4475,9 @@ packages: find-my-way-ts@0.1.6: resolution: {integrity: sha512-a85L9ZoXtNAey3Y6Z+eBWW658kO/MwR7zIafkIUPUMf3isZG0NCs2pjW2wtjxAKuJPxMAsHUIP4ZPGv0o5gyTA==} - find-process@2.1.1: - resolution: {integrity: sha512-SrQDx3QhlmHM90iqn9rdjCQcw/T+WlpOkHFsjoRgB+zTpDfltNA1VSNYeYELwhUTJy12UFxqjWhmhOrJc+o4sA==} - hasBin: true + find-up@3.0.0: + resolution: {integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==} + engines: {node: '>=6'} find-up@5.0.0: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} @@ -4245,20 +4494,9 @@ packages: resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} engines: {node: '>= 0.4'} - foreground-child@3.3.1: - resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} - engines: {node: '>=14'} - - form-data-encoder@1.7.2: - resolution: {integrity: sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A==} - - form-data@4.0.6: - resolution: {integrity: sha512-vKatAh4SlVfgbv+YtmhiRjhEMJsYpsG1Y2rMQtR+SVSbytsSD1YGzDIcrAJmdFec88u/+VoGmxnl+80gL1tRCQ==} - engines: {node: '>= 6'} - - formdata-node@4.4.1: - resolution: {integrity: sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ==} - engines: {node: '>= 12.20'} + formdata-polyfill@4.0.10: + resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} + engines: {node: '>=12.20.0'} forwarded@0.2.0: resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} @@ -4282,8 +4520,9 @@ packages: resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==} engines: {node: '>= 0.8'} - fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + fs-extra@11.3.6: + resolution: {integrity: sha512-w8ZNZr2mKIc7qeNaQ9AVPT1+iFaI+Avd4xudVOvdDJ8VytREi1Ft5Ih7hd9jjehod8vAM5GMsfQ/TpPf4EyoEA==} + engines: {node: '>=14.14'} fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} @@ -4416,6 +4655,9 @@ packages: functions-have-names@1.2.3: resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + fuzzysort@3.1.0: + resolution: {integrity: sha512-sR9BNCjBg6LNgwvxlBd0sBABvQitkLzoVY9MYYROQVX/FvfJ4Mai9LsGhDgd8qYdds0bY77VzYd5iuB+v5rwQQ==} + generate-function@2.3.1: resolution: {integrity: sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==} @@ -4443,6 +4685,10 @@ packages: resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} engines: {node: '>=6'} + get-own-enumerable-keys@1.0.0: + resolution: {integrity: sha512-PKsK2FSrQCyxcGHsGrLDcK0lx+0Ke+6e8KFFozA9/fIQLhQzPaRvJFdcz7+Axg3jUH/Mq+NI4xa5u/UT2tQskA==} + engines: {node: '>=14.16'} + get-proto@1.0.1: resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} engines: {node: '>= 0.4'} @@ -4473,33 +4719,34 @@ packages: resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} engines: {node: '>=10.13.0'} - glob@10.5.0: - resolution: {integrity: sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==} - deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me - hasBin: true - - glob@12.0.0: - resolution: {integrity: sha512-5Qcll1z7IKgHr5g485ePDdHcNQY0k2dtv/bjYy0iuyGxQw2qSOiiXUXJ+AYQpg3HNoUMHqAruX478Jeev7UULw==} - engines: {node: 20 || >=22} - hasBin: true - - glob@9.3.5: - resolution: {integrity: sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==} - engines: {node: '>=16 || 14 >=14.17'} - deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me - globals@14.0.0: resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} engines: {node: '>=18'} + globals@15.15.0: + resolution: {integrity: sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==} + engines: {node: '>=18'} + globals@16.4.0: resolution: {integrity: sha512-ob/2LcVVaVGCYN+r14cnwnoDPUufjiYgSqRhiFD0Q1iI4Odora5RE8Iv1D24hAz5oMophRGkGz+yuvQmmUMnMw==} engines: {node: '>=18'} + globals@17.7.0: + resolution: {integrity: sha512-Czmyns5dUsq4seFBR/Kdydhmo8y9kC79hiSkPn0YcGtNnYWnrgt0vjrSjx9tspoDGWm2CMarffRuLjM4xUz8xg==} + engines: {node: '>=18'} + globalthis@1.0.4: resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} engines: {node: '>= 0.4'} + globrex@0.1.2: + resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} + + goober@2.1.19: + resolution: {integrity: sha512-U7veizMqxyKlM58+Z5j2ngJBH/r9siDmxpvNxSw0PylF6WQvrASJEZrxh1hidRBJc2jqoBVSyOban5u8m+6Rxg==} + peerDependencies: + csstype: ^3.0.10 + gopd@1.2.0: resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} engines: {node: '>= 0.4'} @@ -4507,9 +4754,19 @@ packages: graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - gzip-size@6.0.0: - resolution: {integrity: sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==} - engines: {node: '>=10'} + graphql@16.14.2: + resolution: {integrity: sha512-Chq1s4CY7jmh8gO2qvLIJyfCDIN+EHLFW/9iShnp1z8FjBQMoodWP1kDC36VAMXXIvAjj4ARa7ntfAV2BrjsbA==} + engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0} + + h3@2.0.1-rc.20: + resolution: {integrity: sha512-28ljodXuUp0fZovdiSRq4G9OgrxCztrJe5VdYzXAB7ueRvI7pIUqLU14Xi3XqdYJ/khXjfpUOOD2EQa6CmBgsg==} + engines: {node: '>=20.11.1'} + hasBin: true + peerDependencies: + crossws: ^0.4.1 + peerDependenciesMeta: + crossws: + optional: true has-bigints@1.1.0: resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} @@ -4565,12 +4822,23 @@ packages: hastscript@9.0.1: resolution: {integrity: sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==} + headers-polyfill@5.0.1: + resolution: {integrity: sha512-1TJ6Fih/b8h5TIcv+1+Hw0PDQWJTKDKzFZzcKOiW1wJza3XoAQlkCuXLbymPYB8+ZQyw8mHvdw560e8zVFIWyA==} + hermes-estree@0.25.1: resolution: {integrity: sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==} hermes-parser@0.25.1: resolution: {integrity: sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==} + hono@4.12.30: + resolution: {integrity: sha512-emn+JoJjrN9YTpRDS5it/UI2SO9BAE37T6I3d963RxcZ81G9A4pr2SZTEiiaiKbzx+NKRg5BZ89fCL7gCJCUog==} + engines: {node: '>=16.9.0'} + + html-encoding-sniffer@6.0.0: + resolution: {integrity: sha512-CV9TW3Y3f8/wT0BRFc1/KAVQ3TUHiXmaAb6VW9vtiMFf7SLoMd1PdAc4W3KFOFETBJUb90KatHqlsZMWV+R9Gg==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + html-void-elements@3.0.0: resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} @@ -4578,6 +4846,14 @@ packages: resolution: {integrity: sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==} engines: {node: '>= 0.8'} + http-proxy-agent@7.0.2: + resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} + engines: {node: '>= 14'} + + https-proxy-agent@7.0.6: + resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} + engines: {node: '>= 14'} + human-signals@2.1.0: resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} engines: {node: '>=10.17.0'} @@ -4586,9 +4862,6 @@ packages: resolution: {integrity: sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ==} engines: {node: '>=18.18.0'} - humanize-ms@1.2.1: - resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} - iconv-lite@0.7.3: resolution: {integrity: sha512-IKXpvIzjnC9XTAUbVBcMfGS0EPaIXtW6v+zr+RRp+hqULEpo0owZax6wyRwPOJbWbzjYspQwusTsfVr0ifh4uQ==} engines: {node: '>=0.10.0'} @@ -4647,6 +4920,10 @@ packages: resolution: {integrity: sha512-ehuGcf94bQXhfagULNXrJdfnWO38v070jxSx/qE87Kjzmu2fU7ro5EFAb+OPituLqgfyuQaym5DlrNydW2sJ9A==} engines: {node: '>=12.22.0'} + ip-address@10.2.0: + resolution: {integrity: sha512-/+S6j4E9AHvW9SWMSEY9Xfy66O5PWvVEJ08O0y5JGyEKQpojb0K0GKpz/v5HJ/G0vi3D2sjGK78119oXZeE0qA==} + engines: {node: '>= 12'} + ipaddr.js@1.9.1: resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} engines: {node: '>= 0.10'} @@ -4661,6 +4938,9 @@ packages: resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} engines: {node: '>= 0.4'} + is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + is-async-function@2.1.1: resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==} engines: {node: '>= 0.4'} @@ -4695,6 +4975,11 @@ packages: is-decimal@2.0.1: resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} + is-docker@2.2.1: + resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} + engines: {node: '>=8'} + hasBin: true + is-docker@3.0.0: resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -4736,11 +5021,19 @@ packages: engines: {node: '>=20'} hasBin: true + is-in-ssh@1.0.0: + resolution: {integrity: sha512-jYa6Q9rH90kR1vKB6NM7qqd1mge3Fx4Dhw5TVlK1MUBqhEOuCagrEHMevNuCcbECmXZ0ThXkRm+Ymr51HwEPAw==} + engines: {node: '>=20'} + is-inside-container@1.0.0: resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} engines: {node: '>=14.16'} hasBin: true + is-interactive@2.0.0: + resolution: {integrity: sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==} + engines: {node: '>=12'} + is-map@2.0.3: resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} engines: {node: '>= 0.4'} @@ -4749,6 +5042,9 @@ packages: resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} engines: {node: '>= 0.4'} + is-node-process@1.2.0: + resolution: {integrity: sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==} + is-number-object@1.1.1: resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} engines: {node: '>= 0.4'} @@ -4757,10 +5053,21 @@ packages: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} + is-obj@2.0.0: + resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} + engines: {node: '>=8'} + + is-obj@3.0.0: + resolution: {integrity: sha512-IlsXEHOjtKhpN8r/tRFj2nDyTmHvcfNeu/nrRIcXE17ROeatXchkojffa1SpdqW4cr/Fj6QkEf/Gn4zf6KKvEQ==} + engines: {node: '>=12'} + is-plain-obj@4.1.0: resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} engines: {node: '>=12'} + is-potential-custom-element-name@1.0.1: + resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} + is-promise@4.0.0: resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==} @@ -4771,6 +5078,10 @@ packages: resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} engines: {node: '>= 0.4'} + is-regexp@3.1.0: + resolution: {integrity: sha512-rbku49cWloU5bSMI+zaRaXdQHXnthP6DZ/vLnfdSKyL4zUzuWnomtOEiZZOd+ioQ+avFo/qau3KPTc7Fjy1uPA==} + engines: {node: '>=12'} + is-set@2.0.3: resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} engines: {node: '>= 0.4'} @@ -4799,6 +5110,10 @@ packages: resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} engines: {node: '>= 0.4'} + is-unicode-supported@1.3.0: + resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==} + engines: {node: '>=12'} + is-unicode-supported@2.1.0: resolution: {integrity: sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==} engines: {node: '>=18'} @@ -4818,6 +5133,10 @@ packages: resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} engines: {node: '>= 0.4'} + is-wsl@2.2.0: + resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} + engines: {node: '>=8'} + is-wsl@3.1.1: resolution: {integrity: sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==} engines: {node: '>=16'} @@ -4828,6 +5147,10 @@ packages: isarray@2.0.5: resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + isbot@5.2.1: + resolution: {integrity: sha512-dJ+LpKyClQZ7NG+j3OensC/mAZkGpukE9YUrgPYvAZj2doVL0edfDgywTUh5CXa0o+nW9a1V9e5+CJTX8+SxRw==} + engines: {node: '>=18'} + isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} @@ -4839,17 +5162,13 @@ packages: resolution: {integrity: sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==} engines: {node: '>= 0.4'} - jackspeak@3.4.3: - resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} - - jackspeak@4.2.3: - resolution: {integrity: sha512-ykkVRwrYvFm1nb2AJfKKYPr0emF6IiXDYUaFx4Zn9ZuIH7MrzEZ3sD5RlqGXNRpHtvUHJyOnCEFxOlNDtGo7wg==} - engines: {node: 20 || >=22} - jiti@2.7.0: resolution: {integrity: sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==} hasBin: true + jose@6.2.3: + resolution: {integrity: sha512-YYVDInQKFJfR/xa3ojUTl8c2KoTwiL1R5Wg9YCydwH0x0B9grbzlg5HC7mMjCtUJjbQ/YnGEZIhI5tCgfTb4Hw==} + js-base64@3.9.1: resolution: {integrity: sha512-U73qptcvf/HIOauFOmqT3a0mDUp0MYlfd15oqoe9kqZt5XhiXVb+HG09sLvI9PQ9tZIBFS4nlErai8zbWazP0g==} @@ -4860,6 +5179,15 @@ packages: resolution: {integrity: sha512-1td788aAnnZ5qs7V2QIRl1owjtYpbKt749Y3xauqQgwIIGF/xXWz1wMTEBx5O3LK3lXLVuqXPdPxj2BoFHaW9Q==} hasBin: true + jsdom@28.1.0: + resolution: {integrity: sha512-0+MoQNYyr2rBHqO1xilltfDjV9G7ymYGlAUazgcDLQaUf8JDHbuGwsxN6U9qWaElZ4w1B2r7yEGIL3GdeW3Rug==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + peerDependencies: + canvas: ^3.0.0 + peerDependenciesMeta: + canvas: + optional: true + jsesc@3.1.0: resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} engines: {node: '>=6'} @@ -4868,9 +5196,21 @@ packages: json-buffer@3.0.1: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + json-schema-traverse@0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + + json-schema-typed@7.0.3: + resolution: {integrity: sha512-7DE8mpG+/fVw+dTpjbxnx47TaMnDfOI1jwft9g1VybltZCduyRQPJPvc+zzKY9WPHxhPWczyFuYa6I8Mw4iU5A==} + + json-schema-typed@8.0.2: + resolution: {integrity: sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA==} + json-stable-stringify-without-jsonify@1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} @@ -4886,6 +5226,9 @@ packages: engines: {node: '>=6'} hasBin: true + jsonfile@6.2.1: + resolution: {integrity: sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==} + jsx-ast-utils@3.3.5: resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} engines: {node: '>=4.0'} @@ -4896,6 +5239,10 @@ packages: keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + kleur@3.0.3: + resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} + engines: {node: '>=6'} + kleur@4.1.5: resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} engines: {node: '>=6'} @@ -4910,6 +5257,9 @@ packages: resolution: {integrity: sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==} engines: {node: '>=0.10'} + launch-editor@2.14.1: + resolution: {integrity: sha512-QWBrQsMpH7gPr965dsKD/3cKWiNoTjpATQf++Xq63N6sKRGMwlVXz41O1IZTMfZQgBctD/K5Zt06+/I6pP6+HA==} + levn@0.4.1: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} @@ -5002,6 +5352,13 @@ packages: resolution: {integrity: sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==} engines: {node: '>= 12.0.0'} + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + locate-path@3.0.0: + resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==} + engines: {node: '>=6'} + locate-path@6.0.0: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} @@ -5009,9 +5366,9 @@ packages: lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - loglevel@1.9.2: - resolution: {integrity: sha512-HgMmCqIJSAKqo68l0rS2AanEWfkxaZ5wNiEFb5ggm08lDs9Xl2KxBlX3PTcaD2chBM1gXAYf491/M2Rv8Jwayg==} - engines: {node: '>= 0.6.0'} + log-symbols@6.0.0: + resolution: {integrity: sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==} + engines: {node: '>=18'} long@5.3.2: resolution: {integrity: sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==} @@ -5023,9 +5380,6 @@ packages: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true - lru-cache@10.4.3: - resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} - lru-cache@11.5.2: resolution: {integrity: sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==} engines: {node: 20 || >=22} @@ -5047,6 +5401,10 @@ packages: peerDependencies: react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0 + lz-string@1.5.0: + resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} + hasBin: true + magic-string@0.30.21: resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} @@ -5109,6 +5467,9 @@ packages: mdast-util-to-string@4.0.0: resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} + mdn-data@2.27.1: + resolution: {integrity: sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==} + media-typer@1.1.0: resolution: {integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==} engines: {node: '>= 0.8'} @@ -5233,18 +5594,10 @@ packages: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} - mime-db@1.52.0: - resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} - engines: {node: '>= 0.6'} - mime-db@1.54.0: resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==} engines: {node: '>= 0.6'} - mime-types@2.1.35: - resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} - engines: {node: '>= 0.6'} - mime-types@3.0.2: resolution: {integrity: sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==} engines: {node: '>=18'} @@ -5258,15 +5611,13 @@ packages: resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} engines: {node: '>=6'} - miniflare@4.20260424.0: - resolution: {integrity: sha512-B6MKBBd5TJ19daUc3Ae9rWctn1nDA/VCXykXfCsp9fTxyfGxnZY27tJs1caxgE9MWEMMKGbGHouqVtgKbKGxmw==} - engines: {node: '>=18.0.0'} - hasBin: true + mimic-fn@3.1.0: + resolution: {integrity: sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ==} + engines: {node: '>=8'} - miniflare@4.20260702.0: - resolution: {integrity: sha512-OqX/HwWWu0JqLQ7aCQU0int9fmpMzRjVWDo0T1WJDTssYc7KlaMM3G8N8HUEunkBMflmgI8TiAqmZTISqcVmEw==} - engines: {node: '>=22.0.0'} - hasBin: true + mimic-function@5.0.1: + resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} + engines: {node: '>=18'} miniflare@4.20260714.0: resolution: {integrity: sha512-MYlTCLdWCPqvrYY2uLwOjXwmglXuiHE3TGGkbOW4BwjUPa1r07E0iuHwrNDIs/sxK21r+o90Jx58AV2KeNdJZw==} @@ -5280,33 +5631,9 @@ packages: minimatch@3.1.5: resolution: {integrity: sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==} - minimatch@8.0.7: - resolution: {integrity: sha512-V+1uQNdzybxa14e/p00HZnQNNcTjnRJjDxg2V8wtkjFctq4M7hXFws4oekyTP0Jebeq7QYtpFyOeBAjc88zvYg==} - engines: {node: '>=16 || 14 >=14.17'} - - minimatch@9.0.9: - resolution: {integrity: sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==} - engines: {node: '>=16 || 14 >=14.17'} - minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - minipass@4.2.8: - resolution: {integrity: sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==} - engines: {node: '>=8'} - - minipass@7.1.3: - resolution: {integrity: sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==} - engines: {node: '>=16 || 14 >=14.17'} - - mkdirp@1.0.4: - resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} - engines: {node: '>=10'} - hasBin: true - - mnemonist@0.38.3: - resolution: {integrity: sha512-2K9QYubXx/NAjv4VLq1d1Ly8pWNC5L3BrixtdkyTegXWJIqY+zLNDhhX/A+ZwWt70tB1S8H4BE8FLYEFyNoOBw==} - motion-dom@12.42.2: resolution: {integrity: sha512-5gIMWLp/PycBtJRJWRgjxke5n8dlvkSn2DrYW+tr3XcqAZY1xZh6BJyooJXCM8wdfM7wfMjkBJNLge1CKPUIRA==} @@ -5327,10 +5654,6 @@ packages: react-dom: optional: true - mri@1.2.0: - resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} - engines: {node: '>=4'} - ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} @@ -5341,9 +5664,23 @@ packages: msgpackr@2.0.4: resolution: {integrity: sha512-o1C5KRmuRt+apqMr1HuGSqWStZoRBUpEsCsl15uM9VdAF1qHLtvMOU2En747EnTyEl6c4pzPewRMFF31s1CNbA==} + msw@2.15.0: + resolution: {integrity: sha512-2wQAmKkQKxRuXvYJxVhPGG0wZNBQyD06oJvxqw90XqLvptdqxdlHrFUfEteKkpaNORX3Xzc+HtEl/q0nfmN2wQ==} + engines: {node: '>=18'} + hasBin: true + peerDependencies: + typescript: '>= 4.8.x' + peerDependenciesMeta: + typescript: + optional: true + multipasta@0.2.8: resolution: {integrity: sha512-ZPWuMKyv0cSO29f7hozp+k6+crZbQijV8ipMvxNxRf2SwtYGTX1ZX89Kd20VV4H9Znonx+EQn+iy1wGQsJ+b+Q==} + mute-stream@3.0.0: + resolution: {integrity: sha512-dkEJPVvun4FryqBmZ5KhDo0K9iDXAwn08tMLDinNdRBNPcYEDiWYysLcc6k3mjTMlbP9KyylvRpd4wFtwrT9rw==} + engines: {node: ^20.17.0 || >=22.9.0} + mysql2@3.23.0: resolution: {integrity: sha512-ZwyGLoG9BRlL7hKNDcIy7q18hA6WTWGEpLAerGHXj5Xahemia4msZdwjIOUIzesjK3B5z5gWLktf+2tYSLAyTA==} engines: {node: '>= 8.0'} @@ -5371,10 +5708,6 @@ packages: resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==} engines: {node: '>= 0.6'} - neverthrow@8.2.0: - resolution: {integrity: sha512-kOCT/1MCPAxY5iUV3wytNFUMUolzuwd/VF/1KCx7kf6CutrOsTie+84zTGTpgQycjvfLdBBdvBvFLqFD2c0wkQ==} - engines: {node: '>=18'} - next-themes@0.4.6: resolution: {integrity: sha512-pZvgD5L0IEvX5/9GWyHMf3m8BKiVQwsCMHfoFosXtXBMnaS0ZnIJ9ST4b4NqLVKDEm8QBxoNNGNaBv2JNF6XNA==} peerDependencies: @@ -5411,14 +5744,9 @@ packages: resolution: {integrity: sha512-kXs9Go0cah0qHVV2v389IXQLdLCeE1xfFtjOAF+iobu0OIoG1pje8At2vMHyaPMiPMnG/LWP50twML21eMcAag==} engines: {node: '>= 0.4'} - node-fetch@2.7.0: - resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true + node-fetch@3.3.2: + resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} node-gyp-build-optional-packages@5.2.2: resolution: {integrity: sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw==} @@ -5472,16 +5800,10 @@ packages: resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==} engines: {node: '>= 0.4'} - obliterator@1.6.1: - resolution: {integrity: sha512-9WXswnqINnnhOG/5SLimUlzuU1hFJUc8zkwyD59Sd+dPOMf05PmnYG/d6Q7HZ+KmgkZJa1PxRso6QdM3sTNHig==} - obug@2.1.3: resolution: {integrity: sha512-9miFgM2OFba7hB+pRgvtV84pYTBaoTHohvmIgiRt6dRIzbwEOIaNaP+dIlGs2fNFoB0SeISs0Jz5WFVRid6Xyg==} engines: {node: '>=12.20.0'} - ohash@2.0.11: - resolution: {integrity: sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==} - on-finished@2.4.1: resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} engines: {node: '>= 0.8'} @@ -5493,37 +5815,62 @@ packages: resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} engines: {node: '>=6'} + onetime@7.0.0: + resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==} + engines: {node: '>=18'} + oniguruma-parser@0.12.2: resolution: {integrity: sha512-6HVa5oIrgMC6aA6WF6XyyqbhRPJrKR02L20+2+zpDtO5QAzGHAUGw5TKQvwi5vctNnRHkJYmjAhRVQF2EKdTQw==} oniguruma-to-es@4.3.6: resolution: {integrity: sha512-csuQ9x3Yr0cEIs/Zgx/OEt9iBw9vqIunAPQkx19R/fiMq2oGVTgcMqO/V3Ybqefr1TBvosI6jU539ksaBULJyA==} - open@10.2.0: - resolution: {integrity: sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==} - engines: {node: '>=18'} + open@11.0.0: + resolution: {integrity: sha512-smsWv2LzFjP03xmvFoJ331ss6h+jixfA4UUV/Bsiyuu4YJPfN+FIQGOIiv4w9/+MoHkfkJ22UIaQWRVFRfH6Vw==} + engines: {node: '>=20'} - openapi-types@12.1.3: - resolution: {integrity: sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw==} + open@8.4.2: + resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} + engines: {node: '>=12'} optionator@0.9.4: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} + ora@8.2.0: + resolution: {integrity: sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw==} + engines: {node: '>=18'} + + outvariant@1.4.3: + resolution: {integrity: sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA==} + own-keys@1.0.1: resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} engines: {node: '>= 0.4'} - p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + oxc-parser@0.120.0: + resolution: {integrity: sha512-WyPWZlcIm+Fkte63FGfgFB8mAAk33aH9h5N9lphXVOHSXEBFFsmYdOBedVKly363aWABjZdaj/m9lBfEY4wt+w==} + engines: {node: ^20.19.0 || >=22.12.0} + + p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} engines: {node: '>=10'} + p-locate@3.0.0: + resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==} + engines: {node: '>=6'} + p-locate@5.0.0: resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} engines: {node: '>=10'} - package-json-from-dist@1.0.1: - resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} pako@1.0.11: resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} @@ -5535,6 +5882,10 @@ packages: parse-entities@4.0.2: resolution: {integrity: sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==} + parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + parse-ms@4.0.0: resolution: {integrity: sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==} engines: {node: '>=18'} @@ -5542,6 +5893,9 @@ packages: parse5@7.3.0: resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} + parse5@8.0.1: + resolution: {integrity: sha512-z1e/HMG90obSGeidlli3hj7cbocou0/wa5HacvI3ASx34PecNjNQeaHNo5WIZpWofN9kgkqV1q5YvXe3F0FoPw==} + parseurl@1.3.3: resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} engines: {node: '>= 0.8'} @@ -5550,6 +5904,13 @@ packages: resolution: {integrity: sha512-0YNdUceMdaQwoKce1gatDScmMo5pu/tfABfnzEqeG0gtTmd7mh/WcwgUjtAeOU7N8nFFlbQBnFK2gXW5fGvmMA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + path-browserify@1.0.1: + resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} + + path-exists@3.0.0: + resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} + engines: {node: '>=4'} + path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} @@ -5569,14 +5930,6 @@ packages: path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - path-scurry@1.11.1: - resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} - engines: {node: '>=16 || 14 >=14.18'} - - path-scurry@2.0.2: - resolution: {integrity: sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==} - engines: {node: 18 || 20 || >=22} - path-to-regexp@6.3.0: resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==} @@ -5631,10 +5984,22 @@ packages: resolution: {integrity: sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==} engines: {node: '>=12'} + pkce-challenge@5.0.1: + resolution: {integrity: sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ==} + engines: {node: '>=16.20.0'} + + pkg-up@3.1.0: + resolution: {integrity: sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==} + engines: {node: '>=8'} + possible-typed-array-names@1.1.0: resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} engines: {node: '>= 0.4'} + postcss-selector-parser@7.1.4: + resolution: {integrity: sha512-HeP7D2wyhkR+XaK6v4W8oRF62Dsz4flyuczALJp61GckGm42u1saSSJ/0auvcBqxs3jMRFEcPK34At/0JBKdOg==} + engines: {node: '>=4'} + postcss@8.5.19: resolution: {integrity: sha512-Mz8SaolMd8nB+G13WkORcxQKHZ/NE4xXevtkJHVuG+guo9/wYKlIMTKAqGdEmYOXR2ijPjTYNHssizdaVSUNdQ==} engines: {node: ^10 || ^12 || >=14} @@ -5655,10 +6020,78 @@ packages: resolution: {integrity: sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==} engines: {node: '>=0.10.0'} + powershell-utils@0.1.0: + resolution: {integrity: sha512-dM0jVuXJPsDN6DvRpea484tCUaMiXWjuCn++HGTqUWzGDjv5tZkEZldAJ/UMlqRYGFrD/etByo4/xOuC/snX2A==} + engines: {node: '>=20'} + prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} + prettier-plugin-tailwindcss@0.8.0: + resolution: {integrity: sha512-V8ITGH87yuBDF6JpEZTOVlUz/saAwqb8f3HRgUj8Lh+tGCcrmorhsLpYqzygwFwK0PE2Ib6Mv3M7T/uE2tZV1g==} + engines: {node: '>=20.19'} + peerDependencies: + '@ianvs/prettier-plugin-sort-imports': '*' + '@prettier/plugin-hermes': '*' + '@prettier/plugin-oxc': '*' + '@prettier/plugin-pug': '*' + '@shopify/prettier-plugin-liquid': '*' + '@trivago/prettier-plugin-sort-imports': '*' + '@zackad/prettier-plugin-twig': '*' + prettier: ^3.0 + prettier-plugin-astro: '*' + prettier-plugin-css-order: '*' + prettier-plugin-jsdoc: '*' + prettier-plugin-marko: '*' + prettier-plugin-multiline-arrays: '*' + prettier-plugin-organize-attributes: '*' + prettier-plugin-organize-imports: '*' + prettier-plugin-sort-imports: '*' + prettier-plugin-svelte: '*' + peerDependenciesMeta: + '@ianvs/prettier-plugin-sort-imports': + optional: true + '@prettier/plugin-hermes': + optional: true + '@prettier/plugin-oxc': + optional: true + '@prettier/plugin-pug': + optional: true + '@shopify/prettier-plugin-liquid': + optional: true + '@trivago/prettier-plugin-sort-imports': + optional: true + '@zackad/prettier-plugin-twig': + optional: true + prettier-plugin-astro: + optional: true + prettier-plugin-css-order: + optional: true + prettier-plugin-jsdoc: + optional: true + prettier-plugin-marko: + optional: true + prettier-plugin-multiline-arrays: + optional: true + prettier-plugin-organize-attributes: + optional: true + prettier-plugin-organize-imports: + optional: true + prettier-plugin-sort-imports: + optional: true + prettier-plugin-svelte: + optional: true + + prettier@3.8.3: + resolution: {integrity: sha512-7igPTM53cGHMW8xWuVTydi2KO233VFiTNyF5hLJqpilHfmn8C8gPf+PS7dUT64YcXFbiMGZxS9pCSxL/Dxm/Jw==} + engines: {node: '>=14'} + hasBin: true + + pretty-format@27.5.1: + resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + pretty-ms@9.3.0: resolution: {integrity: sha512-gjVS5hOP+M3wMm5nmNOucbIrqudzs9v/57bWRHQWLYklXqoXKrVfYW2W9+glfGsqtPgpiz5WwyEEB+ksXIx3gQ==} engines: {node: '>=18'} @@ -5669,12 +6102,13 @@ packages: promise-limit@2.7.0: resolution: {integrity: sha512-7nJ6v5lnJsXwGprnGXga4wx6d1POjvi5Qmf1ivTRxTjH4Z/9Czja/UCMLVmB9N93GeWOU93XaFaEt6jbuoagNw==} + prompts@2.4.2: + resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} + engines: {node: '>= 6'} + prop-types@15.8.1: resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} - proper-lockfile@4.1.2: - resolution: {integrity: sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==} - property-information@7.2.0: resolution: {integrity: sha512-IAtzIB6sUiWaJYrX9smp3V46pBGbBeLFRGdh25kg1334VcBlD8HzhPeNIWQH9zhGmo2itIe25EHt9dQP7G5hmg==} @@ -5704,13 +6138,6 @@ packages: resolution: {integrity: sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==} engines: {node: '>= 0.10'} - rclone.js@0.6.6: - resolution: {integrity: sha512-Dxh34cab/fNjFq5SSm0fYLNkGzG2cQSBy782UW9WwxJCEiVO4cGXkvaXcNlgv817dK8K8PuQ+NHUqSAMMhWujQ==} - engines: {node: '>=12'} - cpu: [arm, arm64, mips, mipsel, x32, x64] - os: [darwin, freebsd, linux, openbsd, sunos, win32] - hasBin: true - react-dom@19.2.7: resolution: {integrity: sha512-t0BRVXvbiE/o20Hfw669rLbMCDWtYZLvmJigy2f0MxsXF+71pxhR3xOkspmsO8h3ZlNzyibAmtCa3l4lYKk6gQ==} peerDependencies: @@ -5719,6 +6146,9 @@ packages: react-is@16.13.1: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + react-is@17.0.2: + resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} + react-reconciler@0.33.0: resolution: {integrity: sha512-KetWRytFv1epdpJc3J4G75I4WrplZE5jOL7Yq0p34+OVOKF4Se7WrdIdVC45XsSSmUTlht2FM/fM1FZb1mfQeA==} engines: {node: '>=0.10.0'} @@ -5766,6 +6196,10 @@ packages: resolution: {integrity: sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==} engines: {node: '>= 20.19.0'} + recast@0.23.12: + resolution: {integrity: sha512-dEWRjcINDu/F4l2dYx57ugBtD7HV9KXESyxhzw/MqWLeglJrsjJKqACPyUPg+6AF8mIgm+Zi0dZ3ACoIg+QtpA==} + engines: {node: '>= 4'} + recma-build-jsx@1.0.0: resolution: {integrity: sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew==} @@ -5829,6 +6263,17 @@ packages: remark@15.0.1: resolution: {integrity: sha512-Eht5w30ruCXgFmxVUSlNWQ9iiimq07URKeFS3hNc8cUWy1llX4KDWfyEDZRycMc+znsN9Ux5/tJ/BFdgdOwA3A==} + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + + reselect@5.2.0: + resolution: {integrity: sha512-AgZ3UOZm3YndfrJ4OYjgrT7bmCm/1iqkjvEfH/oYjzh6PD2qw4QuT3jjnXIrpdt4MTpMXclMT3lXbmRY+XRakw==} + resolve-from@4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} @@ -5845,9 +6290,12 @@ packages: resolution: {integrity: sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - retry@0.12.0: - resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} - engines: {node: '>= 4'} + restore-cursor@5.1.0: + resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==} + engines: {node: '>=18'} + + rettime@0.11.11: + resolution: {integrity: sha512-ILJRqVWBCTlg9r42fFgwVZx1gnFAcQF8mRoMkbgQfIrjEDf9nbBFDFx00oloOa+Q869FUtaYDXZvEfnecQSCoQ==} reusify@1.1.0: resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} @@ -5858,11 +6306,19 @@ packages: engines: {node: ^20.19.0 || >=22.12.0} hasBin: true + rolldown@1.0.3: + resolution: {integrity: sha512-i00lAJ2ks1BYr7rjNjKC7BcqAS7nVfiT3QX1SI5aY+AFHblCmaUf9OE9dbdzDvW6dJxbi2ZCZiy9v3CcwOiX3g==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + rolldown@1.1.5: resolution: {integrity: sha512-t9z29cJjXf/vxQ8dyhCSpt6H6aSwHTk8cT5I3iy6SMXuFpk5mB6PL6XfC8PCwrPTx93udwKUm9HRteAlTGBLiA==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true + rou3@0.8.1: + resolution: {integrity: sha512-ePa+XGk00/3HuCqrEnK3LxJW7I0SdNg6EFzKUJG73hMAdDcOUC/i/aSz7LSDwLrGr33kal/rqOGydzwl6U7zBA==} + router@2.2.0: resolution: {integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==} engines: {node: '>= 18'} @@ -5892,6 +6348,10 @@ packages: safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + saxes@6.0.0: + resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} + engines: {node: '>=v12.22.7'} + scheduler@0.27.0: resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==} @@ -5911,10 +6371,23 @@ packages: resolution: {integrity: sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==} engines: {node: '>= 18'} + seroval-plugins@1.5.5: + resolution: {integrity: sha512-+BDhqYM6CEn3x09v44dpa9p6974FuUB2dxk+Ctn04k0cO1Zt6QODTXfmEZK0eBaTe/fJBvP4NMGuNJ+R8T+QMg==} + engines: {node: '>=10'} + peerDependencies: + seroval: ^1.0 + + seroval@1.5.5: + resolution: {integrity: sha512-bSjOuPcwPKLSJNhr9+bZxA20nQxVle5J5MNsYRVE6cIg7KpRLXGupymePavu0jrxlPiPsr4xGZSB8yUY2sH2sw==} + engines: {node: '>=10'} + serve-static@2.2.1: resolution: {integrity: sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==} engines: {node: '>= 18'} + set-cookie-parser@3.1.2: + resolution: {integrity: sha512-5/r/lTwbJ3zQ+qwdUFZYeRNqda7P5HD8zQKqlSjdGt1/S0cjLAphHusj4Y58ahDtWn/g32xrIS58/ikOvwl0Lw==} + set-function-length@1.2.2: resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} engines: {node: '>= 0.4'} @@ -5933,6 +6406,10 @@ packages: setprototypeof@1.2.0: resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + shadcn@4.10.0: + resolution: {integrity: sha512-84IJhUsK0xqSCRJx3QxyZe2NpUXj2Nwk8Vc8Ow/tCOND3yz4CT6uU4655vqicNXhzG9Q1cyUt+TBl2SiCJwNgg==} + hasBin: true + sharp@0.34.5: resolution: {integrity: sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} @@ -5954,6 +6431,10 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} + shell-quote@1.10.0: + resolution: {integrity: sha512-w1aiOKwKuRgtwAReIIj89puqg+I7GvX4IbLrvmhXbzQsj1+Zwi4VO3+fa6ZF91TWSjIxoEkKnMeHcLEODK5ZXA==} + engines: {node: '>= 0.4'} + shiki@4.3.1: resolution: {integrity: sha512-oR+qDVi2OjX1tmDpyv+3KviX01KzO6Af+0NNnKnsp9491UEGz2YpxTuJboS/6VhYpTdqzmuJBuiTlrAWWJAssw==} engines: {node: '>=20'} @@ -5991,6 +6472,9 @@ packages: resolution: {integrity: sha512-stxByr12oeeOyY2BlviTNQlYV5xOj47GirPr4yA1hE9JCtxfQN0+tVbkxwCtYDQWhEKWFHsEK48ORg5jrouCAg==} engines: {node: '>=20'} + solid-js@1.9.14: + resolution: {integrity: sha512-sAEXC0Kk0S1EDg+8ysEWJDbYhA3RRoEjwuySUGlKIemeo0I5YZfOyumNjNs9Sv3y2nmhD+0rW66ag2HsMuQiGQ==} + source-map-js@1.2.1: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} @@ -6017,6 +6501,15 @@ packages: resolution: {integrity: sha512-4toX5E1fQbBrpfXidaHnF0669nkAdETeIPTs2SUjxxD7RRIs9ICG4gtpmfc68JCEKehsdwLFqBu9VlQqZ1P1gg==} engines: {bun: '>=1.0.0', deno: '>=2.0.0', node: '>=12.0.0'} + srvx@0.11.22: + resolution: {integrity: sha512-LqZxxBDMKuMAZzFzJnDCkFOrs9MZQZr0LvHiO/SuSZVdQaXD7xQ5UWTUxheJrQPve1qk9MG2B/yttUvJxw8egQ==} + engines: {node: '>=20.16.0'} + hasBin: true + + stable-hash-x@0.2.0: + resolution: {integrity: sha512-o3yWv49B/o4QZk5ZcsALc6t0+eCelPc44zZsLtCQnZPDwFpDYSWcDnrv2TtMmMbQ7uKo3J0HTURCqckw23czNQ==} + engines: {node: '>=12.0.0'} + stable-hash@0.0.5: resolution: {integrity: sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA==} @@ -6037,18 +6530,21 @@ packages: std-env@4.2.0: resolution: {integrity: sha512-oCUKSupKTHX53EyjDtuZQ64pjLJ6yYCtpmEw0goYxtjG9KpbRe8KAsl2tBUGU9DyMcJ0RwJ8GqJAFzMXcXW1Rw==} + stdin-discarder@0.2.2: + resolution: {integrity: sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==} + engines: {node: '>=18'} + stop-iteration-iterator@1.1.0: resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} engines: {node: '>= 0.4'} + strict-event-emitter@0.5.1: + resolution: {integrity: sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ==} + string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} - string-width@5.1.2: - resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} - engines: {node: '>=12'} - string-width@7.2.0: resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} engines: {node: '>=18'} @@ -6086,6 +6582,10 @@ packages: stringify-entities@4.0.4: resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} + stringify-object@5.0.0: + resolution: {integrity: sha512-zaJYxz2FtcMb4f+g60KsRNFOpVMUyuJgA51Zi5Z1DOTC3S59+OQiVOzE9GZt0x72uBGWKsQIuBKeF9iusmKFsg==} + engines: {node: '>=14.16'} + strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} @@ -6144,10 +6644,25 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} + symbol-tree@3.2.4: + resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} + + systeminformation@5.31.17: + resolution: {integrity: sha512-TvFA9iwDWlMjqZVlKIJ0Cy+Zgm9ttlMx0SMRwJDMNKyhlEKWBMb3+WRwDi/3dvHdWbexpos4Osp4U49p5WjB5g==} + engines: {node: '>=8.0.0'} + os: [darwin, linux, win32, freebsd, openbsd, netbsd, sunos, android] + hasBin: true + tagged-tag@1.0.0: resolution: {integrity: sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==} engines: {node: '>=20'} + tailwind-merge@3.6.0: + resolution: {integrity: sha512-uxL7qAVQriqRQPAyK3pj66VqskWqoZ37PW94jwOTwNfq/z9oyu1V+eqrZqtR2+fCiXdYOZe/Modt8GtvqNzu+w==} + + tailwindcss@4.3.0: + resolution: {integrity: sha512-y6nxMGB1nMW9R6k96e5gdIFzcfL/gTJRNaqGes1YvkLnPVXzWgbqFF2yLC0T8G774n24cx3Pe8XrKoniCOAH+Q==} + tailwindcss@4.3.3: resolution: {integrity: sha512-gOhV3P7ufE62QDGg1zVaTgCR+EtPv92k2nIhVcVKcLmxT1sUBsQGhnZj175j+MqRt4zLF7ic+sCYjfhxMxj7YQ==} @@ -6164,6 +6679,9 @@ packages: engines: {node: '>=10'} hasBin: true + tiny-invariant@1.3.3: + resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} + tinybench@2.9.0: resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} @@ -6179,6 +6697,13 @@ packages: resolution: {integrity: sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==} engines: {node: '>=14.0.0'} + tldts-core@7.4.9: + resolution: {integrity: sha512-DxKfPBI52p2msTEu7MPhdpdDTBhhVQg1a/8PjQckeyAvO13eMYElX545grIp6nnTGIMZlRvFZPvFhvI/WIz2Vg==} + + tldts@7.4.9: + resolution: {integrity: sha512-3kZ8wQQ/k5DrChD4X4FVvr2D7E5uoRgAqkPyLpSCGUvqOvqu+JEdr3mwMUaVWb+vMHZaKhF5fp2PBigKsui7hA==} + hasBin: true + to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} @@ -6191,8 +6716,13 @@ packages: resolution: {integrity: sha512-lVb8X9BsPVuH0M4BKeS91tXAmJvCjQ5UIyAbQFaxkKGyUFK2RPkhwaFSQH8vbpl1d23eu/IBH+dwVMHWaq9A5A==} engines: {node: '>=20'} - tr46@0.0.3: - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + tough-cookie@6.0.2: + resolution: {integrity: sha512-exgYmnmL/sJpR3upZfXG5PoatXQii55xAiXGXzY+sROLZ/Y+SLcp9PgJNI9Vz37HpQ74WvDcLT8eqm+kV3FzrA==} + engines: {node: '>=16'} + + tr46@6.0.0: + resolution: {integrity: sha512-bLVMLPtstlZ4iMQHpFHTR7GAGj2jxi8Dg0s2h2MafAE4uSWF98FC/3MomU51iQAMf8/qDUbKWf5GxuvvVcXEhw==} + engines: {node: '>=20'} trim-lines@3.0.1: resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} @@ -6206,15 +6736,27 @@ packages: peerDependencies: typescript: '>=4.8.4' - ts-tqdm@0.8.6: - resolution: {integrity: sha512-3X3M1PZcHtgQbnwizL+xU8CAgbYbeLHrrDwL9xxcZZrV5J+e7loJm1XrXozHjSkl44J0Zg0SgA8rXbh83kCkcQ==} + ts-declaration-location@1.0.7: + resolution: {integrity: sha512-EDyGAwH1gO0Ausm9gV6T2nUvBgXT5kGoCMJPllOaooZ+4VvJiKBdZE7wK18N1deEowhcUptS+5GXZK8U/fvpwA==} + peerDependencies: + typescript: '>=4.0.0' + + ts-morph@26.0.0: + resolution: {integrity: sha512-ztMO++owQnz8c/gIENcM9XfCEzgoGphTv+nKpYNM1bgsdOVC/jRZuEBf6N+mLLDNg68Kl+GgUZfOySaRiG1/Ug==} tsconfig-paths@3.15.0: resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} + tsconfig-paths@4.2.0: + resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==} + engines: {node: '>=6'} + tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + tw-animate-css@1.4.0: + resolution: {integrity: sha512-7bziOlRqH0hJx80h/3mbicLW7o8qLsH5+RaLR2t+OHM3D0JlWGODQKQ4cxbK7WlvmUxpcj6Kgu6EKqjrGFe3QQ==} + type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} @@ -6262,16 +6804,12 @@ packages: resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} engines: {node: '>= 0.4'} - undici-types@5.26.5: - resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + undici-types@6.21.0: + resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} undici-types@8.3.0: resolution: {integrity: sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ==} - undici@7.24.8: - resolution: {integrity: sha512-6KQ/+QxK49Z/p3HO6E5ZCZWNnCasyZLa5ExaVYyvPxUwKtbCPMKELJOqh7EqOle0t9cH/7d2TaaTRRa6Nhs4YQ==} - engines: {node: '>=20.18.1'} - undici@7.28.0: resolution: {integrity: sha512-cRZYrTDwWznlnRiPjggAGxZXanty6M8RV1ff8Wm4LWXBp7/IG8v5DnOm74DtUBp9OONpK75YlPnIjQqX0dBDtA==} engines: {node: '>=20.18.1'} @@ -6280,9 +6818,6 @@ packages: resolution: {integrity: sha512-N7iQtfyLhIMOFgQubvmLV26svHpO0bqKnAiWotTQCVKCmWrcGbBotPuW1x+xwYZ2VHdSTVUfPQQnlEt1/LouTQ==} engines: {node: '>=22.19.0'} - unenv@2.0.0-rc.21: - resolution: {integrity: sha512-Wj7/AMtE9MRnAXa6Su3Lk0LNCfqDYgfwVjwRFVum9U7wsto1imuHqk4kTm7Jni+5A0Hn7dttL6O/zjvUvoo+8A==} - unenv@2.0.0-rc.24: resolution: {integrity: sha512-i7qRCmY42zmCwnYlh9H2SvLEypEFGye5iRmEMKjcGi7zk9UquigRjFtTLz0TYqr0ZGLZhaMHl/foy1bZR+Cwlw==} @@ -6317,13 +6852,53 @@ packages: universal-user-agent@7.0.3: resolution: {integrity: sha512-TmnEAEAsBJVZM/AADELsK76llnwcf9vMKuPz8JflO1frO8Lchitr0fNaN9d+Ap0BjKtqWqd/J17qeDnXh8CL2A==} + universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + unpipe@1.0.0: resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} engines: {node: '>= 0.8'} + unplugin@3.3.0: + resolution: {integrity: sha512-qa66K+crbfyE6JK10GjvbJeRrOsuC/JpbnHctfyp/i4oBTxWOzJfRZyDiOk1PtErMFRu8JhsU/wPvOdBNWe5Rg==} + engines: {node: ^20.19.0 || >=22.12.0} + peerDependencies: + '@farmfe/core': '*' + '@rspack/core': '*' + bun-types-no-globals: '*' + esbuild: '*' + rolldown: '*' + rollup: '*' + unloader: '*' + vite: '*' + webpack: '*' + peerDependenciesMeta: + '@farmfe/core': + optional: true + '@rspack/core': + optional: true + bun-types-no-globals: + optional: true + esbuild: + optional: true + rolldown: + optional: true + rollup: + optional: true + unloader: + optional: true + vite: + optional: true + webpack: + optional: true + unrs-resolver@1.12.2: resolution: {integrity: sha512-dmlRxBJJayXjqTwC+JtF1HhJmgf3ftQ3YejFcZrf4+KKtJv0qDsK1pjqaaVjG7wJ5NJ6UVP1OqRMQ71Z4C3rxQ==} + until-async@3.0.2: + resolution: {integrity: sha512-IiSk4HlzAMqTUseHHe3VhIGyuFmN90zMTpD3Z3y8jeQbzLIq500MVM7Jq2vUAnTKAFPJrqwkzr6PoTcPhGcOiw==} + update-browserslist-db@1.2.3: resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==} hasBin: true @@ -6333,9 +6908,6 @@ packages: uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - urlpattern-polyfill@10.1.0: - resolution: {integrity: sha512-IGjKp/o0NL3Bso1PymYURCJxMPNAf/ILOpendP9f5B6e1rTJgdgiOvgfoT8VxCAdY+Wisb9uhGaJJf3yZ2V9nw==} - use-callback-ref@1.3.3: resolution: {integrity: sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==} engines: {node: '>=10'} @@ -6356,6 +6928,11 @@ packages: '@types/react': optional: true + use-sync-external-store@1.6.0: + resolution: {integrity: sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} @@ -6363,6 +6940,10 @@ packages: resolution: {integrity: sha512-6ZxzVpzDXDa3bJWaHilVayA+BH/1zmxCJoVgvmqJnid/gPoKHxUrS/aC/T6LGQtNHT+XHG9fXPJB4d+IrU30Ew==} hasBin: true + validate-npm-package-name@7.0.2: + resolution: {integrity: sha512-hVDIBwsRruT73PbK7uP5ebUt+ezEtCmzZz3F59BSr2F6OVFnJ/6h8liuvdLrQ88Xmnk6/+xGGuq+pG9WwTuy3A==} + engines: {node: ^20.17.0 || >=22.9.0} + vary@1.1.2: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} @@ -6376,6 +6957,49 @@ packages: vfile@6.0.3: resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} + vite@8.0.16: + resolution: {integrity: sha512-h9bXPmJichP5fLmVQo3PyaGSDE2n3aPuomeAlVRm0JLmt4rY6zmPKd59HYI4LNW8oTK7tlTsuC7l/m7awx9Jcw==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + '@types/node': ^20.19.0 || >=22.12.0 + '@vitejs/devtools': ^0.1.18 + esbuild: ^0.27.0 || ^0.28.0 + jiti: '>=1.21.0' + less: ^4.0.0 + sass: ^1.70.0 + sass-embedded: ^1.70.0 + stylus: '>=0.54.8' + sugarss: ^5.0.0 + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + '@vitejs/devtools': + optional: true + esbuild: + optional: true + jiti: + optional: true + less: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + vite@8.1.5: resolution: {integrity: sha512-7ULLwsCdYx/nRyrpiEwvqb5TFHrMVZyBt+rg/OAXT7rgj/z+DtTDyKFeLAdDkubDVDKD8jOsndmy7m55XcfUsw==} engines: {node: ^20.19.0 || >=22.12.0} @@ -6419,6 +7043,14 @@ packages: yaml: optional: true + vitefu@1.1.3: + resolution: {integrity: sha512-ub4okH7Z5KLjb6hDyjqrGXqWtWvoYdU3IGm/NorpgHncKoLTCfRIbvlhBm7r0YstIaQRYlp4yEbFqDcKSzXSSg==} + peerDependencies: + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 + peerDependenciesMeta: + vite: + optional: true + vitest@4.1.10: resolution: {integrity: sha512-R9jUTe5S4Qb0HCd4TNqpC7oGcrMssMRGXLW80ubjWsW9VH5GF8y1Y0SFLY9AbqSk6nt0PnOx4H4WNJYZ13GUPw==} engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} @@ -6460,18 +7092,78 @@ packages: jsdom: optional: true + vitest@4.1.8: + resolution: {integrity: sha512-flY6ScbCIt9HThs+C5HS7jvGOB560DJtk/Z15IQROTA6zEy49Nh8T/dofWTQL+n3vswqn87sbJNiuqw1SDp5Ig==} + engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@opentelemetry/api': ^1.9.0 + '@types/node': ^20.0.0 || ^22.0.0 || >=24.0.0 + '@vitest/browser-playwright': 4.1.8 + '@vitest/browser-preview': 4.1.8 + '@vitest/browser-webdriverio': 4.1.8 + '@vitest/coverage-istanbul': 4.1.8 + '@vitest/coverage-v8': 4.1.8 + '@vitest/ui': 4.1.8 + happy-dom: '*' + jsdom: '*' + vite: ^6.0.0 || ^7.0.0 || ^8.0.0 + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@opentelemetry/api': + optional: true + '@types/node': + optional: true + '@vitest/browser-playwright': + optional: true + '@vitest/browser-preview': + optional: true + '@vitest/browser-webdriverio': + optional: true + '@vitest/coverage-istanbul': + optional: true + '@vitest/coverage-v8': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + + vue-eslint-parser@10.4.1: + resolution: {integrity: sha512-Gk6gRDj0n/fkRa3C3l0bBheoBckUq/Rs0F/TvMWIS6nzzx67amAViMe9CkNgsP2tXyQONvGiHQESHwFtZ3aYDA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + + w3c-xmlserializer@5.0.0: + resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} + engines: {node: '>=18'} + web-namespaces@2.0.1: resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} - web-streams-polyfill@4.0.0-beta.3: - resolution: {integrity: sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug==} - engines: {node: '>= 14'} + web-streams-polyfill@3.3.3: + resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} + engines: {node: '>= 8'} + + webidl-conversions@8.0.1: + resolution: {integrity: sha512-BMhLD/Sw+GbJC21C/UgyaZX41nPt8bUTg+jWyDeg7e7YN4xOM05YPSIXceACnXVtqyEw/LMClUQMtMZ+PGGpqQ==} + engines: {node: '>=20'} + + webpack-virtual-modules@0.6.2: + resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} - webidl-conversions@3.0.1: - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + whatwg-mimetype@5.0.0: + resolution: {integrity: sha512-sXcNcHOC51uPGF0P/D4NVtrkjSU2fNsm9iog4ZvZJsL3rjoDAzXZhkm2MWt1y+PUdggKAYVoMAIYcs78wJ51Cw==} + engines: {node: '>=20'} - whatwg-url@5.0.0: - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + whatwg-url@16.0.1: + resolution: {integrity: sha512-1to4zXBxmXHV3IiSSEInrreIlu02vUOvrhxJJH5vcxYTBDAx51cqZiKdyTxlecdKNSjj8EcxGBxNf6Vg+945gw==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} which-boxed-primitive@1.1.1: resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} @@ -6512,16 +7204,6 @@ packages: resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} engines: {node: '>=0.10.0'} - workerd@1.20260424.1: - resolution: {integrity: sha512-oKsB0Xo/mfkYMdSACoS06XZg09VUK4rXwHfF/1t3P++sMbwzf4UHQvMO57+zxpEB2nVrY/ZkW0bYFGq4GdAFSQ==} - engines: {node: '>=16'} - hasBin: true - - workerd@1.20260702.1: - resolution: {integrity: sha512-rkIDTWQ7yhC0BjWBDuKj/q9JsOBzrGt/KdOeun+c4YlN47W4l0pa5aCyE1X6A47/ju3h6BEFhrO1CibZ5EgSpA==} - engines: {node: '>=16'} - hasBin: true - workerd@1.20260704.1: resolution: {integrity: sha512-GDZ0jzIYDYfN7rCt/oFJv4BG3QJ+4IS2kfRvxEMY9VKIfPhzo63PH69Ir7ug8LfORCgCtmfkiQVXrqbot7pZTQ==} engines: {node: '>=16'} @@ -6532,16 +7214,6 @@ packages: engines: {node: '>=16'} hasBin: true - wrangler@4.107.1: - resolution: {integrity: sha512-HMulqgQtNvY9UKXu6nTRTqv5GhtN1RhZeG9cPX+kS8R6s7o7ct6rueoXiNe4MX8+88B7p4lq3RvSPzB205fexg==} - engines: {node: '>=22.0.0'} - hasBin: true - peerDependencies: - '@cloudflare/workers-types': 5.20260717.1 - peerDependenciesMeta: - '@cloudflare/workers-types': - optional: true - wrangler@4.112.0: resolution: {integrity: sha512-5H+XUD0TySCv1LuktFHDIEOkboH2nTfQs+35L+USt3MtntjDTMVIJprLgQcL2WBjulOyjxpd1vyTiSTJVW5MjQ==} engines: {node: '>=22.0.0'} @@ -6556,10 +7228,6 @@ packages: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} - wrap-ansi@8.1.0: - resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} - engines: {node: '>=12'} - wrap-ansi@9.0.2: resolution: {integrity: sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==} engines: {node: '>=18'} @@ -6567,18 +7235,6 @@ packages: wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - ws@8.18.0: - resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - ws@8.21.0: resolution: {integrity: sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==} engines: {node: '>=10.0.0'} @@ -6591,15 +7247,26 @@ packages: utf-8-validate: optional: true - wsl-utils@0.1.0: - resolution: {integrity: sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==} + wsl-utils@0.3.1: + resolution: {integrity: sha512-g/eziiSUNBSsdDJtCLB8bdYEUMj4jR7AGeUo96p/3dTafgjHhpF4RiCFPiRILwjQoDXx5MqkBr4fwWtR3Ky4Wg==} + engines: {node: '>=20'} + + xml-name-validator@5.0.0: + resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==} engines: {node: '>=18'} xml-naming@0.1.0: resolution: {integrity: sha512-k8KO9hrMyNk6tUWqUfkTEZbezRRpONVOzUTnc97VnCvyj6Tf9lyUR9EDAIeiVLv56jsMcoXEwjW8Kv5yPY52lw==} engines: {node: '>=16.0.0'} - xtend@4.0.2: + xmlbuilder2@4.0.3: + resolution: {integrity: sha512-bx8Q1STctnNaaDymWnkfQLKofs0mGNN7rLLapJlGuV3VlvegD7Ls4ggMjE3aUSWItCCzU0PEv45lI87iSigiCA==} + engines: {node: '>=20.0'} + + xmlchars@2.2.0: + resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} + + xtend@4.0.2: resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} engines: {node: '>=0.4'} @@ -6615,18 +7282,22 @@ packages: engines: {node: '>= 14.6'} hasBin: true - yargs-parser@22.0.0: - resolution: {integrity: sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==} - engines: {node: ^20.19.0 || ^22.12.0 || >=23} + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} - yargs@18.0.0: - resolution: {integrity: sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg==} - engines: {node: ^20.19.0 || ^22.12.0 || >=23} + yargs@17.7.3: + resolution: {integrity: sha512-GZtjxm/J/4TSxuL3FNYjCmLktBTnIw/rVmKSIyKeYAZpmJB2ig9VauCC5xsa82GNKVKDAqpOn3KVzNt0zmrU0g==} + engines: {node: '>=12'} yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} + yocto-spinner@1.2.2: + resolution: {integrity: sha512-DODGl1wJjA/s5pnJFKau9lIYHT81lnhob1i3e1TjxZRxEhWRKl74nTbWE6H5KlkViQQTo/Z29YFdxzTZAMY3ng==} + engines: {node: '>=18.19'} + yoctocolors@2.1.2: resolution: {integrity: sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==} engines: {node: '>=18'} @@ -6643,12 +7314,20 @@ packages: yuku-analyzer@0.6.4: resolution: {integrity: sha512-M7c7DOdp4DygONq82QKBjsFkp6FneY8fsrKhRyEx4dZfUuvaYMKJ2acFv5Ew3XEnrlNyYQRWWYFDA/zEw6RbPw==} + zod-to-json-schema@3.25.2: + resolution: {integrity: sha512-O/PgfnpT1xKSDeQYSCfRI5Gy3hPf91mKVDuYLUHZJMiDFptvP41MSnWofm8dnCm0256ZNfZIM7DSzuSMAFnjHA==} + peerDependencies: + zod: ^3.25.28 || ^4 + zod-validation-error@4.0.2: resolution: {integrity: sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==} engines: {node: '>=18.0.0'} peerDependencies: zod: ^3.25.0 || ^4.0.0 + zod@3.25.76: + resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} + zod@4.4.3: resolution: {integrity: sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==} @@ -6657,6 +7336,8 @@ packages: snapshots: + '@acemir/cssom@0.9.31': {} + '@alcalzone/ansi-tokenize@0.2.5': dependencies: ansi-styles: 6.2.3 @@ -6666,84 +7347,31 @@ snapshots: '@alloc/quick-lru@5.2.0': {} - '@ast-grep/napi-darwin-arm64@0.40.5': - optional: true - - '@ast-grep/napi-darwin-x64@0.40.5': - optional: true - - '@ast-grep/napi-linux-arm64-gnu@0.40.5': - optional: true - - '@ast-grep/napi-linux-arm64-musl@0.40.5': - optional: true - - '@ast-grep/napi-linux-x64-gnu@0.40.5': - optional: true - - '@ast-grep/napi-linux-x64-musl@0.40.5': - optional: true - - '@ast-grep/napi-win32-arm64-msvc@0.40.5': - optional: true - - '@ast-grep/napi-win32-ia32-msvc@0.40.5': - optional: true - - '@ast-grep/napi-win32-x64-msvc@0.40.5': - optional: true - - '@ast-grep/napi@0.40.5': - optionalDependencies: - '@ast-grep/napi-darwin-arm64': 0.40.5 - '@ast-grep/napi-darwin-x64': 0.40.5 - '@ast-grep/napi-linux-arm64-gnu': 0.40.5 - '@ast-grep/napi-linux-arm64-musl': 0.40.5 - '@ast-grep/napi-linux-x64-gnu': 0.40.5 - '@ast-grep/napi-linux-x64-musl': 0.40.5 - '@ast-grep/napi-win32-arm64-msvc': 0.40.5 - '@ast-grep/napi-win32-ia32-msvc': 0.40.5 - '@ast-grep/napi-win32-x64-msvc': 0.40.5 - optional: true - - '@aws-crypto/crc32@5.2.0': + '@asamuzakjp/css-color@5.1.11': dependencies: - '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.974.2 - tslib: 2.8.1 + '@asamuzakjp/generational-cache': 1.0.1 + '@csstools/css-calc': 3.2.1(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) + '@csstools/css-color-parser': 4.1.9(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) + '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) + '@csstools/css-tokenizer': 4.0.0 - '@aws-crypto/sha1-browser@5.2.0': + '@asamuzakjp/dom-selector@6.8.1': dependencies: - '@aws-crypto/supports-web-crypto': 5.2.0 - '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.974.2 - '@aws-sdk/util-locate-window': 3.965.8 - '@smithy/util-utf8': 2.3.0 - tslib: 2.8.1 - optional: true + '@asamuzakjp/nwsapi': 2.3.9 + bidi-js: 1.0.3 + css-tree: 3.2.1 + is-potential-custom-element-name: 1.0.1 + lru-cache: 11.5.2 - '@aws-crypto/sha256-browser@5.2.0': - dependencies: - '@aws-crypto/sha256-js': 5.2.0 - '@aws-crypto/supports-web-crypto': 5.2.0 - '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.974.2 - '@aws-sdk/util-locate-window': 3.965.8 - '@smithy/util-utf8': 2.3.0 - tslib: 2.8.1 - optional: true + '@asamuzakjp/generational-cache@1.0.1': {} + + '@asamuzakjp/nwsapi@2.3.9': {} - '@aws-crypto/sha256-js@5.2.0': + '@aws-crypto/crc32@5.2.0': dependencies: '@aws-crypto/util': 5.2.0 '@aws-sdk/types': 3.974.2 tslib: 2.8.1 - optional: true - - '@aws-crypto/supports-web-crypto@5.2.0': - dependencies: - tslib: 2.8.1 - optional: true '@aws-crypto/util@5.2.0': dependencies: @@ -6751,60 +7379,6 @@ snapshots: '@smithy/util-utf8': 2.3.0 tslib: 2.8.1 - '@aws-sdk/checksums@3.1000.18': - dependencies: - '@aws-sdk/core': 3.975.3 - '@aws-sdk/types': 3.974.2 - '@smithy/core': 3.29.4 - '@smithy/types': 4.16.1 - tslib: 2.8.1 - optional: true - - '@aws-sdk/client-cloudfront@3.984.0': - dependencies: - '@aws-crypto/sha256-browser': 5.2.0 - '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.975.3 - '@aws-sdk/credential-provider-node': 3.972.65 - '@aws-sdk/middleware-host-header': 3.972.34 - '@aws-sdk/middleware-logger': 3.972.33 - '@aws-sdk/middleware-recursion-detection': 3.972.35 - '@aws-sdk/middleware-user-agent': 3.972.63 - '@aws-sdk/region-config-resolver': 3.972.37 - '@aws-sdk/types': 3.974.2 - '@aws-sdk/util-endpoints': 3.984.0 - '@aws-sdk/util-user-agent-browser': 3.972.34 - '@aws-sdk/util-user-agent-node': 3.973.49 - '@smithy/config-resolver': 4.6.9 - '@smithy/core': 3.29.4 - '@smithy/fetch-http-handler': 5.6.4 - '@smithy/hash-node': 4.4.9 - '@smithy/invalid-dependency': 4.4.9 - '@smithy/middleware-content-length': 4.4.9 - '@smithy/middleware-endpoint': 4.6.9 - '@smithy/middleware-retry': 4.7.9 - '@smithy/middleware-serde': 4.4.9 - '@smithy/middleware-stack': 4.4.9 - '@smithy/node-config-provider': 4.5.7 - '@smithy/node-http-handler': 4.9.4 - '@smithy/protocol-http': 5.5.9 - '@smithy/smithy-client': 4.14.9 - '@smithy/types': 4.16.1 - '@smithy/url-parser': 4.4.9 - '@smithy/util-base64': 4.5.9 - '@smithy/util-body-length-browser': 4.4.9 - '@smithy/util-body-length-node': 4.4.9 - '@smithy/util-defaults-mode-browser': 4.5.9 - '@smithy/util-defaults-mode-node': 4.4.9 - '@smithy/util-endpoints': 3.6.9 - '@smithy/util-middleware': 4.4.9 - '@smithy/util-retry': 4.5.9 - '@smithy/util-stream': 4.7.9 - '@smithy/util-utf8': 4.4.9 - '@smithy/util-waiter': 4.5.9 - tslib: 2.8.1 - optional: true - '@aws-sdk/client-cognito-identity@3.1081.0': dependencies: '@aws-sdk/core': 3.975.3 @@ -6816,204 +7390,6 @@ snapshots: '@smithy/types': 4.16.1 tslib: 2.8.1 - '@aws-sdk/client-dynamodb@3.984.0': - dependencies: - '@aws-crypto/sha256-browser': 5.2.0 - '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.975.3 - '@aws-sdk/credential-provider-node': 3.972.65 - '@aws-sdk/dynamodb-codec': 3.973.33 - '@aws-sdk/middleware-endpoint-discovery': 3.972.25 - '@aws-sdk/middleware-host-header': 3.972.34 - '@aws-sdk/middleware-logger': 3.972.33 - '@aws-sdk/middleware-recursion-detection': 3.972.35 - '@aws-sdk/middleware-user-agent': 3.972.63 - '@aws-sdk/region-config-resolver': 3.972.37 - '@aws-sdk/types': 3.974.2 - '@aws-sdk/util-endpoints': 3.984.0 - '@aws-sdk/util-user-agent-browser': 3.972.34 - '@aws-sdk/util-user-agent-node': 3.973.49 - '@smithy/config-resolver': 4.6.9 - '@smithy/core': 3.29.4 - '@smithy/fetch-http-handler': 5.6.4 - '@smithy/hash-node': 4.4.9 - '@smithy/invalid-dependency': 4.4.9 - '@smithy/middleware-content-length': 4.4.9 - '@smithy/middleware-endpoint': 4.6.9 - '@smithy/middleware-retry': 4.7.9 - '@smithy/middleware-serde': 4.4.9 - '@smithy/middleware-stack': 4.4.9 - '@smithy/node-config-provider': 4.5.7 - '@smithy/node-http-handler': 4.9.4 - '@smithy/protocol-http': 5.5.9 - '@smithy/smithy-client': 4.14.9 - '@smithy/types': 4.16.1 - '@smithy/url-parser': 4.4.9 - '@smithy/util-base64': 4.5.9 - '@smithy/util-body-length-browser': 4.4.9 - '@smithy/util-body-length-node': 4.4.9 - '@smithy/util-defaults-mode-browser': 4.5.9 - '@smithy/util-defaults-mode-node': 4.4.9 - '@smithy/util-endpoints': 3.6.9 - '@smithy/util-middleware': 4.4.9 - '@smithy/util-retry': 4.5.9 - '@smithy/util-utf8': 4.4.9 - '@smithy/util-waiter': 4.5.9 - tslib: 2.8.1 - optional: true - - '@aws-sdk/client-lambda@3.984.0': - dependencies: - '@aws-crypto/sha256-browser': 5.2.0 - '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.975.3 - '@aws-sdk/credential-provider-node': 3.972.65 - '@aws-sdk/middleware-host-header': 3.972.34 - '@aws-sdk/middleware-logger': 3.972.33 - '@aws-sdk/middleware-recursion-detection': 3.972.35 - '@aws-sdk/middleware-user-agent': 3.972.63 - '@aws-sdk/region-config-resolver': 3.972.37 - '@aws-sdk/types': 3.974.2 - '@aws-sdk/util-endpoints': 3.984.0 - '@aws-sdk/util-user-agent-browser': 3.972.34 - '@aws-sdk/util-user-agent-node': 3.973.49 - '@smithy/config-resolver': 4.6.9 - '@smithy/core': 3.29.4 - '@smithy/eventstream-serde-browser': 4.4.9 - '@smithy/eventstream-serde-config-resolver': 4.5.9 - '@smithy/eventstream-serde-node': 4.4.9 - '@smithy/fetch-http-handler': 5.6.4 - '@smithy/hash-node': 4.4.9 - '@smithy/invalid-dependency': 4.4.9 - '@smithy/middleware-content-length': 4.4.9 - '@smithy/middleware-endpoint': 4.6.9 - '@smithy/middleware-retry': 4.7.9 - '@smithy/middleware-serde': 4.4.9 - '@smithy/middleware-stack': 4.4.9 - '@smithy/node-config-provider': 4.5.7 - '@smithy/node-http-handler': 4.9.4 - '@smithy/protocol-http': 5.5.9 - '@smithy/smithy-client': 4.14.9 - '@smithy/types': 4.16.1 - '@smithy/url-parser': 4.4.9 - '@smithy/util-base64': 4.5.9 - '@smithy/util-body-length-browser': 4.4.9 - '@smithy/util-body-length-node': 4.4.9 - '@smithy/util-defaults-mode-browser': 4.5.9 - '@smithy/util-defaults-mode-node': 4.4.9 - '@smithy/util-endpoints': 3.6.9 - '@smithy/util-middleware': 4.4.9 - '@smithy/util-retry': 4.5.9 - '@smithy/util-stream': 4.7.9 - '@smithy/util-utf8': 4.4.9 - '@smithy/util-waiter': 4.5.9 - tslib: 2.8.1 - optional: true - - '@aws-sdk/client-s3@3.984.0': - dependencies: - '@aws-crypto/sha1-browser': 5.2.0 - '@aws-crypto/sha256-browser': 5.2.0 - '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.975.3 - '@aws-sdk/credential-provider-node': 3.972.65 - '@aws-sdk/middleware-bucket-endpoint': 3.972.37 - '@aws-sdk/middleware-expect-continue': 3.972.33 - '@aws-sdk/middleware-flexible-checksums': 3.974.43 - '@aws-sdk/middleware-host-header': 3.972.34 - '@aws-sdk/middleware-location-constraint': 3.972.30 - '@aws-sdk/middleware-logger': 3.972.33 - '@aws-sdk/middleware-recursion-detection': 3.972.35 - '@aws-sdk/middleware-sdk-s3': 3.972.64 - '@aws-sdk/middleware-ssec': 3.972.30 - '@aws-sdk/middleware-user-agent': 3.972.63 - '@aws-sdk/region-config-resolver': 3.972.37 - '@aws-sdk/signature-v4-multi-region': 3.984.0 - '@aws-sdk/types': 3.974.2 - '@aws-sdk/util-endpoints': 3.984.0 - '@aws-sdk/util-user-agent-browser': 3.972.34 - '@aws-sdk/util-user-agent-node': 3.973.49 - '@smithy/config-resolver': 4.6.9 - '@smithy/core': 3.29.4 - '@smithy/eventstream-serde-browser': 4.4.9 - '@smithy/eventstream-serde-config-resolver': 4.5.9 - '@smithy/eventstream-serde-node': 4.4.9 - '@smithy/fetch-http-handler': 5.6.4 - '@smithy/hash-blob-browser': 4.4.9 - '@smithy/hash-node': 4.4.9 - '@smithy/hash-stream-node': 4.4.9 - '@smithy/invalid-dependency': 4.4.9 - '@smithy/md5-js': 4.4.9 - '@smithy/middleware-content-length': 4.4.9 - '@smithy/middleware-endpoint': 4.6.9 - '@smithy/middleware-retry': 4.7.9 - '@smithy/middleware-serde': 4.4.9 - '@smithy/middleware-stack': 4.4.9 - '@smithy/node-config-provider': 4.5.7 - '@smithy/node-http-handler': 4.9.4 - '@smithy/protocol-http': 5.5.9 - '@smithy/smithy-client': 4.14.9 - '@smithy/types': 4.16.1 - '@smithy/url-parser': 4.4.9 - '@smithy/util-base64': 4.5.9 - '@smithy/util-body-length-browser': 4.4.9 - '@smithy/util-body-length-node': 4.4.9 - '@smithy/util-defaults-mode-browser': 4.5.9 - '@smithy/util-defaults-mode-node': 4.4.9 - '@smithy/util-endpoints': 3.6.9 - '@smithy/util-middleware': 4.4.9 - '@smithy/util-retry': 4.5.9 - '@smithy/util-stream': 4.7.9 - '@smithy/util-utf8': 4.4.9 - '@smithy/util-waiter': 4.5.9 - tslib: 2.8.1 - optional: true - - '@aws-sdk/client-sqs@3.984.0': - dependencies: - '@aws-crypto/sha256-browser': 5.2.0 - '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.975.3 - '@aws-sdk/credential-provider-node': 3.972.65 - '@aws-sdk/middleware-host-header': 3.972.34 - '@aws-sdk/middleware-logger': 3.972.33 - '@aws-sdk/middleware-recursion-detection': 3.972.35 - '@aws-sdk/middleware-sdk-sqs': 3.972.37 - '@aws-sdk/middleware-user-agent': 3.972.63 - '@aws-sdk/region-config-resolver': 3.972.37 - '@aws-sdk/types': 3.974.2 - '@aws-sdk/util-endpoints': 3.984.0 - '@aws-sdk/util-user-agent-browser': 3.972.34 - '@aws-sdk/util-user-agent-node': 3.973.49 - '@smithy/config-resolver': 4.6.9 - '@smithy/core': 3.29.4 - '@smithy/fetch-http-handler': 5.6.4 - '@smithy/hash-node': 4.4.9 - '@smithy/invalid-dependency': 4.4.9 - '@smithy/md5-js': 4.4.9 - '@smithy/middleware-content-length': 4.4.9 - '@smithy/middleware-endpoint': 4.6.9 - '@smithy/middleware-retry': 4.7.9 - '@smithy/middleware-serde': 4.4.9 - '@smithy/middleware-stack': 4.4.9 - '@smithy/node-config-provider': 4.5.7 - '@smithy/node-http-handler': 4.9.4 - '@smithy/protocol-http': 5.5.9 - '@smithy/smithy-client': 4.14.9 - '@smithy/types': 4.16.1 - '@smithy/url-parser': 4.4.9 - '@smithy/util-base64': 4.5.9 - '@smithy/util-body-length-browser': 4.4.9 - '@smithy/util-body-length-node': 4.4.9 - '@smithy/util-defaults-mode-browser': 4.5.9 - '@smithy/util-defaults-mode-node': 4.4.9 - '@smithy/util-endpoints': 3.6.9 - '@smithy/util-middleware': 4.4.9 - '@smithy/util-retry': 4.5.9 - '@smithy/util-utf8': 4.4.9 - tslib: 2.8.1 - optional: true - '@aws-sdk/core@3.975.3': dependencies: '@aws-sdk/types': 3.974.2 @@ -7137,101 +7513,6 @@ snapshots: '@smithy/types': 4.16.1 tslib: 2.8.1 - '@aws-sdk/dynamodb-codec@3.973.33': - dependencies: - '@aws-sdk/core': 3.975.3 - '@smithy/core': 3.29.4 - '@smithy/types': 4.16.1 - tslib: 2.8.1 - optional: true - - '@aws-sdk/endpoint-cache@3.972.9': - dependencies: - mnemonist: 0.38.3 - tslib: 2.8.1 - optional: true - - '@aws-sdk/middleware-bucket-endpoint@3.972.37': - dependencies: - '@aws-sdk/middleware-sdk-s3': 3.972.64 - tslib: 2.8.1 - optional: true - - '@aws-sdk/middleware-endpoint-discovery@3.972.25': - dependencies: - '@aws-sdk/endpoint-cache': 3.972.9 - '@aws-sdk/types': 3.974.2 - '@smithy/core': 3.29.4 - '@smithy/types': 4.16.1 - tslib: 2.8.1 - optional: true - - '@aws-sdk/middleware-expect-continue@3.972.33': - dependencies: - '@aws-sdk/middleware-sdk-s3': 3.972.64 - tslib: 2.8.1 - optional: true - - '@aws-sdk/middleware-flexible-checksums@3.974.43': - dependencies: - '@aws-sdk/checksums': 3.1000.18 - tslib: 2.8.1 - optional: true - - '@aws-sdk/middleware-host-header@3.972.34': - dependencies: - '@aws-sdk/core': 3.975.3 - tslib: 2.8.1 - optional: true - - '@aws-sdk/middleware-location-constraint@3.972.30': - dependencies: - '@aws-sdk/middleware-sdk-s3': 3.972.64 - tslib: 2.8.1 - optional: true - - '@aws-sdk/middleware-logger@3.972.33': - dependencies: - '@aws-sdk/core': 3.975.3 - tslib: 2.8.1 - optional: true - - '@aws-sdk/middleware-recursion-detection@3.972.35': - dependencies: - '@aws-sdk/core': 3.975.3 - tslib: 2.8.1 - optional: true - - '@aws-sdk/middleware-sdk-s3@3.972.64': - dependencies: - '@aws-sdk/core': 3.975.3 - '@aws-sdk/signature-v4-multi-region': 3.996.41 - '@aws-sdk/types': 3.974.2 - '@smithy/core': 3.29.4 - '@smithy/types': 4.16.1 - tslib: 2.8.1 - optional: true - - '@aws-sdk/middleware-sdk-sqs@3.972.37': - dependencies: - '@aws-sdk/types': 3.974.2 - '@smithy/core': 3.29.4 - '@smithy/types': 4.16.1 - tslib: 2.8.1 - optional: true - - '@aws-sdk/middleware-ssec@3.972.30': - dependencies: - '@aws-sdk/middleware-sdk-s3': 3.972.64 - tslib: 2.8.1 - optional: true - - '@aws-sdk/middleware-user-agent@3.972.63': - dependencies: - '@aws-sdk/core': 3.975.3 - tslib: 2.8.1 - optional: true - '@aws-sdk/nested-clients@3.997.30': dependencies: '@aws-sdk/core': 3.975.3 @@ -7243,22 +7524,6 @@ snapshots: '@smithy/types': 4.16.1 tslib: 2.8.1 - '@aws-sdk/region-config-resolver@3.972.37': - dependencies: - '@aws-sdk/core': 3.975.3 - tslib: 2.8.1 - optional: true - - '@aws-sdk/signature-v4-multi-region@3.984.0': - dependencies: - '@aws-sdk/middleware-sdk-s3': 3.972.64 - '@aws-sdk/types': 3.974.2 - '@smithy/protocol-http': 5.5.9 - '@smithy/signature-v4': 5.6.5 - '@smithy/types': 4.16.1 - tslib: 2.8.1 - optional: true - '@aws-sdk/signature-v4-multi-region@3.996.41': dependencies: '@aws-sdk/types': 3.974.2 @@ -7280,32 +7545,6 @@ snapshots: '@smithy/types': 4.16.1 tslib: 2.8.1 - '@aws-sdk/util-endpoints@3.984.0': - dependencies: - '@aws-sdk/types': 3.974.2 - '@smithy/types': 4.16.1 - '@smithy/url-parser': 4.4.9 - '@smithy/util-endpoints': 3.6.9 - tslib: 2.8.1 - optional: true - - '@aws-sdk/util-locate-window@3.965.8': - dependencies: - tslib: 2.8.1 - optional: true - - '@aws-sdk/util-user-agent-browser@3.972.34': - dependencies: - '@aws-sdk/core': 3.975.3 - tslib: 2.8.1 - optional: true - - '@aws-sdk/util-user-agent-node@3.973.49': - dependencies: - '@aws-sdk/core': 3.975.3 - tslib: 2.8.1 - optional: true - '@aws-sdk/xml-builder@3.972.36': dependencies: '@smithy/types': 4.16.1 @@ -7313,6 +7552,12 @@ snapshots: '@aws/lambda-invoke-store@0.3.0': {} + '@babel/code-frame@7.27.1': + dependencies: + '@babel/helper-validator-identifier': 7.29.7 + js-tokens: 4.0.0 + picocolors: 1.1.1 + '@babel/code-frame@7.29.7': dependencies: '@babel/helper-validator-identifier': 7.29.7 @@ -7349,6 +7594,10 @@ snapshots: '@jridgewell/trace-mapping': 0.3.31 jsesc: 3.1.0 + '@babel/helper-annotate-as-pure@7.29.7': + dependencies: + '@babel/types': 7.29.7 + '@babel/helper-compilation-targets@7.29.7': dependencies: '@babel/compat-data': 7.29.7 @@ -7357,8 +7606,28 @@ snapshots: lru-cache: 5.1.1 semver: 6.3.1 + '@babel/helper-create-class-features-plugin@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-annotate-as-pure': 7.29.7 + '@babel/helper-member-expression-to-functions': 7.29.7 + '@babel/helper-optimise-call-expression': 7.29.7 + '@babel/helper-replace-supers': 7.29.7(@babel/core@7.29.7) + '@babel/helper-skip-transparent-expression-wrappers': 7.29.7 + '@babel/traverse': 7.29.7 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + '@babel/helper-globals@7.29.7': {} + '@babel/helper-member-expression-to-functions@7.29.7': + dependencies: + '@babel/traverse': 7.29.7 + '@babel/types': 7.29.7 + transitivePeerDependencies: + - supports-color + '@babel/helper-module-imports@7.29.7': dependencies: '@babel/traverse': 7.29.7 @@ -7375,8 +7644,30 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/helper-string-parser@7.29.7': {} - + '@babel/helper-optimise-call-expression@7.29.7': + dependencies: + '@babel/types': 7.29.7 + + '@babel/helper-plugin-utils@7.29.7': {} + + '@babel/helper-replace-supers@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-member-expression-to-functions': 7.29.7 + '@babel/helper-optimise-call-expression': 7.29.7 + '@babel/traverse': 7.29.7 + transitivePeerDependencies: + - supports-color + + '@babel/helper-skip-transparent-expression-wrappers@7.29.7': + dependencies: + '@babel/traverse': 7.29.7 + '@babel/types': 7.29.7 + transitivePeerDependencies: + - supports-color + + '@babel/helper-string-parser@7.29.7': {} + '@babel/helper-validator-identifier@7.29.7': {} '@babel/helper-validator-option@7.29.7': {} @@ -7390,6 +7681,48 @@ snapshots: dependencies: '@babel/types': 7.29.7 + '@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-modules-commonjs@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7) + '@babel/helper-plugin-utils': 7.29.7 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-typescript@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-annotate-as-pure': 7.29.7 + '@babel/helper-create-class-features-plugin': 7.29.7(@babel/core@7.29.7) + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-skip-transparent-expression-wrappers': 7.29.7 + '@babel/plugin-syntax-typescript': 7.29.7(@babel/core@7.29.7) + transitivePeerDependencies: + - supports-color + + '@babel/preset-typescript@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-validator-option': 7.29.7 + '@babel/plugin-syntax-jsx': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-modules-commonjs': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-typescript': 7.29.7(@babel/core@7.29.7) + transitivePeerDependencies: + - supports-color + + '@babel/runtime@7.29.7': {} + '@babel/template@7.29.7': dependencies: '@babel/code-frame': 7.29.7 @@ -7413,6 +7746,33 @@ snapshots: '@babel/helper-string-parser': 7.29.7 '@babel/helper-validator-identifier': 7.29.7 + '@base-ui/react@1.5.0(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + dependencies: + '@babel/runtime': 7.29.7 + '@base-ui/utils': 0.2.9(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@floating-ui/react-dom': 2.1.9(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@floating-ui/utils': 0.2.12 + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + use-sync-external-store: 1.6.0(react@19.2.7) + optionalDependencies: + '@types/react': 19.2.16 + + '@base-ui/utils@0.2.9(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + dependencies: + '@babel/runtime': 7.29.7 + '@floating-ui/utils': 0.2.12 + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + reselect: 5.2.0 + use-sync-external-store: 1.6.0(react@19.2.7) + optionalDependencies: + '@types/react': 19.2.16 + + '@bramus/specificity@2.4.2': + dependencies: + css-tree: 3.2.1 + '@clack/core@0.5.0': dependencies: picocolors: 1.1.1 @@ -7426,78 +7786,36 @@ snapshots: '@cloudflare/kv-asset-handler@0.5.0': {} - '@cloudflare/unenv-preset@2.16.1(unenv@2.0.0-rc.24)(workerd@1.20260702.1)': - dependencies: - unenv: 2.0.0-rc.24 - optionalDependencies: - workerd: 1.20260702.1 - '@cloudflare/unenv-preset@2.16.1(unenv@2.0.0-rc.24)(workerd@1.20260714.1)': dependencies: unenv: 2.0.0-rc.24 optionalDependencies: workerd: 1.20260714.1 - '@cloudflare/unenv-preset@2.7.7(unenv@2.0.0-rc.21)(workerd@1.20260714.1)': - dependencies: - unenv: 2.0.0-rc.21 - optionalDependencies: - workerd: 1.20260714.1 - - '@cloudflare/workerd-darwin-64@1.20260424.1': - optional: true - - '@cloudflare/workerd-darwin-64@1.20260702.1': - optional: true - '@cloudflare/workerd-darwin-64@1.20260704.1': optional: true '@cloudflare/workerd-darwin-64@1.20260714.1': optional: true - '@cloudflare/workerd-darwin-arm64@1.20260424.1': - optional: true - - '@cloudflare/workerd-darwin-arm64@1.20260702.1': - optional: true - '@cloudflare/workerd-darwin-arm64@1.20260704.1': optional: true '@cloudflare/workerd-darwin-arm64@1.20260714.1': optional: true - '@cloudflare/workerd-linux-64@1.20260424.1': - optional: true - - '@cloudflare/workerd-linux-64@1.20260702.1': - optional: true - '@cloudflare/workerd-linux-64@1.20260704.1': optional: true '@cloudflare/workerd-linux-64@1.20260714.1': optional: true - '@cloudflare/workerd-linux-arm64@1.20260424.1': - optional: true - - '@cloudflare/workerd-linux-arm64@1.20260702.1': - optional: true - '@cloudflare/workerd-linux-arm64@1.20260704.1': optional: true '@cloudflare/workerd-linux-arm64@1.20260714.1': optional: true - '@cloudflare/workerd-windows-64@1.20260424.1': - optional: true - - '@cloudflare/workerd-windows-64@1.20260702.1': - optional: true - '@cloudflare/workerd-windows-64@1.20260704.1': optional: true @@ -7510,6 +7828,30 @@ snapshots: dependencies: '@jridgewell/trace-mapping': 0.3.9 + '@csstools/color-helpers@6.1.0': {} + + '@csstools/css-calc@3.2.1(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)': + dependencies: + '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) + '@csstools/css-tokenizer': 4.0.0 + + '@csstools/css-color-parser@4.1.9(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)': + dependencies: + '@csstools/color-helpers': 6.1.0 + '@csstools/css-calc': 3.2.1(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) + '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) + '@csstools/css-tokenizer': 4.0.0 + + '@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0)': + dependencies: + '@csstools/css-tokenizer': 4.0.0 + + '@csstools/css-syntax-patches-for-csstree@1.1.6(css-tree@3.2.1)': + optionalDependencies: + css-tree: 3.2.1 + + '@csstools/css-tokenizer@4.0.0': {} + '@distilled.cloud/aws@0.29.1(effect@4.0.0-beta.98)': dependencies: '@aws-crypto/crc32': 5.2.0 @@ -7583,23 +7925,26 @@ snapshots: '@distilled.cloud/core': 0.29.1(effect@4.0.0-beta.98) effect: 4.0.0-beta.98 - '@dotenvx/dotenvx@1.31.0': + '@dotenvx/dotenvx@1.75.1': dependencies: + '@dotenvx/primitives': 0.8.0 commander: 11.1.0 - dotenv: 16.6.1 - eciesjs: 0.4.18 + conf: 10.2.0 + dotenv: 17.4.2 + enquirer: 2.4.1 + env-paths: 2.2.1 execa: 5.1.1 fdir: 6.5.0(picomatch@4.0.5) ignore: 5.3.2 object-treeify: 1.1.33 + open: 8.4.2 picomatch: 4.0.5 + systeminformation: 5.31.17 + undici: 7.28.0 which: 4.0.0 - optional: true + yocto-spinner: 1.2.2 - '@ecies/ciphers@0.2.6(@noble/ciphers@1.3.0)': - dependencies: - '@noble/ciphers': 1.3.0 - optional: true + '@dotenvx/primitives@0.8.0': {} '@effect/platform-bun@4.0.0-beta.98(effect@4.0.0-beta.98)': dependencies: @@ -7629,10 +7974,10 @@ snapshots: - bufferutil - utf-8-validate - '@effect/vitest@4.0.0-beta.98(effect@4.0.0-beta.98)(vitest@4.1.10(@types/node@26.1.1)(vite@8.1.5(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.16.9)(yaml@2.9.0)))': + '@effect/vitest@4.0.0-beta.98(effect@4.0.0-beta.98)(vitest@4.1.10(@types/node@26.1.1)(jsdom@28.1.0(@noble/hashes@1.8.0))(msw@2.15.0(@types/node@26.1.1)(typescript@6.0.3))(vite@8.1.5(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.16.9)(yaml@2.9.0)))': dependencies: effect: 4.0.0-beta.98 - vitest: 4.1.10(@types/node@26.1.1)(vite@8.1.5(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.16.9)(yaml@2.9.0)) + vitest: 4.1.10(@types/node@26.1.1)(jsdom@28.1.0(@noble/hashes@1.8.0))(msw@2.15.0(@types/node@26.1.1)(typescript@6.0.3))(vite@8.1.5(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.16.9)(yaml@2.9.0)) '@emnapi/core@1.10.0': dependencies: @@ -7671,237 +8016,89 @@ snapshots: tslib: 2.8.1 optional: true - '@esbuild/aix-ppc64@0.25.12': - optional: true - - '@esbuild/aix-ppc64@0.25.4': - optional: true - '@esbuild/aix-ppc64@0.28.1': optional: true - '@esbuild/android-arm64@0.25.12': - optional: true - - '@esbuild/android-arm64@0.25.4': - optional: true - '@esbuild/android-arm64@0.28.1': optional: true - '@esbuild/android-arm@0.25.12': - optional: true - - '@esbuild/android-arm@0.25.4': - optional: true - '@esbuild/android-arm@0.28.1': optional: true - '@esbuild/android-x64@0.25.12': - optional: true - - '@esbuild/android-x64@0.25.4': - optional: true - '@esbuild/android-x64@0.28.1': optional: true - '@esbuild/darwin-arm64@0.25.12': - optional: true - - '@esbuild/darwin-arm64@0.25.4': - optional: true - '@esbuild/darwin-arm64@0.28.1': optional: true - '@esbuild/darwin-x64@0.25.12': - optional: true - - '@esbuild/darwin-x64@0.25.4': - optional: true - '@esbuild/darwin-x64@0.28.1': optional: true - '@esbuild/freebsd-arm64@0.25.12': - optional: true - - '@esbuild/freebsd-arm64@0.25.4': - optional: true - '@esbuild/freebsd-arm64@0.28.1': optional: true - '@esbuild/freebsd-x64@0.25.12': - optional: true - - '@esbuild/freebsd-x64@0.25.4': - optional: true - '@esbuild/freebsd-x64@0.28.1': optional: true - '@esbuild/linux-arm64@0.25.12': - optional: true - - '@esbuild/linux-arm64@0.25.4': - optional: true - '@esbuild/linux-arm64@0.28.1': optional: true - '@esbuild/linux-arm@0.25.12': - optional: true - - '@esbuild/linux-arm@0.25.4': - optional: true - '@esbuild/linux-arm@0.28.1': optional: true - '@esbuild/linux-ia32@0.25.12': - optional: true - - '@esbuild/linux-ia32@0.25.4': - optional: true - '@esbuild/linux-ia32@0.28.1': optional: true - '@esbuild/linux-loong64@0.25.12': - optional: true - - '@esbuild/linux-loong64@0.25.4': - optional: true - '@esbuild/linux-loong64@0.28.1': optional: true - '@esbuild/linux-mips64el@0.25.12': - optional: true - - '@esbuild/linux-mips64el@0.25.4': - optional: true - '@esbuild/linux-mips64el@0.28.1': optional: true - '@esbuild/linux-ppc64@0.25.12': - optional: true - - '@esbuild/linux-ppc64@0.25.4': - optional: true - '@esbuild/linux-ppc64@0.28.1': optional: true - '@esbuild/linux-riscv64@0.25.12': - optional: true - - '@esbuild/linux-riscv64@0.25.4': - optional: true - '@esbuild/linux-riscv64@0.28.1': optional: true - '@esbuild/linux-s390x@0.25.12': - optional: true - - '@esbuild/linux-s390x@0.25.4': - optional: true - '@esbuild/linux-s390x@0.28.1': optional: true - '@esbuild/linux-x64@0.25.12': - optional: true - - '@esbuild/linux-x64@0.25.4': - optional: true - '@esbuild/linux-x64@0.28.1': optional: true - '@esbuild/netbsd-arm64@0.25.12': - optional: true - - '@esbuild/netbsd-arm64@0.25.4': - optional: true - '@esbuild/netbsd-arm64@0.28.1': optional: true - '@esbuild/netbsd-x64@0.25.12': - optional: true - - '@esbuild/netbsd-x64@0.25.4': - optional: true - '@esbuild/netbsd-x64@0.28.1': optional: true - '@esbuild/openbsd-arm64@0.25.12': - optional: true - - '@esbuild/openbsd-arm64@0.25.4': - optional: true - '@esbuild/openbsd-arm64@0.28.1': optional: true - '@esbuild/openbsd-x64@0.25.12': - optional: true - - '@esbuild/openbsd-x64@0.25.4': - optional: true - '@esbuild/openbsd-x64@0.28.1': optional: true - '@esbuild/openharmony-arm64@0.25.12': - optional: true - '@esbuild/openharmony-arm64@0.28.1': optional: true - '@esbuild/sunos-x64@0.25.12': - optional: true - - '@esbuild/sunos-x64@0.25.4': - optional: true - '@esbuild/sunos-x64@0.28.1': optional: true - '@esbuild/win32-arm64@0.25.12': - optional: true - - '@esbuild/win32-arm64@0.25.4': - optional: true - '@esbuild/win32-arm64@0.28.1': optional: true - '@esbuild/win32-ia32@0.25.12': - optional: true - - '@esbuild/win32-ia32@0.25.4': - optional: true - '@esbuild/win32-ia32@0.28.1': optional: true - '@esbuild/win32-x64@0.25.12': - optional: true - - '@esbuild/win32-x64@0.25.4': - optional: true - '@esbuild/win32-x64@0.28.1': optional: true + '@eslint-community/eslint-utils@4.9.1(eslint@9.39.4(jiti@2.7.0))': + dependencies: + eslint: 9.39.4(jiti@2.7.0) + eslint-visitor-keys: 3.4.3 + '@eslint-community/eslint-utils@4.9.1(eslint@9.39.5(jiti@2.7.0))': dependencies: eslint: 9.39.5(jiti@2.7.0) @@ -7939,6 +8136,12 @@ snapshots: transitivePeerDependencies: - supports-color + '@eslint/js@10.0.1(eslint@9.39.4(jiti@2.7.0))': + optionalDependencies: + eslint: 9.39.4(jiti@2.7.0) + + '@eslint/js@9.39.4': {} + '@eslint/js@9.39.5': {} '@eslint/object-schema@2.1.7': {} @@ -7948,6 +8151,10 @@ snapshots: '@eslint/core': 0.17.0 levn: 0.4.1 + '@exodus/bytes@1.15.1(@noble/hashes@1.8.0)': + optionalDependencies: + '@noble/hashes': 1.8.0 + '@floating-ui/core@1.8.0': dependencies: '@floating-ui/utils': 0.2.12 @@ -7965,6 +8172,8 @@ snapshots: '@floating-ui/utils@0.2.12': {} + '@fontsource-variable/space-grotesk@5.2.10': {} + '@fuma-translate/react@1.0.2(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': dependencies: react: 19.2.7 @@ -7976,6 +8185,16 @@ snapshots: optionalDependencies: tailwindcss: 4.3.3 + '@hono/node-server@1.19.14(hono@4.12.30)': + dependencies: + hono: 4.12.30 + + '@hugeicons/core-free-icons@4.2.0': {} + + '@hugeicons/react@1.1.6(react@19.2.7)': + dependencies: + react: 19.2.7 + '@humanfs/core@0.19.2': dependencies: '@humanfs/types': 0.15.0 @@ -7992,8 +8211,6 @@ snapshots: '@humanwhocodes/retry@0.4.3': {} - '@iarna/toml@2.2.5': {} - '@img/colour@1.1.0': {} '@img/sharp-darwin-arm64@0.34.5': @@ -8194,20 +8411,61 @@ snapshots: '@img/sharp-win32-x64@0.35.3': optional: true - '@ioredis/commands@1.10.0': {} + '@inquirer/ansi@2.0.7': {} - '@isaacs/cliui@8.0.2': + '@inquirer/confirm@6.1.1(@types/node@22.19.19)': dependencies: - string-width: 5.1.2 - string-width-cjs: string-width@4.2.3 - strip-ansi: 7.2.0 - strip-ansi-cjs: strip-ansi@6.0.1 - wrap-ansi: 8.1.0 - wrap-ansi-cjs: wrap-ansi@7.0.0 + '@inquirer/core': 11.2.1(@types/node@22.19.19) + '@inquirer/type': 4.0.7(@types/node@22.19.19) + optionalDependencies: + '@types/node': 22.19.19 + + '@inquirer/confirm@6.1.1(@types/node@26.1.1)': + dependencies: + '@inquirer/core': 11.2.1(@types/node@26.1.1) + '@inquirer/type': 4.0.7(@types/node@26.1.1) + optionalDependencies: + '@types/node': 26.1.1 + optional: true + + '@inquirer/core@11.2.1(@types/node@22.19.19)': + dependencies: + '@inquirer/ansi': 2.0.7 + '@inquirer/figures': 2.0.7 + '@inquirer/type': 4.0.7(@types/node@22.19.19) + cli-width: 4.1.0 + fast-wrap-ansi: 0.2.2 + mute-stream: 3.0.0 + signal-exit: 4.1.0 + optionalDependencies: + '@types/node': 22.19.19 + + '@inquirer/core@11.2.1(@types/node@26.1.1)': + dependencies: + '@inquirer/ansi': 2.0.7 + '@inquirer/figures': 2.0.7 + '@inquirer/type': 4.0.7(@types/node@26.1.1) + cli-width: 4.1.0 + fast-wrap-ansi: 0.2.2 + mute-stream: 3.0.0 + signal-exit: 4.1.0 + optionalDependencies: + '@types/node': 26.1.1 + optional: true + + '@inquirer/figures@2.0.7': {} + + '@inquirer/type@4.0.7(@types/node@22.19.19)': + optionalDependencies: + '@types/node': 22.19.19 - '@isaacs/cliui@9.0.0': + '@inquirer/type@4.0.7(@types/node@26.1.1)': + optionalDependencies: + '@types/node': 26.1.1 optional: true + '@ioredis/commands@1.10.0': {} + '@jridgewell/gen-mapping@0.3.13': dependencies: '@jridgewell/sourcemap-codec': 1.5.5 @@ -8326,6 +8584,28 @@ snapshots: transitivePeerDependencies: - supports-color + '@modelcontextprotocol/sdk@1.29.0(zod@3.25.76)': + dependencies: + '@hono/node-server': 1.19.14(hono@4.12.30) + ajv: 8.20.0 + ajv-formats: 3.0.1(ajv@8.20.0) + content-type: 1.0.5 + cors: 2.8.6 + cross-spawn: 7.0.6 + eventsource: 3.0.7 + eventsource-parser: 3.1.0 + express: 5.2.1 + express-rate-limit: 8.6.0(express@5.2.1) + hono: 4.12.30 + jose: 6.2.3 + json-schema-typed: 8.0.2 + pkce-challenge: 5.0.1 + raw-body: 3.0.2 + zod: 3.25.76 + zod-to-json-schema: 3.25.2(zod@3.25.76) + transitivePeerDependencies: + - supports-color + '@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.4': optional: true @@ -8344,6 +8624,15 @@ snapshots: '@msgpackr-extract/msgpackr-extract-win32-x64@3.0.4': optional: true + '@mswjs/interceptors@0.41.9': + dependencies: + '@open-draft/deferred-promise': 2.2.0 + '@open-draft/logger': 0.3.0 + '@open-draft/until': 2.1.0 + is-node-process: 1.2.0 + outvariant: 1.4.3 + strict-event-emitter: 0.5.1 + '@napi-rs/wasm-runtime@1.1.6(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': dependencies: '@emnapi/core': 1.10.0 @@ -8358,8 +8647,15 @@ snapshots: '@tybys/wasm-util': 0.10.3 optional: true - '@neon-rs/load@0.0.4': {} - + '@napi-rs/wasm-runtime@1.1.6(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.2)': + dependencies: + '@emnapi/core': 1.11.1 + '@emnapi/runtime': 1.11.2 + '@tybys/wasm-util': 0.10.3 + optional: true + + '@neon-rs/load@0.0.4': {} + '@next/env@16.2.10': {} '@next/eslint-plugin-next@16.2.10': @@ -8390,37 +8686,11 @@ snapshots: '@next/swc-win32-x64-msvc@16.2.10': optional: true - '@noble/ciphers@1.3.0': - optional: true - - '@noble/curves@1.9.7': - dependencies: - '@noble/hashes': 1.8.0 - optional: true - '@noble/hashes@1.8.0': optional: true '@nodable/entities@2.2.0': {} - '@node-minify/core@8.0.6': - dependencies: - '@node-minify/utils': 8.0.6 - glob: 9.3.5 - mkdirp: 1.0.4 - optional: true - - '@node-minify/terser@8.0.6': - dependencies: - '@node-minify/utils': 8.0.6 - terser: 5.16.9 - optional: true - - '@node-minify/utils@8.0.6': - dependencies: - gzip-size: 6.0.0 - optional: true - '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5 @@ -8435,20 +8705,8 @@ snapshots: '@nolyfill/is-core-module@1.0.39': {} - '@octokit/auth-token@5.1.2': {} - '@octokit/auth-token@6.0.0': {} - '@octokit/core@6.1.6': - dependencies: - '@octokit/auth-token': 5.1.2 - '@octokit/graphql': 8.2.2 - '@octokit/request': 9.2.4 - '@octokit/request-error': 6.1.8 - '@octokit/types': 14.1.0 - before-after-hook: 3.0.2 - universal-user-agent: 7.0.3 - '@octokit/core@7.0.6': dependencies: '@octokit/auth-token': 6.0.0 @@ -8459,68 +8717,35 @@ snapshots: before-after-hook: 4.0.0 universal-user-agent: 7.0.3 - '@octokit/endpoint@10.1.4': - dependencies: - '@octokit/types': 14.1.0 - universal-user-agent: 7.0.3 - '@octokit/endpoint@11.0.3': dependencies: '@octokit/types': 16.0.0 universal-user-agent: 7.0.3 - '@octokit/graphql@8.2.2': - dependencies: - '@octokit/request': 9.2.4 - '@octokit/types': 14.1.0 - universal-user-agent: 7.0.3 - '@octokit/graphql@9.0.3': dependencies: '@octokit/request': 10.0.11 '@octokit/types': 16.0.0 universal-user-agent: 7.0.3 - '@octokit/openapi-types@24.2.0': {} - - '@octokit/openapi-types@25.1.0': {} - '@octokit/openapi-types@27.0.0': {} '@octokit/openapi-webhooks-types@12.1.0': {} - '@octokit/plugin-paginate-rest@11.6.0(@octokit/core@6.1.6)': - dependencies: - '@octokit/core': 6.1.6 - '@octokit/types': 13.10.0 - '@octokit/plugin-paginate-rest@14.0.0(@octokit/core@7.0.6)': dependencies: '@octokit/core': 7.0.6 '@octokit/types': 16.0.0 - '@octokit/plugin-request-log@5.3.1(@octokit/core@6.1.6)': - dependencies: - '@octokit/core': 6.1.6 - '@octokit/plugin-request-log@6.0.0(@octokit/core@7.0.6)': dependencies: '@octokit/core': 7.0.6 - '@octokit/plugin-rest-endpoint-methods@13.5.0(@octokit/core@6.1.6)': - dependencies: - '@octokit/core': 6.1.6 - '@octokit/types': 13.10.0 - '@octokit/plugin-rest-endpoint-methods@17.0.0(@octokit/core@7.0.6)': dependencies: '@octokit/core': 7.0.6 '@octokit/types': 16.0.0 - '@octokit/request-error@6.1.8': - dependencies: - '@octokit/types': 14.1.0 - '@octokit/request-error@7.1.0': dependencies: '@octokit/types': 16.0.0 @@ -8534,21 +8759,6 @@ snapshots: json-with-bigint: 3.5.10 universal-user-agent: 7.0.3 - '@octokit/request@9.2.4': - dependencies: - '@octokit/endpoint': 10.1.4 - '@octokit/request-error': 6.1.8 - '@octokit/types': 14.1.0 - fast-content-type-parse: 2.0.1 - universal-user-agent: 7.0.3 - - '@octokit/rest@21.1.1': - dependencies: - '@octokit/core': 6.1.6 - '@octokit/plugin-paginate-rest': 11.6.0(@octokit/core@6.1.6) - '@octokit/plugin-request-log': 5.3.1(@octokit/core@6.1.6) - '@octokit/plugin-rest-endpoint-methods': 13.5.0(@octokit/core@6.1.6) - '@octokit/rest@22.0.1': dependencies: '@octokit/core': 7.0.6 @@ -8556,14 +8766,6 @@ snapshots: '@octokit/plugin-request-log': 6.0.0(@octokit/core@7.0.6) '@octokit/plugin-rest-endpoint-methods': 17.0.0(@octokit/core@7.0.6) - '@octokit/types@13.10.0': - dependencies: - '@octokit/openapi-types': 24.2.0 - - '@octokit/types@14.1.0': - dependencies: - '@octokit/openapi-types': 25.1.0 - '@octokit/types@16.0.0': dependencies: '@octokit/openapi-types': 27.0.0 @@ -8576,59 +8778,108 @@ snapshots: '@octokit/request-error': 7.1.0 '@octokit/webhooks-methods': 6.0.0 - '@opennextjs/aws@4.0.2(next@16.2.10(react-dom@19.2.7(react@19.2.7))(react@19.2.7))': - dependencies: - '@ast-grep/napi': 0.40.5 - '@aws-sdk/client-cloudfront': 3.984.0 - '@aws-sdk/client-dynamodb': 3.984.0 - '@aws-sdk/client-lambda': 3.984.0 - '@aws-sdk/client-s3': 3.984.0 - '@aws-sdk/client-sqs': 3.984.0 - '@node-minify/core': 8.0.6 - '@node-minify/terser': 8.0.6 - '@tsconfig/node18': 1.0.3 - aws4fetch: 1.0.20 - chalk: 5.6.2 - cookie: 1.1.1 - esbuild: 0.25.4 - express: 5.2.1 - next: 16.2.10(@babel/core@7.29.7)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) - path-to-regexp: 6.3.0 - urlpattern-polyfill: 10.1.0 - yaml: 2.9.0 - transitivePeerDependencies: - - supports-color + '@oozcitak/dom@2.0.2': + dependencies: + '@oozcitak/infra': 2.0.2 + '@oozcitak/url': 3.0.0 + '@oozcitak/util': 10.0.0 + + '@oozcitak/infra@2.0.2': + dependencies: + '@oozcitak/util': 10.0.0 + + '@oozcitak/url@3.0.0': + dependencies: + '@oozcitak/infra': 2.0.2 + '@oozcitak/util': 10.0.0 + + '@oozcitak/util@10.0.0': {} + + '@open-draft/deferred-promise@2.2.0': {} + + '@open-draft/deferred-promise@3.0.0': {} + + '@open-draft/logger@0.3.0': + dependencies: + is-node-process: 1.2.0 + outvariant: 1.4.3 + + '@open-draft/until@2.1.0': {} + + '@orama/orama@3.1.18': {} + + '@oxc-parser/binding-android-arm-eabi@0.120.0': + optional: true + + '@oxc-parser/binding-android-arm64@0.120.0': + optional: true + + '@oxc-parser/binding-darwin-arm64@0.120.0': + optional: true + + '@oxc-parser/binding-darwin-x64@0.120.0': + optional: true + + '@oxc-parser/binding-freebsd-x64@0.120.0': + optional: true + + '@oxc-parser/binding-linux-arm-gnueabihf@0.120.0': + optional: true + + '@oxc-parser/binding-linux-arm-musleabihf@0.120.0': + optional: true + + '@oxc-parser/binding-linux-arm64-gnu@0.120.0': + optional: true + + '@oxc-parser/binding-linux-arm64-musl@0.120.0': + optional: true + + '@oxc-parser/binding-linux-ppc64-gnu@0.120.0': + optional: true + + '@oxc-parser/binding-linux-riscv64-gnu@0.120.0': + optional: true + + '@oxc-parser/binding-linux-riscv64-musl@0.120.0': + optional: true + + '@oxc-parser/binding-linux-s390x-gnu@0.120.0': + optional: true + + '@oxc-parser/binding-linux-x64-gnu@0.120.0': + optional: true + + '@oxc-parser/binding-linux-x64-musl@0.120.0': + optional: true + + '@oxc-parser/binding-openharmony-arm64@0.120.0': optional: true - '@opennextjs/cloudflare@1.20.1(next@16.2.10(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(rclone.js@0.6.6)(wrangler@4.112.0(@cloudflare/workers-types@5.20260717.1))': + '@oxc-parser/binding-wasm32-wasi@0.120.0(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.2)': dependencies: - '@ast-grep/napi': 0.40.5 - '@dotenvx/dotenvx': 1.31.0 - '@opennextjs/aws': 4.0.2(next@16.2.10(react-dom@19.2.7(react@19.2.7))(react@19.2.7)) - ci-info: 4.4.0 - cloudflare: 4.5.0 - comment-json: 4.6.2 - enquirer: 2.4.1 - glob: 12.0.0 - next: 16.2.10(@babel/core@7.29.7)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) - ts-tqdm: 0.8.6 - wrangler: 4.112.0(@cloudflare/workers-types@5.20260717.1) - yargs: 18.0.0 - optionalDependencies: - rclone.js: 0.6.6 + '@napi-rs/wasm-runtime': 1.1.6(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.2) transitivePeerDependencies: - - encoding - - supports-color + - '@emnapi/core' + - '@emnapi/runtime' optional: true - '@orama/orama@3.1.18': {} + '@oxc-parser/binding-win32-arm64-msvc@0.120.0': + optional: true + + '@oxc-parser/binding-win32-ia32-msvc@0.120.0': + optional: true + + '@oxc-parser/binding-win32-x64-msvc@0.120.0': + optional: true + + '@oxc-project/types@0.120.0': {} '@oxc-project/types@0.130.0': {} - '@oxc-project/types@0.139.0': {} + '@oxc-project/types@0.133.0': {} - '@pkgjs/parseargs@0.11.0': - optional: true + '@oxc-project/types@0.139.0': {} '@poppinss/colors@4.1.6': dependencies: @@ -8994,72 +9245,108 @@ snapshots: '@rolldown/binding-android-arm64@1.0.1': optional: true + '@rolldown/binding-android-arm64@1.0.3': + optional: true + '@rolldown/binding-android-arm64@1.1.5': optional: true '@rolldown/binding-darwin-arm64@1.0.1': optional: true + '@rolldown/binding-darwin-arm64@1.0.3': + optional: true + '@rolldown/binding-darwin-arm64@1.1.5': optional: true '@rolldown/binding-darwin-x64@1.0.1': optional: true + '@rolldown/binding-darwin-x64@1.0.3': + optional: true + '@rolldown/binding-darwin-x64@1.1.5': optional: true '@rolldown/binding-freebsd-x64@1.0.1': optional: true + '@rolldown/binding-freebsd-x64@1.0.3': + optional: true + '@rolldown/binding-freebsd-x64@1.1.5': optional: true '@rolldown/binding-linux-arm-gnueabihf@1.0.1': optional: true + '@rolldown/binding-linux-arm-gnueabihf@1.0.3': + optional: true + '@rolldown/binding-linux-arm-gnueabihf@1.1.5': optional: true '@rolldown/binding-linux-arm64-gnu@1.0.1': optional: true + '@rolldown/binding-linux-arm64-gnu@1.0.3': + optional: true + '@rolldown/binding-linux-arm64-gnu@1.1.5': optional: true '@rolldown/binding-linux-arm64-musl@1.0.1': optional: true + '@rolldown/binding-linux-arm64-musl@1.0.3': + optional: true + '@rolldown/binding-linux-arm64-musl@1.1.5': optional: true '@rolldown/binding-linux-ppc64-gnu@1.0.1': optional: true + '@rolldown/binding-linux-ppc64-gnu@1.0.3': + optional: true + '@rolldown/binding-linux-ppc64-gnu@1.1.5': optional: true '@rolldown/binding-linux-s390x-gnu@1.0.1': optional: true + '@rolldown/binding-linux-s390x-gnu@1.0.3': + optional: true + '@rolldown/binding-linux-s390x-gnu@1.1.5': optional: true '@rolldown/binding-linux-x64-gnu@1.0.1': optional: true + '@rolldown/binding-linux-x64-gnu@1.0.3': + optional: true + '@rolldown/binding-linux-x64-gnu@1.1.5': optional: true '@rolldown/binding-linux-x64-musl@1.0.1': optional: true + '@rolldown/binding-linux-x64-musl@1.0.3': + optional: true + '@rolldown/binding-linux-x64-musl@1.1.5': optional: true '@rolldown/binding-openharmony-arm64@1.0.1': optional: true + '@rolldown/binding-openharmony-arm64@1.0.3': + optional: true + '@rolldown/binding-openharmony-arm64@1.1.5': optional: true @@ -9070,6 +9357,13 @@ snapshots: '@napi-rs/wasm-runtime': 1.1.6(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) optional: true + '@rolldown/binding-wasm32-wasi@1.0.3': + dependencies: + '@emnapi/core': 1.10.0 + '@emnapi/runtime': 1.10.0 + '@napi-rs/wasm-runtime': 1.1.6(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) + optional: true + '@rolldown/binding-wasm32-wasi@1.1.5': dependencies: '@emnapi/core': 1.11.1 @@ -9080,20 +9374,23 @@ snapshots: '@rolldown/binding-win32-arm64-msvc@1.0.1': optional: true + '@rolldown/binding-win32-arm64-msvc@1.0.3': + optional: true + '@rolldown/binding-win32-arm64-msvc@1.1.5': optional: true '@rolldown/binding-win32-x64-msvc@1.0.1': optional: true + '@rolldown/binding-win32-x64-msvc@1.0.3': + optional: true + '@rolldown/binding-win32-x64-msvc@1.1.5': optional: true '@rolldown/pluginutils@1.0.1': {} - '@rollup/rollup-linux-x64-gnu@4.62.2': - optional: true - '@rtsao/scc@1.1.0': {} '@sec-ant/readable-stream@0.4.1': {} @@ -9142,12 +9439,6 @@ snapshots: '@sindresorhus/merge-streams@4.0.0': {} - '@smithy/config-resolver@4.6.9': - dependencies: - '@smithy/core': 3.29.4 - tslib: 2.8.1 - optional: true - '@smithy/core@3.29.4': dependencies: '@smithy/types': 4.16.1 @@ -9159,272 +9450,216 @@ snapshots: '@smithy/types': 4.16.1 tslib: 2.8.1 - '@smithy/eventstream-serde-browser@4.4.9': + '@smithy/fetch-http-handler@5.6.4': dependencies: '@smithy/core': 3.29.4 + '@smithy/types': 4.16.1 tslib: 2.8.1 - optional: true - '@smithy/eventstream-serde-config-resolver@4.5.9': + '@smithy/is-array-buffer@2.2.0': dependencies: - '@smithy/core': 3.29.4 tslib: 2.8.1 - optional: true - '@smithy/eventstream-serde-node@4.4.9': + '@smithy/node-config-provider@4.5.7': dependencies: '@smithy/core': 3.29.4 tslib: 2.8.1 - optional: true - '@smithy/fetch-http-handler@5.6.4': + '@smithy/node-http-handler@4.9.4': dependencies: '@smithy/core': 3.29.4 '@smithy/types': 4.16.1 tslib: 2.8.1 - '@smithy/hash-blob-browser@4.4.9': + '@smithy/shared-ini-file-loader@4.6.9': dependencies: '@smithy/core': 3.29.4 tslib: 2.8.1 - optional: true - '@smithy/hash-node@4.4.9': + '@smithy/signature-v4@5.6.5': dependencies: '@smithy/core': 3.29.4 + '@smithy/types': 4.16.1 tslib: 2.8.1 - optional: true - '@smithy/hash-stream-node@4.4.9': + '@smithy/types@4.16.1': dependencies: - '@smithy/core': 3.29.4 tslib: 2.8.1 - optional: true - '@smithy/invalid-dependency@4.4.9': + '@smithy/util-base64@4.5.9': dependencies: '@smithy/core': 3.29.4 tslib: 2.8.1 - optional: true - '@smithy/is-array-buffer@2.2.0': + '@smithy/util-buffer-from@2.2.0': dependencies: + '@smithy/is-array-buffer': 2.2.0 tslib: 2.8.1 - '@smithy/md5-js@4.4.9': + '@smithy/util-utf8@2.3.0': dependencies: - '@smithy/core': 3.29.4 + '@smithy/util-buffer-from': 2.2.0 tslib: 2.8.1 - optional: true - '@smithy/middleware-content-length@4.4.9': + '@solid-primitives/event-listener@2.4.6(solid-js@1.9.14)': dependencies: - '@smithy/core': 3.29.4 - tslib: 2.8.1 - optional: true + '@solid-primitives/utils': 6.4.1(solid-js@1.9.14) + solid-js: 1.9.14 - '@smithy/middleware-endpoint@4.6.9': + '@solid-primitives/keyboard@1.3.7(solid-js@1.9.14)': dependencies: - '@smithy/core': 3.29.4 - tslib: 2.8.1 - optional: true + '@solid-primitives/event-listener': 2.4.6(solid-js@1.9.14) + '@solid-primitives/rootless': 1.5.4(solid-js@1.9.14) + '@solid-primitives/utils': 6.4.1(solid-js@1.9.14) + solid-js: 1.9.14 - '@smithy/middleware-retry@4.7.9': + '@solid-primitives/resize-observer@2.2.0(solid-js@1.9.14)': dependencies: - '@smithy/core': 3.29.4 - tslib: 2.8.1 - optional: true + '@solid-primitives/event-listener': 2.4.6(solid-js@1.9.14) + '@solid-primitives/rootless': 1.5.4(solid-js@1.9.14) + '@solid-primitives/static-store': 0.1.4(solid-js@1.9.14) + '@solid-primitives/utils': 6.4.1(solid-js@1.9.14) + solid-js: 1.9.14 - '@smithy/middleware-serde@4.4.9': + '@solid-primitives/rootless@1.5.4(solid-js@1.9.14)': dependencies: - '@smithy/core': 3.29.4 - tslib: 2.8.1 - optional: true + '@solid-primitives/utils': 6.4.1(solid-js@1.9.14) + solid-js: 1.9.14 - '@smithy/middleware-stack@4.4.9': + '@solid-primitives/static-store@0.1.4(solid-js@1.9.14)': dependencies: - '@smithy/core': 3.29.4 - tslib: 2.8.1 - optional: true + '@solid-primitives/utils': 6.4.1(solid-js@1.9.14) + solid-js: 1.9.14 - '@smithy/node-config-provider@4.5.7': + '@solid-primitives/utils@6.4.1(solid-js@1.9.14)': dependencies: - '@smithy/core': 3.29.4 - tslib: 2.8.1 + solid-js: 1.9.14 - '@smithy/node-http-handler@4.9.4': - dependencies: - '@smithy/core': 3.29.4 - '@smithy/types': 4.16.1 - tslib: 2.8.1 + '@speed-highlight/core@1.2.17': {} - '@smithy/protocol-http@5.5.9': - dependencies: - '@smithy/core': 3.29.4 - tslib: 2.8.1 - optional: true + '@standard-schema/spec@1.1.0': {} - '@smithy/shared-ini-file-loader@4.6.9': + '@stylistic/eslint-plugin@5.10.0(eslint@9.39.4(jiti@2.7.0))': dependencies: - '@smithy/core': 3.29.4 - tslib: 2.8.1 + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.4(jiti@2.7.0)) + '@typescript-eslint/types': 8.64.0 + eslint: 9.39.4(jiti@2.7.0) + eslint-visitor-keys: 4.2.1 + espree: 10.4.0 + estraverse: 5.3.0 + picomatch: 4.0.5 - '@smithy/signature-v4@5.6.5': + '@swc/helpers@0.5.15': dependencies: - '@smithy/core': 3.29.4 - '@smithy/types': 4.16.1 tslib: 2.8.1 - '@smithy/smithy-client@4.14.9': + '@tailwindcss/node@4.3.0': dependencies: - '@smithy/core': 3.29.4 - '@smithy/types': 4.16.1 - tslib: 2.8.1 - optional: true + '@jridgewell/remapping': 2.3.5 + enhanced-resolve: 5.24.2 + jiti: 2.7.0 + lightningcss: 1.32.0 + magic-string: 0.30.21 + source-map-js: 1.2.1 + tailwindcss: 4.3.0 - '@smithy/types@4.16.0': + '@tailwindcss/node@4.3.3': dependencies: - tslib: 2.8.1 + '@jridgewell/remapping': 2.3.5 + enhanced-resolve: 5.24.2 + jiti: 2.7.0 + lightningcss: 1.32.0 + magic-string: 0.30.21 + source-map-js: 1.2.1 + tailwindcss: 4.3.3 - '@smithy/types@4.16.1': - dependencies: - tslib: 2.8.1 + '@tailwindcss/oxide-android-arm64@4.3.0': + optional: true - '@smithy/url-parser@4.4.9': - dependencies: - '@smithy/core': 3.29.4 - tslib: 2.8.1 + '@tailwindcss/oxide-android-arm64@4.3.3': optional: true - '@smithy/util-base64@4.5.9': - dependencies: - '@smithy/core': 3.29.4 - tslib: 2.8.1 - - '@smithy/util-body-length-browser@4.4.9': - dependencies: - '@smithy/core': 3.29.4 - tslib: 2.8.1 + '@tailwindcss/oxide-darwin-arm64@4.3.0': optional: true - '@smithy/util-body-length-node@4.4.9': - dependencies: - '@smithy/core': 3.29.4 - tslib: 2.8.1 + '@tailwindcss/oxide-darwin-arm64@4.3.3': optional: true - '@smithy/util-buffer-from@2.2.0': - dependencies: - '@smithy/is-array-buffer': 2.2.0 - tslib: 2.8.1 - - '@smithy/util-defaults-mode-browser@4.5.9': - dependencies: - '@smithy/core': 3.29.4 - tslib: 2.8.1 + '@tailwindcss/oxide-darwin-x64@4.3.0': optional: true - '@smithy/util-defaults-mode-node@4.4.9': - dependencies: - '@smithy/core': 3.29.4 - tslib: 2.8.1 + '@tailwindcss/oxide-darwin-x64@4.3.3': optional: true - '@smithy/util-endpoints@3.6.9': - dependencies: - '@smithy/core': 3.29.4 - tslib: 2.8.1 + '@tailwindcss/oxide-freebsd-x64@4.3.0': optional: true - '@smithy/util-middleware@4.4.9': - dependencies: - '@smithy/core': 3.29.4 - tslib: 2.8.1 + '@tailwindcss/oxide-freebsd-x64@4.3.3': optional: true - '@smithy/util-retry@4.5.9': - dependencies: - '@smithy/core': 3.29.4 - tslib: 2.8.1 + '@tailwindcss/oxide-linux-arm-gnueabihf@4.3.0': optional: true - '@smithy/util-stream@4.7.9': - dependencies: - '@smithy/core': 3.29.4 - tslib: 2.8.1 + '@tailwindcss/oxide-linux-arm-gnueabihf@4.3.3': optional: true - '@smithy/util-utf8@2.3.0': - dependencies: - '@smithy/util-buffer-from': 2.2.0 - tslib: 2.8.1 - - '@smithy/util-utf8@4.4.9': - dependencies: - '@smithy/core': 3.29.4 - tslib: 2.8.1 + '@tailwindcss/oxide-linux-arm64-gnu@4.3.0': optional: true - '@smithy/util-waiter@4.5.9': - dependencies: - '@smithy/core': 3.29.4 - tslib: 2.8.1 + '@tailwindcss/oxide-linux-arm64-gnu@4.3.3': optional: true - '@speed-highlight/core@1.2.17': {} - - '@standard-schema/spec@1.1.0': {} - - '@swc/helpers@0.5.15': - dependencies: - tslib: 2.8.1 - - '@tailwindcss/node@4.3.3': - dependencies: - '@jridgewell/remapping': 2.3.5 - enhanced-resolve: 5.24.2 - jiti: 2.7.0 - lightningcss: 1.32.0 - magic-string: 0.30.21 - source-map-js: 1.2.1 - tailwindcss: 4.3.3 - - '@tailwindcss/oxide-android-arm64@4.3.3': + '@tailwindcss/oxide-linux-arm64-musl@4.3.0': optional: true - '@tailwindcss/oxide-darwin-arm64@4.3.3': + '@tailwindcss/oxide-linux-arm64-musl@4.3.3': optional: true - '@tailwindcss/oxide-darwin-x64@4.3.3': + '@tailwindcss/oxide-linux-x64-gnu@4.3.0': optional: true - '@tailwindcss/oxide-freebsd-x64@4.3.3': + '@tailwindcss/oxide-linux-x64-gnu@4.3.3': optional: true - '@tailwindcss/oxide-linux-arm-gnueabihf@4.3.3': + '@tailwindcss/oxide-linux-x64-musl@4.3.0': optional: true - '@tailwindcss/oxide-linux-arm64-gnu@4.3.3': + '@tailwindcss/oxide-linux-x64-musl@4.3.3': optional: true - '@tailwindcss/oxide-linux-arm64-musl@4.3.3': + '@tailwindcss/oxide-wasm32-wasi@4.3.0': optional: true - '@tailwindcss/oxide-linux-x64-gnu@4.3.3': + '@tailwindcss/oxide-wasm32-wasi@4.3.3': optional: true - '@tailwindcss/oxide-linux-x64-musl@4.3.3': + '@tailwindcss/oxide-win32-arm64-msvc@4.3.0': optional: true - '@tailwindcss/oxide-wasm32-wasi@4.3.3': + '@tailwindcss/oxide-win32-arm64-msvc@4.3.3': optional: true - '@tailwindcss/oxide-win32-arm64-msvc@4.3.3': + '@tailwindcss/oxide-win32-x64-msvc@4.3.0': optional: true '@tailwindcss/oxide-win32-x64-msvc@4.3.3': optional: true + '@tailwindcss/oxide@4.3.0': + optionalDependencies: + '@tailwindcss/oxide-android-arm64': 4.3.0 + '@tailwindcss/oxide-darwin-arm64': 4.3.0 + '@tailwindcss/oxide-darwin-x64': 4.3.0 + '@tailwindcss/oxide-freebsd-x64': 4.3.0 + '@tailwindcss/oxide-linux-arm-gnueabihf': 4.3.0 + '@tailwindcss/oxide-linux-arm64-gnu': 4.3.0 + '@tailwindcss/oxide-linux-arm64-musl': 4.3.0 + '@tailwindcss/oxide-linux-x64-gnu': 4.3.0 + '@tailwindcss/oxide-linux-x64-musl': 4.3.0 + '@tailwindcss/oxide-wasm32-wasi': 4.3.0 + '@tailwindcss/oxide-win32-arm64-msvc': 4.3.0 + '@tailwindcss/oxide-win32-x64-msvc': 4.3.0 + '@tailwindcss/oxide@4.3.3': optionalDependencies: '@tailwindcss/oxide-android-arm64': 4.3.3 @@ -9448,14 +9683,398 @@ snapshots: postcss: 8.5.19 tailwindcss: 4.3.3 - '@tsconfig/node18@1.0.3': - optional: true + '@tailwindcss/vite@4.3.0(vite@8.0.16(@types/node@22.19.19)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.16.9)(yaml@2.9.0))': + dependencies: + '@tailwindcss/node': 4.3.0 + '@tailwindcss/oxide': 4.3.0 + tailwindcss: 4.3.0 + vite: 8.0.16(@types/node@22.19.19)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.16.9)(yaml@2.9.0) + + '@tanstack/devtools-client@0.0.6': + dependencies: + '@tanstack/devtools-event-client': 0.4.4 + + '@tanstack/devtools-event-bus@0.4.1': + dependencies: + ws: 8.21.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + '@tanstack/devtools-event-client@0.4.4': {} + + '@tanstack/devtools-ui@0.5.2(csstype@3.2.3)(solid-js@1.9.14)': + dependencies: + clsx: 2.1.1 + dayjs: 1.11.21 + goober: 2.1.19(csstype@3.2.3) + solid-js: 1.9.14 + transitivePeerDependencies: + - csstype + + '@tanstack/devtools-vite@0.7.0(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.2)(vite@8.0.16(@types/node@22.19.19)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.16.9)(yaml@2.9.0))': + dependencies: + '@tanstack/devtools-client': 0.0.6 + '@tanstack/devtools-event-bus': 0.4.1 + chalk: 5.6.2 + launch-editor: 2.14.1 + magic-string: 0.30.21 + oxc-parser: 0.120.0(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.2) + picomatch: 4.0.5 + vite: 8.0.16(@types/node@22.19.19)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.16.9)(yaml@2.9.0) + transitivePeerDependencies: + - '@emnapi/core' + - '@emnapi/runtime' + - bufferutil + - utf-8-validate + + '@tanstack/devtools@0.12.2(csstype@3.2.3)(solid-js@1.9.14)': + dependencies: + '@solid-primitives/event-listener': 2.4.6(solid-js@1.9.14) + '@solid-primitives/keyboard': 1.3.7(solid-js@1.9.14) + '@solid-primitives/resize-observer': 2.2.0(solid-js@1.9.14) + '@tanstack/devtools-client': 0.0.6 + '@tanstack/devtools-event-bus': 0.4.1 + '@tanstack/devtools-ui': 0.5.2(csstype@3.2.3)(solid-js@1.9.14) + clsx: 2.1.1 + goober: 2.1.19(csstype@3.2.3) + solid-js: 1.9.14 + transitivePeerDependencies: + - bufferutil + - csstype + - utf-8-validate + + '@tanstack/eslint-config@0.4.0(@typescript-eslint/utils@8.64.0(eslint@9.39.4(jiti@2.7.0))(typescript@6.0.3))(eslint-import-resolver-node@0.3.10)(eslint@9.39.4(jiti@2.7.0))(typescript@6.0.3)': + dependencies: + '@eslint/js': 10.0.1(eslint@9.39.4(jiti@2.7.0)) + '@stylistic/eslint-plugin': 5.10.0(eslint@9.39.4(jiti@2.7.0)) + eslint: 9.39.4(jiti@2.7.0) + eslint-plugin-import-x: 4.17.1(@typescript-eslint/utils@8.64.0(eslint@9.39.4(jiti@2.7.0))(typescript@6.0.3))(eslint-import-resolver-node@0.3.10)(eslint@9.39.4(jiti@2.7.0)) + eslint-plugin-n: 17.24.0(eslint@9.39.4(jiti@2.7.0))(typescript@6.0.3) + globals: 17.7.0 + typescript-eslint: 8.64.0(eslint@9.39.4(jiti@2.7.0))(typescript@6.0.3) + vue-eslint-parser: 10.4.1(eslint@9.39.4(jiti@2.7.0)) + transitivePeerDependencies: + - '@typescript-eslint/utils' + - eslint-import-resolver-node + - supports-color + - typescript + + '@tanstack/history@1.162.0': {} + + '@tanstack/query-core@5.101.2': {} + + '@tanstack/react-devtools@0.10.5(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(csstype@3.2.3)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(solid-js@1.9.14)': + dependencies: + '@tanstack/devtools': 0.12.2(csstype@3.2.3)(solid-js@1.9.14) + '@types/react': 19.2.16 + '@types/react-dom': 19.2.3(@types/react@19.2.16) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + transitivePeerDependencies: + - bufferutil + - csstype + - solid-js + - utf-8-validate + + '@tanstack/react-query@5.101.2(react@19.2.7)': + dependencies: + '@tanstack/query-core': 5.101.2 + react: 19.2.7 + + '@tanstack/react-router-devtools@1.167.0(@tanstack/react-router@1.170.10(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(@tanstack/router-core@1.171.8)(csstype@3.2.3)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + dependencies: + '@tanstack/react-router': 1.170.10(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@tanstack/router-devtools-core': 1.168.0(@tanstack/router-core@1.171.8)(csstype@3.2.3) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + optionalDependencies: + '@tanstack/router-core': 1.171.8 + transitivePeerDependencies: + - csstype + + '@tanstack/react-router-ssr-query@1.167.1(@tanstack/query-core@5.101.2)(@tanstack/react-query@5.101.2(react@19.2.7))(@tanstack/react-router@1.170.10(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(@tanstack/router-core@1.171.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + dependencies: + '@tanstack/query-core': 5.101.2 + '@tanstack/react-query': 5.101.2(react@19.2.7) + '@tanstack/react-router': 1.170.10(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@tanstack/router-ssr-query-core': 1.169.1(@tanstack/query-core@5.101.2)(@tanstack/router-core@1.171.8) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + transitivePeerDependencies: + - '@tanstack/router-core' + + '@tanstack/react-router@1.170.10(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + dependencies: + '@tanstack/history': 1.162.0 + '@tanstack/react-store': 0.9.3(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@tanstack/router-core': 1.171.8 + isbot: 5.2.1 + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + + '@tanstack/react-start-client@1.168.7(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + dependencies: + '@tanstack/react-router': 1.170.10(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@tanstack/router-core': 1.171.8 + '@tanstack/start-client-core': 1.170.6 + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + + '@tanstack/react-start-rsc@0.1.17(esbuild@0.28.1)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(rolldown@1.1.5)(vite@8.0.16(@types/node@22.19.19)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.16.9)(yaml@2.9.0))': + dependencies: + '@tanstack/react-router': 1.170.10(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@tanstack/react-start-server': 1.167.13(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@tanstack/router-core': 1.171.8 + '@tanstack/router-utils': 1.162.1 + '@tanstack/start-client-core': 1.170.6 + '@tanstack/start-fn-stubs': 1.162.0 + '@tanstack/start-plugin-core': 1.171.10(@tanstack/react-router@1.170.10(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(esbuild@0.28.1)(rolldown@1.1.5)(vite@8.0.16(@types/node@22.19.19)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.16.9)(yaml@2.9.0)) + '@tanstack/start-server-core': 1.169.8 + '@tanstack/start-storage-context': 1.167.10 + pathe: 2.0.3 + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + transitivePeerDependencies: + - '@farmfe/core' + - '@rsbuild/core' + - bun-types-no-globals + - crossws + - esbuild + - rolldown + - rollup + - supports-color + - unloader + - vite + - vite-plugin-solid + - webpack + + '@tanstack/react-start-server@1.167.13(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + dependencies: + '@tanstack/history': 1.162.0 + '@tanstack/react-router': 1.170.10(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@tanstack/router-core': 1.171.8 + '@tanstack/start-client-core': 1.170.6 + '@tanstack/start-server-core': 1.169.8 + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + transitivePeerDependencies: + - crossws + + '@tanstack/react-start@1.168.18(esbuild@0.28.1)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(rolldown@1.1.5)(vite@8.0.16(@types/node@22.19.19)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.16.9)(yaml@2.9.0))': + dependencies: + '@tanstack/react-router': 1.170.10(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@tanstack/react-start-client': 1.168.7(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@tanstack/react-start-rsc': 0.1.17(esbuild@0.28.1)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(rolldown@1.1.5)(vite@8.0.16(@types/node@22.19.19)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.16.9)(yaml@2.9.0)) + '@tanstack/react-start-server': 1.167.13(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@tanstack/router-utils': 1.162.1 + '@tanstack/start-client-core': 1.170.6 + '@tanstack/start-plugin-core': 1.171.10(@tanstack/react-router@1.170.10(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(esbuild@0.28.1)(rolldown@1.1.5)(vite@8.0.16(@types/node@22.19.19)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.16.9)(yaml@2.9.0)) + '@tanstack/start-server-core': 1.169.8 + pathe: 2.0.3 + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + optionalDependencies: + vite: 8.0.16(@types/node@22.19.19)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.16.9)(yaml@2.9.0) + transitivePeerDependencies: + - '@farmfe/core' + - '@rspack/core' + - bun-types-no-globals + - crossws + - esbuild + - react-server-dom-rspack + - rolldown + - rollup + - supports-color + - unloader + - vite-plugin-solid + - webpack + + '@tanstack/react-store@0.9.3(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + dependencies: + '@tanstack/store': 0.9.3 + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + use-sync-external-store: 1.6.0(react@19.2.7) + + '@tanstack/router-core@1.171.8': + dependencies: + '@tanstack/history': 1.162.0 + cookie-es: 3.1.1 + seroval: 1.5.5 + seroval-plugins: 1.5.5(seroval@1.5.5) + + '@tanstack/router-devtools-core@1.168.0(@tanstack/router-core@1.171.8)(csstype@3.2.3)': + dependencies: + '@tanstack/router-core': 1.171.8 + clsx: 2.1.1 + goober: 2.1.19(csstype@3.2.3) + optionalDependencies: + csstype: 3.2.3 + + '@tanstack/router-generator@1.167.12': + dependencies: + '@babel/types': 7.29.7 + '@tanstack/router-core': 1.171.8 + '@tanstack/router-utils': 1.162.1 + '@tanstack/virtual-file-routes': 1.162.0 + jiti: 2.7.0 + magic-string: 0.30.21 + prettier: 3.8.3 + zod: 4.4.3 + transitivePeerDependencies: + - supports-color + + '@tanstack/router-plugin@1.168.13(@tanstack/react-router@1.170.10(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(esbuild@0.28.1)(rolldown@1.1.5)(vite@8.0.16(@types/node@22.19.19)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.16.9)(yaml@2.9.0))': + dependencies: + '@babel/core': 7.29.7 + '@babel/plugin-syntax-jsx': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-syntax-typescript': 7.29.7(@babel/core@7.29.7) + '@babel/template': 7.29.7 + '@babel/traverse': 7.29.7 + '@babel/types': 7.29.7 + '@tanstack/router-core': 1.171.8 + '@tanstack/router-generator': 1.167.12 + '@tanstack/router-utils': 1.162.1 + '@tanstack/virtual-file-routes': 1.162.0 + chokidar: 5.0.0 + unplugin: 3.3.0(esbuild@0.28.1)(rolldown@1.1.5)(vite@8.0.16(@types/node@22.19.19)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.16.9)(yaml@2.9.0)) + zod: 4.4.3 + optionalDependencies: + '@tanstack/react-router': 1.170.10(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + vite: 8.0.16(@types/node@22.19.19)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.16.9)(yaml@2.9.0) + transitivePeerDependencies: + - '@farmfe/core' + - '@rspack/core' + - bun-types-no-globals + - esbuild + - rolldown + - rollup + - supports-color + - unloader + + '@tanstack/router-ssr-query-core@1.169.1(@tanstack/query-core@5.101.2)(@tanstack/router-core@1.171.8)': + dependencies: + '@tanstack/query-core': 5.101.2 + '@tanstack/router-core': 1.171.8 + + '@tanstack/router-utils@1.162.1': + dependencies: + '@babel/core': 7.29.7 + '@babel/generator': 7.29.7 + '@babel/parser': 7.29.7 + '@babel/types': 7.29.7 + ansis: 4.3.1 + babel-dead-code-elimination: 1.0.12 + diff: 8.0.4 + pathe: 2.0.3 + tinyglobby: 0.2.17 + transitivePeerDependencies: + - supports-color + + '@tanstack/start-client-core@1.170.6': + dependencies: + '@tanstack/router-core': 1.171.8 + '@tanstack/start-fn-stubs': 1.162.0 + '@tanstack/start-storage-context': 1.167.10 + seroval: 1.5.5 + + '@tanstack/start-fn-stubs@1.162.0': {} + + '@tanstack/start-plugin-core@1.171.10(@tanstack/react-router@1.170.10(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(esbuild@0.28.1)(rolldown@1.1.5)(vite@8.0.16(@types/node@22.19.19)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.16.9)(yaml@2.9.0))': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/core': 7.29.7 + '@babel/types': 7.29.7 + '@rolldown/pluginutils': 1.0.1 + '@tanstack/router-core': 1.171.8 + '@tanstack/router-generator': 1.167.12 + '@tanstack/router-plugin': 1.168.13(@tanstack/react-router@1.170.10(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(esbuild@0.28.1)(rolldown@1.1.5)(vite@8.0.16(@types/node@22.19.19)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.16.9)(yaml@2.9.0)) + '@tanstack/router-utils': 1.162.1 + '@tanstack/start-client-core': 1.170.6 + '@tanstack/start-server-core': 1.169.8 + exsolve: 1.1.0 + lightningcss: 1.32.0 + pathe: 2.0.3 + picomatch: 4.0.5 + seroval: 1.5.5 + source-map: 0.7.6 + srvx: 0.11.22 + tinyglobby: 0.2.17 + ufo: 1.6.4 + vitefu: 1.1.3(vite@8.0.16(@types/node@22.19.19)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.16.9)(yaml@2.9.0)) + xmlbuilder2: 4.0.3 + zod: 4.4.3 + optionalDependencies: + vite: 8.0.16(@types/node@22.19.19)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.16.9)(yaml@2.9.0) + transitivePeerDependencies: + - '@farmfe/core' + - '@rspack/core' + - '@tanstack/react-router' + - bun-types-no-globals + - crossws + - esbuild + - rolldown + - rollup + - supports-color + - unloader + - vite-plugin-solid + - webpack + + '@tanstack/start-server-core@1.169.8': + dependencies: + '@tanstack/history': 1.162.0 + '@tanstack/router-core': 1.171.8 + '@tanstack/start-client-core': 1.170.6 + '@tanstack/start-storage-context': 1.167.10 + fetchdts: 0.1.7 + h3-v2: h3@2.0.1-rc.20 + seroval: 1.5.5 + transitivePeerDependencies: + - crossws + + '@tanstack/start-storage-context@1.167.10': + dependencies: + '@tanstack/router-core': 1.171.8 + + '@tanstack/store@0.9.3': {} + + '@tanstack/virtual-file-routes@1.162.0': {} + + '@testing-library/dom@10.4.1': + dependencies: + '@babel/code-frame': 7.29.7 + '@babel/runtime': 7.29.7 + '@types/aria-query': 5.0.4 + aria-query: 5.3.0 + dom-accessibility-api: 0.5.16 + lz-string: 1.5.0 + picocolors: 1.1.1 + pretty-format: 27.5.1 + + '@testing-library/react@16.3.2(@testing-library/dom@10.4.1)(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + dependencies: + '@babel/runtime': 7.29.7 + '@testing-library/dom': 10.4.1 + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + optionalDependencies: + '@types/react': 19.2.16 + '@types/react-dom': 19.2.3(@types/react@19.2.16) + + '@ts-morph/common@0.27.0': + dependencies: + fast-glob: 3.3.3 + minimatch: 10.2.5 + path-browserify: 1.0.1 '@tybys/wasm-util@0.10.3': dependencies: tslib: 2.8.1 optional: true + '@types/aria-query@5.0.4': {} + '@types/aws-lambda@8.10.162': {} '@types/chai@5.2.3': @@ -9491,37 +10110,62 @@ snapshots: '@types/ms@2.1.0': {} - '@types/node-fetch@2.6.13': + '@types/node@22.19.19': dependencies: - '@types/node': 26.1.1 - form-data: 4.0.6 - optional: true - - '@types/node@18.19.130': - dependencies: - undici-types: 5.26.5 - optional: true + undici-types: 6.21.0 '@types/node@26.1.1': dependencies: undici-types: 8.3.0 + '@types/react-dom@19.2.3(@types/react@19.2.16)': + dependencies: + '@types/react': 19.2.16 + '@types/react-dom@19.2.3(@types/react@19.2.17)': dependencies: '@types/react': 19.2.17 + '@types/react@19.2.16': + dependencies: + csstype: 3.2.3 + '@types/react@19.2.17': dependencies: csstype: 3.2.3 + '@types/set-cookie-parser@2.4.10': + dependencies: + '@types/node': 26.1.1 + + '@types/statuses@2.0.6': {} + '@types/unist@2.0.11': {} '@types/unist@3.0.3': {} + '@types/validate-npm-package-name@4.0.2': {} + '@types/ws@8.18.1': dependencies: '@types/node': 26.1.1 + '@typescript-eslint/eslint-plugin@8.64.0(@typescript-eslint/parser@8.64.0(eslint@9.39.4(jiti@2.7.0))(typescript@6.0.3))(eslint@9.39.4(jiti@2.7.0))(typescript@6.0.3)': + dependencies: + '@eslint-community/regexpp': 4.12.2 + '@typescript-eslint/parser': 8.64.0(eslint@9.39.4(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/scope-manager': 8.64.0 + '@typescript-eslint/type-utils': 8.64.0(eslint@9.39.4(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/utils': 8.64.0(eslint@9.39.4(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/visitor-keys': 8.64.0 + eslint: 9.39.4(jiti@2.7.0) + ignore: 7.0.6 + natural-compare: 1.4.0 + ts-api-utils: 2.5.0(typescript@6.0.3) + typescript: 6.0.3 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/eslint-plugin@8.64.0(@typescript-eslint/parser@8.64.0(eslint@9.39.5(jiti@2.7.0))(typescript@6.0.3))(eslint@9.39.5(jiti@2.7.0))(typescript@6.0.3)': dependencies: '@eslint-community/regexpp': 4.12.2 @@ -9538,6 +10182,18 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/parser@8.64.0(eslint@9.39.4(jiti@2.7.0))(typescript@6.0.3)': + dependencies: + '@typescript-eslint/scope-manager': 8.64.0 + '@typescript-eslint/types': 8.64.0 + '@typescript-eslint/typescript-estree': 8.64.0(typescript@6.0.3) + '@typescript-eslint/visitor-keys': 8.64.0 + debug: 4.4.3 + eslint: 9.39.4(jiti@2.7.0) + typescript: 6.0.3 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/parser@8.64.0(eslint@9.39.5(jiti@2.7.0))(typescript@6.0.3)': dependencies: '@typescript-eslint/scope-manager': 8.64.0 @@ -9568,6 +10224,18 @@ snapshots: dependencies: typescript: 6.0.3 + '@typescript-eslint/type-utils@8.64.0(eslint@9.39.4(jiti@2.7.0))(typescript@6.0.3)': + dependencies: + '@typescript-eslint/types': 8.64.0 + '@typescript-eslint/typescript-estree': 8.64.0(typescript@6.0.3) + '@typescript-eslint/utils': 8.64.0(eslint@9.39.4(jiti@2.7.0))(typescript@6.0.3) + debug: 4.4.3 + eslint: 9.39.4(jiti@2.7.0) + ts-api-utils: 2.5.0(typescript@6.0.3) + typescript: 6.0.3 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/type-utils@8.64.0(eslint@9.39.5(jiti@2.7.0))(typescript@6.0.3)': dependencies: '@typescript-eslint/types': 8.64.0 @@ -9597,6 +10265,17 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/utils@8.64.0(eslint@9.39.4(jiti@2.7.0))(typescript@6.0.3)': + dependencies: + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.4(jiti@2.7.0)) + '@typescript-eslint/scope-manager': 8.64.0 + '@typescript-eslint/types': 8.64.0 + '@typescript-eslint/typescript-estree': 8.64.0(typescript@6.0.3) + eslint: 9.39.4(jiti@2.7.0) + typescript: 6.0.3 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/utils@8.64.0(eslint@9.39.5(jiti@2.7.0))(typescript@6.0.3)': dependencies: '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.5(jiti@2.7.0)) @@ -9685,6 +10364,11 @@ snapshots: '@unrs/resolver-binding-win32-x64-msvc@1.12.2': optional: true + '@vitejs/plugin-react@6.0.2(vite@8.0.16(@types/node@22.19.19)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.16.9)(yaml@2.9.0))': + dependencies: + '@rolldown/pluginutils': 1.0.1 + vite: 8.0.16(@types/node@22.19.19)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.16.9)(yaml@2.9.0) + '@vitest/expect@4.1.10': dependencies: '@standard-schema/spec': 1.1.0 @@ -9694,21 +10378,49 @@ snapshots: chai: 6.2.2 tinyrainbow: 3.1.0 - '@vitest/mocker@4.1.10(vite@8.1.5(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.16.9)(yaml@2.9.0))': + '@vitest/expect@4.1.8': + dependencies: + '@standard-schema/spec': 1.1.0 + '@types/chai': 5.2.3 + '@vitest/spy': 4.1.8 + '@vitest/utils': 4.1.8 + chai: 6.2.2 + tinyrainbow: 3.1.0 + + '@vitest/mocker@4.1.10(msw@2.15.0(@types/node@26.1.1)(typescript@6.0.3))(vite@8.1.5(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.16.9)(yaml@2.9.0))': dependencies: '@vitest/spy': 4.1.10 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: + msw: 2.15.0(@types/node@26.1.1)(typescript@6.0.3) vite: 8.1.5(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.16.9)(yaml@2.9.0) + '@vitest/mocker@4.1.8(msw@2.15.0(@types/node@22.19.19)(typescript@6.0.3))(vite@8.0.16(@types/node@22.19.19)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.16.9)(yaml@2.9.0))': + dependencies: + '@vitest/spy': 4.1.8 + estree-walker: 3.0.3 + magic-string: 0.30.21 + optionalDependencies: + msw: 2.15.0(@types/node@22.19.19)(typescript@6.0.3) + vite: 8.0.16(@types/node@22.19.19)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.16.9)(yaml@2.9.0) + '@vitest/pretty-format@4.1.10': dependencies: tinyrainbow: 3.1.0 + '@vitest/pretty-format@4.1.8': + dependencies: + tinyrainbow: 3.1.0 + '@vitest/runner@4.1.10': dependencies: - '@vitest/utils': 4.1.10 + '@vitest/utils': 4.1.10 + pathe: 2.0.3 + + '@vitest/runner@4.1.8': + dependencies: + '@vitest/utils': 4.1.8 pathe: 2.0.3 '@vitest/snapshot@4.1.10': @@ -9718,14 +10430,29 @@ snapshots: magic-string: 0.30.21 pathe: 2.0.3 + '@vitest/snapshot@4.1.8': + dependencies: + '@vitest/pretty-format': 4.1.8 + '@vitest/utils': 4.1.8 + magic-string: 0.30.21 + pathe: 2.0.3 + '@vitest/spy@4.1.10': {} + '@vitest/spy@4.1.8': {} + '@vitest/utils@4.1.10': dependencies: '@vitest/pretty-format': 4.1.10 convert-source-map: 2.0.0 tinyrainbow: 3.1.0 + '@vitest/utils@4.1.8': + dependencies: + '@vitest/pretty-format': 4.1.8 + convert-source-map: 2.0.0 + tinyrainbow: 3.1.0 + '@yuku-analyzer/binding-darwin-arm64@0.6.4': optional: true @@ -9761,16 +10488,10 @@ snapshots: '@yuku-toolchain/types@0.5.43': {} - abort-controller@3.0.0: - dependencies: - event-target-shim: 5.0.1 - optional: true - accepts@2.0.0: dependencies: mime-types: 3.0.2 negotiator: 1.0.0 - optional: true acorn-jsx@5.3.2(acorn@8.17.0): dependencies: @@ -9778,13 +10499,15 @@ snapshots: acorn@8.17.0: {} - adm-zip@0.5.18: - optional: true + agent-base@7.1.4: {} - agentkeepalive@4.6.0: - dependencies: - humanize-ms: 1.2.1 - optional: true + ajv-formats@2.1.1(ajv@8.20.0): + optionalDependencies: + ajv: 8.20.0 + + ajv-formats@3.0.1(ajv@8.20.0): + optionalDependencies: + ajv: 8.20.0 ajv@6.15.0: dependencies: @@ -9793,78 +10516,14 @@ snapshots: json-schema-traverse: 0.4.1 uri-js: 4.4.1 - alchemy@0.93.12(@aws-sdk/client-dynamodb@3.984.0)(@aws-sdk/client-lambda@3.984.0)(@aws-sdk/client-s3@3.984.0)(@aws-sdk/client-sqs@3.984.0)(@opennextjs/cloudflare@1.20.1(next@16.2.10(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(rclone.js@0.6.6)(wrangler@4.112.0(@cloudflare/workers-types@5.20260717.1)))(mysql2@3.23.0(@types/node@26.1.1))(pg@8.22.0)(vite@8.1.5(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.16.9)(yaml@2.9.0))(workerd@1.20260714.1): + ajv@8.20.0: dependencies: - '@aws-sdk/credential-providers': 3.1081.0 - '@cloudflare/unenv-preset': 2.7.7(unenv@2.0.0-rc.21)(workerd@1.20260714.1) - '@cloudflare/workers-types': 5.20260717.1 - '@iarna/toml': 2.2.5 - '@octokit/rest': 21.1.1 - '@smithy/node-config-provider': 4.5.7 - '@smithy/types': 4.16.0 - aws4fetch: 1.0.20 - drizzle-orm: 0.45.2(@cloudflare/workers-types@5.20260717.1)(mysql2@3.23.0(@types/node@26.1.1))(pg@8.22.0) - env-paths: 3.0.0 - esbuild: 0.25.12 - execa: 9.6.1 - fast-json-patch: 3.1.1 - fast-xml-parser: 5.9.3 - find-process: 2.1.1 - glob: 10.5.0 - jszip: 3.10.1 - libsodium-wrappers: 0.8.4 - miniflare: 4.20260424.0 - neverthrow: 8.2.0 - open: 10.2.0 - openapi-types: 12.1.3 - pathe: 2.0.3 - picocolors: 1.1.1 - proper-lockfile: 4.1.2 - signal-exit: 4.1.0 - unenv: 2.0.0-rc.21 - wrangler: 4.107.1(@cloudflare/workers-types@5.20260717.1) - ws: 8.21.0 - yaml: 2.9.0 - optionalDependencies: - '@aws-sdk/client-dynamodb': 3.984.0 - '@aws-sdk/client-lambda': 3.984.0 - '@aws-sdk/client-s3': 3.984.0 - '@aws-sdk/client-sqs': 3.984.0 - '@opennextjs/cloudflare': 1.20.1(next@16.2.10(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(rclone.js@0.6.6)(wrangler@4.112.0(@cloudflare/workers-types@5.20260717.1)) - vite: 8.1.5(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.16.9)(yaml@2.9.0) - transitivePeerDependencies: - - '@aws-sdk/client-rds-data' - - '@electric-sql/pglite' - - '@libsql/client-wasm' - - '@neondatabase/serverless' - - '@op-engineering/op-sqlite' - - '@opentelemetry/api' - - '@planetscale/database' - - '@prisma/client' - - '@tidbcloud/serverless' - - '@types/better-sqlite3' - - '@types/pg' - - '@types/sql.js' - - '@upstash/redis' - - '@vercel/postgres' - - '@xata.io/client' - - better-sqlite3 - - bufferutil - - bun-types - - expo-sqlite - - gel - - knex - - kysely - - mysql2 - - pg - - postgres - - prisma - - sql.js - - sqlite3 - - utf-8-validate - - workerd + fast-deep-equal: 3.1.3 + fast-uri: 3.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 - alchemy@2.0.0-beta.63(@effect/platform-bun@4.0.0-beta.98(effect@4.0.0-beta.98))(@effect/platform-node@4.0.0-beta.98(effect@4.0.0-beta.98)(ioredis@5.11.1))(@types/node@26.1.1)(@types/react@19.2.17)(effect@4.0.0-beta.98)(vite@8.1.5(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.16.9)(yaml@2.9.0))(vitest@4.1.10(@types/node@26.1.1)(vite@8.1.5(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.16.9)(yaml@2.9.0)))(workerd@1.20260714.1)(ws@8.21.0): + alchemy@2.0.0-beta.63(@effect/platform-bun@4.0.0-beta.98(effect@4.0.0-beta.98))(@effect/platform-node@4.0.0-beta.98(effect@4.0.0-beta.98)(ioredis@5.11.1))(@types/node@26.1.1)(@types/react@19.2.17)(effect@4.0.0-beta.98)(vite@8.1.5(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.16.9)(yaml@2.9.0))(vitest@4.1.10(@types/node@26.1.1)(jsdom@28.1.0(@noble/hashes@1.8.0))(msw@2.15.0(@types/node@26.1.1)(typescript@6.0.3))(vite@8.1.5(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.16.9)(yaml@2.9.0)))(workerd@1.20260714.1)(ws@8.21.0): dependencies: '@alchemy.run/node-utils': 0.0.5 '@aws-sdk/credential-providers': 3.1081.0 @@ -9878,7 +10537,7 @@ snapshots: '@distilled.cloud/core': 0.29.1(effect@4.0.0-beta.98) '@distilled.cloud/neon': 0.29.1(effect@4.0.0-beta.98) '@distilled.cloud/planetscale': 0.29.1(effect@4.0.0-beta.98) - '@effect/vitest': 4.0.0-beta.98(effect@4.0.0-beta.98)(vitest@4.1.10(@types/node@26.1.1)(vite@8.1.5(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.16.9)(yaml@2.9.0))) + '@effect/vitest': 4.0.0-beta.98(effect@4.0.0-beta.98)(vitest@4.1.10(@types/node@26.1.1)(jsdom@28.1.0(@noble/hashes@1.8.0))(msw@2.15.0(@types/node@26.1.1)(typescript@6.0.3))(vite@8.1.5(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.16.9)(yaml@2.9.0))) '@libsql/client': 0.17.4 '@octokit/rest': 22.0.1 '@octokit/webhooks': 14.2.0 @@ -9918,8 +10577,7 @@ snapshots: - vitest - workerd - ansi-colors@4.1.3: - optional: true + ansi-colors@4.1.3: {} ansi-escapes@7.3.0: dependencies: @@ -9933,8 +10591,12 @@ snapshots: dependencies: color-convert: 2.0.1 + ansi-styles@5.2.0: {} + ansi-styles@6.2.3: {} + ansis@4.3.1: {} + anynum@1.0.1: {} argparse@2.0.1: {} @@ -9943,6 +10605,10 @@ snapshots: dependencies: tslib: 2.8.1 + aria-query@5.3.0: + dependencies: + dequal: 2.0.3 + aria-query@5.3.2: {} array-buffer-byte-length@1.0.2: @@ -9961,9 +10627,6 @@ snapshots: is-string: 1.1.1 math-intrinsics: 1.1.0 - array-timsort@1.0.3: - optional: true - array.prototype.findlast@1.2.5: dependencies: call-bind: 1.0.9 @@ -10019,12 +10682,15 @@ snapshots: ast-types-flow@0.0.8: {} + ast-types@0.16.1: + dependencies: + tslib: 2.8.1 + astring@1.9.0: {} async-function@1.0.0: {} - asynckit@0.4.0: - optional: true + atomically@1.7.0: {} auto-bind@5.0.1: {} @@ -10040,6 +10706,15 @@ snapshots: axobject-query@4.1.0: {} + babel-dead-code-elimination@1.0.12: + dependencies: + '@babel/core': 7.29.7 + '@babel/parser': 7.29.7 + '@babel/traverse': 7.29.7 + '@babel/types': 7.29.7 + transitivePeerDependencies: + - supports-color + bail@2.0.2: {} balanced-match@1.0.2: {} @@ -10048,10 +10723,12 @@ snapshots: baseline-browser-mapping@2.10.43: {} - before-after-hook@3.0.2: {} - before-after-hook@4.0.0: {} + bidi-js@1.0.3: + dependencies: + require-from-string: 2.0.2 + blake3-wasm@2.1.5: {} body-parser@2.3.0: @@ -10067,7 +10744,6 @@ snapshots: type-is: 2.1.0 transitivePeerDependencies: - supports-color - optional: true bowser@2.14.1: {} @@ -10076,10 +10752,6 @@ snapshots: balanced-match: 1.0.2 concat-map: 0.0.1 - brace-expansion@2.1.2: - dependencies: - balanced-match: 1.0.2 - brace-expansion@5.0.7: dependencies: balanced-match: 4.0.4 @@ -10103,8 +10775,7 @@ snapshots: dependencies: run-applescript: 7.1.0 - bytes@3.1.2: - optional: true + bytes@3.1.2: {} call-bind-apply-helpers@1.0.2: dependencies: @@ -10152,9 +10823,6 @@ snapshots: dependencies: readdirp: 5.0.0 - ci-info@4.4.0: - optional: true - class-variance-authority@0.7.1: dependencies: clsx: 2.1.1 @@ -10165,32 +10833,26 @@ snapshots: dependencies: restore-cursor: 4.0.0 + cli-cursor@5.0.0: + dependencies: + restore-cursor: 5.1.0 + + cli-spinners@2.9.2: {} + cli-truncate@5.2.0: dependencies: slice-ansi: 8.0.0 string-width: 8.2.2 - client-only@0.0.1: {} + cli-width@4.1.0: {} - cliui@9.0.1: - dependencies: - string-width: 7.2.0 - strip-ansi: 7.2.0 - wrap-ansi: 9.0.2 - optional: true + client-only@0.0.1: {} - cloudflare@4.5.0: + cliui@8.0.1: dependencies: - '@types/node': 18.19.130 - '@types/node-fetch': 2.6.13 - abort-controller: 3.0.0 - agentkeepalive: 4.6.0 - form-data-encoder: 1.7.2 - formdata-node: 4.4.1 - node-fetch: 2.7.0 - transitivePeerDependencies: - - encoding - optional: true + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 clsx@2.1.1: {} @@ -10198,6 +10860,8 @@ snapshots: cnfast@0.0.8: {} + code-block-writer@13.0.3: {} + code-excerpt@4.0.0: dependencies: convert-to-spaces: 2.0.1 @@ -10210,36 +10874,37 @@ snapshots: color-name@1.1.4: {} - combined-stream@1.0.8: - dependencies: - delayed-stream: 1.0.0 - optional: true - comma-separated-tokens@2.0.3: {} - commander@11.1.0: - optional: true + commander@11.1.0: {} commander@14.0.3: {} commander@2.20.3: optional: true - comment-json@4.6.2: - dependencies: - array-timsort: 1.0.3 - esprima: 4.0.1 - optional: true + comment-parser@1.4.7: {} compute-scroll-into-view@3.1.1: {} concat-map@0.0.1: {} - content-disposition@1.1.0: - optional: true + conf@10.2.0: + dependencies: + ajv: 8.20.0 + ajv-formats: 2.1.1(ajv@8.20.0) + atomically: 1.7.0 + debounce-fn: 4.0.0 + dot-prop: 6.0.1 + env-paths: 2.2.1 + json-schema-typed: 7.0.3 + onetime: 5.1.2 + pkg-up: 3.1.0 + semver: 7.8.5 - content-type@1.0.5: - optional: true + content-disposition@1.1.0: {} + + content-type@1.0.5: {} content-type@2.0.0: {} @@ -10247,26 +10912,63 @@ snapshots: convert-to-spaces@2.0.1: {} - cookie-signature@1.2.2: - optional: true + cookie-es@3.1.1: {} - cookie@0.7.2: - optional: true + cookie-signature@1.2.2: {} + + cookie@0.7.2: {} cookie@1.1.1: {} core-util-is@1.0.3: {} + cors@2.8.6: + dependencies: + object-assign: 4.1.1 + vary: 1.1.2 + + cosmiconfig@9.0.2(typescript@6.0.3): + dependencies: + env-paths: 2.2.1 + import-fresh: 3.3.1 + js-yaml: 4.3.0 + parse-json: 5.2.0 + optionalDependencies: + typescript: 6.0.3 + cross-spawn@7.0.6: dependencies: path-key: 3.1.1 shebang-command: 2.0.0 which: 2.0.2 + css-tree@3.2.1: + dependencies: + mdn-data: 2.27.1 + source-map-js: 1.2.1 + + cssesc@3.0.0: {} + + cssstyle@6.2.0: + dependencies: + '@asamuzakjp/css-color': 5.1.11 + '@csstools/css-syntax-patches-for-csstree': 1.1.6(css-tree@3.2.1) + css-tree: 3.2.1 + lru-cache: 11.5.2 + csstype@3.2.3: {} damerau-levenshtein@1.0.8: {} + data-uri-to-buffer@4.0.1: {} + + data-urls@7.0.0(@noble/hashes@1.8.0): + dependencies: + whatwg-mimetype: 5.0.0 + whatwg-url: 16.0.1(@noble/hashes@1.8.0) + transitivePeerDependencies: + - '@noble/hashes' + data-view-buffer@1.0.2: dependencies: call-bound: 1.0.4 @@ -10285,6 +10987,12 @@ snapshots: es-errors: 1.3.0 is-data-view: 1.0.2 + dayjs@1.11.21: {} + + debounce-fn@4.0.0: + dependencies: + mimic-fn: 3.1.0 + debug@3.2.7: dependencies: ms: 2.1.3 @@ -10293,12 +11001,18 @@ snapshots: dependencies: ms: 2.1.3 + decimal.js@10.6.0: {} + decode-named-character-reference@1.3.0: dependencies: character-entities: 2.0.2 + dedent@1.7.2: {} + deep-is@0.1.4: {} + deepmerge@4.3.1: {} + default-browser-id@5.0.1: {} default-browser@5.5.0: @@ -10312,6 +11026,8 @@ snapshots: es-errors: 1.3.0 gopd: 1.2.0 + define-lazy-prop@2.0.0: {} + define-lazy-prop@3.0.0: {} define-properties@1.2.1: @@ -10320,15 +11036,9 @@ snapshots: has-property-descriptors: 1.0.2 object-keys: 1.1.1 - defu@6.1.7: {} - - delayed-stream@1.0.0: - optional: true - denque@2.1.0: {} - depd@2.0.0: - optional: true + depd@2.0.0: {} dequal@2.0.3: {} @@ -10342,18 +11052,19 @@ snapshots: dependencies: dequal: 2.0.3 + diff@8.0.4: {} + doctrine@2.1.0: dependencies: esutils: 2.0.3 - dotenv@16.6.1: - optional: true + dom-accessibility-api@0.5.16: {} - drizzle-orm@0.45.2(@cloudflare/workers-types@5.20260717.1)(mysql2@3.23.0(@types/node@26.1.1))(pg@8.22.0): - optionalDependencies: - '@cloudflare/workers-types': 5.20260717.1 - mysql2: 3.23.0(@types/node@26.1.1) - pg: 8.22.0 + dot-prop@6.0.1: + dependencies: + is-obj: 2.0.0 + + dotenv@17.4.2: {} dunder-proto@1.0.1: dependencies: @@ -10361,21 +11072,7 @@ snapshots: es-errors: 1.3.0 gopd: 1.2.0 - duplexer@0.1.2: - optional: true - - eastasianwidth@0.2.0: {} - - eciesjs@0.4.18: - dependencies: - '@ecies/ciphers': 0.2.6(@noble/ciphers@1.3.0) - '@noble/ciphers': 1.3.0 - '@noble/curves': 1.9.7 - '@noble/hashes': 1.8.0 - optional: true - - ee-first@1.1.1: - optional: true + ee-first@1.1.1: {} effect@4.0.0-beta.98: dependencies: @@ -10398,8 +11095,7 @@ snapshots: emoji-regex@9.2.2: {} - encodeurl@2.0.0: - optional: true + encodeurl@2.0.0: {} enhanced-resolve@5.24.2: dependencies: @@ -10410,14 +11106,19 @@ snapshots: dependencies: ansi-colors: 4.1.3 strip-ansi: 6.0.1 - optional: true entities@6.0.1: {} - env-paths@3.0.0: {} + entities@8.0.0: {} + + env-paths@2.2.1: {} environment@1.1.0: {} + error-ex@1.3.4: + dependencies: + is-arrayish: 0.2.1 + error-stack-parser-es@1.0.5: {} es-abstract-get@1.0.0: @@ -10549,64 +11250,6 @@ snapshots: esast-util-from-estree: 2.0.0 vfile-message: 4.0.3 - esbuild@0.25.12: - optionalDependencies: - '@esbuild/aix-ppc64': 0.25.12 - '@esbuild/android-arm': 0.25.12 - '@esbuild/android-arm64': 0.25.12 - '@esbuild/android-x64': 0.25.12 - '@esbuild/darwin-arm64': 0.25.12 - '@esbuild/darwin-x64': 0.25.12 - '@esbuild/freebsd-arm64': 0.25.12 - '@esbuild/freebsd-x64': 0.25.12 - '@esbuild/linux-arm': 0.25.12 - '@esbuild/linux-arm64': 0.25.12 - '@esbuild/linux-ia32': 0.25.12 - '@esbuild/linux-loong64': 0.25.12 - '@esbuild/linux-mips64el': 0.25.12 - '@esbuild/linux-ppc64': 0.25.12 - '@esbuild/linux-riscv64': 0.25.12 - '@esbuild/linux-s390x': 0.25.12 - '@esbuild/linux-x64': 0.25.12 - '@esbuild/netbsd-arm64': 0.25.12 - '@esbuild/netbsd-x64': 0.25.12 - '@esbuild/openbsd-arm64': 0.25.12 - '@esbuild/openbsd-x64': 0.25.12 - '@esbuild/openharmony-arm64': 0.25.12 - '@esbuild/sunos-x64': 0.25.12 - '@esbuild/win32-arm64': 0.25.12 - '@esbuild/win32-ia32': 0.25.12 - '@esbuild/win32-x64': 0.25.12 - - esbuild@0.25.4: - optionalDependencies: - '@esbuild/aix-ppc64': 0.25.4 - '@esbuild/android-arm': 0.25.4 - '@esbuild/android-arm64': 0.25.4 - '@esbuild/android-x64': 0.25.4 - '@esbuild/darwin-arm64': 0.25.4 - '@esbuild/darwin-x64': 0.25.4 - '@esbuild/freebsd-arm64': 0.25.4 - '@esbuild/freebsd-x64': 0.25.4 - '@esbuild/linux-arm': 0.25.4 - '@esbuild/linux-arm64': 0.25.4 - '@esbuild/linux-ia32': 0.25.4 - '@esbuild/linux-loong64': 0.25.4 - '@esbuild/linux-mips64el': 0.25.4 - '@esbuild/linux-ppc64': 0.25.4 - '@esbuild/linux-riscv64': 0.25.4 - '@esbuild/linux-s390x': 0.25.4 - '@esbuild/linux-x64': 0.25.4 - '@esbuild/netbsd-arm64': 0.25.4 - '@esbuild/netbsd-x64': 0.25.4 - '@esbuild/openbsd-arm64': 0.25.4 - '@esbuild/openbsd-x64': 0.25.4 - '@esbuild/sunos-x64': 0.25.4 - '@esbuild/win32-arm64': 0.25.4 - '@esbuild/win32-ia32': 0.25.4 - '@esbuild/win32-x64': 0.25.4 - optional: true - esbuild@0.28.1: optionalDependencies: '@esbuild/aix-ppc64': 0.28.1 @@ -10638,8 +11281,7 @@ snapshots: escalade@3.2.0: {} - escape-html@1.0.3: - optional: true + escape-html@1.0.3: {} escape-string-regexp@2.0.0: {} @@ -10647,12 +11289,17 @@ snapshots: escape-string-regexp@5.0.0: {} - eslint-config-next@16.2.10(@typescript-eslint/parser@8.64.0(eslint@9.39.5(jiti@2.7.0))(typescript@6.0.3))(eslint@9.39.5(jiti@2.7.0))(typescript@6.0.3): + eslint-compat-utils@0.5.1(eslint@9.39.4(jiti@2.7.0)): + dependencies: + eslint: 9.39.4(jiti@2.7.0) + semver: 7.8.5 + + eslint-config-next@16.2.10(@typescript-eslint/parser@8.64.0(eslint@9.39.5(jiti@2.7.0))(typescript@6.0.3))(eslint-plugin-import-x@4.17.1(@typescript-eslint/utils@8.64.0(eslint@9.39.5(jiti@2.7.0))(typescript@6.0.3))(eslint-import-resolver-node@0.3.10)(eslint@9.39.5(jiti@2.7.0)))(eslint@9.39.5(jiti@2.7.0))(typescript@6.0.3): dependencies: '@next/eslint-plugin-next': 16.2.10 eslint: 9.39.5(jiti@2.7.0) eslint-import-resolver-node: 0.3.10 - eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.64.0(eslint@9.39.5(jiti@2.7.0))(typescript@6.0.3))(eslint@9.39.5(jiti@2.7.0)))(eslint@9.39.5(jiti@2.7.0)) + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import-x@4.17.1(@typescript-eslint/utils@8.64.0(eslint@9.39.5(jiti@2.7.0))(typescript@6.0.3))(eslint-import-resolver-node@0.3.10)(eslint@9.39.5(jiti@2.7.0)))(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.64.0(eslint@9.39.5(jiti@2.7.0))(typescript@6.0.3))(eslint@9.39.5(jiti@2.7.0)))(eslint@9.39.5(jiti@2.7.0)) eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.64.0(eslint@9.39.5(jiti@2.7.0))(typescript@6.0.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.5(jiti@2.7.0)) eslint-plugin-jsx-a11y: 6.10.2(eslint@9.39.5(jiti@2.7.0)) eslint-plugin-react: 7.37.5(eslint@9.39.5(jiti@2.7.0)) @@ -10667,6 +11314,13 @@ snapshots: - eslint-plugin-import-x - supports-color + eslint-import-context@0.1.9(unrs-resolver@1.12.2): + dependencies: + get-tsconfig: 4.14.0 + stable-hash-x: 0.2.0 + optionalDependencies: + unrs-resolver: 1.12.2 + eslint-import-resolver-node@0.3.10: dependencies: debug: 3.2.7 @@ -10675,7 +11329,7 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.64.0(eslint@9.39.5(jiti@2.7.0))(typescript@6.0.3))(eslint@9.39.5(jiti@2.7.0)))(eslint@9.39.5(jiti@2.7.0)): + eslint-import-resolver-typescript@3.10.1(eslint-plugin-import-x@4.17.1(@typescript-eslint/utils@8.64.0(eslint@9.39.5(jiti@2.7.0))(typescript@6.0.3))(eslint-import-resolver-node@0.3.10)(eslint@9.39.5(jiti@2.7.0)))(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.64.0(eslint@9.39.5(jiti@2.7.0))(typescript@6.0.3))(eslint@9.39.5(jiti@2.7.0)))(eslint@9.39.5(jiti@2.7.0)): dependencies: '@nolyfill/is-core-module': 1.0.39 debug: 4.4.3 @@ -10687,19 +11341,64 @@ snapshots: unrs-resolver: 1.12.2 optionalDependencies: eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.64.0(eslint@9.39.5(jiti@2.7.0))(typescript@6.0.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.5(jiti@2.7.0)) + eslint-plugin-import-x: 4.17.1(@typescript-eslint/utils@8.64.0(eslint@9.39.5(jiti@2.7.0))(typescript@6.0.3))(eslint-import-resolver-node@0.3.10)(eslint@9.39.5(jiti@2.7.0)) transitivePeerDependencies: - supports-color - eslint-module-utils@2.14.0(@typescript-eslint/parser@8.64.0(eslint@9.39.5(jiti@2.7.0))(typescript@6.0.3))(eslint-import-resolver-node@0.3.10)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.64.0(eslint@9.39.5(jiti@2.7.0))(typescript@6.0.3))(eslint@9.39.5(jiti@2.7.0)))(eslint@9.39.5(jiti@2.7.0)))(eslint@9.39.5(jiti@2.7.0)): + eslint-module-utils@2.14.0(@typescript-eslint/parser@8.64.0(eslint@9.39.5(jiti@2.7.0))(typescript@6.0.3))(eslint-import-resolver-node@0.3.10)(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.5(jiti@2.7.0)): dependencies: debug: 3.2.7 optionalDependencies: '@typescript-eslint/parser': 8.64.0(eslint@9.39.5(jiti@2.7.0))(typescript@6.0.3) eslint: 9.39.5(jiti@2.7.0) eslint-import-resolver-node: 0.3.10 - eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.64.0(eslint@9.39.5(jiti@2.7.0))(typescript@6.0.3))(eslint@9.39.5(jiti@2.7.0)))(eslint@9.39.5(jiti@2.7.0)) + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import-x@4.17.1(@typescript-eslint/utils@8.64.0(eslint@9.39.5(jiti@2.7.0))(typescript@6.0.3))(eslint-import-resolver-node@0.3.10)(eslint@9.39.5(jiti@2.7.0)))(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.64.0(eslint@9.39.5(jiti@2.7.0))(typescript@6.0.3))(eslint@9.39.5(jiti@2.7.0)))(eslint@9.39.5(jiti@2.7.0)) + transitivePeerDependencies: + - supports-color + + eslint-plugin-es-x@7.8.0(eslint@9.39.4(jiti@2.7.0)): + dependencies: + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.4(jiti@2.7.0)) + '@eslint-community/regexpp': 4.12.2 + eslint: 9.39.4(jiti@2.7.0) + eslint-compat-utils: 0.5.1(eslint@9.39.4(jiti@2.7.0)) + + eslint-plugin-import-x@4.17.1(@typescript-eslint/utils@8.64.0(eslint@9.39.4(jiti@2.7.0))(typescript@6.0.3))(eslint-import-resolver-node@0.3.10)(eslint@9.39.4(jiti@2.7.0)): + dependencies: + '@typescript-eslint/types': 8.64.0 + comment-parser: 1.4.7 + debug: 4.4.3 + eslint: 9.39.4(jiti@2.7.0) + eslint-import-context: 0.1.9(unrs-resolver@1.12.2) + is-glob: 4.0.3 + minimatch: 10.2.5 + semver: 7.8.5 + stable-hash-x: 0.2.0 + unrs-resolver: 1.12.2 + optionalDependencies: + '@typescript-eslint/utils': 8.64.0(eslint@9.39.4(jiti@2.7.0))(typescript@6.0.3) + eslint-import-resolver-node: 0.3.10 + transitivePeerDependencies: + - supports-color + + eslint-plugin-import-x@4.17.1(@typescript-eslint/utils@8.64.0(eslint@9.39.5(jiti@2.7.0))(typescript@6.0.3))(eslint-import-resolver-node@0.3.10)(eslint@9.39.5(jiti@2.7.0)): + dependencies: + '@typescript-eslint/types': 8.64.0 + comment-parser: 1.4.7 + debug: 4.4.3 + eslint: 9.39.5(jiti@2.7.0) + eslint-import-context: 0.1.9(unrs-resolver@1.12.2) + is-glob: 4.0.3 + minimatch: 10.2.5 + semver: 7.8.5 + stable-hash-x: 0.2.0 + unrs-resolver: 1.12.2 + optionalDependencies: + '@typescript-eslint/utils': 8.64.0(eslint@9.39.5(jiti@2.7.0))(typescript@6.0.3) + eslint-import-resolver-node: 0.3.10 transitivePeerDependencies: - supports-color + optional: true eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.64.0(eslint@9.39.5(jiti@2.7.0))(typescript@6.0.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.5(jiti@2.7.0)): dependencies: @@ -10712,7 +11411,7 @@ snapshots: doctrine: 2.1.0 eslint: 9.39.5(jiti@2.7.0) eslint-import-resolver-node: 0.3.10 - eslint-module-utils: 2.14.0(@typescript-eslint/parser@8.64.0(eslint@9.39.5(jiti@2.7.0))(typescript@6.0.3))(eslint-import-resolver-node@0.3.10)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.64.0(eslint@9.39.5(jiti@2.7.0))(typescript@6.0.3))(eslint@9.39.5(jiti@2.7.0)))(eslint@9.39.5(jiti@2.7.0)))(eslint@9.39.5(jiti@2.7.0)) + eslint-module-utils: 2.14.0(@typescript-eslint/parser@8.64.0(eslint@9.39.5(jiti@2.7.0))(typescript@6.0.3))(eslint-import-resolver-node@0.3.10)(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.5(jiti@2.7.0)) hasown: 2.0.4 is-core-module: 2.16.2 is-glob: 4.0.3 @@ -10749,6 +11448,21 @@ snapshots: safe-regex-test: 1.1.0 string.prototype.includes: 2.0.1 + eslint-plugin-n@17.24.0(eslint@9.39.4(jiti@2.7.0))(typescript@6.0.3): + dependencies: + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.4(jiti@2.7.0)) + enhanced-resolve: 5.24.2 + eslint: 9.39.4(jiti@2.7.0) + eslint-plugin-es-x: 7.8.0(eslint@9.39.4(jiti@2.7.0)) + get-tsconfig: 4.14.0 + globals: 15.15.0 + globrex: 0.1.2 + ignore: 5.3.2 + semver: 7.8.5 + ts-declaration-location: 1.0.7(typescript@6.0.3) + transitivePeerDependencies: + - typescript + eslint-plugin-react-hooks@7.1.1(eslint@9.39.5(jiti@2.7.0)): dependencies: '@babel/core': 7.29.7 @@ -10793,6 +11507,47 @@ snapshots: eslint-visitor-keys@5.0.1: {} + eslint@9.39.4(jiti@2.7.0): + dependencies: + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.4(jiti@2.7.0)) + '@eslint-community/regexpp': 4.12.2 + '@eslint/config-array': 0.21.2 + '@eslint/config-helpers': 0.4.2 + '@eslint/core': 0.17.0 + '@eslint/eslintrc': 3.3.6 + '@eslint/js': 9.39.4 + '@eslint/plugin-kit': 0.4.1 + '@humanfs/node': 0.16.8 + '@humanwhocodes/module-importer': 1.0.1 + '@humanwhocodes/retry': 0.4.3 + '@types/estree': 1.0.9 + ajv: 6.15.0 + chalk: 4.1.2 + cross-spawn: 7.0.6 + debug: 4.4.3 + escape-string-regexp: 4.0.0 + eslint-scope: 8.4.0 + eslint-visitor-keys: 4.2.1 + espree: 10.4.0 + esquery: 1.7.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 8.0.0 + find-up: 5.0.0 + glob-parent: 6.0.2 + ignore: 5.3.2 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + json-stable-stringify-without-jsonify: 1.0.1 + lodash.merge: 4.6.2 + minimatch: 3.1.5 + natural-compare: 1.4.0 + optionator: 0.9.4 + optionalDependencies: + jiti: 2.7.0 + transitivePeerDependencies: + - supports-color + eslint@9.39.5(jiti@2.7.0): dependencies: '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.5(jiti@2.7.0)) @@ -10840,8 +11595,7 @@ snapshots: acorn-jsx: 5.3.2(acorn@8.17.0) eslint-visitor-keys: 4.2.1 - esprima@4.0.1: - optional: true + esprima@4.0.1: {} esquery@1.7.0: dependencies: @@ -10892,11 +11646,13 @@ snapshots: esutils@2.0.3: {} - etag@1.8.1: - optional: true + etag@1.8.1: {} + + eventsource-parser@3.1.0: {} - event-target-shim@5.0.1: - optional: true + eventsource@3.0.7: + dependencies: + eventsource-parser: 3.1.0 execa@5.1.1: dependencies: @@ -10909,7 +11665,6 @@ snapshots: onetime: 5.1.2 signal-exit: 3.0.7 strip-final-newline: 2.0.0 - optional: true execa@9.6.1: dependencies: @@ -10928,6 +11683,14 @@ snapshots: expect-type@1.4.0: {} + express-rate-limit@8.6.0(express@5.2.1): + dependencies: + debug: 4.4.3 + express: 5.2.1 + ip-address: 10.2.0 + transitivePeerDependencies: + - supports-color + express@5.2.1: dependencies: accepts: 2.0.0 @@ -10960,7 +11723,6 @@ snapshots: vary: 1.1.2 transitivePeerDependencies: - supports-color - optional: true exsolve@1.1.0: {} @@ -10970,8 +11732,6 @@ snapshots: dependencies: pure-rand: 8.4.2 - fast-content-type-parse@2.0.1: {} - fast-deep-equal@3.1.3: {} fast-glob@3.3.1: @@ -10990,12 +11750,22 @@ snapshots: merge2: 1.4.1 micromatch: 4.0.8 - fast-json-patch@3.1.1: {} - fast-json-stable-stringify@2.1.0: {} fast-levenshtein@2.0.6: {} + fast-string-truncated-width@3.0.3: {} + + fast-string-width@3.0.2: + dependencies: + fast-string-truncated-width: 3.0.3 + + fast-uri@3.1.3: {} + + fast-wrap-ansi@0.2.2: + dependencies: + fast-string-width: 3.0.2 + fast-xml-builder@1.2.1: dependencies: path-expression-matcher: 1.6.2 @@ -11018,6 +11788,13 @@ snapshots: optionalDependencies: picomatch: 4.0.5 + fetch-blob@3.2.0: + dependencies: + node-domexception: 1.0.0 + web-streams-polyfill: 3.3.3 + + fetchdts@0.1.7: {} + figures@6.1.0: dependencies: is-unicode-supported: 2.1.0 @@ -11040,15 +11817,12 @@ snapshots: statuses: 2.0.2 transitivePeerDependencies: - supports-color - optional: true find-my-way-ts@0.1.6: {} - find-process@2.1.1: + find-up@3.0.0: dependencies: - chalk: 4.1.2 - commander: 14.0.3 - loglevel: 1.9.2 + locate-path: 3.0.0 find-up@5.0.0: dependencies: @@ -11066,31 +11840,11 @@ snapshots: dependencies: is-callable: 1.2.7 - foreground-child@3.3.1: - dependencies: - cross-spawn: 7.0.6 - signal-exit: 4.1.0 - - form-data-encoder@1.7.2: - optional: true - - form-data@4.0.6: - dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - es-set-tostringtag: 2.1.0 - hasown: 2.0.4 - mime-types: 2.1.35 - optional: true - - formdata-node@4.4.1: + formdata-polyfill@4.0.10: dependencies: - node-domexception: 1.0.0 - web-streams-polyfill: 4.0.0-beta.3 - optional: true + fetch-blob: 3.2.0 - forwarded@0.2.0: - optional: true + forwarded@0.2.0: {} framer-motion@12.42.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7): dependencies: @@ -11101,16 +11855,18 @@ snapshots: react: 19.2.7 react-dom: 19.2.7(react@19.2.7) - fresh@2.0.0: - optional: true + fresh@2.0.0: {} - fs.realpath@1.0.0: - optional: true + fs-extra@11.3.6: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.2.1 + universalify: 2.0.1 fsevents@2.3.3: optional: true - fumadocs-core@16.11.5(@mdx-js/mdx@3.1.1)(@types/estree-jsx@1.0.5)(@types/hast@3.0.5)(@types/mdast@4.0.4)(@types/react@19.2.17)(lucide-react@1.25.0(react@19.2.7))(next@16.2.10(@babel/core@7.29.7)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(zod@4.4.3): + fumadocs-core@16.11.5(@mdx-js/mdx@3.1.1)(@tanstack/react-router@1.170.10(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(@types/estree-jsx@1.0.5)(@types/hast@3.0.5)(@types/mdast@4.0.4)(@types/react@19.2.17)(lucide-react@1.25.0(react@19.2.7))(next@16.2.10(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(zod@4.4.3): dependencies: '@orama/orama': 3.1.18 estree-util-value-to-estree: 3.5.0 @@ -11131,26 +11887,27 @@ snapshots: yaml: 2.9.0 optionalDependencies: '@mdx-js/mdx': 3.1.1 + '@tanstack/react-router': 1.170.10(react-dom@19.2.7(react@19.2.7))(react@19.2.7) '@types/estree-jsx': 1.0.5 '@types/hast': 3.0.5 '@types/mdast': 4.0.4 '@types/react': 19.2.17 lucide-react: 1.25.0(react@19.2.7) - next: 16.2.10(@babel/core@7.29.7)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + next: 16.2.10(react-dom@19.2.7(react@19.2.7))(react@19.2.7) react: 19.2.7 react-dom: 19.2.7(react@19.2.7) zod: 4.4.3 transitivePeerDependencies: - supports-color - fumadocs-mdx@15.2.0(@types/mdast@4.0.4)(@types/mdx@2.0.14)(@types/react@19.2.17)(fumadocs-core@16.11.5(@mdx-js/mdx@3.1.1)(@types/estree-jsx@1.0.5)(@types/hast@3.0.5)(@types/mdast@4.0.4)(@types/react@19.2.17)(lucide-react@1.25.0(react@19.2.7))(next@16.2.10(@babel/core@7.29.7)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(zod@4.4.3))(next@16.2.10(@babel/core@7.29.7)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(react@19.2.7)(rolldown@1.0.1)(vite@8.1.5(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.16.9)(yaml@2.9.0)): + fumadocs-mdx@15.2.0(@types/mdast@4.0.4)(@types/mdx@2.0.14)(@types/react@19.2.17)(fumadocs-core@16.11.5(@mdx-js/mdx@3.1.1)(@tanstack/react-router@1.170.10(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(@types/estree-jsx@1.0.5)(@types/hast@3.0.5)(@types/mdast@4.0.4)(@types/react@19.2.17)(lucide-react@1.25.0(react@19.2.7))(next@16.2.10(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(zod@4.4.3))(next@16.2.10(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(react@19.2.7)(rolldown@1.0.1)(vite@8.1.5(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.16.9)(yaml@2.9.0)): dependencies: '@mdx-js/mdx': 3.1.1 '@standard-schema/spec': 1.1.0 chokidar: 5.0.0 esbuild: 0.28.1 estree-util-value-to-estree: 3.5.0 - fumadocs-core: 16.11.5(@mdx-js/mdx@3.1.1)(@types/estree-jsx@1.0.5)(@types/hast@3.0.5)(@types/mdast@4.0.4)(@types/react@19.2.17)(lucide-react@1.25.0(react@19.2.7))(next@16.2.10(@babel/core@7.29.7)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(zod@4.4.3) + fumadocs-core: 16.11.5(@mdx-js/mdx@3.1.1)(@tanstack/react-router@1.170.10(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(@types/estree-jsx@1.0.5)(@types/hast@3.0.5)(@types/mdast@4.0.4)(@types/react@19.2.17)(lucide-react@1.25.0(react@19.2.7))(next@16.2.10(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(zod@4.4.3) github-slugger: 2.0.0 magic-string: 0.30.21 mdast-util-mdx: 3.0.0 @@ -11169,14 +11926,14 @@ snapshots: '@types/mdast': 4.0.4 '@types/mdx': 2.0.14 '@types/react': 19.2.17 - next: 16.2.10(@babel/core@7.29.7)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + next: 16.2.10(react-dom@19.2.7(react@19.2.7))(react@19.2.7) react: 19.2.7 rolldown: 1.0.1 vite: 8.1.5(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.16.9)(yaml@2.9.0) transitivePeerDependencies: - supports-color - fumadocs-ui@16.11.5(@types/mdx@2.0.14)(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(fumadocs-core@16.11.5(@mdx-js/mdx@3.1.1)(@types/estree-jsx@1.0.5)(@types/hast@3.0.5)(@types/mdast@4.0.4)(@types/react@19.2.17)(lucide-react@1.25.0(react@19.2.7))(next@16.2.10(@babel/core@7.29.7)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(zod@4.4.3))(next@16.2.10(@babel/core@7.29.7)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(tailwindcss@4.3.3): + fumadocs-ui@16.11.5(@types/mdx@2.0.14)(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(fumadocs-core@16.11.5(@mdx-js/mdx@3.1.1)(@tanstack/react-router@1.170.10(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(@types/estree-jsx@1.0.5)(@types/hast@3.0.5)(@types/mdast@4.0.4)(@types/react@19.2.17)(lucide-react@1.25.0(react@19.2.7))(next@16.2.10(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(zod@4.4.3))(next@16.2.10(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(tailwindcss@4.3.3): dependencies: '@fuma-translate/react': 1.0.2(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) '@fumadocs/tailwind': 0.1.1(tailwindcss@4.3.3) @@ -11192,7 +11949,7 @@ snapshots: '@radix-ui/react-tabs': 1.1.17(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) class-variance-authority: 0.7.1 cnfast: 0.0.8 - fumadocs-core: 16.11.5(@mdx-js/mdx@3.1.1)(@types/estree-jsx@1.0.5)(@types/hast@3.0.5)(@types/mdast@4.0.4)(@types/react@19.2.17)(lucide-react@1.25.0(react@19.2.7))(next@16.2.10(@babel/core@7.29.7)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(zod@4.4.3) + fumadocs-core: 16.11.5(@mdx-js/mdx@3.1.1)(@tanstack/react-router@1.170.10(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(@types/estree-jsx@1.0.5)(@types/hast@3.0.5)(@types/mdast@4.0.4)(@types/react@19.2.17)(lucide-react@1.25.0(react@19.2.7))(next@16.2.10(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(zod@4.4.3) lucide-react: 1.24.0(react@19.2.7) motion: 12.42.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7) next-themes: 0.4.6(react-dom@19.2.7(react@19.2.7))(react@19.2.7) @@ -11206,7 +11963,7 @@ snapshots: optionalDependencies: '@types/mdx': 2.0.14 '@types/react': 19.2.17 - next: 16.2.10(@babel/core@7.29.7)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + next: 16.2.10(react-dom@19.2.7(react@19.2.7))(react@19.2.7) transitivePeerDependencies: - '@emotion/is-prop-valid' - '@types/react-dom' @@ -11228,6 +11985,8 @@ snapshots: functions-have-names@1.2.3: {} + fuzzysort@3.1.0: {} + generate-function@2.3.1: dependencies: is-property: 1.0.2 @@ -11236,8 +11995,7 @@ snapshots: gensync@1.0.0-beta.2: {} - get-caller-file@2.0.5: - optional: true + get-caller-file@2.0.5: {} get-east-asian-width@1.6.0: {} @@ -11256,13 +12014,14 @@ snapshots: get-nonce@1.0.1: {} + get-own-enumerable-keys@1.0.0: {} + get-proto@1.0.1: dependencies: dunder-proto: 1.0.1 es-object-atoms: 1.1.2 - get-stream@6.0.1: - optional: true + get-stream@6.0.1: {} get-stream@9.0.1: dependencies: @@ -11289,50 +12048,35 @@ snapshots: dependencies: is-glob: 4.0.3 - glob@10.5.0: - dependencies: - foreground-child: 3.3.1 - jackspeak: 3.4.3 - minimatch: 9.0.9 - minipass: 7.1.3 - package-json-from-dist: 1.0.1 - path-scurry: 1.11.1 - - glob@12.0.0: - dependencies: - foreground-child: 3.3.1 - jackspeak: 4.2.3 - minimatch: 10.2.5 - minipass: 7.1.3 - package-json-from-dist: 1.0.1 - path-scurry: 2.0.2 - optional: true - - glob@9.3.5: - dependencies: - fs.realpath: 1.0.0 - minimatch: 8.0.7 - minipass: 4.2.8 - path-scurry: 1.11.1 - optional: true - globals@14.0.0: {} + globals@15.15.0: {} + globals@16.4.0: {} + globals@17.7.0: {} + globalthis@1.0.4: dependencies: define-properties: 1.2.1 gopd: 1.2.0 + globrex@0.1.2: {} + + goober@2.1.19(csstype@3.2.3): + dependencies: + csstype: 3.2.3 + gopd@1.2.0: {} graceful-fs@4.2.11: {} - gzip-size@6.0.0: + graphql@16.14.2: {} + + h3@2.0.1-rc.20: dependencies: - duplexer: 0.1.2 - optional: true + rou3: 0.8.1 + srvx: 0.11.22 has-bigints@1.1.0: {} @@ -11464,12 +12208,25 @@ snapshots: property-information: 7.2.0 space-separated-tokens: 2.0.2 + headers-polyfill@5.0.1: + dependencies: + '@types/set-cookie-parser': 2.4.10 + set-cookie-parser: 3.1.2 + hermes-estree@0.25.1: {} hermes-parser@0.25.1: dependencies: hermes-estree: 0.25.1 + hono@4.12.30: {} + + html-encoding-sniffer@6.0.0(@noble/hashes@1.8.0): + dependencies: + '@exodus/bytes': 1.15.1(@noble/hashes@1.8.0) + transitivePeerDependencies: + - '@noble/hashes' + html-void-elements@3.0.0: {} http-errors@2.0.1: @@ -11479,17 +12236,24 @@ snapshots: setprototypeof: 1.2.0 statuses: 2.0.2 toidentifier: 1.0.1 - optional: true - - human-signals@2.1.0: - optional: true - human-signals@8.0.1: {} + http-proxy-agent@7.0.2: + dependencies: + agent-base: 7.1.4 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color - humanize-ms@1.2.1: + https-proxy-agent@7.0.6: dependencies: - ms: 2.1.3 - optional: true + agent-base: 7.1.4 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + human-signals@2.1.0: {} + + human-signals@8.0.1: {} iconv-lite@0.7.3: dependencies: @@ -11568,8 +12332,9 @@ snapshots: transitivePeerDependencies: - supports-color - ipaddr.js@1.9.1: - optional: true + ip-address@10.2.0: {} + + ipaddr.js@1.9.1: {} is-alphabetical@2.0.1: {} @@ -11584,6 +12349,8 @@ snapshots: call-bound: 1.0.4 get-intrinsic: 1.3.0 + is-arrayish@0.2.1: {} + is-async-function@2.1.1: dependencies: async-function: 1.0.0 @@ -11624,6 +12391,8 @@ snapshots: is-decimal@2.0.1: {} + is-docker@2.2.1: {} + is-docker@3.0.0: {} is-document.all@1.0.0: @@ -11658,14 +12427,20 @@ snapshots: is-in-ci@2.0.0: {} + is-in-ssh@1.0.0: {} + is-inside-container@1.0.0: dependencies: is-docker: 3.0.0 + is-interactive@2.0.0: {} + is-map@2.0.3: {} is-negative-zero@2.0.3: {} + is-node-process@1.2.0: {} + is-number-object@1.1.1: dependencies: call-bound: 1.0.4 @@ -11673,10 +12448,15 @@ snapshots: is-number@7.0.0: {} + is-obj@2.0.0: {} + + is-obj@3.0.0: {} + is-plain-obj@4.1.0: {} - is-promise@4.0.0: - optional: true + is-potential-custom-element-name@1.0.1: {} + + is-promise@4.0.0: {} is-property@1.0.2: {} @@ -11687,14 +12467,15 @@ snapshots: has-tostringtag: 1.0.2 hasown: 2.0.4 + is-regexp@3.1.0: {} + is-set@2.0.3: {} is-shared-array-buffer@1.0.4: dependencies: call-bound: 1.0.4 - is-stream@2.0.1: - optional: true + is-stream@2.0.1: {} is-stream@4.0.1: {} @@ -11713,6 +12494,8 @@ snapshots: dependencies: which-typed-array: 1.1.22 + is-unicode-supported@1.3.0: {} + is-unicode-supported@2.1.0: {} is-unsafe@1.0.1: {} @@ -11728,6 +12511,10 @@ snapshots: call-bound: 1.0.4 get-intrinsic: 1.3.0 + is-wsl@2.2.0: + dependencies: + is-docker: 2.2.1 + is-wsl@3.1.1: dependencies: is-inside-container: 1.0.0 @@ -11736,10 +12523,11 @@ snapshots: isarray@2.0.5: {} + isbot@5.2.1: {} + isexe@2.0.0: {} - isexe@3.1.5: - optional: true + isexe@3.1.5: {} iterator.prototype@1.1.5: dependencies: @@ -11750,19 +12538,10 @@ snapshots: has-symbols: 1.1.0 set-function-name: 2.0.2 - jackspeak@3.4.3: - dependencies: - '@isaacs/cliui': 8.0.2 - optionalDependencies: - '@pkgjs/parseargs': 0.11.0 - - jackspeak@4.2.3: - dependencies: - '@isaacs/cliui': 9.0.0 - optional: true - jiti@2.7.0: {} + jose@6.2.3: {} + js-base64@3.9.1: {} js-tokens@4.0.0: {} @@ -11771,12 +12550,47 @@ snapshots: dependencies: argparse: 2.0.1 + jsdom@28.1.0(@noble/hashes@1.8.0): + dependencies: + '@acemir/cssom': 0.9.31 + '@asamuzakjp/dom-selector': 6.8.1 + '@bramus/specificity': 2.4.2 + '@exodus/bytes': 1.15.1(@noble/hashes@1.8.0) + cssstyle: 6.2.0 + data-urls: 7.0.0(@noble/hashes@1.8.0) + decimal.js: 10.6.0 + html-encoding-sniffer: 6.0.0(@noble/hashes@1.8.0) + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.6 + is-potential-custom-element-name: 1.0.1 + parse5: 8.0.1 + saxes: 6.0.0 + symbol-tree: 3.2.4 + tough-cookie: 6.0.2 + undici: 7.28.0 + w3c-xmlserializer: 5.0.0 + webidl-conversions: 8.0.1 + whatwg-mimetype: 5.0.0 + whatwg-url: 16.0.1(@noble/hashes@1.8.0) + xml-name-validator: 5.0.0 + transitivePeerDependencies: + - '@noble/hashes' + - supports-color + jsesc@3.1.0: {} json-buffer@3.0.1: {} + json-parse-even-better-errors@2.3.1: {} + json-schema-traverse@0.4.1: {} + json-schema-traverse@1.0.0: {} + + json-schema-typed@7.0.3: {} + + json-schema-typed@8.0.2: {} + json-stable-stringify-without-jsonify@1.0.1: {} json-with-bigint@3.5.10: {} @@ -11787,6 +12601,12 @@ snapshots: json5@2.2.3: {} + jsonfile@6.2.1: + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + jsx-ast-utils@3.3.5: dependencies: array-includes: 3.1.9 @@ -11805,6 +12625,8 @@ snapshots: dependencies: json-buffer: 3.0.1 + kleur@3.0.3: {} + kleur@4.1.5: {} kubernetes-types@1.30.0: {} @@ -11815,6 +12637,11 @@ snapshots: dependencies: language-subtag-registry: 0.3.23 + launch-editor@2.14.1: + dependencies: + picocolors: 1.1.1 + shell-quote: 1.10.0 + levn@0.4.1: dependencies: prelude-ls: 1.2.1 @@ -11894,13 +12721,23 @@ snapshots: lightningcss-win32-arm64-msvc: 1.32.0 lightningcss-win32-x64-msvc: 1.32.0 + lines-and-columns@1.2.4: {} + + locate-path@3.0.0: + dependencies: + p-locate: 3.0.0 + path-exists: 3.0.0 + locate-path@6.0.0: dependencies: p-locate: 5.0.0 lodash.merge@4.6.2: {} - loglevel@1.9.2: {} + log-symbols@6.0.0: + dependencies: + chalk: 5.6.2 + is-unicode-supported: 1.3.0 long@5.3.2: {} @@ -11910,10 +12747,7 @@ snapshots: dependencies: js-tokens: 4.0.0 - lru-cache@10.4.3: {} - - lru-cache@11.5.2: - optional: true + lru-cache@11.5.2: {} lru-cache@5.1.1: dependencies: @@ -11929,6 +12763,8 @@ snapshots: dependencies: react: 19.2.7 + lz-string@1.5.0: {} + magic-string@0.30.21: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 @@ -12102,14 +12938,13 @@ snapshots: dependencies: '@types/mdast': 4.0.4 - media-typer@1.1.0: - optional: true + mdn-data@2.27.1: {} - merge-descriptors@2.0.0: - optional: true + media-typer@1.1.0: {} - merge-stream@2.0.0: - optional: true + merge-descriptors@2.0.0: {} + + merge-stream@2.0.0: {} merge2@1.4.1: {} @@ -12382,49 +13217,19 @@ snapshots: braces: 3.0.3 picomatch: 2.3.2 - mime-db@1.52.0: - optional: true - - mime-db@1.54.0: - optional: true - - mime-types@2.1.35: - dependencies: - mime-db: 1.52.0 - optional: true + mime-db@1.54.0: {} mime-types@3.0.2: dependencies: mime-db: 1.54.0 - optional: true mime@4.1.0: {} mimic-fn@2.1.0: {} - miniflare@4.20260424.0: - dependencies: - '@cspotcode/source-map-support': 0.8.1 - sharp: 0.34.5 - undici: 7.24.8 - workerd: 1.20260424.1 - ws: 8.18.0 - youch: 4.1.0-beta.10 - transitivePeerDependencies: - - bufferutil - - utf-8-validate + mimic-fn@3.1.0: {} - miniflare@4.20260702.0: - dependencies: - '@cspotcode/source-map-support': 0.8.1 - sharp: 0.34.5 - undici: 7.28.0 - workerd: 1.20260702.1 - ws: 8.21.0 - youch: 4.1.0-beta.10 - transitivePeerDependencies: - - bufferutil - - utf-8-validate + mimic-function@5.0.1: {} miniflare@4.20260714.0: dependencies: @@ -12446,30 +13251,8 @@ snapshots: dependencies: brace-expansion: 1.1.16 - minimatch@8.0.7: - dependencies: - brace-expansion: 2.1.2 - optional: true - - minimatch@9.0.9: - dependencies: - brace-expansion: 2.1.2 - minimist@1.2.8: {} - minipass@4.2.8: - optional: true - - minipass@7.1.3: {} - - mkdirp@1.0.4: - optional: true - - mnemonist@0.38.3: - dependencies: - obliterator: 1.6.1 - optional: true - motion-dom@12.42.2: dependencies: motion-utils: 12.39.0 @@ -12484,9 +13267,6 @@ snapshots: react: 19.2.7 react-dom: 19.2.7(react@19.2.7) - mri@1.2.0: - optional: true - ms@2.1.3: {} msgpackr-extract@3.0.4: @@ -12505,8 +13285,61 @@ snapshots: optionalDependencies: msgpackr-extract: 3.0.4 + msw@2.15.0(@types/node@22.19.19)(typescript@6.0.3): + dependencies: + '@inquirer/confirm': 6.1.1(@types/node@22.19.19) + '@mswjs/interceptors': 0.41.9 + '@open-draft/deferred-promise': 3.0.0 + '@types/statuses': 2.0.6 + cookie: 1.1.1 + graphql: 16.14.2 + headers-polyfill: 5.0.1 + is-node-process: 1.2.0 + outvariant: 1.4.3 + path-to-regexp: 6.3.0 + picocolors: 1.1.1 + rettime: 0.11.11 + statuses: 2.0.2 + strict-event-emitter: 0.5.1 + tough-cookie: 6.0.2 + type-fest: 5.8.0 + until-async: 3.0.2 + yargs: 17.7.3 + optionalDependencies: + typescript: 6.0.3 + transitivePeerDependencies: + - '@types/node' + + msw@2.15.0(@types/node@26.1.1)(typescript@6.0.3): + dependencies: + '@inquirer/confirm': 6.1.1(@types/node@26.1.1) + '@mswjs/interceptors': 0.41.9 + '@open-draft/deferred-promise': 3.0.0 + '@types/statuses': 2.0.6 + cookie: 1.1.1 + graphql: 16.14.2 + headers-polyfill: 5.0.1 + is-node-process: 1.2.0 + outvariant: 1.4.3 + path-to-regexp: 6.3.0 + picocolors: 1.1.1 + rettime: 0.11.11 + statuses: 2.0.2 + strict-event-emitter: 0.5.1 + tough-cookie: 6.0.2 + type-fest: 5.8.0 + until-async: 3.0.2 + yargs: 17.7.3 + optionalDependencies: + typescript: 6.0.3 + transitivePeerDependencies: + - '@types/node' + optional: true + multipasta@0.2.8: {} + mute-stream@3.0.0: {} + mysql2@3.23.0(@types/node@26.1.1): dependencies: '@types/node': 26.1.1 @@ -12529,19 +13362,14 @@ snapshots: natural-compare@1.4.0: {} - negotiator@1.0.0: - optional: true - - neverthrow@8.2.0: - optionalDependencies: - '@rollup/rollup-linux-x64-gnu': 4.62.2 + negotiator@1.0.0: {} next-themes@0.4.6(react-dom@19.2.7(react@19.2.7))(react@19.2.7): dependencies: react: 19.2.7 react-dom: 19.2.7(react@19.2.7) - next@16.2.10(@babel/core@7.29.7)(react-dom@19.2.7(react@19.2.7))(react@19.2.7): + next@16.2.10(react-dom@19.2.7(react@19.2.7))(react@19.2.7): dependencies: '@next/env': 16.2.10 '@swc/helpers': 0.5.15 @@ -12550,7 +13378,7 @@ snapshots: postcss: 8.5.19 react: 19.2.7 react-dom: 19.2.7(react@19.2.7) - styled-jsx: 5.1.6(@babel/core@7.29.7)(react@19.2.7) + styled-jsx: 5.1.6(react@19.2.7) optionalDependencies: '@next/swc-darwin-arm64': 16.2.10 '@next/swc-darwin-x64': 16.2.10 @@ -12565,8 +13393,7 @@ snapshots: - '@babel/core' - babel-plugin-macros - node-domexception@1.0.0: - optional: true + node-domexception@1.0.0: {} node-exports-info@1.6.2: dependencies: @@ -12575,10 +13402,11 @@ snapshots: object.entries: 1.1.9 semver: 6.3.1 - node-fetch@2.7.0: + node-fetch@3.3.2: dependencies: - whatwg-url: 5.0.0 - optional: true + data-uri-to-buffer: 4.0.1 + fetch-blob: 3.2.0 + formdata-polyfill: 4.0.10 node-gyp-build-optional-packages@5.2.2: dependencies: @@ -12590,7 +13418,6 @@ snapshots: npm-run-path@4.0.1: dependencies: path-key: 3.1.1 - optional: true npm-run-path@6.0.0: dependencies: @@ -12603,8 +13430,7 @@ snapshots: object-keys@1.1.1: {} - object-treeify@1.1.33: - optional: true + object-treeify@1.1.33: {} object.assign@4.1.7: dependencies: @@ -12642,27 +13468,24 @@ snapshots: define-properties: 1.2.1 es-object-atoms: 1.1.2 - obliterator@1.6.1: - optional: true - obug@2.1.3: {} - ohash@2.0.11: {} - on-finished@2.4.1: dependencies: ee-first: 1.1.1 - optional: true once@1.4.0: dependencies: wrappy: 1.0.2 - optional: true onetime@5.1.2: dependencies: mimic-fn: 2.1.0 + onetime@7.0.0: + dependencies: + mimic-function: 5.0.1 + oniguruma-parser@0.12.2: {} oniguruma-to-es@4.3.6: @@ -12671,14 +13494,20 @@ snapshots: regex: 6.1.0 regex-recursion: 6.0.2 - open@10.2.0: + open@11.0.0: dependencies: default-browser: 5.5.0 define-lazy-prop: 3.0.0 + is-in-ssh: 1.0.0 is-inside-container: 1.0.0 - wsl-utils: 0.1.0 + powershell-utils: 0.1.0 + wsl-utils: 0.3.1 - openapi-types@12.1.3: {} + open@8.4.2: + dependencies: + define-lazy-prop: 2.0.0 + is-docker: 2.2.1 + is-wsl: 2.2.0 optionator@0.9.4: dependencies: @@ -12689,21 +13518,71 @@ snapshots: type-check: 0.4.0 word-wrap: 1.2.5 + ora@8.2.0: + dependencies: + chalk: 5.6.2 + cli-cursor: 5.0.0 + cli-spinners: 2.9.2 + is-interactive: 2.0.0 + is-unicode-supported: 2.1.0 + log-symbols: 6.0.0 + stdin-discarder: 0.2.2 + string-width: 7.2.0 + strip-ansi: 7.2.0 + + outvariant@1.4.3: {} + own-keys@1.0.1: dependencies: get-intrinsic: 1.3.0 object-keys: 1.1.1 safe-push-apply: 1.0.0 + oxc-parser@0.120.0(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.2): + dependencies: + '@oxc-project/types': 0.120.0 + optionalDependencies: + '@oxc-parser/binding-android-arm-eabi': 0.120.0 + '@oxc-parser/binding-android-arm64': 0.120.0 + '@oxc-parser/binding-darwin-arm64': 0.120.0 + '@oxc-parser/binding-darwin-x64': 0.120.0 + '@oxc-parser/binding-freebsd-x64': 0.120.0 + '@oxc-parser/binding-linux-arm-gnueabihf': 0.120.0 + '@oxc-parser/binding-linux-arm-musleabihf': 0.120.0 + '@oxc-parser/binding-linux-arm64-gnu': 0.120.0 + '@oxc-parser/binding-linux-arm64-musl': 0.120.0 + '@oxc-parser/binding-linux-ppc64-gnu': 0.120.0 + '@oxc-parser/binding-linux-riscv64-gnu': 0.120.0 + '@oxc-parser/binding-linux-riscv64-musl': 0.120.0 + '@oxc-parser/binding-linux-s390x-gnu': 0.120.0 + '@oxc-parser/binding-linux-x64-gnu': 0.120.0 + '@oxc-parser/binding-linux-x64-musl': 0.120.0 + '@oxc-parser/binding-openharmony-arm64': 0.120.0 + '@oxc-parser/binding-wasm32-wasi': 0.120.0(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.2) + '@oxc-parser/binding-win32-arm64-msvc': 0.120.0 + '@oxc-parser/binding-win32-ia32-msvc': 0.120.0 + '@oxc-parser/binding-win32-x64-msvc': 0.120.0 + transitivePeerDependencies: + - '@emnapi/core' + - '@emnapi/runtime' + + p-limit@2.3.0: + dependencies: + p-try: 2.2.0 + p-limit@3.1.0: dependencies: yocto-queue: 0.1.0 + p-locate@3.0.0: + dependencies: + p-limit: 2.3.0 + p-locate@5.0.0: dependencies: p-limit: 3.1.0 - package-json-from-dist@1.0.1: {} + p-try@2.2.0: {} pako@1.0.11: {} @@ -12721,17 +13600,31 @@ snapshots: is-decimal: 2.0.1 is-hexadecimal: 2.0.1 + parse-json@5.2.0: + dependencies: + '@babel/code-frame': 7.29.7 + error-ex: 1.3.4 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + parse-ms@4.0.0: {} parse5@7.3.0: dependencies: - entities: 6.0.1 + entities: 6.0.1 + + parse5@8.0.1: + dependencies: + entities: 8.0.0 - parseurl@1.3.3: - optional: true + parseurl@1.3.3: {} patch-console@2.0.0: {} + path-browserify@1.0.1: {} + + path-exists@3.0.0: {} + path-exists@4.0.0: {} path-expression-matcher@1.6.2: {} @@ -12742,21 +13635,9 @@ snapshots: path-parse@1.0.7: {} - path-scurry@1.11.1: - dependencies: - lru-cache: 10.4.3 - minipass: 7.1.3 - - path-scurry@2.0.2: - dependencies: - lru-cache: 11.5.2 - minipass: 7.1.3 - optional: true - path-to-regexp@6.3.0: {} - path-to-regexp@8.4.2: - optional: true + path-to-regexp@8.4.2: {} pathe@2.0.3: {} @@ -12801,8 +13682,19 @@ snapshots: picomatch@4.0.5: {} + pkce-challenge@5.0.1: {} + + pkg-up@3.1.0: + dependencies: + find-up: 3.0.0 + possible-typed-array-names@1.1.0: {} + postcss-selector-parser@7.1.4: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + postcss@8.5.19: dependencies: nanoid: 3.3.16 @@ -12819,8 +13711,22 @@ snapshots: dependencies: xtend: 4.0.2 + powershell-utils@0.1.0: {} + prelude-ls@1.2.1: {} + prettier-plugin-tailwindcss@0.8.0(prettier@3.8.3): + dependencies: + prettier: 3.8.3 + + prettier@3.8.3: {} + + pretty-format@27.5.1: + dependencies: + ansi-regex: 5.0.1 + ansi-styles: 5.2.0 + react-is: 17.0.2 + pretty-ms@9.3.0: dependencies: parse-ms: 4.0.0 @@ -12829,25 +13735,23 @@ snapshots: promise-limit@2.7.0: {} + prompts@2.4.2: + dependencies: + kleur: 3.0.3 + sisteransi: 1.0.5 + prop-types@15.8.1: dependencies: loose-envify: 1.4.0 object-assign: 4.1.1 react-is: 16.13.1 - proper-lockfile@4.1.2: - dependencies: - graceful-fs: 4.2.11 - retry: 0.12.0 - signal-exit: 3.0.7 - property-information@7.2.0: {} proxy-addr@2.0.7: dependencies: forwarded: 0.2.0 ipaddr.js: 1.9.1 - optional: true punycode@2.3.1: {} @@ -12857,12 +13761,10 @@ snapshots: dependencies: es-define-property: 1.0.1 side-channel: 1.1.1 - optional: true queue-microtask@1.2.3: {} - range-parser@1.3.0: - optional: true + range-parser@1.3.0: {} raw-body@3.0.2: dependencies: @@ -12870,13 +13772,6 @@ snapshots: http-errors: 2.0.1 iconv-lite: 0.7.3 unpipe: 1.0.0 - optional: true - - rclone.js@0.6.6: - dependencies: - adm-zip: 0.5.18 - mri: 1.2.0 - optional: true react-dom@19.2.7(react@19.2.7): dependencies: @@ -12885,6 +13780,8 @@ snapshots: react-is@16.13.1: {} + react-is@17.0.2: {} + react-reconciler@0.33.0(react@19.2.7): dependencies: react: 19.2.7 @@ -12931,6 +13828,14 @@ snapshots: readdirp@5.0.0: {} + recast@0.23.12: + dependencies: + ast-types: 0.16.1 + esprima: 4.0.1 + source-map: 0.6.1 + tiny-invariant: 1.3.3 + tslib: 2.8.1 + recma-build-jsx@1.0.0: dependencies: '@types/estree': 1.0.9 @@ -13060,6 +13965,12 @@ snapshots: transitivePeerDependencies: - supports-color + require-directory@2.1.1: {} + + require-from-string@2.0.2: {} + + reselect@5.2.0: {} + resolve-from@4.0.0: {} resolve-pkg-maps@1.0.0: {} @@ -13078,7 +13989,12 @@ snapshots: onetime: 5.1.2 signal-exit: 3.0.7 - retry@0.12.0: {} + restore-cursor@5.1.0: + dependencies: + onetime: 7.0.0 + signal-exit: 4.1.0 + + rettime@0.11.11: {} reusify@1.1.0: {} @@ -13103,6 +14019,27 @@ snapshots: '@rolldown/binding-win32-arm64-msvc': 1.0.1 '@rolldown/binding-win32-x64-msvc': 1.0.1 + rolldown@1.0.3: + dependencies: + '@oxc-project/types': 0.133.0 + '@rolldown/pluginutils': 1.0.1 + optionalDependencies: + '@rolldown/binding-android-arm64': 1.0.3 + '@rolldown/binding-darwin-arm64': 1.0.3 + '@rolldown/binding-darwin-x64': 1.0.3 + '@rolldown/binding-freebsd-x64': 1.0.3 + '@rolldown/binding-linux-arm-gnueabihf': 1.0.3 + '@rolldown/binding-linux-arm64-gnu': 1.0.3 + '@rolldown/binding-linux-arm64-musl': 1.0.3 + '@rolldown/binding-linux-ppc64-gnu': 1.0.3 + '@rolldown/binding-linux-s390x-gnu': 1.0.3 + '@rolldown/binding-linux-x64-gnu': 1.0.3 + '@rolldown/binding-linux-x64-musl': 1.0.3 + '@rolldown/binding-openharmony-arm64': 1.0.3 + '@rolldown/binding-wasm32-wasi': 1.0.3 + '@rolldown/binding-win32-arm64-msvc': 1.0.3 + '@rolldown/binding-win32-x64-msvc': 1.0.3 + rolldown@1.1.5: dependencies: '@oxc-project/types': 0.139.0 @@ -13124,6 +14061,8 @@ snapshots: '@rolldown/binding-win32-arm64-msvc': 1.1.5 '@rolldown/binding-win32-x64-msvc': 1.1.5 + rou3@0.8.1: {} + router@2.2.0: dependencies: debug: 4.4.3 @@ -13133,7 +14072,6 @@ snapshots: path-to-regexp: 8.4.2 transitivePeerDependencies: - supports-color - optional: true run-applescript@7.1.0: {} @@ -13164,6 +14102,10 @@ snapshots: safer-buffer@2.1.2: {} + saxes@6.0.0: + dependencies: + xmlchars: 2.2.0 + scheduler@0.27.0: {} scroll-into-view-if-needed@3.1.0: @@ -13189,7 +14131,12 @@ snapshots: statuses: 2.0.2 transitivePeerDependencies: - supports-color - optional: true + + seroval-plugins@1.5.5(seroval@1.5.5): + dependencies: + seroval: 1.5.5 + + seroval@1.5.5: {} serve-static@2.2.1: dependencies: @@ -13199,7 +14146,8 @@ snapshots: send: 1.2.1 transitivePeerDependencies: - supports-color - optional: true + + set-cookie-parser@3.1.2: {} set-function-length@1.2.2: dependencies: @@ -13225,8 +14173,50 @@ snapshots: setimmediate@1.0.5: {} - setprototypeof@1.2.0: - optional: true + setprototypeof@1.2.0: {} + + shadcn@4.10.0(@types/node@22.19.19)(typescript@6.0.3): + dependencies: + '@babel/core': 7.29.7 + '@babel/parser': 7.29.7 + '@babel/plugin-transform-typescript': 7.29.7(@babel/core@7.29.7) + '@babel/preset-typescript': 7.29.7(@babel/core@7.29.7) + '@dotenvx/dotenvx': 1.75.1 + '@modelcontextprotocol/sdk': 1.29.0(zod@3.25.76) + '@types/validate-npm-package-name': 4.0.2 + browserslist: 4.28.6 + commander: 14.0.3 + cosmiconfig: 9.0.2(typescript@6.0.3) + dedent: 1.7.2 + deepmerge: 4.3.1 + diff: 8.0.4 + execa: 9.6.1 + fast-glob: 3.3.3 + fs-extra: 11.3.6 + fuzzysort: 3.1.0 + https-proxy-agent: 7.0.6 + kleur: 4.1.5 + msw: 2.15.0(@types/node@22.19.19)(typescript@6.0.3) + node-fetch: 3.3.2 + open: 11.0.0 + ora: 8.2.0 + postcss: 8.5.19 + postcss-selector-parser: 7.1.4 + prompts: 2.4.2 + recast: 0.23.12 + stringify-object: 5.0.0 + tailwind-merge: 3.6.0 + ts-morph: 26.0.0 + tsconfig-paths: 4.2.0 + validate-npm-package-name: 7.0.2 + zod: 3.25.76 + zod-to-json-schema: 3.25.2(zod@3.25.76) + transitivePeerDependencies: + - '@cfworker/json-schema' + - '@types/node' + - babel-plugin-macros + - supports-color + - typescript sharp@0.34.5: dependencies: @@ -13298,6 +14288,8 @@ snapshots: shebang-regex@3.0.0: {} + shell-quote@1.10.0: {} + shiki@4.3.1: dependencies: '@shikijs/core': 4.3.1 @@ -13350,6 +14342,12 @@ snapshots: ansi-styles: 6.2.3 is-fullwidth-code-point: 5.1.0 + solid-js@1.9.14: + dependencies: + csstype: 3.2.3 + seroval: 1.5.5 + seroval-plugins: 1.5.5(seroval@1.5.5) + source-map-js@1.2.1: {} source-map-support@0.5.21: @@ -13358,8 +14356,7 @@ snapshots: source-map: 0.6.1 optional: true - source-map@0.6.1: - optional: true + source-map@0.6.1: {} source-map@0.7.6: {} @@ -13369,6 +14366,10 @@ snapshots: sql-escaper@1.5.1: {} + srvx@0.11.22: {} + + stable-hash-x@0.2.0: {} + stable-hash@0.0.5: {} stack-utils@2.0.6: @@ -13379,28 +14380,25 @@ snapshots: standard-as-callback@2.1.0: {} - statuses@2.0.2: - optional: true + statuses@2.0.2: {} std-env@4.2.0: {} + stdin-discarder@0.2.2: {} + stop-iteration-iterator@1.1.0: dependencies: es-errors: 1.3.0 internal-slot: 1.1.0 + strict-event-emitter@0.5.1: {} + string-width@4.2.3: dependencies: emoji-regex: 8.0.0 is-fullwidth-code-point: 3.0.0 strip-ansi: 6.0.1 - string-width@5.1.2: - dependencies: - eastasianwidth: 0.2.0 - emoji-regex: 9.2.2 - strip-ansi: 7.2.0 - string-width@7.2.0: dependencies: emoji-regex: 10.6.0 @@ -13472,6 +14470,12 @@ snapshots: character-entities-html4: 2.1.0 character-entities-legacy: 3.0.0 + stringify-object@5.0.0: + dependencies: + get-own-enumerable-keys: 1.0.0 + is-obj: 3.0.0 + is-regexp: 3.1.0 + strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 @@ -13482,8 +14486,7 @@ snapshots: strip-bom@3.0.0: {} - strip-final-newline@2.0.0: - optional: true + strip-final-newline@2.0.0: {} strip-final-newline@4.0.0: {} @@ -13501,12 +14504,10 @@ snapshots: dependencies: inline-style-parser: 0.2.7 - styled-jsx@5.1.6(@babel/core@7.29.7)(react@19.2.7): + styled-jsx@5.1.6(react@19.2.7): dependencies: client-only: 0.0.1 react: 19.2.7 - optionalDependencies: - '@babel/core': 7.29.7 supports-color@10.2.2: {} @@ -13516,8 +14517,16 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} + symbol-tree@3.2.4: {} + + systeminformation@5.31.17: {} + tagged-tag@1.0.0: {} + tailwind-merge@3.6.0: {} + + tailwindcss@4.3.0: {} + tailwindcss@4.3.3: {} tapable@2.3.3: {} @@ -13532,6 +14541,8 @@ snapshots: source-map-support: 0.5.21 optional: true + tiny-invariant@1.3.3: {} + tinybench@2.9.0: {} tinyexec@1.2.4: {} @@ -13543,17 +14554,27 @@ snapshots: tinyrainbow@3.1.0: {} + tldts-core@7.4.9: {} + + tldts@7.4.9: + dependencies: + tldts-core: 7.4.9 + to-regex-range@5.0.1: dependencies: is-number: 7.0.0 - toidentifier@1.0.1: - optional: true + toidentifier@1.0.1: {} toml@4.3.0: {} - tr46@0.0.3: - optional: true + tough-cookie@6.0.2: + dependencies: + tldts: 7.4.9 + + tr46@6.0.0: + dependencies: + punycode: 2.3.1 trim-lines@3.0.1: {} @@ -13563,8 +14584,15 @@ snapshots: dependencies: typescript: 6.0.3 - ts-tqdm@0.8.6: - optional: true + ts-declaration-location@1.0.7(typescript@6.0.3): + dependencies: + picomatch: 4.0.5 + typescript: 6.0.3 + + ts-morph@26.0.0: + dependencies: + '@ts-morph/common': 0.27.0 + code-block-writer: 13.0.3 tsconfig-paths@3.15.0: dependencies: @@ -13573,8 +14601,16 @@ snapshots: minimist: 1.2.8 strip-bom: 3.0.0 + tsconfig-paths@4.2.0: + dependencies: + json5: 2.2.3 + minimist: 1.2.8 + strip-bom: 3.0.0 + tslib@2.8.1: {} + tw-animate-css@1.4.0: {} + type-check@0.4.0: dependencies: prelude-ls: 1.2.1 @@ -13588,7 +14624,6 @@ snapshots: content-type: 2.0.0 media-typer: 1.1.0 mime-types: 3.0.2 - optional: true typed-array-buffer@1.0.3: dependencies: @@ -13623,6 +14658,17 @@ snapshots: possible-typed-array-names: 1.1.0 reflect.getprototypeof: 1.0.10 + typescript-eslint@8.64.0(eslint@9.39.4(jiti@2.7.0))(typescript@6.0.3): + dependencies: + '@typescript-eslint/eslint-plugin': 8.64.0(@typescript-eslint/parser@8.64.0(eslint@9.39.4(jiti@2.7.0))(typescript@6.0.3))(eslint@9.39.4(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/parser': 8.64.0(eslint@9.39.4(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/typescript-estree': 8.64.0(typescript@6.0.3) + '@typescript-eslint/utils': 8.64.0(eslint@9.39.4(jiti@2.7.0))(typescript@6.0.3) + eslint: 9.39.4(jiti@2.7.0) + typescript: 6.0.3 + transitivePeerDependencies: + - supports-color + typescript-eslint@8.64.0(eslint@9.39.5(jiti@2.7.0))(typescript@6.0.3): dependencies: '@typescript-eslint/eslint-plugin': 8.64.0(@typescript-eslint/parser@8.64.0(eslint@9.39.5(jiti@2.7.0))(typescript@6.0.3))(eslint@9.39.5(jiti@2.7.0))(typescript@6.0.3) @@ -13645,25 +14691,14 @@ snapshots: has-symbols: 1.1.0 which-boxed-primitive: 1.1.1 - undici-types@5.26.5: - optional: true + undici-types@6.21.0: {} undici-types@8.3.0: {} - undici@7.24.8: {} - undici@7.28.0: {} undici@8.7.0: {} - unenv@2.0.0-rc.21: - dependencies: - defu: 6.1.7 - exsolve: 1.1.0 - ohash: 2.0.11 - pathe: 2.0.3 - ufo: 1.6.4 - unenv@2.0.0-rc.24: dependencies: pathe: 2.0.3 @@ -13714,8 +14749,19 @@ snapshots: universal-user-agent@7.0.3: {} - unpipe@1.0.0: - optional: true + universalify@2.0.1: {} + + unpipe@1.0.0: {} + + unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.1.5)(vite@8.0.16(@types/node@22.19.19)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.16.9)(yaml@2.9.0)): + dependencies: + '@jridgewell/remapping': 2.3.5 + picomatch: 4.0.5 + webpack-virtual-modules: 0.6.2 + optionalDependencies: + esbuild: 0.28.1 + rolldown: 1.1.5 + vite: 8.0.16(@types/node@22.19.19)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.16.9)(yaml@2.9.0) unrs-resolver@1.12.2: dependencies: @@ -13744,6 +14790,8 @@ snapshots: '@unrs/resolver-binding-win32-ia32-msvc': 1.12.2 '@unrs/resolver-binding-win32-x64-msvc': 1.12.2 + until-async@3.0.2: {} + update-browserslist-db@1.2.3(browserslist@4.28.6): dependencies: browserslist: 4.28.6 @@ -13754,9 +14802,6 @@ snapshots: dependencies: punycode: 2.3.1 - urlpattern-polyfill@10.1.0: - optional: true - use-callback-ref@1.3.3(@types/react@19.2.17)(react@19.2.7): dependencies: react: 19.2.7 @@ -13772,12 +14817,17 @@ snapshots: optionalDependencies: '@types/react': 19.2.17 + use-sync-external-store@1.6.0(react@19.2.7): + dependencies: + react: 19.2.7 + util-deprecate@1.0.2: {} uuid@14.0.1: {} - vary@1.1.2: - optional: true + validate-npm-package-name@7.0.2: {} + + vary@1.1.2: {} vfile-location@5.0.3: dependencies: @@ -13794,6 +14844,21 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.3 + vite@8.0.16(@types/node@22.19.19)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.16.9)(yaml@2.9.0): + dependencies: + lightningcss: 1.32.0 + picomatch: 4.0.5 + postcss: 8.5.19 + rolldown: 1.0.3 + tinyglobby: 0.2.17 + optionalDependencies: + '@types/node': 22.19.19 + esbuild: 0.28.1 + fsevents: 2.3.3 + jiti: 2.7.0 + terser: 5.16.9 + yaml: 2.9.0 + vite@8.1.5(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.16.9)(yaml@2.9.0): dependencies: lightningcss: 1.32.0 @@ -13809,10 +14874,14 @@ snapshots: terser: 5.16.9 yaml: 2.9.0 - vitest@4.1.10(@types/node@26.1.1)(vite@8.1.5(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.16.9)(yaml@2.9.0)): + vitefu@1.1.3(vite@8.0.16(@types/node@22.19.19)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.16.9)(yaml@2.9.0)): + optionalDependencies: + vite: 8.0.16(@types/node@22.19.19)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.16.9)(yaml@2.9.0) + + vitest@4.1.10(@types/node@26.1.1)(jsdom@28.1.0(@noble/hashes@1.8.0))(msw@2.15.0(@types/node@26.1.1)(typescript@6.0.3))(vite@8.1.5(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.16.9)(yaml@2.9.0)): dependencies: '@vitest/expect': 4.1.10 - '@vitest/mocker': 4.1.10(vite@8.1.5(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.16.9)(yaml@2.9.0)) + '@vitest/mocker': 4.1.10(msw@2.15.0(@types/node@26.1.1)(typescript@6.0.3))(vite@8.1.5(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.16.9)(yaml@2.9.0)) '@vitest/pretty-format': 4.1.10 '@vitest/runner': 4.1.10 '@vitest/snapshot': 4.1.10 @@ -13833,22 +14902,71 @@ snapshots: why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 26.1.1 + jsdom: 28.1.0(@noble/hashes@1.8.0) + transitivePeerDependencies: + - msw + + vitest@4.1.8(@types/node@22.19.19)(jsdom@28.1.0(@noble/hashes@1.8.0))(msw@2.15.0(@types/node@22.19.19)(typescript@6.0.3))(vite@8.0.16(@types/node@22.19.19)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.16.9)(yaml@2.9.0)): + dependencies: + '@vitest/expect': 4.1.8 + '@vitest/mocker': 4.1.8(msw@2.15.0(@types/node@22.19.19)(typescript@6.0.3))(vite@8.0.16(@types/node@22.19.19)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.16.9)(yaml@2.9.0)) + '@vitest/pretty-format': 4.1.8 + '@vitest/runner': 4.1.8 + '@vitest/snapshot': 4.1.8 + '@vitest/spy': 4.1.8 + '@vitest/utils': 4.1.8 + es-module-lexer: 2.3.1 + expect-type: 1.4.0 + magic-string: 0.30.21 + obug: 2.1.3 + pathe: 2.0.3 + picomatch: 4.0.5 + std-env: 4.2.0 + tinybench: 2.9.0 + tinyexec: 1.2.4 + tinyglobby: 0.2.17 + tinyrainbow: 3.1.0 + vite: 8.0.16(@types/node@22.19.19)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.16.9)(yaml@2.9.0) + why-is-node-running: 2.3.0 + optionalDependencies: + '@types/node': 22.19.19 + jsdom: 28.1.0(@noble/hashes@1.8.0) transitivePeerDependencies: - msw + vue-eslint-parser@10.4.1(eslint@9.39.4(jiti@2.7.0)): + dependencies: + debug: 4.4.3 + eslint: 9.39.4(jiti@2.7.0) + eslint-scope: 8.4.0 + eslint-visitor-keys: 5.0.1 + espree: 10.4.0 + esquery: 1.7.0 + semver: 7.8.5 + transitivePeerDependencies: + - supports-color + + w3c-xmlserializer@5.0.0: + dependencies: + xml-name-validator: 5.0.0 + web-namespaces@2.0.1: {} - web-streams-polyfill@4.0.0-beta.3: - optional: true + web-streams-polyfill@3.3.3: {} - webidl-conversions@3.0.1: - optional: true + webidl-conversions@8.0.1: {} + + webpack-virtual-modules@0.6.2: {} + + whatwg-mimetype@5.0.0: {} - whatwg-url@5.0.0: + whatwg-url@16.0.1(@noble/hashes@1.8.0): dependencies: - tr46: 0.0.3 - webidl-conversions: 3.0.1 - optional: true + '@exodus/bytes': 1.15.1(@noble/hashes@1.8.0) + tr46: 6.0.0 + webidl-conversions: 8.0.1 + transitivePeerDependencies: + - '@noble/hashes' which-boxed-primitive@1.1.1: dependencies: @@ -13898,7 +15016,6 @@ snapshots: which@4.0.0: dependencies: isexe: 3.1.5 - optional: true why-is-node-running@2.3.0: dependencies: @@ -13911,22 +15028,6 @@ snapshots: word-wrap@1.2.5: {} - workerd@1.20260424.1: - optionalDependencies: - '@cloudflare/workerd-darwin-64': 1.20260424.1 - '@cloudflare/workerd-darwin-arm64': 1.20260424.1 - '@cloudflare/workerd-linux-64': 1.20260424.1 - '@cloudflare/workerd-linux-arm64': 1.20260424.1 - '@cloudflare/workerd-windows-64': 1.20260424.1 - - workerd@1.20260702.1: - optionalDependencies: - '@cloudflare/workerd-darwin-64': 1.20260702.1 - '@cloudflare/workerd-darwin-arm64': 1.20260702.1 - '@cloudflare/workerd-linux-64': 1.20260702.1 - '@cloudflare/workerd-linux-arm64': 1.20260702.1 - '@cloudflare/workerd-windows-64': 1.20260702.1 - workerd@1.20260704.1: optionalDependencies: '@cloudflare/workerd-darwin-64': 1.20260704.1 @@ -13943,23 +15044,6 @@ snapshots: '@cloudflare/workerd-linux-arm64': 1.20260714.1 '@cloudflare/workerd-windows-64': 1.20260714.1 - wrangler@4.107.1(@cloudflare/workers-types@5.20260717.1): - dependencies: - '@cloudflare/kv-asset-handler': 0.5.0 - '@cloudflare/unenv-preset': 2.16.1(unenv@2.0.0-rc.24)(workerd@1.20260702.1) - blake3-wasm: 2.1.5 - esbuild: 0.28.1 - miniflare: 4.20260702.0 - path-to-regexp: 6.3.0 - unenv: 2.0.0-rc.24 - workerd: 1.20260702.1 - optionalDependencies: - '@cloudflare/workers-types': 5.20260717.1 - fsevents: 2.3.3 - transitivePeerDependencies: - - bufferutil - - utf-8-validate - wrangler@4.112.0(@cloudflare/workers-types@5.20260717.1): dependencies: '@cloudflare/kv-asset-handler': 0.5.0 @@ -13983,55 +15067,60 @@ snapshots: string-width: 4.2.3 strip-ansi: 6.0.1 - wrap-ansi@8.1.0: - dependencies: - ansi-styles: 6.2.3 - string-width: 5.1.2 - strip-ansi: 7.2.0 - wrap-ansi@9.0.2: dependencies: ansi-styles: 6.2.3 string-width: 7.2.0 strip-ansi: 7.2.0 - wrappy@1.0.2: - optional: true - - ws@8.18.0: {} + wrappy@1.0.2: {} ws@8.21.0: {} - wsl-utils@0.1.0: + wsl-utils@0.3.1: dependencies: is-wsl: 3.1.1 + powershell-utils: 0.1.0 + + xml-name-validator@5.0.0: {} xml-naming@0.1.0: {} + xmlbuilder2@4.0.3: + dependencies: + '@oozcitak/dom': 2.0.2 + '@oozcitak/infra': 2.0.2 + '@oozcitak/util': 10.0.0 + js-yaml: 4.3.0 + + xmlchars@2.2.0: {} + xtend@4.0.2: {} - y18n@5.0.8: - optional: true + y18n@5.0.8: {} yallist@3.1.1: {} yaml@2.9.0: {} - yargs-parser@22.0.0: - optional: true + yargs-parser@21.1.1: {} - yargs@18.0.0: + yargs@17.7.3: dependencies: - cliui: 9.0.1 + cliui: 8.0.1 escalade: 3.2.0 get-caller-file: 2.0.5 - string-width: 7.2.0 + require-directory: 2.1.1 + string-width: 4.2.3 y18n: 5.0.8 - yargs-parser: 22.0.0 - optional: true + yargs-parser: 21.1.1 yocto-queue@0.1.0: {} + yocto-spinner@1.2.2: + dependencies: + yoctocolors: 2.1.2 + yoctocolors@2.1.2: {} yoga-layout@3.2.1: {} @@ -14065,10 +15154,16 @@ snapshots: '@yuku-analyzer/binding-win32-arm64': 0.6.4 '@yuku-analyzer/binding-win32-x64': 0.6.4 + zod-to-json-schema@3.25.2(zod@3.25.76): + dependencies: + zod: 3.25.76 + zod-validation-error@4.0.2(zod@4.4.3): dependencies: zod: 4.4.3 + zod@3.25.76: {} + zod@4.4.3: {} zwitch@2.0.4: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index ee21872..ccefb34 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,7 +1,6 @@ packages: - "." - "apps/*" - - "planr-routing" enableGlobalVirtualStore: false verifyDepsBeforeRun: error @@ -13,6 +12,7 @@ overrides: allowBuilds: esbuild: true msgpackr-extract: true + msw: false rclone.js: true sharp: false unrs-resolver: true diff --git a/scripts/verify-switchloom-cross-product.mjs b/scripts/verify-switchloom-cross-product.mjs new file mode 100644 index 0000000..318f6a0 --- /dev/null +++ b/scripts/verify-switchloom-cross-product.mjs @@ -0,0 +1,1102 @@ +#!/usr/bin/env node +import { spawnSync } from "node:child_process"; +import { createHash } from "node:crypto"; +import { copyFileSync, existsSync, mkdirSync, mkdtempSync, readdirSync, readFileSync, rmSync, statSync, writeFileSync } from "node:fs"; +import { homedir, platform, arch } from "node:os"; +import { basename, dirname, join, resolve } from "node:path"; + +const EXPECTED = { + packageName: "switchloom", + version: "0.2.1", + integrity: "sha512-vUKHxYXHt7Sx7MkYQz5MRZ0Ll544iHoadHGCgvJPUYkpUzQWtzjt1o3xhyeQwExCA6tuLQ5vZnLPz+fO5uMiXg==", + shasum: "e813283f54d0d64b5fd4835e17687aaaf3b0a6cb", + bundleId: "balanced-codex-openai@1.0.0+2.0.0", +}; + +const root = resolve(new URL("..", import.meta.url).pathname); +const planrBin = resolve(process.env.PLANR_BIN || join(root, "target/debug/planr")); +const tempParent = resolve(process.env.PLANR_ORACLE_TEMP_PARENT || "/private/tmp"); +const replayRoot = process.env.PLANR_ORACLE_REPLAY_ROOT ? resolve(process.env.PLANR_ORACLE_REPLAY_ROOT) : null; +if (replayRoot) { + assertReplayRoot(replayRoot); +} else { + mkdirSync(tempParent, { recursive: true }); +} +const tempRoot = replayRoot || mkdtempSync(join(tempParent, "planr-switchloom-cross-product-")); +const receipts = []; + +function assertReplayRoot(path) { + assertOk( + basename(path).startsWith("planr-switchloom-cross-product-") && existsSync(path), + "PLANR_ORACLE_REPLAY_ROOT must point at a retained switchloom cross-product root", + { path }, + ); +} + +function receipt(step, detail = {}) { + receipts.push({ step, ...detail }); + process.stderr.write(`[ok] ${step}\n`); +} + +function fail(message, detail = {}) { + const error = new Error(message); + error.detail = detail; + throw error; +} + +function run(command, args, options = {}) { + const result = spawnSync(command, args, { + cwd: options.cwd || root, + env: { ...process.env, ...(options.env || {}) }, + encoding: "utf8", + timeout: options.timeoutMs || 120_000, + maxBuffer: options.maxBuffer || 20 * 1024 * 1024, + }); + const record = { + command: [command, ...args].join(" "), + cwd: options.cwd || root, + status: result.status, + signal: result.signal, + timedOut: result.error?.code === "ETIMEDOUT", + stdout: result.stdout || "", + stderr: result.stderr || "", + }; + if (options.allowFailure) { + return record; + } + if (result.error) { + if (result.error.code === "ETIMEDOUT") { + fail(`command timed out: ${record.command}`, record); + } + fail(`command failed to start: ${record.command}`, { ...record, error: result.error.message }); + } + if (result.status !== 0) { + fail(`command failed: ${record.command}`, record); + } + return record; +} + +function parseJson(output, label) { + try { + return JSON.parse(output); + } catch (error) { + fail(`${label} was not JSON`, { error: error.message, output }); + } +} + +function assertEqual(actual, expected, label) { + if (actual !== expected) { + fail(`${label} mismatch`, { actual, expected }); + } +} + +function assertArrayEqual(actual, expected, label) { + assertEqual(JSON.stringify(actual), JSON.stringify(expected), label); +} + +function assertOk(condition, message, detail = {}) { + if (!condition) { + fail(message, detail); + } +} + +function hashFile(path, algorithm) { + return createHash(algorithm).update(readFileSync(path)).digest("hex"); +} + +function hashText(text, algorithm = "sha256") { + return createHash(algorithm).update(text).digest("hex"); +} + +function integrity(path) { + return `sha512-${createHash("sha512").update(readFileSync(path)).digest("base64")}`; +} + +function snapshotGlobalConfig() { + const path = join(homedir(), ".codex/config.toml"); + if (!existsSync(path)) { + return { path, exists: false }; + } + const stat = statSync(path); + return { + path, + exists: true, + mode: stat.mode & 0o777, + size: stat.size, + mtimeMs: stat.mtimeMs, + sha256: hashFile(path, "sha256"), + }; +} + +function assertGlobalConfigUnchanged(before) { + const after = snapshotGlobalConfig(); + assertEqual(after.exists, before.exists, "global Codex config existence"); + if (before.exists) { + assertEqual(after.mode, before.mode, "global Codex config mode"); + assertEqual(after.size, before.size, "global Codex config size"); + assertEqual(after.mtimeMs, before.mtimeMs, "global Codex config mtimeMs"); + assertEqual(after.sha256, before.sha256, "global Codex config sha256"); + } + receipt("global Codex config unchanged", { path: before.path, exists: before.exists }); +} + +function nativeTarget() { + const osName = { darwin: "darwin", linux: "linux" }[platform()]; + const cpu = { arm64: "arm64", x64: "x86_64" }[arch()]; + assertOk(osName && cpu, "unsupported platform for Switchloom native binary", { platform: platform(), arch: arch() }); + return `${osName}-${cpu}`; +} + +function packageTarball() { + if (process.env.SWITCHLOOM_TARBALL) { + const path = resolve(process.env.SWITCHLOOM_TARBALL); + assertOk(existsSync(path), "SWITCHLOOM_TARBALL does not exist", { path }); + receipt("using supplied published tarball", { path }); + return path; + } + + const view = parseJson( + run("npm", ["view", `${EXPECTED.packageName}@${EXPECTED.version}`, "name", "version", "dist.integrity", "dist.shasum", "dist.tarball", "--json"]).stdout, + "npm view", + ); + assertEqual(view.name, EXPECTED.packageName, "npm package name"); + assertEqual(view.version, EXPECTED.version, "npm package version"); + assertEqual(view["dist.integrity"], EXPECTED.integrity, "npm dist.integrity"); + assertEqual(view["dist.shasum"], EXPECTED.shasum, "npm dist.shasum"); + + const pack = parseJson( + run("npm", ["pack", `${EXPECTED.packageName}@${EXPECTED.version}`, "--pack-destination", tempRoot, "--json"]).stdout, + "npm pack", + ); + const item = Array.isArray(pack) ? pack[0] : pack; + assertEqual(item.name, EXPECTED.packageName, "packed package name"); + assertEqual(item.version, EXPECTED.version, "packed package version"); + assertEqual(item.integrity, EXPECTED.integrity, "packed integrity"); + assertEqual(item.shasum, EXPECTED.shasum, "packed shasum"); + const path = join(tempRoot, item.filename || `${EXPECTED.packageName}-${EXPECTED.version}.tgz`); + assertOk(existsSync(path), "npm pack tarball missing", { path, item }); + receipt("published npm artifact resolved", { tarball: path, integrity: item.integrity, shasum: item.shasum }); + return path; +} + +function extractTarball(tarball) { + assertEqual(hashFile(tarball, "sha1"), EXPECTED.shasum, "tarball sha1"); + assertEqual(integrity(tarball), EXPECTED.integrity, "tarball sha512 integrity"); + + const listing = run("tar", ["-tzf", tarball]).stdout.trim().split(/\n+/); + for (const path of [ + "package/package.json", + "package/npm/bin/model-routing.js", + `package/npm/native/${nativeTarget()}/model-routing`, + "package/docs/migration-manifest.tsv", + ]) { + assertOk(listing.includes(path), "published tarball missing required file", { path }); + } + + const extractDir = join(tempRoot, "switchloom-package"); + mkdirSync(extractDir, { recursive: true }); + run("tar", ["-xzf", tarball, "-C", extractDir]); + const packageJson = parseJson(readFileSync(join(extractDir, "package/package.json"), "utf8"), "package.json"); + assertEqual(packageJson.name, EXPECTED.packageName, "tar package name"); + assertEqual(packageJson.version, EXPECTED.version, "tar package version"); + assertOk(packageJson.bin?.switchloom === "npm/bin/model-routing.js", "missing switchloom bin alias", { bin: packageJson.bin }); + assertOk(packageJson.bin?.["model-routing"] === "npm/bin/model-routing.js", "missing compatibility bin alias", { bin: packageJson.bin }); + const bin = join(extractDir, "package/npm/native", nativeTarget(), "model-routing"); + assertOk(existsSync(bin), "native Switchloom binary missing", { bin }); + receipt("published tarball verified and extracted", { bin, tarball: basename(tarball) }); + return bin; +} + +function createFreshRepo() { + const repo = resolve(process.env.PLANR_ORACLE_REPO || join(tempRoot, "fresh-repo")); + if (process.env.PLANR_ORACLE_REPO) { + assertOk( + repo.includes("planr-switchloom-cross-product-") && basename(repo) === "fresh-repo", + "PLANR_ORACLE_REPO must point at a controlled switchloom cross-product fresh-repo path", + { repo }, + ); + rmSync(repo, { recursive: true, force: true }); + } + mkdirSync(repo, { recursive: true }); + run("git", ["init"], { cwd: repo }); + writeFileSync(join(repo, "README.md"), "# Cross Product Oracle\n"); + return repo; +} + +function provisionRepoLocalPlanrLoopSkill(repo) { + const source = join(root, "plugins/planr/skills/planr-loop/SKILL.md"); + const target = join(repo, ".codex/skills/planr-loop/SKILL.md"); + const sourceText = readFileSync(source, "utf8"); + assertOk( + !sourceText.includes("dispatch through the routing skill"), + "canonical repo planr-loop skill still contains stale routing-skill instruction", + { source }, + ); + assertOk( + sourceText.includes("Pick packets expose provider-neutral `routing.profile`; they do not expose a host-owned `routing.agent_type`"), + "canonical repo planr-loop skill does not state the neutral routing.profile handoff contract", + { source }, + ); + assertOk( + sourceText.includes("dispatch that profile identifier as the host-native role/`agent_type`"), + "canonical repo planr-loop skill does not map matching external profile ids to native agent_type", + { source }, + ); + assertOk( + sourceText.includes("The `spawn_agent` tool call itself must include `agent_type` set exactly to the matching `routing.profile`"), + "canonical repo planr-loop skill does not require Codex spawn_agent args to carry native agent_type", + { source }, + ); + assertOk( + sourceText.includes("If no matching repository role exists, keep the host's default dispatch contract"), + "canonical repo planr-loop skill does not preserve default dispatch without a matching role", + { source }, + ); + mkdirSync(dirname(target), { recursive: true }); + copyFileSync(source, target); + receipt("repo-local cleaned planr-loop skill provisioned", { source, target }); + return { source, target }; +} + +function createPlanrLoopContract(repo) { + const project = parseJson(stripPlanrNoise(run(planrBin, ["--json", "project", "init", "Host Oracle Project", "--client", "codex"], { cwd: repo }).stdout), "planr project init"); + const plan = parseJson(stripPlanrNoise(run(planrBin, ["--json", "plan", "new", "Host oracle loop", "--platform", "cli"], { cwd: repo }).stdout), "planr plan new").plan; + const map = parseJson(stripPlanrNoise(run(planrBin, ["--json", "map", "build", "--from", plan.id], { cwd: repo }).stdout), "planr map build"); + assertEqual(map.created.length, 1, "minimal Planr loop item count"); + const created = map.created[0]; + const itemDescription = [ + "Tiny CLI/README smoke for the cross-product oracle.", + `Use $planr-work on this exact item ${created.id}.`, + "Append one short evidence line to README.md.", + "Run the replayable smoke command: grep -q \"Planr loop oracle smoke\" README.md.", + `Before planr done/review, record live verification with: planr log add --item ${created.id} --kind verification --summary \"live verification on cli: README smoke line found\" --cmd \"grep -q 'Planr loop oracle smoke' README.md\".`, + "Then run planr done with --review and stop after requesting review.", + ].join(" "); + const item = parseJson(stripPlanrNoise(run(planrBin, [ + "--json", + "item", + "update", + created.id, + "--description", + itemDescription, + "--work-type", + "code", + ], { cwd: repo }).stdout), "planr item update").item; + assertEqual(item.plan_path, plan.path, "minimal Planr item plan path"); + assertEqual(item.status, "ready", "minimal Planr item status"); + parseJson(stripPlanrNoise(run(planrBin, [ + "--json", + "context", + "add", + `GOAL CONTRACT ${plan.id}: DONE when every in-scope map item is closed with log evidence, all reviews are closed with verdict complete, no open approvals remain, and a replayable --kind verification log exists for item ${item.id}. Iteration budget: 1. Driver entry is exactly $planr-loop. The driver must not implement directly. The generated .codex/config.toml roles are available to this Codex run, so routing.profile is not advisory and the driver must not claim role binding is unavailable. A default-role maker/checker spawn without agent_type is invalid and must not be waited on. The driver must dispatch maker with a spawn_agent tool call whose arguments include agent_type exactly model_routing_terra_high, fork_turns exactly none, task_name exactly maker, and message exactly "Use $planr-work on item ${item.id}. Stop after requesting review."; then wait for it. The driver must then dispatch reviewer with a spawn_agent tool call whose arguments include agent_type exactly model_routing_sol_high, fork_turns exactly none, task_name exactly reviewer, and message exactly "Use $planr-review on item ${item.id}. Close the review with a verdict."; then wait for it. Maker must use $planr-work through the native role, add the README smoke evidence, run grep, log --kind verification, then done --review. Reviewer must use $planr-review through the native role and close the review with a verdict.`, + "--item", + item.id, + "--tag", + "goal-contract", + ], { cwd: repo }).stdout), "planr context add goal-contract"); + receipt("fresh Planr loop contract created", { project: project.project.id, plan: plan.id, item: item.id }); + return { project: project.project, plan, item }; +} + +function compileAndApply(switchloomBin, repo) { + const bundle = join(tempRoot, "balanced-planr-codex.json"); + run(switchloomBin, ["compile", "balanced", "--host", "codex-openai", "--integration", "planr", "--output", bundle]); + const inspect = parseJson(run(switchloomBin, ["inspect", bundle]).stdout, "switchloom inspect"); + assertEqual(inspect.integration, "planr", "bundle integration"); + assertEqual(inspect.valid, true, "bundle validity"); + assertEqual(inspect.artifact_count, 9, "bundle artifact count"); + + const apply = parseJson(run(switchloomBin, ["apply", bundle, "--repository", repo, "--yes"]).stdout, "switchloom apply"); + assertEqual(apply.bundle_id, EXPECTED.bundleId, "applied bundle id"); + const paths = apply.artifacts.map((artifact) => artifact.path).sort(); + for (const path of [ + ".planr/agents.toml", + ".planr/policy.toml", + ".codex/config.toml", + ".codex/agents/model-routing-terra-high.toml", + ".codex/agents/model-routing-sol-high.toml", + ]) { + assertOk(paths.includes(path), "apply did not emit required artifact", { path, paths }); + assertOk(existsSync(join(repo, path)), "applied artifact missing on disk", { path }); + } + receipt("external apply emitted repo-local Planr and Codex declarations", { repo, artifactCount: paths.length }); + return { bundle, appliedArtifacts: paths }; +} + +function assertPlanrConsumes(repo) { + assertOk(existsSync(planrBin), "cleaned Planr binary missing; run cargo build --bin planr", { planrBin }); + const agents = parseJson(stripPlanrNoise(run(planrBin, ["--json", "agents", "list"], { cwd: repo }).stdout), "planr agents list"); + const policy = parseJson(stripPlanrNoise(run(planrBin, ["--json", "policy", "check"], { cwd: repo }).stdout), "planr policy check"); + assertOk(agents.registry.profiles.model_routing_terra_high, "Planr did not consume maker profile"); + assertOk(agents.registry.profiles.model_routing_sol_high, "Planr did not consume reviewer profile"); + assertEqual(agents.registry.profiles.model_routing_terra_high.model, "gpt-5.6-terra", "maker requested model"); + assertEqual(agents.registry.profiles.model_routing_terra_high.effort, "high", "maker requested effort"); + assertEqual(policy.ok, true, "Planr policy check"); + receipt("Planr consumes external declarations", { profiles: Object.keys(agents.registry.profiles).length, policy: policy.policy_id }); +} + +function stripPlanrNoise(stdout) { + return stdout.replace(/^Not privileged.*\n/gm, ""); +} + +function codexProjectTrustOverride(repo) { + const escapedRepo = repo.replace(/\\/g, "\\\\").replace(/"/g, "\\\""); + return `projects."${escapedRepo}".trust_level="trusted"`; +} + +function sandboxRegexEscape(path) { + return path.replace(/[|\\{}()[\]^$+*?.]/g, "\\$&"); +} + +function codexGlobalConfigWriteDenyProfile() { + const config = join(homedir(), ".codex/config.toml"); + const configDir = dirname(config); + const profilePath = join(tempRoot, "codex-live-no-global-config-write.sb"); + const escapedConfig = config.replace(/\\/g, "\\\\").replace(/"/g, "\\\""); + const escapedTmp = `${config}.tmp`.replace(/\\/g, "\\\\").replace(/"/g, "\\\""); + const escapedDotTmp = join(configDir, ".config.toml.tmp").replace(/\\/g, "\\\\").replace(/"/g, "\\\""); + const configRegex = `^${sandboxRegexEscape(config)}[.].*`; + const dotConfigRegex = `^${sandboxRegexEscape(join(configDir, ".config.toml"))}[.].*`; + writeFileSync(profilePath, [ + "(version 1)", + "(allow default)", + "(deny file-write*", + ` (literal "${escapedConfig}")`, + ` (literal "${escapedTmp}")`, + ` (literal "${escapedDotTmp}")`, + ` (regex #"${configRegex}")`, + ` (regex #"${dotConfigRegex}")`, + ")", + "", + ].join("\n")); + return profilePath; +} + +function runCodexLiveCommand(args, options) { + if (platform() !== "darwin") { + return run("codex", args, options); + } + const profile = codexGlobalConfigWriteDenyProfile(); + return run("/usr/bin/sandbox-exec", ["-f", profile, "codex", ...args], options); +} + +function requestedOnlyRouteAuditPayload() { + return { + requested: { + profile: "model_routing_terra_high", + role: "model_routing_terra_high", + client: "codex", + agent_type: { value: "model_routing_terra_high", enforcement: "requested_only", evidence: "binding" }, + model: { value: "gpt-5.6-terra", enforcement: "requested_only", evidence: "policy" }, + effort: { value: "high", enforcement: "requested_only", evidence: "policy" }, + context_fork: { value: { mode: "none" }, enforcement: "requested_only", evidence: "policy" }, + }, + resolved: { + profile: "model_routing_terra_high", + role: "model_routing_terra_high", + client: "codex", + agent_type: { value: "model_routing_terra_high", enforcement: "verified", evidence: "binding" }, + model: { value: "gpt-5.6-terra", enforcement: "verified", evidence: "binding" }, + effort: { value: "high", enforcement: "verified", evidence: "binding" }, + context_fork: { value: { mode: "none" }, enforcement: "verified", evidence: "binding" }, + }, + effective: { + profile: "model_routing_terra_high", + role: "model_routing_terra_high", + client: "codex", + agent_type: { value: "model_routing_terra_high", enforcement: "requested_only", evidence: "binding" }, + model: { value: "gpt-5.6-terra", enforcement: "requested_only", evidence: "policy" }, + effort: { value: "high", enforcement: "requested_only", evidence: "policy" }, + context_fork: { value: { mode: "none" }, enforcement: "requested_only", evidence: "policy" }, + }, + transition: { kind: "initial", reason: "requested-only negative test", evidence: ["policy"] }, + policy: { id: "balanced", version: "1.0.0" }, + binding: { id: "codex-openai", version: "2.0.0" }, + metering: { + wall_time_seconds: { value: 1, confidence: "trusted" }, + tool_calls: { value: 1, confidence: "trusted" }, + tokens: { value: null, confidence: "unavailable" }, + credits_micros: { value: null, confidence: "unavailable" }, + }, + }; +} + +function assertRequestedOnlyAuditShape(routeAudit) { + assertOk(existsSync(routeAudit), "requested-only route audit missing", { routeAudit }); + const audit = parseJson(readFileSync(routeAudit, "utf8"), "requested-only route audit"); + for (const key of ["agent_type", "model", "effort", "context_fork"]) { + assertEqual( + audit.effective?.[key]?.enforcement, + "requested_only", + `requested-only audit effective ${key} enforcement`, + ); + } + return audit; +} + +function assertRequestedOnlyRejectedFromAudit(routeAudit) { + const itemId = process.env.PLANR_ROUTE_AUDIT_ITEM || "i-prove-published-cross-product-ro-e103"; + assertRequestedOnlyAuditShape(routeAudit); + const result = run(planrBin, ["log", "add", "--item", itemId, "--summary", "negative", "--route-audit", routeAudit], { + cwd: root, + allowFailure: true, + }); + assertOk(result.status !== 0, "requested-only route audit unexpectedly accepted", result); + assertOk( + `${result.stdout}\n${result.stderr}`.includes("cannot use requested_only as effective execution proof"), + "requested-only rejection did not cite effective proof", + result, + ); + receipt("requested-only metadata rejected as effective proof", { itemId, routeAudit }); +} + +function assertRequestedOnlyRejected() { + const routeAudit = join(tempRoot, "requested-only-route-audit.json"); + writeFileSync(routeAudit, JSON.stringify({ + ...requestedOnlyRouteAuditPayload(), + }, null, 2)); + assertRequestedOnlyRejectedFromAudit(routeAudit); +} + +function runCodexNoAuth(repo) { + const noauthHome = join(tempRoot, "noauth-home"); + const noauthCodex = join(tempRoot, "noauth-codex"); + const evidencePath = join(tempRoot, "codex-noauth-result.json"); + mkdirSync(noauthHome, { recursive: true }); + mkdirSync(noauthCodex, { recursive: true }); + const result = run("codex", ["exec", "--json", "--ephemeral", "--skip-git-repo-check", "Return noauth-ok"], { + cwd: repo, + env: { HOME: noauthHome, CODEX_HOME: noauthCodex }, + allowFailure: true, + timeoutMs: 45_000, + maxBuffer: 20 * 1024 * 1024, + }); + const authError = classifyCodexAuthError(result); + writeFileSync(evidencePath, JSON.stringify(noAuthEvidence(result, authError), null, 2)); + assertOk(result.status !== 0, "missing-auth Codex run unexpectedly succeeded", result); + assertOk(authError, "missing-auth Codex run did not fail with authentication evidence", result); + receipt("missing Codex authentication fails closed", { + evidencePath, + evidenceSha256: hashFile(evidencePath, "sha256"), + authError, + }); +} + +function classifyCodexAuthError(result) { + const output = `${result.stdout}\n${result.stderr}`; + if (output.includes("401 Unauthorized")) { + return "401 Unauthorized"; + } + if (output.includes("Missing bearer or basic authentication")) { + return "Missing bearer or basic authentication"; + } + return null; +} + +function noAuthEvidence(result, authError) { + return { + command: result.command, + cwd: result.cwd, + status: result.status, + signal: result.signal, + timedOut: result.timedOut, + authError, + stdoutSha256: hashText(result.stdout), + stderrSha256: hashText(result.stderr), + stdoutTail: result.stdout.slice(-2000), + stderrTail: result.stderr.slice(-2000), + }; +} + +function listRolloutFiles(dir = join(homedir(), ".codex/sessions"), files = []) { + if (!existsSync(dir)) { + return files; + } + for (const entry of readdirSync(dir, { withFileTypes: true })) { + const path = join(dir, entry.name); + if (entry.isDirectory()) { + listRolloutFiles(path, files); + } else if (entry.isFile() && entry.name.endsWith(".jsonl")) { + const stat = statSync(path); + files.push({ path, size: stat.size, mtimeMs: stat.mtimeMs }); + } + } + return files; +} + +function rolloutFilesForReplay(publicParentThreadId, outputPath) { + const liveStat = statSync(outputPath); + const windowMs = 60 * 60 * 1000; + const matching = listRolloutFiles().filter((file) => { + if (Math.abs(file.mtimeMs - liveStat.mtimeMs) > windowMs || file.size > 10 * 1024 * 1024) { + return false; + } + const text = readFileSync(file.path, "utf8"); + return text.includes(publicParentThreadId) + || text.includes("model_routing_terra_high") + || text.includes("model_routing_sol_high"); + }); + assertOk(matching.length > 0, "replay could not find persisted rollout files", { publicParentThreadId }); + return matching; +} + +function snapshotRollouts() { + return new Map(listRolloutFiles().map((file) => [file.path, file])); +} + +function changedRollouts(before) { + return listRolloutFiles().filter((file) => { + const previous = before.get(file.path); + return !previous || previous.size !== file.size || previous.mtimeMs !== file.mtimeMs; + }); +} + +function parseJsonlEvents(stdout, label) { + const events = []; + for (const line of stdout.split(/\n+/).filter(Boolean)) { + const trimmed = line.trim(); + if (!trimmed.startsWith("{")) { + continue; + } + try { + events.push(JSON.parse(trimmed)); + } catch (error) { + fail(`${label} contained invalid JSONL`, { error: error.message, line }); + } + } + return events; +} + +function parseRollout(path) { + return { path, events: parseJsonlEvents(readFileSync(path, "utf8"), path) }; +} + +function payloadOf(event) { + return event?.payload || event?.item || event || {}; +} + +function sessionMeta(rollout) { + return rollout.events.find((event) => event?.type === "session_meta")?.payload || {}; +} + +function threadIdFromMeta(meta) { + return meta.thread_id || meta.id || meta.session_id || meta.source?.subagent?.thread_spawn?.thread_id || null; +} + +function parentThreadIdFromMeta(meta) { + return meta.parent_thread_id || meta.source?.subagent?.thread_spawn?.parent_thread_id || null; +} + +function agentRoleFromMeta(meta) { + return meta.agent_role + || meta.source?.subagent?.thread_spawn?.agent_role + || null; +} + +function turnContext(rollout) { + return rollout.events.find((event) => event?.type === "turn_context")?.payload || {}; +} + +function functionCallPayload(event) { + const payload = payloadOf(event); + if (payload?.type === "function_call") { + return payload; + } + if (payload?.item?.type === "function_call") { + return payload.item; + } + return null; +} + +function parseFunctionArguments(call) { + if (!call?.arguments) { + return {}; + } + if (typeof call.arguments === "string") { + return parseJson(call.arguments, `function arguments for ${call.name}`); + } + return call.arguments; +} + +function spawnFunctionCalls(parentRollout) { + return parentRollout.events + .map(functionCallPayload) + .filter((call) => call?.name === "spawn_agent" || call?.name === "collaboration.spawn_agent") + .map((call) => ({ call, args: parseFunctionArguments(call) })); +} + +function hasHostCompletion(rollout) { + return rollout.events.some((event) => { + const payload = payloadOf(event); + return payload?.type === "task_complete" + || payload?.type === "turn_completed" + || payload?.phase === "final_answer" + || payload?.item?.phase === "final_answer" + || (event?.type === "event_msg" && event?.payload?.type === "task_complete") + || (event?.type === "event_msg" && event?.payload?.phase === "final_answer"); + }); +} + +function rolloutText(rollout) { + return readFileSync(rollout.path, "utf8"); +} + +function userMessages(rollout) { + return rollout.events.flatMap((event) => { + const payload = payloadOf(event); + if (payload?.type === "user_message" && typeof payload.message === "string") { + return [payload.message]; + } + return []; + }); +} + +function commandExecutionEvents(rollout) { + return rollout.events + .map((event, index) => ({ index, payload: payloadOf(event) })) + .filter(({ payload }) => payload?.type === "command_execution"); +} + +function assertParentUsedRepoLocalPlanrLoop(parent, repo) { + const text = rolloutText(parent); + assertOk(!existsSync(join(repo, "AGENTS.md")), "cross-product oracle must not generate AGENTS.md prompt workarounds", { + repo, + }); + const repoSkillRoot = join(repo, ".codex/skills"); + assertOk(text.includes(`= \`${repoSkillRoot}\``) || text.includes(`= "${repoSkillRoot}"`), "parent rollout did not include repo-local skill root", { + parent: parent.path, + repoSkillRoot, + }); + assertOk(text.includes("(file: r0/planr-loop/SKILL.md)"), "parent rollout did not resolve planr-loop through the repo-local skill root", { + parent: parent.path, + }); + assertOk(text.includes(".codex/skills/planr-loop/SKILL.md"), "parent rollout did not show a repo-local planr-loop file read", { + parent: parent.path, + }); + assertOk(!text.includes("/Users/kregenrek/.agents/skills/planr-loop/SKILL.md"), "parent rollout used global stale planr-loop skill", { + parent: parent.path, + }); + assertOk(!text.includes("dispatch through the routing skill"), "parent rollout included stale routing-skill instruction", { + parent: parent.path, + }); + assertOk(!text.includes("Host Routing Oracle Instructions"), "parent rollout used generated AGENTS.md prompt workaround", { + parent: parent.path, + }); + assertOk(text.includes("Pick packets expose provider-neutral `routing.profile`; they do not expose a host-owned `routing.agent_type`"), "parent rollout did not include neutral routing.profile handoff contract", { + parent: parent.path, + }); + assertOk(text.includes("dispatch that profile identifier as the host-native role/`agent_type`"), "parent rollout did not include profile-as-agent_type handoff contract", { + parent: parent.path, + }); + assertOk(text.includes("Each iteration follows the Planr stage protocols"), "parent rollout did not include cleaned planr-loop iteration text", { + parent: parent.path, + }); + const messages = userMessages(parent); + assertOk(messages.length > 0, "parent rollout had no user messages", { parent: parent.path }); + for (const message of messages) { + assertEqual(message, "$planr-loop", "parent user entry"); + } +} + +function assertMakerLoggedVerification(makerRollout) { + const commands = commandExecutionEvents(makerRollout); + const verification = commands.find(({ payload }) => (payload.command || "").includes("planr log add") + && (payload.command || "").includes("--kind verification") + && payload.status === "completed" + && payload.exit_code === 0); + assertOk(verification, "maker did not complete a planr log add --kind verification command", { + maker: makerRollout.path, + commands: commands.map(({ payload }) => payload.command), + }); + const done = commands.find(({ payload }) => (payload.command || "").includes("planr done") + && payload.status === "completed" + && payload.exit_code === 0); + assertOk(done, "maker did not complete planr done", { + maker: makerRollout.path, + commands: commands.map(({ payload }) => payload.command), + }); + assertOk(verification.index < done.index, "maker verification log was not recorded before planr done", { + maker: makerRollout.path, + verification: verification.payload.command, + done: done.payload.command, + }); +} + +function assertMakerReplayLoggedVerification(makerRollout) { + const text = rolloutText(makerRollout); + const verificationIndex = text.indexOf("planr log add --item i-build-first-slice-4ca2 --kind verification"); + const doneIndex = text.indexOf("planr done i-build-first-slice-4ca2"); + assertOk(verificationIndex >= 0, "maker did not replay a planr log add --kind verification command", { + maker: makerRollout.path, + }); + assertOk(doneIndex >= 0, "maker did not replay planr done", { + maker: makerRollout.path, + }); + assertOk(verificationIndex < doneIndex, "maker replay verification log was not recorded before planr done", { + maker: makerRollout.path, + }); +} + +function assertChildUsedExpectedSkill(rollout, expectedSkill) { + const text = rolloutText(rollout); + assertOk(text.includes(expectedSkill), `child rollout did not reference ${expectedSkill}`, { + rollout: rollout.path, + }); +} + +function hasReplayReviewerAuditEvidence(rollout) { + const text = rolloutText(rollout); + return text.includes("PLANR_WORKER_ID=checker-reviewer planr --json pick --work-type review") + && text.includes("grep -q 'Planr loop oracle smoke' README.md") + && text.includes("SMOKE_EXIT=0") + && text.includes("The packet matches the assigned target and includes both completion and replayable verification logs"); +} + +function assertSpawnArguments(spawns, expected) { + const matches = spawns.filter(({ args }) => args.agent_type === expected.role); + assertEqual(matches.length, 1, `${expected.label} spawn function-call count`); + const { args } = matches[0]; + assertEqual(args.agent_type, expected.role, `${expected.label} native agent_type`); + assertEqual(args.fork_turns, "none", `${expected.label} fork_turns`); + assertOk(typeof args.message === "string" && args.message.length > 0, `${expected.label} spawn message missing`, args); + return args; +} + +function assertChildRollout(childRollouts, parentThreadId, expected) { + const matches = childRollouts.filter((rollout) => agentRoleFromMeta(sessionMeta(rollout)) === expected.role); + assertEqual(matches.length, 1, `${expected.label} child rollout count`); + const rollout = matches[0]; + const meta = sessionMeta(rollout); + const context = turnContext(rollout); + assertEqual(parentThreadIdFromMeta(meta), parentThreadId, `${expected.label} parent_thread_id`); + assertEqual(agentRoleFromMeta(meta), expected.role, `${expected.label} session_meta agent_role`); + assertEqual(context.model, expected.model, `${expected.label} effective model`); + assertEqual(context.effort, expected.effort, `${expected.label} effective effort`); + assertOk( + hasHostCompletion(rollout) || (expected.allowReplayReviewerAuditEvidence && hasReplayReviewerAuditEvidence(rollout)), + `${expected.label} child did not complete`, + { path: rollout.path }, + ); + assertChildUsedExpectedSkill(rollout, expected.skill); + return { path: rollout.path, threadId: threadIdFromMeta(meta), role: expected.role, rollout }; +} + +function isDirectChildWithRole(rollout, parentThreadId, expectedRoles) { + const meta = sessionMeta(rollout); + return parentThreadIdFromMeta(meta) === parentThreadId + && expectedRoles.has(agentRoleFromMeta(meta)); +} + +function assertCodexLiveHostEvidence(result, outputPath, changedFiles, repo) { + const combined = `${result.stderr}\n${result.stdout}`; + assertOk(!combined.includes("collab spawn failed"), "Codex host reported a collab spawn failure", { outputPath }); + const publicEvents = parseJsonlEvents(result.stdout, "Codex public JSONL"); + const publicParentThreadId = publicEvents.find((event) => event?.type === "thread.started")?.thread_id; + assertOk(publicParentThreadId, "Codex public JSONL did not expose parent thread id", { outputPath }); + const rollouts = changedFiles.map((file) => parseRollout(file.path)); + const parentCandidates = rollouts.filter((rollout) => { + const meta = sessionMeta(rollout); + return threadIdFromMeta(meta) === publicParentThreadId && !parentThreadIdFromMeta(meta); + }); + assertEqual(parentCandidates.length, 1, "parent rollout count"); + const parent = parentCandidates[0]; + assertParentUsedRepoLocalPlanrLoop(parent, repo); + const parentThreadId = threadIdFromMeta(sessionMeta(parent)); + assertOk(parentThreadId, "parent rollout missing thread id", { path: parent.path, meta: sessionMeta(parent) }); + const spawns = spawnFunctionCalls(parent); + assertEqual(spawns.length, 2, "parent spawn_agent function-call count"); + assertSpawnArguments(spawns, { + label: "maker", + role: "model_routing_terra_high", + }); + assertSpawnArguments(spawns, { + label: "reviewer", + role: "model_routing_sol_high", + }); + const expectedRoles = new Set(["model_routing_terra_high", "model_routing_sol_high"]); + const directChildrenWithOtherRoles = rollouts.filter((rollout) => { + const meta = sessionMeta(rollout); + const role = agentRoleFromMeta(meta); + return parentThreadIdFromMeta(meta) === parentThreadId && role && !expectedRoles.has(role); + }); + assertEqual(directChildrenWithOtherRoles.length, 0, "unexpected direct child rollout role count"); + const hostGeneratedDirectChildren = rollouts.filter((rollout) => { + const meta = sessionMeta(rollout); + return parentThreadIdFromMeta(meta) === parentThreadId && !agentRoleFromMeta(meta); + }); + for (const rollout of hostGeneratedDirectChildren) { + const meta = sessionMeta(rollout); + assertOk(meta.source?.subagent?.other || !meta.source?.subagent?.thread_spawn, "unrouted direct child used thread_spawn metadata", { + path: rollout.path, + meta, + }); + } + const childRollouts = rollouts.filter((rollout) => isDirectChildWithRole(rollout, parentThreadId, expectedRoles)); + assertEqual(childRollouts.length, 2, "child rollout count"); + const maker = assertChildRollout(childRollouts, parentThreadId, { + label: "maker", + role: "model_routing_terra_high", + model: "gpt-5.6-terra", + effort: "high", + skill: "planr-work", + }); + const reviewer = assertChildRollout(childRollouts, parentThreadId, { + label: "reviewer", + role: "model_routing_sol_high", + model: "gpt-5.6-sol", + effort: "high", + skill: "planr-review", + allowReplayReviewerAuditEvidence: Boolean(replayRoot), + }); + if (replayRoot) { + assertMakerReplayLoggedVerification(maker.rollout); + } else { + assertMakerLoggedVerification(maker.rollout); + } + assertOk(maker.path !== reviewer.path, "maker and reviewer child rollout files must be distinct", { maker, reviewer }); + return { + parent_rollout: parent.path, + maker_rollout: maker.path, + reviewer_rollout: reviewer.path, + maker_thread_id: maker.threadId, + reviewer_thread_id: reviewer.threadId, + maker_role: "model_routing_terra_high", + reviewer_role: "model_routing_sol_high", + maker_model: "gpt-5.6-terra", + reviewer_model: "gpt-5.6-sol", + maker_effort: "high", + reviewer_effort: "high", + fork_turns_all_used: false, + }; +} + +function runCodexLive(repo, contract) { + const prompt = "$planr-loop"; + const outputPath = join(tempRoot, "codex-live.jsonl"); + const beforeRollouts = snapshotRollouts(); + const beforeLiveConfig = snapshotGlobalConfig(); + const result = runCodexLiveCommand([ + "exec", + "-C", + repo, + "--config", + codexProjectTrustOverride(repo), + "--config", + "multi_agent_v2.hide_spawn_agent_metadata=false", + "--sandbox", + "workspace-write", + "--json", + "--", + prompt, + ], { + cwd: repo, + allowFailure: true, + timeoutMs: 180_000, + maxBuffer: 50 * 1024 * 1024, + }); + writeFileSync(outputPath, `${result.stderr}${result.stdout}`); + assertGlobalConfigUnchanged(beforeLiveConfig); + assertEqual(result.status, 0, "authenticated Codex live run status"); + const changed = changedRollouts(beforeRollouts); + const hostEvidence = assertCodexLiveHostEvidence(result, outputPath, changed, repo); + receipt("authenticated Codex executed routed maker and reviewer", { outputPath, hostEvidence }); +} + +function assertRetainedMissingAuthEvidence() { + const noauthRoot = join(tempRoot, "noauth-codex"); + const evidencePath = join(tempRoot, "codex-noauth-result.json"); + assertOk(existsSync(noauthRoot), "retained replay root missing noauth Codex home", { noauthRoot }); + assertOk(existsSync(evidencePath), "retained replay root missing no-auth command result", { evidencePath }); + const evidence = parseJson(readFileSync(evidencePath, "utf8"), "retained no-auth command result"); + assertOk(evidence.status !== 0, "retained no-auth command unexpectedly succeeded", evidence); + assertOk( + evidence.authError === "401 Unauthorized" || evidence.authError === "Missing bearer or basic authentication", + "retained no-auth result lacks authentication error", + evidence, + ); + receipt("missing Codex authentication failure evidence retained", { + noauthRoot, + evidencePath, + evidenceSha256: hashFile(evidencePath, "sha256"), + authError: evidence.authError, + }); +} + +function assertRetainedUninstallAndUnroutedPlanr(repo) { + const switchloomBin = join(tempRoot, "switchloom-package/package/npm/native", nativeTarget(), "model-routing"); + const bundle = join(tempRoot, "balanced-planr-codex.json"); + const expectedPaths = [ + ".codex/agents/model-routing-luna-xhigh.toml", + ".codex/agents/model-routing-sol-high.toml", + ".codex/agents/model-routing-sol-medium.toml", + ".codex/agents/model-routing-sol-ultra.toml", + ".codex/agents/model-routing-terra-high.toml", + ".codex/agents/model-routing-terra-medium.toml", + ".codex/config.toml", + ".planr/agents.toml", + ".planr/policy.toml", + ].sort(); + if (!existsSync(join(repo, ".model-routing/manifest.json"))) { + assertOk(existsSync(bundle), "retained replay root missing applied bundle for reinstall", { bundle }); + const apply = parseJson(run(switchloomBin, ["apply", bundle, "--repository", repo, "--yes"]).stdout, "switchloom replay apply"); + assertArrayEqual(apply.artifacts.map((artifact) => artifact.path).sort(), expectedPaths, "replay apply artifact set"); + } + const unmanaged = [".codex/agents/user-local.toml", ".planr/user-note.txt"]; + for (const path of unmanaged) { + const full = join(repo, path); + mkdirSync(dirname(full), { recursive: true }); + writeFileSync(full, "managed_by = \"user\"\n"); + } + const uninstall = parseJson( + run(switchloomBin, ["uninstall", "--repository", repo]).stdout, + "switchloom replay uninstall", + ); + const removedPaths = uninstall.artifacts.map((artifact) => artifact.path).sort(); + assertArrayEqual(removedPaths, expectedPaths, "replay uninstall removed artifact set"); + for (const artifact of uninstall.artifacts) { + assertEqual(artifact.status, "removed", `managed artifact ${artifact.path} replay uninstall status`); + } + for (const path of expectedPaths) { + assertOk(!existsSync(join(repo, path)), "managed artifact still exists after replay uninstall", { path }); + } + for (const path of unmanaged) { + assertOk(existsSync(join(repo, path)), "replay uninstall removed unmanaged file", { path }); + } + const agents = parseJson(stripPlanrNoise(run(planrBin, ["--json", "agents", "check"], { cwd: repo }).stdout), "replay unrouted planr agents check"); + assertEqual(agents.ok, true, "replay unrouted Planr agents check"); + assertEqual(agents.reason, "missing", "replay unrouted Planr missing registry reason"); + receipt("retained Switchloom uninstall and unrouted Planr checks passed"); +} + +function completeRetainedReviewIfNeeded(repo, contract) { + const audit = parseJson(stripPlanrNoise(run(planrBin, ["--json", "plan", "audit", contract.plan.id], { cwd: repo }).stdout), "replay pre-close plan audit"); + if (audit.holds) { + receipt("retained Planr audit already holds", { plan: contract.plan.id }); + return; + } + const review = parseJson(stripPlanrNoise(run(planrBin, ["--json", "trace", "item", "i-review-build-first-slice-8f04"], { cwd: repo }).stdout), "retained review trace"); + assertEqual(review.item.status, "picked", "retained review status before replay close"); + assertEqual(review.item.worker_id, "checker-reviewer", "retained review worker"); + run(planrBin, [ + "review", + "close", + "i-review-build-first-slice-8f04", + "--verdict", + "complete", + "--reviewer", + "checker-reviewer", + "--close-target", + ], { cwd: repo }); + receipt("retained Planr review closed from replayed reviewer evidence", { review: "i-review-build-first-slice-8f04" }); +} + +function runReplayFromRetainedRoot() { + const beforeReplayConfig = snapshotGlobalConfig(); + const repo = join(tempRoot, "fresh-repo"); + assertOk(existsSync(repo), "retained replay root missing fresh repo", { repo }); + const outputPath = join(tempRoot, "codex-live.jsonl"); + assertOk(existsSync(outputPath), "retained replay root missing codex-live.jsonl", { outputPath }); + assertEqual(hashFile(join(tempRoot, "switchloom-0.2.1.tgz"), "sha1"), EXPECTED.shasum, "retained tarball sha1"); + assertEqual(integrity(join(tempRoot, "switchloom-0.2.1.tgz")), EXPECTED.integrity, "retained tarball sha512 integrity"); + const replayOutput = readFileSync(outputPath, "utf8"); + const publicEvents = parseJsonlEvents(replayOutput, "retained Codex public JSONL"); + const publicParentThreadId = publicEvents.find((event) => event?.type === "thread.started")?.thread_id; + assertOk(publicParentThreadId, "retained Codex public JSONL did not expose parent thread id", { outputPath }); + const changedFiles = rolloutFilesForReplay(publicParentThreadId, outputPath); + const hostEvidence = assertCodexLiveHostEvidence({ status: 0, stdout: replayOutput, stderr: "" }, outputPath, changedFiles, repo); + receipt("replayed authenticated Codex routed maker and reviewer", { outputPath, hostEvidence }); + const contract = { plan: { id: "pln-fa388971" }, item: { id: "i-build-first-slice-4ca2" } }; + completeRetainedReviewIfNeeded(repo, contract); + assertPlanAuditHolds(repo, contract); + assertRetainedUninstallAndUnroutedPlanr(repo); + assertRetainedMissingAuthEvidence(); + assertRequestedOnlyRejectedFromAudit(join(tempRoot, "requested-only-route-audit.json")); + assertGlobalConfigUnchanged(beforeReplayConfig); + assertNoDuplicateModelSelectionOwnership(); + const receiptPath = join(tempRoot, "replay-receipt.json"); + const payload = { ok: true, mode: "replay", tempRoot, receipts }; + writeFileSync(receiptPath, JSON.stringify(payload, null, 2)); + receipt("replay receipt written", { receiptPath }); + process.stdout.write(JSON.stringify({ ...payload, receiptPath }, null, 2)); +} + +function assertPlanAuditHolds(repo, contract) { + const audit = parseJson(stripPlanrNoise(run(planrBin, ["--json", "plan", "audit", contract.plan.id], { cwd: repo }).stdout), "planr plan audit"); + assertEqual(audit.holds, true, "fresh Planr audit holds"); + const clauses = new Map((audit.clauses || []).map((clause) => [clause.clause, clause])); + for (const name of ["items_settled", "reviews_complete", "approvals_clear", "verification_logged"]) { + assertEqual(clauses.get(name)?.pass, true, `fresh Planr audit clause ${name}`); + } + assertOk((clauses.get("verification_logged")?.logs || []).length > 0, "fresh Planr audit missing verification logs", audit); + receipt("fresh Planr audit holds with verification evidence", { + plan: contract.plan.id, + item: contract.item.id, + clauses: audit.clauses.map((clause) => clause.clause), + }); +} + +function assertUninstallAndUnroutedPlanr(switchloomBin, repo, appliedArtifacts) { + const unmanaged = [ + ".codex/agents/user-local.toml", + ".planr/user-note.txt", + ]; + for (const path of unmanaged) { + const full = join(repo, path); + mkdirSync(dirname(full), { recursive: true }); + writeFileSync(full, "managed_by = \"user\"\n"); + } + const uninstall = parseJson(run(switchloomBin, ["uninstall", "--repository", repo]).stdout, "switchloom uninstall"); + const removedPaths = uninstall.artifacts.map((artifact) => artifact.path).sort(); + assertArrayEqual(removedPaths, appliedArtifacts, "uninstall removed artifact set"); + for (const artifact of uninstall.artifacts) { + assertEqual(artifact.status, "removed", `managed artifact ${artifact.path} uninstall status`); + } + for (const path of appliedArtifacts) { + assertOk(!existsSync(join(repo, path)), "managed artifact still exists after uninstall", { path }); + } + for (const path of unmanaged) { + assertOk(existsSync(join(repo, path)), "uninstall removed unmanaged file", { path }); + } + const agents = parseJson(stripPlanrNoise(run(planrBin, ["--json", "agents", "check"], { cwd: repo }).stdout), "unrouted planr agents check"); + assertEqual(agents.ok, true, "unrouted Planr agents check"); + assertEqual(agents.reason, "missing", "unrouted Planr missing registry reason"); + receipt("Switchloom uninstall removes only managed files and unrouted Planr still works"); +} + +function assertNoDuplicateModelSelectionOwnership() { + run("cargo", ["test", "--test", "routing_ownership"]); + receipt("canonical routing ownership regression passed"); +} + +let beforeConfig; + +try { + if (replayRoot) { + runReplayFromRetainedRoot(); + } else { + beforeConfig = snapshotGlobalConfig(); + const tarball = packageTarball(); + const switchloomBin = extractTarball(tarball); + const repo = createFreshRepo(); + const { bundle, appliedArtifacts } = compileAndApply(switchloomBin, repo); + provisionRepoLocalPlanrLoopSkill(repo); + const contract = createPlanrLoopContract(repo); + assertPlanrConsumes(repo); + assertRequestedOnlyRejected(); + runCodexNoAuth(repo); + runCodexLive(repo, contract); + assertPlanAuditHolds(repo, contract); + assertUninstallAndUnroutedPlanr(switchloomBin, repo, appliedArtifacts); + assertGlobalConfigUnchanged(beforeConfig); + assertNoDuplicateModelSelectionOwnership(); + receipt("cross-product oracle complete", { tempRoot, bundle }); + process.stdout.write(JSON.stringify({ ok: true, tempRoot, receipts }, null, 2)); + } +} catch (error) { + process.stderr.write(`\n[fail] ${error.message}\n`); + if (error.detail) { + process.stderr.write(`${JSON.stringify(error.detail, null, 2)}\n`); + } + process.stderr.write(JSON.stringify({ ok: false, tempRoot, receipts }, null, 2)); + process.exit(1); +} diff --git a/src/app/agents.rs b/src/app/agents.rs index 648c821..874ee51 100644 --- a/src/app/agents.rs +++ b/src/app/agents.rs @@ -287,7 +287,7 @@ impl App { /// The `doctor` registry block. Never fails the command: absent is /// informational, a parse failure is a warning with the parser's line /// context, and a loaded registry reports counts, validation - /// warnings. Host artifacts are owned and verified by routing bundles. + /// warnings. Host artifacts are owned and verified by external tools. pub(crate) fn registry_doctor_value(&self) -> Result { let registry = match load_registry(&self.root) { RegistryLoad::Missing => { @@ -503,7 +503,7 @@ impl App { } /// Static workflow role files for `planr install `. Model and - /// effort pins belong to routing bundles, never to Planr Core. + /// effort pins belong to external routing tools, never to Planr Core. pub(crate) fn agent_role_contents(&self, client: &str) -> Vec<(&'static str, String)> { agent_roles(client) .iter() @@ -640,7 +640,7 @@ impl App { let generic_guidance = [ "Dispatch the selected repository profile through the active host.", "Treat declared model and effort as requested until effective run evidence confirms them.", - "Apply host-specific roles and skills only through a validated repository-local routing bundle.", + "Apply host-specific roles and skills only through externally generated repository declarations.", ]; prompt.push_str("\n### Host dispatch\n"); for line in generic_guidance { diff --git a/src/app/agents_init.rs b/src/app/agents_init.rs index 0cbca50..733d69c 100644 --- a/src/app/agents_init.rs +++ b/src/app/agents_init.rs @@ -236,7 +236,7 @@ fn build_registry(spec: &InitSpec) -> String { # `planr agents check` and `planr install --force`.\n\ #\n\ # Profiles and routes are opaque declarations. Host-specific policy\n\ - # and repository role artifacts arrive through routing bundles.\n", + # and repository role artifacts arrive from external tools such as Switchloom.\n", ); for profile in &spec.profiles { out.push_str(&format!( @@ -456,9 +456,9 @@ impl App { "path": REGISTRY_RELATIVE_PATH, "created": true, "mode": mode, - "next": ["edit .planr/agents.toml or apply a routing bundle", "planr agents check"], + "next": ["edit .planr/agents.toml or generate declarations with Switchloom", "planr agents check"], }), - format!("wrote provider-neutral {REGISTRY_RELATIVE_PATH}\nnext: edit it or apply a routing bundle, then run `planr agents check`"), + format!("wrote provider-neutral {REGISTRY_RELATIVE_PATH}\nnext: edit it or generate declarations with Switchloom, then run `planr agents check`"), ) } diff --git a/src/app/mod.rs b/src/app/mod.rs index ee4a8ba..b5dabfd 100644 --- a/src/app/mod.rs +++ b/src/app/mod.rs @@ -26,7 +26,6 @@ mod render; mod repository; mod review; mod review_workspace; -mod routing; mod surfaces; pub(crate) use flow::LogInput; @@ -97,7 +96,6 @@ impl App { pub(crate) fn dispatch(&self, command: Command) -> Result<()> { match command { Command::Agents(args) => self.agents(args.command), - Command::Routing(args) => self.routing(args.command), Command::Policy { command } => self.policy(command), Command::Project(args) => self.project(args.command), Command::Plan(args) => self.plan(args.command), diff --git a/src/app/routing.rs b/src/app/routing.rs deleted file mode 100644 index 2d16d8f..0000000 --- a/src/app/routing.rs +++ /dev/null @@ -1,181 +0,0 @@ -//! Provider-neutral routing bundle application boundary. - -use super::App; -use crate::cli::{RoutingBundleCommand, RoutingCommand}; -use crate::routing_bundle::{ - RoutingApplicationRecordV1, RoutingBundleTrustAnchorV1, RoutingBundleV1, apply_bundle, - load_bundle, preview_bundle, -}; -use crate::util::now_string; -use anyhow::{Result, bail}; -use serde_json::{Value, json}; -use sha2::{Digest, Sha256}; -use std::fs; - -impl App { - pub(crate) fn routing(&self, command: RoutingCommand) -> Result<()> { - match command { - RoutingCommand::Bundle(args) => self.routing_bundle(args.command), - } - } - - fn routing_bundle(&self, command: RoutingBundleCommand) -> Result<()> { - match command { - RoutingBundleCommand::Inspect(args) => { - let trust = trust_anchor(&args)?; - let bundle = load_bundle(&args.bundle, trust.as_ref())?; - let value = inspect_value(&bundle)?; - self.emit( - value, - format!( - "routing bundle {} is valid ({} artifact(s), {} profile(s), {} route(s))", - bundle.bundle_id, - bundle.artifacts.len(), - bundle.profiles.len(), - bundle.routes.len() - ), - ) - } - RoutingBundleCommand::Preview(args) => { - let trust = trust_anchor(&args)?; - let bundle = load_bundle(&args.bundle, trust.as_ref())?; - let preview = preview_bundle(&self.root, &bundle, trust.as_ref())?; - self.record_event( - "routing.bundle.previewed", - None, - serde_json::to_value(&preview)?, - )?; - let applicable = preview.is_applicable(); - let human = format!( - "previewed routing bundle {}: {} artifact(s), {} conflict(s)", - preview.bundle_id, - preview.artifacts.len(), - preview.conflicts.len() - ); - self.emit(json!({"applicable": applicable, "preview": preview}), human) - } - RoutingBundleCommand::Apply(args) => { - let trust = trust_anchor(&args)?; - let bundle = match load_bundle(&args.bundle, trust.as_ref()) { - Ok(bundle) => bundle, - Err(error) => { - let _ = self.record_event( - "routing.bundle.rejected", - None, - json!({"reason": error.to_string()}), - ); - return Err(error); - } - }; - let (preview, receipts) = match apply_bundle(&self.root, &bundle, trust.as_ref()) { - Ok(result) => result, - Err(error) => { - let _ = self.record_event( - "routing.bundle.rejected", - None, - json!({ - "bundle_id": bundle.bundle_id, - "reason": error.to_string() - }), - ); - return Err(error); - } - }; - let record = RoutingApplicationRecordV1 { - schema_version: 1, - bundle_id: bundle.bundle_id.clone(), - bundle_sha256: preview.bundle_sha256.clone(), - repository_id: repository_id(&self.root)?, - previewed_at: now_string(), - applied_at: Some(now_string()), - artifacts: receipts, - conflicts: Vec::new(), - declared_routes: bundle - .routes - .iter() - .map( - |route| crate::routing_bundle::RoutingDeclaredRouteEvidenceV1 { - selector: route_selector(route), - profile: route.profile.clone(), - }, - ) - .chain(bundle.route_default.iter().map(|route| { - crate::routing_bundle::RoutingDeclaredRouteEvidenceV1 { - selector: "default".to_string(), - profile: route.profile.clone(), - } - })) - .collect(), - effective_routes: Vec::new(), - }; - record.validate().map_err(anyhow::Error::new)?; - self.record_event( - "routing.bundle.applied", - None, - serde_json::to_value(&record)?, - )?; - let changed = record - .artifacts - .iter() - .filter(|artifact| { - !matches!( - artifact.outcome, - crate::routing_bundle::RoutingArtifactOutcomeV1::Unchanged - ) - }) - .count(); - self.emit( - json!({"application": record}), - format!( - "applied routing bundle {}: {} changed artifact(s)", - bundle.bundle_id, changed - ), - ) - } - } - } -} - -fn inspect_value(bundle: &RoutingBundleV1) -> Result { - Ok(json!({ - "valid": true, - "bundle": bundle, - "bundle_sha256": bundle.digest().map_err(anyhow::Error::new)?, - })) -} - -fn trust_anchor( - args: &crate::cli::RoutingBundleFileArgs, -) -> Result> { - match (&args.trusted_signer, &args.trusted_public_key_file) { - (None, None) => Ok(None), - (Some(signer), Some(path)) => Ok(Some(RoutingBundleTrustAnchorV1 { - signer: signer.clone(), - public_key: fs::read_to_string(path)?.trim().to_string(), - })), - _ => bail!("--trusted-signer and --trusted-public-key-file must be supplied together"), - } -} - -fn repository_id(root: &std::path::Path) -> Result { - let canonical = fs::canonicalize(root)?; - Ok(format!( - "sha256:{}", - hex_digest(canonical.to_string_lossy().as_bytes()) - )) -} - -fn route_selector(route: &crate::agents::Route) -> String { - let mut parts = Vec::new(); - if let Some(work_type) = &route.selector.work_type { - parts.push(format!("work_type={work_type}")); - } - if let Some(plan) = &route.selector.plan { - parts.push(format!("plan={plan}")); - } - parts.join(",") -} - -fn hex_digest(bytes: &[u8]) -> String { - format!("{:x}", Sha256::digest(bytes)) -} diff --git a/src/cli.rs b/src/cli.rs index 55ba789..22af216 100644 --- a/src/cli.rs +++ b/src/cli.rs @@ -26,8 +26,6 @@ pub(crate) enum Command { /// Inspect the agent profile registry (.planr/agents.toml) that /// drives advisory model routing in pick packets. Agents(AgentsArgs), - /// Inspect, preview, or apply a provider-neutral routing bundle. - Routing(RoutingArgs), Policy { #[command(subcommand)] command: PolicyCommand, @@ -65,44 +63,6 @@ pub(crate) enum Command { Import(ImportArgs), } -#[derive(Args, Debug)] -pub(crate) struct RoutingArgs { - #[command(subcommand)] - pub(crate) command: RoutingCommand, -} - -#[derive(Subcommand, Debug)] -pub(crate) enum RoutingCommand { - Bundle(RoutingBundleArgs), -} - -#[derive(Args, Debug)] -pub(crate) struct RoutingBundleArgs { - #[command(subcommand)] - pub(crate) command: RoutingBundleCommand, -} - -#[derive(Subcommand, Debug)] -pub(crate) enum RoutingBundleCommand { - /// Parse and validate a bundle without inspecting repository targets. - Inspect(RoutingBundleFileArgs), - /// Show exact repository-local actions without writing. - Preview(RoutingBundleFileArgs), - /// Apply the already validated bundle transactionally inside this repository. - Apply(RoutingBundleFileArgs), -} - -#[derive(Args, Debug)] -pub(crate) struct RoutingBundleFileArgs { - pub(crate) bundle: PathBuf, - /// Expected signer id for a signed bundle (paired with --trusted-public-key-file). - #[arg(long)] - pub(crate) trusted_signer: Option, - /// External Ed25519 public-key file for a signed bundle. - #[arg(long)] - pub(crate) trusted_public_key_file: Option, -} - #[derive(Args, Debug)] pub(crate) struct AgentsArgs { #[command(subcommand)] diff --git a/src/main.rs b/src/main.rs index 5f6e787..ca30d7b 100644 --- a/src/main.rs +++ b/src/main.rs @@ -16,7 +16,6 @@ mod model; mod planpack; mod rolefiles; mod route_audit; -mod routing_bundle; mod secrets; mod storage; pub mod usage_policy; diff --git a/src/rolefiles.rs b/src/rolefiles.rs index 78cfb54..32385af 100644 --- a/src/rolefiles.rs +++ b/src/rolefiles.rs @@ -1,5 +1,5 @@ //! Static workflow role files and skills installed for supported hosts. -//! Model selection and generated routing artifacts are owned by routing bundles. +//! Model selection and generated routing artifacts are owned by external tools. /// Subagent role files installed into a project so loop dispatches work /// without the host plugin system (Codex plugins cannot register agents). diff --git a/src/routing_bundle.rs b/src/routing_bundle.rs deleted file mode 100644 index 1675347..0000000 --- a/src/routing_bundle.rs +++ /dev/null @@ -1,1097 +0,0 @@ -//! Provider-neutral contract between Planr core and routing-policy producers. -//! -//! Core owns this wire shape and its generic invariants. It deliberately does -//! not interpret policy ids, host names, model ids, effort values, or -//! capability names. The optional `planr-routing` package is the producer and -//! sole owner of those opinions. - -use crate::agents::{AgentProfile, DefaultRoute, Route}; -use anyhow::{Context, Result, anyhow, bail}; -use ed25519_dalek::{Signature, Verifier, VerifyingKey}; -use serde::{Deserialize, Serialize}; -use sha2::{Digest, Sha256}; -use std::collections::{BTreeMap, BTreeSet}; -use std::error::Error; -use std::fmt; -use std::fs::{self, OpenOptions}; -use std::io::Write; -use std::path::{Component, Path, PathBuf}; - -pub const ROUTING_BUNDLE_SCHEMA_VERSION: u32 = 1; -pub const ROUTING_APPLICATION_RECORD_SCHEMA_VERSION: u32 = 1; - -#[derive(Debug, Clone, Serialize, Deserialize)] -#[serde(deny_unknown_fields)] -pub struct RoutingBundleV1 { - pub schema_version: u32, - pub bundle_id: String, - pub policy_id: String, - pub policy_version: String, - pub generated_at: String, - pub source: RoutingBundleSourceV1, - #[serde(default)] - pub requirements: Vec, - #[serde(default)] - pub profiles: BTreeMap, - #[serde(default)] - pub routes: Vec, - #[serde(default)] - pub route_default: Option, - #[serde(default)] - pub artifacts: Vec, - #[serde(default, skip_serializing_if = "Option::is_none")] - pub evidence: Option, - #[serde(default, skip_serializing_if = "Option::is_none")] - pub signature: Option, -} - -#[derive(Debug, Clone, Serialize, Deserialize)] -#[serde(deny_unknown_fields)] -pub struct RoutingBundleSourceV1 { - pub package: String, - pub package_version: String, - #[serde(default, skip_serializing_if = "Option::is_none")] - pub registry: Option, -} - -#[derive(Debug, Clone, Serialize, Deserialize)] -#[serde(deny_unknown_fields)] -pub struct RoutingRegistryProvenanceV1 { - pub entry: String, - pub manifest_sha256: String, -} - -#[derive(Debug, Clone, Serialize, Deserialize)] -#[serde(deny_unknown_fields)] -pub struct RoutingHostRequirementV1 { - pub host: String, - #[serde(default)] - pub capabilities: Vec, -} - -#[derive(Debug, Clone, Serialize, Deserialize)] -pub struct RoutingArtifactV1 { - pub path: String, - pub media_type: String, - pub mode: RoutingArtifactModeV1, - #[serde(flatten)] - pub payload: RoutingArtifactPayloadV1, - pub sha256: String, -} - -#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)] -#[serde(rename_all = "snake_case")] -pub enum RoutingArtifactModeV1 { - Create, - Replace, -} - -#[derive(Debug, Clone, Serialize, Deserialize)] -#[serde(untagged)] -pub enum RoutingArtifactPayloadV1 { - Inline(RoutingInlineContentV1), - Reference(RoutingContentReferenceV1), -} - -#[derive(Debug, Clone, Serialize, Deserialize)] -#[serde(deny_unknown_fields)] -pub struct RoutingInlineContentV1 { - pub content: String, -} - -#[derive(Debug, Clone, Serialize, Deserialize)] -#[serde(deny_unknown_fields)] -pub struct RoutingContentReferenceV1 { - pub content_ref: String, -} - -#[derive(Debug, Clone, Serialize, Deserialize)] -#[serde(deny_unknown_fields)] -pub struct RoutingEvaluationEvidenceV1 { - #[serde(default)] - pub evaluation_ids: Vec, - pub status: RoutingEvidenceStatusV1, -} - -#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)] -#[serde(rename_all = "snake_case")] -pub enum RoutingEvidenceStatusV1 { - Unverified, - Experimental, - Verified, - Recommended, -} - -#[derive(Debug, Clone, Serialize, Deserialize)] -#[serde(deny_unknown_fields)] -pub struct RoutingBundleSignatureV1 { - pub algorithm: RoutingSignatureAlgorithmV1, - pub signer: String, - pub value: String, -} - -#[derive(Debug, Clone, PartialEq, Eq)] -pub struct RoutingBundleTrustAnchorV1 { - pub signer: String, - pub public_key: String, -} - -#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)] -#[serde(rename_all = "lowercase")] -pub enum RoutingSignatureAlgorithmV1 { - Ed25519, -} - -/// Durable evidence written by core after preview or apply. Repository -/// identity is opaque so the contract does not require an absolute path. -#[derive(Debug, Clone, Serialize, Deserialize)] -#[serde(deny_unknown_fields)] -pub struct RoutingApplicationRecordV1 { - pub schema_version: u32, - pub bundle_id: String, - pub bundle_sha256: String, - pub repository_id: String, - pub previewed_at: String, - #[serde(default, skip_serializing_if = "Option::is_none")] - pub applied_at: Option, - #[serde(default)] - pub artifacts: Vec, - #[serde(default)] - pub conflicts: Vec, - #[serde(default)] - pub declared_routes: Vec, - #[serde(default)] - pub effective_routes: Vec, -} - -#[derive(Debug, Clone, Serialize, Deserialize)] -#[serde(deny_unknown_fields)] -pub struct RoutingArtifactReceiptV1 { - pub path: String, - pub proposed_sha256: String, - #[serde(default, skip_serializing_if = "Option::is_none")] - pub previous_sha256: Option, - pub outcome: RoutingArtifactOutcomeV1, -} - -#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)] -#[serde(rename_all = "snake_case")] -pub enum RoutingArtifactOutcomeV1 { - Planned, - Created, - Replaced, - Unchanged, -} - -#[derive(Debug, Clone, Serialize, Deserialize)] -#[serde(deny_unknown_fields)] -pub struct RoutingArtifactConflictV1 { - pub path: String, - pub reason: String, -} - -#[derive(Debug, Clone, Serialize, Deserialize)] -#[serde(deny_unknown_fields)] -pub struct RoutingDeclaredRouteEvidenceV1 { - pub selector: String, - pub profile: String, -} - -#[derive(Debug, Clone, Serialize, Deserialize)] -#[serde(deny_unknown_fields)] -pub struct RoutingEffectiveRouteEvidenceV1 { - pub item_id: String, - pub profile: String, - pub observed_client: String, - #[serde(default, skip_serializing_if = "Option::is_none")] - pub observed_model: Option, - #[serde(default, skip_serializing_if = "Option::is_none")] - pub observed_effort: Option, -} - -#[derive(Debug, Clone, PartialEq, Eq)] -pub enum RoutingBundleError { - UnsupportedSchemaVersion { found: u32 }, - InvalidField { field: String, reason: String }, - UnknownProfile { field: String, profile: String }, - DuplicateArtifactPath { path: String }, - ArtifactPathCollision { parent: String, child: String }, - ArtifactDigestMismatch { path: String }, - InvalidSignature, - SignatureTrustRequired, - SignatureSignerMismatch, -} - -impl fmt::Display for RoutingBundleError { - fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result { - match self { - Self::UnsupportedSchemaVersion { found } => write!( - formatter, - "unsupported routing bundle schema version `{found}`; expected `{ROUTING_BUNDLE_SCHEMA_VERSION}`" - ), - Self::InvalidField { field, reason } => { - write!( - formatter, - "invalid routing bundle field `{field}`: {reason}" - ) - } - Self::UnknownProfile { field, profile } => write!( - formatter, - "routing bundle field `{field}` references unknown profile `{profile}`" - ), - Self::DuplicateArtifactPath { path } => { - write!( - formatter, - "routing bundle contains duplicate artifact path `{path}`" - ) - } - Self::ArtifactPathCollision { parent, child } => write!( - formatter, - "routing bundle artifact path `{parent}` is a parent of `{child}`" - ), - Self::ArtifactDigestMismatch { path } => write!( - formatter, - "routing bundle artifact `{path}` content does not match its sha256" - ), - Self::InvalidSignature => write!(formatter, "routing bundle signature is invalid"), - Self::SignatureTrustRequired => write!( - formatter, - "signed routing bundle requires an external trusted signer and public key" - ), - Self::SignatureSignerMismatch => write!( - formatter, - "routing bundle signer does not match the external trust anchor" - ), - } - } -} - -impl Error for RoutingBundleError {} - -impl RoutingBundleV1 { - pub fn parse_json(raw: &str) -> Result { - serde_json::from_str(raw).map_err(|error| RoutingBundleError::InvalidField { - field: "bundle".to_string(), - reason: error.to_string(), - }) - } - - fn validate_structure(&self) -> Result<(), RoutingBundleError> { - if self.schema_version != ROUTING_BUNDLE_SCHEMA_VERSION { - return Err(RoutingBundleError::UnsupportedSchemaVersion { - found: self.schema_version, - }); - } - required("bundle_id", &self.bundle_id)?; - required("policy_id", &self.policy_id)?; - required("policy_version", &self.policy_version)?; - required("generated_at", &self.generated_at)?; - required("source.package", &self.source.package)?; - required("source.package_version", &self.source.package_version)?; - - if let Some(registry) = &self.source.registry { - required("source.registry.entry", ®istry.entry)?; - validate_sha256("source.registry.manifest_sha256", ®istry.manifest_sha256)?; - } - - let mut hosts = BTreeSet::new(); - for (requirement_index, requirement) in self.requirements.iter().enumerate() { - let host_field = format!("requirements[{requirement_index}].host"); - required(&host_field, &requirement.host)?; - if !hosts.insert(requirement.host.as_str()) { - return invalid(&host_field, "host requirement is duplicated"); - } - let mut capabilities = BTreeSet::new(); - for (capability_index, capability) in requirement.capabilities.iter().enumerate() { - let field = - format!("requirements[{requirement_index}].capabilities[{capability_index}]"); - required(&field, capability)?; - if !capabilities.insert(capability.as_str()) { - return invalid(&field, "capability is duplicated for this host"); - } - } - } - - for (profile_id, profile) in &self.profiles { - required("profiles.", profile_id)?; - required(&format!("profiles.{profile_id}.client"), &profile.client)?; - required(&format!("profiles.{profile_id}.model"), &profile.model)?; - } - for (route_index, route) in self.routes.iter().enumerate() { - validate_route_profile( - &self.profiles, - &format!("routes[{route_index}].profile"), - &route.profile, - )?; - for (fallback_index, fallback) in route.fallbacks.iter().enumerate() { - validate_route_profile( - &self.profiles, - &format!("routes[{route_index}].fallbacks[{fallback_index}]"), - fallback, - )?; - } - } - if let Some(default) = &self.route_default { - validate_route_profile(&self.profiles, "route_default.profile", &default.profile)?; - for (fallback_index, fallback) in default.fallbacks.iter().enumerate() { - validate_route_profile( - &self.profiles, - &format!("route_default.fallbacks[{fallback_index}]"), - fallback, - )?; - } - } - - let mut artifact_paths = BTreeSet::new(); - for (artifact_index, artifact) in self.artifacts.iter().enumerate() { - required(&format!("artifacts[{artifact_index}].path"), &artifact.path)?; - required( - &format!("artifacts[{artifact_index}].media_type"), - &artifact.media_type, - )?; - validate_sha256( - &format!("artifacts[{artifact_index}].sha256"), - &artifact.sha256, - )?; - if !artifact_paths.insert(artifact.path.as_str()) { - return Err(RoutingBundleError::DuplicateArtifactPath { - path: artifact.path.clone(), - }); - } - match &artifact.payload { - RoutingArtifactPayloadV1::Inline(inline) => { - if sha256(inline.content.as_bytes()) != artifact.sha256 { - return Err(RoutingBundleError::ArtifactDigestMismatch { - path: artifact.path.clone(), - }); - } - } - RoutingArtifactPayloadV1::Reference(reference) => required( - &format!("artifacts[{artifact_index}].content_ref"), - &reference.content_ref, - )?, - } - } - for child in &artifact_paths { - let mut ancestor = Path::new(child).parent(); - while let Some(parent) = ancestor { - if let Some(parent) = parent.to_str() - && artifact_paths.contains(parent) - { - return Err(RoutingBundleError::ArtifactPathCollision { - parent: parent.to_string(), - child: (*child).to_string(), - }); - } - ancestor = parent.parent(); - } - } - - if let Some(evidence) = &self.evidence { - let mut ids = BTreeSet::new(); - for (index, evaluation_id) in evidence.evaluation_ids.iter().enumerate() { - let field = format!("evidence.evaluation_ids[{index}]"); - required(&field, evaluation_id)?; - if !ids.insert(evaluation_id.as_str()) { - return invalid(&field, "evaluation id is duplicated"); - } - } - if matches!( - evidence.status, - RoutingEvidenceStatusV1::Verified | RoutingEvidenceStatusV1::Recommended - ) { - if evidence.evaluation_ids.is_empty() { - return invalid( - "evidence.evaluation_ids", - "verified or recommended evidence requires at least one evaluation id", - ); - } - if self.signature.is_none() { - return invalid( - "evidence.status", - "verified or recommended evidence requires an externally trusted bundle signature", - ); - } - } - } - if let Some(signature) = &self.signature { - required("signature.signer", &signature.signer)?; - validate_hex("signature.value", &signature.value, 128)?; - } - Ok(()) - } - - pub fn validate(&self) -> Result<(), RoutingBundleError> { - self.validate_with_trust(None) - } - - pub fn validate_with_trust( - &self, - trust: Option<&RoutingBundleTrustAnchorV1>, - ) -> Result<(), RoutingBundleError> { - self.validate_structure()?; - self.verify_signature(trust) - } - - pub fn canonical_bytes(&self) -> Result, RoutingBundleError> { - serde_json::to_vec(self).map_err(|error| RoutingBundleError::InvalidField { - field: "bundle".to_string(), - reason: error.to_string(), - }) - } - - pub fn digest(&self) -> Result { - self.canonical_bytes().map(|bytes| sha256(&bytes)) - } - - fn signing_bytes(&self) -> Result, RoutingBundleError> { - let mut unsigned = self.clone(); - unsigned.signature = None; - unsigned.canonical_bytes() - } - - fn verify_signature( - &self, - trust: Option<&RoutingBundleTrustAnchorV1>, - ) -> Result<(), RoutingBundleError> { - let Some(signature) = &self.signature else { - return Ok(()); - }; - let trust = trust.ok_or(RoutingBundleError::SignatureTrustRequired)?; - if signature.signer != trust.signer { - return Err(RoutingBundleError::SignatureSignerMismatch); - } - let key_bytes = - decode_hex::<32>(&trust.public_key).ok_or(RoutingBundleError::InvalidSignature)?; - let signature_bytes = - decode_hex::<64>(&signature.value).ok_or(RoutingBundleError::InvalidSignature)?; - let key = VerifyingKey::from_bytes(&key_bytes) - .map_err(|_| RoutingBundleError::InvalidSignature)?; - key.verify( - &self.signing_bytes()?, - &Signature::from_bytes(&signature_bytes), - ) - .map_err(|_| RoutingBundleError::InvalidSignature) - } -} - -#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)] -#[serde(rename_all = "snake_case")] -pub enum RoutingArtifactActionV1 { - Create, - Replace, - Unchanged, - Conflict, -} - -#[derive(Debug, Clone, Serialize, Deserialize)] -pub struct RoutingArtifactPreviewV1 { - pub path: String, - pub proposed_sha256: String, - #[serde(skip_serializing_if = "Option::is_none")] - pub current_sha256: Option, - pub action: RoutingArtifactActionV1, -} - -#[derive(Debug, Clone, Serialize, Deserialize)] -pub struct RoutingBundlePreviewV1 { - pub bundle_id: String, - pub bundle_sha256: String, - pub artifacts: Vec, - pub conflicts: Vec, -} - -impl RoutingBundlePreviewV1 { - pub fn is_applicable(&self) -> bool { - self.conflicts.is_empty() - } -} - -impl RoutingApplicationRecordV1 { - pub fn validate(&self) -> Result<(), RoutingBundleError> { - if self.schema_version != ROUTING_APPLICATION_RECORD_SCHEMA_VERSION { - return invalid( - "application_record.schema_version", - &format!( - "unsupported version `{}`; expected `{ROUTING_APPLICATION_RECORD_SCHEMA_VERSION}`", - self.schema_version - ), - ); - } - required("application_record.bundle_id", &self.bundle_id)?; - validate_sha256("application_record.bundle_sha256", &self.bundle_sha256)?; - required("application_record.repository_id", &self.repository_id)?; - required("application_record.previewed_at", &self.previewed_at)?; - if let Some(applied_at) = &self.applied_at { - required("application_record.applied_at", applied_at)?; - } - let mut artifact_paths = BTreeSet::new(); - for (index, artifact) in self.artifacts.iter().enumerate() { - required( - &format!("application_record.artifacts[{index}].path"), - &artifact.path, - )?; - if !artifact_paths.insert(artifact.path.as_str()) { - return invalid( - &format!("application_record.artifacts[{index}].path"), - "artifact receipt path is duplicated", - ); - } - validate_sha256( - &format!("application_record.artifacts[{index}].proposed_sha256"), - &artifact.proposed_sha256, - )?; - if let Some(previous) = &artifact.previous_sha256 { - validate_sha256( - &format!("application_record.artifacts[{index}].previous_sha256"), - previous, - )?; - } - } - for (index, conflict) in self.conflicts.iter().enumerate() { - required( - &format!("application_record.conflicts[{index}].path"), - &conflict.path, - )?; - required( - &format!("application_record.conflicts[{index}].reason"), - &conflict.reason, - )?; - } - for (index, route) in self.declared_routes.iter().enumerate() { - required( - &format!("application_record.declared_routes[{index}].selector"), - &route.selector, - )?; - required( - &format!("application_record.declared_routes[{index}].profile"), - &route.profile, - )?; - } - for (index, route) in self.effective_routes.iter().enumerate() { - required( - &format!("application_record.effective_routes[{index}].item_id"), - &route.item_id, - )?; - required( - &format!("application_record.effective_routes[{index}].profile"), - &route.profile, - )?; - required( - &format!("application_record.effective_routes[{index}].observed_client"), - &route.observed_client, - )?; - if let Some(model) = &route.observed_model { - required( - &format!("application_record.effective_routes[{index}].observed_model"), - model, - )?; - } - if let Some(effort) = &route.observed_effort { - required( - &format!("application_record.effective_routes[{index}].observed_effort"), - effort, - )?; - } - } - Ok(()) - } -} - -fn validate_route_profile( - profiles: &BTreeMap, - field: &str, - profile: &str, -) -> Result<(), RoutingBundleError> { - required(field, profile)?; - if profiles.contains_key(profile) { - Ok(()) - } else { - Err(RoutingBundleError::UnknownProfile { - field: field.to_string(), - profile: profile.to_string(), - }) - } -} - -fn required(field: &str, value: &str) -> Result<(), RoutingBundleError> { - if value.trim().is_empty() { - invalid(field, "must not be blank") - } else { - Ok(()) - } -} - -fn validate_sha256(field: &str, value: &str) -> Result<(), RoutingBundleError> { - validate_hex(field, value, 64) -} - -fn validate_hex(field: &str, value: &str, length: usize) -> Result<(), RoutingBundleError> { - if value.len() != length || !value.bytes().all(|byte| byte.is_ascii_hexdigit()) { - return invalid(field, &format!("must be {length} hexadecimal characters")); - } - if value.bytes().any(|byte| byte.is_ascii_uppercase()) { - return invalid(field, "must use canonical lowercase hexadecimal"); - } - Ok(()) -} - -fn invalid(field: &str, reason: &str) -> Result { - Err(RoutingBundleError::InvalidField { - field: field.to_string(), - reason: reason.to_string(), - }) -} - -fn sha256(bytes: &[u8]) -> String { - format!("{:x}", Sha256::digest(bytes)) -} - -fn decode_hex(value: &str) -> Option<[u8; N]> { - if value.len() != N * 2 { - return None; - } - let mut decoded = [0_u8; N]; - for (index, output) in decoded.iter_mut().enumerate() { - *output = u8::from_str_radix(&value[index * 2..index * 2 + 2], 16).ok()?; - } - Some(decoded) -} - -pub fn load_bundle( - path: &Path, - trust: Option<&RoutingBundleTrustAnchorV1>, -) -> Result { - let raw = fs::read_to_string(path) - .with_context(|| format!("cannot read routing bundle {}", path.display()))?; - let bundle = RoutingBundleV1::parse_json(&raw).map_err(anyhow::Error::new)?; - match trust { - Some(trust) => bundle.validate_with_trust(Some(trust)), - None => bundle.validate(), - } - .map_err(anyhow::Error::new)?; - Ok(bundle) -} - -pub fn preview_bundle( - root: &Path, - bundle: &RoutingBundleV1, - trust: Option<&RoutingBundleTrustAnchorV1>, -) -> Result { - match trust { - Some(trust) => bundle.validate_with_trust(Some(trust)), - None => bundle.validate(), - } - .map_err(anyhow::Error::new)?; - let mut artifacts = Vec::with_capacity(bundle.artifacts.len()); - let mut conflicts = Vec::new(); - for artifact in &bundle.artifacts { - let target = validated_repository_target(root, &artifact.path)?; - let proposed = inline_content(artifact)?; - let current = match fs::read(&target) { - Ok(bytes) => Some(sha256(&bytes)), - Err(error) if error.kind() == std::io::ErrorKind::NotFound => None, - Err(error) => { - return Err(error).with_context(|| format!("cannot inspect {}", target.display())); - } - }; - let action = match current.as_deref() { - Some(current) if current == artifact.sha256 => RoutingArtifactActionV1::Unchanged, - Some(_) if artifact.mode == RoutingArtifactModeV1::Replace => { - RoutingArtifactActionV1::Replace - } - Some(_) => RoutingArtifactActionV1::Conflict, - None => RoutingArtifactActionV1::Create, - }; - if action == RoutingArtifactActionV1::Conflict { - conflicts.push(RoutingArtifactConflictV1 { - path: artifact.path.clone(), - reason: "existing content differs and artifact mode is create".to_string(), - }); - } - debug_assert_eq!(sha256(proposed), artifact.sha256); - artifacts.push(RoutingArtifactPreviewV1 { - path: artifact.path.clone(), - proposed_sha256: artifact.sha256.clone(), - current_sha256: current, - action, - }); - } - Ok(RoutingBundlePreviewV1 { - bundle_id: bundle.bundle_id.clone(), - bundle_sha256: bundle.digest().map_err(anyhow::Error::new)?, - artifacts, - conflicts, - }) -} - -pub fn apply_bundle( - root: &Path, - bundle: &RoutingBundleV1, - trust: Option<&RoutingBundleTrustAnchorV1>, -) -> Result<(RoutingBundlePreviewV1, Vec)> { - let preview = preview_bundle(root, bundle, trust)?; - if !preview.is_applicable() { - bail!( - "routing bundle has {} conflict(s); apply refused before writes", - preview.conflicts.len() - ); - } - - let canonical_root = fs::canonicalize(root) - .with_context(|| format!("cannot canonicalize repository root {}", root.display()))?; - let mut staged: Vec = Vec::new(); - let mut created_directories: Vec = Vec::new(); - for (artifact, artifact_preview) in bundle.artifacts.iter().zip(&preview.artifacts) { - if artifact_preview.action == RoutingArtifactActionV1::Unchanged { - continue; - } - let stage_result = (|| -> Result { - let target = validated_repository_target(root, &artifact.path)?; - let parent = target.parent().ok_or_else(|| { - anyhow!( - "routing artifact target has no parent: {}", - target.display() - ) - })?; - create_missing_directories(&canonical_root, parent, &mut created_directories)?; - reject_symlink_components(root, Path::new(&artifact.path))?; - let temporary = parent.join(format!(".planr-routing-{}.tmp", uuid::Uuid::new_v4())); - let mut file = OpenOptions::new() - .write(true) - .create_new(true) - .open(&temporary)?; - if let Err(error) = file - .write_all(inline_content(artifact)?) - .and_then(|_| file.sync_all()) - { - let _ = fs::remove_file(&temporary); - return Err(error.into()); - } - Ok(StagedArtifact { - target, - temporary, - action: artifact_preview.action, - expected_current_sha256: artifact_preview.current_sha256.clone(), - }) - })(); - match stage_result { - Ok(stage) => staged.push(stage), - Err(error) => { - if let Err(rollback) = rollback_transaction(&staged, &[], &created_directories) { - return Err(error).context(format!("routing rollback also failed: {rollback}")); - } - return Err(error); - } - } - } - - let mut committed: Vec = Vec::new(); - for stage in &staged { - let result = commit_staged(stage); - match result { - Ok(commit) => committed.push(commit), - Err(error) => { - if let Err(rollback) = - rollback_transaction(&staged, &committed, &created_directories) - { - return Err(error).context(format!("routing rollback also failed: {rollback}")); - } - return Err(error); - } - } - } - if let Err(error) = cleanup_backups(&committed) { - if let Err(rollback) = rollback_transaction(&staged, &committed, &created_directories) { - return Err(error).context(format!("routing rollback also failed: {rollback}")); - } - return Err(error); - } - - let receipts = preview - .artifacts - .iter() - .map(|artifact| RoutingArtifactReceiptV1 { - path: artifact.path.clone(), - proposed_sha256: artifact.proposed_sha256.clone(), - previous_sha256: artifact.current_sha256.clone(), - outcome: match artifact.action { - RoutingArtifactActionV1::Create => RoutingArtifactOutcomeV1::Created, - RoutingArtifactActionV1::Replace => RoutingArtifactOutcomeV1::Replaced, - RoutingArtifactActionV1::Unchanged => RoutingArtifactOutcomeV1::Unchanged, - RoutingArtifactActionV1::Conflict => unreachable!("conflicts stop before apply"), - }, - }) - .collect(); - Ok((preview, receipts)) -} - -fn inline_content(artifact: &RoutingArtifactV1) -> Result<&[u8]> { - match &artifact.payload { - RoutingArtifactPayloadV1::Inline(inline) => Ok(inline.content.as_bytes()), - RoutingArtifactPayloadV1::Reference(_) => bail!( - "routing artifact `{}` uses unresolved content_ref; core apply requires self-contained content", - artifact.path - ), - } -} - -fn validated_repository_target(root: &Path, relative: &str) -> Result { - let root = fs::canonicalize(root) - .with_context(|| format!("cannot canonicalize repository root {}", root.display()))?; - let path = Path::new(relative); - if path.is_absolute() || relative.starts_with('~') { - bail!("routing artifact target `{relative}` must be repository-relative"); - } - let components = path - .components() - .map(|component| match component { - Component::Normal(value) => value - .to_str() - .map(ToOwned::to_owned) - .ok_or_else(|| anyhow!("routing artifact target `{relative}` is not UTF-8")), - _ => Err(anyhow!( - "routing artifact target `{relative}` contains traversal or non-normal components" - )), - }) - .collect::>>()?; - let normalized = components.join("/"); - if normalized != relative { - bail!("routing artifact target `{relative}` is not normalized as `{normalized}`"); - } - if !allowed_repository_target(&normalized) { - bail!( - "routing artifact target `{relative}` is outside the repository allowlist; user/global configuration and .codex/config.toml are forbidden" - ); - } - reject_symlink_components(&root, path)?; - Ok(root.join(path)) -} - -fn allowed_repository_target(path: &str) -> bool { - [ - ".planr/", - ".codex/agents/", - ".codex/skills/", - ".claude/agents/", - ".claude/skills/", - ".cursor/agents/", - ".cursor/skills/", - ] - .iter() - .any(|prefix| path.starts_with(prefix) && path.len() > prefix.len()) - && path != ".codex/config.toml" -} - -fn reject_symlink_components(root: &Path, relative: &Path) -> Result<()> { - let mut cursor = root.to_path_buf(); - for component in relative.components() { - let Component::Normal(component) = component else { - bail!("routing artifact path contains a non-normal component"); - }; - cursor.push(component); - match fs::symlink_metadata(&cursor) { - Ok(metadata) if metadata.file_type().is_symlink() => { - bail!( - "routing artifact target crosses symlink `{}`", - cursor.display() - ) - } - Ok(_) => {} - Err(error) if error.kind() == std::io::ErrorKind::NotFound => {} - Err(error) => return Err(error.into()), - } - } - Ok(()) -} - -struct StagedArtifact { - target: PathBuf, - temporary: PathBuf, - action: RoutingArtifactActionV1, - expected_current_sha256: Option, -} - -struct CommittedArtifact { - target: PathBuf, - backup: Option, - previous_content: Option>, -} - -fn commit_staged(stage: &StagedArtifact) -> Result { - match stage.action { - RoutingArtifactActionV1::Create => { - fs::hard_link(&stage.temporary, &stage.target).with_context(|| { - format!( - "routing target appeared after preview; refusing overwrite: {}", - stage.target.display() - ) - })?; - if let Err(error) = fs::remove_file(&stage.temporary) { - let _ = fs::remove_file(&stage.target); - return Err(error.into()); - } - Ok(CommittedArtifact { - target: stage.target.clone(), - backup: None, - previous_content: None, - }) - } - RoutingArtifactActionV1::Replace => { - let current = fs::read(&stage.target).with_context(|| { - format!("cannot recheck {} before replace", stage.target.display()) - })?; - let current_sha256 = sha256(¤t); - if stage.expected_current_sha256.as_deref() != Some(current_sha256.as_str()) { - bail!( - "routing target changed after preview; refusing replace: {}", - stage.target.display() - ); - } - let backup = stage - .target - .with_extension(format!("planr-backup-{}", uuid::Uuid::new_v4())); - fs::rename(&stage.target, &backup)?; - if let Err(error) = fs::rename(&stage.temporary, &stage.target) { - let _ = fs::rename(&backup, &stage.target); - let _ = fs::remove_file(&stage.temporary); - return Err(error.into()); - } - Ok(CommittedArtifact { - target: stage.target.clone(), - backup: Some(backup), - previous_content: Some(current), - }) - } - RoutingArtifactActionV1::Unchanged | RoutingArtifactActionV1::Conflict => { - unreachable!("only mutable staged actions are committed") - } - } -} - -fn create_missing_directories( - root: &Path, - parent: &Path, - created: &mut Vec, -) -> Result<()> { - create_missing_directories_with(root, parent, created, |path| fs::create_dir(path)) -} - -fn create_missing_directories_with( - root: &Path, - parent: &Path, - created: &mut Vec, - mut create: F, -) -> Result<()> -where - F: FnMut(&Path) -> std::io::Result<()>, -{ - let mut missing = Vec::new(); - let mut cursor = parent; - while cursor != root { - if cursor.exists() { - break; - } - if !cursor.starts_with(root) { - bail!("routing artifact parent escaped repository root"); - } - missing.push(cursor.to_path_buf()); - cursor = cursor - .parent() - .ok_or_else(|| anyhow!("routing artifact parent has no repository ancestor"))?; - } - missing.reverse(); - for directory in missing { - match create(&directory) { - Ok(()) => created.push(directory), - Err(error) if error.kind() == std::io::ErrorKind::AlreadyExists => {} - Err(error) => return Err(error.into()), - } - } - Ok(()) -} - -fn cleanup_backups(committed: &[CommittedArtifact]) -> Result<()> { - cleanup_backups_with(committed, |path| fs::remove_file(path)) -} - -fn cleanup_backups_with(committed: &[CommittedArtifact], mut remove: F) -> Result<()> -where - F: FnMut(&Path) -> std::io::Result<()>, -{ - let mut errors = Vec::new(); - for backup in committed.iter().filter_map(|commit| commit.backup.as_ref()) { - if let Err(error) = remove(backup) - && error.kind() != std::io::ErrorKind::NotFound - { - errors.push(format!("remove backup {}: {error}", backup.display())); - } - } - if errors.is_empty() { - Ok(()) - } else { - bail!(errors.join("; ")) - } -} - -fn rollback_transaction( - staged: &[StagedArtifact], - committed: &[CommittedArtifact], - created_directories: &[PathBuf], -) -> Result<()> { - let mut errors = Vec::new(); - for staged_artifact in staged { - if let Err(error) = fs::remove_file(&staged_artifact.temporary) - && error.kind() != std::io::ErrorKind::NotFound - { - errors.push(format!( - "remove temporary {}: {error}", - staged_artifact.temporary.display() - )); - } - } - for commit in committed.iter().rev() { - if let Err(error) = fs::remove_file(&commit.target) - && error.kind() != std::io::ErrorKind::NotFound - { - errors.push(format!( - "remove target {}: {error}", - commit.target.display() - )); - } - if let Some(backup) = &commit.backup { - match fs::rename(backup, &commit.target) { - Ok(()) => continue, - Err(error) if error.kind() == std::io::ErrorKind::NotFound => {} - Err(error) => errors.push(format!( - "restore backup {} to {}: {error}", - backup.display(), - commit.target.display() - )), - } - } - if let Some(previous) = &commit.previous_content - && let Err(error) = fs::write(&commit.target, previous) - { - errors.push(format!( - "restore previous content {}: {error}", - commit.target.display() - )); - } - } - for directory in created_directories.iter().rev() { - if let Err(error) = fs::remove_dir(directory) - && error.kind() != std::io::ErrorKind::NotFound - { - errors.push(format!("remove directory {}: {error}", directory.display())); - } - } - if errors.is_empty() { - Ok(()) - } else { - bail!(errors.join("; ")) - } -} - -#[cfg(test)] -mod tests; diff --git a/src/routing_bundle/tests.rs b/src/routing_bundle/tests.rs deleted file mode 100644 index b8a3607..0000000 --- a/src/routing_bundle/tests.rs +++ /dev/null @@ -1,315 +0,0 @@ -use super::*; -use ed25519_dalek::{Signer, SigningKey}; -use tempfile::tempdir; - -const VALID: &str = - include_str!("../../planr-routing/fixtures/routing-bundle-v1/valid-balanced-codex.json"); -const UNSUPPORTED_VERSION: &str = - include_str!("../../planr-routing/fixtures/routing-bundle-v1/invalid-unsupported-version.json"); -const BAD_ARTIFACT_HASH: &str = - include_str!("../../planr-routing/fixtures/routing-bundle-v1/invalid-artifact-hash.json"); -const DUAL_PAYLOAD: &str = include_str!( - "../../planr-routing/fixtures/routing-bundle-v1/invalid-dual-artifact-payload.json" -); - -#[test] -fn package_owned_valid_fixture_is_consumed_by_core() { - let bundle = RoutingBundleV1::parse_json(VALID).unwrap(); - bundle.validate().unwrap(); - assert_eq!(bundle.schema_version, ROUTING_BUNDLE_SCHEMA_VERSION); - assert_eq!(bundle.source.package, "planr-routing"); - assert_eq!(bundle.policy_id, "balanced"); - assert!(!bundle.profiles.is_empty()); - assert!(!bundle.routes.is_empty()); - assert!(!bundle.artifacts.is_empty()); - assert!(matches!( - bundle.artifacts[0].payload, - RoutingArtifactPayloadV1::Inline(_) - )); -} - -#[test] -fn unsupported_schema_version_is_rejected_without_coercion() { - let bundle = RoutingBundleV1::parse_json(UNSUPPORTED_VERSION).unwrap(); - assert_eq!( - bundle.validate(), - Err(RoutingBundleError::UnsupportedSchemaVersion { found: 2 }) - ); -} - -#[test] -fn artifact_content_must_match_declared_digest() { - let bundle = RoutingBundleV1::parse_json(BAD_ARTIFACT_HASH).unwrap(); - assert!(matches!( - bundle.validate(), - Err(RoutingBundleError::ArtifactDigestMismatch { .. }) - )); -} - -#[test] -fn artifact_payload_has_one_canonical_shape() { - let error = RoutingBundleV1::parse_json(DUAL_PAYLOAD).unwrap_err(); - assert!(error.to_string().contains("bundle")); -} - -#[test] -fn unsigned_bundle_cannot_self_assert_verified_evidence() { - let mut bundle = RoutingBundleV1::parse_json(VALID).unwrap(); - bundle.evidence.as_mut().unwrap().status = RoutingEvidenceStatusV1::Recommended; - assert!( - bundle - .validate() - .unwrap_err() - .to_string() - .contains("externally trusted bundle signature") - ); -} - -#[test] -fn application_record_contract_validates_current_shape() { - let record = RoutingApplicationRecordV1 { - schema_version: ROUTING_APPLICATION_RECORD_SCHEMA_VERSION, - bundle_id: "balanced-codex@1.0.0".into(), - bundle_sha256: "0".repeat(64), - repository_id: "sha256:repository-fixture".into(), - previewed_at: "2026-07-16T00:00:00Z".into(), - applied_at: None, - artifacts: vec![RoutingArtifactReceiptV1 { - path: ".codex/agents/planr-terra-high.toml".into(), - proposed_sha256: "1".repeat(64), - previous_sha256: None, - outcome: RoutingArtifactOutcomeV1::Planned, - }], - conflicts: vec![], - declared_routes: vec![RoutingDeclaredRouteEvidenceV1 { - selector: "work_type=code".into(), - profile: "implementer".into(), - }], - effective_routes: vec![], - }; - record.validate().unwrap(); -} - -#[test] -fn preview_apply_and_second_apply_are_deterministic() { - let root = tempdir().unwrap(); - let bundle = RoutingBundleV1::parse_json(VALID).unwrap(); - let preview = preview_bundle(root.path(), &bundle, None).unwrap(); - assert!(preview.is_applicable()); - assert_eq!(preview.artifacts[0].action, RoutingArtifactActionV1::Create); - - let (_, receipts) = apply_bundle(root.path(), &bundle, None).unwrap(); - assert_eq!(receipts[0].outcome, RoutingArtifactOutcomeV1::Created); - let created = root.path().join(&bundle.artifacts[0].path); - let RoutingArtifactPayloadV1::Inline(expected) = &bundle.artifacts[0].payload else { - panic!("fixture artifact must be inline"); - }; - assert_eq!(std::fs::read(created).unwrap(), expected.content.as_bytes()); - - let second = preview_bundle(root.path(), &bundle, None).unwrap(); - assert_eq!( - second.artifacts[0].action, - RoutingArtifactActionV1::Unchanged - ); - let (_, receipts) = apply_bundle(root.path(), &bundle, None).unwrap(); - assert_eq!(receipts[0].outcome, RoutingArtifactOutcomeV1::Unchanged); -} - -#[test] -fn replace_mode_is_explicit_and_hash_evidenced() { - let root = tempdir().unwrap(); - let mut bundle = RoutingBundleV1::parse_json(VALID).unwrap(); - let target = root.path().join(&bundle.artifacts[0].path); - std::fs::create_dir_all(target.parent().unwrap()).unwrap(); - std::fs::write(&target, "old").unwrap(); - bundle.artifacts[0].mode = RoutingArtifactModeV1::Replace; - bundle.artifacts[0].payload = RoutingArtifactPayloadV1::Inline(RoutingInlineContentV1 { - content: "new".into(), - }); - bundle.artifacts[0].sha256 = sha256(b"new"); - - let preview = preview_bundle(root.path(), &bundle, None).unwrap(); - assert_eq!( - preview.artifacts[0].action, - RoutingArtifactActionV1::Replace - ); - let (_, receipts) = apply_bundle(root.path(), &bundle, None).unwrap(); - assert_eq!(receipts[0].outcome, RoutingArtifactOutcomeV1::Replaced); - let old_sha256 = sha256(b"old"); - assert_eq!( - receipts[0].previous_sha256.as_deref(), - Some(old_sha256.as_str()) - ); - assert_eq!(std::fs::read_to_string(target).unwrap(), "new"); -} - -#[test] -fn conflicts_and_unsafe_paths_fail_before_any_write() { - let root = tempdir().unwrap(); - let bundle = RoutingBundleV1::parse_json(VALID).unwrap(); - let target = root.path().join(&bundle.artifacts[0].path); - std::fs::create_dir_all(target.parent().unwrap()).unwrap(); - std::fs::write(&target, "unrelated").unwrap(); - let preview = preview_bundle(root.path(), &bundle, None).unwrap(); - assert!(!preview.is_applicable()); - assert!(apply_bundle(root.path(), &bundle, None).is_err()); - assert_eq!(std::fs::read_to_string(target).unwrap(), "unrelated"); - - for path in [ - "../escape", - "/tmp/escape", - "~/.codex/config.toml", - ".codex/config.toml", - "outside/generated.txt", - ] { - let mut unsafe_bundle = bundle.clone(); - unsafe_bundle.artifacts[0].path = path.to_string(); - assert!( - preview_bundle(root.path(), &unsafe_bundle, None).is_err(), - "{path}" - ); - } -} - -#[test] -fn parent_child_artifact_collisions_fail_before_creating_directories() { - let root = tempdir().unwrap(); - let mut bundle = RoutingBundleV1::parse_json(VALID).unwrap(); - let mut parent = bundle.artifacts[0].clone(); - parent.path = ".planr/generated".into(); - let mut child = bundle.artifacts[0].clone(); - child.path = ".planr/generated/role.toml".into(); - bundle.artifacts = vec![parent, child]; - - assert!(matches!( - bundle.validate(), - Err(RoutingBundleError::ArtifactPathCollision { .. }) - )); - assert!(preview_bundle(root.path(), &bundle, None).is_err()); - assert!(!root.path().join(".planr").exists()); -} - -#[test] -fn injected_directory_creation_failure_is_journaled_and_rolled_back() { - let root = tempdir().unwrap(); - let parent = root.path().join(".codex/agents/nested"); - let mut created = Vec::new(); - let mut calls = 0; - let error = create_missing_directories_with(root.path(), &parent, &mut created, |directory| { - calls += 1; - if calls == 2 { - Err(std::io::Error::new( - std::io::ErrorKind::PermissionDenied, - "injected create failure", - )) - } else { - std::fs::create_dir(directory) - } - }) - .unwrap_err(); - assert!(error.to_string().contains("injected create failure")); - assert_eq!(created.len(), 1); - assert!(created[0].exists()); - - rollback_transaction(&[], &[], &created).unwrap(); - assert!(!root.path().join(".codex").exists()); -} - -#[test] -fn injected_backup_cleanup_failure_restores_previous_content() { - let root = tempdir().unwrap(); - let target = root.path().join("target.toml"); - let backup = root.path().join("target.backup"); - std::fs::write(&target, "new").unwrap(); - std::fs::write(&backup, "old").unwrap(); - let committed = vec![CommittedArtifact { - target: target.clone(), - backup: Some(backup.clone()), - previous_content: Some(b"old".to_vec()), - }]; - - let error = cleanup_backups_with(&committed, |_| { - Err(std::io::Error::new( - std::io::ErrorKind::PermissionDenied, - "injected backup cleanup failure", - )) - }) - .unwrap_err(); - assert!( - error - .to_string() - .contains("injected backup cleanup failure") - ); - - rollback_transaction(&[], &committed, &[]).unwrap(); - assert_eq!(std::fs::read_to_string(&target).unwrap(), "old"); - assert!(!backup.exists()); -} - -#[cfg(unix)] -#[test] -fn symlink_escape_is_rejected_before_writes() { - use std::os::unix::fs::symlink; - - let root = tempdir().unwrap(); - let outside = tempdir().unwrap(); - std::fs::create_dir_all(root.path().join(".codex")).unwrap(); - symlink(outside.path(), root.path().join(".codex/agents")).unwrap(); - let bundle = RoutingBundleV1::parse_json(VALID).unwrap(); - let error = preview_bundle(root.path(), &bundle, None) - .unwrap_err() - .to_string(); - assert!(error.contains("symlink")); - assert_eq!(std::fs::read_dir(outside.path()).unwrap().count(), 0); -} - -#[test] -fn signatures_cover_the_unsigned_canonical_bundle() { - let mut bundle = RoutingBundleV1::parse_json(VALID).unwrap(); - let signing_key = SigningKey::from_bytes(&[7_u8; 32]); - let signature = signing_key.sign(&bundle.signing_bytes().unwrap()); - bundle.signature = Some(RoutingBundleSignatureV1 { - algorithm: RoutingSignatureAlgorithmV1::Ed25519, - signer: "test-fixture".into(), - value: encode_hex(&signature.to_bytes()), - }); - assert_eq!( - bundle.validate(), - Err(RoutingBundleError::SignatureTrustRequired) - ); - let trust = RoutingBundleTrustAnchorV1 { - signer: "test-fixture".into(), - public_key: encode_hex(signing_key.verifying_key().as_bytes()), - }; - bundle.validate_with_trust(Some(&trust)).unwrap(); - let attacker = RoutingBundleTrustAnchorV1 { - signer: "test-fixture".into(), - public_key: encode_hex( - SigningKey::from_bytes(&[8_u8; 32]) - .verifying_key() - .as_bytes(), - ), - }; - assert_eq!( - bundle.validate_with_trust(Some(&attacker)), - Err(RoutingBundleError::InvalidSignature) - ); - let root = tempdir().unwrap(); - assert!( - preview_bundle(root.path(), &bundle, None) - .unwrap_err() - .to_string() - .contains("external trusted signer") - ); - preview_bundle(root.path(), &bundle, Some(&trust)).unwrap(); - - bundle.policy_version = "tampered".into(); - assert_eq!( - bundle.validate_with_trust(Some(&trust)), - Err(RoutingBundleError::InvalidSignature) - ); -} - -fn encode_hex(bytes: &[u8]) -> String { - bytes.iter().map(|byte| format!("{byte:02x}")).collect() -} diff --git a/tests/e2e.rs b/tests/e2e.rs index aec9409..6d24d1f 100644 --- a/tests/e2e.rs +++ b/tests/e2e.rs @@ -9125,6 +9125,42 @@ fn planr_native_skills_are_packaged_and_cli_first() { "retired Codex fallback remains: {removed}" ); } + let loop_skill = + fs::read_to_string(root.join("plugins/planr/skills/planr-loop/SKILL.md")).unwrap(); + assert!( + loop_skill.contains("Pick packets expose provider-neutral `routing.profile`; they do not expose a host-owned `routing.agent_type`"), + "planr-loop must document that pick packets expose routing.profile, not routing.agent_type" + ); + assert!( + loop_skill + .contains("dispatch that profile identifier as the host-native role/`agent_type`"), + "planr-loop must use matching external profile identifiers as native agent_type" + ); + assert!( + loop_skill.contains( + "If no matching repository role exists, keep the host's default dispatch contract" + ), + "planr-loop must preserve default host dispatch when no matching role exists" + ); + assert!( + loop_skill.contains("Model, effort, profile, client, and fallback fields are advisory declarations and evidence labels only"), + "planr-loop must keep model/profile/fallback fields advisory" + ); + assert!( + loop_skill.contains("attach route observations when available"), + "planr-loop must preserve effective route evidence recording" + ); + for removed in [ + "dispatch through the routing skill", + "resolved native `agent_type`", + "named profile's client and model", + "move down the `fallbacks` chain", + ] { + assert!( + !loop_skill.contains(removed), + "planr-loop reintroduced Planr-owned routing dispatch language: {removed}" + ); + } } #[test] @@ -9247,7 +9283,7 @@ fn project_init_and_install_provision_loop_agent_roles() { ); // `planr install codex` is MCP-only; optional model-specific role files - // remain exclusively owned by externally compiled routing bundles. + // remain exclusively owned by external routing tools. let dir2 = tempdir().unwrap(); let db2 = dir2.path().join(".planr/planr.sqlite"); planr() diff --git a/tests/routing_ownership.rs b/tests/routing_ownership.rs index 38418c9..89bb791 100644 --- a/tests/routing_ownership.rs +++ b/tests/routing_ownership.rs @@ -1,6 +1,37 @@ use std::fs; use std::path::{Path, PathBuf}; +const REMOVED_ROUTING_PATHS: &[&str] = &[ + "planr-routing", + "src/app/routing.rs", + "src/routing_bundle.rs", + "src/routing_bundle/tests.rs", +]; + +const FORBIDDEN_ROUTING_OWNER_NAMES: &[&str] = &[ + "planr-routing", + "routing_bundle", + "routing workflow skill", + "src/app/routing.rs", + "src/routing_bundle.rs", + "src/routing_bundle/tests.rs", +]; + +const ROUTING_OWNER_SCAN_ROOTS: &[&str] = &[ + "src", + "plugins/planr/skills", + "docs", + "README.md", + "Cargo.toml", + "package.json", +]; + +#[derive(Debug, PartialEq, Eq)] +struct ForbiddenHit { + path: String, + needle: &'static str, +} + fn rust_files(root: &Path, out: &mut Vec) { for entry in fs::read_dir(root).unwrap() { let path = entry.unwrap().path(); @@ -14,6 +45,46 @@ fn rust_files(root: &Path, out: &mut Vec) { } } +fn scan_file(path: &Path, root: &Path, hits: &mut Vec) { + let Ok(text) = fs::read_to_string(path) else { + return; + }; + for needle in FORBIDDEN_ROUTING_OWNER_NAMES { + if text.contains(needle) { + hits.push(ForbiddenHit { + path: path.strip_prefix(root).unwrap().display().to_string(), + needle, + }); + } + } +} + +fn scan_path(path: &Path, root: &Path, hits: &mut Vec) { + if path.is_dir() { + for entry in fs::read_dir(path).unwrap() { + scan_path(&entry.unwrap().path(), root, hits); + } + } else if path.is_file() { + scan_file(path, root, hits); + } +} + +fn forbidden_routing_owner_hits(root: &Path) -> Vec { + let mut hits = Vec::new(); + for relative in ROUTING_OWNER_SCAN_ROOTS { + let path = root.join(relative); + if path.exists() { + scan_path(&path, root, &mut hits); + } + } + hits.sort_by(|left, right| { + left.path + .cmp(&right.path) + .then_with(|| left.needle.cmp(right.needle)) + }); + hits +} + #[test] fn planr_core_contains_no_model_policy_or_legacy_preset_owner() { let root = Path::new(env!("CARGO_MANIFEST_DIR")); @@ -61,3 +132,45 @@ fn planr_core_contains_no_model_policy_or_legacy_preset_owner() { } } } + +#[test] +fn planr_core_contains_no_legacy_routing_owner_inventory() { + let root = Path::new(env!("CARGO_MANIFEST_DIR")); + for removed in REMOVED_ROUTING_PATHS { + assert!( + !root.join(removed).exists(), + "legacy routing owner path returned: {removed}" + ); + } + + let hits = forbidden_routing_owner_hits(root); + assert_eq!( + hits, + Vec::::new(), + "legacy routing owner names must not appear in active Planr surfaces" + ); +} + +#[test] +fn routing_owner_inventory_detector_catches_seeded_legacy_names() { + let mut hits = Vec::new(); + let fixture_path = "seeded/legacy-routing-owner.txt".to_string(); + let seeded = FORBIDDEN_ROUTING_OWNER_NAMES.join("\n"); + for needle in FORBIDDEN_ROUTING_OWNER_NAMES { + if seeded.contains(needle) { + hits.push(ForbiddenHit { + path: fixture_path.clone(), + needle, + }); + } + } + + let expected = FORBIDDEN_ROUTING_OWNER_NAMES + .iter() + .map(|needle| ForbiddenHit { + path: fixture_path.clone(), + needle, + }) + .collect::>(); + assert_eq!(hits, expected); +}