diff --git a/.github/workflows/cicd.yml b/.github/workflows/cicd.yml index 9fc1309..957850d 100644 --- a/.github/workflows/cicd.yml +++ b/.github/workflows/cicd.yml @@ -39,16 +39,16 @@ jobs: env: IMAGE_NAME: git-iris-test steps: - - uses: actions/checkout@v6 + - uses: actions/checkout@v7 with: fetch-depth: 0 - - uses: docker/setup-buildx-action@v3 + - uses: docker/setup-buildx-action@v4 - name: Build Docker image working-directory: ./docker - run: ./build.sh $IMAGE_NAME + run: ./build.sh "$IMAGE_NAME" - name: Test Docker image working-directory: ./docker - run: CI=true ./test-image.sh $IMAGE_NAME + run: CI=true ./test-image.sh "$IMAGE_NAME" # ── Build Artifacts ────────────────────────────────────────── build-artifacts: @@ -76,7 +76,7 @@ jobs: target: aarch64-apple-darwin binary_name: git-iris steps: - - uses: actions/checkout@v6 + - uses: actions/checkout@v7 with: fetch-depth: 0 - uses: dtolnay/rust-toolchain@stable @@ -88,7 +88,7 @@ jobs: cache-on-failure: true - name: Build release binary run: cargo build --verbose --locked --release --target ${{ matrix.target }} - - uses: actions/upload-artifact@v4 + - uses: actions/upload-artifact@v7 with: name: git-iris-${{ matrix.build }} path: ./target/${{ matrix.target }}/release/${{ matrix.binary_name }} @@ -113,12 +113,12 @@ jobs: outputs: version: ${{ steps.get_version.outputs.VERSION }} steps: - - uses: actions/checkout@v6 + - uses: actions/checkout@v7 with: fetch-depth: 0 - name: Get version id: get_version - run: echo "VERSION=${GITHUB_REF_NAME#v}" >> $GITHUB_OUTPUT + run: echo "VERSION=${GITHUB_REF_NAME#v}" >> "$GITHUB_OUTPUT" - uses: dtolnay/rust-toolchain@stable with: targets: ${{ matrix.target }} @@ -127,8 +127,8 @@ jobs: run: | sudo apt-get update sudo apt-get install -y gcc-aarch64-linux-gnu - echo "CC_aarch64_unknown_linux_gnu=aarch64-linux-gnu-gcc" >> $GITHUB_ENV - echo "CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_LINKER=aarch64-linux-gnu-gcc" >> $GITHUB_ENV + echo "CC_aarch64_unknown_linux_gnu=aarch64-linux-gnu-gcc" >> "$GITHUB_ENV" + echo "CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_LINKER=aarch64-linux-gnu-gcc" >> "$GITHUB_ENV" - uses: Swatinem/rust-cache@v2 with: cache-on-failure: true @@ -138,7 +138,7 @@ jobs: env: RUSTFLAGS: ${{ matrix.rust_flags }} run: cargo deb --target ${{ matrix.target }} - - uses: actions/upload-artifact@v4 + - uses: actions/upload-artifact@v7 with: name: git-iris-deb-${{ matrix.arch_suffix }} path: ./target/${{ matrix.target }}/debian/git-iris_${{ steps.get_version.outputs.VERSION }}-1_${{ matrix.arch_suffix }}.deb @@ -154,7 +154,7 @@ jobs: env: RUSTFLAGS: ${{ matrix.rust_flags }} run: cargo generate-rpm --target ${{ matrix.target }} - - uses: actions/upload-artifact@v4 + - uses: actions/upload-artifact@v7 with: name: git-iris-rpm-${{ matrix.arch_suffix }} path: ./target/${{ matrix.target }}/generate-rpm/git-iris-${{ steps.get_version.outputs.VERSION }}-1.${{ matrix.rpm_arch }}.rpm @@ -162,7 +162,7 @@ jobs: retention-days: 1 - name: Upload man page if: matrix.build == 'linux-amd64' - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v7 with: name: git-iris-man path: ./git-iris.1 @@ -201,14 +201,15 @@ jobs: permissions: contents: write steps: - - uses: actions/checkout@v6 + - uses: actions/checkout@v7 with: fetch-depth: 0 - name: Download all artifacts - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v8 with: path: ./artifacts pattern: git-iris-* + merge-multiple: false - name: Prepare release assets run: | mkdir -p release-assets @@ -227,7 +228,7 @@ jobs: id: prev_tag run: | PREVIOUS_TAG=$(git describe --tags --abbrev=0 HEAD^ 2>/dev/null || echo "") - echo "tag=$PREVIOUS_TAG" >> $GITHUB_OUTPUT + echo "tag=$PREVIOUS_TAG" >> "$GITHUB_OUTPUT" - name: Prepare git-iris binary run: | chmod +x ./artifacts/git-iris-linux-amd64/git-iris @@ -235,7 +236,7 @@ jobs: - name: Download release notes from release workflow id: download_notes if: ${{ inputs.release_run_id != '' }} - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v8 with: name: release-notes run-id: ${{ inputs.release_run_id }} @@ -250,7 +251,7 @@ jobs: to: ${{ github.ref_name }} version-name: ${{ github.ref_name }} provider: anthropic - model: claude-opus-4-5-20251101 + model: claude-opus-5 api-key: ${{ secrets.ANTHROPIC_API_KEY }} output-file: RELEASE_NOTES.md binary-path: ./artifacts/git-iris-linux-amd64/git-iris @@ -261,7 +262,7 @@ jobs: echo "" >> RELEASE_NOTES.md echo "See [commit history](https://github.com/hyperb1iss/git-iris/commits/${{ github.ref_name }}) for changes." >> RELEASE_NOTES.md - name: Create GitHub Release - uses: softprops/action-gh-release@v2 + uses: softprops/action-gh-release@v3 with: name: Release ${{ github.ref_name }} draft: false @@ -278,7 +279,7 @@ jobs: permissions: contents: write steps: - - uses: actions/checkout@v6 + - uses: actions/checkout@v7 with: fetch-depth: 0 - name: Update major version tag @@ -297,7 +298,7 @@ jobs: needs: create-release runs-on: ubuntu-latest steps: - - uses: actions/checkout@v6 + - uses: actions/checkout@v7 with: repository: hyperb1iss/homebrew-tap token: ${{ secrets.HOMEBREW_TAP_TOKEN }} @@ -306,17 +307,19 @@ jobs: id: sha run: | VERSION="${GITHUB_REF_NAME#v}" - echo "version=$VERSION" >> $GITHUB_OUTPUT + echo "version=$VERSION" >> "$GITHUB_OUTPUT" MACOS_ARM64=$(curl -fsSL "https://github.com/hyperb1iss/git-iris/releases/download/${GITHUB_REF_NAME}/git-iris-macos-arm64" | shasum -a 256 | cut -d' ' -f1) LINUX_ARM64=$(curl -fsSL "https://github.com/hyperb1iss/git-iris/releases/download/${GITHUB_REF_NAME}/git-iris-linux-arm64" | shasum -a 256 | cut -d' ' -f1) LINUX_AMD64=$(curl -fsSL "https://github.com/hyperb1iss/git-iris/releases/download/${GITHUB_REF_NAME}/git-iris-linux-amd64" | shasum -a 256 | cut -d' ' -f1) SOURCE=$(curl -fsSL "https://github.com/hyperb1iss/git-iris/archive/refs/tags/${GITHUB_REF_NAME}.tar.gz" | shasum -a 256 | cut -d' ' -f1) - echo "macos_arm64=$MACOS_ARM64" >> $GITHUB_OUTPUT - echo "linux_arm64=$LINUX_ARM64" >> $GITHUB_OUTPUT - echo "linux_amd64=$LINUX_AMD64" >> $GITHUB_OUTPUT - echo "source=$SOURCE" >> $GITHUB_OUTPUT + { + echo "macos_arm64=$MACOS_ARM64" + echo "linux_arm64=$LINUX_ARM64" + echo "linux_amd64=$LINUX_AMD64" + echo "source=$SOURCE" + } >> "$GITHUB_OUTPUT" - name: Generate formula run: | cat > homebrew-tap/Formula/git-iris.rb << 'EOF' @@ -381,7 +384,7 @@ jobs: needs: create-release runs-on: ubuntu-latest steps: - - uses: actions/checkout@v6 + - uses: actions/checkout@v7 - name: Generate PKGBUILD run: | VERSION="${GITHUB_REF_NAME#v}" @@ -412,7 +415,7 @@ jobs: } EOF - name: Publish to AUR - uses: KSXGitHub/github-actions-deploy-aur@v4.1.2 + uses: KSXGitHub/github-actions-deploy-aur@v4.2.0 with: pkgname: git-iris-bin pkgbuild: ./PKGBUILD diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 9aa7729..f2a0d6b 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -46,7 +46,7 @@ jobs: steps: - name: "📥 Checkout" - uses: actions/checkout@v6 + uses: actions/checkout@v7 with: fetch-depth: 0 token: ${{ secrets.GITHUB_TOKEN }} @@ -104,8 +104,8 @@ jobs: exit 1 fi - echo "current=$CURRENT" >> $GITHUB_OUTPUT - echo "version=$VERSION" >> $GITHUB_OUTPUT + echo "current=$CURRENT" >> "$GITHUB_OUTPUT" + echo "version=$VERSION" >> "$GITHUB_OUTPUT" echo "🚀 Releasing: $CURRENT → $VERSION" - name: "📝 Update Cargo.toml version" @@ -133,7 +133,7 @@ jobs: output-file: CHANGELOG.md update-file: "true" provider: anthropic - model: claude-opus-4-5-20251101 + model: claude-opus-5 api-key: ${{ secrets.ANTHROPIC_API_KEY }} binary-path: ./target/release/git-iris @@ -148,13 +148,13 @@ jobs: version-name: ${{ steps.version.outputs.version }} output-file: RELEASE_NOTES.md provider: anthropic - model: claude-opus-4-5-20251101 + model: claude-opus-5 api-key: ${{ secrets.ANTHROPIC_API_KEY }} binary-path: ./target/release/git-iris - name: "📤 Upload release notes artifact" if: ${{ !inputs.dry_run }} - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v7 with: name: release-notes path: RELEASE_NOTES.md @@ -184,32 +184,32 @@ jobs: - name: "📊 Summary" run: | - echo "## Release ${{ inputs.dry_run && '[DRY RUN] ' || '' }}v${{ steps.version.outputs.version }}" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - - if [[ "${{ inputs.dry_run }}" == "true" ]]; then - echo "✅ Build and tests passed" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "**Ready to release.** Run again without dry-run to publish." >> $GITHUB_STEP_SUMMARY - else - echo "✅ Version bumped: ${{ steps.version.outputs.current }} → ${{ steps.version.outputs.version }}" >> $GITHUB_STEP_SUMMARY - echo "✅ Tag created and pushed: v${{ steps.version.outputs.version }}" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "🚀 **CI/CD pipeline triggered!** The following will happen automatically:" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "- Build release binaries (Linux x64/ARM64, macOS ARM64, Windows)" >> $GITHUB_STEP_SUMMARY - echo "- Build .deb and .rpm packages" >> $GITHUB_STEP_SUMMARY - echo "- Publish Docker image to Docker Hub" >> $GITHUB_STEP_SUMMARY - echo "- Publish to crates.io" >> $GITHUB_STEP_SUMMARY - echo "- Create GitHub Release with release notes" >> $GITHUB_STEP_SUMMARY - echo "- Update v1 action tag" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "📦 [View CI/CD progress](https://github.com/${{ github.repository }}/actions)" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "---" >> $GITHUB_STEP_SUMMARY - echo "### 📝 Release Notes Preview" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - cat << 'EOF' >> $GITHUB_STEP_SUMMARY - ${{ steps.release_notes.outputs.content }} - EOF - fi + { + echo "## Release ${{ inputs.dry_run && '[DRY RUN] ' || '' }}v${{ steps.version.outputs.version }}" + echo "" + + if [[ "${{ inputs.dry_run }}" == "true" ]]; then + echo "✅ Build and tests passed" + echo "" + echo "**Ready to release.** Run again without dry-run to publish." + else + echo "✅ Version bumped: ${{ steps.version.outputs.current }} → ${{ steps.version.outputs.version }}" + echo "✅ Tag created and pushed: v${{ steps.version.outputs.version }}" + echo "" + echo "🚀 **CI/CD pipeline triggered!** The following will happen automatically:" + echo "" + echo "- Build release binaries (Linux x64/ARM64, macOS ARM64, Windows)" + echo "- Build .deb and .rpm packages" + echo "- Publish Docker image to Docker Hub" + echo "- Publish to crates.io" + echo "- Create GitHub Release with release notes" + echo "- Update v1 action tag" + echo "" + echo "📦 [View CI/CD progress](https://github.com/${{ github.repository }}/actions)" + echo "" + echo "---" + echo "### 📝 Release Notes Preview" + echo "" + cat RELEASE_NOTES.md + fi + } >> "$GITHUB_STEP_SUMMARY" diff --git a/CLAUDE.md b/CLAUDE.md index ed8808b..e23981d 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -9,7 +9,7 @@ ## Architecture Overview -Git-Iris uses an agent-first architecture powered by **Iris**, an LLM-driven agent built on the [Rig framework](https://docs.rs/rig-core). Iris dynamically explores codebases using tool calls rather than dumping all context upfront. +Git-Iris uses an agent-first architecture powered by **Iris**, an LLM-driven agent built on the [Rig framework](https://docs.rs/rig/0.42.0). Iris dynamically explores codebases using tool calls rather than dumping all context upfront. ### Core Principles @@ -233,36 +233,36 @@ Iris can update content directly through tools: Each capability is defined in `src/agents/capabilities/*.toml`: -| Capability | Output Type | Description | -| ----------------- | ---------------------- | ------------------------------------------------------------------ | -| `commit` | `GeneratedMessage` | Commit messages with emoji/title/body | -| `review` | `Review` | Structured code review with findings, severity, confidence, GitHub inline links | -| `pr` | `MarkdownPullRequest` | Pull request descriptions | -| `changelog` | `MarkdownChangelog` | Keep a Changelog format | -| `release_notes` | `MarkdownReleaseNotes` | Release documentation | -| `chat` | Varies | Interactive conversation | -| `semantic_blame` | `SemanticBlame` | "Why does this code exist?" history-aware explanation | -| `verify` | `Critique` | Critic verification pass — internal, runs after generation | +| Capability | Output Type | Description | +| ---------------- | ---------------------- | ------------------------------------------------------------------------------- | +| `commit` | `GeneratedMessage` | Commit messages with emoji/title/body | +| `review` | `Review` | Structured code review with findings, severity, confidence, GitHub inline links | +| `pr` | `MarkdownPullRequest` | Pull request descriptions | +| `changelog` | `MarkdownChangelog` | Keep a Changelog format | +| `release_notes` | `MarkdownReleaseNotes` | Release documentation | +| `chat` | Varies | Interactive conversation | +| `semantic_blame` | `SemanticBlame` | "Why does this code exist?" history-aware explanation | +| `verify` | `Critique` | Critic verification pass — internal, runs after generation | ### Tools Available to Iris -| Tool | Purpose | -| ---------------------------------------------------------- | --------------------------------------------------------- | -| `git_diff(detail, from, to, files)` | Get changes with relevance scores; optional file filter | -| `git_log(count, from, to)` | Recent commit history for style reference | -| `git_status()` | Repository status | -| `git_changed_files(from, to)` | List of changed files | -| `git_show(commit, files, max_output_chars)` | Inspect a historical commit (truncated to budget) | -| `git_blame(file, start_line, end_line, recent_commits)` | Line history and recent file commits | -| `git_repo_info()` | Branch, remote, default-base metadata | -| `file_read(path, start, end)` | Read targeted file content and excerpts | -| `code_search()` | Search for patterns, functions, classes | -| `repo_map(token_budget, mentioned_files, max_files)` | Ranked codebase orientation map | -| `static_analysis(analyzer, timeout_secs, max_output_chars)`| Run rust/python/javascript/go linters directly | -| `project_docs(doc_type)` | Read README, AGENTS.md, CLAUDE.md | -| `workspace()` | Iris's notes and task tracking | -| `parallel_analyze()` | Concurrent subagent processing (per-call `max_turns`) | -| `update_commit()` / `update_pr()` / `update_review()` | Chat: update generated content in place | +| Tool | Purpose | +| ----------------------------------------------------------- | ------------------------------------------------------- | +| `git_diff(detail, from, to, files)` | Get changes with relevance scores; optional file filter | +| `git_log(count, from, to)` | Recent commit history for style reference | +| `git_status()` | Repository status | +| `git_changed_files(from, to)` | List of changed files | +| `git_show(commit, files, max_output_chars)` | Inspect a historical commit (truncated to budget) | +| `git_blame(file, start_line, end_line, recent_commits)` | Line history and recent file commits | +| `git_repo_info()` | Branch, remote, default-base metadata | +| `file_read(path, start, end)` | Read targeted file content and excerpts | +| `code_search()` | Search for patterns, functions, classes | +| `repo_map(token_budget, mentioned_files, max_files)` | Ranked codebase orientation map | +| `static_analysis(analyzer, timeout_secs, max_output_chars)` | Run rust/python/javascript/go linters directly | +| `project_docs(doc_type)` | Read README, AGENTS.md, CLAUDE.md | +| `workspace()` | Iris's notes and task tracking | +| `parallel_analyze()` | Concurrent subagent processing (per-call `max_turns`) | +| `update_commit()` / `update_pr()` / `update_review()` | Chat: update generated content in place | The four extraction tools — `repo_map`, `git_blame`, `git_show`, and `static_analysis` — are **core tools**, attached to every main agent and subagent via `attach_core_tools!` in `src/agents/tools/registry.rs` (`CORE_TOOLS`, 11 entries). @@ -270,11 +270,11 @@ The four extraction tools — `repo_map`, `git_blame`, `git_show`, and `static_a Iris adapts her approach based on changeset size: -| Scenario | Strategy | -| ------------------------------------- | ----------------------------------------------------- | -| Small (≤3 files, <100 lines total) | Full context for all files | -| Medium (≤10 files, <500 lines total) | Prioritize files with >60% relevance score | -| Large (everything else) | Summaries by default; `parallel_analyze` for breadth | +| Scenario | Strategy | +| ------------------------------------ | ---------------------------------------------------- | +| Small (≤3 files, <100 lines total) | Full context for all files | +| Medium (≤10 files, <500 lines total) | Prioritize files with >60% relevance score | +| Large (everything else) | Summaries by default; `parallel_analyze` for breadth | Thresholds live in `format_diff_output` in `src/agents/tools/git.rs`. Iris also gets per-call control via `parallel_analyze`'s `max_turns` and the configurable `subagent_timeout_secs` / `subagent_max_turns` budgets. @@ -301,13 +301,13 @@ Instructions for Iris... Iris produces structured responses (all in `src/types/`): -| Type | Format | Description | -| ---------------------- | -------- | -------------------------------------------------------------------- | -| `GeneratedMessage` | JSON | `{ emoji, title, message, completion_message }` | -| `MarkdownPullRequest` | Markdown | `{ content: String }` | +| Type | Format | Description | +| ---------------------- | -------- | -------------------------------------------------------------------------------- | +| `GeneratedMessage` | JSON | `{ emoji, title, message, completion_message }` | +| `MarkdownPullRequest` | Markdown | `{ content: String }` | | `Review` | JSON | `{ summary, metadata, findings[], stats }` — structured findings with confidence | -| `MarkdownChangelog` | Markdown | `{ content: String }` | -| `MarkdownReleaseNotes` | Markdown | `{ content: String }` | +| `MarkdownChangelog` | Markdown | `{ content: String }` | +| `MarkdownReleaseNotes` | Markdown | `{ content: String }` | The `Markdown*` types use a simple wrapper, letting the LLM drive format while capability TOMLs provide guidelines. `Review` is fully structured — findings carry severity, category, file/line citations, and a confidence score. Findings are gated at confidence ≥ 70 for terminal display and GitHub inline publishing. @@ -463,20 +463,22 @@ Or use CLI: ```bash git-iris config --provider anthropic --api-key YOUR_KEY -git-iris config --provider anthropic --model claude-opus-4-6 +git-iris config --provider anthropic --model claude-opus-5 ``` ### Provider Details -| Provider | Default Model | Fast Model | Context | -| --------- | -------------------- | ------------------------- | ------- | -| openai | gpt-5.4 | gpt-5.4-mini | 128K | -| anthropic | claude-opus-4-6 | claude-haiku-4-5-20251001 | 200K | -| google | gemini-3-pro-preview | gemini-2.5-flash | 1M | +| Provider | Default Model | Fast Model | Context | +| --------- | ---------------- | ------------------------- | ------- | +| openai | gpt-6-astra | gpt-5.6-luna | 1.05M | +| anthropic | claude-opus-5 | claude-haiku-4-5-20251001 | 1M | +| google | gemini-3.8-flash | gemini-3.5-flash-lite | 1M | -OpenAI GPT-5 defaults are workflow-aware: main agent generations use medium reasoning, subagents +OpenAI defaults are workflow-aware: main agent generations use medium reasoning, subagents use low reasoning, and status messages use none unless the provider config explicitly overrides -`reasoning`. +`reasoning`. Anthropic Opus 5 uses high effort for main tasks and low for subagents. +OpenRouter and Fireworks are supported through the same agent construction path. The optional +`subagent_model` selects delegated analysis independently of `fast_model` status messages. ## Key Design Decisions diff --git a/Cargo.lock b/Cargo.lock index 9d44540..0c99569 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -8,15 +8,63 @@ version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" +[[package]] +name = "ahash" +version = "0.8.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" +dependencies = [ + "cfg-if", + "const-random", + "getrandom 0.3.4", + "once_cell", + "serde", + "version_check", + "zerocopy", +] + [[package]] name = "aho-corasick" -version = "1.1.4" +version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" +checksum = "c982642fa9e8606056828ee9a8505737230110bb1099153c79efe865c59d12ba" dependencies = [ "memchr", ] +[[package]] +name = "aligned" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee4508988c62edf04abd8d92897fca0c2995d907ce1dfeaf369dac3716a40685" +dependencies = [ + "as-slice", +] + +[[package]] +name = "aligned-vec" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc890384c8602f339876ded803c97ad529f3842aba97f6392b3dba0dd171769b" +dependencies = [ + "equator", +] + +[[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.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e76a019e91224d279006ff972f1e984179a6e9feb050adba6ce8274aef23195" +dependencies = [ + "alloc-no-stdlib", +] + [[package]] name = "allocator-api2" version = "0.2.21" @@ -25,9 +73,9 @@ checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" [[package]] name = "android_system_properties" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +checksum = "ae221649c9976a6f6c56ae1facf410f3ddb33cc661c4b7b61020a912d4237fbc" dependencies = [ "libc", ] @@ -68,7 +116,7 @@ version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc" dependencies = [ - "windows-sys 0.61.2", + "windows-sys 0.60.2", ] [[package]] @@ -79,14 +127,29 @@ checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d" dependencies = [ "anstyle", "once_cell_polyfill", - "windows-sys 0.61.2", + "windows-sys 0.60.2", ] [[package]] name = "anyhow" -version = "1.0.102" +version = "1.0.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "330a5ed07fa54e4702c9d6c4174f74427fc0ef6e214bbd677ae50a5099946470" + +[[package]] +name = "approx" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cab112f0a86d568ea0e627cc1d6be74a1e9cd55214684db5561995f6dad897c6" +dependencies = [ + "num-traits", +] + +[[package]] +name = "arbitrary" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c" +checksum = "c3d036a3c4ab069c7b410a2ce876bd74808d2d0888a82667669f8e783a898bf1" [[package]] name = "arboard" @@ -110,1995 +173,4288 @@ dependencies = [ [[package]] name = "arc-swap" -version = "1.9.1" +version = "1.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a3a1fd6f75306b68087b831f025c712524bcb19aad54e557b1129cfa0a2b207" +checksum = "c049c0be4daef0b145cb3555416b3b8ef5b7888a38aea1a3a155801fe7b0810b" dependencies = [ "rustversion", ] [[package]] -name = "arrayvec" -version = "0.7.6" +name = "arg_enum_proc_macro" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" +checksum = "0ae92a5119aa49cdbcf6b9f893fe4e1d98b04ccbf82ee0584ad948a44a734dea" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] [[package]] -name = "as-any" -version = "0.3.2" +name = "arrayref" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0f477b951e452a0b6b4a10b53ccd569042d1d01729b519e02074a9c0958a063" +checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" [[package]] -name = "async-stream" -version = "0.3.6" +name = "arrayvec" +version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b5a71a6f37880a80d1d7f19efd781e4b5de42c88f0722cc13bcb6cc2cfe8476" -dependencies = [ - "async-stream-impl", - "futures-core", - "pin-project-lite", -] +checksum = "d3fb67a6e08acf24fdeccbac2cb6ac4305825bd1f117462e0e6f2f193345ad56" [[package]] -name = "async-stream-impl" -version = "0.3.6" +name = "arrow" +version = "58.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" +checksum = "6cfdd0833e32a9874d2b55089333ad310c0be208aafa277385ce2461dec90be3" dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", + "arrow-arith", + "arrow-array", + "arrow-buffer", + "arrow-cast", + "arrow-csv", + "arrow-data", + "arrow-ipc", + "arrow-json", + "arrow-ord", + "arrow-row", + "arrow-schema", + "arrow-select", + "arrow-string", ] [[package]] -name = "async-trait" -version = "0.1.89" +name = "arrow-arith" +version = "58.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" +checksum = "0a41203398f0eaa6f7ec8e62c0da742a21abf282c148fc157f6c35c90e29981a" dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", + "arrow-array", + "arrow-buffer", + "arrow-data", + "arrow-schema", + "chrono", + "num-traits", ] [[package]] -name = "atomic" -version = "0.6.1" +name = "arrow-array" +version = "58.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a89cbf775b137e9b968e67227ef7f775587cde3fd31b0d8599dbd0f598a48340" +checksum = "ae33dad492b7df00a217563a7b0ef2874df68a0deea1b1a3acf628152f7f7a69" dependencies = [ - "bytemuck", + "ahash", + "arrow-buffer", + "arrow-data", + "arrow-schema", + "chrono", + "chrono-tz", + "half", + "hashbrown 0.17.1", + "num-complex", + "num-integer", + "num-traits", ] [[package]] -name = "atomic-waker" -version = "1.1.2" +name = "arrow-buffer" +version = "58.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" +checksum = "b9552f96391c005e6ab449fa941420935e7e062489b12b8b1b08879b2163f5b5" +dependencies = [ + "bytes", + "half", + "num-bigint", + "num-traits", +] [[package]] -name = "autocfg" -version = "1.5.0" +name = "arrow-cast" +version = "58.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" +checksum = "3a8a327c9649f30d8406995f27642b68df354713cca3baaaf100f076f18d5f34" +dependencies = [ + "arrow-array", + "arrow-buffer", + "arrow-data", + "arrow-ord", + "arrow-schema", + "arrow-select", + "atoi", + "base64 0.22.1", + "chrono", + "comfy-table", + "half", + "lexical-core", + "num-traits", + "ryu", +] [[package]] -name = "aws-lc-rs" -version = "1.17.0" +name = "arrow-csv" +version = "58.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ec2f1fc3ec205783a5da9a7e6c1509cc69dedf09a1949e412c1e18469326d00" +checksum = "af0dd6d90d1955e9f9a014c1e563ee8aeffc21909085d25623e1da44d96eca26" dependencies = [ - "aws-lc-sys", - "zeroize", + "arrow-array", + "arrow-cast", + "arrow-schema", + "chrono", + "csv", + "csv-core", + "regex", ] [[package]] -name = "aws-lc-sys" -version = "0.41.0" +name = "arrow-data" +version = "58.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a2f9779ce85b93ab6170dd940ad0169b5766ff848247aff13bb788b832fe3f4" +checksum = "2b24852db04738907e06c04ea61e42fe7fda962a34513022dc0d0e754fb7976b" dependencies = [ - "cc", - "cmake", - "dunce", - "fs_extra", + "arrow-buffer", + "arrow-schema", + "half", + "num-integer", + "num-traits", ] [[package]] -name = "base16ct" -version = "0.2.0" +name = "arrow-ipc" +version = "58.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" +checksum = "29a908a11fcfb3fb2f6730f4ac15e367bc644e419155e96238f68cf3adde572b" +dependencies = [ + "arrow-array", + "arrow-buffer", + "arrow-data", + "arrow-schema", + "arrow-select", + "flatbuffers", + "lz4_flex", + "zstd", +] [[package]] -name = "base64" -version = "0.22.1" +name = "arrow-json" +version = "58.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" +checksum = "b8a96aed3931c076adee39ec2a40d8219fc7f09e79bcdaca1df16272993e1e14" +dependencies = [ + "arrow-array", + "arrow-buffer", + "arrow-cast", + "arrow-ord", + "arrow-schema", + "arrow-select", + "chrono", + "half", + "indexmap 2.14.2", + "itoa", + "lexical-core", + "memchr", + "num-traits", + "ryu", + "serde_core", + "serde_json", + "simdutf8", +] [[package]] -name = "base64ct" -version = "1.8.3" +name = "arrow-ord" +version = "58.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2af50177e190e07a26ab74f8b1efbfe2ef87da2116221318cb1c2e82baf7de06" +checksum = "63a083ec750f5c043f02946b4baf05fcdbb55f4560a3277055caca5cc99f3eb0" +dependencies = [ + "arrow-array", + "arrow-buffer", + "arrow-data", + "arrow-schema", + "arrow-select", +] [[package]] -name = "bincode" -version = "1.3.3" +name = "arrow-row" +version = "58.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" +checksum = "514ba0ef0d4c5896202dae736251ce415abb43a950bed570fb7981b8716c0e4c" dependencies = [ - "serde", + "arrow-array", + "arrow-buffer", + "arrow-data", + "arrow-schema", + "half", ] [[package]] -name = "bit-set" -version = "0.5.3" +name = "arrow-schema" +version = "58.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1" +checksum = "21ca356ad6425cecb6eb7b28e4f659f1ee7880fbb1a16127de7dd62901efee9e" dependencies = [ - "bit-vec", + "bitflags 2.13.1", + "serde_core", + "serde_json", ] [[package]] -name = "bit-vec" -version = "0.6.3" +name = "arrow-select" +version = "58.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" +checksum = "c58da39eb3d8350ad4a549e5c2bc49284dac554016c69829310350f1731b0aad" +dependencies = [ + "ahash", + "arrow-array", + "arrow-buffer", + "arrow-data", + "arrow-schema", + "num-traits", +] [[package]] -name = "bitflags" -version = "1.3.2" +name = "arrow-string" +version = "58.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" +checksum = "b6789b388467525e3271326b6b4915666ecfdf5142aef09779445c954b67543c" +dependencies = [ + "arrow-array", + "arrow-buffer", + "arrow-data", + "arrow-schema", + "arrow-select", + "memchr", + "num-traits", + "regex", + "regex-syntax", +] [[package]] -name = "bitflags" -version = "2.11.1" +name = "as-any" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4512299f36f043ab09a583e57bceb5a5aab7a73db1805848e8fef3c9e8c78b3" +checksum = "b0f477b951e452a0b6b4a10b53ccd569042d1d01729b519e02074a9c0958a063" [[package]] -name = "block-buffer" -version = "0.10.4" +name = "as-slice" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +checksum = "516b6b4f0e40d50dcda9365d53964ec74560ad4284da2e7fc97122cd83174516" dependencies = [ - "generic-array", + "stable_deref_trait", ] [[package]] -name = "bstr" -version = "1.12.1" +name = "async-channel" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63044e1ae8e69f3b5a92c736ca6269b8d12fa7efe39bf34ddb06d102cf0e2cab" +checksum = "924ed96dd52d1b75e9c1a3e6275715fd320f5f9439fb5a4a11fa51f4221158d2" dependencies = [ - "memchr", - "serde", + "concurrent-queue", + "event-listener-strategy", + "futures-core", + "pin-project-lite", ] [[package]] -name = "bumpalo" -version = "3.20.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d20789868f4b01b2f2caec9f5c4e0213b41e3e5702a50157d699ae31ced2fcb" - -[[package]] -name = "bytemuck" -version = "1.25.0" +name = "async-compression" +version = "0.4.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8efb64bd706a16a1bdde310ae86b351e4d21550d98d056f22f8a7f7a2183fec" +checksum = "515a1f282e33d55983c499d7e9e87082e81cbc32974825bf9032f928392d5844" +dependencies = [ + "compression-codecs", + "compression-core", + "pin-project-lite", + "tokio", +] [[package]] -name = "byteorder" -version = "1.5.0" +name = "async-lock" +version = "3.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" +checksum = "290f7f2596bd5b78a9fec8088ccd89180d7f9f55b94b0576823bbbdc72ee8311" +dependencies = [ + "event-listener", + "event-listener-strategy", + "pin-project-lite", +] [[package]] -name = "byteorder-lite" -version = "0.1.0" +name = "async-recursion" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495" +checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] [[package]] -name = "bytes" -version = "1.11.1" +name = "async-stream" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33" +checksum = "0b5a71a6f37880a80d1d7f19efd781e4b5de42c88f0722cc13bcb6cc2cfe8476" +dependencies = [ + "async-stream-impl", + "futures-core", + "pin-project-lite", +] [[package]] -name = "camino" -version = "1.2.2" +name = "async-stream-impl" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e629a66d692cb9ff1a1c664e41771b3dcaf961985a9774c0eb0bd1b51cf60a48" +checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" dependencies = [ - "serde_core", + "proc-macro2", + "quote", + "syn 2.0.119", ] [[package]] -name = "cargo-platform" -version = "0.3.3" +name = "async-trait" +version = "0.1.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd0061da739915fae12ea00e16397555ed4371a6bb285431aab930f61b0aa4ba" +checksum = "82f6aeea286b8eb4dd3431a1be1b59d290ace00f5bfd8e2a159bc2a05e2c1667" dependencies = [ - "serde", - "serde_core", + "proc-macro2", + "quote", + "syn 3.0.5", ] [[package]] -name = "cargo_metadata" -version = "0.23.1" +name = "async_cell" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef987d17b0a113becdd19d3d0022d04d7ef41f9efe4f3fb63ac44ba61df3ade9" +checksum = "447ab28afbb345f5408b120702a44e5529ebf90b1796ec76e9528df8e288e6c2" dependencies = [ - "camino", - "cargo-platform", - "semver", - "serde", - "serde_json", - "thiserror 2.0.18", + "loom", ] [[package]] -name = "castaway" -version = "0.2.4" +name = "atoi" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dec551ab6e7578819132c713a93c022a05d60159dc86e7a7050223577484c55a" +checksum = "f28d99ec8bfea296261ca1af174f24225171fea9664ba9003cbebee704810528" dependencies = [ - "rustversion", + "num-traits", ] [[package]] -name = "cc" -version = "1.2.62" +name = "atomic" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1dce859f0832a7d088c4f1119888ab94ef4b5d6795d1ce05afb7fe159d79f98" +checksum = "a89cbf775b137e9b968e67227ef7f775587cde3fd31b0d8599dbd0f598a48340" dependencies = [ - "find-msvc-tools", - "jobserver", - "libc", - "shlex", + "bytemuck", ] [[package]] -name = "cfg-if" -version = "1.0.4" +name = "atomic-waker" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" [[package]] -name = "cfg_aliases" -version = "0.2.1" +name = "autocfg" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" +checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53" [[package]] -name = "chacha20" -version = "0.10.0" +name = "av-scenechange" +version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f8d983286843e49675a4b7a2d174efe136dc93a18d69130dd18198a6c167601" +checksum = "0f321d77c20e19b92c39e7471cf986812cbb46659d2af674adc4331ef3f18394" dependencies = [ - "cfg-if", - "cpufeatures 0.3.0", - "rand_core 0.10.1", + "aligned", + "anyhow", + "arg_enum_proc_macro", + "arrayvec", + "log", + "num-rational", + "num-traits", + "pastey 0.1.1", + "rayon", + "thiserror 2.0.20", + "v_frame", + "y4m", ] [[package]] -name = "chrono" -version = "0.4.44" +name = "av1-grain" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c673075a2e0e5f4a1dde27ce9dee1ea4558c7ffe648f576438a20ca1d2acc4b0" +checksum = "8cfddb07216410377231960af4fcab838eaa12e013417781b78bd95ee22077f8" dependencies = [ - "iana-time-zone", - "js-sys", - "num-traits", - "serde", - "wasm-bindgen", - "windows-link", + "anyhow", + "arrayvec", + "log", + "nom 8.0.0", + "num-rational", + "v_frame", ] [[package]] -name = "clap" -version = "4.6.1" +name = "avif-serialize" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ddb117e43bbf7dacf0a4190fef4d345b9bad68dfc649cb349e7d17d28428e51" +checksum = "e7178fe5f7d460b13895ebb9dcb28a3a6216d2df2574a0806cb51b555d297f38" dependencies = [ - "clap_builder", - "clap_derive", + "arrayvec", ] [[package]] -name = "clap_builder" -version = "4.6.0" +name = "aws-lc-rs" +version = "1.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "714a53001bf66416adb0e2ef5ac857140e7dc3a0c48fb28b2f10762fc4b5069f" +checksum = "b281d307588d634de920874890732659e2e7672f72b5e10e81badc1a8a83621e" dependencies = [ - "anstream", - "anstyle", - "clap_lex", - "strsim 0.11.1", + "aws-lc-sys", + "untrusted 0.7.1", + "zeroize", ] [[package]] -name = "clap_complete" -version = "4.6.5" +name = "aws-lc-sys" +version = "0.45.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0a7a9bfdb35811f9e59832f0f05975114d2251b415fb534108e6f34060fd772" +checksum = "9bff6c3b54fad79a2e60b8102caf565819711497c1f5f092f49508e2f5c31b27" dependencies = [ - "clap", + "cc", + "cmake", + "dunce", + "fs_extra", + "pkg-config", ] [[package]] -name = "clap_derive" -version = "4.6.1" +name = "base64" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2ce8604710f6733aa641a2b3731eaa1e8b3d9973d5e3565da11800813f997a9" -dependencies = [ - "heck 0.5.0", - "proc-macro2", - "quote", - "syn 2.0.117", -] +checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" [[package]] -name = "clap_lex" -version = "1.1.0" +name = "base64" +version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" [[package]] -name = "clipboard-win" -version = "5.4.1" +name = "bigdecimal" +version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bde03770d3df201d4fb868f2c9c59e66a3e4e2bd06692a0fe701e7103c7e84d4" +checksum = "4d6867f1565b3aad85681f1015055b087fcfd840d6aeee6eee7f2da317603695" dependencies = [ - "error-code", + "autocfg", + "libm", + "num-bigint", + "num-integer", + "num-traits", ] [[package]] -name = "cmake" -version = "0.1.58" +name = "bincode" +version = "1.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0f78a02292a74a88ac736019ab962ece0bc380e3f977bf72e376c5d78ff0678" +checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" dependencies = [ - "cc", + "serde", ] [[package]] -name = "colorchoice" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d07550c9036bf2ae0c684c4297d503f838287c83c53686d05370d0e139ae570" - -[[package]] -name = "colored" -version = "3.1.1" +name = "bit-set" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "faf9468729b8cbcea668e36183cb69d317348c2e08e994829fb56ebfdfbaac34" +checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1" dependencies = [ - "windows-sys 0.61.2", + "bit-vec", ] [[package]] -name = "combine" -version = "4.6.7" +name = "bit-vec" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" -dependencies = [ - "bytes", - "memchr", -] +checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" [[package]] -name = "compact_str" -version = "0.9.0" +name = "bit_field" +version = "0.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdb1325a1cece981e8a296ab8f0f9b63ae357bd0784a9faaf548cc7b480707a" -dependencies = [ - "castaway", - "cfg-if", - "itoa", - "rustversion", - "ryu", - "static_assertions", -] +checksum = "1e4b40c7323adcfc0a41c4b88143ed58346ff65a288fc144329c5c45e05d70c6" [[package]] -name = "console" -version = "0.16.3" +name = "bitflags" +version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d64e8af5551369d19cf50138de61f1c42074ab970f74e99be916646777f8fc87" -dependencies = [ - "encode_unicode", - "libc", - "unicode-width", - "windows-sys 0.61.2", -] +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] -name = "const-oid" -version = "0.9.6" +name = "bitflags" +version = "2.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" +checksum = "b588b76d00fde79687d7646a9b5bdf3cc0f655e0bbd080335a95d7e96f3587da" [[package]] -name = "convert_case" -version = "0.10.0" +name = "bitpacking" +version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "633458d4ef8c78b72454de2d54fd6ab2e60f9e02be22f3c6104cdc8a4e0fceb9" +checksum = "96a7139abd3d9cebf8cd6f920a389cf3dc9576172e32f4563f188cae3c3eb019" dependencies = [ - "unicode-segmentation", + "crunchy", ] [[package]] -name = "core-foundation" -version = "0.9.4" +name = "bitstream-io" +version = "4.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" +checksum = "7eff00be299a18769011411c9def0d827e8f2d7bf0c3dbf53633147a8867fd1f" dependencies = [ - "core-foundation-sys", - "libc", + "no_std_io2", ] [[package]] -name = "core-foundation" -version = "0.10.1" +name = "bitvec" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6" +checksum = "ddcec3d12c579d40898fe0a9a358a803c23e9c52ca3c425707f81c9436211837" dependencies = [ - "core-foundation-sys", - "libc", + "funty", + "radium", + "tap", + "wyz", ] [[package]] -name = "core-foundation-sys" -version = "0.8.7" +name = "blake2" +version = "0.10.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" +checksum = "46502ad458c9a52b69d4d4d32775c788b7a1b85e8bc9d482d92250fc0e3f8efe" +dependencies = [ + "digest", +] [[package]] -name = "cpufeatures" -version = "0.2.17" +name = "blake3" +version = "1.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +checksum = "6d9e454fc11f76977dc803893aff6304ed33d6a26efae8696573bea74baa27ae" dependencies = [ - "libc", + "arrayvec", + "cc", + "cfg-if", + "constant_time_eq", + "cpufeatures 0.3.1", ] [[package]] -name = "cpufeatures" -version = "0.3.0" +name = "block-buffer" +version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b2a41393f66f16b0823bb79094d54ac5fbd34ab292ddafb9a0456ac9f87d201" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" dependencies = [ - "libc", + "generic-array", ] [[package]] -name = "crc32fast" -version = "1.5.0" +name = "brotli" +version = "8.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" +checksum = "5cc91aac060a7a1e25823bdccbfb6af1875b88f17c6daac97894eed8207166b3" dependencies = [ - "cfg-if", + "alloc-no-stdlib", + "alloc-stdlib", + "brotli-decompressor", ] [[package]] -name = "crossbeam-deque" -version = "0.8.6" +name = "brotli-decompressor" +version = "5.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" +checksum = "3a32acac15fe1967bc3986b2a6347dffc965602354ea6f450ad07e8bfd253583" dependencies = [ - "crossbeam-epoch", - "crossbeam-utils", + "alloc-no-stdlib", + "alloc-stdlib", ] [[package]] -name = "crossbeam-epoch" -version = "0.9.18" +name = "bs58" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +checksum = "bf88ba1141d185c399bee5288d850d63b8369520c1eafc32a0430b5b6c287bf4" dependencies = [ - "crossbeam-utils", + "tinyvec", ] [[package]] -name = "crossbeam-utils" -version = "0.8.21" +name = "bstr" +version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" +checksum = "6bb31b46c14244e20ee9984b11bf5c992b91fb6939fea616e3512c8baecdbe5f" +dependencies = [ + "memchr", + "serde_core", +] [[package]] -name = "crossterm" -version = "0.29.0" +name = "built" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8b9f2e4c67f833b660cdb0a3523065869fb35570177239812ed4c905aeff87b" -dependencies = [ - "bitflags 2.11.1", - "crossterm_winapi", - "derive_more", - "document-features", - "mio", - "parking_lot", - "rustix", - "signal-hook", - "signal-hook-mio", - "winapi", -] +checksum = "5c0e531d93d39c34eef561e929e8a7f86d77a5af08aac4f6d6e39976c51858e9" [[package]] -name = "crossterm_winapi" -version = "0.9.1" +name = "bumpalo" +version = "3.20.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acdd7c62a3665c7f6830a51635d9ac9b23ed385797f70a83bb8bafe9c572ab2b" -dependencies = [ - "winapi", -] +checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649" [[package]] -name = "crunchy" -version = "0.2.4" +name = "by_address" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" +checksum = "64fa3c856b712db6612c019f14756e64e4bcea13337a6b33b696333a9eaa2d06" [[package]] -name = "crypto-bigint" -version = "0.5.5" +name = "bytecheck" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" +checksum = "26333eeac754f0ad8a6bcd0eb0ac012156302e4e16b852b72ee399aea4f12c29" dependencies = [ - "generic-array", - "rand_core 0.6.4", - "subtle", - "zeroize", + "bytecheck_derive", + "ptr_meta", + "rancor", + "simdutf8", ] [[package]] -name = "crypto-common" -version = "0.1.6" +name = "bytecheck_derive" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +checksum = "46d07918caa9eeaaf06b7873925c53a61daac173539b4f7715090745e44e4e69" dependencies = [ - "generic-array", - "typenum", + "proc-macro2", + "quote", + "syn 3.0.5", ] [[package]] -name = "csscolorparser" -version = "0.6.2" +name = "bytemuck" +version = "1.25.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb2a7d3066da2de787b7f032c736763eb7ae5d355f81a68bab2675a96008b0bf" -dependencies = [ - "lab", - "phf", -] +checksum = "95832e849adfb21180ccb6826a99da14e5d266ae5c2e668e1602cf234f153797" [[package]] -name = "curve25519-dalek" -version = "4.1.3" +name = "byteorder" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97fb8b7c4503de7d6ae7b42ab72a5a59857b4c937ec27a3d4539dba95b5ab2be" -dependencies = [ - "cfg-if", - "cpufeatures 0.2.17", - "curve25519-dalek-derive", - "digest", - "fiat-crypto", - "rustc_version", - "subtle", - "zeroize", -] +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] -name = "curve25519-dalek-derive" -version = "0.1.1" +name = "byteorder-lite" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] +checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495" [[package]] -name = "darling" -version = "0.23.0" +name = "bytes" +version = "1.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25ae13da2f202d56bd7f91c25fba009e7717a1e4a1cc98a76d844b65ae912e9d" -dependencies = [ - "darling_core", - "darling_macro", -] +checksum = "fc652a48c352aef3ea3aed32080501cf3ef6ed5da78602a020c991775b0aff04" [[package]] -name = "darling_core" -version = "0.23.0" +name = "camino" +version = "1.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9865a50f7c335f53564bb694ef660825eb8610e0a53d3e11bf1b0d3df31e03b0" +checksum = "bb1307f12aa967b5a58416e87b3653360e0fd614a016b6e970db08fecbb1b80d" dependencies = [ - "ident_case", - "proc-macro2", - "quote", - "strsim 0.11.1", - "syn 2.0.117", + "serde_core", ] [[package]] -name = "darling_macro" -version = "0.23.0" +name = "cargo-platform" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac3984ec7bd6cfa798e62b4a642426a5be0e68f9401cfc2a01e3fa9ea2fcdb8d" +checksum = "dd0061da739915fae12ea00e16397555ed4371a6bb285431aab930f61b0aa4ba" dependencies = [ - "darling_core", - "quote", - "syn 2.0.117", + "serde", + "serde_core", ] [[package]] -name = "data-encoding" -version = "2.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4ae5f15dda3c708c0ade84bfee31ccab44a3da4f88015ed22f63732abe300c8" - -[[package]] -name = "deltae" -version = "0.3.2" +name = "cargo_metadata" +version = "0.23.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5729f5117e208430e437df2f4843f5e5952997175992d1414f94c57d61e270b4" +checksum = "ef987d17b0a113becdd19d3d0022d04d7ef41f9efe4f3fb63ac44ba61df3ade9" +dependencies = [ + "camino", + "cargo-platform", + "semver", + "serde", + "serde_json", + "thiserror 2.0.20", +] [[package]] -name = "deluxe" -version = "0.5.0" +name = "castaway" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ed332aaf752b459088acf3dd4eca323e3ef4b83c70a84ca48fb0ec5305f1488" +checksum = "dec551ab6e7578819132c713a93c022a05d60159dc86e7a7050223577484c55a" dependencies = [ - "deluxe-core", - "deluxe-macros", - "once_cell", - "proc-macro2", - "syn 2.0.117", + "rustversion", ] [[package]] -name = "deluxe-core" -version = "0.5.0" +name = "cc" +version = "1.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eddada51c8576df9d6a8450c351ff63042b092c9458b8ac7d20f89cbd0ffd313" +checksum = "005ec2760ca554fae18df7a11195552ec576cd665632a881bc011d5bb2fd4d80" dependencies = [ - "arrayvec", - "proc-macro2", - "quote", - "strsim 0.10.0", - "syn 2.0.117", + "find-msvc-tools", + "jobserver", + "libc", + "shlex", ] [[package]] -name = "deluxe-macros" -version = "0.5.0" +name = "cedarwood" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f87546d9c837f0b7557e47b8bd6eae52c3c223141b76aa233c345c9ab41d9117" +checksum = "6d910bedd62c24733263d0bed247460853c9d22e8956bd4cd964302095e04e90" dependencies = [ - "deluxe-core", - "heck 0.4.1", - "if_chain", - "proc-macro-crate 1.3.1", - "proc-macro2", - "quote", - "syn 2.0.117", + "smallvec", ] [[package]] -name = "der" -version = "0.7.10" +name = "cfg-if" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" -dependencies = [ - "const-oid", - "pem-rfc7468", - "zeroize", -] +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" [[package]] -name = "deranged" -version = "0.5.8" +name = "cfg_aliases" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c" -dependencies = [ - "powerfmt", -] +checksum = "f079e83a288787bcd14a6aea84cee5c87a67c5a3e660c30f557a3d24761b3527" [[package]] -name = "derive_more" -version = "2.1.1" +name = "chacha20" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d751e9e49156b02b44f9c1815bcb94b984cdcc4396ecc32521c739452808b134" +checksum = "65c35e4b699c7e15ccbe7ee35c005e4fc0a278d22238a2857e6ce2dadeda1b06" dependencies = [ - "derive_more-impl", + "cfg-if", + "cpufeatures 0.3.1", + "rand_core 0.10.1", ] [[package]] -name = "derive_more-impl" -version = "2.1.1" +name = "chrono" +version = "0.4.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "799a97264921d8623a957f6c3b9011f3b5492f557bbb7a5a19b7fa6d06ba8dcb" +checksum = "1aa79e62e7697b8e29b513a68abacf485adcd1fe8284a4316c5ae868e6633327" dependencies = [ - "convert_case", - "proc-macro2", - "quote", - "rustc_version", - "syn 2.0.117", + "iana-time-zone", + "js-sys", + "num-traits", + "serde", + "wasm-bindgen", + "windows-link", ] [[package]] -name = "digest" -version = "0.10.7" +name = "chrono-tz" +version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +checksum = "a6139a8597ed92cf816dfb33f5dd6cf0bb93a6adc938f11039f371bc5bcd26c3" dependencies = [ - "block-buffer", - "const-oid", - "crypto-common", - "subtle", + "chrono", + "phf 0.12.1", ] [[package]] -name = "dirs" -version = "6.0.0" +name = "clap" +version = "4.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3e8aa94d75141228480295a7d0e7feb620b1a5ad9f12bc40be62411e38cce4e" +checksum = "473c7e07f409a8d772161724aa8db6a765a2532a70f9667eeb7b49d3d02fbdca" dependencies = [ - "dirs-sys", + "clap_builder", + "clap_derive", ] [[package]] -name = "dirs-sys" -version = "0.5.0" +name = "clap_builder" +version = "4.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e01a3366d27ee9890022452ee61b2b63a67e6f13f58900b651ff5665f0bb1fab" +checksum = "7b48fea5a88e9ae728a2dcbedbfc0e730f7d60da42e1cb049a83c9fb8b789889" dependencies = [ - "libc", - "option-ext", - "redox_users", - "windows-sys 0.61.2", + "anstream", + "anstyle", + "clap_lex", + "strsim", ] [[package]] -name = "dispatch2" -version = "0.3.1" +name = "clap_complete" +version = "4.6.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e0e367e4e7da84520dedcac1901e4da967309406d1e51017ae1abfb97adbd38" +checksum = "3be2ad0423bdbbb0e25bc89add796f3559706d4a95e1bc98e4d9662a957b6a19" dependencies = [ - "bitflags 2.11.1", - "objc2", + "clap", ] [[package]] -name = "displaydoc" -version = "0.2.5" +name = "clap_derive" +version = "4.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +checksum = "d012d2b9d65aca7f18f4d9878a045bc17899bba951561ba5ec3c2ba1eed9a061" dependencies = [ + "heck", "proc-macro2", "quote", - "syn 2.0.117", + "syn 3.0.5", ] [[package]] -name = "document-features" -version = "0.2.12" +name = "clap_lex" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4b8a88685455ed29a21542a33abd9cb6510b6b129abadabdcef0f4c55bc8f61" +checksum = "c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9" + +[[package]] +name = "clipboard-win" +version = "5.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bde03770d3df201d4fb868f2c9c59e66a3e4e2bd06692a0fe701e7103c7e84d4" dependencies = [ - "litrs", + "error-code", ] [[package]] -name = "dotenvy" -version = "0.15.7" +name = "cmake" +version = "0.1.58" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b" +checksum = "c0f78a02292a74a88ac736019ab962ece0bc380e3f977bf72e376c5d78ff0678" +dependencies = [ + "cc", +] [[package]] -name = "dunce" -version = "1.0.5" +name = "color_quant" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" +checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" [[package]] -name = "dyn-clone" -version = "1.0.20" +name = "colorchoice" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" +checksum = "1d07550c9036bf2ae0c684c4297d503f838287c83c53686d05370d0e139ae570" [[package]] -name = "ecdsa" -version = "0.16.9" +name = "colored" +version = "3.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" +checksum = "faf9468729b8cbcea668e36183cb69d317348c2e08e994829fb56ebfdfbaac34" dependencies = [ - "der", - "digest", - "elliptic-curve", - "rfc6979", - "signature", - "spki", + "windows-sys 0.59.0", ] [[package]] -name = "ed25519" -version = "2.2.3" +name = "combine" +version = "4.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "115531babc129696a58c64a4fef0a8bf9e9698629fb97e9e40767d235cfbcd53" +checksum = "cfc320937d09e6de266b31b9afb480f197d7a861be86be7cb2ea7e5d1bfffc5e" dependencies = [ - "pkcs8", - "signature", + "bytes", + "memchr", ] [[package]] -name = "ed25519-dalek" -version = "2.2.0" +name = "comfy-table" +version = "7.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70e796c081cee67dc755e1a36a0a172b897fab85fc3f6bc48307991f64e4eca9" +checksum = "958c5d6ecf1f214b4c2bbbbf6ab9523a864bd136dcf71a7e8904799acfe1ad47" dependencies = [ - "curve25519-dalek", - "ed25519", - "serde", - "sha2", - "subtle", - "zeroize", + "unicode-segmentation", + "unicode-width", ] [[package]] -name = "either" -version = "1.15.0" +name = "compact_str" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" +checksum = "9dfdd1c2274d9aa354115b09dc9a901d6c5576818cdf70d14cae2bdb47df00ab" +dependencies = [ + "castaway", + "cfg-if", + "itoa", + "rustversion", + "ryu", + "serde", + "static_assertions", +] [[package]] -name = "elliptic-curve" -version = "0.13.8" +name = "compression-codecs" +version = "0.4.39" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" +checksum = "2fe67f2944eef52fc7b106b8c9450d243a88701a0c065f7f57235e76abaed7df" dependencies = [ - "base16ct", - "crypto-bigint", - "digest", - "ff", - "generic-array", - "group", - "hkdf", - "pem-rfc7468", - "pkcs8", - "rand_core 0.6.4", - "sec1", - "subtle", - "zeroize", + "compression-core", + "flate2", + "memchr", ] [[package]] -name = "encode_unicode" -version = "1.0.0" +name = "compression-core" +version = "0.4.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0" +checksum = "6e8ccc4ea9f6acc32d102c0f6d471d11d913ad15f20c04de743374861fa1d414" [[package]] -name = "encoding_rs" -version = "0.8.35" +name = "concurrent-queue" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" +checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" dependencies = [ - "cfg-if", + "crossbeam-utils", ] [[package]] -name = "equivalent" -version = "1.0.2" +name = "console" +version = "0.15.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" +checksum = "054ccb5b10f9f2cbf51eb355ca1d05c2d279ce1804688d0db74b4733a5aeafd8" +dependencies = [ + "encode_unicode", + "libc", + "once_cell", + "unicode-width", + "windows-sys 0.59.0", +] [[package]] -name = "errno" -version = "0.3.14" +name = "console" +version = "0.16.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" +checksum = "4fe5f465a4f6fee88fad41b85d990f84c835335e85b5d9e6e63e0d06d28cba7c" dependencies = [ + "encode_unicode", "libc", + "unicode-width", "windows-sys 0.61.2", ] [[package]] -name = "error-code" -version = "3.3.2" +name = "const-random" +version = "0.1.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dea2df4cf52843e0452895c455a1a2cfbb842a1e7329671acf418fdc53ed4c59" +checksum = "87e00182fe74b066627d63b85fd550ac2998d4b0bd86bfed477a0ae4c7c71359" +dependencies = [ + "const-random-macro", +] [[package]] -name = "euclid" -version = "0.22.14" +name = "const-random-macro" +version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1a05365e3b1c6d1650318537c7460c6923f1abdd272ad6842baa2b509957a06" +checksum = "f9d839f2a20b0aee515dc581a6172f2321f96cab76c1a38a4c584a194955390e" dependencies = [ - "num-traits", + "getrandom 0.2.17", + "once_cell", + "tiny-keccak", ] [[package]] -name = "eventsource-stream" -version = "0.2.3" +name = "constant_time_eq" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74fef4569247a5f429d9156b9d0a2599914385dd189c539334c625d8099d90ab" +checksum = "3d52eff69cd5e647efe296129160853a42795992097e8af39800e1060caeea9b" + +[[package]] +name = "convert_case" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "633458d4ef8c78b72454de2d54fd6ab2e60f9e02be22f3c6104cdc8a4e0fceb9" dependencies = [ - "futures-core", - "nom", - "pin-project-lite", + "unicode-segmentation", ] [[package]] -name = "fancy-regex" +name = "convert_case" version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b95f7c0680e4142284cf8b22c14a476e87d61b004a3a0861872b32ef7ead40a2" +checksum = "affbf0190ed2caf063e3def54ff444b449371d55c58e513a95ab98eca50adb49" dependencies = [ - "bit-set", - "regex", + "unicode-segmentation", ] [[package]] -name = "fastrand" -version = "2.4.1" +name = "core-foundation" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f1f227452a390804cdb637b74a86990f2a7d7ba4b7d5693aac9b4dd6defd8d6" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" +dependencies = [ + "core-foundation-sys", + "libc", +] [[package]] -name = "fax" -version = "0.2.7" +name = "core-foundation" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "caf1079563223d5d59d83c85886a56e586cfd5c1a26292e971a0fa266531ac5a" - -[[package]] -name = "fdeflate" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e6853b52649d4ac5c0bd02320cddc5ba956bdb407c4b75a2c6b75bf51500f8c" +checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6" dependencies = [ - "simd-adler32", + "core-foundation-sys", + "libc", ] [[package]] -name = "ff" -version = "0.13.1" +name = "core-foundation-sys" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0b50bfb653653f9ca9095b427bed08ab8d75a137839d9ad64eb11810d5b6393" -dependencies = [ - "rand_core 0.6.4", - "subtle", -] +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" [[package]] -name = "fiat-crypto" -version = "0.2.9" +name = "cpufeatures" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] [[package]] -name = "file-id" -version = "0.2.3" +name = "cpufeatures" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1fc6a637b6dc58414714eddd9170ff187ecb0933d4c7024d1abbd23a3cc26e9" +checksum = "5ca28b0ae3115b884660db4118d803791fd6756b6e88f39c0f3f7859060d7566" dependencies = [ - "windows-sys 0.60.2", + "libc", ] [[package]] -name = "filedescriptor" -version = "0.8.3" +name = "crc32fast" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e40758ed24c9b2eeb76c35fb0aebc66c626084edd827e07e1552279814c6682d" +checksum = "8498c871161e1742aaa9d52551b2d6ebdd4c3d45a3be423e3728f33b955be550" dependencies = [ - "libc", - "thiserror 1.0.69", - "winapi", + "cfg-if", ] [[package]] -name = "find-msvc-tools" -version = "0.1.9" +name = "critical-section" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" +checksum = "790eea4361631c5e7d22598ecd5723ff611904e3344ce8720784c93e3d83d40b" [[package]] -name = "finl_unicode" -version = "1.4.0" +name = "crossbeam-channel" +version = "0.5.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9844ddc3a6e533d62bba727eb6c28b5d360921d5175e9ff0f1e621a5c590a4d5" +checksum = "98b0cc327b5bc766e7fda9c9260cc0fa81b43a8e240440422dff70788e3f9ef1" +dependencies = [ + "crossbeam-utils", +] [[package]] -name = "fixedbitset" -version = "0.4.2" +name = "crossbeam-deque" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" +checksum = "622f3fc73690be383c7214310406f28a90e6edeadc3cea882f9d71e495b9711a" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", +] [[package]] -name = "flate2" -version = "1.1.9" +name = "crossbeam-epoch" +version = "0.9.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "843fba2746e448b37e26a819579957415c8cef339bf08564fe8b7ddbd959573c" +checksum = "dc74980687109a3b14c72fd458107bf0baa1da1a1a805e178d15501ba9b86d9d" dependencies = [ - "crc32fast", - "miniz_oxide", + "crossbeam-utils", ] [[package]] -name = "fnv" -version = "1.0.7" +name = "crossbeam-queue" +version = "0.3.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" +checksum = "03e8bd762f7479489c70ed6c768ddca99d7296857de437a68dcb2a94365b3fae" +dependencies = [ + "crossbeam-utils", +] [[package]] -name = "foldhash" -version = "0.1.5" +name = "crossbeam-skiplist" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" +checksum = "df29de440c58ca2cc6e587ec3d22347551a32435fbde9d2bff64e78a9ffa151b" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", +] [[package]] -name = "foldhash" -version = "0.2.0" +name = "crossbeam-utils" +version = "0.8.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" +checksum = "a31eee39dddec8330830986fcd7625edb5a24ec90ea038215273bbc3adb08ac6" [[package]] -name = "form_urlencoded" -version = "1.2.2" +name = "crossterm" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" +checksum = "d8b9f2e4c67f833b660cdb0a3523065869fb35570177239812ed4c905aeff87b" dependencies = [ - "percent-encoding", + "bitflags 2.13.1", + "crossterm_winapi", + "derive_more", + "document-features", + "mio", + "parking_lot", + "rustix", + "signal-hook", + "signal-hook-mio", + "winapi", ] [[package]] -name = "fs_extra" -version = "1.3.0" +name = "crossterm_winapi" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" +checksum = "acdd7c62a3665c7f6830a51635d9ac9b23ed385797f70a83bb8bafe9c572ab2b" +dependencies = [ + "winapi", +] [[package]] -name = "fsevent-sys" -version = "4.1.0" +name = "crunchy" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76ee7a02da4d231650c7cea31349b889be2f45ddb3ef3032d2ec8185f6313fd2" -dependencies = [ - "libc", -] +checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" [[package]] -name = "futures" -version = "0.3.32" +name = "crypto-common" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b147ee9d1f6d097cef9ce628cd2ee62288d963e16fb287bd9286455b241382d" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" dependencies = [ - "futures-channel", - "futures-core", - "futures-executor", - "futures-io", - "futures-sink", - "futures-task", - "futures-util", + "generic-array", + "typenum", ] [[package]] -name = "futures-channel" -version = "0.3.32" +name = "csscolorparser" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07bbe89c50d7a535e539b8c17bc0b49bdb77747034daa8087407d655f3f7cc1d" +checksum = "eb2a7d3066da2de787b7f032c736763eb7ae5d355f81a68bab2675a96008b0bf" dependencies = [ - "futures-core", - "futures-sink", + "lab", + "phf 0.11.3", ] [[package]] -name = "futures-core" -version = "0.3.32" +name = "csv" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d" +checksum = "52cd9d68cf7efc6ddfaaee42e7288d3a99d613d4b50f76ce9827ae0c6e14f938" +dependencies = [ + "csv-core", + "itoa", + "ryu", + "serde_core", +] [[package]] -name = "futures-executor" -version = "0.3.32" +name = "csv-core" +version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf29c38818342a3b26b5b923639e7b1f4a61fc5e76102d4b1981c6dc7a7579d" +checksum = "704a3c26996a80471189265814dbc2c257598b96b8a7feae2d31ace646bb9782" dependencies = [ - "futures-core", - "futures-task", - "futures-util", + "memchr", ] [[package]] -name = "futures-io" -version = "0.3.32" +name = "daachorse" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cecba35d7ad927e23624b22ad55235f2239cfa44fd10428eecbeba6d6a717718" +checksum = "db756b5eb7d81d31f31f660f4132f8cf5698de52fca144c143d0ae0cbb5f2e06" [[package]] -name = "futures-macro" -version = "0.3.32" +name = "darling" +version = "0.20.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e835b70203e41293343137df5c0664546da5745f82ec9b84d40be8336958447b" +checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee" dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", + "darling_core 0.20.11", + "darling_macro 0.20.11", ] [[package]] -name = "futures-sink" -version = "0.3.32" +name = "darling" +version = "0.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c39754e157331b013978ec91992bde1ac089843443c49cbc7f46150b0fad0893" +checksum = "25ae13da2f202d56bd7f91c25fba009e7717a1e4a1cc98a76d844b65ae912e9d" +dependencies = [ + "darling_core 0.23.0", + "darling_macro 0.23.0", +] [[package]] -name = "futures-task" -version = "0.3.32" +name = "darling" +version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393" +checksum = "ed17f5901b6630b993ca003def43f2f8ef4014fc13b047b57aad617ff32bc2ec" +dependencies = [ + "darling_core 0.24.1", + "darling_macro 0.24.1", +] [[package]] -name = "futures-timer" -version = "3.0.3" +name = "darling_core" +version = "0.20.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f288b0a4f20f9a56b5d1da57e2227c661b7b16168e2f72365f57b63326e29b24" +checksum = "0d00b9596d185e565c2207a0b01f8bd1a135483d02d9b7b0a54b11da8d53412e" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn 2.0.119", +] [[package]] -name = "futures-util" -version = "0.3.32" +name = "darling_core" +version = "0.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6" +checksum = "9865a50f7c335f53564bb694ef660825eb8610e0a53d3e11bf1b0d3df31e03b0" dependencies = [ - "futures-channel", - "futures-core", - "futures-io", - "futures-macro", - "futures-sink", - "futures-task", - "memchr", - "pin-project-lite", - "slab", + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn 2.0.119", ] [[package]] -name = "generic-array" -version = "0.14.9" +name = "darling_core" +version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bb6743198531e02858aeaea5398fcc883e71851fcbcb5a2f773e2fb6cb1edf2" +checksum = "6837e2cf7485aaae18f86181d2f0e9a7ed297a025e220aeabf63fdebd3a2ddff" dependencies = [ - "typenum", - "version_check", - "zeroize", + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn 3.0.5", ] [[package]] -name = "gethostname" -version = "1.1.0" +name = "darling_macro" +version = "0.20.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bd49230192a3797a9a4d6abe9b3eed6f7fa4c8a8a4947977c6f80025f92cbd8" +checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" dependencies = [ - "rustix", - "windows-link", + "darling_core 0.20.11", + "quote", + "syn 2.0.119", ] [[package]] -name = "getopts" -version = "0.2.24" +name = "darling_macro" +version = "0.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfe4fbac503b8d1f88e6676011885f34b7174f46e59956bba534ba83abded4df" +checksum = "ac3984ec7bd6cfa798e62b4a642426a5be0e68f9401cfc2a01e3fa9ea2fcdb8d" dependencies = [ - "unicode-width", + "darling_core 0.23.0", + "quote", + "syn 2.0.119", ] [[package]] -name = "getrandom" -version = "0.2.17" +name = "darling_macro" +version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" +checksum = "2ac7135c3ef02b2f7833bbeb1be5ba7f966dcde8a87c6b87f65a778d71a02785" dependencies = [ - "cfg-if", - "js-sys", - "libc", - "wasi", - "wasm-bindgen", + "darling_core 0.24.1", + "quote", + "syn 3.0.5", ] [[package]] -name = "getrandom" -version = "0.3.4" +name = "dary_heap" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" +checksum = "8b1e3a325bc115f096c8b77bbf027a7c2592230e70be2d985be950d3d5e60ebe" dependencies = [ - "cfg-if", - "js-sys", - "libc", - "r-efi 5.3.0", - "wasip2", - "wasm-bindgen", + "serde", ] [[package]] -name = "getrandom" -version = "0.4.2" +name = "dashmap" +version = "6.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0de51e6874e94e7bf76d726fc5d13ba782deca734ff60d5bb2fb2607c7406555" +checksum = "e6361d5c062261c78a176addb82d4c821ae42bed6089de0e12603cd25de2059c" dependencies = [ "cfg-if", - "libc", - "r-efi 6.0.0", - "rand_core 0.10.1", - "wasip2", - "wasip3", + "crossbeam-utils", + "hashbrown 0.14.5", + "lock_api", + "once_cell", + "parking_lot_core", ] [[package]] -name = "gh-token" -version = "0.1.8" +name = "data-encoding" +version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6b05178455aca6d0624534729a2f8d2b94c93b02c0fcdf1736453912b9a9b4f" -dependencies = [ - "home", - "serde", - "serde_derive", - "serde_yaml", -] +checksum = "4583a4551df46e2792f82ceeac45e850d2e2d5debba0b91f102385cda5b11f06" [[package]] -name = "git-iris" -version = "2.1.0" +name = "datafusion" +version = "53.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93db0e623840612f7f2cd757f7e8a8922064192363732c88692e0870016e141b" dependencies = [ - "anyhow", - "arboard", + "arrow", + "arrow-schema", "async-trait", + "bytes", "chrono", - "clap", - "clap_complete", - "colored", - "crossterm", - "dirs", - "dotenvy", + "datafusion-catalog", + "datafusion-catalog-listing", + "datafusion-common", + "datafusion-common-runtime", + "datafusion-datasource", + "datafusion-datasource-arrow", + "datafusion-datasource-csv", + "datafusion-datasource-json", + "datafusion-execution", + "datafusion-expr", + "datafusion-expr-common", + "datafusion-functions", + "datafusion-functions-aggregate", + "datafusion-functions-nested", + "datafusion-functions-table", + "datafusion-functions-window", + "datafusion-optimizer", + "datafusion-physical-expr", + "datafusion-physical-expr-adapter", + "datafusion-physical-expr-common", + "datafusion-physical-optimizer", + "datafusion-physical-plan", + "datafusion-session", + "datafusion-sql", "futures", - "gh-token", - "git2", - "ignore", - "indicatif", - "lru 0.18.0", - "notify", - "notify-debouncer-full", - "octocrab", - "opaline", + "itertools 0.14.0", + "log", + "object_store", "parking_lot", - "pulldown-cmark", - "rand 0.10.1", - "ratatui", - "ratatui-textarea", + "rand 0.9.5", "regex", - "reqwest", - "rig-core", - "rustls", - "schemars", - "serde", - "serde_json", - "strum 0.28.0", - "strum_macros 0.28.0", - "syntect", + "sqlparser", "tempfile", - "textwrap", - "thiserror 2.0.18", "tokio", - "tokio-util", - "toml 1.1.2+spec-1.1.0", - "tracing", - "tracing-subscriber", - "unicode-width", "url", "uuid", ] [[package]] -name = "git2" -version = "0.20.4" +name = "datafusion-catalog" +version = "53.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b88256088d75a56f8ecfa070513a775dd9107f6530ef14919dac831af9cfe2b" +checksum = "37cefde60b26a7f4ff61e9d2ff2833322f91df2b568d7238afe67bde5bdffb66" dependencies = [ - "bitflags 2.11.1", - "libc", - "libgit2-sys", + "arrow", + "async-trait", + "dashmap", + "datafusion-common", + "datafusion-common-runtime", + "datafusion-datasource", + "datafusion-execution", + "datafusion-expr", + "datafusion-physical-expr", + "datafusion-physical-plan", + "datafusion-session", + "futures", + "itertools 0.14.0", "log", - "openssl-probe 0.1.6", - "openssl-sys", - "url", + "object_store", + "parking_lot", + "tokio", ] [[package]] -name = "glob" -version = "0.3.3" +name = "datafusion-catalog-listing" +version = "53.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" +checksum = "17e112307715d6a7a331111a4c2330ff54bc237183511c319e3708a4cff431fb" +dependencies = [ + "arrow", + "async-trait", + "datafusion-catalog", + "datafusion-common", + "datafusion-datasource", + "datafusion-execution", + "datafusion-expr", + "datafusion-physical-expr", + "datafusion-physical-expr-adapter", + "datafusion-physical-expr-common", + "datafusion-physical-plan", + "futures", + "itertools 0.14.0", + "log", + "object_store", +] [[package]] -name = "globset" -version = "0.4.18" +name = "datafusion-common" +version = "53.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52dfc19153a48bde0cbd630453615c8151bce3a5adfac7a0aebfbf0a1e1f57e3" +checksum = "d72a11ca44a95e1081870d3abb80c717496e8a7acb467a1d3e932bb636af5cc2" dependencies = [ - "aho-corasick", - "bstr", + "ahash", + "arrow", + "arrow-ipc", + "chrono", + "half", + "hashbrown 0.16.1", + "indexmap 2.14.2", + "itertools 0.14.0", + "libc", "log", - "regex-automata", - "regex-syntax", + "object_store", + "paste", + "sqlparser", + "tokio", + "web-time", ] [[package]] -name = "group" -version = "0.13.0" +name = "datafusion-common-runtime" +version = "53.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" +checksum = "89f4afaed29670ec4fd6053643adc749fe3f4bc9d1ce1b8c5679b22c67d12def" dependencies = [ - "ff", - "rand_core 0.6.4", - "subtle", + "futures", + "log", + "tokio", ] [[package]] -name = "h2" -version = "0.4.14" +name = "datafusion-datasource" +version = "53.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "171fefbc92fe4a4de27e0698d6a5b392d6a0e333506bc49133760b3bcf948733" +checksum = "e9fb386e1691355355a96419978a0022b7947b44d4a24a6ea99f00b6b485cbb6" dependencies = [ - "atomic-waker", + "arrow", + "async-trait", "bytes", - "fnv", - "futures-core", - "futures-sink", - "http", - "indexmap", - "slab", + "chrono", + "datafusion-common", + "datafusion-common-runtime", + "datafusion-execution", + "datafusion-expr", + "datafusion-physical-expr", + "datafusion-physical-expr-adapter", + "datafusion-physical-expr-common", + "datafusion-physical-plan", + "datafusion-session", + "futures", + "glob", + "itertools 0.14.0", + "log", + "object_store", + "rand 0.9.5", "tokio", - "tokio-util", - "tracing", + "url", ] [[package]] -name = "half" -version = "2.7.1" +name = "datafusion-datasource-arrow" +version = "53.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ea2d84b969582b4b1864a92dc5d27cd2b77b622a8d79306834f1be5ba20d84b" +checksum = "ffa6c52cfed0734c5f93754d1c0175f558175248bf686c944fb05c373e5fc096" dependencies = [ - "cfg-if", - "crunchy", - "zerocopy", + "arrow", + "arrow-ipc", + "async-trait", + "bytes", + "datafusion-common", + "datafusion-common-runtime", + "datafusion-datasource", + "datafusion-execution", + "datafusion-expr", + "datafusion-physical-expr-common", + "datafusion-physical-plan", + "datafusion-session", + "futures", + "itertools 0.14.0", + "object_store", + "tokio", ] [[package]] -name = "hashbrown" -version = "0.15.5" +name = "datafusion-datasource-csv" +version = "53.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" +checksum = "503f29e0582c1fc189578d665ff57d9300da1f80c282777d7eb67bb79fb8cdca" dependencies = [ - "foldhash 0.1.5", + "arrow", + "async-trait", + "bytes", + "datafusion-common", + "datafusion-common-runtime", + "datafusion-datasource", + "datafusion-execution", + "datafusion-expr", + "datafusion-physical-expr-common", + "datafusion-physical-plan", + "datafusion-session", + "futures", + "object_store", + "regex", + "tokio", ] [[package]] -name = "hashbrown" -version = "0.16.1" +name = "datafusion-datasource-json" +version = "53.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" +checksum = "e33804749abc8d0c8cb7473228483cb8070e524c6f6086ee1b85a64debe2b3d2" dependencies = [ - "allocator-api2", - "equivalent", - "foldhash 0.2.0", + "arrow", + "async-trait", + "bytes", + "datafusion-common", + "datafusion-common-runtime", + "datafusion-datasource", + "datafusion-execution", + "datafusion-expr", + "datafusion-physical-expr-common", + "datafusion-physical-plan", + "datafusion-session", + "futures", + "object_store", + "serde_json", + "tokio", + "tokio-stream", ] [[package]] -name = "hashbrown" -version = "0.17.1" +name = "datafusion-doc" +version = "53.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" -dependencies = [ - "allocator-api2", - "equivalent", - "foldhash 0.2.0", -] +checksum = "8de6ac0df1662b9148ad3c987978b32cbec7c772f199b1d53520c8fa764a87ee" [[package]] -name = "heck" -version = "0.4.1" +name = "datafusion-execution" +version = "53.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" +checksum = "c03c7fbdaefcca4ef6ffe425a5fc2325763bfb426599bb0bf4536466efabe709" +dependencies = [ + "arrow", + "arrow-buffer", + "async-trait", + "chrono", + "dashmap", + "datafusion-common", + "datafusion-expr", + "datafusion-physical-expr-common", + "futures", + "log", + "object_store", + "parking_lot", + "rand 0.9.5", + "tempfile", + "url", +] [[package]] -name = "heck" -version = "0.5.0" +name = "datafusion-expr" +version = "53.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" +checksum = "574b9b6977fedbd2a611cbff12e5caf90f31640ad9dc5870f152836d94bad0dd" +dependencies = [ + "arrow", + "async-trait", + "chrono", + "datafusion-common", + "datafusion-doc", + "datafusion-expr-common", + "datafusion-functions-aggregate-common", + "datafusion-functions-window-common", + "datafusion-physical-expr-common", + "indexmap 2.14.2", + "itertools 0.14.0", + "paste", + "serde_json", + "sqlparser", +] [[package]] -name = "hex" -version = "0.4.3" +name = "datafusion-expr-common" +version = "53.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" +checksum = "7d7c3adf3db8bf61e92eb90cb659c8e8b734593a8f7c8e12a843c7ddba24b87e" +dependencies = [ + "arrow", + "datafusion-common", + "indexmap 2.14.2", + "itertools 0.14.0", + "paste", +] [[package]] -name = "hkdf" -version = "0.12.4" +name = "datafusion-functions" +version = "53.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7" +checksum = "f28aa4e10384e782774b10e72aca4d93ef7b31aa653095d9d4536b0a3dbc51b6" dependencies = [ - "hmac", + "arrow", + "arrow-buffer", + "base64 0.22.1", + "blake2", + "blake3", + "chrono", + "chrono-tz", + "datafusion-common", + "datafusion-doc", + "datafusion-execution", + "datafusion-expr", + "datafusion-expr-common", + "datafusion-macros", + "hex", + "itertools 0.14.0", + "log", + "md-5", + "memchr", + "num-traits", + "rand 0.9.5", + "regex", + "sha2", + "unicode-segmentation", + "uuid", ] [[package]] -name = "hmac" -version = "0.12.1" +name = "datafusion-functions-aggregate" +version = "53.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +checksum = "00aa6217e56098ba84e0a338176fe52f0a84cca398021512c6c8c5eff806d0ad" dependencies = [ - "digest", + "ahash", + "arrow", + "datafusion-common", + "datafusion-doc", + "datafusion-execution", + "datafusion-expr", + "datafusion-functions-aggregate-common", + "datafusion-macros", + "datafusion-physical-expr", + "datafusion-physical-expr-common", + "half", + "log", + "num-traits", + "paste", ] [[package]] -name = "home" -version = "0.5.12" +name = "datafusion-functions-aggregate-common" +version = "53.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc627f471c528ff0c4a49e1d5e60450c8f6461dd6d10ba9dcd3a61d3dff7728d" +checksum = "b511250349407db7c43832ab2de63f5557b19a20dfd236b39ca2c04468b50d47" dependencies = [ - "windows-sys 0.61.2", + "ahash", + "arrow", + "datafusion-common", + "datafusion-expr-common", + "datafusion-physical-expr-common", ] [[package]] -name = "http" -version = "1.4.0" +name = "datafusion-functions-nested" +version = "53.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3ba2a386d7f85a81f119ad7498ebe444d2e22c2af0b86b069416ace48b3311a" +checksum = "ef13a858e20d50f0a9bb5e96e7ac82b4e7597f247515bccca4fdd2992df0212a" dependencies = [ - "bytes", + "arrow", + "arrow-ord", + "datafusion-common", + "datafusion-doc", + "datafusion-execution", + "datafusion-expr", + "datafusion-expr-common", + "datafusion-functions", + "datafusion-functions-aggregate", + "datafusion-functions-aggregate-common", + "datafusion-macros", + "datafusion-physical-expr-common", + "hashbrown 0.16.1", + "itertools 0.14.0", "itoa", + "log", + "paste", ] [[package]] -name = "http-body" -version = "1.0.1" +name = "datafusion-functions-table" +version = "53.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" +checksum = "72b40d3f5bbb3905f9ccb1ce9485a9595c77b69758a7c24d3ba79e334ff51e7e" dependencies = [ - "bytes", - "http", + "arrow", + "async-trait", + "datafusion-catalog", + "datafusion-common", + "datafusion-expr", + "datafusion-physical-plan", + "parking_lot", + "paste", ] [[package]] -name = "http-body-util" -version = "0.1.3" +name = "datafusion-functions-window" +version = "53.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" +checksum = "d4e88ec9d57c9b685d02f58bfee7be62d72610430ddcedb82a08e5d9925dbfb6" dependencies = [ - "bytes", - "futures-core", - "http", - "http-body", - "pin-project-lite", + "arrow", + "datafusion-common", + "datafusion-doc", + "datafusion-expr", + "datafusion-functions-window-common", + "datafusion-macros", + "datafusion-physical-expr", + "datafusion-physical-expr-common", + "log", + "paste", ] [[package]] -name = "httparse" -version = "1.10.1" +name = "datafusion-functions-window-common" +version = "53.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" +checksum = "8307bb93519b1a91913723a1130cfafeee3f72200d870d88e91a6fc5470ede5c" +dependencies = [ + "datafusion-common", + "datafusion-physical-expr-common", +] [[package]] -name = "hyper" -version = "1.9.0" +name = "datafusion-macros" +version = "53.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6299f016b246a94207e63da54dbe807655bf9e00044f73ded42c3ac5305fbcca" +checksum = "2e367e6a71051d0ebdd29b2f85d12059b38b1d1f172c6906e80016da662226bd" dependencies = [ - "atomic-waker", - "bytes", - "futures-channel", - "futures-core", - "h2", - "http", - "http-body", - "httparse", - "itoa", - "pin-project-lite", - "smallvec", - "tokio", - "want", + "datafusion-doc", + "quote", + "syn 2.0.119", ] [[package]] -name = "hyper-rustls" -version = "0.27.9" +name = "datafusion-optimizer" +version = "53.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33ca68d021ef39cf6463ab54c1d0f5daf03377b70561305bb89a8f83aab66e0f" +checksum = "e929015451a67f77d9d8b727b2bf3a40c4445fdef6cdc53281d7d97c76888ace" dependencies = [ - "http", - "hyper", - "hyper-util", + "arrow", + "chrono", + "datafusion-common", + "datafusion-expr", + "datafusion-expr-common", + "datafusion-physical-expr", + "indexmap 2.14.2", + "itertools 0.14.0", "log", - "rustls", - "rustls-native-certs", - "tokio", - "tokio-rustls", - "tower-service", + "regex", + "regex-syntax", ] [[package]] -name = "hyper-timeout" -version = "0.5.2" +name = "datafusion-physical-expr" +version = "53.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b90d566bffbce6a75bd8b09a05aa8c2cb1fabb6cb348f8840c9e4c90a0d83b0" +checksum = "4b1e68aba7a4b350401cfdf25a3d6f989ad898a7410164afe9ca52080244cb59" dependencies = [ - "hyper", - "hyper-util", - "pin-project-lite", + "ahash", + "arrow", + "datafusion-common", + "datafusion-expr", + "datafusion-expr-common", + "datafusion-functions-aggregate-common", + "datafusion-physical-expr-common", + "half", + "hashbrown 0.16.1", + "indexmap 2.14.2", + "itertools 0.14.0", + "parking_lot", + "paste", + "petgraph", "tokio", - "tower-service", ] [[package]] -name = "hyper-util" -version = "0.1.20" +name = "datafusion-physical-expr-adapter" +version = "53.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96547c2556ec9d12fb1578c4eaf448b04993e7fb79cbaad930a656880a6bdfa0" +checksum = "ea22315f33cf2e0adc104e8ec42e285f6ed93998d565c65e82fec6a9ee9f9db4" dependencies = [ - "base64", - "bytes", - "futures-channel", - "futures-util", - "http", - "http-body", - "hyper", - "ipnet", - "libc", - "percent-encoding", - "pin-project-lite", - "socket2", - "system-configuration", - "tokio", - "tower-service", - "tracing", - "windows-registry", + "arrow", + "datafusion-common", + "datafusion-expr", + "datafusion-functions", + "datafusion-physical-expr", + "datafusion-physical-expr-common", + "itertools 0.14.0", ] [[package]] -name = "iana-time-zone" -version = "0.1.65" +name = "datafusion-physical-expr-common" +version = "53.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e31bc9ad994ba00e440a8aa5c9ef0ec67d5cb5e5cb0cc7f8b744a35b389cc470" +checksum = "b04b45ea8ad3ac2d78f2ea2a76053e06591c9629c7a603eda16c10649ecf4362" dependencies = [ - "android_system_properties", - "core-foundation-sys", - "iana-time-zone-haiku", - "js-sys", - "log", - "wasm-bindgen", - "windows-core", -] - + "ahash", + "arrow", + "chrono", + "datafusion-common", + "datafusion-expr-common", + "hashbrown 0.16.1", + "indexmap 2.14.2", + "itertools 0.14.0", + "parking_lot", +] + [[package]] -name = "iana-time-zone-haiku" -version = "0.1.2" +name = "datafusion-physical-optimizer" +version = "53.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +checksum = "7cb13397809a425918f608dfe8653f332015a3e330004ab191b4404187238b95" dependencies = [ - "cc", + "arrow", + "datafusion-common", + "datafusion-execution", + "datafusion-expr", + "datafusion-expr-common", + "datafusion-physical-expr", + "datafusion-physical-expr-common", + "datafusion-physical-plan", + "datafusion-pruning", + "itertools 0.14.0", ] [[package]] -name = "icu_collections" -version = "2.2.0" +name = "datafusion-physical-plan" +version = "53.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2984d1cd16c883d7935b9e07e44071dca8d917fd52ecc02c04d5fa0b5a3f191c" +checksum = "5edc023675791af9d5fb4cc4c24abf5f7bd3bd4dcf9e5bd90ea1eff6976dcc79" dependencies = [ - "displaydoc", - "potential_utf", - "utf8_iter", - "yoke", - "zerofrom", - "zerovec", + "ahash", + "arrow", + "arrow-ord", + "arrow-schema", + "async-trait", + "datafusion-common", + "datafusion-common-runtime", + "datafusion-execution", + "datafusion-expr", + "datafusion-functions", + "datafusion-functions-aggregate-common", + "datafusion-functions-window-common", + "datafusion-physical-expr", + "datafusion-physical-expr-common", + "futures", + "half", + "hashbrown 0.16.1", + "indexmap 2.14.2", + "itertools 0.14.0", + "log", + "num-traits", + "parking_lot", + "pin-project-lite", + "tokio", ] [[package]] -name = "icu_locale_core" -version = "2.2.0" +name = "datafusion-pruning" +version = "53.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92219b62b3e2b4d88ac5119f8904c10f8f61bf7e95b640d25ba3075e6cac2c29" +checksum = "ac8c76860e355616555081cab5968cec1af7a80701ff374510860bcd567e365a" dependencies = [ - "displaydoc", - "litemap", - "tinystr", - "writeable", - "zerovec", + "arrow", + "datafusion-common", + "datafusion-datasource", + "datafusion-expr-common", + "datafusion-physical-expr", + "datafusion-physical-expr-common", + "datafusion-physical-plan", + "itertools 0.14.0", + "log", ] [[package]] -name = "icu_normalizer" -version = "2.2.0" +name = "datafusion-session" +version = "53.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c56e5ee99d6e3d33bd91c5d85458b6005a22140021cc324cea84dd0e72cff3b4" +checksum = "5412111aa48e2424ba926112e192f7a6b7e4ccb450145d25ce5ede9f19dc491e" dependencies = [ - "icu_collections", - "icu_normalizer_data", - "icu_properties", - "icu_provider", - "smallvec", - "zerovec", + "async-trait", + "datafusion-common", + "datafusion-execution", + "datafusion-expr", + "datafusion-physical-plan", + "parking_lot", ] [[package]] -name = "icu_normalizer_data" -version = "2.2.0" +name = "datafusion-sql" +version = "53.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da3be0ae77ea334f4da67c12f149704f19f81d1adf7c51cf482943e84a2bad38" +checksum = "fa0d133ddf8b9b3b872acac900157f783e7b879fe9a6bccf389abebbfac45ec1" +dependencies = [ + "arrow", + "bigdecimal", + "chrono", + "datafusion-common", + "datafusion-expr", + "datafusion-functions-nested", + "indexmap 2.14.2", + "log", + "regex", + "sqlparser", +] [[package]] -name = "icu_properties" -version = "2.2.0" +name = "deepsize" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bee3b67d0ea5c2cca5003417989af8996f8604e34fb9ddf96208a033901e70de" +checksum = "1cdb987ec36f6bf7bfbea3f928b75590b736fc42af8e54d97592481351b2b96c" dependencies = [ - "icu_collections", - "icu_locale_core", - "icu_properties_data", - "icu_provider", - "zerotrie", - "zerovec", + "deepsize_derive", ] [[package]] -name = "icu_properties_data" -version = "2.2.0" +name = "deepsize_derive" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "990101d41f3bc8c1a45641024377ee284ecc338e5ecf3ea0f0e236d897c72796" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "defmt" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e2bbb201e0c04f7b4b3e14382af113e17ba4f63e2c9d2ee626b720cbce54a14" +checksum = "e2953bfe4f93bbd20cc71198842756f77d161884c99ebbabc41d80231ded88d1" +dependencies = [ + "bitflags 1.3.2", + "defmt-macros", +] [[package]] -name = "icu_provider" -version = "2.2.0" +name = "defmt-macros" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "139c4cf31c8b5f33d7e199446eff9c1e02decfc2f0eec2c8d71f65befa45b421" +checksum = "bad9c72e7ca2137e0dc3813245a0d282fd6daad32fd800af018306a9169b5fe8" dependencies = [ - "displaydoc", - "icu_locale_core", - "writeable", - "yoke", - "zerofrom", - "zerotrie", - "zerovec", + "defmt-parser", + "proc-macro2", + "quote", + "syn 2.0.119", ] [[package]] -name = "id-arena" -version = "2.3.0" +name = "defmt-parser" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954" +checksum = "10d60334b3b2e7c9d91ef8150abfb6fa4c1c39ebbcf4a81c2e346aad939fee3e" +dependencies = [ + "thiserror 2.0.20", +] [[package]] -name = "ident_case" -version = "1.0.1" +name = "deltae" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" +checksum = "5729f5117e208430e437df2f4843f5e5952997175992d1414f94c57d61e270b4" [[package]] -name = "idna" -version = "1.1.0" +name = "deranged" +version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" +checksum = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c" dependencies = [ - "idna_adapter", - "smallvec", - "utf8_iter", + "serde_core", ] [[package]] -name = "idna_adapter" -version = "1.2.2" +name = "derive_builder" +version = "0.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb68373c0d6620ef8105e855e7745e18b0d00d3bdb07fb532e434244cdb9a714" +checksum = "507dfb09ea8b7fa618fcf76e953f4f5e192547945816d5358edffe39f6f94947" dependencies = [ - "icu_normalizer", - "icu_properties", + "derive_builder_macro", ] [[package]] -name = "if_chain" -version = "1.0.3" +name = "derive_builder_core" +version = "0.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd62e6b5e86ea8eeeb8db1de02880a6abc01a397b2ebb64b5d74ac255318f5cb" +checksum = "2d5bcf7b024d6835cfb3d473887cd966994907effbe9227e8c8219824d06c4e8" +dependencies = [ + "darling 0.20.11", + "proc-macro2", + "quote", + "syn 2.0.119", +] [[package]] -name = "ignore" -version = "0.4.25" +name = "derive_builder_macro" +version = "0.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3d782a365a015e0f5c04902246139249abf769125006fbe7649e2ee88169b4a" +checksum = "ab63b0e2bf4d5928aff72e83a7dace85d7bba5fe12dcc3c5a572d78caffd3f3c" dependencies = [ - "crossbeam-deque", - "globset", - "log", - "memchr", - "regex-automata", - "same-file", - "walkdir", - "winapi-util", + "derive_builder_core", + "syn 2.0.119", ] [[package]] -name = "image" -version = "0.25.10" +name = "derive_more" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85ab80394333c02fe689eaf900ab500fbd0c2213da414687ebf995a65d5a6104" +checksum = "d751e9e49156b02b44f9c1815bcb94b984cdcc4396ecc32521c739452808b134" dependencies = [ - "bytemuck", - "byteorder-lite", - "moxcms", - "num-traits", - "png", - "tiff", + "derive_more-impl", ] [[package]] -name = "indexmap" -version = "2.14.0" +name = "derive_more-impl" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9" +checksum = "799a97264921d8623a957f6c3b9011f3b5492f557bbb7a5a19b7fa6d06ba8dcb" dependencies = [ - "equivalent", - "hashbrown 0.17.1", - "serde", - "serde_core", + "convert_case 0.10.0", + "proc-macro2", + "quote", + "rustc_version", + "syn 2.0.119", ] [[package]] -name = "indicatif" -version = "0.18.4" +name = "digest" +version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25470f23803092da7d239834776d653104d551bc4d7eacaf31e6837854b8e9eb" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ - "console", - "portable-atomic", - "unicode-width", - "unit-prefix", - "web-time", + "block-buffer", + "crypto-common", + "subtle", ] [[package]] -name = "indoc" -version = "2.0.7" +name = "dirs" +version = "6.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79cf5c93f93228cf8efb3ba362535fb11199ac548a09ce117c9b1adc3030d706" +checksum = "c3e8aa94d75141228480295a7d0e7feb620b1a5ad9f12bc40be62411e38cce4e" dependencies = [ - "rustversion", + "dirs-sys", ] [[package]] -name = "inotify" -version = "0.11.1" +name = "dirs" +version = "7.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd5b3eaf1a28b758ac0faa5a4254e8ab2705605496f1b1f3fbbc3988ad73d199" +checksum = "8d57d423b3c82e89b9a24ca3091fee61f456a26edbd28d26c65906f4bc1dcd8f" dependencies = [ - "bitflags 2.11.1", - "inotify-sys", - "libc", + "dirs-sys", ] [[package]] -name = "inotify-sys" -version = "0.1.5" +name = "dirs-sys" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e05c02b5e89bff3b946cedeca278abc628fe811e604f027c45a8aa3cf793d0eb" +checksum = "e01a3366d27ee9890022452ee61b2b63a67e6f13f58900b651ff5665f0bb1fab" dependencies = [ "libc", + "option-ext", + "redox_users", + "windows-sys 0.59.0", ] [[package]] -name = "instability" -version = "0.3.12" +name = "dispatch2" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5eb2d60ef19920a3a9193c3e371f726ec1dafc045dac788d0fb3704272458971" +checksum = "1e0e367e4e7da84520dedcac1901e4da967309406d1e51017ae1abfb97adbd38" +dependencies = [ + "bitflags 2.13.1", + "objc2", +] + +[[package]] +name = "displaydoc" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6232dd377dcc64799954cbd3a9bb882e9cdc1308ccd87b1c098f1fb2eaf82a8" dependencies = [ - "darling", - "indoc", "proc-macro2", "quote", - "syn 2.0.117", + "syn 3.0.5", ] [[package]] -name = "ipnet" -version = "2.12.0" +name = "document-features" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d98f6fed1fde3f8c21bc40a1abb88dd75e67924f9cffc3ef95607bad8017f8e2" +checksum = "d4b8a88685455ed29a21542a33abd9cb6510b6b129abadabdcef0f4c55bc8f61" +dependencies = [ + "litrs", +] [[package]] -name = "is_terminal_polyfill" -version = "1.70.2" +name = "dotenvy" +version = "0.15.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" +checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b" [[package]] -name = "itertools" -version = "0.14.0" +name = "dunce" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" -dependencies = [ - "either", -] +checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" [[package]] -name = "itoa" -version = "1.0.18" +name = "dyn-clone" +version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" +checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" [[package]] -name = "jni" -version = "0.22.4" +name = "either" +version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5efd9a482cf3a427f00d6b35f14332adc7902ce91efb778580e180ff90fa3498" +checksum = "252afb9ae5eaa683babdc6a068b3f5726eb19e05070c731f9b2a23a7c3e8ed34" + +[[package]] +name = "encode_unicode" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0" + +[[package]] +name = "encoding_rs" +version = "0.8.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" dependencies = [ "cfg-if", - "combine", - "jni-macros", - "jni-sys", - "log", - "simd_cesu8", - "thiserror 2.0.18", - "walkdir", - "windows-link", ] [[package]] -name = "jni-macros" -version = "0.22.4" +name = "encoding_rs_io" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a00109accc170f0bdb141fed3e393c565b6f5e072365c3bd58f5b062591560a3" +checksum = "fba3fe847045ecff794b9c138293a80db914678c453ad63fbf0c6a9eb6e00b22" dependencies = [ - "proc-macro2", - "quote", - "rustc_version", - "simd_cesu8", - "syn 2.0.117", + "encoding_rs", ] [[package]] -name = "jni-sys" -version = "0.4.1" +name = "equator" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6377a88cb3910bee9b0fa88d4f42e1d2da8e79915598f65fb0c7ee14c878af2" +checksum = "4711b213838dfee0117e3be6ac926007d7f433d7bbe33595975d4190cb07e6fc" dependencies = [ - "jni-sys-macros", + "equator-macro", ] [[package]] -name = "jni-sys-macros" -version = "0.4.1" +name = "equator-macro" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38c0b942f458fe50cdac086d2f946512305e5631e720728f2a61aabcd47a6264" +checksum = "44f23cf4b44bfce11a86ace86f8a73ffdec849c9fd00a386a53d278bd9e81fb3" dependencies = [ + "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.119", +] + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "errno" +version = "0.3.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" +dependencies = [ + "libc", + "windows-sys 0.59.0", +] + +[[package]] +name = "error-code" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b5343afd4a8365a643ac588dab4cf234a190c7f6c88c9f6dd6ffe00837661b7" + +[[package]] +name = "esaxx-rs" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d817e038c30374a4bcb22f94d0a8a0e216958d4c3dcde369b1439fec4bdda6e6" + +[[package]] +name = "ethnum" +version = "1.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40404c3f5f511ec4da6fe866ddf6a717c309fdbb69fbbad7b0f3edab8f2e835f" + +[[package]] +name = "euclid" +version = "0.22.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1a05365e3b1c6d1650318537c7460c6923f1abdd272ad6842baa2b509957a06" +dependencies = [ + "num-traits", +] + +[[package]] +name = "event-listener" +version = "5.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a23add41df1562121a9393cb065eab5146a1242410f23a644851e90cfd669d2" +dependencies = [ + "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 = "eventsource-stream" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74fef4569247a5f429d9156b9d0a2599914385dd189c539334c625d8099d90ab" +dependencies = [ + "futures-core", + "nom 7.1.3", + "pin-project-lite", +] + +[[package]] +name = "exr" +version = "1.74.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "711fe42c9964295e01ee3fba3f9fe0e1d24b98886950d68efe81b1c76e21adf3" +dependencies = [ + "bit_field", + "half", + "lebe", + "miniz_oxide 0.8.9", + "num-complex", + "pulp", + "rayon-core", + "smallvec", + "zune-inflate", +] + +[[package]] +name = "fancy-regex" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b95f7c0680e4142284cf8b22c14a476e87d61b004a3a0861872b32ef7ead40a2" +dependencies = [ + "bit-set", + "regex", +] + +[[package]] +name = "fast-float2" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6e8948ce679d00a02a94739ea185595dca7118ed04feb991127e443bd3d761f" + +[[package]] +name = "fastembed" +version = "4.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04c269a76bfc6cea69553b7d040acb16c793119cebd97c756d21e08d0f075ff8" +dependencies = [ + "anyhow", + "hf-hub", + "image", + "ndarray", + "ort", + "ort-sys", + "rayon", + "serde_json", + "tokenizers", +] + +[[package]] +name = "fastrand" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da7c62ceae207dd37ea5b845da6a0696c799f85e97da1ab5b7910be3c1c80223" + +[[package]] +name = "fax" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "caf1079563223d5d59d83c85886a56e586cfd5c1a26292e971a0fa266531ac5a" + +[[package]] +name = "fdeflate" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e6853b52649d4ac5c0bd02320cddc5ba956bdb407c4b75a2c6b75bf51500f8c" +dependencies = [ + "simd-adler32", +] + +[[package]] +name = "file-id" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1fc6a637b6dc58414714eddd9170ff187ecb0933d4c7024d1abbd23a3cc26e9" +dependencies = [ + "windows-sys 0.60.2", +] + +[[package]] +name = "filedescriptor" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e40758ed24c9b2eeb76c35fb0aebc66c626084edd827e07e1552279814c6682d" +dependencies = [ + "libc", + "thiserror 1.0.69", + "winapi", +] + +[[package]] +name = "find-msvc-tools" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e0f1c7c3a72c66fd80abe965175f7523475c0489a87d3ff9d6e8c87d87a9d2d" + +[[package]] +name = "finl_unicode" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9844ddc3a6e533d62bba727eb6c28b5d360921d5175e9ff0f1e621a5c590a4d5" + +[[package]] +name = "fixedbitset" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" + +[[package]] +name = "fixedbitset" +version = "0.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d674e81391d1e1ab681a28d99df07927c6d4aa5b027d7da16ba32d1d21ecd99" + +[[package]] +name = "flatbuffers" +version = "25.12.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35f6839d7b3b98adde531effaf34f0c2badc6f4735d26fe74709d8e513a96ef3" +dependencies = [ + "bitflags 2.13.1", + "rustc_version", +] + +[[package]] +name = "flate2" +version = "1.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e634e2e0ebac1ee034020da1ca582e17ffe4e0f5e985823721e168928136dcb" +dependencies = [ + "crc32fast", + "miniz_oxide 0.9.1", + "zlib-rs", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foldhash" +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 = "form_urlencoded" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "fs_extra" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" + +[[package]] +name = "fsevent-sys" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76ee7a02da4d231650c7cea31349b889be2f45ddb3ef3032d2ec8185f6313fd2" +dependencies = [ + "libc", +] + +[[package]] +name = "fsst" +version = "7.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bcd0ce0249ac12fd44fcde62d435c36d881952c2f0df4d1de24b45e1dbba5ddb" +dependencies = [ + "arrow-array", + "rand 0.9.5", +] + +[[package]] +name = "fst" +version = "0.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ab85b9b05e3978cc9a9cf8fea7f01b494e1a09ed3037e16ba39edc7a29eb61a" +dependencies = [ + "utf8-ranges", +] + +[[package]] +name = "funty" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" + +[[package]] +name = "futures" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a31d2a3fbaaeb2af2368bbdd904aa8e812d3c04a1ee10d3171f52d556e5d0a3" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1f9e3d69d39e4862ffed03ed071a76f9a13ba1d9109d355b0f0aa6b15e393c4" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92d699e522242e69e3003b94ecc1f960f3a5e015aa7c5d7486e65ad01dd94f5e" + +[[package]] +name = "futures-executor" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "031b47cf1a3c6cc8bc2fc76cd437f521619387907d469316e7c0bc278f1f5432" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53c0fa8157de1303bfffdaa1cc2a673bfffb60102f76b0ef4441659124373fed" + +[[package]] +name = "futures-macro" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fb9654ba8355388abeb8dcb4fc62f511300867002afc858860463bdd9fe0c44" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.5", +] + +[[package]] +name = "futures-sink" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1944426bf7d03f1d14f708785e4b33efd750b36d48a157b836b3efc15ede8e1d" + +[[package]] +name = "futures-task" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd417de3d1d015fc3bfd2b1ea46dfc7bab72ef86f1cc7cc9c78e728b34a6d1fd" + +[[package]] +name = "futures-timer" +version = "3.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af43fadb8a98512d547e37b4e92e0ced13e205c061b87b4623eff01d918d6968" +dependencies = [ + "gloo-timers", + "send_wrapper", +] + +[[package]] +name = "futures-util" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d50a92467f8ba5dd6e3ee5d4bd04d73ab2e4e1c44474a0674821dfce14b79bc" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "slab", +] + +[[package]] +name = "generator" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3b854b0e584ead1a33f18b2fcad7cf7be18b3875c78816b753639aa501513ae" +dependencies = [ + "cc", + "cfg-if", + "libc", + "log", + "rustversion", + "windows-link", + "windows-result", +] + +[[package]] +name = "generic-array" +version = "0.14.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bb6743198531e02858aeaea5398fcc883e71851fcbcb5a2f773e2fb6cb1edf2" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "gethostname" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bd49230192a3797a9a4d6abe9b3eed6f7fa4c8a8a4947977c6f80025f92cbd8" +dependencies = [ + "rustix", + "windows-link", +] + +[[package]] +name = "getopts" +version = "0.2.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfe4fbac503b8d1f88e6676011885f34b7174f46e59956bba534ba83abded4df" +dependencies = [ + "unicode-width", +] + +[[package]] +name = "getrandom" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "wasi", + "wasm-bindgen", +] + +[[package]] +name = "getrandom" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" +dependencies = [ + "cfg-if", + "libc", + "r-efi 5.3.0", + "wasip2", +] + +[[package]] +name = "getrandom" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "300e883d756b2e4ec94e02791f39b04b522276138852cfc41d9fb7e904106099" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "r-efi 6.0.0", + "rand_core 0.10.1", + "wasm-bindgen", +] + +[[package]] +name = "gh-token" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6b05178455aca6d0624534729a2f8d2b94c93b02c0fcdf1736453912b9a9b4f" +dependencies = [ + "home", + "serde", + "serde_derive", + "serde_yaml", +] + +[[package]] +name = "gif" +version = "0.14.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee8cfcc411d9adbbaba82fb72661cc1bcca13e8bba98b364e62b2dba8f960159" +dependencies = [ + "color_quant", + "weezl", +] + +[[package]] +name = "git-iris" +version = "2.1.0" +dependencies = [ + "anyhow", + "arboard", + "async-trait", + "chrono", + "clap", + "clap_complete", + "colored", + "crossterm", + "dirs 7.0.0", + "dotenvy", + "futures", + "gh-token", + "git2", + "ignore", + "indicatif 0.18.6", + "lru", + "notify", + "notify-debouncer-full", + "octocrab", + "opaline", + "parking_lot", + "pulldown-cmark", + "rand 0.10.2", + "ratatui", + "ratatui-textarea", + "regex", + "reqwest 0.13.4", + "rig", + "rustls", + "schemars 1.2.2", + "serde", + "serde_json", + "strum 0.28.0", + "strum_macros 0.28.0", + "syntect", + "tempfile", + "textwrap", + "thiserror 2.0.20", + "tokio", + "tokio-util", + "toml 1.1.5+spec-1.1.0", + "tracing", + "tracing-subscriber", + "unicode-width", + "url", + "uuid", +] + +[[package]] +name = "git2" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddddbf932745a6be37109b6112d3ee09696106f848449069d3a57bba937ab82e" +dependencies = [ + "bitflags 2.13.1", + "libc", + "libgit2-sys", + "log", +] + +[[package]] +name = "glob" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4eba85ea1d0a966a983acd07deee566e67395d2d96b6fb39e62b5a833f1eb0b" + +[[package]] +name = "globset" +version = "0.4.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07c34a9410465b45bd9787443bc7370f37735bad04b0f0cd57ff1a3186c98988" +dependencies = [ + "aho-corasick", + "bstr", + "log", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "gloo-timers" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "482ce8a491a501da4cd806bd190275363d674f2845005c6ddbd5d3e1dd54495d" +dependencies = [ + "futures-channel", + "futures-core", + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "h2" +version = "0.4.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef8e5e5a340588f4452631496976cf8636d4a7ecf600239fdc27615d2530bc16" +dependencies = [ + "atomic-waker", + "bytes", + "fnv", + "futures-core", + "futures-sink", + "http", + "indexmap 2.14.2", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "half" +version = "2.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ea2d84b969582b4b1864a92dc5d27cd2b77b622a8d79306834f1be5ba20d84b" +dependencies = [ + "cfg-if", + "crunchy", + "num-traits", + "zerocopy", +] + +[[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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" + +[[package]] +name = "hashbrown" +version = "0.15.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" +dependencies = [ + "foldhash 0.1.5", +] + +[[package]] +name = "hashbrown" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" +dependencies = [ + "allocator-api2", + "equivalent", + "foldhash 0.2.0", +] + +[[package]] +name = "hashbrown" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" +dependencies = [ + "allocator-api2", + "equivalent", + "foldhash 0.2.0", +] + +[[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.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e17592d60ebacc7d5e169f4663c5f84f9161cc90328abcfe8456f41e4dfcb284" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "hf-hub" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "629d8f3bbeda9d148036d6b0de0a3ab947abd08ce90626327fc3547a49d59d97" +dependencies = [ + "dirs 6.0.0", + "http", + "indicatif 0.17.11", + "libc", + "log", + "rand 0.9.5", + "reqwest 0.12.28", + "serde", + "serde_json", + "thiserror 2.0.20", + "ureq", + "windows-sys 0.60.2", +] + +[[package]] +name = "home" +version = "0.5.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc627f471c528ff0c4a49e1d5e60450c8f6461dd6d10ba9dcd3a61d3dff7728d" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "http" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "918d3568bebf352712bc2ef3d46a8bcf1a75b373be6539de198e9105cbbf9ce0" +dependencies = [ + "bytes", + "itoa", +] + +[[package]] +name = "http-body" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca2a8f2913ee65f60facd6a5905613afaa448497a0230cc41ce022d93290bc2c" +dependencies = [ + "bytes", + "http", +] + +[[package]] +name = "http-body-util" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23169fe34a5fbcdd3f3862e78fb9b6fccd5f02a6dc6f732547005d45631ce71c" +dependencies = [ + "bytes", + "futures-core", + "http", + "http-body", + "pin-project-lite", +] + +[[package]] +name = "http-serde" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f056c8559e3757392c8d091e796416e4649d8e49e88b8d76df6c002f05027fd" +dependencies = [ + "http", + "serde", +] + +[[package]] +name = "httparse" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" + +[[package]] +name = "humantime" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15cdd26707701c53297e2fa6afb323d55fbc1d0810c3aec078ae3ef0424c3c15" + +[[package]] +name = "hyper" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27b501faa50e7a26c3d3560ca625132f4078a17771f4810baf70475ae48cbe43" +dependencies = [ + "atomic-waker", + "bytes", + "futures-channel", + "futures-core", + "h2", + "http", + "http-body", + "httparse", + "itoa", + "pin-project-lite", + "smallvec", + "tokio", + "want", +] + +[[package]] +name = "hyper-rustls" +version = "0.27.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33ca68d021ef39cf6463ab54c1d0f5daf03377b70561305bb89a8f83aab66e0f" +dependencies = [ + "http", + "hyper", + "hyper-util", + "log", + "rustls", + "rustls-native-certs", + "tokio", + "tokio-rustls", + "tower-service", + "webpki-roots 1.0.9", +] + +[[package]] +name = "hyper-timeout" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b90d566bffbce6a75bd8b09a05aa8c2cb1fabb6cb348f8840c9e4c90a0d83b0" +dependencies = [ + "hyper", + "hyper-util", + "pin-project-lite", + "tokio", + "tower-service", +] + +[[package]] +name = "hyper-util" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96547c2556ec9d12fb1578c4eaf448b04993e7fb79cbaad930a656880a6bdfa0" +dependencies = [ + "base64 0.22.1", + "bytes", + "futures-channel", + "futures-util", + "http", + "http-body", + "hyper", + "ipnet", + "libc", + "percent-encoding", + "pin-project-lite", + "socket2", + "system-configuration", + "tokio", + "tower-service", + "tracing", + "windows-registry", +] + +[[package]] +name = "hyperloglogplus" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "621debdf94dcac33e50475fdd76d34d5ea9c0362a834b9db08c3024696c1fbe3" +dependencies = [ + "serde", +] + +[[package]] +name = "iana-time-zone" +version = "0.1.65" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e31bc9ad994ba00e440a8aa5c9ef0ec67d5cb5e5cb0cc7f8b744a35b389cc470" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "log", + "wasm-bindgen", + "windows-core", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + +[[package]] +name = "icu_collections" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa68d21081c4a05d5a901a1c62add574c77048b6a1c67be3b50ce0b60d4ca513" +dependencies = [ + "displaydoc", + "potential_utf", + "utf8_iter", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locale_core" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d56e28588da92eee5c3201a6eff33fabdd49b62269c8938d4ff050ce4d900deb" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_normalizer" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12f9cf5f235641ed274641dd81c3f28d870e276763d0797aeeab72317b1c646f" +dependencies = [ + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1563da1ed3e0b3bf3d74c9b85917ac9c56464d2f57242270c09c9e752f8021a0" + +[[package]] +name = "icu_properties" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e7ca276ad3145661a65914e6daf131ca5120cd3dcee8f8f3214b8875184a148" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_locale_core", + "icu_properties_data", + "icu_provider", + "zerotrie", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e590f038c1464a96894fd6d10127e90a8be4509f56ff7ecef851b15cee0b7caa" + +[[package]] +name = "icu_provider" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d27bbb9d3abbefac45d55f647c9de1d44aafcd1186eb91879afef17c396c3e73" +dependencies = [ + "displaydoc", + "icu_locale_core", + "writeable", + "yoke", + "zerofrom", + "zerotrie", + "zerovec", +] + +[[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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb68373c0d6620ef8105e855e7745e18b0d00d3bdb07fb532e434244cdb9a714" +dependencies = [ + "icu_normalizer", + "icu_properties", +] + +[[package]] +name = "ignore" +version = "0.4.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b69833ed729dc5aa7d19541d96d6cf8e9137194207a04916d658e43168402f" +dependencies = [ + "crossbeam-deque", + "globset", + "log", + "memchr", + "regex-automata", + "same-file", + "walkdir", + "winapi-util", +] + +[[package]] +name = "image" +version = "0.25.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85ab80394333c02fe689eaf900ab500fbd0c2213da414687ebf995a65d5a6104" +dependencies = [ + "bytemuck", + "byteorder-lite", + "color_quant", + "exr", + "gif", + "image-webp", + "moxcms", + "num-traits", + "png", + "qoi", + "ravif", + "rayon", + "rgb", + "tiff", + "zune-core", + "zune-jpeg", +] + +[[package]] +name = "image-webp" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "525e9ff3e1a4be2fbea1fdf0e98686a6d98b4d8f937e1bf7402245af1909e8c3" +dependencies = [ + "byteorder-lite", + "quick-error", +] + +[[package]] +name = "imgref" +version = "1.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e44b0a4eaa4c82f441d50a963f2d5f05a787240aeee097597033e72accfd22f" + +[[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.14.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc4e190f5d26ca7051642629da2c52fc03bde85a03197c99408dcd291734c855" +dependencies = [ + "equivalent", + "hashbrown 0.17.1", + "serde", + "serde_core", +] + +[[package]] +name = "indicatif" +version = "0.17.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "183b3088984b400f4cfac3620d5e076c84da5364016b4f49473de574b2586235" +dependencies = [ + "console 0.15.11", + "number_prefix", + "portable-atomic", + "unicode-width", + "web-time", +] + +[[package]] +name = "indicatif" +version = "0.18.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9433806cd6b4ec1aba79c021c7e4c58fb4c3b9977c085062e611ac929998fb0c" +dependencies = [ + "console 0.16.4", + "portable-atomic", + "unicode-width", + "unit-prefix", + "web-time", +] + +[[package]] +name = "indoc" +version = "2.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79cf5c93f93228cf8efb3ba362535fb11199ac548a09ce117c9b1adc3030d706" +dependencies = [ + "rustversion", +] + +[[package]] +name = "inotify" +version = "0.11.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cc00ea907cab49550b7da656f80ebb97be1b997d931fbcd28d39734e17ce592" +dependencies = [ + "bitflags 2.13.1", + "inotify-sys", + "libc", +] + +[[package]] +name = "inotify-sys" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c033f80b2c113cdf91ab7a33faa9cbc014726dcad99880c8609af2a370edf37d" +dependencies = [ + "libc", +] + +[[package]] +name = "instability" +version = "0.3.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bf84e73fa6f27f299dec58e13223cf70db80da872eb921d4f6138342a0eabc8" +dependencies = [ + "darling 0.24.1", + "indoc", + "proc-macro2", + "quote", + "syn 3.0.5", +] + +[[package]] +name = "interpolate_name" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c34819042dc3d3971c46c2190835914dfbe0c3c13f61449b2997f4e9722dfa60" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "io-uring" +version = "0.7.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d64d8ca234d152948ceaede1f419b6a83983a5ecccaac05fb337a809c96d3aa6" +dependencies = [ + "bitflags 2.13.1", + "cfg-if", + "libc", +] + +[[package]] +name = "ipnet" +version = "2.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "791930b43c0d5973160d90a8f3894509f2b273430f5c5c73b668636d0287c5c0" + +[[package]] +name = "is_terminal_polyfill" +version = "1.70.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" + +[[package]] +name = "itertools" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" + +[[package]] +name = "jieba-macros" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a29cfc5dcd898604c6f80363411fa6b6b08e27d1d253d6225b9cb6702ea02fc0" +dependencies = [ + "phf_codegen 0.13.1", +] + +[[package]] +name = "jieba-rs" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3245d6e9d1d5facbd6a23848d6b67e3439738ccbb4fa5a3d65da315ba1a910a2" +dependencies = [ + "cedarwood", + "jieba-macros", + "phf 0.13.1", + "regex", + "rustc-hash", +] + +[[package]] +name = "jiff" +version = "0.2.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "668b7183bd07af9a4885f5c35b0cc5c83c4607a913c16b7e17291832910d2dcc" +dependencies = [ + "defmt", + "jiff-core", + "jiff-static", + "jiff-tzdb-platform", + "log", + "portable-atomic", + "portable-atomic-util", + "serde_core", + "windows-link", +] + +[[package]] +name = "jiff-core" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7feca88439efe53da3754500c1851dedf3cb36c524dd5cf8225cc0794de95d09" +dependencies = [ + "defmt", +] + +[[package]] +name = "jiff-static" +version = "0.2.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a69dcb3a21cfb32ce1cd056169337ca284af0766dd766e7878819b251a49204" +dependencies = [ + "jiff-core", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "jiff-tzdb" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "142bd39932ad231f10513df9ab62661fead8719872150b7ad02a2df79f4e141e" + +[[package]] +name = "jiff-tzdb-platform" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "875a5a69ac2bab1a891711cf5eccbec1ce0341ea805560dcd90b7a2e925132e8" +dependencies = [ + "jiff-tzdb", +] + +[[package]] +name = "jni" +version = "0.22.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5efd9a482cf3a427f00d6b35f14332adc7902ce91efb778580e180ff90fa3498" +dependencies = [ + "cfg-if", + "combine", + "jni-macros", + "jni-sys", + "log", + "simd_cesu8", + "thiserror 2.0.20", + "walkdir", + "windows-link", +] + +[[package]] +name = "jni-macros" +version = "0.22.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a00109accc170f0bdb141fed3e393c565b6f5e072365c3bd58f5b062591560a3" +dependencies = [ + "proc-macro2", + "quote", + "rustc_version", + "simd_cesu8", + "syn 2.0.119", +] + +[[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.119", +] + +[[package]] +name = "jobserver" +version = "0.1.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c00acbd29eabad4a2392fa0e921c874934dbbf4194312ad20f04a0ed67a3cb3" +dependencies = [ + "getrandom 0.4.3", + "libc", +] + +[[package]] +name = "js-sys" +version = "0.3.105" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce57d20d1ea864ce2ac172ab472d409214f4fd359f0b2a2775abdf522e2af99e" +dependencies = [ + "cfg-if", + "futures-util", + "wasm-bindgen", +] + +[[package]] +name = "jsonb" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb98fb29636087c40ad0d1274d9a30c0c1e83e03ae93f6e7e89247b37fcc6953" +dependencies = [ + "byteorder", + "ethnum", + "fast-float2", + "itoa", + "jiff", + "nom 8.0.0", + "num-traits", + "ordered-float 5.5.0", + "rand 0.9.5", + "serde", + "serde_json", + "zmij", +] + +[[package]] +name = "jsonwebtoken" +version = "10.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eba32bfb4ffdeaca3e34431072faf01745c9b26d25504aa7a6cf5684334fc4fc" +dependencies = [ + "aws-lc-rs", + "base64 0.22.1", + "getrandom 0.2.17", + "js-sys", + "pem", + "serde", + "serde_json", + "signature", + "simple_asn1", + "zeroize", +] + +[[package]] +name = "kanaria" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0f9d9652540055ac4fded998a73aca97d965899077ab1212587437da44196ff" +dependencies = [ + "bitflags 1.3.2", +] + +[[package]] +name = "kasuari" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bde5057d6143cc94e861d90f591b9303d6716c6b9602309150bd068853c10899" +dependencies = [ + "hashbrown 0.16.1", + "portable-atomic", + "thiserror 2.0.20", +] + +[[package]] +name = "kqueue" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d763e5b24120b4ddf50de6c92308156765aabfbbccebf401da7cff2d70a41ea" +dependencies = [ + "kqueue-sys", + "libc", +] + +[[package]] +name = "kqueue-sys" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07293a4e297ac234359b510362495713f75ea345d5307140414f20c69ffeb087" +dependencies = [ + "bitflags 2.13.1", + "libc", +] + +[[package]] +name = "lab" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf36173d4167ed999940f804952e6b08197cae5ad5d572eb4db150ce8ad5d58f" + +[[package]] +name = "lance" +version = "7.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3944aca86f4c78f4da04af1c2bf33e664a2826b7af72972ad200d6b9de59019f" +dependencies = [ + "arc-swap", + "arrow", + "arrow-arith", + "arrow-array", + "arrow-buffer", + "arrow-cast", + "arrow-ipc", + "arrow-ord", + "arrow-row", + "arrow-schema", + "arrow-select", + "async-recursion", + "async-trait", + "async_cell", + "bitpacking", + "byteorder", + "bytes", + "chrono", + "crossbeam-queue", + "crossbeam-skiplist", + "dashmap", + "datafusion", + "datafusion-expr", + "datafusion-functions", + "datafusion-physical-expr", + "datafusion-physical-plan", + "deepsize", + "either", + "futures", + "half", + "humantime", + "itertools 0.13.0", + "lance-arrow", + "lance-core", + "lance-datafusion", + "lance-encoding", + "lance-file", + "lance-index", + "lance-io", + "lance-linalg", + "lance-namespace", + "lance-table", + "lance-tokenizer", + "log", + "moka", + "object_store", + "permutation", + "pin-project", + "prost", + "prost-build", + "prost-types", + "rand 0.9.5", + "rayon", + "roaring", + "semver", + "serde", + "serde_json", + "snafu 0.9.2", + "tokio", + "tokio-stream", + "tokio-util", + "tracing", + "url", + "uuid", +] + +[[package]] +name = "lance-arrow" +version = "7.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "253f4a0a70580c985b91e65e9ca6cad644825a4078de28d8efbacf3ffbd7ecdc" +dependencies = [ + "arrow-array", + "arrow-buffer", + "arrow-data", + "arrow-ipc", + "arrow-ord", + "arrow-schema", + "arrow-select", + "bytes", + "futures", + "getrandom 0.2.17", + "half", + "jsonb", + "num-traits", + "rand 0.9.5", +] + +[[package]] +name = "lance-bitpacking" +version = "7.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80c4d12521b1945041dd515a56aa0854973138e7ac12111c92572e33e4ecb593" +dependencies = [ + "arrayref", + "paste", + "seq-macro", +] + +[[package]] +name = "lance-core" +version = "7.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13f84020da5a484e2f07dd1796e09785ed7cd889857ebc4cb77e32ef214ee594" +dependencies = [ + "arrow-array", + "arrow-buffer", + "arrow-schema", + "async-trait", + "byteorder", + "bytes", + "datafusion-common", + "datafusion-sql", + "deepsize", + "futures", + "itertools 0.13.0", + "lance-arrow", + "libc", + "log", + "moka", + "num_cpus", + "object_store", + "pin-project", + "prost", + "rand 0.9.5", + "roaring", + "serde_json", + "snafu 0.9.2", + "tempfile", + "tokio", + "tokio-stream", + "tokio-util", + "tracing", + "url", +] + +[[package]] +name = "lance-datafusion" +version = "7.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7460597a66534a75987993d4dac5bc330586d99c5b79ae73367dbcbd4e29e576" +dependencies = [ + "arrow", + "arrow-array", + "arrow-buffer", + "arrow-cast", + "arrow-ord", + "arrow-schema", + "arrow-select", + "async-trait", + "chrono", + "datafusion", + "datafusion-common", + "datafusion-functions", + "datafusion-physical-expr", + "futures", + "jsonb", + "lance-arrow", + "lance-core", + "lance-datagen", + "log", + "pin-project", + "prost", + "prost-build", + "tokio", + "tracing", +] + +[[package]] +name = "lance-datagen" +version = "7.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "046f5506ed2271cd941a050de7bf535dd3aedc291aadec836a63fa56c5926e3b" +dependencies = [ + "arrow", + "arrow-array", + "arrow-cast", + "arrow-schema", + "chrono", + "futures", + "half", + "hex", + "rand 0.9.5", + "rand_distr", + "rand_xoshiro", + "random_word", +] + +[[package]] +name = "lance-encoding" +version = "7.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7af54edf43dcf9d6a56cc636eb35d457e68373c6448dca3f0891b3325b4a24e6" +dependencies = [ + "arrow-arith", + "arrow-array", + "arrow-buffer", + "arrow-cast", + "arrow-data", + "arrow-schema", + "arrow-select", + "bytemuck", + "byteorder", + "bytes", + "fsst", + "futures", + "hex", + "hyperloglogplus", + "itertools 0.13.0", + "lance-arrow", + "lance-bitpacking", + "lance-core", + "log", + "lz4", + "num-traits", + "prost", + "prost-build", + "rand 0.9.5", + "strum 0.26.3", + "tokio", + "tracing", + "xxhash-rust", + "zstd", +] + +[[package]] +name = "lance-file" +version = "7.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0772ae2d6207995dc1eb28aff9507f78e90b3362b58f311da001e9dc25f3d736" +dependencies = [ + "arrow-arith", + "arrow-array", + "arrow-buffer", + "arrow-data", + "arrow-schema", + "arrow-select", + "async-recursion", + "async-trait", + "byteorder", + "bytes", + "datafusion-common", + "deepsize", + "futures", + "lance-arrow", + "lance-core", + "lance-encoding", + "lance-io", + "log", + "num-traits", + "object_store", + "prost", + "prost-build", + "prost-types", + "tokio", + "tracing", +] + +[[package]] +name = "lance-index" +version = "7.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e71fbfb51096a903cb524fe0da716f5f15fbc4a6b6f84cd6dec21abf319c5e84" +dependencies = [ + "arc-swap", + "arrow", + "arrow-arith", + "arrow-array", + "arrow-ord", + "arrow-schema", + "arrow-select", + "async-channel", + "async-recursion", + "async-trait", + "bitpacking", + "bitvec", + "bytes", + "chrono", + "crossbeam-queue", + "datafusion", + "datafusion-common", + "datafusion-expr", + "datafusion-physical-expr", + "deepsize", + "dirs 6.0.0", + "fst", + "futures", + "half", + "itertools 0.13.0", + "jieba-rs", + "jsonb", + "lance-arrow", + "lance-core", + "lance-datafusion", + "lance-datagen", + "lance-encoding", + "lance-file", + "lance-io", + "lance-linalg", + "lance-table", + "lance-tokenizer", + "libm", + "log", + "ndarray", + "num-traits", + "object_store", + "prost", + "prost-build", + "prost-types", + "rand 0.9.5", + "rand_distr", + "rangemap", + "rayon", + "roaring", + "serde", + "serde_json", + "smallvec", + "tempfile", + "tokio", + "tracing", + "twox-hash", + "uuid", +] + +[[package]] +name = "lance-io" +version = "7.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bab8c98ef1b870b20541d27f3ca4efdf7c9f5c25214233be07d231ba88900219" +dependencies = [ + "arrow", + "arrow-arith", + "arrow-array", + "arrow-buffer", + "arrow-cast", + "arrow-data", + "arrow-schema", + "arrow-select", + "async-recursion", + "async-trait", + "byteorder", + "bytes", + "chrono", + "deepsize", + "futures", + "http", + "io-uring", + "lance-arrow", + "lance-core", + "lance-namespace", + "log", + "moka", + "object_store", + "path_abs", + "pin-project", + "prost", + "rand 0.9.5", + "serde", + "tempfile", + "tokio", + "tracing", + "url", +] + +[[package]] +name = "lance-linalg" +version = "7.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b4c51cad0ac780b02dc4da48528479e7693c03e8d05390510bbc69ca2a9a1f1" +dependencies = [ + "arrow-array", + "arrow-buffer", + "arrow-schema", + "cc", + "deepsize", + "half", + "lance-arrow", + "lance-core", + "num-traits", + "rand 0.9.5", +] + +[[package]] +name = "lance-namespace" +version = "7.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "014e8332ca0615506342e0d3af608639864b68396973be14239f09c9f21f1fc2" +dependencies = [ + "arrow", + "async-trait", + "bytes", + "lance-core", + "lance-namespace-reqwest-client", + "snafu 0.9.2", +] + +[[package]] +name = "lance-namespace-impls" +version = "7.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8d1231906a3cf92dd3dcda7d14a09c4835af6cd2bcd76dfd2481e87f20a282d" +dependencies = [ + "arrow", + "arrow-ipc", + "arrow-schema", + "async-trait", + "bytes", + "futures", + "lance", + "lance-core", + "lance-index", + "lance-io", + "lance-linalg", + "lance-namespace", + "lance-table", + "log", + "object_store", + "rand 0.9.5", + "serde_json", + "tokio", + "url", +] + +[[package]] +name = "lance-namespace-reqwest-client" +version = "0.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6369eee4682fb11edf538388b43c61ce288b8302fe89bb40944d7daa7faaae99" +dependencies = [ + "reqwest 0.12.28", + "serde", + "serde_json", + "serde_repr", + "serde_with", + "url", +] + +[[package]] +name = "lance-table" +version = "7.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b16f1355904aea4ebb04ffc70c58c97901e10bde44452b4b021de4a1f329250d" +dependencies = [ + "arrow", + "arrow-array", + "arrow-buffer", + "arrow-ipc", + "arrow-schema", + "async-trait", + "byteorder", + "bytes", + "chrono", + "deepsize", + "futures", + "lance-arrow", + "lance-core", + "lance-file", + "lance-io", + "log", + "object_store", + "prost", + "prost-build", + "prost-types", + "rand 0.9.5", + "rangemap", + "roaring", + "semver", + "serde", + "serde_json", + "snafu 0.9.2", + "tokio", + "tracing", + "url", + "uuid", ] [[package]] -name = "jobserver" -version = "0.1.34" +name = "lance-testing" +version = "7.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" +checksum = "3094c2aacbd1fa093d809fc54fa911e3498671ba451041341d7caaa18460e6b2" dependencies = [ - "getrandom 0.3.4", - "libc", + "arrow-array", + "arrow-schema", + "lance-arrow", + "num-traits", + "rand 0.9.5", ] [[package]] -name = "js-sys" -version = "0.3.98" +name = "lance-tokenizer" +version = "7.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67df7112613f8bfd9150013a0314e196f4800d3201ae742489d999db2f979f08" +checksum = "b39b7f5ed9d0c0b716bf599b559d888267ed1dfe4c4e29d3648b51d2a28940cf" dependencies = [ - "cfg-if", - "futures-util", - "once_cell", - "wasm-bindgen", + "jieba-rs", + "lindera", + "rust-stemmers", + "serde", + "unicode-normalization", ] [[package]] -name = "jsonwebtoken" -version = "10.4.0" +name = "lancedb" +version = "0.30.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eba32bfb4ffdeaca3e34431072faf01745c9b26d25504aa7a6cf5684334fc4fc" -dependencies = [ - "base64", - "ed25519-dalek", - "getrandom 0.2.17", - "hmac", - "js-sys", - "p256", - "p384", - "pem", - "rand 0.8.6", - "rsa", +checksum = "9db595d8da6c1fbf41ef6a547f27a73cc1105d83a837e8c76ce08743a3c09260" +dependencies = [ + "ahash", + "arrow", + "arrow-array", + "arrow-cast", + "arrow-data", + "arrow-ipc", + "arrow-ord", + "arrow-schema", + "arrow-select", + "async-trait", + "bytes", + "chrono", + "datafusion", + "datafusion-catalog", + "datafusion-common", + "datafusion-execution", + "datafusion-expr", + "datafusion-functions", + "datafusion-physical-expr", + "datafusion-physical-plan", + "datafusion-sql", + "futures", + "half", + "lance", + "lance-arrow", + "lance-core", + "lance-datafusion", + "lance-datagen", + "lance-encoding", + "lance-file", + "lance-index", + "lance-io", + "lance-linalg", + "lance-namespace", + "lance-namespace-impls", + "lance-table", + "lance-testing", + "lazy_static", + "log", + "moka", + "num-traits", + "object_store", + "pin-project", + "rand 0.9.5", + "regex", + "semver", "serde", "serde_json", - "sha2", - "signature", - "simple_asn1", - "zeroize", + "serde_with", + "snafu 0.8.9", + "tempfile", + "tokio", + "url", + "uuid", ] [[package]] -name = "kasuari" -version = "0.4.12" +name = "lazy_static" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bde5057d6143cc94e861d90f591b9303d6716c6b9602309150bd068853c10899" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" + +[[package]] +name = "lebe" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a79a3332a6609480d7d0c9eab957bca6b455b91bb84e66d19f5ff66294b85b8" + +[[package]] +name = "lexical-core" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d8d125a277f807e55a77304455eb7b1cb52f2b18c143b60e766c120bd64a594" dependencies = [ - "hashbrown 0.16.1", - "portable-atomic", - "thiserror 2.0.18", + "lexical-parse-float", + "lexical-parse-integer", + "lexical-util", + "lexical-write-float", + "lexical-write-integer", ] [[package]] -name = "kqueue" -version = "1.1.1" +name = "lexical-parse-float" +version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eac30106d7dce88daf4a3fcb4879ea939476d5074a9b7ddd0fb97fa4bed5596a" +checksum = "52a9f232fbd6f550bc0137dcb5f99ab674071ac2d690ac69704593cb4abbea56" dependencies = [ - "kqueue-sys", - "libc", + "lexical-parse-integer", + "lexical-util", ] [[package]] -name = "kqueue-sys" -version = "1.1.2" +name = "lexical-parse-integer" +version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07293a4e297ac234359b510362495713f75ea345d5307140414f20c69ffeb087" +checksum = "9a7a039f8fb9c19c996cd7b2fcce303c1b2874fe1aca544edc85c4a5f8489b34" dependencies = [ - "bitflags 2.11.1", - "libc", + "lexical-util", ] [[package]] -name = "lab" -version = "0.11.0" +name = "lexical-util" +version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf36173d4167ed999940f804952e6b08197cae5ad5d572eb4db150ce8ad5d58f" +checksum = "2604dd126bb14f13fb5d1bd6a66155079cb9fa655b37f875b3a742c705dbed17" [[package]] -name = "lazy_static" -version = "1.5.0" +name = "lexical-write-float" +version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" +checksum = "50c438c87c013188d415fbabbb1dceb44249ab81664efbd31b14ae55dabb6361" dependencies = [ - "spin", + "lexical-util", + "lexical-write-integer", ] [[package]] -name = "leb128fmt" -version = "0.1.0" +name = "lexical-write-integer" +version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" +checksum = "409851a618475d2d5796377cad353802345cba92c867d9fbcde9cf4eac4e14df" +dependencies = [ + "lexical-util", +] [[package]] name = "libc" -version = "0.2.186" +version = "0.2.189" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66" +checksum = "3eaf3ede3fee6db1a4c2ee091bf8a8b4dccdc6d17f656fb07896ee72867612f2" + +[[package]] +name = "libfuzzer-sys" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9fd2f41a1cba099f79a0b6b6c35656cf7c03351a7bae8ff0f28f25270f929d2" +dependencies = [ + "arbitrary", + "cc", +] [[package]] name = "libgit2-sys" -version = "0.18.4+1.9.3" +version = "0.18.8+1.9.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b26f66f35e1871b22efcf7191564123d2a446ca0538cde63c23adfefa9b15b7" +checksum = "7f7c568b25d7489bc3fb2988ed69ab111d2944d2f5fec3d5c987fe545ea97b50" dependencies = [ "cc", "libc", - "libssh2-sys", "libz-sys", - "openssl-sys", "pkg-config", ] @@ -2110,46 +4466,86 @@ checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" [[package]] name = "libredox" -version = "0.1.16" +version = "0.1.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e02f3bb43d335493c96bf3fd3a321600bf6bd07ed34bc64118e9293bdffea46c" +checksum = "8d8f1ea3f21fd3405dcaf6c9b5c1630af9afc422d9073ea39c5f6d6c772e08ed" dependencies = [ "libc", ] [[package]] -name = "libssh2-sys" -version = "0.3.1" +name = "libz-sys" +version = "1.1.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "220e4f05ad4a218192533b300327f5150e809b54c4ec83b5a1d91833601811b9" +checksum = "85bc9657773828b90eeb625adff10eeac83cc21bbfd8e23a03eaa8a33c9e28d9" dependencies = [ "cc", "libc", - "libz-sys", - "openssl-sys", "pkg-config", "vcpkg", ] [[package]] -name = "libz-sys" -version = "1.1.28" +name = "lindera" +version = "3.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc3a226e576f50782b3305c5ccf458698f92798987f551c6a02efe8276721e22" +checksum = "74cda79d7161e99b414e4d292ff673cc3f8d22f070d8be3b6185c033363a9216" dependencies = [ - "cc", - "libc", - "pkg-config", - "vcpkg", + "anyhow", + "byteorder", + "csv", + "daachorse", + "kanaria", + "lindera-dictionary", + "log", + "once_cell", + "percent-encoding", + "regex", + "serde", + "serde_json", + "serde_yaml_ng", + "strum 0.28.0", + "strum_macros 0.28.0", + "unicode-blocks", + "unicode-normalization", + "unicode-segmentation", + "url", +] + +[[package]] +name = "lindera-dictionary" +version = "3.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2385456ca9fe87c29072c5f156b52fdd5e28d5b5738ddfb3979501dbd736530" +dependencies = [ + "anyhow", + "byteorder", + "csv", + "daachorse", + "derive_builder", + "encoding_rs", + "encoding_rs_io", + "glob", + "log", + "memmap2", + "num_cpus", + "once_cell", + "regex", + "rkyv", + "serde", + "serde_json", + "strum 0.28.0", + "strum_macros 0.28.0", + "thiserror 2.0.20", ] [[package]] name = "line-clipping" -version = "0.3.7" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f50e8f47623268b5407192d26876c4d7f89d686ca130fdc53bced4814cd29f8" +checksum = "e752191d037c44ad111a8caa762921926658402f01cc1253f7bef2020ece4f5e" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.13.1", ] [[package]] @@ -2160,9 +4556,9 @@ checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" [[package]] name = "litemap" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92daf443525c4cce67b150400bc2316076100ce0b3686209eb8cf3c31612e6f0" +checksum = "47d9d19d1d6efa0109d2f65ff4c85cddd50bd572e5a00127ab10987290bcefae" [[package]] name = "litrs" @@ -2181,24 +4577,37 @@ dependencies = [ [[package]] name = "log" -version = "0.4.29" +version = "0.4.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" +checksum = "f9f8bd3e56ce4dfc153cf470fffbfa98c7620958b312ca5c3a4b8d5181fd13c6" [[package]] -name = "lru" -version = "0.16.4" +name = "loom" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f66e8d5d03f609abc3a39e6f08e4164ebf1447a732906d39eb9b99b7919ef39" +checksum = "419e0dc8046cb947daa77eb95ae174acfbddb7673b4151f56d1eed8e93fbfaca" dependencies = [ - "hashbrown 0.16.1", + "cfg-if", + "generator", + "scoped-tls", + "tracing", + "tracing-subscriber", +] + +[[package]] +name = "loop9" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fae87c125b03c1d2c0150c90365d7d6bcc53fb73a9acaef207d2d065860f062" +dependencies = [ + "imgref", ] [[package]] name = "lru" -version = "0.18.0" +version = "0.18.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a860605968fce16869fd239cf4237a82f3ac470723415db603b0e8b6c8d4fb9" +checksum = "ff9840bcc50b71349309900da0ce7279aa336ae71d73250b07998932c7d97c25" dependencies = [ "hashbrown 0.17.1", ] @@ -2209,6 +4618,34 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154" +[[package]] +name = "lz4" +version = "1.28.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a20b523e860d03443e98350ceaac5e71c6ba89aea7d960769ec3ce37f4de5af4" +dependencies = [ + "lz4-sys", +] + +[[package]] +name = "lz4-sys" +version = "1.11.1+lz4-1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6bd8c0d6c6ed0cd30b3652886bb8711dc4bb01d637a68105a3d5158039b418e6" +dependencies = [ + "cc", + "libc", +] + +[[package]] +name = "lz4_flex" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ef0d4ed8669f8f8826eb00dc878084aa8f253506c4fd5e8f58f5bce72ddb97e" +dependencies = [ + "twox-hash", +] + [[package]] name = "mac_address" version = "1.1.8" @@ -2219,6 +4656,22 @@ dependencies = [ "winapi", ] +[[package]] +name = "macro_rules_attribute" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3ae8f6d608c795738406608304d30a2dfbdc8e58e44f7ba43236da5208ded3c" +dependencies = [ + "macro_rules_attribute-proc_macro", + "pastey 0.2.3", +] + +[[package]] +name = "macro_rules_attribute-proc_macro" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc04a4c58212d57930a24bf47d3fa87485264a3a054e9c10e042eb373573ad3c" + [[package]] name = "matchers" version = "0.2.0" @@ -2228,11 +4681,53 @@ dependencies = [ "regex-automata", ] +[[package]] +name = "matrixmultiply" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f607c237553f086e7043417a51df26b2eb899d3caff94e6a67592ff992fedc7" +dependencies = [ + "autocfg", + "num_cpus", + "once_cell", + "rawpointer", + "thread-tree", +] + +[[package]] +name = "maybe-rayon" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ea1f30cedd69f0a2954655f7188c6a834246d2bcf1e315e2ac40c4b24dc9519" +dependencies = [ + "cfg-if", + "rayon", +] + +[[package]] +name = "md-5" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" +dependencies = [ + "cfg-if", + "digest", +] + [[package]] name = "memchr" -version = "2.8.0" +version = "2.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98" + +[[package]] +name = "memmap2" +version = "0.9.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" +checksum = "d1219ed1b7f229ee7104d281dd01d6802fe28bb6e95d292942c4daacdeb798c0" +dependencies = [ + "libc", +] [[package]] name = "memmem" @@ -2281,11 +4776,21 @@ dependencies = [ "simd-adler32", ] +[[package]] +name = "miniz_oxide" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b63fbc4a50860e98e7b2aa7804ded1db5cbc3aff9193adaff57a6931bf7c4b4c" +dependencies = [ + "adler2", + "simd-adler32", +] + [[package]] name = "mio" -version = "1.2.0" +version = "1.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50b7e5b27aa02a74bac8c3f23f448f8d87ff11f92d3aac1a6ed369ee08cc56c1" +checksum = "4b18443e9c262bfe8fa82f51666e2642c53393f7e5c27b3e1aeab922cff5b9d8" dependencies = [ "libc", "log", @@ -2293,6 +4798,48 @@ dependencies = [ "windows-sys 0.61.2", ] +[[package]] +name = "moka" +version = "0.12.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4293f18e7567a1caf3c584855554377025c65e0aa445344d04171f5ad63d19b9" +dependencies = [ + "async-lock", + "crossbeam-channel", + "crossbeam-epoch", + "crossbeam-utils", + "equivalent", + "event-listener", + "futures-util", + "parking_lot", + "portable-atomic", + "smallvec", + "tagptr", + "uuid", +] + +[[package]] +name = "monostate" +version = "0.1.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3341a273f6c9d5bef1908f17b7267bbab0e95c9bf69a0d4dcf8e9e1b2c76ef67" +dependencies = [ + "monostate-impl", + "serde", + "serde_core", +] + +[[package]] +name = "monostate-impl" +version = "0.1.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4db6d5580af57bf992f59068d4ea26fd518574ff48d7639b255a36f9de6e7e9" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + [[package]] name = "moxcms" version = "0.8.1" @@ -2304,27 +4851,74 @@ dependencies = [ ] [[package]] -name = "nanoid" -version = "0.4.0" +name = "multimap" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d87ecb2933e8aeadb3e3a02b828fed80a7528047e68b4f424523a0981a3a084" + +[[package]] +name = "munge" +version = "0.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e17401f259eba956ca16491461b6e8f72913a0a114e39736ce404410f915a0c" +dependencies = [ + "munge_macro", +] + +[[package]] +name = "munge_macro" +version = "0.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4568f25ccbd45ab5d5603dc34318c1ec56b117531781260002151b8530a9f931" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "ndarray" +version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ffa00dec017b5b1a8b7cf5e2c008bfda1aa7e0697ac1508b491fdf2622fb4d8" +checksum = "882ed72dce9365842bf196bdeedf5055305f11fc8c03dee7bb0194a6cad34841" dependencies = [ - "rand 0.8.6", + "matrixmultiply", + "num-complex", + "num-integer", + "num-traits", + "portable-atomic", + "portable-atomic-util", + "rawpointer", ] +[[package]] +name = "new_debug_unreachable" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" + [[package]] name = "nix" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.13.1", "cfg-if", "cfg_aliases", "libc", "memoffset", ] +[[package]] +name = "no_std_io2" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "418abd1b6d34fbf6cae440dc874771b0525a604428704c76e48b29a5e67b8003" +dependencies = [ + "memchr", +] + [[package]] name = "nom" version = "7.1.3" @@ -2335,13 +4929,28 @@ dependencies = [ "minimal-lexical", ] +[[package]] +name = "nom" +version = "8.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df9761775871bdef83bee530e60050f7e54b1105350d6884eb0fb4f46c2f9405" +dependencies = [ + "memchr", +] + +[[package]] +name = "noop_proc_macro" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0676bb32a98c1a483ce53e500a81ad9c3d5b3f7c920c28c24e9cb0980d0b5bc8" + [[package]] name = "notify" version = "8.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4d3d07927151ff8575b7087f245456e549fea62edf0ec4e565a5ee50c8402bc3" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.13.1", "fsevent-sys", "inotify", "kqueue", @@ -2372,7 +4981,7 @@ version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42b8cfee0e339a0337359f3c88165702ac6e600dc01c0cc9579a92d62b08477a" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.13.1", ] [[package]] @@ -2381,33 +4990,27 @@ version = "0.50.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5" dependencies = [ - "windows-sys 0.61.2", + "windows-sys 0.59.0", ] [[package]] name = "num-bigint" -version = "0.4.6" +version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" +checksum = "c89e69e7e0f03bea5ef08013795c25018e101932225a656383bd384495ecc367" dependencies = [ "num-integer", "num-traits", ] [[package]] -name = "num-bigint-dig" -version = "0.8.6" +name = "num-complex" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e661dda6640fad38e827a6d4a310ff4763082116fe217f279885c97f511bb0b7" +checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495" dependencies = [ - "lazy_static", - "libm", - "num-integer", - "num-iter", + "bytemuck", "num-traits", - "rand 0.8.6", - "smallvec", - "zeroize", ] [[package]] @@ -2424,25 +5027,25 @@ checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] name = "num-integer" -version = "0.1.46" +version = "0.1.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +checksum = "7ce2d95d4b3734dc35aa2f45e1aa22cd416814592a4f9d9205e11affd5b8e10b" dependencies = [ "num-traits", ] [[package]] -name = "num-iter" -version = "0.1.45" +name = "num-rational" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" +checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" dependencies = [ - "autocfg", + "num-bigint", "num-integer", "num-traits", ] @@ -2457,6 +5060,16 @@ dependencies = [ "libm", ] +[[package]] +name = "num_cpus" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91df4bbde75afed763b708b7eee1e8e7651e02d97f6d5dd763e89367e957b23b" +dependencies = [ + "hermit-abi", + "libc", +] + [[package]] name = "num_threads" version = "0.1.7" @@ -2466,6 +5079,12 @@ dependencies = [ "libc", ] +[[package]] +name = "number_prefix" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830b246a0e5f20af87141b25c173cd1b609bd7779a4617d6ec582abaf90870f3" + [[package]] name = "objc2" version = "0.6.4" @@ -2481,7 +5100,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d49e936b501e5c5bf01fda3a9452ff86dc3ea98ad5f283e1455153142d97518c" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.13.1", "objc2", "objc2-core-graphics", "objc2-foundation", @@ -2493,7 +5112,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.13.1", "dispatch2", "objc2", ] @@ -2504,7 +5123,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e022c9d066895efa1345f8e33e584b9f958da2fd4cd116792e15e07e4720a807" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.13.1", "dispatch2", "objc2", "objc2-core-foundation", @@ -2523,7 +5142,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3e0adef53c21f888deb4fa59fc59f7eb17404926ee8a6f59f5df0fd7f9f3272" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.13.1", "objc2", "objc2-core-foundation", ] @@ -2534,45 +5153,71 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "180788110936d59bab6bd83b6060ffdfffb3b922ba1396b312ae795e1de9d81d" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.13.1", "objc2", "objc2-core-foundation", ] +[[package]] +name = "object_store" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "622acbc9100d3c10e2ee15804b0caa40e55c933d5aa53814cd520805b7958a49" +dependencies = [ + "async-trait", + "bytes", + "chrono", + "futures-channel", + "futures-core", + "futures-util", + "http", + "humantime", + "itertools 0.14.0", + "parking_lot", + "percent-encoding", + "thiserror 2.0.20", + "tokio", + "tracing", + "url", + "walkdir", + "wasm-bindgen-futures", + "web-time", +] + [[package]] name = "octocrab" -version = "0.49.9" +version = "0.54.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ddbc3bb87e8c680febf16f56855bbd8b44a38e18c913334213ab34908e71a09" +checksum = "432fad6f447c52acda76a7a0660f022b21f4c42f373bbdc29f04332ba19a89bf" dependencies = [ "arc-swap", "async-trait", - "base64", + "base64 0.22.1", "bytes", "cargo_metadata", "cfg-if", "chrono", - "either", "futures", "futures-util", "getrandom 0.2.17", "http", "http-body", "http-body-util", + "http-serde", "hyper", "hyper-rustls", "hyper-timeout", "hyper-util", "jsonwebtoken", - "once_cell", "percent-encoding", "pin-project", + "rustls", "secrecy", "serde", "serde_json", "serde_path_to_error", "serde_urlencoded", - "snafu", + "snafu 0.8.9", "tokio", "tower", "tower-http", @@ -2599,7 +5244,7 @@ version = "6.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0cc3cbf698f9438986c11a880c90a6d04b9de27575afd28bbf45b154b6c709e2" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.13.1", "libc", "once_cell", "onig_sys", @@ -2617,44 +5262,26 @@ dependencies = [ [[package]] name = "opaline" -version = "0.4.0" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1ab7165d71f0a02fd8e683c09ae0f341116bb5cef0e1df7eebacb6cecf0fb44" +checksum = "e98277da6412c68269539a8edf58106c72cb2af78e6aa0e210d39fa1084d3512" dependencies = [ "colored", - "dirs", + "dirs 6.0.0", "parking_lot", "ratatui-core", "serde", - "thiserror 2.0.18", + "thiserror 2.0.20", "toml 0.8.23", "unicode-segmentation", ] -[[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" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7c87def4c32ab89d880effc9e097653c8da5d6ef28e6b539d313baaacfbafcbe" -[[package]] -name = "openssl-sys" -version = "0.9.116" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f28a22dc7140cda5f096e5e7724a6962ca81a7f8bfd2979f9b18c11af56318c4" -dependencies = [ - "cc", - "libc", - "pkg-config", - "vcpkg", -] - [[package]] name = "option-ext" version = "0.2.0" @@ -2672,37 +5299,72 @@ dependencies = [ [[package]] name = "ordered-float" -version = "5.3.0" +version = "5.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7d950ca161dc355eaf28f82b11345ed76c6e1f6eb1f4f4479e0323b9e2fbd0e" +checksum = "8c7c9e0d9b23589f26070720bac724174bfec1083e82f7854cdd0267518343c0" dependencies = [ "num-traits", ] [[package]] -name = "p256" -version = "0.13.2" +name = "ort" +version = "2.0.0-rc.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9863ad85fa8f4460f9c48cb909d38a0d689dba1f6f6988a5e3e0d31071bcd4b" +checksum = "52afb44b6b0cffa9bf45e4d37e5a4935b0334a51570658e279e9e3e6cf324aa5" dependencies = [ - "ecdsa", - "elliptic-curve", - "primeorder", - "sha2", + "ndarray", + "ort-sys", + "tracing", ] [[package]] -name = "p384" -version = "0.13.1" +name = "ort-sys" +version = "2.0.0-rc.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe42f1670a52a47d448f14b6a5c61dd78fce51856e68edaa38f7ae3a46b8d6b6" +checksum = "c41d7757331aef2d04b9cb09b45583a59217628beaf91895b7e76187b6e8c088" dependencies = [ - "ecdsa", - "elliptic-curve", - "primeorder", - "sha2", + "pkg-config", +] + +[[package]] +name = "palette" +version = "0.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddeed8580d347d2abf3dcf06a5f0b3dc020258338526b277847cd4248a70fc64" +dependencies = [ + "approx", + "libm", + "palette_derive", + "palette_math", +] + +[[package]] +name = "palette_derive" +version = "0.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88537020289b719d81be994ccf1bbf4990f477e2f69ee52fe3e45f43a02e56be" +dependencies = [ + "by_address", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "palette_math" +version = "0.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e6eb142958d64335fb0e345c5b9ead2ecd6fc438c307e9d7d3c4fd428dbaf12" +dependencies = [ + "libm", ] +[[package]] +name = "parking" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" + [[package]] name = "parking_lot" version = "0.12.5" @@ -2727,22 +5389,43 @@ dependencies = [ ] [[package]] -name = "pem" -version = "3.0.6" +name = "paste" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d30c53c26bc5b31a98cd02d20f25a7c8567146caf63ed593a9d87b2775291be" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + +[[package]] +name = "pastey" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35fb2e5f958ec131621fdd531e9fc186ed768cbe395337403ae56c17a74c68ec" + +[[package]] +name = "pastey" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ee67f1008b1ba2321834326597b8e186293b049a023cdef258527550b9935b4" + +[[package]] +name = "path_abs" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05ef02f6342ac01d8a93b65f96db53fe68a92a15f41144f97fb00a9e669633c3" dependencies = [ - "base64", - "serde_core", + "serde", + "serde_derive", + "std_prelude", + "stfu8", ] [[package]] -name = "pem-rfc7468" -version = "0.7.0" +name = "pem" +version = "3.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412" +checksum = "1d30c53c26bc5b31a98cd02d20f25a7c8567146caf63ed593a9d87b2775291be" dependencies = [ - "base64ct", + "base64 0.22.1", + "serde_core", ] [[package]] @@ -2751,11 +5434,17 @@ version = "2.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" +[[package]] +name = "permutation" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df202b0b0f5b8e389955afd5f27b007b00fb948162953f1db9c70d2c7e3157d7" + [[package]] name = "pest" -version = "2.8.6" +version = "2.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0848c601009d37dfa3430c4666e147e49cdcf1b92ecd3e63657d8a5f19da662" +checksum = "6d45aeb61b4bf818e12d4205f2466f8c4748f85f4fce0146d1c03d69d753f0ad" dependencies = [ "memchr", "ucd-trie", @@ -2763,9 +5452,9 @@ dependencies = [ [[package]] name = "pest_derive" -version = "2.8.6" +version = "2.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11f486f1ea21e6c10ed15d5a7c77165d0ee443402f0780849d1768e7d9d6fe77" +checksum = "89cc5a242e25ed4e7704d0be240f2cfbe20a8c27e7e252d94835be93d92dc39f" dependencies = [ "pest", "pest_generator", @@ -2773,25 +5462,36 @@ dependencies = [ [[package]] name = "pest_generator" -version = "2.8.6" +version = "2.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8040c4647b13b210a963c1ed407c1ff4fdfa01c31d6d2a098218702e6664f94f" +checksum = "7abf21475cc3820fe4b2ca2dc2142902f67a02189f3b5b3a229f4febc01a43e5" dependencies = [ "pest", "pest_meta", "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] name = "pest_meta" -version = "2.8.6" +version = "2.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89815c69d36021a140146f26659a81d6c2afa33d216d736dd4be5381a7362220" +checksum = "adba4db388f687393c18c51348d44a41d870ca9df71a2c98172ea3035dc6936e" dependencies = [ "pest", - "sha2", +] + +[[package]] +name = "petgraph" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8701b58ea97060d5e5b155d383a69952a60943f0e6dfe30b04c287beb0b27455" +dependencies = [ + "fixedbitset 0.5.7", + "hashbrown 0.15.5", + "indexmap 2.14.2", + "serde", ] [[package]] @@ -2801,7 +5501,26 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2c2edd078" dependencies = [ "phf_macros", - "phf_shared", + "phf_shared 0.11.3", +] + +[[package]] +name = "phf" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "913273894cec178f401a31ec4b656318d95473527be05c0752cc41cdc32be8b7" +dependencies = [ + "phf_shared 0.12.1", +] + +[[package]] +name = "phf" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1562dc717473dbaa4c1f85a36410e03c047b2e7df7f45ee938fbef64ae7fadf" +dependencies = [ + "phf_shared 0.13.1", + "serde", ] [[package]] @@ -2810,8 +5529,18 @@ version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "aef8048c789fa5e851558d709946d6d79a8ff88c0440c587967f8e94bfb1216a" dependencies = [ - "phf_generator", - "phf_shared", + "phf_generator 0.11.3", + "phf_shared 0.11.3", +] + +[[package]] +name = "phf_codegen" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49aa7f9d80421bca176ca8dbfebe668cc7a2684708594ec9f3c0db0805d5d6e1" +dependencies = [ + "phf_generator 0.13.1", + "phf_shared 0.13.1", ] [[package]] @@ -2820,8 +5549,18 @@ version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c80231409c20246a13fddb31776fb942c38553c51e871f8cbd687a4cfb5843d" dependencies = [ - "phf_shared", - "rand 0.8.6", + "phf_shared 0.11.3", + "rand 0.8.8", +] + +[[package]] +name = "phf_generator" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "135ace3a761e564ec88c03a77317a7c6b80bb7f7135ef2544dbe054243b89737" +dependencies = [ + "fastrand", + "phf_shared 0.13.1", ] [[package]] @@ -2830,11 +5569,11 @@ version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f84ac04429c13a7ff43785d75ad27569f2951ce0ffd30a3321230db2fc727216" dependencies = [ - "phf_generator", - "phf_shared", + "phf_generator 0.11.3", + "phf_shared 0.11.3", "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] @@ -2846,6 +5585,24 @@ dependencies = [ "siphasher", ] +[[package]] +name = "phf_shared" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06005508882fb681fd97892ecff4b7fd0fee13ef1aa569f8695dae7ab9099981" +dependencies = [ + "siphasher", +] + +[[package]] +name = "phf_shared" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e57fef6bc5981e38c2ce2d63bfa546861309f875b8a75f092d1d54ae2d64f266" +dependencies = [ + "siphasher", +] + [[package]] name = "pin-project" version = "1.1.13" @@ -2863,7 +5620,7 @@ checksum = "c96395f0a926bc13b1c17622aaddda1ecb55d49c8f1bf9777e4d877800a43f8b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] @@ -2873,129 +5630,188 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" [[package]] -name = "pkcs1" -version = "0.7.5" +name = "pkg-config" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6b464fbc74e149a392436b17d523f769e057cb6877f6a5c4618bc6f11800548" + +[[package]] +name = "png" +version = "0.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8ffb9f10fa047879315e6625af03c164b16962a5368d724ed16323b68ace47f" +checksum = "60769b8b31b2a9f263dae2776c37b1b28ae246943cf719eb6946a1db05128a61" dependencies = [ - "der", - "pkcs8", - "spki", + "bitflags 2.13.1", + "crc32fast", + "fdeflate", + "flate2", + "miniz_oxide 0.8.9", ] [[package]] -name = "pkcs8" -version = "0.10.2" +name = "portable-atomic" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05c8b63e8d9609db387f0324918f81d68fe27748f084ef092fb35954d0539a85" + +[[package]] +name = "portable-atomic-util" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" +checksum = "10ab3eb7f3becc3a1cbc4f2c6f20267996cfc1a6467a873763411b136a122715" dependencies = [ - "der", - "spki", + "portable-atomic", ] [[package]] -name = "pkg-config" -version = "0.3.33" +name = "potential_utf" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19f132c84eca552bf34cab8ec81f1c1dcc229b811638f9d283dceabe58c5569e" +checksum = "d83eb9bc6d8e5cf568e7a1101d60ee05e81ed50ea106026f3d18deeb046d7661" +dependencies = [ + "zerovec", +] [[package]] -name = "png" -version = "0.18.1" +name = "powerfmt" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60769b8b31b2a9f263dae2776c37b1b28ae246943cf719eb6946a1db05128a61" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + +[[package]] +name = "ppv-lite86" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" dependencies = [ - "bitflags 2.11.1", - "crc32fast", - "fdeflate", - "flate2", - "miniz_oxide", + "zerocopy", ] [[package]] -name = "portable-atomic" -version = "1.13.1" +name = "prettyplease" +version = "0.2.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" +dependencies = [ + "proc-macro2", + "syn 2.0.119", +] + +[[package]] +name = "proc-macro-crate" +version = "3.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49" +checksum = "e67ba7e9b2b56446f1d419b1d807906278ffa1a658a8a5d8a39dcb1f5a78614f" +dependencies = [ + "toml_edit 0.25.13+spec-1.1.0", +] [[package]] -name = "potential_utf" -version = "0.1.5" +name = "proc-macro2" +version = "1.0.107" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "profiling" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0103b1cef7ec0cf76490e969665504990193874ea05c85ff9bab8b911d0a0564" +checksum = "3d595e54a326bc53c1c197b32d295e14b169e3cfeaa8dc82b529f947fba6bcf5" dependencies = [ - "zerovec", + "profiling-procmacros", ] [[package]] -name = "powerfmt" -version = "0.2.0" +name = "profiling-procmacros" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" +checksum = "4488a4a36b9a4ba6b9334a32a39971f77c1436ec82c38707bce707699cc3bbcb" +dependencies = [ + "quote", + "syn 2.0.119", +] [[package]] -name = "ppv-lite86" -version = "0.2.21" +name = "prost" +version = "0.14.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +checksum = "528ac67416ff8646872a3c02cad9cc4ee5dc9f9540c9b10771855c95cb2e5ae1" dependencies = [ - "zerocopy", + "bytes", + "prost-derive", ] [[package]] -name = "prettyplease" -version = "0.2.37" +name = "prost-build" +version = "0.14.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" +checksum = "03da047801ff44bb6a4d407d4860c05fd70bb81714e6b2f3812603d5b145b042" dependencies = [ - "proc-macro2", - "syn 2.0.117", + "heck", + "itertools 0.14.0", + "log", + "multimap", + "petgraph", + "prettyplease", + "prost", + "prost-types", + "regex", + "syn 2.0.119", + "tempfile", ] [[package]] -name = "primeorder" -version = "0.13.6" +name = "prost-derive" +version = "0.14.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "353e1ca18966c16d9deb1c69278edbc5f194139612772bd9537af60ac231e1e6" +checksum = "b570b25f7617e43d59005d0990ccb79e950a423952cea19671b7a876da390adf" dependencies = [ - "elliptic-curve", + "anyhow", + "itertools 0.14.0", + "proc-macro2", + "quote", + "syn 2.0.119", ] [[package]] -name = "proc-macro-crate" -version = "1.3.1" +name = "prost-types" +version = "0.14.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" +checksum = "f94967dc7688f3054c7fac87473ffae4cc4c3904800e2d9f5b857246d8963b0a" dependencies = [ - "once_cell", - "toml_edit 0.19.15", + "prost", ] [[package]] -name = "proc-macro-crate" -version = "3.5.0" +name = "ptr_meta" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e67ba7e9b2b56446f1d419b1d807906278ffa1a658a8a5d8a39dcb1f5a78614f" +checksum = "743da816b98c921cdbe8628ef7381b76f25ecf4da599fc80aca90eae7ef70cc0" dependencies = [ - "toml_edit 0.25.11+spec-1.1.0", + "ptr_meta_derive", ] [[package]] -name = "proc-macro2" -version = "1.0.106" +name = "ptr_meta_derive" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" +checksum = "1c8d9ca532f185d5d4db7a7c9d51420b452168ea1c2b913953281bd6fe1fcbd0" dependencies = [ - "unicode-ident", + "proc-macro2", + "quote", + "syn 3.0.5", ] [[package]] name = "pulldown-cmark" -version = "0.13.3" +version = "0.13.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c3a14896dfa883796f1cb410461aef38810ea05f2b2c33c5aded3649095fdad" +checksum = "e9f068eba8e7071c5f9511831b44f32c740d5adf574e990f946ddb53db2f314e" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.13.1", "getopts", "memchr", "pulldown-cmark-escape", @@ -3008,11 +5824,43 @@ version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "007d8adb5ddab6f8e3f491ac63566a7d5002cc7ed73901f72057943fa71ae1ae" +[[package]] +name = "pulp" +version = "0.22.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "046aa45b989642ec2e4717c8e72d677b13edd831a4d3b6cf37d9a3e54912496a" +dependencies = [ + "bytemuck", + "cfg-if", + "libm", + "num-complex", + "paste", + "pulp-wasm-simd-flag", + "raw-cpuid", + "reborrow", + "version_check", +] + +[[package]] +name = "pulp-wasm-simd-flag" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d8f70e07b9c3962945a74e59ca1c511bba65b6419468acc217c457d93f3c740" + [[package]] name = "pxfm" -version = "0.1.29" +version = "0.1.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d55d956fa96f5ec02be2e13af0e20391a5aa83d6a074e3ad368959d0fab299ea" + +[[package]] +name = "qoi" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0c5ccf5294c6ccd63a74f1565028353830a9c2f5eb0c682c355c471726a6e3f" +checksum = "7f6d64c71eb498fe9eae14ce4ec935c555749aef511cca85b5568910d6e48001" +dependencies = [ + "bytemuck", +] [[package]] name = "quick-error" @@ -3022,9 +5870,9 @@ checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3" [[package]] name = "quinn" -version = "0.11.9" +version = "0.11.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9e20a958963c291dc322d98411f541009df2ced7b5a4f2bd52337638cfccf20" +checksum = "0c1a41e437b6bbd489372cd4971de128e85c855f56c57f283d20ff016cf7c0a8" dependencies = [ "bytes", "cfg_aliases", @@ -3034,7 +5882,7 @@ dependencies = [ "rustc-hash", "rustls", "socket2", - "thiserror 2.0.18", + "thiserror 2.0.20", "tokio", "tracing", "web-time", @@ -3042,21 +5890,22 @@ dependencies = [ [[package]] name = "quinn-proto" -version = "0.11.14" +version = "0.11.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "434b42fec591c96ef50e21e886936e66d3cc3f737104fdb9b737c40ffb94c098" +checksum = "04759210543be93709136e28212294a659ef5001836ff4eab4d663e4529bba83" dependencies = [ "aws-lc-rs", "bytes", - "getrandom 0.3.4", + "getrandom 0.4.3", "lru-slab", - "rand 0.9.4", + "rand 0.10.2", + "rand_pcg", "ring", "rustc-hash", "rustls", "rustls-pki-types", "slab", - "thiserror 2.0.18", + "thiserror 2.0.20", "tinyvec", "tracing", "web-time", @@ -3064,23 +5913,23 @@ dependencies = [ [[package]] name = "quinn-udp" -version = "0.5.14" +version = "0.5.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "addec6a0dcad8a8d96a771f815f0eaf55f9d1805756410b39f5fa81332574cbd" +checksum = "35a133f956daabe89a61a685c2649f13d82d5aa4bd5d12d1277e1072a21c0694" dependencies = [ "cfg_aliases", "libc", "once_cell", "socket2", "tracing", - "windows-sys 0.60.2", + "windows-sys 0.59.0", ] [[package]] name = "quote" -version = "1.0.45" +version = "1.0.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924" +checksum = "1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001" dependencies = [ "proc-macro2", ] @@ -3098,45 +5947,48 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" [[package]] -name = "rand" -version = "0.8.6" +name = "radium" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ca0ecfa931c29007047d1bc58e623ab12e5590e8c7cc53200d5202b69266d8a" +checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" + +[[package]] +name = "rancor" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b534442d0fcdb55d66f373d9cac6d33b6293a2335bc2136dbd06ce0e87d2572" dependencies = [ - "libc", - "rand_chacha 0.3.1", - "rand_core 0.6.4", + "ptr_meta", ] [[package]] name = "rand" -version = "0.9.4" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44c5af06bb1b7d3216d91932aed5265164bf384dc89cd6ba05cf59a35f5f76ea" +checksum = "e058c7de0b26af77780c769414d6257830bb240f3c38477dbc2c16e5f54d6d4c" dependencies = [ - "rand_chacha 0.9.0", - "rand_core 0.9.5", + "rand_core 0.6.4", ] [[package]] name = "rand" -version = "0.10.1" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2e8e8bcc7961af1fdac401278c6a831614941f6164ee3bf4ce61b7edb162207" +checksum = "b9ef1d0d795eb7d84685bca4f72f3649f064e6641543d3a8c415898726a57b41" dependencies = [ - "chacha20", - "getrandom 0.4.2", - "rand_core 0.10.1", + "rand_chacha", + "rand_core 0.9.5", ] [[package]] -name = "rand_chacha" -version = "0.3.1" +name = "rand" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +checksum = "c7f5fa3a058cd35567ef9bfa5e75732bee0f9e4c55fa90477bef2dfcdbc4be80" dependencies = [ - "ppv-lite86", - "rand_core 0.6.4", + "chacha20", + "getrandom 0.4.3", + "rand_core 0.10.1", ] [[package]] @@ -3173,35 +6025,86 @@ version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "63b8176103e19a2643978565ca18b50549f6101881c443590420e4dc998a3c69" +[[package]] +name = "rand_distr" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a8615d50dcf34fa31f7ab52692afec947c4dd0ab803cc87cb3b0b4570ff7463" +dependencies = [ + "num-traits", + "rand 0.9.5", +] + +[[package]] +name = "rand_pcg" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "caa0f4137e1c0a72f4c651489402276c8e8e1cf081f3b0ba156d2cbeef09e86a" +dependencies = [ + "rand_core 0.10.1", +] + +[[package]] +name = "rand_xoshiro" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f703f4665700daf5512dcca5f43afa6af89f09db47fb56be587f80636bda2d41" +dependencies = [ + "rand_core 0.9.5", +] + +[[package]] +name = "random_word" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e47a395bdb55442b883c89062d6bcff25dc90fa5f8369af81e0ac6d49d78cf81" +dependencies = [ + "ahash", + "brotli", + "paste", + "rand 0.9.5", + "unicase", +] + +[[package]] +name = "rangemap" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a611d15b50743feb4c76b7d03edcb0e64f399c26961e4efe6975bc398be6aa3d" + [[package]] name = "ratatui" -version = "0.30.0" +version = "0.30.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1ce67fb8ba4446454d1c8dbaeda0557ff5e94d39d5e5ed7f10a65eb4c8266bc" +checksum = "3274ba0a2c5e1bcad2a2005d20f4dc59dad26b2eb0940fb094500dba4099d57d" dependencies = [ "instability", "ratatui-core", "ratatui-crossterm", "ratatui-macros", + "ratatui-termina", "ratatui-termwiz", "ratatui-widgets", + "serde", ] [[package]] name = "ratatui-core" -version = "0.1.0" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ef8dea09a92caaf73bff7adb70b76162e5937524058a7e5bff37869cbbec293" +checksum = "cbb175c433c8e28a809d1f5773a2ae96e68c0ce40db865cbab1020bf33ae479c" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.13.1", "compact_str", - "hashbrown 0.16.1", - "indoc", - "itertools", + "critical-section", + "hashbrown 0.17.1", + "itertools 0.14.0", "kasuari", - "lru 0.16.4", - "strum 0.27.2", - "thiserror 2.0.18", + "lru", + "palette", + "serde", + "strum 0.28.0", + "thiserror 2.0.20", "unicode-segmentation", "unicode-truncate", "unicode-width", @@ -3209,9 +6112,9 @@ dependencies = [ [[package]] name = "ratatui-crossterm" -version = "0.1.0" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "577c9b9f652b4c121fb25c6a391dd06406d3b092ba68827e6d2f09550edc54b3" +checksum = "567584a3b0e6a8203c23de40b4861497266725eb5363dbfd18a1edd603cca9f0" dependencies = [ "cfg-if", "crossterm", @@ -3221,19 +6124,30 @@ dependencies = [ [[package]] name = "ratatui-macros" -version = "0.7.0" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7f1342a13e83e4bb9d0b793d0ea762be633f9582048c892ae9041ef39c936f4" +checksum = "ed7dc68daa7498a43e4d68e0eb078427e10c38fbcfbb1e42d955f1fa2140d814" dependencies = [ "ratatui-core", "ratatui-widgets", ] [[package]] -name = "ratatui-termwiz" +name = "ratatui-termina" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f76fe0bd0ed4295f0321b1676732e2454024c15a35d01904ddb315afd3d545c" +checksum = "c0bf912d9e66f057a759d92e386a280ea886b352ab757d6ac4d653c7ed2c43c2" +dependencies = [ + "instability", + "ratatui-core", + "termina", +] + +[[package]] +name = "ratatui-termwiz" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "faf03e0380b7744054d6cb74224fe3adf062a029754933f575ca1e3b4c2ce977" dependencies = [ "ratatui-core", "termwiz", @@ -3241,9 +6155,9 @@ dependencies = [ [[package]] name = "ratatui-textarea" -version = "0.9.1" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2950274c0e155944158cf766848dd87bd6db6dad27da1c23ee4a7c8de71dbf1f" +checksum = "3c78d5ba0f26f97baed69a4c479f268a31c7b5b89d68ab939842152e383d6e73" dependencies = [ "ratatui-core", "ratatui-crossterm", @@ -3254,30 +6168,133 @@ dependencies = [ [[package]] name = "ratatui-widgets" -version = "0.3.0" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7dbfa023cd4e604c2553483820c5fe8aa9d71a42eea5aa77c6e7f35756612db" +checksum = "66e3d19bcc9130ca376277d93b60767ff121ace3be06f5f95f81dd68956407d1" dependencies = [ - "bitflags 2.11.1", - "hashbrown 0.16.1", + "bitflags 2.13.1", + "hashbrown 0.17.1", "indoc", "instability", - "itertools", + "itertools 0.14.0", "line-clipping", "ratatui-core", - "strum 0.27.2", + "serde", + "strum 0.28.0", "time", "unicode-segmentation", "unicode-width", ] +[[package]] +name = "rav1e" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43b6dd56e85d9483277cde964fd1bdb0428de4fec5ebba7540995639a21cb32b" +dependencies = [ + "aligned-vec", + "arbitrary", + "arg_enum_proc_macro", + "arrayvec", + "av-scenechange", + "av1-grain", + "bitstream-io", + "built", + "cfg-if", + "interpolate_name", + "itertools 0.14.0", + "libc", + "libfuzzer-sys", + "log", + "maybe-rayon", + "new_debug_unreachable", + "noop_proc_macro", + "num-derive", + "num-traits", + "paste", + "profiling", + "rand 0.9.5", + "rand_chacha", + "simd_helpers", + "thiserror 2.0.20", + "v_frame", + "wasm-bindgen", +] + +[[package]] +name = "ravif" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e52310197d971b0f5be7fe6b57530dcd27beb35c1b013f29d66c1ad73fbbcc45" +dependencies = [ + "avif-serialize", + "imgref", + "loop9", + "quick-error", + "rav1e", + "rayon", + "rgb", +] + +[[package]] +name = "raw-cpuid" +version = "11.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "498cd0dc59d73224351ee52a95fee0f1a617a2eae0e7d9d720cc622c73a54186" +dependencies = [ + "bitflags 2.13.1", +] + +[[package]] +name = "rawpointer" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60a357793950651c4ed0f3f52338f53b2f809f32d83a07f72909fa13e4c6c1e3" + +[[package]] +name = "rayon" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb39b166781f92d482534ef4b4b1b2568f42613b53e5b6c160e24cfbfa30926d" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-cond" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2964d0cf57a3e7a06e8183d14a8b527195c706b7983549cd5462d5aa3747438f" +dependencies = [ + "either", + "itertools 0.14.0", + "rayon", +] + +[[package]] +name = "rayon-core" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91" +dependencies = [ + "crossbeam-deque", + "crossbeam-utils", +] + +[[package]] +name = "reborrow" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03251193000f4bd3b042892be858ee50e8b3719f2b08e5833ac4353724632430" + [[package]] name = "redox_syscall" version = "0.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.13.1", ] [[package]] @@ -3288,34 +6305,34 @@ checksum = "a4e608c6638b9c18977b00b475ac1f28d14e84b27d8d42f70e0bf1e3dec127ac" dependencies = [ "getrandom 0.2.17", "libredox", - "thiserror 2.0.18", + "thiserror 2.0.20", ] [[package]] name = "ref-cast" -version = "1.0.25" +version = "1.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f354300ae66f76f1c85c5f84693f0ce81d747e2c3f21a45fef496d89c960bf7d" +checksum = "7e440fb4e4b4147295338efb76001ab9e4efc0e5839df2c47fc5ac2381d365c3" dependencies = [ "ref-cast-impl", ] [[package]] name = "ref-cast-impl" -version = "1.0.25" +version = "1.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da" +checksum = "92ecd8964f8453721699a1ed72037b0db49ce2f5a5138486ee89bed6f67cdf3a" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 3.0.5", ] [[package]] name = "regex" -version = "1.12.3" +version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e10754a14b9137dd7b1e3e5b0493cc9171fdd105e0ab477f51b72e7f3ac0e276" +checksum = "f020237b6c8eed93db2e2cb53c00c60a8e1bc73da7d073199a1180401450218d" dependencies = [ "aho-corasick", "memchr", @@ -3325,9 +6342,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.14" +version = "0.4.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f" +checksum = "ad8553b9b26413251cbf30e620595c7a41b3887f03da04579c0e6b0d6a06b4b2" dependencies = [ "aho-corasick", "memchr", @@ -3336,17 +6353,72 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.8.10" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4" + +[[package]] +name = "rend" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a" +checksum = "663ba70707f96e871406fe10d68128412e619b06d1d47cb91c3a4c6501176240" +dependencies = [ + "bytecheck", +] [[package]] name = "reqwest" -version = "0.13.3" +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-core", + "futures-util", + "h2", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-rustls", + "hyper-util", + "js-sys", + "log", + "mime", + "mime_guess", + "percent-encoding", + "pin-project-lite", + "quinn", + "rustls", + "rustls-native-certs", + "rustls-pki-types", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper", + "tokio", + "tokio-rustls", + "tokio-util", + "tower", + "tower-http", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "wasm-streams 0.4.2", + "web-sys", + "webpki-roots 1.0.9", +] + +[[package]] +name = "reqwest" +version = "0.13.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62e0021ea2c22aed41653bc7e1419abb2c97e038ff2c33d0e1309e49a97deec0" +checksum = "219c5811de6525e5416c7d5d53bb656d3afdbc6c5af816e0802bcfa42dbdc1c3" dependencies = [ - "base64", + "base64 0.22.1", "bytes", "encoding_rs", "futures-core", @@ -3380,29 +6452,62 @@ dependencies = [ "url", "wasm-bindgen", "wasm-bindgen-futures", - "wasm-streams", + "wasm-streams 0.5.0", "web-sys", ] [[package]] -name = "rfc6979" -version = "0.4.0" +name = "rgb" +version = "0.8.53" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47b34b781b31e5d73e9fbc8689c70551fd1ade9a19e3e28cfec8580a79290cc4" + +[[package]] +name = "rig" +version = "0.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b989f4060e5f3c1ea4b8b6999f6759949d820704286cc6976b7a688cc0133029" +dependencies = [ + "rig-agent", + "rig-core", + "rig-derive", + "rig-fastembed", + "rig-helixdb", + "rig-lancedb", + "rig-milvus", +] + +[[package]] +name = "rig-agent" +version = "0.42.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" +checksum = "b66477c0d0a786358d078e7e3541a73089dd9009100d6e2b3fe3b0d730e8550f" dependencies = [ - "hmac", - "subtle", + "async-stream", + "fastrand", + "futures", + "http", + "indexmap 2.14.2", + "rig-core", + "rig-derive", + "schemars 1.2.2", + "serde", + "serde_json", + "thiserror 2.0.20", + "tokio", + "tracing", + "tracing-futures", ] [[package]] name = "rig-core" -version = "0.37.0" +version = "0.42.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6bd308c89a90f89ce7cd6641a078c7d2a2c55fb5a4147fd48b5a0989c3430bd" +checksum = "432d83e0facf16749f91fe729cbffca84437e8062d2f4e92f4f12e903693922d" dependencies = [ "as-any", "async-stream", - "base64", + "base64 0.22.1", "bytes", "eventsource-stream", "fastrand", @@ -3410,17 +6515,18 @@ dependencies = [ "futures-timer", "glob", "http", + "indexmap 2.14.2", "mime", "mime_guess", - "nanoid", - "ordered-float 5.3.0", + "ordered-float 5.5.0", "pin-project-lite", - "reqwest", + "reqwest 0.13.4", "rig-derive", - "schemars", + "schemars 1.2.2", "serde", "serde_json", - "thiserror 2.0.18", + "sha2", + "thiserror 2.0.20", "tokio", "tokio-tungstenite", "tracing", @@ -3430,18 +6536,69 @@ dependencies = [ [[package]] name = "rig-derive" -version = "0.1.14" +version = "0.42.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ba9149c63403a49ddfd5d373860487e6feef0021bfe5329812d1c4e72ee207c" +checksum = "de0a33f1bac45f16e50146c248bcbbfaa44518c7252d274e972c7f4ad71aaba7" dependencies = [ - "convert_case", - "deluxe", - "indoc", - "proc-macro-crate 3.5.0", + "convert_case 0.11.0", + "proc-macro-crate", "proc-macro2", "quote", + "syn 2.0.119", +] + +[[package]] +name = "rig-fastembed" +version = "0.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1dff99f9bea13108bb14df5431b6fc0738beb87f1fe5ebfcf26ae9fe54a188d" +dependencies = [ + "fastembed", + "rig-core", + "schemars 1.2.2", + "serde", + "serde_json", + "tracing", +] + +[[package]] +name = "rig-helixdb" +version = "0.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5fa2b188a1e9e65d29c34738c97465f0822c57540d6d45fd4f04dad906c966a" +dependencies = [ + "reqwest 0.13.4", + "rig-core", + "serde", + "serde_json", + "thiserror 2.0.20", +] + +[[package]] +name = "rig-lancedb" +version = "0.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5fe3555202c5bd4e30948414c2e234fddd9260d4520046733fcf0d58718f3a1" +dependencies = [ + "arrow-array", + "futures", + "lancedb", + "rig-core", + "serde", + "serde_json", +] + +[[package]] +name = "rig-milvus" +version = "0.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af9c7b7ff7ed9c16da983a21f1e81f425c9805355427a92f4d2d97ba1fe2aa12" +dependencies = [ + "reqwest 0.13.4", + "rig-core", + "serde", "serde_json", - "syn 2.0.117", + "uuid", ] [[package]] @@ -3454,35 +6611,65 @@ dependencies = [ "cfg-if", "getrandom 0.2.17", "libc", - "untrusted", + "untrusted 0.9.0", "windows-sys 0.52.0", ] [[package]] -name = "rsa" -version = "0.9.10" +name = "rkyv" +version = "0.8.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8573f03f5883dcaebdfcf4725caa1ecb9c15b2ef50c43a07b816e06799bb12d" +checksum = "d9776093b7ca170454ab1406954f7b7d97a57c51dc6c0642957fb2ef25c2d399" dependencies = [ - "const-oid", - "digest", - "num-bigint-dig", - "num-integer", - "num-traits", - "pkcs1", - "pkcs8", - "rand_core 0.6.4", - "signature", - "spki", - "subtle", - "zeroize", + "bytecheck", + "bytes", + "hashbrown 0.17.1", + "indexmap 2.14.2", + "munge", + "ptr_meta", + "rancor", + "rend", + "rkyv_derive", + "tinyvec", + "uuid", +] + +[[package]] +name = "rkyv_derive" +version = "0.8.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c25ef604ac7dd839d44d64648952ea23c97866f124ff671b0ed2cf3ad9bb06e" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.5", +] + +[[package]] +name = "roaring" +version = "0.11.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18bd8a37d17a58532776dcdf6041ce64929adca78e8489d5cacbafe99229d3e1" +dependencies = [ + "bytemuck", + "byteorder", +] + +[[package]] +name = "rust-stemmers" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e46a2036019fdb888131db7a4c847a1063a7493f971ed94ea82c67eada63ca54" +dependencies = [ + "serde", + "serde_derive", ] [[package]] name = "rustc-hash" -version = "2.1.2" +version = "2.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94300abf3f1ae2e2b8ffb7b58043de3d399c73fa6f4b73826402a5c457614dbe" +checksum = "6b1e7f9a428571be2dc5bc0505c13fb6bf936822b894ec87abf8a08a4e51742d" [[package]] name = "rustc_version" @@ -3499,18 +6686,18 @@ version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.13.1", "errno", "libc", "linux-raw-sys", - "windows-sys 0.61.2", + "windows-sys 0.59.0", ] [[package]] name = "rustls" -version = "0.23.40" +version = "0.23.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef86cd5876211988985292b91c96a8f2d298df24e75989a43a3c73f2d4d8168b" +checksum = "0283386ce02abc0151e1761d08802dfe86c173b0b494af5cbc086574e453da06" dependencies = [ "aws-lc-rs", "log", @@ -3524,11 +6711,11 @@ dependencies = [ [[package]] name = "rustls-native-certs" -version = "0.8.3" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "612460d5f7bea540c490b2b6395d8e34a953e52b491accd6c86c8164c5932a63" +checksum = "dab5152771c58876a2146916e53e35057e1a4dfa2b9df0f0305b07f611fdea4d" dependencies = [ - "openssl-probe 0.2.1", + "openssl-probe", "rustls-pki-types", "schannel", "security-framework", @@ -3536,9 +6723,9 @@ dependencies = [ [[package]] name = "rustls-pki-types" -version = "1.14.1" +version = "1.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30a7197ae7eb376e574fe940d068c30fe0462554a3ddbe4eca7838e049c937a9" +checksum = "2f4925028c7eb5d1fcdaf196971378ed9d2c1c4efc7dc5d011256f76c99c0a96" dependencies = [ "web-time", "zeroize", @@ -3562,7 +6749,7 @@ dependencies = [ "security-framework", "security-framework-sys", "webpki-root-certs", - "windows-sys 0.61.2", + "windows-sys 0.59.0", ] [[package]] @@ -3573,21 +6760,21 @@ checksum = "f87165f0995f63a9fbeea62b64d10b4d9d8e78ec6d7d51fb2125fda7bb36788f" [[package]] name = "rustls-webpki" -version = "0.103.13" +version = "0.103.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61c429a8649f110dddef65e2a5ad240f747e85f7758a6bccc7e5777bd33f756e" +checksum = "f3c3cf1d8b1e7d4927e2d154c3fcb02979afb9939629c62cd9048d4f07b60ac2" dependencies = [ "aws-lc-rs", "ring", "rustls-pki-types", - "untrusted", + "untrusted 0.9.0", ] [[package]] name = "rustversion" -version = "1.0.22" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" +checksum = "cf54715a573b99ac80df0bc206da022bcd442c974952c7b9720069370852e21f" [[package]] name = "ryu" @@ -3615,9 +6802,21 @@ dependencies = [ [[package]] name = "schemars" -version = "1.2.1" +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.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2b42f36aa1cd011945615b92222f6bf73c599a102a300334cd7f8dbeec726cc" +checksum = "687274d293b6cdc6e73e0fee520bf2049650090d7164f87672d212a3c530cf4a" dependencies = [ "dyn-clone", "ref-cast", @@ -3628,35 +6827,27 @@ dependencies = [ [[package]] name = "schemars_derive" -version = "1.2.1" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d115b50f4aaeea07e79c1912f645c7513d81715d0420f8bc77a18c6260b307f" +checksum = "d98c67716b46af2f0b8cf752abc930f6f9aecfbf671ecfb531db8a31dbe4e2ba" dependencies = [ "proc-macro2", "quote", "serde_derive_internals", - "syn 2.0.117", + "syn 3.0.5", ] [[package]] -name = "scopeguard" -version = "1.2.0" +name = "scoped-tls" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" +checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" [[package]] -name = "sec1" -version = "0.7.3" +name = "scopeguard" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" -dependencies = [ - "base16ct", - "der", - "generic-array", - "pkcs8", - "subtle", - "zeroize", -] +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "secrecy" @@ -3673,7 +6864,7 @@ version = "3.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b7f4bc775c73d9a02cde8bf7b2ec4c9d12743edf609006c7facc23998404cd1d" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.13.1", "core-foundation 0.10.1", "core-foundation-sys", "libc", @@ -3700,11 +6891,23 @@ dependencies = [ "serde_core", ] +[[package]] +name = "send_wrapper" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd0b0ec5f1c1ca621c432a25813d8d60c88abe6d3e08a3eb9cf37d97a0fe3d73" + +[[package]] +name = "seq-macro" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bc711410fbe7399f390ca1c3b60ad0f53f80e95c5eb935e52268a0e2cd49acc" + [[package]] name = "serde" -version = "1.0.228" +version = "1.0.229" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +checksum = "4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba" dependencies = [ "serde_core", "serde_derive", @@ -3712,40 +6915,40 @@ dependencies = [ [[package]] name = "serde_core" -version = "1.0.228" +version = "1.0.229" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" +checksum = "67dca2c9c51e58a4791a4b1ed58308b39c64224d349a935ab5039aa360942a48" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.228" +version = "1.0.229" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" +checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 3.0.5", ] [[package]] name = "serde_derive_internals" -version = "0.29.1" +version = "0.30.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" +checksum = "f852137cce035d6a4df67ccce505ff6b3e9fd3a10e3e52b24dc71e650bb1a9bd" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 3.0.5", ] [[package]] name = "serde_json" -version = "1.0.149" +version = "1.0.151" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86" +checksum = "c841b55ecdae098c80dcae9cf767f6f8a0c2cdb3416bbef72181df4d0fe73f14" dependencies = [ "itoa", "memchr", @@ -3765,6 +6968,17 @@ dependencies = [ "serde_core", ] +[[package]] +name = "serde_repr" +version = "0.1.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d3b1629de253c70a0508c3899572da79ca359fdab27c7920ff00406df418906" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.5", +] + [[package]] name = "serde_spanned" version = "0.6.9" @@ -3795,13 +7009,59 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_with" +version = "3.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee78f1fbe43ac4a0e47aadb3dbd357b69eb0d3793e948624cd03dd2750ab1c0a" +dependencies = [ + "base64 0.22.1", + "bs58", + "chrono", + "hex", + "indexmap 1.9.3", + "indexmap 2.14.2", + "jiff", + "schemars 0.9.0", + "schemars 1.2.2", + "serde_core", + "serde_json", + "serde_with_macros", + "time", +] + +[[package]] +name = "serde_with_macros" +version = "3.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8705578779c2b6bd90d84d66eb2e206b708b1a4d7b9f17641b293545bf1c7e46" +dependencies = [ + "darling 0.23.0", + "proc-macro2", + "quote", + "syn 2.0.119", +] + [[package]] name = "serde_yaml" version = "0.9.34+deprecated" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47" dependencies = [ - "indexmap", + "indexmap 2.14.2", + "itoa", + "ryu", + "serde", + "unsafe-libyaml", +] + +[[package]] +name = "serde_yaml_ng" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b4db627b98b36d4203a7b458cf3573730f2bb591b28871d916dfa9efabfd41f" +dependencies = [ + "indexmap 2.14.2", "itoa", "ryu", "serde", @@ -3810,9 +7070,9 @@ dependencies = [ [[package]] name = "sha1" -version = "0.10.6" +version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +checksum = "a978451301f4db1d02937a4ab3ccce137717b81826e79b7d49ffe3244a13c3b8" dependencies = [ "cfg-if", "cpufeatures 0.2.17", @@ -3841,9 +7101,9 @@ dependencies = [ [[package]] name = "shlex" -version = "1.3.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" +checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba" [[package]] name = "signal-hook" @@ -3882,26 +7142,34 @@ version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" dependencies = [ - "digest", "rand_core 0.6.4", ] [[package]] name = "simd-adler32" -version = "0.3.9" +version = "0.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "703d5c7ef118737c72f1af64ad2f6f8c5e1921f818cdcb97b8fe6fc69bf66214" +checksum = "3a219298ac11a56ea9a6d2120044824d6f01aeb034955e7af7bc16858527deea" [[package]] name = "simd_cesu8" -version = "1.1.1" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94f90157bb87cddf702797c5dadfa0be7d266cdf49e22da2fcaa32eff75b2c33" +checksum = "11031e251abf8611c80f460e19dbdeb54a66db918e49c65a7065b46ac7aec520" dependencies = [ "rustc_version", "simdutf8", ] +[[package]] +name = "simd_helpers" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95890f873bec569a0362c235787f3aca6e1e887302ba4840839bcc6459c42da6" +dependencies = [ + "quote", +] + [[package]] name = "simdutf8" version = "0.1.5" @@ -3916,7 +7184,7 @@ checksum = "0d585997b0ac10be3c5ee635f1bab02d512760d14b7c468801ac8a01d9ae5f1d" dependencies = [ "num-bigint", "num-traits", - "thiserror 2.0.18", + "thiserror 2.0.20", "time", ] @@ -3934,15 +7202,15 @@ checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" [[package]] name = "smallvec" -version = "1.15.1" +version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" +checksum = "b9be42f50aa861c555654aa3a37f52f4b1074bacf4e48fe0ef7fa584e80f1f0f" [[package]] name = "smawk" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7c388c1b5e93756d0c740965c41e8822f866621d41acbdf6336a6a168f8840c" +checksum = "e8e2fb0f499abb4d162f2bedad68f5ef91a1682b5a03596ddb67efd37768d100" [[package]] name = "snafu" @@ -3950,7 +7218,16 @@ version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6e84b3f4eacbf3a1ce05eac6763b4d629d60cbc94d632e4092c54ade71f1e1a2" dependencies = [ - "snafu-derive", + "snafu-derive 0.8.9", +] + +[[package]] +name = "snafu" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e45cb604038abb7b926b679887b3226d8d0f23874b66623625a0454be425a4b7" +dependencies = [ + "snafu-derive 0.9.2", ] [[package]] @@ -3959,36 +7236,76 @@ version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c1c97747dbf44bb1ca44a561ece23508e99cb592e862f22222dcf42f51d1e451" dependencies = [ - "heck 0.5.0", + "heck", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "snafu-derive" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "287f59010008f0d7cf5e3b03196d666c1acc46c8d3e9cf34c28a1a7157601e72" +dependencies = [ + "heck", "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] name = "socket2" -version = "0.6.3" +version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a766e1110788c36f4fa1c2b71b387a7815aa65f88ce0229841826633d93723e" +checksum = "c3d1e2c7f27f8d4cb10542a02c49005dbd6e93095799d6f3be745fae9f8fedd4" dependencies = [ "libc", - "windows-sys 0.61.2", + "windows-sys 0.60.2", +] + +[[package]] +name = "socks" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0c3dbbd9ae980613c6dd8e28a9407b50509d3803b57624d5dfe8315218cd58b" +dependencies = [ + "byteorder", + "libc", + "winapi", +] + +[[package]] +name = "spm_precompiled" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5851699c4033c63636f7ea4cf7b7c1f1bf06d0cc03cfb42e711de5a5c46cf326" +dependencies = [ + "base64 0.13.1", + "nom 7.1.3", + "serde", + "unicode-segmentation", ] [[package]] -name = "spin" -version = "0.9.8" +name = "sqlparser" +version = "0.61.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" +checksum = "dbf5ea8d4d7c808e1af1cbabebca9a2abe603bcefc22294c5b95018d53200cb7" +dependencies = [ + "log", + "sqlparser_derive", +] [[package]] -name = "spki" -version = "0.7.3" +name = "sqlparser_derive" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" +checksum = "a6dd45d8fc1c79299bfbb7190e42ccbbdf6a5f52e4a6ad98d92357ea965bd289" dependencies = [ - "base64ct", - "der", + "proc-macro2", + "quote", + "syn 2.0.119", ] [[package]] @@ -4004,10 +7321,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" [[package]] -name = "strsim" -version = "0.10.0" +name = "std_prelude" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8207e78455ffdf55661170876f88daf85356e4edd54e0a3dbc79586ca1e50cbe" + +[[package]] +name = "stfu8" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" +checksum = "e51f1e89f093f99e7432c491c382b88a6860a5adbe6bf02574bf0a08efff1978" [[package]] name = "strsim" @@ -4017,11 +7340,11 @@ checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" [[package]] name = "strum" -version = "0.27.2" +version = "0.26.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af23d6f6c1a224baef9d3f61e287d2761385a5b88fdab4eb4c6f11aeb54c4bcf" +checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06" dependencies = [ - "strum_macros 0.27.2", + "strum_macros 0.26.4", ] [[package]] @@ -4029,17 +7352,21 @@ name = "strum" version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9628de9b8791db39ceda2b119bbe13134770b56c138ec1d3af810d045c04f9bd" +dependencies = [ + "strum_macros 0.28.0", +] [[package]] name = "strum_macros" -version = "0.27.2" +version = "0.26.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7695ce3845ea4b33927c055a39dc438a45b059f7c1b3d91d38d10355fb8cbca7" +checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be" dependencies = [ - "heck 0.5.0", + "heck", "proc-macro2", "quote", - "syn 2.0.117", + "rustversion", + "syn 2.0.119", ] [[package]] @@ -4048,10 +7375,10 @@ version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ab85eea0270ee17587ed4156089e10b9e6880ee688791d45a905f5b1ca36f664" dependencies = [ - "heck 0.5.0", + "heck", "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] @@ -4073,9 +7400,20 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.117" +version = "2.0.119" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "872831b642d1a07999a962a351ed35b955ea2cfc8f3862091e2a240a84f17297" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "3.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99" +checksum = "12df2e0110f65b775f769bb17ef989067a1d931b2eb822bd4346631eeada89f9" dependencies = [ "proc-macro2", "quote", @@ -4099,7 +7437,7 @@ checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] @@ -4116,7 +7454,7 @@ dependencies = [ "regex-syntax", "serde", "serde_derive", - "thiserror 2.0.18", + "thiserror 2.0.20", "walkdir", ] @@ -4126,7 +7464,7 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a13f3d0daba03132c0aa9767f98351b3488edc2c100cda2d2ec2b04f3d8d3c8b" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.13.1", "core-foundation 0.9.4", "system-configuration-sys", ] @@ -4141,6 +7479,18 @@ dependencies = [ "libc", ] +[[package]] +name = "tagptr" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b2093cf4c8eb1e67749a6762251bc9cd836b6fc171623bd0a9d324d37af2417" + +[[package]] +name = "tap" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" + [[package]] name = "tempfile" version = "3.27.0" @@ -4148,10 +7498,23 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd" dependencies = [ "fastrand", - "getrandom 0.4.2", + "getrandom 0.3.4", "once_cell", "rustix", - "windows-sys 0.61.2", + "windows-sys 0.59.0", +] + +[[package]] +name = "termina" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9048a889effe34a5cddee0af7f53285198b16dca3be510858d38dfdb3e62a04e" +dependencies = [ + "bitflags 2.13.1", + "parking_lot", + "rustix", + "signal-hook", + "windows-sys 0.60.2", ] [[package]] @@ -4161,9 +7524,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d4ea810f0692f9f51b382fff5893887bb4580f5fa246fde546e0b13e7fcee662" dependencies = [ "fnv", - "nom", - "phf", - "phf_codegen", + "nom 7.1.3", + "phf 0.11.3", + "phf_codegen 0.11.3", ] [[package]] @@ -4182,12 +7545,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4676b37242ccbd1aabf56edb093a4827dc49086c0ffd764a5705899e0f35f8f7" dependencies = [ "anyhow", - "base64", - "bitflags 2.11.1", + "base64 0.22.1", + "bitflags 2.13.1", "fancy-regex", "filedescriptor", "finl_unicode", - "fixedbitset", + "fixedbitset 0.4.2", "hex", "lazy_static", "libc", @@ -4199,7 +7562,7 @@ dependencies = [ "ordered-float 4.6.0", "pest", "pest_derive", - "phf", + "phf 0.11.3", "sha2", "signal-hook", "siphasher", @@ -4239,11 +7602,11 @@ dependencies = [ [[package]] name = "thiserror" -version = "2.0.18" +version = "2.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4" +checksum = "ec86235f5fcc2a73650310756d2ac5b138a5780bbbdfae3eeccec992c435ba4f" dependencies = [ - "thiserror-impl 2.0.18", + "thiserror-impl 2.0.20", ] [[package]] @@ -4254,25 +7617,34 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] name = "thiserror-impl" -version = "2.0.18" +version = "2.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" +checksum = "bc04cd3e1236dd4a98afca4569f2deb3f120e5422a4023be2cb683f8486292af" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 3.0.5", +] + +[[package]] +name = "thread-tree" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffbd370cb847953a25954d9f63e14824a36113f8c72eecf6eccef5dc4b45d630" +dependencies = [ + "crossbeam-channel", ] [[package]] name = "thread_local" -version = "1.1.9" +version = "1.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f60246a4944f24f6e018aa17cdeffb7818b76356965d03b07d6a9886e8962185" +checksum = "1ad99c4c6d32803332c548b1af0540b357b3f5fc0be8f6c6bfe8b2e6ae784070" dependencies = [ "cfg-if", ] @@ -4293,12 +7665,11 @@ dependencies = [ [[package]] name = "time" -version = "0.3.47" +version = "0.3.55" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "743bd48c283afc0388f9b8827b976905fb217ad9e647fae3a379a9283c4def2c" +checksum = "cdb87b95ec50ddfa440816d227a17b2ccbdda963a316a727fda0fc4334f7d134" dependencies = [ "deranged", - "itoa", "libc", "num-conv", "num_threads", @@ -4310,25 +7681,34 @@ dependencies = [ [[package]] name = "time-core" -version = "0.1.8" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7694e1cfe791f8d31026952abf09c69ca6f6fa4e1a1229e18988f06a04a12dca" +checksum = "9e1c906769ad99c88eaa54e728060edef082f8e358ff32030cb7c7d315e81109" [[package]] name = "time-macros" -version = "0.2.27" +version = "0.2.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e70e4c5a0e0a8a4823ad65dfe1a6930e4f4d756dcd9dd7939022b5e8c501215" +checksum = "7e689342a48d2ea927c87ea50cabf8594854bf940e9310208848d680d668ed85" dependencies = [ "num-conv", "time-core", ] +[[package]] +name = "tiny-keccak" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237" +dependencies = [ + "crunchy", +] + [[package]] name = "tinystr" -version = "0.8.3" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8323304221c2a851516f22236c5722a72eaa19749016521d6dff0824447d96d" +checksum = "b1e27c91459209c2986af3dcf603a5a74a4368754ce37414f59acc971167f643" dependencies = [ "displaydoc", "zerovec", @@ -4336,9 +7716,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.11.0" +version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e61e67053d25a4e82c844e8424039d9745781b3fc4f32b8d55ed50f5f667ef3" +checksum = "4cf0ded5c4e56918d8f8a339e1bb67d038d3bc6d144ac407904015ba2e4cde9b" dependencies = [ "tinyvec_macros", ] @@ -4349,11 +7729,44 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" +[[package]] +name = "tokenizers" +version = "0.21.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a620b996116a59e184c2fa2dfd8251ea34a36d0a514758c6f966386bd2e03476" +dependencies = [ + "ahash", + "aho-corasick", + "compact_str", + "dary_heap", + "derive_builder", + "esaxx-rs", + "getrandom 0.3.4", + "itertools 0.14.0", + "log", + "macro_rules_attribute", + "monostate", + "onig", + "paste", + "rand 0.9.5", + "rayon", + "rayon-cond", + "regex", + "regex-syntax", + "serde", + "serde_json", + "spm_precompiled", + "thiserror 2.0.20", + "unicode-normalization-alignments", + "unicode-segmentation", + "unicode_categories", +] + [[package]] name = "tokio" -version = "1.52.3" +version = "1.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fc7f01b389ac15039e4dc9531aa973a135d7a4135281b12d7c1bc79fd57fffe" +checksum = "202caea871b69668250d242070849eb495be178ed697a3e98aebce5bc81a0bed" dependencies = [ "bytes", "libc", @@ -4368,30 +7781,42 @@ dependencies = [ [[package]] name = "tokio-macros" -version = "2.7.0" +version = "2.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "385a6cb71ab9ab790c5fe8d67f1645e6c450a7ce006a33de03daa956cf70a496" +checksum = "78773a2a397f451582ce068015985c33193cf6dea8b74d2a639fe457b2f07b0e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 3.0.5", ] [[package]] name = "tokio-rustls" -version = "0.26.4" +version = "0.26.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" +checksum = "b0c85f2c3ef0b1cd58b36682f4b17aaa995f0e5db534d85692b4903abce21f67" dependencies = [ "rustls", "tokio", ] +[[package]] +name = "tokio-stream" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3d06f0b082ba57c26b79407372e57cf2a1e28124f78e9479fe80322cf53420b" +dependencies = [ + "futures-core", + "pin-project-lite", + "tokio", + "tokio-util", +] + [[package]] name = "tokio-tungstenite" -version = "0.23.1" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6989540ced10490aaf14e6bad2e3d33728a2813310a0c71d1574304c49631cd" +checksum = "8f72a05e828585856dacd553fba484c242c46e391fb0e58917c942ee9202915c" dependencies = [ "futures-util", "log", @@ -4405,14 +7830,15 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.18" +version = "0.7.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ae9cec805b01e8fc3fd2fe289f89149a9b66dd16786abd8b19cfa7b48cb0098" +checksum = "494815d09bf52b5548659851081238f0ca39ff638363907596da739561c62c52" dependencies = [ "bytes", "futures-core", "futures-sink", "futures-util", + "libc", "pin-project-lite", "tokio", ] @@ -4431,17 +7857,17 @@ dependencies = [ [[package]] name = "toml" -version = "1.1.2+spec-1.1.0" +version = "1.1.5+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81f3d15e84cbcd896376e6730314d59fb5a87f31e4b038454184435cd57defee" +checksum = "12c0ba9680044b4ce98d391a62094047eada0d64860b80166c39f4a6b5640785" dependencies = [ - "indexmap", + "indexmap 2.14.2", "serde_core", "serde_spanned 1.1.1", "toml_datetime 1.1.1+spec-1.1.0", "toml_parser", "toml_writer", - "winnow 1.0.3", + "winnow 1.0.4", ] [[package]] @@ -4462,24 +7888,13 @@ 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", - "toml_datetime 0.6.11", - "winnow 0.5.40", -] - [[package]] name = "toml_edit" version = "0.22.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" dependencies = [ - "indexmap", + "indexmap 2.14.2", "serde", "serde_spanned 0.6.9", "toml_datetime 0.6.11", @@ -4489,23 +7904,23 @@ dependencies = [ [[package]] name = "toml_edit" -version = "0.25.11+spec-1.1.0" +version = "0.25.13+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b59c4d22ed448339746c59b905d24568fcbb3ab65a500494f7b8c3e97739f2b" +checksum = "6975367e4d2ef766d86af01ffad14b622fecc8d4357a998fbc4deb6e9bacaf9b" dependencies = [ - "indexmap", + "indexmap 2.14.2", "toml_datetime 1.1.1+spec-1.1.0", "toml_parser", - "winnow 1.0.3", + "winnow 1.0.4", ] [[package]] name = "toml_parser" -version = "1.1.2+spec-1.1.0" +version = "1.1.3+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2abe9b86193656635d2411dc43050282ca48aa31c2451210f4202550afb7526" +checksum = "1d38ac1cf9b95face32296c0a3ede1fdc270627c9d9c02a7274dd6d960dc4d56" dependencies = [ - "winnow 1.0.3", + "winnow 1.0.4", ] [[package]] @@ -4516,9 +7931,9 @@ checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801" [[package]] name = "toml_writer" -version = "1.1.1+spec-1.1.0" +version = "1.1.2+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "756daf9b1013ebe47a8776667b466417e2d4c5679d441c26230efd9ef78692db" +checksum = "7d56353a2a665ad0f41a421187180aab746c8c325620617ad883a99a1cbe66d2" [[package]] name = "tower" @@ -4543,12 +7958,17 @@ version = "0.6.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4cfcf7e2740e6fc6d4d688b4ef00650406bb94adf4731e43c096c3a19fe40840" dependencies = [ - "bitflags 2.11.1", + "async-compression", + "bitflags 2.13.1", "bytes", + "futures-core", "futures-util", "http", "http-body", + "http-body-util", "pin-project-lite", + "tokio", + "tokio-util", "tower", "tower-layer", "tower-service", @@ -4588,7 +8008,7 @@ checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] @@ -4665,29 +8085,36 @@ checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" [[package]] name = "tungstenite" -version = "0.23.0" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e2e2ce1e47ed2994fd43b04c8f618008d4cabdd5ee34027cf14f9d918edd9c8" +checksum = "6c01152af293afb9c7c2a57e4b559c5620b421f6d133261c60dd2d0cdb38e6b8" dependencies = [ - "byteorder", "bytes", "data-encoding", "http", "httparse", "log", - "rand 0.8.6", + "rand 0.9.5", "rustls", "rustls-pki-types", "sha1", - "thiserror 1.0.69", - "utf-8", + "thiserror 2.0.20", +] + +[[package]] +name = "twox-hash" +version = "2.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5283634e518fe9e82c7b20520bb4bc209009fd16c82077c802f8111ecbb0117a" +dependencies = [ + "rand 0.10.2", ] [[package]] name = "typenum" -version = "1.20.0" +version = "1.20.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40ce102ab67701b8526c123c1bab5cbe42d7040ccfd0f64af1a385808d2f43de" +checksum = "b6f5e870be6c3b371b77fe0ee0bafb859fa4964b4404c27de1d380043c4dda20" [[package]] name = "ucd-trie" @@ -4701,6 +8128,12 @@ version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dbc4bc3a9f746d862c45cb89d705aa10f187bb96c76001afab07a0d35ce60142" +[[package]] +name = "unicode-blocks" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "328edfd6d0bb91a22e592bed3a3b54c7b1f5c92a517f5a7aca24a2caef10c363" + [[package]] name = "unicode-ident" version = "1.0.24" @@ -4713,11 +8146,29 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3b09c83c3c29d37506a3e260c08c03743a6bb66a9cd432c6934ab501a190571f" +[[package]] +name = "unicode-normalization" +version = "0.1.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5fd4f6878c9cb28d874b009da9e8d183b5abc80117c40bbd187a1fde336be6e8" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "unicode-normalization-alignments" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43f613e4fa046e69818dd287fdc4bc78175ff20331479dab6e1b0f98d57062de" +dependencies = [ + "smallvec", +] + [[package]] name = "unicode-segmentation" -version = "1.13.2" +version = "1.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9629274872b2bfaf8d66f5f15725007f635594914870f65218920345aa11aa8c" +checksum = "c6f5d3c3b1bf09027a88a6bc961fc00497d651009560b5463668dc81b0fa87a8" [[package]] name = "unicode-truncate" @@ -4725,7 +8176,7 @@ version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "16b380a1238663e5f8a691f9039c73e1cdae598a30e9855f541d29b08b53e9a5" dependencies = [ - "itertools", + "itertools 0.14.0", "unicode-segmentation", "unicode-width", ] @@ -4737,10 +8188,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254" [[package]] -name = "unicode-xid" -version = "0.2.6" +name = "unicode_categories" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" +checksum = "39ec24b3121d976906ece63c9daad25b85969647682eee313cb5779fdd69e14e" [[package]] name = "unit-prefix" @@ -4754,12 +8205,37 @@ version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "673aac59facbab8a9007c7f6108d11f63b603f7cabff99fabf650fea5c32b861" +[[package]] +name = "untrusted" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" + [[package]] name = "untrusted" version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" +[[package]] +name = "ureq" +version = "2.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02d1a66277ed75f640d608235660df48c8e3c19f3b4edb6a263315626cc3c01d" +dependencies = [ + "base64 0.22.1", + "flate2", + "log", + "once_cell", + "rustls", + "rustls-pki-types", + "serde", + "serde_json", + "socks", + "url", + "webpki-roots 0.26.11", +] + [[package]] name = "url" version = "2.5.8" @@ -4774,10 +8250,10 @@ dependencies = [ ] [[package]] -name = "utf-8" -version = "0.7.6" +name = "utf8-ranges" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" +checksum = "7fcfc827f90e53a02eaef5e535ee14266c1d569214c6aa70133a624d8a3164ba" [[package]] name = "utf8_iter" @@ -4793,17 +8269,28 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "uuid" -version = "1.23.1" +version = "1.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddd74a9687298c6858e9b88ec8935ec45d22e8fd5e6394fa1bd4e99a87789c76" +checksum = "b5772d71c9be8a8a6ac2117d949c5b224c1b72241bb611d9a3012edcf8af7812" dependencies = [ "atomic", - "getrandom 0.4.2", + "getrandom 0.4.3", "js-sys", "serde_core", "wasm-bindgen", ] +[[package]] +name = "v_frame" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "666b7727c8875d6ab5db9533418d7c764233ac9c0cff1d469aec8fa127597be2" +dependencies = [ + "aligned-vec", + "num-traits", + "wasm-bindgen", +] + [[package]] name = "valuable" version = "0.1.1" @@ -4858,27 +8345,18 @@ checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" [[package]] name = "wasip2" -version = "1.0.3+wasi-0.2.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20064672db26d7cdc89c7798c48a0fdfac8213434a1186e5ef29fd560ae223d6" -dependencies = [ - "wit-bindgen 0.57.1", -] - -[[package]] -name = "wasip3" -version = "0.4.0+wasi-0.3.0-rc-2026-01-06" +version = "1.0.4+wasi-0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5428f8bf88ea5ddc08faddef2ac4a67e390b88186c703ce6dbd955e1c145aca5" +checksum = "b67efb37e106e55ce722a510d6b5f9c17f083e5fc79afc2badeb12cc313d9487" dependencies = [ - "wit-bindgen 0.51.0", + "wit-bindgen", ] [[package]] name = "wasm-bindgen" -version = "0.2.121" +version = "0.2.128" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49ace1d07c165b0864824eee619580c4689389afa9dc9ed3a4c75040d82e6790" +checksum = "aecb87a33d3b0c5e3b7aa46336eaf486cffafbd281b195e4c8b80d50df2351bf" dependencies = [ "cfg-if", "once_cell", @@ -4889,9 +8367,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.71" +version = "0.4.78" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96492d0d3ffba25305a7dc88720d250b1401d7edca02cc3bcd50633b424673b8" +checksum = "6ef4c5d3d2cdf5c54f4231181768f5510842e350db025faf1f7163b1030ed928" dependencies = [ "js-sys", "wasm-bindgen", @@ -4899,9 +8377,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.121" +version = "0.2.128" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e68e6f4afd367a562002c05637acb8578ff2dea1943df76afb9e83d177c8578" +checksum = "a690d511e3c1a8b3a55e33511e3c2c00c78415cd23650f32b808627f5696b9ed" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -4909,46 +8387,37 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.121" +version = "0.2.128" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d95a9ec35c64b2a7cb35d3fead40c4238d0940c86d107136999567a4703259f2" +checksum = "411e4887f0071ef2d2164a9d5fdf2d20efbef78fccd3a78b0c10a1dc5295e48a" dependencies = [ "bumpalo", "proc-macro2", "quote", - "syn 2.0.117", + "syn 3.0.5", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.121" +version = "0.2.128" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4e0100b01e9f0d03189a92b96772a1fb998639d981193d7dbab487302513441" +checksum = "81941cd78d0c92026c33e5e01312845a4cb1e9af3407f9134b100dd03144103e" 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" +name = "wasm-streams" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb0e353e6a2fbdc176932bbaab493762eb1255a7900fe0fea1a2f96c296cc909" +checksum = "15053d8d85c7eccdbefef60f06769760a563c7f0a9d6902a13d35c7800b0ad65" dependencies = [ - "anyhow", - "indexmap", - "wasm-encoder", - "wasmparser", + "futures-util", + "js-sys", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", ] [[package]] @@ -4964,23 +8433,11 @@ dependencies = [ "web-sys", ] -[[package]] -name = "wasmparser" -version = "0.244.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe" -dependencies = [ - "bitflags 2.11.1", - "hashbrown 0.15.5", - "indexmap", - "semver", -] - [[package]] name = "web-sys" -version = "0.3.98" +version = "0.3.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b572dff8bcf38bad0fa19729c89bb5748b2b9b1d8be70cf90df697e3a8f32aa" +checksum = "9fbddc4a036f00ec4f18c83445bd3115cb306a91da554919a099d9222fe4a7f8" dependencies = [ "js-sys", "wasm-bindgen", @@ -4999,9 +8456,9 @@ dependencies = [ [[package]] name = "webpki-root-certs" -version = "1.0.7" +version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f31141ce3fc3e300ae89b78c0dd67f9708061d1d2eda54b8209346fd6be9a92c" +checksum = "b96554aa2acc8ccdb7e1c9a58a7a68dd5d13bccc69cd124cb09406db612a1c9b" dependencies = [ "rustls-pki-types", ] @@ -5012,14 +8469,14 @@ version = "0.26.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "521bc38abb08001b01866da9f51eb7c5d647a19260e00054a8c7fd5f9e57f7a9" dependencies = [ - "webpki-roots 1.0.7", + "webpki-roots 1.0.9", ] [[package]] name = "webpki-roots" -version = "1.0.7" +version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52f5ee44c96cf55f1b349600768e3ece3a8f26010c05265ab73f945bb1a2eb9d" +checksum = "7dcd9d09a39985f5344844e66b0c530a33843579125f23e21e9f0f220850f22a" dependencies = [ "rustls-pki-types", ] @@ -5073,7 +8530,7 @@ checksum = "5f2ab60e120fd6eaa68d9567f3226e876684639d22a4219b313ff69ec0ccd5ac" dependencies = [ "log", "ordered-float 4.6.0", - "strsim 0.11.1", + "strsim", "thiserror 1.0.69", "wezterm-dynamic-derive", ] @@ -5124,7 +8581,7 @@ version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" dependencies = [ - "windows-sys 0.61.2", + "windows-sys 0.59.0", ] [[package]] @@ -5154,7 +8611,7 @@ checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] @@ -5165,7 +8622,7 @@ checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] @@ -5212,6 +8669,15 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", +] + [[package]] name = "windows-sys" version = "0.60.2" @@ -5359,15 +8825,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" @@ -5379,22 +8836,13 @@ dependencies = [ [[package]] name = "winnow" -version = "1.0.3" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0592e1c9d151f854e6fd382574c3a0855250e1d9b2f99d9281c6e6391af352f1" +checksum = "23b97319f7b8343df12cc98938e5c3eb436064524c8d2b4e30a1d3a36eecdf81" dependencies = [ "memchr", ] -[[package]] -name = "wit-bindgen" -version = "0.51.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5" -dependencies = [ - "wit-bindgen-rust-macro", -] - [[package]] name = "wit-bindgen" version = "0.57.1" @@ -5402,90 +8850,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e" [[package]] -name = "wit-bindgen-core" -version = "0.51.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea61de684c3ea68cb082b7a88508a8b27fcc8b797d738bfc99a82facf1d752dc" -dependencies = [ - "anyhow", - "heck 0.5.0", - "wit-parser", -] - -[[package]] -name = "wit-bindgen-rust" -version = "0.51.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7c566e0f4b284dd6561c786d9cb0142da491f46a9fbed79ea69cdad5db17f21" -dependencies = [ - "anyhow", - "heck 0.5.0", - "indexmap", - "prettyplease", - "syn 2.0.117", - "wasm-metadata", - "wit-bindgen-core", - "wit-component", -] - -[[package]] -name = "wit-bindgen-rust-macro" -version = "0.51.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c0f9bfd77e6a48eccf51359e3ae77140a7f50b1e2ebfe62422d8afdaffab17a" -dependencies = [ - "anyhow", - "prettyplease", - "proc-macro2", - "quote", - "syn 2.0.117", - "wit-bindgen-core", - "wit-bindgen-rust", -] - -[[package]] -name = "wit-component" -version = "0.244.0" +name = "writeable" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2" -dependencies = [ - "anyhow", - "bitflags 2.11.1", - "indexmap", - "log", - "serde", - "serde_derive", - "serde_json", - "wasm-encoder", - "wasm-metadata", - "wasmparser", - "wit-parser", -] +checksum = "3ad82d2a33cdc9674dc7465672f271e096168fcdbe0f799d9e6db8c5892679dc" [[package]] -name = "wit-parser" -version = "0.244.0" +name = "wyz" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ecc8ac4bc1dc3381b7f59c34f00b67e18f910c2c0f50015669dde7def656a736" +checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" dependencies = [ - "anyhow", - "id-arena", - "indexmap", - "log", - "semver", - "serde", - "serde_derive", - "serde_json", - "unicode-xid", - "wasmparser", + "tap", ] -[[package]] -name = "writeable" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ffae5123b2d3fc086436f8834ae3ab053a283cfac8fe0a0b8eaae044768a4c4" - [[package]] name = "x11rb" version = "0.13.2" @@ -5503,11 +8881,23 @@ version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ea6fc2961e4ef194dcbfe56bb845534d0dc8098940c7e5c012a258bfec6701bd" +[[package]] +name = "xxhash-rust" +version = "0.8.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aee1b19627c7c60102ab80d3a9cbe18de90bfe03bfa6c3715447681f0e8c8af6" + +[[package]] +name = "y4m" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a5a4b21e1a62b67a2970e6831bc091d7b87e119e7f9791aef9702e3bef04448" + [[package]] name = "yoke" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abe8c5fda708d9ca3df187cae8bfb9ceda00dd96231bed36e445a1a48e66f9ca" +checksum = "709fe23a0424b6a435d82152b1bd3fdfb0833487d5fa90d05d42762a9891fef5" dependencies = [ "stable_deref_trait", "yoke-derive", @@ -5522,28 +8912,28 @@ checksum = "de844c262c8848816172cef550288e7dc6c7b7814b4ee56b3e1553f275f1858e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.119", "synstructure", ] [[package]] name = "zerocopy" -version = "0.8.48" +version = "0.8.56" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eed437bf9d6692032087e337407a86f04cd8d6a16a37199ed57949d415bd68e9" +checksum = "556764e583adb45a9f8d413c2a147fa7e8d821e48e12b14fd560b607998b75eb" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.48" +version = "0.8.56" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70e3cd084b1788766f53af483dd21f93881ff30d7320490ec3ef7526d203bad4" +checksum = "f2ab42fc20575779bd240faa45f94a74256f755c0fa9e89f0ede20d91d0cdfc1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] @@ -5563,35 +8953,35 @@ checksum = "11532158c46691caf0f2593ea8358fed6bbf68a0315e80aae9bd41fbade684a1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.119", "synstructure", ] [[package]] name = "zeroize" -version = "1.8.2" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" +checksum = "e13c156562582aa81c60cb29407084cdb54c4164760106ab78e6c5b0858cf64e" dependencies = [ "zeroize_derive", ] [[package]] name = "zeroize_derive" -version = "1.4.3" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85a5b4158499876c763cb03bc4e49185d3cccbabb15b33c627f7884f43db852e" +checksum = "3c50655cbb0fe3fc43170059e702f1ce5e19b84cec58dc87b037a09935c2f328" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] name = "zerotrie" -version = "0.2.4" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f9152d31db0792fa83f70fb2f83148effb5c1f5b8c7686c3459e361d9bc20bf" +checksum = "4ea269c3bd32f0a32c321907a2ae912ba6f4649bb0fc764a15627e99a7095a3f" dependencies = [ "displaydoc", "yoke", @@ -5600,9 +8990,9 @@ dependencies = [ [[package]] name = "zerovec" -version = "0.11.6" +version = "0.11.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90f911cbc359ab6af17377d242225f4d75119aec87ea711a880987b18cd7b239" +checksum = "bb0464e17806c1d976d5cba29399c7f08e516e279e2ba493f63123b5fca67dd8" dependencies = [ "yoke", "zerofrom", @@ -5611,26 +9001,69 @@ dependencies = [ [[package]] name = "zerovec-derive" -version = "0.11.3" +version = "0.11.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "625dc425cab0dca6dc3c3319506e6593dcb08a9f387ea3b284dbd52a92c40555" +checksum = "34df6fc39dbd26ddc9c10e6a2984476e13acce22e64e4487636ef494369225da" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 3.0.5", ] +[[package]] +name = "zlib-rs" +version = "0.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34b31d188d9d685a4f9c7b46d6e36631b07058d2cfe190267adce54dc230bf12" + [[package]] name = "zmij" -version = "1.0.21" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b" + +[[package]] +name = "zstd" +version = "0.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e91ee311a569c327171651566e07972200e76fcfe2242a4fa446149a3881c08a" +dependencies = [ + "zstd-safe", +] + +[[package]] +name = "zstd-safe" +version = "7.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64d80649ab6db9d9f6f9c80a40becd948eda4714a0a5ac8c4d157a32231c7882" +dependencies = [ + "zstd-sys", +] + +[[package]] +name = "zstd-sys" +version = "2.1.0+zstd.1.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" +checksum = "0ef0a8027ec3ee71300ab3bcbcd0393f434aa72b91ca6d635a39941deae8eea0" +dependencies = [ + "cc", + "pkg-config", +] [[package]] name = "zune-core" -version = "0.5.1" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d56377fd46368984a170bc5aac5567e52ca5da874caa60bea39fcbca78fb658b" + +[[package]] +name = "zune-inflate" +version = "0.2.54" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb8a0807f7c01457d0379ba880ba6322660448ddebc890ce29bb64da71fb40f9" +checksum = "73ab332fe2f6680068f3582b16a24f90ad7096d5d39b974d1c0aff0125116f02" +dependencies = [ + "simd-adler32", +] [[package]] name = "zune-jpeg" diff --git a/Cargo.toml b/Cargo.toml index 5da18f9..144e5e9 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -33,51 +33,51 @@ path = "src/main.rs" integration = [] [dependencies] -anyhow = "1.0.102" +anyhow = "1.0.104" arboard = "3.6" -async-trait = "0.1.89" -chrono = { version = "0.4.44", features = ["serde"] } -clap = { version = "4.6.1", features = ["derive", "cargo"] } +async-trait = "0.1.92" +chrono = { version = "0.4.45", features = ["serde"] } +clap = { version = "4.6.6", features = ["derive", "cargo"] } clap_complete = "4.6" colored = "3.1" crossterm = "0.29" -dirs = "6.0.0" -futures = "0.3.32" -git2 = "0.20.4" +dirs = "7.0.0" +futures = "0.3.34" +git2 = "0.21.0" ignore = "0.4" -indicatif = "0.18.4" +indicatif = "0.18.6" gh-token = "0.1.8" notify = "8.2" notify-debouncer-full = "0.7.0" -lru = "0.18.0" -octocrab = "0.49.9" +lru = "0.18.4" +octocrab = { version = "0.54.1", default-features = false, features = ["follow-redirect", "retry", "rustls", "timeout", "tracing", "default-client", "rustls-aws-lc-rs", "jwt-aws-lc-rs"] } parking_lot = "0.12.5" pulldown-cmark = "0.13" -rand = "0.10.1" -opaline = { version = "0.4.0", features = ["ratatui", "gradients", "global-state", "builtin-themes", "discovery", "cli"] } -ratatui = "0.30.0" -regex = "1.12" -reqwest = { version = "0.13.3", features = ["json"] } -rig = { package = "rig-core", version = "0.37.0", features = ["derive"] } +rand = "0.10.2" +opaline = { version = "0.4.2", features = ["ratatui", "gradients", "global-state", "builtin-themes", "discovery", "cli"] } +ratatui = "0.30.2" +regex = "1.13" +reqwest = { version = "0.13.4", features = ["json"] } +rig = { version = "0.42.0", features = ["derive"] } rustls = { version = "0.23", default-features = false, features = ["aws_lc_rs", "std"] } schemars = "1.2" -serde = { version = "1.0.228", features = ["derive"] } -serde_json = "1.0.149" +serde = { version = "1.0.229", features = ["derive"] } +serde_json = "1.0.151" strum = "0.28.0" strum_macros = "0.28.0" syntect = { version = "5.3", default-features = false, features = ["default-syntaxes", "default-themes", "regex-onig"] } tempfile = "3.27.0" textwrap = "0.16.2" -thiserror = "2.0.18" -tokio = { version = "1.52.1", features = ["full"] } +thiserror = "2.0.20" +tokio = { version = "1.53.1", features = ["full"] } tokio-util = { version = "0.7", default-features = false, features = ["rt"] } -toml = "1.1.2" +toml = "1.1.5" tracing = "0.1.44" tracing-subscriber = { version = "0.3.23", features = ["env-filter", "fmt", "time", "json", "chrono"] } -ratatui-textarea = "0.9.1" +ratatui-textarea = "0.9.2" unicode-width = "0.2" url = "2.5.8" -uuid = { version = "1.23.1", features = ["v4", "serde"] } +uuid = { version = "1.26.0", features = ["v4", "serde"] } [dev-dependencies] dotenvy = "0.15" @@ -167,7 +167,6 @@ redundant_else = { level = "warn", priority = 36 } semicolon_if_nothing_returned = { level = "warn", priority = 36 } cloned_instead_of_copied = { level = "warn", priority = 36 } flat_map_option = { level = "warn", priority = 36 } -from_iter_instead_of_collect = { level = "warn", priority = 36 } needless_pass_by_value = { level = "warn", priority = 36 } trivially_copy_pass_by_ref = { level = "warn", priority = 36 } if_not_else = { level = "warn", priority = 36 } diff --git a/action.yml b/action.yml index 08ce001..5566108 100644 --- a/action.yml +++ b/action.yml @@ -18,7 +18,7 @@ inputs: required: false default: "HEAD" provider: - description: "LLM provider (openai, anthropic, google)" + description: "LLM provider (openai, anthropic, google, openrouter, fireworks)" required: false default: "openai" model: @@ -231,6 +231,14 @@ runs: IRIS_PROVIDER="google" export GOOGLE_API_KEY="$ACTION_API_KEY" ;; + openrouter) + IRIS_PROVIDER="openrouter" + export OPENROUTER_API_KEY="$ACTION_API_KEY" + ;; + fireworks|fireworks.ai) + IRIS_PROVIDER="fireworks" + export FIREWORKS_API_KEY="$ACTION_API_KEY" + ;; *) echo "::error::Unsupported provider: $IRIS_PROVIDER_INPUT" exit 1 diff --git a/docs/.vitepress/theme/index.ts b/docs/.vitepress/theme/index.ts index e3de298..b945fd7 100644 --- a/docs/.vitepress/theme/index.ts +++ b/docs/.vitepress/theme/index.ts @@ -1,5 +1,5 @@ import DefaultTheme from 'vitepress/theme' -import type { Theme } from 'vitepress' +import { useRouter, type Theme } from 'vitepress' import './silkcircuit.css' declare global { @@ -11,6 +11,7 @@ declare global { export default { extends: DefaultTheme, setup() { + const router = useRouter() // Mermaid rendering with SilkCircuit theming if (typeof window !== 'undefined') { const isDarkMode = () => @@ -69,12 +70,12 @@ export default { }, }) - let mermaidLoadPromise: Promise | null = null + let mermaidLoadPromise: Promise< + (typeof import('mermaid'))['default'] + > | null = null const ensureMermaid = async () => { if (!mermaidLoadPromise) { - mermaidLoadPromise = import( - /* @vite-ignore */ 'mermaid/dist/mermaid.esm.mjs' - ).then((mod) => mod.default ?? mod) + mermaidLoadPromise = import('mermaid').then((mod) => mod.default) } return mermaidLoadPromise } @@ -98,7 +99,9 @@ export default { } // Handle pre elements with mermaid - const pres = Array.from(document.querySelectorAll('pre')) + const pres = Array.from( + document.querySelectorAll('pre') + ) for (const pre of pres) { const code = pre.querySelector('code') const isMermaid = @@ -120,11 +123,13 @@ export default { const resetExistingDiagrams = () => { let reset = 0 - const diagrams = document.querySelectorAll('.mermaid-diagram') + const diagrams = + document.querySelectorAll('.mermaid-diagram') diagrams.forEach((diagram) => { const source = diagram.dataset.mermaidSource if (!source) return diagram.textContent = source + delete diagram.dataset.processed reset++ }) return reset @@ -227,9 +232,7 @@ export default { } // Re-render after navigation - window.addEventListener('vitepress:after-route-changed', () => { - setTimeout(renderMermaid, 100) - }) + router.onAfterRouteChange = () => renderMermaid() } }, } satisfies Theme diff --git a/docs/architecture/agent.md b/docs/architecture/agent.md index def151e..670a088 100644 --- a/docs/architecture/agent.md +++ b/docs/architecture/agent.md @@ -1,6 +1,6 @@ # Iris Agent System -The Iris Agent is the core intelligence of Git-Iris, built on [rig-core 0.37](https://docs.rs/rig-core/0.37.0) (imported as `rig` via `package = "rig-core"` in `Cargo.toml`) for agentic workflows. +The Iris Agent is the core intelligence of Git-Iris, built on [Rig 0.42](https://docs.rs/rig/0.42.0) (the `rig` facade crate) for agentic workflows. **Source:** `src/agents/iris.rs` @@ -12,9 +12,9 @@ Git-Iris uses a **unified agent architecture** with capability switching: ```rust pub struct IrisAgent { - provider: String, // "openai", "anthropic", "google" + provider: String, // Provider registry name model: String, // Primary model for complex tasks - fast_model: Option, // Fast model for subagents + fast_model: Option, // Lightweight status model current_capability: Option, // Active capability provider_config: HashMap, preamble: Option, @@ -30,13 +30,16 @@ pub struct IrisAgent { - **Maintainability** — Fix a bug once, it's fixed everywhere - **Testability** — Test one agent with different prompts -### Stateless and Send-Safe +### Provider Construction -`IrisAgent` doesn't store any rig clients. Each call to `build_agent` constructs a fresh provider client through `provider::openai_builder`, `provider::anthropic_builder`, or `provider::gemini_builder`, then returns a `DynAgent` enum wrapping the provider-specific `Agent`. This design: +The provider module creates clients through one `agent_builder` entry point. Rig 0.42 erases the +completion model type inside its agent, so `DynAgent` wraps one shared agent type. OpenAI uses +Responses, OpenRouter uses its native adapter, and Fireworks uses an OpenAI-compatible Chat +Completions client. Anthropic and Gemini retain their native adapters. -- Reads API keys from environment (or config) at call time via `resolve_api_key` -- Allows the agent to be used across async boundaries (`tokio::spawn`) -- Makes the agent `Send + Sync` safe +API keys resolve from provider configuration, then the provider's environment variable. Service +entry points bind repository identity and execution trust for tool calls. Parallel workers carry +both values into spawned tasks; remote clones cannot run project build scripts through static analysis. ## Agent Lifecycle @@ -44,12 +47,12 @@ pub struct IrisAgent { ```rust // Direct creation -let agent = IrisAgent::new("anthropic", "claude-opus-4-6")?; +let agent = IrisAgent::new("anthropic", "claude-opus-5")?; // With builder let agent = IrisAgentBuilder::new() .with_provider("anthropic") - .with_model("claude-opus-4-6") + .with_model("claude-opus-5") .with_preamble("Custom instructions...") .build()?; ``` @@ -58,7 +61,7 @@ let agent = IrisAgentBuilder::new() Agents can be configured with: -- **Fast model** for subagents: `agent.set_fast_model("gpt-5.4-mini")` +- **Subagent model** for delegated analysis: set `providers..subagent_model` in the config - **Config** for gitmoji/presets: `agent.set_config(config)` - **Content update sender** for Studio chat mode: `agent.set_content_update_sender(sender)` @@ -86,42 +89,17 @@ agent.execute_task_streaming("review", prompt, |chunk, aggregated| { ## Tool Attachment -Tools are attached when the agent is built. `build_agent` returns a `DynAgent` enum and dispatches on the configured provider string: +The shared `build_agent` path creates a focused subagent and main agent using the selected +provider. It applies `CompletionProfile::Subagent` and `CompletionProfile::MainAgent` through +`apply_completion_params`, then attaches their tools. -```rust -fn build_agent(&self) -> Result { - let preamble = self.preamble.as_deref().unwrap_or(DEFAULT_PREAMBLE); - let fast_model = self.effective_fast_model(); - let api_key = self.get_api_key(); - let subagent_timeout = self.config.as_ref().map_or(120, |c| c.subagent_timeout_secs); - let subagent_max_turns = self.config.as_ref().map_or(20, |c| c.subagent_max_turns); - - // ... macros build subagent, attach main tools, optionally add update tools ... - - match self.provider.as_str() { - "openai" => { - let sub_agent = build_subagent!(provider::openai_builder(fast_model, api_key)?); - let builder = provider::openai_builder(&self.model, api_key)?.preamble(preamble); - let builder = self.apply_completion_params(builder, &self.model, 16384, CompletionProfile::MainAgent)?; - let builder = attach_main_tools!(builder).tool(sub_agent); - let agent = maybe_attach_update_tools!(builder); - Ok(DynAgent::OpenAI(agent)) - } - "anthropic" => { /* mirror of OpenAI arm using anthropic_builder */ } - "google" | "gemini" => { /* mirror using gemini_builder */ } - _ => Err(anyhow::anyhow!("Unsupported provider: {}", self.provider)), - } -} -``` +The main agent receives the core registry plus repository metadata, a persistent workspace, +`ParallelAnalyze`, and the focused subagent through Rig's `dynamic_tool` adapter. Studio chat adds +content-update tools when a sender is present. Subagents receive core tools without delegation. -Each arm: - -1. Builds a subagent with `attach_core_tools!` (no delegation tools). -2. Builds the main agent with `attach_core_tools!` plus `GitRepoInfo`, `Workspace`, and `ParallelAnalyze::with_limits` (configured with `subagent_timeout` and `subagent_max_turns`). -3. Conditionally attaches `UpdateCommitTool`, `UpdatePRTool`, and `UpdateReviewTool` when a `content_update_sender` is present (Studio chat mode). -4. Wraps the resulting `Agent` in the appropriate `DynAgent` variant. - -`apply_completion_params` keeps provider quirks out of the main builder flow. For OpenAI GPT-5 models, it injects the right completion-token parameter and a default reasoning profile (`medium` for the main agent unless the user explicitly overrides `reasoning`). For Anthropic, `anthropic_agent_builder` adds `.with_automatic_caching()` unconditionally so multi-turn tool loops bill prior turns at the cached rate. +Provider parameter mapping lives in `src/agents/provider.rs`. OpenAI gets Responses reasoning; +Opus gets adaptive thinking and effort; Gemini gets generation configuration. Anthropic's builder +enables automatic prompt caching. Explicit model choices and provider parameters remain configurable. ### Tool Registry Pattern @@ -159,7 +137,7 @@ The companion `CORE_TOOLS: &[&str]` constant in `src/agents/tools/registry.rs` l ## Multi-Turn Execution -Iris operates in **multi-turn mode**, allowing up to 50 tool calls. The non-streaming path calls `prompt_extended` on the `DynAgent`, which internally chains `max_turns(depth).extended_details()` for the active provider: +Iris operates in **multi-turn mode**, allowing up to 50 tool calls. The non-streaming path calls `prompt_extended` on `DynAgent`, which chains `max_turns(depth).extended_details()` on the shared agent: ```rust let prompt_response: PromptResponse = agent.prompt_extended(&full_prompt, 50).await?; @@ -343,78 +321,39 @@ fn inject_style_instructions(&self, system_prompt: &mut String, capability: &str ## Subagent Creation -The agent builds a **sub-agent** as a tool: - -```rust -let sub_agent_builder = client_builder - .agent(&self.provider, fast_model) - .name("analyze_subagent") - .description("Delegate focused analysis tasks to a sub-agent...") - .preamble("You are a specialized analysis sub-agent..."); -let sub_agent_builder = self.apply_completion_params( - sub_agent_builder, - fast_model, - 4_096, - CompletionProfile::Subagent, -)?; - -let sub_agent = attach_core_tools!(sub_agent_builder).build(); -``` - -**Key differences from main agent:** - -- Uses **fast model** for cost efficiency -- Has **core tools** (git, file read) but no delegation tools (no recursion) -- **Smaller token limit** (4096 vs 16384), applied through provider-aware completion params -- **Lower default reasoning** for OpenAI GPT-5 (`low`) so delegated analysis stays fast -- **Focused preamble** — "Complete the task, return concise summary" +Iris exposes a focused `analyze_subagent` tool and a `parallel_analyze` tool for independent tasks. +Both use `subagent_model` when configured, otherwise the primary model. The fast model is reserved +for status messages. -The sub-agent is attached as a **tool**, allowing Iris to delegate: +Subagents receive the core registry, a focused preamble, and 4,096 output tokens. They have no +further delegation tools. The primary agent receives 16,384 output tokens. Configured turn and +time budgets govern delegated tasks, and each worker retains the originating repository and trust. -``` -Iris: "analyze_subagent({ task: 'Review database migrations in db/' })" -Sub-Agent: [Calls git_diff, file_read, returns focused summary] -Iris: [Incorporates sub-agent findings into final output] -``` +Reasoning is selected by `CompletionProfile::Subagent`: low for Astra, Opus, and Gemini 3.8. +Fireworks DeepSeek V4 uses high because its API promotes low and medium to high. ## Provider-Specific Handling ### OpenAI Model Defaults -Git-Iris targets the GPT-5 family for OpenAI. Keep examples and docs aligned with the current defaults in `src/providers.rs` rather than older model aliases. +Git-Iris defaults to GPT-6 Astra for OpenAI analysis and GPT-5.6 Luna for status messages. Keep examples and docs aligned with the current defaults in `src/providers.rs` rather than older model aliases. ### Anthropic Prompt Caching -`anthropic_agent_builder` calls `.with_automatic_caching()` on every Anthropic completion model (`src/agents/provider.rs:194-204`). Rig places a top-level `cache_control` breakpoint on the last cacheable block, which the API advances as the conversation grows. On Iris's multi-turn tool loops, where every turn otherwise re-sends the whole transcript at full input price, cached turns are billed at a fraction of that cost. Caching is unconditional — prompts below the model's cacheable minimum are simply not cached by the API. Debug output surfaces both `cache_creation_input_tokens` and `cached_input_tokens` so you can confirm the cache is doing real work on your workload. +`anthropic_agent_builder` calls `.with_automatic_caching()` on every Anthropic completion model (`src/agents/provider.rs`). Rig places a top-level `cache_control` breakpoint on the last cacheable block, which the API advances as the conversation grows. On Iris's multi-turn tool loops, where every turn otherwise re-sends the whole transcript at full input price, cached turns are billed at a fraction of that cost. Caching is unconditional — prompts below the model's cacheable minimum are simply not cached by the API. Debug output surfaces both `cache_creation_input_tokens` and `cached_input_tokens` so you can confirm the cache is doing real work on your workload. ## Streaming Support -For real-time TUI updates, streaming dispatches per-provider through `build_openai_agent_for_streaming`, `build_anthropic_agent_for_streaming`, or `build_gemini_agent_for_streaming` — each returns a concrete `rig::agent::Agent` rather than a `DynAgent`, because rig's streaming types are model-specific. The aggregated text is then converted to the appropriate structured response by `text_to_structured_response`: +Streaming uses the same configured agent and tool registry as non-streaming generation: ```rust -let aggregated_text = match self.provider.as_str() { - "openai" => { - let agent = self.build_openai_agent_for_streaming(&full_prompt)?; - let stream = agent.stream_prompt(&full_prompt).multi_turn(50).await; - consume_stream!(stream) - } - "anthropic" => { /* build_anthropic_agent_for_streaming + stream_prompt */ } - "google" | "gemini" => { /* build_gemini_agent_for_streaming + stream_prompt */ } - _ => return Err(anyhow::anyhow!("Unsupported provider: {}", self.provider)), -}; - -let response = Self::text_to_structured_response(&output_type, aggregated_text); +let agent = self.build_agent()?; +let stream = agent.0.stream_prompt(&full_prompt).max_turns(50).await; ``` -The `consume_stream!` macro matches `MultiTurnStreamItem::StreamAssistantItem(StreamedAssistantContent::Text(...))` for text chunks and `StreamedAssistantContent::ToolCall { tool_call, .. }` for status updates. `text_to_structured_response` dispatches on the capability's declared output type: - -- `GeneratedMessage` — try JSON parse, fall back to `PlainText`. -- `Review` — wrap text in `Review::from_unstructured` so the streamed markdown is still surfaced when structured parsing fails. -- `MarkdownPullRequest`, `MarkdownChangelog`, `MarkdownReleaseNotes` — wrap the text directly. -- `SemanticBlame` — return as-is. -- anything else — `PlainText` fallback. - -**Note:** Streaming does not enforce a JSON schema in-flight. The structured response is reconstructed once the stream completes. +The consumer forwards text chunks and tool activity to Studio. The aggregated response is parsed +through `text_to_structured_response`, so the structured output contract stays consistent across +streaming and non-streaming tasks. ## Debug Instrumentation @@ -447,7 +386,7 @@ Test capability loading: ```rust #[test] fn loads_commit_capability() { - let agent = IrisAgent::new("openai", "gpt-5.4").unwrap(); + let agent = IrisAgent::new("openai", "gpt-6-astra").unwrap(); let (prompt, output_type) = agent.load_capability_config("commit").unwrap(); assert!(prompt.contains("Generate a commit message")); assert_eq!(output_type, "GeneratedMessage"); @@ -461,7 +400,7 @@ Test full execution with mocked tools: ```rust #[tokio::test] async fn generates_commit_message() { - let agent = IrisAgent::new("openai", "gpt-5.4").unwrap(); + let agent = IrisAgent::new("openai", "gpt-6-astra").unwrap(); let response = agent.execute_task("commit", "Generate message").await.unwrap(); match response { diff --git a/docs/architecture/index.md b/docs/architecture/index.md index f2cd133..d05ef98 100644 --- a/docs/architecture/index.md +++ b/docs/architecture/index.md @@ -1,6 +1,6 @@ # Architecture Overview -Git-Iris is built on an **agent-first architecture** where intelligent decisions are made by Iris, an LLM-driven agent powered by [rig-core 0.37](https://docs.rs/rig-core/0.37.0) (imported as `rig`). Rather than dumping context upfront, Iris dynamically explores codebases using tool calls, gathering precisely what she needs. +Git-Iris is built on an **agent-first architecture** where intelligent decisions are made by Iris, an LLM-driven agent powered by [Rig 0.42](https://docs.rs/rig/0.42.0). Rather than dumping context upfront, Iris dynamically explores codebases using tool calls, gathering precisely what she needs. ## Core Philosophy @@ -237,11 +237,11 @@ Each subagent: Git-Iris supports multiple LLM providers through rig's unified interface. There is no `DynClientBuilder`; instead `IrisAgent::build_agent` dispatches on the configured provider string and calls one of `provider::openai_builder`, `provider::anthropic_builder`, or `provider::gemini_builder`, returning a `DynAgent` enum that wraps the provider-specific `Agent`. -| Provider | Default Model | Fast Model | -| --------- | ---------------------- | --------------------------- | -| OpenAI | `gpt-5.4` | `gpt-5.4-mini` | -| Anthropic | `claude-opus-4-6` | `claude-haiku-4-5-20251001` | -| Google | `gemini-3-pro-preview` | `gemini-2.5-flash` | +| Provider | Default Model | Fast Model | +| --------- | ------------------ | --------------------------- | +| OpenAI | `gpt-6-astra` | `gpt-5.6-luna` | +| Anthropic | `claude-opus-5` | `claude-haiku-4-5-20251001` | +| Google | `gemini-3.8-flash` | `gemini-3.5-flash-lite` | Provider switching is transparent — the same capabilities and tools work across all backends. diff --git a/docs/architecture/tools.md b/docs/architecture/tools.md index 9fa1d00..8e07d30 100644 --- a/docs/architecture/tools.md +++ b/docs/architecture/tools.md @@ -831,7 +831,7 @@ Test tools within agent context: ```rust #[tokio::test] async fn agent_uses_git_diff() { - let agent = IrisAgent::new("openai", "gpt-5.4").unwrap(); + let agent = IrisAgent::new("openai", "gpt-6-astra").unwrap(); let response = agent.execute_task("commit", "Generate message").await.unwrap(); // Verify the agent called git_diff and produced output diff --git a/docs/configuration/index.md b/docs/configuration/index.md index c3821b7..105964d 100644 --- a/docs/configuration/index.md +++ b/docs/configuration/index.md @@ -21,8 +21,8 @@ git-iris config --provider anthropic --api-key YOUR_ANTHROPIC_API_KEY git-iris config --provider google --api-key YOUR_GOOGLE_API_KEY # Optionally override models for the selected provider -git-iris config --provider openai --model gpt-5.4 -git-iris config --provider openai --fast-model gpt-5.4-mini +git-iris config --provider openai --model gpt-6-astra +git-iris config --provider openai --fast-model gpt-5.6-luna # Enable gitmoji git-iris config --gitmoji @@ -78,18 +78,18 @@ default_provider = "openai" # Provider configurations [providers.openai] api_key = "sk-..." -model = "gpt-5.4" -fast_model = "gpt-5.4-mini" +model = "gpt-6-astra" +fast_model = "gpt-5.6-luna" [providers.anthropic] api_key = "sk-ant-..." -model = "claude-opus-4-6" +model = "claude-opus-5" fast_model = "claude-haiku-4-5-20251001" [providers.google] api_key = "AIza..." -model = "gemini-3-pro-preview" -fast_model = "gemini-2.5-flash" +model = "gemini-3.8-flash" +fast_model = "gemini-3.5-flash-lite" ``` ## Global Settings diff --git a/docs/configuration/models.md b/docs/configuration/models.md index 70e908c..cc7565f 100644 --- a/docs/configuration/models.md +++ b/docs/configuration/models.md @@ -1,236 +1,93 @@ # Model Selection -Git-Iris uses a dual-model strategy: **primary models** for complex analysis and **fast models** for simple tasks. +Iris uses separate models for generation, delegated analysis, and status messages. The primary +model handles commits, reviews, PRs, changelogs, release notes, and chat. Subagents use the primary +model unless you configure `subagent_model`. The fast model writes progress messages. -## Model Strategy +## Default Models and Effort -| Model Type | Used For | Examples | -| ----------- | ---------------------------------------------- | --------------------------------------------------------------- | -| **Primary** | Commit messages, code reviews, PR descriptions | `claude-opus-4-6`, `gpt-5.4`, `gemini-3-pro-preview` | -| **Fast** | Status updates, parsing, simple queries | `claude-haiku-4-5-20251001`, `gpt-5.4-mini`, `gemini-2.5-flash` | +| Provider | Primary model | Primary effort | Subagent effort | Status model | +| --------- | ------------------ | -------------- | --------------- | ------------------------------------------------ | +| OpenAI | `gpt-6-astra` | `medium` | `low` | `gpt-5.6-luna`, reasoning `none` | +| Anthropic | `claude-opus-5` | `high` | `low` | `claude-haiku-4-5-20251001`, no effort parameter | +| Google | `gemini-3.8-flash` | `medium` | `low` | `gemini-3.5-flash-lite` | -This dual-model approach optimizes for both quality and speed. +These defaults were checked against provider documentation in September 2026. Model availability +still depends on your account. Existing explicit model choices stay configured until you change them. +See [Providers](./providers) for OpenRouter and Fireworks configuration. -## Default Models by Provider - -### OpenAI - -```toml -[providers.openai] -model = "gpt-5.4" -fast_model = "gpt-5.4-mini" -``` - -| Model | Use Case | Context | Notes | -| -------------- | -------- | ------- | ------------------------- | -| `gpt-5.4` | Primary | 128K | Best for complex analysis | -| `gpt-5.4-mini` | Fast | 128K | Quick status updates | - -Git-Iris also applies workflow-specific GPT-5 reasoning defaults for OpenAI: - -- Main agent tasks use `medium` reasoning for commit/review/PR quality -- Subagents and `parallel_analyze` use `low` reasoning to stay fast but thoughtful -- Status messages use `none` reasoning to keep waiting text snappy - -If you want a different OpenAI reasoning level everywhere, set `additional_params.reasoning` for -that provider. - -### Anthropic - -```toml -[providers.anthropic] -model = "claude-opus-4-6" -fast_model = "claude-haiku-4-5-20251001" -``` - -| Model | Use Case | Context | Notes | -| --------------------------- | -------- | ------- | --------------------------- | -| `claude-opus-4-6` | Primary | 200K | Excellent for code analysis | -| `claude-haiku-4-5-20251001` | Fast | 200K | Fastest response times | - -### Google - -```toml -[providers.google] -model = "gemini-3-pro-preview" -fast_model = "gemini-2.5-flash" -``` - -| Model | Use Case | Context | Notes | -| ---------------------- | -------- | ------- | ---------------------- | -| `gemini-3-pro-preview` | Primary | 1M | Largest context window | -| `gemini-2.5-flash` | Fast | 1M | Good for large diffs | - -## Configuring Models - -### Via CLI +## Configure Each Role ```bash -# Set primary model -git-iris config --provider anthropic --model claude-opus-4-6 - -# Set fast model -git-iris config --provider anthropic --fast-model claude-haiku-4-5-20251001 -``` +# Primary analysis model +git-iris config --provider openai --model gpt-6-astra -### Via Config File +# Optional independent model for delegated analysis +git-iris config --provider openai --subagent-model gpt-5.6-terra -```toml -[providers.anthropic] -api_key = "sk-ant-..." -model = "claude-opus-4-6" -fast_model = "claude-haiku-4-5-20251001" +# Lightweight progress messages +git-iris config --provider openai --fast-model gpt-5.6-luna ``` -## When to Use Which Model - -### Primary Model Tasks - -- **Commit message generation** — Needs context understanding -- **Code reviews** — Requires deep analysis -- **PR descriptions** — Synthesizes multiple changes -- **Changelogs** — Categorizes and summarizes -- **Release notes** — Produces polished documentation - -### Fast Model Tasks - -- **Status updates** — "Analyzing file 3 of 15..." -- **Progress parsing** — Extracting structured data -- **Tool responses** — Simple confirmations -- **Chat queries** — Quick interactions - -## Model Selection Criteria - -### Choose Primary Model Based On - -| Priority | Consideration | Recommendation | -| ----------- | ---------------------------- | -------------------------------- | -| **Quality** | Need best analysis | Claude Opus 4.6 | -| **Context** | Large changesets (>50 files) | Gemini 3 Pro (1M tokens) | -| **Speed** | Fast turnaround | GPT-5.4-mini or Gemini 2.5 Flash | -| **Cost** | Budget constraints | Use fast models more | +The same fields work in the global provider configuration: -### Optimize Fast Model For - -- **Response time** — Haiku, GPT-5.4-mini, Gemini Flash -- **Context window** — All fast models support large context -- **Availability** — Check provider rate limits - -## Custom Model Configuration - -You can use any model supported by your provider: - -```bash -# OpenAI custom model -git-iris config --provider openai --model gpt-5.4 - -# Anthropic custom model -git-iris config --provider anthropic --model claude-haiku-4-5-20251001 - -# Google custom model -git-iris config --provider google --model gemini-2.5-flash +```toml +[providers.openai] +model = "gpt-6-astra" +subagent_model = "gpt-5.6-terra" +fast_model = "gpt-5.6-luna" ``` -## Model Fallback Behavior - -If a configured model is unavailable, Git-Iris will: - -1. Attempt to use the provider's default model -2. Report an error with the model name -3. Suggest checking provider documentation - -## Context Window Management +Leave `subagent_model` unset to use the primary model for delegated analysis. Changing `fast_model` +only changes status generation. Use lower effort or a different worker model after comparing review +findings and completion quality on representative repositories. -Git-Iris automatically manages context to fit within model limits: +## Reasoning Controls -| Scenario | Strategy | -| ------------------------------ | -------------------------- | -| Small changeset (<10 files) | Full context | -| Medium changeset (10-20 files) | Relevance scoring | -| Large changeset (20+ files) | Parallel subagent analysis | - -Override token limits per provider: +Iris chooses effort by task role. You can override provider parameters through `--param`: ```bash -git-iris config --provider anthropic --token-limit 150000 +git-iris config --provider openai --param reasoning='{"effort":"medium"}' +git-iris config --provider anthropic --param output_config='{"effort":"high"}' ``` -## Model Performance Tips +Explicit parameters apply to requests using that provider configuration. Check the selected model's +supported parameters before overriding defaults, especially when the status model differs from the +primary model. Anthropic Haiku does not support the effort parameter. -### For Large Repositories +Astra uses the Responses API for tool calling. Astra does not accept reasoning `none` or `minimal`, +and does not support sampling parameters such as `temperature` and `top_p`. +[OpenAI migration guidance](https://developers.openai.com/api/docs/guides/latest-model?model=gpt-6-astra) +explains the request requirements. -```toml -[providers.google] -model = "gemini-3-pro-preview" # 1M context window -``` +Opus 5 uses adaptive thinking and defaults to high effort. Haiku 4.5 remains the lightweight status +model. See [Anthropic's model overview](https://platform.claude.com/docs/en/models/overview). -### For Speed-Critical Workflows +Google's Gemini 3.8 Flash supports `low`, `medium`, and `high` thinking. The old +`gemini-3-pro-preview` endpoint was retired; update saved configurations that still name it. +See [Gemini 3.8 Flash](https://ai.google.dev/gemini-api/docs/models/gemini-3.8-flash) and +[Google's deprecation schedule](https://ai.google.dev/gemini-api/docs/deprecations). -```toml -[providers.anthropic] -model = "claude-haiku-4-5-20251001" # Fast even for primary tasks -fast_model = "claude-haiku-4-5-20251001" -``` +## Context and Output Budgets -### For Maximum Quality +A model's context window covers input and conversation history. Its output limit is a separate +constraint. A larger output budget does not make the input context window larger. -```toml -[providers.anthropic] -model = "claude-opus-4-6" # Best code understanding -``` +The primary Astra and Opus models have roughly one million tokens of context, as does Gemini 3.8 +Flash. Haiku's context is 200K. Tool calls still use targeted file excerpts and diff summaries to +keep evidence relevant. Those tools do not guarantee that every conversation fits its model's +context window. -## Monitoring Model Usage +## Availability and Diagnostics -Enable debug mode to see which model handles each task: +Choose an explicit model ID offered by your provider. Iris reports provider errors when a selected +model is unavailable; it does not silently switch the main task to a different model. ```bash git-iris gen --debug ``` -Output shows: - -- Model name -- Token usage -- Tool calls -- Response time - -## Cost Optimization - -### Minimize Costs - -```toml -# Use fast model for everything -[providers.openai] -model = "gpt-5.4-mini" -fast_model = "gpt-5.4-mini" -token_limit = 8000 # Lower limit -``` - -### Balance Quality and Cost - -```toml -# Standard setup -[providers.anthropic] -model = "claude-opus-4-6" # Quality for commits -fast_model = "claude-haiku-4-5-20251001" # Speed for status -``` - -## Troubleshooting - -| Issue | Solution | -| ----------------- | ---------------------------------------------------- | -| "Model not found" | Check provider documentation for available models | -| Slow responses | Switch to a faster model | -| Context exceeded | Reduce `token_limit` or use model with larger window | -| Poor quality | Use a more capable primary model | - -## Model Comparison Table - -| Model | Provider | Context | Speed | Quality | Cost | -| -------------------- | --------- | ------- | ------ | --------- | ------ | -| claude-opus-4-6 | Anthropic | 200K | Medium | Excellent | Medium | -| claude-haiku-4-5 | Anthropic | 200K | Fast | Good | Low | -| gpt-5.4 | OpenAI | 128K | Medium | Excellent | Medium | -| gpt-5.4-mini | OpenAI | 128K | Fast | Good | Low | -| gemini-3-pro-preview | Google | 1M | Slow | Excellent | High | -| gemini-2.5-flash | Google | 1M | Fast | Good | Low | +Debug output shows agent activity and token usage. If a request exceeds context, narrow the requested +comparison or choose a model with sufficient context. Iris currently requests 16,384 output tokens for main tasks and 4,096 for subagents; +`token_limit` is context metadata and does not change those budgets. Authentication errors require checking the active +provider's key, independently of model selection. diff --git a/docs/configuration/project-config.md b/docs/configuration/project-config.md index f46f101..380b1c8 100644 --- a/docs/configuration/project-config.md +++ b/docs/configuration/project-config.md @@ -27,7 +27,7 @@ This prevents credential leakage when committing `.irisconfig` to version contro ```bash # From repository root git-iris project-config --provider anthropic -git-iris project-config --model claude-opus-4-6 +git-iris project-config --model claude-opus-5 git-iris project-config --preset conventional ``` @@ -57,7 +57,8 @@ Focus on business impact over implementation details. # Provider configurations (no API keys) [providers.anthropic] -model = "claude-opus-4-6" +model = "claude-opus-5" +subagent_model = "claude-opus-5" fast_model = "claude-haiku-4-5-20251001" token_limit = 150000 ``` @@ -82,7 +83,7 @@ use_gitmoji = false [providers.openai] api_key = "sk-..." -model = "gpt-5.4" +model = "gpt-6-astra" ``` **Project config:** @@ -93,7 +94,7 @@ use_gitmoji = true instruction_preset = "conventional" [providers.anthropic] -model = "claude-opus-4-6" +model = "claude-opus-5" ``` **Effective config:** @@ -110,7 +111,7 @@ api_key = "sk-..." # From project config [providers.anthropic] -model = "claude-opus-4-6" +model = "claude-opus-5" # API key loaded from personal config or ANTHROPIC_API_KEY env var ``` @@ -201,7 +202,7 @@ git-iris project-config --print git-iris project-config --provider google # Change model -git-iris project-config --model gemini-3-pro-preview +git-iris project-config --model gemini-3.8-flash # Update token limit git-iris project-config --token-limit 100000 @@ -252,7 +253,7 @@ Project-specific PR description guidelines here. """ [providers.anthropic] -model = "claude-opus-4-6" +model = "claude-opus-5" fast_model = "claude-haiku-4-5-20251001" # API keys NOT included - loaded from personal config @@ -372,7 +373,7 @@ Include: """ [providers.anthropic] -model = "claude-opus-4-6" +model = "claude-opus-5" token_limit = 150000 ``` diff --git a/docs/configuration/providers.md b/docs/configuration/providers.md index 74ff8d8..13b1115 100644 --- a/docs/configuration/providers.md +++ b/docs/configuration/providers.md @@ -1,14 +1,17 @@ # LLM Providers -Git-Iris supports three LLM providers: OpenAI, Anthropic, and Google. +Git-Iris supports OpenAI, Anthropic, Google, OpenRouter, and Fireworks. ## Provider Overview -| Provider | Default Model | Fast Model | Context Window | API Key Env | -| ------------- | ---------------------- | --------------------------- | -------------- | ------------------- | -| **OpenAI** | `gpt-5.4` | `gpt-5.4-mini` | 128K | `OPENAI_API_KEY` | -| **Anthropic** | `claude-opus-4-6` | `claude-haiku-4-5-20251001` | 200K | `ANTHROPIC_API_KEY` | -| **Google** | `gemini-3-pro-preview` | `gemini-2.5-flash` | 1M | `GOOGLE_API_KEY` | +| Provider | Default Model | Fast Model | Context Window | API Key Env | +| ------------- | ------------------ | --------------------------- | -------------- | ------------------- | +| **OpenAI** | `gpt-6-astra` | `gpt-5.6-luna` | 1.05M | `OPENAI_API_KEY` | +| **Anthropic** | `claude-opus-5` | `claude-haiku-4-5-20251001` | 1M | `ANTHROPIC_API_KEY` | +| **Google** | `gemini-3.8-flash` | `gemini-3.5-flash-lite` | 1M | `GOOGLE_API_KEY` | + +OpenRouter defaults to `anthropic/claude-opus-5` and uses `OPENROUTER_API_KEY`. Fireworks defaults +to `accounts/fireworks/models/deepseek-v4-pro-0813` and uses `FIREWORKS_API_KEY`. ## Configuration Format @@ -19,7 +22,8 @@ Each provider has its own section under `[providers]`: api_key = "YOUR_API_KEY" model = "model-name" # Optional: primary model fast_model = "fast-model-name" # Optional: for status updates -token_limit = 8000 # Optional: custom limit +subagent_model = "worker-model-name" # Optional: defaults to the primary model +token_limit = 1050000 # Optional: context-window metadata ``` ## OpenAI Configuration @@ -27,16 +31,15 @@ token_limit = 8000 # Optional: custom limit ```toml [providers.openai] api_key = "sk-..." -model = "gpt-5.4" -fast_model = "gpt-5.4-mini" -token_limit = 128000 +model = "gpt-6-astra" +fast_model = "gpt-5.6-luna" ``` ### CLI Setup ```bash git-iris config --provider openai --api-key YOUR_API_KEY -git-iris config --provider openai --model gpt-5.4 +git-iris config --provider openai --model gpt-6-astra ``` ### Environment Variable @@ -50,16 +53,15 @@ export OPENAI_API_KEY="sk-..." ```toml [providers.anthropic] api_key = "sk-ant-..." -model = "claude-opus-4-6" +model = "claude-opus-5" fast_model = "claude-haiku-4-5-20251001" -token_limit = 200000 ``` ### CLI Setup ```bash git-iris config --provider anthropic --api-key YOUR_API_KEY -git-iris config --provider anthropic --model claude-opus-4-6 +git-iris config --provider anthropic --model claude-opus-5 ``` ### Environment Variable @@ -77,16 +79,15 @@ The provider names `claude` and `gemini` are still supported as aliases for `ant ```toml [providers.google] api_key = "your-google-api-key" -model = "gemini-3-pro-preview" -fast_model = "gemini-2.5-flash" -token_limit = 1000000 +model = "gemini-3.8-flash" +fast_model = "gemini-3.5-flash-lite" ``` ### CLI Setup ```bash git-iris config --provider google --api-key YOUR_API_KEY -git-iris config --provider google --model gemini-3-pro-preview +git-iris config --provider google --model gemini-3.8-flash ``` ### Environment Variable @@ -95,6 +96,46 @@ git-iris config --provider google --model gemini-3-pro-preview export GOOGLE_API_KEY="..." ``` +## OpenRouter Configuration + +OpenRouter routes requests to hosted models using its own model IDs and API key. Iris uses the +native OpenRouter integration to retain reasoning details across tool calls. + +```bash +export OPENROUTER_API_KEY="sk-or-..." +git-iris config --provider openrouter --model anthropic/claude-opus-5 +``` + +```toml +[providers.openrouter] +model = "anthropic/claude-opus-5" +fast_model = "anthropic/claude-haiku-4.5" +``` + +The Opus default uses high effort for main tasks and low effort for subagents. Use model IDs from +[OpenRouter's catalog](https://openrouter.ai/models) and choose models with tool-calling support. + +## Fireworks Configuration + +Fireworks uses its OpenAI-compatible Chat Completions endpoint. Model IDs include the account path. + +```bash +export FIREWORKS_API_KEY="..." +git-iris config --provider fireworks --model accounts/fireworks/models/deepseek-v4-pro-0813 +``` + +```toml +[providers.fireworks] +model = "accounts/fireworks/models/deepseek-v4-pro-0813" +fast_model = "accounts/fireworks/models/deepseek-v4-flash-0731" +``` + +For the default DeepSeek V4 models, Iris uses high effort for analysis and disables thinking for +status messages. Fireworks promotes low and medium effort to high for this model family. Custom +models retain their provider defaults unless you supply parameters. +See [Fireworks' model guide](https://docs.fireworks.ai/guides/recommended-models) for serverless +availability and supported features. An account-specific deployment can use its own model ID. + ## Switching Providers ### Set Default Provider @@ -120,14 +161,14 @@ git-iris config --provider openai --param text='{"verbosity":"low"}' ``` Git-Iris parses valid JSON values here, so nested provider options work without extra config -files. For OpenAI reasoning models, use `--token-limit` to control output-token budgets; Git-Iris -maps that to the provider's current completion-token setting automatically. +files. The `--token-limit` setting records context-window metadata; it does not change output +budgets. Iris currently requests 16,384 output tokens for main tasks and 4,096 for subagents. -OpenAI GPT-5 defaults are already tuned by workflow: +OpenAI defaults use the Responses API and choose reasoning by workflow: - Main agent generations use `reasoning = {"effort":"medium"}` - Subagents and `parallel_analyze` use `reasoning = {"effort":"low"}` -- Fast status messages use `reasoning = {"effort":"none"}` +- Fast status messages use Luna with `reasoning = {"effort":"none"}` Set `reasoning` yourself only when you want to override those defaults for every OpenAI request using that provider config. @@ -145,17 +186,8 @@ api_key = "sk-..." ## Token Limits -Each provider has a default context window. You can override this: - -```bash -git-iris config --provider anthropic --token-limit 100000 -``` - -This is useful for: - -- Cost control (smaller limit = fewer tokens) -- Faster responses -- Testing with limited context +The model context window and output-token budget are separate limits. See +[Model Selection](./models) for role defaults and context guidance. ## API Key Priority diff --git a/docs/extending/contributing.md b/docs/extending/contributing.md index ab481cb..39db946 100644 --- a/docs/extending/contributing.md +++ b/docs/extending/contributing.md @@ -173,13 +173,12 @@ let content = fs::read_to_string(&path) **Clear tool descriptions:** ```rust -async fn definition(&self, _: String) -> ToolDefinition { - ToolDefinition { - name: "my_tool".to_string(), - // Good - actionable, specific - description: "Analyze project dependencies from package manifests (Cargo.toml, package.json, requirements.txt)".to_string(), - parameters: parameters_schema::(), - } +fn description(&self) -> String { + "Analyze project dependencies from package manifests (Cargo.toml, package.json, requirements.txt)".to_string() +} + +fn parameters(&self) -> serde_json::Value { + parameters_schema::() } ``` @@ -300,7 +299,7 @@ Example test file at `src/agents/tools/tests/dependency_analyzer_tests.rs`: ```rust use std::path::PathBuf; -use rig::tool::Tool; +use rig::tool::portable::PortableTool; use crate::agents::tools::dependency_analyzer::{ DependencyAnalyzer, DependencyAnalyzerArgs, detect_manifest_type, @@ -360,7 +359,7 @@ async fn test_commit_generation_flow() -> anyhow::Result<()> { let service = IrisAgentService::new( test_config(), "anthropic".to_string(), - "claude-opus-4-6".to_string(), + "claude-opus-5".to_string(), "claude-haiku-4-5-20251001".to_string(), ); diff --git a/docs/extending/tools.md b/docs/extending/tools.md index ac51075..d4d020c 100644 --- a/docs/extending/tools.md +++ b/docs/extending/tools.md @@ -18,20 +18,23 @@ A tool is a Rust struct that implements the `rig::tool::Tool` trait. When Iris n ## Tool Trait Requirements -Every tool must implement: +Repository tools implement Rig 0.42's `PortableTool`; Rig adapts it to the runtime tool interface: ```rust -use rig::tool::Tool; -use rig::completion::ToolDefinition; +use rig::tool::portable::PortableTool; -impl Tool for MyTool { +impl PortableTool for MyTool { const NAME: &'static str = "my_tool"; type Error = MyToolError; type Args = MyToolArgs; type Output = String; - async fn definition(&self, _prompt: String) -> ToolDefinition { - // Return tool metadata for LLM + fn description(&self) -> String { + "Describe what the tool does".to_string() + } + + fn parameters(&self) -> serde_json::Value { + parameters_schema::() } async fn call(&self, args: Self::Args) -> Result { @@ -58,8 +61,7 @@ Create `src/agents/tools/dependency_analyzer.rs`: //! Analyzes project dependencies from package manifests. use anyhow::Result; -use rig::completion::ToolDefinition; -use rig::tool::Tool; +use rig::tool::portable::PortableTool; use serde::{Deserialize, Serialize}; use std::path::PathBuf; @@ -83,23 +85,23 @@ pub struct DependencyAnalyzerArgs { pub include_dev: bool, } -impl Tool for DependencyAnalyzer { +impl PortableTool for DependencyAnalyzer { const NAME: &'static str = "dependency_analyzer"; type Error = DependencyAnalyzerError; type Args = DependencyAnalyzerArgs; type Output = String; - async fn definition(&self, _: String) -> ToolDefinition { - ToolDefinition { - name: "dependency_analyzer".to_string(), - description: "Analyze project dependencies from package manifests (Cargo.toml, package.json, requirements.txt)".to_string(), - parameters: parameters_schema::(), - } + fn description(&self) -> String { + "Analyze project dependencies from package manifests (Cargo.toml, package.json, requirements.txt)".to_string() + } + + fn parameters(&self) -> serde_json::Value { + parameters_schema::() } async fn call(&self, args: Self::Args) -> Result { // Get current working directory - let repo_path = std::env::current_dir() + let repo_path = super::common::current_repo_root() .map_err(|e| DependencyAnalyzerError(format!("Failed to get CWD: {}", e)))?; // Detect manifest type if not specified @@ -339,7 +341,7 @@ pub struct SimpleQueryArgs { pub query: String, } -impl Tool for SimpleQueryTool { +impl PortableTool for SimpleQueryTool { const NAME: &'static str = "simple_query"; type Error = SimpleQueryError; type Args = SimpleQueryArgs; @@ -376,7 +378,7 @@ impl StatefulTool { } } -impl Tool for StatefulTool { +impl PortableTool for StatefulTool { // ... implementation uses self.state } ``` @@ -391,7 +393,7 @@ Accesses Git repository data: use crate::git::GitRepo; use super::common::get_current_repo; -impl Tool for GitAwareTool { +impl PortableTool for GitAwareTool { async fn call(&self, args: Self::Args) -> Result { let repo = get_current_repo().map_err(GitAwareError::from)?; @@ -415,7 +417,7 @@ Reads files and analyzes content: use std::fs; use std::path::PathBuf; -impl Tool for FileSystemTool { +impl PortableTool for FileSystemTool { async fn call(&self, args: Self::Args) -> Result { let path = PathBuf::from(&args.file_path); @@ -437,13 +439,11 @@ impl Tool for FileSystemTool { ### 1. Clear Tool Descriptions -The `description` field in `ToolDefinition` is what Iris sees. Make it actionable: +The `description()` method supplies the text Iris sees. Make it actionable: ```rust -ToolDefinition { - name: "dependency_analyzer".to_string(), - description: "Analyze project dependencies from package manifests. Auto-detects Cargo.toml, package.json, or requirements.txt. Use include_dev=true for dev dependencies.".to_string(), - parameters: parameters_schema::(), +fn description(&self) -> String { + "Analyze project dependencies from package manifests. Auto-detects Cargo.toml, package.json, or requirements.txt. Use include_dev=true for dev dependencies.".to_string() } ``` @@ -515,7 +515,7 @@ pub struct CachedTool { cache: Arc>>, } -impl Tool for CachedTool { +impl PortableTool for CachedTool { async fn call(&self, args: Self::Args) -> Result { let mut cache = self.cache.lock().unwrap(); @@ -551,7 +551,7 @@ To add tests for `dependency_analyzer`: 1. Create `src/agents/tools/tests/dependency_analyzer_tests.rs`: ```rust - use rig::tool::Tool; + use rig::tool::portable::PortableTool; use crate::agents::tools::dependency_analyzer::{ DependencyAnalyzer, DependencyAnalyzerArgs, diff --git a/docs/getting-started/configuration.md b/docs/getting-started/configuration.md index 67c5635..ffe2467 100644 --- a/docs/getting-started/configuration.md +++ b/docs/getting-started/configuration.md @@ -52,13 +52,14 @@ This displays your active provider, model, presets, and all configured providers ## Provider Details -Git-Iris supports three LLM providers with different strengths: +Git-Iris supports five providers. Direct-provider defaults are listed below; see +[Providers](../configuration/providers) for OpenRouter and Fireworks setup. -| Provider | Default Model | Fast Model | Context Window | Best For | -| ------------- | -------------------- | ------------------------- | -------------- | --------------------------------- | -| **openai** | gpt-5.4 | gpt-5.4-mini | 128K | General purpose, fast | -| **anthropic** | claude-opus-4-6 | claude-haiku-4-5-20251001 | 200K | Deep analysis, code understanding | -| **google** | gemini-3-pro-preview | gemini-2.5-flash | 1M | Massive context windows | +| Provider | Default Model | Fast Model | Context Window | Best For | +| ------------- | ---------------- | ------------------------- | -------------- | --------------------------------- | +| **openai** | gpt-6-astra | gpt-5.6-luna | 1.05M | General purpose, fast | +| **anthropic** | claude-opus-5 | claude-haiku-4-5-20251001 | 1M | Deep analysis, code understanding | +| **google** | gemini-3.8-flash | gemini-3.5-flash-lite | 1M | Massive context windows | **Fast models** are used for simple tasks like status updates and parsing. The primary model handles complex analysis. @@ -67,13 +68,13 @@ Git-Iris supports three LLM providers with different strengths: Set a custom model for your provider: ```bash -git-iris config --provider anthropic --model claude-opus-4-6 +git-iris config --provider anthropic --model claude-opus-5 ``` Set a custom fast model: ```bash -git-iris config --provider openai --fast-model gpt-5.4-mini +git-iris config --provider openai --fast-model gpt-5.6-luna ``` ### Token Limits @@ -159,8 +160,8 @@ git-iris config --provider openai \ --param text='{"verbosity":"low"}' ``` -For OpenAI reasoning models, prefer `--token-limit` for output-token budgets instead of manually -setting legacy token params in `--param`. +The `--token-limit` option records context-window metadata. It does not control generation output +budgets. See [Model Selection](../configuration/models) for role defaults. ## Project Configuration @@ -177,7 +178,7 @@ git-iris project-config --provider openai --preset conventional Set a model for the project: ```bash -git-iris project-config --model gpt-5.4 +git-iris project-config --model gpt-6-astra ``` Set project PR instructions: @@ -336,18 +337,18 @@ theme = "silkcircuit-neon" [providers.openai] api_key = "sk-..." -model = "gpt-5.4" -fast_model = "gpt-5.4-mini" +model = "gpt-6-astra" +fast_model = "gpt-5.6-luna" [providers.anthropic] api_key = "sk-ant-..." -model = "claude-opus-4-6" +model = "claude-opus-5" fast_model = "claude-haiku-4-5-20251001" [providers.google] api_key = "AIza..." -model = "gemini-3-pro-preview" -fast_model = "gemini-2.5-flash" +model = "gemini-3.8-flash" +fast_model = "gemini-3.5-flash-lite" ``` You can edit this manually if you prefer, but the `git-iris config` command is safer. diff --git a/docs/getting-started/index.md b/docs/getting-started/index.md index b1e02ae..a8d46d5 100644 --- a/docs/getting-started/index.md +++ b/docs/getting-started/index.md @@ -43,11 +43,11 @@ Press `/` in any mode to chat with Iris. Ask her to refine content, explain chan Work with your preferred LLM: -| Provider | Default Model | Context Window | -| ------------- | -------------------- | -------------- | -| **OpenAI** | gpt-5.4 | 128K tokens | -| **Anthropic** | claude-opus-4-6 | 200K tokens | -| **Google** | gemini-3-pro-preview | 1M tokens | +| Provider | Default Model | Context Window | +| ------------- | ---------------- | -------------- | +| **OpenAI** | gpt-6-astra | 1.05M tokens | +| **Anthropic** | claude-opus-5 | 1M tokens | +| **Google** | gemini-3.8-flash | 1M tokens | Switch providers instantly—configuration is shared across your system. diff --git a/docs/package-lock.json b/docs/package-lock.json deleted file mode 100644 index a9a3fa6..0000000 --- a/docs/package-lock.json +++ /dev/null @@ -1,3646 +0,0 @@ -{ - "name": "git-iris-docs", - "version": "1.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "git-iris-docs", - "version": "1.0.0", - "devDependencies": { - "mermaid": "^11.12.1", - "prettier": "^3.7.1", - "vitepress": "^2.0.0-alpha.15" - } - }, - "node_modules/@antfu/install-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@antfu/install-pkg/-/install-pkg-1.1.0.tgz", - "integrity": "sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "package-manager-detector": "^1.3.0", - "tinyexec": "^1.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", - "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", - "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz", - "integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.28.5" - }, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/types": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz", - "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.28.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@braintree/sanitize-url": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-7.1.1.tgz", - "integrity": "sha512-i1L7noDNxtFyL5DmZafWy1wRVhGehQmzZaz1HiN5e7iylJMSZR7ekOV7NsIqa5qBldlLrsKv4HbgFUVlQrz8Mw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@chevrotain/cst-dts-gen": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/@chevrotain/cst-dts-gen/-/cst-dts-gen-11.0.3.tgz", - "integrity": "sha512-BvIKpRLeS/8UbfxXxgC33xOumsacaeCKAjAeLyOn7Pcp95HiRbrpl14S+9vaZLolnbssPIUuiUd8IvgkRyt6NQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@chevrotain/gast": "11.0.3", - "@chevrotain/types": "11.0.3", - "lodash-es": "4.17.21" - } - }, - "node_modules/@chevrotain/gast": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/@chevrotain/gast/-/gast-11.0.3.tgz", - "integrity": "sha512-+qNfcoNk70PyS/uxmj3li5NiECO+2YKZZQMbmjTqRI3Qchu8Hig/Q9vgkHpI3alNjr7M+a2St5pw5w5F6NL5/Q==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@chevrotain/types": "11.0.3", - "lodash-es": "4.17.21" - } - }, - "node_modules/@chevrotain/regexp-to-ast": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/@chevrotain/regexp-to-ast/-/regexp-to-ast-11.0.3.tgz", - "integrity": "sha512-1fMHaBZxLFvWI067AVbGJav1eRY7N8DDvYCTwGBiE/ytKBgP8azTdgyrKyWZ9Mfh09eHWb5PgTSO8wi7U824RA==", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/@chevrotain/types": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/@chevrotain/types/-/types-11.0.3.tgz", - "integrity": "sha512-gsiM3G8b58kZC2HaWR50gu6Y1440cHiJ+i3JUvcp/35JchYejb2+5MVeJK0iKThYpAa/P2PYFV4hoi44HD+aHQ==", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/@chevrotain/utils": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/@chevrotain/utils/-/utils-11.0.3.tgz", - "integrity": "sha512-YslZMgtJUyuMbZ+aKvfF3x1f5liK4mWNxghFRv7jqRR9C3R3fAOGTTKvxXDa2Y1s9zSbcpuO0cAxDYsc9SrXoQ==", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/@docsearch/css": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-4.3.2.tgz", - "integrity": "sha512-K3Yhay9MgkBjJJ0WEL5MxnACModX9xuNt3UlQQkDEDZJZ0+aeWKtOkxHNndMRkMBnHdYvQjxkm6mdlneOtU1IQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@docsearch/js": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@docsearch/js/-/js-4.3.2.tgz", - "integrity": "sha512-xdfpPXMgKRY9EW7U1vtY7gLKbLZFa9ed+t0Dacquq8zXBqAlH9HlUf0h4Mhxm0xatsVeMaIR2wr/u6g0GsZyQw==", - "dev": true, - "license": "MIT", - "dependencies": { - "htm": "3.1.1" - } - }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", - "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", - "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", - "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", - "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", - "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", - "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", - "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", - "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", - "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", - "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", - "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", - "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", - "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", - "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", - "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", - "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", - "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", - "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", - "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", - "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", - "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openharmony-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", - "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", - "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", - "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", - "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", - "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@iconify-json/simple-icons": { - "version": "1.2.60", - "resolved": "https://registry.npmjs.org/@iconify-json/simple-icons/-/simple-icons-1.2.60.tgz", - "integrity": "sha512-KlwLBKCdMCqfySdkAA+jehdUx6VSjnj6lvzQKus7HjkPSQ6QP58d6xiptkIp0jd/Hw3PW2++nRuGvCvSYaF0Mg==", - "dev": true, - "license": "CC0-1.0", - "dependencies": { - "@iconify/types": "*" - } - }, - "node_modules/@iconify/types": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@iconify/types/-/types-2.0.0.tgz", - "integrity": "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@iconify/utils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@iconify/utils/-/utils-3.1.0.tgz", - "integrity": "sha512-Zlzem1ZXhI1iHeeERabLNzBHdOa4VhQbqAcOQaMKuTuyZCpwKbC2R4Dd0Zo3g9EAc+Y4fiarO8HIHRAth7+skw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@antfu/install-pkg": "^1.1.0", - "@iconify/types": "^2.0.0", - "mlly": "^1.8.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", - "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", - "dev": true, - "license": "MIT" - }, - "node_modules/@mermaid-js/parser": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/@mermaid-js/parser/-/parser-0.6.3.tgz", - "integrity": "sha512-lnjOhe7zyHjc+If7yT4zoedx2vo4sHaTmtkl1+or8BRTnCtDmcTpAjpzDSfCZrshM5bCoz0GyidzadJAH1xobA==", - "dev": true, - "license": "MIT", - "dependencies": { - "langium": "3.3.1" - } - }, - "node_modules/@rolldown/pluginutils": { - "version": "1.0.0-beta.50", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.50.tgz", - "integrity": "sha512-5e76wQiQVeL1ICOZVUg4LSOVYg9jyhGCin+icYozhsUzM+fHE7kddi1bdiE0jwVqTfkjba3jUFbEkoC9WkdvyA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.53.3.tgz", - "integrity": "sha512-mRSi+4cBjrRLoaal2PnqH82Wqyb+d3HsPUN/W+WslCXsZsyHa9ZeQQX/pQsZaVIWDkPcpV6jJ+3KLbTbgnwv8w==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.53.3.tgz", - "integrity": "sha512-CbDGaMpdE9sh7sCmTrTUyllhrg65t6SwhjlMJsLr+J8YjFuPmCEjbBSx4Z/e4SmDyH3aB5hGaJUP2ltV/vcs4w==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.53.3.tgz", - "integrity": "sha512-Nr7SlQeqIBpOV6BHHGZgYBuSdanCXuw09hon14MGOLGmXAFYjx1wNvquVPmpZnl0tLjg25dEdr4IQ6GgyToCUA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.53.3.tgz", - "integrity": "sha512-DZ8N4CSNfl965CmPktJ8oBnfYr3F8dTTNBQkRlffnUarJ2ohudQD17sZBa097J8xhQ26AwhHJ5mvUyQW8ddTsQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.53.3.tgz", - "integrity": "sha512-yMTrCrK92aGyi7GuDNtGn2sNW+Gdb4vErx4t3Gv/Tr+1zRb8ax4z8GWVRfr3Jw8zJWvpGHNpss3vVlbF58DZ4w==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.53.3.tgz", - "integrity": "sha512-lMfF8X7QhdQzseM6XaX0vbno2m3hlyZFhwcndRMw8fbAGUGL3WFMBdK0hbUBIUYcEcMhVLr1SIamDeuLBnXS+Q==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.53.3.tgz", - "integrity": "sha512-k9oD15soC/Ln6d2Wv/JOFPzZXIAIFLp6B+i14KhxAfnq76ajt0EhYc5YPeX6W1xJkAdItcVT+JhKl1QZh44/qw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.53.3.tgz", - "integrity": "sha512-vTNlKq+N6CK/8UktsrFuc+/7NlEYVxgaEgRXVUVK258Z5ymho29skzW1sutgYjqNnquGwVUObAaxae8rZ6YMhg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.53.3.tgz", - "integrity": "sha512-RGrFLWgMhSxRs/EWJMIFM1O5Mzuz3Xy3/mnxJp/5cVhZ2XoCAxJnmNsEyeMJtpK+wu0FJFWz+QF4mjCA7AUQ3w==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.53.3.tgz", - "integrity": "sha512-kASyvfBEWYPEwe0Qv4nfu6pNkITLTb32p4yTgzFCocHnJLAHs+9LjUu9ONIhvfT/5lv4YS5muBHyuV84epBo/A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-loong64-gnu": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.53.3.tgz", - "integrity": "sha512-JiuKcp2teLJwQ7vkJ95EwESWkNRFJD7TQgYmCnrPtlu50b4XvT5MOmurWNrCj3IFdyjBQ5p9vnrX4JM6I8OE7g==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.53.3.tgz", - "integrity": "sha512-EoGSa8nd6d3T7zLuqdojxC20oBfNT8nexBbB/rkxgKj5T5vhpAQKKnD+h3UkoMuTyXkP5jTjK/ccNRmQrPNDuw==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.53.3.tgz", - "integrity": "sha512-4s+Wped2IHXHPnAEbIB0YWBv7SDohqxobiiPA1FIWZpX+w9o2i4LezzH/NkFUl8LRci/8udci6cLq+jJQlh+0g==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.53.3.tgz", - "integrity": "sha512-68k2g7+0vs2u9CxDt5ktXTngsxOQkSEV/xBbwlqYcUrAVh6P9EgMZvFsnHy4SEiUl46Xf0IObWVbMvPrr2gw8A==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.53.3.tgz", - "integrity": "sha512-VYsFMpULAz87ZW6BVYw3I6sWesGpsP9OPcyKe8ofdg9LHxSbRMd7zrVrr5xi/3kMZtpWL/wC+UIJWJYVX5uTKg==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.53.3.tgz", - "integrity": "sha512-3EhFi1FU6YL8HTUJZ51imGJWEX//ajQPfqWLI3BQq4TlvHy4X0MOr5q3D2Zof/ka0d5FNdPwZXm3Yyib/UEd+w==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.53.3.tgz", - "integrity": "sha512-eoROhjcc6HbZCJr+tvVT8X4fW3/5g/WkGvvmwz/88sDtSJzO7r/blvoBDgISDiCjDRZmHpwud7h+6Q9JxFwq1Q==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-openharmony-arm64": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.53.3.tgz", - "integrity": "sha512-OueLAWgrNSPGAdUdIjSWXw+u/02BRTcnfw9PN41D2vq/JSEPnJnVuBgw18VkN8wcd4fjUs+jFHVM4t9+kBSNLw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ] - }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.53.3.tgz", - "integrity": "sha512-GOFuKpsxR/whszbF/bzydebLiXIHSgsEUp6M0JI8dWvi+fFa1TD6YQa4aSZHtpmh2/uAlj/Dy+nmby3TJ3pkTw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.53.3.tgz", - "integrity": "sha512-iah+THLcBJdpfZ1TstDFbKNznlzoxa8fmnFYK4V67HvmuNYkVdAywJSoteUszvBQ9/HqN2+9AZghbajMsFT+oA==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-gnu": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.53.3.tgz", - "integrity": "sha512-J9QDiOIZlZLdcot5NXEepDkstocktoVjkaKUtqzgzpt2yWjGlbYiKyp05rWwk4nypbYUNoFAztEgixoLaSETkg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.53.3.tgz", - "integrity": "sha512-UhTd8u31dXadv0MopwGgNOBpUVROFKWVQgAg5N1ESyCz8AuBcMqm4AuTjrwgQKGDfoFuz02EuMRHQIw/frmYKQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@shikijs/core": { - "version": "3.17.0", - "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-3.17.0.tgz", - "integrity": "sha512-/HjeOnbc62C+n33QFNFrAhUlIADKwfuoS50Ht0pxujxP4QjZAlFp5Q+OkDo531SCTzivx5T18khwyBdKoPdkuw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@shikijs/types": "3.17.0", - "@shikijs/vscode-textmate": "^10.0.2", - "@types/hast": "^3.0.4", - "hast-util-to-html": "^9.0.5" - } - }, - "node_modules/@shikijs/engine-javascript": { - "version": "3.17.0", - "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-3.17.0.tgz", - "integrity": "sha512-WwF99xdP8KfuDrIbT4wxyypfhoIxMeeOCp1AiuvzzZ6JT5B3vIuoclL8xOuuydA6LBeeNXUF/XV5zlwwex1jlA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@shikijs/types": "3.17.0", - "@shikijs/vscode-textmate": "^10.0.2", - "oniguruma-to-es": "^4.3.4" - } - }, - "node_modules/@shikijs/engine-oniguruma": { - "version": "3.17.0", - "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-3.17.0.tgz", - "integrity": "sha512-flSbHZAiOZDNTrEbULY8DLWavu/TyVu/E7RChpLB4WvKX4iHMfj80C6Hi3TjIWaQtHOW0KC6kzMcuB5TO1hZ8Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@shikijs/types": "3.17.0", - "@shikijs/vscode-textmate": "^10.0.2" - } - }, - "node_modules/@shikijs/langs": { - "version": "3.17.0", - "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-3.17.0.tgz", - "integrity": "sha512-icmur2n5Ojb+HAiQu6NEcIIJ8oWDFGGEpiqSCe43539Sabpx7Y829WR3QuUW2zjTM4l6V8Sazgb3rrHO2orEAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@shikijs/types": "3.17.0" - } - }, - "node_modules/@shikijs/themes": { - "version": "3.17.0", - "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-3.17.0.tgz", - "integrity": "sha512-/xEizMHLBmMHwtx4JuOkRf3zwhWD2bmG5BRr0IPjpcWpaq4C3mYEuTk/USAEglN0qPrTwEHwKVpSu/y2jhferA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@shikijs/types": "3.17.0" - } - }, - "node_modules/@shikijs/transformers": { - "version": "3.17.0", - "resolved": "https://registry.npmjs.org/@shikijs/transformers/-/transformers-3.17.0.tgz", - "integrity": "sha512-b14s8lPt/3K/PjtGgvdS4oU676Ke/ct9kdi6ksEb2rHzRVBAoWJeRwvDQcHASiiZbrDHlnnC8VnwL2Bw0T/nlw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@shikijs/core": "3.17.0", - "@shikijs/types": "3.17.0" - } - }, - "node_modules/@shikijs/types": { - "version": "3.17.0", - "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-3.17.0.tgz", - "integrity": "sha512-wjLVfutYWVUnxAjsWEob98xgyaGv0dTEnMZDruU5mRjVN7szcGOfgO+997W2yR6odp+1PtSBNeSITRRTfUzK/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@shikijs/vscode-textmate": "^10.0.2", - "@types/hast": "^3.0.4" - } - }, - "node_modules/@shikijs/vscode-textmate": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-10.0.2.tgz", - "integrity": "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/d3": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/@types/d3/-/d3-7.4.3.tgz", - "integrity": "sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/d3-array": "*", - "@types/d3-axis": "*", - "@types/d3-brush": "*", - "@types/d3-chord": "*", - "@types/d3-color": "*", - "@types/d3-contour": "*", - "@types/d3-delaunay": "*", - "@types/d3-dispatch": "*", - "@types/d3-drag": "*", - "@types/d3-dsv": "*", - "@types/d3-ease": "*", - "@types/d3-fetch": "*", - "@types/d3-force": "*", - "@types/d3-format": "*", - "@types/d3-geo": "*", - "@types/d3-hierarchy": "*", - "@types/d3-interpolate": "*", - "@types/d3-path": "*", - "@types/d3-polygon": "*", - "@types/d3-quadtree": "*", - "@types/d3-random": "*", - "@types/d3-scale": "*", - "@types/d3-scale-chromatic": "*", - "@types/d3-selection": "*", - "@types/d3-shape": "*", - "@types/d3-time": "*", - "@types/d3-time-format": "*", - "@types/d3-timer": "*", - "@types/d3-transition": "*", - "@types/d3-zoom": "*" - } - }, - "node_modules/@types/d3-array": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.2.tgz", - "integrity": "sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/d3-axis": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@types/d3-axis/-/d3-axis-3.0.6.tgz", - "integrity": "sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/d3-selection": "*" - } - }, - "node_modules/@types/d3-brush": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@types/d3-brush/-/d3-brush-3.0.6.tgz", - "integrity": "sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/d3-selection": "*" - } - }, - "node_modules/@types/d3-chord": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@types/d3-chord/-/d3-chord-3.0.6.tgz", - "integrity": "sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/d3-color": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", - "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/d3-contour": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@types/d3-contour/-/d3-contour-3.0.6.tgz", - "integrity": "sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/d3-array": "*", - "@types/geojson": "*" - } - }, - "node_modules/@types/d3-delaunay": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/@types/d3-delaunay/-/d3-delaunay-6.0.4.tgz", - "integrity": "sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/d3-dispatch": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/@types/d3-dispatch/-/d3-dispatch-3.0.7.tgz", - "integrity": "sha512-5o9OIAdKkhN1QItV2oqaE5KMIiXAvDWBDPrD85e58Qlz1c1kI/J0NcqbEG88CoTwJrYe7ntUCVfeUl2UJKbWgA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/d3-drag": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/@types/d3-drag/-/d3-drag-3.0.7.tgz", - "integrity": "sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/d3-selection": "*" - } - }, - "node_modules/@types/d3-dsv": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/@types/d3-dsv/-/d3-dsv-3.0.7.tgz", - "integrity": "sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/d3-ease": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz", - "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/d3-fetch": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/@types/d3-fetch/-/d3-fetch-3.0.7.tgz", - "integrity": "sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/d3-dsv": "*" - } - }, - "node_modules/@types/d3-force": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/@types/d3-force/-/d3-force-3.0.10.tgz", - "integrity": "sha512-ZYeSaCF3p73RdOKcjj+swRlZfnYpK1EbaDiYICEEp5Q6sUiqFaFQ9qgoshp5CzIyyb/yD09kD9o2zEltCexlgw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/d3-format": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/d3-format/-/d3-format-3.0.4.tgz", - "integrity": "sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/d3-geo": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@types/d3-geo/-/d3-geo-3.1.0.tgz", - "integrity": "sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/geojson": "*" - } - }, - "node_modules/@types/d3-hierarchy": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/@types/d3-hierarchy/-/d3-hierarchy-3.1.7.tgz", - "integrity": "sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/d3-interpolate": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", - "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/d3-color": "*" - } - }, - "node_modules/@types/d3-path": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.1.tgz", - "integrity": "sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/d3-polygon": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-polygon/-/d3-polygon-3.0.2.tgz", - "integrity": "sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/d3-quadtree": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@types/d3-quadtree/-/d3-quadtree-3.0.6.tgz", - "integrity": "sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/d3-random": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/d3-random/-/d3-random-3.0.3.tgz", - "integrity": "sha512-Imagg1vJ3y76Y2ea0871wpabqp613+8/r0mCLEBfdtqC7xMSfj9idOnmBYyMoULfHePJyxMAw3nWhJxzc+LFwQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/d3-scale": { - "version": "4.0.9", - "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.9.tgz", - "integrity": "sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/d3-time": "*" - } - }, - "node_modules/@types/d3-scale-chromatic": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", - "integrity": "sha512-iWMJgwkK7yTRmWqRB5plb1kadXyQ5Sj8V/zYlFGMUBbIPKQScw+Dku9cAAMgJG+z5GYDoMjWGLVOvjghDEFnKQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/d3-selection": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-3.0.11.tgz", - "integrity": "sha512-bhAXu23DJWsrI45xafYpkQ4NtcKMwWnAC/vKrd2l+nxMFuvOT3XMYTIj2opv8vq8AO5Yh7Qac/nSeP/3zjTK0w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/d3-shape": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.7.tgz", - "integrity": "sha512-VLvUQ33C+3J+8p+Daf+nYSOsjB4GXp19/S/aGo60m9h1v6XaxjiT82lKVWJCfzhtuZ3yD7i/TPeC/fuKLLOSmg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/d3-path": "*" - } - }, - "node_modules/@types/d3-time": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.4.tgz", - "integrity": "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/d3-time-format": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@types/d3-time-format/-/d3-time-format-4.0.3.tgz", - "integrity": "sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/d3-timer": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz", - "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/d3-transition": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-3.0.9.tgz", - "integrity": "sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/d3-selection": "*" - } - }, - "node_modules/@types/d3-zoom": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-3.0.8.tgz", - "integrity": "sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/d3-interpolate": "*", - "@types/d3-selection": "*" - } - }, - "node_modules/@types/estree": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", - "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/geojson": { - "version": "7946.0.16", - "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.16.tgz", - "integrity": "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/hast": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", - "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/unist": "*" - } - }, - "node_modules/@types/linkify-it": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-5.0.0.tgz", - "integrity": "sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/markdown-it": { - "version": "14.1.2", - "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-14.1.2.tgz", - "integrity": "sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/linkify-it": "^5", - "@types/mdurl": "^2" - } - }, - "node_modules/@types/mdast": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", - "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/unist": "*" - } - }, - "node_modules/@types/mdurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-2.0.0.tgz", - "integrity": "sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/trusted-types": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", - "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/@types/unist": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", - "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/web-bluetooth": { - "version": "0.0.21", - "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.21.tgz", - "integrity": "sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@ungap/structured-clone": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", - "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", - "dev": true, - "license": "ISC" - }, - "node_modules/@vitejs/plugin-vue": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-6.0.2.tgz", - "integrity": "sha512-iHmwV3QcVGGvSC1BG5bZ4z6iwa1SOpAPWmnjOErd4Ske+lZua5K9TtAVdx0gMBClJ28DViCbSmZitjWZsWO3LA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@rolldown/pluginutils": "1.0.0-beta.50" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "peerDependencies": { - "vite": "^5.0.0 || ^6.0.0 || ^7.0.0", - "vue": "^3.2.25" - } - }, - "node_modules/@vue/compiler-core": { - "version": "3.5.25", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.25.tgz", - "integrity": "sha512-vay5/oQJdsNHmliWoZfHPoVZZRmnSWhug0BYT34njkYTPqClh3DNWLkZNJBVSjsNMrg0CCrBfoKkjZQPM/QVUw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.28.5", - "@vue/shared": "3.5.25", - "entities": "^4.5.0", - "estree-walker": "^2.0.2", - "source-map-js": "^1.2.1" - } - }, - "node_modules/@vue/compiler-dom": { - "version": "3.5.25", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.25.tgz", - "integrity": "sha512-4We0OAcMZsKgYoGlMjzYvaoErltdFI2/25wqanuTu+S4gismOTRTBPi4IASOjxWdzIwrYSjnqONfKvuqkXzE2Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vue/compiler-core": "3.5.25", - "@vue/shared": "3.5.25" - } - }, - "node_modules/@vue/compiler-sfc": { - "version": "3.5.25", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.25.tgz", - "integrity": "sha512-PUgKp2rn8fFsI++lF2sO7gwO2d9Yj57Utr5yEsDf3GNaQcowCLKL7sf+LvVFvtJDXUp/03+dC6f2+LCv5aK1ag==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.28.5", - "@vue/compiler-core": "3.5.25", - "@vue/compiler-dom": "3.5.25", - "@vue/compiler-ssr": "3.5.25", - "@vue/shared": "3.5.25", - "estree-walker": "^2.0.2", - "magic-string": "^0.30.21", - "postcss": "^8.5.6", - "source-map-js": "^1.2.1" - } - }, - "node_modules/@vue/compiler-ssr": { - "version": "3.5.25", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.25.tgz", - "integrity": "sha512-ritPSKLBcParnsKYi+GNtbdbrIE1mtuFEJ4U1sWeuOMlIziK5GtOL85t5RhsNy4uWIXPgk+OUdpnXiTdzn8o3A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vue/compiler-dom": "3.5.25", - "@vue/shared": "3.5.25" - } - }, - "node_modules/@vue/devtools-api": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-8.0.5.tgz", - "integrity": "sha512-DgVcW8H/Nral7LgZEecYFFYXnAvGuN9C3L3DtWekAncFBedBczpNW8iHKExfaM559Zm8wQWrwtYZ9lXthEHtDw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vue/devtools-kit": "^8.0.5" - } - }, - "node_modules/@vue/devtools-kit": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-8.0.5.tgz", - "integrity": "sha512-q2VV6x1U3KJMTQPUlRMyWEKVbcHuxhqJdSr6Jtjz5uAThAIrfJ6WVZdGZm5cuO63ZnSUz0RCsVwiUUb0mDV0Yg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vue/devtools-shared": "^8.0.5", - "birpc": "^2.6.1", - "hookable": "^5.5.3", - "mitt": "^3.0.1", - "perfect-debounce": "^2.0.0", - "speakingurl": "^14.0.1", - "superjson": "^2.2.2" - } - }, - "node_modules/@vue/devtools-shared": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/@vue/devtools-shared/-/devtools-shared-8.0.5.tgz", - "integrity": "sha512-bRLn6/spxpmgLk+iwOrR29KrYnJjG9DGpHGkDFG82UM21ZpJ39ztUT9OXX3g+usW7/b2z+h46I9ZiYyB07XMXg==", - "dev": true, - "license": "MIT", - "dependencies": { - "rfdc": "^1.4.1" - } - }, - "node_modules/@vue/reactivity": { - "version": "3.5.25", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.25.tgz", - "integrity": "sha512-5xfAypCQepv4Jog1U4zn8cZIcbKKFka3AgWHEFQeK65OW+Ys4XybP6z2kKgws4YB43KGpqp5D/K3go2UPPunLA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vue/shared": "3.5.25" - } - }, - "node_modules/@vue/runtime-core": { - "version": "3.5.25", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.25.tgz", - "integrity": "sha512-Z751v203YWwYzy460bzsYQISDfPjHTl+6Zzwo/a3CsAf+0ccEjQ8c+0CdX1WsumRTHeywvyUFtW6KvNukT/smA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vue/reactivity": "3.5.25", - "@vue/shared": "3.5.25" - } - }, - "node_modules/@vue/runtime-dom": { - "version": "3.5.25", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.25.tgz", - "integrity": "sha512-a4WrkYFbb19i9pjkz38zJBg8wa/rboNERq3+hRRb0dHiJh13c+6kAbgqCPfMaJ2gg4weWD3APZswASOfmKwamA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vue/reactivity": "3.5.25", - "@vue/runtime-core": "3.5.25", - "@vue/shared": "3.5.25", - "csstype": "^3.1.3" - } - }, - "node_modules/@vue/server-renderer": { - "version": "3.5.25", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.25.tgz", - "integrity": "sha512-UJaXR54vMG61i8XNIzTSf2Q7MOqZHpp8+x3XLGtE3+fL+nQd+k7O5+X3D/uWrnQXOdMw5VPih+Uremcw+u1woQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vue/compiler-ssr": "3.5.25", - "@vue/shared": "3.5.25" - }, - "peerDependencies": { - "vue": "3.5.25" - } - }, - "node_modules/@vue/shared": { - "version": "3.5.25", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.25.tgz", - "integrity": "sha512-AbOPdQQnAnzs58H2FrrDxYj/TJfmeS2jdfEEhgiKINy+bnOANmVizIEgq1r+C5zsbs6l1CCQxtcj71rwNQ4jWg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@vueuse/core": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-14.1.0.tgz", - "integrity": "sha512-rgBinKs07hAYyPF834mDTigH7BtPqvZ3Pryuzt1SD/lg5wEcWqvwzXXYGEDb2/cP0Sj5zSvHl3WkmMELr5kfWw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/web-bluetooth": "^0.0.21", - "@vueuse/metadata": "14.1.0", - "@vueuse/shared": "14.1.0" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - }, - "peerDependencies": { - "vue": "^3.5.0" - } - }, - "node_modules/@vueuse/integrations": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/@vueuse/integrations/-/integrations-14.1.0.tgz", - "integrity": "sha512-eNQPdisnO9SvdydTIXnTE7c29yOsJBD/xkwEyQLdhDC/LKbqrFpXHb3uS//7NcIrQO3fWVuvMGp8dbK6mNEMCA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vueuse/core": "14.1.0", - "@vueuse/shared": "14.1.0" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - }, - "peerDependencies": { - "async-validator": "^4", - "axios": "^1", - "change-case": "^5", - "drauu": "^0.4", - "focus-trap": "^7", - "fuse.js": "^7", - "idb-keyval": "^6", - "jwt-decode": "^4", - "nprogress": "^0.2", - "qrcode": "^1.5", - "sortablejs": "^1", - "universal-cookie": "^7 || ^8", - "vue": "^3.5.0" - }, - "peerDependenciesMeta": { - "async-validator": { - "optional": true - }, - "axios": { - "optional": true - }, - "change-case": { - "optional": true - }, - "drauu": { - "optional": true - }, - "focus-trap": { - "optional": true - }, - "fuse.js": { - "optional": true - }, - "idb-keyval": { - "optional": true - }, - "jwt-decode": { - "optional": true - }, - "nprogress": { - "optional": true - }, - "qrcode": { - "optional": true - }, - "sortablejs": { - "optional": true - }, - "universal-cookie": { - "optional": true - } - } - }, - "node_modules/@vueuse/metadata": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-14.1.0.tgz", - "integrity": "sha512-7hK4g015rWn2PhKcZ99NyT+ZD9sbwm7SGvp7k+k+rKGWnLjS/oQozoIZzWfCewSUeBmnJkIb+CNr7Zc/EyRnnA==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@vueuse/shared": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-14.1.0.tgz", - "integrity": "sha512-EcKxtYvn6gx1F8z9J5/rsg3+lTQnvOruQd8fUecW99DCK04BkWD7z5KQ/wTAx+DazyoEE9dJt/zV8OIEQbM6kw==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/antfu" - }, - "peerDependencies": { - "vue": "^3.5.0" - } - }, - "node_modules/acorn": { - "version": "8.15.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", - "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", - "dev": true, - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/birpc": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/birpc/-/birpc-2.8.0.tgz", - "integrity": "sha512-Bz2a4qD/5GRhiHSwj30c/8kC8QGj12nNDwz3D4ErQ4Xhy35dsSDvF+RA/tWpjyU0pdGtSDiEk6B5fBGE1qNVhw==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/ccount": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", - "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/character-entities-html4": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", - "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/character-entities-legacy": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", - "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/chevrotain": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/chevrotain/-/chevrotain-11.0.3.tgz", - "integrity": "sha512-ci2iJH6LeIkvP9eJW6gpueU8cnZhv85ELY8w8WiFtNjMHA5ad6pQLaJo9mEly/9qUyCpvqX8/POVUTf18/HFdw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@chevrotain/cst-dts-gen": "11.0.3", - "@chevrotain/gast": "11.0.3", - "@chevrotain/regexp-to-ast": "11.0.3", - "@chevrotain/types": "11.0.3", - "@chevrotain/utils": "11.0.3", - "lodash-es": "4.17.21" - } - }, - "node_modules/chevrotain-allstar": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/chevrotain-allstar/-/chevrotain-allstar-0.3.1.tgz", - "integrity": "sha512-b7g+y9A0v4mxCW1qUhf3BSVPg+/NvGErk/dOkrDaHA0nQIQGAtrOjlX//9OQtRlSCy+x9rfB5N8yC71lH1nvMw==", - "dev": true, - "license": "MIT", - "dependencies": { - "lodash-es": "^4.17.21" - }, - "peerDependencies": { - "chevrotain": "^11.0.0" - } - }, - "node_modules/comma-separated-tokens": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", - "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10" - } - }, - "node_modules/confbox": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz", - "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==", - "dev": true, - "license": "MIT" - }, - "node_modules/copy-anything": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-4.0.5.tgz", - "integrity": "sha512-7Vv6asjS4gMOuILabD3l739tsaxFQmC+a7pLZm02zyvs8p977bL3zEgq3yDk5rn9B0PbYgIv++jmHcuUab4RhA==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-what": "^5.2.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/mesqueeb" - } - }, - "node_modules/cose-base": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/cose-base/-/cose-base-1.0.3.tgz", - "integrity": "sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==", - "dev": true, - "license": "MIT", - "dependencies": { - "layout-base": "^1.0.0" - } - }, - "node_modules/csstype": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", - "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/cytoscape": { - "version": "3.33.1", - "resolved": "https://registry.npmjs.org/cytoscape/-/cytoscape-3.33.1.tgz", - "integrity": "sha512-iJc4TwyANnOGR1OmWhsS9ayRS3s+XQ185FmuHObThD+5AeJCakAAbWv8KimMTt08xCCLNgneQwFp+JRJOr9qGQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10" - } - }, - "node_modules/cytoscape-cose-bilkent": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cytoscape-cose-bilkent/-/cytoscape-cose-bilkent-4.1.0.tgz", - "integrity": "sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "cose-base": "^1.0.0" - }, - "peerDependencies": { - "cytoscape": "^3.2.0" - } - }, - "node_modules/cytoscape-fcose": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cytoscape-fcose/-/cytoscape-fcose-2.2.0.tgz", - "integrity": "sha512-ki1/VuRIHFCzxWNrsshHYPs6L7TvLu3DL+TyIGEsRcvVERmxokbf5Gdk7mFxZnTdiGtnA4cfSmjZJMviqSuZrQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "cose-base": "^2.2.0" - }, - "peerDependencies": { - "cytoscape": "^3.2.0" - } - }, - "node_modules/cytoscape-fcose/node_modules/cose-base": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cose-base/-/cose-base-2.2.0.tgz", - "integrity": "sha512-AzlgcsCbUMymkADOJtQm3wO9S3ltPfYOFD5033keQn9NJzIbtnZj+UdBJe7DYml/8TdbtHJW3j58SOnKhWY/5g==", - "dev": true, - "license": "MIT", - "dependencies": { - "layout-base": "^2.0.0" - } - }, - "node_modules/cytoscape-fcose/node_modules/layout-base": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/layout-base/-/layout-base-2.0.1.tgz", - "integrity": "sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg==", - "dev": true, - "license": "MIT" - }, - "node_modules/d3": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/d3/-/d3-7.9.0.tgz", - "integrity": "sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==", - "dev": true, - "license": "ISC", - "dependencies": { - "d3-array": "3", - "d3-axis": "3", - "d3-brush": "3", - "d3-chord": "3", - "d3-color": "3", - "d3-contour": "4", - "d3-delaunay": "6", - "d3-dispatch": "3", - "d3-drag": "3", - "d3-dsv": "3", - "d3-ease": "3", - "d3-fetch": "3", - "d3-force": "3", - "d3-format": "3", - "d3-geo": "3", - "d3-hierarchy": "3", - "d3-interpolate": "3", - "d3-path": "3", - "d3-polygon": "3", - "d3-quadtree": "3", - "d3-random": "3", - "d3-scale": "4", - "d3-scale-chromatic": "3", - "d3-selection": "3", - "d3-shape": "3", - "d3-time": "3", - "d3-time-format": "4", - "d3-timer": "3", - "d3-transition": "3", - "d3-zoom": "3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-array": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", - "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", - "dev": true, - "license": "ISC", - "dependencies": { - "internmap": "1 - 2" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-axis": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz", - "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-brush": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-3.0.0.tgz", - "integrity": "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "d3-dispatch": "1 - 3", - "d3-drag": "2 - 3", - "d3-interpolate": "1 - 3", - "d3-selection": "3", - "d3-transition": "3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-chord": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-3.0.1.tgz", - "integrity": "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==", - "dev": true, - "license": "ISC", - "dependencies": { - "d3-path": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-color": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", - "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-contour": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-4.0.2.tgz", - "integrity": "sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==", - "dev": true, - "license": "ISC", - "dependencies": { - "d3-array": "^3.2.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-delaunay": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.4.tgz", - "integrity": "sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==", - "dev": true, - "license": "ISC", - "dependencies": { - "delaunator": "5" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-dispatch": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", - "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-drag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", - "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", - "dev": true, - "license": "ISC", - "dependencies": { - "d3-dispatch": "1 - 3", - "d3-selection": "3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-dsv": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz", - "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==", - "dev": true, - "license": "ISC", - "dependencies": { - "commander": "7", - "iconv-lite": "0.6", - "rw": "1" - }, - "bin": { - "csv2json": "bin/dsv2json.js", - "csv2tsv": "bin/dsv2dsv.js", - "dsv2dsv": "bin/dsv2dsv.js", - "dsv2json": "bin/dsv2json.js", - "json2csv": "bin/json2dsv.js", - "json2dsv": "bin/json2dsv.js", - "json2tsv": "bin/json2dsv.js", - "tsv2csv": "bin/dsv2dsv.js", - "tsv2json": "bin/dsv2json.js" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-ease": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", - "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-fetch": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-3.0.1.tgz", - "integrity": "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==", - "dev": true, - "license": "ISC", - "dependencies": { - "d3-dsv": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-force": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz", - "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==", - "dev": true, - "license": "ISC", - "dependencies": { - "d3-dispatch": "1 - 3", - "d3-quadtree": "1 - 3", - "d3-timer": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-format": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz", - "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-geo": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.1.tgz", - "integrity": "sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==", - "dev": true, - "license": "ISC", - "dependencies": { - "d3-array": "2.5.0 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-hierarchy": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz", - "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-interpolate": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", - "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", - "dev": true, - "license": "ISC", - "dependencies": { - "d3-color": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-path": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", - "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-polygon": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz", - "integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-quadtree": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz", - "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-random": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-3.0.1.tgz", - "integrity": "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-sankey": { - "version": "0.12.3", - "resolved": "https://registry.npmjs.org/d3-sankey/-/d3-sankey-0.12.3.tgz", - "integrity": "sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "d3-array": "1 - 2", - "d3-shape": "^1.2.0" - } - }, - "node_modules/d3-sankey/node_modules/d3-array": { - "version": "2.12.1", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.12.1.tgz", - "integrity": "sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "internmap": "^1.0.0" - } - }, - "node_modules/d3-sankey/node_modules/d3-path": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz", - "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/d3-sankey/node_modules/d3-shape": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz", - "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "d3-path": "1" - } - }, - "node_modules/d3-sankey/node_modules/internmap": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/internmap/-/internmap-1.0.1.tgz", - "integrity": "sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==", - "dev": true, - "license": "ISC" - }, - "node_modules/d3-scale": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", - "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "d3-array": "2.10.0 - 3", - "d3-format": "1 - 3", - "d3-interpolate": "1.2.0 - 3", - "d3-time": "2.1.1 - 3", - "d3-time-format": "2 - 4" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-scale-chromatic": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", - "integrity": "sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "d3-color": "1 - 3", - "d3-interpolate": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-selection": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", - "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-shape": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", - "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", - "dev": true, - "license": "ISC", - "dependencies": { - "d3-path": "^3.1.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-time": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", - "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", - "dev": true, - "license": "ISC", - "dependencies": { - "d3-array": "2 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-time-format": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", - "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", - "dev": true, - "license": "ISC", - "dependencies": { - "d3-time": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-timer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", - "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-transition": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", - "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", - "dev": true, - "license": "ISC", - "dependencies": { - "d3-color": "1 - 3", - "d3-dispatch": "1 - 3", - "d3-ease": "1 - 3", - "d3-interpolate": "1 - 3", - "d3-timer": "1 - 3" - }, - "engines": { - "node": ">=12" - }, - "peerDependencies": { - "d3-selection": "2 - 3" - } - }, - "node_modules/d3-zoom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", - "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", - "dev": true, - "license": "ISC", - "dependencies": { - "d3-dispatch": "1 - 3", - "d3-drag": "2 - 3", - "d3-interpolate": "1 - 3", - "d3-selection": "2 - 3", - "d3-transition": "2 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/dagre-d3-es": { - "version": "7.0.13", - "resolved": "https://registry.npmjs.org/dagre-d3-es/-/dagre-d3-es-7.0.13.tgz", - "integrity": "sha512-efEhnxpSuwpYOKRm/L5KbqoZmNNukHa/Flty4Wp62JRvgH2ojwVgPgdYyr4twpieZnyRDdIH7PY2mopX26+j2Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "d3": "^7.9.0", - "lodash-es": "^4.17.21" - } - }, - "node_modules/dayjs": { - "version": "1.11.19", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.19.tgz", - "integrity": "sha512-t5EcLVS6QPBNqM2z8fakk/NKel+Xzshgt8FFKAn+qwlD1pzZWxh0nVCrvFK7ZDb6XucZeF9z8C7CBWTRIVApAw==", - "dev": true, - "license": "MIT" - }, - "node_modules/delaunator": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.0.1.tgz", - "integrity": "sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==", - "dev": true, - "license": "ISC", - "dependencies": { - "robust-predicates": "^3.0.2" - } - }, - "node_modules/dequal": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/devlop": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", - "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", - "dev": true, - "license": "MIT", - "dependencies": { - "dequal": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/dompurify": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.3.0.tgz", - "integrity": "sha512-r+f6MYR1gGN1eJv0TVQbhA7if/U7P87cdPl3HN5rikqaBSBxLiCb/b9O+2eG0cxz0ghyU+mU1QkbsOwERMYlWQ==", - "dev": true, - "license": "(MPL-2.0 OR Apache-2.0)", - "optionalDependencies": { - "@types/trusted-types": "^2.0.7" - } - }, - "node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/esbuild": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", - "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "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" - } - }, - "node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "dev": true, - "license": "MIT" - }, - "node_modules/fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/focus-trap": { - "version": "7.6.6", - "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-7.6.6.tgz", - "integrity": "sha512-v/Z8bvMCajtx4mEXmOo7QEsIzlIOqRXTIwgUfsFOF9gEsespdbD0AkPIka1bSXZ8Y8oZ+2IVDQZePkTfEHZl7Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "tabbable": "^6.3.0" - } - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/hachure-fill": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/hachure-fill/-/hachure-fill-0.5.2.tgz", - "integrity": "sha512-3GKBOn+m2LX9iq+JC1064cSFprJY4jL1jCXTcpnfER5HYE2l/4EfWSGzkPa/ZDBmYI0ZOEj5VHV/eKnPGkHuOg==", - "dev": true, - "license": "MIT" - }, - "node_modules/hast-util-to-html": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.5.tgz", - "integrity": "sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/unist": "^3.0.0", - "ccount": "^2.0.0", - "comma-separated-tokens": "^2.0.0", - "hast-util-whitespace": "^3.0.0", - "html-void-elements": "^3.0.0", - "mdast-util-to-hast": "^13.0.0", - "property-information": "^7.0.0", - "space-separated-tokens": "^2.0.0", - "stringify-entities": "^4.0.0", - "zwitch": "^2.0.4" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-whitespace": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", - "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hookable": { - "version": "5.5.3", - "resolved": "https://registry.npmjs.org/hookable/-/hookable-5.5.3.tgz", - "integrity": "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/htm": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/htm/-/htm-3.1.1.tgz", - "integrity": "sha512-983Vyg8NwUE7JkZ6NmOqpCZ+sh1bKv2iYTlUkzlWmA5JD2acKoxd4KVxbMmxX/85mtfdnDmTFoNKcg5DGAvxNQ==", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/html-void-elements": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", - "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/internmap": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", - "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/is-what": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/is-what/-/is-what-5.5.0.tgz", - "integrity": "sha512-oG7cgbmg5kLYae2N5IVd3jm2s+vldjxJzK1pcu9LfpGuQ93MQSzo0okvRna+7y5ifrD+20FE8FvjusyGaz14fw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/mesqueeb" - } - }, - "node_modules/katex": { - "version": "0.16.25", - "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.25.tgz", - "integrity": "sha512-woHRUZ/iF23GBP1dkDQMh1QBad9dmr8/PAwNA54VrSOVYgI12MAcE14TqnDdQOdzyEonGzMepYnqBMYdsoAr8Q==", - "dev": true, - "funding": [ - "https://opencollective.com/katex", - "https://github.com/sponsors/katex" - ], - "license": "MIT", - "dependencies": { - "commander": "^8.3.0" - }, - "bin": { - "katex": "cli.js" - } - }, - "node_modules/katex/node_modules/commander": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 12" - } - }, - "node_modules/khroma": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/khroma/-/khroma-2.1.0.tgz", - "integrity": "sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw==", - "dev": true - }, - "node_modules/langium": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/langium/-/langium-3.3.1.tgz", - "integrity": "sha512-QJv/h939gDpvT+9SiLVlY7tZC3xB2qK57v0J04Sh9wpMb6MP1q8gB21L3WIo8T5P1MSMg3Ep14L7KkDCFG3y4w==", - "dev": true, - "license": "MIT", - "dependencies": { - "chevrotain": "~11.0.3", - "chevrotain-allstar": "~0.3.0", - "vscode-languageserver": "~9.0.1", - "vscode-languageserver-textdocument": "~1.0.11", - "vscode-uri": "~3.0.8" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/layout-base": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/layout-base/-/layout-base-1.0.2.tgz", - "integrity": "sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash-es": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", - "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", - "dev": true, - "license": "MIT" - }, - "node_modules/magic-string": { - "version": "0.30.21", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", - "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.5" - } - }, - "node_modules/mark.js": { - "version": "8.11.1", - "resolved": "https://registry.npmjs.org/mark.js/-/mark.js-8.11.1.tgz", - "integrity": "sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/marked": { - "version": "16.4.2", - "resolved": "https://registry.npmjs.org/marked/-/marked-16.4.2.tgz", - "integrity": "sha512-TI3V8YYWvkVf3KJe1dRkpnjs68JUPyEa5vjKrp1XEEJUAOaQc+Qj+L1qWbPd0SJuAdQkFU0h73sXXqwDYxsiDA==", - "dev": true, - "license": "MIT", - "bin": { - "marked": "bin/marked.js" - }, - "engines": { - "node": ">= 20" - } - }, - "node_modules/mdast-util-to-hast": { - "version": "13.2.1", - "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.1.tgz", - "integrity": "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "@ungap/structured-clone": "^1.0.0", - "devlop": "^1.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "trim-lines": "^3.0.0", - "unist-util-position": "^5.0.0", - "unist-util-visit": "^5.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mermaid": { - "version": "11.12.1", - "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-11.12.1.tgz", - "integrity": "sha512-UlIZrRariB11TY1RtTgUWp65tphtBv4CSq7vyS2ZZ2TgoMjs2nloq+wFqxiwcxlhHUvs7DPGgMjs2aeQxz5h9g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@braintree/sanitize-url": "^7.1.1", - "@iconify/utils": "^3.0.1", - "@mermaid-js/parser": "^0.6.3", - "@types/d3": "^7.4.3", - "cytoscape": "^3.29.3", - "cytoscape-cose-bilkent": "^4.1.0", - "cytoscape-fcose": "^2.2.0", - "d3": "^7.9.0", - "d3-sankey": "^0.12.3", - "dagre-d3-es": "7.0.13", - "dayjs": "^1.11.18", - "dompurify": "^3.2.5", - "katex": "^0.16.22", - "khroma": "^2.1.0", - "lodash-es": "^4.17.21", - "marked": "^16.2.1", - "roughjs": "^4.6.6", - "stylis": "^4.3.6", - "ts-dedent": "^2.2.0", - "uuid": "^11.1.0" - } - }, - "node_modules/micromark-util-character": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", - "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-encode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", - "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-util-sanitize-uri": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", - "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-encode": "^2.0.0", - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-symbol": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-util-types": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", - "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/minisearch": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/minisearch/-/minisearch-7.2.0.tgz", - "integrity": "sha512-dqT2XBYUOZOiC5t2HRnwADjhNS2cecp9u+TJRiJ1Qp/f5qjkeT5APcGPjHw+bz89Ms8Jp+cG4AlE+QZ/QnDglg==", - "dev": true, - "license": "MIT" - }, - "node_modules/mitt": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", - "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", - "dev": true, - "license": "MIT" - }, - "node_modules/mlly": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.8.0.tgz", - "integrity": "sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "acorn": "^8.15.0", - "pathe": "^2.0.3", - "pkg-types": "^1.3.1", - "ufo": "^1.6.1" - } - }, - "node_modules/nanoid": { - "version": "3.3.11", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", - "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/oniguruma-parser": { - "version": "0.12.1", - "resolved": "https://registry.npmjs.org/oniguruma-parser/-/oniguruma-parser-0.12.1.tgz", - "integrity": "sha512-8Unqkvk1RYc6yq2WBYRj4hdnsAxVze8i7iPfQr8e4uSP3tRv0rpZcbGUDvxfQQcdwHt/e9PrMvGCsa8OqG9X3w==", - "dev": true, - "license": "MIT" - }, - "node_modules/oniguruma-to-es": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-4.3.4.tgz", - "integrity": "sha512-3VhUGN3w2eYxnTzHn+ikMI+fp/96KoRSVK9/kMTcFqj1NRDh2IhQCKvYxDnWePKRXY/AqH+Fuiyb7VHSzBjHfA==", - "dev": true, - "license": "MIT", - "dependencies": { - "oniguruma-parser": "^0.12.1", - "regex": "^6.0.1", - "regex-recursion": "^6.0.2" - } - }, - "node_modules/package-manager-detector": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-1.6.0.tgz", - "integrity": "sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA==", - "dev": true, - "license": "MIT" - }, - "node_modules/path-data-parser": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/path-data-parser/-/path-data-parser-0.1.0.tgz", - "integrity": "sha512-NOnmBpt5Y2RWbuv0LMzsayp3lVylAHLPUTut412ZA3l+C4uw4ZVkQbjShYCQ8TCpUMdPapr4YjUqLYD6v68j+w==", - "dev": true, - "license": "MIT" - }, - "node_modules/pathe": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", - "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", - "dev": true, - "license": "MIT" - }, - "node_modules/perfect-debounce": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-2.0.0.tgz", - "integrity": "sha512-fkEH/OBiKrqqI/yIgjR92lMfs2K8105zt/VT6+7eTjNwisrsh47CeIED9z58zI7DfKdH3uHAn25ziRZn3kgAow==", - "dev": true, - "license": "MIT" - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true, - "license": "ISC" - }, - "node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pkg-types": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz", - "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "confbox": "^0.1.8", - "mlly": "^1.7.4", - "pathe": "^2.0.1" - } - }, - "node_modules/points-on-curve": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/points-on-curve/-/points-on-curve-0.2.0.tgz", - "integrity": "sha512-0mYKnYYe9ZcqMCWhUjItv/oHjvgEsfKvnUTg8sAtnHr3GVy7rGkXCb6d5cSyqrWqL4k81b9CPg3urd+T7aop3A==", - "dev": true, - "license": "MIT" - }, - "node_modules/points-on-path": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/points-on-path/-/points-on-path-0.2.1.tgz", - "integrity": "sha512-25ClnWWuw7JbWZcgqY/gJ4FQWadKxGWk+3kR/7kD0tCaDtPPMj7oHu2ToLaVhfpnHrZzYby2w6tUA0eOIuUg8g==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-data-parser": "0.1.0", - "points-on-curve": "0.2.0" - } - }, - "node_modules/postcss": { - "version": "8.5.6", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", - "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.11", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/prettier": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.7.1.tgz", - "integrity": "sha512-RWKXE4qB3u5Z6yz7omJkjWwmTfLdcbv44jUVHC5NpfXwFGzvpQM798FGv/6WNK879tc+Cn0AAyherCl1KjbyZQ==", - "dev": true, - "license": "MIT", - "bin": { - "prettier": "bin/prettier.cjs" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, - "node_modules/property-information": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz", - "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/regex/-/regex-6.0.1.tgz", - "integrity": "sha512-uorlqlzAKjKQZ5P+kTJr3eeJGSVroLKoHmquUj4zHWuR+hEyNqlXsSKlYYF5F4NI6nl7tWCs0apKJ0lmfsXAPA==", - "dev": true, - "license": "MIT", - "dependencies": { - "regex-utilities": "^2.3.0" - } - }, - "node_modules/regex-recursion": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/regex-recursion/-/regex-recursion-6.0.2.tgz", - "integrity": "sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==", - "dev": true, - "license": "MIT", - "dependencies": { - "regex-utilities": "^2.3.0" - } - }, - "node_modules/regex-utilities": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/regex-utilities/-/regex-utilities-2.3.0.tgz", - "integrity": "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==", - "dev": true, - "license": "MIT" - }, - "node_modules/rfdc": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", - "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", - "dev": true, - "license": "MIT" - }, - "node_modules/robust-predicates": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.2.tgz", - "integrity": "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==", - "dev": true, - "license": "Unlicense" - }, - "node_modules/rollup": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.53.3.tgz", - "integrity": "sha512-w8GmOxZfBmKknvdXU1sdM9NHcoQejwF/4mNgj2JuEEdRaHwwF12K7e9eXn1nLZ07ad+du76mkVsyeb2rKGllsA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "1.0.8" - }, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.53.3", - "@rollup/rollup-android-arm64": "4.53.3", - "@rollup/rollup-darwin-arm64": "4.53.3", - "@rollup/rollup-darwin-x64": "4.53.3", - "@rollup/rollup-freebsd-arm64": "4.53.3", - "@rollup/rollup-freebsd-x64": "4.53.3", - "@rollup/rollup-linux-arm-gnueabihf": "4.53.3", - "@rollup/rollup-linux-arm-musleabihf": "4.53.3", - "@rollup/rollup-linux-arm64-gnu": "4.53.3", - "@rollup/rollup-linux-arm64-musl": "4.53.3", - "@rollup/rollup-linux-loong64-gnu": "4.53.3", - "@rollup/rollup-linux-ppc64-gnu": "4.53.3", - "@rollup/rollup-linux-riscv64-gnu": "4.53.3", - "@rollup/rollup-linux-riscv64-musl": "4.53.3", - "@rollup/rollup-linux-s390x-gnu": "4.53.3", - "@rollup/rollup-linux-x64-gnu": "4.53.3", - "@rollup/rollup-linux-x64-musl": "4.53.3", - "@rollup/rollup-openharmony-arm64": "4.53.3", - "@rollup/rollup-win32-arm64-msvc": "4.53.3", - "@rollup/rollup-win32-ia32-msvc": "4.53.3", - "@rollup/rollup-win32-x64-gnu": "4.53.3", - "@rollup/rollup-win32-x64-msvc": "4.53.3", - "fsevents": "~2.3.2" - } - }, - "node_modules/roughjs": { - "version": "4.6.6", - "resolved": "https://registry.npmjs.org/roughjs/-/roughjs-4.6.6.tgz", - "integrity": "sha512-ZUz/69+SYpFN/g/lUlo2FXcIjRkSu3nDarreVdGGndHEBJ6cXPdKguS8JGxwj5HA5xIbVKSmLgr5b3AWxtRfvQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "hachure-fill": "^0.5.2", - "path-data-parser": "^0.1.0", - "points-on-curve": "^0.2.0", - "points-on-path": "^0.2.1" - } - }, - "node_modules/rw": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", - "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true, - "license": "MIT" - }, - "node_modules/shiki": { - "version": "3.17.0", - "resolved": "https://registry.npmjs.org/shiki/-/shiki-3.17.0.tgz", - "integrity": "sha512-lUZfWsyW7czITYTdo/Tb6ZM4VfyXlzmKYBQBjTz+pBzPPkP08RgIt00Ls1Z50Cl3SfwJsue6WbJeF3UgqLVI9Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@shikijs/core": "3.17.0", - "@shikijs/engine-javascript": "3.17.0", - "@shikijs/engine-oniguruma": "3.17.0", - "@shikijs/langs": "3.17.0", - "@shikijs/themes": "3.17.0", - "@shikijs/types": "3.17.0", - "@shikijs/vscode-textmate": "^10.0.2", - "@types/hast": "^3.0.4" - } - }, - "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/space-separated-tokens": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", - "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/speakingurl": { - "version": "14.0.1", - "resolved": "https://registry.npmjs.org/speakingurl/-/speakingurl-14.0.1.tgz", - "integrity": "sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/stringify-entities": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", - "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", - "dev": true, - "license": "MIT", - "dependencies": { - "character-entities-html4": "^2.0.0", - "character-entities-legacy": "^3.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/stylis": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.6.tgz", - "integrity": "sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/superjson": { - "version": "2.2.6", - "resolved": "https://registry.npmjs.org/superjson/-/superjson-2.2.6.tgz", - "integrity": "sha512-H+ue8Zo4vJmV2nRjpx86P35lzwDT3nItnIsocgumgr0hHMQ+ZGq5vrERg9kJBo5AWGmxZDhzDo+WVIJqkB0cGA==", - "dev": true, - "license": "MIT", - "dependencies": { - "copy-anything": "^4" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/tabbable": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.3.0.tgz", - "integrity": "sha512-EIHvdY5bPLuWForiR/AN2Bxngzpuwn1is4asboytXtpTgsArc+WmSJKVLlhdh71u7jFcryDqB2A8lQvj78MkyQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/tinyexec": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz", - "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/tinyglobby": { - "version": "0.2.15", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", - "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "fdir": "^6.5.0", - "picomatch": "^4.0.3" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/SuperchupuDev" - } - }, - "node_modules/trim-lines": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", - "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/ts-dedent": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/ts-dedent/-/ts-dedent-2.2.0.tgz", - "integrity": "sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.10" - } - }, - "node_modules/ufo": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.1.tgz", - "integrity": "sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==", - "dev": true, - "license": "MIT" - }, - "node_modules/unist-util-is": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.1.tgz", - "integrity": "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-position": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", - "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-stringify-position": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", - "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-visit": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz", - "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-is": "^6.0.0", - "unist-util-visit-parents": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-visit-parents": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz", - "integrity": "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-is": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/uuid": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz", - "integrity": "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==", - "dev": true, - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "license": "MIT", - "bin": { - "uuid": "dist/esm/bin/uuid" - } - }, - "node_modules/vfile": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", - "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "vfile-message": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/vfile-message": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz", - "integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-stringify-position": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/vite": { - "version": "7.2.4", - "resolved": "https://registry.npmjs.org/vite/-/vite-7.2.4.tgz", - "integrity": "sha512-NL8jTlbo0Tn4dUEXEsUg8KeyG/Lkmc4Fnzb8JXN/Ykm9G4HNImjtABMJgkQoVjOBN/j2WAwDTRytdqJbZsah7w==", - "dev": true, - "license": "MIT", - "dependencies": { - "esbuild": "^0.25.0", - "fdir": "^6.5.0", - "picomatch": "^4.0.3", - "postcss": "^8.5.6", - "rollup": "^4.43.0", - "tinyglobby": "^0.2.15" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^20.19.0 || >=22.12.0", - "jiti": ">=1.21.0", - "less": "^4.0.0", - "lightningcss": "^1.21.0", - "sass": "^1.70.0", - "sass-embedded": "^1.70.0", - "stylus": ">=0.54.8", - "sugarss": "^5.0.0", - "terser": "^5.16.0", - "tsx": "^4.8.1", - "yaml": "^2.4.2" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "jiti": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - }, - "tsx": { - "optional": true - }, - "yaml": { - "optional": true - } - } - }, - "node_modules/vitepress": { - "version": "2.0.0-alpha.15", - "resolved": "https://registry.npmjs.org/vitepress/-/vitepress-2.0.0-alpha.15.tgz", - "integrity": "sha512-jhjSYd10Z6RZiKOa7jy0xMVf5NB5oSc/lS3bD/QoUc6V8PrvQR5JhC9104NEt6+oTGY/ftieVWxY9v7YI+1IjA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@docsearch/css": "^4.3.2", - "@docsearch/js": "^4.3.2", - "@iconify-json/simple-icons": "^1.2.59", - "@shikijs/core": "^3.15.0", - "@shikijs/transformers": "^3.15.0", - "@shikijs/types": "^3.15.0", - "@types/markdown-it": "^14.1.2", - "@vitejs/plugin-vue": "^6.0.1", - "@vue/devtools-api": "^8.0.5", - "@vue/shared": "^3.5.24", - "@vueuse/core": "^14.0.0", - "@vueuse/integrations": "^14.0.0", - "focus-trap": "^7.6.6", - "mark.js": "8.11.1", - "minisearch": "^7.2.0", - "shiki": "^3.15.0", - "vite": "^7.2.2", - "vue": "^3.5.24" - }, - "bin": { - "vitepress": "bin/vitepress.js" - }, - "peerDependencies": { - "markdown-it-mathjax3": "^4", - "oxc-minify": "*", - "postcss": "^8" - }, - "peerDependenciesMeta": { - "markdown-it-mathjax3": { - "optional": true - }, - "oxc-minify": { - "optional": true - }, - "postcss": { - "optional": true - } - } - }, - "node_modules/vscode-jsonrpc": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.2.0.tgz", - "integrity": "sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/vscode-languageserver": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-9.0.1.tgz", - "integrity": "sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g==", - "dev": true, - "license": "MIT", - "dependencies": { - "vscode-languageserver-protocol": "3.17.5" - }, - "bin": { - "installServerIntoExtension": "bin/installServerIntoExtension" - } - }, - "node_modules/vscode-languageserver-protocol": { - "version": "3.17.5", - "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.5.tgz", - "integrity": "sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==", - "dev": true, - "license": "MIT", - "dependencies": { - "vscode-jsonrpc": "8.2.0", - "vscode-languageserver-types": "3.17.5" - } - }, - "node_modules/vscode-languageserver-textdocument": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.12.tgz", - "integrity": "sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA==", - "dev": true, - "license": "MIT" - }, - "node_modules/vscode-languageserver-types": { - "version": "3.17.5", - "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.5.tgz", - "integrity": "sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==", - "dev": true, - "license": "MIT" - }, - "node_modules/vscode-uri": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.8.tgz", - "integrity": "sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==", - "dev": true, - "license": "MIT" - }, - "node_modules/vue": { - "version": "3.5.25", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.25.tgz", - "integrity": "sha512-YLVdgv2K13WJ6n+kD5owehKtEXwdwXuj2TTyJMsO7pSeKw2bfRNZGjhB7YzrpbMYj5b5QsUebHpOqR3R3ziy/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vue/compiler-dom": "3.5.25", - "@vue/compiler-sfc": "3.5.25", - "@vue/runtime-dom": "3.5.25", - "@vue/server-renderer": "3.5.25", - "@vue/shared": "3.5.25" - }, - "peerDependencies": { - "typescript": "*" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/zwitch": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", - "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - } - } -} diff --git a/docs/package.json b/docs/package.json index 4c80879..a85a143 100644 --- a/docs/package.json +++ b/docs/package.json @@ -2,6 +2,8 @@ "name": "git-iris-docs", "version": "1.0.0", "private": true, + "type": "module", + "packageManager": "pnpm@12.3.4", "description": "Git-Iris Documentation", "scripts": { "dev": "vitepress dev", @@ -12,8 +14,8 @@ "format": "pnpm lint:fix" }, "devDependencies": { - "mermaid": "^11.12.1", - "prettier": "^3.7.1", - "vitepress": "^2.0.0-alpha.15" + "mermaid": "^11.17.2", + "prettier": "^3.9.6", + "vitepress": "2.0.0-alpha.20" } } diff --git a/docs/pnpm-lock.yaml b/docs/pnpm-lock.yaml index 095c4d7..0f51333 100644 --- a/docs/pnpm-lock.yaml +++ b/docs/pnpm-lock.yaml @@ -1,391 +1,309 @@ +--- lockfileVersion: '9.0' -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false - importers: .: - devDependencies: - mermaid: - specifier: ^11.12.1 - version: 11.14.0 - prettier: - specifier: ^3.7.1 - version: 3.8.1 - vitepress: - specifier: ^2.0.0-alpha.15 - version: 2.0.0-alpha.17(postcss@8.5.9) + configDependencies: {} + packageManagerDependencies: + pnpm: + specifier: 12.3.4 + version: 12.3.4 packages: - '@antfu/install-pkg@1.1.0': - resolution: {integrity: sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ==} - - '@babel/helper-string-parser@7.27.1': - resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} - engines: {node: '>=6.9.0'} - - '@babel/helper-validator-identifier@7.28.5': - resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} - engines: {node: '>=6.9.0'} - - '@babel/parser@7.29.2': - resolution: {integrity: sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==} - engines: {node: '>=6.0.0'} - hasBin: true - - '@babel/types@7.29.0': - resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==} - engines: {node: '>=6.9.0'} - - '@braintree/sanitize-url@7.1.2': - resolution: {integrity: sha512-jigsZK+sMF/cuiB7sERuo9V7N9jx+dhmHHnQyDSVdpZwVutaBu7WvNYqMDLSgFgfB30n452TP3vjDAvFC973mA==} - - '@chevrotain/cst-dts-gen@12.0.0': - resolution: {integrity: sha512-fSL4KXjTl7cDgf0B5Rip9Q05BOrYvkJV/RrBTE/bKDN096E4hN/ySpcBK5B24T76dlQ2i32Zc3PAE27jFnFrKg==} - - '@chevrotain/gast@12.0.0': - resolution: {integrity: sha512-1ne/m3XsIT8aEdrvT33so0GUC+wkctpUPK6zU9IlOyJLUbR0rg4G7ZiApiJbggpgPir9ERy3FRjT6T7lpgetnQ==} + '@pnpm/exe.darwin-arm64@12.3.4': + resolution: {integrity: sha512-PAyUol8T1+/+ViOiXAt51ECA+QnfXCqz6foL4bW+LsoX0NcVd5XVEM2mRQu+LV4oc7uRz9zf9U0P+XFfuQeDAw==} + cpu: [arm64] + os: [darwin] - '@chevrotain/regexp-to-ast@12.0.0': - resolution: {integrity: sha512-p+EW9MaJwgaHguhoqwOtx/FwuGr+DnNn857sXWOi/mClXIkPGl3rn7hGNWvo31HA3vyeQxjqe+H36yZJwYU8cA==} + '@pnpm/exe.darwin-x64@12.3.4': + resolution: {integrity: sha512-fxP9JCk0Cdye+ePuj+GJJLMUMTqHGWRdb1dtv4How876uQ2ehxvenpgiYAir/ceO9PsYUZkFTtyZdx+rRu5QOA==} + cpu: [x64] + os: [darwin] - '@chevrotain/types@12.0.0': - resolution: {integrity: sha512-S+04vjFQKeuYw0/eW3U52LkAHQsB1ASxsPGsLPUyQgrZ2iNNibQrsidruDzjEX2JYfespXMG0eZmXlhA6z7nWA==} + '@pnpm/exe.linux-arm64-musl@12.3.4': + resolution: {integrity: sha512-FBOt0/7ye6O6q4AllVV5QMviB6qE6fqkeczV/+MDWQsmo+QJrlfsh6X7CpH/tClVpBZEyIbjpUoT8bNhCYBxEg==} + cpu: [arm64] + os: [linux] + libc: [musl] - '@chevrotain/utils@12.0.0': - resolution: {integrity: sha512-lB59uJoaGIfOOL9knQqQRfhl9g7x8/wqFkp13zTdkRu1huG9kg6IJs1O8hqj9rs6h7orGxHJUKb+mX3rPbWGhA==} + '@pnpm/exe.linux-arm64@12.3.4': + resolution: {integrity: sha512-t71AVA7LRqiKTyZ5xMYaZc2n5DfdpMbfokZuiIOXHBOM03ECnF0t4iYwaBDqJgVjlKYUOwaF/bRQajGNA4cJ4w==} + cpu: [arm64] + os: [linux] + libc: [glibc] - '@docsearch/css@4.6.2': - resolution: {integrity: sha512-fH/cn8BjEEdM2nJdjNMHIvOVYupG6AIDtFVDgIZrNzdCSj4KXr9kd+hsehqsNGYjpUjObeKYKvgy/IwCb1jZYQ==} + '@pnpm/exe.linux-x64-musl@12.3.4': + resolution: {integrity: sha512-RPmk7Jb/aYaFvL2iyDN/AtMY+hUEsue732WmXpcuQ9tBpMnGyA5py7Z3+e+qmQaJ0zY/4ni9jJiyPBQHujmv6w==} + cpu: [x64] + os: [linux] + libc: [musl] - '@docsearch/js@4.6.2': - resolution: {integrity: sha512-qj1yoxl3y4GKoK7+VM6fq/rQqPnvUmg3IKzJ9x0VzN14QVzdB/SG/J6VfV1BWT5RcPUFxIcVwoY1fwHM2fSRRw==} + '@pnpm/exe.linux-x64@12.3.4': + resolution: {integrity: sha512-2ZqOlSPkfwX1h5cR+FPiWf8+F+2hZT/3TvhUK5sigHqwaQCIiq8R7CGxhndKs63JtcLi2a1Qpo+wX/EoyfjyJQ==} + cpu: [x64] + os: [linux] + libc: [glibc] - '@docsearch/sidepanel-js@4.6.2': - resolution: {integrity: sha512-Pni85AP/GwRj7fFg8cBJp0U04tzbueBvWSd3gysgnOsVnQVSZwSYncfErUScLE1CAtR+qocPDFjmYR9AMRNJtQ==} + '@pnpm/exe.win32-arm64@12.3.4': + resolution: {integrity: sha512-ANyrHqyqco6SXBysUTRF74itDyyraea7IbFsKFdNXTjcFnfycTDx37EwuhdpPYFNSIh2JhUG4fByclsRfiHX7w==} + cpu: [arm64] + os: [win32] - '@esbuild/aix-ppc64@0.27.7': - resolution: {integrity: sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [aix] + '@pnpm/exe.win32-x64@12.3.4': + resolution: {integrity: sha512-WH/KqBPY/hq2Tb7SgQltEZytimcjgKRaCRL/aM9CI0c67iKc5TVmHUhIiL3Ux9FB4bWn36i6XewUcScQI+zG8w==} + cpu: [x64] + os: [win32] - '@esbuild/android-arm64@0.27.7': - resolution: {integrity: sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ==} - engines: {node: '>=18'} - cpu: [arm64] - os: [android] + pnpm@12.3.4: + resolution: {integrity: sha512-lhqkH7B32joEpEHZ+OFevAyW2o73ELLrZ7+e58sGEOq9SPH9hfUc/+c4RnhfoPh8VqOocqHYk/hEZ0G1zORUVw==} + engines: {node: '>=18.*'} + hasBin: true - '@esbuild/android-arm@0.27.7': - resolution: {integrity: sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ==} - engines: {node: '>=18'} - cpu: [arm] - os: [android] +snapshots: - '@esbuild/android-x64@0.27.7': - resolution: {integrity: sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg==} - engines: {node: '>=18'} - cpu: [x64] - os: [android] + '@pnpm/exe.darwin-arm64@12.3.4': + optional: true - '@esbuild/darwin-arm64@0.27.7': - resolution: {integrity: sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw==} - engines: {node: '>=18'} - cpu: [arm64] - os: [darwin] + '@pnpm/exe.darwin-x64@12.3.4': + optional: true - '@esbuild/darwin-x64@0.27.7': - resolution: {integrity: sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ==} - engines: {node: '>=18'} - cpu: [x64] - os: [darwin] + '@pnpm/exe.linux-arm64-musl@12.3.4': + optional: true - '@esbuild/freebsd-arm64@0.27.7': - resolution: {integrity: sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w==} - engines: {node: '>=18'} - cpu: [arm64] - os: [freebsd] + '@pnpm/exe.linux-arm64@12.3.4': + optional: true - '@esbuild/freebsd-x64@0.27.7': - resolution: {integrity: sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ==} - engines: {node: '>=18'} - cpu: [x64] - os: [freebsd] + '@pnpm/exe.linux-x64-musl@12.3.4': + optional: true - '@esbuild/linux-arm64@0.27.7': - resolution: {integrity: sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A==} - engines: {node: '>=18'} - cpu: [arm64] - os: [linux] + '@pnpm/exe.linux-x64@12.3.4': + optional: true - '@esbuild/linux-arm@0.27.7': - resolution: {integrity: sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA==} - engines: {node: '>=18'} - cpu: [arm] - os: [linux] + '@pnpm/exe.win32-arm64@12.3.4': + optional: true - '@esbuild/linux-ia32@0.27.7': - resolution: {integrity: sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg==} - engines: {node: '>=18'} - cpu: [ia32] - os: [linux] + '@pnpm/exe.win32-x64@12.3.4': + optional: true - '@esbuild/linux-loong64@0.27.7': - resolution: {integrity: sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q==} - engines: {node: '>=18'} - cpu: [loong64] - os: [linux] + pnpm@12.3.4: + optionalDependencies: + '@pnpm/exe.darwin-arm64': 12.3.4 + '@pnpm/exe.darwin-x64': 12.3.4 + '@pnpm/exe.linux-arm64': 12.3.4 + '@pnpm/exe.linux-arm64-musl': 12.3.4 + '@pnpm/exe.linux-x64': 12.3.4 + '@pnpm/exe.linux-x64-musl': 12.3.4 + '@pnpm/exe.win32-arm64': 12.3.4 + '@pnpm/exe.win32-x64': 12.3.4 + +--- +lockfileVersion: '9.0' - '@esbuild/linux-mips64el@0.27.7': - resolution: {integrity: sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw==} - engines: {node: '>=18'} - cpu: [mips64el] - os: [linux] +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false - '@esbuild/linux-ppc64@0.27.7': - resolution: {integrity: sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [linux] +importers: - '@esbuild/linux-riscv64@0.27.7': - resolution: {integrity: sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ==} - engines: {node: '>=18'} - cpu: [riscv64] - os: [linux] + .: + devDependencies: + mermaid: + specifier: ^11.17.2 + version: 11.17.2 + prettier: + specifier: ^3.9.6 + version: 3.9.6 + vitepress: + specifier: 2.0.0-alpha.20 + version: 2.0.0-alpha.20 - '@esbuild/linux-s390x@0.27.7': - resolution: {integrity: sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw==} - engines: {node: '>=18'} - cpu: [s390x] - os: [linux] +packages: - '@esbuild/linux-x64@0.27.7': - resolution: {integrity: sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA==} - engines: {node: '>=18'} - cpu: [x64] - os: [linux] + '@antfu/install-pkg@2.0.1': + resolution: {integrity: sha512-iCKVQcIC0e3oDxEfs3SHQGW+ovhBMZmS1TE+bTk50rVyMCBmCfClv7Qi3HQKlumYwvjb/iIMeWCW2i67q6kFfQ==} - '@esbuild/netbsd-arm64@0.27.7': - resolution: {integrity: sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w==} - engines: {node: '>=18'} - cpu: [arm64] - os: [netbsd] + '@babel/helper-string-parser@7.29.7': + resolution: {integrity: sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==} + engines: {node: '>=6.9.0'} - '@esbuild/netbsd-x64@0.27.7': - resolution: {integrity: sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw==} - engines: {node: '>=18'} - cpu: [x64] - os: [netbsd] + '@babel/helper-validator-identifier@7.29.7': + resolution: {integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==} + engines: {node: '>=6.9.0'} - '@esbuild/openbsd-arm64@0.27.7': - resolution: {integrity: sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A==} - engines: {node: '>=18'} - cpu: [arm64] - os: [openbsd] + '@babel/parser@7.29.8': + resolution: {integrity: sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==} + engines: {node: '>=6.0.0'} + hasBin: true - '@esbuild/openbsd-x64@0.27.7': - resolution: {integrity: sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg==} - engines: {node: '>=18'} - cpu: [x64] - os: [openbsd] + '@babel/types@7.29.8': + resolution: {integrity: sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==} + engines: {node: '>=6.9.0'} - '@esbuild/openharmony-arm64@0.27.7': - resolution: {integrity: sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw==} - engines: {node: '>=18'} - cpu: [arm64] - os: [openharmony] + '@braintree/sanitize-url@7.1.2': + resolution: {integrity: sha512-jigsZK+sMF/cuiB7sERuo9V7N9jx+dhmHHnQyDSVdpZwVutaBu7WvNYqMDLSgFgfB30n452TP3vjDAvFC973mA==} - '@esbuild/sunos-x64@0.27.7': - resolution: {integrity: sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA==} - engines: {node: '>=18'} - cpu: [x64] - os: [sunos] + '@chevrotain/types@11.1.2': + resolution: {integrity: sha512-U+HFai5+zmJCkK86QsaJtoITlboZHBqrVketcO2ROv865xfCMSFpELQoz1GkX5GzME8pTa+3kbKrZHQtI0gdbw==} - '@esbuild/win32-arm64@0.27.7': - resolution: {integrity: sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA==} - engines: {node: '>=18'} - cpu: [arm64] - os: [win32] + '@docsearch/css@4.7.0': + resolution: {integrity: sha512-Sk5xkdRFeE7PeWjG9l4AfTwdvMfr9wHiwNNCpHXT4v4SNyNMKdHGvEILc31BgaVFGDDNbv5u/a73tofRiwbEZw==} - '@esbuild/win32-ia32@0.27.7': - resolution: {integrity: sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw==} - engines: {node: '>=18'} - cpu: [ia32] - os: [win32] + '@docsearch/js@4.7.0': + resolution: {integrity: sha512-x5lCqu1tetgsJFkjQ6VSocbHldsRkGEgwg5N98Vx21sq/V5wcmj4u226PY9k+TEpIgQ772zlYbPLTPicWyGnpA==} - '@esbuild/win32-x64@0.27.7': - resolution: {integrity: sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg==} - engines: {node: '>=18'} - cpu: [x64] - os: [win32] + '@docsearch/sidepanel-js@4.7.0': + resolution: {integrity: sha512-A8r34jCU8kcIk2viECEn2msA28ojUF1BLi/3v5OWWc5G2N3jOuuumBXoeYjfr8dA0UxgFSy5R2bt12dnFJQSyA==} - '@iconify-json/simple-icons@1.2.77': - resolution: {integrity: sha512-oaENvo6C3BkAEWMlcQA3XemxU9v2SFOTlApSUCODAkIu1haeLCjzrmH3HgmGqjRnJjM+LevO8sA+MgdMHBFBDA==} + '@iconify-json/simple-icons@1.2.94': + resolution: {integrity: sha512-l8UWzVxKaqZd9ABsE/M/9p6NyGkQnmCnOoZyhQmjlXCtY5PuL2rcWxOFk2l9pk7ux3ERMPkTLE4jl6kQpTkwxA==} '@iconify/types@2.0.0': resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} - '@iconify/utils@3.1.0': - resolution: {integrity: sha512-Zlzem1ZXhI1iHeeERabLNzBHdOa4VhQbqAcOQaMKuTuyZCpwKbC2R4Dd0Zo3g9EAc+Y4fiarO8HIHRAth7+skw==} + '@iconify/utils@3.1.5': + resolution: {integrity: sha512-nT+AWyh5caHY6xa0PdLXpUooIz6l7qsT+adqsCTYBfbdn5Q18VrWs2fvuTa7KEoJnPBfEPqWkmAIht0EHtCi2A==} - '@jridgewell/sourcemap-codec@1.5.5': - resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + '@jridgewell/sourcemap-codec@1.6.0': + resolution: {integrity: sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==} - '@mermaid-js/parser@1.1.0': - resolution: {integrity: sha512-gxK9ZX2+Fex5zu8LhRQoMeMPEHbc73UKZ0FQ54YrQtUxE1VVhMwzeNtKRPAu5aXks4FasbMe4xB4bWrmq6Jlxw==} + '@mermaid-js/parser@1.2.1': + resolution: {integrity: sha512-n12NohV3mrUyUL2o93IgG/ifeW9FTyeJn3zDxkhwa8MJ9Fxg3HQMlA3RiGmD/3UnJvheztkjjQAjA2T4LmUcpw==} - '@rolldown/pluginutils@1.0.0-rc.2': - resolution: {integrity: sha512-izyXV/v+cHiRfozX62W9htOAvwMo4/bXKDrQ+vom1L1qRuexPock/7VZDAhnpHCLNejd3NJ6hiab+tO0D44Rgw==} + '@oxc-project/types@0.148.0': + resolution: {integrity: sha512-Nm4s/jB+4FpFsPhWGEC4h7rzksesmtnMXomo6rCMcg/b8zLQuOziRgkCS1fxDCXOlJB/6Q8oABOZ/OP6RIPj9A==} - '@rollup/rollup-android-arm-eabi@4.60.1': - resolution: {integrity: sha512-d6FinEBLdIiK+1uACUttJKfgZREXrF0Qc2SmLII7W2AD8FfiZ9Wjd+rD/iRuf5s5dWrr1GgwXCvPqOuDquOowA==} + '@rolldown/binding-android-arm-eabi@1.2.7': + resolution: {integrity: sha512-EypzgnYCwyVY4NDHKzGmNJT5b+XaQEBniHxsMdeIQLB/tcCzZnhqrzHpZFbX9iaxx+5RiB8caATBtfvZP7zVxQ==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.60.1': - resolution: {integrity: sha512-YjG/EwIDvvYI1YvYbHvDz/BYHtkY4ygUIXHnTdLhG+hKIQFBiosfWiACWortsKPKU/+dUwQQCKQM3qrDe8c9BA==} + '@rolldown/binding-android-arm64@1.2.7': + resolution: {integrity: sha512-l17HE9EweWaqJZhuUuNBN/FzM62xw+DECVnJyvMsxn8vJFAGLy5QfLDoYAcronkAN8VxKZHezDpulHDPx95vFw==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.60.1': - resolution: {integrity: sha512-mjCpF7GmkRtSJwon+Rq1N8+pI+8l7w5g9Z3vWj4T7abguC4Czwi3Yu/pFaLvA3TTeMVjnu3ctigusqWUfjZzvw==} + '@rolldown/binding-darwin-arm64@1.2.7': + resolution: {integrity: sha512-8ED8ELFvHXc6OCETIn4gXObPiaR6bckM/ipXtbzlPVDRMBfEGjCKgO90F9YtfdpDatVx/ZQw7aZ1vUMf/+T3Mw==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.60.1': - resolution: {integrity: sha512-haZ7hJ1JT4e9hqkoT9R/19XW2QKqjfJVv+i5AGg57S+nLk9lQnJ1F/eZloRO3o9Scy9CM3wQ9l+dkXtcBgN5Ew==} + '@rolldown/binding-darwin-x64@1.2.7': + resolution: {integrity: sha512-/WPripjtiAIZ2tWY7ddijORT0Ujg87wxWW/qcoFVCKAWVDPhtY0xr7Dj0M3GyNGz60jGwTElhro/mkF9dT7dDQ==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.60.1': - resolution: {integrity: sha512-czw90wpQq3ZsAVBlinZjAYTKduOjTywlG7fEeWKUA7oCmpA8xdTkxZZlwNJKWqILlq0wehoZcJYfBvOyhPTQ6w==} - cpu: [arm64] - os: [freebsd] - - '@rollup/rollup-freebsd-x64@4.60.1': - resolution: {integrity: sha512-KVB2rqsxTHuBtfOeySEyzEOB7ltlB/ux38iu2rBQzkjbwRVlkhAGIEDiiYnO2kFOkJp+Z7pUXKyrRRFuFUKt+g==} + '@rolldown/binding-freebsd-x64@1.2.7': + resolution: {integrity: sha512-14DI4NcqpvbICxSnGLx3PmtDaWqRP/KGSGb6C+JLLVPeZRl6dKdHba3pGsqT3vpdTqhEYIPG0MMQ8c0xYqoJxA==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.60.1': - resolution: {integrity: sha512-L+34Qqil+v5uC0zEubW7uByo78WOCIrBvci69E7sFASRl0X7b/MB6Cqd1lky/CtcSVTydWa2WZwFuWexjS5o6g==} - cpu: [arm] - os: [linux] - - '@rollup/rollup-linux-arm-musleabihf@4.60.1': - resolution: {integrity: sha512-n83O8rt4v34hgFzlkb1ycniJh7IR5RCIqt6mz1VRJD6pmhRi0CXdmfnLu9dIUS6buzh60IvACM842Ffb3xd6Gg==} + '@rolldown/binding-linux-arm-gnueabihf@1.2.7': + resolution: {integrity: sha512-bxrWIRvHWQvbJwi+VIie/kDJmQxcNE6xxWwZdqF/ExVAigtHkv54WTLQPb+QsZdnFy18fg7JPfWGL0RH6vwIlQ==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.60.1': - resolution: {integrity: sha512-Nql7sTeAzhTAja3QXeAI48+/+GjBJ+QmAH13snn0AJSNL50JsDqotyudHyMbO2RbJkskbMbFJfIJKWA6R1LCJQ==} + '@rolldown/binding-linux-arm64-gnu@1.2.7': + resolution: {integrity: sha512-toOY2BChBZyuxU7OYX6Tn389di4IzAqPTycVcci0O7FSfBqzRB3RZn+K5Is6ANf4tmgRd/K1yZTsNTXbkXsnLg==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] + libc: [glibc] - '@rollup/rollup-linux-arm64-musl@4.60.1': - resolution: {integrity: sha512-+pUymDhd0ys9GcKZPPWlFiZ67sTWV5UU6zOJat02M1+PiuSGDziyRuI/pPue3hoUwm2uGfxdL+trT6Z9rxnlMA==} + '@rolldown/binding-linux-arm64-musl@1.2.7': + resolution: {integrity: sha512-lAIXTH/aiLRLxsTgQvfhjo4K1ydWIp00+V0voOr9beb/9ZmkUFrSIb03dXNFRgMNvkE6oGsF10ioQ6UsI+vS5Q==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] + libc: [musl] - '@rollup/rollup-linux-loong64-gnu@4.60.1': - resolution: {integrity: sha512-VSvgvQeIcsEvY4bKDHEDWcpW4Yw7BtlKG1GUT4FzBUlEKQK0rWHYBqQt6Fm2taXS+1bXvJT6kICu5ZwqKCnvlQ==} - cpu: [loong64] - os: [linux] - - '@rollup/rollup-linux-loong64-musl@4.60.1': - resolution: {integrity: sha512-4LqhUomJqwe641gsPp6xLfhqWMbQV04KtPp7/dIp0nzPxAkNY1AbwL5W0MQpcalLYk07vaW9Kp1PBhdpZYYcEw==} - cpu: [loong64] - os: [linux] - - '@rollup/rollup-linux-ppc64-gnu@4.60.1': - resolution: {integrity: sha512-tLQQ9aPvkBxOc/EUT6j3pyeMD6Hb8QF2BTBnCQWP/uu1lhc9AIrIjKnLYMEroIz/JvtGYgI9dF3AxHZNaEH0rw==} - cpu: [ppc64] - os: [linux] - - '@rollup/rollup-linux-ppc64-musl@4.60.1': - resolution: {integrity: sha512-RMxFhJwc9fSXP6PqmAz4cbv3kAyvD1etJFjTx4ONqFP9DkTkXsAMU4v3Vyc5BgzC+anz7nS/9tp4obsKfqkDHg==} + '@rolldown/binding-linux-ppc64-gnu@1.2.7': + resolution: {integrity: sha512-kdnwS28Pkenp/mZMRwjXXXwxQ7pIsm+bF919LUK93BOyhcLsrVKdP2p9fxpiPNPAbNuch8ypQt0pm2P2LYCAGg==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [ppc64] os: [linux] + libc: [glibc] - '@rollup/rollup-linux-riscv64-gnu@4.60.1': - resolution: {integrity: sha512-QKgFl+Yc1eEk6MmOBfRHYF6lTxiiiV3/z/BRrbSiW2I7AFTXoBFvdMEyglohPj//2mZS4hDOqeB0H1ACh3sBbg==} - cpu: [riscv64] - os: [linux] - - '@rollup/rollup-linux-riscv64-musl@4.60.1': - resolution: {integrity: sha512-RAjXjP/8c6ZtzatZcA1RaQr6O1TRhzC+adn8YZDnChliZHviqIjmvFwHcxi4JKPSDAt6Uhf/7vqcBzQJy0PDJg==} - cpu: [riscv64] - os: [linux] - - '@rollup/rollup-linux-s390x-gnu@4.60.1': - resolution: {integrity: sha512-wcuocpaOlaL1COBYiA89O6yfjlp3RwKDeTIA0hM7OpmhR1Bjo9j31G1uQVpDlTvwxGn2nQs65fBFL5UFd76FcQ==} + '@rolldown/binding-linux-s390x-gnu@1.2.7': + resolution: {integrity: sha512-516OdsyLdr5E65paF3yBF55t8mfm9+gmtCsK3xI7XKXIT7EfRlHhxL8K/NR6Hu8BWSgF5+1w74lTL0+nxcc8Qw==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] + libc: [glibc] - '@rollup/rollup-linux-x64-gnu@4.60.1': - resolution: {integrity: sha512-77PpsFQUCOiZR9+LQEFg9GClyfkNXj1MP6wRnzYs0EeWbPcHs02AXu4xuUbM1zhwn3wqaizle3AEYg5aeoohhg==} + '@rolldown/binding-linux-x64-gnu@1.2.7': + resolution: {integrity: sha512-r8/z8n7GFaYRln3xmP1Cxy0HH/HLM0uBUPkEuSVEfKGDA89M0FsZRZJRSwe/tJjRx+fpH/gjorfhB8tmEbSFLA==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] + libc: [glibc] - '@rollup/rollup-linux-x64-musl@4.60.1': - resolution: {integrity: sha512-5cIATbk5vynAjqqmyBjlciMJl1+R/CwX9oLk/EyiFXDWd95KpHdrOJT//rnUl4cUcskrd0jCCw3wpZnhIHdD9w==} + '@rolldown/binding-linux-x64-musl@1.2.7': + resolution: {integrity: sha512-pAsE8iiDxUg1xBqdhrTfg45AVDVpirjz00sblEYClGNNcMnDb+e8beQgqIAw6LvauX/APvgxUnwrgun/YYGBhw==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] + libc: [musl] - '@rollup/rollup-openbsd-x64@4.60.1': - resolution: {integrity: sha512-cl0w09WsCi17mcmWqqglez9Gk8isgeWvoUZ3WiJFYSR3zjBQc2J5/ihSjpl+VLjPqjQ/1hJRcqBfLjssREQILw==} - cpu: [x64] - os: [openbsd] - - '@rollup/rollup-openharmony-arm64@4.60.1': - resolution: {integrity: sha512-4Cv23ZrONRbNtbZa37mLSueXUCtN7MXccChtKpUnQNgF010rjrjfHx3QxkS2PI7LqGT5xXyYs1a7LbzAwT0iCA==} + '@rolldown/binding-openharmony-arm64@1.2.7': + resolution: {integrity: sha512-lTcIYmmnQQA8Or/2DatS6oSqcdLHvendjS+zLu+FwgToynWMRSmQdpM65fTANJgIS4mjbMOo5KT2lnT9SAb96w==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] - '@rollup/rollup-win32-arm64-msvc@4.60.1': - resolution: {integrity: sha512-i1okWYkA4FJICtr7KpYzFpRTHgy5jdDbZiWfvny21iIKky5YExiDXP+zbXzm3dUcFpkEeYNHgQ5fuG236JPq0g==} + '@rolldown/binding-win32-arm64-msvc@1.2.7': + resolution: {integrity: sha512-e3Gu3WxbNk/UqQhxqU7YIYO+9ZBvWNz3U+h/qRFosscMFzdRPbXYSaSWgSnklv2fz1TgzBTcti2z35c/7irsHw==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.60.1': - resolution: {integrity: sha512-u09m3CuwLzShA0EYKMNiFgcjjzwqtUMLmuCJLeZWjjOYA3IT2Di09KaxGBTP9xVztWyIWjVdsB2E9goMjZvTQg==} - cpu: [ia32] - os: [win32] - - '@rollup/rollup-win32-x64-gnu@4.60.1': - resolution: {integrity: sha512-k+600V9Zl1CM7eZxJgMyTUzmrmhB/0XZnF4pRypKAlAgxmedUA+1v9R+XOFv56W4SlHEzfeMtzujLJD22Uz5zg==} + '@rolldown/binding-win32-x64-msvc@1.2.7': + resolution: {integrity: sha512-W/jg5qoRSqjsEv0+dZi4e687mcHqmVuU0P4fK6qS/xjetW2Gmc1W8j//z5nAeNcC8Ttm0hV46IjcYeuVwYhuiw==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.60.1': - resolution: {integrity: sha512-lWMnixq/QzxyhTV6NjQJ4SFo1J6PvOX8vUx5Wb4bBPsEb+8xZ89Bz6kOXpfXj9ak9AHTQVQzlgzBEc1SyM27xQ==} - cpu: [x64] - os: [win32] + '@rolldown/pluginutils@1.0.1': + resolution: {integrity: sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==} + + '@shikijs/core@4.4.3': + resolution: {integrity: sha512-QCR4q2ZO/ILJEuwiBMel4wdcTDb1JGwfjKTxPDF6x8ixOaluPrVqIn06C99AcRPhmYlBR56d/Fb+GN58GzExpg==} + engines: {node: '>=20'} - '@shikijs/core@3.23.0': - resolution: {integrity: sha512-NSWQz0riNb67xthdm5br6lAkvpDJRTgB36fxlo37ZzM2yq0PQFFzbd8psqC2XMPgCzo1fW6cVi18+ArJ44wqgA==} + '@shikijs/engine-javascript@4.4.3': + resolution: {integrity: sha512-FbOjFJp9VLdo1Wevs10BBtVxiTWwNLqZh5Gkhjgda/ioL15YOgeSl9n+6XMa3qRlPQzfhFNe641SrynFHYG0nQ==} + engines: {node: '>=20'} - '@shikijs/engine-javascript@3.23.0': - resolution: {integrity: sha512-aHt9eiGFobmWR5uqJUViySI1bHMqrAgamWE1TYSUoftkAeCCAiGawPMwM+VCadylQtF4V3VNOZ5LmfItH5f3yA==} + '@shikijs/engine-oniguruma@4.4.3': + resolution: {integrity: sha512-EcOQkxdxGQrc1Row/cC2c96/v1dbZqGnEVu1qTuT/MJmp6+cXCvQussowVmCv5Tqr3KuY3c7IbM6HTW3LJ1k9w==} + engines: {node: '>=20'} - '@shikijs/engine-oniguruma@3.23.0': - resolution: {integrity: sha512-1nWINwKXxKKLqPibT5f4pAFLej9oZzQTsby8942OTlsJzOBZ0MWKiwzMsd+jhzu8YPCHAswGnnN1YtQfirL35g==} + '@shikijs/langs@4.4.3': + resolution: {integrity: sha512-ePic0yfAJGOF83D5wBHK/00EjK65oahBYxFk5epgq33WRv7X9UuxLEV8PtR0szC0z8dl7INIpIodB99JRFlR+A==} + engines: {node: '>=20'} - '@shikijs/langs@3.23.0': - resolution: {integrity: sha512-2Ep4W3Re5aB1/62RSYQInK9mM3HsLeB91cHqznAJMuylqjzNVAVCMnNWRHFtcNHXsoNRayP9z1qj4Sq3nMqYXg==} + '@shikijs/primitive@4.4.3': + resolution: {integrity: sha512-m0wBeLDQDeIxRdUmrCPdQqfuUamDwRL5isCfYbguKD6NiaKpVbsv+3J81DyIKgNW5h4WAIIr8T4EkgQrBBxvaQ==} + engines: {node: '>=20'} - '@shikijs/themes@3.23.0': - resolution: {integrity: sha512-5qySYa1ZgAT18HR/ypENL9cUSGOeI2x+4IvYJu4JgVJdizn6kG4ia5Q1jDEOi7gTbN4RbuYtmHh0W3eccOrjMA==} + '@shikijs/themes@4.4.3': + resolution: {integrity: sha512-w8UHjeUnIR965KMWJHUPXOc2mNJUnK3vpVLYLvw5IYU2mnTTJ89E24OrJDBNiJDQ0qzb0tc4l7mrIXx5cFeIyw==} + engines: {node: '>=20'} - '@shikijs/transformers@3.23.0': - resolution: {integrity: sha512-F9msZVxdF+krQNSdQ4V+Ja5QemeAoTQ2jxt7nJCwhDsdF1JWS3KxIQXA3lQbyKwS3J61oHRUSv4jYWv3CkaKTQ==} + '@shikijs/transformers@4.4.3': + resolution: {integrity: sha512-oJSARV6NaWd+rnNJbtnpAdj3Zg0ZVyzsnMgb3vi3HA+35y8lBWUCpOnWsmyiXZIikY+x1BDqrQUgmxfzWh7Jvw==} + engines: {node: '>=20'} - '@shikijs/types@3.23.0': - resolution: {integrity: sha512-3JZ5HXOZfYjsYSk0yPwBrkupyYSLpAE26Qc0HLghhZNGTZg/SKxXIIgoxOpmmeQP0RRSDJTk1/vPfw9tbw+jSQ==} + '@shikijs/types@4.4.3': + resolution: {integrity: sha512-UEJxmRR++MAGR6hugn0vgVS2W/6lWAts84FFSrnlH9sP0LNol7E5+NQ792pH8liWUhyMyjhTgSUH3k7iD7tc5g==} + engines: {node: '>=20'} '@shikijs/vscode-textmate@10.0.2': resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} @@ -432,8 +350,8 @@ packages: '@types/d3-format@3.0.4': resolution: {integrity: sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g==} - '@types/d3-geo@3.1.0': - resolution: {integrity: sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ==} + '@types/d3-geo@3.1.1': + resolution: {integrity: sha512-65Emv9fQiQQqphLlRkuQ5ypPsOmWPhtBGCMv61JDPEPMvsx+gzhGf74yw1a78xFKPj6zw4AgQICJoQv0vK9M2w==} '@types/d3-hierarchy@3.1.7': resolution: {integrity: sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg==} @@ -450,8 +368,8 @@ packages: '@types/d3-quadtree@3.0.6': resolution: {integrity: sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg==} - '@types/d3-random@3.0.3': - resolution: {integrity: sha512-Imagg1vJ3y76Y2ea0871wpabqp613+8/r0mCLEBfdtqC7xMSfj9idOnmBYyMoULfHePJyxMAw3nWhJxzc+LFwQ==} + '@types/d3-random@3.0.4': + resolution: {integrity: sha512-UHYId5WTCx4L4YNel7NU00XUXXgvgpgZOvp10PuvsQENjMDXhh2RyFc0KBjO7B45ne4Ha1yVH7ii0vnzKkuzWA==} '@types/d3-scale-chromatic@3.1.0': resolution: {integrity: sha512-iWMJgwkK7yTRmWqRB5plb1kadXyQ5Sj8V/zYlFGMUBbIPKQScw+Dku9cAAMgJG+z5GYDoMjWGLVOvjghDEFnKQ==} @@ -462,8 +380,8 @@ packages: '@types/d3-selection@3.0.11': resolution: {integrity: sha512-bhAXu23DJWsrI45xafYpkQ4NtcKMwWnAC/vKrd2l+nxMFuvOT3XMYTIj2opv8vq8AO5Yh7Qac/nSeP/3zjTK0w==} - '@types/d3-shape@3.1.8': - resolution: {integrity: sha512-lae0iWfcDeR7qt7rA88BNiqdvPS5pFVPpo5OfjElwNaT2yyekbM0C9vK+yqBqEmHr6lDkRnYNoTBYlAgJa7a4w==} + '@types/d3-shape@3.2.0': + resolution: {integrity: sha512-kVd74ta9eof3eJOvbNd1vGKS/XERRyQbT26Og63hIsvDO84cjD5gEOhsXf26w3FSoNlPVz84DOFcKv/oou+fMw==} '@types/d3-time-format@4.0.3': resolution: {integrity: sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg==} @@ -483,20 +401,17 @@ packages: '@types/d3@7.4.3': resolution: {integrity: sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww==} - '@types/estree@1.0.8': - resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} - '@types/geojson@7946.0.16': resolution: {integrity: sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==} - '@types/hast@3.0.4': - resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} + '@types/hast@3.0.5': + resolution: {integrity: sha512-rp/ezSWaD1m44dPKICGhiskI13nVr7qTloFwDa/IYkhhf5nzwP+zIQcIJh3WIFSBOy/H1PzB40jPjMDksN4F+g==} '@types/linkify-it@5.0.0': resolution: {integrity: sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==} - '@types/markdown-it@14.1.2': - resolution: {integrity: sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==} + '@types/markdown-it@14.2.0': + resolution: {integrity: sha512-NoQ2yGlLWj4wpxMs+TYmRKk3thDrQ97agr7sFqfLsAlvoS8SNQuTrlObhFqG9iugdTtgOE9jpJ6FNM4ZGsa5xQ==} '@types/mdast@4.0.4': resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} @@ -513,64 +428,62 @@ packages: '@types/web-bluetooth@0.0.21': resolution: {integrity: sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==} - '@ungap/structured-clone@1.3.0': - resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} + '@ungap/structured-clone@1.4.0': + resolution: {integrity: sha512-1mEZtMKPM09vDmQt5y7YvmN2+DFTP7Tg0EWXdic8/C6VRnpb33e4ghisCIE3WZjsE2N8mf+QV1Zqh7ZFYLWInQ==} '@upsetjs/venn.js@2.0.0': resolution: {integrity: sha512-WbBhLrooyePuQ1VZxrJjtLvTc4NVfpOyKx0sKqioq9bX1C1m7Jgykkn8gLrtwumBioXIqam8DLxp88Adbue6Hw==} - '@vitejs/plugin-vue@6.0.5': - resolution: {integrity: sha512-bL3AxKuQySfk1iGcBsQnoRVexTPJq0Z/ixFVM8OhVJAP6ZXXXLtM7NFKWhLl30Kg7uTBqIaPXbh+nuQCuBDedg==} + '@vitejs/plugin-vue@6.0.8': + resolution: {integrity: sha512-0ZjgOg7oO6farnNGup7yvoM/YXZV84OZxHAwtflItNa/6zzQyVb5LNxyea3FEKEX2XlagIKzrlH7wwxkKgtiew==} engines: {node: ^20.19.0 || >=22.12.0} peerDependencies: vite: ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 vue: ^3.2.25 - '@vue/compiler-core@3.5.32': - resolution: {integrity: sha512-4x74Tbtqnda8s/NSD6e1Dr5p1c8HdMU5RWSjMSUzb8RTcUQqevDCxVAitcLBKT+ie3o0Dl9crc/S/opJM7qBGQ==} + '@vue/compiler-core@3.5.42': + resolution: {integrity: sha512-2Ye1ilMtKXxl8qZUrQ5j0CdgenFp/HFQmta6rfRyfEsTG69L6Wk+tWuNoHYHMx9E8tF2Slvdg1FuwDvAXdy1LQ==} - '@vue/compiler-dom@3.5.32': - resolution: {integrity: sha512-ybHAu70NtiEI1fvAUz3oXZqkUYEe5J98GjMDpTGl5iHb0T15wQYLR4wE3h9xfuTNA+Cm2f4czfe8B4s+CCH57Q==} + '@vue/compiler-dom@3.5.42': + resolution: {integrity: sha512-qbhQZEFmycr+ni/qyuccS4sucNN7VAbDfbkvNxWOX2VfgFm90MNs3/UhRNKoPMEIVn0F8gdlYjLPvqxHwHeQOA==} - '@vue/compiler-sfc@3.5.32': - resolution: {integrity: sha512-8UYUYo71cP/0YHMO814TRZlPuUUw3oifHuMR7Wp9SNoRSrxRQnhMLNlCeaODNn6kNTJsjFoQ/kqIj4qGvya4Xg==} + '@vue/compiler-sfc@3.5.42': + resolution: {integrity: sha512-fkCAFB4okcAANGMThboWnScp/gzWjU0ZSkVnjTIiplmMDq2uq0tIB3j+xVu4rhv5rvOgBySCysudmbMd6xRRqw==} - '@vue/compiler-ssr@3.5.32': - resolution: {integrity: sha512-Gp4gTs22T3DgRotZ8aA/6m2jMR+GMztvBXUBEUOYOcST+giyGWJ4WvFd7QLHBkzTxkfOt8IELKNdpzITLbA2rw==} + '@vue/compiler-ssr@3.5.42': + resolution: {integrity: sha512-xmLk3wLkbizPAiLyomjgFFosf2ys9b5Ghb+oh/k2tnvipNz8OFrQOiTcWCzyK7MpBp9KkyGtfvgfLUivbmuGYA==} - '@vue/devtools-api@8.1.1': - resolution: {integrity: sha512-bsDMJ07b3GN1puVwJb/fyFnj/U2imyswK5UQVLZwVl7O05jDrt6BHxeG5XffmOOdasOj/bOmIjxJvGPxU7pcqw==} + '@vue/devtools-api@8.2.1': + resolution: {integrity: sha512-6u4vXBlIBAC1wMplIZgpyPn7uh/s4Bf6F5bMzvLv+EdJ0aHs/+4B7Ygv864EStQSjRbsRzTko/kUG1A1IejQ3A==} - '@vue/devtools-kit@8.1.1': - resolution: {integrity: sha512-gVBaBv++i+adg4JpH71k9ppl4soyR7Y2McEqO5YNgv0BI1kMZ7BDX5gnwkZ5COYgiCyhejZG+yGNrBAjj6Coqg==} + '@vue/devtools-kit@8.2.1': + resolution: {integrity: sha512-FIGIuq3AWReEpbAHY/cRGeHDfI0qOb8OCQ3YjbEAX04uaxIDbGc9rhkbVcG7rnfHPXE3RsU5KrWOu9V/okd8AQ==} - '@vue/devtools-shared@8.1.1': - resolution: {integrity: sha512-+h4ttmJYl/txpxHKaoZcaKpC+pvckgLzIDiSQlaQ7kKthKh8KuwoLW2D8hPJEnqKzXOvu15UHEoGyngAXCz0EQ==} + '@vue/devtools-shared@8.2.1': + resolution: {integrity: sha512-Fkac7lUdGReh6pVOi3AYPRGe82LQqRmAfThW7RRligOAP0ZA/Z1z9XLHDM9dv34pV2HRc79DK8uKPeG2fLnA/g==} - '@vue/reactivity@3.5.32': - resolution: {integrity: sha512-/ORasxSGvZ6MN5gc+uE364SxFdJ0+WqVG0CENXaGW58TOCdrAW76WWaplDtECeS1qphvtBZtR+3/o1g1zL4xPQ==} + '@vue/reactivity@3.5.42': + resolution: {integrity: sha512-TzNNfKpb7hDxbQltwAut8VDQA5YP+BuRlxntHUuRjyKwlMvmAPbs3unhCvieijifY6vFfVBwsS7wG/C7uq+bEQ==} - '@vue/runtime-core@3.5.32': - resolution: {integrity: sha512-pDrXCejn4UpFDFmMd27AcJEbHaLemaE5o4pbb7sLk79SRIhc6/t34BQA7SGNgYtbMnvbF/HHOftYBgFJtUoJUQ==} + '@vue/runtime-core@3.5.42': + resolution: {integrity: sha512-9uACtuHs7vJGkm5Bp3xu4xRDLFTIYy5DgxpToVjqGIAhAEKwQfsaLvKINhM6nFVp6bZPRFGdDqd1g52MqKsotA==} - '@vue/runtime-dom@3.5.32': - resolution: {integrity: sha512-1CDVv7tv/IV13V8Nip1k/aaObVbWqRlVCVezTwx3K07p7Vxossp5JU1dcPNhJk3w347gonIUT9jQOGutyJrSVQ==} + '@vue/runtime-dom@3.5.42': + resolution: {integrity: sha512-rsCmhiWLaRxGltLwhlCWyYkFn7WAbKRh0q17eZ1A6Dq6eqc2ACQ61IIryxz0LrsvCzHSilLA9JHovVwM8CNE2g==} - '@vue/server-renderer@3.5.32': - resolution: {integrity: sha512-IOjm2+JQwRFS7W28HNuJeXQle9KdZbODFY7hFGVtnnghF51ta20EWAZJHX+zLGtsHhaU6uC9BGPV52KVpYryMQ==} - peerDependencies: - vue: 3.5.32 + '@vue/server-renderer@3.5.42': + resolution: {integrity: sha512-2++5dUyYS4gvo7xQXSECUDhB7TS0aOl5SeVfC5qSq1Jgfhjvegw1zqhwTIR3imZ+QYPJQw9gfcFvXGAjGZ7ajQ==} - '@vue/shared@3.5.32': - resolution: {integrity: sha512-ksNyrmRQzWJJ8n3cRDuSF7zNNontuJg1YHnmWRJd2AMu8Ij2bqwiiri2lH5rHtYPZjj4STkNcgcmiQqlOjiYGg==} + '@vue/shared@3.5.42': + resolution: {integrity: sha512-2rPxex1jQf4jvl9MOHl6YaXCPcrNqz/FstMOEh3QWY+/OME9nQTvl9WYeCwhW7AFjaR0SnngZGlp/wkR6rkI6g==} - '@vueuse/core@14.2.1': - resolution: {integrity: sha512-3vwDzV+GDUNpdegRY6kzpLm4Igptq+GA0QkJ3W61Iv27YWwW/ufSlOfgQIpN6FZRMG0mkaz4gglJRtq5SeJyIQ==} + '@vueuse/core@14.4.0': + resolution: {integrity: sha512-X4WHz1HlCzCBoYXesUkifzzWBAcZgXG8Fi5iNPQg/epdzOB3gu8Fawj3hvuwYR1nGcXGnvxwYYcUC/71++svtQ==} peerDependencies: vue: ^3.5.0 - '@vueuse/integrations@14.2.1': - resolution: {integrity: sha512-2LIUpBi/67PoXJGqSDQUF0pgQWpNHh7beiA+KG2AbybcNm+pTGWT6oPGlBgUoDWmYwfeQqM/uzOHqcILpKL7nA==} + '@vueuse/integrations@14.4.0': + resolution: {integrity: sha512-oJz9qTgczvA7L1nXQFRU7h8tQbOCoiceqvMMhT9XYMyOGTqLJ2rEa09PON+nD2t48sZUfeOmg4eaWJXV4sZb/w==} peerDependencies: async-validator: ^4 axios: ^1 @@ -611,19 +524,14 @@ packages: universal-cookie: optional: true - '@vueuse/metadata@14.2.1': - resolution: {integrity: sha512-1ButlVtj5Sb/HDtIy1HFr1VqCP4G6Ypqt5MAo0lCgjokrk2mvQKsK2uuy0vqu/Ks+sHfuHo0B9Y9jn9xKdjZsw==} + '@vueuse/metadata@14.4.0': + resolution: {integrity: sha512-swx/255R6JyHZFJhx845iz5CRWDZdCfvkZOpACWc5+c5WHcG24mv8gUT1WIdFQaHt6dq79rvILd9QnCWiyVm9g==} - '@vueuse/shared@14.2.1': - resolution: {integrity: sha512-shTJncjV9JTI4oVNyF1FQonetYAiTBd+Qj7cY89SWbXSkx7gyhrgtEdF2ZAVWS1S3SHlaROO6F2IesJxQEkZBw==} + '@vueuse/shared@14.4.0': + resolution: {integrity: sha512-JRgY90Sz8DDtPMsaDflvPMp9xYk69JZAmbuDvAquUVXKr2gEjqtzGNTTthLfckH0BzBqvnu31gb4a8TGLRe79g==} peerDependencies: vue: ^3.5.0 - acorn@8.16.0: - resolution: {integrity: sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==} - engines: {node: '>=0.4.0'} - hasBin: true - birpc@2.9.0: resolution: {integrity: sha512-KrayHS5pBi69Xi9JmvoqrIgYGDkD6mcSe/i6YKi3w5kekCLzrX4+nawcXqrj2tIp50Kw/mT/s3p+GVK0A0sKxw==} @@ -636,15 +544,6 @@ packages: character-entities-legacy@3.0.0: resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} - chevrotain-allstar@0.4.1: - resolution: {integrity: sha512-PvVJm3oGqrveUVW2Vt/eZGeiAIsJszYweUcYwcskg9e+IubNYKKD+rHHem7A6XVO22eDAL+inxNIGAzZ/VIWlA==} - peerDependencies: - chevrotain: ^12.0.0 - - chevrotain@12.0.0: - resolution: {integrity: sha512-csJvb+6kEiQaqo1woTdSAuOWdN0WTLIydkKrBnS+V5gZz0oqBrp4kQ35519QgK6TpBThiG3V1vNSHlIkv4AglQ==} - engines: {node: '>=22.0.0'} - comma-separated-tokens@2.0.3: resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} @@ -656,9 +555,6 @@ packages: resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} engines: {node: '>= 12'} - confbox@0.1.8: - resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} - cose-base@1.0.3: resolution: {integrity: sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==} @@ -678,8 +574,8 @@ packages: peerDependencies: cytoscape: ^3.2.0 - cytoscape@3.33.2: - resolution: {integrity: sha512-sj4HXd3DokGhzZAdjDejGvTPLqlt84vNFN8m7bGsOzDY5DyVcxIb2ejIXat2Iy7HxWhdT/N1oKyheJ5YdpsGuw==} + cytoscape@3.34.2: + resolution: {integrity: sha512-Cm2jaj1X/PBNlzV9yH8zcfGOxO7U+CJ/+mxSBVPSchLaugdp4jtlGx5qaHtPRZ6tgiZ5P+o1XoRfJA+ba6KM3g==} engines: {node: '>=0.10'} d3-array@2.12.1: @@ -824,8 +720,8 @@ packages: dagre-d3-es@7.0.14: resolution: {integrity: sha512-P4rFMVq9ESWqmOgK+dlXvOtLwYg0i7u0HBGJER0LZDJT2VHIPAMZ/riPxqJceWMStH5+E61QxFra9kIS3AqdMg==} - dayjs@1.11.20: - resolution: {integrity: sha512-YbwwqR/uYpeoP4pu043q+LTDLFBLApUP6VxRihdfNTqu4ubqMlGDLd6ErXhEgsyvY0K6nCs7nggYumAN+9uEuQ==} + dayjs@1.11.23: + resolution: {integrity: sha512-QDTCU0M0MxR3hQfnlDJfwekQiaanm1ubOD231u73WBckQ/fsamwRLiE2GBz6D3a/xF1NgfiDLJjXBa1hYOYTtQ==} delaunator@5.1.0: resolution: {integrity: sha512-AGrQ4QSgssa1NGmWmLPqN5NY2KajF5MqxetNEO+o0n3ZwZZeTmt7bBnvzHWrmkZFxGgr4HdyFgelzgi06otLuQ==} @@ -834,24 +730,29 @@ packages: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} + detect-libc@2.1.2: + resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} + engines: {node: '>=8'} + devlop@1.1.0: resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} - dompurify@3.3.3: - resolution: {integrity: sha512-Oj6pzI2+RqBfFG+qOaOLbFXLQ90ARpcGG6UePL82bJLtdsa6CYJD7nmiU8MW9nQNOtCHV3lZ/Bzq1X0QYbBZCA==} + dompurify@3.4.14: + resolution: {integrity: sha512-dVoH9z+MY+C9IilgGCk3YfFqjLi3fChm2OiKJMzh6axrJ5qwxqWaZamgmHrpv22CN/KdbZJuGEGgfQoL00LTdg==} entities@7.0.1: resolution: {integrity: sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==} engines: {node: '>=0.12'} - esbuild@0.27.7: - resolution: {integrity: sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w==} - engines: {node: '>=18'} - hasBin: true + es-toolkit@1.52.0: + resolution: {integrity: sha512-XTNEJQh1tY1ZJVcf6ayP/2n4ZPyaHlW2FWs7xvw5ddPuhUVjLD3olQVQS7kf58JbAB48iL0uL/jerTrjtV3lDA==} estree-walker@2.0.2: resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + fastdom@1.0.12: + resolution: {integrity: sha512-LB+xjSTEbjHE1cWsxu+tN2Xqr1kpi+V9aADI7sVM5ZMaXyYGPHULQMzpJMYqOTULK/73pUkWVzzObFRBkPr+hg==} + fdir@6.5.0: resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} engines: {node: '>=12.0.0'} @@ -861,8 +762,8 @@ packages: picomatch: optional: true - focus-trap@8.0.1: - resolution: {integrity: sha512-9ptSG6z51YQOstI/oN4XuVGP/03u2nh0g//qz7L6zX0i6PZiPnkcf3GenXq7N2hZnASXaMxTPpbKwdI+PFvxlw==} + focus-trap@8.2.2: + resolution: {integrity: sha512-qV0g8hRYBqgACcFOH3f9wXc4zPKhr/0z9RI2a6ZijZ72EeBi4g8oBy8zAWuUR1TsMpOzwpUMFvjdasrC41Joug==} fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} @@ -888,6 +789,9 @@ packages: resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} engines: {node: '>=0.10.0'} + import-meta-resolve@4.2.0: + resolution: {integrity: sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==} + internmap@1.0.1: resolution: {integrity: sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==} @@ -895,23 +799,93 @@ packages: resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==} engines: {node: '>=12'} - katex@0.16.45: - resolution: {integrity: sha512-pQpZbdBu7wCTmQUh7ufPmLr0pFoObnGUoL/yhtwJDgmmQpbkg/0HSVti25Fu4rmd1oCR6NGWe9vqTWuWv3GcNA==} + katex@0.16.47: + resolution: {integrity: sha512-Eeo8Ys1doU1z+x8AZsPpQu+p/QcZBI5PeOo7QGQdy2x2m0MU/hYagBbGOmXwr5KVbEfVuWv9LpnQWeehogurjg==} hasBin: true khroma@2.1.0: resolution: {integrity: sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw==} - langium@4.2.2: - resolution: {integrity: sha512-JUshTRAfHI4/MF9dH2WupvjSXyn8JBuUEWazB8ZVJUtXutT0doDlAv1XKbZ1Pb5sMexa8FF4CFBc0iiul7gbUQ==} - engines: {node: '>=20.10.0', npm: '>=10.2.3'} - layout-base@1.0.2: resolution: {integrity: sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==} layout-base@2.0.1: resolution: {integrity: sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg==} + lightningcss-android-arm64@1.33.0: + resolution: {integrity: sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [android] + + lightningcss-darwin-arm64@1.33.0: + resolution: {integrity: sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] + + lightningcss-darwin-x64@1.33.0: + resolution: {integrity: sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] + + lightningcss-freebsd-x64@1.33.0: + resolution: {integrity: sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] + + lightningcss-linux-arm-gnueabihf@1.33.0: + resolution: {integrity: sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] + + lightningcss-linux-arm64-gnu@1.33.0: + resolution: {integrity: sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + lightningcss-linux-arm64-musl@1.33.0: + resolution: {integrity: sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + libc: [musl] + + lightningcss-linux-x64-gnu@1.33.0: + resolution: {integrity: sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + libc: [glibc] + + lightningcss-linux-x64-musl@1.33.0: + resolution: {integrity: sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + libc: [musl] + + lightningcss-win32-arm64-msvc@1.33.0: + resolution: {integrity: sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [win32] + + lightningcss-win32-x64-msvc@1.33.0: + resolution: {integrity: sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] + + lightningcss@1.33.0: + resolution: {integrity: sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==} + engines: {node: '>= 12.0.0'} + lodash-es@4.18.1: resolution: {integrity: sha512-J8xewKD/Gk22OZbhpOVSwcs60zhd95ESDwezOFuA3/099925PdHJ7OFHNTGtajL3AlZkykD32HykiMo+BIBI8A==} @@ -929,8 +903,8 @@ packages: mdast-util-to-hast@13.2.1: resolution: {integrity: sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==} - mermaid@11.14.0: - resolution: {integrity: sha512-GSGloRsBs+JINmmhl0JDwjpuezCsHB4WGI4NASHxL3fHo3o/BRXTxhDLKnln8/Q0lRFRyDdEjmk1/d5Sn1Xz8g==} + mermaid@11.17.2: + resolution: {integrity: sha512-V6K3C8EBdEsPFZXSKMJe6ppQOENxuHARr9GvHX4hh47lAbhMRD9qf4oEK7LoaRQxULMa80/qt5gHO73aCleBBg==} micromark-util-character@2.1.1: resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==} @@ -950,59 +924,50 @@ packages: minisearch@7.2.0: resolution: {integrity: sha512-dqT2XBYUOZOiC5t2HRnwADjhNS2cecp9u+TJRiJ1Qp/f5qjkeT5APcGPjHw+bz89Ms8Jp+cG4AlE+QZ/QnDglg==} - mlly@1.8.2: - resolution: {integrity: sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==} - - nanoid@3.3.11: - resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} + nanoid@3.3.18: + resolution: {integrity: sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true - oniguruma-parser@0.12.1: - resolution: {integrity: sha512-8Unqkvk1RYc6yq2WBYRj4hdnsAxVze8i7iPfQr8e4uSP3tRv0rpZcbGUDvxfQQcdwHt/e9PrMvGCsa8OqG9X3w==} + oniguruma-parser@0.12.2: + resolution: {integrity: sha512-6HVa5oIrgMC6aA6WF6XyyqbhRPJrKR02L20+2+zpDtO5QAzGHAUGw5TKQvwi5vctNnRHkJYmjAhRVQF2EKdTQw==} - oniguruma-to-es@4.3.5: - resolution: {integrity: sha512-Zjygswjpsewa0NLTsiizVuMQZbp0MDyM6lIt66OxsF21npUDlzpHi1Mgb/qhQdkb+dWFTzJmFbEWdvZgRho8eQ==} + oniguruma-to-es@4.3.6: + resolution: {integrity: sha512-csuQ9x3Yr0cEIs/Zgx/OEt9iBw9vqIunAPQkx19R/fiMq2oGVTgcMqO/V3Ybqefr1TBvosI6jU539ksaBULJyA==} - package-manager-detector@1.6.0: - resolution: {integrity: sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA==} + package-manager-detector@1.8.0: + resolution: {integrity: sha512-yQA4H19AmPEoMUeavPMDIe1higySl/gH/yaQrkT/s07Qp+7pp2hYz30N3z2l5BkjVkF9Ow6o0wjJamm2y7Sn0A==} path-data-parser@0.1.0: resolution: {integrity: sha512-NOnmBpt5Y2RWbuv0LMzsayp3lVylAHLPUTut412ZA3l+C4uw4ZVkQbjShYCQ8TCpUMdPapr4YjUqLYD6v68j+w==} - pathe@2.0.3: - resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} - perfect-debounce@2.1.0: resolution: {integrity: sha512-LjgdTytVFXeUgtHZr9WYViYSM/g8MkcTPYDlPa3cDqMirHjKiSZPYd6DoL7pK8AJQr+uWkQvCjHNdiMqsrJs+g==} picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} - picomatch@4.0.4: - resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} + picomatch@4.0.7: + resolution: {integrity: sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==} engines: {node: '>=12'} - pkg-types@1.3.1: - resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} - points-on-curve@0.2.0: resolution: {integrity: sha512-0mYKnYYe9ZcqMCWhUjItv/oHjvgEsfKvnUTg8sAtnHr3GVy7rGkXCb6d5cSyqrWqL4k81b9CPg3urd+T7aop3A==} points-on-path@0.2.1: resolution: {integrity: sha512-25ClnWWuw7JbWZcgqY/gJ4FQWadKxGWk+3kR/7kD0tCaDtPPMj7oHu2ToLaVhfpnHrZzYby2w6tUA0eOIuUg8g==} - postcss@8.5.9: - resolution: {integrity: sha512-7a70Nsot+EMX9fFU3064K/kdHWZqGVY+BADLyXc8Dfv+mTLLVl6JzJpPaCZ2kQL9gIJvKXSLMHhqdRRjwQeFtw==} + postcss@8.5.28: + resolution: {integrity: sha512-RRuzqDtt5Y9h3quz5hWhK+TPnsmVs6WwSU6LkJMeY4HstUEDuYTG8UJSdawMRzmzAtV+KEoG8N3Qg2qLy5vM/A==} engines: {node: ^10 || ^12 || >=14} - prettier@3.8.1: - resolution: {integrity: sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==} + prettier@3.9.6: + resolution: {integrity: sha512-OpN0zzVdiaiAhxpuuj5efpIS4sY9j7bY6uR5mnj5yPzGkdkjNKSJeUThPb60Jw29QuAZgA4o+/iB49kFiaBX6g==} engines: {node: '>=14'} hasBin: true - property-information@7.1.0: - resolution: {integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==} + property-information@7.2.0: + resolution: {integrity: sha512-IAtzIB6sUiWaJYrX9smp3V46pBGbBeLFRGdh25kg1334VcBlD8HzhPeNIWQH9zhGmo2itIe25EHt9dQP7G5hmg==} regex-recursion@6.0.2: resolution: {integrity: sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==} @@ -1016,9 +981,9 @@ packages: robust-predicates@3.0.3: resolution: {integrity: sha512-NS3levdsRIUOmiJ8FZWCP7LG3QpJyrs/TE0Zpf1yvZu8cAJJ6QMW92H1c7kWpdIHo8RvmLxN/o2JXTKHp74lUA==} - rollup@4.60.1: - resolution: {integrity: sha512-VmtB2rFU/GroZ4oL8+ZqXgSA38O6GR8KSIvWmEFv63pQ0G6KaBH9s07PO8XTXP4vI+3UJUEypOfjkGfmSBBR0w==} - engines: {node: '>=18.0.0', npm: '>=8.0.0'} + rolldown@1.2.7: + resolution: {integrity: sha512-g0EtLvBjTUB7jhyV0S/TCup3v/XSVl45vUIGbOGU4QPiyjTenCe4mKuFvW9fEgYmS2Fo42AUssRmNuMziXdrig==} + engines: {node: ^20.19.0 || >=22.12.0} hasBin: true roughjs@4.6.6: @@ -1030,8 +995,9 @@ packages: safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - shiki@3.23.0: - resolution: {integrity: sha512-55Dj73uq9ZXL5zyeRPzHQsK7Nbyt6Y10k5s7OjuFZGMhpp4r/rsLBH0o/0fstIzX1Lep9VxefWljK/SKCzygIA==} + shiki@4.4.3: + resolution: {integrity: sha512-Mb/GvXPHBAXdgGIcnfU5L3ldpn1XcxrGkPHwqgRx17/I2XRfqlFKk2vGkHWINn1kdXvzJZeuO3is6I9KLPFm0g==} + engines: {node: '>=20'} source-map-js@1.2.1: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} @@ -1040,33 +1006,33 @@ packages: space-separated-tokens@2.0.2: resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + strictdom@1.0.1: + resolution: {integrity: sha512-cEmp9QeXXRmjj/rVp9oyiqcvyocWab/HaoN4+bwFeZ7QzykJD6L3yD4v12K1x0tHpqRqVpJevN3gW7kyM39Bqg==} + stringify-entities@4.0.4: resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} - stylis@4.3.6: - resolution: {integrity: sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ==} + stylis@4.4.0: + resolution: {integrity: sha512-5Z9ZpRzfuH6l/UAvCPAPUo3665Nk2wLaZU3x+TLHKVzIz33+sbJqbtrYoC3KD4/uVOr2Zp+L0LySezP9OHV9yA==} - tabbable@6.4.0: - resolution: {integrity: sha512-05PUHKSNE8ou2dwIxTngl4EzcnsCDZGJ/iCLtDflR/SHB/ny14rXc+qU5P4mG9JkusiV7EivzY9Mhm55AzAvCg==} + tabbable@6.5.0: + resolution: {integrity: sha512-wieBHXygIm7OyQOu5hQlkk62/WyCFYGlWg7L6/ZCUZwx0o398Zkn4pVmMyfYhfMG8kGrj/Krt8eIk6UKC6VzwA==} - tinyexec@1.1.1: - resolution: {integrity: sha512-VKS/ZaQhhkKFMANmAOhhXVoIfBXblQxGX1myCQ2faQrfmobMftXeJPcZGp0gS07ocvGJWDLZGyOZDadDBqYIJg==} + tinyexec@1.3.1: + resolution: {integrity: sha512-GCvB3aoys96IuDFBMcTB46JOR6mdMtAToqwiW8JlWhsoh1mhHi/xn9ss/Dg7N555GiJyEt2qzoG/NHCwM6h1EA==} engines: {node: '>=18'} - tinyglobby@0.2.16: - resolution: {integrity: sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==} + tinyglobby@0.2.17: + resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} engines: {node: '>=12.0.0'} trim-lines@3.0.1: resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} - ts-dedent@2.2.0: - resolution: {integrity: sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==} + ts-dedent@2.3.0: + resolution: {integrity: sha512-JfJeIHke7y2egdGGgRAvpCwYFUsHlM2gPcrVOxFkznt/4uzQ7HFmvE63iFHVLBJNDuyDOQgijDK/tXH/f6Msjg==} engines: {node: '>=6.10'} - ufo@1.6.3: - resolution: {integrity: sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==} - unist-util-is@6.0.1: resolution: {integrity: sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==} @@ -1082,8 +1048,8 @@ packages: unist-util-visit@5.1.0: resolution: {integrity: sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==} - uuid@11.1.0: - resolution: {integrity: sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==} + uuid@14.0.2: + resolution: {integrity: sha512-xZe/16rV4aa+HGSOCiY2YeLT1OybRLrrkL/Rqaq7p7GMVXjFh+6wN4oMYgjFmnSnhY8t6Xpdl2l9qmnHYuMHwQ==} hasBin: true vfile-message@4.0.3: @@ -1092,15 +1058,16 @@ packages: vfile@6.0.3: resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} - vite@7.3.2: - resolution: {integrity: sha512-Bby3NOsna2jsjfLVOHKes8sGwgl4TT0E6vvpYgnAYDIF/tie7MRaFthmKuHx1NSXjiTueXH3do80FMQgvEktRg==} + vite@8.2.2: + resolution: {integrity: sha512-cFKLV/PRgAUlIRm5WjMjJ86jrftzpqcgH+Us+DS8mI3CDNiH30Whrz8uHL3+MOLPAgqbMBAqWdAHAphOAM+z/Q==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: '@types/node': ^20.19.0 || >=22.12.0 + '@vitejs/devtools': ^0.4.0 || ^0.5.0 + esbuild: ^0.27.0 || ^0.28.0 jiti: '>=1.21.0' less: ^4.0.0 - lightningcss: ^1.21.0 sass: ^1.70.0 sass-embedded: ^1.70.0 stylus: '>=0.54.8' @@ -1111,12 +1078,14 @@ packages: peerDependenciesMeta: '@types/node': optional: true + '@vitejs/devtools': + optional: true + esbuild: + optional: true jiti: optional: true less: optional: true - lightningcss: - optional: true sass: optional: true sass-embedded: @@ -1132,43 +1101,20 @@ packages: yaml: optional: true - vitepress@2.0.0-alpha.17: - resolution: {integrity: sha512-Z3VPUpwk/bHYqt1uMVOOK1/4xFiWQov1GNc2FvMdz6kvje4JRXEOngVI9C+bi5jeedMSHiA4dwKkff1NCvbZ9Q==} + vitepress@2.0.0-alpha.20: + resolution: {integrity: sha512-uQWKmP9PaBkf9zxHn0iOml/ZPPDaGKqQXVMBHz3yjwyyd9Eg+BKLGxbqmOGlfOMCt6Fj8TLiAnE59qlKZ0A3xw==} hasBin: true peerDependencies: markdown-it-mathjax3: ^4 - oxc-minify: '*' postcss: ^8 peerDependenciesMeta: markdown-it-mathjax3: optional: true - oxc-minify: - optional: true postcss: optional: true - vscode-jsonrpc@8.2.0: - resolution: {integrity: sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==} - engines: {node: '>=14.0.0'} - - vscode-languageserver-protocol@3.17.5: - resolution: {integrity: sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==} - - vscode-languageserver-textdocument@1.0.12: - resolution: {integrity: sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA==} - - vscode-languageserver-types@3.17.5: - resolution: {integrity: sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==} - - vscode-languageserver@9.0.1: - resolution: {integrity: sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g==} - hasBin: true - - vscode-uri@3.1.0: - resolution: {integrity: sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==} - - vue@3.5.32: - resolution: {integrity: sha512-vM4z4Q9tTafVfMAK7IVzmxg34rSzTFMyIe0UUEijUCkn9+23lj0WRfA83dg7eQZIUlgOSGrkViIaCfqSAUXsMw==} + vue@3.5.42: + resolution: {integrity: sha512-4RyHQTbQvOPs3MfvUO1Sg0YRrKNnA0mAVtvpd12Tg1fKDN7OHBUl1IqSn8zGJjK9nI3NkNp8cgTpVrSZC5TTcA==} peerDependencies: typescript: '*' peerDependenciesMeta: @@ -1180,255 +1126,143 @@ packages: snapshots: - '@antfu/install-pkg@1.1.0': + '@antfu/install-pkg@2.0.1': dependencies: - package-manager-detector: 1.6.0 - tinyexec: 1.1.1 + package-manager-detector: 1.8.0 + tinyexec: 1.3.1 - '@babel/helper-string-parser@7.27.1': {} + '@babel/helper-string-parser@7.29.7': {} - '@babel/helper-validator-identifier@7.28.5': {} + '@babel/helper-validator-identifier@7.29.7': {} - '@babel/parser@7.29.2': + '@babel/parser@7.29.8': dependencies: - '@babel/types': 7.29.0 + '@babel/types': 7.29.8 - '@babel/types@7.29.0': + '@babel/types@7.29.8': dependencies: - '@babel/helper-string-parser': 7.27.1 - '@babel/helper-validator-identifier': 7.28.5 + '@babel/helper-string-parser': 7.29.7 + '@babel/helper-validator-identifier': 7.29.7 '@braintree/sanitize-url@7.1.2': {} - '@chevrotain/cst-dts-gen@12.0.0': - dependencies: - '@chevrotain/gast': 12.0.0 - '@chevrotain/types': 12.0.0 - - '@chevrotain/gast@12.0.0': - dependencies: - '@chevrotain/types': 12.0.0 - - '@chevrotain/regexp-to-ast@12.0.0': {} - - '@chevrotain/types@12.0.0': {} - - '@chevrotain/utils@12.0.0': {} - - '@docsearch/css@4.6.2': {} - - '@docsearch/js@4.6.2': {} - - '@docsearch/sidepanel-js@4.6.2': {} - - '@esbuild/aix-ppc64@0.27.7': - optional: true - - '@esbuild/android-arm64@0.27.7': - optional: true - - '@esbuild/android-arm@0.27.7': - optional: true - - '@esbuild/android-x64@0.27.7': - optional: true - - '@esbuild/darwin-arm64@0.27.7': - optional: true - - '@esbuild/darwin-x64@0.27.7': - optional: true - - '@esbuild/freebsd-arm64@0.27.7': - optional: true - - '@esbuild/freebsd-x64@0.27.7': - optional: true - - '@esbuild/linux-arm64@0.27.7': - optional: true - - '@esbuild/linux-arm@0.27.7': - optional: true - - '@esbuild/linux-ia32@0.27.7': - optional: true - - '@esbuild/linux-loong64@0.27.7': - optional: true - - '@esbuild/linux-mips64el@0.27.7': - optional: true - - '@esbuild/linux-ppc64@0.27.7': - optional: true - - '@esbuild/linux-riscv64@0.27.7': - optional: true - - '@esbuild/linux-s390x@0.27.7': - optional: true - - '@esbuild/linux-x64@0.27.7': - optional: true - - '@esbuild/netbsd-arm64@0.27.7': - optional: true - - '@esbuild/netbsd-x64@0.27.7': - optional: true - - '@esbuild/openbsd-arm64@0.27.7': - optional: true - - '@esbuild/openbsd-x64@0.27.7': - optional: true - - '@esbuild/openharmony-arm64@0.27.7': - optional: true + '@chevrotain/types@11.1.2': {} - '@esbuild/sunos-x64@0.27.7': - optional: true - - '@esbuild/win32-arm64@0.27.7': - optional: true + '@docsearch/css@4.7.0': {} - '@esbuild/win32-ia32@0.27.7': - optional: true + '@docsearch/js@4.7.0': {} - '@esbuild/win32-x64@0.27.7': - optional: true + '@docsearch/sidepanel-js@4.7.0': {} - '@iconify-json/simple-icons@1.2.77': + '@iconify-json/simple-icons@1.2.94': dependencies: '@iconify/types': 2.0.0 '@iconify/types@2.0.0': {} - '@iconify/utils@3.1.0': + '@iconify/utils@3.1.5': dependencies: - '@antfu/install-pkg': 1.1.0 + '@antfu/install-pkg': 2.0.1 '@iconify/types': 2.0.0 - mlly: 1.8.2 + import-meta-resolve: 4.2.0 - '@jridgewell/sourcemap-codec@1.5.5': {} + '@jridgewell/sourcemap-codec@1.6.0': {} - '@mermaid-js/parser@1.1.0': + '@mermaid-js/parser@1.2.1': dependencies: - langium: 4.2.2 - - '@rolldown/pluginutils@1.0.0-rc.2': {} - - '@rollup/rollup-android-arm-eabi@4.60.1': - optional: true - - '@rollup/rollup-android-arm64@4.60.1': - optional: true - - '@rollup/rollup-darwin-arm64@4.60.1': - optional: true + '@chevrotain/types': 11.1.2 - '@rollup/rollup-darwin-x64@4.60.1': - optional: true + '@oxc-project/types@0.148.0': {} - '@rollup/rollup-freebsd-arm64@4.60.1': + '@rolldown/binding-android-arm-eabi@1.2.7': optional: true - '@rollup/rollup-freebsd-x64@4.60.1': + '@rolldown/binding-android-arm64@1.2.7': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.60.1': + '@rolldown/binding-darwin-arm64@1.2.7': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.60.1': + '@rolldown/binding-darwin-x64@1.2.7': optional: true - '@rollup/rollup-linux-arm64-gnu@4.60.1': + '@rolldown/binding-freebsd-x64@1.2.7': optional: true - '@rollup/rollup-linux-arm64-musl@4.60.1': + '@rolldown/binding-linux-arm-gnueabihf@1.2.7': optional: true - '@rollup/rollup-linux-loong64-gnu@4.60.1': + '@rolldown/binding-linux-arm64-gnu@1.2.7': optional: true - '@rollup/rollup-linux-loong64-musl@4.60.1': + '@rolldown/binding-linux-arm64-musl@1.2.7': optional: true - '@rollup/rollup-linux-ppc64-gnu@4.60.1': + '@rolldown/binding-linux-ppc64-gnu@1.2.7': optional: true - '@rollup/rollup-linux-ppc64-musl@4.60.1': + '@rolldown/binding-linux-s390x-gnu@1.2.7': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.60.1': + '@rolldown/binding-linux-x64-gnu@1.2.7': optional: true - '@rollup/rollup-linux-riscv64-musl@4.60.1': + '@rolldown/binding-linux-x64-musl@1.2.7': optional: true - '@rollup/rollup-linux-s390x-gnu@4.60.1': + '@rolldown/binding-openharmony-arm64@1.2.7': optional: true - '@rollup/rollup-linux-x64-gnu@4.60.1': + '@rolldown/binding-win32-arm64-msvc@1.2.7': optional: true - '@rollup/rollup-linux-x64-musl@4.60.1': + '@rolldown/binding-win32-x64-msvc@1.2.7': optional: true - '@rollup/rollup-openbsd-x64@4.60.1': - optional: true + '@rolldown/pluginutils@1.0.1': {} - '@rollup/rollup-openharmony-arm64@4.60.1': - optional: true - - '@rollup/rollup-win32-arm64-msvc@4.60.1': - optional: true - - '@rollup/rollup-win32-ia32-msvc@4.60.1': - optional: true - - '@rollup/rollup-win32-x64-gnu@4.60.1': - optional: true - - '@rollup/rollup-win32-x64-msvc@4.60.1': - optional: true - - '@shikijs/core@3.23.0': + '@shikijs/core@4.4.3': dependencies: - '@shikijs/types': 3.23.0 + '@shikijs/primitive': 4.4.3 + '@shikijs/types': 4.4.3 '@shikijs/vscode-textmate': 10.0.2 - '@types/hast': 3.0.4 + '@types/hast': 3.0.5 hast-util-to-html: 9.0.5 - '@shikijs/engine-javascript@3.23.0': + '@shikijs/engine-javascript@4.4.3': dependencies: - '@shikijs/types': 3.23.0 + '@shikijs/types': 4.4.3 '@shikijs/vscode-textmate': 10.0.2 - oniguruma-to-es: 4.3.5 + oniguruma-to-es: 4.3.6 - '@shikijs/engine-oniguruma@3.23.0': + '@shikijs/engine-oniguruma@4.4.3': dependencies: - '@shikijs/types': 3.23.0 + '@shikijs/types': 4.4.3 '@shikijs/vscode-textmate': 10.0.2 - '@shikijs/langs@3.23.0': + '@shikijs/langs@4.4.3': dependencies: - '@shikijs/types': 3.23.0 + '@shikijs/types': 4.4.3 + + '@shikijs/primitive@4.4.3': + dependencies: + '@shikijs/types': 4.4.3 + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.5 - '@shikijs/themes@3.23.0': + '@shikijs/themes@4.4.3': dependencies: - '@shikijs/types': 3.23.0 + '@shikijs/types': 4.4.3 - '@shikijs/transformers@3.23.0': + '@shikijs/transformers@4.4.3': dependencies: - '@shikijs/core': 3.23.0 - '@shikijs/types': 3.23.0 + '@shikijs/core': 4.4.3 + '@shikijs/types': 4.4.3 - '@shikijs/types@3.23.0': + '@shikijs/types@4.4.3': dependencies: '@shikijs/vscode-textmate': 10.0.2 - '@types/hast': 3.0.4 + '@types/hast': 3.0.5 '@shikijs/vscode-textmate@10.0.2': {} @@ -1471,7 +1305,7 @@ snapshots: '@types/d3-format@3.0.4': {} - '@types/d3-geo@3.1.0': + '@types/d3-geo@3.1.1': dependencies: '@types/geojson': 7946.0.16 @@ -1487,7 +1321,7 @@ snapshots: '@types/d3-quadtree@3.0.6': {} - '@types/d3-random@3.0.3': {} + '@types/d3-random@3.0.4': {} '@types/d3-scale-chromatic@3.1.0': {} @@ -1497,7 +1331,7 @@ snapshots: '@types/d3-selection@3.0.11': {} - '@types/d3-shape@3.1.8': + '@types/d3-shape@3.2.0': dependencies: '@types/d3-path': 3.1.1 @@ -1532,34 +1366,32 @@ snapshots: '@types/d3-fetch': 3.0.7 '@types/d3-force': 3.0.10 '@types/d3-format': 3.0.4 - '@types/d3-geo': 3.1.0 + '@types/d3-geo': 3.1.1 '@types/d3-hierarchy': 3.1.7 '@types/d3-interpolate': 3.0.4 '@types/d3-path': 3.1.1 '@types/d3-polygon': 3.0.2 '@types/d3-quadtree': 3.0.6 - '@types/d3-random': 3.0.3 + '@types/d3-random': 3.0.4 '@types/d3-scale': 4.0.9 '@types/d3-scale-chromatic': 3.1.0 '@types/d3-selection': 3.0.11 - '@types/d3-shape': 3.1.8 + '@types/d3-shape': 3.2.0 '@types/d3-time': 3.0.4 '@types/d3-time-format': 4.0.3 '@types/d3-timer': 3.0.2 '@types/d3-transition': 3.0.9 '@types/d3-zoom': 3.0.8 - '@types/estree@1.0.8': {} - '@types/geojson@7946.0.16': {} - '@types/hast@3.0.4': + '@types/hast@3.0.5': dependencies: '@types/unist': 3.0.3 '@types/linkify-it@5.0.0': {} - '@types/markdown-it@14.1.2': + '@types/markdown-it@14.2.0': dependencies: '@types/linkify-it': 5.0.0 '@types/mdurl': 2.0.0 @@ -1577,108 +1409,106 @@ snapshots: '@types/web-bluetooth@0.0.21': {} - '@ungap/structured-clone@1.3.0': {} + '@ungap/structured-clone@1.4.0': {} '@upsetjs/venn.js@2.0.0': optionalDependencies: d3-selection: 3.0.0 d3-transition: 3.0.1(d3-selection@3.0.0) - '@vitejs/plugin-vue@6.0.5(vite@7.3.2)(vue@3.5.32)': + '@vitejs/plugin-vue@6.0.8(vite@8.2.2)(vue@3.5.42)': dependencies: - '@rolldown/pluginutils': 1.0.0-rc.2 - vite: 7.3.2 - vue: 3.5.32 + '@rolldown/pluginutils': 1.0.1 + vite: 8.2.2 + vue: 3.5.42 - '@vue/compiler-core@3.5.32': + '@vue/compiler-core@3.5.42': dependencies: - '@babel/parser': 7.29.2 - '@vue/shared': 3.5.32 + '@babel/parser': 7.29.8 + '@vue/shared': 3.5.42 entities: 7.0.1 estree-walker: 2.0.2 source-map-js: 1.2.1 - '@vue/compiler-dom@3.5.32': + '@vue/compiler-dom@3.5.42': dependencies: - '@vue/compiler-core': 3.5.32 - '@vue/shared': 3.5.32 + '@vue/compiler-core': 3.5.42 + '@vue/shared': 3.5.42 - '@vue/compiler-sfc@3.5.32': + '@vue/compiler-sfc@3.5.42': dependencies: - '@babel/parser': 7.29.2 - '@vue/compiler-core': 3.5.32 - '@vue/compiler-dom': 3.5.32 - '@vue/compiler-ssr': 3.5.32 - '@vue/shared': 3.5.32 + '@babel/parser': 7.29.8 + '@vue/compiler-core': 3.5.42 + '@vue/compiler-dom': 3.5.42 + '@vue/compiler-ssr': 3.5.42 + '@vue/shared': 3.5.42 estree-walker: 2.0.2 magic-string: 0.30.21 - postcss: 8.5.9 + postcss: 8.5.28 source-map-js: 1.2.1 - '@vue/compiler-ssr@3.5.32': + '@vue/compiler-ssr@3.5.42': dependencies: - '@vue/compiler-dom': 3.5.32 - '@vue/shared': 3.5.32 + '@vue/compiler-dom': 3.5.42 + '@vue/shared': 3.5.42 - '@vue/devtools-api@8.1.1': + '@vue/devtools-api@8.2.1': dependencies: - '@vue/devtools-kit': 8.1.1 + '@vue/devtools-kit': 8.2.1 - '@vue/devtools-kit@8.1.1': + '@vue/devtools-kit@8.2.1': dependencies: - '@vue/devtools-shared': 8.1.1 + '@vue/devtools-shared': 8.2.1 birpc: 2.9.0 hookable: 5.5.3 perfect-debounce: 2.1.0 - '@vue/devtools-shared@8.1.1': {} + '@vue/devtools-shared@8.2.1': {} - '@vue/reactivity@3.5.32': + '@vue/reactivity@3.5.42': dependencies: - '@vue/shared': 3.5.32 + '@vue/shared': 3.5.42 - '@vue/runtime-core@3.5.32': + '@vue/runtime-core@3.5.42': dependencies: - '@vue/reactivity': 3.5.32 - '@vue/shared': 3.5.32 + '@vue/reactivity': 3.5.42 + '@vue/shared': 3.5.42 - '@vue/runtime-dom@3.5.32': + '@vue/runtime-dom@3.5.42': dependencies: - '@vue/reactivity': 3.5.32 - '@vue/runtime-core': 3.5.32 - '@vue/shared': 3.5.32 + '@vue/reactivity': 3.5.42 + '@vue/runtime-core': 3.5.42 + '@vue/shared': 3.5.42 csstype: 3.2.3 - '@vue/server-renderer@3.5.32(vue@3.5.32)': + '@vue/server-renderer@3.5.42': dependencies: - '@vue/compiler-ssr': 3.5.32 - '@vue/shared': 3.5.32 - vue: 3.5.32 + '@vue/compiler-ssr': 3.5.42 + '@vue/runtime-dom': 3.5.42 + '@vue/shared': 3.5.42 - '@vue/shared@3.5.32': {} + '@vue/shared@3.5.42': {} - '@vueuse/core@14.2.1(vue@3.5.32)': + '@vueuse/core@14.4.0(vue@3.5.42)': dependencies: '@types/web-bluetooth': 0.0.21 - '@vueuse/metadata': 14.2.1 - '@vueuse/shared': 14.2.1(vue@3.5.32) - vue: 3.5.32 + '@vueuse/metadata': 14.4.0 + '@vueuse/shared': 14.4.0(vue@3.5.42) + vue: 3.5.42 - '@vueuse/integrations@14.2.1(focus-trap@8.0.1)(vue@3.5.32)': + '@vueuse/integrations@14.4.0(focus-trap@8.2.2)(vue@3.5.42)': dependencies: - '@vueuse/core': 14.2.1(vue@3.5.32) - '@vueuse/shared': 14.2.1(vue@3.5.32) - vue: 3.5.32 + '@vueuse/core': 14.4.0(vue@3.5.42) + '@vueuse/shared': 14.4.0(vue@3.5.42) + vue: 3.5.42 optionalDependencies: - focus-trap: 8.0.1 + focus-trap: 8.2.2 - '@vueuse/metadata@14.2.1': {} + '@vueuse/metadata@14.4.0': {} - '@vueuse/shared@14.2.1(vue@3.5.32)': + '@vueuse/shared@14.4.0(vue@3.5.42)': dependencies: - vue: 3.5.32 - - acorn@8.16.0: {} + vue: 3.5.42 birpc@2.9.0: {} @@ -1688,27 +1518,12 @@ snapshots: character-entities-legacy@3.0.0: {} - chevrotain-allstar@0.4.1(chevrotain@12.0.0): - dependencies: - chevrotain: 12.0.0 - lodash-es: 4.18.1 - - chevrotain@12.0.0: - dependencies: - '@chevrotain/cst-dts-gen': 12.0.0 - '@chevrotain/gast': 12.0.0 - '@chevrotain/regexp-to-ast': 12.0.0 - '@chevrotain/types': 12.0.0 - '@chevrotain/utils': 12.0.0 - comma-separated-tokens@2.0.3: {} commander@7.2.0: {} commander@8.3.0: {} - confbox@0.1.8: {} - cose-base@1.0.3: dependencies: layout-base: 1.0.2 @@ -1719,17 +1534,17 @@ snapshots: csstype@3.2.3: {} - cytoscape-cose-bilkent@4.1.0(cytoscape@3.33.2): + cytoscape-cose-bilkent@4.1.0(cytoscape@3.34.2): dependencies: cose-base: 1.0.3 - cytoscape: 3.33.2 + cytoscape: 3.34.2 - cytoscape-fcose@2.2.0(cytoscape@3.33.2): + cytoscape-fcose@2.2.0(cytoscape@3.34.2): dependencies: cose-base: 2.2.0 - cytoscape: 3.33.2 + cytoscape: 3.34.2 - cytoscape@3.33.2: {} + cytoscape@3.34.2: {} d3-array@2.12.1: dependencies: @@ -1903,7 +1718,7 @@ snapshots: d3: 7.9.0 lodash-es: 4.18.1 - dayjs@1.11.20: {} + dayjs@1.11.23: {} delaunator@5.1.0: dependencies: @@ -1911,54 +1726,33 @@ snapshots: dequal@2.0.3: {} + detect-libc@2.1.2: {} + devlop@1.1.0: dependencies: dequal: 2.0.3 - dompurify@3.3.3: + dompurify@3.4.14: optionalDependencies: '@types/trusted-types': 2.0.7 entities@7.0.1: {} - esbuild@0.27.7: - optionalDependencies: - '@esbuild/aix-ppc64': 0.27.7 - '@esbuild/android-arm': 0.27.7 - '@esbuild/android-arm64': 0.27.7 - '@esbuild/android-x64': 0.27.7 - '@esbuild/darwin-arm64': 0.27.7 - '@esbuild/darwin-x64': 0.27.7 - '@esbuild/freebsd-arm64': 0.27.7 - '@esbuild/freebsd-x64': 0.27.7 - '@esbuild/linux-arm': 0.27.7 - '@esbuild/linux-arm64': 0.27.7 - '@esbuild/linux-ia32': 0.27.7 - '@esbuild/linux-loong64': 0.27.7 - '@esbuild/linux-mips64el': 0.27.7 - '@esbuild/linux-ppc64': 0.27.7 - '@esbuild/linux-riscv64': 0.27.7 - '@esbuild/linux-s390x': 0.27.7 - '@esbuild/linux-x64': 0.27.7 - '@esbuild/netbsd-arm64': 0.27.7 - '@esbuild/netbsd-x64': 0.27.7 - '@esbuild/openbsd-arm64': 0.27.7 - '@esbuild/openbsd-x64': 0.27.7 - '@esbuild/openharmony-arm64': 0.27.7 - '@esbuild/sunos-x64': 0.27.7 - '@esbuild/win32-arm64': 0.27.7 - '@esbuild/win32-ia32': 0.27.7 - '@esbuild/win32-x64': 0.27.7 + es-toolkit@1.52.0: {} estree-walker@2.0.2: {} - fdir@6.5.0(picomatch@4.0.4): + fastdom@1.0.12: + dependencies: + strictdom: 1.0.1 + + fdir@6.5.0(picomatch@4.0.7): optionalDependencies: - picomatch: 4.0.4 + picomatch: 4.0.7 - focus-trap@8.0.1: + focus-trap@8.2.2: dependencies: - tabbable: 6.4.0 + tabbable: 6.5.0 fsevents@2.3.3: optional: true @@ -1967,21 +1761,21 @@ snapshots: hast-util-to-html@9.0.5: dependencies: - '@types/hast': 3.0.4 + '@types/hast': 3.0.5 '@types/unist': 3.0.3 ccount: 2.0.1 comma-separated-tokens: 2.0.3 hast-util-whitespace: 3.0.0 html-void-elements: 3.0.0 mdast-util-to-hast: 13.2.1 - property-information: 7.1.0 + property-information: 7.2.0 space-separated-tokens: 2.0.2 stringify-entities: 4.0.4 zwitch: 2.0.4 hast-util-whitespace@3.0.0: dependencies: - '@types/hast': 3.0.4 + '@types/hast': 3.0.5 hookable@5.5.3: {} @@ -1991,34 +1785,76 @@ snapshots: dependencies: safer-buffer: 2.1.2 + import-meta-resolve@4.2.0: {} + internmap@1.0.1: {} internmap@2.0.3: {} - katex@0.16.45: + katex@0.16.47: dependencies: commander: 8.3.0 khroma@2.1.0: {} - langium@4.2.2: - dependencies: - '@chevrotain/regexp-to-ast': 12.0.0 - chevrotain: 12.0.0 - chevrotain-allstar: 0.4.1(chevrotain@12.0.0) - vscode-languageserver: 9.0.1 - vscode-languageserver-textdocument: 1.0.12 - vscode-uri: 3.1.0 - layout-base@1.0.2: {} layout-base@2.0.1: {} + lightningcss-android-arm64@1.33.0: + optional: true + + lightningcss-darwin-arm64@1.33.0: + optional: true + + lightningcss-darwin-x64@1.33.0: + optional: true + + lightningcss-freebsd-x64@1.33.0: + optional: true + + lightningcss-linux-arm-gnueabihf@1.33.0: + optional: true + + lightningcss-linux-arm64-gnu@1.33.0: + optional: true + + lightningcss-linux-arm64-musl@1.33.0: + optional: true + + lightningcss-linux-x64-gnu@1.33.0: + optional: true + + lightningcss-linux-x64-musl@1.33.0: + optional: true + + lightningcss-win32-arm64-msvc@1.33.0: + optional: true + + lightningcss-win32-x64-msvc@1.33.0: + optional: true + + lightningcss@1.33.0: + dependencies: + detect-libc: 2.1.2 + optionalDependencies: + lightningcss-android-arm64: 1.33.0 + lightningcss-darwin-arm64: 1.33.0 + lightningcss-darwin-x64: 1.33.0 + lightningcss-freebsd-x64: 1.33.0 + lightningcss-linux-arm-gnueabihf: 1.33.0 + lightningcss-linux-arm64-gnu: 1.33.0 + lightningcss-linux-arm64-musl: 1.33.0 + lightningcss-linux-x64-gnu: 1.33.0 + lightningcss-linux-x64-musl: 1.33.0 + lightningcss-win32-arm64-msvc: 1.33.0 + lightningcss-win32-x64-msvc: 1.33.0 + lodash-es@4.18.1: {} magic-string@0.30.21: dependencies: - '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/sourcemap-codec': 1.6.0 mark.js@8.11.1: {} @@ -2026,9 +1862,9 @@ snapshots: mdast-util-to-hast@13.2.1: dependencies: - '@types/hast': 3.0.4 + '@types/hast': 3.0.5 '@types/mdast': 4.0.4 - '@ungap/structured-clone': 1.3.0 + '@ungap/structured-clone': 1.4.0 devlop: 1.1.0 micromark-util-sanitize-uri: 2.0.1 trim-lines: 3.0.1 @@ -2036,29 +1872,30 @@ snapshots: unist-util-visit: 5.1.0 vfile: 6.0.3 - mermaid@11.14.0: + mermaid@11.17.2: dependencies: '@braintree/sanitize-url': 7.1.2 - '@iconify/utils': 3.1.0 - '@mermaid-js/parser': 1.1.0 + '@iconify/utils': 3.1.5 + '@mermaid-js/parser': 1.2.1 '@types/d3': 7.4.3 '@upsetjs/venn.js': 2.0.0 - cytoscape: 3.33.2 - cytoscape-cose-bilkent: 4.1.0(cytoscape@3.33.2) - cytoscape-fcose: 2.2.0(cytoscape@3.33.2) + cytoscape: 3.34.2 + cytoscape-cose-bilkent: 4.1.0(cytoscape@3.34.2) + cytoscape-fcose: 2.2.0(cytoscape@3.34.2) d3: 7.9.0 d3-sankey: 0.12.3 dagre-d3-es: 7.0.14 - dayjs: 1.11.20 - dompurify: 3.3.3 - katex: 0.16.45 + dayjs: 1.11.23 + dompurify: 3.4.14 + es-toolkit: 1.52.0 + fastdom: 1.0.12 + katex: 0.16.47 khroma: 2.1.0 - lodash-es: 4.18.1 marked: 16.4.2 roughjs: 4.6.6 - stylis: 4.3.6 - ts-dedent: 2.2.0 - uuid: 11.1.0 + stylis: 4.4.0 + ts-dedent: 2.3.0 + uuid: 14.0.2 micromark-util-character@2.1.1: dependencies: @@ -2079,40 +1916,25 @@ snapshots: minisearch@7.2.0: {} - mlly@1.8.2: - dependencies: - acorn: 8.16.0 - pathe: 2.0.3 - pkg-types: 1.3.1 - ufo: 1.6.3 - - nanoid@3.3.11: {} + nanoid@3.3.18: {} - oniguruma-parser@0.12.1: {} + oniguruma-parser@0.12.2: {} - oniguruma-to-es@4.3.5: + oniguruma-to-es@4.3.6: dependencies: - oniguruma-parser: 0.12.1 + oniguruma-parser: 0.12.2 regex: 6.1.0 regex-recursion: 6.0.2 - package-manager-detector@1.6.0: {} + package-manager-detector@1.8.0: {} path-data-parser@0.1.0: {} - pathe@2.0.3: {} - perfect-debounce@2.1.0: {} picocolors@1.1.1: {} - picomatch@4.0.4: {} - - pkg-types@1.3.1: - dependencies: - confbox: 0.1.8 - mlly: 1.8.2 - pathe: 2.0.3 + picomatch@4.0.7: {} points-on-curve@0.2.0: {} @@ -2121,15 +1943,15 @@ snapshots: path-data-parser: 0.1.0 points-on-curve: 0.2.0 - postcss@8.5.9: + postcss@8.5.28: dependencies: - nanoid: 3.3.11 + nanoid: 3.3.18 picocolors: 1.1.1 source-map-js: 1.2.1 - prettier@3.8.1: {} + prettier@3.9.6: {} - property-information@7.1.0: {} + property-information@7.2.0: {} regex-recursion@6.0.2: dependencies: @@ -2143,36 +1965,26 @@ snapshots: robust-predicates@3.0.3: {} - rollup@4.60.1: + rolldown@1.2.7: dependencies: - '@types/estree': 1.0.8 + '@oxc-project/types': 0.148.0 + '@rolldown/pluginutils': 1.0.1 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.3 + '@rolldown/binding-android-arm-eabi': 1.2.7 + '@rolldown/binding-android-arm64': 1.2.7 + '@rolldown/binding-darwin-arm64': 1.2.7 + '@rolldown/binding-darwin-x64': 1.2.7 + '@rolldown/binding-freebsd-x64': 1.2.7 + '@rolldown/binding-linux-arm-gnueabihf': 1.2.7 + '@rolldown/binding-linux-arm64-gnu': 1.2.7 + '@rolldown/binding-linux-arm64-musl': 1.2.7 + '@rolldown/binding-linux-ppc64-gnu': 1.2.7 + '@rolldown/binding-linux-s390x-gnu': 1.2.7 + '@rolldown/binding-linux-x64-gnu': 1.2.7 + '@rolldown/binding-linux-x64-musl': 1.2.7 + '@rolldown/binding-openharmony-arm64': 1.2.7 + '@rolldown/binding-win32-arm64-msvc': 1.2.7 + '@rolldown/binding-win32-x64-msvc': 1.2.7 roughjs@4.6.6: dependencies: @@ -2185,42 +1997,42 @@ snapshots: safer-buffer@2.1.2: {} - shiki@3.23.0: + shiki@4.4.3: dependencies: - '@shikijs/core': 3.23.0 - '@shikijs/engine-javascript': 3.23.0 - '@shikijs/engine-oniguruma': 3.23.0 - '@shikijs/langs': 3.23.0 - '@shikijs/themes': 3.23.0 - '@shikijs/types': 3.23.0 + '@shikijs/core': 4.4.3 + '@shikijs/engine-javascript': 4.4.3 + '@shikijs/engine-oniguruma': 4.4.3 + '@shikijs/langs': 4.4.3 + '@shikijs/themes': 4.4.3 + '@shikijs/types': 4.4.3 '@shikijs/vscode-textmate': 10.0.2 - '@types/hast': 3.0.4 + '@types/hast': 3.0.5 source-map-js@1.2.1: {} space-separated-tokens@2.0.2: {} + strictdom@1.0.1: {} + stringify-entities@4.0.4: dependencies: character-entities-html4: 2.1.0 character-entities-legacy: 3.0.0 - stylis@4.3.6: {} + stylis@4.4.0: {} - tabbable@6.4.0: {} + tabbable@6.5.0: {} - tinyexec@1.1.1: {} + tinyexec@1.3.1: {} - tinyglobby@0.2.16: + tinyglobby@0.2.17: dependencies: - fdir: 6.5.0(picomatch@4.0.4) - picomatch: 4.0.4 + fdir: 6.5.0(picomatch@4.0.7) + picomatch: 4.0.7 trim-lines@3.0.1: {} - ts-dedent@2.2.0: {} - - ufo@1.6.3: {} + ts-dedent@2.3.0: {} unist-util-is@6.0.1: dependencies: @@ -2245,7 +2057,7 @@ snapshots: unist-util-is: 6.0.1 unist-util-visit-parents: 6.0.2 - uuid@11.1.0: {} + uuid@14.0.2: {} vfile-message@4.0.3: dependencies: @@ -2257,52 +2069,48 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.3 - vite@7.3.2: + vite@8.2.2: dependencies: - esbuild: 0.27.7 - fdir: 6.5.0(picomatch@4.0.4) - picomatch: 4.0.4 - postcss: 8.5.9 - rollup: 4.60.1 - tinyglobby: 0.2.16 + lightningcss: 1.33.0 + picomatch: 4.0.7 + postcss: 8.5.28 + rolldown: 1.2.7 + tinyglobby: 0.2.17 optionalDependencies: fsevents: 2.3.3 - vitepress@2.0.0-alpha.17(postcss@8.5.9): - dependencies: - '@docsearch/css': 4.6.2 - '@docsearch/js': 4.6.2 - '@docsearch/sidepanel-js': 4.6.2 - '@iconify-json/simple-icons': 1.2.77 - '@shikijs/core': 3.23.0 - '@shikijs/transformers': 3.23.0 - '@shikijs/types': 3.23.0 - '@types/markdown-it': 14.1.2 - '@vitejs/plugin-vue': 6.0.5(vite@7.3.2)(vue@3.5.32) - '@vue/devtools-api': 8.1.1 - '@vue/shared': 3.5.32 - '@vueuse/core': 14.2.1(vue@3.5.32) - '@vueuse/integrations': 14.2.1(focus-trap@8.0.1)(vue@3.5.32) - focus-trap: 8.0.1 + vitepress@2.0.0-alpha.20: + dependencies: + '@docsearch/css': 4.7.0 + '@docsearch/js': 4.7.0 + '@docsearch/sidepanel-js': 4.7.0 + '@iconify-json/simple-icons': 1.2.94 + '@shikijs/transformers': 4.4.3 + '@types/markdown-it': 14.2.0 + '@vitejs/plugin-vue': 6.0.8(vite@8.2.2)(vue@3.5.42) + '@vue/devtools-api': 8.2.1 + '@vue/shared': 3.5.42 + '@vueuse/core': 14.4.0(vue@3.5.42) + '@vueuse/integrations': 14.4.0(focus-trap@8.2.2)(vue@3.5.42) + focus-trap: 8.2.2 mark.js: 8.11.1 minisearch: 7.2.0 - shiki: 3.23.0 - vite: 7.3.2 - vue: 3.5.32 - optionalDependencies: - postcss: 8.5.9 + shiki: 4.4.3 + vite: 8.2.2 + vue: 3.5.42 transitivePeerDependencies: - '@types/node' + - '@vitejs/devtools' - async-validator - axios - change-case - drauu + - esbuild - fuse.js - idb-keyval - jiti - jwt-decode - less - - lightningcss - nprogress - qrcode - sass @@ -2316,29 +2124,12 @@ snapshots: - universal-cookie - yaml - vscode-jsonrpc@8.2.0: {} - - vscode-languageserver-protocol@3.17.5: - dependencies: - vscode-jsonrpc: 8.2.0 - vscode-languageserver-types: 3.17.5 - - vscode-languageserver-textdocument@1.0.12: {} - - vscode-languageserver-types@3.17.5: {} - - vscode-languageserver@9.0.1: - dependencies: - vscode-languageserver-protocol: 3.17.5 - - vscode-uri@3.1.0: {} - - vue@3.5.32: + vue@3.5.42: dependencies: - '@vue/compiler-dom': 3.5.32 - '@vue/compiler-sfc': 3.5.32 - '@vue/runtime-dom': 3.5.32 - '@vue/server-renderer': 3.5.32(vue@3.5.32) - '@vue/shared': 3.5.32 + '@vue/compiler-dom': 3.5.42 + '@vue/compiler-sfc': 3.5.42 + '@vue/runtime-dom': 3.5.42 + '@vue/server-renderer': 3.5.42 + '@vue/shared': 3.5.42 zwitch@2.0.4: {} diff --git a/docs/pnpm-workspace.yaml b/docs/pnpm-workspace.yaml new file mode 100644 index 0000000..5ed0b5a --- /dev/null +++ b/docs/pnpm-workspace.yaml @@ -0,0 +1,2 @@ +allowBuilds: + esbuild: true diff --git a/docs/reference/cli.md b/docs/reference/cli.md index 187b9f2..126eb17 100644 --- a/docs/reference/cli.md +++ b/docs/reference/cli.md @@ -334,7 +334,8 @@ Configure global Git-Iris settings. | `--api-key ` | Set API key | | `--model ` | Set primary model | | `--fast-model ` | Set fast model | -| `--token-limit ` | Set token limit | +| `--subagent-model ` | Set delegated analysis model | +| `--token-limit ` | Set context-window metadata | | `--param ` | Set additional parameters | | `--subagent-timeout ` | Set parallel subagent timeout (default: `120`) | | `--subagent-max-turns ` | Set subagent turn budget (default: `20`) | @@ -347,7 +348,7 @@ git-iris config --provider openai --api-key sk-... # Configure models git-iris config --provider anthropic \ - --model claude-opus-4-6 \ + --model claude-opus-5 \ --fast-model claude-haiku-4-5-20251001 # Set token limit @@ -395,7 +396,7 @@ Manage project-specific `.irisconfig` file. git-iris project-config --provider google # Set project model -git-iris project-config --model gemini-3-pro-preview +git-iris project-config --model gemini-3.8-flash # View project config git-iris project-config --print diff --git a/docs/reference/github-action.md b/docs/reference/github-action.md index 6215a16..490017e 100644 --- a/docs/reference/github-action.md +++ b/docs/reference/github-action.md @@ -111,7 +111,7 @@ jobs: command: release-notes from: v1.0.0 provider: openai - model: gpt-5.4 + model: gpt-6-astra api-key: ${{ secrets.OPENAI_API_KEY }} ``` diff --git a/docs/reference/troubleshooting.md b/docs/reference/troubleshooting.md index 2b4161c..a0fc677 100644 --- a/docs/reference/troubleshooting.md +++ b/docs/reference/troubleshooting.md @@ -135,7 +135,7 @@ Error: Model 'claude-4' not found ```bash # Use correct model name -git-iris config --provider anthropic --model claude-opus-4-6 +git-iris config --provider anthropic --model claude-opus-5 # List available providers git-iris config --help diff --git a/docs/user-guide/index.md b/docs/user-guide/index.md index 8bdee93..ad63251 100644 --- a/docs/user-guide/index.md +++ b/docs/user-guide/index.md @@ -58,7 +58,7 @@ Set your API key and preferences: git-iris config --provider openai --api-key YOUR_OPENAI_API_KEY # Set default model -git-iris config --provider anthropic --model claude-opus-4-6 +git-iris config --provider anthropic --model claude-opus-5 # Google works the same way git-iris config --provider google --api-key YOUR_GOOGLE_API_KEY diff --git a/docs/user-guide/reviews.md b/docs/user-guide/reviews.md index 61fa128..fedecd0 100644 --- a/docs/user-guide/reviews.md +++ b/docs/user-guide/reviews.md @@ -41,15 +41,15 @@ git-iris review [FLAGS] [OPTIONS] ### Global Options -| Option | Description | -| --------------------------- | ------------------------------------------------------------------ | -| `--provider ` | Override LLM provider | -| `--model ` | Override model for this operation | -| `-r, --repo ` | Run against a remote repository URL instead of the local repo | -| `--preset ` | Use instruction preset | -| `-i, --instructions "text"` | Custom review focus | +| Option | Description | +| --------------------------- | ----------------------------------------------------------------------- | +| `--provider ` | Override LLM provider | +| `--model ` | Override model for this operation | +| `-r, --repo ` | Run against a remote repository URL instead of the local repo | +| `--preset ` | Use instruction preset | +| `-i, --instructions "text"` | Custom review focus | | `--critic` / `--no-critic` | Run or skip the critic verification pass after generation (default: on) | -| `--debug` | Show agent execution details | +| `--debug` | Show agent execution details | ## Review Modes @@ -107,20 +107,20 @@ git-iris review --from develop --to feature-xyz Each finding Iris produces is tagged with one of these categories (the `Category` enum in source): -| Category | Focus | -| ------------------ | -------------------------------------------------------------- | -| **security** | Vulnerabilities, unsafe patterns, missing input validation | -| **performance** | Inefficient algorithms, resource leaks, hot-path regressions | -| **error_handling** | Edge cases, error propagation, recovery gaps | -| **complexity** | Deep nesting, god functions, hard-to-reason logic | -| **abstraction** | Leaky abstractions, unclear separation of concerns | -| **duplication** | Copy-pasted code, repeated logic | -| **testing** | Gaps in coverage, brittle or missing tests | -| **style** | Inconsistencies, naming, formatting | -| **api_contract** | Breaking changes, public surface drift | -| **concurrency** | Race conditions, locking errors, async correctness | -| **documentation** | Missing or misleading docs and comments | -| **other** | Anything that doesn't fit cleanly above | +| Category | Focus | +| ------------------ | ------------------------------------------------------------ | +| **security** | Vulnerabilities, unsafe patterns, missing input validation | +| **performance** | Inefficient algorithms, resource leaks, hot-path regressions | +| **error_handling** | Edge cases, error propagation, recovery gaps | +| **complexity** | Deep nesting, god functions, hard-to-reason logic | +| **abstraction** | Leaky abstractions, unclear separation of concerns | +| **duplication** | Copy-pasted code, repeated logic | +| **testing** | Gaps in coverage, brittle or missing tests | +| **style** | Inconsistencies, naming, formatting | +| **api_contract** | Breaking changes, public surface drift | +| **concurrency** | Race conditions, locking errors, async correctness | +| **documentation** | Missing or misleading docs and comments | +| **other** | Anything that doesn't fit cleanly above | ## Output Format @@ -140,6 +140,7 @@ Risk: medium Strategy: Plan → run targeted specialist passes → reconcile findings. Specialist passes: + - Security pass on auth changes - Concurrency pass on the session manager @@ -238,7 +239,7 @@ git-iris review --raw | pandoc -f markdown -t html ### GitHub Review Publishing -Publish the generated review directly to an open GitHub PR: +Publish a review of an open GitHub PR: ```bash # Auto-detect the PR from the current branch @@ -254,7 +255,16 @@ git-iris review --github-review --github-review-event request-changes git-iris review --github-review --github-inline-comments ``` -When `--github-inline-comments` is set, every finding at or above the 70% confidence gate posts an inline comment directly on the cited file and line range — no extra heuristic matching required, since findings carry structured locations. +Publishing resolves the PR before analysis and pins its base and head commits. Without an explicit +commit or range, Iris reviews the PR from its merge base to its head. The commits must be available +locally. An explicit `--commit` or `--to` must match the PR head; unpublished working-tree changes +cannot be attached to a GitHub commit review. If the PR head changes or the PR targets a different +base branch during analysis, publication stops and asks for a new review. Normal base-branch +advancement does not discard the analysis. A push after the final check cannot relabel the review onto newer code: +the submitted review retains the analyzed commit ID. + +When `--github-inline-comments` is set, findings at or above the 70% confidence gate are matched to +reviewable lines in the PR diff. Findings outside those lines remain in the review body. The review body is also augmented with a `## GitHub Permalinks` section listing one permalink per visible finding back to the exact commit and lines, so reviewers can jump straight to the code. diff --git a/justfile b/justfile index f00cd3a..7d513d9 100644 --- a/justfile +++ b/justfile @@ -30,7 +30,7 @@ check: lint test # Run clippy clippy: - cargo clippy --all-targets + cargo clippy --locked --all-targets -- -D warnings # Run clippy with pedantic warnings clippy-pedantic: @@ -96,23 +96,23 @@ doc: # Start VitePress dev server docs-dev: - cd docs && npm run dev + cd docs && pnpm dev # Build VitePress site docs-build: - cd docs && npm run build + cd docs && pnpm build # Preview built VitePress site docs-preview: - cd docs && npm run preview + cd docs && pnpm preview # Format docs markdown with prettier docs-fmt: - cd docs && npm run format + cd docs && pnpm format # Check docs markdown formatting docs-fmt-check: - cd docs && npm run lint + cd docs && pnpm lint # ── Docker ────────────────────────────────────────────────────── diff --git a/src/agents/debug_tool.rs b/src/agents/debug_tool.rs index 94b78a2..546a1a9 100644 --- a/src/agents/debug_tool.rs +++ b/src/agents/debug_tool.rs @@ -1,8 +1,7 @@ //! Debug wrapper for Rig tools to provide real-time observability use anyhow::Result; -use rig::completion::ToolDefinition; -use rig::tool::Tool; +use rig::tool::portable::PortableTool; use serde::{Deserialize, Serialize}; use std::fmt::Debug; use std::marker::PhantomData; @@ -12,7 +11,7 @@ use crate::agents::debug; /// Wrapper that adds debug logging to any Rig tool pub struct DebugTool where - T: Tool, + T: PortableTool, { inner: T, _phantom: PhantomData, @@ -20,7 +19,7 @@ where impl DebugTool where - T: Tool, + T: PortableTool, { pub fn new(tool: T) -> Self { Self { @@ -32,7 +31,7 @@ where impl Clone for DebugTool where - T: Tool + Clone, + T: PortableTool + Clone, { fn clone(&self) -> Self { Self { @@ -44,7 +43,7 @@ where impl Debug for DebugTool where - T: Tool + Debug, + T: PortableTool + Debug, { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { f.debug_struct("DebugTool") @@ -55,7 +54,7 @@ where impl Serialize for DebugTool where - T: Tool + Serialize, + T: PortableTool + Serialize, { fn serialize(&self, serializer: S) -> Result where @@ -67,7 +66,7 @@ where impl<'de, T> Deserialize<'de> for DebugTool where - T: Tool + Deserialize<'de>, + T: PortableTool + Deserialize<'de>, { fn deserialize(deserializer: D) -> Result where @@ -81,9 +80,9 @@ where } } -impl Tool for DebugTool +impl PortableTool for DebugTool where - T: Tool + Send + Sync, + T: PortableTool + Send + Sync, T::Args: Debug + Send + Sync, T::Output: Debug + Send + Sync, T::Error: Send + Sync, @@ -93,8 +92,12 @@ where type Args = T::Args; type Output = T::Output; - async fn definition(&self, prompt: String) -> ToolDefinition { - self.inner.definition(prompt).await + fn description(&self) -> String { + self.inner.description() + } + + fn parameters(&self) -> serde_json::Value { + self.inner.parameters() } async fn call(&self, args: Self::Args) -> Result { diff --git a/src/agents/iris.rs b/src/agents/iris.rs index ca43789..f39b7cd 100644 --- a/src/agents/iris.rs +++ b/src/agents/iris.rs @@ -5,7 +5,6 @@ use anyhow::Result; use rig::agent::{AgentBuilder, PromptResponse}; -use rig::completion::CompletionModel; use schemars::JsonSchema; use serde::de::DeserializeOwned; use serde::{Deserialize, Serialize}; @@ -14,64 +13,6 @@ use std::collections::HashMap; use std::fmt; use std::sync::OnceLock; -/// Macro to build a streaming agent for any provider. -/// -/// All three providers (`OpenAI`, `Anthropic`, `Gemini`) share identical setup logic — -/// subagent creation, tool attachment, optional content update tools — differing -/// only in the provider builder function. This macro eliminates that duplication. -macro_rules! build_streaming_agent { - ($self:expr, $builder_fn:path, $fast_model:expr, $api_key:expr, $subagent_timeout:expr, $subagent_max_turns:expr) => {{ - use crate::agents::debug_tool::DebugTool; - - // Build subagent - let sub_builder = $builder_fn($fast_model, $api_key)? - .name("analyze_subagent") - .preamble("You are a specialized analysis sub-agent."); - let sub_builder = $self.apply_completion_params( - sub_builder, - $fast_model, - 4096, - CompletionProfile::Subagent, - )?; - let sub_agent = crate::attach_core_tools!(sub_builder).build(); - - // Build main agent with tools - let builder = $builder_fn(&$self.model, $api_key)? - .preamble($self.preamble.as_deref().unwrap_or("You are Iris.")); - let builder = $self.apply_completion_params( - builder, - &$self.model, - 16384, - CompletionProfile::MainAgent, - )?; - - let builder = crate::attach_core_tools!(builder) - .tool(DebugTool::new(GitRepoInfo)) - .tool(DebugTool::new($self.workspace.clone())) - .tool(DebugTool::new(ParallelAnalyze::with_limits( - &$self.provider, - $fast_model, - $subagent_timeout, - $subagent_max_turns, - $api_key, - $self.current_provider_additional_params().cloned(), - )?)) - .tool(sub_agent); - - // Conditionally attach content update tools for chat mode - if let Some(sender) = &$self.content_update_sender { - use crate::agents::tools::{UpdateCommitTool, UpdatePRTool, UpdateReviewTool}; - Ok(builder - .tool(DebugTool::new(UpdateCommitTool::new(sender.clone()))) - .tool(DebugTool::new(UpdatePRTool::new(sender.clone()))) - .tool(DebugTool::new(UpdateReviewTool::new(sender.clone()))) - .build()) - } else { - Ok(builder.build()) - } - }}; -} - // Embed capability TOML files at compile time so they're always available const CAPABILITY_COMMIT: &str = include_str!("capabilities/commit.toml"); const CAPABILITY_PR: &str = include_str!("capabilities/pr.toml"); @@ -594,6 +535,13 @@ impl IrisAgent { self.fast_model.as_deref().unwrap_or(&self.model) } + fn effective_subagent_model(&self) -> &str { + provider::current_provider_config(self.config.as_ref(), &self.provider) + .and_then(|config| config.subagent_model.as_deref()) + .filter(|model| !model.is_empty()) + .unwrap_or(&self.model) + } + /// Get the API key for the current provider from config fn get_api_key(&self) -> Option<&str> { provider::current_provider_config(self.config.as_ref(), &self.provider) @@ -619,7 +567,7 @@ impl IrisAgent { use crate::agents::debug_tool::DebugTool; let preamble = self.preamble.as_deref().unwrap_or(DEFAULT_PREAMBLE); - let fast_model = self.effective_fast_model(); + let fast_model = self.effective_subagent_model(); let api_key = self.get_api_key(); let subagent_timeout = self .config @@ -685,57 +633,17 @@ Guidelines: }}; } - match self.provider.as_str() { - "openai" => { - // Build subagent - let sub_agent = build_subagent!(provider::openai_builder(fast_model, api_key)?); - - // Build main agent - let builder = provider::openai_builder(&self.model, api_key)?.preamble(preamble); - let builder = self.apply_completion_params( - builder, - &self.model, - 16384, - CompletionProfile::MainAgent, - )?; - let builder = attach_main_tools!(builder).tool(sub_agent); - let agent = maybe_attach_update_tools!(builder); - Ok(DynAgent::OpenAI(agent)) - } - "anthropic" => { - // Build subagent - let sub_agent = build_subagent!(provider::anthropic_builder(fast_model, api_key)?); - - // Build main agent - let builder = provider::anthropic_builder(&self.model, api_key)?.preamble(preamble); - let builder = self.apply_completion_params( - builder, - &self.model, - 16384, - CompletionProfile::MainAgent, - )?; - let builder = attach_main_tools!(builder).tool(sub_agent); - let agent = maybe_attach_update_tools!(builder); - Ok(DynAgent::Anthropic(agent)) - } - "google" | "gemini" => { - // Build subagent - let sub_agent = build_subagent!(provider::gemini_builder(fast_model, api_key)?); - - // Build main agent - let builder = provider::gemini_builder(&self.model, api_key)?.preamble(preamble); - let builder = self.apply_completion_params( - builder, - &self.model, - 16384, - CompletionProfile::MainAgent, - )?; - let builder = attach_main_tools!(builder).tool(sub_agent); - let agent = maybe_attach_update_tools!(builder); - Ok(DynAgent::Gemini(agent)) - } - _ => Err(anyhow::anyhow!("Unsupported provider: {}", self.provider)), - } + let provider = self.current_provider()?; + let sub_agent = build_subagent!(provider::agent_builder(provider, fast_model, api_key)?); + let builder = provider::agent_builder(provider, &self.model, api_key)?.preamble(preamble); + let builder = self.apply_completion_params( + builder, + &self.model, + 16384, + CompletionProfile::MainAgent, + )?; + let builder = attach_main_tools!(builder).dynamic_tool(sub_agent.into_tool()); + Ok(DynAgent(maybe_attach_update_tools!(builder))) } fn apply_completion_params( @@ -744,10 +652,7 @@ Guidelines: model: &str, max_tokens: u64, profile: CompletionProfile, - ) -> Result> - where - M: CompletionModel, - { + ) -> Result> { let provider = self.current_provider()?; Ok(provider::apply_completion_params( builder, @@ -1351,25 +1256,9 @@ Guidelines: }}; } - // Build and stream per-provider (streaming types are model-specific) - let aggregated_text = match self.provider.as_str() { - "openai" => { - let agent = self.build_openai_agent_for_streaming(&full_prompt)?; - let stream = agent.stream_prompt(&full_prompt).multi_turn(50).await; - consume_stream!(stream) - } - "anthropic" => { - let agent = self.build_anthropic_agent_for_streaming(&full_prompt)?; - let stream = agent.stream_prompt(&full_prompt).multi_turn(50).await; - consume_stream!(stream) - } - "google" | "gemini" => { - let agent = self.build_gemini_agent_for_streaming(&full_prompt)?; - let stream = agent.stream_prompt(&full_prompt).multi_turn(50).await; - consume_stream!(stream) - } - _ => return Err(anyhow::anyhow!("Unsupported provider: {}", self.provider)), - }; + let agent = self.build_agent()?; + let stream = agent.0.stream_prompt(&full_prompt).max_turns(50).await; + let aggregated_text = consume_stream!(stream); // Update status crate::iris_status_dynamic!( @@ -1418,69 +1307,6 @@ Guidelines: parse_with_recovery(sanitized_json.as_ref()).ok() } - /// Shared streaming agent configuration - fn streaming_agent_config(&self) -> (&str, Option<&str>, u64, usize) { - let fast_model = self.effective_fast_model(); - let api_key = self.get_api_key(); - let subagent_timeout = self - .config - .as_ref() - .map_or(120, |c| c.subagent_timeout_secs); - let subagent_max_turns = self.config.as_ref().map_or(20, |c| c.subagent_max_turns); - (fast_model, api_key, subagent_timeout, subagent_max_turns) - } - - /// Build `OpenAI` agent for streaming (with tools attached) - fn build_openai_agent_for_streaming( - &self, - _prompt: &str, - ) -> Result> { - let (fast_model, api_key, subagent_timeout, subagent_max_turns) = - self.streaming_agent_config(); - build_streaming_agent!( - self, - provider::openai_builder, - fast_model, - api_key, - subagent_timeout, - subagent_max_turns - ) - } - - /// Build Anthropic agent for streaming (with tools attached) - fn build_anthropic_agent_for_streaming( - &self, - _prompt: &str, - ) -> Result> { - let (fast_model, api_key, subagent_timeout, subagent_max_turns) = - self.streaming_agent_config(); - build_streaming_agent!( - self, - provider::anthropic_builder, - fast_model, - api_key, - subagent_timeout, - subagent_max_turns - ) - } - - /// Build Gemini agent for streaming (with tools attached) - fn build_gemini_agent_for_streaming( - &self, - _prompt: &str, - ) -> Result> { - let (fast_model, api_key, subagent_timeout, subagent_max_turns) = - self.streaming_agent_config(); - build_streaming_agent!( - self, - provider::gemini_builder, - fast_model, - api_key, - subagent_timeout, - subagent_max_turns - ) - } - /// Load capability configuration from embedded TOML, returning both prompt and output type fn load_capability_config(&self, capability: &str) -> Result<(String, String)> { let _ = self; // Keep &self for method syntax consistency @@ -1590,7 +1416,7 @@ Guidelines: /// Builder for creating `IrisAgent` instances with different configurations pub struct IrisAgentBuilder { provider: String, - model: String, + model: Option, preamble: Option, } @@ -1600,7 +1426,7 @@ impl IrisAgentBuilder { pub fn new() -> Self { Self { provider: "openai".to_string(), - model: "gpt-5.4".to_string(), + model: None, preamble: None, } } @@ -1613,7 +1439,7 @@ impl IrisAgentBuilder { /// Set the model to use pub fn with_model(mut self, model: impl Into) -> Self { - self.model = model.into(); + self.model = Some(model.into()); self } @@ -1629,7 +1455,12 @@ impl IrisAgentBuilder { /// /// Returns an error when the configured provider or model cannot build an agent. pub fn build(self) -> Result { - let mut agent = IrisAgent::new(&self.provider, &self.model)?; + let provider = provider::provider_from_name(&self.provider)?; + let model = self + .model + .as_deref() + .unwrap_or_else(|| provider.default_model()); + let mut agent = IrisAgent::new(provider.name(), model)?; // Apply custom preamble if provided if let Some(preamble) = self.preamble { @@ -1891,3 +1722,7 @@ Line2\"}"; assert!(!prompt.contains("`:analytics:`")); } } + +#[cfg(test)] +#[path = "iris_workflow_tests.rs"] +mod workflow_tests; diff --git a/src/agents/iris_workflow_tests.rs b/src/agents/iris_workflow_tests.rs new file mode 100644 index 0000000..181b747 --- /dev/null +++ b/src/agents/iris_workflow_tests.rs @@ -0,0 +1,40 @@ +use super::*; +use crate::{config::Config, providers::Provider}; + +#[test] +fn delegated_analysis_defaults_to_main_model_and_honors_override() { + let mut config = Config::default(); + let mut agent = IrisAgent::new("openai", "gpt-6-astra").expect("agent"); + agent.set_fast_model("gpt-5.6-luna".to_string()); + agent.set_config(config.clone()); + assert_eq!(agent.effective_subagent_model(), "gpt-6-astra"); + config + .providers + .get_mut("openai") + .expect("provider") + .subagent_model = Some("gpt-5.6-sol".to_string()); + agent.set_config(config); + assert_eq!(agent.effective_subagent_model(), "gpt-5.6-sol"); +} + +#[test] +fn all_providers_build_complete_agents_and_select_their_own_defaults() { + for provider in Provider::ALL { + let mut config = Config { + default_provider: provider.name().to_string(), + ..Config::default() + }; + config + .providers + .get_mut(provider.name()) + .expect("provider") + .api_key = "test-key".to_string(); + let mut agent = IrisAgentBuilder::new() + .with_provider(provider.name()) + .build() + .expect("agent"); + assert_eq!(agent.model, provider.default_model()); + agent.set_config(config); + assert!(agent.build_agent().is_ok(), "provider {provider}"); + } +} diff --git a/src/agents/provider.rs b/src/agents/provider.rs index 9a34e53..0b2bb6e 100644 --- a/src/agents/provider.rs +++ b/src/agents/provider.rs @@ -1,30 +1,17 @@ -//! Dynamic provider abstraction for rig-core 0.27+ -//! -//! This module provides runtime provider selection using enum dispatch, -//! allowing git-iris to work with any supported provider based on config. +//! Provider transports and workflow defaults for the shared Rig agent runtime. use anyhow::Result; use rig::{ agent::{Agent, AgentBuilder, PromptResponse}, - client::{CompletionClient, ProviderClient}, - completion::{CompletionModel, Prompt, PromptError}, - providers::{anthropic, gemini, openai}, + client::{AgentClientExt, CompletionClient}, + completion::{Prompt, PromptError}, + providers::{anthropic, gemini, openai, openrouter}, }; use serde_json::{Map, Value, json}; use std::collections::HashMap; use crate::providers::{Provider, ProviderConfig}; -/// Completion model types for each provider -pub type OpenAIModel = openai::completion::CompletionModel; -pub type AnthropicModel = anthropic::completion::CompletionModel; -pub type GeminiModel = gemini::completion::CompletionModel; - -/// Agent builder types for each provider -pub type OpenAIBuilder = AgentBuilder; -pub type AnthropicBuilder = AgentBuilder; -pub type GeminiBuilder = AgentBuilder; - #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub enum CompletionProfile { MainAgent, @@ -42,58 +29,91 @@ impl CompletionProfile { } } -/// Dynamic agent that can be any provider's agent type -pub enum DynAgent { - OpenAI(Agent), - Anthropic(Agent), - Gemini(Agent), -} +/// Shared provider-independent agent runtime. +#[derive(Clone)] +pub struct DynAgent(pub Agent); impl DynAgent { - /// Simple prompt - returns response string + /// Send a prompt through the selected provider. /// /// # Errors - /// - /// Returns an error when the underlying provider request fails. + /// Returns the underlying provider or tool error. pub async fn prompt(&self, msg: &str) -> Result { - match self { - Self::OpenAI(a) => a.prompt(msg).await, - Self::Anthropic(a) => a.prompt(msg).await, - Self::Gemini(a) => a.prompt(msg).await, - } + self.0.prompt(msg).await } - /// Multi-turn prompt with specified depth for tool calling + /// Execute a bounded multi-turn tool loop. /// /// # Errors - /// - /// Returns an error when the underlying provider request fails. + /// Returns the underlying provider or tool error. pub async fn prompt_multi_turn(&self, msg: &str, depth: usize) -> Result { - match self { - Self::OpenAI(a) => a.prompt(msg).max_turns(depth).await, - Self::Anthropic(a) => a.prompt(msg).max_turns(depth).await, - Self::Gemini(a) => a.prompt(msg).max_turns(depth).await, - } + self.0.prompt(msg).max_turns(depth).await } - /// Multi-turn prompt with extended details (token usage, etc.) + /// Execute a tool loop and include usage details. /// /// # Errors - /// - /// Returns an error when the underlying provider request fails. + /// Returns the underlying provider or tool error. pub async fn prompt_extended( &self, msg: &str, depth: usize, ) -> Result { - match self { - Self::OpenAI(a) => a.prompt(msg).max_turns(depth).extended_details().await, - Self::Anthropic(a) => a.prompt(msg).max_turns(depth).extended_details().await, - Self::Gemini(a) => a.prompt(msg).max_turns(depth).extended_details().await, - } + self.0.prompt(msg).max_turns(depth).extended_details().await } } +/// Select the provider transport while sharing the agent runtime. +/// +/// # Errors +/// Returns an error when provider credentials or client configuration are invalid. +pub fn agent_builder( + provider: Provider, + model: &str, + api_key: Option<&str>, +) -> Result { + agent_builder_at(provider, model, api_key, None) +} + +fn agent_builder_at( + provider: Provider, + model: &str, + api_key: Option<&str>, + base_url: Option<&str>, +) -> Result { + let key = required_api_key(api_key, provider)?; + macro_rules! client { + ($client:path) => {{ + let builder = <$client>::builder().api_key(&key); + let builder = if let Some(url) = base_url { + builder.base_url(url) + } else { + builder + }; + builder.build().map_err(|_| { + anyhow::anyhow!( + "Failed to create {provider} client: authentication or configuration error" + ) + })? + }}; + } + Ok(match provider { + Provider::OpenAI => client!(openai::Client).agent(model), + Provider::Anthropic => anthropic_agent_builder(&client!(anthropic::Client), model), + Provider::Google => client!(gemini::Client).agent(model), + Provider::OpenRouter => client!(openrouter::Client).agent(model), + Provider::Fireworks => { + let base_url = base_url.unwrap_or(FIREWORKS_BASE_URL); + let client = openai::Client::builder() + .api_key(&key) + .base_url(base_url) + .build() + .map_err(|_| anyhow::anyhow!("Failed to create Fireworks client"))?; + client.completions_api().agent(model) + } + }) +} + /// Source of the resolved API key (for logging/debugging) #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub enum ApiKeySource { @@ -161,106 +181,23 @@ pub fn resolve_api_key( (None, ApiKeySource::ClientDefault) } -/// Create an `OpenAI` agent builder -/// -/// # Arguments -/// * `model` - The model name to use -/// * `api_key` - Optional API key from config. Resolution order: -/// 1. Non-empty `api_key` parameter (from config) -/// 2. `OPENAI_API_KEY` environment variable -/// 3. Client's `from_env()` (requires env var to be set) -/// -/// # Errors -/// Returns an error if client creation fails (invalid credentials or missing env var). -/// -/// # Security -/// Error messages are sanitized to prevent potential API key exposure. -pub fn openai_builder(model: &str, api_key: Option<&str>) -> Result { - let (resolved_key, _source) = resolve_api_key(api_key, Provider::OpenAI); - let client = match resolved_key { - Some(key) => openai::Client::new(&key) - // Sanitize error to prevent potential key exposure in error messages - .map_err(|_| { - anyhow::anyhow!( - "Failed to create OpenAI client: authentication or configuration error" - ) - })?, - None => openai::Client::from_env() - .map_err(|_| anyhow::anyhow!("Failed to create OpenAI client from environment"))?, - }; - Ok(client.completions_api().agent(model)) -} - -/// Wrap an existing Anthropic client into an agent builder with prompt caching. -/// -/// Enables Anthropic's automatic prompt caching: a top-level `cache_control` -/// breakpoint that the API places on the last cacheable block and advances as -/// the conversation grows. On Iris's multi-turn tool loops, where every turn -/// otherwise re-sends the whole transcript at full input price, cached turns -/// are billed at a fraction of that cost. Caching is unconditional: prompts -/// below the model's cacheable minimum are simply not cached by the API. -pub fn anthropic_agent_builder(client: &anthropic::Client, model: &str) -> AnthropicBuilder { +/// Enable Anthropic prompt caching for the complete multi-turn transcript. +pub fn anthropic_agent_builder(client: &anthropic::Client, model: &str) -> AgentBuilder { AgentBuilder::new(client.completion_model(model).with_automatic_caching()) } -/// Create an Anthropic agent builder with prompt caching enabled. -/// -/// # Arguments -/// * `model` - The model name to use -/// * `api_key` - Optional API key from config. Resolution order: -/// 1. Non-empty `api_key` parameter (from config) -/// 2. `ANTHROPIC_API_KEY` environment variable -/// 3. Client's `from_env()` (requires env var to be set) -/// -/// # Errors -/// Returns an error if client creation fails (invalid credentials or missing env var). -/// -/// # Security -/// Error messages are sanitized to prevent potential API key exposure. -pub fn anthropic_builder(model: &str, api_key: Option<&str>) -> Result { - let (resolved_key, _source) = resolve_api_key(api_key, Provider::Anthropic); - let client = match resolved_key { - Some(key) => anthropic::Client::new(&key) - // Sanitize error to prevent potential key exposure in error messages - .map_err(|_| { - anyhow::anyhow!( - "Failed to create Anthropic client: authentication or configuration error" - ) - })?, - None => anthropic::Client::from_env() - .map_err(|_| anyhow::anyhow!("Failed to create Anthropic client from environment"))?, - }; - Ok(anthropic_agent_builder(&client, model)) -} - -/// Create a Gemini agent builder -/// -/// # Arguments -/// * `model` - The model name to use -/// * `api_key` - Optional API key from config. Resolution order: -/// 1. Non-empty `api_key` parameter (from config) -/// 2. `GOOGLE_API_KEY` environment variable -/// 3. Client's `from_env()` (requires env var to be set) -/// -/// # Errors -/// Returns an error if client creation fails (invalid credentials or missing env var). -/// -/// # Security -/// Error messages are sanitized to prevent potential API key exposure. -pub fn gemini_builder(model: &str, api_key: Option<&str>) -> Result { - let (resolved_key, _source) = resolve_api_key(api_key, Provider::Google); - let client = match resolved_key { - Some(key) => gemini::Client::new(&key) - // Sanitize error to prevent potential key exposure in error messages - .map_err(|_| { - anyhow::anyhow!( - "Failed to create Gemini client: authentication or configuration error" - ) - })?, - None => gemini::Client::from_env() - .map_err(|_| anyhow::anyhow!("Failed to create Gemini client from environment"))?, - }; - Ok(client.agent(model)) +pub(crate) const FIREWORKS_BASE_URL: &str = "https://api.fireworks.ai/inference/v1"; + +fn required_api_key(api_key: Option<&str>, provider: Provider) -> Result { + resolve_api_key(api_key, provider) + .0 + .filter(|key| !key.is_empty()) + .ok_or_else(|| { + anyhow::anyhow!( + "API key required for {provider}: set {} or configure a key", + provider.api_key_env() + ) + }) } fn parse_additional_param_value(raw: &str) -> Value { @@ -282,50 +219,103 @@ where params } -fn supports_openai_reasoning_defaults(model: &str) -> bool { - model.to_lowercase().starts_with("gpt-5") -} - fn completion_params_json( additional_params: Option<&HashMap>, provider: Provider, model: &str, - max_tokens: u64, + _max_tokens: u64, profile: CompletionProfile, ) -> Map where S: std::hash::BuildHasher, { let mut params = additional_params_json(additional_params); - - if provider == Provider::OpenAI && needs_max_completion_tokens(model) { - params.insert("max_completion_tokens".to_string(), json!(max_tokens)); - } - - if provider == Provider::OpenAI - && supports_openai_reasoning_defaults(model) - && !params.contains_key("reasoning") - { - params.insert( - "reasoning".to_string(), - json!({ "effort": profile.default_openai_reasoning_effort() }), - ); + let model = model.to_lowercase(); + match provider { + Provider::OpenAI if model.starts_with("gpt-5") || model.starts_with("gpt-6") => { + let effort = + if model.starts_with("gpt-6") && profile == CompletionProfile::StatusMessage { + "low" + } else { + profile.default_openai_reasoning_effort() + }; + params + .entry("reasoning") + .or_insert_with(|| json!({"effort": effort})); + } + Provider::Anthropic if model.starts_with("claude-opus-5") => { + if profile != CompletionProfile::StatusMessage { + params + .entry("thinking") + .or_insert_with(|| json!({"type": "adaptive"})); + let effort = if profile == CompletionProfile::MainAgent { + "high" + } else { + "low" + }; + let output = params.entry("output_config").or_insert_with(|| json!({})); + if let Some(output) = output.as_object_mut() { + output.entry("effort").or_insert_with(|| json!(effort)); + } + } + } + Provider::OpenRouter => { + if model.starts_with("anthropic/claude-opus-5") { + let effort = if profile == CompletionProfile::MainAgent { + "high" + } else { + "low" + }; + params + .entry("reasoning") + .or_insert_with(|| json!({"effort": effort})); + } else if model.starts_with("openai/gpt-5") || model.starts_with("openai/gpt-6") { + let effort = if model.starts_with("openai/gpt-6") + && profile == CompletionProfile::StatusMessage + { + "low" + } else { + profile.default_openai_reasoning_effort() + }; + params + .entry("reasoning") + .or_insert_with(|| json!({"effort": effort})); + } + } + Provider::Fireworks if model.starts_with("accounts/fireworks/models/deepseek-v4-") => { + let effort = if profile == CompletionProfile::StatusMessage { + "none" + } else { + "high" + }; + if !params.contains_key("thinking") { + params + .entry("reasoning_effort") + .or_insert_with(|| json!(effort)); + } + } + Provider::Google if model.starts_with("gemini-3.8-flash") => { + let effort = if profile == CompletionProfile::MainAgent { + "medium" + } else { + "low" + }; + let config = params + .entry("generationConfig") + .or_insert_with(|| json!({})); + if let Some(config) = config.as_object_mut() { + config + .entry("thinkingConfig") + .or_insert_with(|| json!({"thinkingLevel": effort})); + } + } + _ => {} } - params } -fn needs_max_completion_tokens(model: &str) -> bool { - let model = model.to_lowercase(); - model.starts_with("gpt-5") - || model.starts_with("gpt-4.1") - || model.starts_with("o1") - || model.starts_with("o3") - || model.starts_with("o4") -} - pub fn apply_completion_params( - mut builder: AgentBuilder, + builder: AgentBuilder, provider: Provider, model: &str, max_tokens: u64, @@ -333,15 +323,10 @@ pub fn apply_completion_params( profile: CompletionProfile, ) -> AgentBuilder where - M: CompletionModel, S: std::hash::BuildHasher, { - if !(provider == Provider::OpenAI && needs_max_completion_tokens(model)) { - builder = builder.max_tokens(max_tokens); - } - + let builder = builder.max_tokens(max_tokens); let params = completion_params_json(additional_params, provider, model, max_tokens, profile); - if params.is_empty() { builder } else { @@ -369,171 +354,4 @@ pub fn current_provider_config<'a>( } #[cfg(test)] -mod tests { - use super::*; - - #[test] - fn test_resolve_api_key_uses_config_when_provided() { - // Config key takes precedence - let (key, source) = resolve_api_key(Some("sk-config-key-1234567890"), Provider::OpenAI); - assert_eq!(key, Some("sk-config-key-1234567890".to_string())); - assert_eq!(source, ApiKeySource::Config); - } - - #[test] - fn test_resolve_api_key_empty_config_not_used() { - // Empty config should NOT be treated as a valid key - // It should fall through to env var or client default - let empty_config: Option<&str> = Some(""); - let (_key, source) = resolve_api_key(empty_config, Provider::OpenAI); - - // Empty config should NOT return Config source - // This test verifies the empty string is treated as "not configured" - assert_ne!(source, ApiKeySource::Config); - } - - #[test] - fn test_resolve_api_key_none_config_checks_env() { - // When config is None, should check env var - let (key, source) = resolve_api_key(None, Provider::OpenAI); - - // Result depends on whether OPENAI_API_KEY is set in the environment - // We just verify the function doesn't panic and returns appropriate source - match source { - ApiKeySource::Environment => { - assert!(key.is_some()); - } - ApiKeySource::ClientDefault => { - assert!(key.is_none()); - } - ApiKeySource::Config => { - unreachable!("Should not return Config source when config is None"); - } - } - } - - #[test] - fn test_api_key_source_enum_equality() { - assert_eq!(ApiKeySource::Config, ApiKeySource::Config); - assert_eq!(ApiKeySource::Environment, ApiKeySource::Environment); - assert_eq!(ApiKeySource::ClientDefault, ApiKeySource::ClientDefault); - assert_ne!(ApiKeySource::Config, ApiKeySource::Environment); - } - - #[test] - fn test_resolve_api_key_all_providers() { - // Test that resolve_api_key works for all supported providers - for provider in Provider::ALL { - let (key, source) = resolve_api_key(Some("test-key-123456789012345"), *provider); - assert_eq!(key, Some("test-key-123456789012345".to_string())); - assert_eq!(source, ApiKeySource::Config); - } - } - - #[test] - fn test_resolve_api_key_config_precedence() { - // Even if env var is set, config should take precedence - // We can't easily mock env vars in unit tests, but we can verify - // that a provided config key is always used regardless of env state - let config_key = "sk-from-config-abcdef1234567890"; - let (key, source) = resolve_api_key(Some(config_key), Provider::OpenAI); - - assert_eq!(key.as_deref(), Some(config_key)); - assert_eq!(source, ApiKeySource::Config); - } - - #[test] - fn test_api_key_source_debug_impl() { - // Verify Debug is implemented for logging purposes - let source = ApiKeySource::Config; - let debug_str = format!("{:?}", source); - assert!(debug_str.contains("Config")); - } - - #[test] - fn test_apply_completion_params_parses_json_like_additional_params() { - let mut additional_params = HashMap::new(); - additional_params.insert("temperature".to_string(), "0.7".to_string()); - additional_params.insert("reasoning".to_string(), r#"{"effort":"low"}"#.to_string()); - - let params = additional_params_json(Some(&additional_params)); - assert_eq!(params.get("temperature"), Some(&json!(0.7))); - assert_eq!(params.get("reasoning"), Some(&json!({"effort": "low"}))); - } - - #[test] - fn test_completion_params_use_profile_specific_openai_reasoning_defaults() { - let main_params = completion_params_json::( - None, - Provider::OpenAI, - "gpt-5.4", - 16_384, - CompletionProfile::MainAgent, - ); - assert_eq!( - main_params.get("reasoning"), - Some(&json!({"effort": "medium"})) - ); - assert_eq!( - main_params.get("max_completion_tokens"), - Some(&json!(16_384)) - ); - - let status_params = completion_params_json::( - None, - Provider::OpenAI, - "gpt-5.4-mini", - 50, - CompletionProfile::StatusMessage, - ); - assert_eq!( - status_params.get("reasoning"), - Some(&json!({"effort": "none"})) - ); - assert_eq!(status_params.get("max_completion_tokens"), Some(&json!(50))); - } - - #[test] - fn test_completion_params_preserve_explicit_reasoning_overrides() { - let mut additional_params = HashMap::new(); - additional_params.insert("reasoning".to_string(), r#"{"effort":"high"}"#.to_string()); - - let params = completion_params_json( - Some(&additional_params), - Provider::OpenAI, - "gpt-5.4", - 4096, - CompletionProfile::MainAgent, - ); - - assert_eq!(params.get("reasoning"), Some(&json!({"effort": "high"}))); - } - - #[test] - fn test_completion_params_skip_openai_reasoning_defaults_for_non_gpt5_models() { - let params = completion_params_json::( - None, - Provider::OpenAI, - "gpt-4.1", - 4096, - CompletionProfile::MainAgent, - ); - - assert!(!params.contains_key("reasoning")); - assert_eq!(params.get("max_completion_tokens"), Some(&json!(4096))); - } - - #[test] - fn test_provider_from_name_supports_aliases() { - assert_eq!(provider_from_name("openai").ok(), Some(Provider::OpenAI)); - assert_eq!(provider_from_name("claude").ok(), Some(Provider::Anthropic)); - assert_eq!(provider_from_name("gemini").ok(), Some(Provider::Google)); - } - - #[test] - fn test_needs_max_completion_tokens_for_gpt5_family() { - assert!(needs_max_completion_tokens("gpt-5.4")); - assert!(needs_max_completion_tokens("o3")); - assert!(!needs_max_completion_tokens("claude-opus-4-6")); - } -} +mod tests; diff --git a/src/agents/provider/tests/mod.rs b/src/agents/provider/tests/mod.rs new file mode 100644 index 0000000..b8e1e15 --- /dev/null +++ b/src/agents/provider/tests/mod.rs @@ -0,0 +1,289 @@ +use super::*; + +#[test] +fn test_resolve_api_key_uses_config_when_provided() { + // Config key takes precedence + let (key, source) = resolve_api_key(Some("sk-config-key-1234567890"), Provider::OpenAI); + assert_eq!(key, Some("sk-config-key-1234567890".to_string())); + assert_eq!(source, ApiKeySource::Config); +} + +#[test] +fn test_resolve_api_key_empty_config_not_used() { + // Empty config should NOT be treated as a valid key + // It should fall through to env var or client default + let empty_config: Option<&str> = Some(""); + let (_key, source) = resolve_api_key(empty_config, Provider::OpenAI); + + // Empty config should NOT return Config source + // This test verifies the empty string is treated as "not configured" + assert_ne!(source, ApiKeySource::Config); +} + +#[test] +fn test_resolve_api_key_none_config_checks_env() { + // When config is None, should check env var + let (key, source) = resolve_api_key(None, Provider::OpenAI); + + // Result depends on whether OPENAI_API_KEY is set in the environment + // We just verify the function doesn't panic and returns appropriate source + match source { + ApiKeySource::Environment => { + assert!(key.is_some()); + } + ApiKeySource::ClientDefault => { + assert!(key.is_none()); + } + ApiKeySource::Config => { + unreachable!("Should not return Config source when config is None"); + } + } +} + +#[test] +fn test_api_key_source_enum_equality() { + assert_eq!(ApiKeySource::Config, ApiKeySource::Config); + assert_eq!(ApiKeySource::Environment, ApiKeySource::Environment); + assert_eq!(ApiKeySource::ClientDefault, ApiKeySource::ClientDefault); + assert_ne!(ApiKeySource::Config, ApiKeySource::Environment); +} + +#[test] +fn test_resolve_api_key_all_providers() { + // Test that resolve_api_key works for all supported providers + for provider in Provider::ALL { + let (key, source) = resolve_api_key(Some("test-key-123456789012345"), *provider); + assert_eq!(key, Some("test-key-123456789012345".to_string())); + assert_eq!(source, ApiKeySource::Config); + } +} + +#[test] +fn test_resolve_api_key_config_precedence() { + // Even if env var is set, config should take precedence + // We can't easily mock env vars in unit tests, but we can verify + // that a provided config key is always used regardless of env state + let config_key = "sk-from-config-abcdef1234567890"; + let (key, source) = resolve_api_key(Some(config_key), Provider::OpenAI); + + assert_eq!(key.as_deref(), Some(config_key)); + assert_eq!(source, ApiKeySource::Config); +} + +#[test] +fn test_api_key_source_debug_impl() { + // Verify Debug is implemented for logging purposes + let source = ApiKeySource::Config; + let debug_str = format!("{:?}", source); + assert!(debug_str.contains("Config")); +} + +#[test] +fn test_apply_completion_params_parses_json_like_additional_params() { + let mut additional_params = HashMap::new(); + additional_params.insert("temperature".to_string(), "0.7".to_string()); + additional_params.insert("reasoning".to_string(), r#"{"effort":"low"}"#.to_string()); + + let params = additional_params_json(Some(&additional_params)); + assert_eq!(params.get("temperature"), Some(&json!(0.7))); + assert_eq!(params.get("reasoning"), Some(&json!({"effort": "low"}))); +} + +#[test] +fn test_completion_params_use_profile_specific_openai_reasoning_defaults() { + let main_params = completion_params_json::( + None, + Provider::OpenAI, + "gpt-5.4", + 16_384, + CompletionProfile::MainAgent, + ); + assert_eq!( + main_params.get("reasoning"), + Some(&json!({"effort": "medium"})) + ); + assert!(!main_params.contains_key("max_output_tokens")); + + let status_params = completion_params_json::( + None, + Provider::OpenAI, + "gpt-5.4-mini", + 50, + CompletionProfile::StatusMessage, + ); + assert_eq!( + status_params.get("reasoning"), + Some(&json!({"effort": "none"})) + ); + assert!(!status_params.contains_key("max_output_tokens")); +} + +#[test] +fn test_completion_params_preserve_explicit_reasoning_overrides() { + let mut additional_params = HashMap::new(); + additional_params.insert("reasoning".to_string(), r#"{"effort":"high"}"#.to_string()); + + let params = completion_params_json( + Some(&additional_params), + Provider::OpenAI, + "gpt-5.4", + 4096, + CompletionProfile::MainAgent, + ); + + assert_eq!(params.get("reasoning"), Some(&json!({"effort": "high"}))); +} + +#[test] +fn test_completion_params_skip_openai_reasoning_defaults_for_non_gpt5_models() { + let params = completion_params_json::( + None, + Provider::OpenAI, + "gpt-4.1", + 4096, + CompletionProfile::MainAgent, + ); + + assert!(!params.contains_key("reasoning")); + assert!(!params.contains_key("max_output_tokens")); +} + +#[test] +fn test_provider_from_name_supports_aliases() { + assert_eq!(provider_from_name("openai").ok(), Some(Provider::OpenAI)); + assert_eq!(provider_from_name("claude").ok(), Some(Provider::Anthropic)); + assert_eq!(provider_from_name("gemini").ok(), Some(Provider::Google)); +} + +mod wire_tests; + +#[test] +fn model_profiles_keep_status_cheap_and_subagents_capable() { + let params = |provider, model, profile| { + completion_params_json::( + None, provider, model, 4096, profile, + ) + }; + assert_eq!( + params(Provider::OpenAI, "gpt-6-astra", CompletionProfile::Subagent)["reasoning"]["effort"], + "low" + ); + assert_eq!( + params( + Provider::OpenAI, + "gpt-6-astra", + CompletionProfile::StatusMessage + )["reasoning"]["effort"], + "low" + ); + assert_eq!( + params( + Provider::OpenAI, + "gpt-5.6-luna", + CompletionProfile::StatusMessage + )["reasoning"]["effort"], + "none" + ); + assert_eq!( + params( + Provider::Anthropic, + "claude-opus-5", + CompletionProfile::Subagent + )["output_config"]["effort"], + "low" + ); + assert!( + params( + Provider::Anthropic, + "claude-haiku-4-5-20251001", + CompletionProfile::StatusMessage + ) + .is_empty() + ); + assert!( + params( + Provider::Google, + "gemini-3.5-flash-lite", + CompletionProfile::StatusMessage + ) + .is_empty() + ); + assert_eq!( + params( + Provider::Fireworks, + Provider::Fireworks.default_fast_model(), + CompletionProfile::StatusMessage + )["reasoning_effort"], + "none" + ); + assert!( + params( + Provider::Fireworks, + "accounts/custom/models/custom", + CompletionProfile::MainAgent + ) + .is_empty() + ); +} + +#[test] +fn native_parameter_overrides_survive_profile_defaults() { + let params = HashMap::from([ + ("thinking".to_string(), r#"{"type":"disabled"}"#.to_string()), + ( + "output_config".to_string(), + r#"{"effort":"max","format":{"type":"json_schema"}}"#.to_string(), + ), + ]); + let result = completion_params_json( + Some(¶ms), + Provider::Anthropic, + "claude-opus-5", + 4096, + CompletionProfile::MainAgent, + ); + assert_eq!(result["thinking"]["type"], "disabled"); + assert_eq!(result["output_config"]["effort"], "max"); + assert_eq!(result["output_config"]["format"]["type"], "json_schema"); +} + +#[test] +fn provider_registry_drives_configuration_defaults() { + let config = crate::config::Config::default(); + for provider in [Provider::OpenRouter, Provider::Fireworks] { + let provider_config = config + .get_provider_config(provider.name()) + .expect("provider configuration"); + assert_eq!( + provider_config.effective_subagent_model(provider), + provider.default_model() + ); + assert_eq!( + provider_config.effective_fast_model(provider), + provider.default_fast_model() + ); + } +} + +#[test] +fn cli_accepts_subagent_models_for_both_config_scopes() { + use clap::Parser; + for command in ["config", "project-config"] { + let cli = crate::cli::Cli::try_parse_from([ + "git-iris", + command, + "--provider", + "openrouter", + "--subagent-model", + "openai/gpt-5.6-sol", + ]) + .expect("configuration args"); + let (crate::cli::Commands::Config { subagent_model, .. } + | crate::cli::Commands::ProjectConfig { subagent_model, .. }) = + cli.command.expect("command") + else { + panic!("expected config"); + }; + assert_eq!(subagent_model.as_deref(), Some("openai/gpt-5.6-sol")); + } +} diff --git a/src/agents/provider/tests/wire_tests.rs b/src/agents/provider/tests/wire_tests.rs new file mode 100644 index 0000000..111c415 --- /dev/null +++ b/src/agents/provider/tests/wire_tests.rs @@ -0,0 +1,259 @@ +use super::super::*; +use rig::tool::portable::PortableTool; +use tokio::io::{AsyncReadExt, AsyncWriteExt}; + +struct Probe; +impl PortableTool for Probe { + const NAME: &'static str = "probe"; + type Error = std::io::Error; + type Args = Value; + type Output = String; + + fn description(&self) -> String { + "Return a test result".to_string() + } + fn parameters(&self) -> Value { + json!({"type":"object", "properties":{}, "additionalProperties":false}) + } + fn call(&self, _args: Value) -> impl std::future::Future> { + std::future::ready(Ok("verified".to_string())) + } +} + +async fn mock_server( + responses: Vec, +) -> (String, tokio::task::JoinHandle>) { + let listener = tokio::net::TcpListener::bind("127.0.0.1:0") + .await + .expect("bind mock"); + let address = listener.local_addr().expect("address"); + let task = tokio::spawn(async move { + let mut requests = Vec::new(); + for response in responses { + let (mut socket, _) = listener.accept().await.expect("accept request"); + let mut bytes = Vec::new(); + let (header_end, length) = loop { + let mut buffer = [0u8; 4096]; + let read = socket.read(&mut buffer).await.expect("read request"); + assert_ne!(read, 0, "incomplete HTTP request"); + bytes.extend_from_slice(&buffer[..read]); + if let Some(end) = bytes.windows(4).position(|bytes| bytes == b"\r\n\r\n") { + let headers = String::from_utf8_lossy(&bytes[..end]); + let length = headers + .lines() + .find_map(|line| { + let (name, value) = line.split_once(':')?; + name.eq_ignore_ascii_case("content-length") + .then(|| value.trim().parse::().expect("content length")) + }) + .expect("content length header"); + break (end + 4, length); + } + }; + while bytes.len() < header_end + length { + let mut buffer = [0u8; 4096]; + let read = socket.read(&mut buffer).await.expect("read body"); + assert_ne!(read, 0); + bytes.extend_from_slice(&buffer[..read]); + } + let headers = String::from_utf8_lossy(&bytes[..header_end]).into_owned(); + let body = + serde_json::from_slice(&bytes[header_end..header_end + length]).expect("JSON body"); + requests.push((headers, body)); + let body = response.to_string(); + let response = format!( + "HTTP/1.1 200 OK\r\nContent-Type: application/json\r\nContent-Length: {}\r\nConnection: close\r\n\r\n{body}", + body.len() + ); + socket + .write_all(response.as_bytes()) + .await + .expect("write response"); + } + requests + }); + (format!("http://{address}"), task) +} + +fn responses_result(output: &Value) -> Value { + json!({"id":"resp_test", "object":"response", "created_at":1, "status":"completed", "model":"gpt-6-astra", "output":output}) +} + +fn chat_result(message: &Value, finish: &str) -> Value { + json!({"id":"chat_test", "object":"chat.completion", "created":1, "model":"test", "choices":[{"index":0,"message":message,"finish_reason":finish}]}) +} + +#[tokio::test] +async fn responses_preserve_reasoning_and_tool_results_across_turns() { + let first = responses_result(&json!([ + {"type":"reasoning","id":"rs_test","summary":[],"encrypted_content":"encrypted-test"}, + {"type":"function_call","id":"fc_test","call_id":"call_test","name":"probe","arguments":"{}","status":"completed"} + ])); + let last = responses_result( + &json!([{"type":"message","id":"msg_test","role":"assistant","status":"completed","content":[{"type":"output_text","text":"done","annotations":[]}]}]), + ); + let (url, server) = mock_server(vec![first, last]).await; + let builder = agent_builder_at( + Provider::OpenAI, + "gpt-6-astra", + Some("test-key"), + Some(&url), + ) + .expect("builder"); + let agent = apply_completion_params::<_, std::collections::hash_map::RandomState>( + builder, + Provider::OpenAI, + "gpt-6-astra", + 4096, + None, + CompletionProfile::MainAgent, + ) + .tool(Probe) + .build(); + assert_eq!( + agent.prompt("test").max_turns(3).await.expect("tool loop"), + "done" + ); + let requests = server.await.expect("mock task"); + assert_eq!(requests.len(), 2); + for (headers, body) in &requests { + assert!(headers.starts_with("POST /responses ")); + assert!( + headers + .to_lowercase() + .contains("authorization: bearer test-key") + ); + assert_eq!(body["reasoning"]["effort"], "medium"); + assert_eq!(body["max_output_tokens"], 4096); + assert!(body.get("max_tokens").is_none()); + assert!(body.get("max_completion_tokens").is_none()); + assert!(body.get("temperature").is_none()); + } + let input = requests[1].1["input"].as_array().expect("input"); + assert!( + input.iter().any( + |item| item["type"] == "reasoning" && item["encrypted_content"] == "encrypted-test" + ) + ); + assert!( + input + .iter() + .any(|item| item["type"] == "function_call_output" && item["call_id"] == "call_test") + ); +} + +#[tokio::test] +async fn routed_chat_preserves_provider_reasoning_and_tool_results() { + for provider in [Provider::OpenRouter, Provider::Fireworks] { + let mut message = json!({"role":"assistant", "content":null, "tool_calls":[{"id":"call_test","type":"function","function":{"name":"probe","arguments":"{}"}}]}); + if provider == Provider::OpenRouter { + message["reasoning_details"] = json!([{"type":"reasoning.encrypted","id":"rs_test","data":"encrypted-test","format":"anthropic-claude-v1","index":0}]); + } else { + message["reasoning_content"] = json!("test reasoning"); + } + let (url, server) = mock_server(vec![ + chat_result(&message, "tool_calls"), + chat_result(&json!({"role":"assistant","content":"done"}), "stop"), + ]) + .await; + let builder = agent_builder_at( + provider, + provider.default_model(), + Some("test-key"), + Some(&url), + ) + .expect("builder"); + let agent = apply_completion_params::<_, std::collections::hash_map::RandomState>( + builder, + provider, + provider.default_model(), + 4096, + None, + CompletionProfile::MainAgent, + ) + .tool(Probe) + .build(); + assert_eq!( + agent.prompt("test").max_turns(3).await.expect("tool loop"), + "done" + ); + let requests = server.await.expect("mock task"); + assert!(requests[0].0.starts_with("POST /chat/completions ")); + assert_eq!(requests[0].1["model"], provider.default_model()); + assert_eq!(requests[0].1["max_tokens"], 4096); + let messages = requests[1].1["messages"].as_array().expect("messages"); + assert!( + messages + .iter() + .any(|item| item["role"] == "tool" && item["tool_call_id"] == "call_test") + ); + let assistant = messages + .iter() + .find(|item| item["role"] == "assistant") + .expect("assistant"); + if provider == Provider::OpenRouter { + assert_eq!(assistant["reasoning_details"][0]["data"], "encrypted-test"); + assert_eq!(requests[0].1["reasoning"]["effort"], "high"); + } else { + assert_eq!(assistant["reasoning_content"], "test reasoning"); + } + } +} + +#[tokio::test] +async fn anthropic_caching_and_effort_reach_the_messages_endpoint() { + let response = json!({"id":"msg_test","type":"message","role":"assistant","model":"claude-opus-5","content":[{"type":"text","text":"done"}],"stop_reason":"end_turn","stop_sequence":null,"usage":{"input_tokens":1,"output_tokens":1}}); + let (url, server) = mock_server(vec![response]).await; + let builder = agent_builder_at( + Provider::Anthropic, + "claude-opus-5", + Some("test-key"), + Some(&url), + ) + .expect("builder"); + let agent = apply_completion_params::<_, std::collections::hash_map::RandomState>( + builder, + Provider::Anthropic, + "claude-opus-5", + 4096, + None, + CompletionProfile::MainAgent, + ) + .build(); + assert_eq!(agent.prompt("test").await.expect("prompt"), "done"); + let requests = server.await.expect("mock task"); + assert!(requests[0].0.starts_with("POST /v1/messages ")); + assert_eq!(requests[0].1["thinking"]["type"], "adaptive"); + assert_eq!(requests[0].1["output_config"]["effort"], "high"); + assert_eq!(requests[0].1["cache_control"]["type"], "ephemeral"); +} + +#[tokio::test] +async fn gemini_thinking_and_output_budget_reach_generate_content() { + let response = json!({"candidates":[{"content":{"role":"model","parts":[{"text":"done"}]},"finishReason":"STOP"}],"usageMetadata":{"promptTokenCount":1,"candidatesTokenCount":1,"totalTokenCount":2}}); + let (url, server) = mock_server(vec![response]).await; + let builder = agent_builder_at( + Provider::Google, + "gemini-3.8-flash", + Some("test-key"), + Some(&url), + ) + .expect("builder"); + let agent = apply_completion_params::<_, std::collections::hash_map::RandomState>( + builder, + Provider::Google, + "gemini-3.8-flash", + 4096, + None, + CompletionProfile::Subagent, + ) + .build(); + assert_eq!(agent.prompt("test").await.expect("prompt"), "done"); + let requests = server.await.expect("mock task"); + assert!(requests[0].0.contains("gemini-3.8-flash:generateContent")); + assert_eq!( + requests[0].1["generationConfig"]["thinkingConfig"]["thinkingLevel"], + "low" + ); + assert_eq!(requests[0].1["generationConfig"]["maxOutputTokens"], 4096); +} diff --git a/src/agents/setup.rs b/src/agents/setup.rs index 8d4f1ba..d5bd7b5 100644 --- a/src/agents/setup.rs +++ b/src/agents/setup.rs @@ -8,7 +8,7 @@ use std::sync::Arc; use crate::agents::context::TaskContext; use crate::agents::iris::StructuredResponse; -use crate::agents::tools::with_active_repo_root; +use crate::agents::tools::with_repo_execution_context; use crate::agents::{AgentBackend, IrisAgent, IrisAgentBuilder}; use crate::common::CommonParams; use crate::config::Config; @@ -141,8 +141,12 @@ where // Create agent let mut agent = setup_service.create_iris_agent()?; - // Execute task with capability - now returns StructuredResponse - let result = agent.execute_task(capability, task_prompt).await?; + let execution = agent.execute_task(capability, task_prompt); + let result = if let Some(repo) = setup_service.git_repo() { + with_repo_execution_context(repo.repo_path(), !repo.is_remote(), execution).await? + } else { + execution.await? + }; // Call the handler with the result handler(result).await @@ -290,7 +294,7 @@ impl IrisAgentService { }; if let Some(repo) = &self.git_repo { - with_active_repo_root(repo.repo_path(), run_task).await + with_repo_execution_context(repo.repo_path(), !repo.is_remote(), run_task).await } else { run_task.await } @@ -312,7 +316,7 @@ impl IrisAgentService { }; if let Some(repo) = &self.git_repo { - with_active_repo_root(repo.repo_path(), run_task).await + with_repo_execution_context(repo.repo_path(), !repo.is_remote(), run_task).await } else { run_task.await } @@ -365,7 +369,7 @@ impl IrisAgentService { }; if let Some(repo) = &self.git_repo { - with_active_repo_root(repo.repo_path(), run_task).await + with_repo_execution_context(repo.repo_path(), !repo.is_remote(), run_task).await } else { run_task.await } @@ -499,7 +503,7 @@ impl IrisAgentService { }; if let Some(repo) = &self.git_repo { - with_active_repo_root(repo.repo_path(), run_task).await + with_repo_execution_context(repo.repo_path(), !repo.is_remote(), run_task).await } else { run_task.await } @@ -529,7 +533,7 @@ impl IrisAgentService { }; if let Some(repo) = &self.git_repo { - with_active_repo_root(repo.repo_path(), run_task).await + with_repo_execution_context(repo.repo_path(), !repo.is_remote(), run_task).await } else { run_task.await } @@ -574,7 +578,7 @@ impl IrisAgentService { }; if let Some(repo) = &self.git_repo { - with_active_repo_root(repo.repo_path(), run_task).await + with_repo_execution_context(repo.repo_path(), !repo.is_remote(), run_task).await } else { run_task.await } diff --git a/src/agents/status_messages.rs b/src/agents/status_messages.rs index 0d52491..8c7992e 100644 --- a/src/agents/status_messages.rs +++ b/src/agents/status_messages.rs @@ -227,48 +227,18 @@ impl StatusMessageGenerator { Just the message text, nothing else."; let provider_name = provider::provider_from_name(provider)?; - match provider { - "openai" => { - let builder = provider::openai_builder(fast_model, api_key)?.preamble(preamble); - let agent = provider::apply_completion_params( - builder, - provider_name, - fast_model, - 50, - additional_params, - CompletionProfile::StatusMessage, - ) - .build(); - Ok(DynAgent::OpenAI(agent)) - } - "anthropic" => { - let builder = provider::anthropic_builder(fast_model, api_key)?.preamble(preamble); - let agent = provider::apply_completion_params( - builder, - provider_name, - fast_model, - 50, - additional_params, - CompletionProfile::StatusMessage, - ) - .build(); - Ok(DynAgent::Anthropic(agent)) - } - "google" | "gemini" => { - let builder = provider::gemini_builder(fast_model, api_key)?.preamble(preamble); - let agent = provider::apply_completion_params( - builder, - provider_name, - fast_model, - 50, - additional_params, - CompletionProfile::StatusMessage, - ) - .build(); - Ok(DynAgent::Gemini(agent)) - } - _ => Err(anyhow::anyhow!("Unsupported provider: {}", provider)), - } + let builder = + provider::agent_builder(provider_name, fast_model, api_key)?.preamble(preamble); + let agent = provider::apply_completion_params( + builder, + provider_name, + fast_model, + 50, + additional_params, + CompletionProfile::StatusMessage, + ) + .build(); + Ok(DynAgent(agent)) } /// Internal generation logic diff --git a/src/agents/tools/code_search.rs b/src/agents/tools/code_search.rs index a0f377a..5b46e79 100644 --- a/src/agents/tools/code_search.rs +++ b/src/agents/tools/code_search.rs @@ -5,8 +5,7 @@ use anyhow::Result; use regex::escape as regex_escape; -use rig::completion::ToolDefinition; -use rig::tool::Tool; +use rig::tool::portable::PortableTool; use serde::{Deserialize, Serialize}; use std::path::Path; use std::process::Command; @@ -209,20 +208,24 @@ fn default_max_results() -> usize { 20 } -impl Tool for CodeSearch { +impl PortableTool for CodeSearch { const NAME: &'static str = "code_search"; type Error = CodeSearchError; type Args = CodeSearchArgs; type Output = String; - async fn definition(&self, _: String) -> ToolDefinition { - ToolDefinition { - name: "code_search".to_string(), - description: "Search for code patterns, functions, classes, and related files in the repository using ripgrep. Supports multiple search types and file filtering.".to_string(), - parameters: parameters_schema::(), - } + fn description(&self) -> String { + "Search for code patterns, functions, classes, and related files in the repository using ripgrep. Supports multiple search types and file filtering.".to_string() + } + + fn parameters(&self) -> serde_json::Value { + parameters_schema::() } + #[expect( + clippy::unused_async_trait_impl, + reason = "Defer synchronous tool work until polling inside the repository context" + )] async fn call(&self, args: Self::Args) -> Result { let repo = get_current_repo().map_err(CodeSearchError::from)?; let repo_path = repo.repo_path().clone(); diff --git a/src/agents/tools/common.rs b/src/agents/tools/common.rs index 799b614..3272305 100644 --- a/src/agents/tools/common.rs +++ b/src/agents/tools/common.rs @@ -14,6 +14,7 @@ use crate::git::GitRepo; tokio::task_local! { static ACTIVE_REPO_ROOT: PathBuf; + static TRUSTED_EXECUTION: bool; } /// Generate a JSON schema for tool parameters that's `OpenAI`-compatible. @@ -61,14 +62,33 @@ pub fn get_current_repo() -> anyhow::Result { /// Run an async operation with a repo root bound to the current task. pub async fn with_active_repo_root(repo_path: &Path, future: F) -> T +where + F: Future, +{ + with_repo_execution_context(repo_path, current_repo_execution_trusted(), future).await +} + +/// Bind repository identity and permission to execute project code to a task. +pub async fn with_repo_execution_context(repo_path: &Path, trusted: bool, future: F) -> T where F: Future, { ACTIVE_REPO_ROOT - .scope(repo_path.to_path_buf(), future) + .scope( + repo_path.to_path_buf(), + TRUSTED_EXECUTION.scope(trusted, future), + ) .await } +/// Local workspaces permit analysis; remote clones must explicitly carry distrust. +#[must_use] +pub fn current_repo_execution_trusted() -> bool { + TRUSTED_EXECUTION + .try_with(|trusted| *trusted) + .unwrap_or(true) +} + /// Get the repo root bound to the current task, falling back to the current directory. /// /// # Errors diff --git a/src/agents/tools/content_update.rs b/src/agents/tools/content_update.rs index c245e06..751eb38 100644 --- a/src/agents/tools/content_update.rs +++ b/src/agents/tools/content_update.rs @@ -4,8 +4,7 @@ //! through proper tool calls rather than JSON parsing. use anyhow::Result; -use rig::completion::ToolDefinition; -use rig::tool::Tool; +use rig::tool::portable::PortableTool; use serde::{Deserialize, Serialize}; use serde_json::json; use std::sync::Arc; @@ -75,20 +74,24 @@ impl UpdateCommitTool { } } -impl Tool for UpdateCommitTool { +impl PortableTool for UpdateCommitTool { const NAME: &'static str = "update_commit"; type Error = ContentUpdateError; type Args = UpdateCommitArgs; type Output = String; - async fn definition(&self, _: String) -> ToolDefinition { - ToolDefinition { - name: "update_commit".to_string(), - description: "Update the current commit message. Use this when the user asks you to modify, change, or rewrite the commit message. The update will be applied immediately.".to_string(), - parameters: parameters_schema::(), - } + fn description(&self) -> String { + "Update the current commit message. Use this when the user asks you to modify, change, or rewrite the commit message. The update will be applied immediately.".to_string() + } + + fn parameters(&self) -> serde_json::Value { + parameters_schema::() } + #[expect( + clippy::unused_async_trait_impl, + reason = "Defer synchronous tool work until polling inside the repository context" + )] async fn call(&self, args: Self::Args) -> Result { tracing::info!( "update_commit tool called! emoji={:?}, title={}, message_len={}", @@ -146,20 +149,24 @@ impl UpdatePRTool { } } -impl Tool for UpdatePRTool { +impl PortableTool for UpdatePRTool { const NAME: &'static str = "update_pr"; type Error = ContentUpdateError; type Args = UpdatePRArgs; type Output = String; - async fn definition(&self, _: String) -> ToolDefinition { - ToolDefinition { - name: "update_pr".to_string(), - description: "Update the current PR description. Use this when the user asks you to modify, change, or rewrite the PR content.".to_string(), - parameters: parameters_schema::(), - } + fn description(&self) -> String { + "Update the current PR description. Use this when the user asks you to modify, change, or rewrite the PR content.".to_string() } + fn parameters(&self) -> serde_json::Value { + parameters_schema::() + } + + #[expect( + clippy::unused_async_trait_impl, + reason = "Defer synchronous tool work until polling inside the repository context" + )] async fn call(&self, args: Self::Args) -> Result { let content_len = args.content.len(); let update = ContentUpdate::PR { @@ -205,20 +212,24 @@ impl UpdateReviewTool { } } -impl Tool for UpdateReviewTool { +impl PortableTool for UpdateReviewTool { const NAME: &'static str = "update_review"; type Error = ContentUpdateError; type Args = UpdateReviewArgs; type Output = String; - async fn definition(&self, _: String) -> ToolDefinition { - ToolDefinition { - name: "update_review".to_string(), - description: "Update the current code review. Use this when the user asks you to modify, change, or rewrite the review content.".to_string(), - parameters: parameters_schema::(), - } + fn description(&self) -> String { + "Update the current code review. Use this when the user asks you to modify, change, or rewrite the review content.".to_string() + } + + fn parameters(&self) -> serde_json::Value { + parameters_schema::() } + #[expect( + clippy::unused_async_trait_impl, + reason = "Defer synchronous tool work until polling inside the repository context" + )] async fn call(&self, args: Self::Args) -> Result { let content_len = args.content.len(); let update = ContentUpdate::Review { diff --git a/src/agents/tools/docs.rs b/src/agents/tools/docs.rs index 53b06e3..4353a6b 100644 --- a/src/agents/tools/docs.rs +++ b/src/agents/tools/docs.rs @@ -4,8 +4,7 @@ //! CHANGELOG.md, etc. from the project root. use anyhow::Result; -use rig::completion::ToolDefinition; -use rig::tool::Tool; +use rig::tool::portable::PortableTool; use serde::{Deserialize, Serialize}; use std::cmp::Reverse; use std::path::{Path, PathBuf}; @@ -395,12 +394,12 @@ async fn build_context_output(repo_root: &Path, requested_max_chars: usize) -> R let mut docs = Vec::new(); if let Some(path) = find_first_existing_file(repo_root, readme_candidates()) { - let content = tokio::fs::read_to_string(&path).await?; + let content = read_repo_doc(repo_root, &path).await?; docs.push((ContextDocKind::Readme, path, content)); } if let Some(path) = find_first_existing_file(repo_root, agent_doc_candidates()) { - let content = tokio::fs::read_to_string(&path).await?; + let content = read_repo_doc(repo_root, &path).await?; docs.push((ContextDocKind::Agents, path, content)); } @@ -445,20 +444,29 @@ async fn build_context_output(repo_root: &Path, requested_max_chars: usize) -> R Ok(truncate_chars(output.trim_end(), context_budget)) } -impl Tool for ProjectDocs { +async fn read_repo_doc(repo_root: &Path, path: &Path) -> Result { + let canonical_root = tokio::fs::canonicalize(repo_root).await?; + let canonical_path = tokio::fs::canonicalize(path).await?; + anyhow::ensure!( + canonical_path.starts_with(&canonical_root), + "Documentation path escapes repository boundaries" + ); + Ok(tokio::fs::read_to_string(canonical_path).await?) +} + +impl PortableTool for ProjectDocs { const NAME: &'static str = "project_docs"; type Error = DocsError; type Args = ProjectDocsArgs; type Output = String; - async fn definition(&self, _: String) -> ToolDefinition { - ToolDefinition { - name: "project_docs".to_string(), - description: - "Fetch project documentation for context. Types: readme, contributing, changelog, license, codeofconduct, agents (AGENTS.md/CLAUDE.md), context (compact README + agent-instructions snapshot), all" - .to_string(), - parameters: parameters_schema::(), - } + fn description(&self) -> String { + "Fetch project documentation for context. Types: readme, contributing, changelog, license, codeofconduct, agents (AGENTS.md/CLAUDE.md), context (compact README + agent-instructions snapshot), all" + .to_string() + } + + fn parameters(&self) -> serde_json::Value { + parameters_schema::() } async fn call(&self, args: Self::Args) -> Result { @@ -508,7 +516,7 @@ impl Tool for ProjectDocs { let path: PathBuf = current_dir.join(filename); if path.exists() { - match tokio::fs::read_to_string(&path).await { + match read_repo_doc(¤t_dir, &path).await { Ok(content) => { found_any = true; diff --git a/src/agents/tools/file_read.rs b/src/agents/tools/file_read.rs index 6cdc3b6..de4edc1 100644 --- a/src/agents/tools/file_read.rs +++ b/src/agents/tools/file_read.rs @@ -4,10 +4,10 @@ //! This is more efficient than using `code_search` when you need the actual content. use anyhow::Result; -use rig::completion::ToolDefinition; -use rig::tool::Tool; +use rig::tool::portable::PortableTool; use serde::{Deserialize, Serialize}; use std::fs; +use std::io::{BufRead, BufReader, Read}; use std::path::Path; use crate::define_tool_error; @@ -27,12 +27,6 @@ impl FileRead { /// Line number column width (supports files up to 999,999 lines) const LINE_NUM_WIDTH: usize = 6; - /// Check if file appears to be binary - fn is_binary(content: &[u8]) -> bool { - let check_size = content.len().min(8192); - content[..check_size].contains(&0) - } - /// Check if file extension indicates binary fn is_binary_extension(path: &str) -> bool { const BINARY_EXTENSIONS: &[&str] = &[ @@ -112,20 +106,24 @@ pub struct FileReadArgs { pub num_lines: Option, } -impl Tool for FileRead { +impl PortableTool for FileRead { const NAME: &'static str = "file_read"; type Error = FileReadError; type Args = FileReadArgs; type Output = String; - async fn definition(&self, _: String) -> ToolDefinition { - ToolDefinition { - name: "file_read".to_string(), - description: "Read file contents directly. Use start_line and num_lines for partial reads on large files. Returns line-numbered content.".to_string(), - parameters: parameters_schema::(), - } + fn description(&self) -> String { + "Read file contents directly. Use start_line and num_lines for partial reads on large files. Returns line-numbered content.".to_string() } + fn parameters(&self) -> serde_json::Value { + parameters_schema::() + } + + #[expect( + clippy::unused_async_trait_impl, + reason = "Defer synchronous tool work until polling inside the repository context" + )] async fn call(&self, args: Self::Args) -> Result { let repo = get_current_repo().map_err(FileReadError::from)?; let repo_path = repo.repo_path(); @@ -175,13 +173,17 @@ impl Tool for FileRead { )); } - // Guard against excessively large files (10 MB) for full reads. - // Partial reads (start_line/num_lines specified) are allowed — the line-based - // slicing below limits memory regardless of file size. - // Open once to avoid TOCTOU between metadata check and read. + Self::read_excerpt(&canonical_file, &args) + } +} + +impl FileRead { + pub(super) fn read_excerpt(path: &Path, args: &FileReadArgs) -> Result { const MAX_FILE_SIZE: u64 = 10 * 1024 * 1024; + let file = fs::File::open(path).map_err(|e| FileReadError(e.to_string()))?; let is_partial_read = args.start_line.is_some() || args.num_lines.is_some(); - let file_len = fs::metadata(&canonical_file) + let file_len = file + .metadata() .map_err(|e| FileReadError(e.to_string()))? .len(); @@ -193,27 +195,61 @@ impl Tool for FileRead { ))); } - // Read the file (use canonical path for actual read) - let content = fs::read(&canonical_file).map_err(|e| FileReadError(e.to_string()))?; - - // Check for binary content - if Self::is_binary(&content) { + let mut reader = BufReader::new(file); + if reader + .fill_buf() + .map_err(|e| FileReadError(e.to_string()))? + .contains(&0) + { return Ok(format!( "[Binary file detected: {} - content not displayed]", args.path )); } - // Convert to string - let content_str = String::from_utf8(content).map_err(|e| FileReadError(e.to_string()))?; - - let lines: Vec<&str> = content_str.lines().collect(); - let total_lines = lines.len(); - - // Calculate range - let start = args.start_line.unwrap_or(1).saturating_sub(1); // Convert to 0-indexed + let requested_start = args.start_line.unwrap_or(1).saturating_sub(1); let max_lines = args.num_lines.unwrap_or(Self::DEFAULT_MAX_LINES).min(1000); - let end = (start + max_lines).min(total_lines); + let requested_end = requested_start.saturating_add(max_lines); + let mut total_lines = 0; + let mut content = Vec::new(); + loop { + // Skipped lines never allocate, even when a generated file has a giant line. + let bytes = if (requested_start..requested_end).contains(&total_lines) { + let retained = + u64::try_from(content.len()).map_err(|e| FileReadError(e.to_string()))?; + let remaining = MAX_FILE_SIZE.saturating_sub(retained); + let bytes = reader + .by_ref() + .take(remaining + 1) + .read_until(b'\n', &mut content) + .map_err(|e| FileReadError(e.to_string()))?; + if u64::try_from(content.len()).map_err(|e| FileReadError(e.to_string()))? + > MAX_FILE_SIZE + { + return Err(FileReadError( + "Selected excerpt exceeds 10 MB. Request fewer lines.".into(), + )); + } + bytes + } else { + reader + .skip_until(b'\n') + .map_err(|e| FileReadError(e.to_string()))? + }; + if bytes == 0 { + break; + } + total_lines += 1; + } + if content.contains(&0) { + return Ok(format!( + "[Binary file detected: {} - content not displayed]", + args.path + )); + } + let content_str = String::from_utf8(content).map_err(|e| FileReadError(e.to_string()))?; + let start = requested_start.min(total_lines); + let end = requested_end.min(total_lines); // Build output with line numbers let mut output = String::new(); @@ -222,7 +258,9 @@ impl Tool for FileRead { args.path, total_lines )); - if start > 0 || end < total_lines { + if start == end { + output.push_str("No lines in requested range.\n"); + } else if start > 0 || end < total_lines { output.push_str(&format!( "Showing lines {}-{} of {}\n", start + 1, @@ -232,10 +270,10 @@ impl Tool for FileRead { } output.push('\n'); - for (i, line) in lines.iter().enumerate().skip(start).take(end - start) { + for (i, line) in content_str.lines().enumerate() { output.push_str(&format!( "{:>width$}│ {}\n", - i + 1, + start + i + 1, line, width = Self::LINE_NUM_WIDTH )); diff --git a/src/agents/tools/git.rs b/src/agents/tools/git.rs index 67e6602..8af75bf 100644 --- a/src/agents/tools/git.rs +++ b/src/agents/tools/git.rs @@ -3,8 +3,7 @@ //! This module provides Git operations using Rig's tool system. use anyhow::Result; -use rig::completion::ToolDefinition; -use rig::tool::Tool; +use rig::tool::portable::PortableTool; use serde::{Deserialize, Serialize}; use std::collections::BTreeSet; use std::path::{Path, PathBuf}; @@ -338,21 +337,24 @@ pub struct GitStatusArgs { pub include_unstaged: bool, } -impl Tool for GitStatus { +impl PortableTool for GitStatus { const NAME: &'static str = "git_status"; type Error = GitError; type Args = GitStatusArgs; type Output = String; - async fn definition(&self, _: String) -> ToolDefinition { - ToolDefinition { - name: "git_status".to_string(), - description: "Get current Git repository status including staged and unstaged files" - .to_string(), - parameters: parameters_schema::(), - } + fn description(&self) -> String { + "Get current Git repository status including staged and unstaged files".to_string() + } + + fn parameters(&self) -> serde_json::Value { + parameters_schema::() } + #[expect( + clippy::unused_async_trait_impl, + reason = "Defer synchronous tool work until polling inside the repository context" + )] async fn call(&self, args: Self::Args) -> Result { let repo = get_current_repo().map_err(GitError::from)?; @@ -406,20 +408,24 @@ pub struct GitDiffArgs { pub files: Option>, } -impl Tool for GitDiff { +impl PortableTool for GitDiff { const NAME: &'static str = "git_diff"; type Error = GitError; type Args = GitDiffArgs; type Output = String; - async fn definition(&self, _: String) -> ToolDefinition { - ToolDefinition { - name: "git_diff".to_string(), - description: "Get Git diff for file changes. Returns summary by default (file list with relevance scores). Use detail='standard' with files=['path1','path2'] to get full diffs for specific files. Progressive approach: call once for summary, then again with files filter for important ones.".to_string(), - parameters: parameters_schema::(), - } + fn description(&self) -> String { + "Get Git diff for file changes. Returns summary by default (file list with relevance scores). Use detail='standard' with files=['path1','path2'] to get full diffs for specific files. Progressive approach: call once for summary, then again with files filter for important ones.".to_string() + } + + fn parameters(&self) -> serde_json::Value { + parameters_schema::() } + #[expect( + clippy::unused_async_trait_impl, + reason = "Defer synchronous tool work until polling inside the repository context" + )] async fn call(&self, args: Self::Args) -> Result { let repo = get_current_repo().map_err(GitError::from)?; @@ -509,20 +515,24 @@ pub struct GitLogArgs { pub to: Option, } -impl Tool for GitLog { +impl PortableTool for GitLog { const NAME: &'static str = "git_log"; type Error = GitError; type Args = GitLogArgs; type Output = String; - async fn definition(&self, _: String) -> ToolDefinition { - ToolDefinition { - name: "git_log".to_string(), - description: "Get Git commit history".to_string(), - parameters: parameters_schema::(), - } + fn description(&self) -> String { + "Get Git commit history".to_string() + } + + fn parameters(&self) -> serde_json::Value { + parameters_schema::() } + #[expect( + clippy::unused_async_trait_impl, + reason = "Defer synchronous tool work until polling inside the repository context" + )] async fn call(&self, args: Self::Args) -> Result { let repo = get_current_repo().map_err(GitError::from)?; @@ -617,20 +627,24 @@ fn default_git_show_max_output_chars() -> usize { 20_000 } -impl Tool for GitShow { +impl PortableTool for GitShow { const NAME: &'static str = "git_show"; type Error = GitError; type Args = GitShowArgs; type Output = String; - async fn definition(&self, _: String) -> ToolDefinition { - ToolDefinition { - name: "git_show".to_string(), - description: "Show a commit message, metadata, stat, and patch for a commit, tag, or branch. Use this after git_log or git_blame when a historical commit's exact changes clarify intent, prior behavior, or regression risk.".to_string(), - parameters: parameters_schema::(), - } + fn description(&self) -> String { + "Show a commit message, metadata, stat, and patch for a commit, tag, or branch. Use this after git_log or git_blame when a historical commit's exact changes clarify intent, prior behavior, or regression risk.".to_string() } + fn parameters(&self) -> serde_json::Value { + parameters_schema::() + } + + #[expect( + clippy::unused_async_trait_impl, + reason = "Defer synchronous tool work until polling inside the repository context" + )] async fn call(&self, args: Self::Args) -> Result { let repo = get_current_repo().map_err(GitError::from)?; let repo_root = repo.repo_path(); @@ -745,20 +759,24 @@ pub struct GitRepoInfo; #[derive(Debug, Clone, Serialize, Deserialize, schemars::JsonSchema)] pub struct GitRepoInfoArgs {} -impl Tool for GitRepoInfo { +impl PortableTool for GitRepoInfo { const NAME: &'static str = "git_repo_info"; type Error = GitError; type Args = GitRepoInfoArgs; type Output = String; - async fn definition(&self, _: String) -> ToolDefinition { - ToolDefinition { - name: "git_repo_info".to_string(), - description: "Get general information about the Git repository".to_string(), - parameters: parameters_schema::(), - } + fn description(&self) -> String { + "Get general information about the Git repository".to_string() } + fn parameters(&self) -> serde_json::Value { + parameters_schema::() + } + + #[expect( + clippy::unused_async_trait_impl, + reason = "Defer synchronous tool work until polling inside the repository context" + )] async fn call(&self, _args: Self::Args) -> Result { let repo = get_current_repo().map_err(GitError::from)?; @@ -790,21 +808,24 @@ pub struct GitChangedFilesArgs { pub to: Option, } -impl Tool for GitChangedFiles { +impl PortableTool for GitChangedFiles { const NAME: &'static str = "git_changed_files"; type Error = GitError; type Args = GitChangedFilesArgs; type Output = String; - async fn definition(&self, _: String) -> ToolDefinition { - ToolDefinition { - name: "git_changed_files".to_string(), - description: "Get list of files that have changed between commits or branches" - .to_string(), - parameters: parameters_schema::(), - } + fn description(&self) -> String { + "Get list of files that have changed between commits or branches".to_string() } + fn parameters(&self) -> serde_json::Value { + parameters_schema::() + } + + #[expect( + clippy::unused_async_trait_impl, + reason = "Defer synchronous tool work until polling inside the repository context" + )] async fn call(&self, args: Self::Args) -> Result { let repo = get_current_repo().map_err(GitError::from)?; @@ -889,20 +910,24 @@ fn default_recent_commits() -> usize { 3 } -impl Tool for GitBlame { +impl PortableTool for GitBlame { const NAME: &'static str = "git_blame"; type Error = GitError; type Args = GitBlameArgs; type Output = String; - async fn definition(&self, _: String) -> ToolDefinition { - ToolDefinition { - name: "git_blame".to_string(), - description: "Get git blame context for a repository-relative file line range, plus recent commits that touched the file. Use this for history, ownership, and style context before commit messages, PR descriptions, or semantic explanations.".to_string(), - parameters: parameters_schema::(), - } + fn description(&self) -> String { + "Get git blame context for a repository-relative file line range, plus recent commits that touched the file. Use this for history, ownership, and style context before commit messages, PR descriptions, or semantic explanations.".to_string() + } + + fn parameters(&self) -> serde_json::Value { + parameters_schema::() } + #[expect( + clippy::unused_async_trait_impl, + reason = "Defer synchronous tool work until polling inside the repository context" + )] async fn call(&self, args: Self::Args) -> Result { let repo = get_current_repo().map_err(GitError::from)?; let repo_root = repo.repo_path(); diff --git a/src/agents/tools/mod.rs b/src/agents/tools/mod.rs index 3f2a81b..0f94319 100644 --- a/src/agents/tools/mod.rs +++ b/src/agents/tools/mod.rs @@ -5,7 +5,10 @@ // Common utilities shared across tools pub mod common; -pub use common::{current_repo_root, get_current_repo, parameters_schema, with_active_repo_root}; +pub use common::{ + current_repo_root, get_current_repo, parameters_schema, with_active_repo_root, + with_repo_execution_context, +}; // Tool registry for consistent attachment pub mod registry; diff --git a/src/agents/tools/parallel_analyze.rs b/src/agents/tools/parallel_analyze.rs index 1ebc2ac..db54966 100644 --- a/src/agents/tools/parallel_analyze.rs +++ b/src/agents/tools/parallel_analyze.rs @@ -5,12 +5,7 @@ //! dealing with large changesets by distributing work across separate context windows. use anyhow::Result; -use rig::{ - client::{CompletionClient, ProviderClient}, - completion::{Prompt, ToolDefinition}, - providers::{anthropic, gemini, openai}, - tool::Tool, -}; +use rig::tool::portable::PortableTool; use schemars::JsonSchema; use serde::{Deserialize, Serialize}; use serde_json::json; @@ -21,10 +16,8 @@ use tokio::sync::Mutex; use crate::agents::debug as agent_debug; use crate::agents::provider::{ - CompletionProfile, anthropic_agent_builder, apply_completion_params, provider_from_name, - resolve_api_key, + self, CompletionProfile, DynAgent, apply_completion_params, provider_from_name, }; -use crate::providers::Provider; /// Default timeout for individual subagent tasks (2 minutes) const DEFAULT_SUBAGENT_TIMEOUT_SECS: u64 = 120; @@ -68,24 +61,10 @@ pub struct ParallelAnalyzeResult { pub execution_time_ms: u64, } -/// Provider-specific subagent runner +/// A reusable agent configured for focused parallel analysis. #[derive(Clone)] -enum SubagentRunner { - OpenAI { - client: openai::Client, - model: String, - additional_params: HashMap, - }, - Anthropic { - client: anthropic::Client, - model: String, - additional_params: HashMap, - }, - Gemini { - client: gemini::Client, - model: String, - additional_params: HashMap, - }, +struct SubagentRunner { + agent: DynAgent, } impl SubagentRunner { @@ -93,173 +72,35 @@ impl SubagentRunner { provider: &str, model: &str, api_key: Option<&str>, - additional_params: HashMap, + additional_params: &HashMap, ) -> Result { - match provider { - "openai" => { - let client = Self::resolve_openai_client(api_key)?; - Ok(Self::OpenAI { - client, - model: model.to_string(), - additional_params, - }) - } - "anthropic" => { - let client = Self::resolve_anthropic_client(api_key)?; - Ok(Self::Anthropic { - client, - model: model.to_string(), - additional_params, - }) - } - "google" | "gemini" => { - let client = Self::resolve_gemini_client(api_key)?; - Ok(Self::Gemini { - client, - model: model.to_string(), - additional_params, - }) - } - _ => Err(anyhow::anyhow!( - "Unsupported provider for parallel analysis: {}. Supported: openai, anthropic, google", - provider - )), - } - } - - /// Create `OpenAI` client using shared resolution logic - /// - /// Uses `resolve_api_key` from provider module to maintain consistent - /// resolution order: config → env var → client default - fn resolve_openai_client(api_key: Option<&str>) -> Result { - let (resolved_key, _source) = resolve_api_key(api_key, Provider::OpenAI); - match resolved_key { - Some(key) => openai::Client::new(&key) - // Sanitize error to avoid exposing key material - .map_err(|_| { - anyhow::anyhow!( - "Failed to create OpenAI client: authentication or configuration error" - ) - }), - None => openai::Client::from_env() - .map_err(|_| anyhow::anyhow!("Failed to create OpenAI client from environment")), - } - } - - /// Create `Anthropic` client using shared resolution logic - /// - /// Uses `resolve_api_key` from provider module to maintain consistent - /// resolution order: config → env var → client default - fn resolve_anthropic_client(api_key: Option<&str>) -> Result { - let (resolved_key, _source) = resolve_api_key(api_key, Provider::Anthropic); - match resolved_key { - Some(key) => anthropic::Client::new(&key) - // Sanitize error to avoid exposing key material - .map_err(|_| { - anyhow::anyhow!( - "Failed to create Anthropic client: authentication or configuration error" - ) - }), - None => anthropic::Client::from_env() - .map_err(|_| anyhow::anyhow!("Failed to create Anthropic client from environment")), - } - } - - /// Create `Gemini` client using shared resolution logic - /// - /// Uses `resolve_api_key` from provider module to maintain consistent - /// resolution order: config → env var → client default - fn resolve_gemini_client(api_key: Option<&str>) -> Result { - let (resolved_key, _source) = resolve_api_key(api_key, Provider::Google); - match resolved_key { - Some(key) => gemini::Client::new(&key) - // Sanitize error to avoid exposing key material - .map_err(|_| { - anyhow::anyhow!( - "Failed to create Gemini client: authentication or configuration error" - ) - }), - None => gemini::Client::from_env() - .map_err(|_| anyhow::anyhow!("Failed to create Gemini client from environment")), - } + let provider = provider_from_name(provider)?; + let builder = provider::agent_builder(provider, model, api_key)?.preamble("You are a specialized analysis sub-agent. Complete the assigned task thoroughly using the available tools and return a focused, actionable summary."); + let builder = apply_completion_params( + builder, + provider, + model, + 4096, + Some(additional_params), + CompletionProfile::Subagent, + ); + let agent = DynAgent(crate::attach_core_tools!(builder).build()); + Ok(Self { agent }) } async fn run_task(&self, task: &str, max_turns: usize) -> SubagentResult { - let preamble = "You are a specialized analysis sub-agent. Complete the assigned \ - task thoroughly and return a focused summary.\n\n\ - Guidelines:\n\ - - Use the available tools to gather necessary information\n\ - - Focus only on what's asked\n\ - - Return a clear, structured summary\n\ - - Be concise but comprehensive"; - - // Use shared tool registry for consistent tool attachment - let result = match self { - Self::OpenAI { - client, - model, - additional_params, - } => { - let builder = client.agent(model).preamble(preamble); - let builder = apply_completion_params( - builder, - Provider::OpenAI, - model, - 4096, - Some(additional_params), - CompletionProfile::Subagent, - ); - let agent = crate::attach_core_tools!(builder).build(); - agent.prompt(task).max_turns(max_turns).await - } - Self::Anthropic { - client, - model, - additional_params, - } => { - let builder = anthropic_agent_builder(client, model).preamble(preamble); - let builder = apply_completion_params( - builder, - Provider::Anthropic, - model, - 4096, - Some(additional_params), - CompletionProfile::Subagent, - ); - let agent = crate::attach_core_tools!(builder).build(); - agent.prompt(task).max_turns(max_turns).await - } - Self::Gemini { - client, - model, - additional_params, - } => { - let builder = client.agent(model).preamble(preamble); - let builder = apply_completion_params( - builder, - Provider::Google, - model, - 4096, - Some(additional_params), - CompletionProfile::Subagent, - ); - let agent = crate::attach_core_tools!(builder).build(); - agent.prompt(task).max_turns(max_turns).await - } - }; - - match result { - Ok(response) => SubagentResult { + match self.agent.prompt_multi_turn(task, max_turns).await { + Ok(result) => SubagentResult { task: task.to_string(), - result: response, + result, success: true, error: None, }, - Err(e) => SubagentResult { + Err(error) => SubagentResult { task: task.to_string(), - result: format!("Subagent failed: {e}"), + result: format!("Subagent failed: {error}"), success: false, - error: Some(e.to_string()), + error: Some(error.to_string()), }, } } @@ -335,7 +176,7 @@ impl ParallelAnalyze { provider_name.name(), model, api_key, - additional_params.unwrap_or_default(), + &additional_params.unwrap_or_default(), ) .map_err(|e| { anyhow::anyhow!( @@ -357,16 +198,14 @@ impl ParallelAnalyze { // Use standard tool error macro for consistency crate::define_tool_error!(ParallelAnalyzeError); -impl Tool for ParallelAnalyze { +impl PortableTool for ParallelAnalyze { const NAME: &'static str = "parallel_analyze"; type Error = ParallelAnalyzeError; type Args = ParallelAnalyzeArgs; type Output = ParallelAnalyzeResult; - async fn definition(&self, _prompt: String) -> ToolDefinition { - ToolDefinition { - name: Self::NAME.to_string(), - description: "Run multiple analysis tasks in parallel using independent subagents. \ + fn description(&self) -> String { + "Run multiple analysis tasks in parallel using independent subagents. \ Each subagent has its own context window, preventing overflow when \ analyzing large changesets. Use this when you have multiple independent \ analysis tasks that can run concurrently.\n\n\ @@ -375,27 +214,29 @@ impl Tool for ParallelAnalyze { - Processing many commits in batches\n\ - Running different types of analysis (security, performance, style) in parallel\n\n\ Each task should be a focused prompt. Results are aggregated and returned." - .to_string(), - parameters: json!({ - "type": "object", - "properties": { - "tasks": { - "type": "array", - "items": { "type": "string" }, - "description": "List of analysis task prompts to run in parallel. Each task runs in its own subagent with independent context.", - "minItems": 1, - "maxItems": 10 - }, - "max_turns": { - "type": "integer", - "description": "Optional per-subagent turn budget. Increase for broad repository searches; lower it to cap cost or runaway tool loops.", - "minimum": 1, - "maximum": 100 - } + .to_string() + } + + fn parameters(&self) -> serde_json::Value { + json!({ + "type": "object", + "properties": { + "tasks": { + "type": "array", + "items": { "type": "string" }, + "description": "List of analysis task prompts to run in parallel. Each task runs in its own subagent with independent context.", + "minItems": 1, + "maxItems": 10 }, - "required": ["tasks"] - }), - } + "max_turns": { + "type": "integer", + "description": "Optional per-subagent turn budget. Increase for broad repository searches; lower it to cap cost or runaway tool loops.", + "minimum": 1, + "maximum": 100 + } + }, + "required": ["tasks"] + }) } #[allow(clippy::cognitive_complexity)] @@ -431,6 +272,8 @@ impl Tool for ParallelAnalyze { // Spawn all tasks as parallel tokio tasks, tracking index for ordering let mut handles = Vec::new(); + let repo_root = super::common::current_repo_root()?; + let trusted = super::common::current_repo_execution_trusted(); let timeout = Duration::from_secs(self.timeout_secs); for (index, task) in tasks.into_iter().enumerate() { let runner = self.runner.clone(); @@ -439,11 +282,16 @@ impl Tool for ParallelAnalyze { let timeout_secs = self.timeout_secs; let task_max_turns = max_turns; + let task_repo_root = repo_root.clone(); let handle = tokio::spawn(async move { // Wrap task execution in timeout to prevent hanging let result = match tokio::time::timeout( task_timeout, - runner.run_task(&task, task_max_turns), + super::common::with_repo_execution_context( + &task_repo_root, + trusted, + runner.run_task(&task, task_max_turns), + ), ) .await { diff --git a/src/agents/tools/repo_map.rs b/src/agents/tools/repo_map.rs index b66c8a5..b3f8402 100644 --- a/src/agents/tools/repo_map.rs +++ b/src/agents/tools/repo_map.rs @@ -3,8 +3,7 @@ use anyhow::{Context, Result}; use ignore::WalkBuilder; use regex::Regex; -use rig::completion::ToolDefinition; -use rig::tool::Tool; +use rig::tool::portable::PortableTool; use schemars::JsonSchema; use serde::{Deserialize, Serialize}; use std::cmp::Reverse; @@ -135,20 +134,24 @@ impl RepoMapTool { } } -impl Tool for RepoMapTool { +impl PortableTool for RepoMapTool { const NAME: &'static str = "repo_map"; type Error = RepoMapError; type Args = RepoMapArgs; type Output = RepoMap; - async fn definition(&self, _: String) -> ToolDefinition { - ToolDefinition { - name: Self::NAME.to_string(), - description: "Build a compact repository map with ranked source files, definitions, imports, and changed or mentioned-file signals. Use this before broad cross-file analysis when you need the codebase skeleton without reading every file.".to_string(), - parameters: parameters_schema::(), - } + fn description(&self) -> String { + "Build a compact repository map with ranked source files, definitions, imports, and changed or mentioned-file signals. Use this before broad cross-file analysis when you need the codebase skeleton without reading every file.".to_string() + } + + fn parameters(&self) -> serde_json::Value { + parameters_schema::() } + #[expect( + clippy::unused_async_trait_impl, + reason = "Defer synchronous tool work until polling inside the repository context" + )] async fn call(&self, args: Self::Args) -> Result { let repo_root = current_repo_root().map_err(RepoMapError::from)?; Self::build(&repo_root, &args).map_err(RepoMapError::from) diff --git a/src/agents/tools/static_analysis.rs b/src/agents/tools/static_analysis.rs index 0050537..b6b8d4c 100644 --- a/src/agents/tools/static_analysis.rs +++ b/src/agents/tools/static_analysis.rs @@ -1,8 +1,7 @@ //! Static analysis tool for agent review context. use anyhow::Result; -use rig::completion::ToolDefinition; -use rig::tool::Tool; +use rig::tool::portable::PortableTool; use schemars::JsonSchema; use serde::{Deserialize, Serialize}; use std::fmt; @@ -12,7 +11,7 @@ use std::time::Duration; use tokio::process::Command; use tokio::time::timeout; -use super::common::{current_repo_root, parameters_schema}; +use super::common::{current_repo_execution_trusted, current_repo_root, parameters_schema}; crate::define_tool_error!(StaticAnalysisError); @@ -86,21 +85,27 @@ fn default_max_output_chars() -> usize { DEFAULT_MAX_OUTPUT_CHARS } -impl Tool for StaticAnalysis { +impl PortableTool for StaticAnalysis { const NAME: &'static str = "static_analysis"; type Error = StaticAnalysisError; type Args = StaticAnalysisArgs; type Output = String; - async fn definition(&self, _: String) -> ToolDefinition { - ToolDefinition { - name: Self::NAME.to_string(), - description: "Run installed static analysis tools directly without performing package install steps. Supports Rust/clippy, Python/ruff, JavaScript or TypeScript/biome or oxlint, and Go/golangci-lint or go vet. Use this during review to prioritize analyzer findings and avoid reporting issues a linter already catches. These tools can execute project build scripts, plugins, or analyzer configuration, so only run them in trusted workspaces. Timeouts clamp to 1..=600 seconds; output truncates to 512..=40000 characters.".to_string(), - parameters: parameters_schema::(), - } + fn description(&self) -> String { + "Run installed static analysis tools directly without performing package install steps. Supports Rust/clippy, Python/ruff, JavaScript or TypeScript/biome or oxlint, and Go/golangci-lint or go vet. Use this during review to prioritize analyzer findings and avoid reporting issues a linter already catches. These tools can execute project build scripts, plugins, or analyzer configuration, so only run them in trusted workspaces. Timeouts clamp to 1..=600 seconds; output truncates to 512..=40000 characters.".to_string() + } + + fn parameters(&self) -> serde_json::Value { + parameters_schema::() } async fn call(&self, args: Self::Args) -> Result { + if !current_repo_execution_trusted() { + return Err(StaticAnalysisError( + "Static analysis cannot execute project code in an untrusted remote clone. Review it with the read-only tools, or inspect and clone the repository locally before running analysis." + .to_string(), + )); + } let repo_root = current_repo_root()?; let commands = select_analysis_commands(&repo_root, args.analyzer, command_available); if commands.is_empty() { diff --git a/src/agents/tools/tests/file_read_tests.rs b/src/agents/tools/tests/file_read_tests.rs new file mode 100644 index 0000000..d98db79 --- /dev/null +++ b/src/agents/tools/tests/file_read_tests.rs @@ -0,0 +1,78 @@ +#![allow(clippy::unwrap_used)] + +use std::io::Write; + +use crate::agents::tools::file_read::{FileRead, FileReadArgs}; + +fn excerpt(content: &[u8], start: usize, count: usize) -> String { + let mut file = tempfile::NamedTempFile::new().unwrap(); + file.write_all(content).unwrap(); + FileRead::read_excerpt( + file.path(), + &FileReadArgs { + path: "sample.txt".into(), + start_line: Some(start), + num_lines: Some(count), + }, + ) + .unwrap() +} + +#[test] +fn file_read_ranges_handle_eof_and_integer_limits() { + for start in [3, 10, usize::MAX] { + let output = excerpt(b"one\ntwo\n", start, 1000); + assert!(output.contains("2 total lines")); + assert!(output.contains("No lines in requested range")); + assert!(!output.contains('│')); + } + assert!(excerpt(b"", 1, 500).contains("0 total lines")); + assert!(!excerpt(b"one\n", 1, 0).contains('│')); +} + +#[test] +fn file_read_excerpt_preserves_crlf_unicode_and_unterminated_lines() { + let output = excerpt("one\r\n紫\r\nthree".as_bytes(), 2, 1); + assert!(output.contains("3 total lines")); + assert!(output.contains(" 2│ 紫\n")); + assert!(output.contains("start_line=3")); + assert!(!output.contains("three")); + assert!(excerpt(b"one\ntwo", 2, 2).contains(" 2│ two\n")); +} + +#[test] +fn file_read_skips_large_lines_without_retaining_them() { + let mut file = tempfile::NamedTempFile::new().unwrap(); + let chunk = [b'x'; 8192]; + for _ in 0..2048 { + file.write_all(&chunk).unwrap(); + } + file.write_all(b"\nsmall excerpt\n").unwrap(); + let args = FileReadArgs { + path: "generated.txt".into(), + start_line: Some(2), + num_lines: Some(1), + }; + let output = FileRead::read_excerpt(file.path(), &args).unwrap(); + assert!(output.contains("2 total lines")); + assert!(output.contains("2│ small excerpt")); + assert!(output.len() < 200); + let args = FileReadArgs { + start_line: Some(1), + ..args + }; + assert!( + FileRead::read_excerpt(file.path(), &args) + .unwrap_err() + .to_string() + .contains("exceeds 10 MB") + ); +} + +#[test] +fn file_read_detects_binary_content() { + assert!(excerpt(b"hello\0world", 1, 10).contains("Binary file detected")); + let mut content = vec![b'x'; 9000]; + content.extend_from_slice(b"\nhello\0world"); + assert!(excerpt(&content, 2, 1).contains("Binary file detected")); +} diff --git a/src/agents/tools/tests/git_blame_tests.rs b/src/agents/tools/tests/git_blame_tests.rs index fd86ad0..9d86da5 100644 --- a/src/agents/tools/tests/git_blame_tests.rs +++ b/src/agents/tools/tests/git_blame_tests.rs @@ -1,7 +1,7 @@ use std::fs; use std::process::Command; -use rig::tool::Tool; +use rig::tool::portable::PortableTool; use tempfile::TempDir; use crate::agents::tools::git::{GitBlame, GitBlameArgs}; diff --git a/src/agents/tools/tests/git_show_tests.rs b/src/agents/tools/tests/git_show_tests.rs index 2f148d1..fb728d8 100644 --- a/src/agents/tools/tests/git_show_tests.rs +++ b/src/agents/tools/tests/git_show_tests.rs @@ -1,7 +1,7 @@ use std::fs; use std::process::Command; -use rig::tool::Tool; +use rig::tool::portable::PortableTool; use tempfile::TempDir; use crate::agents::tools::git::{GitShow, GitShowArgs}; diff --git a/src/agents/tools/tests/mod.rs b/src/agents/tools/tests/mod.rs index 2e818ba..9a0f960 100644 --- a/src/agents/tools/tests/mod.rs +++ b/src/agents/tools/tests/mod.rs @@ -1,3 +1,4 @@ +mod file_read_tests; mod git_blame_tests; mod git_show_tests; mod repo_map_tests; diff --git a/src/agents/tools/workspace.rs b/src/agents/tools/workspace.rs index 4386e6e..949618b 100644 --- a/src/agents/tools/workspace.rs +++ b/src/agents/tools/workspace.rs @@ -4,8 +4,7 @@ //! creating task lists, and managing her workflow during complex operations. use anyhow::Result; -use rig::completion::ToolDefinition; -use rig::tool::Tool; +use rig::tool::portable::PortableTool; use serde::{Deserialize, Serialize}; use serde_json::json; use std::sync::{Arc, Mutex}; @@ -116,20 +115,24 @@ impl Workspace { } } -impl Tool for Workspace { +impl PortableTool for Workspace { const NAME: &'static str = "workspace"; type Error = WorkspaceError; type Args = WorkspaceArgs; type Output = String; - async fn definition(&self, _: String) -> ToolDefinition { - ToolDefinition { - name: "workspace".to_string(), - description: "Iris's personal workspace for notes and task management. Use this to track progress, take notes on findings, and manage complex workflows.".to_string(), - parameters: parameters_schema::(), - } + fn description(&self) -> String { + "Iris's personal workspace for notes and task management. Use this to track progress, take notes on findings, and manage complex workflows.".to_string() + } + + fn parameters(&self) -> serde_json::Value { + parameters_schema::() } + #[expect( + clippy::unused_async_trait_impl, + reason = "Defer synchronous tool work until polling inside the repository context" + )] async fn call(&self, args: Self::Args) -> Result { let mut data = self .data diff --git a/src/cli.rs b/src/cli.rs index 23154dc..43927d2 100644 --- a/src/cli.rs +++ b/src/cli.rs @@ -364,6 +364,10 @@ pub enum Commands { )] fast_model: Option, + /// Set the model used for delegated analysis (defaults to the primary model) + #[arg(long)] + subagent_model: Option, + /// Set token limit for the specified provider #[arg(long, help = "Set token limit for the specified provider")] token_limit: Option, @@ -403,6 +407,10 @@ pub enum Commands { )] fast_model: Option, + /// Set the model used for delegated analysis (defaults to the primary model) + #[arg(long)] + subagent_model: Option, + /// Set token limit for the specified provider #[arg(long, help = "Set token limit for the specified provider")] token_limit: Option, @@ -788,6 +796,7 @@ fn handle_config( api_key: Option, model: Option, fast_model: Option, + subagent_model: Option, token_limit: Option, param: Option>, subagent_timeout: Option, @@ -812,6 +821,7 @@ fn handle_config( api_key, model, fast_model, + subagent_model, token_limit, param, subagent_timeout, @@ -906,8 +916,20 @@ async fn handle_review( .git_repo() .and_then(|repo| repo.get_default_base_ref().ok()) .unwrap_or_else(|| "main".to_string()); - let context = + let mut context = TaskContext::for_review_with_base(commit, from, to, include_unstaged, &default_base)?; + let publication = if output.github_review { + let git_repo = service + .git_repo() + .ok_or_else(|| anyhow::anyhow!("GitHub publishing requires a git repository"))?; + let github = GitHubClient::from_git_repo(git_repo)?; + let number = github.resolve_pull_number(pull_number, git_repo).await?; + let target = github.review_target(number).await?; + context = target.pin_context(git_repo, context)?; + Some((github, number, target)) + } else { + None + }; let response = service.execute_task("review", context).await?; // Finish spinner @@ -920,12 +942,7 @@ async fn handle_review( _ => response.to_string(), }; - if output.github_review { - let git_repo = service - .git_repo() - .ok_or_else(|| anyhow::anyhow!("GitHub publishing requires a git repository"))?; - let github = GitHubClient::from_git_repo(git_repo)?; - let number = github.resolve_pull_number(pull_number, git_repo).await?; + if let Some((github, number, target)) = publication { let publish_options = ReviewPublishOptions { event: output.github_review_event.into(), inline_comments: output.github_inline_comments, @@ -933,12 +950,12 @@ async fn handle_review( match &response { StructuredResponse::Review(review) => { github - .publish_structured_review(number, review, publish_options) + .publish_structured_review(number, review, publish_options, &target) .await?; } _ => { github - .publish_review(number, &review_content, publish_options) + .publish_review(number, &review_content, publish_options, &target) .await?; } } @@ -1200,6 +1217,7 @@ pub async fn handle_command( common, api_key, fast_model, + subagent_model, token_limit, param, subagent_timeout, @@ -1209,6 +1227,7 @@ pub async fn handle_command( api_key, common.model.clone(), fast_model, + subagent_model, token_limit, param, subagent_timeout, @@ -1289,6 +1308,7 @@ pub async fn handle_command( Commands::ProjectConfig { common, fast_model, + subagent_model, token_limit, param, subagent_timeout, @@ -1298,6 +1318,7 @@ pub async fn handle_command( &common, common.model.clone(), fast_model, + subagent_model, token_limit, param, subagent_timeout, diff --git a/src/commands.rs b/src/commands.rs index 443a4e5..6717f21 100644 --- a/src/commands.rs +++ b/src/commands.rs @@ -75,6 +75,7 @@ fn apply_config_changes( common: &CommonParams, model: Option, fast_model: Option, + subagent_model: Option, token_limit: Option, param: Option>, api_key: Option, @@ -89,22 +90,7 @@ fn apply_config_changes( // Handle provider change - validate and insert if needed if let Some(provider_str) = &common.provider { - let provider: Provider = provider_str.parse().map_err(|_| { - anyhow!( - "Invalid provider: {}. Available: {}", - provider_str, - Provider::all_names().join(", ") - ) - })?; - - // Only check for provider insertion if it wasn't already handled - if !config.providers.contains_key(provider.name()) { - config.providers.insert( - provider.name().to_string(), - ProviderConfig::with_defaults(provider), - ); - changes_made = true; - } + changes_made |= ensure_provider_config(config, provider_str)?; } let provider_config = config @@ -129,6 +115,13 @@ fn apply_config_changes( } // Apply fast model change + if let Some(model) = subagent_model + && provider_config.subagent_model.as_ref() != Some(&model) + { + provider_config.subagent_model = Some(model); + changes_made = true; + } + if let Some(fast_model) = fast_model && provider_config.fast_model != Some(fast_model.clone()) { @@ -206,6 +199,26 @@ fn apply_config_changes( Ok(changes_made) } +fn ensure_provider_config(config: &mut Config, provider_name: &str) -> anyhow::Result { + let provider: Provider = provider_name.parse().map_err(|_| { + anyhow!( + "Invalid provider: {}. Available: {}", + provider_name, + Provider::all_names().join(", ") + ) + })?; + + if config.providers.contains_key(provider.name()) { + return Ok(false); + } + + config.providers.insert( + provider.name().to_string(), + ProviderConfig::with_defaults(provider), + ); + Ok(true) +} + /// Handle the 'config' command #[allow(clippy::too_many_lines)] /// @@ -217,6 +230,7 @@ pub fn handle_config_command( api_key: Option, model: Option, fast_model: Option, + subagent_model: Option, token_limit: Option, param: Option>, subagent_timeout: Option, @@ -245,6 +259,7 @@ pub fn handle_config_command( common, model, fast_model, + subagent_model, token_limit, param, api_key, @@ -314,6 +329,7 @@ pub fn handle_project_config_command( common: &CommonParams, model: Option, fast_model: Option, + subagent_model: Option, token_limit: Option, param: Option>, subagent_timeout: Option, @@ -363,6 +379,7 @@ pub fn handle_project_config_command( common, model, fast_model, + subagent_model, token_limit, param, &mut changes_made, @@ -389,6 +406,7 @@ fn apply_provider_settings( common: &CommonParams, model: Option, fast_model: Option, + subagent_model: Option, token_limit: Option, param: Option>, changes_made: &mut bool, @@ -414,20 +432,19 @@ fn apply_provider_settings( } // Get provider name to use - let provider_name = common - .provider - .clone() - .or_else(|| { - if config.default_provider.is_empty() { - None - } else { - Some(config.default_provider.clone()) - } - }) - .unwrap_or_else(|| Provider::default().name().to_string()); + let provider_name = if config.default_provider.is_empty() { + Provider::default().name().to_string() + } else { + config.default_provider.clone() + }; // Ensure provider config entry exists if setting model options - if model.is_some() || fast_model.is_some() || token_limit.is_some() || param.is_some() { + if model.is_some() + || fast_model.is_some() + || subagent_model.is_some() + || token_limit.is_some() + || param.is_some() + { config.providers.entry(provider_name.clone()).or_default(); } @@ -440,6 +457,14 @@ fn apply_provider_settings( *changes_made = true; } + if let Some(model) = subagent_model + && let Some(pc) = config.providers.get_mut(&provider_name) + && pc.subagent_model.as_ref() != Some(&model) + { + pc.subagent_model = Some(model); + *changes_made = true; + } + if let Some(fm) = fast_model && let Some(pc) = config.providers.get_mut(&provider_name) && pc.fast_model != Some(fm.clone()) @@ -733,6 +758,10 @@ fn print_provider_section(config: &Config, provider_name: &str) { .or_else(|| provider.map(|p| p.default_fast_model().to_string())) .unwrap_or_default(); print_config_row("Fast Model", &fast_model, dim, false); + let subagent_model = provider_config + .and_then(|pc| provider.map(|p| pc.effective_subagent_model(p))) + .unwrap_or(&model); + print_config_row("Subagent Model", subagent_model, dim, false); // Context window if let Some(p) = provider { @@ -1076,3 +1105,7 @@ fn find_git_hooks_dir() -> Result { Ok(hooks_dir) } + +#[cfg(test)] +#[path = "commands_tests.rs"] +mod tests; diff --git a/src/commands_tests.rs b/src/commands_tests.rs new file mode 100644 index 0000000..cb8a808 --- /dev/null +++ b/src/commands_tests.rs @@ -0,0 +1,32 @@ +use super::apply_provider_settings; +use crate::{common::CommonParams, config::Config}; + +#[test] +fn project_provider_aliases_store_overrides_under_the_canonical_name() { + for alias in ["claude", "Anthropic"] { + let mut config = Config::default(); + let common = CommonParams { + provider: Some(alias.to_string()), + ..CommonParams::default() + }; + let mut changed = false; + let name = apply_provider_settings( + &mut config, + &common, + Some("primary".into()), + Some("status".into()), + Some("worker".into()), + None, + None, + &mut changed, + ) + .expect("valid alias"); + assert_eq!(name, "anthropic"); + assert!(changed); + assert!(!config.providers.contains_key(alias)); + let provider = &config.providers["anthropic"]; + assert_eq!(provider.model, "primary"); + assert_eq!(provider.fast_model.as_deref(), Some("status")); + assert_eq!(provider.subagent_model.as_deref(), Some("worker")); + } +} diff --git a/src/config.rs b/src/config.rs index fd9b556..fb38d8b 100644 --- a/src/config.rs +++ b/src/config.rs @@ -232,6 +232,9 @@ impl Config { if !proj_config.model.is_empty() { entry.model = proj_config.model; } + if proj_config.subagent_model.is_some() { + entry.subagent_model.clone_from(&proj_config.subagent_model); + } if proj_config.fast_model.is_some() { entry.fast_model = proj_config.fast_model; } @@ -303,6 +306,9 @@ impl Config { if !proj_config.model.is_empty() { proj_config.model.clone_into(&mut entry.model); } + if proj_config.subagent_model.is_some() { + entry.subagent_model.clone_from(&proj_config.subagent_model); + } if proj_config.fast_model.is_some() { entry.fast_model.clone_from(&proj_config.fast_model); } diff --git a/src/config/tests/project_config_tests.rs b/src/config/tests/project_config_tests.rs index 40066d2..b53c2d5 100644 --- a/src/config/tests/project_config_tests.rs +++ b/src/config/tests/project_config_tests.rs @@ -179,3 +179,24 @@ model = "claude-opus-4-6" let (_migrated, needs_save) = Config::migrate_if_needed(config); assert!(!needs_save, "no-op migration must not request a save"); } + +#[test] +fn project_subagent_model_overrides_personal_without_changing_status_model() { + let mut personal = Config::default(); + let project_toml = r#" +[providers.openai] +subagent_model = "gpt-5.6-sol" +"#; + let project: Config = toml::from_str(project_toml).expect("project config"); + let source: toml::Value = toml::from_str(project_toml).expect("project source"); + personal.merge_loaded_project_config(project, &source); + let provider = personal.providers.get("openai").expect("provider"); + assert_eq!( + provider.effective_subagent_model(crate::providers::Provider::OpenAI), + "gpt-5.6-sol" + ); + assert_eq!( + provider.effective_fast_model(crate::providers::Provider::OpenAI), + "gpt-5.6-luna" + ); +} diff --git a/src/git/commit.rs b/src/git/commit.rs index 9860f02..06a39f7 100644 --- a/src/git/commit.rs +++ b/src/git/commit.rs @@ -1,9 +1,9 @@ use crate::context::{ChangeType, RecentCommit, StagedFile}; use crate::git::utils::{is_binary_diff, should_exclude_file}; use crate::log_debug; -use anyhow::{Context, Result, anyhow}; +use anyhow::{Result, anyhow}; use chrono; -use git2::{FileMode, Repository, Status}; +use git2::{Delta, FileMode, Repository}; /// Results from a commit operation #[derive(Debug)] @@ -46,58 +46,36 @@ pub fn commit(repo: &Repository, message: &str, is_remote: bool) -> Result Some(head.peel_to_commit()?), + Err(error) if error.code() == git2::ErrorCode::UnbornBranch => None, + Err(error) => return Err(error.into()), + }; + let parents: Vec<_> = parent_commit.iter().collect(); let commit_oid = repo.commit( Some("HEAD"), &signature, &signature, message, &tree, - &[&parent_commit], + &parents, )?; let branch_name = repo.head()?.shorthand().unwrap_or("HEAD").to_string(); let commit = repo.find_commit(commit_oid)?; let short_hash = commit.id().to_string()[..7].to_string(); - let mut files_changed = 0; - let mut insertions = 0; - let mut deletions = 0; - let mut new_files = Vec::new(); - - let diff = repo.diff_tree_to_tree(Some(&parent_commit.tree()?), Some(&tree), None)?; - - diff.print(git2::DiffFormat::NameStatus, |_, _, line| { - files_changed += 1; - if line.origin() == '+' { - insertions += 1; - } else if line.origin() == '-' { - deletions += 1; - } - true - })?; - - let statuses = repo.statuses(None)?; - for entry in statuses.iter() { - if entry.status().contains(Status::INDEX_NEW) { - new_files.push(( - entry.path().context("Could not get path")?.to_string(), - entry - .index_to_workdir() - .context("Could not get index to workdir")? - .new_file() - .mode(), - )); - } - } + let parent_tree = parent_commit.as_ref().map(git2::Commit::tree).transpose()?; + let diff = repo.diff_tree_to_tree(parent_tree.as_ref(), Some(&tree), None)?; + let stats = diff.stats()?; Ok(CommitResult { branch: branch_name, commit_hash: short_hash, - files_changed, - insertions, - deletions, - new_files, + files_changed: stats.files_changed(), + insertions: stats.insertions(), + deletions: stats.deletions(), + new_files: added_files(&diff), }) } @@ -135,7 +113,7 @@ pub fn amend_commit(repo: &Repository, message: &str, is_remote: bool) -> Result // Amend the HEAD commit with the new tree and message let commit_oid = head_commit.amend( Some("HEAD"), // Update the HEAD reference - Some(&signature), // New author (use current) + None, // Preserve the original author and author date Some(&signature), // New committer (use current) None, // Keep original encoding Some(message), // New message @@ -146,12 +124,6 @@ pub fn amend_commit(repo: &Repository, message: &str, is_remote: bool) -> Result let commit = repo.find_commit(commit_oid)?; let short_hash = commit.id().to_string()[..7].to_string(); - // Calculate diff stats from the original parent to the new tree - let mut files_changed = 0; - let mut insertions = 0; - let mut deletions = 0; - let new_files = Vec::new(); - // Use the first parent for diff (or empty tree if initial commit) let parent_tree = if head_commit.parent_count() > 0 { Some(head_commit.parent(0)?.tree()?) @@ -160,33 +132,35 @@ pub fn amend_commit(repo: &Repository, message: &str, is_remote: bool) -> Result }; let diff = repo.diff_tree_to_tree(parent_tree.as_ref(), Some(&tree), None)?; - diff.print(git2::DiffFormat::NameStatus, |_, _, line| { - files_changed += 1; - if line.origin() == '+' { - insertions += 1; - } else if line.origin() == '-' { - deletions += 1; - } - true - })?; + let stats = diff.stats()?; log_debug!( "Amended commit {} -> {} with {} files changed", &head_commit.id().to_string()[..7], short_hash, - files_changed + stats.files_changed() ); Ok(CommitResult { branch: branch_name, commit_hash: short_hash, - files_changed, - insertions, - deletions, - new_files, + files_changed: stats.files_changed(), + insertions: stats.insertions(), + deletions: stats.deletions(), + new_files: added_files(&diff), }) } +fn added_files(diff: &git2::Diff<'_>) -> Vec<(String, FileMode)> { + diff.deltas() + .filter(|delta| delta.status() == Delta::Added) + .filter_map(|delta| { + let file = delta.new_file(); + Some((file.path()?.to_string_lossy().into_owned(), file.mode())) + }) + .collect() +} + /// Gets the message of the HEAD commit. /// /// # Arguments diff --git a/src/git/files.rs b/src/git/files.rs index b09ba7d..036768c 100644 --- a/src/git/files.rs +++ b/src/git/files.rs @@ -240,7 +240,7 @@ pub fn get_untracked_files(repo: &Repository) -> Result> { // Only include files that are untracked (not in index, not ignored) if status.is_wt_new() && !status.is_index_new() - && let Some(path) = entry.path() + && let Ok(path) = entry.path() { untracked.push(path.to_string()); } @@ -309,7 +309,7 @@ pub fn get_ahead_behind(repo: &Repository) -> (usize, usize) { return (0, 0); // No HEAD }; - let Some(branch_name) = head.shorthand() else { + let Ok(branch_name) = head.shorthand() else { return (0, 0); }; diff --git a/src/git/repository.rs b/src/git/repository.rs index 572e8c2..5668c21 100644 --- a/src/git/repository.rs +++ b/src/git/repository.rs @@ -215,6 +215,8 @@ impl GitRepo { let remotes = repo.remotes()?; let remote_name = remotes .iter() + .collect::, _>>()? + .into_iter() .flatten() .next() .ok_or_else(|| anyhow!("No remote found"))?; @@ -223,6 +225,8 @@ impl GitRepo { let fetch_refspec_storage: Vec = remote .fetch_refspecs()? .iter() + .collect::, _>>()? + .into_iter() .flatten() .map(std::string::ToString::to_string) .collect(); @@ -246,8 +250,17 @@ impl GitRepo { /// A Result containing the branch name as a String or an error. pub fn get_current_branch(&self) -> Result { let repo = self.open_repo()?; - let head = repo.head()?; - let branch_name = head.shorthand().unwrap_or("HEAD detached").to_string(); + let branch_name = match repo.head() { + Ok(head) if head.is_branch() => head.shorthand().unwrap_or("HEAD").to_string(), + Ok(_) => "HEAD detached".to_string(), + Err(error) if error.code() == git2::ErrorCode::UnbornBranch => repo + .find_reference("HEAD")? + .symbolic_target()? + .and_then(|target| target.strip_prefix("refs/heads/")) + .context("Unborn HEAD has no branch name")? + .to_string(), + Err(error) => return Err(error.into()), + }; log_debug!("Current branch: {}", branch_name); Ok(branch_name) } @@ -266,7 +279,10 @@ impl GitRepo { } if let Ok(remotes) = repo.remotes() { - for remote_name in remotes.iter().flatten() { + for remote_name in &remotes { + let Some(remote_name) = remote_name? else { + continue; + }; if remote_name == "origin" { continue; } @@ -314,16 +330,42 @@ impl GitRepo { } let repo = self.open_repo()?; - let hook_path = repo.path().join("hooks").join(hook_name); + let repo_workdir = repo + .workdir() + .context("Repository has no working directory")?; + // Git resolves core.hooksPath and the shared directory of linked worktrees. + let output = Command::new("git") + .current_dir(repo_workdir) + .env("GIT_DIR", repo.path()) + .env("GIT_WORK_TREE", repo_workdir) + .args(["rev-parse", "--git-path", &format!("hooks/{hook_name}")]) + .output() + .context("Failed to resolve Git hook path")?; + if !output.status.success() { + return Err(anyhow!( + "Failed to resolve Git hook path: {}", + String::from_utf8_lossy(&output.stderr).trim() + )); + } + let hook_path = repo_workdir.join( + String::from_utf8(output.stdout) + .context("Git hook path is not valid UTF-8")? + .trim_end_matches(['\r', '\n']), + ); if !hook_path.exists() { log_debug!("Hook '{}' not found at {:?}", hook_name, hook_path); return Ok(()); } - let repo_workdir = repo - .workdir() - .context("Repository has no working directory")?; + #[cfg(unix)] + { + use std::os::unix::fs::PermissionsExt; + if hook_path.metadata()?.permissions().mode() & 0o111 == 0 { + log_debug!("Skipping non-executable hook: {:?}", hook_path); + return Ok(()); + } + } execute_hook_command(hook_name, &hook_path, repo.path(), repo_workdir) } @@ -749,7 +791,11 @@ impl GitRepo { let repo = self.open_repo()?; log_debug!("Fetching {} recent commits", count); let mut revwalk = repo.revwalk()?; - revwalk.push_head()?; + match repo.head() { + Ok(_) => revwalk.push_head()?, + Err(error) if error.code() == git2::ErrorCode::UnbornBranch => return Ok(Vec::new()), + Err(error) => return Err(error.into()), + } let commits = revwalk .take(count) @@ -914,14 +960,15 @@ impl GitRepo { let repo = self.open_repo()?; // Get HEAD tree to reset index entry - let head = repo.head()?; - let head_commit = head.peel_to_commit()?; - let head_tree = head_commit.tree()?; - let mut index = repo.index()?; + let head_tree = match repo.head() { + Ok(head) => Some(head.peel_to_tree()?), + Err(error) if error.code() == git2::ErrorCode::UnbornBranch => None, + Err(error) => return Err(error.into()), + }; // Try to get the entry from HEAD - if let Ok(entry) = head_tree.get_path(path) { + if let Some(entry) = head_tree.as_ref().and_then(|tree| tree.get_path(path).ok()) { // File exists in HEAD, reset to that state let blob = repo.find_blob(entry.id())?; #[allow( @@ -970,9 +1017,18 @@ impl GitRepo { /// Unstage all files (reset index to HEAD) pub fn unstage_all(&self) -> Result<()> { let repo = self.open_repo()?; - let head = repo.head()?; - let head_commit = head.peel_to_commit()?; - repo.reset(head_commit.as_object(), git2::ResetType::Mixed, None)?; + match repo.head() { + Ok(head) => { + let head_commit = head.peel_to_commit()?; + repo.reset(head_commit.as_object(), git2::ResetType::Mixed, None)?; + } + Err(error) if error.code() == git2::ErrorCode::UnbornBranch => { + let mut index = repo.index()?; + index.clear()?; + index.write()?; + } + Err(error) => return Err(error.into()), + } Ok(()) } @@ -1022,7 +1078,7 @@ fn resolve_remote_head_base( let Ok(reference) = repo.find_reference(&reference_name) else { return None; }; - let symbolic_target = reference.symbolic_target()?; + let symbolic_target = reference.symbolic_target().ok()??; let remote_ref = symbolic_target.strip_prefix("refs/remotes/")?; if let Some((_, local_candidate)) = remote_ref.split_once('/') diff --git a/src/github.rs b/src/github.rs index 899f826..31d7a13 100644 --- a/src/github.rs +++ b/src/github.rs @@ -11,6 +11,9 @@ use std::path::{Path, PathBuf}; use std::sync::LazyLock; use url::Url; +mod review_target; +pub use review_target::ReviewTarget; + static BACKTICK_LOCATION_RE: LazyLock = LazyLock::new(|| { Regex::new(r"`([^`\s]+):(\d+)`").expect("backtick location regex should compile") }); @@ -108,9 +111,15 @@ impl GitHubClient { pull_number: u64, body: &str, options: ReviewPublishOptions, + target: &ReviewTarget, ) -> Result { - self.publish_review_with_comments(pull_number, ReviewSource::Markdown(body), options) - .await + self.publish_review_with_comments( + pull_number, + ReviewSource::Markdown(body), + options, + target, + ) + .await } pub async fn publish_structured_review( @@ -118,9 +127,15 @@ impl GitHubClient { pull_number: u64, review: &CodeReview, options: ReviewPublishOptions, + target: &ReviewTarget, ) -> Result { - self.publish_review_with_comments(pull_number, ReviewSource::Structured(review), options) - .await + self.publish_review_with_comments( + pull_number, + ReviewSource::Structured(review), + options, + target, + ) + .await } async fn publish_review_with_comments( @@ -128,6 +143,7 @@ impl GitHubClient { pull_number: u64, review: ReviewSource<'_>, options: ReviewPublishOptions, + target: &ReviewTarget, ) -> Result { let pull = self .crab @@ -135,13 +151,18 @@ impl GitHubClient { .get(pull_number) .await .with_context(|| format!("Failed to fetch PR #{pull_number}"))?; - let review_body = review.body(&self.repo, &pull.head.sha); + target.validate(&pull.base.ref_field, &pull.head.sha)?; + let review_body = review.body(&self.repo, &target.head_sha); let comments = if options.inline_comments { self.validated_inline_comments(pull_number, review).await? } else { Vec::new() }; + // The diff endpoint is mutable; recheck after retrieving inline locations. + let current = self.review_target(pull_number).await?; + target.validate(¤t.base_ref, ¤t.head_sha)?; + let route = format!( "/repos/{owner}/{repo}/pulls/{pull_number}/reviews", owner = self.repo.owner, @@ -150,7 +171,7 @@ impl GitHubClient { let payload = serde_json::json!({ "body": review_body, "event": options.event, - "commit_id": pull.head.sha, + "commit_id": target.head_sha, "comments": comments, }); @@ -164,6 +185,21 @@ impl GitHubClient { &self.repo } + /// Capture the immutable commits before generating a pull-request review. + pub async fn review_target(&self, pull_number: u64) -> Result { + let pull = self + .crab + .pulls(&self.repo.owner, &self.repo.name) + .get(pull_number) + .await + .with_context(|| format!("Failed to fetch PR #{pull_number}"))?; + Ok(ReviewTarget { + base_ref: pull.base.ref_field, + base_sha: pull.base.sha, + head_sha: pull.head.sha, + }) + } + async fn find_open_pull_for_branch(&self, branch: &str) -> Result { let same_repo_head = format!("{}:{branch}", self.repo.owner); let page = self @@ -392,6 +428,8 @@ fn github_remote_url(repo: &GitRepo) -> Result { let remotes = raw_repo.remotes()?; let remote_name = remotes .iter() + .collect::, _>>()? + .into_iter() .flatten() .next() .ok_or(git2::Error::from_str("No git remotes configured"))?; @@ -402,7 +440,7 @@ fn github_remote_url(repo: &GitRepo) -> Result { remote .url() .map(std::string::ToString::to_string) - .ok_or_else(|| anyhow!("Git remote has no URL")) + .context("Git remote has no valid URL") } fn single_pull_number(pulls: &[PullRequest]) -> Option { diff --git a/src/github/review_target.rs b/src/github/review_target.rs new file mode 100644 index 0000000..5c5de15 --- /dev/null +++ b/src/github/review_target.rs @@ -0,0 +1,69 @@ +use anyhow::{Context, Result, bail}; + +use crate::{agents::TaskContext, git::GitRepo}; + +/// Pull-request revisions captured before analysis and checked before publishing. +#[derive(Debug, Clone)] +pub struct ReviewTarget { + pub base_ref: String, + pub base_sha: String, + pub head_sha: String, +} + +impl ReviewTarget { + pub(super) fn validate(&self, base_ref: &str, head: &str) -> Result<()> { + if self.base_ref != base_ref || self.head_sha != head { + bail!("Pull request changed during analysis. Generate a new review before publishing."); + } + Ok(()) + } + + /// Resolve local refs to immutable commits matching the publication target. + pub fn pin_context(&self, repo: &GitRepo, context: TaskContext) -> Result { + let repo = git2::Repository::open(repo.repo_path())?; + let resolve = |reference: &str| -> Result { + Ok(repo.revparse_single(reference) + .with_context(|| format!("Review commit {reference} is unavailable locally; fetch the pull request first"))? + .peel_to_commit()?.id()) + }; + let head = resolve(&self.head_sha)?; + let pinned = match context { + TaskContext::Staged { + include_unstaged: false, + } => { + let base = resolve(&self.base_sha)?; + let merge_base = repo.merge_base(base, head)?; + TaskContext::Range { + from: merge_base.to_string(), + to: head.to_string(), + } + } + TaskContext::Commit { commit_id } => { + let commit = resolve(&commit_id)?; + if commit != head { + bail!( + "Selected commit does not match the pull-request head. Review the current PR head before publishing." + ); + } + TaskContext::Commit { + commit_id: commit.to_string(), + } + } + TaskContext::Range { from, to } => { + if resolve(&to)? != head { + bail!( + "Review --to does not match the pull-request head. Review the current PR head before publishing." + ); + } + TaskContext::Range { + from: resolve(&from)?.to_string(), + to: head.to_string(), + } + } + _ => bail!( + "Uncommitted changes cannot be attached to a GitHub commit review. Commit and push them, or review locally without --github-review." + ), + }; + Ok(pinned) + } +} diff --git a/src/github/tests/mod.rs b/src/github/tests/mod.rs index 6dfd8b4..fa5851c 100644 --- a/src/github/tests/mod.rs +++ b/src/github/tests/mod.rs @@ -1,5 +1,7 @@ use std::path::PathBuf; +mod review_target_tests; + use crate::types::{ Category, EvidenceRef, Finding, FindingId, Review, ReviewMetadata, ReviewStats, Severity, }; diff --git a/src/github/tests/review_target_tests.rs b/src/github/tests/review_target_tests.rs new file mode 100644 index 0000000..e1bea72 --- /dev/null +++ b/src/github/tests/review_target_tests.rs @@ -0,0 +1,217 @@ +use crate::{agents::TaskContext, git::GitRepo, github::ReviewTarget}; +use anyhow::Result; + +#[test] +fn review_target_rejects_retargeting_or_changed_head() { + let target = ReviewTarget { + base_ref: "main".into(), + base_sha: "base".into(), + head_sha: "head".into(), + }; + assert!(target.validate("main", "head").is_ok()); + assert!(target.validate("release", "head").is_err()); + assert!(target.validate("main", "new-head").is_err()); +} + +#[test] +fn github_review_context_pins_commits_and_rejects_unpublished_changes() -> Result<()> { + let dir = tempfile::TempDir::new()?; + let repo = git2::Repository::init(dir.path())?; + let sig = git2::Signature::now("Test", "test@example.com")?; + let tree_id = repo.index()?.write_tree()?; + let tree = repo.find_tree(tree_id)?; + let base = repo.commit(Some("HEAD"), &sig, &sig, "base", &tree, &[])?; + let parent = repo.find_commit(base)?; + let head = repo.commit(Some("HEAD"), &sig, &sig, "head", &tree, &[&parent])?; + let target = ReviewTarget { + base_ref: "main".into(), + base_sha: base.to_string(), + head_sha: head.to_string(), + }; + let git_repo = GitRepo::new(dir.path())?; + + let context = target.pin_context( + &git_repo, + TaskContext::Staged { + include_unstaged: false, + }, + )?; + assert!( + matches!(context, TaskContext::Range { from, to } if from == base.to_string() && to == head.to_string()) + ); + let context = target.pin_context( + &git_repo, + TaskContext::Commit { + commit_id: "HEAD".into(), + }, + )?; + assert!(matches!(context, TaskContext::Commit { commit_id } if commit_id == head.to_string())); + assert!( + target + .pin_context( + &git_repo, + TaskContext::Commit { + commit_id: base.to_string() + } + ) + .is_err() + ); + assert!( + target + .pin_context( + &git_repo, + TaskContext::Range { + from: base.to_string(), + to: base.to_string() + } + ) + .is_err() + ); + assert!( + target + .pin_context( + &git_repo, + TaskContext::Staged { + include_unstaged: true + } + ) + .is_err() + ); + Ok(()) +} + +async fn server( + responses: Vec, +) -> Result<( + crate::github::GitHubClient, + tokio::task::JoinHandle>, +)> { + use tokio::io::{AsyncReadExt, AsyncWriteExt}; + let listener = tokio::net::TcpListener::bind("127.0.0.1:0").await?; + let address = listener.local_addr()?; + let task = tokio::spawn(async move { + let mut requests = Vec::new(); + for response in responses { + let (mut stream, _) = listener.accept().await.expect("accept"); + let mut bytes = Vec::new(); + let (end, length) = loop { + let mut chunk = [0; 4096]; + let count = stream.read(&mut chunk).await.expect("read"); + assert_ne!(count, 0); + bytes.extend_from_slice(&chunk[..count]); + if let Some(end) = bytes.windows(4).position(|part| part == b"\r\n\r\n") { + let headers = String::from_utf8_lossy(&bytes[..end]); + let length = headers + .lines() + .find_map(|line| { + let (name, value) = line.split_once(':')?; + name.eq_ignore_ascii_case("content-length") + .then(|| value.trim().parse::().expect("length")) + }) + .unwrap_or(0); + break (end + 4, length); + } + }; + while bytes.len() < end + length { + let mut chunk = [0; 4096]; + let count = stream.read(&mut chunk).await.expect("body"); + assert_ne!(count, 0); + bytes.extend_from_slice(&chunk[..count]); + } + let header = String::from_utf8_lossy(&bytes[..end]).into_owned(); + let body = if length == 0 { + serde_json::Value::Null + } else { + serde_json::from_slice(&bytes[end..end + length]).expect("JSON body") + }; + requests.push((header, body)); + let body = response.to_string(); + stream.write_all(format!("HTTP/1.1 200 OK\r\nContent-Type: application/json\r\nContent-Length: {}\r\nConnection: close\r\n\r\n{body}", body.len()).as_bytes()).await.expect("response"); + } + requests + }); + let client = crate::github::GitHubClient { + crab: octocrab::Octocrab::builder() + .base_uri(format!("http://{address}"))? + .build()?, + repo: crate::github::GitHubRepository { + owner: "test".into(), + name: "repo".into(), + }, + }; + Ok((client, task)) +} + +fn pull(head: &str) -> serde_json::Value { + serde_json::json!({"id":1,"number":1,"url":"https://api.github.com/repos/test/repo/pulls/1", + "head":{"ref":"feature","sha":head},"base":{"ref":"main","sha":"base"}}) +} + +#[tokio::test] +async fn publisher_posts_only_the_reviewed_commit() -> Result<()> { + let mut advanced_base = pull("head"); + advanced_base["base"]["sha"] = "advanced-base".into(); + let (client, requests) = server(vec![ + pull("head"), + advanced_base, + serde_json::json!({ + "id":1,"node_id":"review","html_url":"https://github.com/test/repo/pull/1#review"}), + ]) + .await?; + let target = ReviewTarget { + base_ref: "main".into(), + base_sha: "base".into(), + head_sha: "head".into(), + }; + client + .publish_review( + 1, + "Reviewed pinned changes", + crate::github::ReviewPublishOptions { + event: octocrab::models::pulls::ReviewAction::Comment, + inline_comments: false, + }, + &target, + ) + .await?; + let requests = requests.await?; + assert_eq!(requests.len(), 3); + assert!( + requests[2] + .0 + .starts_with("POST /repos/test/repo/pulls/1/reviews ") + ); + assert_eq!(requests[2].1["commit_id"], "head"); + Ok(()) +} + +#[tokio::test] +async fn publisher_rejects_head_movement_before_posting() -> Result<()> { + let (client, requests) = server(vec![pull("head"), pull("new-head")]).await?; + let target = ReviewTarget { + base_ref: "main".into(), + base_sha: "base".into(), + head_sha: "head".into(), + }; + let error = client + .publish_review( + 1, + "Review", + crate::github::ReviewPublishOptions { + event: octocrab::models::pulls::ReviewAction::Approve, + inline_comments: false, + }, + &target, + ) + .await + .expect_err("moving PR must not publish"); + assert!(error.to_string().contains("changed during analysis")); + let requests = requests.await?; + assert_eq!(requests.len(), 2); + assert!( + requests + .iter() + .all(|(header, _)| header.starts_with("GET ")) + ); + Ok(()) +} diff --git a/src/providers.rs b/src/providers.rs index 4c899dd..3837354 100644 --- a/src/providers.rs +++ b/src/providers.rs @@ -15,11 +15,19 @@ pub enum Provider { OpenAI, Anthropic, Google, + OpenRouter, + Fireworks, } impl Provider { /// All available providers - pub const ALL: &'static [Provider] = &[Provider::OpenAI, Provider::Anthropic, Provider::Google]; + pub const ALL: &'static [Provider] = &[ + Provider::OpenAI, + Provider::Anthropic, + Provider::Google, + Provider::OpenRouter, + Provider::Fireworks, + ]; /// Provider name as used in config files and CLI #[must_use] @@ -28,6 +36,8 @@ impl Provider { Self::OpenAI => "openai", Self::Anthropic => "anthropic", Self::Google => "google", + Self::OpenRouter => "openrouter", + Self::Fireworks => "fireworks", } } @@ -35,9 +45,11 @@ impl Provider { #[must_use] pub const fn default_model(&self) -> &'static str { match self { - Self::OpenAI => "gpt-5.4", - Self::Anthropic => "claude-opus-4-6", - Self::Google => "gemini-3-pro-preview", + Self::OpenAI => "gpt-6-astra", + Self::Anthropic => "claude-opus-5", + Self::Google => "gemini-3.8-flash", + Self::OpenRouter => "anthropic/claude-opus-5", + Self::Fireworks => "accounts/fireworks/models/deepseek-v4-pro-0813", } } @@ -45,9 +57,11 @@ impl Provider { #[must_use] pub const fn default_fast_model(&self) -> &'static str { match self { - Self::OpenAI => "gpt-5.4-mini", + Self::OpenAI => "gpt-5.6-luna", Self::Anthropic => "claude-haiku-4-5-20251001", - Self::Google => "gemini-2.5-flash", + Self::Google => "gemini-3.5-flash-lite", + Self::OpenRouter => "anthropic/claude-haiku-4.5", + Self::Fireworks => "accounts/fireworks/models/deepseek-v4-flash-0731", } } @@ -55,9 +69,9 @@ impl Provider { #[must_use] pub const fn context_window(&self) -> usize { match self { - Self::OpenAI => 128_000, - Self::Anthropic => 200_000, - Self::Google => 1_000_000, + Self::OpenAI => 1_050_000, + Self::Anthropic | Self::OpenRouter | Self::Fireworks => 1_000_000, + Self::Google => 1_048_576, } } @@ -68,6 +82,8 @@ impl Provider { Self::OpenAI => "OPENAI_API_KEY", Self::Anthropic => "ANTHROPIC_API_KEY", Self::Google => "GOOGLE_API_KEY", + Self::OpenRouter => "OPENROUTER_API_KEY", + Self::Fireworks => "FIREWORKS_API_KEY", } } @@ -80,7 +96,8 @@ impl Provider { match self { Self::OpenAI => &["sk-", "sk-proj-"], Self::Anthropic => &["sk-ant-"], - Self::Google => &[], // Google API keys don't have a consistent prefix + Self::OpenRouter => &["sk-or-"], + Self::Google | Self::Fireworks => &[], // Google API keys don't have a consistent prefix } } @@ -92,7 +109,8 @@ impl Provider { match self { Self::OpenAI => Some("sk-"), Self::Anthropic => Some("sk-ant-"), - Self::Google => None, + Self::OpenRouter => Some("sk-or-"), + Self::Google | Self::Fireworks => None, } } @@ -176,7 +194,7 @@ impl fmt::Display for Provider { /// Provider configuration error #[derive(Debug, thiserror::Error)] pub enum ProviderError { - #[error("Unknown provider: {0}. Supported: openai, anthropic, google")] + #[error("Unknown provider: {0}. Supported: openai, anthropic, google, openrouter, fireworks")] Unknown(String), #[error("API key required for provider: {0}")] MissingApiKey(String), @@ -194,6 +212,9 @@ pub struct ProviderConfig { /// Fast model for simple tasks #[serde(default, skip_serializing_if = "Option::is_none")] pub fast_model: Option, + /// Model for delegated analysis (defaults to the primary model) + #[serde(default, skip_serializing_if = "Option::is_none")] + pub subagent_model: Option, /// Token limit override #[serde(default, skip_serializing_if = "Option::is_none")] pub token_limit: Option, @@ -215,6 +236,7 @@ impl fmt::Debug for ProviderConfig { ) .field("model", &self.model) .field("fast_model", &self.fast_model) + .field("subagent_model", &self.subagent_model) .field("token_limit", &self.token_limit) .field("additional_params", &self.additional_params) .finish() @@ -229,6 +251,7 @@ impl ProviderConfig { api_key: String::new(), model: provider.default_model().to_string(), fast_model: Some(provider.default_fast_model().to_string()), + subagent_model: None, token_limit: None, additional_params: HashMap::new(), } @@ -252,6 +275,15 @@ impl ProviderConfig { .unwrap_or_else(|| provider.default_fast_model()) } + /// Get the model used for delegated analysis. + #[must_use] + pub fn effective_subagent_model(&self, provider: Provider) -> &str { + self.subagent_model + .as_deref() + .filter(|model| !model.is_empty()) + .unwrap_or_else(|| self.effective_model(provider)) + } + /// Get effective token limit (configured or default) #[must_use] pub fn effective_token_limit(&self, provider: Provider) -> usize { @@ -298,16 +330,16 @@ mod tests { #[test] fn test_provider_defaults() { - assert_eq!(Provider::OpenAI.default_model(), "gpt-5.4"); - assert_eq!(Provider::OpenAI.default_fast_model(), "gpt-5.4-mini"); - assert_eq!(Provider::Anthropic.context_window(), 200_000); + assert_eq!(Provider::OpenAI.default_model(), "gpt-6-astra"); + assert_eq!(Provider::OpenAI.default_fast_model(), "gpt-5.6-luna"); + assert_eq!(Provider::Anthropic.context_window(), 1_000_000); assert_eq!(Provider::Google.api_key_env(), "GOOGLE_API_KEY"); } #[test] fn test_provider_config_defaults() { let config = ProviderConfig::with_defaults(Provider::Anthropic); - assert_eq!(config.model, "claude-opus-4-6"); + assert_eq!(config.model, "claude-opus-5"); assert_eq!( config.fast_model.as_deref(), Some("claude-haiku-4-5-20251001") diff --git a/src/studio/app/mod.rs b/src/studio/app/mod.rs index 8b8e9a8..3bcf03b 100644 --- a/src/studio/app/mod.rs +++ b/src/studio/app/mod.rs @@ -89,6 +89,10 @@ pub enum IrisTaskResult { file: std::path::PathBuf, entries: Vec, }, + FileLogFailed { + file: std::path::PathBuf, + error: String, + }, /// Global commit log loaded GlobalLogLoaded { entries: Vec, @@ -590,6 +594,10 @@ impl StudioApp { use crate::studio::state::FileLogEntry; let Some(repo) = &self.state.repo else { + let _ = self.iris_result_tx.send(IrisTaskResult::FileLogFailed { + file: path.to_path_buf(), + error: "No repository is open".into(), + }); return; }; @@ -627,7 +635,9 @@ impl StudioApp { .output()?; if !output.status.success() { - return Ok(Vec::new()); + return Err(std::io::Error::other( + String::from_utf8_lossy(&output.stderr).into_owned(), + )); } let stdout = String::from_utf8_lossy(&output.stdout); @@ -680,10 +690,16 @@ impl StudioApp { }); } Ok(Err(e)) => { - tracing::warn!("Failed to load file log: {}", e); + let _ = tx.send(IrisTaskResult::FileLogFailed { + file: file_for_result, + error: e.to_string(), + }); } Err(e) => { - tracing::warn!("File log task panicked: {}", e); + let _ = tx.send(IrisTaskResult::FileLogFailed { + file: file_for_result, + error: e.to_string(), + }); } } }); @@ -1185,6 +1201,9 @@ impl StudioApp { IrisTaskResult::FileLogLoaded { file, entries } => { Some(StudioEvent::FileLogLoaded { file, entries }) } + IrisTaskResult::FileLogFailed { file, error } => { + Some(StudioEvent::FileLogFailed { file, error }) + } IrisTaskResult::GlobalLogLoaded { entries } => { Some(StudioEvent::GlobalLogLoaded { entries }) } @@ -1709,29 +1728,12 @@ impl StudioApp { if is_double_click && is_dir { file_tree.toggle_expand(); - } else if is_double_click && !is_dir { - // Double-click on file: load it and focus code view - if let Some(path) = file_tree.selected_path() { - self.state.modes.explore.current_file = Some(path.clone()); - if let Err(e) = self.state.modes.explore.code_view.load_file(&path) { - self.state.notify(Notification::warning(format!( - "Could not load file: {}", - e - ))); - } + } else if (is_double_click || changed) && !is_dir { + let effects = super::handlers::load_selected_file(&mut self.state); + let _ = self.execute_effects(effects); + if is_double_click { self.state.focused_panel = PanelId::Center; } - } else if changed && !is_dir { - // Single click on file: load it into code view - if let Some(path) = file_tree.selected_path() { - self.state.modes.explore.current_file = Some(path.clone()); - if let Err(e) = self.state.modes.explore.code_view.load_file(&path) { - self.state.notify(Notification::warning(format!( - "Could not load file: {}", - e - ))); - } - } } self.state.mark_dirty(); } diff --git a/src/studio/events.rs b/src/studio/events.rs index 55b04dc..37eb028 100644 --- a/src/studio/events.rs +++ b/src/studio/events.rs @@ -161,6 +161,9 @@ pub enum StudioEvent { /// File log loading started FileLogLoading(PathBuf), + /// File history failed to load for a particular selection. + FileLogFailed { file: PathBuf, error: String }, + /// Global commit log loaded GlobalLogLoaded { entries: Vec, diff --git a/src/studio/handlers/explore.rs b/src/studio/handlers/explore.rs index 964f3b6..fd86922 100644 --- a/src/studio/handlers/explore.rs +++ b/src/studio/handlers/explore.rs @@ -45,7 +45,7 @@ pub fn handle_explore_key(state: &mut StudioState, key: KeyEvent) -> Vec Vec { +pub(crate) fn load_selected_file(state: &mut StudioState) -> Vec { if let Some(entry) = state.modes.explore.file_tree.selected_entry() && !entry.is_dir { @@ -56,6 +56,9 @@ fn load_selected_file(state: &mut StudioState) -> Vec { } // Trigger file log loading state.modes.explore.file_log_loading = true; + state.modes.explore.file_log.clear(); + state.modes.explore.file_log_selected = 0; + state.modes.explore.file_log_scroll = 0; return vec![SideEffect::LoadFileLog(path)]; } vec![] diff --git a/src/studio/handlers/mod.rs b/src/studio/handlers/mod.rs index 30f28c0..d8df368 100644 --- a/src/studio/handlers/mod.rs +++ b/src/studio/handlers/mod.rs @@ -20,6 +20,7 @@ use crate::studio::state::{Modal, Mode, Notification, SettingsState, StudioState pub use changelog::handle_changelog_key; pub use commit::handle_commit_key; pub use explore::handle_explore_key; +pub(crate) use explore::load_selected_file; pub use modals::handle_modal_key; pub use pr::handle_pr_key; pub use release_notes::handle_release_notes_key; diff --git a/src/studio/reducer/git.rs b/src/studio/reducer/git.rs index ebfab2e..c7084f0 100644 --- a/src/studio/reducer/git.rs +++ b/src/studio/reducer/git.rs @@ -64,11 +64,12 @@ pub fn file_log_loading(state: &mut StudioState, path: PathBuf) -> Vec, ) { - // Always update the file log - the path was already validated when loading started - // We also reset loading state here since results have arrived + if state.modes.explore.current_file.as_deref() != Some(file) { + return; + } state.modes.explore.file_log = entries; state.modes.explore.file_log_loading = false; state.modes.explore.file_log_selected = 0; @@ -76,6 +77,18 @@ pub fn file_log_loaded( state.mark_dirty(); } +/// Stop loading and report an error only for the current file selection. +pub fn file_log_failed(state: &mut StudioState, file: &Path, error: &str) { + if state.modes.explore.current_file.as_deref() != Some(file) { + return; + } + state.modes.explore.file_log_loading = false; + state.notify(Notification::warning(format!( + "Could not load file history: {error}" + ))); + state.mark_dirty(); +} + /// Handle `GlobalLogLoading` event pub fn global_log_loading(state: &mut StudioState) -> Vec { state.modes.explore.global_log_loading = true; diff --git a/src/studio/reducer/mod.rs b/src/studio/reducer/mod.rs index 527a93d..7c8cfe3 100644 --- a/src/studio/reducer/mod.rs +++ b/src/studio/reducer/mod.rs @@ -338,6 +338,10 @@ pub fn reduce( git::file_log_loaded(state, &file, entries); } + StudioEvent::FileLogFailed { file, error } => { + git::file_log_failed(state, &file, &error); + } + StudioEvent::GlobalLogLoading => { effects.extend(git::global_log_loading(state)); } diff --git a/src/studio/state/mod.rs b/src/studio/state/mod.rs index fd83ff7..ad9c2b5 100644 --- a/src/studio/state/mod.rs +++ b/src/studio/state/mod.rs @@ -628,7 +628,7 @@ impl SettingsState { // Truncate for display if too long let preview = self.custom_instructions.lines().next().unwrap_or(""); if preview.len() > 30 || self.custom_instructions.lines().count() > 1 { - format!("{}...", &preview.chars().take(30).collect::()) + format!("{}...", preview.chars().take(30).collect::()) } else { preview.to_string() } diff --git a/src/studio/tests/mod.rs b/src/studio/tests/mod.rs index 96bb502..59700bf 100644 --- a/src/studio/tests/mod.rs +++ b/src/studio/tests/mod.rs @@ -4,4 +4,5 @@ mod commit_handler_tests; mod explore_handler_tests; mod global_handler_tests; mod history_tests; +mod provider_settings_tests; mod reducer_tests; diff --git a/src/studio/tests/provider_settings_tests.rs b/src/studio/tests/provider_settings_tests.rs new file mode 100644 index 0000000..e3289f6 --- /dev/null +++ b/src/studio/tests/provider_settings_tests.rs @@ -0,0 +1,16 @@ +use super::super::state::SettingsState; +use crate::{config::Config, providers::Provider}; + +#[test] +fn provider_picker_includes_routed_providers() { + let config = Config::default(); + let settings = SettingsState::from_config(&config); + for provider in [Provider::OpenRouter, Provider::Fireworks] { + assert!( + settings + .available_providers + .iter() + .any(|name| name == provider.name()) + ); + } +} diff --git a/src/studio/tests/reducer_tests.rs b/src/studio/tests/reducer_tests.rs index 68afe0b..50e3d72 100644 --- a/src/studio/tests/reducer_tests.rs +++ b/src/studio/tests/reducer_tests.rs @@ -14,6 +14,63 @@ fn test_state() -> StudioState { StudioState::new(Config::default(), None) } +#[test] +fn file_log_results_only_update_the_selected_file() { + use crate::studio::state::FileLogEntry; + let mut state = test_state(); + let mut history = History::new(); + state.modes.explore.current_file = Some("new.rs".into()); + state.modes.explore.file_log_loading = true; + let entries = vec![FileLogEntry { + hash: "abc123".into(), + message: "correct history".into(), + author: "Author".into(), + short_hash: "abc123".into(), + relative_time: "now".into(), + additions: None, + deletions: None, + }]; + reduce( + &mut state, + StudioEvent::FileLogLoaded { + file: "old.rs".into(), + entries: entries.clone(), + }, + &mut history, + ); + assert!(state.modes.explore.file_log.is_empty()); + assert!(state.modes.explore.file_log_loading); + reduce( + &mut state, + StudioEvent::FileLogLoaded { + file: "new.rs".into(), + entries, + }, + &mut history, + ); + assert_eq!(state.modes.explore.file_log.len(), 1); + assert!(!state.modes.explore.file_log_loading); +} + +#[test] +fn file_log_failures_only_stop_loading_for_the_current_selection() { + let mut state = test_state(); + let mut history = History::new(); + state.modes.explore.current_file = Some("new.rs".into()); + state.modes.explore.file_log_loading = true; + for (file, still_loading) in [("old.rs", true), ("new.rs", false)] { + reduce( + &mut state, + StudioEvent::FileLogFailed { + file: file.into(), + error: "git failed".into(), + }, + &mut history, + ); + assert_eq!(state.modes.explore.file_log_loading, still_loading); + } +} + fn test_review(summary: &str) -> Review { Review { summary: summary.to_string(), diff --git a/tests/agent_tests.rs b/tests/agent_tests.rs index 4e843dc..a4717c4 100644 --- a/tests/agent_tests.rs +++ b/tests/agent_tests.rs @@ -14,7 +14,7 @@ use git_iris::{ config::Config, git::GitRepo, }; -use rig::tool::Tool; +use rig::tool::portable::PortableTool; use std::env; use std::fs; use std::sync::{Mutex, MutexGuard, OnceLock}; diff --git a/tests/agent_tools_security_tests.rs b/tests/agent_tools_security_tests.rs new file mode 100644 index 0000000..fed5ee8 --- /dev/null +++ b/tests/agent_tools_security_tests.rs @@ -0,0 +1,131 @@ +use git_iris::agents::tools::common::{current_repo_execution_trusted, current_repo_root}; +use git_iris::agents::tools::docs::{DocType, ProjectDocs, ProjectDocsArgs}; +use git_iris::agents::tools::static_analysis::{ + StaticAnalysis, StaticAnalysisArgs, StaticAnalyzer, +}; +use git_iris::agents::tools::{with_active_repo_root, with_repo_execution_context}; +use rig::tool::portable::PortableTool; +use tempfile::TempDir; + +fn analysis_args() -> StaticAnalysisArgs { + StaticAnalysisArgs { + analyzer: StaticAnalyzer::Auto, + timeout_secs: 1, + max_output_chars: 512, + } +} + +#[tokio::test] +async fn remote_execution_context_blocks_project_code() -> anyhow::Result<()> { + let repo = TempDir::new()?; + std::fs::write(repo.path().join("Cargo.toml"), "[package]\nname='remote'\n")?; + let result = with_repo_execution_context(repo.path(), false, async { + StaticAnalysis.call(analysis_args()).await + }) + .await; + assert!( + result + .expect_err("Remote code must not execute") + .to_string() + .contains("untrusted") + ); + Ok(()) +} + +#[tokio::test] +async fn local_execution_context_retains_static_analysis() -> anyhow::Result<()> { + let repo = TempDir::new()?; + let result = with_repo_execution_context(repo.path(), true, async { + StaticAnalysis.call(analysis_args()).await + }) + .await?; + assert!(result.contains("No matching project markers")); + Ok(()) +} + +#[tokio::test] +async fn concurrent_repository_contexts_keep_trust_isolated() -> anyhow::Result<()> { + let remote = TempDir::new()?; + let local = TempDir::new()?; + let (remote_result, local_result) = tokio::join!( + with_repo_execution_context(remote.path(), false, async { + with_active_repo_root(remote.path(), async { + tokio::task::yield_now().await; + assert_eq!(current_repo_root()?, remote.path()); + assert!(!current_repo_execution_trusted()); + Ok::<_, anyhow::Error>(()) + }) + .await + }), + with_repo_execution_context(local.path(), true, async { + tokio::task::yield_now().await; + assert_eq!(current_repo_root()?, local.path()); + assert!(current_repo_execution_trusted()); + Ok::<_, anyhow::Error>(()) + }), + ); + remote_result?; + local_result?; + Ok(()) +} + +#[cfg(unix)] +#[tokio::test] +async fn project_docs_do_not_follow_external_symlinks() -> anyhow::Result<()> { + let repo = TempDir::new()?; + let external = TempDir::new()?; + let secret = "EXTERNAL_DOCUMENT_SENTINEL"; + std::fs::write(external.path().join("private.txt"), secret)?; + for filename in ["README.md", "AGENTS.md"] { + std::os::unix::fs::symlink( + external.path().join("private.txt"), + repo.path().join(filename), + )?; + } + for doc_type in [ + DocType::Readme, + DocType::Agents, + DocType::Context, + DocType::All, + ] { + let result = with_active_repo_root(repo.path(), async { + ProjectDocs + .call(ProjectDocsArgs { + doc_type, + max_chars: 20_000, + }) + .await + }) + .await; + let output = match result { + Ok(output) => output, + Err(error) => error.to_string(), + }; + assert!(!output.contains(secret)); + } + Ok(()) +} + +#[cfg(unix)] +#[tokio::test] +async fn project_docs_follow_internal_instruction_symlinks() -> anyhow::Result<()> { + let repo = TempDir::new()?; + std::fs::write( + repo.path().join("CLAUDE.md"), + "# Instructions\nTrusted local instructions.", + )?; + std::os::unix::fs::symlink("CLAUDE.md", repo.path().join("AGENTS.md"))?; + for doc_type in [DocType::Agents, DocType::Context, DocType::All] { + let output = with_active_repo_root(repo.path(), async { + ProjectDocs + .call(ProjectDocsArgs { + doc_type, + max_chars: 20_000, + }) + .await + }) + .await?; + assert!(output.contains("Trusted local instructions.")); + } + Ok(()) +} diff --git a/tests/config_tests.rs b/tests/config_tests.rs index a382407..1bd45fb 100644 --- a/tests/config_tests.rs +++ b/tests/config_tests.rs @@ -242,6 +242,7 @@ fn test_project_config_with_provider_only_serializes_set_fields() { api_key: String::new(), model: "claude-opus-4-6".to_string(), fast_model: None, + subagent_model: None, token_limit: None, additional_params: HashMap::new(), }, @@ -376,6 +377,7 @@ fn test_provider_config_skip_serialization() { api_key: String::new(), model: String::new(), fast_model: None, + subagent_model: None, token_limit: None, additional_params: HashMap::new(), }; @@ -414,6 +416,7 @@ fn test_provider_config_serializes_set_values() { api_key: String::new(), // Still empty, should skip model: "gpt-5.4".to_string(), fast_model: Some("gpt-5.4-mini".to_string()), + subagent_model: None, token_limit: Some(4096), additional_params: params, }; diff --git a/tests/git_hooks_tests.rs b/tests/git_hooks_tests.rs index 0015a70..910b4c5 100644 --- a/tests/git_hooks_tests.rs +++ b/tests/git_hooks_tests.rs @@ -161,3 +161,67 @@ fn test_verify_and_commit_no_hooks() -> Result<()> { Ok(()) } + +fn write_executable_hook(path: &std::path::Path, body: &str) -> Result<()> { + use std::os::unix::fs::PermissionsExt; + std::fs::create_dir_all(path.parent().expect("Hook path has a parent"))?; + std::fs::write(path, format!("#!/bin/sh\n{body}\n"))?; + std::fs::set_permissions(path, std::fs::Permissions::from_mode(0o755))?; + Ok(()) +} + +#[test] +fn configured_relative_hooks_path_is_respected() -> Result<()> { + let (temp_dir, git_repo) = setup_git_repo(); + let repo = Repository::open(temp_dir.path())?; + repo.config()?.set_str("core.hooksPath", ".custom hooks")?; + write_executable_hook(&temp_dir.path().join(".custom hooks/pre-commit"), "exit 23")?; + assert!(git_repo.execute_hook("pre-commit").is_err()); + Ok(()) +} + +#[test] +fn configured_absolute_hooks_path_is_respected() -> Result<()> { + let (temp_dir, git_repo) = setup_git_repo(); + let hooks_dir = tempfile::TempDir::new()?; + let repo = Repository::open(temp_dir.path())?; + repo.config()?.set_str( + "core.hooksPath", + hooks_dir.path().to_str().expect("UTF-8 temp path"), + )?; + write_executable_hook(&hooks_dir.path().join("pre-commit"), "exit 23")?; + assert!(git_repo.execute_hook("pre-commit").is_err()); + Ok(()) +} + +#[test] +fn linked_worktree_uses_shared_hooks_with_worktree_environment() -> Result<()> { + let (temp_dir, _) = setup_git_repo(); + let repo = Repository::open(temp_dir.path())?; + let checkout_parent = tempfile::TempDir::new()?; + let checkout = checkout_parent.path().join("checkout"); + repo.worktree("hook-test", &checkout, None)?; + write_executable_hook( + &repo.path().join("hooks/pre-commit"), + "test \"$(git rev-parse --show-toplevel)\" = \"$PWD\" || exit 24\nprintf 'hook ran' > hook-marker", + )?; + let linked_repo = git_iris::git::GitRepo::new(&checkout)?; + linked_repo.execute_hook("pre-commit")?; + assert_eq!( + std::fs::read_to_string(checkout.join("hook-marker"))?, + "hook ran" + ); + assert!(!temp_dir.path().join("hook-marker").exists()); + Ok(()) +} + +#[test] +fn non_executable_hooks_are_ignored() -> Result<()> { + use std::os::unix::fs::PermissionsExt; + let (temp_dir, git_repo) = setup_git_repo(); + let hook = temp_dir.path().join(".git/hooks/pre-commit"); + std::fs::write(&hook, "#!/bin/sh\nexit 23\n")?; + std::fs::set_permissions(hook, std::fs::Permissions::from_mode(0o644))?; + git_repo.execute_hook("pre-commit")?; + Ok(()) +} diff --git a/tests/project_docs_tests.rs b/tests/project_docs_tests.rs index 642616c..b931506 100644 --- a/tests/project_docs_tests.rs +++ b/tests/project_docs_tests.rs @@ -2,7 +2,7 @@ use git_iris::agents::tools::docs::{DocType, ProjectDocsArgs}; use git_iris::agents::tools::{ProjectDocs, with_active_repo_root}; -use rig::tool::Tool; +use rig::tool::portable::PortableTool; use std::fs; use tempfile::TempDir; diff --git a/tests/service_tests.rs b/tests/service_tests.rs index edfb8f0..69f028f 100644 --- a/tests/service_tests.rs +++ b/tests/service_tests.rs @@ -38,3 +38,101 @@ async fn test_perform_commit() -> Result<()> { Ok(()) } + +#[test] +fn initial_commit_supports_context_staging_and_statistics() -> Result<()> { + let temp_dir = TempDir::new()?; + let repo = git2::Repository::init(temp_dir.path())?; + repo.set_head("refs/heads/new-project")?; + repo.config()?.set_str("user.name", "First Author")?; + repo.config()?.set_str("user.email", "first@example.com")?; + let git_repo = Arc::new(GitRepo::new(temp_dir.path())?); + let path = std::path::Path::new("first.txt"); + std::fs::write(temp_dir.path().join(path), "first\nsecond\n")?; + git_repo.stage_file(path)?; + + let context = git_repo.get_git_info(&git_iris::config::Config::default())?; + assert_eq!(context.branch, "new-project"); + assert!(context.recent_commits.is_empty()); + assert_eq!(context.staged_files.len(), 1); + + git_repo.unstage_file(path)?; + assert!(repo.index()?.is_empty()); + assert!(temp_dir.path().join(path).is_file()); + git_repo.stage_file(path)?; + git_repo.unstage_all()?; + assert!(repo.index()?.is_empty()); + assert!(temp_dir.path().join(path).is_file()); + git_repo.stage_file(path)?; + + let service = GitCommitService::new(git_repo, false, false); + let result = service.perform_commit("Initial project")?; + let commit = repo.head()?.peel_to_commit()?; + assert_eq!(commit.parent_count(), 0); + assert_eq!(commit.message()?, "Initial project"); + assert_eq!(result.files_changed, 1); + assert_eq!(result.insertions, 2); + assert_eq!(result.deletions, 0); + assert_eq!( + result.new_files, + vec![("first.txt".into(), git2::FileMode::Blob)] + ); + Ok(()) +} + +#[test] +fn amend_preserves_author_and_updates_committer_and_statistics() -> Result<()> { + let (temp_dir, git_repo) = setup_test_repo()?; + let repo = git2::Repository::open(temp_dir.path())?; + let original = repo.head()?.peel_to_commit()?; + let original_author = git2::Signature::new( + "Original Author", + "original@example.com", + &git2::Time::new(1_000_000, 60), + )?; + original.amend(Some("HEAD"), Some(&original_author), None, None, None, None)?; + repo.config()?.set_str("user.name", "Current Committer")?; + repo.config()? + .set_str("user.email", "current@example.com")?; + std::fs::write(temp_dir.path().join("src/main.rs"), "fn main() {}\n")?; + git_repo.stage_file(std::path::Path::new("src/main.rs"))?; + + let service = GitCommitService::new(git_repo, false, false); + let result = service.perform_amend("Amended project")?; + let amended = repo.head()?.peel_to_commit()?; + assert_eq!(amended.author().name()?, "Original Author"); + assert_eq!(amended.author().email()?, "original@example.com"); + assert_eq!(amended.author().when(), original_author.when()); + assert_eq!(amended.committer().name()?, "Current Committer"); + assert_eq!(amended.parent_id(0)?, original.parent_id(0)?); + assert_eq!(result.files_changed, 1); + assert_eq!(result.insertions, 1); + assert_eq!( + result.new_files, + vec![("src/main.rs".into(), git2::FileMode::Blob)] + ); + Ok(()) +} + +#[test] +fn commit_reports_insertions_and_deletions_from_committed_tree() -> Result<()> { + let (temp_dir, git_repo) = setup_test_repo()?; + std::fs::write(temp_dir.path().join("README.md"), "replacement\nextra\n")?; + git_repo.stage_file(std::path::Path::new("README.md"))?; + let service = GitCommitService::new(git_repo, false, false); + let result = service.perform_commit("Replace readme")?; + assert_eq!(result.files_changed, 1); + assert_eq!(result.insertions, 2); + assert_eq!(result.deletions, 1); + assert!(result.new_files.is_empty()); + Ok(()) +} + +#[test] +fn detached_head_is_identified_for_pr_detection() -> Result<()> { + let (temp_dir, git_repo) = setup_test_repo()?; + let repo = git2::Repository::open(temp_dir.path())?; + repo.set_head_detached(repo.head()?.peel_to_commit()?.id())?; + assert_eq!(git_repo.get_current_branch()?, "HEAD detached"); + Ok(()) +} diff --git a/tests/test_utils.rs b/tests/test_utils.rs index 79f10e3..7bb05cb 100644 --- a/tests/test_utils.rs +++ b/tests/test_utils.rs @@ -66,7 +66,7 @@ fn ensure_primary_branch(repo: &Repository, target_branch: &str) { let current_branch = repo .head() .ok() - .and_then(|head| head.shorthand().map(std::string::ToString::to_string)) + .and_then(|head| head.shorthand().ok().map(std::string::ToString::to_string)) .unwrap_or_default(); if current_branch == target_branch { return;