Skip to content

Commit fc11d6d

Browse files
Merge upstream/main (3ee042d) into feat/per-write-checkpoints-b1
Keep both sides of the SettingsView spec conflict: the B1 per-write checkpoints save round trip and upstream's promptCacheTtl save round trip (#2271) now coexist in one file.
2 parents e2417cb + 3ee042d commit fc11d6d

874 files changed

Lines changed: 41538 additions & 14607 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

‎.coderabbit.yaml‎

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,19 @@ reviews:
9696
a call-count check. For code with fallback behavior, verify both the cold-start case
9797
(no prior state) and the warm case (prior state exists) are covered, as they exercise
9898
different branches.
99+
A test double must not re-implement production logic. If a mock, stub, or inline helper
100+
copies a predicate, filter, sort, or transform that also exists in production code, a
101+
change to the production copy cannot fail the test. Bind the real function instead, for
102+
example with `vi.importActual` or `vi.spyOn`, and replace only the external boundary
103+
(network, filesystem, VS Code API).
104+
For code that filters, groups, reorders, or deduplicates a collection, require a test
105+
with mixed input, such as interleaved item types and repeated items, that asserts the
106+
full output array. A test that uses only one item type cannot fail when the production
107+
predicate becomes narrower. Ask for the case that fails when the predicate covers a
108+
subset of the intended items.
109+
When Stryker reports a surviving mutant on changed code, prefer a test that kills it.
110+
If the mutant is equivalent, prefer to delete the redundant branch before adding a
111+
`Stryker disable` comment.
99112
100113
- path: "apps/vscode-e2e/**"
101114
instructions: >-

‎.github/actions/setup-node-pnpm/action.yml‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ inputs:
66
node-version:
77
description: "Node.js version to use"
88
required: false
9-
default: "22.23.1"
9+
default: "22.23.4"
1010
pnpm-version:
1111
description: "pnpm version to use"
1212
required: false
@@ -24,7 +24,7 @@ runs:
2424
using: "composite"
2525
steps:
2626
- name: Install pnpm
27-
uses: pnpm/action-setup@0977fd99725f1db4007ccb2928dbb4e90d06cc86 # v6.0.10
27+
uses: pnpm/action-setup@ea17c68df8912ef543352723c149a84f56e3d413 # v6.1.0
2828
with:
2929
version: ${{ inputs.pnpm-version }}
3030
- name: Get pnpm store directory
@@ -39,7 +39,7 @@ runs:
3939
restore-keys: |
4040
${{ runner.os }}-pnpm-store-
4141
- name: Setup Node.js
42-
uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
42+
uses: actions/setup-node@949feb2413d6458794dcd2491c4babbbce0c15c1 # v7.1.0
4343
with:
4444
node-version: ${{ inputs.node-version }}
4545
- name: Install dependencies

‎.github/pull_request_template.md‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ Write the steps that test your changes. This helps reviewers check your work.
4040
- [ ] **Self-Review**: I reviewed my own code with care.
4141
- [ ] **Writing Style**: The PR title and description use Simplified Technical English (ASD-STE100): short sentences, plain words, active voice, one idea per sentence, no contractions.
4242
- [ ] **Testing**: New and/or updated tests have been added to cover my changes (if applicable).
43+
- [ ] **Test Helpers** (test changes only): Shared test helpers (`src/test-utils/`, `@/utils/test-utils`) are used only for mechanical duplication; test intent and scenario-specific mocks remain visible.
4344
- [ ] **Visual Snapshot** (UI changes only): If a user would notice this change at a glance (layout, theme tokens, brand elements, empty/error states), I added or updated a `*.visual.tsx` snapshot in `webview-ui/`. See `webview-ui/AGENTS.md` → "When a UI change needs a snapshot".
4445
- [ ] **Documentation Impact**: I checked if my changes need documentation updates (see "Documentation Updates" section below).
4546
- [ ] **Contribution Guidelines**: I read and agree to the [Contributor Guidelines](/CONTRIBUTING.md).

‎.github/workflows/cli-release.yml‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -198,7 +198,7 @@ jobs:
198198
rm -rf "$VERIFY_DIR"
199199
200200
- name: Upload artifact
201-
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
201+
uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
202202
with:
203203
name: cli-${{ matrix.platform }}
204204
path: |
@@ -230,7 +230,7 @@ jobs:
230230
echo "tag=cli-v$VERSION" >> $GITHUB_OUTPUT
231231
232232
- name: Download all artifacts
233-
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
233+
uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8.0.2
234234
with:
235235
path: artifacts
236236

@@ -376,7 +376,7 @@ jobs:
376376

377377
steps:
378378
- name: Download all artifacts
379-
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
379+
uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8.0.2
380380
with:
381381
path: artifacts
382382

‎.github/workflows/code-qa.yml‎

Lines changed: 28 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -66,8 +66,12 @@ jobs:
6666
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
6767
- name: Setup Node.js and pnpm
6868
uses: ./.github/actions/setup-node-pnpm
69+
with:
70+
install-args: "--frozen-lockfile"
6971
- name: Verify all translations are complete
7072
run: node scripts/find-missing-translations.js
73+
- name: Verify t() calls pass every interpolation variable
74+
run: node scripts/check-i18n-interpolation.js
7175

7276
knip:
7377
runs-on: ubuntu-latest
@@ -76,6 +80,8 @@ jobs:
7680
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
7781
- name: Setup Node.js and pnpm
7882
uses: ./.github/actions/setup-node-pnpm
83+
with:
84+
install-args: "--frozen-lockfile"
7985
- name: Verify Knip guardrails
8086
run: pnpm test:knip-policy
8187
- name: Run knip checks
@@ -90,6 +96,8 @@ jobs:
9096
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
9197
- name: Setup Node.js and pnpm
9298
uses: ./.github/actions/setup-node-pnpm
99+
with:
100+
install-args: "--frozen-lockfile"
93101
- name: Check formatting
94102
run: pnpm format:check
95103
- name: Lint
@@ -98,8 +106,20 @@ jobs:
98106
run: pnpm check-types
99107
- name: Validate Code QA workflow
100108
run: pnpm test:code-qa-ci
109+
- name: Validate Solheim provider smoke workflow
110+
run: pnpm test:solheim-smoke-ci
111+
- name: Test Solheim provider smoke units
112+
run: pnpm test:solheim-smoke:unit
113+
- name: Check Solheim provider smoke types
114+
run: pnpm solheim-smoke:check-types
115+
- name: Test agent evals units
116+
run: pnpm test:agent-evals:unit
117+
- name: Check agent evals types
118+
run: pnpm agent-evals:check-types
101119
- name: Model-check task lifecycle protocols
102120
run: pnpm lifecycle:model-check
121+
- name: Model-check webview recovery
122+
run: pnpm webview-recovery:check-types && pnpm webview-recovery:model-check
103123
- name: Validate MCP OAuth integration
104124
run: pnpm mcp:integration-check
105125

@@ -123,7 +143,7 @@ jobs:
123143
- name: Package extension
124144
run: pnpm --filter ./src vsix
125145
- name: Upload test VSIX
126-
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
146+
uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
127147
with:
128148
name: zoo-code-vsix-pr-${{ github.event.pull_request.number }}
129149
path: bin/*.vsix
@@ -153,6 +173,8 @@ jobs:
153173
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
154174
- name: Setup Node.js and pnpm
155175
uses: ./.github/actions/setup-node-pnpm
176+
with:
177+
install-args: "--frozen-lockfile"
156178
- name: Restore Turbo cache
157179
id: turbo-cache
158180
uses: actions/cache/restore@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
@@ -236,7 +258,7 @@ jobs:
236258
# See https://docs.codecov.com/docs/flags
237259
- name: Upload non-core coverage to Codecov
238260
if: matrix.collect-coverage
239-
uses: codecov/codecov-action@fb8b3582c8e4def4969c97caa2f19720cb33a72f # v7.0.0
261+
uses: codecov/codecov-action@303a32d7a59b442fa8d48b6a1cc6825c09c847a5 # v7.1.1
240262
with:
241263
files: >-
242264
src/coverage/merged/lcov.info,
@@ -248,31 +270,31 @@ jobs:
248270
token: ${{ secrets.CODECOV_TOKEN }}
249271
- name: Upload webview JSDOM coverage to Codecov
250272
if: matrix.collect-coverage
251-
uses: codecov/codecov-action@fb8b3582c8e4def4969c97caa2f19720cb33a72f # v7.0.0
273+
uses: codecov/codecov-action@303a32d7a59b442fa8d48b6a1cc6825c09c847a5 # v7.1.1
252274
with:
253275
files: webview-ui/coverage/lcov.info
254276
disable_search: true
255277
flags: webview-ui
256278
token: ${{ secrets.CODECOV_TOKEN }}
257279
- name: Upload core unit coverage to Codecov
258280
if: matrix.collect-coverage
259-
uses: codecov/codecov-action@fb8b3582c8e4def4969c97caa2f19720cb33a72f # v7.0.0
281+
uses: codecov/codecov-action@303a32d7a59b442fa8d48b6a1cc6825c09c847a5 # v7.1.1
260282
with:
261283
files: packages/core/coverage/unit/lcov.info
262284
disable_search: true
263285
flags: ${{ matrix.codecov-flag }},core-unit
264286
token: ${{ secrets.CODECOV_TOKEN }}
265287
- name: Upload core integration coverage to Codecov
266288
if: matrix.collect-coverage
267-
uses: codecov/codecov-action@fb8b3582c8e4def4969c97caa2f19720cb33a72f # v7.0.0
289+
uses: codecov/codecov-action@303a32d7a59b442fa8d48b6a1cc6825c09c847a5 # v7.1.1
268290
with:
269291
files: packages/core/coverage/integration/lcov.info
270292
disable_search: true
271293
flags: ${{ matrix.codecov-flag }},core-integration
272294
token: ${{ secrets.CODECOV_TOKEN }}
273295
- name: Upload coverage reports to GitHub
274296
if: matrix.collect-coverage
275-
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
297+
uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
276298
with:
277299
name: coverage-reports-${{ matrix.name }}
278300
path: |

‎.github/workflows/codeql.yml‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ jobs:
5252

5353
# Initializes the CodeQL tools for scanning.
5454
- name: Initialize CodeQL
55-
uses: github/codeql-action/init@cdf488f595d80d6e07e03d4674febd5ab45fa938 # v4.37.9
55+
uses: github/codeql-action/init@9b3254085494b55a0f7c4c2b3d2d52cc712ce370 # v4.39.1
5656
with:
5757
languages: ${{ matrix.language }}
5858
build-mode: ${{ matrix.build-mode }}
@@ -80,6 +80,6 @@ jobs:
8080
exit 1
8181
8282
- name: Perform CodeQL Analysis
83-
uses: github/codeql-action/analyze@cdf488f595d80d6e07e03d4674febd5ab45fa938 # v4.37.9
83+
uses: github/codeql-action/analyze@9b3254085494b55a0f7c4c2b3d2d52cc712ce370 # v4.39.1
8484
with:
8585
category: "/language:${{matrix.language}}"

‎.github/workflows/label-pr-review-state.yml‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -319,6 +319,7 @@ jobs:
319319
const communityApprovedLabel = 'community-approved';
320320
const reviewGateName = 'Zoo Code / PR review gate';
321321
const reconciliationCheckName = 'Zoo Code / reconcile PR review state';
322+
const workflowRunUrl = `${context.serverUrl}/${owner}/${repo}/actions/runs/${context.runId}`;
322323
323324
if (context.eventName === 'issue_comment' &&
324325
(!context.payload.issue?.pull_request ||
@@ -656,8 +657,7 @@ jobs:
656657
}
657658
if (!lookupSucceeded && passed) return;
658659
if (latestGateStatus?.state === state &&
659-
latestGateStatus.description === description &&
660-
latestGateStatus.target_url === pr.html_url) {
660+
latestGateStatus.description === description) {
661661
return;
662662
}
663663
const mustInvalidateSuccess = !passed &&
@@ -671,7 +671,7 @@ jobs:
671671
state,
672672
context: reviewGateName,
673673
description,
674-
target_url: pr.html_url,
674+
target_url: workflowRunUrl,
675675
});
676676
} catch (error) {
677677
if (required || mustInvalidateSuccess) throw error;

‎.github/workflows/mutation-testing.yml‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ jobs:
5858
id: mutation_report
5959
if: always() && github.event_name == 'pull_request'
6060
continue-on-error: true
61-
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
61+
uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
6262
with:
6363
name: changed-code-mutation-report
6464
path: reports/mutation/

‎.github/workflows/release-kickoff.yml‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,9 @@ name: Weekly release kickoff
2323

2424
on:
2525
schedule:
26-
# Friday at 7:00pm ET (23:00 UTC during daylight saving time).
27-
# This fixed UTC cron fires at 6:00pm ET while the US is on EST.
28-
- cron: "0 23 * * 5"
26+
# Friday at 12:00pm EST (17:00 UTC).
27+
# This fixed UTC cron fires at 1:00pm ET while the US is on EDT.
28+
- cron: "0 17 * * 5"
2929
workflow_dispatch:
3030

3131
permissions: {}
Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
name: Solheim provider smoke
2+
3+
# Project A: infrastructure validation only. No PR diff, review judgment, router,
4+
# deterministic review rule, or GitHub posting. Only trusted main-branch code runs.
5+
on:
6+
workflow_dispatch:
7+
8+
permissions:
9+
contents: read
10+
11+
concurrency:
12+
group: solheim-provider-smoke
13+
cancel-in-progress: false
14+
15+
jobs:
16+
smoke:
17+
if: github.ref == 'refs/heads/main'
18+
runs-on: ubuntu-24.04
19+
timeout-minutes: 25
20+
# Retain the existing protected environment and secret names for compatibility.
21+
# The environment requires reviewer approval, matching the deploy
22+
# environment. The job guard above restricts runs to main, so the
23+
# secret is released only for an approved main run. See
24+
# scripts/solheim-smoke/README.md.
25+
environment: final-vscode-review-smoke
26+
steps:
27+
- name: Checkout exact trusted main revision
28+
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
29+
with:
30+
ref: ${{ github.sha }}
31+
persist-credentials: false
32+
33+
- name: Setup Node.js and pnpm
34+
uses: ./.github/actions/setup-node-pnpm
35+
with:
36+
install-args: "--frozen-lockfile"
37+
38+
- name: Build trusted extension and webview
39+
run: |
40+
pnpm -w bundle
41+
pnpm --filter @roo-code/vscode-webview build
42+
43+
- name: Install display dependencies
44+
timeout-minutes: 5
45+
run: sudo apt-get update && sudo apt-get install -y xvfb ffmpeg libasound2t64
46+
47+
- name: Run Solheim provider smoke
48+
id: provider
49+
timeout-minutes: 8
50+
env:
51+
SOLHEIM_API_KEY: ${{ secrets.FINAL_SMOKE_OPENAI_API_KEY }}
52+
SOLHEIM_SMOKE_OUT_DIR: ${{ runner.temp }}/solheim-provider-smoke
53+
run: xvfb-run -a -s "-screen 0 1280x720x24 -nolisten tcp" bash scripts/solheim-smoke/record.sh
54+
55+
# The recorder publishes smoke.mp4 only through an atomic rename
56+
# after a nonempty check and ffprobe validation, so the published
57+
# final is the commit marker: present and nonempty means complete.
58+
# There is no separate persisted status marker.
59+
- name: Verify recording integrity
60+
if: ${{ !cancelled() && (steps.provider.outcome == 'success' || steps.provider.outcome == 'failure') }}
61+
env:
62+
SOLHEIM_SMOKE_OUT_DIR: ${{ runner.temp }}/solheim-provider-smoke
63+
run: |
64+
test -s "$SOLHEIM_SMOKE_OUT_DIR/smoke.mp4"
65+
echo "Recording published and nonempty: $SOLHEIM_SMOKE_OUT_DIR/smoke.mp4"
66+
67+
# Verdict and trace evidence must survive even when the recording
68+
# is missing, so metadata and video are uploaded separately.
69+
- name: Upload provider smoke verdict and trace
70+
if: ${{ !cancelled() && (steps.provider.outcome == 'success' || steps.provider.outcome == 'failure') }}
71+
uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
72+
with:
73+
name: solheim-provider-smoke-${{ github.sha }}
74+
path: |
75+
${{ runner.temp }}/solheim-provider-smoke/verdict.json
76+
${{ runner.temp }}/solheim-provider-smoke/trace.json
77+
${{ runner.temp }}/solheim-provider-smoke/sidebar-focus.json
78+
if-no-files-found: error
79+
retention-days: 7
80+
81+
# Exact validated final path only; the recorder leaves no temporary
82+
# file behind, so a failed upload here reports the missing recording.
83+
- name: Upload provider smoke recording
84+
if: ${{ !cancelled() && (steps.provider.outcome == 'success' || steps.provider.outcome == 'failure') }}
85+
uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
86+
with:
87+
name: solheim-provider-smoke-recording-${{ github.sha }}
88+
path: ${{ runner.temp }}/solheim-provider-smoke/smoke.mp4
89+
if-no-files-found: error
90+
retention-days: 7

0 commit comments

Comments
 (0)