Three.js visualization will render here
-
- Connect @echo/renderer-three to enable
-
diff --git a/.ban-unordered-abi-allowlist b/.ban-unordered-abi-allowlist index c7b608b8..eccc9089 100644 --- a/.ban-unordered-abi-allowlist +++ b/.ban-unordered-abi-allowlist @@ -1,7 +1,6 @@ # Non-ABI crates and internal state where HashMap/HashSet are acceptable. **/warp-viewer/** **/echo-session-service/** -**/echo-session-ws-gateway/** **/warp-core/src/engine_impl.rs **/warp-core/src/attachment.rs **/echo-wasm-abi/src/lib.rs diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d4d8eeeb..fd08519c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -3,408 +3,374 @@ name: CI on: - push: - branches: - - main - pull_request: + push: + branches: + - main + pull_request: jobs: - fmt: - name: Format - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - with: - submodules: false - - uses: dtolnay/rust-toolchain@1.90.0 - - uses: Swatinem/rust-cache@v2 - with: - workspaces: | - . - - name: cargo fmt - run: cargo fmt --all -- --check + fmt: + name: Format + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + submodules: false + - uses: dtolnay/rust-toolchain@1.90.0 + - uses: Swatinem/rust-cache@v2 + with: + workspaces: | + . + - name: cargo fmt + run: cargo fmt --all -- --check - clippy: - name: Clippy - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - with: - submodules: false - - uses: dtolnay/rust-toolchain@1.90.0 - with: - components: clippy - - uses: Swatinem/rust-cache@v2 - with: - workspaces: | - . - - name: cargo clippy - run: cargo clippy --all-targets -- -D warnings -D missing_docs + clippy: + name: Clippy + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + submodules: false + - uses: dtolnay/rust-toolchain@1.90.0 + with: + components: clippy + - uses: Swatinem/rust-cache@v2 + with: + workspaces: | + . + - name: cargo clippy + run: cargo clippy --all-targets -- -D warnings -D missing_docs - clippy-det-fixed: - name: Clippy (det_fixed) - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - with: - submodules: false - - uses: dtolnay/rust-toolchain@1.90.0 - with: - components: clippy - - uses: Swatinem/rust-cache@v2 - with: - workspaces: | - . - - name: cargo clippy (warp-core, det_fixed) - run: cargo clippy -p warp-core --all-targets --features det_fixed -- -D warnings -D missing_docs + clippy-det-fixed: + name: Clippy (det_fixed) + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + submodules: false + - uses: dtolnay/rust-toolchain@1.90.0 + with: + components: clippy + - uses: Swatinem/rust-cache@v2 + with: + workspaces: | + . + - name: cargo clippy (warp-core, det_fixed) + run: cargo clippy -p warp-core --all-targets --features det_fixed -- -D warnings -D missing_docs - test-workspace: - name: Tests (workspace sans warp-core) - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - with: - submodules: false - - uses: dtolnay/rust-toolchain@1.90.0 - - uses: Swatinem/rust-cache@v2 - with: - workspaces: | - . - - name: cargo test (workspace sans warp-core) - run: cargo test --workspace --exclude warp-core + test-workspace: + name: Tests (workspace sans warp-core) + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + submodules: false + - uses: dtolnay/rust-toolchain@1.90.0 + - uses: Swatinem/rust-cache@v2 + with: + workspaces: | + . + - name: cargo test (workspace sans warp-core) + run: cargo test --workspace --exclude warp-core - test-warp-core: - name: Tests (warp-core) - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - with: - submodules: false - - uses: dtolnay/rust-toolchain@1.90.0 - - uses: Swatinem/rust-cache@v2 - with: - workspaces: | - . - - name: Install cargo-nextest - uses: taiki-e/install-action@5ab5d1729c22acd8f798b267eadcfe5e5be6f5c2 # v2.68.27 - with: - tool: nextest - - name: cargo nextest run (warp-core) - run: cargo nextest run -p warp-core - - name: cargo test --doc (warp-core) - run: cargo test -p warp-core --doc - - name: PRNG golden regression (warp-core) - run: cargo test -p warp-core --features golden_prng --test prng_golden_regression + build-echo-cas-wasm: + name: Build echo-cas (wasm32) + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + submodules: false + - uses: dtolnay/rust-toolchain@1.90.0 + with: + targets: wasm32-unknown-unknown + - uses: Swatinem/rust-cache@v2 + with: + workspaces: | + . + - name: cargo build (echo-cas, wasm32) + run: cargo build --target wasm32-unknown-unknown -p echo-cas - test: - name: Tests - runs-on: ubuntu-latest - needs: - - test-workspace - - test-warp-core - if: always() - steps: - - name: Require test shard success - shell: bash - run: | - set -euo pipefail - workspace_result="${{ needs.test-workspace.result }}" - warp_core_result="${{ needs.test-warp-core.result }}" - if [[ "$workspace_result" != "success" ]]; then - echo "workspace shard result: $workspace_result" >&2 - exit 1 - fi - if [[ "$warp_core_result" != "success" ]]; then - echo "warp-core shard result: $warp_core_result" >&2 - exit 1 - fi - echo "All test shards passed." + test-warp-core: + name: Tests (warp-core) + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + submodules: false + - uses: dtolnay/rust-toolchain@1.90.0 + - uses: Swatinem/rust-cache@v2 + with: + workspaces: | + . + - name: Install cargo-nextest + uses: taiki-e/install-action@5ab5d1729c22acd8f798b267eadcfe5e5be6f5c2 # v2.68.27 + with: + tool: nextest + - name: cargo nextest run (warp-core) + run: cargo nextest run -p warp-core + - name: cargo test --doc (warp-core) + run: cargo test -p warp-core --doc + - name: PRNG golden regression (warp-core) + run: cargo test -p warp-core --features golden_prng --test prng_golden_regression - test-musl: - name: Tests (musl) - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - with: - submodules: false - - uses: dtolnay/rust-toolchain@1.90.0 - with: - targets: x86_64-unknown-linux-musl - - name: Install musl tools - run: sudo apt-get update && sudo apt-get install -y musl-tools - - uses: Swatinem/rust-cache@v2 - with: - workspaces: | - . - # Intentionally test only warp-core under MUSL; warp-wasm targets wasm32 - # (wasm-bindgen/js-sys) and has separate cross-compilation concerns. - - name: cargo test (warp-core, musl) - run: cargo test -p warp-core --target x86_64-unknown-linux-musl - - test-det-fixed: - name: Tests (det_fixed) - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - with: - submodules: false - - uses: dtolnay/rust-toolchain@1.90.0 - - uses: Swatinem/rust-cache@v2 - with: - workspaces: | - . - - name: cargo test (warp-core, det_fixed) - run: cargo test -p warp-core --features det_fixed - - test-musl-det-fixed: - name: Tests (musl, det_fixed) - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - with: - submodules: false - - uses: dtolnay/rust-toolchain@1.90.0 - with: - targets: x86_64-unknown-linux-musl - - name: Install musl tools - run: sudo apt-get update && sudo apt-get install -y musl-tools - - uses: Swatinem/rust-cache@v2 - with: - workspaces: | - . - - name: cargo test (warp-core, musl, det_fixed) - run: cargo test -p warp-core --features det_fixed --target x86_64-unknown-linux-musl - - rust-version: - name: Rust Version Guard - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - with: - submodules: false - - uses: dtolnay/rust-toolchain@1.90.0 - - name: Check workspace rust-version declarations - shell: bash - run: | - set -euo pipefail - script="scripts/check_rust_versions.sh" - if [[ ! -x "$script" ]]; then - echo "Error: $script is missing or not executable" >&2 - ls -la scripts || true - exit 1 - fi - "$script" - - name: Rust version checker self-tests - shell: bash - run: | - set -euo pipefail - bash scripts/tests/check_rust_versions_test.sh - - task-lists: - name: Task Lists Guard - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - name: Check task lists for contradictions - shell: bash - run: | - set -euo pipefail - script="scripts/check_task_lists.sh" - if [[ ! -x "$script" ]]; then - echo "Error: $script is missing or not executable" >&2 - ls -la scripts || true - exit 1 - fi - "$script" - - name: Task list checker self-tests - shell: bash - run: | - set -euo pipefail - bash scripts/tests/check_task_lists_test.sh - - deterministic-math-guard: - name: Deterministic Math Guard - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - name: Forbid raw trig in warp-core math - shell: bash - run: | - set -euo pipefail - script="scripts/check_no_raw_trig.sh" - if [[ ! -x "$script" ]]; then - echo "Error: $script is missing or not executable" >&2 - ls -la scripts || true - exit 1 - fi - "$script" - - determinism-guards: - name: Determinism Guards - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - name: Install ripgrep - run: sudo apt-get update && sudo apt-get install -y ripgrep - - name: Ban globals - shell: bash - run: | - set -euo pipefail - script="scripts/ban-globals.sh" - if [[ ! -x "$script" ]]; then - echo "Error: $script is missing or not executable" >&2 - ls -la scripts || true - exit 1 - fi - "$script" - - name: Ban nondeterminism - shell: bash - run: | - set -euo pipefail - script="scripts/ban-nondeterminism.sh" - if [[ ! -x "$script" ]]; then - echo "Error: $script is missing or not executable" >&2 - ls -la scripts || true - exit 1 - fi - "$script" - - name: Ban unordered ABI containers - shell: bash - run: | - set -euo pipefail - script="scripts/ban-unordered-abi.sh" - if [[ ! -x "$script" ]]; then - echo "Error: $script is missing or not executable" >&2 - ls -la scripts || true - exit 1 - fi - "$script" - - dind-pr: - name: DIND (PR set) - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - uses: dtolnay/rust-toolchain@1.90.0 - - uses: actions/setup-node@v4 - with: - node-version: "20" - - name: Run DIND PR suite (full hash) - run: node scripts/dind-run-suite.mjs --tags pr - - benches: - name: Benchmarks (compilation gate) - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - with: - submodules: false - - uses: dtolnay/rust-toolchain@1.90.0 - - uses: Swatinem/rust-cache@v2 - with: - workspaces: | - . - - name: cargo check (benches) - run: cargo check --benches -p warp-benches - - # MSRV job removed per policy: use @stable everywhere - - playwright: - name: E2E (Playwright) - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - with: - submodules: false + test: + name: Tests + runs-on: ubuntu-latest + needs: + - test-workspace + - test-warp-core + if: always() + steps: + - name: Require test shard success + shell: bash + run: | + set -euo pipefail + workspace_result="${{ needs.test-workspace.result }}" + warp_core_result="${{ needs.test-warp-core.result }}" + if [[ "$workspace_result" != "success" ]]; then + echo "workspace shard result: $workspace_result" >&2 + exit 1 + fi + if [[ "$warp_core_result" != "success" ]]; then + echo "warp-core shard result: $warp_core_result" >&2 + exit 1 + fi + echo "All test shards passed." - - uses: dtolnay/rust-toolchain@1.90.0 + test-musl: + name: Tests (musl) + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + submodules: false + - uses: dtolnay/rust-toolchain@1.90.0 + with: + targets: x86_64-unknown-linux-musl + - name: Install musl tools + run: sudo apt-get update && sudo apt-get install -y musl-tools + - uses: Swatinem/rust-cache@v2 + with: + workspaces: | + . + # Intentionally test only warp-core under MUSL; warp-wasm targets wasm32 + # (wasm-bindgen/js-sys) and has separate cross-compilation concerns. + - name: cargo test (warp-core, musl) + run: cargo test -p warp-core --target x86_64-unknown-linux-musl - - uses: Swatinem/rust-cache@v2 - with: - workspaces: | - . + test-det-fixed: + name: Tests (det_fixed) + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + submodules: false + - uses: dtolnay/rust-toolchain@1.90.0 + - uses: Swatinem/rust-cache@v2 + with: + workspaces: | + . + - name: cargo test (warp-core, det_fixed) + run: cargo test -p warp-core --features det_fixed - - uses: actions/setup-node@v4 - with: - node-version: "20" + test-musl-det-fixed: + name: Tests (musl, det_fixed) + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + submodules: false + - uses: dtolnay/rust-toolchain@1.90.0 + with: + targets: x86_64-unknown-linux-musl + - name: Install musl tools + run: sudo apt-get update && sudo apt-get install -y musl-tools + - uses: Swatinem/rust-cache@v2 + with: + workspaces: | + . + - name: cargo test (warp-core, musl, det_fixed) + run: cargo test -p warp-core --features det_fixed --target x86_64-unknown-linux-musl - - uses: pnpm/action-setup@v4 - with: - version: 10.23.0 - run_install: false + rust-version: + name: Rust Version Guard + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + submodules: false + - uses: dtolnay/rust-toolchain@1.90.0 + - name: Check workspace rust-version declarations + shell: bash + run: | + set -euo pipefail + script="scripts/check_rust_versions.sh" + if [[ ! -x "$script" ]]; then + echo "Error: $script is missing or not executable" >&2 + ls -la scripts || true + exit 1 + fi + "$script" + - name: Rust version checker self-tests + shell: bash + run: | + set -euo pipefail + bash scripts/tests/check_rust_versions_test.sh - - name: Resolve pnpm store path - shell: bash - run: | - set -euo pipefail - echo "PNPM_STORE_PATH=$(pnpm store path --silent)" >> "$GITHUB_ENV" + task-lists: + name: Task Lists Guard + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: Check task lists for contradictions + shell: bash + run: | + set -euo pipefail + script="scripts/check_task_lists.sh" + if [[ ! -x "$script" ]]; then + echo "Error: $script is missing or not executable" >&2 + ls -la scripts || true + exit 1 + fi + "$script" + - name: Task list checker self-tests + shell: bash + run: | + set -euo pipefail + bash scripts/tests/check_task_lists_test.sh - - name: Cache pnpm store - uses: actions/cache@v4 - with: - path: ${{ env.PNPM_STORE_PATH }} - key: ${{ runner.os }}-pnpm-store-${{ hashFiles('pnpm-lock.yaml') }} - restore-keys: | - ${{ runner.os }}-pnpm-store- + man-pages: + name: Man Pages Freshness + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + submodules: false + - uses: dtolnay/rust-toolchain@1.90.0 + - uses: Swatinem/rust-cache@v2 + with: + workspaces: | + . + - name: Check generated echo-cli man pages + run: cargo xtask man-pages --check - - name: Cache Playwright browsers - uses: actions/cache@v4 - with: - path: ~/.cache/ms-playwright - key: ${{ runner.os }}-playwright-${{ hashFiles('pnpm-lock.yaml') }} - restore-keys: | - ${{ runner.os }}-playwright- + deterministic-math-guard: + name: Deterministic Math Guard + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: Forbid raw trig in warp-core math + shell: bash + run: | + set -euo pipefail + script="scripts/check_no_raw_trig.sh" + if [[ ! -x "$script" ]]; then + echo "Error: $script is missing or not executable" >&2 + ls -la scripts || true + exit 1 + fi + "$script" - - name: Install JS dependencies - run: pnpm install --frozen-lockfile + determinism-guards: + name: Determinism Guards + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: Install ripgrep + run: sudo apt-get update && sudo apt-get install -y ripgrep + - name: Ban globals + shell: bash + run: | + set -euo pipefail + script="scripts/ban-globals.sh" + if [[ ! -x "$script" ]]; then + echo "Error: $script is missing or not executable" >&2 + ls -la scripts || true + exit 1 + fi + "$script" + - name: Ban nondeterminism + shell: bash + run: | + set -euo pipefail + script="scripts/ban-nondeterminism.sh" + if [[ ! -x "$script" ]]; then + echo "Error: $script is missing or not executable" >&2 + ls -la scripts || true + exit 1 + fi + "$script" + - name: Ban unordered ABI containers + shell: bash + run: | + set -euo pipefail + script="scripts/ban-unordered-abi.sh" + if [[ ! -x "$script" ]]; then + echo "Error: $script is missing or not executable" >&2 + ls -la scripts || true + exit 1 + fi + "$script" - - name: Install Playwright Chromium - run: pnpm exec playwright install --with-deps chromium + dind-pr: + name: DIND (PR set) + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: dtolnay/rust-toolchain@1.90.0 + - uses: actions/setup-node@v4 + with: + node-version: "20" + - name: Run DIND PR suite (full hash) + run: node scripts/dind-run-suite.mjs --tags pr - - name: Playwright e2e - run: pnpm exec playwright test + benches: + name: Benchmarks (compilation gate) + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + submodules: false + - uses: dtolnay/rust-toolchain@1.90.0 + - uses: Swatinem/rust-cache@v2 + with: + workspaces: | + . + - name: cargo check (benches) + run: cargo check --benches -p warp-benches - - name: Upload Playwright report - if: always() - uses: actions/upload-artifact@v4 - with: - name: playwright-report - path: | - playwright-report - test-results - if-no-files-found: ignore - retention-days: 7 + # MSRV job removed per policy: use @stable everywhere - rustdoc: - name: Rustdoc (warnings gate) - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - with: - submodules: false - - uses: dtolnay/rust-toolchain@1.90.0 - - uses: Swatinem/rust-cache@v2 - - name: rustdoc warnings gate (warp-core) - run: RUSTDOCFLAGS="-D warnings" cargo doc -p warp-core --no-deps - - name: rustdoc warnings gate (warp-geom) - run: RUSTDOCFLAGS="-D warnings" cargo doc -p warp-geom --no-deps - - name: rustdoc warnings gate (warp-wasm) - run: | - if [ -f crates/warp-wasm/Cargo.toml ]; then RUSTDOCFLAGS="-D warnings" cargo doc -p warp-wasm --no-deps; fi + rustdoc: + name: Rustdoc (warnings gate) + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + submodules: false + - uses: dtolnay/rust-toolchain@1.90.0 + - uses: Swatinem/rust-cache@v2 + - name: rustdoc warnings gate (warp-core) + run: RUSTDOCFLAGS="-D warnings" cargo doc -p warp-core --no-deps + - name: rustdoc warnings gate (warp-geom) + run: RUSTDOCFLAGS="-D warnings" cargo doc -p warp-geom --no-deps + - name: rustdoc warnings gate (warp-wasm) + run: | + if [ -f crates/warp-wasm/Cargo.toml ]; then RUSTDOCFLAGS="-D warnings" cargo doc -p warp-wasm --no-deps; fi - deny: - name: Dependency Policy (cargo-deny) - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - uses: dtolnay/rust-toolchain@stable - - uses: Swatinem/rust-cache@v2 - - name: Pre-fetch crates (locked) - run: cargo fetch --locked - - name: cargo-audit runner self-tests - shell: bash - run: | - set -euo pipefail - bash scripts/tests/run_cargo_audit_test.sh - - name: Run cargo-deny - uses: EmbarkStudios/cargo-deny-action@76cd80eb775d7bbbd2d80292136d74d39e1b4918 # v2.0.14 + deny: + name: Dependency Policy (cargo-deny) + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: dtolnay/rust-toolchain@stable + - uses: Swatinem/rust-cache@v2 + - name: Pre-fetch crates (locked) + run: cargo fetch --locked + - name: cargo-audit runner self-tests + shell: bash + run: | + set -euo pipefail + bash scripts/tests/run_cargo_audit_test.sh + - name: Run cargo-deny + uses: EmbarkStudios/cargo-deny-action@76cd80eb775d7bbbd2d80292136d74d39e1b4918 # v2.0.14 diff --git a/.github/workflows/refresh-dependency-dags.yml b/.github/workflows/refresh-dependency-dags.yml index 9a797b88..59e1dc21 100644 --- a/.github/workflows/refresh-dependency-dags.yml +++ b/.github/workflows/refresh-dependency-dags.yml @@ -36,9 +36,6 @@ jobs: - name: Install Graphviz run: sudo apt-get update && sudo apt-get install -y graphviz - - name: Generate Tasks DAG assets - run: node scripts/generate-tasks-dag.js - - name: Generate DAG DOT+SVG (from GitHub) env: GH_TOKEN: ${{ github.token }} diff --git a/.gitignore b/.gitignore index bfccc3bb..73defebd 100644 --- a/.gitignore +++ b/.gitignore @@ -48,10 +48,6 @@ artifacts/pr-review/ __pycache__/ *.pyc -# Playwright artifacts -test-results -playwright-report - # LaTeX build artifacts (keep PDFs tracked) *.aux *.log diff --git a/CHANGELOG.md b/CHANGELOG.md index 3cc77c3d..6232acea 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,12 @@ ### Added +- `echo-registry-api::verify_contract_artifact(...)` — generic load-time + verification for Wesley-generated registries, including schema/codec/layout + checks, expected footprint certificate hashes, optional generated artifact + hashes, and a policy switch requiring all mutation operations to be backed by + an expected certificate before the artifact is treated as + compile-time-certified. - Cycle 0003 (dt policy) — ratify fixed timestep as default, variable-dt as opt-in admitted stream, braidability constraint for settlement. - `KERNEL_strand-contract` backlog item — strand as a first-class @@ -45,6 +51,29 @@ ### Fixed (PR #326 follow-up) +- Added regression coverage that rejects trailing whitespace in the committed + `echo-cli --help` golden fixture, and cleaned the existing padded blank line. +- Split generated contract artifact verification into `MetadataVerified` and + `CompileTimeCertified` postures so weak or metadata-only host policies cannot + accidentally enable the trusted footprint fast path. +- Strengthened Wesley footprint certificate artifact hashes so they incorporate + a generated Rust artifact manifest hash and operation argument shape instead + of only the declared read/write footprint. +- Changed GraphQL SDL operation id generation to fail closed on derived id + collisions instead of silently incrementing persisted ABI ids. +- Replaced generated query optic variable digests with Echo ABI's + domain-separated BLAKE3 `query_vars_digest_v1(...)` helper. +- Made built-in observation request helpers fail closed on invalid + frame/projection pairs instead of silently falling back to `QueryBytes`. +- Restored the CodeRabbit archive path filter and added a hook regression guard + so frozen `docs/archive/**` files stay out of automated review. +- Split the large `warp-core` optic module test body into `optic/tests.rs` and + added a hook guard so production optic code is no longer buried under the + test suite. +- Verified imported witnessed causal suffix bundle digests before admission and + reject forged retained-shell identities. +- Validated exported witnessed suffix boundary witnesses against the source + worldline and resolved base/target frontier range. - Fixed Wesley-generated helper output so helper-only vars and intent error types live in a generated namespace instead of colliding with user contract types, while preserving top-level helper function re-exports, and added diff --git a/CONTINUUM.md b/CONTINUUM.md deleted file mode 100644 index 00de5352..00000000 --- a/CONTINUUM.md +++ /dev/null @@ -1,23 +0,0 @@ - - - -# Continuum - -Status: Archived platform memo - -This file used to describe a broader multi-repo Continuum platform around Echo. That language is no longer the live documentation frame for this repo. - -Echo's current docs describe Echo directly: - -- runtime carrier state in `warp-core` -- deterministic settlement through footprints and tick patches -- retained worldlines and provenance shells -- observer-relative readings through the observation and ABI surfaces - -Start with: - -- [Echo docs map](docs/index.md) -- [Echo runtime model](docs/architecture/outline.md) -- [Echo theory map](docs/theory/THEORY.md) - -Git history is the archive for the older Continuum memo. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index a6886150..7a5ac5f4 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -59,11 +59,9 @@ Echo is a deterministic, renderer-agnostic engine. We prioritize: `warp-core` integration-test binary before applying that runtime filter. - The broader local gate must pass before PR submission. - Add unit/integration coverage for new logic; Rhai/TypeScript tooling will regain coverage when reintroduced. -- For WASM / living specs: - - Install toolchain target: `rustup target add wasm32-unknown-unknown`. - - Install Trunk once: `cargo install --locked trunk`. - - Dev loop for Spec-000: from repo root run `make spec-000-dev` (hot reload at `http://127.0.0.1:8080`). - - Release build: `make spec-000-build` (outputs to `specs/spec-000-rewrite/dist/`). +- For WASM work, install the required target with + `rustup target add wasm32-unknown-unknown` and use the crate-specific build + instructions for the surface you are changing. ## Documentation & Telemetry diff --git a/Cargo.lock b/Cargo.lock index 60a862bc..7da1da26 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -11,6 +11,15 @@ dependencies = [ "memchr", ] +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + [[package]] name = "anes" version = "0.1.6" @@ -67,23 +76,23 @@ dependencies = [ "windows-sys 0.61.2", ] -[[package]] -name = "any_spawner" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1384d3fe1eecb464229fcf6eebb72306591c56bf27b373561489458a7c73027d" -dependencies = [ - "futures", - "thiserror 2.0.17", - "wasm-bindgen-futures", -] - [[package]] name = "anyhow" version = "1.0.100" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61" +[[package]] +name = "apollo-parser" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "947e21ff51879f8a40d7519dfe619268de2afba4042a8a43878276de3cb910f0" +dependencies = [ + "memchr", + "rowan", + "thiserror 2.0.17", +] + [[package]] name = "arrayref" version = "0.3.9" @@ -111,23 +120,6 @@ dependencies = [ "wait-timeout", ] -[[package]] -name = "async-lock" -version = "3.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "290f7f2596bd5b78a9fec8088ccd89180d7f9f55b94b0576823bbbdc72ee8311" -dependencies = [ - "event-listener", - "event-listener-strategy", - "pin-project-lite", -] - -[[package]] -name = "async-once-cell" -version = "0.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4288f83726785267c6f2ef073a3d83dc3f9b81464e9f99898240cced85fce35a" - [[package]] name = "async-trait" version = "0.1.89" @@ -139,54 +131,12 @@ dependencies = [ "syn", ] -[[package]] -name = "attribute-derive" -version = "0.10.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05832cdddc8f2650cc2cc187cc2e952b8c133a48eb055f35211f61ee81502d77" -dependencies = [ - "attribute-derive-macro", - "derive-where", - "manyhow", - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "attribute-derive-macro" -version = "0.10.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a7cdbbd4bd005c5d3e2e9c885e6fa575db4f4a3572335b974d8db853b6beb61" -dependencies = [ - "collection_literals", - "interpolator", - "manyhow", - "proc-macro-utils", - "proc-macro2", - "quote", - "quote-use", - "syn", -] - [[package]] name = "autocfg" version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" -[[package]] -name = "base16" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d27c3610c36aee21ce8ac510e6224498de4228ad772a171ed65643a24693a5a8" - -[[package]] -name = "base64" -version = "0.22.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" - [[package]] name = "bit-set" version = "0.8.0" @@ -267,6 +217,12 @@ dependencies = [ "syn", ] +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + [[package]] name = "bytes" version = "1.11.1" @@ -276,12 +232,6 @@ dependencies = [ "serde", ] -[[package]] -name = "camino" -version = "1.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e629a66d692cb9ff1a1c664e41771b3dcaf961985a9774c0eb0bd1b51cf60a48" - [[package]] name = "cast" version = "0.3.0" @@ -304,6 +254,20 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" +[[package]] +name = "chrono" +version = "0.4.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c673075a2e0e5f4a1dde27ce9dee1ea4558c7ffe648f576438a20ca1d2acc4b0" +dependencies = [ + "iana-time-zone", + "js-sys", + "num-traits", + "serde", + "wasm-bindgen", + "windows-link", +] + [[package]] name = "ciborium" version = "0.2.2" @@ -381,23 +345,6 @@ dependencies = [ "roff", ] -[[package]] -name = "codee" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9dbbdc4b4d349732bc6690de10a9de952bd39ba6a065c586e26600b6b0b91f5" -dependencies = [ - "serde", - "serde_json", - "thiserror 2.0.17", -] - -[[package]] -name = "collection_literals" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2550f75b8cfac212855f6b1885455df8eaee8fe8e246b647d69146142e016084" - [[package]] name = "colorchoice" version = "1.0.4" @@ -415,28 +362,6 @@ dependencies = [ "unicode-width", ] -[[package]] -name = "concurrent-queue" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" -dependencies = [ - "crossbeam-utils", -] - -[[package]] -name = "config" -version = "0.15.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b30fa8254caad766fc03cb0ccae691e14bf3bd72bfff27f72802ce729551b3d6" -dependencies = [ - "convert_case 0.6.0", - "pathdiff", - "serde_core", - "toml", - "winnow", -] - [[package]] name = "console_error_panic_hook" version = "0.1.7" @@ -447,38 +372,6 @@ dependencies = [ "wasm-bindgen", ] -[[package]] -name = "const-str" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0664d2867b4a32697dfe655557f5c3b187e9b605b38612a748e5ec99811d160" - -[[package]] -name = "const_format" -version = "0.2.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7faa7469a93a566e9ccc1c73fe783b4a65c274c5ace346038dca9c39fe0030ad" -dependencies = [ - "const_format_proc_macros", -] - -[[package]] -name = "const_format_proc_macros" -version = "0.2.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d57c2eccfb16dbac1f4e61e206105db5820c9d26c3c472bc17c774259ef7744" -dependencies = [ - "proc-macro2", - "quote", - "unicode-xid", -] - -[[package]] -name = "const_str_slice_concat" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f67855af358fcb20fac58f9d714c94e2b228fe5694c1c9b4ead4a366343eda1b" - [[package]] name = "constant_time_eq" version = "0.3.1" @@ -486,31 +379,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7c74b8349d32d297c9134b8c88677813a227df8f779daa29bfc29c183fe3dca6" [[package]] -name = "convert_case" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec182b0ca2f35d8fc196cf3404988fd8b8c739a4d270ff118a398feb0cbec1ca" -dependencies = [ - "unicode-segmentation", -] - -[[package]] -name = "convert_case" -version = "0.8.0" +name = "core-foundation-sys" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baaaa0ecca5b51987b9423ccdc971514dd8b0bb7b4060b983d3664dad3f1f89f" -dependencies = [ - "unicode-segmentation", -] +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" [[package]] -name = "convert_case" -version = "0.10.0" +name = "countme" +version = "3.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "633458d4ef8c78b72454de2d54fd6ab2e60f9e02be22f3c6104cdc8a4e0fceb9" -dependencies = [ - "unicode-segmentation", -] +checksum = "7704b5fdd17b18ae31c4c1da5a2e0305a2bf17b5249300a9ee9ed7b72114c636" [[package]] name = "cpufeatures" @@ -533,7 +411,7 @@ dependencies = [ "clap", "criterion-plot", "is-terminal", - "itertools 0.10.5", + "itertools", "num-traits", "once_cell", "oorandom", @@ -552,7 +430,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6b50826342786a51a89e2da3a28f1c32b06e387201bc2d19791f622c673706b1" dependencies = [ "cast", - "itertools 0.10.5", + "itertools", ] [[package]] @@ -619,20 +497,6 @@ dependencies = [ "typenum", ] -[[package]] -name = "dashmap" -version = "6.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5041cc499144891f3790297212f32a74fb938e5136a14943f338ef9e0ae276cf" -dependencies = [ - "cfg-if", - "crossbeam-utils", - "hashbrown 0.14.5", - "lock_api", - "once_cell", - "parking_lot_core", -] - [[package]] name = "deranged" version = "0.5.8" @@ -642,17 +506,6 @@ dependencies = [ "powerfmt", ] -[[package]] -name = "derive-where" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef941ded77d15ca19b40374869ac6000af1c9f2a4c0f3d4c70926287e6364a8f" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "difflib" version = "0.4.0" @@ -690,17 +543,6 @@ dependencies = [ "windows-sys 0.48.0", ] -[[package]] -name = "displaydoc" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "document-features" version = "0.2.12" @@ -710,12 +552,6 @@ dependencies = [ "litrs", ] -[[package]] -name = "drain_filter_polyfill" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "669a445ee724c5c69b1b06fe0b63e70a1c84bc9bb7d9696cd4f4e3ec45050408" - [[package]] name = "echo-app-core" version = "0.1.0" @@ -848,6 +684,7 @@ dependencies = [ name = "echo-wasm-abi" version = "0.1.0" dependencies = [ + "blake3", "ciborium", "half", "proptest", @@ -873,6 +710,7 @@ name = "echo-wesley-gen" version = "0.1.0" dependencies = [ "anyhow", + "blake3", "clap", "prettyplease", "proc-macro2", @@ -880,6 +718,7 @@ dependencies = [ "serde", "serde_json", "syn", + "wesley-core", ] [[package]] @@ -888,28 +727,12 @@ version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" -[[package]] -name = "either_of" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "216d23e0ec69759a17f05e1c553f3a6870e5ec73420fbb07807a6f34d5d1d5a4" -dependencies = [ - "paste", - "pin-project-lite", -] - [[package]] name = "equivalent" version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" -[[package]] -name = "erased" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1731451909bde27714eacba19c2566362a7f35224f52b153d3f42cf60f72472" - [[package]] name = "errno" version = "0.3.14" @@ -920,27 +743,6 @@ dependencies = [ "windows-sys 0.61.2", ] -[[package]] -name = "event-listener" -version = "5.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13b66accf52311f30a0db42147dadea9850cb48cd070028831ae5f5d4b856ab" -dependencies = [ - "concurrent-queue", - "parking", - "pin-project-lite", -] - -[[package]] -name = "event-listener-strategy" -version = "0.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93" -dependencies = [ - "event-listener", - "pin-project-lite", -] - [[package]] name = "fastrand" version = "2.3.0" @@ -968,20 +770,11 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" -[[package]] -name = "form_urlencoded" -version = "1.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" -dependencies = [ - "percent-encoding", -] - [[package]] name = "futures" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" +checksum = "8b147ee9d1f6d097cef9ce628cd2ee62288d963e16fb287bd9286455b241382d" dependencies = [ "futures-channel", "futures-core", @@ -994,9 +787,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" +checksum = "07bbe89c50d7a535e539b8c17bc0b49bdb77747034daa8087407d655f3f7cc1d" dependencies = [ "futures-core", "futures-sink", @@ -1004,33 +797,32 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" +checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d" [[package]] name = "futures-executor" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" +checksum = "baf29c38818342a3b26b5b923639e7b1f4a61fc5e76102d4b1981c6dc7a7579d" dependencies = [ "futures-core", "futures-task", "futures-util", - "num_cpus", ] [[package]] name = "futures-io" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" +checksum = "cecba35d7ad927e23624b22ad55235f2239cfa44fd10428eecbeba6d6a717718" [[package]] name = "futures-macro" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" +checksum = "e835b70203e41293343137df5c0664546da5745f82ec9b84d40be8336958447b" dependencies = [ "proc-macro2", "quote", @@ -1039,21 +831,21 @@ dependencies = [ [[package]] name = "futures-sink" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" +checksum = "c39754e157331b013978ec91992bde1ac089843443c49cbc7f46150b0fad0893" [[package]] name = "futures-task" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" +checksum = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393" [[package]] name = "futures-util" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" +checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6" dependencies = [ "futures-channel", "futures-core", @@ -1063,7 +855,6 @@ dependencies = [ "futures-task", "memchr", "pin-project-lite", - "pin-utils", "slab", ] @@ -1095,53 +886,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" dependencies = [ "cfg-if", - "js-sys", "libc", "r-efi", "wasip2", - "wasm-bindgen", -] - -[[package]] -name = "gloo-net" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c06f627b1a58ca3d42b45d6104bf1e1a03799df472df00988b6ba21accc10580" -dependencies = [ - "futures-channel", - "futures-core", - "futures-sink", - "gloo-utils", - "http", - "js-sys", - "pin-project", - "serde", - "serde_json", - "thiserror 1.0.69", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", ] -[[package]] -name = "gloo-utils" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b5555354113b18c547c1d3a98fbf7fb32a9ff4f6fa112ce823a21641a0ba3aa" -dependencies = [ - "js-sys", - "serde", - "serde_json", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "guardian" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17e2ac29387b1aa07a1e448f7bb4f35b500787971e965b02842b900afa5c8f6f" - [[package]] name = "half" version = "2.7.1" @@ -1161,9 +910,19 @@ checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" [[package]] name = "hashbrown" -version = "0.16.1" +version = "0.17.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" +checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" + +[[package]] +name = "hdrhistogram" +version = "7.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "765c9198f173dd59ce26ff9f95ef0aafd0a0fe01fb9d72841bc5066a4c06511d" +dependencies = [ + "byteorder", + "num-traits", +] [[package]] name = "heck" @@ -1184,172 +943,57 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" [[package]] -name = "html-escape" -version = "0.2.13" +name = "iana-time-zone" +version = "0.1.65" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d1ad449764d627e22bfd7cd5e8868264fc9236e07c752972b4080cd351cb476" +checksum = "e31bc9ad994ba00e440a8aa5c9ef0ec67d5cb5e5cb0cc7f8b744a35b389cc470" dependencies = [ - "utf8-width", + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "log", + "wasm-bindgen", + "windows-core", ] [[package]] -name = "http" -version = "1.4.0" +name = "iana-time-zone-haiku" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3ba2a386d7f85a81f119ad7498ebe444d2e22c2af0b86b069416ace48b3311a" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" dependencies = [ - "bytes", - "itoa", + "cc", ] [[package]] -name = "hydration_context" -version = "0.3.0" +name = "indexmap" +version = "2.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8714ae4adeaa846d838f380fbd72f049197de629948f91bf045329e0cf0a283" +checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9" dependencies = [ - "futures", - "once_cell", - "or_poisoned", - "pin-project-lite", + "equivalent", + "hashbrown 0.17.1", "serde", - "throw_error", + "serde_core", ] [[package]] -name = "icu_collections" -version = "2.1.1" +name = "is-terminal" +version = "0.4.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c6b649701667bbe825c3b7e6388cb521c23d88644678e83c0c4d0a621a34b43" +checksum = "3640c1c38b8e4e43584d8df18be5fc6b0aa314ce6ebf51b53313d4306cca8e46" dependencies = [ - "displaydoc", - "potential_utf", - "yoke", - "zerofrom", - "zerovec", + "hermit-abi", + "libc", + "windows-sys 0.61.2", ] [[package]] -name = "icu_locale_core" -version = "2.1.1" +name = "is_terminal_polyfill" +version = "1.70.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edba7861004dd3714265b4db54a3c390e880ab658fec5f7db895fae2046b5bb6" -dependencies = [ - "displaydoc", - "litemap", - "tinystr", - "writeable", - "zerovec", -] - -[[package]] -name = "icu_normalizer" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f6c8828b67bf8908d82127b2054ea1b4427ff0230ee9141c54251934ab1b599" -dependencies = [ - "icu_collections", - "icu_normalizer_data", - "icu_properties", - "icu_provider", - "smallvec", - "zerovec", -] - -[[package]] -name = "icu_normalizer_data" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a" - -[[package]] -name = "icu_properties" -version = "2.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "020bfc02fe870ec3a66d93e677ccca0562506e5872c650f893269e08615d74ec" -dependencies = [ - "icu_collections", - "icu_locale_core", - "icu_properties_data", - "icu_provider", - "zerotrie", - "zerovec", -] - -[[package]] -name = "icu_properties_data" -version = "2.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "616c294cf8d725c6afcd8f55abc17c56464ef6211f9ed59cccffe534129c77af" - -[[package]] -name = "icu_provider" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85962cf0ce02e1e0a629cc34e7ca3e373ce20dda4c4d7294bbd0bf1fdb59e614" -dependencies = [ - "displaydoc", - "icu_locale_core", - "writeable", - "yoke", - "zerofrom", - "zerotrie", - "zerovec", -] - -[[package]] -name = "idna" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" -dependencies = [ - "idna_adapter", - "smallvec", - "utf8_iter", -] - -[[package]] -name = "idna_adapter" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" -dependencies = [ - "icu_normalizer", - "icu_properties", -] - -[[package]] -name = "indexmap" -version = "2.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ad4bb2b565bca0645f4d68c5c9af97fba094e9791da685bf83cb5f3ce74acf2" -dependencies = [ - "equivalent", - "hashbrown 0.16.1", -] - -[[package]] -name = "interpolator" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71dd52191aae121e8611f1e8dc3e324dd0dd1dee1e6dd91d10ee07a3cfb4d9d8" - -[[package]] -name = "is-terminal" -version = "0.4.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3640c1c38b8e4e43584d8df18be5fc6b0aa314ce6ebf51b53313d4306cca8e46" -dependencies = [ - "hermit-abi", - "libc", - "windows-sys 0.61.2", -] - -[[package]] -name = "is_terminal_polyfill" -version = "1.70.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" +checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" [[package]] name = "itertools" @@ -1360,15 +1004,6 @@ dependencies = [ "either", ] -[[package]] -name = "itertools" -version = "0.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" -dependencies = [ - "either", -] - [[package]] name = "itoa" version = "1.0.17" @@ -1385,135 +1020,6 @@ dependencies = [ "wasm-bindgen", ] -[[package]] -name = "leptos" -version = "0.8.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f9569fc37575a5d64c0512145af7630bf651007237ef67a8a77328199d315bb" -dependencies = [ - "any_spawner", - "cfg-if", - "either_of", - "futures", - "getrandom 0.3.4", - "hydration_context", - "leptos_config", - "leptos_dom", - "leptos_hot_reload", - "leptos_macro", - "leptos_server", - "oco_ref", - "or_poisoned", - "paste", - "reactive_graph", - "rustc-hash", - "rustc_version", - "send_wrapper", - "serde", - "serde_json", - "serde_qs", - "server_fn", - "slotmap", - "tachys", - "thiserror 2.0.17", - "throw_error", - "typed-builder 0.23.2", - "typed-builder-macro 0.23.2", - "wasm-bindgen", - "wasm-bindgen-futures", - "wasm_split_helpers", - "web-sys", -] - -[[package]] -name = "leptos_config" -version = "0.8.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "071fc40aeb9fcab885965bad1887990477253ad51f926cd19068f45a44c59e89" -dependencies = [ - "config", - "regex", - "serde", - "thiserror 2.0.17", - "typed-builder 0.21.2", -] - -[[package]] -name = "leptos_dom" -version = "0.8.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78f4330c88694c5575e0bfe4eecf81b045d14e76a4f8b00d5fd2a63f8779f895" -dependencies = [ - "js-sys", - "or_poisoned", - "reactive_graph", - "send_wrapper", - "tachys", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "leptos_hot_reload" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d61ec3e1ff8aaee8c5151688550c0363f85bc37845450764c31ff7584a33f38" -dependencies = [ - "anyhow", - "camino", - "indexmap", - "parking_lot", - "proc-macro2", - "quote", - "rstml", - "serde", - "syn", - "walkdir", -] - -[[package]] -name = "leptos_macro" -version = "0.8.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c86ffd2e9cf3e264e9b3e16bdb086cefa26bd0fa7bc6a26b0cc5f6c1fd3178ed" -dependencies = [ - "attribute-derive", - "cfg-if", - "convert_case 0.10.0", - "html-escape", - "itertools 0.14.0", - "leptos_hot_reload", - "prettyplease", - "proc-macro-error2", - "proc-macro2", - "quote", - "rstml", - "rustc_version", - "server_fn_macro", - "syn", - "uuid", -] - -[[package]] -name = "leptos_server" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbf1045af93050bf3388d1c138426393fc131f6d9e46a65519da884c033ed730" -dependencies = [ - "any_spawner", - "base64", - "codee", - "futures", - "hydration_context", - "or_poisoned", - "reactive_graph", - "send_wrapper", - "serde", - "serde_json", - "server_fn", - "tachys", -] - [[package]] name = "libc" version = "0.2.178" @@ -1536,24 +1042,12 @@ dependencies = [ "libc", ] -[[package]] -name = "linear-map" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfae20f6b19ad527b550c223fddc3077a547fc70cda94b9b566575423fd303ee" - [[package]] name = "linux-raw-sys" version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" -[[package]] -name = "litemap" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77" - [[package]] name = "litrs" version = "1.0.0" @@ -1570,27 +1064,10 @@ dependencies = [ ] [[package]] -name = "manyhow" -version = "0.11.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b33efb3ca6d3b07393750d4030418d594ab1139cee518f0dc88db70fec873587" -dependencies = [ - "manyhow-macros", - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "manyhow-macros" -version = "0.11.4" +name = "log" +version = "0.4.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46fce34d199b78b6e6073abf984c9cf5fd3e9330145a93ee0738a7443e371495" -dependencies = [ - "proc-macro-utils", - "proc-macro2", - "quote", -] +checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" [[package]] name = "memchr" @@ -1628,10 +1105,31 @@ dependencies = [ ] [[package]] -name = "next_tuple" -version = "0.1.0" +name = "mio" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a69bcab0ad47271a0234d9422b131806bf3968021e5dc9328caf2d4cd58557fc" +dependencies = [ + "libc", + "wasi", + "windows-sys 0.61.2", +] + +[[package]] +name = "ninelives" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60993920e071b0c9b66f14e2b32740a4e27ffc82854dcd72035887f336a09a28" +checksum = "9eb329d63297228258d6747b37dcaaf6d9daa83ea7473b6b5c248ce87e93219d" +dependencies = [ + "async-trait", + "futures", + "rand 0.9.3", + "tokio", + "tower 0.5.3", + "tower-layer", + "tower-service", + "tracing", +] [[package]] name = "normalize-line-endings" @@ -1654,26 +1152,6 @@ dependencies = [ "autocfg", ] -[[package]] -name = "num_cpus" -version = "1.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91df4bbde75afed763b708b7eee1e8e7651e02d97f6d5dd763e89367e957b23b" -dependencies = [ - "hermit-abi", - "libc", -] - -[[package]] -name = "oco_ref" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed0423ff9973dea4d6bd075934fdda86ebb8c05bdf9d6b0507067d4a1226371d" -dependencies = [ - "serde", - "thiserror 2.0.17", -] - [[package]] name = "once_cell" version = "1.21.3" @@ -1698,12 +1176,6 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" -[[package]] -name = "or_poisoned" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c04f5d74368e4d0dfe06c45c8627c81bd7c317d52762d118fb9b3076f6420fd" - [[package]] name = "ordered-float" version = "2.10.1" @@ -1713,12 +1185,6 @@ dependencies = [ "num-traits", ] -[[package]] -name = "parking" -version = "2.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" - [[package]] name = "parking_lot" version = "0.12.5" @@ -1742,38 +1208,20 @@ dependencies = [ "windows-link", ] -[[package]] -name = "paste" -version = "1.0.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" - -[[package]] -name = "pathdiff" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df94ce210e5bc13cb6651479fa48d14f601d9858cfe0467f43ae157023b938d3" - -[[package]] -name = "percent-encoding" -version = "2.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" - [[package]] name = "pin-project" -version = "1.1.10" +version = "1.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677f1add503faace112b9f1373e43e9e054bfdd22ff1a63c1bc485eaec6a6a8a" +checksum = "cbf0d9e68100b3a7989b4901972f265cd542e560a3a8a724e1e20322f4d06ce9" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.10" +version = "1.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" +checksum = "a990e22f43e84855daf260dded30524ef4a9021cc7541c26540500a50b624389" dependencies = [ "proc-macro2", "quote", @@ -1782,24 +1230,9 @@ dependencies = [ [[package]] name = "pin-project-lite" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" - -[[package]] -name = "pin-utils" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" - -[[package]] -name = "potential_utf" -version = "0.1.4" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b73949432f5e2a09657003c25bca5e19a0e9c84f8058ca374f49e0ebe605af77" -dependencies = [ - "zerovec", -] +checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" [[package]] name = "powerfmt" @@ -1856,39 +1289,6 @@ dependencies = [ "syn", ] -[[package]] -name = "proc-macro-error-attr2" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96de42df36bb9bba5542fe9f1a054b8cc87e172759a1868aa05c1f3acc89dfc5" -dependencies = [ - "proc-macro2", - "quote", -] - -[[package]] -name = "proc-macro-error2" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11ec05c52be0a07b08061f7dd003e7d7092e0472bc731b4af7bb1ef876109802" -dependencies = [ - "proc-macro-error-attr2", - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "proc-macro-utils" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eeaf08a13de400bc215877b5bdc088f241b12eb42f0a548d3390dc1c56bb7071" -dependencies = [ - "proc-macro2", - "quote", - "smallvec", -] - [[package]] name = "proc-macro2" version = "1.0.104" @@ -1898,19 +1298,6 @@ dependencies = [ "unicode-ident", ] -[[package]] -name = "proc-macro2-diagnostics" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af066a9c399a26e020ada66a034357a868728e72cd426f3adcd35f80d88d88c8" -dependencies = [ - "proc-macro2", - "quote", - "syn", - "version_check", - "yansi", -] - [[package]] name = "proptest" version = "1.9.0" @@ -1956,28 +1343,6 @@ dependencies = [ "proc-macro2", ] -[[package]] -name = "quote-use" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9619db1197b497a36178cfc736dc96b271fe918875fbf1344c436a7e93d0321e" -dependencies = [ - "quote", - "quote-use-macros", -] - -[[package]] -name = "quote-use-macros" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82ebfb7faafadc06a7ab141a6f67bcfb24cb8beb158c6fe933f2f035afa99f35" -dependencies = [ - "proc-macro-utils", - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "r-efi" version = "5.3.0" @@ -2072,60 +1437,6 @@ dependencies = [ "crossbeam-utils", ] -[[package]] -name = "reactive_graph" -version = "0.2.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17f0df355582937223ea403e52490201d65295bd6981383c69bfae5a1f8730c2" -dependencies = [ - "any_spawner", - "async-lock", - "futures", - "guardian", - "hydration_context", - "indexmap", - "or_poisoned", - "paste", - "pin-project-lite", - "rustc-hash", - "rustc_version", - "send_wrapper", - "serde", - "slotmap", - "thiserror 2.0.17", - "web-sys", -] - -[[package]] -name = "reactive_stores" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35372f05664a62a3dd389503371a15b8feb3396f99f6ec000de651fddb030942" -dependencies = [ - "dashmap", - "guardian", - "itertools 0.14.0", - "or_poisoned", - "paste", - "reactive_graph", - "reactive_stores_macro", - "rustc-hash", - "send_wrapper", -] - -[[package]] -name = "reactive_stores_macro" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fa40919eb2975100283b2a70e68eafce1e8bcf81f0622ff168e4c2b3f8d46bb" -dependencies = [ - "convert_case 0.8.0", - "proc-macro-error2", - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "redox_syscall" version = "0.5.18" @@ -2182,34 +1493,28 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "88f8660c1ff60292143c98d08fc6e2f654d722db50410e3f3797d40baaf9d8f3" [[package]] -name = "rstml" -version = "0.12.1" +name = "rowan" +version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61cf4616de7499fc5164570d40ca4e1b24d231c6833a88bff0fe00725080fd56" +checksum = "417a3a9f582e349834051b8a10c8d71ca88da4211e4093528e36b9845f6b5f21" dependencies = [ - "derive-where", - "proc-macro2", - "proc-macro2-diagnostics", - "quote", - "syn", - "syn_derive", - "thiserror 2.0.17", + "countme", + "hashbrown 0.14.5", + "rustc-hash 1.1.0", + "text-size", ] [[package]] name = "rustc-hash" -version = "2.1.1" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" +checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" [[package]] -name = "rustc_version" -version = "0.4.1" +name = "rustc-hash" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" -dependencies = [ - "semver", -] +checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" [[package]] name = "rustix" @@ -2257,21 +1562,6 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" -[[package]] -name = "semver" -version = "1.0.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" - -[[package]] -name = "send_wrapper" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd0b0ec5f1c1ca621c432a25813d8d60c88abe6d3e08a3eb9cf37d97a0fe3d73" -dependencies = [ - "futures-core", -] - [[package]] name = "serde" version = "1.0.228" @@ -2329,6 +1619,7 @@ version = "1.0.148" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3084b546a1dd6289475996f182a22aba973866ea8e8b02c51d9f46b1336a22da" dependencies = [ + "indexmap", "itoa", "memchr", "serde", @@ -2336,84 +1627,6 @@ dependencies = [ "zmij", ] -[[package]] -name = "serde_qs" -version = "0.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3faaf9e727533a19351a43cc5a8de957372163c7d35cc48c90b75cdda13c352" -dependencies = [ - "percent-encoding", - "serde", - "thiserror 2.0.17", -] - -[[package]] -name = "serde_spanned" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8bbf91e5a4d6315eee45e704372590b30e260ee83af6639d64557f51b067776" -dependencies = [ - "serde_core", -] - -[[package]] -name = "server_fn" -version = "0.8.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "353d02fa2886cd8dae0b8da0965289fa8f2ecc7df633d1ce965f62fdf9644d29" -dependencies = [ - "base64", - "bytes", - "const-str", - "const_format", - "dashmap", - "futures", - "gloo-net", - "http", - "js-sys", - "pin-project-lite", - "rustc_version", - "rustversion", - "send_wrapper", - "serde", - "serde_json", - "serde_qs", - "server_fn_macro_default", - "thiserror 2.0.17", - "throw_error", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "wasm-streams", - "web-sys", - "xxhash-rust", -] - -[[package]] -name = "server_fn_macro" -version = "0.8.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "950b8cfc9ff5f39ca879c5a7c5e640de2695a199e18e424c3289d0964cabe642" -dependencies = [ - "const_format", - "convert_case 0.8.0", - "proc-macro2", - "quote", - "rustc_version", - "syn", - "xxhash-rust", -] - -[[package]] -name = "server_fn_macro_default" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63eb08f80db903d3c42f64e60ebb3875e0305be502bdc064ec0a0eab42207f00" -dependencies = [ - "server_fn_macro", - "syn", -] - [[package]] name = "sha2" version = "0.10.9" @@ -2432,19 +1645,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" [[package]] -name = "slab" -version = "0.4.11" +name = "signal-hook-registry" +version = "1.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" +checksum = "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b" +dependencies = [ + "errno", + "libc", +] [[package]] -name = "slotmap" -version = "1.1.1" +name = "slab" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bdd58c3c93c3d278ca835519292445cb4b0d4dc59ccfdf7ceadaab3f8aeb4038" -dependencies = [ - "version_check", -] +checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" [[package]] name = "smallvec" @@ -2453,20 +1667,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" [[package]] -name = "spec-000-rewrite" -version = "0.1.0" +name = "socket2" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a766e1110788c36f4fa1c2b71b387a7815aa65f88ce0229841826633d93723e" dependencies = [ - "console_error_panic_hook", - "leptos", - "wasm-bindgen", + "libc", + "windows-sys 0.61.2", ] -[[package]] -name = "stable_deref_trait" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" - [[package]] name = "strsim" version = "0.11.1" @@ -2484,62 +1693,11 @@ dependencies = [ "unicode-ident", ] -[[package]] -name = "syn_derive" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdb066a04799e45f5d582e8fc6ec8e6d6896040d00898eb4e6a835196815b219" -dependencies = [ - "proc-macro-error2", - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "synstructure" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "tachys" -version = "0.2.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2b2db11e455f7e84e2cc3e76f8a3f3843f7956096265d5ecff781eabe235077" -dependencies = [ - "any_spawner", - "async-trait", - "const_str_slice_concat", - "drain_filter_polyfill", - "either_of", - "erased", - "futures", - "html-escape", - "indexmap", - "itertools 0.14.0", - "js-sys", - "linear-map", - "next_tuple", - "oco_ref", - "or_poisoned", - "parking_lot", - "paste", - "reactive_graph", - "reactive_stores", - "rustc-hash", - "rustc_version", - "send_wrapper", - "slotmap", - "throw_error", - "wasm-bindgen", - "web-sys", -] +[[package]] +name = "sync_wrapper" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" [[package]] name = "tempfile" @@ -2560,6 +1718,12 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f50febec83f5ee1df3015341d8bd429f2d1cc62bcba7ea2076759d315084683" +[[package]] +name = "text-size" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f18aa187839b2bdb1ad2fa35ead8c4c2976b64e4363c386d45ac0f7ee85c9233" + [[package]] name = "thiserror" version = "1.0.69" @@ -2600,15 +1764,6 @@ dependencies = [ "syn", ] -[[package]] -name = "throw_error" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc0ed6038fcbc0795aca7c92963ddda636573b956679204e044492d2b13c8f64" -dependencies = [ - "pin-project-lite", -] - [[package]] name = "time" version = "0.3.47" @@ -2640,16 +1795,6 @@ dependencies = [ "time-core", ] -[[package]] -name = "tinystr" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42d3e9c45c09de15d06dd8acf5f4e0e399e85927b7f00711024eb7ae10fa4869" -dependencies = [ - "displaydoc", - "zerovec", -] - [[package]] name = "tinytemplate" version = "1.2.1" @@ -2661,82 +1806,110 @@ dependencies = [ ] [[package]] -name = "toml" -version = "0.9.10+spec-1.1.0" +name = "tokio" +version = "1.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0825052159284a1a8b4d6c0c86cbc801f2da5afd2b225fa548c72f2e74002f48" +checksum = "ff360e02eab121e0bc37a2d3b4d4dc622e6eda3a8e5253d5435ecf5bd4c68408" dependencies = [ - "serde_core", - "serde_spanned", - "toml_datetime", - "toml_parser", - "winnow", + "bytes", + "libc", + "mio", + "parking_lot", + "pin-project-lite", + "signal-hook-registry", + "socket2", + "tokio-macros", + "windows-sys 0.61.2", ] [[package]] -name = "toml_datetime" -version = "0.7.5+spec-1.1.0" +name = "tokio-macros" +version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92e1cfed4a3038bc5a127e35a2d360f145e1f4b971b551a2ba5fd7aedf7e1347" +checksum = "5c55a2eff8b69ce66c84f85e1da1c233edc36ceb85a2058d11b0d6a3c7e7569c" dependencies = [ - "serde_core", + "proc-macro2", + "quote", + "syn", ] [[package]] -name = "toml_parser" -version = "1.0.6+spec-1.1.0" +name = "tokio-util" +version = "0.7.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3198b4b0a8e11f09dd03e133c0280504d0801269e9afa46362ffde1cbeebf44" +checksum = "9ae9cec805b01e8fc3fd2fe289f89149a9b66dd16786abd8b19cfa7b48cb0098" dependencies = [ - "winnow", + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", ] [[package]] -name = "ttd-browser" -version = "0.1.0" +name = "tower" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" dependencies = [ - "ciborium", - "console_error_panic_hook", - "echo-session-proto", - "echo-ttd", - "js-sys", - "serde", - "ttd-protocol-rs", - "warp-core", - "wasm-bindgen", - "web-sys", + "futures-core", + "futures-util", + "pin-project", + "pin-project-lite", + "tower-layer", + "tower-service", + "tracing", ] [[package]] -name = "ttd-protocol-rs" -version = "0.1.0" +name = "tower" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebe5ef63511595f1344e2d5cfa636d973292adc0eec1f0ad45fae9f0851ab1d4" dependencies = [ - "serde", + "futures-core", + "futures-util", + "hdrhistogram", + "indexmap", + "pin-project-lite", + "slab", + "sync_wrapper", + "tokio", + "tokio-util", + "tower-layer", + "tower-service", + "tracing", ] [[package]] -name = "typed-builder" -version = "0.21.2" +name = "tower-layer" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fef81aec2ca29576f9f6ae8755108640d0a86dd3161b2e8bca6cfa554e98f77d" -dependencies = [ - "typed-builder-macro 0.21.2", -] +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" + +[[package]] +name = "tower-service" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" [[package]] -name = "typed-builder" -version = "0.23.2" +name = "tracing" +version = "0.1.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31aa81521b70f94402501d848ccc0ecaa8f93c8eb6999eb9747e72287757ffda" +checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" dependencies = [ - "typed-builder-macro 0.23.2", + "log", + "pin-project-lite", + "tracing-attributes", + "tracing-core", ] [[package]] -name = "typed-builder-macro" -version = "0.21.2" +name = "tracing-attributes" +version = "0.1.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ecb9ecf7799210407c14a8cfdfe0173365780968dc57973ed082211958e0b18" +checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" dependencies = [ "proc-macro2", "quote", @@ -2744,14 +1917,35 @@ dependencies = [ ] [[package]] -name = "typed-builder-macro" -version = "0.23.2" +name = "tracing-core" +version = "0.1.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "076a02dc54dd46795c2e9c8282ed40bcfb1e22747e955de9389a1de28190fb26" +checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" dependencies = [ - "proc-macro2", - "quote", - "syn", + "once_cell", +] + +[[package]] +name = "ttd-browser" +version = "0.1.0" +dependencies = [ + "ciborium", + "console_error_panic_hook", + "echo-session-proto", + "echo-ttd", + "js-sys", + "serde", + "ttd-protocol-rs", + "warp-core", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "ttd-protocol-rs" +version = "0.1.0" +dependencies = [ + "serde", ] [[package]] @@ -2790,53 +1984,12 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254" -[[package]] -name = "unicode-xid" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" - -[[package]] -name = "url" -version = "2.5.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08bc136a29a3d1758e07a9cca267be308aeebf5cfd5a10f3f67ab2097683ef5b" -dependencies = [ - "form_urlencoded", - "idna", - "percent-encoding", - "serde", -] - -[[package]] -name = "utf8-width" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1292c0d970b54115d14f2492fe0170adf21d68a1de108eebc51c1df4f346a091" - -[[package]] -name = "utf8_iter" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" - [[package]] name = "utf8parse" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" -[[package]] -name = "uuid" -version = "1.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2e054861b4bd027cd373e18e8d8d8e6548085000e41290d95ce0c373a654b4a" -dependencies = [ - "getrandom 0.3.4", - "js-sys", - "wasm-bindgen", -] - [[package]] name = "version_check" version = "0.9.5" @@ -2871,7 +2024,7 @@ dependencies = [ "criterion", "echo-dry-tests", "rayon", - "rustc-hash", + "rustc-hash 2.1.1", "warp-core", ] @@ -2907,7 +2060,7 @@ dependencies = [ "hex", "libm", "proptest", - "rustc-hash", + "rustc-hash 2.1.1", "serde", "serde-value", "thiserror 1.0.69", @@ -2963,19 +2116,6 @@ dependencies = [ "wasm-bindgen-shared", ] -[[package]] -name = "wasm-bindgen-futures" -version = "0.4.56" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "836d9622d604feee9e5de25ac10e3ea5f2d65b41eac0d9ce72eb5deae707ce7c" -dependencies = [ - "cfg-if", - "js-sys", - "once_cell", - "wasm-bindgen", - "web-sys", -] - [[package]] name = "wasm-bindgen-macro" version = "0.2.106" @@ -3009,48 +2149,33 @@ dependencies = [ ] [[package]] -name = "wasm-streams" -version = "0.4.2" +name = "web-sys" +version = "0.3.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15053d8d85c7eccdbefef60f06769760a563c7f0a9d6902a13d35c7800b0ad65" +checksum = "9b32828d774c412041098d182a8b38b16ea816958e07cf40eec2bc080ae137ac" dependencies = [ - "futures-util", "js-sys", "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", -] - -[[package]] -name = "wasm_split_helpers" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a114b3073258dd5de3d812cdd048cca6842342755e828a14dbf15f843f2d1b84" -dependencies = [ - "async-once-cell", - "wasm_split_macros", ] [[package]] -name = "wasm_split_macros" -version = "0.2.0" +name = "wesley-core" +version = "0.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56481f8ed1a9f9ae97ea7b08a5e2b12e8adf9a7818a6ba952b918e09c7be8bf0" +checksum = "8365972ab1d1d8ece193aa3de936223e33abe3844f3fba0e7049efc50f64b3ea" dependencies = [ - "base16", - "quote", + "apollo-parser", + "async-trait", + "chrono", + "hex", + "indexmap", + "ninelives", + "serde", + "serde_json", "sha2", - "syn", -] - -[[package]] -name = "web-sys" -version = "0.3.83" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b32828d774c412041098d182a8b38b16ea816958e07cf40eec2bc080ae137ac" -dependencies = [ - "js-sys", - "wasm-bindgen", + "thiserror 1.0.69", + "tokio", + "tower 0.4.13", ] [[package]] @@ -3084,12 +2209,65 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +[[package]] +name = "windows-core" +version = "0.62.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link", + "windows-result", + "windows-strings", +] + +[[package]] +name = "windows-implement" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "windows-interface" +version = "0.59.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "windows-link" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" +[[package]] +name = "windows-result" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-strings" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" +dependencies = [ + "windows-link", +] + [[package]] name = "windows-sys" version = "0.48.0" @@ -3165,27 +2343,12 @@ version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" -[[package]] -name = "winnow" -version = "0.7.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a5364e9d77fcdeeaa6062ced926ee3381faa2ee02d3eb83a5c27a8825540829" -dependencies = [ - "memchr", -] - [[package]] name = "wit-bindgen" version = "0.46.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" -[[package]] -name = "writeable" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9" - [[package]] name = "xtask" version = "0.1.0" @@ -3202,41 +2365,6 @@ dependencies = [ "warp-cli", ] -[[package]] -name = "xxhash-rust" -version = "0.8.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdd20c5420375476fbd4394763288da7eb0cc0b8c11deed431a91562af7335d3" - -[[package]] -name = "yansi" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed6529b049" - -[[package]] -name = "yoke" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954" -dependencies = [ - "stable_deref_trait", - "yoke-derive", - "zerofrom", -] - -[[package]] -name = "yoke-derive" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" -dependencies = [ - "proc-macro2", - "quote", - "syn", - "synstructure", -] - [[package]] name = "zerocopy" version = "0.8.31" @@ -3257,60 +2385,6 @@ dependencies = [ "syn", ] -[[package]] -name = "zerofrom" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" -dependencies = [ - "zerofrom-derive", -] - -[[package]] -name = "zerofrom-derive" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" -dependencies = [ - "proc-macro2", - "quote", - "syn", - "synstructure", -] - -[[package]] -name = "zerotrie" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a59c17a5562d507e4b54960e8569ebee33bee890c70aa3fe7b97e85a9fd7851" -dependencies = [ - "displaydoc", - "yoke", - "zerofrom", -] - -[[package]] -name = "zerovec" -version = "0.11.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c28719294829477f525be0186d13efa9a3c602f7ec202ca9e353d310fb9a002" -dependencies = [ - "yoke", - "zerofrom", - "zerovec-derive", -] - -[[package]] -name = "zerovec-derive" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "zmij" version = "1.0.2" diff --git a/Cargo.toml b/Cargo.toml index 4036a28e..bafd9f87 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -17,7 +17,6 @@ members = [ "crates/echo-dind-tests", "crates/echo-wasm-abi", "crates/echo-registry-api", - "specs/spec-000-rewrite", "crates/echo-wasm-bindings", "crates/echo-wesley-gen", "crates/echo-dry-tests", diff --git a/Makefile b/Makefile index 8bc6781b..bf6a6e75 100644 --- a/Makefile +++ b/Makefile @@ -223,16 +223,3 @@ bench-policy-open-inline: else \ echo "Open URL: $(BENCH_POLICY_REPORT_URI)" ; \ fi - -# Spec-000 (WASM) helpers -.PHONY: spec-000-dev spec-000-build - -spec-000-dev: - @command -v trunk >/dev/null 2>&1 || { echo "Error: trunk not found. Install: cargo install trunk" >&2; exit 1; } - @test -d specs/spec-000-rewrite || { echo "Error: specs/spec-000-rewrite not found" >&2; exit 1; } - @cd specs/spec-000-rewrite && trunk serve - -spec-000-build: - @command -v trunk >/dev/null 2>&1 || { echo "Error: trunk not found. Install: cargo install trunk" >&2; exit 1; } - @test -d specs/spec-000-rewrite || { echo "Error: specs/spec-000-rewrite not found" >&2; exit 1; } - @cd specs/spec-000-rewrite && trunk build --release diff --git a/README.md b/README.md index efc00f74..8a91b45a 100644 --- a/README.md +++ b/README.md @@ -1,173 +1,572 @@ +
-
Docs • Architecture • -Continuum • -warp-core • -AIΩN Framework +There Is No Graph • +Continuum • +WSC / Verkle / IPA • +warp-core
+# Echo + +Echo is the hot runtime optic in the WARP stack. + +It does not treat a graph, database, file tree, editor buffer, or in-memory +object heap as the ultimate truth. Echo's substrate is witnessed causal history: +admitted transitions, frontiers, receipts, witnesses, patches, checkpoints, +retained readings, and boundary artifacts. + +The hard doctrine is: + +```text +There is no privileged graph. +There are causal histories and lawful readings of those histories. +``` + +Echo turns that doctrine into runtime machinery. + +It admits canonical intents, schedules deterministic work, settles speculative +paths, emits evidence-bearing receipts, serves bounded observations, and retains +the artifacts needed to replay or verify what happened. Graph-shaped state is a +reading. Files are readings. Build outputs are readings. Debugger views are +readings. Echo exists to make those readings lawful, witnessed, and +replayable. + +## Thirty Second Version + +Echo is a deterministic runtime for admitting canonical intents and producing +witnessed readings. + +Most applications do not call Echo with application objects directly. They: + +```text +author GraphQL contract + -> compile with Wesley + -> use generated helpers + -> dispatch canonical EINT intents + -> observe ReadingEnvelope-backed results +``` + +Echo handles causal admission, receipts, witnesses, retention, replay, and +bounded observations. The application owns domain semantics. Wesley bridges the +two by turning authored contracts into typed generated surfaces. + +## Reader Paths + +- **Write an app:** start with + [Writing An Echo Application](#writing-an-echo-application), then read + [Application Contract Hosting](docs/architecture/application-contract-hosting.md). +- **Understand the model:** read [WARP And Continuum](#warp-and-continuum), + [Core Ontology](#core-ontology), and + [There Is No Graph](docs/architecture/there-is-no-graph.md). +- **Generate contracts:** use + [echo-wesley-gen](crates/echo-wesley-gen/README.md) with a GraphQL SDL + contract. +- **Hack the runtime:** start with [Core Crates](#core-crates), then run the + [Quick Start](#quick-start) checks. +- **Follow retained readings and proofs:** read + [WSC, Verkle, IPA, And Retained Readings](docs/architecture/wsc-verkle-ipa-retained-readings.md). + +## Why It Exists + +Traditional systems pretend there is one mutable global state: + +```text +program + state -> mutated state +``` + +That model leaks. It turns concurrency into locks, collaboration into merge +pain, debugging into archaeology, and generated artifacts into "trust me, this +script probably ran." +Echo follows the WARP model instead: -# What is Echo? +```text +causal basis + optic law + support obligations -> witnessed reading -Echo is a Rust implementation of the [WARP](https://github.com/flyingrobots/aion) (Worldline Algebra for Recursive Provenance) architecture. +reading + intent + admission law -> witnessed suffix -Traditional applications model state as a hierarchy of mutable containers, relying on locks and mutexes to manage concurrency. This approach leads to non-deterministic execution, making bugs difficult to reproduce and debug. +witnessed suffix + optic -> new reading +``` -**Echo fundamentally changes this model:** Instead of mutating a global state, Echo treats **witnessed causal history** as the ultimate source of truth. Graph-shaped structures are treated merely as observer-relative *views* over that history, rather than the core reality. Once kernel history is admitted, it is immutable. Parallel work is handled via private deltas that merge only when mathematically proven to be lawful, eliminating the need for runtime locks. +The result is not "no state." State-like values still exist everywhere. The +difference is authority: materialized state is a chart, cache, viewport, or +hologram. It is not the territory. + +## WARP And Continuum + +WARP is the runtime/optic model used here. A WARP optic is a bounded, +law-governed participant over causal history. It can observe, admit, retain, +reveal, import, materialize, or verify readings, but it does not own a canonical +global graph. + +Continuum is the compatibility layer between WARP participants. It is not Echo, +not "the Echo protocol," and not a second runtime that owns the truth. It is the +shared transport vocabulary for exchanging enough causal evidence for another +optic to produce a compatible local reading: + +- causal suffixes; +- coordinates and frontiers; +- witnesses, receipts, and support obligations; +- hologram and reading boundaries; +- optic, rule, schema, and artifact identifiers. + +Echo is one Continuum-speaking WARP participant. `git-warp`, Wesley, Graft, +WARPDrive, `warp-ttd`, and application tools such as `jedit` can also be WARP +participants when they exchange witnessed causal structure instead of pretending +to pass around a privileged graph object. + +The payload is not "the graph." The payload is the causal suffix, coordinate, +support, and witness material needed for another optic to construct its own +lawful reading. + +## Core Ontology + +| Concept | Meaning in Echo | +| ------------------ | ------------------------------------------------------------------------------------------------------------------------------------- | +| **Causal history** | The witnessed substrate: admitted transitions, frontiers, receipts, witnesses, and retained boundary artifacts. | +| **WARP optic** | A bounded, law-named operation over causal history. It may admit, observe, retain, reveal, import, or materialize. | +| **Reading** | An observer-relative artifact emitted from a coordinate, aperture, and projection law. | +| **Hologram** | A witnessed output carrying enough basis, law, aperture, evidence, identity, and posture to recreate the claim at its declared level. | +| **Witness** | Evidence that a transition or reading followed from a named basis under a named law. | +| **Shell** | A retained boundary artifact such as a tick patch, suffix bundle, provenance payload, or checkpoint base. | +| **ReadIdentity** | The semantic question a retained payload answers. It is intentionally separate from the CAS byte hash. | + +The front-door architecture note is +[There Is No Graph](docs/architecture/there-is-no-graph.md). + +## What Echo Owns + +Echo owns the generic hot runtime path: + +- canonical intent ingress; +- deterministic scheduling and footprint checks; +- rewrite settlement; +- worldline and provenance retention; +- replayable tick patches; +- Merkle commitments over state and patch boundaries; +- observation artifacts and `ReadingEnvelope` metadata; +- WASM/session boundaries for browser and host integration; +- `echo-cas` retention for bytes, witnesses, receipts, and cached readings. + +Echo does **not** own application nouns. + +Names like `ReplaceRange`, `JeditBuffer`, `CounterIncrement`, +`RenameSymbol`, or `GraftProjection` belong in authored contracts, +Wesley-generated code, application adapters, or fixtures. They must not become +Echo substrate APIs. + +## WARP Runtime Flow + +Echo's hot path is deliberately boring: + +1. External callers submit canonical intent bytes. +2. Inbox sequencing derives content identity and canonical pending order. +3. Rules propose candidate rewrites with explicit footprints. +4. The scheduler admits a deterministic independent subset. +5. The engine applies admitted rewrites. +6. Echo emits receipts, tick patches, provenance, and hashes. +7. Observation services resolve coordinates and return readings. +8. Retention stores the bytes and witness material needed for replay or + obstruction. + +The point is not to mutate a global graph. The point is to admit and observe +witnessed causal structure through explicit laws. + +## Application Contracts + +Applications talk to Echo through generated contracts, not app-specific runtime +APIs. + +Wesley is the compiler optic for those contracts. Application authors describe +their domain operations and readings in GraphQL SDL; Wesley lowers that +authored contract into generated helpers, registries, codecs, operation ids, +artifact metadata, and footprint certificates. Echo then hosts the generated +contract through generic dispatch and observation boundaries. + +Wesley exists because Echo's runtime boundary is intentionally generic. Echo +should not learn what `increment`, `ReplaceRange`, `CounterValue`, or +`JeditBuffer` mean. Generated Wesley code gives applications a typed surface +while preserving Echo's substrate rule: -# At a Glance +```text +Application nouns live in contracts. +Echo receives canonical intents and returns witnessed readings. +``` -| Feature | How Echo Achieves It | -|---|---| -| **Lock-Free Parallelism** | Immutable bases, private deltas, canonical merging, and strict footprint checks. | -| **0-ULP Determinism** | Platform-invariant math, logical (not system) time, and seeded randomness. | -| **Witnessed Admission** | Every accepted state transition carries reviewable cryptographic evidence. | -| **Bounded Optics** | State modifications (lowering) produce an explicit outcome, a witness, and a retained shell. | -| **Observer-Relative Reads** | Data reads carry coordinates, basis info, witnesses, and context. | -| **Live Settlement** | Speculative paths (strands) are settled against live evidence before merging. | +The current shape is: -# Core Architecture +```text +Application UI / adapter + -> Wesley-generated contract client + -> canonical operation variables + -> EINT intent bytes + -> Echo dispatch_intent(...) + -> Echo causal admission and receipts + -> Echo observe(...) + -> ReadingEnvelope + payload bytes + -> generated/application decoding + -> UI +``` -## The WARP Runtime Model +This is why a serious text editor such as `jedit` can own its rope model, +buffer law, edit-group law, checkpoint policy, and UI behavior while Echo stays +generic. Echo hosts the generated contract, verifies artifact metadata, admits +intents, emits readings, and retains bytes. It does not become a text editor. -Echo relies on a specific set of concepts to manage state and history: +See [Application Contract Hosting](docs/architecture/application-contract-hosting.md). -* **Witnessed Causal History:** The immutable, underlying semantic truth of the system. -* **Graph-Shaped Readings:** Filtered, observer-relative views projected from causal history. -* **Optics:** The rules defining how changes are lowered, admitted, witnessed, and retained. -* **Observers:** The rules defining what a read operation can project, preserve, accumulate, and output. -* **Shells:** Retained data packages that enable deterministic replay, auditing, network transport, and state revelation. +## Writing An Echo Application -Materialized state in Echo is just a cache, checkpoint, or reading surface—never the definitive source of truth. The only thing that truly matters is what was admitted, the laws governing it, the witness that proves it, and what an observer is allowed to read from it. +The normal authoring loop is contract-first: -## How State Evolves (Admission) +1. Author a GraphQL SDL contract in the application repo. +2. Declare operation/read names with `@wes_op`. +3. Declare deterministic access footprints with `@wes_footprint` when the + operation mutates or observes application state. +4. Run `echo-wesley-gen` to generate Rust contract helpers. +5. Have the host verify the generated registry/artifact metadata. +6. Use generated helpers to pack EINT intent bytes and build observation + requests. +7. Let Echo admit the intent, emit receipts, retain witnesses, and return a + `ReadingEnvelope`. +8. Decode and present the result in the application. -When Echo steps forward (ticks), it does not mutate a global object. Instead, work is evaluated through an **Optic**: +The end-to-end shape is: ```text -Optic = (ObserverPlan, OpticSlice, LoweringSurface, AdmissionLaw, RetentionContract) +counter.graphql + -> echo-wesley-gen + -> generated.rs + -> verify_contract_artifact(...) + -> pack_increment_intent(...) + -> dispatch_intent(...) + -> counter_value_observation_request(...) + -> observe(...) + -> inspect ReadingEnvelope +``` + +A tiny contract looks like this: + +```graphql +directive @wes_op(name: String!) on FIELD_DEFINITION +directive @wes_footprint( + reads: [String!] + writes: [String!] +) on FIELD_DEFINITION + +type CounterValue { + value: Int! +} + +input IncrementInput { + amount: Int! +} + +type Query { + counterValue: CounterValue! @wes_op(name: "counterValue") +} + +type Mutation { + increment(input: IncrementInput!): CounterValue! + @wes_op(name: "increment") + @wes_footprint(reads: ["CounterValue"], writes: ["CounterValue"]) +} +``` + +Generate the Rust contract surface: + +```bash +cargo run -p echo-wesley-gen -- --schema counter.graphql --out generated.rs +``` + +Application code should use generated helpers rather than hand-rolling Echo +wire bytes. Conceptually: + +```rust +let intent = generated::pack_increment_intent( + &generated::__echo_wesley_generated::IncrementVars { + input: generated::IncrementInput { amount: 1 }, + }, +)?; + +let response = echo_wasm_abi::kernel_port::KernelPort::dispatch_intent( + &mut kernel, + &intent, +)?; +``` + +For reads, generated query helpers build `ObservationRequest` values. Echo +returns an `ObservationArtifact` containing payload bytes plus a +`ReadingEnvelope`; the application should inspect that envelope before treating +the reading as complete. -Lower(frontier, weave) = (Outcome, Witness, Shell) +Current checked-in generation is Rust-first. TypeScript/browser generation +should follow the same contract identity, registry, artifact-verification, and +footprint-honesty rules rather than inventing a separate Echo API. -Outcome(X) = Derived(X) | Plural(X) | Conflict | Obstruction +### Boundary Vocabulary +- **GraphQL SDL contract:** the application-owned declaration of types, + operations, reads, and metadata. +- **Wesley:** the compiler optic that lowers the contract into generated Echo + helpers and registry metadata. +- **EINT:** Echo's canonical intent envelope. Generated helpers pack operation + variables into this shape. +- **ObservationRequest:** the generic Echo read request produced by generated + query helpers. +- **ReadingEnvelope:** the evidence wrapper around a returned reading. It names + basis, observer, projection, witness references, and whether the reading is + complete, residual, obstructed, or otherwise limited. +- **Artifact verification:** the host check that a generated contract registry + matches the expected schema, codec, registry version, and certificate + posture. + +## What Not To Put In Echo + +Echo is generic substrate. Keep application semantics above the generated +contract boundary. + +Do not add: + +- app-specific runtime APIs such as `replace_range(...)`, + `increment_counter(...)`, `rename_symbol(...)`, or `save_buffer(...)`; +- application-owned structs as core Echo state; +- GraphQL execution as Echo's runtime language; +- hand-rolled EINT packing in product code when generated helpers exist; +- jedit, Graft, Wesley, Continuum, or `git-warp` ownership inside Echo core. + +The operational anchor is: + +```text +big ontology claim: there is no privileged graph +runtime consequence: Echo stores witnessed causal history and serves readings +through explicit dispatch and observation boundaries ``` -* **Outcome:** Determines whether the change was admitted or why it failed. -* **Witness:** Provides the evidence required to audit the decision. -* **Shell:** Packages the data required for future replays or reads. +## jedit Boundary + +`jedit` is expected to be a serious Echo consumer, not an Echo submodule. + +`jedit` owns: + +- rope model and buffer semantics; +- edit group law; +- dirty state and checkpoint policy; +- editor UI and user interaction policy; +- the external text GraphQL contract. + +Wesley owns: + +- compiling that external GraphQL contract into generated helpers; +- carrying contract identity, schema identity, operation ids, registry + metadata, and footprint certificates. -# Observation and Artifacts +Echo owns: -In Echo, observation is an active, structured process, not a passive query. +- generic contract hosting; +- intent admission and scheduling; +- receipts, witnesses, and retained bytes; +- contract-aware readings and `ReadingEnvelope` posture. + +Echo tests may use generated `jedit` Wesley output as a fixture. Echo should not +author the `jedit` contract or grow text-editor APIs. + +## Retained Readings: WSC, Verkle, IPA, CAS + +Echo's retained-reading direction is: ```text -StructuralObserver = (Projection, ObserverBasis, ObserverState, UpdateLaw, EmissionLaw) +WSC = canonical columnar bytes for a reading or checkpoint +Verkle = authenticated commitment/index over those bytes +IPA = compact proof mechanism for opening bounded apertures +echo-cas = content-addressed byte retention +``` + +Short version: +```text +WSC gives us the table. +Verkle gives us the root. +IPA gives us the aperture proof. +echo-cas stores the bytes. ``` -Observations yield a `ReadingArtifact` containing the payload, coordinates, basis, budget, and witness. The WASM ABI (currently v6) wraps these in a `ReadingEnvelope` so host tools understand exactly how a read was resolved. This "holographic" approach allows tools to seamlessly reconstruct prior states or causal slices without bolting on an external debugger. +Current reality: + +- `warp-core` has WSC writing, validation, and borrowed view support. +- `echo-cas` stores opaque bytes by `BLAKE3(bytes)`. +- retained reading identity is intentionally separate from CAS byte identity. + +Future direction: + +- WSC-backed retained readings and checkpoints; +- Verkle or equivalent authenticated indexes over WSC coordinates; +- IPA or equivalent compact opening proofs for proof-carrying apertures; +- bounded reads that can verify selected rows, chunks, or ranges without + materializing the full retained reading. + +This is future proof infrastructure, not a new ontology. WSC is not truth. +Verkle is not truth. IPA is not storage. CAS is not semantic identity. + +See [WSC, Verkle, IPA, And Retained Readings](docs/architecture/wsc-verkle-ipa-retained-readings.md). + +## Current Reality -# Determinism by Construction +Works today: -Echo achieves exact, cross-platform reproducibility (0-ULP determinism). The kernel output will be identical whether running on 1 thread or 32, across Linux, macOS, or Windows, today or ten years from now. +- Rust contract generation from GraphQL SDL through `echo-wesley-gen`; +- generated registry metadata and operation descriptors; +- generated footprint certificate constants for `@wes_footprint`; +- host-side contract artifact verification through `echo-registry-api`; +- generic EINT dispatch and observation plumbing; +- WSC writing, validation, inspection, and borrowed views in `warp-core`; +- content-addressed byte retention in `echo-cas`; +- docs and Method backlog tracking for active contract-hosting work. -To enforce this, Echo strictly bans: +Designed or in progress: -* **Bare host floats:** All math uses fixed-point or platform-invariant scalars. -* **System wall-clock time:** Simulation time is an intrinsic property of the worldline. -* **Unseeded randomness:** Any tick utilizing randomness must include the seed as part of the admitted input. -* **Footprint enforcement** ensures parallelism remains deterministic. Optics declare bounded regions; the scheduler proves independence. Any proposed delta that violates its contract is structurally rejected—never patched or retried. +- TypeScript/browser generator parity; +- generated `jedit` contract fixtures as Echo integration evidence; +- contract-aware receipts and readings with full application identity; +- WSC-backed retained readings and checkpoints; +- Verkle or equivalent authenticated retained-reading indexes; +- IPA or equivalent proof-carrying aperture openings; +- full Continuum interchange across Echo, `git-warp`, Wesley, Graft, + WARPDrive, and `warp-ttd`. -# Runtime Surfaces & Stack +## Determinism Posture -Echo serves as the engine layer governing the transition from private speculation (strands) to shared causal reality. +Echo is built around exact replay and cross-platform convergence. -# Core Components +The runtime treats nondeterminism as an input discipline problem: -| Component | Role | -|---|---| -| **warp-core** | Hot runtime kernel handling worldlines, strands, observation, and settlement. | -| **echo-wasm-abi** | Current ABI v6 DTOs and canonical CBOR boundary. *Note: v6 is a compatibility epoch, not a promise of support for v1-v5.* | -| **warp-wasm** | wasm-bindgen boundary for browser and JavaScript environments. | -| **warp-cli** | Native CLI for inspection and verification. | -| **ObservationService** | Canonical read path emitting observation artifacts. | -| **SettlementService** | Handles strand comparison, import candidates, and conflicts. | -| **echo-cas** | Content-addressed storage substrate. | -| **echo-ttd & ttd-browser** | Time-travel/debugging protocol surfaces and their browser bridges. | -| **echo-dind-*** | Cross-platform harness for verifying hash convergence. | +- no ambient wall-clock time in admitted simulation law; +- no unseeded randomness inside ticks; +- platform-sensitive math is pinned behind deterministic representations; +- canonical CBOR is used at ABI boundaries; +- footprint declarations constrain parallel work; +- receipts and patches carry the evidence needed for replay and audit. -# Quick Start +The slogan is not "parallelism is safe because we hope so." The rule is: -## 1. Repository Setup +```text +parallel work is admitted only when the runtime can prove the admitted subset +is lawful for the current basis. +``` + +## Core Crates + +| Crate | Role | +| -------------------------- | -------------------------------------------------------------------------------------------------------- | +| `warp-core` | Hot runtime kernel: worldlines, scheduling, settlement, observation, WSC, receipts, and core WARP state. | +| `echo-wasm-abi` | Canonical host/runtime DTOs, `KernelPort`, canonical CBOR helpers, observation and dispatch surfaces. | +| `warp-wasm` | Browser/JavaScript boundary around the runtime kernel. | +| `warp-cli` | Native CLI for WSC inspection, validation, and runtime support tooling. | +| `echo-registry-api` | Minimal generic registry boundary for generated application contracts. | +| `echo-wesley-gen` | Wesley-to-Echo Rust generator for generated DTOs, op ids, registry metadata, and contract helpers. | +| `echo-cas` | Content-addressed byte store. It stores bytes; typed identity lives above it. | +| `echo-ttd` / `ttd-browser` | Time-travel/debugging protocol surfaces and browser bridges. | +| `echo-dind-*` | Cross-platform determinism harnesses and evidence tooling. | + +## Quick Start + +### Hacking Echo -Install the necessary guardrails and verify the current operational Method view. +Install hooks and check the current Method view: ```bash make hooks cargo xtask method status --json - ``` -## 2. Run a Fast Runtime Slice - -Execute the narrow test-slice path for rapid local iteration. +Run a fast runtime slice: ```bash cargo xtask test-slice warp-core-smoke +``` +Run focused generated-contract checks: + +```bash +cargo test -p echo-wesley-gen +cargo test -p echo-registry-api ``` -## 3. Build Documentation +Build the docs: -The documentation build serves as an active regression gate. ```bash pnpm docs:build +``` +Run the determinism harness: + +```bash +cargo xtask dind run ``` -## 4. Run the Determinism Harness +### Generating A Contract -Use Docker-in-Docker (DIND) to verify cross-platform hash convergence. +Generate a Rust contract surface from GraphQL SDL: ```bash -cargo xtask dind run +cargo run -p echo-wesley-gen -- --schema counter.graphql --out generated.rs +``` + +Generate to stdout while iterating: +```bash +cargo run -p echo-wesley-gen -- --schema counter.graphql ``` -# Documentation Directory +### Inspecting WSC + +Inspect a WSC snapshot: + +```bash +export SNAPSHOT=/path/to/state.wsc + +cargo run -p warp-cli -- inspect "$SNAPSHOT" +cargo run -p warp-cli -- inspect "$SNAPSHOT" --tree +cargo run -p warp-cli -- verify "$SNAPSHOT" +cargo run -p warp-cli -- --format json verify "$SNAPSHOT" +``` -* **Docs**: Main documentation map (runtime, replay, observation). -* **Bearing**: Repository direction and near-term priorities. -* **Architecture**: System architecture and layer model. -* **WARP Drift**: Adjustments regarding strands and suffix admission. -* **Optic & Observer Doctrine**: Core definitions for runtime nouns. -* **WASM ABI (v6)**: The active host/runtime contract. -* **Method**: Operational workflow and backlog automation rules. -* **DIND**: Instructions for the determinism testing harness. -* **Theory**: Theoretical foundations of the WARP model. -* **Continuum**: The multi-repository system model. +## Documentation Map + +- [Docs index](docs/index.md) +- [Current bearing](docs/BEARING.md) +- [Runtime model](docs/architecture/outline.md) +- [There Is No Graph](docs/architecture/there-is-no-graph.md) +- [Continuum Transport](docs/architecture/continuum-transport.md) +- [Application Contract Hosting](docs/architecture/application-contract-hosting.md) +- [echo-wesley-gen CLI](crates/echo-wesley-gen/README.md) +- [WSC, Verkle, IPA, And Retained Readings](docs/architecture/wsc-verkle-ipa-retained-readings.md) +- [warp-core spec](docs/spec/warp-core.md) +- [WASM ABI contract](docs/spec/SPEC-0009-wasm-abi.md) +- [Theory map](docs/theory/THEORY.md) +- [Contributor workflow](docs/workflows.md) ----Built by FLYING•ROBOTS +Built by FLYING•ROBOTS.
diff --git a/apps/ttd-app/src/components/ProvenanceDrawer.css b/apps/ttd-app/src/components/ProvenanceDrawer.css deleted file mode 100644 index f835c8a9..00000000 --- a/apps/ttd-app/src/components/ProvenanceDrawer.css +++ /dev/null @@ -1,195 +0,0 @@ -/* SPDX-License-Identifier: Apache-2.0 */ -/* © James Ross Ω FLYING•ROBOTS{truncateHash(write.ruleId)}
- {decodeValue(write.oldValue)}
- {decodeValue(write.newValue)}
- {truncateHash(atom.id, 4)}
- {JSON.stringify(atom.value, null, 2)}
- {truncateHash(node.id)}
- Three.js visualization will render here
-
- Connect @echo/renderer-three to enable
-
0?d[i-1]:l,v.x1=i
0)for(i=0;i=n)&&(e=n);else{let r=-1;for(let i of t)null!=(i=n(i,++r,t))&&(e=i)&&(e=i)}return e}function tt(t,n){let e,r=-1,i=-1;if(void 0===n)for(const n of t)++i,null!=n&&(e =0;)(r=i[o])&&(a&&4^r.compareDocumentPosition(a)&&a.parentNode.insertBefore(r,a),a=r);return this},sort:function(t){function n(n,e){return n&&e?t(n.__data__,e.__data__):!n-!e}t||(t=un);for(var e=this._groups,r=e.length,i=new Array(r),o=0;o >1)+h+t+M+S.slice(A);break;default:t=S+h+t+M}return u(t)}return y=void 0===y?6:/[gprs]/.test(_)?Math.max(1,Math.min(21,y)):Math.max(0,Math.min(20,y)),M.toString=function(){return t+""},M}return{format:l,formatPrefix:function(t,n){var e=l(((t=Jc(t)).type="f",t)),r=3*Math.max(-8,Math.min(8,Math.floor(Zc(n)/3))),i=Math.pow(10,-r),o=uf[8+r/3];return function(t){return e(i*t)+o}}}}function ff(n){return of=cf(n),t.format=of.format,t.formatPrefix=of.formatPrefix,of}function sf(t){return Math.max(0,-Zc(Math.abs(t)))}function lf(t,n){return Math.max(0,3*Math.max(-8,Math.min(8,Math.floor(Zc(n)/3)))-Zc(Math.abs(t)))}function hf(t,n){return t=Math.abs(t),n=Math.abs(n)-t,Math.max(0,Zc(n)-Zc(t))+1}t.format=void 0,t.formatPrefix=void 0,ff({thousands:",",grouping:[3],currency:["$",""]});var df=1e-6,pf=1e-12,gf=Math.PI,yf=gf/2,vf=gf/4,_f=2*gf,bf=180/gf,mf=gf/180,xf=Math.abs,wf=Math.atan,Mf=Math.atan2,Tf=Math.cos,Af=Math.ceil,Sf=Math.exp,Ef=Math.hypot,Nf=Math.log,kf=Math.pow,Cf=Math.sin,Pf=Math.sign||function(t){return t>0?1:t<0?-1:0},zf=Math.sqrt,$f=Math.tan;function Df(t){return t>1?0:t<-1?gf:Math.acos(t)}function Rf(t){return t>1?yf:t<-1?-yf:Math.asin(t)}function Ff(t){return(t=Cf(t/2))*t}function qf(){}function Uf(t,n){t&&Of.hasOwnProperty(t.type)&&Of[t.type](t,n)}var If={Feature:function(t,n){Uf(t.geometry,n)},FeatureCollection:function(t,n){for(var e=t.features,r=-1,i=e.length;++r=0?1:-1,i=r*e,o=Tf(n=(n*=mf)/2+vf),a=Cf(n),u=Vf*a,c=Gf*o+u*Tf(i),f=u*r*Cf(i);as.add(Mf(f,c)),Xf=t,Gf=o,Vf=a}function ds(t){return[Mf(t[1],t[0]),Rf(t[2])]}function ps(t){var n=t[0],e=t[1],r=Tf(e);return[r*Tf(n),r*Cf(n),Cf(e)]}function gs(t,n){return t[0]*n[0]+t[1]*n[1]+t[2]*n[2]}function ys(t,n){return[t[1]*n[2]-t[2]*n[1],t[2]*n[0]-t[0]*n[2],t[0]*n[1]-t[1]*n[0]]}function vs(t,n){t[0]+=n[0],t[1]+=n[1],t[2]+=n[2]}function _s(t,n){return[t[0]*n,t[1]*n,t[2]*n]}function bs(t){var n=zf(t[0]*t[0]+t[1]*t[1]+t[2]*t[2]);t[0]/=n,t[1]/=n,t[2]/=n}var ms,xs,ws,Ms,Ts,As,Ss,Es,Ns,ks,Cs,Ps,zs,$s,Ds,Rs,Fs={point:qs,lineStart:Is,lineEnd:Os,polygonStart:function(){Fs.point=Bs,Fs.lineStart=Ys,Fs.lineEnd=Ls,rs=new T,cs.polygonStart()},polygonEnd:function(){cs.polygonEnd(),Fs.point=qs,Fs.lineStart=Is,Fs.lineEnd=Os,as<0?(Wf=-(Kf=180),Zf=-(Qf=90)):rs>df?Qf=90:rs<-df&&(Zf=-90),os[0]=Wf,os[1]=Kf},sphere:function(){Wf=-(Kf=180),Zf=-(Qf=90)}};function qs(t,n){is.push(os=[Wf=t,Kf=t]),n t.r&&(t.r=t[n].r)}function c(){if(n){var r,i,o=n.length;for(e=new Array(o),r=0;r >>1;f[g]1;)i-=2;for(let t=2;t0){if(n>=this.ymax)return null;(i=(this.ymax-n)/r)0){if(t>=this.xmax)return null;(i=(this.xmax-t)/e)this.xmax?2:0)|(n9999?"+"+Ku(n,6):Ku(n,4))+"-"+Ku(t.getUTCMonth()+1,2)+"-"+Ku(t.getUTCDate(),2)+(o?"T"+Ku(e,2)+":"+Ku(r,2)+":"+Ku(i,2)+"."+Ku(o,3)+"Z":i?"T"+Ku(e,2)+":"+Ku(r,2)+":"+Ku(i,2)+"Z":r||e?"T"+Ku(e,2)+":"+Ku(r,2)+"Z":"")}function Ju(t){var n=new RegExp('["'+t+"\n\r]"),e=t.charCodeAt(0);function r(t,n){var r,i=[],o=t.length,a=0,u=0,c=o<=0,f=!1;function s(){if(c)return Hu;if(f)return f=!1,ju;var n,r,i=a;if(t.charCodeAt(i)===Xu){for(;a++=v)<<1|t>=y)&&(c=p[p.length-1],p[p.length-1]=p[p.length-1-f],p[p.length-1-f]=c)}else{var _=t-+this._x.call(null,g.data),b=n-+this._y.call(null,g.data),m=_*_+b*b;if(m=u)){(t.data!==n||t.next)&&(0===l&&(p+=(l=Uc(e))*l),0===h&&(p+=(h=Uc(e))*h),p(t=(Lc*t+jc)%Hc)/Hc}();function l(){h(),f.call("tick",n),e1?(f.on(t,e),n):f.on(t)}}},t.forceX=function(t){var n,e,r,i=qc(.1);function o(t){for(var i,o=0,a=n.length;o=.12&&i<.234&&r>=-.425&&r<-.214?u:i>=.166&&i<.234&&r>=-.214&&r<-.115?c:a).invert(t)},s.stream=function(e){return t&&n===e?t:(r=[a.stream(n=e),u.stream(e),c.stream(e)],i=r.length,t={point:function(t,n){for(var e=-1;++ejs(r[0],r[1])&&(r[1]=i[1]),js(i[0],r[1])>js(r[0],r[1])&&(r[0]=i[0])):o.push(r=i);for(a=-1/0,n=0,r=o[e=o.length-1];n<=e;r=i,++n)i=o[n],(u=js(r[1],i[0]))>a&&(a=u,Wf=i[0],Kf=r[1])}return is=os=null,Wf===1/0||Zf===1/0?[[NaN,NaN],[NaN,NaN]]:[[Wf,Zf],[Kf,Qf]]},t.geoCentroid=function(t){ms=xs=ws=Ms=Ts=As=Ss=Es=0,Ns=new T,ks=new T,Cs=new T,Lf(t,Gs);var n=+Ns,e=+ks,r=+Cs,i=Ef(n,e,r);return icode,kbd){white-space:nowrap}:where(pre){direction:ltr;max-inline-size:max-content;min-inline-size:0;white-space:pre;writing-mode:lr}:where(:not(pre)>code){background:var(--surface-2);border-radius:var(--radius-2);padding:var(--size-1) var(--size-2);writing-mode:lr}:where(kbd,var){border-color:var(--surface-4);border-radius:var(--radius-2);border-width:var(--border-size-1);padding:var(--size-1) var(--size-2)}:where(mark){border-radius:var(--radius-2);padding-inline:var(--size-1)}:where(ol,ul){padding-inline-start:var(--size-8)}:where(li){padding-inline-start:var(--size-2)}:where(li,dd,figcaption){max-inline-size:var(--size-content-2)}:where(p){text-wrap:pretty;max-inline-size:var(--size-content-3)}:where(dt,summary){font-weight:var(--font-weight-7)}:where(dt:not(:first-of-type)){margin-block-start:var(--size-5)}:where(small){font-size:max(.5em,var(--font-size-0));max-inline-size:var(--size-content-1)}:where(hr){background-color:var(--surface-3);height:var(--border-size-2);margin-block:var(--size-fluid-5)}:where(figure){display:grid;gap:var(--size-2);place-items:center}:where(figure)>:where(figcaption){text-wrap:balance;font-size:var(--font-size-1)}:where(blockquote,:not(blockquote)>cite){border-inline-start-width:var(--border-size-3)}:where(blockquote){display:grid;gap:var(--size-3);max-inline-size:var(--size-content-2);padding-block:var(--size-3);padding-inline:var(--size-4)}:where(:not(blockquote)>cite){padding-inline-start:var(--size-2)}:where(summary){background:var(--surface-3);border-radius:var(--radius-2);margin:calc(var(--size-2)*-1) calc(var(--size-3)*-1);padding:var(--size-2) var(--size-3)}:where(details){background:var(--surface-2);border-radius:var(--radius-2);padding-block:var(--size-2);padding-inline:var(--size-3)}:where(details[open]>summary){border-end-end-radius:0;border-end-start-radius:0;margin-bottom:var(--size-2)}:where(fieldset){border:var(--border-size-1) solid var(--surface-4);border-radius:var(--radius-2)}:where(del){background:var(--red-9);color:var(--red-2)}:where(ins){background:var(--green-9);color:var(--green-1)}:where(abbr){text-decoration-color:var(--blue-5)}:where(dialog){background-color:var(--surface-1);border-radius:var(--radius-3);box-shadow:var(--shadow-6);color:inherit}:where(menu){display:flex;gap:var(--size-3);padding-inline-start:0}:where(sup){font-size:.5em}:where(table){--nice-inner-radius:calc(var(--radius-3) - 2px);background:var(--surface-2);border:1px solid var(--surface-2);border-radius:var(--radius-3);width:fit-content}:where(table:not(:has(tfoot)) tr:last-child td:first-child){border-end-start-radius:var(--nice-inner-radius)}:where(table:not(:has(tfoot)) tr:last-child td:last-child){border-end-end-radius:var(--nice-inner-radius)}:where(table thead tr:first-child th:first-child){border-start-start-radius:var(--nice-inner-radius)}:where(table thead tr:first-child th:last-child){border-start-end-radius:var(--nice-inner-radius)}:where(tfoot tr:last-child th:first-of-type){border-end-start-radius:var(--nice-inner-radius)}:where(tfoot tr:last-child td:first-of-type){border-end-start-radius:var(--nice-inner-radius)}:where(tfoot tr:last-child th:last-of-type){border-end-end-radius:var(--nice-inner-radius)}:where(tfoot tr:last-child td:last-of-type){border-end-end-radius:var(--nice-inner-radius)}:where(th){background-color:var(--surface-2);color:var(--text-1)}:where(table a:not(.does-not-exist):focus-visible){outline-offset:-2px}:where(table button:not(.does-not-exist):focus-visible){outline-offset:-2px}:where(table [contenteditable]:focus-visible){outline-offset:-2px}:where(td){text-wrap:pretty;background:var(--surface-1);max-inline-size:var(--size-content-2)}:where(td,th){padding:var(--size-2);text-align:left}:where(td:not([align])){text-align:center}:where(th:not([align])){text-align:center}:where(thead){border-collapse:collapse}:where(table tr:hover td),:where(tbody tr:nth-child(2n):hover td){background-color:var(--surface-3)}:where(table>caption){margin:var(--size-3)}:where(tfoot button){padding-block:var(--size-1);padding-inline:var(--size-3)}@media (prefers-color-scheme:dark){:where(textarea,select,input:not([type=button],[type=submit],[type=reset])){background-color:#171a1c}:where(dialog){background-color:var(--surface-2)}::placeholder{color:var(--gray-6)}}
\ No newline at end of file
diff --git a/crates/echo-session-ws-gateway/assets/vendor/open-props.LICENSE b/crates/echo-session-ws-gateway/assets/vendor/open-props.LICENSE
deleted file mode 100644
index 57d11b0b..00000000
--- a/crates/echo-session-ws-gateway/assets/vendor/open-props.LICENSE
+++ /dev/null
@@ -1,21 +0,0 @@
-MIT License
-
-Copyright (c) 2021 Adam Argyle
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
diff --git a/crates/echo-session-ws-gateway/assets/vendor/open-props.min.css b/crates/echo-session-ws-gateway/assets/vendor/open-props.min.css
deleted file mode 100644
index 177cb68c..00000000
--- a/crates/echo-session-ws-gateway/assets/vendor/open-props.min.css
+++ /dev/null
@@ -1 +0,0 @@
-:where(html){--font-system-ui:system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif;--font-transitional:Charter,Bitstream Charter,Sitka Text,Cambria,serif;--font-old-style:Iowan Old Style,Palatino Linotype,URW Palladio L,P052,serif;--font-humanist:Seravek,Gill Sans Nova,Ubuntu,Calibri,DejaVu Sans,source-sans-pro,sans-serif;--font-geometric-humanist:Avenir,Montserrat,Corbel,URW Gothic,source-sans-pro,sans-serif;--font-classical-humanist:Optima,Candara,Noto Sans,source-sans-pro,sans-serif;--font-neo-grotesque:Inter,Roboto,Helvetica Neue,Arial Nova,Nimbus Sans,Arial,sans-serif;--font-monospace-slab-serif:Nimbus Mono PS,Courier New,monospace;--font-monospace-code:Dank Mono,Operator Mono,Inconsolata,Fira Mono,ui-monospace,SF Mono,Monaco,Droid Sans Mono,Source Code Pro,Cascadia Code,Menlo,Consolas,DejaVu Sans Mono,monospace;--font-industrial:Bahnschrift,DIN Alternate,Franklin Gothic Medium,Nimbus Sans Narrow,sans-serif-condensed,sans-serif;--font-rounded-sans:ui-rounded,Hiragino Maru Gothic ProN,Quicksand,Comfortaa,Manjari,Arial Rounded MT,Arial Rounded MT Bold,Calibri,source-sans-pro,sans-serif;--font-slab-serif:Rockwell,Rockwell Nova,Roboto Slab,DejaVu Serif,Sitka Small,serif;--font-antique:Superclarendon,Bookman Old Style,URW Bookman,URW Bookman L,Georgia Pro,Georgia,serif;--font-didone:Didot,Bodoni MT,Noto Serif Display,URW Palladio L,P052,Sylfaen,serif;--font-handwritten:Segoe Print,Bradley Hand,Chilanka,TSCu_Comic,casual,cursive;--font-sans:var(--font-system-ui);--font-serif:ui-serif,serif;--font-mono:var(--font-monospace-code);--font-weight-1:100;--font-weight-2:200;--font-weight-3:300;--font-weight-4:400;--font-weight-5:500;--font-weight-6:600;--font-weight-7:700;--font-weight-8:800;--font-weight-9:900;--font-lineheight-00:.95;--font-lineheight-0:1.1;--font-lineheight-1:1.25;--font-lineheight-2:1.375;--font-lineheight-3:1.5;--font-lineheight-4:1.75;--font-lineheight-5:2;--font-letterspacing-0:-.05em;--font-letterspacing-1:.025em;--font-letterspacing-2:.050em;--font-letterspacing-3:.075em;--font-letterspacing-4:.150em;--font-letterspacing-5:.500em;--font-letterspacing-6:.750em;--font-letterspacing-7:1em;--font-size-00:.5rem;--font-size-0:.75rem;--font-size-1:1rem;--font-size-2:1.1rem;--font-size-3:1.25rem;--font-size-4:1.5rem;--font-size-5:2rem;--font-size-6:2.5rem;--font-size-7:3rem;--font-size-8:3.5rem;--font-size-fluid-0:max(.75rem,min(2vw,1rem));--font-size-fluid-1:max(1rem,min(4vw,1.5rem));--font-size-fluid-2:max(1.5rem,min(6vw,2.5rem));--font-size-fluid-3:max(2rem,min(9vw,3.5rem));--size-000:-.5rem;--size-00:-.25rem;--size-1:.25rem;--size-2:.5rem;--size-3:1rem;--size-4:1.25rem;--size-5:1.5rem;--size-6:1.75rem;--size-7:2rem;--size-8:3rem;--size-9:4rem;--size-10:5rem;--size-11:7.5rem;--size-12:10rem;--size-13:15rem;--size-14:20rem;--size-15:30rem;--size-px-000:-8px;--size-px-00:-4px;--size-px-1:4px;--size-px-2:8px;--size-px-3:16px;--size-px-4:20px;--size-px-5:24px;--size-px-6:28px;--size-px-7:32px;--size-px-8:48px;--size-px-9:64px;--size-px-10:80px;--size-px-11:120px;--size-px-12:160px;--size-px-13:240px;--size-px-14:320px;--size-px-15:480px;--size-fluid-1:max(.5rem,min(1vw,1rem));--size-fluid-2:max(1rem,min(2vw,1.5rem));--size-fluid-3:max(1.5rem,min(3vw,2rem));--size-fluid-4:max(2rem,min(4vw,3rem));--size-fluid-5:max(4rem,min(5vw,5rem));--size-fluid-6:max(5rem,min(7vw,7.5rem));--size-fluid-7:max(7.5rem,min(10vw,10rem));--size-fluid-8:max(10rem,min(20vw,15rem));--size-fluid-9:max(15rem,min(30vw,20rem));--size-fluid-10:max(20rem,min(40vw,30rem));--size-content-1:20ch;--size-content-2:45ch;--size-content-3:60ch;--size-header-1:20ch;--size-header-2:25ch;--size-header-3:35ch;--size-xxs:240px;--size-xs:360px;--size-sm:480px;--size-md:768px;--size-lg:1024px;--size-xl:1440px;--size-xxl:1920px;--size-relative-000:-.5ch;--size-relative-00:-.25ch;--size-relative-1:.25ch;--size-relative-2:.5ch;--size-relative-3:1ch;--size-relative-4:1.25ch;--size-relative-5:1.5ch;--size-relative-6:1.75ch;--size-relative-7:2ch;--size-relative-8:3ch;--size-relative-9:4ch;--size-relative-10:5ch;--size-relative-11:7.5ch;--size-relative-12:10ch;--size-relative-13:15ch;--size-relative-14:20ch;--size-relative-15:30ch;--ease-1:cubic-bezier(.25,0,.5,1);--ease-2:cubic-bezier(.25,0,.4,1);--ease-3:cubic-bezier(.25,0,.3,1);--ease-4:cubic-bezier(.25,0,.2,1);--ease-5:cubic-bezier(.25,0,.1,1);--ease-in-1:cubic-bezier(.25,0,1,1);--ease-in-2:cubic-bezier(.50,0,1,1);--ease-in-3:cubic-bezier(.70,0,1,1);--ease-in-4:cubic-bezier(.90,0,1,1);--ease-in-5:cubic-bezier(1,0,1,1);--ease-out-1:cubic-bezier(0,0,.75,1);--ease-out-2:cubic-bezier(0,0,.50,1);--ease-out-3:cubic-bezier(0,0,.3,1);--ease-out-4:cubic-bezier(0,0,.1,1);--ease-out-5:cubic-bezier(0,0,0,1);--ease-in-out-1:cubic-bezier(.1,0,.9,1);--ease-in-out-2:cubic-bezier(.3,0,.7,1);--ease-in-out-3:cubic-bezier(.5,0,.5,1);--ease-in-out-4:cubic-bezier(.7,0,.3,1);--ease-in-out-5:cubic-bezier(.9,0,.1,1);--ease-elastic-out-1:cubic-bezier(.5,.75,.75,1.25);--ease-elastic-out-2:cubic-bezier(.5,1,.75,1.25);--ease-elastic-out-3:cubic-bezier(.5,1.25,.75,1.25);--ease-elastic-out-4:cubic-bezier(.5,1.5,.75,1.25);--ease-elastic-out-5:cubic-bezier(.5,1.75,.75,1.25);--ease-elastic-in-1:cubic-bezier(.5,-0.25,.75,1);--ease-elastic-in-2:cubic-bezier(.5,-0.50,.75,1);--ease-elastic-in-3:cubic-bezier(.5,-0.75,.75,1);--ease-elastic-in-4:cubic-bezier(.5,-1.00,.75,1);--ease-elastic-in-5:cubic-bezier(.5,-1.25,.75,1);--ease-elastic-in-out-1:cubic-bezier(.5,-.1,.1,1.5);--ease-elastic-in-out-2:cubic-bezier(.5,-.3,.1,1.5);--ease-elastic-in-out-3:cubic-bezier(.5,-.5,.1,1.5);--ease-elastic-in-out-4:cubic-bezier(.5,-.7,.1,1.5);--ease-elastic-in-out-5:cubic-bezier(.5,-.9,.1,1.5);--ease-step-1:steps(2);--ease-step-2:steps(3);--ease-step-3:steps(4);--ease-step-4:steps(7);--ease-step-5:steps(10);--ease-elastic-1:var(--ease-elastic-out-1);--ease-elastic-2:var(--ease-elastic-out-2);--ease-elastic-3:var(--ease-elastic-out-3);--ease-elastic-4:var(--ease-elastic-out-4);--ease-elastic-5:var(--ease-elastic-out-5);--ease-squish-1:var(--ease-elastic-in-out-1);--ease-squish-2:var(--ease-elastic-in-out-2);--ease-squish-3:var(--ease-elastic-in-out-3);--ease-squish-4:var(--ease-elastic-in-out-4);--ease-squish-5:var(--ease-elastic-in-out-5);--ease-spring-1:linear(0,0.006,0.025 2.8%,0.101 6.1%,0.539 18.9%,0.721 25.3%,0.849 31.5%,0.937 38.1%,0.968 41.8%,0.991 45.7%,1.006 50.1%,1.015 55%,1.017 63.9%,1.001);--ease-spring-2:linear(0,0.007,0.029 2.2%,0.118 4.7%,0.625 14.4%,0.826 19%,0.902,0.962,1.008 26.1%,1.041 28.7%,1.064 32.1%,1.07 36%,1.061 40.5%,1.015 53.4%,0.999 61.6%,0.995 71.2%,1);--ease-spring-3:linear(0,0.009,0.035 2.1%,0.141 4.4%,0.723 12.9%,0.938 16.7%,1.017,1.077,1.121,1.149 24.3%,1.159,1.163,1.161,1.154 29.9%,1.129 32.8%,1.051 39.6%,1.017 43.1%,0.991,0.977 51%,0.974 53.8%,0.975 57.1%,0.997 69.8%,1.003 76.9%,1);--ease-spring-4:linear(0,0.009,0.037 1.7%,0.153 3.6%,0.776 10.3%,1.001,1.142 16%,1.185,1.209 19%,1.215 19.9% 20.8%,1.199,1.165 25%,1.056 30.3%,1.008 33%,0.973,0.955 39.2%,0.953 41.1%,0.957 43.3%,0.998 53.3%,1.009 59.1% 63.7%,0.998 78.9%,1);--ease-spring-5:linear(0,0.01,0.04 1.6%,0.161 3.3%,0.816 9.4%,1.046,1.189 14.4%,1.231,1.254 17%,1.259,1.257 18.6%,1.236,1.194 22.3%,1.057 27%,0.999 29.4%,0.955 32.1%,0.942,0.935 34.9%,0.933,0.939 38.4%,1 47.3%,1.011,1.017 52.6%,1.016 56.4%,1 65.2%,0.996 70.2%,1.001 87.2%,1);--ease-bounce-1:linear(0,0.004,0.016,0.035,0.063,0.098,0.141,0.191,0.25,0.316,0.391 36.8%,0.563,0.766,1 58.8%,0.946,0.908 69.1%,0.895,0.885,0.879,0.878,0.879,0.885,0.895,0.908 89.7%,0.946,1);--ease-bounce-2:linear(0,0.004,0.016,0.035,0.063,0.098,0.141 15.1%,0.25,0.391,0.562,0.765,1,0.892 45.2%,0.849,0.815,0.788,0.769,0.757,0.753,0.757,0.769,0.788,0.815,0.85,0.892 75.2%,1 80.2%,0.973,0.954,0.943,0.939,0.943,0.954,0.973,1);--ease-bounce-3:linear(0,0.004,0.016,0.035,0.062,0.098,0.141 11.4%,0.25,0.39,0.562,0.764,1 30.3%,0.847 34.8%,0.787,0.737,0.699,0.672,0.655,0.65,0.656,0.672,0.699,0.738,0.787,0.847 61.7%,1 66.2%,0.946,0.908,0.885 74.2%,0.879,0.878,0.879,0.885 79.5%,0.908,0.946,1 87.4%,0.981,0.968,0.96,0.957,0.96,0.968,0.981,1);--ease-bounce-4:linear(0,0.004,0.016 3%,0.062,0.141,0.25,0.391,0.562 18.2%,1 24.3%,0.81,0.676 32.3%,0.629,0.595,0.575,0.568,0.575,0.595,0.629,0.676 48.2%,0.811,1 56.2%,0.918,0.86,0.825,0.814,0.825,0.86,0.918,1 77.2%,0.94 80.6%,0.925,0.92,0.925,0.94 87.5%,1 90.9%,0.974,0.965,0.974,1);--ease-bounce-5:linear(0,0.004,0.016 2.5%,0.063,0.141,0.25 10.1%,0.562,1 20.2%,0.783,0.627,0.534 30.9%,0.511,0.503,0.511,0.534 38%,0.627,0.782,1 48.7%,0.892,0.815,0.769 56.3%,0.757,0.753,0.757,0.769 61.3%,0.815,0.892,1 68.8%,0.908 72.4%,0.885,0.878,0.885,0.908 79.4%,1 83%,0.954 85.5%,0.943,0.939,0.943,0.954 90.5%,1 93%,0.977,0.97,0.977,1);--ease-circ-in:cubic-bezier(.6,.04,.98,.335);--ease-circ-in-out:cubic-bezier(.785,.135,.15,.86);--ease-circ-out:cubic-bezier(.075,.82,.165,1);--ease-cubic-in:cubic-bezier(.55,.055,.675,.19);--ease-cubic-in-out:cubic-bezier(.645,.045,.355,1);--ease-cubic-out:cubic-bezier(.215,.61,.355,1);--ease-expo-in:cubic-bezier(.95,.05,.795,.035);--ease-expo-in-out:cubic-bezier(1,0,0,1);--ease-expo-out:cubic-bezier(.19,1,.22,1);--ease-quad-in:cubic-bezier(.55,.085,.68,.53);--ease-quad-in-out:cubic-bezier(.455,.03,.515,.955);--ease-quad-out:cubic-bezier(.25,.46,.45,.94);--ease-quart-in:cubic-bezier(.895,.03,.685,.22);--ease-quart-in-out:cubic-bezier(.77,0,.175,1);--ease-quart-out:cubic-bezier(.165,.84,.44,1);--ease-quint-in:cubic-bezier(.755,.05,.855,.06);--ease-quint-in-out:cubic-bezier(.86,0,.07,1);--ease-quint-out:cubic-bezier(.23,1,.32,1);--ease-sine-in:cubic-bezier(.47,0,.745,.715);--ease-sine-in-out:cubic-bezier(.445,.05,.55,.95);--ease-sine-out:cubic-bezier(.39,.575,.565,1);--layer-1:1;--layer-2:2;--layer-3:3;--layer-4:4;--layer-5:5;--layer-important:2147483647;--shadow-color:220 3% 15%;--shadow-strength:1%;--inner-shadow-highlight:inset 0 -.5px 0 0 #fff,inset 0 .5px 0 0 rgba(0,0,0,.067);--shadow-1:0 1px 2px -1px hsl(var(--shadow-color)/calc(var(--shadow-strength) + 9%));--shadow-2:0 3px 5px -2px hsl(var(--shadow-color)/calc(var(--shadow-strength) + 3%)),0 7px 14px -5px hsl(var(--shadow-color)/calc(var(--shadow-strength) + 5%));--shadow-3:0 -1px 3px 0 hsl(var(--shadow-color)/calc(var(--shadow-strength) + 2%)),0 1px 2px -5px hsl(var(--shadow-color)/calc(var(--shadow-strength) + 2%)),0 2px 5px -5px hsl(var(--shadow-color)/calc(var(--shadow-strength) + 4%)),0 4px 12px -5px hsl(var(--shadow-color)/calc(var(--shadow-strength) + 5%)),0 12px 15px -5px hsl(var(--shadow-color)/calc(var(--shadow-strength) + 7%));--shadow-4:0 -2px 5px 0 hsl(var(--shadow-color)/calc(var(--shadow-strength) + 2%)),0 1px 1px -2px hsl(var(--shadow-color)/calc(var(--shadow-strength) + 3%)),0 2px 2px -2px hsl(var(--shadow-color)/calc(var(--shadow-strength) + 3%)),0 5px 5px -2px hsl(var(--shadow-color)/calc(var(--shadow-strength) + 4%)),0 9px 9px -2px hsl(var(--shadow-color)/calc(var(--shadow-strength) + 5%)),0 16px 16px -2px hsl(var(--shadow-color)/calc(var(--shadow-strength) + 6%));--shadow-5:0 -1px 2px 0 hsl(var(--shadow-color)/calc(var(--shadow-strength) + 2%)),0 2px 1px -2px hsl(var(--shadow-color)/calc(var(--shadow-strength) + 3%)),0 5px 5px -2px hsl(var(--shadow-color)/calc(var(--shadow-strength) + 3%)),0 10px 10px -2px hsl(var(--shadow-color)/calc(var(--shadow-strength) + 4%)),0 20px 20px -2px hsl(var(--shadow-color)/calc(var(--shadow-strength) + 5%)),0 40px 40px -2px hsl(var(--shadow-color)/calc(var(--shadow-strength) + 7%));--shadow-6:0 -1px 2px 0 hsl(var(--shadow-color)/calc(var(--shadow-strength) + 2%)),0 3px 2px -2px hsl(var(--shadow-color)/calc(var(--shadow-strength) + 3%)),0 7px 5px -2px hsl(var(--shadow-color)/calc(var(--shadow-strength) + 3%)),0 12px 10px -2px hsl(var(--shadow-color)/calc(var(--shadow-strength) + 4%)),0 22px 18px -2px hsl(var(--shadow-color)/calc(var(--shadow-strength) + 5%)),0 41px 33px -2px hsl(var(--shadow-color)/calc(var(--shadow-strength) + 6%)),0 100px 80px -2px hsl(var(--shadow-color)/calc(var(--shadow-strength) + 7%));--inner-shadow-0:inset 0 0 0 1px hsl(var(--shadow-color)/calc(var(--shadow-strength) + 9%));--inner-shadow-1:inset 0 1px 2px 0 hsl(var(--shadow-color)/calc(var(--shadow-strength) + 9%)),var(--inner-shadow-highlight);--inner-shadow-2:inset 0 1px 4px 0 hsl(var(--shadow-color)/calc(var(--shadow-strength) + 9%)),var(--inner-shadow-highlight);--inner-shadow-3:inset 0 2px 8px 0 hsl(var(--shadow-color)/calc(var(--shadow-strength) + 9%)),var(--inner-shadow-highlight);--inner-shadow-4:inset 0 2px 14px 0 hsl(var(--shadow-color)/calc(var(--shadow-strength) + 9%)),var(--inner-shadow-highlight);--ratio-square:1;--ratio-landscape:4/3;--ratio-portrait:3/4;--ratio-widescreen:16/9;--ratio-ultrawide:18/5;--ratio-golden:1.6180/1;--gray-0:#f8f9fa;--gray-1:#f1f3f5;--gray-2:#e9ecef;--gray-3:#dee2e6;--gray-4:#ced4da;--gray-5:#adb5bd;--gray-6:#868e96;--gray-7:#495057;--gray-8:#343a40;--gray-9:#212529;--gray-10:#16191d;--gray-11:#0d0f12;--gray-12:#030507;--stone-0:#f8fafb;--stone-1:#f2f4f6;--stone-2:#ebedef;--stone-3:#e0e4e5;--stone-4:#d1d6d8;--stone-5:#b1b6b9;--stone-6:#979b9d;--stone-7:#7e8282;--stone-8:#666968;--stone-9:#50514f;--stone-10:#3a3a37;--stone-11:#252521;--stone-12:#121210;--red-0:#fff5f5;--red-1:#ffe3e3;--red-2:#ffc9c9;--red-3:#ffa8a8;--red-4:#ff8787;--red-5:#ff6b6b;--red-6:#fa5252;--red-7:#f03e3e;--red-8:#e03131;--red-9:#c92a2a;--red-10:#b02525;--red-11:#962020;--red-12:#7d1a1a;--pink-0:#fff0f6;--pink-1:#ffdeeb;--pink-2:#fcc2d7;--pink-3:#faa2c1;--pink-4:#f783ac;--pink-5:#f06595;--pink-6:#e64980;--pink-7:#d6336c;--pink-8:#c2255c;--pink-9:#a61e4d;--pink-10:#8c1941;--pink-11:#731536;--pink-12:#59102a;--purple-0:#f8f0fc;--purple-1:#f3d9fa;--purple-2:#eebefa;--purple-3:#e599f7;--purple-4:#da77f2;--purple-5:#cc5de8;--purple-6:#be4bdb;--purple-7:#ae3ec9;--purple-8:#9c36b5;--purple-9:#862e9c;--purple-10:#702682;--purple-11:#5a1e69;--purple-12:#44174f;--violet-0:#f3f0ff;--violet-1:#e5dbff;--violet-2:#d0bfff;--violet-3:#b197fc;--violet-4:#9775fa;--violet-5:#845ef7;--violet-6:#7950f2;--violet-7:#7048e8;--violet-8:#6741d9;--violet-9:#5f3dc4;--violet-10:#5235ab;--violet-11:#462d91;--violet-12:#3a2578;--indigo-0:#edf2ff;--indigo-1:#dbe4ff;--indigo-2:#bac8ff;--indigo-3:#91a7ff;--indigo-4:#748ffc;--indigo-5:#5c7cfa;--indigo-6:#4c6ef5;--indigo-7:#4263eb;--indigo-8:#3b5bdb;--indigo-9:#364fc7;--indigo-10:#2f44ad;--indigo-11:#283a94;--indigo-12:#21307a;--blue-0:#e7f5ff;--blue-1:#d0ebff;--blue-2:#a5d8ff;--blue-3:#74c0fc;--blue-4:#4dabf7;--blue-5:#339af0;--blue-6:#228be6;--blue-7:#1c7ed6;--blue-8:#1971c2;--blue-9:#1864ab;--blue-10:#145591;--blue-11:#114678;--blue-12:#0d375e;--cyan-0:#e3fafc;--cyan-1:#c5f6fa;--cyan-2:#99e9f2;--cyan-3:#66d9e8;--cyan-4:#3bc9db;--cyan-5:#22b8cf;--cyan-6:#15aabf;--cyan-7:#1098ad;--cyan-8:#0c8599;--cyan-9:#0b7285;--cyan-10:#095c6b;--cyan-11:#074652;--cyan-12:#053038;--teal-0:#e6fcf5;--teal-1:#c3fae8;--teal-2:#96f2d7;--teal-3:#63e6be;--teal-4:#38d9a9;--teal-5:#20c997;--teal-6:#12b886;--teal-7:#0ca678;--teal-8:#099268;--teal-9:#087f5b;--teal-10:#066649;--teal-11:#054d37;--teal-12:#033325;--green-0:#ebfbee;--green-1:#d3f9d8;--green-2:#b2f2bb;--green-3:#8ce99a;--green-4:#69db7c;--green-5:#51cf66;--green-6:#40c057;--green-7:#37b24d;--green-8:#2f9e44;--green-9:#2b8a3e;--green-10:#237032;--green-11:#1b5727;--green-12:#133d1b;--lime-0:#f4fce3;--lime-1:#e9fac8;--lime-2:#d8f5a2;--lime-3:#c0eb75;--lime-4:#a9e34b;--lime-5:#94d82d;--lime-6:#82c91e;--lime-7:#74b816;--lime-8:#66a80f;--lime-9:#5c940d;--lime-10:#4c7a0b;--lime-11:#3c6109;--lime-12:#2c4706;--yellow-0:#fff9db;--yellow-1:#fff3bf;--yellow-2:#ffec99;--yellow-3:#ffe066;--yellow-4:#ffd43b;--yellow-5:#fcc419;--yellow-6:#fab005;--yellow-7:#f59f00;--yellow-8:#f08c00;--yellow-9:#e67700;--yellow-10:#b35c00;--yellow-11:#804200;--yellow-12:#663500;--orange-0:#fff4e6;--orange-1:#ffe8cc;--orange-2:#ffd8a8;--orange-3:#ffc078;--orange-4:#ffa94d;--orange-5:#ff922b;--orange-6:#fd7e14;--orange-7:#f76707;--orange-8:#e8590c;--orange-9:#d9480f;--orange-10:#bf400d;--orange-11:#99330b;--orange-12:#802b09;--choco-0:#fff8dc;--choco-1:#fce1bc;--choco-2:#f7ca9e;--choco-3:#f1b280;--choco-4:#e99b62;--choco-5:#df8545;--choco-6:#d46e25;--choco-7:#bd5f1b;--choco-8:#a45117;--choco-9:#8a4513;--choco-10:#703a13;--choco-11:#572f12;--choco-12:#3d210d;--brown-0:#faf4eb;--brown-1:#ede0d1;--brown-2:#e0cab7;--brown-3:#d3b79e;--brown-4:#c5a285;--brown-5:#b78f6d;--brown-6:#a87c56;--brown-7:#956b47;--brown-8:#825b3a;--brown-9:#6f4b2d;--brown-10:#5e3a21;--brown-11:#4e2b15;--brown-12:#422412;--sand-0:#f8fafb;--sand-1:#e6e4dc;--sand-2:#d5cfbd;--sand-3:#c2b9a0;--sand-4:#aea58c;--sand-5:#9a9178;--sand-6:#867c65;--sand-7:#736a53;--sand-8:#5f5746;--sand-9:#4b4639;--sand-10:#38352d;--sand-11:#252521;--sand-12:#121210;--camo-0:#f9fbe7;--camo-1:#e8ed9c;--camo-2:#d2df4e;--camo-3:#c2ce34;--camo-4:#b5bb2e;--camo-5:#a7a827;--camo-6:#999621;--camo-7:#8c851c;--camo-8:#7e7416;--camo-9:#6d6414;--camo-10:#5d5411;--camo-11:#4d460e;--camo-12:#36300a;--jungle-0:#ecfeb0;--jungle-1:#def39a;--jungle-2:#d0e884;--jungle-3:#c2dd6e;--jungle-4:#b5d15b;--jungle-5:#a8c648;--jungle-6:#9bbb36;--jungle-7:#8fb024;--jungle-8:#84a513;--jungle-9:#7a9908;--jungle-10:#658006;--jungle-11:#516605;--jungle-12:#3d4d04;--gradient-space: ;--gradient-1:linear-gradient(to bottom right var(--gradient-space),#1f005c,#5b0060,#870160,#ac255e,#ca485c,#e16b5c,#f39060,#ffb56b);--gradient-2:linear-gradient(to bottom right var(--gradient-space),#48005c,#8300e2,#a269ff);--gradient-3:radial-gradient(circle at top right var(--gradient-space),#0ff,rgba(0,255,255,0)),radial-gradient(circle at bottom left var(--gradient-space),#ff1492,rgba(255,20,146,0));--gradient-4:linear-gradient(to bottom right var(--gradient-space),#00f5a0,#00d9f5);--gradient-5:conic-gradient(from -270deg at 75% 110% var(--gradient-space),#f0f,#fffaf0);--gradient-6:conic-gradient(from -90deg at top left var(--gradient-space),#000,#fff);--gradient-7:linear-gradient(to bottom right var(--gradient-space),#72c6ef,#004e8f);--gradient-8:conic-gradient(from 90deg at 50% 0% var(--gradient-space),#111,50%,#222,#111);--gradient-9:conic-gradient(from .5turn at bottom center var(--gradient-space),#add8e6,#fff);--gradient-10:conic-gradient(from 90deg at 40% -25% var(--gradient-space),gold,#f79d03,#ee6907,#e6390a,#de0d0d,#d61039,#cf1261,#c71585,#cf1261,#d61039,#de0d0d,#ee6907,#f79d03,gold,gold,gold);--gradient-11:conic-gradient(at bottom left var(--gradient-space),#ff1493,cyan);--gradient-12:conic-gradient(from 90deg at 25% -10% var(--gradient-space),#ff4500,#d3f340,#7bee85,#afeeee,#7bee85);--gradient-13:radial-gradient(circle at 50% 200% var(--gradient-space),#000142,#3b0083,#b300c3,#ff059f,#ff4661,#ffad86,#fff3c7);--gradient-14:conic-gradient(at top right var(--gradient-space),lime,cyan);--gradient-15:linear-gradient(to bottom right var(--gradient-space),#c7d2fe,#fecaca,#fef3c7);--gradient-16:radial-gradient(circle at 50% -250% var(--gradient-space),#374151,#111827,#000);--gradient-17:conic-gradient(from -90deg at 50% -25% var(--gradient-space),blue,#8a2be2);--gradient-18:linear-gradient(0deg var(--gradient-space),rgba(255,0,0,.8),rgba(255,0,0,0) 75%),linear-gradient(60deg var(--gradient-space),rgba(255,255,0,.8),rgba(255,255,0,0) 75%),linear-gradient(120deg var(--gradient-space),rgba(0,255,0,.8),rgba(0,255,0,0) 75%),linear-gradient(180deg var(--gradient-space),rgba(0,255,255,.8),rgba(0,255,255,0) 75%),linear-gradient(240deg var(--gradient-space),rgba(0,0,255,.8),rgba(0,0,255,0) 75%),linear-gradient(300deg var(--gradient-space),rgba(255,0,255,.8),rgba(255,0,255,0) 75%);--gradient-19:linear-gradient(to bottom right var(--gradient-space),#ffe259,#ffa751);--gradient-20:conic-gradient(from -135deg at -10% center var(--gradient-space),orange,#ff7715,#ff522a,#ff3f47,#ff5482,#ff69b4);--gradient-21:conic-gradient(from -90deg at 25% 115% var(--gradient-space),red,#f06,#f0c,#c0f,#60f,#00f,#00f,#00f,#00f);--gradient-22:linear-gradient(to bottom right var(--gradient-space),#acb6e5,#86fde8);--gradient-23:linear-gradient(to bottom right var(--gradient-space),#536976,#292e49);--gradient-24:conic-gradient(from .5turn at 0% 0% var(--gradient-space),#00c476,10%,#82b0ff,90%,#00c476);--gradient-25:conic-gradient(at 125% 50% var(--gradient-space),#b78cf7,#ff7c94,#ffcf0d,#ff7c94,#b78cf7);--gradient-26:linear-gradient(to bottom right var(--gradient-space),#9796f0,#fbc7d4);--gradient-27:conic-gradient(from .5turn at bottom left var(--gradient-space),#ff1493,#639);--gradient-28:conic-gradient(from -90deg at 50% 105% var(--gradient-space),#fff,orchid);--gradient-29:radial-gradient(circle at top right var(--gradient-space),#bfb3ff,rgba(191,179,255,0)),radial-gradient(circle at bottom left var(--gradient-space),#86acf9,rgba(134,172,249,0));--gradient-30:radial-gradient(circle at top right var(--gradient-space),#00ff80,rgba(0,255,128,0)),radial-gradient(circle at bottom left var(--gradient-space),#adffd6,rgba(173,255,214,0));--noise-1:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 200 200' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='a'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.005' numOctaves='2' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23a)'/%3E%3C/svg%3E");--noise-2:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 300 300' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='a'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.05' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23a)'/%3E%3C/svg%3E");--noise-3:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 1024 1024' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='a'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.25' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23a)'/%3E%3C/svg%3E");--noise-4:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 2056 2056' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='a'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.5' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23a)'/%3E%3C/svg%3E");--noise-5:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 2056 2056' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='a'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.75' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23a)'/%3E%3C/svg%3E");--noise-filter-1:contrast(300%) brightness(100%);--noise-filter-2:contrast(200%) brightness(150%);--noise-filter-3:contrast(200%) brightness(250%);--noise-filter-4:contrast(200%) brightness(500%);--noise-filter-5:contrast(200%) brightness(1000%);--animation-fade-in:fade-in .5s var(--ease-3);--animation-fade-in-bloom:fade-in-bloom 2s var(--ease-3);--animation-fade-out:fade-out .5s var(--ease-3);--animation-fade-out-bloom:fade-out-bloom 2s var(--ease-3);--animation-scale-up:scale-up .5s var(--ease-3);--animation-scale-down:scale-down .5s var(--ease-3);--animation-slide-out-up:slide-out-up .5s var(--ease-3);--animation-slide-out-down:slide-out-down .5s var(--ease-3);--animation-slide-out-right:slide-out-right .5s var(--ease-3);--animation-slide-out-left:slide-out-left .5s var(--ease-3);--animation-slide-in-up:slide-in-up .5s var(--ease-3);--animation-slide-in-down:slide-in-down .5s var(--ease-3);--animation-slide-in-right:slide-in-right .5s var(--ease-3);--animation-slide-in-left:slide-in-left .5s var(--ease-3);--animation-shake-x:shake-x .75s var(--ease-out-5);--animation-shake-y:shake-y .75s var(--ease-out-5);--animation-shake-z:shake-z 1s var(--ease-in-out-3);--animation-spin:spin 2s linear infinite;--animation-ping:ping 5s var(--ease-out-3) infinite;--animation-blink:blink 1s var(--ease-out-3) infinite;--animation-float:float 3s var(--ease-in-out-3) infinite;--animation-bounce:bounce 2s var(--ease-squish-2) infinite;--animation-pulse:pulse 2s var(--ease-out-3) infinite;--border-size-1:1px;--border-size-2:2px;--border-size-3:5px;--border-size-4:10px;--border-size-5:25px;--radius-1:2px;--radius-2:5px;--radius-3:1rem;--radius-4:2rem;--radius-5:4rem;--radius-6:8rem;--radius-drawn-1:255px 15px 225px 15px/15px 225px 15px 255px;--radius-drawn-2:125px 10px 20px 185px/25px 205px 205px 25px;--radius-drawn-3:15px 255px 15px 225px/225px 15px 255px 15px;--radius-drawn-4:15px 25px 155px 25px/225px 150px 25px 115px;--radius-drawn-5:250px 25px 15px 20px/15px 80px 105px 115px;--radius-drawn-6:28px 100px 20px 15px/150px 30px 205px 225px;--radius-round:1e5px;--radius-blob-1:30% 70% 70% 30%/53% 30% 70% 47%;--radius-blob-2:53% 47% 34% 66%/63% 46% 54% 37%;--radius-blob-3:37% 63% 56% 44%/49% 56% 44% 51%;--radius-blob-4:63% 37% 37% 63%/43% 37% 63% 57%;--radius-blob-5:49% 51% 48% 52%/57% 44% 56% 43%;--radius-conditional-1:clamp(0px,calc(100vw - 100%) * 1e5,var(--radius-1));--radius-conditional-2:clamp(0px,calc(100vw - 100%) * 1e5,var(--radius-2));--radius-conditional-3:clamp(0px,calc(100vw - 100%) * 1e5,var(--radius-3));--radius-conditional-4:clamp(0px,calc(100vw - 100%) * 1e5,var(--radius-4));--radius-conditional-5:clamp(0px,calc(100vw - 100%) * 1e5,var(--radius-5));--radius-conditional-6:clamp(0px,calc(100vw - 100%) * 1e5,var(--radius-6))}@media (prefers-color-scheme:dark){:where(html){--shadow-color:220 40% 2%;--shadow-strength:25%;--inner-shadow-highlight:inset 0 -.5px 0 0 hsla(0,0%,100%,.067),inset 0 .5px 0 0 rgba(0,0,0,.467)}}@supports (background:linear-gradient(to right in oklab,#000,#fff)){:where(html){--gradient-space:in oklab}}@keyframes fade-in{to{opacity:1}}@keyframes fade-in-bloom{0%{filter:brightness(1) blur(20px);opacity:0}10%{filter:brightness(2) blur(10px);opacity:1}to{filter:brightness(1) blur(0);opacity:1}}@keyframes fade-out{to{opacity:0}}@keyframes fade-out-bloom{to{filter:brightness(1) blur(20px);opacity:0}10%{filter:brightness(2) blur(10px);opacity:1}0%{filter:brightness(1) blur(0);opacity:1}}@keyframes scale-up{to{transform:scale(1.25)}}@keyframes scale-down{to{transform:scale(.75)}}@keyframes slide-out-up{to{transform:translateY(-100%)}}@keyframes slide-out-down{to{transform:translateY(100%)}}@keyframes slide-out-right{to{transform:translateX(100%)}}@keyframes slide-out-left{to{transform:translateX(-100%)}}@keyframes slide-in-up{0%{transform:translateY(100%)}}@keyframes slide-in-down{0%{transform:translateY(-100%)}}@keyframes slide-in-right{0%{transform:translateX(-100%)}}@keyframes slide-in-left{0%{transform:translateX(100%)}}@keyframes shake-x{0%,to{transform:translateX(0)}20%{transform:translateX(-5%)}40%{transform:translateX(5%)}60%{transform:translateX(-5%)}80%{transform:translateX(5%)}}@keyframes shake-y{0%,to{transform:translateY(0)}20%{transform:translateY(-5%)}40%{transform:translateY(5%)}60%{transform:translateY(-5%)}80%{transform:translateY(5%)}}@keyframes shake-z{0%,to{transform:rotate(0deg)}20%{transform:rotate(-2deg)}40%{transform:rotate(2deg)}60%{transform:rotate(-2deg)}80%{transform:rotate(2deg)}}@keyframes spin{to{transform:rotate(1turn)}}@keyframes ping{90%,to{opacity:0;transform:scale(2)}}@keyframes blink{0%,to{opacity:1}50%{opacity:.5}}@keyframes float{50%{transform:translateY(-25%)}}@keyframes bounce{25%{transform:translateY(-20%)}40%{transform:translateY(-3%)}0%,60%,to{transform:translateY(0)}}@keyframes pulse{50%{transform:scale(.9)}}@media (prefers-color-scheme:dark){@keyframes fade-in-bloom{0%{filter:brightness(1) blur(20px);opacity:0}10%{filter:brightness(.5) blur(10px);opacity:1}to{filter:brightness(1) blur(0);opacity:1}}}@media (prefers-color-scheme:dark){@keyframes fade-out-bloom{to{filter:brightness(1) blur(20px);opacity:0}10%{filter:brightness(.5) blur(10px);opacity:1}0%{filter:brightness(1) blur(0);opacity:1}}}
\ No newline at end of file
diff --git a/crates/echo-session-ws-gateway/assets/vendor/theme.dark.switch.min.css b/crates/echo-session-ws-gateway/assets/vendor/theme.dark.switch.min.css
deleted file mode 100644
index 3c1917d7..00000000
--- a/crates/echo-session-ws-gateway/assets/vendor/theme.dark.switch.min.css
+++ /dev/null
@@ -1 +0,0 @@
-:where([data-theme=dark],.dark,.dark-theme){--csstools-color-scheme--light: ;--link:var(--indigo-3);--link-visited:var(--purple-3);--text-1:var(--gray-0);--text-2:var(--gray-4);--surface-1:var(--gray-9);--surface-2:var(--gray-8);--surface-3:var(--gray-7);--surface-4:var(--gray-6);--scrollthumb-color:var(--gray-6);--shadow-strength:10%;--shadow-color:220 40% 2%;--inner-shadow-highlight:inset 0 -.5px 0 0 hsla(0,0%,100%,.067),inset 0 .5px 0 0 rgba(0,0,0,.467);color-scheme:dark}:where([data-theme=dark],.dark,.dark-theme) :where(dialog){background-color:var(--surface-2)}:where([data-theme=dark],.dark,.dark-theme) :where(button,.btn){--_highlight:var(--_highlight-dark);--_bg:var(--_bg-dark);--_ink-shadow:var(--_ink-shadow-dark)}:where(.dark,.dark-theme,[data-theme=dark]) :where(button,.btn):where([type=reset]){--_text:var(--red-2);--_border:var(--surface-3)}:where(.dark,.dark-theme,[data-theme=dark]) [disabled]:where(button,input[type=button],.btn){--_text:var(--gray-5)}:where(.dark,.dark-theme,[data-theme=dark]) [disabled]:where(button,input[type=submit],.btn){--_text:var(--gray-5)}:where(.dark,.dark-theme,[data-theme=dark]) [disabled]:where(button,input[type=reset],.btn){--_text:var(--gray-5)}:where([data-theme=dark],.dark,.dark-theme) :where(textarea,select,input:not([type=button],[type=submit],[type=reset])){background-color:#171a1c}:where([data-theme=dark],.dark,.dark-theme) :where([disabled]),:where([data-theme=dark],.dark,.dark-theme) :where([type=reset]),:where([data-theme=dark],.dark,.dark-theme) :where([type=submit]),:where([data-theme=dark],.dark,.dark-theme) :where(form button:not([type=button])){--_bg:var(--surface-1)}
\ No newline at end of file
diff --git a/crates/echo-session-ws-gateway/assets/vendor/theme.light.switch.min.css b/crates/echo-session-ws-gateway/assets/vendor/theme.light.switch.min.css
deleted file mode 100644
index 2c014abf..00000000
--- a/crates/echo-session-ws-gateway/assets/vendor/theme.light.switch.min.css
+++ /dev/null
@@ -1 +0,0 @@
-:where([data-theme=light],.light,.light-theme){--csstools-color-scheme--light:initial;--link:var(--indigo-7);--link-visited:var(--purple-7);--text-1:var(--gray-12);--text-2:var(--gray-7);--surface-1:var(--gray-0);--surface-2:var(--gray-2);--surface-3:var(--gray-3);--surface-4:var(--gray-4);--scrollthumb-color:var(--gray-7);--shadow-color:220 3% 15%;--shadow-strength:1%;--inner-shadow-highlight:inset 0 -.5px 0 0 #fff,inset 0 .5px 0 0 rgba(0,0,0,.067);color-scheme:light}@media (dynamic-range:high) or (color-gamut:p3){@supports (color:color(display-p3 0 0 0)){:where([data-theme=light],.light,.light-theme){--link:color(display-p3 .1 .39 1);--link-visited:color(display-p3 .6 .2 1)}}}:where([data-theme=light],.light,.light-theme) :where(dialog){background-color:var(--surface-1)}:where([data-theme=light],.light,.light-theme) :where(button,.btn){--_highlight:var(--_highlight-light);--_bg:var(--_bg-light);--_ink-shadow:var(--_ink-shadow-light)}:where(.light,.light-theme,[data-theme=light]) :where(button,.btn):where([type=reset]){--_text:var(--red-6);--_border:var(--red-3)}:where(.light,.light-theme,[data-theme=light]) [disabled]:where(button,input[type=button],.btn){--_text:var(--gray-6)}:where(.light,.light-theme,[data-theme=light]) [disabled]:where(button,input[type=submit],.btn){--_text:var(--gray-6)}:where(.light,.light-theme,[data-theme=light]) [disabled]:where(button,input[type=reset],.btn){--_text:var(--gray-6)}:where([data-theme=light],.light,.light-theme) :where(textarea,select,input:not([type=button],[type=submit],[type=reset])){background-color:var(--surface-2)}
\ No newline at end of file
diff --git a/crates/echo-wasm-abi/Cargo.toml b/crates/echo-wasm-abi/Cargo.toml
index acd4f2c7..4f2829bb 100644
--- a/crates/echo-wasm-abi/Cargo.toml
+++ b/crates/echo-wasm-abi/Cargo.toml
@@ -18,6 +18,7 @@ ciborium = { version = "0.2", default-features = false }
serde-value = { version = "0.7" }
half = { version = "2.4", default-features = false, features = ["alloc"] }
thiserror = { version = "2.0" }
+blake3 = { version = "1.5", default-features = false }
[features]
default = ["std"]
diff --git a/crates/echo-wasm-abi/src/kernel_port.rs b/crates/echo-wasm-abi/src/kernel_port.rs
index c8877033..409e621e 100644
--- a/crates/echo-wasm-abi/src/kernel_port.rs
+++ b/crates/echo-wasm-abi/src/kernel_port.rs
@@ -10,7 +10,7 @@
//!
//! # ABI Version
//!
-//! The current ABI version is [`ABI_VERSION`] (8). All response types are
+//! The current ABI version is [`ABI_VERSION`] (9). All response types are
//! CBOR-encoded using the canonical rules defined in `docs/spec/js-cbor-mapping.md`.
//! Breaking changes to response shapes or error codes require a bump to the
//! ABI version.
@@ -26,6 +26,8 @@
extern crate alloc;
+use alloc::boxed::Box;
+use alloc::format;
use alloc::string::String;
use alloc::vec::Vec;
use core::fmt;
@@ -38,7 +40,7 @@ use serde::{
///
/// Increment when response types, error codes, or method signatures change
/// in a backward-incompatible way.
-pub const ABI_VERSION: u32 = 8;
+pub const ABI_VERSION: u32 = 9;
fn deserialize_opaque_id<'de, D>(deserializer: D) -> Result<[u8; 32], D::Error>
where
@@ -186,6 +188,92 @@ logical_counter!(
RunId
);
+opaque_id!(
+ /// Opaque stable identifier for an Echo optic descriptor.
+ OpticId
+);
+
+opaque_id!(
+ /// Opaque stable identifier for a generic braid.
+ BraidId
+);
+
+opaque_id!(
+ /// Opaque stable identifier for a retained reading key.
+ RetainedReadingKey
+);
+
+opaque_id!(
+ /// Opaque stable identifier for the encoding used by a retained reading payload.
+ RetainedReadingCodecId
+);
+
+opaque_id!(
+ /// Opaque stable identifier for an intent family allowed through an optic.
+ IntentFamilyId
+);
+
+opaque_id!(
+ /// Opaque stable identifier for an admission law used by optic dispatch.
+ AdmissionLawId
+);
+
+opaque_id!(
+ /// Opaque stable identifier for an optic capability basis.
+ OpticCapabilityId
+);
+
+opaque_id!(
+ /// Opaque stable identifier for an actor opening or using an optic.
+ OpticActorId
+);
+
+opaque_id!(
+ /// Opaque stable identifier for an authored or kernel observer plan.
+ ObserverPlanId
+);
+
+opaque_id!(
+ /// Opaque stable identifier for a hosted observer instance.
+ ObserverInstanceId
+);
+
+opaque_id!(
+ /// Opaque stable identifier for a WARP instance.
+ WarpId
+);
+
+opaque_id!(
+ /// Opaque stable identifier for a node within a WARP instance.
+ NodeId
+);
+
+opaque_id!(
+ /// Opaque stable identifier for an edge within a WARP instance.
+ EdgeId
+);
+
+opaque_id!(
+ /// Opaque stable identifier for a materialization channel.
+ ChannelId
+);
+
+/// Version of the projection law used by an optic read.
+#[repr(transparent)]
+#[derive(
+ Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default, Serialize, Deserialize,
+)]
+#[serde(transparent)]
+pub struct ProjectionVersion(pub u32);
+
+/// Version of the reducer law used by an optic read, when a reducer is present.
+#[repr(transparent)]
+#[derive(
+ Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default, Serialize, Deserialize,
+)]
+#[serde(transparent)]
+pub struct ReducerVersion(pub u32);
+
// ---------------------------------------------------------------------------
// Error codes
// ---------------------------------------------------------------------------
@@ -220,6 +308,14 @@ pub mod error_codes {
pub const INVALID_CONTROL: u32 = 13;
/// The requested strand is not registered.
pub const INVALID_STRAND: u32 = 14;
+ /// The requested observer plan is not available in this kernel.
+ pub const UNSUPPORTED_OBSERVER_PLAN: u32 = 15;
+ /// The requested observer instance is not available in this kernel.
+ pub const UNSUPPORTED_OBSERVER_INSTANCE: u32 = 16;
+ /// The requested observation rights posture is not available in this kernel.
+ pub const UNSUPPORTED_OBSERVATION_RIGHTS: u32 = 17;
+ /// The requested observation exceeded its explicit read budget.
+ pub const OBSERVATION_BUDGET_EXCEEDED: u32 = 18;
}
// ---------------------------------------------------------------------------
@@ -436,6 +532,664 @@ pub struct ChannelData {
pub data: Vec