diff --git a/.github/workflows/lint-ci.yml b/.github/workflows/lint-ci.yml index e1a4f1591f..3531b8a140 100644 --- a/.github/workflows/lint-ci.yml +++ b/.github/workflows/lint-ci.yml @@ -43,9 +43,9 @@ jobs: runs-on: ubuntu-latest timeout-minutes: 5 steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1 - - uses: actions/setup-python@v5 + - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0 with: python-version: '3.12' cache: 'pip' diff --git a/.github/workflows/mlx-ci.yml b/.github/workflows/mlx-ci.yml index 8103643fce..9dae97c30c 100644 --- a/.github/workflows/mlx-ci.yml +++ b/.github/workflows/mlx-ci.yml @@ -51,9 +51,9 @@ jobs: runs-on: ubuntu-latest timeout-minutes: 10 steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1 - - uses: actions/setup-python@v5 + - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0 with: python-version: '3.12' cache: 'pip' diff --git a/.github/workflows/security-audit.yml b/.github/workflows/security-audit.yml index 745c99e05b..39ba77f96f 100644 --- a/.github/workflows/security-audit.yml +++ b/.github/workflows/security-audit.yml @@ -103,26 +103,26 @@ jobs: egress-policy: audit disable-sudo: true - - uses: actions/checkout@v4 + - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1 with: # Full history so TruffleHog can diff base..head; without # this it sees only the latest commit and reports nothing. fetch-depth: 0 - - uses: actions/setup-python@v5 + - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0 with: python-version: '3.12' cache: 'pip' - - uses: actions/setup-node@v4 + - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 with: node-version: '22' cache: 'npm' cache-dependency-path: studio/frontend/package-lock.json - - uses: dtolnay/rust-toolchain@stable + - uses: dtolnay/rust-toolchain@29eef336d9b2848a0b548edc03f92a220660cdb8 # stable @ 2026-05-07 - - uses: swatinem/rust-cache@v2 + - uses: swatinem/rust-cache@23869a5bd66c73db3c0ac40331f3206eb23791dc # v2.9.1 with: workspaces: studio/src-tauri -> target @@ -130,11 +130,13 @@ jobs: # cargo-audit pulls advisories from the RustSec advisory-db on # first run and caches them under ~/.cargo/advisory-db. Pin # --locked so the version we install matches Cargo.lock - # determinism. + # determinism. cargo-audit 0.22 supports the CVSS 4.0 schema + # used in 2026 advisories (e.g. RUSTSEC-2026-0073); 0.21 + # crashes with a TOML parse error on that file. # npm audit is bundled with the node toolchain, no install. run: | python -m pip install --upgrade pip 'pip-audit>=2.7' - cargo install --locked --version '^0.21' cargo-audit + cargo install --locked --version '^0.22' cargo-audit # ───────────────────────────────────────────────────────────── # Python: pip-audit @@ -300,9 +302,10 @@ jobs: continue-on-error: true run: | set +e - curl -fsSL -o /tmp/osv-scanner.tar.gz \ - https://github.com/google/osv-scanner/releases/download/v2.0.2/osv-scanner_linux_amd64.tar.gz - tar -xzf /tmp/osv-scanner.tar.gz -C /tmp osv-scanner + # OSV-Scanner ships a raw binary (no tarball) in v2.x. + curl -fsSL -o /tmp/osv-scanner \ + https://github.com/google/osv-scanner/releases/download/v2.0.2/osv-scanner_linux_amd64 + chmod +x /tmp/osv-scanner /tmp/osv-scanner --version /tmp/osv-scanner scan source \ --lockfile=studio/frontend/package-lock.json \ @@ -439,7 +442,11 @@ jobs: path: ./ base: ${{ github.event.pull_request.base.sha || '' }} head: ${{ github.event.pull_request.head.sha || github.sha }} - extra_args: --only-verified --no-update + # The action passes --no-update internally; passing it here + # too triggers `flag 'no-update' cannot be repeated`. Stick + # with --only-verified so we only flag tokens the source + # provider confirmed are live (no probabilistic findings). + extra_args: --only-verified # ───────────────────────────────────────────────────────────── # CycloneDX SBOM. Lets downstream consumers audit what's @@ -456,20 +463,23 @@ jobs: mkdir -p sbom # Per-requirements-file SBOM (the audit-reqs/ files are the # filtered, git+-stripped views built earlier in this job). + # cyclonedx-py 4.x uses `--sv` for spec version and `-o` for + # the output file; the older `--schema-version`/`--outfile` + # spellings are not accepted. for f in audit-reqs/*.txt; do base=$(basename "$f" .txt) if grep -qE '^[^#[:space:]]' "$f"; then cyclonedx-py requirements "$f" \ - --schema-version 1.6 \ - --output-format JSON \ - --outfile "sbom/sbom-$base.json" 2>&1 | tail -5 || true + --sv 1.6 \ + --of JSON \ + -o "sbom/sbom-$base.json" 2>&1 | tail -5 || true fi done # Project-level SBOM from pyproject.toml. cyclonedx-py environment \ - --schema-version 1.6 \ - --output-format JSON \ - --outfile sbom/sbom-environment.json 2>&1 | tail -5 || true + --sv 1.6 \ + --of JSON \ + -o sbom/sbom-environment.json 2>&1 | tail -5 || true ls -la sbom/ { echo "## CycloneDX SBOM" @@ -582,7 +592,7 @@ jobs: echo '```' } >> "$GITHUB_STEP_SUMMARY" - - uses: actions/upload-artifact@v4 + - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 if: always() with: name: advisory-audit-logs @@ -662,9 +672,9 @@ jobs: egress-policy: audit disable-sudo: true - - uses: actions/checkout@v4 + - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1 - - uses: actions/setup-python@v5 + - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0 with: python-version: '3.12' cache: 'pip' @@ -776,7 +786,7 @@ jobs: echo '```' } >> "$GITHUB_STEP_SUMMARY" - - uses: actions/upload-artifact@v4 + - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 if: always() with: name: scan-packages-log-${{ matrix.shard.id }} diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml index fc864d1736..1a4cf841d0 100644 --- a/.github/workflows/stale.yml +++ b/.github/workflows/stale.yml @@ -11,7 +11,7 @@ jobs: issues: write steps: - - uses: actions/stale@v10 + - uses: actions/stale@b5d41d4e1d5dceea10e7104786b73624c18a190f # v10.2.0 with: # The message to post on stale issues. # This message will ping the issue author. diff --git a/.github/workflows/studio-backend-ci.yml b/.github/workflows/studio-backend-ci.yml index a1f0cfb9c4..ef561187a4 100644 --- a/.github/workflows/studio-backend-ci.yml +++ b/.github/workflows/studio-backend-ci.yml @@ -52,9 +52,9 @@ jobs: matrix: python: ['3.10', '3.11', '3.12', '3.13'] steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1 - - uses: actions/setup-python@v5 + - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0 with: python-version: '${{ matrix.python }}' cache: 'pip' @@ -105,9 +105,9 @@ jobs: runs-on: ubuntu-latest timeout-minutes: 15 steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1 - - uses: actions/setup-python@v5 + - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0 with: python-version: '3.12' cache: 'pip' @@ -117,7 +117,7 @@ jobs: # compile a tiny TS harness against the frontend chat sources. # - tests/python/* spawn fresh `uv venv`s to verify the no-torch # install path; they self-skip when uv is missing. - - uses: actions/setup-node@v4 + - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 with: node-version: '22' diff --git a/.github/workflows/studio-frontend-ci.yml b/.github/workflows/studio-frontend-ci.yml index 4f209ec7d8..d4d0bddecb 100644 --- a/.github/workflows/studio-frontend-ci.yml +++ b/.github/workflows/studio-frontend-ci.yml @@ -35,7 +35,7 @@ jobs: run: working-directory: studio/frontend steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1 # FIXME: drop this step once @assistant-ui/* and assistant-stream # leave 0.x -- on 1.x, caret ranges are conventional. Until then, @@ -52,7 +52,7 @@ jobs: fi echo "All assistant-ui packages are pinned exactly." - - uses: actions/setup-node@v4 + - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 with: node-version: '22' cache: 'npm' diff --git a/.github/workflows/studio-inference-smoke.yml b/.github/workflows/studio-inference-smoke.yml index 36d581b2b3..40ed10df7b 100644 --- a/.github/workflows/studio-inference-smoke.yml +++ b/.github/workflows/studio-inference-smoke.yml @@ -66,7 +66,7 @@ jobs: STUDIO_PORT: '18888' HF_HOME: ${{ github.workspace }}/hf-cache steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1 - name: Linux deps for llama.cpp prebuilt run: | @@ -74,13 +74,13 @@ jobs: sudo apt-get install -y --no-install-recommends \ libcurl4-openssl-dev libssl-dev jq - - uses: actions/setup-node@v4 + - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 with: node-version: '22' cache: 'npm' cache-dependency-path: studio/frontend/package-lock.json - - uses: actions/setup-python@v5 + - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0 with: python-version: '3.12' cache: 'pip' @@ -294,7 +294,7 @@ jobs: STUDIO_PORT: '18889' HF_HOME: ${{ github.workspace }}/hf-cache steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1 - name: Linux deps for llama.cpp prebuilt run: | @@ -302,13 +302,13 @@ jobs: sudo apt-get install -y --no-install-recommends \ libcurl4-openssl-dev libssl-dev jq - - uses: actions/setup-node@v4 + - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 with: node-version: '22' cache: 'npm' cache-dependency-path: studio/frontend/package-lock.json - - uses: actions/setup-python@v5 + - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0 with: python-version: '3.12' cache: 'pip' @@ -597,7 +597,7 @@ jobs: STUDIO_PORT: '18890' HF_HOME: ${{ github.workspace }}/hf-cache steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1 - name: Linux deps for llama.cpp prebuilt run: | @@ -605,13 +605,13 @@ jobs: sudo apt-get install -y --no-install-recommends \ libcurl4-openssl-dev libssl-dev jq - - uses: actions/setup-node@v4 + - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 with: node-version: '22' cache: 'npm' cache-dependency-path: studio/frontend/package-lock.json - - uses: actions/setup-python@v5 + - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0 with: python-version: '3.12' cache: 'pip' diff --git a/.github/workflows/studio-tauri-smoke.yml b/.github/workflows/studio-tauri-smoke.yml index c862cb24d5..64f1d15ad2 100644 --- a/.github/workflows/studio-tauri-smoke.yml +++ b/.github/workflows/studio-tauri-smoke.yml @@ -36,7 +36,7 @@ jobs: runs-on: ubuntu-22.04 timeout-minutes: 25 steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1 - name: Linux native deps for Tauri / WebKit2GTK run: | @@ -45,15 +45,15 @@ jobs: libwebkit2gtk-4.1-dev libayatana-appindicator3-dev \ librsvg2-dev libxdo-dev libssl-dev patchelf - - uses: actions/setup-node@v4 + - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 with: node-version: '24' cache: 'npm' cache-dependency-path: studio/frontend/package-lock.json - - uses: dtolnay/rust-toolchain@stable + - uses: dtolnay/rust-toolchain@29eef336d9b2848a0b548edc03f92a220660cdb8 # stable @ 2026-05-07 - - uses: swatinem/rust-cache@v2 + - uses: swatinem/rust-cache@23869a5bd66c73db3c0ac40331f3206eb23791dc # v2.9.1 with: workspaces: studio/src-tauri -> target @@ -98,7 +98,7 @@ jobs: file "$BIN" du -h "$BIN" - - uses: actions/upload-artifact@v4 + - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 if: failure() with: name: tauri-debug-build diff --git a/.github/workflows/studio-ui-smoke.yml b/.github/workflows/studio-ui-smoke.yml index c3f96784c1..8ad878afa1 100644 --- a/.github/workflows/studio-ui-smoke.yml +++ b/.github/workflows/studio-ui-smoke.yml @@ -48,7 +48,7 @@ jobs: STUDIO_PORT: '18892' HF_HOME: ${{ github.workspace }}/hf-cache steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1 - name: Linux deps run: | @@ -56,13 +56,13 @@ jobs: sudo apt-get install -y --no-install-recommends \ libcurl4-openssl-dev libssl-dev jq - - uses: actions/setup-node@v4 + - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 with: node-version: '22' cache: 'npm' cache-dependency-path: studio/frontend/package-lock.json - - uses: actions/setup-python@v5 + - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0 with: python-version: '3.12' cache: 'pip' diff --git a/.github/workflows/studio-update-smoke.yml b/.github/workflows/studio-update-smoke.yml index 4edf157cdb..453c9e6947 100644 --- a/.github/workflows/studio-update-smoke.yml +++ b/.github/workflows/studio-update-smoke.yml @@ -39,7 +39,7 @@ jobs: runs-on: ubuntu-latest timeout-minutes: 15 steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1 - name: Linux deps for llama.cpp prebuilt run: | @@ -47,13 +47,13 @@ jobs: sudo apt-get install -y --no-install-recommends \ libcurl4-openssl-dev libssl-dev jq - - uses: actions/setup-node@v4 + - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 with: node-version: '22' cache: 'npm' cache-dependency-path: studio/frontend/package-lock.json - - uses: actions/setup-python@v5 + - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0 with: python-version: '3.12' cache: 'pip' diff --git a/.github/workflows/wheel-smoke.yml b/.github/workflows/wheel-smoke.yml index cec32e8cdf..30ef7948a0 100644 --- a/.github/workflows/wheel-smoke.yml +++ b/.github/workflows/wheel-smoke.yml @@ -41,15 +41,15 @@ jobs: runs-on: ubuntu-latest timeout-minutes: 15 steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1 - - uses: actions/setup-node@v4 + - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 with: node-version: '22' cache: 'npm' cache-dependency-path: studio/frontend/package-lock.json - - uses: actions/setup-python@v5 + - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0 with: python-version: '3.12'