From 5b7df1a1062c3be7a821d64e55f49e89d92d980d Mon Sep 17 00:00:00 2001 From: Stefanie Jane Date: Sun, 6 Sep 2026 11:01:53 -0700 Subject: [PATCH 1/7] build(docs): refresh tooling and repair diagram rendering Standardize docs on one frozen pnpm dependency graph and update the release actions. Bundle Mermaid correctly and redraw diagrams after navigation and theme changes so published architecture pages render. Read generated release notes as data when building the workflow summary. Frozen install, docs build, dependency audit, browser navigation and workflow lint checks pass, with independent source verification. Co-Authored-By: Nova (GPT-6 Astra) --- .github/workflows/cicd.yml | 59 +- .github/workflows/release.yml | 70 +- docs/.vitepress/theme/index.ts | 23 +- docs/package-lock.json | 3646 -------------------------------- docs/package.json | 8 +- docs/pnpm-lock.yaml | 1583 ++++++-------- docs/pnpm-workspace.yaml | 2 + justfile | 10 +- 8 files changed, 778 insertions(+), 4623 deletions(-) delete mode 100644 docs/package-lock.json create mode 100644 docs/pnpm-workspace.yaml 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/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/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/justfile b/justfile index f00cd3a..c5a16e0 100644 --- a/justfile +++ b/justfile @@ -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 ────────────────────────────────────────────────────── From 82a1dd087ba60cbfa987dda24fe24c02e39ada90 Mon Sep 17 00:00:00 2001 From: Stefanie Jane Date: Sun, 6 Sep 2026 11:17:06 -0700 Subject: [PATCH 2/7] feat(providers): modernize agent runtime and add hosted model routes Upgrade Rust dependencies and migrate to Rig's shared agent runtime. Route Astra through Responses, preserve hosted reasoning during tool calls, and add OpenRouter and Fireworks with separate worker models. Use Opus 5 high and Astra medium for primary analysis, reserving fast models for status text. Preserve explicit provider configuration. Keep repository trust attached to delegated tool execution. Remote analysis cannot execute project linters, documentation stays inside the repository, and targeted file reads use bounded memory. Wire fixtures cover provider requests and reasoning replay without paid API calls. Co-Authored-By: Nova (GPT-6) --- Cargo.lock | 7083 ++++++++++++++----- Cargo.toml | 47 +- src/agents/debug_tool.rs | 27 +- src/agents/iris.rs | 237 +- src/agents/iris_workflow_tests.rs | 38 + src/agents/provider.rs | 512 +- src/agents/provider/tests/mod.rs | 288 + src/agents/provider/tests/wire_tests.rs | 259 + src/agents/setup.rs | 22 +- src/agents/status_messages.rs | 54 +- src/agents/tools/code_search.rs | 21 +- src/agents/tools/common.rs | 22 +- src/agents/tools/content_update.rs | 57 +- src/agents/tools/docs.rs | 36 +- src/agents/tools/file_read.rs | 112 +- src/agents/tools/git.rs | 131 +- src/agents/tools/mod.rs | 5 +- src/agents/tools/parallel_analyze.rs | 264 +- src/agents/tools/repo_map.rs | 21 +- src/agents/tools/static_analysis.rs | 25 +- src/agents/tools/tests/file_read_tests.rs | 78 + src/agents/tools/tests/git_blame_tests.rs | 2 +- src/agents/tools/tests/git_show_tests.rs | 2 +- src/agents/tools/tests/mod.rs | 1 + src/agents/tools/workspace.rs | 21 +- src/cli.rs | 14 + src/commands.rs | 52 +- src/commands_tests.rs | 32 + src/config.rs | 6 + src/config/tests/project_config_tests.rs | 21 + src/git/files.rs | 4 +- src/git/repository.rs | 11 +- src/providers.rs | 64 +- src/studio/state/mod.rs | 2 +- src/studio/tests/mod.rs | 1 + src/studio/tests/provider_settings_tests.rs | 16 + tests/agent_tests.rs | 2 +- tests/agent_tools_security_tests.rs | 131 + tests/config_tests.rs | 3 + tests/project_docs_tests.rs | 2 +- tests/test_utils.rs | 2 +- 41 files changed, 6856 insertions(+), 2872 deletions(-) create mode 100644 src/agents/iris_workflow_tests.rs create mode 100644 src/agents/provider/tests/mod.rs create mode 100644 src/agents/provider/tests/wire_tests.rs create mode 100644 src/agents/tools/tests/file_read_tests.rs create mode 100644 src/commands_tests.rs create mode 100644 src/studio/tests/provider_settings_tests.rs create mode 100644 tests/agent_tools_security_tests.rs 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/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..67a2edd --- /dev/null +++ b/src/agents/iris_workflow_tests.rs @@ -0,0 +1,38 @@ +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(); + config.default_provider = provider.name().to_string(); + 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..9132b7f --- /dev/null +++ b/src/agents/provider/tests/mod.rs @@ -0,0 +1,288 @@ +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 subagent_model = match cli.command.expect("command") { + crate::cli::Commands::Config { subagent_model, .. } + | crate::cli::Commands::ProjectConfig { subagent_model, .. } => subagent_model, + _ => 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..7f43db7 --- /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..b47bf23 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 { @@ -95,171 +74,33 @@ impl SubagentRunner { api_key: Option<&str>, 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()), }, } } @@ -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..1526d01 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, @@ -1200,6 +1210,7 @@ pub async fn handle_command( common, api_key, fast_model, + subagent_model, token_limit, param, subagent_timeout, @@ -1209,6 +1220,7 @@ pub async fn handle_command( api_key, common.model.clone(), fast_model, + subagent_model, token_limit, param, subagent_timeout, @@ -1289,6 +1301,7 @@ pub async fn handle_command( Commands::ProjectConfig { common, fast_model, + subagent_model, token_limit, param, subagent_timeout, @@ -1298,6 +1311,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..1b33e7c 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, @@ -129,6 +130,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()) { @@ -217,6 +225,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 +254,7 @@ pub fn handle_config_command( common, model, fast_model, + subagent_model, token_limit, param, api_key, @@ -314,6 +324,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 +374,7 @@ pub fn handle_project_config_command( common, model, fast_model, + subagent_model, token_limit, param, &mut changes_made, @@ -389,6 +401,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 +427,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 +452,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 +753,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 +1100,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/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..355dfca 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(); @@ -266,7 +270,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; } @@ -1022,7 +1029,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/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/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/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/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/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; From 041cc0f540149b1265dfffcb53f94e6643319f71 Mon Sep 17 00:00:00 2001 From: Stefanie Jane Date: Sun, 6 Sep 2026 11:17:18 -0700 Subject: [PATCH 3/7] fix(git): support initial commits and preserve native metadata Handle unborn branches during commit, history, and index operations. Compute statistics from committed trees and retain the original author when amending. Resolve executable hooks through Git so linked worktrees and core.hooksPath use the correct repository despite inherited Git variables. Regression tests exercise empty repositories, amend attribution, committed statistics, custom hooks, and linked worktrees. Co-Authored-By: Nova (GPT-6) --- src/git/commit.rs | 92 ++++++++++++++----------------------- src/git/repository.rs | 79 ++++++++++++++++++++++++++------ tests/git_hooks_tests.rs | 64 ++++++++++++++++++++++++++ tests/service_tests.rs | 98 ++++++++++++++++++++++++++++++++++++++++ 4 files changed, 259 insertions(+), 74 deletions(-) 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/repository.rs b/src/git/repository.rs index 355dfca..5668c21 100644 --- a/src/git/repository.rs +++ b/src/git/repository.rs @@ -250,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) } @@ -321,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) } @@ -756,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) @@ -921,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( @@ -977,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(()) } 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/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(()) +} From 027319a5c882f13b2fcf70ae04a75bc560a880b4 Mon Sep 17 00:00:00 2001 From: Stefanie Jane Date: Sun, 6 Sep 2026 11:17:29 -0700 Subject: [PATCH 4/7] fix(studio): keep file history attached to the selected file Mouse and keyboard selection now share the file-loading path. Clear previous history on selection and ignore results for other files. Propagate repository, Git, and worker failures so a failed history load does not leave its spinner running indefinitely. Reducer tests cover stale results and failure handling. Independent source tracing verifies the shared mouse and keyboard path. Co-Authored-By: Nova (GPT-6) --- src/studio/app/mod.rs | 50 ++++++++++++++------------- src/studio/events.rs | 3 ++ src/studio/handlers/explore.rs | 5 ++- src/studio/handlers/mod.rs | 1 + src/studio/reducer/git.rs | 19 +++++++++-- src/studio/reducer/mod.rs | 4 +++ src/studio/tests/reducer_tests.rs | 57 +++++++++++++++++++++++++++++++ 7 files changed, 111 insertions(+), 28 deletions(-) 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/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(), From f49fe1cbb93a1b71c1aec5f72b6ce6ba8de5b4a6 Mon Sep 17 00:00:00 2001 From: Stefanie Jane Date: Sun, 6 Sep 2026 11:17:45 -0700 Subject: [PATCH 5/7] fix(github): anchor published reviews to the analyzed PR head Capture the PR target before generation and resolve review ranges to immutable commits. Reject unpublished changes, mismatched selected heads, subsequent pushes, and base-branch retargeting before publishing. Allow ordinary base-tip advancement without discarding the analysis. Submit the captured head as commit_id so a final-check race cannot label old findings as a review of newer code. Local HTTP fixtures verify the posted commit and rejection before POST when the head moves. Co-Authored-By: Nova (GPT-6) --- src/cli.rs | 25 ++- src/github.rs | 52 +++++- src/github/review_target.rs | 69 ++++++++ src/github/tests/mod.rs | 2 + src/github/tests/review_target_tests.rs | 217 ++++++++++++++++++++++++ 5 files changed, 349 insertions(+), 16 deletions(-) create mode 100644 src/github/review_target.rs create mode 100644 src/github/tests/review_target_tests.rs diff --git a/src/cli.rs b/src/cli.rs index 1526d01..43927d2 100644 --- a/src/cli.rs +++ b/src/cli.rs @@ -916,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 @@ -930,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, @@ -943,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?; } } 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(()) +} From aa44139b06728855fd04ef25671a5503f2bcea30 Mon Sep 17 00:00:00 2001 From: Stefanie Jane Date: Sun, 6 Sep 2026 11:18:20 -0700 Subject: [PATCH 6/7] docs: align provider setup and architecture with the current runtime Document the five providers, role-specific model defaults, subagent configuration, and reasoning controls. Distinguish context metadata from output budgets and explain pinned GitHub review publication. Update agent and extension examples for Rig 0.42 and refresh the action model defaults. The production documentation build passes, including bundled Mermaid rendering after navigation and theme changes. Co-Authored-By: Nova (GPT-6) --- CLAUDE.md | 96 +++++----- action.yml | 10 +- docs/architecture/agent.md | 145 +++++--------- docs/architecture/index.md | 12 +- docs/architecture/tools.md | 2 +- docs/configuration/index.md | 14 +- docs/configuration/models.md | 261 ++++++-------------------- docs/configuration/project-config.md | 17 +- docs/configuration/providers.md | 98 ++++++---- docs/extending/contributing.md | 17 +- docs/extending/tools.md | 54 +++--- docs/getting-started/configuration.md | 33 ++-- docs/getting-started/index.md | 10 +- docs/reference/cli.md | 7 +- docs/reference/github-action.md | 2 +- docs/reference/troubleshooting.md | 2 +- docs/user-guide/index.md | 2 +- docs/user-guide/reviews.md | 58 +++--- 18 files changed, 345 insertions(+), 495 deletions(-) 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/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/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/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. From db00a8debfd42f42978a00cd9102b43c9df28c38 Mon Sep 17 00:00:00 2001 From: Stefanie Jane Date: Sun, 6 Sep 2026 15:45:50 -0700 Subject: [PATCH 7/7] fix(ci): match local lint checks to the warnings-as-errors gate The shared CI workflow rejects warnings while the local recipe allowed them, hiding six failures in the provider migration. Resolve the warning sources and make just lint enforce the same policy before publication. Extract provider initialization without changing its behavior and avoid unnecessary ownership in request helpers and fixtures. The exact lint gate and focused regression tests pass without warning suppressions. Co-Authored-By: Nova (GPT-6) --- justfile | 2 +- src/agents/iris_workflow_tests.rs | 6 ++-- src/agents/provider/tests/mod.rs | 9 +++--- src/agents/provider/tests/wire_tests.rs | 12 ++++---- src/agents/tools/parallel_analyze.rs | 6 ++-- src/commands.rs | 37 ++++++++++++++----------- 6 files changed, 40 insertions(+), 32 deletions(-) diff --git a/justfile b/justfile index c5a16e0..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: diff --git a/src/agents/iris_workflow_tests.rs b/src/agents/iris_workflow_tests.rs index 67a2edd..181b747 100644 --- a/src/agents/iris_workflow_tests.rs +++ b/src/agents/iris_workflow_tests.rs @@ -20,8 +20,10 @@ fn delegated_analysis_defaults_to_main_model_and_honors_override() { #[test] fn all_providers_build_complete_agents_and_select_their_own_defaults() { for provider in Provider::ALL { - let mut config = Config::default(); - config.default_provider = provider.name().to_string(); + let mut config = Config { + default_provider: provider.name().to_string(), + ..Config::default() + }; config .providers .get_mut(provider.name()) diff --git a/src/agents/provider/tests/mod.rs b/src/agents/provider/tests/mod.rs index 9132b7f..b8e1e15 100644 --- a/src/agents/provider/tests/mod.rs +++ b/src/agents/provider/tests/mod.rs @@ -278,10 +278,11 @@ fn cli_accepts_subagent_models_for_both_config_scopes() { "openai/gpt-5.6-sol", ]) .expect("configuration args"); - let subagent_model = match cli.command.expect("command") { - crate::cli::Commands::Config { subagent_model, .. } - | crate::cli::Commands::ProjectConfig { subagent_model, .. } => subagent_model, - _ => panic!("expected config"), + 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 index 7f43db7..111c415 100644 --- a/src/agents/provider/tests/wire_tests.rs +++ b/src/agents/provider/tests/wire_tests.rs @@ -75,22 +75,22 @@ async fn mock_server( (format!("http://{address}"), task) } -fn responses_result(output: Value) -> Value { +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 { +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!([ + 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":[]}]}]), + &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( @@ -152,8 +152,8 @@ async fn routed_chat_preserves_provider_reasoning_and_tool_results() { 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"), + chat_result(&message, "tool_calls"), + chat_result(&json!({"role":"assistant","content":"done"}), "stop"), ]) .await; let builder = agent_builder_at( diff --git a/src/agents/tools/parallel_analyze.rs b/src/agents/tools/parallel_analyze.rs index b47bf23..db54966 100644 --- a/src/agents/tools/parallel_analyze.rs +++ b/src/agents/tools/parallel_analyze.rs @@ -72,7 +72,7 @@ impl SubagentRunner { provider: &str, model: &str, api_key: Option<&str>, - additional_params: HashMap, + additional_params: &HashMap, ) -> Result { 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."); @@ -81,7 +81,7 @@ impl SubagentRunner { provider, model, 4096, - Some(&additional_params), + Some(additional_params), CompletionProfile::Subagent, ); let agent = DynAgent(crate::attach_core_tools!(builder).build()); @@ -176,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!( diff --git a/src/commands.rs b/src/commands.rs index 1b33e7c..6717f21 100644 --- a/src/commands.rs +++ b/src/commands.rs @@ -90,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 @@ -214,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)] ///