diff --git a/.github/workflows/ai-eval.yml b/.github/workflows/ai-eval.yml
index 9abb5372cd..8096295140 100644
--- a/.github/workflows/ai-eval.yml
+++ b/.github/workflows/ai-eval.yml
@@ -67,7 +67,7 @@ jobs:
runs-on: ${{ inputs.runner || 'ubuntu-latest' }}
timeout-minutes: 10
steps:
- - uses: actions/checkout@v5
+ - uses: actions/checkout@v7
- uses: actions/setup-go@v6
with:
go-version-file: go.mod
@@ -89,7 +89,7 @@ jobs:
runs-on: ${{ inputs.runner || 'ubuntu-latest' }}
timeout-minutes: 15
steps:
- - uses: actions/checkout@v5
+ - uses: actions/checkout@v7
- uses: actions/setup-go@v6
with:
go-version-file: go.mod
@@ -100,7 +100,7 @@ jobs:
run: make ai-eval-full
- name: Upload JUnit report
if: always()
- uses: actions/upload-artifact@v6
+ uses: actions/upload-artifact@v7.0.1
with:
name: ai-eval-junit
path: ai-eval.junit.xml
@@ -115,7 +115,7 @@ jobs:
JUDGE_PROVIDER: ${{ secrets.JUDGE_PROVIDER }}
JUDGE_API_KEY: ${{ secrets.JUDGE_API_KEY }}
steps:
- - uses: actions/checkout@v5
+ - uses: actions/checkout@v7
- uses: actions/setup-go@v6
with:
go-version-file: go.mod
@@ -134,7 +134,7 @@ jobs:
run: make ai-eval-judged
- name: Upload judged JUnit report
if: steps.gate.outputs.judge == 'enabled'
- uses: actions/upload-artifact@v6
+ uses: actions/upload-artifact@v7.0.1
with:
name: ai-eval-judged-junit
path: ai-eval.judged.junit.xml
diff --git a/.github/workflows/backup-restore-drill.yml b/.github/workflows/backup-restore-drill.yml
index 1967b15e3e..05a44bdb11 100644
--- a/.github/workflows/backup-restore-drill.yml
+++ b/.github/workflows/backup-restore-drill.yml
@@ -74,7 +74,7 @@ jobs:
TARGET_DB: teslasync_drill_restored
TARGET_GUARD: restore-drill-${{ github.run_id }}-${{ github.run_attempt }}
steps:
- - uses: actions/checkout@fbc6f3992d24b796d5a048ff273f7fcc4a7b6c09 # v5
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
- uses: actions/setup-go@924ae3a1cded613372ab5595356fb5720e22ba16 # v6
with:
@@ -417,7 +417,7 @@ jobs:
- name: Upload drill evidence
if: always()
- uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6
+ uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: restore-drill-${{ github.run_id }}-${{ github.run_attempt }}
path: |
diff --git a/.github/workflows/capacity-test.yml b/.github/workflows/capacity-test.yml
index 052e46e80b..da5a5ec9ea 100644
--- a/.github/workflows/capacity-test.yml
+++ b/.github/workflows/capacity-test.yml
@@ -61,7 +61,7 @@ jobs:
# Below safety.max_duration (30m) with room for stack boot/teardown.
timeout-minutes: 40
steps:
- - uses: actions/checkout@fbc6f3992d24b796d5a048ff273f7fcc4a7b6c09 # v5
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
- uses: actions/setup-go@924ae3a1cded613372ab5595356fb5720e22ba16 # v6
with:
@@ -126,7 +126,7 @@ jobs:
- name: Install k6
if: ${{ inputs.profile != 'reconnect-storm' }}
- uses: grafana/setup-k6-action@db07bd9765aac508ef18982e52ab937fe633a065 # v1.2.1
+ uses: grafana/setup-k6-action@43b9fc21641a76002687994433dd586f56e791b1 # v1.2.2
with:
k6-version: v1.8.1
@@ -266,7 +266,7 @@ jobs:
- name: Upload k6 summaries
if: always()
- uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6
+ uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: capacity-${{ inputs.profile }}-${{ github.run_number }}
path: |
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index be3ae426e5..c98d2d945a 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -41,7 +41,7 @@ jobs:
# feature mirror, the SLO rules/dashboards).
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v5
+ - uses: actions/checkout@v7
- uses: actions/setup-node@v5
with:
node-version: "26"
@@ -73,7 +73,7 @@ jobs:
matrix:
check: [lint, architecture]
steps:
- - uses: actions/checkout@v5
+ - uses: actions/checkout@v7
- uses: actions/setup-go@v6
with:
go-version-file: go.mod
@@ -120,7 +120,7 @@ jobs:
--health-timeout 5s
--health-retries 10
steps:
- - uses: actions/checkout@v5
+ - uses: actions/checkout@v7
- uses: actions/setup-go@v6
with:
go-version-file: go.mod
@@ -140,7 +140,7 @@ jobs:
go test -race -coverprofile=shard/coverage.out -covermode=atomic -json "${packages[@]}" | tee shard/test-events.json
- name: Upload raw shard evidence
if: always()
- uses: actions/upload-artifact@v6
+ uses: actions/upload-artifact@v7.0.1
with:
name: backend-test-${{ matrix.shard }}
path: shard/
@@ -155,7 +155,7 @@ jobs:
env:
CGO_ENABLED: 1
steps:
- - uses: actions/checkout@v5
+ - uses: actions/checkout@v7
- uses: actions/setup-go@v6
with:
go-version-file: go.mod
@@ -182,7 +182,7 @@ jobs:
- name: Upload coverage
if: always()
- uses: actions/upload-artifact@v6
+ uses: actions/upload-artifact@v7.0.1
with:
name: backend-coverage
if-no-files-found: error
@@ -217,7 +217,7 @@ jobs:
--health-timeout 5s
--health-retries 10
steps:
- - uses: actions/checkout@v5
+ - uses: actions/checkout@v7
- uses: actions/setup-go@v6
with:
go-version-file: go.mod
@@ -267,7 +267,7 @@ jobs:
matrix:
binary: [teslasync, notification-worker, export-worker]
steps:
- - uses: actions/checkout@v5
+ - uses: actions/checkout@v7
- uses: actions/setup-go@v6
with:
go-version-file: go.mod
@@ -299,7 +299,7 @@ jobs:
run:
working-directory: web
steps:
- - uses: actions/checkout@v5
+ - uses: actions/checkout@v7
- uses: actions/setup-node@v5
with:
node-version: "26"
@@ -337,7 +337,7 @@ jobs:
run:
working-directory: web
steps:
- - uses: actions/checkout@v5
+ - uses: actions/checkout@v7
- uses: actions/setup-node@v5
with:
node-version: "26"
@@ -353,7 +353,7 @@ jobs:
--reporter=default --reporter=blob
- name: Upload raw shard evidence
if: always()
- uses: actions/upload-artifact@v6
+ uses: actions/upload-artifact@v7.0.1
with:
name: frontend-test-${{ matrix.shard }}
path: web/.vitest-reports/
@@ -370,7 +370,7 @@ jobs:
run:
working-directory: web
steps:
- - uses: actions/checkout@v5
+ - uses: actions/checkout@v7
- uses: actions/setup-node@v5
with:
@@ -405,7 +405,7 @@ jobs:
- name: Upload coverage
if: always()
- uses: actions/upload-artifact@v6
+ uses: actions/upload-artifact@v7.0.1
with:
name: frontend-coverage
path: web/coverage/
@@ -447,7 +447,7 @@ jobs:
- image: web
file: Dockerfile.web
steps:
- - uses: actions/checkout@v5
+ - uses: actions/checkout@v7
- uses: docker/setup-buildx-action@v4
- name: Build ${{ matrix.image }}
diff --git a/.github/workflows/cleanup.yml b/.github/workflows/cleanup.yml
index 1cfaa5d459..ada7e63d8c 100644
--- a/.github/workflows/cleanup.yml
+++ b/.github/workflows/cleanup.yml
@@ -35,7 +35,7 @@ jobs:
contents: read
packages: write
steps:
- - uses: actions/checkout@fbc6f3992d24b796d5a048ff273f7fcc4a7b6c09 # v5
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
- uses: actions/setup-node@v5
with:
node-version: '22'
@@ -49,7 +49,7 @@ jobs:
run: node scripts/package-retention.mjs
- name: Upload retention report
if: always()
- uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6
+ uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: package-retention-report
path: |
diff --git a/.github/workflows/copilot-setup-steps.yml b/.github/workflows/copilot-setup-steps.yml
index 547f8b50f0..b7e63eb17c 100644
--- a/.github/workflows/copilot-setup-steps.yml
+++ b/.github/workflows/copilot-setup-steps.yml
@@ -32,7 +32,7 @@ jobs:
steps:
- name: Checkout code
- uses: actions/checkout@v5
+ uses: actions/checkout@v7
# ── Go toolchain ──────────────────────────────────────────
- name: Set up Go
diff --git a/.github/workflows/deploy-rollback.yml b/.github/workflows/deploy-rollback.yml
index 73ad008073..300595d022 100644
--- a/.github/workflows/deploy-rollback.yml
+++ b/.github/workflows/deploy-rollback.yml
@@ -96,7 +96,7 @@ jobs:
verdict: ${{ steps.evaluate.outputs.verdict }}
automation_allowed: ${{ steps.evaluate.outputs.automation_allowed }}
steps:
- - uses: actions/checkout@fbc6f3992d24b796d5a048ff273f7fcc4a7b6c09 # v5
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
- uses: actions/setup-go@924ae3a1cded613372ab5595356fb5720e22ba16 # v6
with:
@@ -155,7 +155,7 @@ jobs:
- name: Upload decision
if: always()
- uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6
+ uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: rollback-decision-${{ github.run_number }}
path: decision.json
@@ -189,7 +189,7 @@ jobs:
# a production rollback safe.
environment: ${{ inputs.environment }}
steps:
- - uses: actions/checkout@fbc6f3992d24b796d5a048ff273f7fcc4a7b6c09 # v5
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
- uses: actions/setup-go@924ae3a1cded613372ab5595356fb5720e22ba16 # v6
with:
diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml
index 56fcdbbc29..39aec44fa9 100644
--- a/.github/workflows/docs.yml
+++ b/.github/workflows/docs.yml
@@ -32,7 +32,7 @@ jobs:
name: github-pages
url: ${{ steps.deployment.outputs.page_url }}
steps:
- - uses: actions/checkout@v5
+ - uses: actions/checkout@v7
with:
fetch-depth: 0
diff --git a/.github/workflows/fleet-proto-drift.yml b/.github/workflows/fleet-proto-drift.yml
index bdd2475b2a..abf3c68f23 100644
--- a/.github/workflows/fleet-proto-drift.yml
+++ b/.github/workflows/fleet-proto-drift.yml
@@ -17,7 +17,7 @@ jobs:
check:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v5
+ - uses: actions/checkout@v7
- name: Test the drift detector
run: python3 -m unittest discover -s scripts -p 'test_check_fleet_proto_drift.py'
- name: Fetch the current upstream schema at a fixed revision
diff --git a/.github/workflows/frontend-quality.yml b/.github/workflows/frontend-quality.yml
index 14c620d8aa..9579ee64c5 100644
--- a/.github/workflows/frontend-quality.yml
+++ b/.github/workflows/frontend-quality.yml
@@ -40,7 +40,7 @@ jobs:
name: Route registry and test discovery
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v5
+ - uses: actions/checkout@v7
- uses: actions/setup-node@v5
with:
node-version: '26'
@@ -73,7 +73,7 @@ jobs:
name: Shared hermetic browser build
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v5
+ - uses: actions/checkout@v7
- uses: actions/setup-node@v5
with:
node-version: '26'
@@ -83,7 +83,7 @@ jobs:
- run: npm run e2e:build
env:
E2E_MOCKS: '1'
- - uses: actions/upload-artifact@v6
+ - uses: actions/upload-artifact@v7.0.1
with:
name: e2e-app
path: web/e2e/.app-dist/
@@ -106,7 +106,7 @@ jobs:
- {name: accessibility, suite: a11y, shard: '1/1'}
- {name: performance, suite: performance, shard: '1/1'}
steps:
- - uses: actions/checkout@v5
+ - uses: actions/checkout@v7
- uses: actions/setup-node@v5
with:
node-version: '26'
@@ -125,7 +125,7 @@ jobs:
run: npm run e2e:${{ matrix.suite }} -- --shard=${{ matrix.shard }}
- name: Upload Chromium failure evidence
if: always()
- uses: actions/upload-artifact@v6
+ uses: actions/upload-artifact@v7.0.1
with:
name: chromium-${{ matrix.name }}-report
if-no-files-found: ignore
@@ -158,7 +158,7 @@ jobs:
matrix:
browser: [firefox, webkit]
steps:
- - uses: actions/checkout@v5
+ - uses: actions/checkout@v7
- uses: actions/setup-node@v5
with:
node-version: '26'
@@ -177,7 +177,7 @@ jobs:
run: npm run e2e -- --project=${{ matrix.browser }}-smoke
- name: Upload engine failure evidence
if: always()
- uses: actions/upload-artifact@v6
+ uses: actions/upload-artifact@v7.0.1
with:
name: ${{ matrix.browser }}-smoke-report
if-no-files-found: ignore
@@ -195,7 +195,7 @@ jobs:
matrix:
shard: [1, 2, 3, 4]
steps:
- - uses: actions/checkout@v5
+ - uses: actions/checkout@v7
- uses: actions/setup-node@v5
with:
node-version: '26'
@@ -214,7 +214,7 @@ jobs:
run: npm run e2e:visual -- --shard=${{ matrix.shard }}/4 --workers=2
- name: Upload visual diffs
if: always()
- uses: actions/upload-artifact@v6
+ uses: actions/upload-artifact@v7.0.1
with:
name: visual-regression-report-${{ matrix.shard }}
if-no-files-found: ignore
@@ -244,7 +244,7 @@ jobs:
runs-on: ubuntu-latest
needs: contract
steps:
- - uses: actions/checkout@v5
+ - uses: actions/checkout@v7
- uses: actions/setup-node@v5
with:
node-version: '26'
@@ -283,7 +283,7 @@ jobs:
rm -rf test-results playwright-report blob-report
- name: Upload sanitized deployed smoke status
if: always()
- uses: actions/upload-artifact@v6
+ uses: actions/upload-artifact@v7.0.1
with:
name: authenticated-production-smoke-status
if-no-files-found: error
diff --git a/.github/workflows/helm-ci.yml b/.github/workflows/helm-ci.yml
index 97932eb4ce..1b1a4e7740 100644
--- a/.github/workflows/helm-ci.yml
+++ b/.github/workflows/helm-ci.yml
@@ -33,7 +33,7 @@ jobs:
name: Lint Chart
runs-on: ${{ inputs.runner || 'ubuntu-latest' }}
steps:
- - uses: actions/checkout@v5
+ - uses: actions/checkout@v7
with:
fetch-depth: 0
@@ -69,7 +69,7 @@ jobs:
name: Template Validation
runs-on: ${{ inputs.runner || 'ubuntu-latest' }}
steps:
- - uses: actions/checkout@v5
+ - uses: actions/checkout@v7
- uses: azure/setup-helm@v5
with:
@@ -148,7 +148,7 @@ jobs:
name: Schema Validation
runs-on: ${{ inputs.runner || 'ubuntu-latest' }}
steps:
- - uses: actions/checkout@v5
+ - uses: actions/checkout@v7
- uses: azure/setup-helm@v5
with:
@@ -171,7 +171,7 @@ jobs:
runs-on: ${{ inputs.runner || 'ubuntu-latest' }}
if: github.event_name == 'pull_request'
steps:
- - uses: actions/checkout@v5
+ - uses: actions/checkout@v7
with:
fetch-depth: 0
diff --git a/.github/workflows/load-test.yml b/.github/workflows/load-test.yml
index 3840b0780f..3ce4dac92d 100644
--- a/.github/workflows/load-test.yml
+++ b/.github/workflows/load-test.yml
@@ -48,7 +48,7 @@ jobs:
runs-on: ${{ github.event.inputs.runner || 'ubuntu-latest' }}
timeout-minutes: 30
steps:
- - uses: actions/checkout@v5
+ - uses: actions/checkout@v7
- name: Boot ephemeral TeslaSync stack
env:
@@ -91,7 +91,7 @@ jobs:
- name: Upload k6 summary
if: always()
- uses: actions/upload-artifact@v6
+ uses: actions/upload-artifact@v7.0.1
with:
name: k6-summary-${{ github.run_number }}
path: tests/k6/summary.json
@@ -104,7 +104,7 @@ jobs:
- name: Upload API logs
if: failure()
- uses: actions/upload-artifact@v6
+ uses: actions/upload-artifact@v7.0.1
with:
name: api-logs-${{ github.run_number }}
path: api.log
diff --git a/.github/workflows/ops-gate.yml b/.github/workflows/ops-gate.yml
index ab697d8d3c..895cc88dac 100644
--- a/.github/workflows/ops-gate.yml
+++ b/.github/workflows/ops-gate.yml
@@ -37,7 +37,7 @@ jobs:
runs-on: ubuntu-latest
timeout-minutes: 15
steps:
- - uses: actions/checkout@fbc6f3992d24b796d5a048ff273f7fcc4a7b6c09 # v5
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
- uses: actions/setup-go@924ae3a1cded613372ab5595356fb5720e22ba16 # v6
with:
@@ -91,7 +91,7 @@ jobs:
PGPASSWORD: fixture
DB_URL: postgres://fixture:fixture@localhost:5432/teslasync_fixture?sslmode=disable
steps:
- - uses: actions/checkout@fbc6f3992d24b796d5a048ff273f7fcc4a7b6c09 # v5
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
- uses: actions/setup-go@924ae3a1cded613372ab5595356fb5720e22ba16 # v6
with:
@@ -153,7 +153,7 @@ jobs:
runs-on: ubuntu-latest
timeout-minutes: 10
steps:
- - uses: actions/checkout@fbc6f3992d24b796d5a048ff273f7fcc4a7b6c09 # v5
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
- uses: actions/setup-go@924ae3a1cded613372ab5595356fb5720e22ba16 # v6
with:
diff --git a/.github/workflows/perf.yml b/.github/workflows/perf.yml
index e4c7b68427..0d3c4cb36a 100644
--- a/.github/workflows/perf.yml
+++ b/.github/workflows/perf.yml
@@ -35,7 +35,7 @@ jobs:
run:
working-directory: web
steps:
- - uses: actions/checkout@v5
+ - uses: actions/checkout@v7
- uses: actions/setup-node@v5
with:
diff --git a/.github/workflows/post-deploy-smoke.yml b/.github/workflows/post-deploy-smoke.yml
index 70dd7f5b26..a0d71ae76f 100644
--- a/.github/workflows/post-deploy-smoke.yml
+++ b/.github/workflows/post-deploy-smoke.yml
@@ -76,7 +76,7 @@ jobs:
outputs:
passed: ${{ steps.run.outputs.passed }}
steps:
- - uses: actions/checkout@fbc6f3992d24b796d5a048ff273f7fcc4a7b6c09 # v5
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
- uses: actions/setup-go@924ae3a1cded613372ab5595356fb5720e22ba16 # v6
with:
@@ -115,7 +115,7 @@ jobs:
- name: Upload smoke report
if: always()
- uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6
+ uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: smoke-report-${{ github.run_number }}
path: smoke-report.json
diff --git a/.github/workflows/proto-gen-check.yml b/.github/workflows/proto-gen-check.yml
index 8be9d14d5a..cdc8b876c2 100644
--- a/.github/workflows/proto-gen-check.yml
+++ b/.github/workflows/proto-gen-check.yml
@@ -20,7 +20,7 @@ jobs:
name: Verify generated Tesla protomodel matches proto
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v5
+ - uses: actions/checkout@v7
- uses: actions/setup-go@v6
with:
go-version-file: go.mod
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index 6a633b69a7..5664d3a214 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -63,7 +63,7 @@ jobs:
fi
done
- - uses: actions/checkout@fbc6f3992d24b796d5a048ff273f7fcc4a7b6c09 # v5
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
fetch-depth: 0
@@ -187,7 +187,7 @@ jobs:
- image: fleet-telemetry
file: Dockerfile.fleet-telemetry
steps:
- - uses: actions/checkout@fbc6f3992d24b796d5a048ff273f7fcc4a7b6c09 # v5
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
- uses: docker/setup-buildx-action@f87e5991a6d7451dcb8d9637bfbc97413f497069 # v4
- name: Prepare the promotion directory
@@ -314,7 +314,7 @@ jobs:
timeout: 30m
- name: Upload vulnerability scan
- uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6
+ uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: vuln-${{ matrix.image }}-${{ needs.version.outputs.version }}
path: vuln-${{ matrix.image }}.json
@@ -324,7 +324,7 @@ jobs:
# version, so legs cannot collide and a publish job cannot pick up
# another image's bytes.
- name: Upload the promotable image archive
- uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6
+ uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: image-${{ matrix.image }}-${{ needs.version.outputs.version }}
path: |
@@ -347,7 +347,7 @@ jobs:
summary: ${{ steps.aggregate.outputs.summary }}
blocking: ${{ steps.aggregate.outputs.blocking }}
steps:
- - uses: actions/checkout@fbc6f3992d24b796d5a048ff273f7fcc4a7b6c09 # v5
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
- name: Download vulnerability scans
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
@@ -405,7 +405,7 @@ jobs:
- name: Upload vulnerability status
if: always()
- uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6
+ uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: vulnerability-status-${{ needs.version.outputs.version }}
path: vulnerability-status.md
@@ -427,7 +427,7 @@ jobs:
# No `file` / `build-args` here: this stage does NOT build.
image: [api, web, notification-worker, export-worker, automation-worker, fleet-telemetry]
steps:
- - uses: actions/checkout@fbc6f3992d24b796d5a048ff273f7fcc4a7b6c09 # v5
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
- uses: actions/setup-go@924ae3a1cded613372ab5595356fb5720e22ba16 # v6
with:
@@ -606,7 +606,7 @@ jobs:
echo "✅ Attested CycloneDX SBOM to ${PRIMARY}@${DIGEST}"
- name: Upload SBOM artifacts
- uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6
+ uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: sbom-${{ matrix.image }}-${{ needs.version.outputs.version }}
path: |
@@ -625,7 +625,7 @@ jobs:
# It is bound to the DIGEST, not the tag, so re-tagging cannot
# transplant provenance onto different bytes.
- name: Attest build provenance
- uses: actions/attest-build-provenance@977bb373ede98d70efdf65b84cb5f73e068dcc2a # v3
+ uses: actions/attest-build-provenance@4d101475d8b20a2381f78447822ac1eab6504dd8 # v4.2.2
with:
subject-name: ghcr.io/${{ github.repository }}-${{ matrix.image }}
subject-digest: ${{ steps.promote.outputs.digest }}
@@ -639,7 +639,7 @@ jobs:
contents: read
packages: write
steps:
- - uses: actions/checkout@fbc6f3992d24b796d5a048ff273f7fcc4a7b6c09 # v5
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
- name: Install Helm
uses: azure/setup-helm@9bc31f4ebc9c6b171d7bfbaa5d006ae7abdb4310 # v5.0.1
@@ -678,7 +678,7 @@ jobs:
contents: write
packages: read
steps:
- - uses: actions/checkout@fbc6f3992d24b796d5a048ff273f7fcc4a7b6c09 # v5
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
fetch-depth: 0
diff --git a/.github/workflows/security.yml b/.github/workflows/security.yml
index 4729031bf5..788c811e53 100644
--- a/.github/workflows/security.yml
+++ b/.github/workflows/security.yml
@@ -52,7 +52,7 @@ jobs:
name: Security Scan
runs-on: ${{ inputs.runner || 'ubuntu-latest' }}
steps:
- - uses: actions/checkout@fbc6f3992d24b796d5a048ff273f7fcc4a7b6c09 # v5
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
- name: Install CodeQL runtime prerequisites
run: |
@@ -218,12 +218,12 @@ jobs:
node-version: "26"
- name: Initialize CodeQL
- uses: github/codeql-action/init@b96794f015dfd88f77b49b1c93e0fa7110f94c63 # v4.38.0
+ uses: github/codeql-action/init@2892aa5e19bbd11bc0cff5427e3b750a04d9e3c2 # v4.38.2
with:
languages: go,javascript-typescript
- name: CodeQL autobuild
- uses: github/codeql-action/autobuild@b96794f015dfd88f77b49b1c93e0fa7110f94c63 # v4.38.0
+ uses: github/codeql-action/autobuild@2892aa5e19bbd11bc0cff5427e3b750a04d9e3c2 # v4.38.2
- name: CodeQL analysis
- uses: github/codeql-action/analyze@b96794f015dfd88f77b49b1c93e0fa7110f94c63 # v4.38.0
+ uses: github/codeql-action/analyze@2892aa5e19bbd11bc0cff5427e3b750a04d9e3c2 # v4.38.2
diff --git a/.github/workflows/si-canonical-gate.yml b/.github/workflows/si-canonical-gate.yml
index b2fed3bbac..c6ccc582c2 100644
--- a/.github/workflows/si-canonical-gate.yml
+++ b/.github/workflows/si-canonical-gate.yml
@@ -40,7 +40,7 @@ jobs:
name: Block new legacy unit-suffixed identifiers
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v5
+ - uses: actions/checkout@v7
with:
# Fetch enough history to compute the diff against the merge
# base. depth: 0 is wasteful but reliable on shallow clones.
diff --git a/Dockerfile.web b/Dockerfile.web
index 81de76bf0d..6b933892a1 100644
--- a/Dockerfile.web
+++ b/Dockerfile.web
@@ -70,7 +70,7 @@ RUN npm run build
RUN find dist -name '*.map' -delete
# Serve with a supported, digest-pinned nginx runtime.
-FROM nginx:1.31.4-alpine3.24@sha256:db35bfc6b2951e7f8a72db5db120288c127ffaeeb4a6d4b95a26fead017d5913
+FROM nginx:1.31.5-alpine3.24@sha256:72ba65eb42c10344912a84ff42408db7d34f2feb642204570ab8fc5ffd29f1d3
RUN apk upgrade --no-cache
diff --git a/go.mod b/go.mod
index 226d42107e..fd5ce60d06 100644
--- a/go.mod
+++ b/go.mod
@@ -7,15 +7,15 @@ require (
github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.6.4
github.com/SherClockHolmes/webpush-go v1.4.0
github.com/alicebob/miniredis/v2 v2.38.0
- github.com/aws/aws-sdk-go-v2 v1.41.5
- github.com/aws/aws-sdk-go-v2/config v1.32.13
- github.com/aws/aws-sdk-go-v2/credentials v1.19.13
+ github.com/aws/aws-sdk-go-v2 v1.47.0
+ github.com/aws/aws-sdk-go-v2/config v1.33.5
+ github.com/aws/aws-sdk-go-v2/credentials v1.20.5
github.com/aws/aws-sdk-go-v2/service/s3 v1.98.0
github.com/caarlos0/env/v11 v11.4.1
github.com/eclipse/paho.mqtt.golang v1.5.1
github.com/exaring/otelpgx v0.10.0
github.com/go-chi/chi/v5 v5.3.0
- github.com/go-chi/cors v1.2.1
+ github.com/go-chi/cors v1.2.2
github.com/go-chi/httprate v0.16.0
github.com/golang-migrate/migrate/v4 v4.19.1
github.com/google/uuid v1.6.0
@@ -25,10 +25,10 @@ require (
github.com/pquerna/otp v1.5.0
github.com/prometheus/client_golang v1.24.1
github.com/prometheus/client_model v0.6.2
- github.com/prometheus/common v0.70.1
+ github.com/prometheus/common v0.71.0
github.com/redis/go-redis/v9 v9.18.0
github.com/robfig/cron/v3 v3.0.1
- github.com/rs/zerolog v1.32.0
+ github.com/rs/zerolog v1.35.1
github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e
github.com/sony/gobreaker v0.5.0
github.com/teslamotors/fleet-telemetry v0.9.5-0.20260924184623-3d366a3da23c
@@ -38,7 +38,7 @@ require (
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.45.0
go.opentelemetry.io/otel/sdk v1.45.0
go.opentelemetry.io/otel/trace v1.45.0
- golang.org/x/sync v0.22.0
+ golang.org/x/sync v0.23.0
golang.org/x/time v0.15.0
golang.org/x/tools v0.49.0
google.golang.org/api v0.294.0
@@ -61,20 +61,19 @@ require (
github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.55.0 // indirect
github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.55.0 // indirect
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.8 // indirect
- github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.21 // indirect
- github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.21 // indirect
- github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.21 // indirect
- github.com/aws/aws-sdk-go-v2/internal/ini v1.8.6 // indirect
- github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.22 // indirect
- github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.7 // indirect
+ github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.20.0 // indirect
+ github.com/aws/aws-sdk-go-v2/internal/configsources v1.5.3 // indirect
+ github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.8.3 // indirect
+ github.com/aws/aws-sdk-go-v2/internal/v4a v1.5.3 // indirect
+ github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.19 // indirect
github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.13 // indirect
- github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.21 // indirect
+ github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.14.3 // indirect
github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.21 // indirect
- github.com/aws/aws-sdk-go-v2/service/signin v1.0.9 // indirect
- github.com/aws/aws-sdk-go-v2/service/sso v1.30.14 // indirect
- github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.18 // indirect
- github.com/aws/aws-sdk-go-v2/service/sts v1.41.10 // indirect
- github.com/aws/smithy-go v1.24.2 // indirect
+ github.com/aws/aws-sdk-go-v2/service/signin v1.10.0 // indirect
+ github.com/aws/aws-sdk-go-v2/service/sso v1.38.0 // indirect
+ github.com/aws/aws-sdk-go-v2/service/ssooidc v1.43.0 // indirect
+ github.com/aws/aws-sdk-go-v2/service/sts v1.51.0 // indirect
+ github.com/aws/smithy-go v1.28.1 // indirect
github.com/beorn7/perks v1.0.1 // indirect
github.com/boombuler/barcode v1.0.1-0.20190219062509-6c824513bacc // indirect
github.com/cenkalti/backoff/v5 v5.0.3 // indirect
@@ -101,8 +100,8 @@ require (
github.com/klauspost/cpuid/v2 v2.2.10 // indirect
github.com/kylelemons/godebug v1.1.0 // indirect
github.com/lib/pq v1.10.9 // indirect
- github.com/mattn/go-colorable v0.1.13 // indirect
- github.com/mattn/go-isatty v0.0.19 // indirect
+ github.com/mattn/go-colorable v0.1.14 // indirect
+ github.com/mattn/go-isatty v0.0.20 // indirect
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.2 // indirect
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
diff --git a/go.sum b/go.sum
index 48d1b090c5..4694b08eea 100644
--- a/go.sum
+++ b/go.sum
@@ -46,48 +46,44 @@ github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERo
github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU=
github.com/SherClockHolmes/webpush-go v1.4.0 h1:ocnzNKWN23T9nvHi6IfyrQjkIc0oJWv1B1pULsf9i3s=
github.com/SherClockHolmes/webpush-go v1.4.0/go.mod h1:XSq8pKX11vNV8MJEMwjrlTkxhAj1zKfxmyhdV7Pd6UA=
-github.com/alicebob/miniredis/v2 v2.37.0 h1:RheObYW32G1aiJIj81XVt78ZHJpHonHLHW7OLIshq68=
-github.com/alicebob/miniredis/v2 v2.37.0/go.mod h1:TcL7YfarKPGDAthEtl5NBeHZfeUQj6OXMm/+iu5cLMM=
github.com/alicebob/miniredis/v2 v2.38.0 h1:nZAzCR+Lj+Vxk4ZXzm2NuKq2O33RXj1XxJ2e2uP9jiw=
github.com/alicebob/miniredis/v2 v2.38.0/go.mod h1:TcL7YfarKPGDAthEtl5NBeHZfeUQj6OXMm/+iu5cLMM=
-github.com/aws/aws-sdk-go-v2 v1.41.5 h1:dj5kopbwUsVUVFgO4Fi5BIT3t4WyqIDjGKCangnV/yY=
-github.com/aws/aws-sdk-go-v2 v1.41.5/go.mod h1:mwsPRE8ceUUpiTgF7QmQIJ7lgsKUPQOUl3o72QBrE1o=
+github.com/aws/aws-sdk-go-v2 v1.47.0 h1:0jsHallhJCeaU0Ko48c/3FK1ctOQ7NpzggxriJOQ8MQ=
+github.com/aws/aws-sdk-go-v2 v1.47.0/go.mod h1:bttEH6JqnUL8LepvDVfdrds/fZ5bCIxzpe3abyUrhDU=
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.8 h1:eBMB84YGghSocM7PsjmmPffTa+1FBUeNvGvFou6V/4o=
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.8/go.mod h1:lyw7GFp3qENLh7kwzf7iMzAxDn+NzjXEAGjKS2UOKqI=
-github.com/aws/aws-sdk-go-v2/config v1.32.13 h1:5KgbxMaS2coSWRrx9TX/QtWbqzgQkOdEa3sZPhBhCSg=
-github.com/aws/aws-sdk-go-v2/config v1.32.13/go.mod h1:8zz7wedqtCbw5e9Mi2doEwDyEgHcEE9YOJp6a8jdSMY=
-github.com/aws/aws-sdk-go-v2/credentials v1.19.13 h1:mA59E3fokBvyEGHKFdnpNNrvaR351cqiHgRg+JzOSRI=
-github.com/aws/aws-sdk-go-v2/credentials v1.19.13/go.mod h1:yoTXOQKea18nrM69wGF9jBdG4WocSZA1h38A+t/MAsk=
-github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.21 h1:NUS3K4BTDArQqNu2ih7yeDLaS3bmHD0YndtA6UP884g=
-github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.21/go.mod h1:YWNWJQNjKigKY1RHVJCuupeWDrrHjRqHm0N9rdrWzYI=
-github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.21 h1:Rgg6wvjjtX8bNHcvi9OnXWwcE0a2vGpbwmtICOsvcf4=
-github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.21/go.mod h1:A/kJFst/nm//cyqonihbdpQZwiUhhzpqTsdbhDdRF9c=
-github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.21 h1:PEgGVtPoB6NTpPrBgqSE5hE/o47Ij9qk/SEZFbUOe9A=
-github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.21/go.mod h1:p+hz+PRAYlY3zcpJhPwXlLC4C+kqn70WIHwnzAfs6ps=
-github.com/aws/aws-sdk-go-v2/internal/ini v1.8.6 h1:qYQ4pzQ2Oz6WpQ8T3HvGHnZydA72MnLuFK9tJwmrbHw=
-github.com/aws/aws-sdk-go-v2/internal/ini v1.8.6/go.mod h1:O3h0IK87yXci+kg6flUKzJnWeziQUKciKrLjcatSNcY=
-github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.22 h1:rWyie/PxDRIdhNf4DzRk0lvjVOqFJuNnO8WwaIRVxzQ=
-github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.22/go.mod h1:zd/JsJ4P7oGfUhXn1VyLqaRZwPmZwg44Jf2dS84Dm3Y=
-github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.7 h1:5EniKhLZe4xzL7a+fU3C2tfUN4nWIqlLesfrjkuPFTY=
-github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.7/go.mod h1:x0nZssQ3qZSnIcePWLvcoFisRXJzcTVvYpAAdYX8+GI=
+github.com/aws/aws-sdk-go-v2/config v1.33.5 h1:UA1dmokBFOLFoOyVBhO6HjM6edy0MIk5AZSkJVcksQw=
+github.com/aws/aws-sdk-go-v2/config v1.33.5/go.mod h1:Dop8axzz0xx38GExIYWXdeyc8QQ7Cr+nPsxpD/LYy4U=
+github.com/aws/aws-sdk-go-v2/credentials v1.20.5 h1:wklUVvHMc9xTQ3rcp49/ISpiMnhbCicJcA6n6S8m7J8=
+github.com/aws/aws-sdk-go-v2/credentials v1.20.5/go.mod h1:fyEdrn6ccLFOkoK84j5bQyGTxp9zPt5l2XMhxf4DVZs=
+github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.20.0 h1:AM4hHjww+PSFtt6E+UrBrPlZkWsePCLEt9AjkfQX+yM=
+github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.20.0/go.mod h1:3x/yXezeQjpOvBb4jEMxrS8SXvpdvJ5abv6l5c1gWM8=
+github.com/aws/aws-sdk-go-v2/internal/configsources v1.5.3 h1:Hp/VgjP0BysR3OgLlR057Vz2LcbbVnoWeJ+3qWiS/fY=
+github.com/aws/aws-sdk-go-v2/internal/configsources v1.5.3/go.mod h1:nwGV5qw7F1IZPgxCvA/ph8N2TAuz+BkRG/bXn808qMA=
+github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.8.3 h1:MUaM4f+kj1ZIBPZfUS8cxP1GKXXZtHJjAthy93AN7SM=
+github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.8.3/go.mod h1:6YmVmEVRI5ZZzRjCSsb9SryKH0hAlMRdgA7kG9aDvBU=
+github.com/aws/aws-sdk-go-v2/internal/v4a v1.5.3 h1:fuSCw4Z2qfRCztMPO3GXJNSiEp6Wee+WOLwrHHUMy9c=
+github.com/aws/aws-sdk-go-v2/internal/v4a v1.5.3/go.mod h1:6SxcHheD1pPR5+kWm1wGvjlL/YqUsh267sAfEmN4K7A=
+github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.19 h1:bAdDl/HkGCcGPoe25ToSHEw23VIxt6CT5fLcg111BKg=
+github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.19/go.mod h1:KaUzbLxv4CeSxh6ZCl9B4m7CuFenS8kUEaDs+f/DQr4=
github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.13 h1:JRaIgADQS/U6uXDqlPiefP32yXTda7Kqfx+LgspooZM=
github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.13/go.mod h1:CEuVn5WqOMilYl+tbccq8+N2ieCy0gVn3OtRb0vBNNM=
-github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.21 h1:c31//R3xgIJMSC8S6hEVq+38DcvUlgFY0FM6mSI5oto=
-github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.21/go.mod h1:r6+pf23ouCB718FUxaqzZdbpYFyDtehyZcmP5KL9FkA=
+github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.14.3 h1:bON1rJf67TSTDCKg816AAIE4xSTtoo9tl0XRkO72R+I=
+github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.14.3/go.mod h1:c5BBpjJcQXpfeq9iASyVKA3T6vX6B6LEXY4mL/gklDY=
github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.21 h1:ZlvrNcHSFFWURB8avufQq9gFsheUgjVD9536obIknfM=
github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.21/go.mod h1:cv3TNhVrssKR0O/xxLJVRfd2oazSnZnkUeTf6ctUwfQ=
github.com/aws/aws-sdk-go-v2/service/s3 v1.98.0 h1:foqo/ocQ7WqKwy3FojGtZQJo0FR4vto9qnz9VaumbCo=
github.com/aws/aws-sdk-go-v2/service/s3 v1.98.0/go.mod h1:uoA43SdFwacedBfSgfFSjjCvYe8aYBS7EnU5GZ/YKMM=
-github.com/aws/aws-sdk-go-v2/service/signin v1.0.9 h1:QKZH0S178gCmFEgst8hN0mCX1KxLgHBKKY/CLqwP8lg=
-github.com/aws/aws-sdk-go-v2/service/signin v1.0.9/go.mod h1:7yuQJoT+OoH8aqIxw9vwF+8KpvLZ8AWmvmUWHsGQZvI=
-github.com/aws/aws-sdk-go-v2/service/sso v1.30.14 h1:GcLE9ba5ehAQma6wlopUesYg/hbcOhFNWTjELkiWkh4=
-github.com/aws/aws-sdk-go-v2/service/sso v1.30.14/go.mod h1:WSvS1NLr7JaPunCXqpJnWk1Bjo7IxzZXrZi1QQCkuqM=
-github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.18 h1:mP49nTpfKtpXLt5SLn8Uv8z6W+03jYVoOSAl/c02nog=
-github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.18/go.mod h1:YO8TrYtFdl5w/4vmjL8zaBSsiNp3w0L1FfKVKenZT7w=
-github.com/aws/aws-sdk-go-v2/service/sts v1.41.10 h1:p8ogvvLugcR/zLBXTXrTkj0RYBUdErbMnAFFp12Lm/U=
-github.com/aws/aws-sdk-go-v2/service/sts v1.41.10/go.mod h1:60dv0eZJfeVXfbT1tFJinbHrDfSJ2GZl4Q//OSSNAVw=
-github.com/aws/smithy-go v1.24.2 h1:FzA3bu/nt/vDvmnkg+R8Xl46gmzEDam6mZ1hzmwXFng=
-github.com/aws/smithy-go v1.24.2/go.mod h1:YE2RhdIuDbA5E5bTdciG9KrW3+TiEONeUWCqxX9i1Fc=
+github.com/aws/aws-sdk-go-v2/service/signin v1.10.0 h1:ZD5qFpWcaOKdTuhBi431pIDkCgrMkMlMT6jlpSPoIRI=
+github.com/aws/aws-sdk-go-v2/service/signin v1.10.0/go.mod h1:8Nuuf+tR346PjJ3MvZPh9pekbLiLQFWJhzMXfwy7alA=
+github.com/aws/aws-sdk-go-v2/service/sso v1.38.0 h1:JGeeBcMlhg1xtOXYpeCaTQBZObtXMPQCUqBcmr65NRA=
+github.com/aws/aws-sdk-go-v2/service/sso v1.38.0/go.mod h1:XwteswG9EOMRFm73UT0t+MbTwyLxMrEXkU6e+v92Lzo=
+github.com/aws/aws-sdk-go-v2/service/ssooidc v1.43.0 h1:obhahQXDEdVEv8y5bTKXR30LVaxYe1kyYM0L7l2Iq+k=
+github.com/aws/aws-sdk-go-v2/service/ssooidc v1.43.0/go.mod h1:6twZZ/aXHNy1vXUO8koUbp++MYzMASkOgEBdkbJYmO0=
+github.com/aws/aws-sdk-go-v2/service/sts v1.51.0 h1:Zpnqa6XtrNzXZnwbdCqHOXpXhMsa01ql/pcRQ1sb4hk=
+github.com/aws/aws-sdk-go-v2/service/sts v1.51.0/go.mod h1:/8JRcdTt//hG0Q4BTmGbuOplT7ABe+5rdtqUHqXvYIM=
+github.com/aws/smithy-go v1.28.1 h1:R/nXH00c8qcfCzQVELtRw+eLQWtzv+VAIEFJ1/xxXlQ=
+github.com/aws/smithy-go v1.28.1/go.mod h1:YE2RhdIuDbA5E5bTdciG9KrW3+TiEONeUWCqxX9i1Fc=
github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
github.com/boombuler/barcode v1.0.1-0.20190219062509-6c824513bacc h1:biVzkmvwrH8WK8raXaxBx6fRVTlJILwEwQGL1I/ByEI=
@@ -108,7 +104,6 @@ github.com/containerd/errdefs v1.0.0 h1:tg5yIfIlQIrxYtu9ajqY42W3lpS19XqdxRQeEwYG
github.com/containerd/errdefs v1.0.0/go.mod h1:+YBYIdtsnF4Iw6nWZhJcqGSg/dwvV7tyJ/kCkyJ2k+M=
github.com/containerd/errdefs/pkg v0.3.0 h1:9IKJ06FvyNlexW690DXuQNx2KA2cUJXx151Xdx3ZPPE=
github.com/containerd/errdefs/pkg v0.3.0/go.mod h1:NJw6s9HwNuRhnjJhM7pylWwMyAkmCQvQ4GpJHEqRLVk=
-github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=
@@ -141,8 +136,8 @@ github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2
github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=
github.com/go-chi/chi/v5 v5.3.0 h1:halUjDxhshgXHMrao5bB8eNBXo/rnzwr8m5m36glehM=
github.com/go-chi/chi/v5 v5.3.0/go.mod h1:R+tYY2hNuVUUjxoPtqUdgBqevM9s9njzkTLutVsOCto=
-github.com/go-chi/cors v1.2.1 h1:xEC8UT3Rlp2QuWNEr4Fs/c2EAGVKBwy/1vHx3bppil4=
-github.com/go-chi/cors v1.2.1/go.mod h1:sSbTewc+6wYHBBCW7ytsFSn836hqM7JxpglAy2Vzc58=
+github.com/go-chi/cors v1.2.2 h1:Jmey33TE+b+rB7fT8MUy1u0I4L+NARQlK6LhzKPSyQE=
+github.com/go-chi/cors v1.2.2/go.mod h1:sSbTewc+6wYHBBCW7ytsFSn836hqM7JxpglAy2Vzc58=
github.com/go-chi/httprate v0.16.0 h1:8V5DH9j6pSK6UQoBsTpvMyFxycqaKEIToyPKzHJjUa8=
github.com/go-chi/httprate v0.16.0/go.mod h1:A8lo+qRhk+s9LiuP5saS7XCGDXRXMcrueq0NfIuCa/I=
github.com/go-jose/go-jose/v4 v4.1.4 h1:moDMcTHmvE6Groj34emNPLs/qtYXRVcd6S7NHbHz3kA=
@@ -152,7 +147,6 @@ github.com/go-logr/logr v1.4.4 h1:tG4xh9yMsRCAiodLVTxyrkzSZ9+o0L1Kg/+cPVcbP/8=
github.com/go-logr/logr v1.4.4/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
-github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
github.com/golang-jwt/jwt/v5 v5.2.1/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk=
@@ -208,11 +202,10 @@ github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0
github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw=
github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw=
github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
-github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
-github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
-github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
-github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA=
-github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
+github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE=
+github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8=
+github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
+github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
github.com/moby/docker-image-spec v1.3.1 h1:jMKff3w6PgbfSa69GfNg+zN/XLhfXJGnEx3Nl2EsFP0=
github.com/moby/docker-image-spec v1.3.1/go.mod h1:eKmb5VW8vQEh/BAr2yvVNvuiJuY6UIocYsFu/DxxRpo=
github.com/moby/term v0.5.0 h1:xt8Q1nalod/v7BqbG21f8mQPqH+xAaC9C3N3wfWbVP0=
@@ -239,16 +232,14 @@ github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINE
github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo=
github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
-github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=
-github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/pquerna/otp v1.5.0 h1:NMMR+WrmaqXU4EzdGJEE1aUUI0AMRzsp96fFFWNPwxs=
github.com/pquerna/otp v1.5.0/go.mod h1:dkJfzwRKNiegxyNb54X/3fLwhCynbMspSyWKnvi1AEg=
github.com/prometheus/client_golang v1.24.1 h1:JnJkREXzWxUdCuPFpIWZiPispT9xVV59uiuyR2bPlnU=
github.com/prometheus/client_golang v1.24.1/go.mod h1:F+oSRECHg4sse5ucfYpYDeIv/hu68Zo0uoHKetWnzcE=
github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk=
github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE=
-github.com/prometheus/common v0.70.1 h1:1HvjP4D5oL3t8RsPlwxA9onvvStjtIHYE5XuuwOi/PY=
-github.com/prometheus/common v0.70.1/go.mod h1:VdFUQDMZK3VLkurFUVhia6uys/0suUp86TJz5qbJRhc=
+github.com/prometheus/common v0.71.0 h1:9KDAKb7Mj3HEVKyFCK6Dc/HIwlBzZIN2l7/lrHl3KK8=
+github.com/prometheus/common v0.71.0/go.mod h1:CLJ5H8TEsGX8bl31BdMkfhIZ+QmZ9tBPPotUxUbfcmk=
github.com/prometheus/procfs v0.21.1 h1:GljZCt+zSTS+NZq88cyQ1LjZ+RCHp3uVuabBWA5+OJI=
github.com/prometheus/procfs v0.21.1/go.mod h1:aB55Cww9pdSJVHk0hUf0inxWyyjPogFIjmHKYgMKmtY=
github.com/redis/go-redis/v9 v9.18.0 h1:pMkxYPkEbMPwRdenAzUNyFNrDgHx9U+DrBabWNfSRQs=
@@ -257,9 +248,8 @@ github.com/robfig/cron/v3 v3.0.1 h1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs=
github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro=
github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ=
github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc=
-github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg=
-github.com/rs/zerolog v1.32.0 h1:keLypqrlIjaFsbmJOBdB/qvyF8KEtCWHwobLp5l/mQ0=
-github.com/rs/zerolog v1.32.0/go.mod h1:/7mN4D5sKwJLZQ2b/znpjC3/GQWY/xaDXUM0kKWRHss=
+github.com/rs/zerolog v1.35.1 h1:m7xQeoiLIiV0BCEY4Hs+j2NG4Gp2o2KPKmhnnLiazKI=
+github.com/rs/zerolog v1.35.1/go.mod h1:EjML9kdfa/RMA7h/6z6pYmq1ykOuA8/mjWaEvGI+jcw=
github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e h1:MRM5ITcdelLK2j1vwZ3Je0FKVCfqOLp5zO6trqMLYs0=
github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e/go.mod h1:XV66xRDqSt+GTGFMVlhk3ULuV0y9ZmzeVGR4mloJI3M=
github.com/sony/gobreaker v0.5.0 h1:dRCvqm0P490vZPmy7ppEk2qCnCieBooFJ+YoXGYB+yg=
@@ -271,10 +261,8 @@ github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY=
github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
-github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U=
-github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U=
-github.com/teslamotors/fleet-telemetry v0.9.0 h1:3qz6JAaMF15+HdUzq5eH+LPelH6qiUf+6x5pHG9uzbg=
-github.com/teslamotors/fleet-telemetry v0.9.0/go.mod h1:0pr+vwxzHPxJjB2LNhwCuG+FvIgpoM70GICHJB3MMlk=
+github.com/stretchr/testify v1.12.1 h1:EuwCh5fleGS7H32xRwO3wRGT7DxrDhLAT6FF8MpWDWE=
+github.com/stretchr/testify v1.12.1/go.mod h1:MDEgiDPPsNp5cuIrHPPCyornHKgEVbtFUmoNlxoYthg=
github.com/teslamotors/fleet-telemetry v0.9.5-0.20260924184623-3d366a3da23c h1:Qgt7TjYmL2r1S0HUiCA17LI1q3Otvdz044qbmjawBgc=
github.com/teslamotors/fleet-telemetry v0.9.5-0.20260924184623-3d366a3da23c/go.mod h1:J/JIH6HU3llBEstJAPjMaaCyxAPtWEXyxiYlgp43eiE=
github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c=
@@ -328,6 +316,8 @@ go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
go.yaml.in/yaml/v2 v2.4.4 h1:tuyd0P+2Ont/d6e2rl3be67goVK4R6deVxCUX5vyPaQ=
go.yaml.in/yaml/v2 v2.4.4/go.mod h1:gMZqIpDtDqOfM0uNfy0SkpRhvUryYH0Z6wdMYcacYXQ=
+go.yaml.in/yaml/v3 v3.0.5 h1:N6y/pJk8buWs9NY5ERU2HSMfm+IuD/OtfdAnq6kESPw=
+go.yaml.in/yaml/v3 v3.0.5/go.mod h1:HVTZu1O7/Vkt2N+BFy8Zza+lnLsABggaTM2ZpNIGuKg=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc=
@@ -362,14 +352,13 @@ golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y=
golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
-golang.org/x/sync v0.22.0 h1:SZjpbeLmrCk4xhRSZFNZW5gFUeCeFgjekvI/+gfScek=
-golang.org/x/sync v0.22.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0=
+golang.org/x/sync v0.23.0 h1:KameEIfc1IkluZyXWLn39Wd4tURc6GbCiISGiZm2bQk=
+golang.org/x/sync v0.23.0/go.mod h1:sUUOizhqBxiL6pEWpqNLUiaJn1ShEbZ6BBqskPbjZm0=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
diff --git a/web/e2e/tesla-usage.smoke.spec.ts b/web/e2e/tesla-usage.smoke.spec.ts
index 3e7c5405cb..e7fc8762e3 100644
--- a/web/e2e/tesla-usage.smoke.spec.ts
+++ b/web/e2e/tesla-usage.smoke.spec.ts
@@ -83,7 +83,7 @@ test('Tesla usage page and status overview render desktop/mobile, light/dark and
await page.getByRole('button', { name: 'Date range' }).click()
await expect(page.getByRole('option', { name: 'Last year' })).toBeVisible()
await expect(page.locator('.rdp-month').first()).toBeVisible()
- await expect(page.getByRole('dialog', { name: 'Date range picker' }).getByRole('gridcell', { name: '20' }).first()).toBeVisible()
+ await expect(page.getByRole('dialog', { name: 'Date range picker' }).locator('.rdp-day_button').first()).toBeVisible()
const applyButton = page.getByRole('dialog', { name: 'Date range picker' }).getByRole('button', { name: 'Apply' })
await expect.poll(async () => {
const bounds = await applyButton.boundingBox()
@@ -140,9 +140,11 @@ test('custom calendar dates submit inclusive UTC days as an exclusive-end API qu
const picker = page.getByRole('dialog', { name: 'Date range picker' })
await picker.getByRole('button', { name: 'New range' }).click()
const september = picker.getByRole('grid', { name: 'September' })
- await expect(september.getByRole('gridcell', { name: '20' })).toBeVisible()
- await september.getByRole('gridcell', { name: '20' }).click()
- await september.getByRole('gridcell', { name: '21' }).click()
+ const day20 = september.locator('[data-day="2026-09-20"] button')
+ const day21 = september.locator('[data-day="2026-09-21"] button')
+ await expect(day20).toBeVisible()
+ await day20.click()
+ await day21.click()
await picker.getByRole('button', { name: 'Apply' }).click()
await expect.poll(() => historyRange).toEqual({
start: '2026-09-20T00:00:00.000Z', end: '2026-09-22T00:00:00.000Z',
diff --git a/web/package-lock.json b/web/package-lock.json
index 4f47e9a1e1..caddf032d2 100644
--- a/web/package-lock.json
+++ b/web/package-lock.json
@@ -19,7 +19,7 @@
"@opentelemetry/sdk-trace-web": "^2.8.0",
"@tanstack/react-query": "^5.101.4",
"@tanstack/react-virtual": "^3.13.24",
- "date-fns": "^3.6.0",
+ "date-fns": "^4.4.0",
"framer-motion": "^12.38.0",
"html2canvas-pro": "^2.0.2",
"i18next": "^25.10.4",
@@ -29,7 +29,7 @@
"leaflet.markercluster": "^1.5.3",
"lucide-react": "^0.363.0",
"react": "^18.3.1",
- "react-day-picker": "^8.10.2",
+ "react-day-picker": "^9.14.0",
"react-dom": "^18.3.1",
"react-grid-layout": "^2.2.3",
"react-hook-form": "^7.74.0",
@@ -1973,6 +1973,12 @@
"node": ">=20.19.0"
}
},
+ "node_modules/@date-fns/tz": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/@date-fns/tz/-/tz-1.5.0.tgz",
+ "integrity": "sha512-lwYN/vDPeNRULcepoE/LO2Pgx+7/RV+S9ARfbc9lr2DtGkOD7pAiruHvbR1RX3Qyf6ja47EWJDMsNK5vK08DJg==",
+ "license": "MIT"
+ },
"node_modules/@dnd-kit/accessibility": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/@dnd-kit/accessibility/-/accessibility-3.1.1.tgz",
@@ -4217,6 +4223,15 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/@tabby_ai/hijri-converter": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/@tabby_ai/hijri-converter/-/hijri-converter-1.0.5.tgz",
+ "integrity": "sha512-r5bClKrcIusDoo049dSL8CawnHR6mRdDwhlQuIgZRNty68q0x8k3Lf1BtPAMxRf/GgnHBnIO4ujd3+GQdLWzxQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
"node_modules/@tailwindcss/container-queries": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/@tailwindcss/container-queries/-/container-queries-0.1.1.tgz",
@@ -4610,14 +4625,12 @@
"version": "15.7.15",
"resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz",
"integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==",
- "dev": true,
"license": "MIT"
},
"node_modules/@types/react": {
"version": "18.3.31",
"resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.31.tgz",
"integrity": "sha512-vfEqpXTvwT91yhmwdfouStN2hSKwTvyRs8qpLfADyrq/kxDw0hZM7Wk9Ug1FELj8hIby+S/+kQCSRFF32nv2Qw==",
- "dev": true,
"license": "MIT",
"dependencies": {
"@types/prop-types": "*",
@@ -6210,15 +6223,21 @@
}
},
"node_modules/date-fns": {
- "version": "3.6.0",
- "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-3.6.0.tgz",
- "integrity": "sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==",
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-4.4.0.tgz",
+ "integrity": "sha512-+1UMbeh68lH1SegH83CGWwpb6OHHbpSgr3+s5Eww5M4CAgswBpoWS0AjTOfEJ33HiYKz1hdj/KTFprzXHmq/6w==",
"license": "MIT",
"funding": {
"type": "github",
"url": "https://github.com/sponsors/kossnocorp"
}
},
+ "node_modules/date-fns-jalali": {
+ "version": "4.1.0-0",
+ "resolved": "https://registry.npmjs.org/date-fns-jalali/-/date-fns-jalali-4.1.0-0.tgz",
+ "integrity": "sha512-hTIP/z+t+qKwBDcmmsnmjWTduxCg+5KfdqWQvb2X/8C9+knYY6epN/pfxdDuyVlSVeFz0sM5eEfwIUQ70U4ckg==",
+ "license": "MIT"
+ },
"node_modules/debug": {
"version": "4.4.3",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
@@ -10742,17 +10761,25 @@
}
},
"node_modules/react-day-picker": {
- "version": "8.10.2",
- "resolved": "https://registry.npmjs.org/react-day-picker/-/react-day-picker-8.10.2.tgz",
- "integrity": "sha512-LK68OTbHB3oJNhl9cA0qVizzp3o26w61YSjAFkYi67N86iro32wx86kSNeFU/hq+gI8m1yzWhnomMLfZ041RzQ==",
+ "version": "9.14.0",
+ "resolved": "https://registry.npmjs.org/react-day-picker/-/react-day-picker-9.14.0.tgz",
+ "integrity": "sha512-tBaoDWjPwe0M5pGrum4H0SR6Lyk+BO9oHnp9JbKpGKW2mlraNPgP9BMfsg5pWpwrssARmeqk7YBl2oXutZTaHA==",
"license": "MIT",
+ "dependencies": {
+ "@date-fns/tz": "^1.4.1",
+ "@tabby_ai/hijri-converter": "1.0.5",
+ "date-fns": "^4.1.0",
+ "date-fns-jalali": "4.1.0-0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
"funding": {
"type": "individual",
"url": "https://github.com/sponsors/gpbl"
},
"peerDependencies": {
- "date-fns": "^2.28.0 || ^3.0.0",
- "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
+ "react": ">=16.8.0"
}
},
"node_modules/react-dom": {
@@ -12493,7 +12520,7 @@
"version": "5.9.3",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz",
"integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
- "dev": true,
+ "devOptional": true,
"license": "Apache-2.0",
"bin": {
"tsc": "bin/tsc",
diff --git a/web/package.json b/web/package.json
index 50d3cd19f8..919ce90af7 100644
--- a/web/package.json
+++ b/web/package.json
@@ -112,7 +112,7 @@
"@opentelemetry/sdk-trace-web": "^2.8.0",
"@tanstack/react-query": "^5.101.4",
"@tanstack/react-virtual": "^3.13.24",
- "date-fns": "^3.6.0",
+ "date-fns": "^4.4.0",
"framer-motion": "^12.38.0",
"html2canvas-pro": "^2.0.2",
"i18next": "^25.10.4",
@@ -122,7 +122,7 @@
"leaflet.markercluster": "^1.5.3",
"lucide-react": "^0.363.0",
"react": "^18.3.1",
- "react-day-picker": "^8.10.2",
+ "react-day-picker": "^9.14.0",
"react-dom": "^18.3.1",
"react-grid-layout": "^2.2.3",
"react-hook-form": "^7.74.0",
diff --git a/web/src/components/forms/RangePicker.tsx b/web/src/components/forms/RangePicker.tsx
index a528a14617..30d8165637 100644
--- a/web/src/components/forms/RangePicker.tsx
+++ b/web/src/components/forms/RangePicker.tsx
@@ -307,8 +307,11 @@ export function RangePicker({
selected={staged}
onSelect={setStaged}
numberOfMonths={typeof window !== 'undefined' && window.innerWidth >= 768 ? 2 : 1}
- fromDate={minDateObj}
- toDate={maxDateObj}
+ startMonth={minDateObj}
+ endMonth={maxDateObj}
+ disabled={minDateObj
+ ? [{ before: minDateObj }, { after: maxDateObj }]
+ : { after: maxDateObj }}
showOutsideDays={false}
className="rdp-tesla"
weekStartsOn={(i18n.language?.startsWith('en') ? 0 : 1) as 0 | 1}
diff --git a/web/src/components/forms/__tests__/RangePicker.test.tsx b/web/src/components/forms/__tests__/RangePicker.test.tsx
index addcccc0a3..77e323e5f1 100644
--- a/web/src/components/forms/__tests__/RangePicker.test.tsx
+++ b/web/src/components/forms/__tests__/RangePicker.test.tsx
@@ -110,6 +110,27 @@ describe(' preset behavior — auto-apply, no Apply needed', () =
});
describe(' Apply button', () => {
+ it('keeps dates outside the configured bounds unselectable', async () => {
+ render(
+ ,
+ );
+ fireEvent.click(screen.getByRole('button', { name: /date range/i }));
+ expect(
+ await screen.findByRole(
+ 'button',
+ { name: /Thursday, January 2nd, 2025/i },
+ { timeout: 20_000 },
+ ),
+ ).toBeDisabled();
+ expect(screen.getByRole('button', { name: /Saturday, January 4th, 2025/i })).toBeEnabled();
+ expect(screen.getByRole('button', { name: /Wednesday, January 8th, 2025/i })).toBeDisabled();
+ });
+
it('Apply is disabled when staged range matches the current value', () => {
render();
fireEvent.click(screen.getByRole('button', { name: /date range/i }));
diff --git a/web/src/index.css b/web/src/index.css
index 94fc0340ed..c28f77d7cd 100644
--- a/web/src/index.css
+++ b/web/src/index.css
@@ -1818,35 +1818,32 @@ figure[data-print-card]:fullscreen p {
/* react-day-picker theming for the RangePicker popover.
Keeps the calendar consistent with the dark glass surface tokens. */
.rdp-tesla {
- --rdp-cell-size: 36px;
+ --rdp-day-height: 36px;
+ --rdp-day-width: 36px;
+ --rdp-day_button-height: 34px;
+ --rdp-day_button-width: 34px;
--rdp-accent-color: var(--accent, #2563eb);
- --rdp-background-color: rgba(255, 255, 255, 0.06);
- --rdp-accent-color-dark: var(--accent, #2563eb);
- --rdp-background-color-dark: rgba(255, 255, 255, 0.08);
- --rdp-outline: 2px solid var(--accent, #2563eb);
- --rdp-outline-selected: 2px solid var(--accent, #2563eb);
+ --rdp-accent-background-color: rgba(37, 99, 235, 0.18);
margin: 0;
color: var(--text-primary);
}
-.rdp-tesla .rdp-day_today:not(.rdp-day_selected) {
+.rdp-tesla .rdp-today:not(.rdp-selected) {
font-weight: 700;
color: var(--accent, #2563eb);
}
-.rdp-tesla .rdp-day_selected,
-.rdp-tesla .rdp-day_selected:focus-visible,
-.rdp-tesla .rdp-day_selected:hover {
+.rdp-tesla .rdp-selected .rdp-day_button {
background-color: var(--accent, #2563eb);
color: white;
}
-.rdp-tesla .rdp-day_range_middle {
- background-color: rgba(37, 99, 235, 0.18);
+.rdp-tesla .rdp-range_middle .rdp-day_button {
+ background-color: var(--rdp-accent-background-color);
color: var(--text-primary);
}
-.rdp-tesla .rdp-button:focus-visible {
+.rdp-tesla .rdp-day_button:focus-visible {
outline: 2px solid var(--accent, #2563eb);
outline-offset: 2px;
}
-.rdp-tesla .rdp-head_cell {
+.rdp-tesla .rdp-weekday {
color: var(--text-muted);
font-weight: 500;
}
@@ -1854,10 +1851,12 @@ figure[data-print-card]:fullscreen p {
color: var(--text-primary);
font-weight: 600;
}
-.rdp-tesla .rdp-nav_button {
+.rdp-tesla .rdp-button_previous,
+.rdp-tesla .rdp-button_next {
color: var(--text-secondary);
}
-.rdp-tesla .rdp-nav_button:hover {
+.rdp-tesla .rdp-button_previous:hover,
+.rdp-tesla .rdp-button_next:hover {
background-color: rgba(255, 255, 255, 0.06);
}