diff --git a/.github/workflows/deploy-site.yml b/.github/workflows/deploy-site.yml index 2de7602..af356a7 100644 --- a/.github/workflows/deploy-site.yml +++ b/.github/workflows/deploy-site.yml @@ -24,15 +24,11 @@ jobs: key: cargo-test-${{ hashFiles('Cargo.lock') }} restore-keys: cargo-test- - # toolpath-desktop is a Tauri 2 app that pulls in glib-sys / - # webkit2gtk-sys on Linux, which need GTK system libs we don't - # install here. The crate targets macOS primarily; its own tests - # run on dev machines where Tauri's deps are already present. - name: Test - run: cargo test --workspace --exclude toolpath-desktop + run: cargo test --workspace - name: Clippy - run: cargo clippy --workspace --exclude toolpath-desktop -- -D warnings + run: cargo clippy --workspace -- -D warnings deploy: needs: test diff --git a/.github/workflows/release-desktop.yml b/.github/workflows/release-desktop.yml deleted file mode 100644 index cdf556d..0000000 --- a/.github/workflows/release-desktop.yml +++ /dev/null @@ -1,74 +0,0 @@ -name: Release Desktop App - -on: - release: - types: [created] - workflow_dispatch: - inputs: - release_tag: - description: "Existing release tag to attach artifacts to" - required: true - -jobs: - build: - strategy: - fail-fast: false - matrix: - include: - - platform: macos-latest - args: "--target aarch64-apple-darwin" - - platform: macos-latest - args: "--target x86_64-apple-darwin" - - platform: ubuntu-22.04 - args: "" - - platform: windows-latest - args: "" - - runs-on: ${{ matrix.platform }} - steps: - - uses: actions/checkout@v4 - - - name: Install Linux dependencies - if: matrix.platform == 'ubuntu-22.04' - run: | - sudo apt-get update - sudo apt-get install -y \ - libwebkit2gtk-4.1-dev \ - libayatana-appindicator3-dev \ - librsvg2-dev \ - patchelf \ - libssl-dev \ - build-essential \ - curl \ - wget \ - file - - - name: Install Rust stable - uses: dtolnay/rust-toolchain@stable - with: - targets: ${{ matrix.platform == 'macos-latest' && 'aarch64-apple-darwin,x86_64-apple-darwin' || '' }} - - - name: Rust cache - uses: swatinem/rust-cache@v2 - with: - workspaces: "./ -> target" - - - name: Setup Bun - uses: oven-sh/setup-bun@v2 - with: - bun-version: latest - - - name: Install frontend dependencies - working-directory: crates/toolpath-desktop/frontend - run: bun install - - - name: Build and upload Tauri app - uses: tauri-apps/tauri-action@v0 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - with: - projectPath: crates/toolpath-desktop - tagName: ${{ github.event.inputs.release_tag || github.event.release.tag_name }} - releaseName: ${{ github.event.inputs.release_tag || github.event.release.tag_name }} - releaseId: ${{ github.event.release.id }} - args: ${{ matrix.args }} diff --git a/CHANGELOG.md b/CHANGELOG.md index ef88355..4804c31 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,10 @@ All notable changes to the Toolpath workspace are documented here. ## [Unreleased] +### Removed + +- `toolpath-desktop` moved out of the workspace. The Tauri 2 desktop GUI now lives in the private [pathbase](https://github.com/empathic/pathbase) repo as `pathbase-app`. The toolpath derive/render crates remain open-source and are consumed by `pathbase-app` via git/crates.io deps. + ### Changed - `toolpath-convo` 0.7.0: **breaking** — `file_write_diff` gains a `before_state: Option<&str>` parameter. For the `Write { content }` shape, callers can now supply the prior file contents (e.g. resolved from `git show HEAD:`) so the resulting diff shows `-` lines for replaced content instead of an addition-only hunk. `None` preserves the old behaviour (diff against `""`). `Edit` / `MultiEdit` shapes are unaffected — they carry their own `old_string`. `toolpath-claude`'s Claude-JSONL deriver wires a best-effort git-HEAD lookup for `Write` tool invocations; falls back silently to additions-only when the project isn't a git repo, the file isn't tracked, or `git` isn't on `PATH`. (#35) @@ -19,7 +23,6 @@ All notable changes to the Toolpath workspace are documented here. - `toolpath-opencode` 0.1.0: new crate — reads opencode's `~/.local/share/opencode/opencode.db` SQLite database (opened read-only via `rusqlite` with `SQLITE_OPEN_READ_ONLY` so it never interferes with a live opencode process), implements `ConversationProvider`, and derives Toolpath `Path` documents. Strongly types all 12 `part.data` variants (text, reasoning, tool, step-start/-finish, snapshot, patch, file, agent, subtask, retry, compaction) with `#[serde(other)]` catch-alls so new upstream variants round-trip. Each message becomes a step with tool invocations attached; reasoning folds onto `Turn.thinking`. Real unified diffs come from opencode's sibling bare git snapshot repositories via `git2` tree↔tree comparisons, honoring both the current `snapshot///` layout and the older `snapshot//` flat layout. Files under `.gitignore`d paths (which opencode never captures in its snapshot store) fall back to tool-input-derived structural changes with `source: "tool_input_gitignored"` labeling. Project id is the SHA of the repo's first root commit (stable across clones and renames). 43 unit + 1 doc test. - `toolpath-cli` 0.4.0: adds `gen_synthetic_path` binary for generating synthetic `Path` fixtures at configurable step counts (bench support for toolpath-desktop Preview, see issue #41). - `toolpath-cli` 0.3.1: `path project claude` and `path incept` commands for projecting toolpath documents into Claude sessions; `derive gemini`/`list gemini`, `derive codex`/`list codex`, and `derive opencode [--session ID] [--all] [--project ID] [--no-snapshot-diffs]` / `list opencode [--project ID] [--json]` subcommands. -- `toolpath-desktop` 0.1.0: new crate — Tauri 2 desktop app for non-technical users. Source discovery for Claude Code + Pi + local git + GitHub PRs; interactive DAG preview (d3 + dagre-d3, Svelte 5 + TypeScript frontend); local `.path.json` export; stubbed Pathbase upload. GitHub PAT stored in the OS keychain under `dev.pathbase.toolpath-desktop`. Hot-reloading dev loop via `cargo tauri dev` (spawns Vite on port 1420). ## 0.3.0 — toolpath-cli diff --git a/CLAUDE.md b/CLAUDE.md index 1d2544b..db08c9d 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -23,7 +23,6 @@ crates/ toolpath-dot/ # Graphviz DOT rendering toolpath-md/ # Markdown rendering for LLM consumption toolpath-cli/ # unified CLI (binary: path) - toolpath-desktop/ # Tauri 2 GUI (binary: toolpath-desktop) schema/toolpath.schema.json # JSON Schema for the format examples/*.json # 12 example documents (step, path, graph) RFC.md # full format specification @@ -45,12 +44,11 @@ toolpath-cli (binary: path) ├── toolpath-pi → toolpath, toolpath-convo ├── toolpath-dot → toolpath └── toolpath-md → toolpath - -toolpath-desktop (binary: toolpath-desktop, Tauri 2 app) - ├── toolpath, toolpath-claude, toolpath-git, toolpath-github ``` -Cross-dependencies between satellite crates: `toolpath-claude → toolpath-convo`, `toolpath-gemini → toolpath-convo`, `toolpath-codex → toolpath-convo`, `toolpath-opencode → toolpath-convo`, `toolpath-pi → toolpath-convo`. `toolpath-desktop` is a leaf — nothing depends on it. +Cross-dependencies between satellite crates: `toolpath-claude → toolpath-convo`, `toolpath-gemini → toolpath-convo`, `toolpath-codex → toolpath-convo`, `toolpath-opencode → toolpath-convo`, `toolpath-pi → toolpath-convo`. + +The desktop GUI lives in the private [pathbase](https://github.com/empathic/pathbase) repo as `pathbase-app` — it consumes the toolpath crates via git or crates.io. ## Build and test @@ -124,7 +122,6 @@ Tests live alongside the code (`#[cfg(test)] mod tests`), plus `toolpath-cli` ha - `toolpath-pi`: ~88 unit tests (types, paths, error, reader, io, provider) - `toolpath-dot`: 30 unit + 2 doc tests (render, visual conventions, escaping) - `toolpath-cli`: 126 unit + 24 integration tests (all commands, track sessions, merge, validate, roundtrip, render-md snapshots) -- `toolpath-desktop`: 17 unit tests (IPC command modules — source listing, derive validation, export round-trip, upload stub, keychain input checks; tray activity-window bucketing, stats-snapshot smoke, session-id/basename helpers) Validate example documents: `for f in examples/*.json; do cargo run -p toolpath-cli -- validate --input "$f"; done` @@ -133,38 +130,9 @@ Validate example documents: `for f in examples/*.json; do cargo run -p toolpath- - `toolpath-claude` has a `watcher` feature (default: on) gating `notify`/`tokio` dependencies for filesystem watching - `toolpath-gemini` has a `watcher` feature (default: on) gating the polling-based `ConversationWatcher` module -## toolpath-desktop - -Tauri 2 app. Rust backend links `toolpath`, `toolpath-claude`, `toolpath-git`, `toolpath-github` directly (no CLI subprocess). Frontend is Svelte 5 + TypeScript + Vite, in the Elm-architecture (TEA) shape. - -Layout: -- `crates/toolpath-desktop/src/` — Rust backend (Tauri IPC commands). -- `crates/toolpath-desktop/frontend/` — Svelte app (bundled by Vite; managed with `bun`). - - `src/lib/types.ts` — `Model`, `Msg`, `Cmd`, IPC payload types (mirror Rust serde). - - `src/lib/update.ts` — pure `update(msg, model) -> [model, cmd]` reducer + `initialModel()`. - - `src/lib/store.svelte.ts` — reactive Svelte 5 store wrapping `update`, runs `Cmd`s (invoke / batch / emitMsg / fn). - - `src/lib/ipc.ts` — typed `invoke()` + `listen()` wrappers around `@tauri-apps/api`. - - `src/lib/viz.ts` — dagre-d3 DAG renderer. - - `src/routes/*.svelte` — one component per route, pure views over `store.m`. - - `src/app.svelte` — top-level switch on `store.m.route`. - -Tauri dev loop: `cargo tauri dev` spawns `bun --cwd frontend run dev` (Vite on `http://localhost:1420`), then runs the Rust binary against that URL. Frontend edits hot-reload via Vite HMR without restarting Rust; Rust edits trigger `cargo run` to restart. Production: `cargo tauri build` runs `bun --cwd frontend run build` first, bundling to `frontend/dist/`. - -Menu-bar mode: the app runs as a normal GUI app (Dock icon + app-switcher entry) *and* installs a tray icon — the tray is an accessory, not a replacement for the main window. Accessory activation policy was tried and reverted because macOS tiling window managers (yabai, Amethyst) stop managing accessory windows. A tray icon is installed in `src/tray.rs`; a background thread polls every 30s across `toolpath-claude`, `-gemini`, `-codex`, `-opencode`, and `-pi`, classifies sessions as *active* (last activity in the last 2 min) or *recent* (last 24h), updates the tray title (`● N`), and emits a `tray:stats` event. The popover is a second Tauri window (`label = "popover"`, undecorated, hidden by default) with its own Vite entry (`frontend/popover.html` → `src/popover.ts` → `routes/Popover.svelte`); left-clicking the tray toggles it via `tauri-plugin-positioner`. For an on-demand snapshot (no waiting for the next poll) the popover invokes the `tray_stats_now` IPC command. - -Opening a trace from the popover: clicking a recent-session row invokes `tray_open_trace { provider, project, session_id }`. The Rust side calls back into the existing `derive_claude` / `derive_pi` commands, shows the main window, and emits a `trace:opened` event to the main window with the derived `{ doc, source, filename }`. `app.svelte` listens for it and dispatches `DeriveSucceeded`, which routes to the preview. Only `claude` and `pi` have derive commands today — rows for `gemini`, `codex`, `opencode` still appear in the list (so users can see activity) but are rendered disabled. - -Pre-derive cache: after each 30s poll the tray kicks off background derives for every recent claude/pi session and stashes the result in `src/cache.rs`'s `TraceCache` (shared via `app.manage(Arc)`). Both the popover's `tray_open_trace` and the main-window's `derive_claude` / `derive_pi` commands route through the same cache (via `derive_claude_impl` / `derive_pi_impl` in `commands/derive.rs`), so clicking a session — whether from Quick View or the Browse view's "Select →" button — usually resolves instantly. Cache freshness keys on the source's `last_activity`; when a session gets new turns its cached entry is replaced on the next poll. Cacheable calls are limited to single-session, `include_thinking=false` derives (the shape the poller prewarms). Warm-up runs with at most 2 concurrent threads. - -Two tiers: (1) memory, a `HashMap` capped at 32 entries; (2) disk, under `/toolpath-desktop/trace-cache/.json`, so caches survive app restarts (macOS/Linux eventually clean `/tmp` themselves). Disk is capped at 200 entries, pruned oldest-first by mtime at startup. Memory misses fall through to disk and promote the hit back into memory. Corrupt files are silently deleted on read so a bad write doesn't poison the cache forever. - -Perf tracer (`frontend/src/lib/perf.svelte.ts`, `PerfOverlay.svelte`): the store, Preview, and the `trace:opened` listener call `perfStart` / `perfMark` / `perfEnd` at each checkpoint of a click → derive → render flow (dispatch, invoke-start, invoke-end, model-updated, preview-mounted, viz-rendered). Every completed trace logs a summary to the devtools console; set `localStorage.perf = "1"` and reload to also show a phase-bar overlay in the bottom-right. Use this to tell whether perceived click latency is the Rust derive vs. the Svelte/dagre render. - -Streaming pattern (Claude project/session lists): Rust command spawns a thread that emits `claude:project`, `claude:session`, `claude:projects-done`, `claude:sessions-done` events. The Svelte component subscribes with `$effect(() => { listen(...) ... return unlisten; })` — Svelte tears down listeners automatically when the effect's deps change or the component unmounts. - -Package manager for the frontend is `bun` (installed at `~/.bun/bin/bun`). `bun install` to set up, `bun run check` for `svelte-check`, `bun run build` for a production Vite build. Never commit `node_modules/` or `dist/` — both are ignored. +## Desktop app -Dev: `cargo tauri dev` from the crate directory. Build: `cargo tauri build`. GitHub PAT is stored in the OS keychain under service `dev.pathbase.toolpath-desktop`. Pathbase upload is a stub as of 0.1.0 — it validates the payload and returns a mock URL. +The Tauri 2 desktop GUI lives in the private [pathbase](https://github.com/empathic/pathbase) repo as `pathbase-app`. It consumes `toolpath`, `toolpath-claude`, `toolpath-git`, `toolpath-github`, `toolpath-gemini`, `toolpath-codex`, `toolpath-opencode`, and `toolpath-pi` via git/crates.io deps. Don't look for it in this workspace — it was moved out when Pathbase went closed-source. ## Versioning and release checklist diff --git a/Cargo.lock b/Cargo.lock index f83843b..db32301 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,12 +2,6 @@ # It is not intended for manual editing. version = 4 -[[package]] -name = "adler2" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" - [[package]] name = "ahash" version = "0.8.12" @@ -29,21 +23,6 @@ dependencies = [ "memchr", ] -[[package]] -name = "alloc-no-stdlib" -version = "2.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3" - -[[package]] -name = "alloc-stdlib" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94fb8275041c72129eb51b7d0322c29b8387a0386127718b096429201a5d6ece" -dependencies = [ - "alloc-no-stdlib", -] - [[package]] name = "android_system_properties" version = "0.1.5" @@ -124,160 +103,6 @@ dependencies = [ "wait-timeout", ] -[[package]] -name = "async-broadcast" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "435a87a52755b8f27fcf321ac4f04b2802e337c8c4872923137471ec39c37532" -dependencies = [ - "event-listener", - "event-listener-strategy", - "futures-core", - "pin-project-lite", -] - -[[package]] -name = "async-channel" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "924ed96dd52d1b75e9c1a3e6275715fd320f5f9439fb5a4a11fa51f4221158d2" -dependencies = [ - "concurrent-queue", - "event-listener-strategy", - "futures-core", - "pin-project-lite", -] - -[[package]] -name = "async-executor" -version = "1.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c96bf972d85afc50bf5ab8fe2d54d1586b4e0b46c97c50a0c9e71e2f7bcd812a" -dependencies = [ - "async-task", - "concurrent-queue", - "fastrand", - "futures-lite", - "pin-project-lite", - "slab", -] - -[[package]] -name = "async-io" -version = "2.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "456b8a8feb6f42d237746d4b3e9a178494627745c3c56c6ea55d92ba50d026fc" -dependencies = [ - "autocfg", - "cfg-if", - "concurrent-queue", - "futures-io", - "futures-lite", - "parking", - "polling", - "rustix", - "slab", - "windows-sys 0.61.2", -] - -[[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-process" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc50921ec0055cdd8a16de48773bfeec5c972598674347252c0399676be7da75" -dependencies = [ - "async-channel", - "async-io", - "async-lock", - "async-signal", - "async-task", - "blocking", - "cfg-if", - "event-listener", - "futures-lite", - "rustix", -] - -[[package]] -name = "async-recursion" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.115", -] - -[[package]] -name = "async-signal" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52b5aaafa020cf5053a01f2a60e8ff5dccf550f0f77ec54a4e47285ac2bab485" -dependencies = [ - "async-io", - "async-lock", - "atomic-waker", - "cfg-if", - "futures-core", - "futures-io", - "rustix", - "signal-hook-registry", - "slab", - "windows-sys 0.61.2", -] - -[[package]] -name = "async-task" -version = "4.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" - -[[package]] -name = "async-trait" -version = "0.1.89" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.115", -] - -[[package]] -name = "atk" -version = "0.18.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "241b621213072e993be4f6f3a9e4b45f65b7e6faad43001be957184b7bb1824b" -dependencies = [ - "atk-sys", - "glib", - "libc", -] - -[[package]] -name = "atk-sys" -version = "0.18.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5e48b684b0ca77d2bbadeef17424c2ea3c897d44d566a1617e7e8f30614d086" -dependencies = [ - "glib-sys", - "gobject-sys", - "libc", - "system-deps", -] - [[package]] name = "atomic-waker" version = "1.1.2" @@ -290,33 +115,12 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" -[[package]] -name = "base64" -version = "0.21.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" - [[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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3" -dependencies = [ - "bit-vec", -] - -[[package]] -name = "bit-vec" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" - [[package]] name = "bitflags" version = "1.3.2" @@ -328,9 +132,6 @@ name = "bitflags" version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3" -dependencies = [ - "serde_core", -] [[package]] name = "block-buffer" @@ -341,49 +142,6 @@ dependencies = [ "generic-array", ] -[[package]] -name = "block2" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdeb9d870516001442e364c5220d3574d2da8dc765554b4a617230d33fa58ef5" -dependencies = [ - "objc2", -] - -[[package]] -name = "blocking" -version = "1.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e83f8d02be6967315521be875afa792a316e28d57b5a2d401897e2a7921b7f21" -dependencies = [ - "async-channel", - "async-task", - "futures-io", - "futures-lite", - "piper", -] - -[[package]] -name = "brotli" -version = "8.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bd8b9603c7aa97359dbd97ecf258968c95f3adddd6db2f7e7a5bef101c84560" -dependencies = [ - "alloc-no-stdlib", - "alloc-stdlib", - "brotli-decompressor", -] - -[[package]] -name = "brotli-decompressor" -version = "5.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "874bb8112abecc98cbd6d81ea4fa7e94fb9449648c93cc89aa40c81c24d7de03" -dependencies = [ - "alloc-no-stdlib", - "alloc-stdlib", -] - [[package]] name = "bstr" version = "1.12.1" @@ -401,93 +159,11 @@ version = "3.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5dd9dc738b7a8311c7ade152424974d8115f2cdad61e8dab8dac9f2362298510" -[[package]] -name = "bytemuck" -version = "1.25.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8efb64bd706a16a1bdde310ae86b351e4d21550d98d056f22f8a7f7a2183fec" - -[[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" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33" -dependencies = [ - "serde", -] - -[[package]] -name = "cairo-rs" -version = "0.18.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ca26ef0159422fb77631dc9d17b102f253b876fe1586b03b803e63a309b4ee2" -dependencies = [ - "bitflags 2.10.0", - "cairo-sys-rs", - "glib", - "libc", - "once_cell", - "thiserror 1.0.69", -] - -[[package]] -name = "cairo-sys-rs" -version = "0.18.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "685c9fa8e590b8b3d678873528d83411db17242a73fccaed827770ea0fedda51" -dependencies = [ - "glib-sys", - "libc", - "system-deps", -] - -[[package]] -name = "camino" -version = "1.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e629a66d692cb9ff1a1c664e41771b3dcaf961985a9774c0eb0bd1b51cf60a48" -dependencies = [ - "serde_core", -] - -[[package]] -name = "cargo-platform" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e35af189006b9c0f00a064685c727031e3ed2d8020f7ba284d78cc2671bd36ea" -dependencies = [ - "serde", -] - -[[package]] -name = "cargo_metadata" -version = "0.19.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd5eb614ed4c27c5d706420e4320fbe3216ab31fa1c33cd8246ac36dae4479ba" -dependencies = [ - "camino", - "cargo-platform", - "semver", - "serde", - "serde_json", - "thiserror 2.0.18", -] - -[[package]] -name = "cargo_toml" -version = "0.22.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "374b7c592d9c00c1f4972ea58390ac6b18cbb6ab79011f3bdc90a0b82ca06b77" -dependencies = [ - "serde", - "toml 0.9.12+spec-1.1.0", -] [[package]] name = "cc" @@ -501,33 +177,6 @@ dependencies = [ "shlex", ] -[[package]] -name = "cesu8" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" - -[[package]] -name = "cfb" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d38f2da7a0a2c4ccf0065be06397cc26a81f4e528be095826eee9d4adbb8c60f" -dependencies = [ - "byteorder", - "fnv", - "uuid", -] - -[[package]] -name = "cfg-expr" -version = "0.15.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d067ad48b8650848b989a59a86c6c36a995d02d2bf778d45c3c5d57bc2718f02" -dependencies = [ - "smallvec", - "target-lexicon", -] - [[package]] name = "cfg-if" version = "1.0.4" @@ -545,7 +194,7 @@ dependencies = [ "num-traits", "serde", "wasm-bindgen", - "windows-link 0.2.1", + "windows-link", ] [[package]] @@ -576,10 +225,10 @@ version = "4.5.55" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a92793da1a46a5f2a02a6f4c46c6496b28c43638adea8306fcb0caa1634f24e5" dependencies = [ - "heck 0.5.0", + "heck", "proc-macro2", "quote", - "syn 2.0.115", + "syn", ] [[package]] @@ -594,25 +243,6 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" -[[package]] -name = "combine" -version = "4.6.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" -dependencies = [ - "bytes", - "memchr", -] - -[[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 = "console" version = "0.15.11" @@ -625,22 +255,6 @@ dependencies = [ "windows-sys 0.59.0", ] -[[package]] -name = "convert_case" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" - -[[package]] -name = "cookie" -version = "0.18.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ddef33a339a91ea89fb53151bd0a4689cfce27055c291dfa69945475d22c747" -dependencies = [ - "time", - "version_check", -] - [[package]] name = "core-foundation" version = "0.9.4" @@ -668,205 +282,29 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" [[package]] -name = "core-graphics" -version = "0.25.0" +name = "cpufeatures" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "064badf302c3194842cf2c5d61f56cc88e54a759313879cdf03abdd27d0c3b97" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" dependencies = [ - "bitflags 2.10.0", - "core-foundation 0.10.1", - "core-graphics-types", - "foreign-types 0.5.0", "libc", ] [[package]] -name = "core-graphics-types" -version = "0.2.0" +name = "crypto-common" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d44a101f213f6c4cdc1853d4b78aef6db6bdfa3468798cc1d9912f4735013eb" +checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" dependencies = [ - "bitflags 2.10.0", - "core-foundation 0.10.1", - "libc", + "generic-array", + "typenum", ] [[package]] -name = "cpufeatures" -version = "0.2.17" +name = "difflib" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" -dependencies = [ - "libc", -] - -[[package]] -name = "crc32fast" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "crossbeam-channel" -version = "0.5.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2" -dependencies = [ - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-utils" -version = "0.8.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" - -[[package]] -name = "crypto-common" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" -dependencies = [ - "generic-array", - "typenum", -] - -[[package]] -name = "cssparser" -version = "0.29.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f93d03419cb5950ccfd3daf3ff1c7a36ace64609a1a8746d493df1ca0afde0fa" -dependencies = [ - "cssparser-macros", - "dtoa-short", - "itoa", - "matches", - "phf 0.10.1", - "proc-macro2", - "quote", - "smallvec", - "syn 1.0.109", -] - -[[package]] -name = "cssparser" -version = "0.36.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dae61cf9c0abb83bd659dab65b7e4e38d8236824c85f0f804f173567bda257d2" -dependencies = [ - "cssparser-macros", - "dtoa-short", - "itoa", - "phf 0.13.1", - "smallvec", -] - -[[package]] -name = "cssparser-macros" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331" -dependencies = [ - "quote", - "syn 2.0.115", -] - -[[package]] -name = "ctor" -version = "0.2.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a2785755761f3ddc1492979ce1e48d2c00d09311c39e4466429188f3dd6501" -dependencies = [ - "quote", - "syn 2.0.115", -] - -[[package]] -name = "darling" -version = "0.23.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25ae13da2f202d56bd7f91c25fba009e7717a1e4a1cc98a76d844b65ae912e9d" -dependencies = [ - "darling_core", - "darling_macro", -] - -[[package]] -name = "darling_core" -version = "0.23.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9865a50f7c335f53564bb694ef660825eb8610e0a53d3e11bf1b0d3df31e03b0" -dependencies = [ - "ident_case", - "proc-macro2", - "quote", - "strsim", - "syn 2.0.115", -] - -[[package]] -name = "darling_macro" -version = "0.23.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac3984ec7bd6cfa798e62b4a642426a5be0e68f9401cfc2a01e3fa9ea2fcdb8d" -dependencies = [ - "darling_core", - "quote", - "syn 2.0.115", -] - -[[package]] -name = "deranged" -version = "0.5.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c" -dependencies = [ - "powerfmt", - "serde_core", -] - -[[package]] -name = "derive_more" -version = "0.99.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6edb4b64a43d977b8e99788fe3a04d483834fba1215a7e02caa415b626497f7f" -dependencies = [ - "convert_case", - "proc-macro2", - "quote", - "rustc_version", - "syn 2.0.115", -] - -[[package]] -name = "derive_more" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d751e9e49156b02b44f9c1815bcb94b984cdcc4396ecc32521c739452808b134" -dependencies = [ - "derive_more-impl", -] - -[[package]] -name = "derive_more-impl" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "799a97264921d8623a957f6c3b9011f3b5492f557bbb7a5a19b7fa6d06ba8dcb" -dependencies = [ - "proc-macro2", - "quote", - "rustc_version", - "syn 2.0.115", -] - -[[package]] -name = "difflib" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6184e33543162437515c2e2b48714794e37845ec9851711914eec9d308f6ebe8" +checksum = "6184e33543162437515c2e2b48714794e37845ec9851711914eec9d308f6ebe8" [[package]] name = "digest" @@ -878,39 +316,6 @@ dependencies = [ "crypto-common", ] -[[package]] -name = "dirs" -version = "6.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3e8aa94d75141228480295a7d0e7feb620b1a5ad9f12bc40be62411e38cce4e" -dependencies = [ - "dirs-sys", -] - -[[package]] -name = "dirs-sys" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e01a3366d27ee9890022452ee61b2b63a67e6f13f58900b651ff5665f0bb1fab" -dependencies = [ - "libc", - "option-ext", - "redox_users", - "windows-sys 0.61.2", -] - -[[package]] -name = "dispatch2" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e0e367e4e7da84520dedcac1901e4da967309406d1e51017ae1abfb97adbd38" -dependencies = [ - "bitflags 2.10.0", - "block2", - "libc", - "objc2", -] - [[package]] name = "displaydoc" version = "0.2.5" @@ -919,103 +324,9 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.115", -] - -[[package]] -name = "dlopen2" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e2c5bd4158e66d1e215c49b837e11d62f3267b30c92f1d171c4d3105e3dc4d4" -dependencies = [ - "dlopen2_derive", - "libc", - "once_cell", - "winapi", -] - -[[package]] -name = "dlopen2_derive" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fbbb781877580993a8707ec48672673ec7b81eeba04cfd2310bd28c08e47c8f" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.115", -] - -[[package]] -name = "dom_query" -version = "0.27.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "521e380c0c8afb8d9a1e83a1822ee03556fc3e3e7dbc1fd30be14e37f9cb3f89" -dependencies = [ - "bit-set", - "cssparser 0.36.0", - "foldhash 0.2.0", - "html5ever 0.38.0", - "precomputed-hash", - "selectors 0.36.1", - "tendril 0.5.0", -] - -[[package]] -name = "dpi" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8b14ccef22fc6f5a8f4d7d768562a182c04ce9a3b3157b91390b52ddfdf1a76" -dependencies = [ - "serde", -] - -[[package]] -name = "dtoa" -version = "1.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c3cf4824e2d5f025c7b531afcb2325364084a16806f6d47fbc1f5fbd9960590" - -[[package]] -name = "dtoa-short" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd1511a7b6a56299bd043a9c167a6d2bfb37bf84a6dfceaba651168adfb43c87" -dependencies = [ - "dtoa", -] - -[[package]] -name = "dunce" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" - -[[package]] -name = "dyn-clone" -version = "1.0.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" - -[[package]] -name = "embed-resource" -version = "3.0.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63a1d0de4f2249aa0ff5884d7080814f446bb241a559af6c170a41e878ed2d45" -dependencies = [ - "cc", - "memchr", - "rustc_version", - "toml 0.9.12+spec-1.1.0", - "vswhom", - "winreg", + "syn", ] -[[package]] -name = "embed_plist" -version = "1.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ef6b89e5b37196644d8796de5268852ff179b44e96276cf4290264843743bb7" - [[package]] name = "encode_unicode" version = "1.0.0" @@ -1031,50 +342,12 @@ dependencies = [ "cfg-if", ] -[[package]] -name = "endi" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66b7e2430c6dff6a955451e2cfc438f09cea1965a9d6f87f7e3b90decc014099" - -[[package]] -name = "enumflags2" -version = "0.7.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1027f7680c853e056ebcec683615fb6fbbc07dbaa13b4d5d9442b146ded4ecef" -dependencies = [ - "enumflags2_derive", - "serde", -] - -[[package]] -name = "enumflags2_derive" -version = "0.7.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67c78a4d8fdf9953a5c9d458f9efe940fd97a0cab0941c075a813ac594733827" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.115", -] - [[package]] name = "equivalent" version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" -[[package]] -name = "erased-serde" -version = "0.4.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2add8a07dd6a8d93ff627029c51de145e12686fbc36ecb298ac22e74cf02dec" -dependencies = [ - "serde", - "serde_core", - "typeid", -] - [[package]] name = "errno" version = "0.3.14" @@ -1085,27 +358,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 = "fallible-iterator" version = "0.3.0" @@ -1124,25 +376,6 @@ version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" -[[package]] -name = "fdeflate" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e6853b52649d4ac5c0bd02320cddc5ba956bdb407c4b75a2c6b75bf51500f8c" -dependencies = [ - "simd-adler32", -] - -[[package]] -name = "field-offset" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38e2275cc4e4fc009b0669731a1e5ab7ebf11f469eaede2bab9309a5b4d6057f" -dependencies = [ - "memoffset", - "rustc_version", -] - [[package]] name = "filetime" version = "0.2.27" @@ -1160,16 +393,6 @@ version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" -[[package]] -name = "flate2" -version = "1.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "843fba2746e448b37e26a819579957415c8cef339bf08564fe8b7ddbd959573c" -dependencies = [ - "crc32fast", - "miniz_oxide", -] - [[package]] name = "float-cmp" version = "0.10.0" @@ -1191,40 +414,13 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" -[[package]] -name = "foldhash" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" - [[package]] name = "foreign-types" version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" dependencies = [ - "foreign-types-shared 0.1.1", -] - -[[package]] -name = "foreign-types" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965" -dependencies = [ - "foreign-types-macros", - "foreign-types-shared 0.3.1", -] - -[[package]] -name = "foreign-types-macros" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.115", + "foreign-types-shared", ] [[package]] @@ -1233,12 +429,6 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" -[[package]] -name = "foreign-types-shared" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" - [[package]] name = "form_urlencoded" version = "1.2.2" @@ -1257,16 +447,6 @@ dependencies = [ "libc", ] -[[package]] -name = "futf" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df420e2e84819663797d1ec6544b13c5be84629e7bb00dc960d6917db2987843" -dependencies = [ - "mac", - "new_debug_unreachable", -] - [[package]] name = "futures-channel" version = "0.3.32" @@ -1283,47 +463,12 @@ version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d" -[[package]] -name = "futures-executor" -version = "0.3.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf29c38818342a3b26b5b923639e7b1f4a61fc5e76102d4b1981c6dc7a7579d" -dependencies = [ - "futures-core", - "futures-task", - "futures-util", -] - [[package]] name = "futures-io" version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cecba35d7ad927e23624b22ad55235f2239cfa44fd10428eecbeba6d6a717718" -[[package]] -name = "futures-lite" -version = "2.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f78e10609fe0e0b3f4157ffab1876319b5b0db102a2c60dc4626306dc46b44ad" -dependencies = [ - "fastrand", - "futures-core", - "futures-io", - "parking", - "pin-project-lite", -] - -[[package]] -name = "futures-macro" -version = "0.3.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e835b70203e41293343137df5c0664546da5745f82ec9b84d40be8336958447b" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.115", -] - [[package]] name = "futures-sink" version = "0.3.32" @@ -1344,7 +489,6 @@ checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6" dependencies = [ "futures-core", "futures-io", - "futures-macro", "futures-sink", "futures-task", "memchr", @@ -1352,114 +496,6 @@ dependencies = [ "slab", ] -[[package]] -name = "fxhash" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" -dependencies = [ - "byteorder", -] - -[[package]] -name = "gdk" -version = "0.18.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9f245958c627ac99d8e529166f9823fb3b838d1d41fd2b297af3075093c2691" -dependencies = [ - "cairo-rs", - "gdk-pixbuf", - "gdk-sys", - "gio", - "glib", - "libc", - "pango", -] - -[[package]] -name = "gdk-pixbuf" -version = "0.18.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50e1f5f1b0bfb830d6ccc8066d18db35c487b1b2b1e8589b5dfe9f07e8defaec" -dependencies = [ - "gdk-pixbuf-sys", - "gio", - "glib", - "libc", - "once_cell", -] - -[[package]] -name = "gdk-pixbuf-sys" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9839ea644ed9c97a34d129ad56d38a25e6756f99f3a88e15cd39c20629caf7" -dependencies = [ - "gio-sys", - "glib-sys", - "gobject-sys", - "libc", - "system-deps", -] - -[[package]] -name = "gdk-sys" -version = "0.18.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c2d13f38594ac1e66619e188c6d5a1adb98d11b2fcf7894fc416ad76aa2f3f7" -dependencies = [ - "cairo-sys-rs", - "gdk-pixbuf-sys", - "gio-sys", - "glib-sys", - "gobject-sys", - "libc", - "pango-sys", - "pkg-config", - "system-deps", -] - -[[package]] -name = "gdkwayland-sys" -version = "0.18.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "140071d506d223f7572b9f09b5e155afbd77428cd5cc7af8f2694c41d98dfe69" -dependencies = [ - "gdk-sys", - "glib-sys", - "gobject-sys", - "libc", - "pkg-config", - "system-deps", -] - -[[package]] -name = "gdkx11" -version = "0.18.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3caa00e14351bebbc8183b3c36690327eb77c49abc2268dd4bd36b856db3fbfe" -dependencies = [ - "gdk", - "gdkx11-sys", - "gio", - "glib", - "libc", - "x11", -] - -[[package]] -name = "gdkx11-sys" -version = "0.18.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e2e7445fe01ac26f11601db260dd8608fe172514eb63b3b5e261ea6b0f4428d" -dependencies = [ - "gdk-sys", - "glib-sys", - "libc", - "system-deps", - "x11", -] - [[package]] name = "generic-array" version = "0.14.7" @@ -1470,17 +506,6 @@ dependencies = [ "version_check", ] -[[package]] -name = "getrandom" -version = "0.1.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" -dependencies = [ - "cfg-if", - "libc", - "wasi 0.9.0+wasi-snapshot-preview1", -] - [[package]] name = "getrandom" version = "0.2.17" @@ -1489,7 +514,7 @@ checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" dependencies = [ "cfg-if", "libc", - "wasi 0.11.1+wasi-snapshot-preview1", + "wasi", ] [[package]] @@ -1517,38 +542,6 @@ dependencies = [ "wasip3", ] -[[package]] -name = "gio" -version = "0.18.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4fc8f532f87b79cbc51a79748f16a6828fb784be93145a322fa14d06d354c73" -dependencies = [ - "futures-channel", - "futures-core", - "futures-io", - "futures-util", - "gio-sys", - "glib", - "libc", - "once_cell", - "pin-project-lite", - "smallvec", - "thiserror 1.0.69", -] - -[[package]] -name = "gio-sys" -version = "0.18.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37566df850baf5e4cb0dfb78af2e4b9898d817ed9263d1090a2df958c64737d2" -dependencies = [ - "glib-sys", - "gobject-sys", - "libc", - "system-deps", - "winapi", -] - [[package]] name = "git2" version = "0.19.0" @@ -1564,122 +557,6 @@ dependencies = [ "url", ] -[[package]] -name = "glib" -version = "0.18.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "233daaf6e83ae6a12a52055f568f9d7cf4671dabb78ff9560ab6da230ce00ee5" -dependencies = [ - "bitflags 2.10.0", - "futures-channel", - "futures-core", - "futures-executor", - "futures-task", - "futures-util", - "gio-sys", - "glib-macros", - "glib-sys", - "gobject-sys", - "libc", - "memchr", - "once_cell", - "smallvec", - "thiserror 1.0.69", -] - -[[package]] -name = "glib-macros" -version = "0.18.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bb0228f477c0900c880fd78c8759b95c7636dbd7842707f49e132378aa2acdc" -dependencies = [ - "heck 0.4.1", - "proc-macro-crate 2.0.2", - "proc-macro-error", - "proc-macro2", - "quote", - "syn 2.0.115", -] - -[[package]] -name = "glib-sys" -version = "0.18.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "063ce2eb6a8d0ea93d2bf8ba1957e78dbab6be1c2220dd3daca57d5a9d869898" -dependencies = [ - "libc", - "system-deps", -] - -[[package]] -name = "glob" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" - -[[package]] -name = "gobject-sys" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0850127b514d1c4a4654ead6dedadb18198999985908e6ffe4436f53c785ce44" -dependencies = [ - "glib-sys", - "libc", - "system-deps", -] - -[[package]] -name = "gtk" -version = "0.18.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd56fb197bfc42bd5d2751f4f017d44ff59fbb58140c6b49f9b3b2bdab08506a" -dependencies = [ - "atk", - "cairo-rs", - "field-offset", - "futures-channel", - "gdk", - "gdk-pixbuf", - "gio", - "glib", - "gtk-sys", - "gtk3-macros", - "libc", - "pango", - "pkg-config", -] - -[[package]] -name = "gtk-sys" -version = "0.18.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f29a1c21c59553eb7dd40e918be54dccd60c52b049b75119d5d96ce6b624414" -dependencies = [ - "atk-sys", - "cairo-sys-rs", - "gdk-pixbuf-sys", - "gdk-sys", - "gio-sys", - "glib-sys", - "gobject-sys", - "libc", - "pango-sys", - "system-deps", -] - -[[package]] -name = "gtk3-macros" -version = "0.18.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52ff3c5b21f14f0736fed6dcfc0bfb4225ebf5725f3c0209edeec181e4d73e9d" -dependencies = [ - "proc-macro-crate 1.3.1", - "proc-macro-error", - "proc-macro2", - "quote", - "syn 2.0.115", -] - [[package]] name = "h2" version = "0.4.13" @@ -1692,19 +569,13 @@ dependencies = [ "futures-core", "futures-sink", "http", - "indexmap 2.13.0", + "indexmap", "slab", "tokio", "tokio-util", "tracing", ] -[[package]] -name = "hashbrown" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" - [[package]] name = "hashbrown" version = "0.14.5" @@ -1720,7 +591,7 @@ version = "0.15.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" dependencies = [ - "foldhash 0.1.5", + "foldhash", ] [[package]] @@ -1738,52 +609,12 @@ dependencies = [ "hashbrown 0.14.5", ] -[[package]] -name = "heck" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" - [[package]] name = "heck" version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" -[[package]] -name = "hermit-abi" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" - -[[package]] -name = "hex" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" - -[[package]] -name = "html5ever" -version = "0.29.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b7410cae13cbc75623c98ac4cbfd1f0bedddf3227afc24f370cf0f50a44a11c" -dependencies = [ - "log", - "mac", - "markup5ever 0.14.1", - "match_token", -] - -[[package]] -name = "html5ever" -version = "0.38.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1054432bae2f14e0061e33d23402fbaa67a921d319d56adc6bcf887ddad1cbc2" -dependencies = [ - "log", - "markup5ever 0.38.0", -] - [[package]] name = "http" version = "1.4.0" @@ -1883,7 +714,7 @@ version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "96547c2556ec9d12fb1578c4eaf448b04993e7fb79cbaad930a656880a6bdfa0" dependencies = [ - "base64 0.22.1", + "base64", "bytes", "futures-channel", "futures-util", @@ -1914,7 +745,7 @@ dependencies = [ "js-sys", "log", "wasm-bindgen", - "windows-core 0.62.2", + "windows-core", ] [[package]] @@ -1926,16 +757,6 @@ dependencies = [ "cc", ] -[[package]] -name = "ico" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e795dff5605e0f04bff85ca41b51a96b83e80b281e96231bcaaf1ac35103371" -dependencies = [ - "byteorder", - "png", -] - [[package]] name = "icu_collections" version = "2.1.1" @@ -2023,12 +844,6 @@ version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954" -[[package]] -name = "ident_case" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" - [[package]] name = "idna" version = "1.1.0" @@ -2050,17 +865,6 @@ dependencies = [ "icu_properties", ] -[[package]] -name = "indexmap" -version = "1.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" -dependencies = [ - "autocfg", - "hashbrown 0.12.3", - "serde", -] - [[package]] name = "indexmap" version = "2.13.0" @@ -2073,15 +877,6 @@ dependencies = [ "serde_core", ] -[[package]] -name = "infer" -version = "0.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a588916bfdfd92e71cacef98a63d9b1f0d74d6599980d11894290e7ddefffcf7" -dependencies = [ - "cfb", -] - [[package]] name = "inotify" version = "0.10.2" @@ -2139,25 +934,6 @@ dependencies = [ "serde", ] -[[package]] -name = "is-docker" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "928bae27f42bc99b60d9ac7334e3a21d10ad8f1835a4e12ec3ec0464765ed1b3" -dependencies = [ - "once_cell", -] - -[[package]] -name = "is-wsl" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "173609498df190136aa7dea1a91db051746d339e18476eed5ca40521f02d7aa5" -dependencies = [ - "is-docker", - "once_cell", -] - [[package]] name = "is_terminal_polyfill" version = "1.70.2" @@ -2171,143 +947,33 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "92ecc6618181def0457392ccd0ee51198e065e016d1d527a7ac1b6dc7c1f09d2" [[package]] -name = "javascriptcore-rs" -version = "1.1.2" +name = "jobserver" +version = "0.1.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca5671e9ffce8ffba57afc24070e906da7fc4b1ba66f2cabebf61bf2ea257fcc" +checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" dependencies = [ - "bitflags 1.3.2", - "glib", - "javascriptcore-rs-sys", + "getrandom 0.3.4", + "libc", ] [[package]] -name = "javascriptcore-rs-sys" -version = "1.1.1" +name = "js-sys" +version = "0.3.85" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af1be78d14ffa4b75b66df31840478fef72b51f8c2465d4ca7c194da9f7a5124" +checksum = "8c942ebf8e95485ca0d52d97da7c5a2c387d0e7f0ba4c35e93bfcaee045955b3" dependencies = [ - "glib-sys", - "gobject-sys", - "libc", - "system-deps", + "once_cell", + "wasm-bindgen", ] [[package]] -name = "jni" -version = "0.21.1" +name = "kqueue" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" +checksum = "eac30106d7dce88daf4a3fcb4879ea939476d5074a9b7ddd0fb97fa4bed5596a" dependencies = [ - "cesu8", - "cfg-if", - "combine", - "jni-sys 0.3.1", - "log", - "thiserror 1.0.69", - "walkdir", - "windows-sys 0.45.0", -] - -[[package]] -name = "jni-sys" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41a652e1f9b6e0275df1f15b32661cf0d4b78d4d87ddec5e0c3c20f097433258" -dependencies = [ - "jni-sys 0.4.1", -] - -[[package]] -name = "jni-sys" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6377a88cb3910bee9b0fa88d4f42e1d2da8e79915598f65fb0c7ee14c878af2" -dependencies = [ - "jni-sys-macros", -] - -[[package]] -name = "jni-sys-macros" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38c0b942f458fe50cdac086d2f946512305e5631e720728f2a61aabcd47a6264" -dependencies = [ - "quote", - "syn 2.0.115", -] - -[[package]] -name = "jobserver" -version = "0.1.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" -dependencies = [ - "getrandom 0.3.4", - "libc", -] - -[[package]] -name = "js-sys" -version = "0.3.85" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c942ebf8e95485ca0d52d97da7c5a2c387d0e7f0ba4c35e93bfcaee045955b3" -dependencies = [ - "once_cell", - "wasm-bindgen", -] - -[[package]] -name = "json-patch" -version = "3.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "863726d7afb6bc2590eeff7135d923545e5e964f004c2ccf8716c25e70a86f08" -dependencies = [ - "jsonptr", - "serde", - "serde_json", - "thiserror 1.0.69", -] - -[[package]] -name = "jsonptr" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dea2b27dd239b2556ed7a25ba842fe47fd602e7fc7433c2a8d6106d4d9edd70" -dependencies = [ - "serde", - "serde_json", -] - -[[package]] -name = "keyboard-types" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b750dcadc39a09dbadd74e118f6dd6598df77fa01df0cfcdc52c28dece74528a" -dependencies = [ - "bitflags 2.10.0", - "serde", - "unicode-segmentation", -] - -[[package]] -name = "keyring" -version = "3.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eebcc3aff044e5944a8fbaf69eb277d11986064cba30c468730e8b9909fb551c" -dependencies = [ - "log", - "zeroize", -] - -[[package]] -name = "kqueue" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eac30106d7dce88daf4a3fcb4879ea939476d5074a9b7ddd0fb97fa4bed5596a" -dependencies = [ - "kqueue-sys", - "libc", + "kqueue-sys", + "libc", ] [[package]] @@ -2320,48 +986,12 @@ dependencies = [ "libc", ] -[[package]] -name = "kuchikiki" -version = "0.8.8-speedreader" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02cb977175687f33fa4afa0c95c112b987ea1443e5a51c8f8ff27dc618270cc2" -dependencies = [ - "cssparser 0.29.6", - "html5ever 0.29.1", - "indexmap 2.13.0", - "selectors 0.24.0", -] - [[package]] name = "leb128fmt" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" -[[package]] -name = "libappindicator" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03589b9607c868cc7ae54c0b2a22c8dc03dd41692d48f2d7df73615c6a95dc0a" -dependencies = [ - "glib", - "gtk", - "gtk-sys", - "libappindicator-sys", - "log", -] - -[[package]] -name = "libappindicator-sys" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e9ec52138abedcc58dc17a7c6c0c00a2bdb4f3427c7f63fa97fd0d859155caf" -dependencies = [ - "gtk-sys", - "libloading", - "once_cell", -] - [[package]] name = "libc" version = "0.2.181" @@ -2382,16 +1012,6 @@ dependencies = [ "pkg-config", ] -[[package]] -name = "libloading" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b67380fd3b2fbe7527a606e18729d21c6f3951633d0500574c4dc22d2d638b9f" -dependencies = [ - "cfg-if", - "winapi", -] - [[package]] name = "libredox" version = "0.1.12" @@ -2467,85 +1087,18 @@ version = "0.4.29" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" -[[package]] -name = "mac" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c41e0c4fef86961ac6d6f8a82609f55f31b05e4fce149ac5710e439df7619ba4" - -[[package]] -name = "markup5ever" -version = "0.14.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7a7213d12e1864c0f002f52c2923d4556935a43dec5e71355c2760e0f6e7a18" -dependencies = [ - "log", - "phf 0.11.3", - "phf_codegen 0.11.3", - "string_cache 0.8.9", - "string_cache_codegen 0.5.4", - "tendril 0.4.3", -] - -[[package]] -name = "markup5ever" -version = "0.38.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8983d30f2915feeaaab2d6babdd6bc7e9ed1a00b66b5e6d74df19aa9c0e91862" -dependencies = [ - "log", - "tendril 0.5.0", - "web_atoms", -] - -[[package]] -name = "match_token" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88a9689d8d44bf9964484516275f5cd4c9b59457a6940c1d5d0ecbb94510a36b" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.115", -] - -[[package]] -name = "matches" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5" - [[package]] name = "memchr" version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" -[[package]] -name = "memoffset" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" -dependencies = [ - "autocfg", -] - [[package]] name = "mime" version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" -[[package]] -name = "miniz_oxide" -version = "0.8.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" -dependencies = [ - "adler2", - "simd-adler32", -] - [[package]] name = "mio" version = "1.1.1" @@ -2554,31 +1107,10 @@ checksum = "a69bcab0ad47271a0234d9422b131806bf3968021e5dc9328caf2d4cd58557fc" dependencies = [ "libc", "log", - "wasi 0.11.1+wasi-snapshot-preview1", + "wasi", "windows-sys 0.61.2", ] -[[package]] -name = "muda" -version = "0.17.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c9fec5a4e89860383d778d10563a605838f8f0b2f9303868937e5ff32e86177" -dependencies = [ - "crossbeam-channel", - "dpi", - "gtk", - "keyboard-types", - "objc2", - "objc2-app-kit", - "objc2-core-foundation", - "objc2-foundation", - "once_cell", - "png", - "serde", - "thiserror 2.0.18", - "windows-sys 0.60.2", -] - [[package]] name = "native-tls" version = "0.2.18" @@ -2596,48 +1128,6 @@ dependencies = [ "tempfile", ] -[[package]] -name = "ndk" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012ebfd62d4" -dependencies = [ - "bitflags 2.10.0", - "jni-sys 0.3.1", - "log", - "ndk-sys", - "num_enum", - "raw-window-handle", - "thiserror 1.0.69", -] - -[[package]] -name = "ndk-context" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b" - -[[package]] -name = "ndk-sys" -version = "0.6.0+11769913" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee6cda3051665f1fb8d9e08fc35c96d5a244fb1be711a03b71118828afc9a873" -dependencies = [ - "jni-sys 0.3.1", -] - -[[package]] -name = "new_debug_unreachable" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" - -[[package]] -name = "nodrop" -version = "0.1.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb" - [[package]] name = "normalize-line-endings" version = "0.3.0" @@ -2672,12 +1162,6 @@ dependencies = [ "instant", ] -[[package]] -name = "num-conv" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6673768db2d862beb9b39a78fdcb1a69439615d5794a1be50caa9bc92c81967" - [[package]] name = "num-traits" version = "0.2.19" @@ -2688,2093 +1172,642 @@ dependencies = [ ] [[package]] -name = "num_enum" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d0bca838442ec211fa11de3a8b0e0e8f3a4522575b5c4c06ed722e005036f26" -dependencies = [ - "num_enum_derive", - "rustversion", -] - -[[package]] -name = "num_enum_derive" -version = "0.7.6" +name = "once_cell" +version = "1.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "680998035259dcfcafe653688bf2aa6d3e2dc05e98be6ab46afb089dc84f1df8" -dependencies = [ - "proc-macro-crate 3.5.0", - "proc-macro2", - "quote", - "syn 2.0.115", -] +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" [[package]] -name = "objc2" -version = "0.6.4" +name = "once_cell_polyfill" +version = "1.70.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a12a8ed07aefc768292f076dc3ac8c48f3781c8f2d5851dd3d98950e8c5a89f" -dependencies = [ - "objc2-encode", - "objc2-exception-helper", -] +checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" [[package]] -name = "objc2-app-kit" -version = "0.3.2" +name = "openssl" +version = "0.10.75" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d49e936b501e5c5bf01fda3a9452ff86dc3ea98ad5f283e1455153142d97518c" +checksum = "08838db121398ad17ab8531ce9de97b244589089e290a384c900cb9ff7434328" dependencies = [ "bitflags 2.10.0", - "block2", - "objc2", - "objc2-core-foundation", - "objc2-foundation", + "cfg-if", + "foreign-types", + "libc", + "once_cell", + "openssl-macros", + "openssl-sys", ] [[package]] -name = "objc2-core-foundation" -version = "0.3.2" +name = "openssl-macros" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536" +checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ - "bitflags 2.10.0", - "dispatch2", - "objc2", + "proc-macro2", + "quote", + "syn", ] [[package]] -name = "objc2-core-graphics" -version = "0.3.2" +name = "openssl-probe" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e022c9d066895efa1345f8e33e584b9f958da2fd4cd116792e15e07e4720a807" -dependencies = [ - "bitflags 2.10.0", - "dispatch2", - "objc2", - "objc2-core-foundation", - "objc2-io-surface", -] +checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" [[package]] -name = "objc2-encode" -version = "4.1.0" +name = "openssl-probe" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cbc89d0c33" +checksum = "7c87def4c32ab89d880effc9e097653c8da5d6ef28e6b539d313baaacfbafcbe" [[package]] -name = "objc2-exception-helper" -version = "0.1.1" +name = "openssl-sys" +version = "0.9.111" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7a1c5fbb72d7735b076bb47b578523aedc40f3c439bea6dfd595c089d79d98a" +checksum = "82cab2d520aa75e3c58898289429321eb788c3106963d0dc886ec7a5f4adc321" dependencies = [ "cc", + "libc", + "pkg-config", + "vcpkg", ] [[package]] -name = "objc2-foundation" -version = "0.3.2" +name = "parking_lot" +version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3e0adef53c21f888deb4fa59fc59f7eb17404926ee8a6f59f5df0fd7f9f3272" +checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" dependencies = [ - "bitflags 2.10.0", - "block2", - "libc", - "objc2", - "objc2-core-foundation", + "lock_api", + "parking_lot_core", ] [[package]] -name = "objc2-io-surface" -version = "0.3.2" +name = "parking_lot_core" +version = "0.9.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "180788110936d59bab6bd83b6060ffdfffb3b922ba1396b312ae795e1de9d81d" +checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" dependencies = [ - "bitflags 2.10.0", - "objc2", - "objc2-core-foundation", + "cfg-if", + "libc", + "redox_syscall 0.5.18", + "smallvec", + "windows-link", ] [[package]] -name = "objc2-quartz-core" -version = "0.3.2" +name = "percent-encoding" +version = "2.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96c1358452b371bf9f104e21ec536d37a650eb10f7ee379fff67d2e08d537f1f" -dependencies = [ - "bitflags 2.10.0", - "objc2", - "objc2-core-foundation", - "objc2-foundation", -] +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" [[package]] -name = "objc2-ui-kit" -version = "0.3.2" +name = "pin-project-lite" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d87d638e33c06f577498cbcc50491496a3ed4246998a7fbba7ccb98b1e7eab22" -dependencies = [ - "bitflags 2.10.0", - "objc2", - "objc2-core-foundation", - "objc2-foundation", -] - -[[package]] -name = "objc2-web-kit" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2e5aaab980c433cf470df9d7af96a7b46a9d892d521a2cbbb2f8a4c16751e7f" -dependencies = [ - "bitflags 2.10.0", - "block2", - "objc2", - "objc2-app-kit", - "objc2-core-foundation", - "objc2-foundation", -] +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" [[package]] -name = "once_cell" -version = "1.21.3" +name = "pin-utils" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] -name = "once_cell_polyfill" -version = "1.70.2" +name = "pkg-config" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" +checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" [[package]] -name = "open" -version = "5.3.4" +name = "potential_utf" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f3bab717c29a857abf75fcef718d441ec7cb2725f937343c734740a985d37fd" +checksum = "b73949432f5e2a09657003c25bca5e19a0e9c84f8058ca374f49e0ebe605af77" dependencies = [ - "dunce", - "is-wsl", - "libc", - "pathdiff", + "zerovec", ] [[package]] -name = "openssl" -version = "0.10.75" +name = "ppv-lite86" +version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08838db121398ad17ab8531ce9de97b244589089e290a384c900cb9ff7434328" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" dependencies = [ - "bitflags 2.10.0", - "cfg-if", - "foreign-types 0.3.2", - "libc", - "once_cell", - "openssl-macros", - "openssl-sys", + "zerocopy", ] [[package]] -name = "openssl-macros" -version = "0.1.1" +name = "predicates" +version = "3.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" +checksum = "ada8f2932f28a27ee7b70dd6c1c39ea0675c55a36879ab92f3a715eaa1e63cfe" dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.115", + "anstyle", + "difflib", + "float-cmp", + "normalize-line-endings", + "predicates-core", + "regex", ] [[package]] -name = "openssl-probe" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" - -[[package]] -name = "openssl-probe" -version = "0.2.1" +name = "predicates-core" +version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c87def4c32ab89d880effc9e097653c8da5d6ef28e6b539d313baaacfbafcbe" +checksum = "cad38746f3166b4031b1a0d39ad9f954dd291e7854fcc0eed52ee41a0b50d144" [[package]] -name = "openssl-sys" -version = "0.9.111" +name = "predicates-tree" +version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82cab2d520aa75e3c58898289429321eb788c3106963d0dc886ec7a5f4adc321" +checksum = "d0de1b847b39c8131db0467e9df1ff60e6d0562ab8e9a16e568ad0fdb372e2f2" dependencies = [ - "cc", - "libc", - "pkg-config", - "vcpkg", + "predicates-core", + "termtree", ] [[package]] -name = "option-ext" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" - -[[package]] -name = "ordered-stream" -version = "0.2.0" +name = "prettyplease" +version = "0.2.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9aa2b01e1d916879f73a53d01d1d6cee68adbb31d6d9177a8cfce093cced1d50" +checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" dependencies = [ - "futures-core", - "pin-project-lite", + "proc-macro2", + "syn", ] [[package]] -name = "pango" -version = "0.18.3" +name = "proc-macro2" +version = "1.0.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ca27ec1eb0457ab26f3036ea52229edbdb74dee1edd29063f5b9b010e7ebee4" +checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" dependencies = [ - "gio", - "glib", - "libc", - "once_cell", - "pango-sys", + "unicode-ident", ] [[package]] -name = "pango-sys" -version = "0.18.0" +name = "quote" +version = "1.0.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "436737e391a843e5933d6d9aa102cb126d501e815b83601365a948a518555dc5" +checksum = "21b2ebcf727b7760c461f091f9f0f539b77b8e87f2fd88131e7f1b433b3cece4" dependencies = [ - "glib-sys", - "gobject-sys", - "libc", - "system-deps", + "proc-macro2", ] [[package]] -name = "parking" -version = "2.2.1" +name = "r-efi" +version = "5.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" [[package]] -name = "parking_lot" -version = "0.12.5" +name = "rand" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" +checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" dependencies = [ - "lock_api", - "parking_lot_core", + "rand_chacha", + "rand_core", ] [[package]] -name = "parking_lot_core" -version = "0.9.12" +name = "rand_chacha" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" dependencies = [ - "cfg-if", - "libc", - "redox_syscall 0.5.18", - "smallvec", - "windows-link 0.2.1", + "ppv-lite86", + "rand_core", ] [[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 = "phf" -version = "0.8.0" +name = "rand_core" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3dfb61232e34fcb633f43d12c58f83c1df82962dcdfa565a4e866ffc17dafe12" +checksum = "76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c" dependencies = [ - "phf_shared 0.8.0", + "getrandom 0.3.4", ] [[package]] -name = "phf" -version = "0.10.1" +name = "redox_syscall" +version = "0.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fabbf1ead8a5bcbc20f5f8b939ee3f5b0f6f281b6ad3468b84656b658b455259" +checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" dependencies = [ - "phf_macros 0.10.0", - "phf_shared 0.10.0", - "proc-macro-hack", + "bitflags 2.10.0", ] [[package]] -name = "phf" -version = "0.11.3" +name = "redox_syscall" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2c2edd078" +checksum = "35985aa610addc02e24fc232012c86fd11f14111180f902b67e2d5331f8ebf2b" dependencies = [ - "phf_macros 0.11.3", - "phf_shared 0.11.3", + "bitflags 2.10.0", ] [[package]] -name = "phf" -version = "0.13.1" +name = "regex" +version = "1.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1562dc717473dbaa4c1f85a36410e03c047b2e7df7f45ee938fbef64ae7fadf" +checksum = "e10754a14b9137dd7b1e3e5b0493cc9171fdd105e0ab477f51b72e7f3ac0e276" dependencies = [ - "phf_macros 0.13.1", - "phf_shared 0.13.1", - "serde", + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", ] [[package]] -name = "phf_codegen" -version = "0.8.0" +name = "regex-automata" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbffee61585b0411840d3ece935cce9cb6321f01c45477d30066498cd5e1a815" +checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f" dependencies = [ - "phf_generator 0.8.0", - "phf_shared 0.8.0", + "aho-corasick", + "memchr", + "regex-syntax", ] [[package]] -name = "phf_codegen" -version = "0.11.3" +name = "regex-syntax" +version = "0.8.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aef8048c789fa5e851558d709946d6d79a8ff88c0440c587967f8e94bfb1216a" -dependencies = [ - "phf_generator 0.11.3", - "phf_shared 0.11.3", -] +checksum = "dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a" [[package]] -name = "phf_codegen" -version = "0.13.1" +name = "reqwest" +version = "0.12.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49aa7f9d80421bca176ca8dbfebe668cc7a2684708594ec9f3c0db0805d5d6e1" +checksum = "eddd3ca559203180a307f12d114c268abf583f59b03cb906fd0b3ff8646c1147" dependencies = [ - "phf_generator 0.13.1", - "phf_shared 0.13.1", + "base64", + "bytes", + "encoding_rs", + "futures-channel", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-rustls", + "hyper-tls", + "hyper-util", + "js-sys", + "log", + "mime", + "native-tls", + "percent-encoding", + "pin-project-lite", + "rustls-pki-types", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper", + "tokio", + "tokio-native-tls", + "tower", + "tower-http", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", ] [[package]] -name = "phf_generator" -version = "0.8.0" +name = "ring" +version = "0.17.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17367f0cc86f2d25802b2c26ee58a7b23faeccf78a396094c13dced0d0182526" +checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" dependencies = [ - "phf_shared 0.8.0", - "rand 0.7.3", + "cc", + "cfg-if", + "getrandom 0.2.17", + "libc", + "untrusted", + "windows-sys 0.52.0", ] [[package]] -name = "phf_generator" -version = "0.10.0" +name = "rusqlite" +version = "0.32.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d5285893bb5eb82e6aaf5d59ee909a06a16737a8970984dd7746ba9283498d6" +checksum = "7753b721174eb8ff87a9a0e799e2d7bc3749323e773db92e0984debb00019d6e" dependencies = [ - "phf_shared 0.10.0", - "rand 0.8.6", + "bitflags 2.10.0", + "fallible-iterator", + "fallible-streaming-iterator", + "hashlink", + "libsqlite3-sys", + "smallvec", ] [[package]] -name = "phf_generator" -version = "0.11.3" +name = "rustix" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c80231409c20246a13fddb31776fb942c38553c51e871f8cbd687a4cfb5843d" +checksum = "146c9e247ccc180c1f61615433868c99f3de3ae256a30a43b49f67c2d9171f34" dependencies = [ - "phf_shared 0.11.3", - "rand 0.8.6", + "bitflags 2.10.0", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.61.2", ] [[package]] -name = "phf_generator" -version = "0.13.1" +name = "rustls" +version = "0.23.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "135ace3a761e564ec88c03a77317a7c6b80bb7f7135ef2544dbe054243b89737" +checksum = "758025cb5fccfd3bc2fd74708fd4682be41d99e5dff73c377c0646c6012c73a4" dependencies = [ - "fastrand", - "phf_shared 0.13.1", + "once_cell", + "rustls-pki-types", + "rustls-webpki", + "subtle", + "zeroize", ] [[package]] -name = "phf_macros" -version = "0.10.0" +name = "rustls-pki-types" +version = "1.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58fdf3184dd560f160dd73922bea2d5cd6e8f064bf4b13110abd81b03697b4e0" +checksum = "be040f8b0a225e40375822a563fa9524378b9d63112f53e19ffff34df5d33fdd" dependencies = [ - "phf_generator 0.10.0", - "phf_shared 0.10.0", - "proc-macro-hack", - "proc-macro2", - "quote", - "syn 1.0.109", + "zeroize", ] [[package]] -name = "phf_macros" -version = "0.11.3" +name = "rustls-webpki" +version = "0.103.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f84ac04429c13a7ff43785d75ad27569f2951ce0ffd30a3321230db2fc727216" +checksum = "d7df23109aa6c1567d1c575b9952556388da57401e4ace1d15f79eedad0d8f53" dependencies = [ - "phf_generator 0.11.3", - "phf_shared 0.11.3", - "proc-macro2", - "quote", - "syn 2.0.115", + "ring", + "rustls-pki-types", + "untrusted", ] [[package]] -name = "phf_macros" -version = "0.13.1" +name = "rustversion" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "812f032b54b1e759ccd5f8b6677695d5268c588701effba24601f6932f8269ef" -dependencies = [ - "phf_generator 0.13.1", - "phf_shared 0.13.1", - "proc-macro2", - "quote", - "syn 2.0.115", -] - -[[package]] -name = "phf_shared" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c00cf8b9eafe68dde5e9eaa2cef8ee84a9336a47d566ec55ca16589633b65af7" -dependencies = [ - "siphasher 0.3.11", -] - -[[package]] -name = "phf_shared" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6796ad771acdc0123d2a88dc428b5e38ef24456743ddb1744ed628f9815c096" -dependencies = [ - "siphasher 0.3.11", -] - -[[package]] -name = "phf_shared" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5" -dependencies = [ - "siphasher 1.0.2", -] - -[[package]] -name = "phf_shared" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e57fef6bc5981e38c2ce2d63bfa546861309f875b8a75f092d1d54ae2d64f266" -dependencies = [ - "siphasher 1.0.2", -] - -[[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 = "piper" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c835479a4443ded371d6c535cbfd8d31ad92c5d23ae9770a61bc155e4992a3c1" -dependencies = [ - "atomic-waker", - "fastrand", - "futures-io", -] - -[[package]] -name = "pkg-config" -version = "0.3.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" - -[[package]] -name = "plist" -version = "1.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "740ebea15c5d1428f910cd1a5f52cebf8d25006245ed8ade92702f4943d91e07" -dependencies = [ - "base64 0.22.1", - "indexmap 2.13.0", - "quick-xml", - "serde", - "time", -] - -[[package]] -name = "png" -version = "0.17.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82151a2fc869e011c153adc57cf2789ccb8d9906ce52c0b39a6b5697749d7526" -dependencies = [ - "bitflags 1.3.2", - "crc32fast", - "fdeflate", - "flate2", - "miniz_oxide", -] - -[[package]] -name = "polling" -version = "3.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d0e4f59085d47d8241c88ead0f274e8a0cb551f3625263c05eb8dd897c34218" -dependencies = [ - "cfg-if", - "concurrent-queue", - "hermit-abi", - "pin-project-lite", - "rustix", - "windows-sys 0.61.2", -] - -[[package]] -name = "potential_utf" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b73949432f5e2a09657003c25bca5e19a0e9c84f8058ca374f49e0ebe605af77" -dependencies = [ - "zerovec", -] - -[[package]] -name = "powerfmt" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" - -[[package]] -name = "ppv-lite86" -version = "0.2.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" -dependencies = [ - "zerocopy", -] - -[[package]] -name = "precomputed-hash" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" - -[[package]] -name = "predicates" -version = "3.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ada8f2932f28a27ee7b70dd6c1c39ea0675c55a36879ab92f3a715eaa1e63cfe" -dependencies = [ - "anstyle", - "difflib", - "float-cmp", - "normalize-line-endings", - "predicates-core", - "regex", -] - -[[package]] -name = "predicates-core" -version = "1.0.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cad38746f3166b4031b1a0d39ad9f954dd291e7854fcc0eed52ee41a0b50d144" - -[[package]] -name = "predicates-tree" -version = "1.0.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0de1b847b39c8131db0467e9df1ff60e6d0562ab8e9a16e568ad0fdb372e2f2" -dependencies = [ - "predicates-core", - "termtree", -] - -[[package]] -name = "prettyplease" -version = "0.2.37" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" -dependencies = [ - "proc-macro2", - "syn 2.0.115", -] - -[[package]] -name = "proc-macro-crate" -version = "1.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" -dependencies = [ - "once_cell", - "toml_edit 0.19.15", -] - -[[package]] -name = "proc-macro-crate" -version = "2.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b00f26d3400549137f92511a46ac1cd8ce37cb5598a96d382381458b992a5d24" -dependencies = [ - "toml_datetime 0.6.3", - "toml_edit 0.20.2", -] - -[[package]] -name = "proc-macro-crate" -version = "3.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e67ba7e9b2b56446f1d419b1d807906278ffa1a658a8a5d8a39dcb1f5a78614f" -dependencies = [ - "toml_edit 0.25.11+spec-1.1.0", -] - -[[package]] -name = "proc-macro-error" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" -dependencies = [ - "proc-macro-error-attr", - "proc-macro2", - "quote", - "syn 1.0.109", - "version_check", -] - -[[package]] -name = "proc-macro-error-attr" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" -dependencies = [ - "proc-macro2", - "quote", - "version_check", -] - -[[package]] -name = "proc-macro-hack" -version = "0.5.20+deprecated" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068" - -[[package]] -name = "proc-macro2" -version = "1.0.106" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "quick-xml" -version = "0.38.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b66c2058c55a409d601666cffe35f04333cf1013010882cec174a7467cd4e21c" -dependencies = [ - "memchr", -] - -[[package]] -name = "quote" -version = "1.0.44" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21b2ebcf727b7760c461f091f9f0f539b77b8e87f2fd88131e7f1b433b3cece4" -dependencies = [ - "proc-macro2", -] - -[[package]] -name = "r-efi" -version = "5.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" - -[[package]] -name = "rand" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" -dependencies = [ - "getrandom 0.1.16", - "libc", - "rand_chacha 0.2.2", - "rand_core 0.5.1", - "rand_hc", - "rand_pcg", -] - -[[package]] -name = "rand" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ca0ecfa931c29007047d1bc58e623ab12e5590e8c7cc53200d5202b69266d8a" -dependencies = [ - "libc", - "rand_chacha 0.3.1", - "rand_core 0.6.4", -] - -[[package]] -name = "rand" -version = "0.9.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" -dependencies = [ - "rand_chacha 0.9.0", - "rand_core 0.9.5", -] - -[[package]] -name = "rand_chacha" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" -dependencies = [ - "ppv-lite86", - "rand_core 0.5.1", -] - -[[package]] -name = "rand_chacha" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" -dependencies = [ - "ppv-lite86", - "rand_core 0.6.4", -] - -[[package]] -name = "rand_chacha" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" -dependencies = [ - "ppv-lite86", - "rand_core 0.9.5", -] - -[[package]] -name = "rand_core" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" -dependencies = [ - "getrandom 0.1.16", -] - -[[package]] -name = "rand_core" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" -dependencies = [ - "getrandom 0.2.17", -] - -[[package]] -name = "rand_core" -version = "0.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c" -dependencies = [ - "getrandom 0.3.4", -] - -[[package]] -name = "rand_hc" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" -dependencies = [ - "rand_core 0.5.1", -] - -[[package]] -name = "rand_pcg" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16abd0c1b639e9eb4d7c50c0b8100b0d0f849be2349829c740fe8e6eb4816429" -dependencies = [ - "rand_core 0.5.1", -] - -[[package]] -name = "raw-window-handle" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20675572f6f24e9e76ef639bc5552774ed45f1c30e2951e1e99c59888861c539" - -[[package]] -name = "redox_syscall" -version = "0.5.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" -dependencies = [ - "bitflags 2.10.0", -] - -[[package]] -name = "redox_syscall" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35985aa610addc02e24fc232012c86fd11f14111180f902b67e2d5331f8ebf2b" -dependencies = [ - "bitflags 2.10.0", -] - -[[package]] -name = "redox_users" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4e608c6638b9c18977b00b475ac1f28d14e84b27d8d42f70e0bf1e3dec127ac" -dependencies = [ - "getrandom 0.2.17", - "libredox", - "thiserror 2.0.18", -] - -[[package]] -name = "ref-cast" -version = "1.0.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f354300ae66f76f1c85c5f84693f0ce81d747e2c3f21a45fef496d89c960bf7d" -dependencies = [ - "ref-cast-impl", -] - -[[package]] -name = "ref-cast-impl" -version = "1.0.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.115", -] - -[[package]] -name = "regex" -version = "1.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e10754a14b9137dd7b1e3e5b0493cc9171fdd105e0ab477f51b72e7f3ac0e276" -dependencies = [ - "aho-corasick", - "memchr", - "regex-automata", - "regex-syntax", -] - -[[package]] -name = "regex-automata" -version = "0.4.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f" -dependencies = [ - "aho-corasick", - "memchr", - "regex-syntax", -] - -[[package]] -name = "regex-syntax" -version = "0.8.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a" - -[[package]] -name = "reqwest" -version = "0.12.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eddd3ca559203180a307f12d114c268abf583f59b03cb906fd0b3ff8646c1147" -dependencies = [ - "base64 0.22.1", - "bytes", - "encoding_rs", - "futures-channel", - "futures-core", - "futures-util", - "h2", - "http", - "http-body", - "http-body-util", - "hyper", - "hyper-rustls", - "hyper-tls", - "hyper-util", - "js-sys", - "log", - "mime", - "native-tls", - "percent-encoding", - "pin-project-lite", - "rustls-pki-types", - "serde", - "serde_json", - "serde_urlencoded", - "sync_wrapper", - "tokio", - "tokio-native-tls", - "tower", - "tower-http", - "tower-service", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", -] - -[[package]] -name = "reqwest" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab3f43e3283ab1488b624b44b0e988d0acea0b3214e694730a055cb6b2efa801" -dependencies = [ - "base64 0.22.1", - "bytes", - "futures-core", - "futures-util", - "http", - "http-body", - "http-body-util", - "hyper", - "hyper-util", - "js-sys", - "log", - "percent-encoding", - "pin-project-lite", - "serde", - "serde_json", - "sync_wrapper", - "tokio", - "tokio-util", - "tower", - "tower-http", - "tower-service", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "wasm-streams", - "web-sys", -] - -[[package]] -name = "rfd" -version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a15ad77d9e70a92437d8f74c35d99b4e4691128df018833e99f90bcd36152672" -dependencies = [ - "block2", - "dispatch2", - "glib-sys", - "gobject-sys", - "gtk-sys", - "js-sys", - "log", - "objc2", - "objc2-app-kit", - "objc2-core-foundation", - "objc2-foundation", - "raw-window-handle", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", - "windows-sys 0.60.2", -] - -[[package]] -name = "ring" -version = "0.17.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" -dependencies = [ - "cc", - "cfg-if", - "getrandom 0.2.17", - "libc", - "untrusted", - "windows-sys 0.52.0", -] - -[[package]] -name = "rusqlite" -version = "0.32.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7753b721174eb8ff87a9a0e799e2d7bc3749323e773db92e0984debb00019d6e" -dependencies = [ - "bitflags 2.10.0", - "fallible-iterator", - "fallible-streaming-iterator", - "hashlink", - "libsqlite3-sys", - "smallvec", -] - -[[package]] -name = "rustc-hash" -version = "2.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94300abf3f1ae2e2b8ffb7b58043de3d399c73fa6f4b73826402a5c457614dbe" - -[[package]] -name = "rustc_version" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" -dependencies = [ - "semver", -] - -[[package]] -name = "rustix" -version = "1.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "146c9e247ccc180c1f61615433868c99f3de3ae256a30a43b49f67c2d9171f34" -dependencies = [ - "bitflags 2.10.0", - "errno", - "libc", - "linux-raw-sys", - "windows-sys 0.61.2", -] - -[[package]] -name = "rustls" -version = "0.23.37" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "758025cb5fccfd3bc2fd74708fd4682be41d99e5dff73c377c0646c6012c73a4" -dependencies = [ - "once_cell", - "rustls-pki-types", - "rustls-webpki", - "subtle", - "zeroize", -] - -[[package]] -name = "rustls-pki-types" -version = "1.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be040f8b0a225e40375822a563fa9524378b9d63112f53e19ffff34df5d33fdd" -dependencies = [ - "zeroize", -] - -[[package]] -name = "rustls-webpki" -version = "0.103.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7df23109aa6c1567d1c575b9952556388da57401e4ace1d15f79eedad0d8f53" -dependencies = [ - "ring", - "rustls-pki-types", - "untrusted", -] - -[[package]] -name = "rustversion" -version = "1.0.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" - -[[package]] -name = "ryu" -version = "1.0.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f" - -[[package]] -name = "same-file" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" -dependencies = [ - "winapi-util", -] - -[[package]] -name = "schannel" -version = "0.1.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "891d81b926048e76efe18581bf793546b4c0eaf8448d72be8de2bbee5fd166e1" -dependencies = [ - "windows-sys 0.61.2", -] - -[[package]] -name = "schemars" -version = "0.8.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fbf2ae1b8bc8e02df939598064d22402220cd5bbcca1c76f7d6a310974d5615" -dependencies = [ - "dyn-clone", - "indexmap 1.9.3", - "schemars_derive", - "serde", - "serde_json", - "url", - "uuid", -] - -[[package]] -name = "schemars" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cd191f9397d57d581cddd31014772520aa448f65ef991055d7f61582c65165f" -dependencies = [ - "dyn-clone", - "ref-cast", - "serde", - "serde_json", -] - -[[package]] -name = "schemars" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2b42f36aa1cd011945615b92222f6bf73c599a102a300334cd7f8dbeec726cc" -dependencies = [ - "dyn-clone", - "ref-cast", - "serde", - "serde_json", -] - -[[package]] -name = "schemars_derive" -version = "0.8.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32e265784ad618884abaea0600a9adf15393368d840e0222d101a072f3f7534d" -dependencies = [ - "proc-macro2", - "quote", - "serde_derive_internals", - "syn 2.0.115", -] - -[[package]] -name = "scopeguard" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" - -[[package]] -name = "security-framework" -version = "3.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d17b898a6d6948c3a8ee4372c17cb384f90d2e6e912ef00895b14fd7ab54ec38" -dependencies = [ - "bitflags 2.10.0", - "core-foundation 0.10.1", - "core-foundation-sys", - "libc", - "security-framework-sys", -] - -[[package]] -name = "security-framework-sys" -version = "2.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ce2691df843ecc5d231c0b14ece2acc3efb62c0a398c7e1d875f3983ce020e3" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "selectors" -version = "0.24.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c37578180969d00692904465fb7f6b3d50b9a2b952b87c23d0e2e5cb5013416" -dependencies = [ - "bitflags 1.3.2", - "cssparser 0.29.6", - "derive_more 0.99.20", - "fxhash", - "log", - "phf 0.8.0", - "phf_codegen 0.8.0", - "precomputed-hash", - "servo_arc 0.2.0", - "smallvec", -] - -[[package]] -name = "selectors" -version = "0.36.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5d9c0c92a92d33f08817311cf3f2c29a3538a8240e94a6a3c622ce652d7e00c" -dependencies = [ - "bitflags 2.10.0", - "cssparser 0.36.0", - "derive_more 2.1.1", - "log", - "new_debug_unreachable", - "phf 0.13.1", - "phf_codegen 0.13.1", - "precomputed-hash", - "rustc-hash", - "servo_arc 0.4.3", - "smallvec", -] - -[[package]] -name = "semver" -version = "1.0.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" -dependencies = [ - "serde", - "serde_core", -] - -[[package]] -name = "serde" -version = "1.0.228" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" -dependencies = [ - "serde_core", - "serde_derive", -] - -[[package]] -name = "serde-untagged" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9faf48a4a2d2693be24c6289dbe26552776eb7737074e6722891fadbe6c5058" -dependencies = [ - "erased-serde", - "serde", - "serde_core", - "typeid", -] - -[[package]] -name = "serde_core" -version = "1.0.228" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde_derive" -version = "1.0.228" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.115", -] - -[[package]] -name = "serde_derive_internals" -version = "0.29.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.115", -] - -[[package]] -name = "serde_json" -version = "1.0.149" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86" -dependencies = [ - "itoa", - "memchr", - "serde", - "serde_core", - "zmij", -] - -[[package]] -name = "serde_repr" -version = "0.1.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.115", -] - -[[package]] -name = "serde_spanned" -version = "0.6.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3" -dependencies = [ - "serde", -] - -[[package]] -name = "serde_spanned" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6662b5879511e06e8999a8a235d848113e942c9124f211511b16466ee2995f26" -dependencies = [ - "serde_core", -] - -[[package]] -name = "serde_urlencoded" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" -dependencies = [ - "form_urlencoded", - "itoa", - "ryu", - "serde", -] - -[[package]] -name = "serde_with" -version = "3.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd5414fad8e6907dbdd5bc441a50ae8d6e26151a03b1de04d89a5576de61d01f" -dependencies = [ - "base64 0.22.1", - "chrono", - "hex", - "indexmap 1.9.3", - "indexmap 2.13.0", - "schemars 0.9.0", - "schemars 1.2.1", - "serde_core", - "serde_json", - "serde_with_macros", - "time", -] - -[[package]] -name = "serde_with_macros" -version = "3.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3db8978e608f1fe7357e211969fd9abdcae80bac1ba7a3369bb7eb6b404eb65" -dependencies = [ - "darling", - "proc-macro2", - "quote", - "syn 2.0.115", -] - -[[package]] -name = "serialize-to-javascript" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04f3666a07a197cdb77cdf306c32be9b7f598d7060d50cfd4d5aa04bfd92f6c5" -dependencies = [ - "serde", - "serde_json", - "serialize-to-javascript-impl", -] - -[[package]] -name = "serialize-to-javascript-impl" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "772ee033c0916d670af7860b6e1ef7d658a4629a6d0b4c8c3e67f09b3765b75d" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.115", -] - -[[package]] -name = "servo_arc" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d52aa42f8fdf0fed91e5ce7f23d8138441002fa31dca008acf47e6fd4721f741" -dependencies = [ - "nodrop", - "stable_deref_trait", -] - -[[package]] -name = "servo_arc" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "170fb83ab34de17dc69aa7c67482b22218ddb85da56546f9bd6b929e32a05930" -dependencies = [ - "stable_deref_trait", -] - -[[package]] -name = "sha1" -version = "0.10.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" -dependencies = [ - "cfg-if", - "cpufeatures", - "digest", -] - -[[package]] -name = "sha2" -version = "0.10.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" -dependencies = [ - "cfg-if", - "cpufeatures", - "digest", -] +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" [[package]] -name = "shlex" -version = "1.3.0" +name = "ryu" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" +checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f" [[package]] -name = "signal-hook-registry" -version = "1.4.8" +name = "same-file" +version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" dependencies = [ - "errno", - "libc", + "winapi-util", ] [[package]] -name = "simd-adler32" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "703d5c7ef118737c72f1af64ad2f6f8c5e1921f818cdcb97b8fe6fc69bf66214" - -[[package]] -name = "similar" -version = "2.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbbb5d9659141646ae647b42fe094daf6c6192d1620870b449d9557f748b2daa" - -[[package]] -name = "siphasher" -version = "0.3.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" - -[[package]] -name = "siphasher" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2aa850e253778c88a04c3d7323b043aeda9d3e30d5971937c1855769763678e" - -[[package]] -name = "slab" -version = "0.4.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" - -[[package]] -name = "smallvec" -version = "1.15.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" - -[[package]] -name = "socket2" -version = "0.6.2" +name = "schannel" +version = "0.1.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86f4aa3ad99f2088c990dfa82d367e19cb29268ed67c574d10d0a4bfe71f07e0" +checksum = "891d81b926048e76efe18581bf793546b4c0eaf8448d72be8de2bbee5fd166e1" dependencies = [ - "libc", - "windows-sys 0.60.2", + "windows-sys 0.61.2", ] [[package]] -name = "softbuffer" -version = "0.4.8" +name = "scopeguard" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aac18da81ebbf05109ab275b157c22a653bb3c12cf884450179942f81bcbf6c3" -dependencies = [ - "bytemuck", - "js-sys", - "ndk", - "objc2", - "objc2-core-foundation", - "objc2-core-graphics", - "objc2-foundation", - "objc2-quartz-core", - "raw-window-handle", - "redox_syscall 0.5.18", - "tracing", - "wasm-bindgen", - "web-sys", - "windows-sys 0.61.2", -] +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] -name = "soup3" -version = "0.5.0" +name = "security-framework" +version = "3.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "471f924a40f31251afc77450e781cb26d55c0b650842efafc9c6cbd2f7cc4f9f" +checksum = "d17b898a6d6948c3a8ee4372c17cb384f90d2e6e912ef00895b14fd7ab54ec38" dependencies = [ - "futures-channel", - "gio", - "glib", + "bitflags 2.10.0", + "core-foundation 0.10.1", + "core-foundation-sys", "libc", - "soup3-sys", + "security-framework-sys", ] [[package]] -name = "soup3-sys" -version = "0.5.0" +name = "security-framework-sys" +version = "2.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ebe8950a680a12f24f15ebe1bf70db7af98ad242d9db43596ad3108aab86c27" +checksum = "6ce2691df843ecc5d231c0b14ece2acc3efb62c0a398c7e1d875f3983ce020e3" dependencies = [ - "gio-sys", - "glib-sys", - "gobject-sys", + "core-foundation-sys", "libc", - "system-deps", ] [[package]] -name = "stable_deref_trait" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" - -[[package]] -name = "string_cache" -version = "0.8.9" +name = "semver" +version = "1.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf776ba3fa74f83bf4b63c3dcbbf82173db2632ed8452cb2d891d33f459de70f" -dependencies = [ - "new_debug_unreachable", - "parking_lot", - "phf_shared 0.11.3", - "precomputed-hash", - "serde", -] +checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" [[package]] -name = "string_cache" -version = "0.9.0" +name = "serde" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a18596f8c785a729f2819c0f6a7eae6ebeebdfffbfe4214ae6b087f690e31901" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" dependencies = [ - "new_debug_unreachable", - "parking_lot", - "phf_shared 0.13.1", - "precomputed-hash", + "serde_core", + "serde_derive", ] [[package]] -name = "string_cache_codegen" -version = "0.5.4" +name = "serde_core" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c711928715f1fe0fe509c53b43e993a9a557babc2d0a3567d0a3006f1ac931a0" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" dependencies = [ - "phf_generator 0.11.3", - "phf_shared 0.11.3", - "proc-macro2", - "quote", + "serde_derive", ] [[package]] -name = "string_cache_codegen" -version = "0.6.1" +name = "serde_derive" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "585635e46db231059f76c5849798146164652513eb9e8ab2685939dd90f29b69" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ - "phf_generator 0.13.1", - "phf_shared 0.13.1", "proc-macro2", "quote", + "syn", ] [[package]] -name = "strsim" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" - -[[package]] -name = "subtle" -version = "2.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" - -[[package]] -name = "swift-rs" -version = "1.0.7" +name = "serde_json" +version = "1.0.149" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4057c98e2e852d51fdcfca832aac7b571f6b351ad159f9eda5db1655f8d0c4d7" +checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86" dependencies = [ - "base64 0.21.7", + "itoa", + "memchr", "serde", - "serde_json", -] - -[[package]] -name = "syn" -version = "1.0.109" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "syn" -version = "2.0.115" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e614ed320ac28113fa64972c4262d5dbc89deacdfd00c34a3e4cea073243c12" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "sync_wrapper" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" -dependencies = [ - "futures-core", -] - -[[package]] -name = "synstructure" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.115", -] - -[[package]] -name = "system-configuration" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a13f3d0daba03132c0aa9767f98351b3488edc2c100cda2d2ec2b04f3d8d3c8b" -dependencies = [ - "bitflags 2.10.0", - "core-foundation 0.9.4", - "system-configuration-sys", -] - -[[package]] -name = "system-configuration-sys" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4" -dependencies = [ - "core-foundation-sys", - "libc", + "serde_core", + "zmij", ] [[package]] -name = "system-deps" -version = "6.2.2" +name = "serde_urlencoded" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3e535eb8dded36d55ec13eddacd30dec501792ff23a0b1682c38601b8cf2349" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" dependencies = [ - "cfg-expr", - "heck 0.5.0", - "pkg-config", - "toml 0.8.2", - "version-compare", + "form_urlencoded", + "itoa", + "ryu", + "serde", ] [[package]] -name = "tao" -version = "0.34.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9103edf55f2da3c82aea4c7fab7c4241032bfeea0e71fa557d98e00e7ce7cc20" -dependencies = [ - "bitflags 2.10.0", - "block2", - "core-foundation 0.10.1", - "core-graphics", - "crossbeam-channel", - "dispatch2", - "dlopen2", - "dpi", - "gdkwayland-sys", - "gdkx11-sys", - "gtk", - "jni", - "libc", - "log", - "ndk", - "ndk-context", - "ndk-sys", - "objc2", - "objc2-app-kit", - "objc2-foundation", - "once_cell", - "parking_lot", - "raw-window-handle", - "tao-macros", - "unicode-segmentation", - "url", - "windows", - "windows-core 0.61.2", - "windows-version", - "x11-dl", +name = "sha1" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", ] [[package]] -name = "tao-macros" -version = "0.1.3" +name = "sha2" +version = "0.10.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4e16beb8b2ac17db28eab8bca40e62dbfbb34c0fcdc6d9826b11b7b5d047dfd" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.115", + "cfg-if", + "cpufeatures", + "digest", ] [[package]] -name = "target-lexicon" -version = "0.12.16" +name = "shlex" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" [[package]] -name = "tauri" -version = "2.10.3" +name = "signal-hook-registry" +version = "1.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da77cc00fb9028caf5b5d4650f75e31f1ef3693459dfca7f7e506d1ecef0ba2d" +checksum = "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b" dependencies = [ - "anyhow", - "bytes", - "cookie", - "dirs", - "dunce", - "embed_plist", - "getrandom 0.3.4", - "glob", - "gtk", - "heck 0.5.0", - "http", - "jni", + "errno", "libc", - "log", - "mime", - "muda", - "objc2", - "objc2-app-kit", - "objc2-foundation", - "objc2-ui-kit", - "objc2-web-kit", - "percent-encoding", - "plist", - "raw-window-handle", - "reqwest 0.13.2", - "serde", - "serde_json", - "serde_repr", - "serialize-to-javascript", - "swift-rs", - "tauri-build", - "tauri-macros", - "tauri-runtime", - "tauri-runtime-wry", - "tauri-utils", - "thiserror 2.0.18", - "tokio", - "tray-icon", - "url", - "webkit2gtk", - "webview2-com", - "window-vibrancy", - "windows", ] [[package]] -name = "tauri-build" -version = "2.5.6" +name = "similar" +version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bbc990d1dbf57a8e1c7fa2327f2a614d8b757805603c1b9ba5c81bade09fd4d" -dependencies = [ - "anyhow", - "cargo_toml", - "dirs", - "glob", - "heck 0.5.0", - "json-patch", - "schemars 0.8.22", - "semver", - "serde", - "serde_json", - "tauri-utils", - "tauri-winres", - "toml 0.9.12+spec-1.1.0", - "walkdir", -] +checksum = "bbbb5d9659141646ae647b42fe094daf6c6192d1620870b449d9557f748b2daa" [[package]] -name = "tauri-codegen" -version = "2.5.5" +name = "slab" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4a24476afd977c5d5d169f72425868613d82747916dd29e0a357c84c4bd6d29" -dependencies = [ - "base64 0.22.1", - "brotli", - "ico", - "json-patch", - "plist", - "png", - "proc-macro2", - "quote", - "semver", - "serde", - "serde_json", - "sha2", - "syn 2.0.115", - "tauri-utils", - "thiserror 2.0.18", - "time", - "url", - "uuid", - "walkdir", -] +checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" [[package]] -name = "tauri-macros" -version = "2.5.5" +name = "smallvec" +version = "1.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d39b349a98dadaffebb73f0a40dcd1f23c999211e5a2e744403db384d0c33de7" -dependencies = [ - "heck 0.5.0", - "proc-macro2", - "quote", - "syn 2.0.115", - "tauri-codegen", - "tauri-utils", -] +checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" [[package]] -name = "tauri-plugin" -version = "2.5.4" +name = "socket2" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddde7d51c907b940fb573006cdda9a642d6a7c8153657e88f8a5c3c9290cd4aa" +checksum = "86f4aa3ad99f2088c990dfa82d367e19cb29268ed67c574d10d0a4bfe71f07e0" dependencies = [ - "anyhow", - "glob", - "plist", - "schemars 0.8.22", - "serde", - "serde_json", - "tauri-utils", - "toml 0.9.12+spec-1.1.0", - "walkdir", + "libc", + "windows-sys 0.60.2", ] [[package]] -name = "tauri-plugin-dialog" -version = "2.7.0" +name = "stable_deref_trait" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1fa4150c95ae391946cc8b8f905ab14797427caba3a8a2f79628e956da91809" -dependencies = [ - "log", - "raw-window-handle", - "rfd", - "serde", - "serde_json", - "tauri", - "tauri-plugin", - "tauri-plugin-fs", - "thiserror 2.0.18", - "url", -] +checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" [[package]] -name = "tauri-plugin-fs" -version = "2.5.0" +name = "strsim" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36e1ec28b79f3d0683f4507e1615c36292c0ea6716668770d4396b9b39871ed8" -dependencies = [ - "anyhow", - "dunce", - "glob", - "log", - "objc2-foundation", - "percent-encoding", - "schemars 0.8.22", - "serde", - "serde_json", - "serde_repr", - "tauri", - "tauri-plugin", - "tauri-utils", - "thiserror 2.0.18", - "toml 0.9.12+spec-1.1.0", - "url", -] +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" [[package]] -name = "tauri-plugin-opener" -version = "2.5.3" +name = "subtle" +version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc624469b06f59f5a29f874bbc61a2ed737c0f9c23ef09855a292c389c42e83f" -dependencies = [ - "dunce", - "glob", - "objc2-app-kit", - "objc2-foundation", - "open", - "schemars 0.8.22", - "serde", - "serde_json", - "tauri", - "tauri-plugin", - "thiserror 2.0.18", - "url", - "windows", - "zbus", -] +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] -name = "tauri-plugin-positioner" -version = "2.3.1" +name = "syn" +version = "2.0.115" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02dcd56dd4797bd4d6c4c658daed40ce563176f92df90fbd2c904ce145de17ef" +checksum = "6e614ed320ac28113fa64972c4262d5dbc89deacdfd00c34a3e4cea073243c12" dependencies = [ - "log", - "serde", - "serde_json", - "serde_repr", - "tauri", - "tauri-plugin", - "thiserror 2.0.18", + "proc-macro2", + "quote", + "unicode-ident", ] [[package]] -name = "tauri-runtime" -version = "2.10.1" +name = "sync_wrapper" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2826d79a3297ed08cd6ea7f412644ef58e32969504bc4fbd8d7dbeabc4445ea2" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" dependencies = [ - "cookie", - "dpi", - "gtk", - "http", - "jni", - "objc2", - "objc2-ui-kit", - "objc2-web-kit", - "raw-window-handle", - "serde", - "serde_json", - "tauri-utils", - "thiserror 2.0.18", - "url", - "webkit2gtk", - "webview2-com", - "windows", + "futures-core", ] [[package]] -name = "tauri-runtime-wry" -version = "2.10.1" +name = "synstructure" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e11ea2e6f801d275fdd890d6c9603736012742a1c33b96d0db788c9cdebf7f9e" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ - "gtk", - "http", - "jni", - "log", - "objc2", - "objc2-app-kit", - "once_cell", - "percent-encoding", - "raw-window-handle", - "softbuffer", - "tao", - "tauri-runtime", - "tauri-utils", - "url", - "webkit2gtk", - "webview2-com", - "windows", - "wry", + "proc-macro2", + "quote", + "syn", ] [[package]] -name = "tauri-utils" -version = "2.8.3" +name = "system-configuration" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "219a1f983a2af3653f75b5747f76733b0da7ff03069c7a41901a5eb3ace4557d" +checksum = "a13f3d0daba03132c0aa9767f98351b3488edc2c100cda2d2ec2b04f3d8d3c8b" dependencies = [ - "anyhow", - "brotli", - "cargo_metadata", - "ctor", - "dunce", - "glob", - "html5ever 0.29.1", - "http", - "infer", - "json-patch", - "kuchikiki", - "log", - "memchr", - "phf 0.11.3", - "proc-macro2", - "quote", - "regex", - "schemars 0.8.22", - "semver", - "serde", - "serde-untagged", - "serde_json", - "serde_with", - "swift-rs", - "thiserror 2.0.18", - "toml 0.9.12+spec-1.1.0", - "url", - "urlpattern", - "uuid", - "walkdir", + "bitflags 2.10.0", + "core-foundation 0.9.4", + "system-configuration-sys", ] [[package]] -name = "tauri-winres" -version = "0.3.5" +name = "system-configuration-sys" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1087b111fe2b005e42dbdc1990fc18593234238d47453b0c99b7de1c9ab2c1e0" +checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4" dependencies = [ - "dunce", - "embed-resource", - "toml 0.9.12+spec-1.1.0", + "core-foundation-sys", + "libc", ] [[package]] @@ -4790,27 +1823,6 @@ dependencies = [ "windows-sys 0.61.2", ] -[[package]] -name = "tendril" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d24a120c5fc464a3458240ee02c299ebcb9d67b5249c8848b09d639dca8d7bb0" -dependencies = [ - "futf", - "mac", - "utf-8", -] - -[[package]] -name = "tendril" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4790fc369d5a530f4b544b094e31388b9b3a37c0f4652ade4505945f5660d24" -dependencies = [ - "new_debug_unreachable", - "utf-8", -] - [[package]] name = "termtree" version = "0.5.1" @@ -4823,16 +1835,7 @@ version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" dependencies = [ - "thiserror-impl 1.0.69", -] - -[[package]] -name = "thiserror" -version = "2.0.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4" -dependencies = [ - "thiserror-impl 2.0.18", + "thiserror-impl", ] [[package]] @@ -4843,49 +1846,7 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.115", -] - -[[package]] -name = "thiserror-impl" -version = "2.0.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.115", -] - -[[package]] -name = "time" -version = "0.3.47" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "743bd48c283afc0388f9b8827b976905fb217ad9e647fae3a379a9283c4def2c" -dependencies = [ - "deranged", - "itoa", - "num-conv", - "powerfmt", - "serde_core", - "time-core", - "time-macros", -] - -[[package]] -name = "time-core" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7694e1cfe791f8d31026952abf09c69ca6f6fa4e1a1229e18988f06a04a12dca" - -[[package]] -name = "time-macros" -version = "0.2.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e70e4c5a0e0a8a4823ad65dfe1a6930e4f4d756dcd9dd7939022b5e8c501215" -dependencies = [ - "num-conv", - "time-core", + "syn", ] [[package]] @@ -4923,7 +1884,7 @@ checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.115", + "syn", ] [[package]] @@ -4940,130 +1901,25 @@ dependencies = [ name = "tokio-rustls" version = "0.26.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" -dependencies = [ - "rustls", - "tokio", -] - -[[package]] -name = "tokio-util" -version = "0.7.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ae9cec805b01e8fc3fd2fe289f89149a9b66dd16786abd8b19cfa7b48cb0098" -dependencies = [ - "bytes", - "futures-core", - "futures-sink", - "pin-project-lite", - "tokio", -] - -[[package]] -name = "toml" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "185d8ab0dfbb35cf1399a6344d8484209c088f75f8f68230da55d48d95d43e3d" -dependencies = [ - "serde", - "serde_spanned 0.6.9", - "toml_datetime 0.6.3", - "toml_edit 0.20.2", -] - -[[package]] -name = "toml" -version = "0.9.12+spec-1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf92845e79fc2e2def6a5d828f0801e29a2f8acc037becc5ab08595c7d5e9863" -dependencies = [ - "indexmap 2.13.0", - "serde_core", - "serde_spanned 1.1.1", - "toml_datetime 0.7.5+spec-1.1.0", - "toml_parser", - "toml_writer", - "winnow 0.7.15", -] - -[[package]] -name = "toml_datetime" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b" -dependencies = [ - "serde", -] - -[[package]] -name = "toml_datetime" -version = "0.7.5+spec-1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92e1cfed4a3038bc5a127e35a2d360f145e1f4b971b551a2ba5fd7aedf7e1347" -dependencies = [ - "serde_core", -] - -[[package]] -name = "toml_datetime" -version = "1.1.1+spec-1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3165f65f62e28e0115a00b2ebdd37eb6f3b641855f9d636d3cd4103767159ad7" -dependencies = [ - "serde_core", -] - -[[package]] -name = "toml_edit" -version = "0.19.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" -dependencies = [ - "indexmap 2.13.0", - "toml_datetime 0.6.3", - "winnow 0.5.40", -] - -[[package]] -name = "toml_edit" -version = "0.20.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "396e4d48bbb2b7554c944bde63101b5ae446cff6ec4a24227428f15eb72ef338" -dependencies = [ - "indexmap 2.13.0", - "serde", - "serde_spanned 0.6.9", - "toml_datetime 0.6.3", - "winnow 0.5.40", -] - -[[package]] -name = "toml_edit" -version = "0.25.11+spec-1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b59c4d22ed448339746c59b905d24568fcbb3ab65a500494f7b8c3e97739f2b" +checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" dependencies = [ - "indexmap 2.13.0", - "toml_datetime 1.1.1+spec-1.1.0", - "toml_parser", - "winnow 1.0.1", + "rustls", + "tokio", ] [[package]] -name = "toml_parser" -version = "1.1.2+spec-1.1.0" +name = "tokio-util" +version = "0.7.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2abe9b86193656635d2411dc43050282ca48aa31c2451210f4202550afb7526" +checksum = "9ae9cec805b01e8fc3fd2fe289f89149a9b66dd16786abd8b19cfa7b48cb0098" dependencies = [ - "winnow 1.0.1", + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", ] -[[package]] -name = "toml_writer" -version = "1.1.1+spec-1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "756daf9b1013ebe47a8776667b466417e2d4c5679d441c26230efd9ef78692db" - [[package]] name = "toolpath" version = "0.1.5" @@ -5082,7 +1938,7 @@ dependencies = [ "serde", "serde_json", "tempfile", - "thiserror 1.0.69", + "thiserror", "tokio", "toolpath", "toolpath-convo", @@ -5099,8 +1955,8 @@ dependencies = [ "git2", "insta", "predicates", - "rand 0.9.2", - "reqwest 0.12.28", + "rand", + "reqwest", "serde", "serde_json", "similar", @@ -5127,7 +1983,7 @@ dependencies = [ "serde", "serde_json", "tempfile", - "thiserror 1.0.69", + "thiserror", "toolpath", "toolpath-convo", ] @@ -5140,36 +1996,8 @@ dependencies = [ "serde", "serde_json", "similar", - "thiserror 1.0.69", - "toolpath", -] - -[[package]] -name = "toolpath-desktop" -version = "0.1.0" -dependencies = [ - "anyhow", - "chrono", - "git2", - "keyring", - "serde", - "serde_json", - "tauri", - "tauri-build", - "tauri-plugin-dialog", - "tauri-plugin-opener", - "tauri-plugin-positioner", - "tempfile", - "thiserror 1.0.69", + "thiserror", "toolpath", - "toolpath-claude", - "toolpath-codex", - "toolpath-gemini", - "toolpath-git", - "toolpath-github", - "toolpath-opencode", - "toolpath-pi", - "uuid", ] [[package]] @@ -5189,7 +2017,7 @@ dependencies = [ "serde_json", "sha2", "tempfile", - "thiserror 1.0.69", + "thiserror", "toolpath", "toolpath-convo", ] @@ -5211,7 +2039,7 @@ version = "0.2.0" dependencies = [ "anyhow", "chrono", - "reqwest 0.12.28", + "reqwest", "serde", "serde_json", "toolpath", @@ -5237,7 +2065,7 @@ dependencies = [ "serde_json", "sha1", "tempfile", - "thiserror 1.0.69", + "thiserror", "toolpath", "toolpath-convo", ] @@ -5251,7 +2079,7 @@ dependencies = [ "serde", "serde_json", "tempfile", - "thiserror 1.0.69", + "thiserror", "toolpath", "toolpath-convo", ] @@ -5308,21 +2136,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" dependencies = [ "pin-project-lite", - "tracing-attributes", "tracing-core", ] -[[package]] -name = "tracing-attributes" -version = "0.1.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.115", -] - [[package]] name = "tracing-core" version = "0.1.36" @@ -5332,110 +2148,24 @@ dependencies = [ "once_cell", ] -[[package]] -name = "tray-icon" -version = "0.21.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5e85aa143ceb072062fc4d6356c1b520a51d636e7bc8e77ec94be3608e5e80c" -dependencies = [ - "crossbeam-channel", - "dirs", - "libappindicator", - "muda", - "objc2", - "objc2-app-kit", - "objc2-core-foundation", - "objc2-core-graphics", - "objc2-foundation", - "once_cell", - "png", - "serde", - "thiserror 2.0.18", - "windows-sys 0.60.2", -] - [[package]] name = "try-lock" version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" -[[package]] -name = "typeid" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc7d623258602320d5c55d1bc22793b57daff0ec7efc270ea7d55ce1d5f5471c" - [[package]] name = "typenum" version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" -[[package]] -name = "uds_windows" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2f6fb2847f6742cd76af783a2a2c49e9375d0a111c7bef6f71cd9e738c72d6e" -dependencies = [ - "memoffset", - "tempfile", - "windows-sys 0.61.2", -] - -[[package]] -name = "unic-char-property" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8c57a407d9b6fa02b4795eb81c5b6652060a15a7903ea981f3d723e6c0be221" -dependencies = [ - "unic-char-range", -] - -[[package]] -name = "unic-char-range" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0398022d5f700414f6b899e10b8348231abf9173fa93144cbc1a43b9793c1fbc" - -[[package]] -name = "unic-common" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80d7ff825a6a654ee85a63e80f92f054f904f21e7d12da4e22f9834a4aaa35bc" - -[[package]] -name = "unic-ucd-ident" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e230a37c0381caa9219d67cf063aa3a375ffed5bf541a452db16e744bdab6987" -dependencies = [ - "unic-char-property", - "unic-char-range", - "unic-ucd-version", -] - -[[package]] -name = "unic-ucd-version" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96bd2f2237fe450fcd0a1d2f5f4e91711124f7857ba2e964247776ebeeb7b0c4" -dependencies = [ - "unic-common", -] - [[package]] name = "unicode-ident" version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "537dd038a89878be9b64dd4bd1b260315c1bb94f4d784956b81e27a088d9a09e" -[[package]] -name = "unicode-segmentation" -version = "1.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9629274872b2bfaf8d66f5f15725007f635594914870f65218920345aa11aa8c" - [[package]] name = "unicode-xid" version = "0.2.6" @@ -5458,27 +2188,8 @@ dependencies = [ "idna", "percent-encoding", "serde", - "serde_derive", -] - -[[package]] -name = "urlpattern" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70acd30e3aa1450bc2eece896ce2ad0d178e9c079493819301573dae3c37ba6d" -dependencies = [ - "regex", - "serde", - "unic-ucd-ident", - "url", ] -[[package]] -name = "utf-8" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" - [[package]] name = "utf8_iter" version = "1.0.4" @@ -5491,56 +2202,18 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" -[[package]] -name = "uuid" -version = "1.23.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddd74a9687298c6858e9b88ec8935ec45d22e8fd5e6394fa1bd4e99a87789c76" -dependencies = [ - "getrandom 0.4.1", - "js-sys", - "serde_core", - "wasm-bindgen", -] - [[package]] name = "vcpkg" version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" -[[package]] -name = "version-compare" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03c2856837ef78f57382f06b2b8563a2f512f7185d732608fd9176cb3b8edf0e" - [[package]] name = "version_check" version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" -[[package]] -name = "vswhom" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be979b7f07507105799e854203b470ff7c78a1639e330a58f183b5fea574608b" -dependencies = [ - "libc", - "vswhom-sys", -] - -[[package]] -name = "vswhom-sys" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb067e4cbd1ff067d1df46c9194b5de0e98efd2810bbc95c5d5e5f25a3231150" -dependencies = [ - "cc", - "libc", -] - [[package]] name = "wait-timeout" version = "0.2.1" @@ -5569,12 +2242,6 @@ dependencies = [ "try-lock", ] -[[package]] -name = "wasi" -version = "0.9.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" - [[package]] name = "wasi" version = "0.11.1+wasi-snapshot-preview1" @@ -5606,286 +2273,109 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "64024a30ec1e37399cf85a7ffefebdb72205ca1c972291c51512360d90bd8566" dependencies = [ "cfg-if", - "once_cell", - "rustversion", - "wasm-bindgen-macro", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-futures" -version = "0.4.58" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70a6e77fd0ae8029c9ea0063f87c46fde723e7d887703d74ad2616d792e51e6f" -dependencies = [ - "cfg-if", - "futures-util", - "js-sys", - "once_cell", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "wasm-bindgen-macro" -version = "0.2.108" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "008b239d9c740232e71bd39e8ef6429d27097518b6b30bdf9086833bd5b6d608" -dependencies = [ - "quote", - "wasm-bindgen-macro-support", -] - -[[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.108" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5256bae2d58f54820e6490f9839c49780dff84c65aeab9e772f15d5f0e913a55" -dependencies = [ - "bumpalo", - "proc-macro2", - "quote", - "syn 2.0.115", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-shared" -version = "0.2.108" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f01b580c9ac74c8d8f0c0e4afb04eeef2acf145458e52c03845ee9cd23e3d12" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "wasm-encoder" -version = "0.244.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "990065f2fe63003fe337b932cfb5e3b80e0b4d0f5ff650e6985b1048f62c8319" -dependencies = [ - "leb128fmt", - "wasmparser", -] - -[[package]] -name = "wasm-metadata" -version = "0.244.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb0e353e6a2fbdc176932bbaab493762eb1255a7900fe0fea1a2f96c296cc909" -dependencies = [ - "anyhow", - "indexmap 2.13.0", - "wasm-encoder", - "wasmparser", -] - -[[package]] -name = "wasm-streams" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d1ec4f6517c9e11ae630e200b2b65d193279042e28edd4a2cda233e46670bbb" -dependencies = [ - "futures-util", - "js-sys", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", -] - -[[package]] -name = "wasmparser" -version = "0.244.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe" -dependencies = [ - "bitflags 2.10.0", - "hashbrown 0.15.5", - "indexmap 2.13.0", - "semver", -] - -[[package]] -name = "web-sys" -version = "0.3.85" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "312e32e551d92129218ea9a2452120f4aabc03529ef03e4d0d82fb2780608598" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "web_atoms" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7cff6eef815df1834fd250e3a2ff436044d82a9f1bc1980ca1dbdf07effc538" -dependencies = [ - "phf 0.13.1", - "phf_codegen 0.13.1", - "string_cache 0.9.0", - "string_cache_codegen 0.6.1", -] - -[[package]] -name = "webkit2gtk" -version = "2.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1027150013530fb2eaf806408df88461ae4815a45c541c8975e61d6f2fc4793" -dependencies = [ - "bitflags 1.3.2", - "cairo-rs", - "gdk", - "gdk-sys", - "gio", - "gio-sys", - "glib", - "glib-sys", - "gobject-sys", - "gtk", - "gtk-sys", - "javascriptcore-rs", - "libc", - "once_cell", - "soup3", - "webkit2gtk-sys", -] - -[[package]] -name = "webkit2gtk-sys" -version = "2.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "916a5f65c2ef0dfe12fff695960a2ec3d4565359fdbb2e9943c974e06c734ea5" -dependencies = [ - "bitflags 1.3.2", - "cairo-sys-rs", - "gdk-sys", - "gio-sys", - "glib-sys", - "gobject-sys", - "gtk-sys", - "javascriptcore-rs-sys", - "libc", - "pkg-config", - "soup3-sys", - "system-deps", + "once_cell", + "rustversion", + "wasm-bindgen-macro", + "wasm-bindgen-shared", ] [[package]] -name = "webview2-com" -version = "0.38.2" +name = "wasm-bindgen-futures" +version = "0.4.58" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7130243a7a5b33c54a444e54842e6a9e133de08b5ad7b5861cd8ed9a6a5bc96a" +checksum = "70a6e77fd0ae8029c9ea0063f87c46fde723e7d887703d74ad2616d792e51e6f" dependencies = [ - "webview2-com-macros", - "webview2-com-sys", - "windows", - "windows-core 0.61.2", - "windows-implement", - "windows-interface", + "cfg-if", + "futures-util", + "js-sys", + "once_cell", + "wasm-bindgen", + "web-sys", ] [[package]] -name = "webview2-com-macros" -version = "0.8.1" +name = "wasm-bindgen-macro" +version = "0.2.108" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67a921c1b6914c367b2b823cd4cde6f96beec77d30a939c8199bb377cf9b9b54" +checksum = "008b239d9c740232e71bd39e8ef6429d27097518b6b30bdf9086833bd5b6d608" dependencies = [ - "proc-macro2", "quote", - "syn 2.0.115", + "wasm-bindgen-macro-support", ] [[package]] -name = "webview2-com-sys" -version = "0.38.2" +name = "wasm-bindgen-macro-support" +version = "0.2.108" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "381336cfffd772377d291702245447a5251a2ffa5bad679c99e61bc48bacbf9c" +checksum = "5256bae2d58f54820e6490f9839c49780dff84c65aeab9e772f15d5f0e913a55" dependencies = [ - "thiserror 2.0.18", - "windows", - "windows-core 0.61.2", + "bumpalo", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", ] [[package]] -name = "winapi" -version = "0.3.9" +name = "wasm-bindgen-shared" +version = "0.2.108" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +checksum = "1f01b580c9ac74c8d8f0c0e4afb04eeef2acf145458e52c03845ee9cd23e3d12" dependencies = [ - "winapi-i686-pc-windows-gnu", - "winapi-x86_64-pc-windows-gnu", + "unicode-ident", ] [[package]] -name = "winapi-i686-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" - -[[package]] -name = "winapi-util" -version = "0.1.11" +name = "wasm-encoder" +version = "0.244.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" +checksum = "990065f2fe63003fe337b932cfb5e3b80e0b4d0f5ff650e6985b1048f62c8319" dependencies = [ - "windows-sys 0.61.2", + "leb128fmt", + "wasmparser", ] [[package]] -name = "winapi-x86_64-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" - -[[package]] -name = "window-vibrancy" -version = "0.6.0" +name = "wasm-metadata" +version = "0.244.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9bec5a31f3f9362f2258fd0e9c9dd61a9ca432e7306cc78c444258f0dce9a9c" +checksum = "bb0e353e6a2fbdc176932bbaab493762eb1255a7900fe0fea1a2f96c296cc909" dependencies = [ - "objc2", - "objc2-app-kit", - "objc2-core-foundation", - "objc2-foundation", - "raw-window-handle", - "windows-sys 0.59.0", - "windows-version", + "anyhow", + "indexmap", + "wasm-encoder", + "wasmparser", ] [[package]] -name = "windows" -version = "0.61.3" +name = "wasmparser" +version = "0.244.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9babd3a767a4c1aef6900409f85f5d53ce2544ccdfaa86dad48c91782c6d6893" +checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe" dependencies = [ - "windows-collections", - "windows-core 0.61.2", - "windows-future", - "windows-link 0.1.3", - "windows-numerics", + "bitflags 2.10.0", + "hashbrown 0.15.5", + "indexmap", + "semver", ] [[package]] -name = "windows-collections" -version = "0.2.0" +name = "web-sys" +version = "0.3.85" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3beeceb5e5cfd9eb1d76b381630e82c4241ccd0d27f1a39ed41b2760b255c5e8" +checksum = "312e32e551d92129218ea9a2452120f4aabc03529ef03e4d0d82fb2780608598" dependencies = [ - "windows-core 0.61.2", + "js-sys", + "wasm-bindgen", ] [[package]] -name = "windows-core" -version = "0.61.2" +name = "winapi-util" +version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" dependencies = [ - "windows-implement", - "windows-interface", - "windows-link 0.1.3", - "windows-result 0.3.4", - "windows-strings 0.4.2", + "windows-sys 0.61.2", ] [[package]] @@ -5896,20 +2386,9 @@ checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" dependencies = [ "windows-implement", "windows-interface", - "windows-link 0.2.1", - "windows-result 0.4.1", - "windows-strings 0.5.1", -] - -[[package]] -name = "windows-future" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc6a41e98427b19fe4b73c550f060b59fa592d7d686537eebf9385621bfbad8e" -dependencies = [ - "windows-core 0.61.2", - "windows-link 0.1.3", - "windows-threading", + "windows-link", + "windows-result", + "windows-strings", ] [[package]] @@ -5920,7 +2399,7 @@ checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" dependencies = [ "proc-macro2", "quote", - "syn 2.0.115", + "syn", ] [[package]] @@ -5931,49 +2410,24 @@ checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" dependencies = [ "proc-macro2", "quote", - "syn 2.0.115", + "syn", ] -[[package]] -name = "windows-link" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" - [[package]] name = "windows-link" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" -[[package]] -name = "windows-numerics" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9150af68066c4c5c07ddc0ce30421554771e528bde427614c61038bc2c92c2b1" -dependencies = [ - "windows-core 0.61.2", - "windows-link 0.1.3", -] - [[package]] name = "windows-registry" version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "02752bf7fbdcce7f2a27a742f798510f3e5ad88dbe84871e5168e2120c3d5720" dependencies = [ - "windows-link 0.2.1", - "windows-result 0.4.1", - "windows-strings 0.5.1", -] - -[[package]] -name = "windows-result" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" -dependencies = [ - "windows-link 0.1.3", + "windows-link", + "windows-result", + "windows-strings", ] [[package]] @@ -5982,16 +2436,7 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" dependencies = [ - "windows-link 0.2.1", -] - -[[package]] -name = "windows-strings" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" -dependencies = [ - "windows-link 0.1.3", + "windows-link", ] [[package]] @@ -6000,16 +2445,7 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" dependencies = [ - "windows-link 0.2.1", -] - -[[package]] -name = "windows-sys" -version = "0.45.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" -dependencies = [ - "windows-targets 0.42.2", + "windows-link", ] [[package]] @@ -6045,22 +2481,7 @@ version = "0.61.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" dependencies = [ - "windows-link 0.2.1", -] - -[[package]] -name = "windows-targets" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" -dependencies = [ - "windows_aarch64_gnullvm 0.42.2", - "windows_aarch64_msvc 0.42.2", - "windows_i686_gnu 0.42.2", - "windows_i686_msvc 0.42.2", - "windows_x86_64_gnu 0.42.2", - "windows_x86_64_gnullvm 0.42.2", - "windows_x86_64_msvc 0.42.2", + "windows-link", ] [[package]] @@ -6085,7 +2506,7 @@ version = "0.53.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" dependencies = [ - "windows-link 0.2.1", + "windows-link", "windows_aarch64_gnullvm 0.53.1", "windows_aarch64_msvc 0.53.1", "windows_i686_gnu 0.53.1", @@ -6096,30 +2517,6 @@ dependencies = [ "windows_x86_64_msvc 0.53.1", ] -[[package]] -name = "windows-threading" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b66463ad2e0ea3bbf808b7f1d371311c80e115c0b71d60efc142cafbcfb057a6" -dependencies = [ - "windows-link 0.1.3", -] - -[[package]] -name = "windows-version" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4060a1da109b9d0326b7262c8e12c84df67cc0dbc9e33cf49e01ccc2eb63631" -dependencies = [ - "windows-link 0.2.1", -] - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" - [[package]] name = "windows_aarch64_gnullvm" version = "0.52.6" @@ -6132,12 +2529,6 @@ version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" -[[package]] -name = "windows_aarch64_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" - [[package]] name = "windows_aarch64_msvc" version = "0.52.6" @@ -6150,12 +2541,6 @@ version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" -[[package]] -name = "windows_i686_gnu" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" - [[package]] name = "windows_i686_gnu" version = "0.52.6" @@ -6180,12 +2565,6 @@ version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" -[[package]] -name = "windows_i686_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" - [[package]] name = "windows_i686_msvc" version = "0.52.6" @@ -6198,12 +2577,6 @@ version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" -[[package]] -name = "windows_x86_64_gnu" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" - [[package]] name = "windows_x86_64_gnu" version = "0.52.6" @@ -6216,12 +2589,6 @@ version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" - [[package]] name = "windows_x86_64_gnullvm" version = "0.52.6" @@ -6234,12 +2601,6 @@ version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" -[[package]] -name = "windows_x86_64_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" - [[package]] name = "windows_x86_64_msvc" version = "0.52.6" @@ -6252,43 +2613,6 @@ version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" -[[package]] -name = "winnow" -version = "0.5.40" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" -dependencies = [ - "memchr", -] - -[[package]] -name = "winnow" -version = "0.7.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df79d97927682d2fd8adb29682d1140b343be4ac0f08fd68b7765d9c059d3945" -dependencies = [ - "memchr", -] - -[[package]] -name = "winnow" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09dac053f1cd375980747450bfc7250c264eaae0583872e845c0c7cd578872b5" -dependencies = [ - "memchr", -] - -[[package]] -name = "winreg" -version = "0.55.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb5a765337c50e9ec252c2069be9bf91c7df47afb103b642ba3a53bf8101be97" -dependencies = [ - "cfg-if", - "windows-sys 0.59.0", -] - [[package]] name = "wit-bindgen" version = "0.51.0" @@ -6305,7 +2629,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ea61de684c3ea68cb082b7a88508a8b27fcc8b797d738bfc99a82facf1d752dc" dependencies = [ "anyhow", - "heck 0.5.0", + "heck", "wit-parser", ] @@ -6316,10 +2640,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b7c566e0f4b284dd6561c786d9cb0142da491f46a9fbed79ea69cdad5db17f21" dependencies = [ "anyhow", - "heck 0.5.0", - "indexmap 2.13.0", + "heck", + "indexmap", "prettyplease", - "syn 2.0.115", + "syn", "wasm-metadata", "wit-bindgen-core", "wit-component", @@ -6335,7 +2659,7 @@ dependencies = [ "prettyplease", "proc-macro2", "quote", - "syn 2.0.115", + "syn", "wit-bindgen-core", "wit-bindgen-rust", ] @@ -6348,7 +2672,7 @@ checksum = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2" dependencies = [ "anyhow", "bitflags 2.10.0", - "indexmap 2.13.0", + "indexmap", "log", "serde", "serde_derive", @@ -6367,7 +2691,7 @@ checksum = "ecc8ac4bc1dc3381b7f59c34f00b67e18f910c2c0f50015669dde7def656a736" dependencies = [ "anyhow", "id-arena", - "indexmap 2.13.0", + "indexmap", "log", "semver", "serde", @@ -6383,71 +2707,6 @@ version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9" -[[package]] -name = "wry" -version = "0.54.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5a8135d8676225e5744de000d4dff5a082501bf7db6a1c1495034f8c314edbc" -dependencies = [ - "base64 0.22.1", - "block2", - "cookie", - "crossbeam-channel", - "dirs", - "dom_query", - "dpi", - "dunce", - "gdkx11", - "gtk", - "http", - "javascriptcore-rs", - "jni", - "libc", - "ndk", - "objc2", - "objc2-app-kit", - "objc2-core-foundation", - "objc2-foundation", - "objc2-ui-kit", - "objc2-web-kit", - "once_cell", - "percent-encoding", - "raw-window-handle", - "sha2", - "soup3", - "tao-macros", - "thiserror 2.0.18", - "url", - "webkit2gtk", - "webkit2gtk-sys", - "webview2-com", - "windows", - "windows-core 0.61.2", - "windows-version", - "x11-dl", -] - -[[package]] -name = "x11" -version = "2.21.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "502da5464ccd04011667b11c435cb992822c2c0dbde1770c988480d312a0db2e" -dependencies = [ - "libc", - "pkg-config", -] - -[[package]] -name = "x11-dl" -version = "2.21.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38735924fedd5314a6e548792904ed8c6de6636285cb9fec04d5b1db85c1516f" -dependencies = [ - "libc", - "once_cell", - "pkg-config", -] - [[package]] name = "yoke" version = "0.8.1" @@ -6467,71 +2726,10 @@ checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.115", + "syn", "synstructure", ] -[[package]] -name = "zbus" -version = "5.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca82f95dbd3943a40a53cfded6c2d0a2ca26192011846a1810c4256ef92c60bc" -dependencies = [ - "async-broadcast", - "async-executor", - "async-io", - "async-lock", - "async-process", - "async-recursion", - "async-task", - "async-trait", - "blocking", - "enumflags2", - "event-listener", - "futures-core", - "futures-lite", - "hex", - "libc", - "ordered-stream", - "rustix", - "serde", - "serde_repr", - "tracing", - "uds_windows", - "uuid", - "windows-sys 0.61.2", - "winnow 0.7.15", - "zbus_macros", - "zbus_names", - "zvariant", -] - -[[package]] -name = "zbus_macros" -version = "5.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "897e79616e84aac4b2c46e9132a4f63b93105d54fe8c0e8f6bffc21fa8d49222" -dependencies = [ - "proc-macro-crate 3.5.0", - "proc-macro2", - "quote", - "syn 2.0.115", - "zbus_names", - "zvariant", - "zvariant_utils", -] - -[[package]] -name = "zbus_names" -version = "4.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffd8af6d5b78619bab301ff3c560a5bd22426150253db278f164d6cf3b72c50f" -dependencies = [ - "serde", - "winnow 0.7.15", - "zvariant", -] - [[package]] name = "zerocopy" version = "0.8.39" @@ -6549,7 +2747,7 @@ checksum = "4122cd3169e94605190e77839c9a40d40ed048d305bfdc146e7df40ab0f3e517" dependencies = [ "proc-macro2", "quote", - "syn 2.0.115", + "syn", ] [[package]] @@ -6569,7 +2767,7 @@ checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" dependencies = [ "proc-macro2", "quote", - "syn 2.0.115", + "syn", "synstructure", ] @@ -6609,7 +2807,7 @@ checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.115", + "syn", ] [[package]] @@ -6617,43 +2815,3 @@ name = "zmij" version = "1.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" - -[[package]] -name = "zvariant" -version = "5.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5708299b21903bbe348e94729f22c49c55d04720a004aa350f1f9c122fd2540b" -dependencies = [ - "endi", - "enumflags2", - "serde", - "winnow 0.7.15", - "zvariant_derive", - "zvariant_utils", -] - -[[package]] -name = "zvariant_derive" -version = "5.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b59b012ebe9c46656f9cc08d8da8b4c726510aef12559da3e5f1bf72780752c" -dependencies = [ - "proc-macro-crate 3.5.0", - "proc-macro2", - "quote", - "syn 2.0.115", - "zvariant_utils", -] - -[[package]] -name = "zvariant_utils" -version = "3.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f75c23a64ef8f40f13a6989991e643554d9bef1d682a281160cf0c1bc389c5e9" -dependencies = [ - "proc-macro2", - "quote", - "serde", - "syn 2.0.115", - "winnow 0.7.15", -] diff --git a/Cargo.toml b/Cargo.toml index d62510a..e266f03 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -12,7 +12,6 @@ members = [ "crates/toolpath-md", "crates/toolpath-pi", "crates/toolpath-cli", - "crates/toolpath-desktop", ] resolver = "2" @@ -32,7 +31,6 @@ toolpath-github = { version = "0.2.0", path = "crates/toolpath-github" } toolpath-dot = { version = "0.1.2", path = "crates/toolpath-dot" } toolpath-md = { version = "0.2.0", path = "crates/toolpath-md" } toolpath-pi = { version = "0.1.0", path = "crates/toolpath-pi" } -toolpath-desktop = { version = "0.1.0", path = "crates/toolpath-desktop" } reqwest = { version = "0.12", features = ["blocking", "json"] } serde = { version = "1.0", features = ["derive"] } diff --git a/README.md b/README.md index 7c5d318..e2942c9 100644 --- a/README.md +++ b/README.md @@ -52,7 +52,6 @@ crates/ toolpath-dot/ Graphviz DOT visualization toolpath-md/ Markdown rendering for LLM consumption toolpath-cli/ Unified CLI (binary: path) - toolpath-desktop/ Tauri 2 desktop app (binary: toolpath-desktop) ``` See each crate's README for library-level documentation. diff --git a/crates/toolpath-desktop/.gitignore b/crates/toolpath-desktop/.gitignore deleted file mode 100644 index 3973c5a..0000000 --- a/crates/toolpath-desktop/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -# Generated by tauri-build from tauri.conf.json + capabilities/ on each build. -# Safe to ignore — regenerated automatically. -gen/ -node_modules/ diff --git a/crates/toolpath-desktop/.taurignore b/crates/toolpath-desktop/.taurignore deleted file mode 100644 index a22982e..0000000 --- a/crates/toolpath-desktop/.taurignore +++ /dev/null @@ -1,5 +0,0 @@ -# Tauri CLI file-watcher ignore list (gitignore syntax). -# `cargo tauri dev` watches the crate root and restarts the Rust binary on -# any change. Vite already hot-reloads the Svelte frontend, so we don't -# want the frontend tree to trigger a Rust restart. -frontend/ diff --git a/crates/toolpath-desktop/Cargo.toml b/crates/toolpath-desktop/Cargo.toml deleted file mode 100644 index 1ef284f..0000000 --- a/crates/toolpath-desktop/Cargo.toml +++ /dev/null @@ -1,43 +0,0 @@ -[package] -name = "toolpath-desktop" -version = "0.1.0" -edition.workspace = true -license.workspace = true -repository = "https://github.com/empathic/toolpath" -description = "Desktop app for selecting, previewing, and exporting Toolpath traces" -keywords = ["toolpath", "desktop", "tauri", "provenance", "pathbase"] -categories = ["gui", "development-tools"] - -[[bin]] -name = "toolpath-desktop" -path = "src/main.rs" - -[build-dependencies] -tauri-build = { version = "2", features = [] } - -[dependencies] -toolpath = { workspace = true } -toolpath-claude = { workspace = true, features = ["watcher"] } -toolpath-codex = { workspace = true } -toolpath-gemini = { workspace = true } -toolpath-git = { workspace = true } -toolpath-github = { workspace = true } -toolpath-opencode = { workspace = true } -toolpath-pi = { workspace = true } - -tauri = { version = "2", features = ["tray-icon"] } -tauri-plugin-dialog = "2" -tauri-plugin-opener = "2" -tauri-plugin-positioner = { version = "2", features = ["tray-icon"] } - -serde = { workspace = true } -serde_json = { workspace = true } -thiserror = { workspace = true } -anyhow = { workspace = true } -chrono = { workspace = true } -git2 = { workspace = true } -keyring = "3" -uuid = { version = "1", features = ["v4"] } - -[dev-dependencies] -tempfile = { workspace = true } diff --git a/crates/toolpath-desktop/README.md b/crates/toolpath-desktop/README.md deleted file mode 100644 index 8004ec7..0000000 --- a/crates/toolpath-desktop/README.md +++ /dev/null @@ -1,70 +0,0 @@ -# toolpath-desktop - -Desktop GUI for selecting, previewing, and exporting Toolpath traces. - -This crate ships a [Tauri 2](https://tauri.app) application that provides a -non-technical-user entry point to the Toolpath ecosystem. It is the companion -app to **Pathbase** — the GitHub-like service for agent traces — and is -intended for people who won't open a terminal to run the `path` CLI. - -## What it does - -1. **Discover** — enumerate the user's local agent traces: - - Claude Code sessions under `~/.claude/projects/` - - Local git branches - - GitHub pull requests (by URL) -2. **Preview** — render the derived Toolpath `Document` as an interactive DAG - so the user can see what's in the trace before sharing it. -3. **Export** — save the document as a local `.path.json` file, **or** upload - it to Pathbase. The Pathbase upload is stubbed in v0.1 and logs a mock - response; the real API will be wired up in a follow-up. -4. **Quick View (menu bar)** — a tray icon that sits alongside the regular - Dock-icon app. A background thread polls every 30s across all five agent - providers (`toolpath-claude`, `-gemini`, `-codex`, `-opencode`, `-pi`) - and updates the tray title with an activity count. Left-click opens a - small popover listing recent sessions; the menu has an "Open Toolpath" - item that brings up the main window, and clicking a recent session in - the popover opens its trace directly in the preview. See `src/tray.rs` - and `frontend/src/routes/Popover.svelte`. - -## Architecture - -- **Rust backend** (`src/`) — Tauri commands that link `toolpath`, - `toolpath-claude`, `toolpath-git`, and `toolpath-github` directly - in-process. No subprocess, no Wasm. -- **Frontend** (`frontend/`) — Svelte 5 + TypeScript + Vite, built - with `bun`. Elm-architecture (TEA) shape: `src/lib/types.ts`, - `update.ts`, and `store.svelte.ts` hold `Model`/`Msg`/`Cmd` and - the reducer; `src/routes/*.svelte` are pure views over the - reactive store. Event subscriptions use Svelte `$effect` for - auto-cleanup. DAG rendering via `src/lib/viz.ts` (dagre-d3-es). - -## Run in development - -```bash -cargo install tauri-cli --locked --version "^2" # once -cd crates/toolpath-desktop -cd frontend && bun install && cd .. # once -cargo tauri dev -``` - -`cargo tauri dev` auto-starts the Vite dev server on -`http://localhost:1420` (via `beforeDevCommand`) and wires Tauri's -webview to it, so frontend edits hot-reload without restarting Rust. - -## Build a bundle - -```bash -cd crates/toolpath-desktop -cargo tauri build # runs `bun run build` first, then bundles -``` - -Artifacts land under `target/release/bundle/`. - -## Scope - -In scope for v0.1: source discovery, trace preview, local export, stubbed -Pathbase upload. - -Out of scope: real Pathbase API integration, live/track mode, query UI, -editing documents, multi-doc Graph merging, identity signing. diff --git a/crates/toolpath-desktop/build.rs b/crates/toolpath-desktop/build.rs deleted file mode 100644 index d860e1e..0000000 --- a/crates/toolpath-desktop/build.rs +++ /dev/null @@ -1,3 +0,0 @@ -fn main() { - tauri_build::build() -} diff --git a/crates/toolpath-desktop/bun.lock b/crates/toolpath-desktop/bun.lock deleted file mode 100644 index 5c5ee3a..0000000 --- a/crates/toolpath-desktop/bun.lock +++ /dev/null @@ -1,104 +0,0 @@ -{ - "lockfileVersion": 1, - "configVersion": 1, - "workspaces": { - "": { - "dependencies": { - "vite": "^8.0.9", - }, - }, - }, - "packages": { - "@emnapi/core": ["@emnapi/core@1.9.2", "", { "dependencies": { "@emnapi/wasi-threads": "1.2.1", "tslib": "^2.4.0" } }, "sha512-UC+ZhH3XtczQYfOlu3lNEkdW/p4dsJ1r/bP7H8+rhao3TTTMO1ATq/4DdIi23XuGoFY+Cz0JmCbdVl0hz9jZcA=="], - - "@emnapi/runtime": ["@emnapi/runtime@1.9.2", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-3U4+MIWHImeyu1wnmVygh5WlgfYDtyf0k8AbLhMFxOipihf6nrWC4syIm/SwEeec0mNSafiiNnMJwbza/Is6Lw=="], - - "@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.2.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w=="], - - "@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@1.1.4", "", { "dependencies": { "@tybys/wasm-util": "^0.10.1" }, "peerDependencies": { "@emnapi/core": "^1.7.1", "@emnapi/runtime": "^1.7.1" } }, "sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow=="], - - "@oxc-project/types": ["@oxc-project/types@0.126.0", "", {}, "sha512-oGfVtjAgwQVVpfBrbtk4e1XDyWHRFta6BS3GWVzrF8xYBT2VGQAk39yJS/wFSMrZqoiCU4oghT3Ch0HaHGIHcQ=="], - - "@rolldown/binding-android-arm64": ["@rolldown/binding-android-arm64@1.0.0-rc.16", "", { "os": "android", "cpu": "arm64" }, "sha512-rhY3k7Bsae9qQfOtph2Pm2jZEA+s8Gmjoz4hhmx70K9iMQ/ddeae+xhRQcM5IuVx5ry1+bGfkvMn7D6MJggVSA=="], - - "@rolldown/binding-darwin-arm64": ["@rolldown/binding-darwin-arm64@1.0.0-rc.16", "", { "os": "darwin", "cpu": "arm64" }, "sha512-rNz0yK078yrNn3DrdgN+PKiMOW8HfQ92jQiXxwX8yW899ayV00MLVdaCNeVBhG/TbH3ouYVObo8/yrkiectkcQ=="], - - "@rolldown/binding-darwin-x64": ["@rolldown/binding-darwin-x64@1.0.0-rc.16", "", { "os": "darwin", "cpu": "x64" }, "sha512-r/OmdR00HmD4i79Z//xO06uEPOq5hRXdhw7nzkxQxwSavs3PSHa1ijntdpOiZ2mzOQ3fVVu8C1M19FoNM+dMUQ=="], - - "@rolldown/binding-freebsd-x64": ["@rolldown/binding-freebsd-x64@1.0.0-rc.16", "", { "os": "freebsd", "cpu": "x64" }, "sha512-KcRE5w8h0OnjUatG8pldyD14/CQ5Phs1oxfR+3pKDjboHRo9+MkqQaiIZlZRpsxC15paeXme/I127tUa9TXJ6g=="], - - "@rolldown/binding-linux-arm-gnueabihf": ["@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.16", "", { "os": "linux", "cpu": "arm" }, "sha512-bT0guA1bpxEJ/ZhTRniQf7rNF8ybvXOuWbNIeLABaV5NGjx4EtOWBTSRGWFU9ZWVkPOZ+HNFP8RMcBokBiZ0Kg=="], - - "@rolldown/binding-linux-arm64-gnu": ["@rolldown/binding-linux-arm64-gnu@1.0.0-rc.16", "", { "os": "linux", "cpu": "arm64" }, "sha512-+tHktCHWV8BDQSjemUqm/Jl/TPk3QObCTIjmdDy/nlupcujZghmKK2962LYrqFpWu+ai01AN/REOH3NEpqvYQg=="], - - "@rolldown/binding-linux-arm64-musl": ["@rolldown/binding-linux-arm64-musl@1.0.0-rc.16", "", { "os": "linux", "cpu": "arm64" }, "sha512-3fPzdREH806oRLxpTWW1Gt4tQHs0TitZFOECB2xzCFLPKnSOy90gwA7P29cksYilFO6XVRY1kzga0cL2nRjKPg=="], - - "@rolldown/binding-linux-ppc64-gnu": ["@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.16", "", { "os": "linux", "cpu": "ppc64" }, "sha512-EKwI1tSrLs7YVw+JPJT/G2dJQ1jl9qlTTTEG0V2Ok/RdOenRfBw2PQdLPyjhIu58ocdBfP7vIRN/pvMsPxs/AQ=="], - - "@rolldown/binding-linux-s390x-gnu": ["@rolldown/binding-linux-s390x-gnu@1.0.0-rc.16", "", { "os": "linux", "cpu": "s390x" }, "sha512-Uknladnb3Sxqu6SEcqBldQyJUpk8NleooZEc0MbRBJ4inEhRYWZX0NJu12vNf2mqAq7gsofAxHrGghiUYjhaLQ=="], - - "@rolldown/binding-linux-x64-gnu": ["@rolldown/binding-linux-x64-gnu@1.0.0-rc.16", "", { "os": "linux", "cpu": "x64" }, "sha512-FIb8+uG49sZBtLTn+zt1AJ20TqVcqWeSIyoVt0or7uAWesgKaHbiBh6OpA/k9v0LTt+PTrb1Lao133kP4uVxkg=="], - - "@rolldown/binding-linux-x64-musl": ["@rolldown/binding-linux-x64-musl@1.0.0-rc.16", "", { "os": "linux", "cpu": "x64" }, "sha512-RuERhF9/EgWxZEXYWCOaViUWHIboceK4/ivdtQ3R0T44NjLkIIlGIAVAuCddFxsZ7vnRHtNQUrt2vR2n2slB2w=="], - - "@rolldown/binding-openharmony-arm64": ["@rolldown/binding-openharmony-arm64@1.0.0-rc.16", "", { "os": "none", "cpu": "arm64" }, "sha512-mXcXnvd9GpazCxeUCCnZ2+YF7nut+ZOEbE4GtaiPtyY6AkhZWbK70y1KK3j+RDhjVq5+U8FySkKRb/+w0EeUwA=="], - - "@rolldown/binding-wasm32-wasi": ["@rolldown/binding-wasm32-wasi@1.0.0-rc.16", "", { "dependencies": { "@emnapi/core": "1.9.2", "@emnapi/runtime": "1.9.2", "@napi-rs/wasm-runtime": "^1.1.4" }, "cpu": "none" }, "sha512-3Q2KQxnC8IJOLqXmUMoYwyIPZU9hzRbnHaoV3Euz+VVnjZKcY8ktnNP8T9R4/GGQtb27C/UYKABxesKWb8lsvQ=="], - - "@rolldown/binding-win32-arm64-msvc": ["@rolldown/binding-win32-arm64-msvc@1.0.0-rc.16", "", { "os": "win32", "cpu": "arm64" }, "sha512-tj7XRemQcOcFwv7qhpUxMTBbI5mWMlE4c1Omhg5+h8GuLXzyj8HviYgR+bB2DMDgRqUE+jiDleqSCRjx4aYk/Q=="], - - "@rolldown/binding-win32-x64-msvc": ["@rolldown/binding-win32-x64-msvc@1.0.0-rc.16", "", { "os": "win32", "cpu": "x64" }, "sha512-PH5DRZT+F4f2PTXRXR8uJxnBq2po/xFtddyabTJVJs/ZYVHqXPEgNIr35IHTEa6bpa0Q8Awg+ymkTaGnKITw4g=="], - - "@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.0-rc.16", "", {}, "sha512-45+YtqxLYKDWQouLKCrpIZhke+nXxhsw+qAHVzHDVwttyBlHNBVs2K25rDXrZzhpTp9w1FlAlvweV1H++fdZoA=="], - - "@tybys/wasm-util": ["@tybys/wasm-util@0.10.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg=="], - - "detect-libc": ["detect-libc@2.1.2", "", {}, "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ=="], - - "fdir": ["fdir@6.5.0", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg=="], - - "fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], - - "lightningcss": ["lightningcss@1.32.0", "", { "dependencies": { "detect-libc": "^2.0.3" }, "optionalDependencies": { "lightningcss-android-arm64": "1.32.0", "lightningcss-darwin-arm64": "1.32.0", "lightningcss-darwin-x64": "1.32.0", "lightningcss-freebsd-x64": "1.32.0", "lightningcss-linux-arm-gnueabihf": "1.32.0", "lightningcss-linux-arm64-gnu": "1.32.0", "lightningcss-linux-arm64-musl": "1.32.0", "lightningcss-linux-x64-gnu": "1.32.0", "lightningcss-linux-x64-musl": "1.32.0", "lightningcss-win32-arm64-msvc": "1.32.0", "lightningcss-win32-x64-msvc": "1.32.0" } }, "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ=="], - - "lightningcss-android-arm64": ["lightningcss-android-arm64@1.32.0", "", { "os": "android", "cpu": "arm64" }, "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg=="], - - "lightningcss-darwin-arm64": ["lightningcss-darwin-arm64@1.32.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ=="], - - "lightningcss-darwin-x64": ["lightningcss-darwin-x64@1.32.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w=="], - - "lightningcss-freebsd-x64": ["lightningcss-freebsd-x64@1.32.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig=="], - - "lightningcss-linux-arm-gnueabihf": ["lightningcss-linux-arm-gnueabihf@1.32.0", "", { "os": "linux", "cpu": "arm" }, "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw=="], - - "lightningcss-linux-arm64-gnu": ["lightningcss-linux-arm64-gnu@1.32.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ=="], - - "lightningcss-linux-arm64-musl": ["lightningcss-linux-arm64-musl@1.32.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg=="], - - "lightningcss-linux-x64-gnu": ["lightningcss-linux-x64-gnu@1.32.0", "", { "os": "linux", "cpu": "x64" }, "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA=="], - - "lightningcss-linux-x64-musl": ["lightningcss-linux-x64-musl@1.32.0", "", { "os": "linux", "cpu": "x64" }, "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg=="], - - "lightningcss-win32-arm64-msvc": ["lightningcss-win32-arm64-msvc@1.32.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw=="], - - "lightningcss-win32-x64-msvc": ["lightningcss-win32-x64-msvc@1.32.0", "", { "os": "win32", "cpu": "x64" }, "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q=="], - - "nanoid": ["nanoid@3.3.11", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="], - - "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="], - - "picomatch": ["picomatch@4.0.4", "", {}, "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A=="], - - "postcss": ["postcss@8.5.10", "", { "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-pMMHxBOZKFU6HgAZ4eyGnwXF/EvPGGqUr0MnZ5+99485wwW41kW91A4LOGxSHhgugZmSChL5AlElNdwlNgcnLQ=="], - - "rolldown": ["rolldown@1.0.0-rc.16", "", { "dependencies": { "@oxc-project/types": "=0.126.0", "@rolldown/pluginutils": "1.0.0-rc.16" }, "optionalDependencies": { "@rolldown/binding-android-arm64": "1.0.0-rc.16", "@rolldown/binding-darwin-arm64": "1.0.0-rc.16", "@rolldown/binding-darwin-x64": "1.0.0-rc.16", "@rolldown/binding-freebsd-x64": "1.0.0-rc.16", "@rolldown/binding-linux-arm-gnueabihf": "1.0.0-rc.16", "@rolldown/binding-linux-arm64-gnu": "1.0.0-rc.16", "@rolldown/binding-linux-arm64-musl": "1.0.0-rc.16", "@rolldown/binding-linux-ppc64-gnu": "1.0.0-rc.16", "@rolldown/binding-linux-s390x-gnu": "1.0.0-rc.16", "@rolldown/binding-linux-x64-gnu": "1.0.0-rc.16", "@rolldown/binding-linux-x64-musl": "1.0.0-rc.16", "@rolldown/binding-openharmony-arm64": "1.0.0-rc.16", "@rolldown/binding-wasm32-wasi": "1.0.0-rc.16", "@rolldown/binding-win32-arm64-msvc": "1.0.0-rc.16", "@rolldown/binding-win32-x64-msvc": "1.0.0-rc.16" }, "bin": { "rolldown": "bin/cli.mjs" } }, "sha512-rzi5WqKzEZw3SooTt7cgm4eqIoujPIyGcJNGFL7iPEuajQw7vxMHUkXylu4/vhCkJGXsgRmxqMKXUpT6FEgl0g=="], - - "source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="], - - "tinyglobby": ["tinyglobby@0.2.16", "", { "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.4" } }, "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg=="], - - "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], - - "vite": ["vite@8.0.9", "", { "dependencies": { "lightningcss": "^1.32.0", "picomatch": "^4.0.4", "postcss": "^8.5.10", "rolldown": "1.0.0-rc.16", "tinyglobby": "^0.2.16" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", "@vitejs/devtools": "^0.1.0", "esbuild": "^0.27.0 || ^0.28.0", "jiti": ">=1.21.0", "less": "^4.0.0", "sass": "^1.70.0", "sass-embedded": "^1.70.0", "stylus": ">=0.54.8", "sugarss": "^5.0.0", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "@vitejs/devtools", "esbuild", "jiti", "less", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-t7g7GVRpMXjNpa67HaVWI/8BWtdVIQPCL2WoozXXA7LBGEFK4AkkKkHx2hAQf5x1GZSlcmEDPkVLSGahxnEEZw=="], - } -} diff --git a/crates/toolpath-desktop/capabilities/default.json b/crates/toolpath-desktop/capabilities/default.json deleted file mode 100644 index 081edb6..0000000 --- a/crates/toolpath-desktop/capabilities/default.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "$schema": "../gen/schemas/desktop-schema.json", - "identifier": "default", - "description": "Capabilities required by the Toolpath desktop app.", - "windows": ["main", "popover"], - "permissions": [ - "core:default", - "dialog:default", - "opener:default", - "positioner:default", - "core:window:allow-show", - "core:window:allow-hide", - "core:window:allow-set-focus", - "core:window:allow-close", - "core:window:allow-is-visible", - "core:window:allow-start-dragging" - ] -} diff --git a/crates/toolpath-desktop/frontend/.gitignore b/crates/toolpath-desktop/frontend/.gitignore deleted file mode 100644 index 4c8daff..0000000 --- a/crates/toolpath-desktop/frontend/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -node_modules/ -dist/ -.vite/ -*.tsbuildinfo diff --git a/crates/toolpath-desktop/frontend/BENCHMARKS.md b/crates/toolpath-desktop/frontend/BENCHMARKS.md deleted file mode 100644 index 5cb00c2..0000000 --- a/crates/toolpath-desktop/frontend/BENCHMARKS.md +++ /dev/null @@ -1,151 +0,0 @@ -# toolpath-desktop Preview benchmarks - -Tracks the Preview's performance on synthetic `Path` fixtures at 1k / 5k / 10k -steps. Filed against [issue #41](https://github.com/empathic/toolpath/issues/41). -Rerun after [#38](https://github.com/empathic/toolpath/issues/38) (markdown -memoization) and [#39](https://github.com/empathic/toolpath/issues/39) -(buildTree dep narrowing) land to quantify the win. - -## What's measured - -Two layers, split by whether an agent can run them unattended: - -| Layer | Hot path | Where it runs | Automatable? | -|-------|----------|----------------|--------------| -| Pure TS | `normalize` / `buildTree` / `flattenChatHead` / `classify` / `matchesFilter` | Node-compatible, runs in `bun` | Yes — `bun run bench` | -| Tauri webview | `renderMarkdown` per turn, `diff.raw.split("\n")` per tool turn, whole-graph re-layout, DOM update | `cargo tauri dev` + real webview | No — manual Chrome DevTools | - -Pure-TS numbers are reproducible on any host. Render / memory numbers need a -human at a running Tauri binary because the cost is dominated by the -webview's layout/paint, which `bun` doesn't simulate. - -## Generating fixtures - -Fixtures are not committed (~5 MB at 10k steps, trivially regenerated). From -the repo root: - -```bash -cargo run -p toolpath-cli --bin gen_synthetic_path -- --steps 1000 --out bench/fixtures/synthetic-1k.path.json -cargo run -p toolpath-cli --bin gen_synthetic_path -- --steps 5000 --out bench/fixtures/synthetic-5k.path.json -cargo run -p toolpath-cli --bin gen_synthetic_path -- --steps 10000 --out bench/fixtures/synthetic-10k.path.json -``` - -Mix is ~70% conversation turns (alternating user/assistant), ~20% Edit/Write -tool invocations, ~10% MultiEdit — chosen to approximate a derived Claude -session. Seed is deterministic (default 42). - -## Running the pure-TS bench - -From `crates/toolpath-desktop/frontend`: - -```bash -bun install -bun run bench -# or a single fixture: -bun run src/lib/__bench__/preview.bench.ts --fixture ../../../bench/fixtures/synthetic-10k.path.json -``` - -Prints `median / p95 / max / mean` over 10 iterations per (size × op) cell. - -## Running the manual Tauri bench - -1. Generate the 10k fixture (steps above). -2. `cd crates/toolpath-desktop && cargo tauri dev`. -3. When the app opens, use **New upload → Local git → Pick** (or whatever - route gets you into Preview) on any real session; then in the dev - console, paste the fixture as a `PreviewSlice`: - ```js - // In DevTools console, with the app on the Preview route: - const raw = await fetch("file:///ABSOLUTE/PATH/TO/bench/fixtures/synthetic-10k.path.json").then(r => r.text()); - // Then dispatch a DeriveSucceeded msg via the store. Exact wiring TBD - // — the cleanest path is a hidden "load from file" debug Msg; for now - // just derive from a real large session and use that. - ``` - In practice the easier route is to derive from a real long Claude session - (e.g. `~/.claude/projects/` with 1000+ turns) and measure that - directly. Synthetic fixtures catch regressions in normalize / buildTree; - they don't exercise `renderMarkdown` the way real prose does. -4. Open **Chrome DevTools → Performance** (Tauri exposes Chromium devtools; - right-click → Inspect). -5. Click **Record**, interact (open Preview, type in the tree search, toggle - view mode between `chat` and `graph`), stop. -6. Read **Scripting**, **Rendering**, **Painting**, and **Total** columns - from the summary. -7. For memory: DevTools → **Memory → Take heap snapshot** before and after - opening the Preview. Subtract for the Document + parsed-DOM footprint. - -## Metrics table - -Fill in the columns as you run them. Leave `—` for "not measured yet"; -`N/A` for "not measurable in this environment". - -### Legend -- **TFP** — time to first paint of the Preview after `DeriveSucceeded` -- **Keystroke** — median render time after a keypress in the tree search box -- **Mem** — resident heap delta when Preview is open vs Home route - -### 2026-04-22 baseline (pre-#38, pre-#39) - -Host: Apple M4 Pro / Darwin 25.4 / bun 1.3.5 (Node v24 compat) / commit `eliot/issue-41-preview-benchmark` HEAD. - -Pure-TS ops, 10 iterations each: - -| Size | JSON.parse | normalize | buildTree (median) | buildTree (p95) | keystroke filter | flattenChatHead | classify × all | -|------|------------|-----------|---------------------|------------------|-------------------|------------------|-----------------| -| 1k | 1.16 ms | 0.23 ms | **3.98 ms** | 7.5 ms | 0.08 ms | 0.23 ms | 0.14 ms | -| 5k | 3.17 ms | 0.79 ms | **82.2 ms** | 113 ms | 0.43 ms | 1.20 ms | 0.47 ms | -| 10k | 6.32 ms | 2.15 ms | **579 ms** | 1830 ms | 1.12 ms | 5.34 ms | 1.49 ms | - -Tauri webview ops (measure manually, DevTools → Performance): - -| Size | TFP | Keystroke (DOM-updated) | Mem (Document + DOM) | -|------|-----|--------------------------|------------------------| -| 1k | — | — | — | -| 5k | — | — | — | -| 10k | — | — | — | - -### Notes on the 2026-04-22 baseline - -- `buildTree` at 10k is **way above** the 200 ms target from the issue - (median 579 ms, p95 1.8 s). Expected — the HEAD-ancestor walk inside - `normalize` and the DFS in `flattenTree` are both O(N) with per-node - allocations, and the variance suggests significant GC pressure. This is - the primary thing #39 should improve. -- `filter(matchesFilter)` itself is fine in pure TS (1 ms at 10k) — the - keystroke cost in the UI is dominated by `renderMarkdown` inside - `StepTree.svelte`'s re-render, not the filter. #38 should eliminate that. -- `flattenChatHead` is cheap (5.3 ms at 10k) because it only walks the HEAD - spine. -- `classify` is near-free; no need to memoize it unless #38 reveals it - inside a hot loop. -- Numbers are from `bun` running on Node-compatible mode, not a real - webview. Webview layout/paint and V8 JIT vs JavaScriptCore differ — treat - these as **lower bounds** for what the Preview actually experiences. - -### Post-#38 / post-#39 rerun - -Rerun `bun run bench` on this same branch layout after the fix PRs land and -fill the table below. Commit numbers alongside the reference to the merged -PR number. - -| Size | buildTree (median) | keystroke (DOM) | TFP (Tauri) | -|------|---------------------|------------------|--------------| -| 1k | — | — | — | -| 5k | — | — | — | -| 10k | — | — | — | - -## When to act - -The issue calls out **200 ms on a keystroke** as the threshold. A few rules -of thumb for reading the table: - -- Pure-TS `buildTree` > 100 ms at any size → probably visible as a freeze; - deserves a targeted fix (memoization, incremental update, or dep - narrowing — #39). -- Keystroke (DOM-updated) > 200 ms → real user-visible lag; deserves a - targeted fix (virtualized list, markdown memo — #38). -- Memory delta > ~200 MB for a 10k-step Document → investigate the parsed - DOM; consider lazy-rendering off-screen cards. - -Don't file sub-issues for known wins from #38 / #39 — they're already -tracked. diff --git a/crates/toolpath-desktop/frontend/bun.lock b/crates/toolpath-desktop/frontend/bun.lock deleted file mode 100644 index 17ba4e2..0000000 --- a/crates/toolpath-desktop/frontend/bun.lock +++ /dev/null @@ -1,285 +0,0 @@ -{ - "lockfileVersion": 1, - "configVersion": 1, - "workspaces": { - "": { - "name": "toolpath-desktop-frontend", - "dependencies": { - "@tauri-apps/api": "^2", - "@tauri-apps/plugin-dialog": "^2.7.0", - "@tauri-apps/plugin-opener": "^2.5.3", - "dompurify": "^3.4.1", - "marked": "^18.0.2", - }, - "devDependencies": { - "@dagrejs/dagre": "^1.1.4", - "@sveltejs/vite-plugin-svelte": "^5", - "@tsconfig/svelte": "^5", - "svelte": "^5", - "svelte-check": "^4", - "typescript": "^5", - "vite": "^6", - "vitest": "^4.1.5", - }, - }, - }, - "packages": { - "@dagrejs/dagre": ["@dagrejs/dagre@1.1.8", "", { "dependencies": { "@dagrejs/graphlib": "2.2.4" } }, "sha512-5SEDlndt4W/LaVzPYJW+bSmSEZc9EzTf8rJ20WCKvjS5EAZAN0b+x0Yww7VMT4R3Wootkg+X9bUfUxazYw6Blw=="], - - "@dagrejs/graphlib": ["@dagrejs/graphlib@2.2.4", "", {}, "sha512-mepCf/e9+SKYy1d02/UkvSy6+6MoyXhVxP8lLDfA7BPE1X1d4dR0sZznmbM8/XVJ1GPM+Svnx7Xj6ZweByWUkw=="], - - "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.25.12", "", { "os": "aix", "cpu": "ppc64" }, "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA=="], - - "@esbuild/android-arm": ["@esbuild/android-arm@0.25.12", "", { "os": "android", "cpu": "arm" }, "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg=="], - - "@esbuild/android-arm64": ["@esbuild/android-arm64@0.25.12", "", { "os": "android", "cpu": "arm64" }, "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg=="], - - "@esbuild/android-x64": ["@esbuild/android-x64@0.25.12", "", { "os": "android", "cpu": "x64" }, "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg=="], - - "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.25.12", "", { "os": "darwin", "cpu": "arm64" }, "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg=="], - - "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.25.12", "", { "os": "darwin", "cpu": "x64" }, "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA=="], - - "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.25.12", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg=="], - - "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.25.12", "", { "os": "freebsd", "cpu": "x64" }, "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ=="], - - "@esbuild/linux-arm": ["@esbuild/linux-arm@0.25.12", "", { "os": "linux", "cpu": "arm" }, "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw=="], - - "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.25.12", "", { "os": "linux", "cpu": "arm64" }, "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ=="], - - "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.25.12", "", { "os": "linux", "cpu": "ia32" }, "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA=="], - - "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.25.12", "", { "os": "linux", "cpu": "none" }, "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng=="], - - "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.25.12", "", { "os": "linux", "cpu": "none" }, "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw=="], - - "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.25.12", "", { "os": "linux", "cpu": "ppc64" }, "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA=="], - - "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.25.12", "", { "os": "linux", "cpu": "none" }, "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w=="], - - "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.25.12", "", { "os": "linux", "cpu": "s390x" }, "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg=="], - - "@esbuild/linux-x64": ["@esbuild/linux-x64@0.25.12", "", { "os": "linux", "cpu": "x64" }, "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw=="], - - "@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.25.12", "", { "os": "none", "cpu": "arm64" }, "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg=="], - - "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.25.12", "", { "os": "none", "cpu": "x64" }, "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ=="], - - "@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.25.12", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A=="], - - "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.25.12", "", { "os": "openbsd", "cpu": "x64" }, "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw=="], - - "@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.25.12", "", { "os": "none", "cpu": "arm64" }, "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg=="], - - "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.25.12", "", { "os": "sunos", "cpu": "x64" }, "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w=="], - - "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.25.12", "", { "os": "win32", "cpu": "arm64" }, "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg=="], - - "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.25.12", "", { "os": "win32", "cpu": "ia32" }, "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ=="], - - "@esbuild/win32-x64": ["@esbuild/win32-x64@0.25.12", "", { "os": "win32", "cpu": "x64" }, "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA=="], - - "@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.13", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA=="], - - "@jridgewell/remapping": ["@jridgewell/remapping@2.3.5", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ=="], - - "@jridgewell/resolve-uri": ["@jridgewell/resolve-uri@3.1.2", "", {}, "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw=="], - - "@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.5", "", {}, "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og=="], - - "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.31", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw=="], - - "@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.60.1", "", { "os": "android", "cpu": "arm" }, "sha512-d6FinEBLdIiK+1uACUttJKfgZREXrF0Qc2SmLII7W2AD8FfiZ9Wjd+rD/iRuf5s5dWrr1GgwXCvPqOuDquOowA=="], - - "@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.60.1", "", { "os": "android", "cpu": "arm64" }, "sha512-YjG/EwIDvvYI1YvYbHvDz/BYHtkY4ygUIXHnTdLhG+hKIQFBiosfWiACWortsKPKU/+dUwQQCKQM3qrDe8c9BA=="], - - "@rollup/rollup-darwin-arm64": ["@rollup/rollup-darwin-arm64@4.60.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-mjCpF7GmkRtSJwon+Rq1N8+pI+8l7w5g9Z3vWj4T7abguC4Czwi3Yu/pFaLvA3TTeMVjnu3ctigusqWUfjZzvw=="], - - "@rollup/rollup-darwin-x64": ["@rollup/rollup-darwin-x64@4.60.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-haZ7hJ1JT4e9hqkoT9R/19XW2QKqjfJVv+i5AGg57S+nLk9lQnJ1F/eZloRO3o9Scy9CM3wQ9l+dkXtcBgN5Ew=="], - - "@rollup/rollup-freebsd-arm64": ["@rollup/rollup-freebsd-arm64@4.60.1", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-czw90wpQq3ZsAVBlinZjAYTKduOjTywlG7fEeWKUA7oCmpA8xdTkxZZlwNJKWqILlq0wehoZcJYfBvOyhPTQ6w=="], - - "@rollup/rollup-freebsd-x64": ["@rollup/rollup-freebsd-x64@4.60.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-KVB2rqsxTHuBtfOeySEyzEOB7ltlB/ux38iu2rBQzkjbwRVlkhAGIEDiiYnO2kFOkJp+Z7pUXKyrRRFuFUKt+g=="], - - "@rollup/rollup-linux-arm-gnueabihf": ["@rollup/rollup-linux-arm-gnueabihf@4.60.1", "", { "os": "linux", "cpu": "arm" }, "sha512-L+34Qqil+v5uC0zEubW7uByo78WOCIrBvci69E7sFASRl0X7b/MB6Cqd1lky/CtcSVTydWa2WZwFuWexjS5o6g=="], - - "@rollup/rollup-linux-arm-musleabihf": ["@rollup/rollup-linux-arm-musleabihf@4.60.1", "", { "os": "linux", "cpu": "arm" }, "sha512-n83O8rt4v34hgFzlkb1ycniJh7IR5RCIqt6mz1VRJD6pmhRi0CXdmfnLu9dIUS6buzh60IvACM842Ffb3xd6Gg=="], - - "@rollup/rollup-linux-arm64-gnu": ["@rollup/rollup-linux-arm64-gnu@4.60.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-Nql7sTeAzhTAja3QXeAI48+/+GjBJ+QmAH13snn0AJSNL50JsDqotyudHyMbO2RbJkskbMbFJfIJKWA6R1LCJQ=="], - - "@rollup/rollup-linux-arm64-musl": ["@rollup/rollup-linux-arm64-musl@4.60.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-+pUymDhd0ys9GcKZPPWlFiZ67sTWV5UU6zOJat02M1+PiuSGDziyRuI/pPue3hoUwm2uGfxdL+trT6Z9rxnlMA=="], - - "@rollup/rollup-linux-loong64-gnu": ["@rollup/rollup-linux-loong64-gnu@4.60.1", "", { "os": "linux", "cpu": "none" }, "sha512-VSvgvQeIcsEvY4bKDHEDWcpW4Yw7BtlKG1GUT4FzBUlEKQK0rWHYBqQt6Fm2taXS+1bXvJT6kICu5ZwqKCnvlQ=="], - - "@rollup/rollup-linux-loong64-musl": ["@rollup/rollup-linux-loong64-musl@4.60.1", "", { "os": "linux", "cpu": "none" }, "sha512-4LqhUomJqwe641gsPp6xLfhqWMbQV04KtPp7/dIp0nzPxAkNY1AbwL5W0MQpcalLYk07vaW9Kp1PBhdpZYYcEw=="], - - "@rollup/rollup-linux-ppc64-gnu": ["@rollup/rollup-linux-ppc64-gnu@4.60.1", "", { "os": "linux", "cpu": "ppc64" }, "sha512-tLQQ9aPvkBxOc/EUT6j3pyeMD6Hb8QF2BTBnCQWP/uu1lhc9AIrIjKnLYMEroIz/JvtGYgI9dF3AxHZNaEH0rw=="], - - "@rollup/rollup-linux-ppc64-musl": ["@rollup/rollup-linux-ppc64-musl@4.60.1", "", { "os": "linux", "cpu": "ppc64" }, "sha512-RMxFhJwc9fSXP6PqmAz4cbv3kAyvD1etJFjTx4ONqFP9DkTkXsAMU4v3Vyc5BgzC+anz7nS/9tp4obsKfqkDHg=="], - - "@rollup/rollup-linux-riscv64-gnu": ["@rollup/rollup-linux-riscv64-gnu@4.60.1", "", { "os": "linux", "cpu": "none" }, "sha512-QKgFl+Yc1eEk6MmOBfRHYF6lTxiiiV3/z/BRrbSiW2I7AFTXoBFvdMEyglohPj//2mZS4hDOqeB0H1ACh3sBbg=="], - - "@rollup/rollup-linux-riscv64-musl": ["@rollup/rollup-linux-riscv64-musl@4.60.1", "", { "os": "linux", "cpu": "none" }, "sha512-RAjXjP/8c6ZtzatZcA1RaQr6O1TRhzC+adn8YZDnChliZHviqIjmvFwHcxi4JKPSDAt6Uhf/7vqcBzQJy0PDJg=="], - - "@rollup/rollup-linux-s390x-gnu": ["@rollup/rollup-linux-s390x-gnu@4.60.1", "", { "os": "linux", "cpu": "s390x" }, "sha512-wcuocpaOlaL1COBYiA89O6yfjlp3RwKDeTIA0hM7OpmhR1Bjo9j31G1uQVpDlTvwxGn2nQs65fBFL5UFd76FcQ=="], - - "@rollup/rollup-linux-x64-gnu": ["@rollup/rollup-linux-x64-gnu@4.60.1", "", { "os": "linux", "cpu": "x64" }, "sha512-77PpsFQUCOiZR9+LQEFg9GClyfkNXj1MP6wRnzYs0EeWbPcHs02AXu4xuUbM1zhwn3wqaizle3AEYg5aeoohhg=="], - - "@rollup/rollup-linux-x64-musl": ["@rollup/rollup-linux-x64-musl@4.60.1", "", { "os": "linux", "cpu": "x64" }, "sha512-5cIATbk5vynAjqqmyBjlciMJl1+R/CwX9oLk/EyiFXDWd95KpHdrOJT//rnUl4cUcskrd0jCCw3wpZnhIHdD9w=="], - - "@rollup/rollup-openbsd-x64": ["@rollup/rollup-openbsd-x64@4.60.1", "", { "os": "openbsd", "cpu": "x64" }, "sha512-cl0w09WsCi17mcmWqqglez9Gk8isgeWvoUZ3WiJFYSR3zjBQc2J5/ihSjpl+VLjPqjQ/1hJRcqBfLjssREQILw=="], - - "@rollup/rollup-openharmony-arm64": ["@rollup/rollup-openharmony-arm64@4.60.1", "", { "os": "none", "cpu": "arm64" }, "sha512-4Cv23ZrONRbNtbZa37mLSueXUCtN7MXccChtKpUnQNgF010rjrjfHx3QxkS2PI7LqGT5xXyYs1a7LbzAwT0iCA=="], - - "@rollup/rollup-win32-arm64-msvc": ["@rollup/rollup-win32-arm64-msvc@4.60.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-i1okWYkA4FJICtr7KpYzFpRTHgy5jdDbZiWfvny21iIKky5YExiDXP+zbXzm3dUcFpkEeYNHgQ5fuG236JPq0g=="], - - "@rollup/rollup-win32-ia32-msvc": ["@rollup/rollup-win32-ia32-msvc@4.60.1", "", { "os": "win32", "cpu": "ia32" }, "sha512-u09m3CuwLzShA0EYKMNiFgcjjzwqtUMLmuCJLeZWjjOYA3IT2Di09KaxGBTP9xVztWyIWjVdsB2E9goMjZvTQg=="], - - "@rollup/rollup-win32-x64-gnu": ["@rollup/rollup-win32-x64-gnu@4.60.1", "", { "os": "win32", "cpu": "x64" }, "sha512-k+600V9Zl1CM7eZxJgMyTUzmrmhB/0XZnF4pRypKAlAgxmedUA+1v9R+XOFv56W4SlHEzfeMtzujLJD22Uz5zg=="], - - "@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.60.1", "", { "os": "win32", "cpu": "x64" }, "sha512-lWMnixq/QzxyhTV6NjQJ4SFo1J6PvOX8vUx5Wb4bBPsEb+8xZ89Bz6kOXpfXj9ak9AHTQVQzlgzBEc1SyM27xQ=="], - - "@standard-schema/spec": ["@standard-schema/spec@1.1.0", "", {}, "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w=="], - - "@sveltejs/acorn-typescript": ["@sveltejs/acorn-typescript@1.0.9", "", { "peerDependencies": { "acorn": "^8.9.0" } }, "sha512-lVJX6qEgs/4DOcRTpo56tmKzVPtoWAaVbL4hfO7t7NVwl9AAXzQR6cihesW1BmNMPl+bK6dreu2sOKBP2Q9CIA=="], - - "@sveltejs/vite-plugin-svelte": ["@sveltejs/vite-plugin-svelte@5.1.1", "", { "dependencies": { "@sveltejs/vite-plugin-svelte-inspector": "^4.0.1", "debug": "^4.4.1", "deepmerge": "^4.3.1", "kleur": "^4.1.5", "magic-string": "^0.30.17", "vitefu": "^1.0.6" }, "peerDependencies": { "svelte": "^5.0.0", "vite": "^6.0.0" } }, "sha512-Y1Cs7hhTc+a5E9Va/xwKlAJoariQyHY+5zBgCZg4PFWNYQ1nMN9sjK1zhw1gK69DuqVP++sht/1GZg1aRwmAXQ=="], - - "@sveltejs/vite-plugin-svelte-inspector": ["@sveltejs/vite-plugin-svelte-inspector@4.0.1", "", { "dependencies": { "debug": "^4.3.7" }, "peerDependencies": { "@sveltejs/vite-plugin-svelte": "^5.0.0", "svelte": "^5.0.0", "vite": "^6.0.0" } }, "sha512-J/Nmb2Q2y7mck2hyCX4ckVHcR5tu2J+MtBEQqpDrrgELZ2uvraQcK/ioCV61AqkdXFgriksOKIceDcQmqnGhVw=="], - - "@tauri-apps/api": ["@tauri-apps/api@2.10.1", "", {}, "sha512-hKL/jWf293UDSUN09rR69hrToyIXBb8CjGaWC7gfinvnQrBVvnLr08FeFi38gxtugAVyVcTa5/FD/Xnkb1siBw=="], - - "@tauri-apps/plugin-dialog": ["@tauri-apps/plugin-dialog@2.7.0", "", { "dependencies": { "@tauri-apps/api": "^2.10.1" } }, "sha512-4nS/hfGMGCXiAS3LtVjH9AgsSAPJeG/7R+q8agTFqytjnMa4Zq95Bq8WzVDkckpanX+yyRHXnRtrKXkANKDHvw=="], - - "@tauri-apps/plugin-opener": ["@tauri-apps/plugin-opener@2.5.3", "", { "dependencies": { "@tauri-apps/api": "^2.8.0" } }, "sha512-CCcUltXMOfUEArbf3db3kCE7Ggy1ExBEBl51Ko2ODJ6GDYHRp1nSNlQm5uNCFY5k7/ufaK5Ib3Du/Zir19IYQQ=="], - - "@tsconfig/svelte": ["@tsconfig/svelte@5.0.8", "", {}, "sha512-UkNnw1/oFEfecR8ypyHIQuWYdkPvHiwcQ78sh+ymIiYoF+uc5H1UBetbjyqT+vgGJ3qQN6nhucJviX6HesWtKQ=="], - - "@types/chai": ["@types/chai@5.2.3", "", { "dependencies": { "@types/deep-eql": "*", "assertion-error": "^2.0.1" } }, "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA=="], - - "@types/deep-eql": ["@types/deep-eql@4.0.2", "", {}, "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw=="], - - "@types/estree": ["@types/estree@1.0.8", "", {}, "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w=="], - - "@types/trusted-types": ["@types/trusted-types@2.0.7", "", {}, "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw=="], - - "@vitest/expect": ["@vitest/expect@4.1.5", "", { "dependencies": { "@standard-schema/spec": "^1.1.0", "@types/chai": "^5.2.2", "@vitest/spy": "4.1.5", "@vitest/utils": "4.1.5", "chai": "^6.2.2", "tinyrainbow": "^3.1.0" } }, "sha512-PWBaRY5JoKuRnHlUHfpV/KohFylaDZTupcXN1H9vYryNLOnitSw60Mw9IAE2r67NbwwzBw/Cc/8q9BK3kIX8Kw=="], - - "@vitest/mocker": ["@vitest/mocker@4.1.5", "", { "dependencies": { "@vitest/spy": "4.1.5", "estree-walker": "^3.0.3", "magic-string": "^0.30.21" }, "peerDependencies": { "msw": "^2.4.9", "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" }, "optionalPeers": ["msw", "vite"] }, "sha512-/x2EmFC4mT4NNzqvC3fmesuV97w5FC903KPmey4gsnJiMQ3Be1IlDKVaDaG8iqaLFHqJ2FVEkxZk5VmeLjIItw=="], - - "@vitest/pretty-format": ["@vitest/pretty-format@4.1.5", "", { "dependencies": { "tinyrainbow": "^3.1.0" } }, "sha512-7I3q6l5qr03dVfMX2wCo9FxwSJbPdwKjy2uu/YPpU3wfHvIL4QHwVRp57OfGrDFeUJ8/8QdfBKIV12FTtLn00g=="], - - "@vitest/runner": ["@vitest/runner@4.1.5", "", { "dependencies": { "@vitest/utils": "4.1.5", "pathe": "^2.0.3" } }, "sha512-2D+o7Pr82IEO46YPpoA/YU0neeyr6FTerQb5Ro7BUnBuv6NQtT/kmVnczngiMEBhzgqz2UZYl5gArejsyERDSQ=="], - - "@vitest/snapshot": ["@vitest/snapshot@4.1.5", "", { "dependencies": { "@vitest/pretty-format": "4.1.5", "@vitest/utils": "4.1.5", "magic-string": "^0.30.21", "pathe": "^2.0.3" } }, "sha512-zypXEt4KH/XgKGPUz4eC2AvErYx0My5hfL8oDb1HzGFpEk1P62bxSohdyOmvz+d9UJwanI68MKwr2EquOaOgMQ=="], - - "@vitest/spy": ["@vitest/spy@4.1.5", "", {}, "sha512-2lNOsh6+R2Idnf1TCZqSwYlKN2E/iDlD8sgU59kYVl+OMDmvldO1VDk39smRfpUNwYpNRVn3w4YfuC7KfbBnkQ=="], - - "@vitest/utils": ["@vitest/utils@4.1.5", "", { "dependencies": { "@vitest/pretty-format": "4.1.5", "convert-source-map": "^2.0.0", "tinyrainbow": "^3.1.0" } }, "sha512-76wdkrmfXfqGjueGgnb45ITPyUi1ycZ4IHgC2bhPDUfWHklY/q3MdLOAB+TF1e6xfl8NxNY0ZYaPCFNWSsw3Ug=="], - - "acorn": ["acorn@8.16.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw=="], - - "aria-query": ["aria-query@5.3.1", "", {}, "sha512-Z/ZeOgVl7bcSYZ/u/rh0fOpvEpq//LZmdbkXyc7syVzjPAhfOa9ebsdTSjEBDU4vs5nC98Kfduj1uFo0qyET3g=="], - - "assertion-error": ["assertion-error@2.0.1", "", {}, "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA=="], - - "axobject-query": ["axobject-query@4.1.0", "", {}, "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ=="], - - "chai": ["chai@6.2.2", "", {}, "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg=="], - - "chokidar": ["chokidar@4.0.3", "", { "dependencies": { "readdirp": "^4.0.1" } }, "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA=="], - - "clsx": ["clsx@2.1.1", "", {}, "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA=="], - - "convert-source-map": ["convert-source-map@2.0.0", "", {}, "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="], - - "debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="], - - "deepmerge": ["deepmerge@4.3.1", "", {}, "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A=="], - - "devalue": ["devalue@5.7.1", "", {}, "sha512-MUbZ586EgQqdRnC4yDrlod3BEdyvE4TapGYHMW2CiaW+KkkFmWEFqBUaLltEZCGi0iFXCEjRF0OjF0DV2QHjOA=="], - - "dompurify": ["dompurify@3.4.1", "", { "optionalDependencies": { "@types/trusted-types": "^2.0.7" } }, "sha512-JahakDAIg1gyOm7dlgWSDjV4n7Ip2PKR55NIT6jrMfIgLFgWo81vdr1/QGqWtFNRqXP9UV71oVePtjqS2ebnPw=="], - - "es-module-lexer": ["es-module-lexer@2.0.0", "", {}, "sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw=="], - - "esbuild": ["esbuild@0.25.12", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.25.12", "@esbuild/android-arm": "0.25.12", "@esbuild/android-arm64": "0.25.12", "@esbuild/android-x64": "0.25.12", "@esbuild/darwin-arm64": "0.25.12", "@esbuild/darwin-x64": "0.25.12", "@esbuild/freebsd-arm64": "0.25.12", "@esbuild/freebsd-x64": "0.25.12", "@esbuild/linux-arm": "0.25.12", "@esbuild/linux-arm64": "0.25.12", "@esbuild/linux-ia32": "0.25.12", "@esbuild/linux-loong64": "0.25.12", "@esbuild/linux-mips64el": "0.25.12", "@esbuild/linux-ppc64": "0.25.12", "@esbuild/linux-riscv64": "0.25.12", "@esbuild/linux-s390x": "0.25.12", "@esbuild/linux-x64": "0.25.12", "@esbuild/netbsd-arm64": "0.25.12", "@esbuild/netbsd-x64": "0.25.12", "@esbuild/openbsd-arm64": "0.25.12", "@esbuild/openbsd-x64": "0.25.12", "@esbuild/openharmony-arm64": "0.25.12", "@esbuild/sunos-x64": "0.25.12", "@esbuild/win32-arm64": "0.25.12", "@esbuild/win32-ia32": "0.25.12", "@esbuild/win32-x64": "0.25.12" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg=="], - - "esm-env": ["esm-env@1.2.2", "", {}, "sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA=="], - - "esrap": ["esrap@2.2.5", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.15" }, "peerDependencies": { "@typescript-eslint/types": "^8.2.0" }, "optionalPeers": ["@typescript-eslint/types"] }, "sha512-/yLB1538mag+dn0wsePTe8C0rDIjUOaJpMs2McodSzmM2msWcZsBSdRtg6HOBt0A/r82BN+Md3pgwSc/uWt2Ig=="], - - "estree-walker": ["estree-walker@3.0.3", "", { "dependencies": { "@types/estree": "^1.0.0" } }, "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g=="], - - "expect-type": ["expect-type@1.3.0", "", {}, "sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA=="], - - "fdir": ["fdir@6.5.0", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg=="], - - "fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], - - "is-reference": ["is-reference@3.0.3", "", { "dependencies": { "@types/estree": "^1.0.6" } }, "sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw=="], - - "kleur": ["kleur@4.1.5", "", {}, "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ=="], - - "locate-character": ["locate-character@3.0.0", "", {}, "sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA=="], - - "magic-string": ["magic-string@0.30.21", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ=="], - - "marked": ["marked@18.0.2", "", { "bin": { "marked": "bin/marked.js" } }, "sha512-NsmlUYBS/Zg57rgDWMYdnre6OTj4e+qq/JS2ot3KrYLSoHLw+sDu0Nm1ZGpRgYAq6c+b1ekaY5NzVchMCQnzcg=="], - - "mri": ["mri@1.2.0", "", {}, "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA=="], - - "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], - - "nanoid": ["nanoid@3.3.11", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="], - - "obug": ["obug@2.1.1", "", {}, "sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ=="], - - "pathe": ["pathe@2.0.3", "", {}, "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="], - - "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="], - - "picomatch": ["picomatch@4.0.4", "", {}, "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A=="], - - "postcss": ["postcss@8.5.10", "", { "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-pMMHxBOZKFU6HgAZ4eyGnwXF/EvPGGqUr0MnZ5+99485wwW41kW91A4LOGxSHhgugZmSChL5AlElNdwlNgcnLQ=="], - - "readdirp": ["readdirp@4.1.2", "", {}, "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg=="], - - "rollup": ["rollup@4.60.1", "", { "dependencies": { "@types/estree": "1.0.8" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.60.1", "@rollup/rollup-android-arm64": "4.60.1", "@rollup/rollup-darwin-arm64": "4.60.1", "@rollup/rollup-darwin-x64": "4.60.1", "@rollup/rollup-freebsd-arm64": "4.60.1", "@rollup/rollup-freebsd-x64": "4.60.1", "@rollup/rollup-linux-arm-gnueabihf": "4.60.1", "@rollup/rollup-linux-arm-musleabihf": "4.60.1", "@rollup/rollup-linux-arm64-gnu": "4.60.1", "@rollup/rollup-linux-arm64-musl": "4.60.1", "@rollup/rollup-linux-loong64-gnu": "4.60.1", "@rollup/rollup-linux-loong64-musl": "4.60.1", "@rollup/rollup-linux-ppc64-gnu": "4.60.1", "@rollup/rollup-linux-ppc64-musl": "4.60.1", "@rollup/rollup-linux-riscv64-gnu": "4.60.1", "@rollup/rollup-linux-riscv64-musl": "4.60.1", "@rollup/rollup-linux-s390x-gnu": "4.60.1", "@rollup/rollup-linux-x64-gnu": "4.60.1", "@rollup/rollup-linux-x64-musl": "4.60.1", "@rollup/rollup-openbsd-x64": "4.60.1", "@rollup/rollup-openharmony-arm64": "4.60.1", "@rollup/rollup-win32-arm64-msvc": "4.60.1", "@rollup/rollup-win32-ia32-msvc": "4.60.1", "@rollup/rollup-win32-x64-gnu": "4.60.1", "@rollup/rollup-win32-x64-msvc": "4.60.1", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-VmtB2rFU/GroZ4oL8+ZqXgSA38O6GR8KSIvWmEFv63pQ0G6KaBH9s07PO8XTXP4vI+3UJUEypOfjkGfmSBBR0w=="], - - "sade": ["sade@1.8.1", "", { "dependencies": { "mri": "^1.1.0" } }, "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A=="], - - "siginfo": ["siginfo@2.0.0", "", {}, "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g=="], - - "source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="], - - "stackback": ["stackback@0.0.2", "", {}, "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw=="], - - "std-env": ["std-env@4.1.0", "", {}, "sha512-Rq7ybcX2RuC55r9oaPVEW7/xu3tj8u4GeBYHBWCychFtzMIr86A7e3PPEBPT37sHStKX3+TiX/Fr/ACmJLVlLQ=="], - - "svelte": ["svelte@5.55.4", "", { "dependencies": { "@jridgewell/remapping": "^2.3.4", "@jridgewell/sourcemap-codec": "^1.5.0", "@sveltejs/acorn-typescript": "^1.0.5", "@types/estree": "^1.0.5", "@types/trusted-types": "^2.0.7", "acorn": "^8.12.1", "aria-query": "5.3.1", "axobject-query": "^4.1.0", "clsx": "^2.1.1", "devalue": "^5.6.4", "esm-env": "^1.2.1", "esrap": "^2.2.4", "is-reference": "^3.0.3", "locate-character": "^3.0.0", "magic-string": "^0.30.11", "zimmerframe": "^1.1.2" } }, "sha512-q8DFohk6vUswSng95IZb9nzWJnbINZsK7OiM1snAa3qCjJBL0ZQpvMyAaVXjUukdM75J/m8UE8xwqat8Ors/zQ=="], - - "svelte-check": ["svelte-check@4.4.6", "", { "dependencies": { "@jridgewell/trace-mapping": "^0.3.25", "chokidar": "^4.0.1", "fdir": "^6.2.0", "picocolors": "^1.0.0", "sade": "^1.7.4" }, "peerDependencies": { "svelte": "^4.0.0 || ^5.0.0-next.0", "typescript": ">=5.0.0" }, "bin": { "svelte-check": "bin/svelte-check" } }, "sha512-kP1zG81EWaFe9ZyTv4ZXv44Csi6Pkdpb7S3oj6m+K2ec/IcDg/a8LsFsnVLqm2nxtkSwsd5xPj/qFkTBgXHXjg=="], - - "tinybench": ["tinybench@2.9.0", "", {}, "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg=="], - - "tinyexec": ["tinyexec@1.1.1", "", {}, "sha512-VKS/ZaQhhkKFMANmAOhhXVoIfBXblQxGX1myCQ2faQrfmobMftXeJPcZGp0gS07ocvGJWDLZGyOZDadDBqYIJg=="], - - "tinyglobby": ["tinyglobby@0.2.16", "", { "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.4" } }, "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg=="], - - "tinyrainbow": ["tinyrainbow@3.1.0", "", {}, "sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw=="], - - "typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="], - - "vite": ["vite@6.4.2", "", { "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.4.4", "picomatch": "^4.0.2", "postcss": "^8.5.3", "rollup": "^4.34.9", "tinyglobby": "^0.2.13" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", "jiti": ">=1.21.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", "sass-embedded": "*", "stylus": "*", "sugarss": "*", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "jiti", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-2N/55r4JDJ4gdrCvGgINMy+HH3iRpNIz8K6SFwVsA+JbQScLiC+clmAxBgwiSPgcG9U15QmvqCGWzMbqda5zGQ=="], - - "vitefu": ["vitefu@1.1.3", "", { "peerDependencies": { "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" }, "optionalPeers": ["vite"] }, "sha512-ub4okH7Z5KLjb6hDyjqrGXqWtWvoYdU3IGm/NorpgHncKoLTCfRIbvlhBm7r0YstIaQRYlp4yEbFqDcKSzXSSg=="], - - "vitest": ["vitest@4.1.5", "", { "dependencies": { "@vitest/expect": "4.1.5", "@vitest/mocker": "4.1.5", "@vitest/pretty-format": "4.1.5", "@vitest/runner": "4.1.5", "@vitest/snapshot": "4.1.5", "@vitest/spy": "4.1.5", "@vitest/utils": "4.1.5", "es-module-lexer": "^2.0.0", "expect-type": "^1.3.0", "magic-string": "^0.30.21", "obug": "^2.1.1", "pathe": "^2.0.3", "picomatch": "^4.0.3", "std-env": "^4.0.0-rc.1", "tinybench": "^2.9.0", "tinyexec": "^1.0.2", "tinyglobby": "^0.2.15", "tinyrainbow": "^3.1.0", "vite": "^6.0.0 || ^7.0.0 || ^8.0.0", "why-is-node-running": "^2.3.0" }, "peerDependencies": { "@edge-runtime/vm": "*", "@opentelemetry/api": "^1.9.0", "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", "@vitest/browser-playwright": "4.1.5", "@vitest/browser-preview": "4.1.5", "@vitest/browser-webdriverio": "4.1.5", "@vitest/coverage-istanbul": "4.1.5", "@vitest/coverage-v8": "4.1.5", "@vitest/ui": "4.1.5", "happy-dom": "*", "jsdom": "*" }, "optionalPeers": ["@edge-runtime/vm", "@opentelemetry/api", "@types/node", "@vitest/browser-playwright", "@vitest/browser-preview", "@vitest/browser-webdriverio", "@vitest/coverage-istanbul", "@vitest/coverage-v8", "@vitest/ui", "happy-dom", "jsdom"], "bin": { "vitest": "vitest.mjs" } }, "sha512-9Xx1v3/ih3m9hN+SbfkUyy0JAs72ap3r7joc87XL6jwF0jGg6mFBvQ1SrwaX+h8BlkX6Hz9shdd1uo6AF+ZGpg=="], - - "why-is-node-running": ["why-is-node-running@2.3.0", "", { "dependencies": { "siginfo": "^2.0.0", "stackback": "0.0.2" }, "bin": { "why-is-node-running": "cli.js" } }, "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w=="], - - "zimmerframe": ["zimmerframe@1.1.4", "", {}, "sha512-B58NGBEoc8Y9MWWCQGl/gq9xBCe4IiKM0a2x7GZdQKOW5Exr8S1W24J6OgM1njK8xCRGvAJIL/MxXHf6SkmQKQ=="], - } -} diff --git a/crates/toolpath-desktop/frontend/index.html b/crates/toolpath-desktop/frontend/index.html deleted file mode 100644 index 97b3c51..0000000 --- a/crates/toolpath-desktop/frontend/index.html +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - Toolpath Desktop - - -
- - - diff --git a/crates/toolpath-desktop/frontend/package.json b/crates/toolpath-desktop/frontend/package.json deleted file mode 100644 index d64cc35..0000000 --- a/crates/toolpath-desktop/frontend/package.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "name": "toolpath-desktop-frontend", - "private": true, - "type": "module", - "version": "0.1.0", - "scripts": { - "dev": "vite", - "build": "vite build", - "check": "svelte-check --tsconfig ./tsconfig.json", - "test": "vitest run", - "test:watch": "vitest", - "bench": "bun run src/lib/__bench__/preview.bench.ts" - }, - "dependencies": { - "@tauri-apps/api": "^2", - "@tauri-apps/plugin-dialog": "^2.7.0", - "@tauri-apps/plugin-opener": "^2.5.3", - "dompurify": "^3.4.1", - "marked": "^18.0.2" - }, - "devDependencies": { - "@dagrejs/dagre": "^1.1.4", - "@sveltejs/vite-plugin-svelte": "^5", - "@tsconfig/svelte": "^5", - "svelte": "^5", - "svelte-check": "^4", - "typescript": "^5", - "vite": "^6", - "vitest": "^4.1.5" - } -} diff --git a/crates/toolpath-desktop/frontend/popover.html b/crates/toolpath-desktop/frontend/popover.html deleted file mode 100644 index 9dd8b7f..0000000 --- a/crates/toolpath-desktop/frontend/popover.html +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - Toolpath Quick View - - -
- - - diff --git a/crates/toolpath-desktop/frontend/public/contour-texture.svg b/crates/toolpath-desktop/frontend/public/contour-texture.svg deleted file mode 100644 index de9b29e..0000000 --- a/crates/toolpath-desktop/frontend/public/contour-texture.svg +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/crates/toolpath-desktop/frontend/src/app.svelte b/crates/toolpath-desktop/frontend/src/app.svelte deleted file mode 100644 index dbdf133..0000000 --- a/crates/toolpath-desktop/frontend/src/app.svelte +++ /dev/null @@ -1,173 +0,0 @@ - - -
- -
- - - - -
- {#if notInTauri} - - {/if} - - {#if store.m.error} -
-
- {store.m.error} - - -
-
- {/if} - - {#if store.m.route === "home"} - - {:else if store.m.route === "browse-agents"} - - {:else if store.m.route === "browse-claude"} - - {:else if store.m.route === "browse-pi"} - - {:else if store.m.route === "browse-git"} - - {:else if store.m.route === "browse-github"} - - {:else if store.m.route === "preview"} - - {:else if store.m.route === "result"} - - {/if} -
-
- - diff --git a/crates/toolpath-desktop/frontend/src/lib/ChatView.svelte b/crates/toolpath-desktop/frontend/src/lib/ChatView.svelte deleted file mode 100644 index e3c7c96..0000000 --- a/crates/toolpath-desktop/frontend/src/lib/ChatView.svelte +++ /dev/null @@ -1,249 +0,0 @@ - - -{#if preview && built} - {#if turns.length === 0} -
- This document has no HEAD path to transcribe. Switch to graph view to - inspect the raw DAG. -
- {:else} -
- {#each turns as t (t.id)} - {@const selected = t.id === selectedId} - - {#if t.kind === "user"} -
onSelect(t)} - role="button" - tabindex="0" - onkeydown={(e) => { if (e.key === "Enter") onSelect(t); }} - > -
- {#if t.text} -
{@html t.textHtml}
- {:else} -
(empty message)
- {/if} -
-
- You - {#if t.timestamp}·{fmtTime(t.timestamp)}{/if} -
-
- - {:else if t.kind === "assistant"} -
onSelect(t)} - role="button" - tabindex="0" - onkeydown={(e) => { if (e.key === "Enter") onSelect(t); }} - > -
- {t.actorDisplay} - {#if t.model}·{t.model}{/if} -
- - {#if t.thinking} -
- Thinking… -
{@html t.thinkingHtml}
-
- {/if} - - {#if t.text} -
{@html t.textHtml}
- {:else if t.toolNames.length === 0} -
(no text in this turn)
- {/if} - - {#if t.toolNames.length} -
- Used - {#each t.toolNames as name, i (i)} - {name} - {/each} -
- {/if} - -
- {#if t.timestamp}{fmtTime(t.timestamp)}{/if} -
- - {#if t.toolInvocations.length} -
- {#each t.toolInvocations as tool (tool.id)} - {@const expanded = isExpanded(tool)} - {@const diff = tool.toolDiff} -
- - {#if expanded} - {@const input = toolInput(tool)} - {@const result = toolResult(tool)} -
- {#if diff} - -
{#each diff.lines as line, i (i)}{line}
-{/each}
- {:else if input} - -
{input}
- {/if} - {#if result} - -
{result}
- {/if} - {#if !diff && !input && !result} -
(no captured input/result)
- {/if} -
- {/if} -
- {/each} -
- {/if} -
- - {:else} - -
onSelect(t)} role="button" tabindex="0" onkeydown={(e) => { if (e.key === "Enter") onSelect(t); }}> - - - {t.intent || t.actorDisplay || "system event"} - {#if t.timestamp}·{fmtTime(t.timestamp)}{/if} - - -
- {/if} - {/each} -
- {/if} -{/if} diff --git a/crates/toolpath-desktop/frontend/src/lib/PerfOverlay.svelte b/crates/toolpath-desktop/frontend/src/lib/PerfOverlay.svelte deleted file mode 100644 index 076641d..0000000 --- a/crates/toolpath-desktop/frontend/src/lib/PerfOverlay.svelte +++ /dev/null @@ -1,164 +0,0 @@ - - -{#if enabled && trace} -
-
- {trace.label} - - {#if trace.durationMs != null} - {fmt(trace.durationMs)}ms - {:else} - running… - {/if} - -
-
- {#each phases as p (p.name + p.start)} -
- {p.name} - {fmt(p.end - p.start)} -
- {/each} -
-
- marks - - - - - - {#each phases as p (p.name + p.start)} - - - - - - {/each} - -
markatΔ
{p.name}{fmt(p.end)}+{fmt(p.end - p.start)}
-
-
-{/if} - - diff --git a/crates/toolpath-desktop/frontend/src/lib/SourceLogo.svelte b/crates/toolpath-desktop/frontend/src/lib/SourceLogo.svelte deleted file mode 100644 index 570abad..0000000 --- a/crates/toolpath-desktop/frontend/src/lib/SourceLogo.svelte +++ /dev/null @@ -1,33 +0,0 @@ - - -{#if kind === "github"} - - - -{:else if kind === "git"} - - - -{:else if kind === "claude"} - - - - -{:else if kind === "pi"} - - - - - -{/if} diff --git a/crates/toolpath-desktop/frontend/src/lib/StepTree.svelte b/crates/toolpath-desktop/frontend/src/lib/StepTree.svelte deleted file mode 100644 index 4e8560b..0000000 --- a/crates/toolpath-desktop/frontend/src/lib/StepTree.svelte +++ /dev/null @@ -1,129 +0,0 @@ - - -{#if preview && built} - {@const total = built.nodes.length} - {@const onHead = built.nodes.filter((n) => n.onHead).length} -
-
-
{preview.filename}
-
- {total} step{total === 1 ? "" : "s"} · {onHead} on HEAD - {#if built.norm.head}· head {built.norm.head}{/if} -
-
-
- - store.dispatch({ t: "PreviewSetTreeQuery", value: (e.currentTarget as HTMLInputElement).value })} - /> -
-
- {#each FILTERS as f (f.key)} - - {/each} -
-
- {#if rows.length === 0} -
- {query || filter !== "all" ? "No steps match." : "No steps in this document."} -
- {:else} - {#each rows as node (node.id)} - {@const isSelected = node.id === selectedId} - - {/each} - {/if} -
-
- HEAD - on HEAD - dead end -
-
-{/if} diff --git a/crates/toolpath-desktop/frontend/src/lib/__bench__/preview.bench.ts b/crates/toolpath-desktop/frontend/src/lib/__bench__/preview.bench.ts deleted file mode 100644 index ade6c6c..0000000 --- a/crates/toolpath-desktop/frontend/src/lib/__bench__/preview.bench.ts +++ /dev/null @@ -1,181 +0,0 @@ -// Bench script for the Preview's pure-TS hot paths (issue #41). -// -// Runs against the synthetic fixtures generated by -// `cargo run -p toolpath-cli --bin gen_synthetic_path`. Prints median / -// p95 / max over N iterations per (size × operation) cell. Intended for -// tracking wins from #38 (markdown memo) and #39 (buildTree deps narrow). -// -// Usage (from `crates/toolpath-desktop/frontend`): -// -// bun run bench # default: all sizes it can find -// bun run src/lib/__bench__/preview.bench.ts --fixture ../../../bench/fixtures/synthetic-10k.path.json -// -// No external deps — just `performance.now()` and the modules under test. -// Render-time + memory measurements are the Tauri side and live in -// `BENCHMARKS.md` as a manual procedure. - -import { readFileSync } from "node:fs"; -import { resolve, dirname } from "node:path"; -import { fileURLToPath } from "node:url"; - -import { classify } from "../classify"; -import { buildTree, flattenChatHead, matchesFilter } from "../tree"; -import { normalize } from "../viz"; -import type { Document } from "../types"; - -const ITERATIONS_PER_OP = 10; -const KEYSTROKE_QUERIES = ["step", "step-0", "agent", "claude", "bench", "xyz"]; - -interface Stats { - n: number; - median: number; - p95: number; - max: number; - mean: number; -} - -function stats(samples: number[]): Stats { - const sorted = [...samples].sort((a, b) => a - b); - const n = sorted.length; - const median = sorted[Math.floor(n / 2)]; - const p95 = sorted[Math.min(n - 1, Math.floor(n * 0.95))]; - const max = sorted[n - 1]; - const mean = sorted.reduce((a, b) => a + b, 0) / n; - return { n, median, p95, max, mean }; -} - -function fmt(ms: number): string { - if (ms < 1) return `${(ms * 1000).toFixed(0)}us`; - if (ms < 100) return `${ms.toFixed(2)}ms`; - return `${ms.toFixed(1)}ms`; -} - -function printRow(label: string, s: Stats): void { - console.log( - ` ${label.padEnd(36)}` + - `median=${fmt(s.median).padStart(8)} ` + - `p95=${fmt(s.p95).padStart(8)} ` + - `max=${fmt(s.max).padStart(8)} ` + - `mean=${fmt(s.mean).padStart(8)} (n=${s.n})`, - ); -} - -function time(fn: () => T): [number, T] { - const t0 = performance.now(); - const out = fn(); - const t1 = performance.now(); - return [t1 - t0, out]; -} - -function benchFixture(fixturePath: string): void { - const raw = readFileSync(fixturePath, "utf8"); - const parseStart = performance.now(); - const doc = JSON.parse(raw) as Document; - const parseMs = performance.now() - parseStart; - - const stepCount = - "Path" in doc ? doc.Path.steps.length - : "Graph" in doc ? doc.Graph.paths.flatMap((p) => ("$ref" in p ? [] : p.steps)).length - : "Step" in doc ? 1 - : 0; - - console.log(""); - console.log(`── ${fixturePath} (${stepCount} steps, ${raw.length.toLocaleString()} bytes)`); - console.log(` JSON.parse: ${fmt(parseMs)}`); - - // normalize - const normSamples: number[] = []; - for (let i = 0; i < ITERATIONS_PER_OP; i++) { - const [ms] = time(() => normalize(doc)); - normSamples.push(ms); - } - printRow("normalize(doc)", stats(normSamples)); - - // buildTree (normalize + flattenTree) - const buildSamples: number[] = []; - for (let i = 0; i < ITERATIONS_PER_OP; i++) { - const [ms] = time(() => buildTree(doc)); - buildSamples.push(ms); - } - printRow("buildTree(doc)", stats(buildSamples)); - - // Warm a tree once for keystroke + classify benches. - const { nodes, norm } = buildTree(doc); - - // matchesFilter — per-keystroke simulation over all nodes, "all" filter. - const keystrokeSamples: number[] = []; - for (let i = 0; i < ITERATIONS_PER_OP; i++) { - const q = KEYSTROKE_QUERIES[i % KEYSTROKE_QUERIES.length]; - const [ms] = time(() => nodes.filter((n) => matchesFilter(n, q, "all"))); - keystrokeSamples.push(ms); - } - printRow("filter(matchesFilter) per keystroke", stats(keystrokeSamples)); - - // flattenChatHead — HEAD-chain walk used by the transcript view. - const chatSamples: number[] = []; - for (let i = 0; i < ITERATIONS_PER_OP; i++) { - const [ms] = time(() => flattenChatHead(norm)); - chatSamples.push(ms); - } - printRow("flattenChatHead(norm)", stats(chatSamples)); - - // classify — per-step metadata extraction, run across every step. - const classifySamples: number[] = []; - for (let i = 0; i < ITERATIONS_PER_OP; i++) { - const [ms] = time(() => { - for (const s of norm.steps) classify(s); - }); - classifySamples.push(ms); - } - printRow("classify × all steps", stats(classifySamples)); -} - -// ── Entry point ────────────────────────────────────────────────────────── - -const __filename = fileURLToPath(import.meta.url); -const __dirname = dirname(__filename); -const repoRoot = resolve(__dirname, "../../../../../.."); - -function defaultFixtures(): string[] { - return [ - "bench/fixtures/synthetic-1k.path.json", - "bench/fixtures/synthetic-5k.path.json", - "bench/fixtures/synthetic-10k.path.json", - ] - .map((p) => resolve(repoRoot, p)) - .filter((p) => { - try { - readFileSync(p); - return true; - } catch { - return false; - } - }); -} - -function main(): void { - const argv = process.argv.slice(2); - const fixtureArgIdx = argv.indexOf("--fixture"); - const fixtures = - fixtureArgIdx >= 0 && argv[fixtureArgIdx + 1] - ? [resolve(process.cwd(), argv[fixtureArgIdx + 1])] - : defaultFixtures(); - - if (fixtures.length === 0) { - console.error( - "No fixtures found. Generate them first:\n" + - " cargo run -p toolpath-cli --bin gen_synthetic_path -- --steps 1000 --out bench/fixtures/synthetic-1k.path.json\n" + - " cargo run -p toolpath-cli --bin gen_synthetic_path -- --steps 5000 --out bench/fixtures/synthetic-5k.path.json\n" + - " cargo run -p toolpath-cli --bin gen_synthetic_path -- --steps 10000 --out bench/fixtures/synthetic-10k.path.json\n", - ); - process.exit(1); - } - - console.log(`Preview bench — ${ITERATIONS_PER_OP} iterations per op`); - console.log(`Node/Bun: ${process.version ?? "unknown"}`); - - for (const f of fixtures) benchFixture(f); - console.log(""); -} - -main(); diff --git a/crates/toolpath-desktop/frontend/src/lib/__tests__/classify.test.ts b/crates/toolpath-desktop/frontend/src/lib/__tests__/classify.test.ts deleted file mode 100644 index 1806e88..0000000 --- a/crates/toolpath-desktop/frontend/src/lib/__tests__/classify.test.ts +++ /dev/null @@ -1,63 +0,0 @@ -import { describe, expect, it } from "vitest"; -import { classify, readStructural } from "../classify"; -import type { StepRef } from "../types"; - -// Minimal StepRef fixture — only the fields classify/readStructural read. -// `structural` is the flattened wire shape (see StructuralChange in Rust: -// `#[serde(rename = "type")]` on the tag + `#[serde(flatten)]` on extra). -function stepWith(structural: Record): StepRef { - return { - step: { id: "s", actor: "agent:claude-code" }, - change: { "convo://turn": { structural } }, - }; -} - -describe("classify", () => { - it("returns 'user' for a conversation.append with role=user", () => { - const s = stepWith({ type: "conversation.append", role: "user", text: "hi" }); - expect(classify(s).kind).toBe("user"); - }); - - it("returns 'assistant' for a conversation.append with role=assistant", () => { - const s = stepWith({ - type: "conversation.append", - role: "assistant", - text: "hello", - }); - expect(classify(s).kind).toBe("assistant"); - }); - - it("returns 'tool' for tool.invoke", () => { - const s = stepWith({ type: "tool.invoke", name: "Edit" }); - const c = classify(s); - expect(c.kind).toBe("tool"); - expect(c.toolName).toBe("Edit"); - }); - - it("returns 'system' for unknown types", () => { - const s = stepWith({ type: "conversation.init", model: "claude-opus-4-7" }); - expect(classify(s).kind).toBe("system"); - }); -}); - -describe("readStructural", () => { - it("prefers a tool.invoke payload over a non-conversation sibling artifact", () => { - // Claude multi-artifact case: a tool.invoke step also writes a file - // artifact whose `structural` is something unrelated (not in the - // CONVERSATION_TYPES set). readStructural should pick the tool.invoke. - const step: StepRef = { - step: { id: "s", actor: "agent:claude-code" }, - change: { - "file:///tmp/out.txt": { - structural: { type: "file.write", bytes: 42 }, - }, - "tool://Edit": { - structural: { type: "tool.invoke", name: "Edit" }, - }, - }, - }; - const s = readStructural(step); - expect(s?.type).toBe("tool.invoke"); - expect(s?.name).toBe("Edit"); - }); -}); diff --git a/crates/toolpath-desktop/frontend/src/lib/__tests__/tree.test.ts b/crates/toolpath-desktop/frontend/src/lib/__tests__/tree.test.ts deleted file mode 100644 index 4b2b953..0000000 --- a/crates/toolpath-desktop/frontend/src/lib/__tests__/tree.test.ts +++ /dev/null @@ -1,119 +0,0 @@ -import { describe, expect, it } from "vitest"; -import { flattenChatHead } from "../tree"; -import type { Document, StepRef } from "../types"; -import { normalize } from "../viz"; - -// ── Step fixture helpers ─────────────────────────────────────────────── - -function userStep(id: string, parent: string | null, text: string): StepRef { - return { - step: { id, actor: "human:alex", parents: parent ? [parent] : [] }, - change: { - "convo://turn": { - structural: { type: "conversation.append", role: "user", text }, - }, - }, - }; -} - -function assistantStep(id: string, parent: string, text: string): StepRef { - return { - step: { id, actor: "agent:claude-code", parents: [parent] }, - change: { - "convo://turn": { - structural: { type: "conversation.append", role: "assistant", text }, - }, - }, - }; -} - -function toolStep(id: string, parent: string, name: string): StepRef { - return { - step: { id, actor: "agent:claude-code", parents: [parent] }, - change: { - "tool://invoke": { - structural: { type: "tool.invoke", name }, - }, - }, - }; -} - -function pathDoc(head: string, steps: StepRef[]): Document { - return { - Path: { - path: { id: "p", head }, - steps, - }, - }; -} - -// ── Tests ────────────────────────────────────────────────────────────── - -describe("flattenChatHead", () => { - it("linearises a user → assistant → user → assistant chain in order", () => { - const steps = [ - userStep("s1", null, "hi"), - assistantStep("s2", "s1", "hello"), - userStep("s3", "s2", "how are you"), - assistantStep("s4", "s3", "good"), - ]; - const turns = flattenChatHead(normalize(pathDoc("s4", steps))); - expect(turns.map((t) => t.id)).toEqual(["s1", "s2", "s3", "s4"]); - expect(turns.map((t) => t.kind)).toEqual([ - "user", - "assistant", - "user", - "assistant", - ]); - }); - - it("attaches a tool.invoke sibling child to its assistant parent", () => { - // s2 (assistant) has two children: s3 (tool.invoke sibling, not on HEAD) - // and s4 (next user turn, on HEAD). head = s4. - const steps = [ - userStep("s1", null, "hi"), - assistantStep("s2", "s1", "ok"), - toolStep("s3", "s2", "Edit"), - userStep("s4", "s2", "thanks"), - ]; - const turns = flattenChatHead(normalize(pathDoc("s4", steps))); - const s2 = turns.find((t) => t.id === "s2")!; - expect(s2.toolInvocations.map((t) => t.id)).toEqual(["s3"]); - expect(s2.toolInvocations[0].toolName).toBe("Edit"); - // s3 should not appear as its own top-level turn. - expect(turns.map((t) => t.id)).toEqual(["s1", "s2", "s4"]); - }); - - it("ignores sibling children that aren't tool.invoke", () => { - const steps = [ - userStep("s1", null, "hi"), - assistantStep("s2", "s1", "ok"), - // sibling child that's a user turn, not a tool.invoke - userStep("s3", "s2", "detour"), - userStep("s4", "s2", "thanks"), - ]; - const turns = flattenChatHead(normalize(pathDoc("s4", steps))); - const s2 = turns.find((t) => t.id === "s2")!; - expect(s2.toolInvocations).toEqual([]); - }); - - it("falls back to the full step list for a bare Step doc (no head)", () => { - const doc: Document = { - Step: userStep("solo", null, "hi") as StepRef & { - meta?: { actors?: Record }; - }, - }; - const turns = flattenChatHead(normalize(doc)); - expect(turns.map((t) => t.id)).toEqual(["solo"]); - }); - - it("falls back to the full step list when head is detached (not in stepMap)", () => { - const steps = [ - userStep("s1", null, "hi"), - assistantStep("s2", "s1", "ok"), - ]; - // head points to a non-existent step. - const turns = flattenChatHead(normalize(pathDoc("missing", steps))); - expect(turns.map((t) => t.id)).toEqual(["s1", "s2"]); - }); -}); diff --git a/crates/toolpath-desktop/frontend/src/lib/classify.ts b/crates/toolpath-desktop/frontend/src/lib/classify.ts deleted file mode 100644 index 00b625e..0000000 --- a/crates/toolpath-desktop/frontend/src/lib/classify.ts +++ /dev/null @@ -1,84 +0,0 @@ -// Step-level classification shared by the chat transcript and the graph -// card renderer. Reads the `structural` payload of a step's change entries -// and extracts role / text / tool metadata. -// -// Keep in sync with `crates/toolpath/src/types.rs::StructuralChange`: -// - `change_type` is `#[serde(rename = "type")]` -// - `extra: HashMap` is `#[serde(flatten)]` -// so on the wire the payload is a flat object like -// `{ type: "conversation.append", role: "assistant", text: "...", ... }`. - -import type { StepRef } from "./types"; - -export type ChatTurnKind = - | "user" // conversation.append, role=user - | "assistant" // conversation.append, role=assistant - | "tool" // tool.invoke - | "system" // conversation.init / conversation.event / anything else - ; - -export type StructuralPayload = Record & { type?: string }; - -const CONVERSATION_TYPES = new Set([ - "conversation.append", - "conversation.init", - "conversation.event", - "tool.invoke", -]); - -/** - * Pick the best `structural` payload from a step's change map — prefer - * one whose `type` is a known conversation variant so that (e.g.) a tool - * file artifact doesn't shadow the conversation payload. - */ -export function readStructural(step: StepRef): StructuralPayload | null { - if (!step.change) return null; - const candidates: StructuralPayload[] = []; - for (const key of Object.keys(step.change)) { - const s = step.change[key]?.structural as StructuralPayload | undefined; - if (s && typeof s === "object") candidates.push(s); - } - if (candidates.length === 0) return null; - return ( - candidates.find((c) => typeof c.type === "string" && CONVERSATION_TYPES.has(c.type)) - ?? candidates[0] - ); -} - -function asString(v: unknown): string | null { - return typeof v === "string" && v.length ? v : null; -} - -function asStringArray(v: unknown): string[] { - if (!Array.isArray(v)) return []; - return v.filter((x): x is string => typeof x === "string"); -} - -export interface Classified { - kind: ChatTurnKind; - text: string | null; - toolNames: string[]; - thinking: string | null; - model: string | null; - toolName: string | null; -} - -export function classify(step: StepRef): Classified { - const s = readStructural(step) ?? {}; - const ct = typeof s.type === "string" ? s.type : ""; - const role = asString(s["role"]); - const text = asString(s["text"]); - const thinking = asString(s["thinking"]); - const toolNames = asStringArray(s["tool_uses"]); - const model = asString(s["model"]); - const toolName = asString(s["name"]); - - let kind: ChatTurnKind; - if (ct === "tool.invoke") kind = "tool"; - else if (ct === "conversation.append") { - kind = role === "user" ? "user" : "assistant"; - } else { - kind = "system"; - } - return { kind, text, toolNames, thinking, model, toolName }; -} diff --git a/crates/toolpath-desktop/frontend/src/lib/debug.ts b/crates/toolpath-desktop/frontend/src/lib/debug.ts deleted file mode 100644 index 853e04a..0000000 --- a/crates/toolpath-desktop/frontend/src/lib/debug.ts +++ /dev/null @@ -1,54 +0,0 @@ -// Lightweight debug-log helper. -// -// `dbg("msg", name, payload)` prints a timestamped, colour-coded line to the -// webview devtools console. Category is a string tag (`msg`, `route`, -// `invoke`, `invoke.ok`, `invoke.err`, `event`, ...). Disable all output by -// setting `localStorage.debug = "0"` or `false`; default is on in dev. -// -// Pretty-prints non-trivial payloads as expandable objects rather than -// stringifying them, so the devtools inspector stays useful. - -const COLOURS: Record = { - msg: "#b5652b", - route: "#3a7e3a", - invoke: "#5b7bc4", - "invoke.ok": "#3a7e3a", - "invoke.err": "#c44030", - event: "#8a5a9a", - default: "#8a8078", -}; - -function enabled(): boolean { - try { - const v = globalThis.localStorage?.getItem("debug"); - return v !== "0" && v !== "false"; - } catch { - return true; - } -} - -function ts(): string { - const d = new Date(); - return ( - String(d.getHours()).padStart(2, "0") + - ":" + - String(d.getMinutes()).padStart(2, "0") + - ":" + - String(d.getSeconds()).padStart(2, "0") + - "." + - String(d.getMilliseconds()).padStart(3, "0") - ); -} - -export function dbg(category: string, label: string, ...rest: unknown[]): void { - if (!enabled()) return; - const colour = COLOURS[category] ?? COLOURS.default; - // eslint-disable-next-line no-console - console.log( - `%c${ts()} %c${category}%c ${label}`, - "color:#8a8078;font-family:monospace", - `color:${colour};font-weight:600;font-family:monospace`, - "color:inherit;font-family:monospace", - ...rest, - ); -} diff --git a/crates/toolpath-desktop/frontend/src/lib/ipc.ts b/crates/toolpath-desktop/frontend/src/lib/ipc.ts deleted file mode 100644 index 60944fc..0000000 --- a/crates/toolpath-desktop/frontend/src/lib/ipc.ts +++ /dev/null @@ -1,32 +0,0 @@ -// Tauri IPC bridge wrappers, typed. -// -// `invoke` is a thin typed wrapper around `@tauri-apps/api/core`. Rust -// commands are snake_case; Tauri converts camelCase JS args to snake_case -// Rust params. - -import { invoke as tauriInvoke } from "@tauri-apps/api/core"; -import { listen as tauriListen, type UnlistenFn } from "@tauri-apps/api/event"; -import { dbg } from "./debug"; - -export function invoke( - cmd: string, - args?: Record, -): Promise { - return tauriInvoke(cmd, args); -} - -/** - * Subscribe to a Tauri backend event. Returns a promise of the unlisten - * function so `$effect` can clean up automatically. Every received event is - * logged via `dbg("event", name, payload)`. - */ -export function listen( - event: string, - handler: (payload: T) => void, -): Promise { - dbg("event", event + " (subscribed)"); - return tauriListen(event, (ev) => { - dbg("event", event, ev.payload); - handler(ev.payload as T); - }); -} diff --git a/crates/toolpath-desktop/frontend/src/lib/markdown.ts b/crates/toolpath-desktop/frontend/src/lib/markdown.ts deleted file mode 100644 index c8d6775..0000000 --- a/crates/toolpath-desktop/frontend/src/lib/markdown.ts +++ /dev/null @@ -1,20 +0,0 @@ -// Minimal markdown → sanitized HTML renderer for chat bodies. Pipes -// `marked` through DOMPurify so raw ` - -
-
- -
- - - - {#if store.m.agents.list === null} - - {:else if store.m.agents.list.length === 0} -
No agents known.
- {:else} -
- {#each store.m.agents.list as agent (agent.id)} - {@const clickable = agent.status === "available"} - - {/each} -
- {/if} -
diff --git a/crates/toolpath-desktop/frontend/src/routes/BrowseClaude.svelte b/crates/toolpath-desktop/frontend/src/routes/BrowseClaude.svelte deleted file mode 100644 index 842103c..0000000 --- a/crates/toolpath-desktop/frontend/src/routes/BrowseClaude.svelte +++ /dev/null @@ -1,174 +0,0 @@ - - -
- {#if !embedded} -
- -
- - - {/if} - - {#if projectCount === 0 && claude.projectsDone} -
No Claude projects found. Use Claude Code at least once and come back.
- {:else} -
- {#each claude.projects as p (p.project_path)} - {@const isExpanded = claude.expanded === p.project_path} - {@const projectTitle = claude.projectTitles[p.project_path]} -
- - {#if isExpanded} - {@const sessions = claude.sessionsByPath[p.project_path] ?? []} - {@const loading = claude.sessionsLoading[p.project_path]} -
- {#if sessions.length === 0 && loading} -
- Loading sessions… -
- {:else if sessions.length === 0} -
No sessions in this project.
- {:else} - {#each sessions as s (s.session_id)} - {@const title = claude.titles[`${p.project_path}|${s.session_id}`]} -
- -
-
- {#if title}{title}{:else}loading title…{/if} -
-
- {s.turn_count} turn{s.turn_count === 1 ? "" : "s"} - {fmtTime(s.last_activity)} - {s.session_id.slice(0, 8)} -
-
- -
- {/each} - {#if loading} -
- Still loading… -
- {/if} - {/if} -
- {/if} -
- {/each} -
- {/if} -
diff --git a/crates/toolpath-desktop/frontend/src/routes/BrowseGit.svelte b/crates/toolpath-desktop/frontend/src/routes/BrowseGit.svelte deleted file mode 100644 index 00ebca9..0000000 --- a/crates/toolpath-desktop/frontend/src/routes/BrowseGit.svelte +++ /dev/null @@ -1,92 +0,0 @@ - - -
- {#if !embedded} -
- -
- - - {/if} - - - -
- -
- store.dispatch({ t: "GitSetRepoPath", value: (ev.target as HTMLInputElement).value })} - onkeydown={(ev) => { if (ev.key === "Enter") store.dispatch({ t: "GitLoadBranches" }); }} - /> - - -
-
- - {#if git.branches !== null && git.branches.length > 0} - -
- {#each git.branches as b (b.name)} - - {/each} -
- {:else if git.branches !== null} -
No branches found in this repo.
- {:else} -
No branches loaded yet.
- {/if} - -
- - -
-
diff --git a/crates/toolpath-desktop/frontend/src/routes/BrowseGithub.svelte b/crates/toolpath-desktop/frontend/src/routes/BrowseGithub.svelte deleted file mode 100644 index 4423f64..0000000 --- a/crates/toolpath-desktop/frontend/src/routes/BrowseGithub.svelte +++ /dev/null @@ -1,120 +0,0 @@ - - -
- {#if !embedded} -
- -
- - - {/if} - - - - {#if gh.hasToken === null} -
Checking keychain…
- {:else if gh.editingToken || !gh.hasToken} -
- -
- store.dispatch({ t: "GithubSetTokenInput", value: (ev.target as HTMLInputElement).value })} - /> - - {#if gh.hasToken} - - {/if} -
-
- Stored under dev.pathbase.toolpath-desktop. -
-
- {:else} -
- ◇ Token set - - - -
- {/if} - - - -
- store.dispatch({ t: "GithubSetUrl", value: (ev.target as HTMLInputElement).value })} - /> -
- - -
-
- -
- - -
-
diff --git a/crates/toolpath-desktop/frontend/src/routes/BrowsePi.svelte b/crates/toolpath-desktop/frontend/src/routes/BrowsePi.svelte deleted file mode 100644 index 2273d82..0000000 --- a/crates/toolpath-desktop/frontend/src/routes/BrowsePi.svelte +++ /dev/null @@ -1,186 +0,0 @@ - - -
- {#if !embedded} -
- -
- - - {/if} - - {#if projectCount === 0 && pi.projectsDone} -
No pi.dev projects found. Run a pi.dev session and come back.
- {:else} -
- {#each pi.projects as p (p.project_path)} - {@const isExpanded = pi.expanded === p.project_path} -
- - {#if isExpanded} - {@const sessions = pi.sessionsByPath[p.project_path] ?? []} - {@const loading = pi.sessionsLoading[p.project_path]} -
- {#if sessions.length === 0 && loading} -
- Loading sessions… -
- {:else if sessions.length === 0} -
No sessions in this project.
- {:else} - {#each sessions as s (s.session_id)} -
- -
-
{s.session_id}
-
- {s.entry_count} entr{s.entry_count === 1 ? "y" : "ies"} - {fmtTime(s.timestamp)} -
-
- -
- {/each} - {#if loading} -
- Still loading… -
- {/if} - {/if} -
- {/if} -
- {/each} -
- {/if} -
diff --git a/crates/toolpath-desktop/frontend/src/routes/Home.svelte b/crates/toolpath-desktop/frontend/src/routes/Home.svelte deleted file mode 100644 index 21fc083..0000000 --- a/crates/toolpath-desktop/frontend/src/routes/Home.svelte +++ /dev/null @@ -1,59 +0,0 @@ - - -
- - - -
- {#each SOURCES as s (s.k)} - - {/each} -
- - - {#if active === "claude"} - - {:else if active === "pi"} - - {:else if active === "git"} - - {:else if active === "github"} - - {/if} -
diff --git a/crates/toolpath-desktop/frontend/src/routes/Popover.svelte b/crates/toolpath-desktop/frontend/src/routes/Popover.svelte deleted file mode 100644 index 228f62e..0000000 --- a/crates/toolpath-desktop/frontend/src/routes/Popover.svelte +++ /dev/null @@ -1,376 +0,0 @@ - - -
-
- Quick View - {#if stats} - {stats.total_active} active · {stats.total_recent} recent - {:else} - loading… - {/if} -
- - {#if stats} -
    - {#each stats.counts as c (c.provider)} -
  • - {providerName(c.provider)} - 0} - >● {c.active} - {c.recent} today -
  • - {/each} -
- - -
    - {#if stats.recent.length === 0} -
  • No recent activity.
  • - {/if} - {#each stats.recent as r (r.provider + ":" + r.session_id)} - {@const supported = SUPPORTED.has(r.provider)} -
  • - -
  • - {/each} -
- - {#if openError} - - {/if} - {/if} - -
- - - - {#if stats} - updated {ago(stats.polled_at)} - {/if} -
-
- - diff --git a/crates/toolpath-desktop/frontend/src/routes/Preview.svelte b/crates/toolpath-desktop/frontend/src/routes/Preview.svelte deleted file mode 100644 index a14404a..0000000 --- a/crates/toolpath-desktop/frontend/src/routes/Preview.svelte +++ /dev/null @@ -1,305 +0,0 @@ - - -{#if !preview} -
-
-
Nothing to preview
-

- Pick a repo, pull request, or conversation from the home tab. Toolpath - will derive a Path document, show its provenance graph, and let you - upload it to pathbase.dev. -

-
⎇ ◇ ⊕ ● · four source types
-
-{:else} - -
-
-
§2 · DERIVED PATH · {preview.source}
-
{docTitle}
-
- △ {steps.length} step{steps.length === 1 ? "" : "s"} - · ◆ {actorSet.size} actor{actorSet.size === 1 ? "" : "s"} - {#if times.length >= 2}· {times[0].slice(0, 10)} → {times[times.length - 1].slice(0, 10)}{/if} -
-
-
- ◇ Valid - - -
-
- - -
-
- - - - -
- - - -
- {#if !preview.selectedStep} -
Click a step in the tree or graph to inspect its diff and metadata.
- {:else} - {@const s = preview.selectedStep} - {@const actor = s.step.actor} - {@const def = preview.selectedActors?.[actor]} - {@const displayName = def?.name ?? actor.split(":").slice(1).join(":")} - {@const changeKeys = s.change ? Object.keys(s.change) : []} -
- {s.step.id} -
-
-
Actor
-
{displayName} {actor}
- {#if s.step.timestamp} -
Time
-
{s.step.timestamp}
- {/if} - {#if s.step.parents && s.step.parents.length} -
Parents
-
{s.step.parents.join(", ")}
- {/if} - {#if s.meta?.intent} -
Intent
-
{s.meta.intent}
- {/if} -
- {#if changeKeys.length === 0} -
No change body on this step.
- {:else} - {#each changeKeys as k (k)} - {@const ch = s.change![k]} -
{k}
- {#if ch.raw}
{ch.raw}
{/if} - {#if ch.structural}
{JSON.stringify(ch.structural, null, 2)}
{/if} - {/each} - {/if} - {/if} -
- -
- -
-
Source
-
{preview.source}
-
Filename
-
{preview.filename}
-
Steps
-
{steps.length}
-
Actors
-
{actorSet.size}
-
-
- -
- - -
- - -
- - {#if preview.viewMode === "chat"} - - -
- HEAD path only - - {steps.length} steps · {actorSet.size} actors -
- {:else} -
- - - -
- - - -
- ⌘/ctrl + scroll to zoom -
- -
- -
-
- -
- - - human - - - - agent - - - - dead-end - - - {steps.length} steps · {actorSet.size} actors -
- {/if} -
-
-{/if} diff --git a/crates/toolpath-desktop/frontend/src/routes/Result.svelte b/crates/toolpath-desktop/frontend/src/routes/Result.svelte deleted file mode 100644 index 948b3bc..0000000 --- a/crates/toolpath-desktop/frontend/src/routes/Result.svelte +++ /dev/null @@ -1,79 +0,0 @@ - - -
- {#if !r} -
-
-
No result yet
-

Derive and upload a Path document to see the outcome here.

-
- {:else if r.kind === "export"} - - -
-
-
Source
-
{r.source}
-
Path
-
{r.path}
-
-
- -
- - - -
- {:else} - - - {#if r.stub} -
- Pathbase is not live yet — this is a stubbed response. The document - validated cleanly; the real upload will drop in when the API ships. -
- {/if} - -
-
-
Source
-
{r.source}
-
URL
-
{r.url}
-
-
- -
- - - -
- {/if} -
diff --git a/crates/toolpath-desktop/frontend/src/styles.css b/crates/toolpath-desktop/frontend/src/styles.css deleted file mode 100644 index 785b53c..0000000 --- a/crates/toolpath-desktop/frontend/src/styles.css +++ /dev/null @@ -1,1903 +0,0 @@ -/* ========================================================================== - Toolpath Desktop — cartographic "paper chart" design language. - Mirrors the Pathbase brand: topographic map palette, hairline rules, - serif body, monospace metadata. - ========================================================================== */ - -@import url('https://fonts.googleapis.com/css2?family=Source+Serif+4:ital,opsz,wght@0,8..60,300..900;1,8..60,300..900&family=JetBrains+Mono:wght@300..700&family=IBM+Plex+Sans+Condensed:wght@300;400;500;600;700&display=swap'); - -:root { - /* Paper stock — cream chart paper */ - --paper: #ece6d6; - --paper-2: #e2dbc8; - --paper-3: #d6ceb8; - --paper-bright: #f2ede0; - --paper-white: #f6f2e6; - - /* Ink — desaturated warm-black */ - --ink: #221f18; - --ink-2: #3d3830; - --ink-3: #6e6857; - --ink-4: #9a9483; - --ink-5: #beb8a5; - - /* Contour brown — the defining cartographic ink */ - --contour: #8c6a3a; - --contour-2: #6d4f26; - --contour-faint: #b59a6e; - - /* Map palette */ - --water: #6e8faa; - --water-wash: #cfd9e0; - --forest: #8a9a6e; - --forest-wash: #d7dcbf; - --road: #a85038; - --road-2: #8a3e2a; - --road-wash: #ecd5cb; - --boundary: #8a3a6a; - - --accent: var(--road); - --accent-2: var(--road-2); - --accent-wash: var(--road-wash); - --ok: var(--forest); - --warn: var(--contour); - --err: var(--road); - - /* Role-specific surface tokens (used by .pg-card states) */ - --pg-card-dead-bg: #fcfaf6; - --pg-card-toggle-bg: #faf6ee; - - --font-serif: "Source Serif 4", "Source Serif Pro", "Times New Roman", Times, Georgia, serif; - --font-display: "Source Serif 4", Georgia, serif; - --font-mono: "JetBrains Mono", "IBM Plex Mono", ui-monospace, Menlo, monospace; - --font-sans: "IBM Plex Sans Condensed", "IBM Plex Sans", -apple-system, BlinkMacSystemFont, Helvetica, Arial, sans-serif; - - --ease: cubic-bezier(0.2, 0, 0.2, 1); - - /* Legacy aliases used by viz.ts (.path-graph, .pg-card) */ - --text: var(--ink); - --text-muted: var(--ink-3); - --panel: var(--paper-bright); - --border: var(--ink-5); - --accent-soft: var(--accent-wash); - --accent-hot: var(--accent-wash); - --danger: var(--road); - --dead: var(--road-wash); - --mono: var(--font-mono); - --sans: var(--font-sans); -} - -/* ========================================================================== - DARK MODE — "Soft graphite" night survey paper. - A first-class companion to light mode. Toggle via . - Moss-smudged paper, warm cream ink, muted territory hues. - ========================================================================== */ -:root[data-theme="dark"] { - --paper: #2e3230; - --paper-2: #353a37; - --paper-3: #3d423e; - --paper-bright: #373c39; - --paper-white: #424742; - - --ink: #e8e5d6; - --ink-2: #ccc9ba; - --ink-3: #97968a; - --ink-4: #6a6c62; - --ink-5: #4c4f4a; - - --contour: #c8a76e; - --contour-2: #d9b67c; - --contour-faint: #7f6c4c; - - --water: #9ab3c4; - --water-wash: #3e4c54; - --forest: #b6c68e; - --forest-wash: #3f4a36; - --road: #d38c74; - --road-2: #de9d86; - --road-wash: #4a342c; - --boundary: #bf8fab; - - --pg-card-dead-bg: var(--paper-2); - --pg-card-toggle-bg: var(--paper-2); - - color-scheme: dark; -} - -/* No lighter "frame" around the window in dark mode — let the paper run - edge-to-edge. Also sit the active tab a shade below the page so it - reads as pressed-in, not raised. */ -:root[data-theme="dark"] html, -:root[data-theme="dark"] body { background: var(--paper); } -:root[data-theme="dark"] .window { border-color: transparent; } -:root[data-theme="dark"] .tabs__item--active { background: #24272a; } - -* { box-sizing: border-box; } -html, body { - height: 100%; - margin: 0; - background: var(--paper-3); - color: var(--ink); - font-family: var(--font-serif); - font-size: 14px; - line-height: 1.55; - font-feature-settings: "onum" 1, "liga" 1, "kern" 1; - -webkit-font-smoothing: antialiased; - text-rendering: optimizeLegibility; -} - -*::-webkit-scrollbar { width: 10px; height: 10px; } -*::-webkit-scrollbar-track { background: var(--paper-2); } -*::-webkit-scrollbar-thumb { background: var(--ink-5); border: 2px solid var(--paper-2); } -*::-webkit-scrollbar-thumb:hover { background: var(--ink-4); } - -/* ---------- Window chrome ---------- */ -.window { - display: grid; - grid-template-rows: 36px auto 1fr auto; - min-height: 100vh; - background: var(--paper); - border: 0.5px solid var(--ink); - position: relative; -} - -.window__title { - display: grid; - grid-template-columns: auto 1fr auto; - align-items: center; - gap: 12px; - padding: 0 14px; - height: 36px; - background: var(--paper-2); - border-bottom: 0.5px solid var(--ink); - user-select: none; -} -.window__dots { display: flex; gap: 6px; align-items: center; } -.window__dot { - width: 10px; height: 10px; border-radius: 999px; - border: 0.5px solid var(--ink); background: transparent; -} -.window__brand { - font-family: var(--font-mono); - font-size: 10px; - letter-spacing: 0.22em; - text-transform: uppercase; - color: var(--contour-2); - margin-left: 8px; -} -.window__title-center { - font-family: var(--font-mono); - font-size: 11px; - letter-spacing: 0.18em; - text-transform: uppercase; - color: var(--ink-3); - text-align: center; - display: flex; align-items: center; justify-content: center; gap: 10px; -} -.window__title-center .sep { opacity: 0.4; } -.window__title-right { - display: flex; align-items: center; gap: 10px; - font-family: var(--font-mono); font-size: 10px; - color: var(--ink-3); letter-spacing: 0.14em; - text-transform: uppercase; -} -.window__title-right .elevation { color: var(--contour-2); } - -/* ---------- Tab bar ---------- */ -.tabs { - display: flex; - align-items: stretch; - background: var(--paper); - border-bottom: 0.5px solid var(--ink); - padding-left: 24px; -} -.tabs__item { - background: transparent; - border: 0; - border-right: 0.5px solid var(--ink-5); - border-left: 0.5px solid transparent; - border-top: 2px solid transparent; - padding: 10px 18px; - cursor: pointer; - display: flex; align-items: center; gap: 8px; - font-family: var(--font-serif); - font-size: 14px; - color: var(--ink-3); - transition: color 120ms var(--ease); -} -.tabs__item:hover { color: var(--ink-2); } -.tabs__item--active { - background: var(--paper-bright); - border-left: 0.5px solid var(--ink-5); - border-top: 2px solid var(--ink); - margin-bottom: -0.5px; - color: var(--ink); -} -.tabs__num { - font-family: var(--font-mono); - font-size: 10px; - letter-spacing: 0.14em; - color: var(--ink-4); -} -.tabs__item--active .tabs__num { color: var(--contour-2); } -.tabs__badge { - font-family: var(--font-mono); - font-size: 10px; - letter-spacing: 0.1em; - padding: 1px 6px; - border: 0.5px solid var(--road); - color: var(--road); - margin-left: 4px; -} - -/* ---------- Theme toggle (sits at the end of the tabs bar) ---------- */ -.theme-toggle { - margin-left: auto; - align-self: center; - display: inline-flex; - align-items: center; - gap: 8px; - padding: 6px 12px; - margin-right: 18px; - background: transparent; - border: 0.5px solid var(--ink-5); - color: var(--ink-3); - cursor: pointer; - font-family: var(--font-mono); - font-size: 10px; - letter-spacing: 0.18em; - text-transform: uppercase; - border-radius: 2px; - transition: all 120ms var(--ease); -} -.theme-toggle:hover { - border-color: var(--ink); - color: var(--ink); -} -.theme-toggle__glyph { - font-size: 13px; - color: var(--contour-2); - line-height: 1; -} - -/* In dark mode, invert the subtle contour backdrop so it still reads. */ -:root[data-theme="dark"] .backdrop { - filter: invert(1); - opacity: 0.05; -} - -/* ---------- Main scroll area ---------- */ -.main { - min-height: 0; - overflow-y: auto; - background: var(--paper); - position: relative; -} - -/* ---------- Page header "sheet title" ---------- */ -.page { - max-width: 1360px; - margin: 0 auto; - padding: 28px 32px 48px; -} -.page__eyebrow { - font-family: var(--font-mono); - font-size: 10px; - letter-spacing: 0.28em; - text-transform: uppercase; - color: var(--contour-2); -} -.page__title { - font-family: var(--font-display); - font-size: 34px; - font-weight: 700; - letter-spacing: -0.01em; - color: var(--ink); - margin: 4px 0 6px; - line-height: 1.15; -} -.page__title .accent { color: var(--road); } -.page__lede { - font-family: var(--font-serif); - font-size: 14px; - color: var(--ink-3); - max-width: 64ch; - margin: 0; -} -.page__coord { - font-family: var(--font-mono); - font-size: 10px; - color: var(--ink-3); - letter-spacing: 0.16em; - text-transform: uppercase; - white-space: nowrap; -} -.page__header { - display: grid; - grid-template-columns: 1fr auto; - align-items: end; - gap: 20px; - margin-bottom: 24px; -} - -/* ---------- Section label ---------- */ -.section-label { - display: grid; - grid-template-columns: auto 1fr auto; - align-items: baseline; - gap: 10px; - margin: 0 0 10px; -} -.section-label__num { - font-family: var(--font-mono); font-size: 10px; - color: var(--contour-2); - letter-spacing: 0.22em; text-transform: uppercase; font-weight: 500; -} -.section-label__text { - font-family: var(--font-sans); font-size: 11px; - letter-spacing: 0.22em; text-transform: uppercase; - color: var(--ink-2); font-weight: 500; - border-bottom: 0.5px solid var(--ink-5); - padding-bottom: 4px; -} -.section-label__right { - font-family: var(--font-mono); font-size: 10px; - color: var(--ink-4); letter-spacing: 0.14em; text-transform: uppercase; -} - -/* ---------- Status bar ---------- */ -.status-bar { - height: 28px; - border-top: 0.5px solid var(--ink); - background: var(--paper-2); - display: grid; - grid-template-columns: 1fr auto; - align-items: center; - padding: 0 18px; - font-family: var(--font-mono); - font-size: 11px; - letter-spacing: 0.1em; - color: var(--ink-3); - gap: 14px; -} -.status-bar__items { display: flex; gap: 20px; align-items: center; } -.status-bar__item { display: inline-flex; align-items: center; gap: 6px; } -.status-bar__k { color: var(--ink-4); text-transform: uppercase; letter-spacing: 0.14em; } -.status-bar__v { color: var(--ink); } -.status-bar__right { display: flex; gap: 14px; align-items: center; } -.status-bar__sep { color: var(--ink-5); } - -/* ---------- Banner (not-in-tauri) ---------- */ -.banner { - padding: 10px 20px; - font-size: 13px; - background: var(--road); - color: var(--paper-bright); - font-family: var(--font-sans); -} -.banner code { - font-family: var(--font-mono); - font-size: 12px; - background: rgba(255,255,255,0.18); - padding: 1px 5px; -} - -/* ---------- Error ---------- */ -.error { - color: var(--road); - background: var(--road-wash); - border: 0.5px solid var(--road); - padding: 10px 14px; - font-family: var(--font-serif); font-size: 13px; - display: flex; align-items: center; gap: 12px; - margin-bottom: 18px; -} - -/* ---------- Buttons ---------- */ -.btn { - font-family: var(--font-sans); - font-size: 13px; - font-weight: 500; - padding: 7px 14px; - border: 0.5px solid var(--ink); - background: var(--paper-bright); - color: var(--ink); - cursor: pointer; - transition: all 120ms var(--ease); - display: inline-flex; align-items: center; gap: 6px; - letter-spacing: 0; - border-radius: 2px; -} -.btn:hover:not(:disabled) { background: var(--paper); } -.btn:disabled { opacity: 0.5; cursor: not-allowed; } -.btn--primary { background: var(--ink); color: var(--paper-bright); } -.btn--primary:hover:not(:disabled) { background: var(--ink-2); } -.btn--accent { background: var(--accent); color: var(--paper-bright); border-color: var(--accent); } -.btn--accent:hover:not(:disabled) { background: var(--accent-2); } -.btn--ghost { - background: transparent; border: 0; padding: 6px 8px; - text-decoration: underline; text-underline-offset: 4px; text-decoration-thickness: 0.5px; - border-radius: 0; -} -.btn--danger { background: var(--paper-bright); color: var(--road); border-color: var(--road); } -.btn--sm { padding: 5px 10px; font-size: 11.5px; } - -/* ---------- Tag / badge ---------- */ -.tag { - font-family: var(--font-mono); - font-size: 10px; - letter-spacing: 0.1em; - text-transform: uppercase; - padding: 2px 7px; - border: 0.5px solid var(--ink); - color: var(--ink); - background: transparent; - display: inline-flex; align-items: center; gap: 5px; -} -.tag--solid { background: var(--ink); color: var(--paper-bright); } -.tag--accent { border-color: var(--accent); color: var(--accent); } -.tag--ok { border-color: var(--ok); color: var(--ok); } -.tag--warn { border-color: var(--warn); color: var(--warn); } -.tag--muted { border-color: var(--ink-5); color: var(--ink-3); } - -/* ---------- Source-type tabs (top of source picker) ---------- */ -.source-tabs { - display: grid; - grid-template-columns: repeat(4, 1fr); - background: var(--paper-2); - border-bottom: 0.5px solid var(--ink-5); -} -.source-tabs__item { - background: transparent; - border: 0; - border-right: 0.5px solid var(--ink-5); - border-bottom: 2px solid transparent; - padding: 12px 8px; - display: flex; flex-direction: column; align-items: center; gap: 3px; - cursor: pointer; - color: var(--ink-3); - font-family: var(--font-sans); - transition: all 120ms var(--ease); -} -.source-tabs__item:hover { background: var(--paper); color: var(--ink-2); } -.source-tabs__item--active { - background: var(--paper-bright); - border-bottom-color: var(--contour-2); - color: var(--ink); -} -.source-tabs__glyph { - font-family: var(--font-mono); - font-size: 13px; - color: var(--ink-4); -} -.source-tabs__item--active .source-tabs__glyph { color: var(--contour-2); } -.source-tabs__label { font-size: 12px; letter-spacing: 0.06em; } -.source-tabs__count { - font-family: var(--font-mono); font-size: 9px; - letter-spacing: 0.1em; color: var(--ink-4); - text-transform: uppercase; -} - -/* ---------- Input / search bar ---------- */ -.field { - padding: 10px 14px; - border-bottom: 0.5px solid var(--ink-5); - background: var(--paper); - display: flex; align-items: center; gap: 8px; -} -.field input { - flex: 1; - border: 0; - background: transparent; - outline: 0; - font-family: var(--font-serif); - font-size: 13px; - color: var(--ink); -} -.field input::placeholder { color: var(--ink-4); } - -.input { - font-family: var(--font-serif); - font-size: 14px; - padding: 8px 10px; - border: 0.5px solid var(--ink); - background: var(--paper-white); - color: var(--ink); - outline: 0; - width: 100%; - border-radius: 2px; -} -.input:focus { border-color: var(--accent); } - -.kbd { - font-family: var(--font-mono); - font-size: 11px; - padding: 1px 6px; - border: 0.5px solid var(--ink); - border-bottom-width: 1.5px; - border-radius: 2px; - background: var(--paper-bright); - color: var(--ink); - letter-spacing: 0.04em; - display: inline-block; - line-height: 1.3; -} - -/* ---------- Row card (source picker list row) ---------- */ -.row-card { - width: 100%; - text-align: left; - background: transparent; - border: 0; - border-left: 2px solid transparent; - border-bottom: 0.5px solid var(--ink-5); - padding: 14px; - cursor: pointer; - display: grid; - grid-template-columns: 18px 1fr auto; - align-items: start; - column-gap: 10px; - row-gap: 4px; - transition: background 120ms var(--ease); - color: var(--ink); -} -.row-card:hover { background: var(--paper); } -.row-card--selected { - background: var(--paper-bright); - border-left-color: var(--contour-2); -} -.row-card__marker { - font-family: var(--font-mono); - font-size: 13px; - color: var(--contour-2); - margin-top: 1px; - text-align: center; -} -.row-card__marker--road { color: var(--road); } -.row-card__marker--water { color: var(--water); } -.row-card__marker--forest { color: var(--forest); } -.row-card__marker--boundary{ color: var(--boundary); } -.row-card__marker--muted { color: var(--ink-4); } -.row-card__title { - font-family: var(--font-serif); font-size: 14px; color: var(--ink); - white-space: nowrap; overflow: hidden; text-overflow: ellipsis; -} -.row-card__sub { - font-family: var(--font-mono); - font-size: 10.5px; - color: var(--ink-3); - letter-spacing: 0.04em; - margin-top: 3px; - white-space: nowrap; overflow: hidden; text-overflow: ellipsis; -} -.row-card__meta { - font-family: var(--font-mono); - font-size: 10px; - color: var(--ink-4); - letter-spacing: 0.06em; - margin-top: 4px; - display: flex; gap: 10px; flex-wrap: wrap; -} -.row-card__right { - font-family: var(--font-mono); font-size: 10px; - color: var(--ink-4); letter-spacing: 0.06em; - text-align: right; white-space: nowrap; -} -.row-card__children { - background: var(--paper-bright); - border-bottom: 0.5px solid var(--ink-5); - padding: 4px 0; -} - -/* ---------- Paper-bright card panel ---------- */ -.card-panel { - background: var(--paper-bright); - border: 0.5px solid var(--ink-5); - padding: 18px; -} - -/* ---------- Meta table ---------- */ -.meta-table { - display: grid; - grid-template-columns: 120px 1fr; - gap: 0; - width: 100%; -} -.meta-table__k { - font-family: var(--font-mono); font-size: 10.5px; - letter-spacing: 0.1em; color: var(--ink-3); text-transform: uppercase; - padding: 6px 0; - border-bottom: 0.5px solid var(--ink-5); -} -.meta-table__v { - font-family: var(--font-mono); font-size: 12px; - color: var(--ink); - padding: 6px 0; - font-variant-numeric: tabular-nums; - border-bottom: 0.5px solid var(--ink-5); - word-break: break-all; -} -.meta-table__k:last-of-type, .meta-table__v:last-of-type { border-bottom: 0; } - -/* ---------- Empty states ---------- */ -.empty { - display: flex; flex-direction: column; align-items: center; justify-content: center; - height: 100%; gap: 14px; padding: 48px; text-align: center; -} -.empty__mark { - width: 88px; height: 88px; border-radius: 999px; - border: 0.5px solid var(--contour-faint); - display: flex; align-items: center; justify-content: center; - font-family: var(--font-mono); font-size: 28px; color: var(--contour-2); - position: relative; -} -.empty__mark::after { - content: ""; position: absolute; inset: -8px; border-radius: 999px; - border: 0.5px dashed var(--contour-faint); -} -.empty__title { - font-family: var(--font-display); - font-size: 20px; color: var(--ink); -} -.empty__body { - font-family: var(--font-serif); font-size: 14px; color: var(--ink-3); - max-width: 360px; margin: 0; -} -.empty__hint { - font-family: var(--font-mono); font-size: 10px; - color: var(--ink-4); letter-spacing: 0.18em; text-transform: uppercase; - margin-top: 12px; -} - -/* ---------- Notice ---------- */ -.notice { - font-family: var(--font-serif); - font-size: 13px; - color: var(--ink-3); - padding: 12px 16px; - background: var(--paper-bright); - border: 0.5px dashed var(--contour-faint); - border-left: 2px solid var(--contour); -} - -/* ---------- Spinner ---------- */ -.spinner { - display: inline-block; - width: 10px; height: 10px; - border: 1.5px solid var(--contour-faint); - border-top-color: var(--contour-2); - border-radius: 50%; - animation: spin 0.9s linear infinite; - vertical-align: middle; -} -@keyframes spin { to { transform: rotate(360deg); } } - -/* ---------- Helpers ---------- */ -.row { display: flex; gap: 10px; align-items: center; } -.stack > * + * { margin-top: 10px; } -.spacer { flex: 1 1 auto; } -.mono { font-family: var(--font-mono); } - -/* Preview canvas */ -.preview-canvas { - border: 0.5px solid var(--ink-5); - background: var(--paper-white); - position: relative; - overflow: hidden; -} -.preview-canvas svg { width: 100%; height: 100%; display: block; } - -/* Graph-view scroll + zoom wrapper */ -.graph-scroll { - border: 0.5px solid var(--ink-5); - background: var(--paper-white); - height: 600px; - overflow: auto; - position: relative; - resize: vertical; /* let user pull the pane taller */ -} -.graph-zoom { - /* Min sizes so the scroll container doesn't collapse when the graph is - small. viz.ts sets explicit px width/height on .path-graph below. */ - min-width: 100%; - min-height: 100%; - /* Non-standard but supported across every WebKit/Chromium-based runtime - we ship against (macOS WebKit, WebView2). `zoom` rescales layout, so - the outer `.graph-scroll` sees correct content bounds. */ - zoom: var(--pg-zoom, 1); -} -/* Fallback for engines without `zoom` (Firefox, anything non-WebKit/Chromium - we might hit via `bun run dev` in a plain browser). `transform: scale` - only rescales visuals, so we inverse-compensate width/height on this - wrapper; the inner `.path-graph` has explicit px dims from dagre, and - those dims flow back up through the scaled wrapper for correct scrollbars. */ -@supports not (zoom: 2) { - .graph-zoom { - transform: scale(var(--pg-zoom, 1)); - transform-origin: 0 0; - width: calc(100% / var(--pg-zoom, 1)); - height: calc(100% / var(--pg-zoom, 1)); - } -} - -/* Zoom toolbar */ -.zoom-ctl { - display: inline-flex; - align-items: stretch; - border: 0.5px solid var(--ink-5); - border-radius: 3px; - overflow: hidden; - background: var(--paper-white); -} -.zoom-ctl__btn, -.zoom-ctl__pct { - font-family: var(--font-mono); - font-size: 11px; - letter-spacing: 0.04em; - color: var(--ink-2); - background: transparent; - border: 0; - padding: 3px 10px; - cursor: pointer; - min-width: 26px; -} -.zoom-ctl__btn:hover:not(:disabled), -.zoom-ctl__pct:hover { background: var(--paper-2); color: var(--ink); } -.zoom-ctl__btn:disabled { - color: var(--ink-5); - cursor: not-allowed; -} -.zoom-ctl__pct { - border-left: 0.5px solid var(--ink-5); - border-right: 0.5px solid var(--ink-5); - min-width: 52px; - font-variant-numeric: tabular-nums; -} - -/* Wizard split layout */ -.wizard { - display: grid; - grid-template-columns: 380px 1fr; - min-height: calc(100vh - 36px - 44px - 28px); -} -.wizard__left { - border-right: 0.5px solid var(--ink); - background: var(--paper-2); - display: grid; - grid-template-rows: auto auto auto 1fr; - min-height: 0; -} -.wizard__left-header { - padding: 16px 18px 12px; - border-bottom: 0.5px solid var(--ink-5); -} -.wizard__left-header h2 { - font-family: var(--font-display); - font-size: 17px; font-weight: 600; color: var(--ink); - margin: 2px 0 0; -} -.wizard__left-header .hint { - font-family: var(--font-mono); - font-size: 10.5px; color: var(--ink-3); - letter-spacing: 0.05em; margin-top: 4px; -} -.wizard__list { - overflow-y: auto; - min-height: 0; - background: var(--paper); -} -.wizard__right { - min-height: 0; - overflow-y: auto; - background: var(--paper); -} - -/* Preview header band */ -.preview-header { - padding: 18px 28px 14px; - border-bottom: 0.5px solid var(--ink-5); - display: grid; - grid-template-columns: 1fr auto; - align-items: end; - gap: 14px; -} -.preview-header__eyebrow { - font-family: var(--font-mono); font-size: 10px; - letter-spacing: 0.22em; text-transform: uppercase; color: var(--contour-2); -} -.preview-header__title { - font-family: var(--font-display); - font-size: 26px; font-weight: 600; color: var(--ink); - letter-spacing: -0.005em; line-height: 1.2; margin-top: 4px; -} -.preview-header__stats { - font-family: var(--font-mono); - font-size: 11px; color: var(--ink-3); - letter-spacing: 0.08em; margin-top: 6px; -} -.preview-header__actions { - display: flex; gap: 8px; align-items: center; -} - -.preview-body { - display: grid; - gap: 0; - padding: 18px 28px 28px; -} -.preview-body--split { - grid-template-columns: 380px minmax(0, 1fr); - padding: 0; -} -.preview-body--split > .preview-body__left { - padding: 18px 20px 18px 28px; - border-right: 0.5px solid var(--ink-5); - min-width: 0; /* let inner search/tree shrink instead of overflowing */ -} -.preview-body--split > .preview-body__right { - padding: 18px 28px 28px 20px; -} - -/* Step inspector panel */ -.inspector { - background: var(--paper-bright); - border: 0.5px solid var(--ink-5); - padding: 14px; -} -.inspector pre { - font-family: var(--font-mono); - font-size: 11px; - background: var(--paper-2); - border: 0.5px solid var(--ink-5); - padding: 10px; - overflow: auto; - max-height: 220px; - white-space: pre-wrap; - word-break: break-word; - margin: 6px 0; -} -.inspector__empty { - color: var(--ink-3); font-size: 13px; - font-style: italic; -} - -/* Toolbar (visualizer toggles) */ -.toolbar { - display: flex; gap: 16px; align-items: center; - padding: 10px 14px; - background: var(--paper-2); - border: 0.5px solid var(--ink-5); - flex-wrap: wrap; - margin: 10px 0; -} -.toolbar label { - display: inline-flex; gap: 6px; align-items: center; - font-family: var(--font-mono); font-size: 11px; - color: var(--ink-3); letter-spacing: 0.06em; - text-transform: uppercase; - cursor: pointer; -} -.checkbox { - width: 14px; height: 14px; - accent-color: var(--contour-2); - margin: 0; -} - -/* Contour-texture backdrop */ -.backdrop { - position: fixed; inset: 0; - background-image: url('/contour-texture.svg'); - background-size: 600px 600px; - opacity: 0.06; - pointer-events: none; - z-index: 0; -} - -::selection { background: var(--accent-wash); color: var(--ink); } -:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; } - -code { font-family: var(--font-mono); font-size: 0.92em; } - -/* Result / destination display */ -dl.dl-grid { - display: grid; - grid-template-columns: auto 1fr; - gap: 8px 16px; - margin: 14px 0; -} -dl.dl-grid dt { - font-family: var(--font-mono); font-size: 10.5px; - color: var(--ink-3); letter-spacing: 0.1em; - text-transform: uppercase; -} -dl.dl-grid dd { - margin: 0; - font-family: var(--font-mono); font-size: 12px; - color: var(--ink); - word-break: break-all; -} - -/* Live-pulse animation (upload / tracking indicators) */ -@keyframes widgetPulse { - 0% { transform: scale(1); opacity: 0.6; } - 100% { transform: scale(2.2); opacity: 0; } -} -.pulse { - position: relative; display: inline-block; - width: 10px; height: 10px; -} -.pulse::before { - content: ""; position: absolute; inset: 0; - border-radius: 999px; background: var(--road); -} -.pulse::after { - content: ""; position: absolute; inset: -4px; - border-radius: 999px; border: 1px solid var(--road); - opacity: 0.4; - animation: widgetPulse 1.6s ease-out infinite; -} -/* ─── Path graph (viz.ts) ──────────────────────────────────────────── */ -.path-graph { - position: relative; - margin: 0 auto; -} -.path-graph__edges { - position: absolute; - top: 0; left: 0; - overflow: visible; - pointer-events: none; - z-index: 1; -} -.path-graph__nodes { - position: relative; - width: 100%; - height: 100%; -} -.path-graph__empty { - color: var(--text-muted); - font-size: 13px; - padding: 20px; - text-align: center; -} -.path-graph__edge { - fill: none; - stroke: var(--text-muted); - stroke-width: 1.5; -} -.path-graph__edge--dead { - stroke: var(--danger); - stroke-dasharray: 5 3; - opacity: 0.8; -} - -/* Card — chat-shaped: speaker label on top, message text as body. */ -.pg-card { - position: absolute; - visibility: hidden; /* revealed by viz.ts after layout */ - box-sizing: border-box; - width: 300px; - background: var(--panel); - border: 1px solid var(--border); - border-left: 3px solid var(--text-muted); - border-radius: 10px; - padding: 10px 14px 10px 14px; - z-index: 2; - cursor: pointer; - font-family: var(--font-serif); - font-size: 13px; - transition: border-color 0.12s, transform 0.12s, box-shadow 0.12s; -} -.pg-card:hover { - border-color: var(--accent); -} -/* Match the chat scheme: user = warm road tint, agent = cool water tint. */ -.pg-card--role-human { - border-left-color: var(--road); - background: var(--road-wash); -} -.pg-card--role-agent { - border-left-color: var(--water); - background: var(--water-wash); -} -.pg-card--role-tool, -.pg-card--role-ci { border-left-color: var(--text-muted); } -.pg-card--dead { - border-left-color: var(--danger); - background: var(--pg-card-dead-bg); -} -.pg-card--head { - border-color: var(--accent); - box-shadow: 0 0 0 1px var(--accent-soft); -} -.pg-card--focused { - border-color: var(--accent); - box-shadow: 0 0 0 2px var(--accent-hot); -} -/* Stacked-card shadow when HEAD card has collapsed dead children. */ -.pg-card--has-hidden { - box-shadow: - 6px 6px 0 -1px var(--panel), - 6px 6px 0 0 var(--border), - 12px 12px 0 -1px var(--panel), - 12px 12px 0 0 var(--danger); -} - -.pg-card__head { - display: flex; - align-items: baseline; - gap: 8px; - margin-bottom: 6px; - font-family: var(--font-mono); - font-size: 10px; - letter-spacing: 0.14em; - text-transform: uppercase; - color: var(--ink-3); -} -.pg-card__speaker { - font-weight: 700; - color: var(--ink); - letter-spacing: 0.1em; - flex-shrink: 0; -} -.pg-card--role-human .pg-card__speaker { color: var(--road); } -.pg-card--role-agent .pg-card__speaker { color: var(--water); } -.pg-card__model { - color: var(--ink-4); - font-weight: 500; - letter-spacing: 0.06em; - text-transform: none; - flex: 1; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} -.pg-card__tool-name { - font-family: var(--font-mono); - font-size: 11.5px; - font-weight: 600; - color: var(--contour-2); - letter-spacing: 0.04em; - text-transform: none; - flex: 1; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} -.pg-card__sys-label { - font-family: var(--font-mono); - font-size: 10.5px; - color: var(--ink-3); - letter-spacing: 0.1em; - flex: 1; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} -.pg-card__chips { - display: flex; - gap: 4px; - flex-shrink: 0; -} -.pg-card__chip { - font-family: var(--font-mono); - font-size: 9px; - text-transform: uppercase; - letter-spacing: 0.12em; - padding: 1px 6px; - border-radius: 999px; - border: 0.5px solid currentColor; -} -.pg-card__chip--head { - color: var(--contour-2); - background: var(--paper-2); -} -.pg-card__chip--dead { - color: var(--danger); - background: var(--dead); -} - -/* Message body — compact markdown preview, fades out at the bottom so - any block-level content (headings, pre, lists) clips cleanly. */ -.pg-card__body { - color: var(--ink); - font-family: var(--font-serif); - font-size: 13px; - line-height: 1.5; - margin: 2px 0 0; - max-height: 160px; - overflow: hidden; - word-break: break-word; - -webkit-mask-image: linear-gradient(to bottom, #000 72%, transparent 100%); - mask-image: linear-gradient(to bottom, #000 72%, transparent 100%); -} -.pg-card__body--empty { - color: var(--ink-4); - font-style: italic; - -webkit-mask-image: none; - mask-image: none; -} - -/* "Used Read · Edit · Bash" summary chips under an assistant card. */ -.pg-card__tools { - display: flex; - flex-wrap: wrap; - gap: 4px 6px; - align-items: baseline; - margin-top: 8px; - font-family: var(--font-mono); - font-size: 9.5px; - color: var(--ink-3); -} -.pg-card__tools-label { - text-transform: uppercase; - letter-spacing: 0.14em; - color: var(--ink-4); -} -.pg-card__tool-chip { - padding: 1px 6px; - border: 0.5px solid var(--ink-5); - border-radius: 10px; - background: var(--paper-white); - color: var(--ink-2); - font-weight: 500; - letter-spacing: 0.02em; -} - -.pg-card__actor { - font-family: var(--font-mono); - font-size: 10px; - color: var(--ink-4); - letter-spacing: 0.08em; - margin-top: 6px; -} -.pg-card__ts { - font-family: var(--mono); - font-size: 10px; - color: var(--text-muted); - margin-top: 2px; -} -.pg-card__files { - font-family: var(--mono); - font-size: 10px; - color: var(--text-muted); - margin-top: 4px; - line-height: 1.35; - word-break: break-all; -} - -.pg-card__footer { - margin-top: 8px; - display: flex; - justify-content: flex-end; -} -.pg-card__toggle { - font: inherit; - font-size: 10.5px; - font-family: var(--mono); - padding: 2px 8px; - border: 1px solid var(--border); - background: var(--pg-card-toggle-bg); - color: var(--text-muted); - border-radius: 3px; - cursor: pointer; -} -.pg-card__toggle:hover { - color: var(--accent); - border-color: var(--accent); - background: var(--accent-soft); -} -.pg-card__toggle--on { - color: var(--accent); - border-color: var(--accent); - background: var(--accent-soft); -} - -/* ─── Step tree sidebar (StepTree.svelte) ──────────────────────────── */ -.step-tree { - background: var(--paper-bright); - border: 0.5px solid var(--ink-5); - display: flex; - flex-direction: column; - max-height: 440px; - min-height: 200px; -} -.step-tree__head { - padding: 10px 12px 8px; - border-bottom: 0.5px solid var(--ink-5); -} -.step-tree__title { - font-family: var(--font-mono); - font-size: 11px; - font-weight: 600; - color: var(--ink); - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} -.step-tree__sub { - font-family: var(--font-mono); - font-size: 10px; - color: var(--ink-3); - margin-top: 3px; - letter-spacing: 0.04em; -} -.step-tree__sub code { - background: var(--paper-2); - padding: 0 4px; - border-radius: 2px; -} -.step-tree__controls { - padding: 8px 10px; - border-bottom: 0.5px solid var(--ink-5); -} -.step-tree__search { - width: 100%; - padding: 4px 8px; - font-family: var(--font-mono); - font-size: 11px; - color: var(--ink); - background: var(--paper-white); - border: 0.5px solid var(--ink-5); - border-radius: 2px; -} -.step-tree__search:focus { - outline: none; - border-color: var(--contour); -} -.step-tree__filters { - display: flex; - gap: 4px; - padding: 6px 10px; - border-bottom: 0.5px solid var(--ink-5); - flex-wrap: wrap; -} -.step-tree__filter-btn { - padding: 2px 8px; - font-family: var(--font-mono); - font-size: 10px; - letter-spacing: 0.08em; - text-transform: uppercase; - background: transparent; - color: var(--ink-3); - border: 0.5px solid var(--ink-5); - border-radius: 2px; - cursor: pointer; -} -.step-tree__filter-btn:hover { - color: var(--ink); - border-color: var(--ink-4); -} -.step-tree__filter-btn--active { - background: var(--paper-2); - color: var(--ink); - border-color: var(--ink-3); -} -.step-tree__rows { - flex: 1 1 auto; - overflow-y: auto; - overflow-x: hidden; - padding: 4px 0 8px; - min-height: 0; -} -.step-tree__row { - display: flex; - align-items: baseline; - gap: 0; - width: 100%; - min-width: 0; - padding: 0 12px; - background: transparent; - border: 0; - text-align: left; - cursor: pointer; - white-space: nowrap; - font-family: var(--font-mono); - font-size: 11px; - line-height: 20px; - color: var(--ink-2); - overflow: hidden; -} -.step-tree__row:hover { background: var(--paper-2); } -.step-tree__row--active { background: var(--paper-2); } -.step-tree__row--off-head { opacity: 0.52; } -.step-tree__row--off-head:hover { opacity: 1; } -.step-tree__prefix { - color: var(--ink-5); - white-space: pre; - flex-shrink: 0; -} -.step-tree__marker { - flex-shrink: 0; - margin-right: 4px; -} -.step-tree__marker--head { color: var(--contour-2); } -.step-tree__marker--dead { color: var(--road); } -.step-tree__marker--on { color: var(--ink-4); } -.step-tree__id { - color: var(--ink-3); - margin-right: 6px; - flex-shrink: 0; -} -.step-tree__actor { - font-weight: 600; - color: var(--ink); - flex-shrink: 0; -} -.step-tree__row--role-human .step-tree__actor { color: var(--road); } -.step-tree__row--role-agent .step-tree__actor { color: var(--water); } -.step-tree__row--role-tool .step-tree__actor { color: var(--ink-3); } -.step-tree__row--role-ci .step-tree__actor { color: var(--boundary); } -.step-tree__intent { - color: var(--ink-3); - margin-left: 6px; - overflow: hidden; - text-overflow: ellipsis; - font-family: var(--font-serif); - font-size: 12px; - min-width: 0; -} -.step-tree__empty { - padding: 16px; - color: var(--ink-4); - font-size: 12px; - font-style: italic; - text-align: center; -} -.step-tree__legend { - padding: 6px 12px 8px; - border-top: 0.5px solid var(--ink-5); - font-family: var(--font-mono); - font-size: 9.5px; - letter-spacing: 0.08em; - color: var(--ink-4); - display: flex; - gap: 14px; - flex-wrap: wrap; -} - -/* ─── View-mode toggle (Chat / Graph) ─────────────────────────────── */ -.view-toggle { - display: inline-flex; - margin: 0 0 12px; - border: 0.5px solid var(--ink-5); - background: var(--paper-2); - padding: 2px; - border-radius: 3px; -} -.view-toggle__btn { - padding: 5px 14px; - font-family: var(--font-mono); - font-size: 10.5px; - letter-spacing: 0.14em; - text-transform: uppercase; - color: var(--ink-3); - background: transparent; - border: 0; - border-radius: 2px; - cursor: pointer; -} -.view-toggle__btn:hover { color: var(--ink); } -.view-toggle__btn--active { - background: var(--paper-white); - color: var(--ink); - box-shadow: 0 0 0 0.5px var(--ink-5); -} - -/* ─── Chat transcript (ChatView.svelte) ─────────────────────────────── - Modelled on Claude's native desktop chat. - — User messages: right-aligned soft card, warm paper tint, no border. - — Assistant messages: left-aligned prose, no bubble, model label above. - — Tool invocations: collapsed inline accordion, mono label. - — System / init entries: centered hairline divider. - ───────────────────────────────────────────────────────────────────── */ -.chat-view { - max-height: 720px; - overflow-y: auto; - overflow-x: hidden; - padding: 4px 6px 8px 2px; - display: flex; - flex-direction: column; - gap: 18px; -} -.chat-view__warn { - padding: 10px 14px; - border: 0.5px solid var(--road); - background: var(--road-wash); - color: var(--ink-2); - font-family: var(--font-mono); - font-size: 11.5px; - line-height: 1.5; - border-radius: 6px; - margin-bottom: 4px; -} -.chat-view__empty { - padding: 28px; - text-align: center; - color: var(--ink-3); - font-style: italic; - font-size: 13px; - border: 0.5px dashed var(--ink-5); - background: var(--paper-bright); -} - -/* Shared message basics */ -.chat-msg { - display: flex; - flex-direction: column; - cursor: pointer; - outline: none; - border-radius: 8px; - transition: background 120ms var(--ease); -} -.chat-msg:focus-visible { - box-shadow: 0 0 0 2px var(--contour-faint); -} -.chat-msg__text { - font-family: var(--font-serif); - font-size: 14.5px; - line-height: 1.6; - color: var(--ink); - white-space: pre-wrap; - word-wrap: break-word; - overflow-wrap: anywhere; -} -.chat-msg__text--empty { - color: var(--ink-4); - font-style: italic; -} -.chat-msg__meta { - display: flex; - gap: 6px; - font-family: var(--font-mono); - font-size: 9.5px; - letter-spacing: 0.1em; - text-transform: uppercase; - color: var(--ink-4); - margin-top: 4px; -} -.chat-msg__meta--left { justify-content: flex-start; } -.chat-msg__sep { color: var(--ink-5); } -.chat-msg__spacer { flex: 1; } - -/* User: right-aligned bubble */ -.chat-msg--user { - align-items: flex-end; -} -.chat-msg--user .chat-msg__bubble { - max-width: 78%; - padding: 11px 16px; - background: var(--road-wash); - border: 0.5px solid var(--road-wash); - border-radius: 14px 14px 4px 14px; - color: var(--ink); -} -.chat-msg--user .chat-msg__meta { padding-right: 6px; } -.chat-msg--user.chat-msg--active .chat-msg__bubble { - border-color: var(--road); - background: var(--paper-white); - box-shadow: 0 0 0 1px var(--road) inset; -} - -/* Assistant: left-aligned soft water-wash card. */ -.chat-msg--assistant { - align-items: flex-start; - max-width: 88%; - padding: 12px 18px 10px; - background: var(--water-wash); - border: 0.5px solid var(--water-wash); - border-radius: 14px 14px 14px 4px; - color: var(--ink); -} -.chat-msg--assistant .chat-msg__label { - font-family: var(--font-mono); - font-size: 10px; - letter-spacing: 0.18em; - text-transform: uppercase; - color: var(--water); - margin-bottom: 6px; -} -.chat-msg--assistant .chat-msg__name { font-weight: 600; } -.chat-msg--assistant .chat-msg__model { color: var(--ink-4); letter-spacing: 0.08em; } -.chat-msg--assistant .chat-msg__text { max-width: 80ch; } -.chat-msg--assistant.chat-msg--active { - border-color: var(--water); - box-shadow: 0 0 0 1px var(--water) inset; - background: var(--paper-white); -} -/* Inside a water-wash bubble, lift code/pre contrast so they read. */ -.chat-msg--assistant .markdown code, -.chat-msg--assistant .markdown pre { - background: var(--paper-white); - border-color: var(--ink-5); -} - -/* "Used X, Y, Z" summary under an assistant turn. */ -.chat-tools { - display: flex; - flex-wrap: wrap; - gap: 4px 6px; - align-items: baseline; - margin-top: 10px; - font-family: var(--font-mono); - font-size: 10px; - letter-spacing: 0.08em; - color: var(--ink-3); -} -.chat-tools__label { - text-transform: uppercase; - letter-spacing: 0.14em; - color: var(--ink-4); -} -.chat-tools__chip { - padding: 1px 7px; - border: 0.5px solid var(--ink-5); - border-radius: 10px; - background: var(--paper-2); - color: var(--ink-2); - font-weight: 500; -} - -/* Thinking block (assistant pre-thought). */ -.chat-thinking { - margin: 2px 0 10px; - border: 0.5px dashed var(--ink-5); - background: var(--paper-2); - border-radius: 6px; - padding: 0 10px; -} -.chat-thinking > summary { - cursor: pointer; - font-family: var(--font-mono); - font-size: 10.5px; - letter-spacing: 0.14em; - text-transform: uppercase; - color: var(--ink-3); - padding: 6px 0; - list-style: none; -} -.chat-thinking > summary::-webkit-details-marker { display: none; } -.chat-thinking[open] > summary { color: var(--contour-2); } -.chat-thinking__body { - font-family: var(--font-serif); - font-size: 13px; - color: var(--ink-3); - white-space: pre-wrap; - padding: 4px 0 10px; - font-style: italic; - border-top: 0.5px solid var(--ink-5); -} - -/* Tool invocation card (collapsed by default). */ -.chat-tool { - border: 0.5px solid var(--ink-5); - border-radius: 6px; - background: var(--paper-bright); - overflow: hidden; - max-width: 80ch; -} -.chat-tool--active { - border-color: var(--contour-2); - box-shadow: 0 0 0 1px var(--contour-faint); -} -.chat-tool--has-diff { - border-left: 3px solid var(--forest); -} - -/* Inline tool list inside an assistant bubble. Indented so it visually - belongs to the parent message; cards inside get a paper-white bg to - contrast against the water-wash bubble. */ -.chat-tool-list { - margin: 10px 0 0; - display: flex; - flex-direction: column; - gap: 6px; -} -.chat-tool-list .chat-tool { - background: var(--paper-white); - max-width: 100%; -} -.chat-tool__head { - display: flex; - align-items: center; - gap: 8px; - width: 100%; - padding: 8px 12px; - background: transparent; - border: 0; - cursor: pointer; - font-family: var(--font-mono); - font-size: 11px; - color: var(--ink-2); - letter-spacing: 0.06em; - text-align: left; -} -.chat-tool__head:hover { background: var(--paper-2); } -.chat-tool__caret { - color: var(--ink-4); - font-size: 10px; - width: 10px; -} -.chat-tool__name { - color: var(--contour-2); - font-weight: 600; - letter-spacing: 0.04em; -} -.chat-tool__sep { color: var(--ink-5); } -.chat-tool__actor { color: var(--ink-3); } -.chat-tool__ts { color: var(--ink-4); font-size: 10px; letter-spacing: 0.08em; } -.chat-tool__body { - border-top: 0.5px solid var(--ink-5); - padding: 10px 12px 12px; - display: flex; - flex-direction: column; - gap: 6px; -} -.chat-tool__section-label { - font-family: var(--font-mono); - font-size: 9.5px; - letter-spacing: 0.14em; - text-transform: uppercase; - color: var(--ink-4); - margin-top: 4px; -} -.chat-tool__diff { - font-family: var(--font-mono); - font-size: 11px; - background: var(--paper-2); - border: 0.5px solid var(--ink-5); - border-radius: 4px; - padding: 8px 10px; - margin: 0; - overflow: auto; - max-height: 320px; - line-height: 1.45; - color: var(--ink-2); - white-space: pre; -} -.chat-tool__diff code { font: inherit; color: inherit; background: transparent; } -.diff-line { display: block; } -.diff-line--add { color: var(--forest); background: var(--forest-wash); } -.diff-line--del { color: var(--road-2); background: var(--road-wash); } -.diff-line--hunk { color: var(--water); background: transparent; font-weight: 600; } -.diff-line--meta { color: var(--ink-4); background: transparent; } - -.chat-tool__path { - color: var(--ink-3); - font-weight: 500; - overflow: hidden; - text-overflow: ellipsis; - max-width: 240px; - white-space: nowrap; -} - -.chat-tool__pre { - font-family: var(--font-mono); - font-size: 11px; - background: var(--paper-2); - border: 0.5px solid var(--ink-5); - border-radius: 4px; - padding: 8px 10px; - margin: 0; - overflow: auto; - max-height: 220px; - white-space: pre-wrap; - word-break: break-word; - color: var(--ink-2); -} -.chat-tool__empty { - color: var(--ink-4); - font-size: 11px; - font-style: italic; -} -.chat-tool__inspect { - background: transparent; - border: 0.5px solid var(--ink-5); - color: var(--ink-3); - padding: 3px 10px; - font-family: var(--font-mono); - font-size: 10px; - letter-spacing: 0.1em; - text-transform: uppercase; - border-radius: 3px; - cursor: pointer; -} -.chat-tool__inspect:hover { - color: var(--contour-2); - border-color: var(--contour-2); - background: var(--paper-2); -} - -/* ─── Markdown prose (chat bodies) ───────────────────────────────── */ -.markdown { - /* Override ChatView's pre-wrap so block elements flow naturally. */ - white-space: normal; -} -.markdown > :first-child { margin-top: 0; } -.markdown > :last-child { margin-bottom: 0; } -.markdown p { - margin: 0 0 10px; - line-height: 1.6; -} -.markdown p:last-child { margin-bottom: 0; } -.markdown h1, -.markdown h2, -.markdown h3, -.markdown h4, -.markdown h5, -.markdown h6 { - font-family: var(--font-display); - font-weight: 700; - letter-spacing: -0.005em; - color: var(--ink); - margin: 16px 0 8px; - line-height: 1.25; -} -.markdown h1 { font-size: 22px; } -.markdown h2 { font-size: 18px; } -.markdown h3 { font-size: 16px; } -.markdown h4 { font-size: 14.5px; font-weight: 600; } -.markdown h5, -.markdown h6 { font-size: 13px; font-weight: 600; color: var(--ink-2); } -.markdown strong { font-weight: 700; color: var(--ink); } -.markdown em { font-style: italic; } -.markdown a { - color: var(--road); - text-decoration: underline; - text-decoration-color: var(--road-wash); - text-underline-offset: 2px; -} -.markdown a:hover { - text-decoration-color: var(--road); -} -.markdown ul, -.markdown ol { - margin: 6px 0 10px; - padding-left: 24px; -} -.markdown li { margin: 2px 0; line-height: 1.55; } -.markdown li > p { margin-bottom: 4px; } -.markdown ul > li { list-style-type: disc; } -.markdown ol > li { list-style-type: decimal; } -.markdown ul ul > li { list-style-type: circle; } -.markdown blockquote { - margin: 8px 0; - padding: 4px 12px; - border-left: 3px solid var(--contour-faint); - background: var(--paper-2); - color: var(--ink-2); - font-style: italic; -} -.markdown hr { - border: 0; - border-top: 0.5px solid var(--ink-5); - margin: 14px 0; -} -.markdown code { - font-family: var(--font-mono); - font-size: 0.88em; - background: var(--paper-2); - border: 0.5px solid var(--ink-5); - padding: 0.5px 5px; - border-radius: 3px; - color: var(--ink-2); - white-space: break-spaces; -} -.markdown pre { - font-family: var(--font-mono); - font-size: 12px; - background: var(--paper-2); - border: 0.5px solid var(--ink-5); - border-radius: 6px; - padding: 10px 12px; - margin: 8px 0; - overflow: auto; - max-height: 380px; - line-height: 1.5; - color: var(--ink); -} -.markdown pre > code { - background: transparent; - border: 0; - padding: 0; - border-radius: 0; - color: inherit; - font-size: inherit; - white-space: pre; -} -.markdown table { - border-collapse: collapse; - margin: 8px 0; - font-size: 12.5px; - width: auto; - max-width: 100%; - overflow: auto; - display: block; -} -.markdown th, -.markdown td { - border: 0.5px solid var(--ink-5); - padding: 4px 10px; - text-align: left; -} -.markdown th { - background: var(--paper-2); - font-weight: 600; - font-family: var(--font-sans); - letter-spacing: 0.04em; -} -.markdown img { - max-width: 100%; - border-radius: 4px; - border: 0.5px solid var(--ink-5); -} - -/* Tune user bubble so pre/code have contrast inside the warm tint. */ -.chat-msg--user .markdown code, -.chat-msg--user .markdown pre { - background: var(--paper-white); - border-color: var(--ink-5); -} - -/* Compact markdown — used inside graph-view cards where real estate is - tight and headings/code-blocks need to stay on scale with body text. */ -.markdown--compact { font-size: 12.5px; line-height: 1.45; } -.markdown--compact p { margin: 0 0 6px; } -.markdown--compact h1, -.markdown--compact h2, -.markdown--compact h3, -.markdown--compact h4, -.markdown--compact h5, -.markdown--compact h6 { - margin: 6px 0 3px; - font-size: 13px; - font-weight: 600; - font-family: var(--font-display); -} -.markdown--compact h1 { font-size: 14px; } -.markdown--compact ul, -.markdown--compact ol { margin: 2px 0 6px; padding-left: 18px; } -.markdown--compact li { margin: 0; line-height: 1.4; } -.markdown--compact blockquote { - margin: 4px 0; padding: 2px 8px; font-size: 12px; -} -.markdown--compact hr { margin: 6px 0; } -.markdown--compact code { - font-size: 0.85em; - padding: 0 4px; -} -.markdown--compact pre { - font-size: 10.5px; - padding: 6px 8px; - margin: 4px 0; - max-height: 90px; - line-height: 1.35; - border-radius: 4px; -} -.markdown--compact table { font-size: 11px; } -.markdown--compact th, -.markdown--compact td { padding: 2px 6px; } - -/* Centered hairline divider for system/init/event rows. */ -.chat-divider { - display: flex; - align-items: center; - gap: 10px; - cursor: pointer; - padding: 2px 0; - outline: none; -} -.chat-divider:focus-visible .chat-divider__label { - color: var(--contour-2); -} -.chat-divider__line { - flex: 1; - height: 0; - border-top: 0.5px solid var(--ink-5); -} -.chat-divider__label { - font-family: var(--font-mono); - font-size: 9.5px; - letter-spacing: 0.16em; - text-transform: uppercase; - color: var(--ink-4); - white-space: nowrap; -} diff --git a/crates/toolpath-desktop/frontend/svelte.config.js b/crates/toolpath-desktop/frontend/svelte.config.js deleted file mode 100644 index 8bda965..0000000 --- a/crates/toolpath-desktop/frontend/svelte.config.js +++ /dev/null @@ -1,8 +0,0 @@ -import { vitePreprocess } from "@sveltejs/vite-plugin-svelte"; - -export default { - preprocess: vitePreprocess(), - compilerOptions: { - runes: true, - }, -}; diff --git a/crates/toolpath-desktop/frontend/tsconfig.json b/crates/toolpath-desktop/frontend/tsconfig.json deleted file mode 100644 index d409648..0000000 --- a/crates/toolpath-desktop/frontend/tsconfig.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "extends": "@tsconfig/svelte/tsconfig.json", - "compilerOptions": { - "target": "ES2022", - "module": "ESNext", - "moduleResolution": "bundler", - "resolveJsonModule": true, - "allowSyntheticDefaultImports": true, - "strict": true, - "noImplicitAny": true, - "noUnusedLocals": false, - "skipLibCheck": true, - "isolatedModules": true, - "verbatimModuleSyntax": true, - "lib": ["ES2022", "DOM", "DOM.Iterable"], - "types": ["svelte", "vite/client"] - }, - "include": ["src/**/*.ts", "src/**/*.svelte"], - "exclude": ["src/lib/__bench__/**"] -} diff --git a/crates/toolpath-desktop/frontend/vite.config.ts b/crates/toolpath-desktop/frontend/vite.config.ts deleted file mode 100644 index 47b98b4..0000000 --- a/crates/toolpath-desktop/frontend/vite.config.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { defineConfig } from "vite"; -import { svelte } from "@sveltejs/vite-plugin-svelte"; -import { resolve } from "node:path"; - -// Tauri expects a fixed port; strictPort = fail if taken rather than pick -// another one behind its back. -const HOST = "127.0.0.1"; -const PORT = 1420; - -export default defineConfig({ - plugins: [svelte()], - clearScreen: false, - server: { - host: HOST, - port: PORT, - strictPort: true, - hmr: { protocol: "ws", host: HOST, port: PORT + 1 }, - watch: { - // Don't let Vite re-scan the Rust side. - ignored: ["**/src-tauri/**", "**/target/**"], - }, - }, - build: { - target: "es2022", - // Tauri bundles the assets; a single-chunk build keeps the devtools - // panel readable and avoids weird code-splitting behaviour in the - // webview. - chunkSizeWarningLimit: 1500, - rollupOptions: { - // Two HTML entries: the main window (index.html) and the tray popover - // (popover.html). Both are bundled into frontend/dist by Tauri. - input: { - main: resolve(__dirname, "index.html"), - popover: resolve(__dirname, "popover.html"), - }, - }, - }, -}); diff --git a/crates/toolpath-desktop/frontend/vitest.config.ts b/crates/toolpath-desktop/frontend/vitest.config.ts deleted file mode 100644 index 23913e6..0000000 --- a/crates/toolpath-desktop/frontend/vitest.config.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { defineConfig } from "vitest/config"; - -// Pure-TS unit tests for the lib modules. No Svelte component tests, no -// DOM — the two modules we test (`classify.ts`, `tree.ts`) operate on -// plain data shapes, so the Node environment is sufficient. -export default defineConfig({ - test: { - environment: "node", - include: ["src/**/*.test.ts"], - }, -}); diff --git a/crates/toolpath-desktop/icons/icon.png b/crates/toolpath-desktop/icons/icon.png deleted file mode 100644 index 5fad9d9..0000000 Binary files a/crates/toolpath-desktop/icons/icon.png and /dev/null differ diff --git a/crates/toolpath-desktop/package.json b/crates/toolpath-desktop/package.json deleted file mode 100644 index df8568a..0000000 --- a/crates/toolpath-desktop/package.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "dependencies": { - "vite": "^8.0.9" - } -} \ No newline at end of file diff --git a/crates/toolpath-desktop/src/commands/derive.rs b/crates/toolpath-desktop/src/commands/derive.rs deleted file mode 100644 index c58793a..0000000 --- a/crates/toolpath-desktop/src/commands/derive.rs +++ /dev/null @@ -1,199 +0,0 @@ -use serde_json::Value; - -use crate::commands::keychain; -use crate::error::{DesktopError, DesktopResult}; - -/// Serialise a `Document` through its JSON form so the frontend receives it as -/// a plain value without us manually reimplementing every type. -fn document_to_value(doc: &toolpath::v1::Document) -> DesktopResult { - let json = doc - .to_json() - .map_err(|e| DesktopError::Derive(format!("serialize document: {e}")))?; - Ok(serde_json::from_str(&json)?) -} - -#[tauri::command] -pub fn derive_claude( - project_path: String, - session_ids: Vec, - include_thinking: bool, -) -> DesktopResult { - if session_ids.is_empty() { - return Err(DesktopError::InvalidInput( - "at least one session ID is required".into(), - )); - } - - let manager = toolpath_claude::ClaudeConvo::new(); - let config = toolpath_claude::derive::DeriveConfig { - project_path: Some(project_path.clone()), - include_thinking, - }; - - let mut paths = Vec::with_capacity(session_ids.len()); - for session_id in &session_ids { - let convo = manager - .read_conversation(&project_path, session_id) - .map_err(|e| DesktopError::Derive(format!("read {session_id}: {e}")))?; - paths.push(toolpath_claude::derive::derive_path(&convo, &config)); - } - - let document = if paths.len() == 1 { - toolpath::v1::Document::Path(paths.pop().unwrap()) - } else { - // Multiple sessions selected -> produce a Graph wrapping each Path. - let graph = toolpath::v1::Graph { - graph: toolpath::v1::GraphIdentity { - id: format!("graph-claude-{}", uuid_suffix()), - }, - paths: paths - .into_iter() - .map(|p| toolpath::v1::PathOrRef::Path(Box::new(p))) - .collect(), - meta: Some(toolpath::v1::GraphMeta { - title: Some(format!("Claude sessions from {project_path}")), - ..Default::default() - }), - }; - toolpath::v1::Document::Graph(graph) - }; - - document_to_value(&document) -} - -#[tauri::command] -pub fn derive_pi( - project_path: String, - session_ids: Vec, - include_thinking: bool, -) -> DesktopResult { - if session_ids.is_empty() { - return Err(DesktopError::InvalidInput( - "at least one session ID is required".into(), - )); - } - - let manager = toolpath_pi::PiConvo::new(); - let config = toolpath_pi::DeriveConfig { - include_thinking, - ..Default::default() - }; - - let mut paths = Vec::with_capacity(session_ids.len()); - for session_id in &session_ids { - let session = manager - .read_session(&project_path, session_id) - .map_err(|e| DesktopError::Derive(format!("read {session_id}: {e}")))?; - paths.push(toolpath_pi::derive_path(&session, &config)); - } - - let document = if paths.len() == 1 { - toolpath::v1::Document::Path(paths.pop().unwrap()) - } else { - let graph = toolpath::v1::Graph { - graph: toolpath::v1::GraphIdentity { - id: format!("graph-pi-{}", uuid_suffix()), - }, - paths: paths - .into_iter() - .map(|p| toolpath::v1::PathOrRef::Path(Box::new(p))) - .collect(), - meta: Some(toolpath::v1::GraphMeta { - title: Some(format!("pi.dev sessions from {project_path}")), - ..Default::default() - }), - }; - toolpath::v1::Document::Graph(graph) - }; - - document_to_value(&document) -} - -#[tauri::command] -pub fn derive_git(repo_path: String, branch: String, base: Option) -> DesktopResult { - if branch.is_empty() { - return Err(DesktopError::InvalidInput("branch is required".into())); - } - let repo = git2::Repository::open(&repo_path) - .map_err(|e| DesktopError::Derive(format!("open repo {repo_path}: {e}")))?; - - let config = toolpath_git::DeriveConfig { - remote: "origin".to_string(), - title: None, - base, - }; - - let document = toolpath_git::derive(&repo, std::slice::from_ref(&branch), &config) - .map_err(|e| DesktopError::Derive(format!("derive git: {e:#}")))?; - - document_to_value(&document) -} - -#[tauri::command] -pub fn derive_github( - pr_url: String, - include_ci: bool, - include_comments: bool, -) -> DesktopResult { - let parsed = toolpath_github::parse_pr_url(&pr_url).ok_or_else(|| { - DesktopError::InvalidInput( - "invalid PR URL; expected https://github.com/owner/repo/pull/N".into(), - ) - })?; - - let token = keychain::read_github_token() - .map_err(|e| DesktopError::Auth(format!("no GitHub token configured: {e}")))?; - - let config = toolpath_github::DeriveConfig { - token, - include_ci, - include_comments, - ..Default::default() - }; - - let path = - toolpath_github::derive_pull_request(&parsed.owner, &parsed.repo, parsed.number, &config) - .map_err(|e| DesktopError::Derive(format!("derive github: {e:#}")))?; - - document_to_value(&toolpath::v1::Document::Path(path)) -} - -fn uuid_suffix() -> String { - uuid::Uuid::new_v4().to_string().chars().take(8).collect() -} - -#[cfg(test)] -mod tests { - use super::*; - use tempfile::tempdir; - - #[test] - fn derive_claude_rejects_empty_selection() { - let err = derive_claude("/nowhere".into(), vec![], false).unwrap_err(); - assert!(matches!(err, DesktopError::InvalidInput(_))); - } - - #[test] - fn derive_git_rejects_missing_branch() { - let err = derive_git("/tmp".into(), String::new(), None).unwrap_err(); - assert!(matches!(err, DesktopError::InvalidInput(_))); - } - - #[test] - fn derive_git_rejects_bad_repo() { - let dir = tempdir().unwrap(); - let err = derive_git( - dir.path().to_string_lossy().into_owned(), - "main".into(), - None, - ) - .unwrap_err(); - assert!(matches!(err, DesktopError::Derive(_))); - } - - #[test] - fn derive_github_rejects_bad_url() { - let err = derive_github("not a url".into(), true, true).unwrap_err(); - assert!(matches!(err, DesktopError::InvalidInput(_))); - } -} diff --git a/crates/toolpath-desktop/src/commands/export.rs b/crates/toolpath-desktop/src/commands/export.rs deleted file mode 100644 index 01ecf17..0000000 --- a/crates/toolpath-desktop/src/commands/export.rs +++ /dev/null @@ -1,98 +0,0 @@ -use serde_json::Value; -use std::path::PathBuf; - -use crate::error::{DesktopError, DesktopResult}; - -/// Write a Toolpath document to disk as pretty-printed JSON. -/// -/// The frontend is responsible for prompting the user with a save dialog -/// (via `@tauri-apps/plugin-dialog`) and passing us the chosen absolute path -/// plus the derived document as a JSON value. We parse it back through the -/// `Document` type so bad payloads are rejected before touching the -/// filesystem. -#[tauri::command] -pub fn save_document(document: Value, out_path: String) -> DesktopResult { - if out_path.is_empty() { - return Err(DesktopError::InvalidInput("out_path is empty".into())); - } - - // Round-trip through Document to enforce schema-shape at the boundary. - let json = serde_json::to_string(&document)?; - let doc = toolpath::v1::Document::from_json(&json) - .map_err(|e| DesktopError::InvalidInput(format!("invalid document: {e}")))?; - let pretty = doc - .to_json_pretty() - .map_err(|e| DesktopError::Io(format!("serialize: {e}")))?; - - let path = PathBuf::from(&out_path); - if let Some(parent) = path.parent() - && !parent.as_os_str().is_empty() - { - std::fs::create_dir_all(parent)?; - } - std::fs::write(&path, pretty)?; - - Ok(path.to_string_lossy().into_owned()) -} - -#[cfg(test)] -mod tests { - use super::*; - - fn minimal_document() -> Value { - serde_json::json!({ - "Path": { - "path": { - "id": "p1", - "head": "s1" - }, - "steps": [{ - "step": { - "id": "s1", - "actor": "human:tester", - "timestamp": "2024-01-01T00:00:00Z" - }, - "change": { - "file.txt": { "raw": "@@ -0,0 +1 @@\n+hi\n" } - } - }] - } - }) - } - - #[test] - fn save_document_writes_pretty_json() { - let dir = tempfile::tempdir().unwrap(); - let path = dir.path().join("out.path.json"); - let written = - save_document(minimal_document(), path.to_string_lossy().into_owned()).expect("save"); - let body = std::fs::read_to_string(&written).unwrap(); - // Pretty output uses indentation. - assert!(body.contains(" \"path\"")); - // Round-trips through Document. - let doc = toolpath::v1::Document::from_json(&body).expect("parse"); - match doc { - toolpath::v1::Document::Path(p) => { - assert_eq!(p.path.id, "p1"); - assert_eq!(p.path.head, "s1"); - } - _ => panic!("expected Path"), - } - } - - #[test] - fn save_document_rejects_empty_path() { - let err = save_document(minimal_document(), String::new()).unwrap_err(); - assert!(matches!(err, DesktopError::InvalidInput(_))); - } - - #[test] - fn save_document_rejects_invalid_payload() { - let err = save_document( - serde_json::json!({ "nonsense": true }), - "/tmp/should-not-be-written".into(), - ) - .unwrap_err(); - assert!(matches!(err, DesktopError::InvalidInput(_))); - } -} diff --git a/crates/toolpath-desktop/src/commands/keychain.rs b/crates/toolpath-desktop/src/commands/keychain.rs deleted file mode 100644 index 51a1bc6..0000000 --- a/crates/toolpath-desktop/src/commands/keychain.rs +++ /dev/null @@ -1,64 +0,0 @@ -use crate::error::{DesktopError, DesktopResult}; - -const SERVICE: &str = "dev.pathbase.toolpath-desktop"; -const ACCOUNT: &str = "github-pat"; - -fn entry() -> DesktopResult { - keyring::Entry::new(SERVICE, ACCOUNT) - .map_err(|e| DesktopError::Keychain(format!("open entry: {e}"))) -} - -/// Backend-only helper used by `derive::derive_github`. Not exposed to the -/// frontend because we never want a raw token crossing the IPC boundary. -pub(crate) fn read_github_token() -> DesktopResult { - let entry = entry()?; - match entry.get_password() { - Ok(tok) if !tok.is_empty() => Ok(tok), - Ok(_) => Err(DesktopError::Auth("GitHub token is empty".into())), - Err(keyring::Error::NoEntry) => Err(DesktopError::Auth("GitHub token not set".into())), - Err(e) => Err(DesktopError::Keychain(format!("read: {e}"))), - } -} - -#[tauri::command] -pub fn github_set_token(token: String) -> DesktopResult<()> { - if token.trim().is_empty() { - return Err(DesktopError::InvalidInput("token is empty".into())); - } - let entry = entry()?; - entry - .set_password(token.trim()) - .map_err(|e| DesktopError::Keychain(format!("write: {e}")))?; - Ok(()) -} - -#[tauri::command] -pub fn github_has_token() -> DesktopResult { - let entry = entry()?; - match entry.get_password() { - Ok(tok) => Ok(!tok.is_empty()), - Err(keyring::Error::NoEntry) => Ok(false), - Err(e) => Err(DesktopError::Keychain(format!("probe: {e}"))), - } -} - -#[tauri::command] -pub fn github_clear_token() -> DesktopResult<()> { - let entry = entry()?; - match entry.delete_credential() { - Ok(()) => Ok(()), - Err(keyring::Error::NoEntry) => Ok(()), - Err(e) => Err(DesktopError::Keychain(format!("delete: {e}"))), - } -} - -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn set_token_rejects_empty_string() { - let err = github_set_token(" ".into()).unwrap_err(); - assert!(matches!(err, DesktopError::InvalidInput(_))); - } -} diff --git a/crates/toolpath-desktop/src/commands/mod.rs b/crates/toolpath-desktop/src/commands/mod.rs deleted file mode 100644 index 6237393..0000000 --- a/crates/toolpath-desktop/src/commands/mod.rs +++ /dev/null @@ -1,5 +0,0 @@ -pub mod derive; -pub mod export; -pub mod keychain; -pub mod sources; -pub mod upload; diff --git a/crates/toolpath-desktop/src/commands/sources.rs b/crates/toolpath-desktop/src/commands/sources.rs deleted file mode 100644 index 1271271..0000000 --- a/crates/toolpath-desktop/src/commands/sources.rs +++ /dev/null @@ -1,564 +0,0 @@ -use serde::Serialize; -use std::path::PathBuf; -use tauri::{AppHandle, Emitter}; - -use crate::error::{DesktopError, DesktopResult}; - -/// A Claude Code project as listed for the source browser. -#[derive(Debug, Clone, Serialize)] -pub struct ClaudeProjectSummary { - /// Original project path (e.g. `/Users/alex/myproject`). - pub project_path: String, - /// Friendly display name (basename of the project path). - pub display_name: String, - /// Number of logical conversations (chain heads) found for this project. - pub session_count: usize, - /// Timestamp of the most recent activity across all sessions, if known. - pub last_activity: Option, -} - -/// A single conversation shown in the session picker. -#[derive(Debug, Clone, Serialize)] -pub struct ClaudeSessionSummary { - /// Chain-head session ID. - pub session_id: String, - /// Short title derived from the first user message (truncated). - pub title: Option, - /// Total turn count across the chain. - pub turn_count: usize, - /// ISO 8601 timestamp of the first entry. - pub started_at: Option, - /// ISO 8601 timestamp of the most recent entry. - pub last_activity: Option, -} - -/// One branch entry shown in the git picker. -#[derive(Debug, Clone, Serialize)] -pub struct GitBranchSummary { - pub name: String, - pub head_short: String, - pub subject: String, - pub author: String, - pub timestamp: String, -} - -fn claude_manager() -> toolpath_claude::ClaudeConvo { - toolpath_claude::ClaudeConvo::new() -} - -/// Cheap recency hint for a Claude project: max mtime across its `.jsonl` -/// files, formatted RFC3339. Stat-only — no JSONL parsing. -fn newest_jsonl_mtime( - manager: &toolpath_claude::ClaudeConvo, - project_path: &str, -) -> Option { - let dir = manager.resolver().project_dir(project_path).ok()?; - let entries = std::fs::read_dir(&dir).ok()?; - let mut newest: Option = None; - for entry in entries.flatten() { - let path = entry.path(); - if path.extension().and_then(|e| e.to_str()) != Some("jsonl") { - continue; - } - if let Ok(modified) = entry.metadata().and_then(|m| m.modified()) { - if newest.is_none_or(|prev| modified > prev) { - newest = Some(modified); - } - } - } - newest.map(|t| chrono::DateTime::::from(t).to_rfc3339()) -} - -#[tauri::command] -pub fn list_claude_projects() -> DesktopResult> { - let manager = claude_manager(); - if !manager.exists() { - return Ok(Vec::new()); - } - - let project_paths = manager - .list_projects() - .map_err(|e| DesktopError::Source(format!("list projects: {e}")))?; - - let mut out = Vec::with_capacity(project_paths.len()); - for project_path in project_paths { - let display_name = PathBuf::from(&project_path) - .file_name() - .and_then(|s| s.to_str().map(|s| s.to_string())) - .unwrap_or_else(|| project_path.clone()); - - // list_conversation_metadata is sorted most-recent-first; use - // its length for session count and the first entry's timestamp - // for last_activity. Skip projects we can't read rather than failing - // the whole call (a single bad project shouldn't hide the rest). - let (session_count, last_activity) = match manager.list_conversation_metadata(&project_path) - { - Ok(metas) => { - let last = metas - .first() - .and_then(|m| m.last_activity) - .map(|t| t.to_rfc3339()); - (metas.len(), last) - } - Err(_) => (0, None), - }; - - out.push(ClaudeProjectSummary { - project_path, - display_name, - session_count, - last_activity, - }); - } - - // Most recently active projects first. - out.sort_by(|a, b| b.last_activity.cmp(&a.last_activity)); - Ok(out) -} - -#[tauri::command] -pub fn list_claude_sessions(project_path: String) -> DesktopResult> { - let manager = claude_manager(); - let metadata = manager - .list_conversation_metadata(&project_path) - .map_err(|e| DesktopError::Source(format!("list sessions: {e}")))?; - - let mut out = Vec::with_capacity(metadata.len()); - for meta in metadata { - let title = manager - .read_conversation(&project_path, &meta.session_id) - .ok() - .and_then(|c| c.title(80)); - - out.push(ClaudeSessionSummary { - session_id: meta.session_id, - title, - turn_count: meta.message_count, - started_at: meta.started_at.map(|t| t.to_rfc3339()), - last_activity: meta.last_activity.map(|t| t.to_rfc3339()), - }); - } - Ok(out) -} - -/// Status of an AI-agent integration on this machine. -/// -/// Serialised as `kebab-case` so the frontend branches on plain strings. -#[derive(Debug, Clone, Copy, Serialize)] -#[serde(rename_all = "kebab-case")] -#[allow(dead_code)] // ComingSoon is used for future agents that haven't landed yet. -pub enum AgentStatus { - /// Detected on disk and usable right now. - Available, - /// Known integration, but no data / tooling detected. - Unavailable, - /// Support in development — not yet wired up. - ComingSoon, -} - -/// Top-level agent entry shown on the "Agents" picker. -#[derive(Debug, Clone, Serialize)] -pub struct AgentSummary { - /// Stable identifier used in navigation and as a routing key. - pub id: String, - /// Display name. - pub name: String, - /// One-line blurb — what this agent is. - pub tagline: String, - pub status: AgentStatus, - /// Human-readable note. For `Unavailable`: why not. For `ComingSoon`: - /// what's in flight. `None` when `Available` with nothing to add. - pub reason: Option, - /// Absolute path where this agent's data lives, when known. - pub data_path: Option, -} - -/// Enumerate known agent integrations + auto-detect which are usable. -/// -/// New entries are added here as agent support lands. The list is small -/// enough that a stream variant isn't worth it — the whole thing serialises -/// in under a millisecond. -#[tauri::command] -pub fn list_agents() -> DesktopResult> { - let manager = claude_manager(); - let claude_available = manager.exists(); - let claude_path = manager - .claude_dir_path() - .ok() - .map(|p| p.to_string_lossy().into_owned()); - - Ok(vec![ - AgentSummary { - id: "claude-code".into(), - name: "Claude Code".into(), - tagline: "Anthropic's terminal-native coding agent.".into(), - status: if claude_available { - AgentStatus::Available - } else { - AgentStatus::Unavailable - }, - reason: if claude_available { - None - } else { - Some( - "No ~/.claude directory found — use Claude Code at least once and try again." - .into(), - ) - }, - data_path: claude_path, - }, - { - let pi = toolpath_pi::PiConvo::new(); - let pi_available = pi.exists(); - let pi_path = std::path::PathBuf::from(std::env::var("HOME").unwrap_or_default()) - .join(".pi/agent/sessions"); - AgentSummary { - id: "pi-dev".into(), - name: "pi.dev".into(), - tagline: "pi.dev agent session traces.".into(), - status: if pi_available { - AgentStatus::Available - } else { - AgentStatus::Unavailable - }, - reason: if pi_available { - None - } else { - Some( - "No ~/.pi/agent/sessions directory found — run a pi.dev session and try again." - .into(), - ) - }, - data_path: pi_available.then(|| pi_path.to_string_lossy().into_owned()), - } - }, - ]) -} - -/// Minimal per-project payload emitted from [`list_claude_projects_stream`]. -/// -/// Only cheap-to-compute fields: display name, a file-count proxy for session -/// count, and a stat-based recency hint (max mtime across the project's JSONL -/// files). Avoids per-session JSONL parsing. -#[derive(Debug, Clone, Serialize)] -pub struct ClaudeProjectQuick { - pub project_path: String, - pub display_name: String, - pub session_count: usize, - pub last_activity: Option, -} - -/// Streaming variant of [`list_claude_projects`]. -/// -/// Emits one `claude:project` event per project as its cheap data becomes -/// available, then a terminal `claude:projects-done` event. The work runs -/// on Tauri's command worker pool — it's synchronous from the command's -/// perspective, so a panic turns into a rejected invoke instead of vanishing. -/// -/// Frontend must subscribe to the events before invoking. -#[tauri::command] -pub fn list_claude_projects_stream(app: AppHandle) -> DesktopResult<()> { - let manager = claude_manager(); - if !manager.exists() { - let _ = app.emit("claude:projects-done", ()); - return Ok(()); - } - - let paths = match manager.list_projects() { - Ok(p) => p, - Err(e) => { - let _ = app.emit("claude:projects-error", format!("list projects: {e}")); - let _ = app.emit("claude:projects-done", ()); - return Ok(()); - } - }; - - for path in paths { - let display_name = PathBuf::from(&path) - .file_name() - .and_then(|s| s.to_str().map(|s| s.to_string())) - .unwrap_or_else(|| path.clone()); - - // Chain heads only — cheap directory walk + chain index lookup, - // no per-session JSONL parsing. - let session_count = manager - .list_conversations(&path) - .map(|v| v.len()) - .unwrap_or(0); - - let last_activity = newest_jsonl_mtime(&manager, &path); - - let _ = app.emit( - "claude:project", - ClaudeProjectQuick { - project_path: path, - display_name, - session_count, - last_activity, - }, - ); - } - - let _ = app.emit("claude:projects-done", ()); - Ok(()) -} - -/// Per-session payload emitted from [`list_claude_sessions_stream`]. -/// -/// Mirrors [`ClaudeSessionSummary`] but without the expensive `title` field. -/// Frontends can fetch titles lazily for sessions the user hovers or -/// explicitly selects. -#[derive(Debug, Clone, Serialize)] -pub struct ClaudeSessionQuick { - pub project_path: String, - pub session_id: String, - pub turn_count: usize, - pub started_at: Option, - pub last_activity: Option, -} - -/// Streaming variant of [`list_claude_sessions`]. -/// -/// Emits one `claude:session` per session (metadata only, no title), then a -/// terminal `claude:sessions-done` event with the project path as payload so -/// the frontend can match the completion to the right project. -#[tauri::command] -pub fn list_claude_sessions_stream(app: AppHandle, project_path: String) -> DesktopResult<()> { - let manager = claude_manager(); - match manager.list_conversation_metadata(&project_path) { - Ok(metadata) => { - for meta in metadata { - let payload = ClaudeSessionQuick { - project_path: project_path.clone(), - session_id: meta.session_id, - turn_count: meta.message_count, - started_at: meta.started_at.map(|t| t.to_rfc3339()), - last_activity: meta.last_activity.map(|t| t.to_rfc3339()), - }; - let _ = app.emit("claude:session", payload); - } - } - Err(e) => { - let _ = app.emit( - "claude:sessions-error", - format!("list sessions for {project_path}: {e}"), - ); - } - } - let _ = app.emit("claude:sessions-done", project_path); - Ok(()) -} - -/// Fetch the first-user-message title for a single session. -/// -/// Requires reading the full JSONL, so it's deliberately split out from the -/// session-list stream. Call lazily (e.g. on hover) or in a background pass -/// after the session list has rendered. -#[tauri::command] -pub fn claude_session_title( - project_path: String, - session_id: String, -) -> DesktopResult> { - let manager = claude_manager(); - let convo = manager - .read_conversation(&project_path, &session_id) - .map_err(|e| DesktopError::Source(format!("read {session_id}: {e}")))?; - Ok(convo.title(80)) -} - -/// Fetch a human-readable label for a project: the title of its most-recent -/// session. Called lazily per-project after [`list_claude_projects_stream`] -/// emits, so the project list paints fast and the titles fill in after. -#[tauri::command] -pub fn claude_project_latest_title(project_path: String) -> DesktopResult> { - let manager = claude_manager(); - let metadata = manager - .list_conversation_metadata(&project_path) - .map_err(|e| DesktopError::Source(format!("list sessions: {e}")))?; - let Some(head) = metadata.into_iter().next() else { - return Ok(None); - }; - let convo = manager - .read_conversation(&project_path, &head.session_id) - .map_err(|e| DesktopError::Source(format!("read {}: {e}", head.session_id)))?; - Ok(convo.title(80)) -} - -// ─── pi.dev ────────────────────────────────────────────────────────────── - -fn pi_manager() -> toolpath_pi::PiConvo { - toolpath_pi::PiConvo::new() -} - -#[derive(Debug, Clone, Serialize)] -pub struct PiProjectQuick { - pub project_path: String, - pub display_name: String, - pub session_count: usize, -} - -#[derive(Debug, Clone, Serialize)] -pub struct PiSessionQuick { - pub project_path: String, - pub session_id: String, - pub entry_count: usize, - pub timestamp: String, -} - -/// Streaming variant of pi.dev project listing. -#[tauri::command] -pub fn list_pi_projects_stream(app: AppHandle) -> DesktopResult<()> { - let manager = pi_manager(); - if !manager.exists() { - let _ = app.emit("pi:projects-done", ()); - return Ok(()); - } - - let projects = match manager.list_projects() { - Ok(p) => p, - Err(e) => { - let _ = app.emit("pi:projects-error", format!("list projects: {e}")); - let _ = app.emit("pi:projects-done", ()); - return Ok(()); - } - }; - - for project in projects { - let display_name = project.clone(); - let session_count = manager - .list_sessions(&project) - .map(|v| v.len()) - .unwrap_or(0); - let _ = app.emit( - "pi:project", - PiProjectQuick { - project_path: project, - display_name, - session_count, - }, - ); - } - - let _ = app.emit("pi:projects-done", ()); - Ok(()) -} - -/// Streaming variant of pi.dev session listing. -#[tauri::command] -pub fn list_pi_sessions_stream(app: AppHandle, project_path: String) -> DesktopResult<()> { - let manager = pi_manager(); - match manager.list_sessions(&project_path) { - Ok(sessions) => { - for s in sessions { - let _ = app.emit( - "pi:session", - PiSessionQuick { - project_path: project_path.clone(), - session_id: s.id, - entry_count: s.entry_count, - timestamp: s.timestamp, - }, - ); - } - } - Err(e) => { - let _ = app.emit( - "pi:sessions-error", - format!("list sessions for {project_path}: {e}"), - ); - } - } - let _ = app.emit("pi:sessions-done", project_path); - Ok(()) -} - -#[tauri::command] -pub fn list_git_branches(repo_path: String) -> DesktopResult> { - let repo = git2::Repository::open(&repo_path) - .map_err(|e| DesktopError::Source(format!("open repo {repo_path}: {e}")))?; - let branches = toolpath_git::list_branches(&repo) - .map_err(|e| DesktopError::Source(format!("list branches: {e:#}")))?; - - Ok(branches - .into_iter() - .map(|b| GitBranchSummary { - name: b.name, - head_short: b.head_short, - subject: b.subject, - author: b.author, - timestamp: b.timestamp, - }) - .collect()) -} - -#[cfg(test)] -mod tests { - use super::*; - use toolpath_claude::{ClaudeConvo, PathResolver}; - - fn setup_manager_with_project() -> (tempfile::TempDir, ClaudeConvo) { - let temp = tempfile::tempdir().unwrap(); - let claude_dir = temp.path().join(".claude"); - let project_dir = claude_dir.join("projects/-test-project"); - std::fs::create_dir_all(&project_dir).unwrap(); - - let entry1 = r#"{"type":"user","uuid":"uuid-1","timestamp":"2024-01-01T00:00:00Z","cwd":"/test/project","message":{"role":"user","content":"Hello world"}}"#; - let entry2 = r#"{"type":"assistant","uuid":"uuid-2","timestamp":"2024-01-01T00:00:01Z","message":{"role":"assistant","content":"Hi there"}}"#; - std::fs::write( - project_dir.join("session-abc.jsonl"), - format!("{entry1}\n{entry2}\n"), - ) - .unwrap(); - - let resolver = PathResolver::new().with_claude_dir(&claude_dir); - let manager = ClaudeConvo::with_resolver(resolver); - (temp, manager) - } - - #[test] - fn session_summary_includes_title_and_turns() { - let (_temp, manager) = setup_manager_with_project(); - let metas = manager - .list_conversation_metadata("/test/project") - .expect("list"); - assert_eq!(metas.len(), 1); - assert_eq!(metas[0].message_count, 2); - - let convo = manager - .read_conversation("/test/project", &metas[0].session_id) - .expect("read"); - assert_eq!(convo.title(80).as_deref(), Some("Hello world")); - } - - #[test] - fn list_git_branches_opens_temp_repo() { - let dir = tempfile::tempdir().unwrap(); - let repo = git2::Repository::init(dir.path()).unwrap(); - { - let mut config = repo.config().unwrap(); - config.set_str("user.name", "Test").unwrap(); - config.set_str("user.email", "t@t.t").unwrap(); - } - let mut index = repo.index().unwrap(); - let file = dir.path().join("f.txt"); - std::fs::write(&file, "hi").unwrap(); - index.add_path(std::path::Path::new("f.txt")).unwrap(); - index.write().unwrap(); - let tree_id = index.write_tree().unwrap(); - let tree = repo.find_tree(tree_id).unwrap(); - let sig = repo.signature().unwrap(); - repo.commit(Some("HEAD"), &sig, &sig, "init", &tree, &[]) - .unwrap(); - - let branches = - list_git_branches(dir.path().to_string_lossy().into_owned()).expect("branches"); - assert!(!branches.is_empty()); - } - - #[test] - fn list_git_branches_rejects_non_repo() { - let dir = tempfile::tempdir().unwrap(); - let err = list_git_branches(dir.path().to_string_lossy().into_owned()).unwrap_err(); - assert!(matches!(err, DesktopError::Source(_))); - } -} diff --git a/crates/toolpath-desktop/src/commands/upload.rs b/crates/toolpath-desktop/src/commands/upload.rs deleted file mode 100644 index fd8deb2..0000000 --- a/crates/toolpath-desktop/src/commands/upload.rs +++ /dev/null @@ -1,80 +0,0 @@ -use serde::Serialize; -use serde_json::Value; - -use crate::error::{DesktopError, DesktopResult}; - -/// Response returned from a successful (stubbed) Pathbase upload. -/// -/// The real Pathbase service does not exist yet. We validate the payload, -/// log an event to stderr so it's visible in `cargo tauri dev`, and hand -/// back a mock URL the frontend can display. When the real API is ready, -/// replace the body of [`upload_to_pathbase`] without changing the IPC -/// signature. -#[derive(Debug, Clone, Serialize)] -pub struct UploadResult { - pub url: String, - pub status: &'static str, - pub stub: bool, -} - -const MAX_UPLOAD_BYTES: usize = 50 * 1024 * 1024; - -#[tauri::command] -pub fn upload_to_pathbase(document: Value) -> DesktopResult { - let json = serde_json::to_string(&document)?; - - if json.len() > MAX_UPLOAD_BYTES { - return Err(DesktopError::Upload(format!( - "document is {} bytes, over the 50MB stub limit", - json.len() - ))); - } - - let doc = toolpath::v1::Document::from_json(&json) - .map_err(|e| DesktopError::InvalidInput(format!("invalid document: {e}")))?; - - let (kind, id) = match &doc { - toolpath::v1::Document::Step(s) => ("step", s.step.id.clone()), - toolpath::v1::Document::Path(p) => ("path", p.path.id.clone()), - toolpath::v1::Document::Graph(g) => ("graph", g.graph.id.clone()), - }; - - let token = uuid::Uuid::new_v4().to_string(); - let url = format!("https://pathbase.dev/stub/{kind}/{token}"); - - eprintln!("[toolpath-desktop] (stub) would upload {kind} id={id} -> {url}"); - - Ok(UploadResult { - url, - status: "stubbed", - stub: true, - }) -} - -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn upload_returns_stub_url_for_valid_path() { - let doc = serde_json::json!({ - "Path": { - "path": { "id": "pr-1", "head": "s1" }, - "steps": [{ - "step": { "id": "s1", "actor": "human:x", "timestamp": "2024-01-01T00:00:00Z" }, - "change": { "file.txt": { "raw": "@@ -0,0 +1 @@\n+hi\n" } } - }] - } - }); - let res = upload_to_pathbase(doc).expect("ok"); - assert!(res.stub); - assert_eq!(res.status, "stubbed"); - assert!(res.url.starts_with("https://pathbase.dev/stub/path/")); - } - - #[test] - fn upload_rejects_bad_document() { - let err = upload_to_pathbase(serde_json::json!({ "wat": 1 })).unwrap_err(); - assert!(matches!(err, DesktopError::InvalidInput(_))); - } -} diff --git a/crates/toolpath-desktop/src/error.rs b/crates/toolpath-desktop/src/error.rs deleted file mode 100644 index 67529c1..0000000 --- a/crates/toolpath-desktop/src/error.rs +++ /dev/null @@ -1,78 +0,0 @@ -use serde::Serialize; -use thiserror::Error; - -/// Error type returned across the Tauri IPC boundary. -/// -/// All command results use `Result`. Errors are serialised to -/// JSON with a stable `code` discriminator so the frontend can branch on it -/// without string-matching. -#[derive(Debug, Error)] -pub enum DesktopError { - #[error("source error: {0}")] - Source(String), - - #[error("derive error: {0}")] - Derive(String), - - #[error("invalid input: {0}")] - InvalidInput(String), - - #[error("io error: {0}")] - Io(String), - - #[error("auth error: {0}")] - Auth(String), - - #[error("keychain error: {0}")] - Keychain(String), - - #[error("upload error: {0}")] - Upload(String), -} - -impl DesktopError { - fn code(&self) -> &'static str { - match self { - Self::Source(_) => "source", - Self::Derive(_) => "derive", - Self::InvalidInput(_) => "invalid_input", - Self::Io(_) => "io", - Self::Auth(_) => "auth", - Self::Keychain(_) => "keychain", - Self::Upload(_) => "upload", - } - } -} - -impl Serialize for DesktopError { - fn serialize(&self, serializer: S) -> Result - where - S: serde::Serializer, - { - use serde::ser::SerializeStruct; - let mut state = serializer.serialize_struct("DesktopError", 2)?; - state.serialize_field("code", self.code())?; - state.serialize_field("message", &self.to_string())?; - state.end() - } -} - -impl From for DesktopError { - fn from(err: std::io::Error) -> Self { - DesktopError::Io(err.to_string()) - } -} - -impl From for DesktopError { - fn from(err: serde_json::Error) -> Self { - DesktopError::Io(format!("json: {err}")) - } -} - -impl From for DesktopError { - fn from(err: anyhow::Error) -> Self { - DesktopError::Derive(format!("{err:#}")) - } -} - -pub type DesktopResult = std::result::Result; diff --git a/crates/toolpath-desktop/src/main.rs b/crates/toolpath-desktop/src/main.rs deleted file mode 100644 index 70b42f7..0000000 --- a/crates/toolpath-desktop/src/main.rs +++ /dev/null @@ -1,47 +0,0 @@ -#![cfg_attr( - all(not(debug_assertions), target_os = "windows"), - windows_subsystem = "windows" -)] - -mod commands; -mod error; -mod tray; - -use commands::{derive, export, keychain, sources, upload}; - -fn main() { - tauri::Builder::default() - .plugin(tauri_plugin_dialog::init()) - .plugin(tauri_plugin_opener::init()) - .plugin(tauri_plugin_positioner::init()) - .setup(|app| { - tray::install(app)?; - Ok(()) - }) - .invoke_handler(tauri::generate_handler![ - sources::list_agents, - sources::list_claude_projects, - sources::list_claude_projects_stream, - sources::list_claude_sessions, - sources::list_claude_sessions_stream, - sources::claude_session_title, - sources::claude_project_latest_title, - sources::list_pi_projects_stream, - sources::list_pi_sessions_stream, - sources::list_git_branches, - derive::derive_claude, - derive::derive_pi, - derive::derive_git, - derive::derive_github, - export::save_document, - upload::upload_to_pathbase, - keychain::github_set_token, - keychain::github_has_token, - keychain::github_clear_token, - tray::tray_stats_now, - tray::tray_open_main, - tray::tray_open_trace, - ]) - .run(tauri::generate_context!()) - .expect("error while running toolpath-desktop"); -} diff --git a/crates/toolpath-desktop/src/tray.rs b/crates/toolpath-desktop/src/tray.rs deleted file mode 100644 index 01f17f2..0000000 --- a/crates/toolpath-desktop/src/tray.rs +++ /dev/null @@ -1,587 +0,0 @@ -//! System tray / menu-bar mode. -//! -//! Sets up a macOS menu-bar icon with a small popover window and a 30-second -//! background poller that walks every agent-conversation provider -//! (`toolpath-claude`, `-gemini`, `-codex`, `-opencode`, `-pi`) and reports -//! how many sessions have been active recently. -//! -//! The popover is a second Tauri window (`label = "popover"`) configured as -//! undecorated and hidden by default in `tauri.conf.json`. Left-clicking the -//! tray icon toggles it; clicking the menu's "Open Toolpath" brings up the -//! main window. -//! -//! The poller emits a `tray:stats` event with a [`TrayStats`] payload. The -//! popover frontend subscribes to that event and also invokes -//! `tray_stats_now` for an immediate value on open. - -use std::sync::Arc; -use std::thread; -use std::time::Duration; - -use chrono::{DateTime, Utc}; -use serde::Serialize; -use tauri::menu::{Menu, MenuItem}; -use tauri::tray::{MouseButton, MouseButtonState, TrayIconBuilder, TrayIconEvent}; -use tauri::{AppHandle, Emitter, Manager}; -use tauri_plugin_positioner::{Position, WindowExt}; - -/// How often the background poller re-scans providers. -const POLL_INTERVAL: Duration = Duration::from_secs(30); - -/// Sessions touched within this window count as "active now". -const ACTIVE_WINDOW_SECS: i64 = 120; - -/// Sessions touched within this window count as "recent" (shown in list). -const RECENT_WINDOW_SECS: i64 = 24 * 60 * 60; - -/// Maximum number of recent sessions to include in the popover payload. -const MAX_RECENT_SESSIONS: usize = 20; - -/// Per-provider counts, emitted in [`TrayStats`]. -#[derive(Debug, Clone, Default, Serialize)] -pub struct ProviderCounts { - pub provider: &'static str, - /// Sessions with `last_activity` within [`ACTIVE_WINDOW_SECS`]. - pub active: usize, - /// Sessions with `last_activity` within [`RECENT_WINDOW_SECS`]. - pub recent: usize, -} - -/// One entry in the popover's "recent sessions" list. -#[derive(Debug, Clone, Serialize)] -pub struct RecentSession { - pub provider: &'static str, - /// Project key (empty string for codex/opencode which are project-less). - pub project: String, - pub session_id: String, - pub last_activity: String, -} - -/// Payload for the `tray:stats` event (and `tray_stats_now` response). -#[derive(Debug, Clone, Default, Serialize)] -pub struct TrayStats { - pub counts: Vec, - pub recent: Vec, - pub total_active: usize, - pub total_recent: usize, - /// RFC3339 timestamp of the poll that produced this snapshot. - pub polled_at: String, -} - -/// Compute a fresh stats snapshot by walking every provider. -/// -/// Errors from individual providers are swallowed — a broken pi install -/// shouldn't hide claude activity. This is the same defensive posture the -/// existing `list_claude_projects` command takes. -pub fn collect_stats() -> TrayStats { - let now = Utc::now(); - let mut counts: Vec = Vec::new(); - let mut recent: Vec = Vec::new(); - - collect_claude(&now, &mut counts, &mut recent); - collect_gemini(&now, &mut counts, &mut recent); - collect_codex(&now, &mut counts, &mut recent); - collect_opencode(&now, &mut counts, &mut recent); - collect_pi(&now, &mut counts, &mut recent); - - recent.sort_by(|a, b| b.last_activity.cmp(&a.last_activity)); - recent.truncate(MAX_RECENT_SESSIONS); - - let total_active = counts.iter().map(|c| c.active).sum(); - let total_recent = counts.iter().map(|c| c.recent).sum(); - - TrayStats { - counts, - recent, - total_active, - total_recent, - polled_at: now.to_rfc3339(), - } -} - -fn bucket( - now: &DateTime, - last: Option>, -) -> (bool /* active */, bool /* recent */) { - let Some(ts) = last else { - return (false, false); - }; - let delta = now.signed_duration_since(ts).num_seconds(); - if delta < 0 { - // Future timestamps (clock skew) — treat as active. - return (true, true); - } - (delta <= ACTIVE_WINDOW_SECS, delta <= RECENT_WINDOW_SECS) -} - -fn collect_claude( - now: &DateTime, - counts: &mut Vec, - recent: &mut Vec, -) { - let mgr = toolpath_claude::ClaudeConvo::new(); - let mut c = ProviderCounts { - provider: "claude", - ..Default::default() - }; - if !mgr.exists() { - counts.push(c); - return; - } - let projects = mgr.list_projects().unwrap_or_default(); - for project in projects { - let metas = match mgr.list_conversation_metadata(&project) { - Ok(m) => m, - Err(_) => continue, - }; - for meta in metas { - let (active, is_recent) = bucket(now, meta.last_activity); - if active { - c.active += 1; - } - if is_recent { - c.recent += 1; - if let Some(ts) = meta.last_activity { - recent.push(RecentSession { - provider: "claude", - project: project.clone(), - session_id: meta.session_id, - last_activity: ts.to_rfc3339(), - }); - } - } - } - } - counts.push(c); -} - -fn collect_gemini( - now: &DateTime, - counts: &mut Vec, - recent: &mut Vec, -) { - let mgr = toolpath_gemini::GeminiConvo::new(); - let mut c = ProviderCounts { - provider: "gemini", - ..Default::default() - }; - if !mgr.exists() { - counts.push(c); - return; - } - let projects = mgr.list_projects().unwrap_or_default(); - for project in projects { - let metas = match mgr.list_conversation_metadata(&project) { - Ok(m) => m, - Err(_) => continue, - }; - for meta in metas { - let (active, is_recent) = bucket(now, meta.last_activity); - if active { - c.active += 1; - } - if is_recent { - c.recent += 1; - if let Some(ts) = meta.last_activity { - recent.push(RecentSession { - provider: "gemini", - project: project.clone(), - session_id: meta.session_uuid.clone(), - last_activity: ts.to_rfc3339(), - }); - } - } - } - } - counts.push(c); -} - -fn collect_codex( - now: &DateTime, - counts: &mut Vec, - recent: &mut Vec, -) { - let mgr = toolpath_codex::CodexConvo::new(); - let mut c = ProviderCounts { - provider: "codex", - ..Default::default() - }; - let sessions = mgr.list_sessions().unwrap_or_default(); - for s in sessions { - let (active, is_recent) = bucket(now, s.last_activity); - if active { - c.active += 1; - } - if is_recent { - c.recent += 1; - if let Some(ts) = s.last_activity { - recent.push(RecentSession { - provider: "codex", - project: s - .cwd - .as_ref() - .map(|p| p.to_string_lossy().into_owned()) - .unwrap_or_default(), - session_id: s.id, - last_activity: ts.to_rfc3339(), - }); - } - } - } - counts.push(c); -} - -fn collect_opencode( - now: &DateTime, - counts: &mut Vec, - recent: &mut Vec, -) { - let mgr = toolpath_opencode::OpencodeConvo::new(); - let mut c = ProviderCounts { - provider: "opencode", - ..Default::default() - }; - let sessions = mgr.list_sessions().unwrap_or_default(); - for s in sessions { - let (active, is_recent) = bucket(now, s.last_activity); - if active { - c.active += 1; - } - if is_recent { - c.recent += 1; - if let Some(ts) = s.last_activity { - recent.push(RecentSession { - provider: "opencode", - project: s.project_id.clone(), - session_id: s.id, - last_activity: ts.to_rfc3339(), - }); - } - } - } - counts.push(c); -} - -fn collect_pi( - now: &DateTime, - counts: &mut Vec, - recent: &mut Vec, -) { - let mgr = toolpath_pi::PiConvo::new(); - let mut c = ProviderCounts { - provider: "pi", - ..Default::default() - }; - if !mgr.exists() { - counts.push(c); - return; - } - let projects = mgr.list_projects().unwrap_or_default(); - for project in projects { - let sessions = match mgr.list_sessions(&project) { - Ok(s) => s, - Err(_) => continue, - }; - for s in sessions { - let ts = DateTime::parse_from_rfc3339(&s.timestamp) - .ok() - .map(|t| t.with_timezone(&Utc)); - let (active, is_recent) = bucket(now, ts); - if active { - c.active += 1; - } - if is_recent { - c.recent += 1; - if let Some(ts) = ts { - recent.push(RecentSession { - provider: "pi", - project: project.clone(), - session_id: s.id, - last_activity: ts.to_rfc3339(), - }); - } - } - } - } - counts.push(c); -} - -/// IPC command — returns the current stats without waiting for the next poll. -/// -/// Called by the popover on open so it doesn't display stale data for up to -/// 30 seconds after being shown. -#[tauri::command] -pub fn tray_stats_now() -> TrayStats { - collect_stats() -} - -/// IPC command — show + focus the main window. -/// -/// Called by the popover's "Open Toolpath" button. Mirrors the tray menu's -/// `tray:open` action so the popover doesn't need a separate permission for -/// addressing another window by label from JS. -#[tauri::command] -pub fn tray_open_main(app: AppHandle) { - show_main(&app); - hide_popover(&app); -} - -/// Payload pushed to the main window after a trace is derived on the tray -/// side. The main window's reducer consumes this as a `DeriveSucceeded` msg. -#[derive(Debug, Clone, Serialize)] -pub struct TraceOpenedPayload { - pub doc: serde_json::Value, - pub source: String, - pub filename: String, -} - -/// IPC command — derive the trace for a single session and surface it in the -/// main window's preview. -/// -/// Callable from the popover when the user clicks a recent session. Only the -/// providers with a desktop-side derive command are supported (claude, pi). -/// For gemini/codex/opencode the popover should disable the row instead of -/// calling this. -#[tauri::command] -pub fn tray_open_trace( - app: AppHandle, - provider: String, - project: String, - session_id: String, -) -> Result<(), String> { - let (doc, source, filename) = match provider.as_str() { - "claude" => { - let value = crate::commands::derive::derive_claude( - project.clone(), - vec![session_id.clone()], - /* include_thinking */ false, - ) - .map_err(|e| e.to_string())?; - let filename = format!( - "claude-{}-{}.path.json", - basename_slug(&project), - short(&session_id) - ); - (value, format!("Claude: {}", basename(&project)), filename) - } - "pi" => { - let value = crate::commands::derive::derive_pi( - project.clone(), - vec![session_id.clone()], - /* include_thinking */ false, - ) - .map_err(|e| e.to_string())?; - let filename = format!( - "pi-{}-{}.path.json", - basename_slug(&project), - short(&session_id) - ); - (value, format!("pi.dev: {}", basename(&project)), filename) - } - // Not wired up in the desktop backend yet. The popover disables - // rows for these, but we still reject politely if one slips through. - "gemini" | "codex" | "opencode" => { - return Err(format!( - "Opening {provider} traces from Quick View isn't wired up yet." - )); - } - other => return Err(format!("unknown provider: {other}")), - }; - - let payload = TraceOpenedPayload { - doc, - source, - filename, - }; - show_main(&app); - hide_popover(&app); - app.emit_to("main", "trace:opened", payload) - .map_err(|e| e.to_string())?; - Ok(()) -} - -fn basename(path: &str) -> String { - if path.is_empty() { - return String::new(); - } - std::path::Path::new(path) - .file_name() - .and_then(|s| s.to_str()) - .map(|s| s.to_string()) - .unwrap_or_else(|| path.to_string()) -} - -fn basename_slug(path: &str) -> String { - basename(path) - .chars() - .map(|c| if c.is_ascii_alphanumeric() { c } else { '-' }) - .collect() -} - -fn short(id: &str) -> &str { - id.get(..8).unwrap_or(id) -} - -/// Install the tray icon, menu, event handlers, and the background poller. -/// -/// Called from `setup` in `main.rs`. Safe to call once per app lifetime. -pub fn install(app: &tauri::App) -> tauri::Result<()> { - let handle = app.handle().clone(); - - let menu_open = MenuItem::with_id(app, "tray:open", "Open Toolpath", true, None::<&str>)?; - let menu_refresh = MenuItem::with_id(app, "tray:refresh", "Refresh now", true, None::<&str>)?; - let menu_quit = MenuItem::with_id(app, "tray:quit", "Quit", true, None::<&str>)?; - let menu = Menu::with_items(app, &[&menu_open, &menu_refresh, &menu_quit])?; - - let _tray = TrayIconBuilder::with_id("main") - .icon( - app.default_window_icon() - .cloned() - .expect("bundle provides a default window icon"), - ) - .icon_as_template(true) - .title("·") - .tooltip("Toolpath — no activity") - .menu(&menu) - .show_menu_on_left_click(false) - .on_menu_event(move |app, event| match event.id.as_ref() { - "tray:quit" => app.exit(0), - "tray:open" => show_main(app), - "tray:refresh" => publish_stats(app), - _ => {} - }) - .on_tray_icon_event(|tray, event| { - let app = tray.app_handle(); - tauri_plugin_positioner::on_tray_event(app, &event); - if let TrayIconEvent::Click { - button: MouseButton::Left, - button_state: MouseButtonState::Up, - .. - } = event - { - toggle_popover(app); - } - }) - .build(app)?; - - // Kick off the poller. One initial publish so the tray title reflects - // reality without a 30s wait. - let poll_handle = Arc::new(handle.clone()); - thread::spawn(move || { - publish_stats(&poll_handle); - loop { - thread::sleep(POLL_INTERVAL); - publish_stats(&poll_handle); - } - }); - - Ok(()) -} - -fn show_main(app: &AppHandle) { - if let Some(w) = app.get_webview_window("main") { - let _ = w.show(); - let _ = w.unminimize(); - let _ = w.set_focus(); - } -} - -fn toggle_popover(app: &AppHandle) { - let Some(w) = app.get_webview_window("popover") else { - return; - }; - let visible = w.is_visible().unwrap_or(false); - if visible { - let _ = w.hide(); - return; - } - let _ = w.move_window(Position::TrayBottomCenter); - let _ = w.show(); - let _ = w.set_focus(); -} - -fn hide_popover(app: &AppHandle) { - if let Some(w) = app.get_webview_window("popover") { - let _ = w.hide(); - } -} - -fn publish_stats(app: &AppHandle) { - let stats = collect_stats(); - - // Update the tray title with a compact activity indicator. - if let Some(tray) = app.tray_by_id("main") { - let title = match stats.total_active { - 0 => "·".to_string(), - n => format!("● {n}"), - }; - let tooltip = format!( - "Toolpath — {} active, {} recent", - stats.total_active, stats.total_recent - ); - let _ = tray.set_title(Some(&title)); - let _ = tray.set_tooltip(Some(&tooltip)); - } - - let _ = app.emit("tray:stats", stats); -} - -#[cfg(test)] -mod tests { - use super::*; - use chrono::Duration; - - #[test] - fn bucket_classifies_activity_windows() { - let now = Utc::now(); - - // None → neither active nor recent. - assert_eq!(bucket(&now, None), (false, false)); - - // 10s ago → both active and recent. - assert_eq!( - bucket(&now, Some(now - Duration::seconds(10))), - (true, true) - ); - - // 5 minutes ago → recent but not active. - assert_eq!( - bucket(&now, Some(now - Duration::minutes(5))), - (false, true) - ); - - // 2 days ago → neither. - assert_eq!(bucket(&now, Some(now - Duration::days(2))), (false, false)); - - // Future timestamp (clock skew) → both (optimistic). - assert_eq!( - bucket(&now, Some(now + Duration::seconds(30))), - (true, true) - ); - } - - #[test] - fn collect_stats_runs_without_panic() { - // With no provider data on this machine the call should still - // produce a well-formed snapshot with all five provider slots. - let s = collect_stats(); - let providers: Vec<_> = s.counts.iter().map(|c| c.provider).collect(); - assert_eq!( - providers, - vec!["claude", "gemini", "codex", "opencode", "pi"] - ); - } - - #[test] - fn basename_slug_handles_paths_and_empty() { - assert_eq!(basename_slug("/Users/alex/proj"), "proj"); - assert_eq!(basename_slug("my project!"), "my-project-"); - assert_eq!(basename_slug(""), ""); - } - - #[test] - fn short_truncates_session_ids() { - assert_eq!(short("0123456789abcdef"), "01234567"); - assert_eq!(short("abc"), "abc"); - } -} diff --git a/crates/toolpath-desktop/tauri.conf.json b/crates/toolpath-desktop/tauri.conf.json deleted file mode 100644 index db5fa24..0000000 --- a/crates/toolpath-desktop/tauri.conf.json +++ /dev/null @@ -1,60 +0,0 @@ -{ - "$schema": "https://schema.tauri.app/config/2", - "productName": "Toolpath", - "version": "0.1.0", - "identifier": "dev.pathbase.toolpath-desktop", - "build": { - "frontendDist": "frontend/dist", - "devUrl": "http://localhost:1420", - "beforeDevCommand": { - "script": "bun install && bun run dev", - "cwd": "./frontend" - }, - "beforeBuildCommand": { - "script": "bun install && bun run build", - "cwd": "./frontend" - } - }, - "app": { - "withGlobalTauri": true, - "windows": [ - { - "label": "main", - "title": "Toolpath", - "width": 430, - "height": 900, - "minWidth": 360, - "minHeight": 640, - "resizable": true, - "fullscreen": false - }, - { - "label": "popover", - "url": "popover.html", - "title": "Toolpath Quick View", - "width": 340, - "height": 420, - "resizable": false, - "decorations": false, - "transparent": false, - "alwaysOnTop": true, - "skipTaskbar": true, - "visible": false, - "focus": false - } - ], - "security": { - "csp": null - } - }, - "bundle": { - "active": true, - "targets": ["app", "dmg", "msi", "deb", "appimage"], - "icon": [ - "icons/icon.png" - ], - "category": "DeveloperTool", - "shortDescription": "Export agent traces as Toolpath documents", - "longDescription": "Select Claude Code sessions, git branches, or GitHub PRs, preview the provenance DAG, and export to a local .path.json file or upload to Pathbase." - } -} diff --git a/scripts/release.sh b/scripts/release.sh index 1de9646..cc25286 100755 --- a/scripts/release.sh +++ b/scripts/release.sh @@ -21,9 +21,8 @@ set -euo pipefail # toolpath-opencode (depends on toolpath, toolpath-convo) # toolpath-pi (depends on toolpath, toolpath-convo) # 3. toolpath-cli (depends on all of the above) -# toolpath-desktop (depends on toolpath, toolpath-claude, toolpath-git, toolpath-github) -ALL_CRATES=(toolpath toolpath-convo toolpath-git toolpath-github toolpath-dot toolpath-md toolpath-claude toolpath-gemini toolpath-codex toolpath-opencode toolpath-pi toolpath-cli toolpath-desktop) +ALL_CRATES=(toolpath toolpath-convo toolpath-git toolpath-github toolpath-dot toolpath-md toolpath-claude toolpath-gemini toolpath-codex toolpath-opencode toolpath-pi toolpath-cli) DRY_RUN="" AUTO_YES="" @@ -218,8 +217,7 @@ for crate in toolpath-git toolpath-github toolpath-dot toolpath-md toolpath-clau fi done -# Tier 3: CLI binary + desktop app (depend on everything above) +# Tier 3: CLI binary (depends on everything above) publish toolpath-cli -publish toolpath-desktop echo "=== done ===" diff --git a/scripts/run-desktop.sh b/scripts/run-desktop.sh deleted file mode 100755 index 3c8b9ee..0000000 --- a/scripts/run-desktop.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/bash - -cd crates/toolpath-desktop && cargo tauri dev diff --git a/site/_data/crates.json b/site/_data/crates.json index f17693b..d0c939b 100644 --- a/site/_data/crates.json +++ b/site/_data/crates.json @@ -94,13 +94,5 @@ "docs": "https://docs.rs/toolpath-cli", "crate": "https://crates.io/crates/toolpath-cli", "role": "One binary called `path` that ties everything together: derive, query, render, merge, track, validate." - }, - { - "name": "toolpath-desktop", - "version": "0.1.0", - "description": "Desktop app for selecting, previewing, and exporting traces", - "docs": "https://docs.rs/toolpath-desktop", - "crate": "https://crates.io/crates/toolpath-desktop", - "role": "Tauri 2 app that wraps the derive/preview/export flow for non-technical users. Companion to Pathbase — users pick Claude sessions, git branches, or PRs, preview the DAG, and export locally or upload." } ] diff --git a/site/pages/crates.md b/site/pages/crates.md index c77c655..aee5f77 100644 --- a/site/pages/crates.md +++ b/site/pages/crates.md @@ -22,12 +22,9 @@ toolpath-cli (binary: path) +-- toolpath-pi -> toolpath, toolpath-convo +-- toolpath-dot -> toolpath +-- toolpath-md -> toolpath - -toolpath-desktop (Tauri 2 app) - +-- toolpath, toolpath-claude, toolpath-git, toolpath-github ``` -Cross-dependencies between satellite crates: `toolpath-claude -> toolpath-convo`, `toolpath-gemini -> toolpath-convo`, `toolpath-codex -> toolpath-convo`, `toolpath-opencode -> toolpath-convo`, `toolpath-pi -> toolpath-convo`. `toolpath-desktop` is a leaf — nothing depends on it. +Cross-dependencies between satellite crates: `toolpath-claude -> toolpath-convo`, `toolpath-gemini -> toolpath-convo`, `toolpath-codex -> toolpath-convo`, `toolpath-opencode -> toolpath-convo`, `toolpath-pi -> toolpath-convo`. {% for crate in crates %}