Skip to content

Commit 42a1bbb

Browse files
Merge upstream main (73931fe) into fws/u6-apply-patch-wiring
Conflict set resolved per the stack's settled copy sources; every copy source named per file group: - src/utils/safeWriteJson.ts + src/utils/__tests__/safeWriteJson.test.ts + .lockKey.spec.ts + .interruption.test.ts: copy source = settled Zoo-Code-Org#1916 head 711ada7 (which itself pins the json quartet at 74f5eb2, the Zoo-Code-Org#1914 head). Main-side taskMessages.ts consumes SafeWriteJsonTraceStage + the trace option, which only this json generation provides; the era json predates main's Zoo-Code-Org#2297 and fails tsc against it. - src/services/file-safety/safeWriteText.ts + spec + integration spec: same copy source (the same 74f5eb2 pin). json and text travel as one generation. - src/core/tools/guardedWrite.ts + src/core/tools/__tests__/guardedWrite.spec.ts: copy source = 711ada7 - the U8-era guardedWrite surface adapted to the pinned generation: publish calls carry backup: true, resolveLinkPathLockKey and canonicalDirKey are module-local helpers, and the spec's mock arguments spell backup: true where the era spelled retainedTarget: true (31 sites; the 12 DiffViewProvider.spec sites travel with that file's copy below). - src/integrations/editor/DiffViewProvider.ts + __tests__/DiffViewProvider.spec.ts: copy source = 711ada7 in full. This is the era x 3ee042d x main 3-way resolution Zoo-Code-Org#1916 carries, and it includes the teardown-tail deadlock fix: revertChanges' tail finalizes via finalizeSessionFromTeardownTail() - the same finalization minus the session-start join, because the reservation that join would wait on is itself waiting on this pass (reset -> reservation -> open -> teardownInFlight -> the tail -> reset would never settle). The fix is verified IN THIS TREE, not inherited silently: its regression test "revertChanges' tail does not deadlock when open() starts during the pass" runs in this branch's misc shard gate, together with the companion ownership assertion the fix owes. - src/eslint-suppressions.json: main's counts first (the theirs side); u6-only file entries kept only where main carries none (25 entries); then eslint verify with --prune-suppressions on the merged tree. No prune carried across the merge: shared-file counts restart from main and only eslint may lower them. Generation-pairing rule enforced by this resolution (adopted as a rule by the stack lead; the four-generation map and the discriminator experiment are posted on Zoo-Code-Org#2350 where the convergence review reads them): json plus its specs and text plus its specs travel as ONE generation, always. The evidence behind it: on Zoo-Code-Org#1916 an era-text x 74f5-json chimera passed tsc --noEmit, every ubuntu leg, and every local misc shard, and failed only on the windows platform-unit misc shard (15 rows in the era windows-only ACL/backup-stat and interruption kill-timing branches, run 42459507387 job 128665547657) - the shape of a red a reviewer would attribute to the change in the diff rather than to the pairing. Auto-merged Task.ts accepted after review: same two-lineage splice Zoo-Code-Org#1916 merged (era-side hunks and main's Zoo-Code-Org#2297 hunks are disjoint regions). - src/utils/__tests__/safeWriteJson.test.ts additionally adopted from 025fb7d (Zoo-Code-Org#2359 head, test-only hardening, keyed on inode not path spelling): the windows platform-unit rows that motivated it are the same on any tree carrying 74f5eb2's json test (reason lines read from runs 42461215177 128670729075 and 42448302148 128631851822). src/utils/safeWriteJson.ts is byte-identical between the two refs, so json + its specs still travel as one generation - this branch adopts the generation's windows-proven test file (025fb7d windows platform-unit green with this file against the identical implementation, run 42455872567 job 128654644966), matching Zoo-Code-Org#1914/Zoo-Code-Org#1916 byte-for-byte so the stack carries one copy of this test.
2 parents 94f4a23 + 73931fe commit 42a1bbb

218 files changed

Lines changed: 18399 additions & 5208 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.

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,12 @@ on:
99
merge_group:
1010
types: [checks_requested]
1111

12+
# Cancel superseded runs when a pull request is updated. Non-PR events keep
13+
# unique groups, so main, merge-queue, and manual runs are never cancelled.
14+
concurrency:
15+
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.run_id }}
16+
cancel-in-progress: ${{ github.event_name == 'pull_request' }}
17+
1218
# Least privilege: every job below escalates only where it needs to.
1319
permissions:
1420
contents: read

‎.github/workflows/codeql.yml‎

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,12 @@ on:
77
schedule:
88
- cron: "24 19 * * 3"
99

10+
# Cancel superseded runs when a pull request is updated. Non-PR events keep
11+
# unique groups, so main pushes and scheduled scans are never cancelled.
12+
concurrency:
13+
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.run_id }}
14+
cancel-in-progress: ${{ github.event_name == 'pull_request' }}
15+
1016
# Least privilege: the analyze job escalates to security-events: write via its
1117
# own job-level permissions block.
1218
permissions:

‎.github/workflows/e2e.yml‎

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,12 @@ on:
77
merge_group:
88
types: [checks_requested]
99

10+
# Cancel superseded runs when a pull request is updated. Non-PR events keep
11+
# unique groups, so merge-queue and manual runs are never cancelled.
12+
concurrency:
13+
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.run_id }}
14+
cancel-in-progress: ${{ github.event_name == 'pull_request' }}
15+
1016
permissions:
1117
contents: read
1218

@@ -156,6 +162,18 @@ jobs:
156162
if: github.event_name != 'pull_request' || steps.e2e-marker.outputs.cache-hit != 'true'
157163
run: TEST_FILE=restart-persistence.test USE_MOCK=true xvfb-run -a pnpm --filter @roo-code/vscode-e2e exec node ./out/runTest.js
158164

165+
- name: Upload restart-persistence failure artifacts
166+
# runTest.js preserves a failed scenario workspace (phase results,
167+
# VS Code logs, task files) under apps/vscode-e2e/test-failures/
168+
# instead of deleting it, so the interrupted-write state from
169+
# issue #2130-style failures stays inspectable.
170+
if: failure()
171+
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
172+
with:
173+
name: restart-persistence-failure
174+
path: apps/vscode-e2e/test-failures/
175+
if-no-files-found: ignore
176+
159177
- name: Explain skipped mocked E2E pass marker
160178
if: steps.e2e-marker.outputs.cache-hit != 'true' && steps.run-e2e.outcome == 'success' && steps.vscode-fallback.outputs.used == 'true'
161179
run: echo "Skipping mocked E2E pass marker because tests ran against a stale cached VS Code binary (VS Code download endpoints unreachable)."

‎.github/workflows/mutation-pr-comment.yml‎

Lines changed: 428 additions & 0 deletions
Large diffs are not rendered by default.

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ jobs:
5050
if: github.event_name == 'pull_request'
5151
env:
5252
HEAD_SHA: ${{ github.sha }}
53+
PR_HEAD_SHA: ${{ github.event.pull_request.head.sha }}
5354
run: |
5455
BASE_SHA="$(git rev-parse "$HEAD_SHA^1")"
5556
node scripts/stryker-diff.mjs ci --base "$BASE_SHA" --head "$HEAD_SHA"

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,12 @@ on:
1616
- "releases/**"
1717
- ".github/workflows/release-validation.yml"
1818

19+
# Cancel superseded runs when a pull request is updated. Non-PR events keep
20+
# unique groups, so manual runs are never cancelled.
21+
concurrency:
22+
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.run_id }}
23+
cancel-in-progress: ${{ github.event_name == 'pull_request' }}
24+
1925
permissions:
2026
contents: read
2127

‎.gitignore‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ AGENTS.local.md
2828
apps/vscode-e2e/playwright-report-electron/
2929
apps/vscode-e2e/test-results-electron/
3030
apps/vscode-e2e/heap-results/
31+
apps/vscode-e2e/test-failures/
3132

3233
# Docs
3334
docs/_site/

‎CHANGELOG.md‎

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,79 @@
11
# Zoo Code Changelog
22

3+
## [3.96.0]
4+
5+
- ✨ **New chat settings and diagnostics:** Show message timestamps with configurable time and date formats, tune the prompt-cache TTL for Anthropic profiles, and generate privacy-safe diagnostics reports.
6+
- 💸 **More accurate provider costs and caching:** Keep Anthropic tool results intact, adopt cumulative output tokens in Anthropic and MiniMax costs, read DeepSeek prompt-cache counters, target the xAI Responses cache, and bill Mistral cache reads at 0.1x.
7+
- 🧭 **More reliable and faster chats:** Resume completed tasks after a restart, restore checkpoints when the saved commit is missing, auto-reload a dead webview renderer, throttle streaming updates, and load locales on demand.
8+
9+
### New Chat Settings and Diagnostics
10+
11+
- Add time and date format settings and message timestamps (#2221 by @KarthickMahalingam, PR #2223 by @KarthickMahalingam)
12+
- Add a user-facing prompt-cache TTL for Anthropic profiles (PR #2271 by @simurg79)
13+
- Add privacy-safe diagnostics reports (PR #2292 by @app/zoomote2)
14+
15+
### More Accurate Provider Costs and Caching
16+
17+
- Keep tool_result blocks contiguous in Anthropic requests by grouping image blocks separately (#1307 by @alaskanloosemoose-dotcom, PR #2243 by @myk1yt)
18+
- Adopt cumulative message_delta output tokens in Anthropic and MiniMax cost (#1727 by @myk1yt, PR #2242 by @myk1yt)
19+
- Read documented top-level prompt-cache counters for DeepSeek (PR #2252 by @myk1yt)
20+
- Send body prompt_cache_key for xAI Responses cache affinity (PR #2256 by @myk1yt)
21+
- Bill Mistral cache reads at 0.1x instead of the full input price (PR #2257 by @myk1yt)
22+
- Map xAI tool_choice to the Responses API shape with a typed request body (PR #2036 by @easonLiangWorldedtech)
23+
- Add MiMo V2.6 Flash and Pro model configurations for OpenCode Go (#1997 by @WebMad, PR #2246 by @myk1yt)
24+
25+
### More Reliable and Faster Chats
26+
27+
- Resume completed tasks after a restart when a message write is interrupted (#2130 by @edelauna, PR #2297 by @app/zoomote2)
28+
- Restore checkpoints when the saved commit is missing (PR #2269 by @simurg79)
29+
- Detect a dead webview renderer via heartbeat and auto-reload (PR #1715 by @myk1yt)
30+
- Report emergency condense like the automatic path (PR #1838 by @PierrunoYT)
31+
- Summarize only the API-visible history when condensing (#1342 by @RemainIndoors1, PR #2300 by @RytisLT)
32+
- Propagate beyond-EOF read-file errors instead of reporting the file as empty (PR #1734 by @myk1yt)
33+
- Throttle partial message updates while streaming (PR #2120 by @PierrunoYT)
34+
- Replace axios with fetch in key-info hooks (PR #2261 by @myk1yt)
35+
- Load locales on demand instead of eager-globbing all 18 (PR #2267 by @myk1yt)
36+
- Replace the debounce package with a local leading-edge helper (PR #2268 by @myk1yt)
37+
38+
### New Features and Integrations
39+
40+
- Add a dependency-free BM25 ranker tool (PR #1207 by @edelauna)
41+
- Add abort-signal wiring for lm-studio and qwen-code (PR #1309 by @easonLiangWorldedtech)
42+
- Add Keenable to the MCP marketplace (#2312 by @ilya-bogin-keenable, PR #2313 by @ilya-bogin-keenable)
43+
44+
### Testing, CI, and Repository Automation
45+
46+
- Cancel obsolete PR CI runs and remove duplicate builds (#2289 by @edelauna, PR #2294 by @app/zoomote2)
47+
- Post surviving mutants as a PR comment (#2287 by @edelauna, PR #2293 by @app/zoomote2)
48+
- Run webview CI tests with four workers (#2288 by @edelauna, PR #2308 by @app/zoomote2)
49+
- Use plugin-side related-test discovery for the extension package mutation gate (PR #2211 by @easonLiangWorldedtech)
50+
- Add test-utils guardrails and convert remaining stragglers (PR #2279 by @app/zoomote2)
51+
- Drop test-only tool-use interfaces from shared/tools (PR #2258 by @myk1yt)
52+
- Show the Zoo Code panel in the Solheim smoke video and bound the apt step (#2158 by @edelauna, PR #2195 by @app/zoomote2)
53+
54+
### Refactoring and Code Health
55+
56+
- Move default provider ID functionality into the provider definition (PR #2233 by @p12tic)
57+
- Resolve profile model IDs through provider definitions (PR #2239 by @p12tic)
58+
- Remove no-explicit-any suppressions in utils (PR #2281 by @app/zoomote2)
59+
- Remove no-explicit-any suppressions in small directories (PR #2286 by @app/zoomote2)
60+
- Close lint coverage and knip hygiene gaps (PR #2280 by @app/zoomote2)
61+
- Sweep dead locale keys behind an AST gate (PR #2263 by @myk1yt)
62+
- Remove dead CSS classes from the global stylesheet (PR #2251 by @myk1yt)
63+
64+
### Dependencies and Maintenance
65+
66+
- Update @tanstack/react-query to v5.105.0 (PR #2180 by @app/renovate)
67+
- Update ignore to v7.0.14 (PR #2181 by @app/renovate)
68+
- Update posthog-js to v1.440.0 (PR #2182 by @app/renovate)
69+
- Update posthog-node to v5.57.2 (PR #2183 by @app/renovate)
70+
- Update GitHub Actions (PR #2186 by @app/renovate)
71+
- Update qs to v6.16.1 [security] (PR #2214 by @app/renovate)
72+
73+
### Housekeeping
74+
75+
- Merge the **previous v3.94.0 release preparation** after its publication; this is prior-release housekeeping, not a v3.96.0 feature (PR #2272 by @app/zoomote2)
76+
377
## [3.94.0]
478

579
- ✨ **Broader model and provider support:** Use Claude Haiku 5.5 through Anthropic, send images to compatible VS Code LM models, tune temperature for OpenCode Go Responses models, and cancel requests cleanly across more providers.

‎README.md‎

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -46,11 +46,11 @@ Zoo Code builds on the foundation created by Roo Code and continues to expand it
4646
- **More dependable terminal and editing workflows** — fixes for premature terminal completion, task-state races, context management, diff editing, and provider-specific tool use.
4747
- **More control over your workspace** — rules management, per-mode MCP restrictions, multi-root path controls, model reasoning options, and completion change review actions.
4848

49-
## What's New in v3.94.0
49+
## What's New in v3.96.0
5050

51-
- ✨ **Broader model and provider support:** Use Claude Haiku 5.5 through Anthropic, send images to compatible VS Code LM models, tune temperature for OpenCode Go Responses models, and cancel requests cleanly across more providers.
52-
- 🔐 **More flexible MCP OAuth:** Configure static OAuth client settings, use custom callback paths, discover authentication details from `WWW-Authenticate`, and see callback failures before retrying.
53-
- 🧭 **Smoother chats and long sessions:** Rename tasks in history, drag files into chat without holding Shift, reduce memory retained during long sessions, and keep subtask links and replaced webviews stable.
51+
- ✨ **New chat settings and diagnostics:** Show message timestamps with configurable time and date formats, tune the prompt-cache TTL for Anthropic profiles, and generate privacy-safe diagnostics reports.
52+
- 💸 **More accurate provider costs and caching:** Keep Anthropic tool results intact, adopt cumulative output tokens in Anthropic and MiniMax costs, read DeepSeek prompt-cache counters, target the xAI Responses cache, and bill Mistral cache reads at 0.1x.
53+
- 🧭 **More reliable and faster chats:** Resume completed tasks after a restart, restore checkpoints when the saved commit is missing, auto-reload a dead webview renderer, throttle streaming updates, and load locales on demand.
5454

5555
<details>
5656
<summary>🌐 Available languages</summary>

‎apps/vscode-e2e/package.json‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,11 @@
55
"lint": "eslint src --ext=ts --max-warnings=0",
66
"check-types": "tsc -p tsconfig.esm.json --noEmit",
77
"format": "prettier --write src",
8-
"test:ci": "pnpm -w bundle && pnpm --filter @roo-code/vscode-webview build && pnpm test:run",
9-
"test:ci:mock": "pnpm -w bundle && pnpm --filter @roo-code/vscode-webview build && USE_MOCK=true pnpm test:run",
8+
"test:ci": "pnpm -w bundle && pnpm test:run",
9+
"test:ci:mock": "pnpm -w bundle && USE_MOCK=true pnpm test:run",
1010
"test:record": "AIMOCK_RECORD=true pnpm test:ci",
1111
"test:run": "rimraf out && tsc -p tsconfig.json && dotenv -e .env.local -- node ./out/runTest.js",
12-
"themes:build": "pnpm -w bundle && pnpm --filter @roo-code/vscode-webview build && rimraf out && tsc -p tsconfig.json",
12+
"themes:build": "pnpm -w bundle && rimraf out && tsc -p tsconfig.json",
1313
"themes:update": "pnpm themes:build && node ./out/theme-fixtures/generate.js update",
1414
"themes:check": "pnpm themes:build && node ./out/theme-fixtures/generate.js check",
1515
"themes:test": "pnpm --filter @roo-code/types build && rimraf out && tsc -p tsconfig.json && node --test ./out/theme-fixtures/fixtures.test.js",

0 commit comments

Comments
 (0)