Skip to content

fix(desktop): inherit login-shell Android SDK selection - #24623

Merged
juliusmarminge merged 6 commits into
mainfrom
takeover/pr-11648
Nov 14, 2026
Merged

juliusmarminge merged 6 commits into
mainfrom
takeover/pr-11648

Conversation

@juliusmarminge

Copy link
Copy Markdown
Member

A POSIX desktop app launched from the GUI could not find an Android SDK configured only in the login-shell profile. Read ANDROID_HOME and ANDROID_SDK_ROOT during the existing shell probe and carry them into the desktop environment before the backend starts.

Treat the two names as one SDK selection: hydrate them only when neither is inherited. This prevents a shell ANDROID_HOME from overriding an inherited ANDROID_SDK_ROOT. Windows, WSL forwarding and standalone server startup are unchanged.

Retains the fix by @thelonewander3r in #11648, with the pinned main revision merged and the original commits preserved.

Validation at c4c9ff1ee9:

  • 24 focused DesktopShellEnvironment tests pass. The original single added test is replaced by two behavioral cases covering normal hydration and inherited SDK selection; 22 existing tests remain unchanged.
  • The inherited-selection case fails before the fix and passes afterward. Script-text assertions were removed.
  • Changed-file formatting and lint, plus the desktop typecheck, pass.
  • This is nonvisual environment handling. No packaged GUI launch was performed; tests exercise the existing shell-environment service, and the environment path through the backend to the device host was reviewed.

Independent Opus and Sol full-diff reviews found no code blockers after the SDK-precedence correction.

Current-head CI will run after this update; previous checks cover the original head only.

Implementation: Claude Fable 5.1. Test assessment and independent review: Claude Opus 5.5. Independent review and coordination: GPT-6.1 Sol, through Claude Code and Codex in T3 Code.

Takeover

Credits @thelonewander3r for #11648. Rebuilt on current main because the contribution is on a fork; the SDK group-precedence implementation is retained. Ported the two behavioral tests with distinct paths to catch swapped values. The validation above describes the original fork head; replacement validation follows.

Evidence

Linux x86_64, Electron 44.9.3 under headless-desktop/Xvfb; GUI-like env -i, isolated HOME/T3 home per run, T3CODE_DEV_SEED=0. Synthetic SDK discovery only, no emulator launch.

Fixture matrix, 44/44 runtime results, all scripts, manifests, filtered backend environments, stills and recordings. U=absent, E=empty, W=whitespace; h/r are profile roots, i/j inherited roots. Each linked tuple opens its real Electron still; raw tuples and selected-root sentinels are in the archive.

Row / fixture Before
843f4e3529
After
e90cc01e4b
Selected root before → after
A1: profile pair (U, U) (h, r) none / h
A2: profile HOME only (U, U) (h, U) none / h
A3: profile ROOT only (U, U) (U, r) none / r
A4: empty inherited pair (E, E) (h, r) none / h
A5: blank inherited pair (W, W) (h, r) none / h
A6: empty HOME, profile ROOT (E, U) (E, r) none / r
A7: empty ROOT, profile HOME (U, E) (h, E) none / h
A8: empty profile HOME (U, U) (U, r) none / r
A9: blank profile ROOT (U, U) (h, U) none / h
A10: spaces and edge whitespace (U, U) (home sdk, root sdk) none / home sdk
A11: stdout/stderr noise (U, U) (h, r) none / h
C1: inherited pair (i, j) (i, j) i / i
C2: inherited HOME only (i, U) (i, U) i / i
C3: inherited ROOT only (U, j) (U, j) j / j
C4: ROOT vs profile HOME (U, j) (U, j) j / j
C5: HOME vs profile ROOT (i, U) (i, U) i / i
C6: unset everywhere (U, U) (U, U) none / none
C7: empty HOME, inherited ROOT (E, j) (E, j) j / j
C8: inherited HOME, empty ROOT (i, E) (i, E) i / i
C9: blank profile pair (U, U) (U, U) none / none
C10: blank values everywhere (E, W) (E, W) none / none
C11: padded inherited HOME (padded i, U) (padded i, U) i / i
W1/W2 and S1–S6: unchanged Windows / shell-selection controls Source only Source/control proof No Windows/macOS runtime claim

Before — profile-only SDK unavailable:

Before: real Electron reports Android SDK not found

After — profile-only SDK discovered:

After: real Electron discovers synthetic SDK without an AVD

Verification log
  • Tests: vp test run apps/desktop/src/shell/DesktopShellEnvironment.test.ts, 12 existing → 14 passing. Removing the fix or capture names fails hydration; per-variable filling fails inherited-selection protection.
  • Changed-file lint/format and desktop typecheck pass. No new parser/regex; fixed two-name loop.
  • Review round 1: Sol FIX_FIRST for pending captures/coverage requests, Opus MERGE; no code defects. Round 2: Sol MERGE and Opus MERGE; focused coverage accepted after runtime evidence.
  • Proof audit pass 2: SUFFICIENT; independently rebuilt/replayed HEAD A1. C11-after final process-tree snapshot is empty after shutdown; exec-time tuple, child sentinels, UI and recording support the row. Audit scripts/replay.
  • All 44 Linux before/after runs passed; all 88 stills opened and pixel-stable, all 44 recordings decoded. Captured backend exec environment prevents terminal-profile masking.
  • Windows/macOS runtime and actual emulator boot unverified; no platform-specific branch added. Shared POSIX code verified on Linux desktop; standalone server, web/mobile startup and remote host provisioning unchanged.
  • Replacement-head CI pending; dispatcher owns CI and merge.
  • Models/harnesses: Claude Opus 5.5 (tests, implementation, reviews) and GPT-6.1 Sol (coordination, reviews, evidence, proof audit), through Claude Agent and Codex in T3 Code.

Final merged-head verification

The historical 44/44 matrix and PASS2 replay above were captured at e90cc01e4b, with before shell source from 843f4e3529; those captures are not attributed to the merged head. Earlier PASS1 labeling at b6c944c9b8 differs only in tests.

Final local head 131173e0f4 merges the reviewed head with main 3eb836664e. Desktop/web/shared shell and local device source are unchanged; the complete patch against main remains byte-identical, two files and 47 additions.

Fresh web/backend/Electron rebuild at that exact final head passed, followed by real Electron A1-after and critical inherited-ROOT C3-after captures. A1 backend inherits (h,r) from profile; C3 retains (absent,j), selects j and does not fill HOME from profile. Both show SDK installed/no AVD; both still pairs are stable, recordings fully decode, focused tests pass 14/14, and cleanup reports no remaining recorded live PIDs. Historical C11-after empty final-tree caveat remains unchanged.

Final-head addendum — SUFFICIENT, new capture/log/script bundle. Synthetic Linux discovery only; Windows/macOS runtime and actual emulator boot remain unverified. No new code review or CI result is claimed by this addendum.

@github-actions github-actions Bot added vouch:trusted Author is trusted by repo permissions or the VOUCHED list. size:S 10-29 changed lines (additions + deletions). labels Oct 25, 2026
macroscopeapp[bot]
macroscopeapp Bot previously approved these changes Oct 25, 2026
@macroscopeapp

macroscopeapp Bot commented Oct 25, 2026 •

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved at 364ca6d

Macroscope's review found this PR approvable — The desktop now honors login-shell Android SDK selections and refreshes the local device host's SDK environment when used. Existing inherited selections and discovery defaults are preserved, keeping the change limited to local tool selection.

You can add or adjust custom eligibility rules. Learn more.

@coderabbitai

coderabbitai Bot commented Oct 25, 2026 •

Copy link
Copy Markdown
Contributor

Explain Change →

No actionable comments were generated in the recent review.

Walkthrough

The desktop shell environment captures ANDROID_HOME and ANDROID_SDK_ROOT from the login shell. On POSIX systems, it copies shell values only when neither variable is inherited. The local device host resolves the current SDK-derived environment during startup, shutdown, readiness checks, and command execution.

Changes: Android SDK Environment Handling

Layer / File(s) Summary
Capture and hydrate Android SDK variables
packages/contracts/src/resourceTelemetry.ts, apps/desktop/src/shell/DesktopShellEnvironment.ts, apps/desktop/src/shell/DesktopShellEnvironment.test.ts
ShellEnvironmentPatch accepts optional nullable Android SDK variables. Login-shell capture includes both variables. POSIX installation copies nonblank shell values only when both inherited values are blank or unset. macOS tests cover hydration and preservation of an inherited ANDROID_SDK_ROOT.
Resolve current SDK environment for host operations
apps/server/src/device/LocalDeviceHost.ts, apps/server/src/device/LocalDeviceHost.test.ts
Host operations resolve the Android SDK environment when used. The test changes ANDROID_HOME after host creation and checks readiness, agent launch, and a later emulator command, including the platform-tools path.

Estimated code review effort: 3 (Moderate) | ~20 minutes

Change: Bug fix

Suggested reviewers: tris203

Merge Risk: Minimal · up to 364ca

This change lets desktop launches pick up an Android SDK configured only in a login-shell profile, and the device host now follows the current SDK selection. No actionable merge-blocking risk was found. Windows and macOS runtime behavior was not verified.

Pre-merge checks: Passed 4

Check name Status Explanation
Title check Passed The title "fix(desktop): inherit login-shell Android SDK selection" matches the main change in the changeset. The changes hydrate ANDROID_HOME and ANDROID_SDK_ROOT from the login-shell capture in Desk…
Description check Passed The description follows the repository template. It has a Problem section (a POSIX desktop app launched from the GUI could not find an Android SDK set only in the login-shell profile), a Change sectio…
Linked Issues check Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check Passed Check skipped because no linked issues were found for this pull request.
Full details: Title check

Explanation

The title "fix(desktop): inherit login-shell Android SDK selection" matches the main change in the changeset. The changes hydrate ANDROID_HOME and ANDROID_SDK_ROOT from the login-shell capture in DesktopShellEnvironment.ts, only when neither is inherited, and add tests for that behavior. The title is specific and follows conventional commit style. The LocalDeviceHost.ts resolution change is a secondary change that the title does not mention, which is acceptable for a title.

Full details: Description check

Explanation

The description follows the repository template. It has a Problem section (a POSIX desktop app launched from the GUI could not find an Android SDK set only in the login-shell profile), a Change section (read both variables during the shell probe and hydrate them only when neither is inherited), a Scope section (it does not link a bug issue directly; it references PR #11648 as the retained fix, and the author does not explain why no issue is needed or whether a maintainer requested it), and a Verification section with focused tests, lint/format, typecheck, and Linux runtime evidence. The description is long and includes a lot of matrix and evidence detail that goes beyond the template. It also contains a 'Takeover' section and the author attribution. Scope is the main gap: the template asks for a linked issue that shows the bug, or a reason for skipping one. The description also reports that Windows and macOS runtime were not verified, and the LocalDeviceHost.ts change is not explained in the Change section.

Resolution

Optionally: link the issue that shows the bug, or say why no issue is needed. Briefly explain the LocalDeviceHost.ts per-use SDK resolution change in the Change section. Shorten the evidence matrix, since the template asks for focused verification.

Finishing Touches

Generate unit tests (beta)

  • Commit to this branch
  • Create a new PR
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts
Recent review info

Run configuration

Commits

Reviewing files that changed from the base of the PR and between 35ff8e9 and 364ca6d.

Files selected for processing: 2

  • apps/server/src/device/LocalDeviceHost.test.ts
  • apps/server/src/device/LocalDeviceHost.ts

Included review availability: This review used your included allowance. Your plan provides up to 10 included reviews per hour; 0 remain after this review.

@juliusmarminge juliusmarminge added bugfix Fix PR opened by an issue lead; enters the PR loop pr:needs-verification Reviewed and green; needs a run on a desktop, Android or iOS device and captures posted labels Oct 25, 2026
@juliusmarminge juliusmarminge added the takeover:in-progress A takeover lead is working on this PR label Nov 14, 2026
juliusmarminge and others added 2 commits November 14, 2026 07:40
Main now forwards the login-shell environment to the backend as a ShellEnvironmentPatch, which only carries the fields its schema lists. Add ANDROID_HOME and ANDROID_SDK_ROOT so the hydrated SDK selection reaches the server's device tools.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
@macroscopeapp
macroscopeapp Bot dismissed their stale review November 14, 2026 07:42

Dismissing prior approval to re-evaluate 35ff8e9

macroscopeapp[bot]
macroscopeapp Bot previously approved these changes Nov 14, 2026
@github-actions

github-actions Bot commented Nov 14, 2026 •

Copy link
Copy Markdown
Contributor

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

Provider Metric Main baseline This PR Impact PR ceiling
Codex Total thread wire 5.0 KiB 5.0 KiB 0 B (0.0%) 6.8 KiB ✅
Codex Thread snapshot wire 3.8 KiB 3.8 KiB 0 B (0.0%) 4.9 KiB ✅
Codex Live turn WebSocket wire 1.2 KiB 1.2 KiB 0 B (0.0%) 2.0 KiB ✅
Codex Live turn WebSocket decoded 21.5 KiB 21.5 KiB 0 B (0.0%) 24.4 KiB ✅
Codex Live turn messages 1 1 0 (0.0%) 8 ✅
Claude Total thread wire 5.0 KiB 5.0 KiB 0 B (0.0%) 6.8 KiB ✅
Claude Thread snapshot wire 3.8 KiB 3.8 KiB 0 B (0.0%) 4.9 KiB ✅
Claude Live turn WebSocket wire 1.2 KiB 1.2 KiB 0 B (0.0%) 2.0 KiB ✅
Claude Live turn WebSocket decoded 21.9 KiB 21.9 KiB 0 B (0.0%) 24.4 KiB ✅
Claude Live turn messages 1 1 0 (0.0%) 8 ✅

Other scenarios

All 64 scenario measurements match main.

All 64 scenario measurements
Provider Scenario Metric Main baseline This PR Impact PR ceiling
Codex short turn resume WebSocket decoded 10.5 KiB 10.5 KiB 0 B (0.0%) 12.7 KiB ✅
Codex short turn resume WebSocket messages 2 2 0 (0.0%) 2 ✅
Codex long turn running, cold open HTTP decoded 281.7 KiB 281.7 KiB 0 B (0.0%) 302.7 KiB ✅
Codex long turn running, cold open rows 75 75 0 (0.0%) 75 ✅
Codex long turn running, history page HTTP decoded 92.4 KiB 92.4 KiB 0 B (0.0%) 107.4 KiB ✅
Codex long turn running, history page rows 75 75 0 (0.0%) 75 ✅
Codex long turn finished, cold open HTTP decoded 381.5 KiB 381.5 KiB 0 B (0.0%) 410.2 KiB ✅
Codex long turn finished, cold open rows 151 151 0 (0.0%) 151 ✅
Codex long turn finished, socket cold open WebSocket decoded 381.6 KiB 381.6 KiB 0 B (0.0%) 410.2 KiB ✅
Codex long turn finished, socket cold open WebSocket messages 2 2 0 (0.0%) 2 ✅
Codex long turn finished, socket cold open rows 151 151 0 (0.0%) 151 ✅
Codex long turn finished, work page HTTP decoded 186.2 KiB 186.2 KiB 0 B (0.0%) 200.2 KiB ✅
Codex long turn finished, work page rows 150 150 0 (0.0%) 150 ✅
Codex idle thread resume WebSocket decoded 65 B 65 B 0 B (0.0%) 200 B ✅
Codex idle thread resume WebSocket messages 1 1 0 (0.0%) 1 ✅
Codex fleet shell snapshot HTTP decoded 42.4 KiB 42.4 KiB 0 B (0.0%) 53.7 KiB ✅
Codex fleet shell snapshot rows 27 27 0 (0.0%) 27 ✅
Codex fleet shell subscribe WebSocket decoded 65 B 65 B 0 B (0.0%) 200 B ✅
Codex fleet shell subscribe WebSocket messages 1 1 0 (0.0%) 1 ✅
Codex fleet shell resume check HTTP decoded 18 B 18 B 0 B (0.0%) 100 B ✅
Codex fleet shell resume check rows 0 0 0 0 ✅
Codex stale shell reload HTTP decoded 42.4 KiB 42.4 KiB 0 B (0.0%) 53.7 KiB ✅
Codex stale shell reload rows 27 27 0 (0.0%) 27 ✅
Codex stale shell resume WebSocket decoded 140 B 140 B 0 B (0.0%) 400 B ✅
Codex stale shell resume WebSocket messages 2 2 0 (0.0%) 2 ✅
Codex stale todo list cold open HTTP decoded 72.4 KiB 72.4 KiB 0 B (0.0%) 83.0 KiB ✅
Codex stale todo list cold open rows 75 75 0 (0.0%) 75 ✅
Codex stale todo list cold open nodes 2 2 0 (0.0%) 4 ✅
Codex stale todo list cold open subagents 2 2 0 (0.0%) 4 ✅
Codex stale todo list cold open plans 1 1 0 (0.0%) 2 ✅
Codex stale todo list cold open providerTurns 1 1 0 (0.0%) 2 ✅
Codex stale todo list cold open checkpoints 1 1 0 (0.0%) 2 ✅
Claude short turn resume WebSocket decoded 10.6 KiB 10.6 KiB 0 B (0.0%) 12.7 KiB ✅
Claude short turn resume WebSocket messages 2 2 0 (0.0%) 2 ✅
Claude long turn running, cold open HTTP decoded 283.3 KiB 283.3 KiB 0 B (0.0%) 302.7 KiB ✅
Claude long turn running, cold open rows 75 75 0 (0.0%) 75 ✅
Claude long turn running, history page HTTP decoded 93.4 KiB 93.4 KiB 0 B (0.0%) 107.4 KiB ✅
Claude long turn running, history page rows 75 75 0 (0.0%) 75 ✅
Claude long turn finished, cold open HTTP decoded 384.2 KiB 384.2 KiB 0 B (0.0%) 410.2 KiB ✅
Claude long turn finished, cold open rows 151 151 0 (0.0%) 151 ✅
Claude long turn finished, socket cold open WebSocket decoded 384.3 KiB 384.3 KiB 0 B (0.0%) 410.2 KiB ✅
Claude long turn finished, socket cold open WebSocket messages 2 2 0 (0.0%) 2 ✅
Claude long turn finished, socket cold open rows 151 151 0 (0.0%) 151 ✅
Claude long turn finished, work page HTTP decoded 188.1 KiB 188.1 KiB 0 B (0.0%) 200.2 KiB ✅
Claude long turn finished, work page rows 150 150 0 (0.0%) 150 ✅
Claude idle thread resume WebSocket decoded 66 B 66 B 0 B (0.0%) 200 B ✅
Claude idle thread resume WebSocket messages 1 1 0 (0.0%) 1 ✅
Claude fleet shell snapshot HTTP decoded 43.0 KiB 43.0 KiB 0 B (0.0%) 53.7 KiB ✅
Claude fleet shell snapshot rows 27 27 0 (0.0%) 27 ✅
Claude fleet shell subscribe WebSocket decoded 66 B 66 B 0 B (0.0%) 200 B ✅
Claude fleet shell subscribe WebSocket messages 1 1 0 (0.0%) 1 ✅
Claude fleet shell resume check HTTP decoded 18 B 18 B 0 B (0.0%) 100 B ✅
Claude fleet shell resume check rows 0 0 0 0 ✅
Claude stale shell reload HTTP decoded 43.0 KiB 43.0 KiB 0 B (0.0%) 53.7 KiB ✅
Claude stale shell reload rows 27 27 0 (0.0%) 27 ✅
Claude stale shell resume WebSocket decoded 140 B 140 B 0 B (0.0%) 400 B ✅
Claude stale shell resume WebSocket messages 2 2 0 (0.0%) 2 ✅
Claude stale todo list cold open HTTP decoded 73.4 KiB 73.4 KiB 0 B (0.0%) 83.0 KiB ✅
Claude stale todo list cold open rows 75 75 0 (0.0%) 75 ✅
Claude stale todo list cold open nodes 2 2 0 (0.0%) 4 ✅
Claude stale todo list cold open subagents 2 2 0 (0.0%) 4 ✅
Claude stale todo list cold open plans 1 1 0 (0.0%) 2 ✅
Claude stale todo list cold open providerTurns 1 1 0 (0.0%) 2 ✅
Claude stale todo list cold open checkpoints 1 1 0 (0.0%) 2 ✅

Baseline: 8247952 · PR result: 364ca6d · Source CI: success

Scenario and decoded snapshot size

10 historical turns, 5 command tools per turn, 878.9 KiB retained MCP result per historical turn, and a 1.05 MiB retained result in the measured turn.

  • Codex decoded thread snapshot: 108.5 KiB
  • Claude decoded thread snapshot: 108.8 KiB

Updated in place by a trusted workflow. PR artifacts are strictly validated and never executed.

… later

The desktop shell environment reaches the server after startup, but LocalDeviceHost resolved the Android SDK and copied the process environment once at construction. The hub, the agent-device daemon and emulator commands kept a standard-location SDK even after the login shell selected another one. Resolve the SDK and helper environment each time a helper starts or a command runs.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
@macroscopeapp
macroscopeapp Bot dismissed their stale review November 14, 2026 07:58

Dismissing prior approval to re-evaluate 364ca6d

@github-actions github-actions Bot added size:M 30-99 changed lines (additions + deletions). and removed size:S 10-29 changed lines (additions + deletions). labels Nov 14, 2026
@juliusmarminge

Copy link
Copy Markdown
Member Author

Evidence

Built and ran both commits as real Electron desktop apps on Linux under headless-desktop. Every capture uses fresh isolated state, a 1280×900 window, and dark theme.

  1. Create a custom SDK outside default discovery locations with the three executable tool stubs used by the triage reproduction.
  2. Export ANDROID_HOME only in .bash_profile; keep adb out of PATH. Confirm the interactive login shell sees the SDK and no adb.
  3. Launch Electron without ANDROID_HOME or ANDROID_SDK_ROOT inherited.
  4. Open Settings → Devices, enable Use devices, and open the Android popover.
Before After
82479522cb 364ca6d169
Before: Android SDK not found After: Android available
Before recording After recording

The base reports “Android not available — Android SDK was not found”; the head reports “Android available.” Stills were captured only after two screenshots 500 ms apart matched.

Additional controls all displayed Android available:

For both preservation controls, the profile points ANDROID_HOME at an empty SDK directory, making an override observable as unavailable.

Reproduction and seed driver · Synthetic observations

Verified by gpt-6.1-sol through the Codex harness.

Not shown:

  • Real AVD creation, emulator launch, adb operation, and agent-device commands were not exercised: the reproduction uses executable SDK tool stubs, matching triage.
  • The late shell-selection behavior of individual device helper subprocesses was not independently exercised beyond the real desktop availability flow.
  • macOS and Windows desktop behavior was not exercised; these captures establish the result on Linux.

@juliusmarminge juliusmarminge added takeover:ready Takeover done; auto-lands when gates pass and removed takeover:in-progress A takeover lead is working on this PR labels Nov 14, 2026
@juliusmarminge
juliusmarminge merged commit d530d96 into main Nov 14, 2026
54 checks passed
@juliusmarminge
juliusmarminge deleted the takeover/pr-11648 branch November 14, 2026 08:17
@juliusmarminge juliusmarminge removed the takeover:ready Takeover done; auto-lands when gates pass label Nov 14, 2026
jieyuexing added a commit to jieyuexing/t3code-cn that referenced this pull request Nov 14, 2026
合入上游 286 个提交。冲突 8 处:
- apps/desktop/src/shell/DesktopShellEnvironment.ts:fork 的代理端点与绕过列表补全、上游 pingdotgg#24623 的 Android SDK 补全两段都保留,先代理后 Android SDK。
- apps/server/src/mcp/McpHttpServer.ts:layerTools 里 fork 的 layerPluginAgentTools 与上游的 layerMessageToolkit 都保留。
- apps/server/src/peer/RemoteDelegation.ts:服务对象两边字段合并(fork 的 checkout、finishedCheckout、place 与上游 pingdotgg#24475 的 runStatus)。
- apps/server/src/peer/RemoteDelegation.test.ts:makeLaptop 参数取上游的 beforeFollow(第 4 个,保持上游调用不变)再接 fork 的 load、descriptor,fork 唯一传这两个参数的调用补一个 undefined;层组合取上游的 ThreadManagement 包装,再接 fork 的 layerForwarding(代替 PeerForwarding.layer)。
- apps/server/src/provider/agentContextBudget.json:取上游 claude/codex 实测值,mcpToolListJsonBytes 按合并后实测 50432。
- apps/web/src/components/ChatMarkdown.tsx:上游 pingdotgg#36364 的 agentRoots 接在 fork 提到组件层的 otherProjectRoots 上。
- apps/web/src/components/DiffPanel.tsx:fork 的插件 reveal 与上游 pingdotgg#36606 的 trimEnd 都保留(trimEnd 只作用于回合差异的路径)。
- evals/mcp-tool-use/cases/orchestration.ndjson:两边新增的用例都保留。

更新说明(nightly 20261114.4682)
桌面 / 网页
- 智能体可以用主题色和 CSS 改 T3 Code 的外观(主题编辑器)
- 新开的浏览器标签按默认缩放与外观打开;Agent 从链接打开的新标签不再抢走输入框焦点;鼠标前进后退留在浏览器标签内
- Agent 在 cd 进去的检出里引用的文件链接能打开对应文件;文件预览选区滚动后复制仍是所选行;回合差异超出大小上限时会说明不完整
- 删除定时任务前先确认;去掉常规的成功通知;运行中等待前台子代理时显示原因而不是「思考中」
- 修复:模型选择不再继承另一个模型的特性、重新创建的文件夹不再显示已删文件、清屏保留终端输入模式、粘贴的 URL 与路径保留下划线、Linux 中键点击空白处不再粘进输入框等

移动端(需更新商店版才有)
- 线程列表的项目筛选先列最近活跃的项目;新线程从当前筛选的项目开始;已是项目的文件夹再次添加会直接打开
- 修复 iOS 引用块长按遮挡、Android 返回键、iPhone 上 HTML 预览内联播放视频等问题

服务端与 Agent
- 停止的提供方线程可原生恢复;Codex 的 Stop 迟迟不完成时提供 Force stop;delegate_task 子任务以 Codex 子代理启动
- 新线程首轮启动更快;线程列表只为返回的这一页构建元数据;多处线程读取不再读全部历史
- T3 Connect 新设备需要批准;其他网站不能再嵌入网页版;提供方登录链接只打开网页地址
- Git:尊重跟踪分支配置的推送远端、轮次差异跟随分支切换、远端删掉的默认分支不再用于新建 worktree 线程;GitLab、Azure DevOps、Forgejo 多处修复
- 修复:网络挂载卡住时启动进程不再冻结服务端、btrfs 上数据库目录关闭写时复制、远端委派任务的跟随者出错后不再一直显示运行中、Claude 可完整展示轮次中途的文字、OpenCode/Cursor/Pi 多处用量与子代理问题等

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bugfix Fix PR opened by an issue lead; enters the PR loop pr:needs-verification Reviewed and green; needs a run on a desktop, Android or iOS device and captures posted size:M 30-99 changed lines (additions + deletions). vouch:trusted Author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants