Skip to content

fix(server): preserve typed requirements as the RPC group grows - #23813

Merged
juliusmarminge merged 2 commits into
mainfrom
fix/issue-22364
Oct 22, 2026
Merged

juliusmarminge merged 2 commits into
mainfrom
fix/issue-22364

Conversation

@juliusmarminge

@juliusmarminge juliusmarminge commented Oct 22, 2026 •

Copy link
Copy Markdown
Member

Problem

Adding six empty methods to the 198-method WsRpcGroup makes the server typecheck fail with TS2589 and TS377030: layer requirements degrade to any. The same probe passes without those methods.

Change

Register the existing handlers through two disjoint RPC groups and merge their contexts. This reduces Effect's handler-requirements type expansion while preserving handler types, middleware, and the complete server RPC group.

Scope and approval

Fixes https://git.cafe/pingdotgg/t3code/issues/22364

Triaged bug via the automated issue flow: #22364.

Verification

  • Server typecheck: passes normally and with six (204 total) and 60 (258 total) additional probe methods; before the fix, 204 fails with 22 errors.
  • Post-merge 204-method typecheck: exit 0, zero errors (captured summary).
  • Existing WebSocket tests: 6 passed. Targeted lint and formatting passed with no new findings.
  • Real isolated dev server: authenticated server.getSettings and scheduledTasks.list both returned success on the same WebSocket, which closed cleanly with code 1000. This exercises both handler partitions.
  • No render paths changed; visual fixture matrix is empty. No platform-specific surface is unverified.
  • Headroom remains finite: the 318-method stress probe still fails. The transcript records that result and distinguishes captured diagnostics from reported compiler exit codes.

Compiler and runtime evidence · compiler probe · runtime probe. Evidence compares 044f07257c with ba593c8ca3; current main was subsequently merged and scoped checks rerun.

Made with Claude Opus 5.5 through Claude Code and GPT-6.1-Sol through Codex in T3 Code.

Verification log

Round 2, 2026-10-22. Reviewed head de44c6e1b7, merge-base 22840ab943. No round-1 verification log was present.

  • Reviewer A — Codex gpt-6.1-sol: VERDICT: MERGE. Review transcript.
  • Reviewer B — claudeAgent claude-opus-5-5: VERDICT: MERGE. Review transcript. Claude started successfully; no fallback.
  • Both reviewed the full committed diff and found no blockers: 198 RPCs are covered exactly once, in 104/94 partitions, with authorization and instrumentation preserved; the full group still drives dispatch. Picks retain precise handler types. Context merging adds bounded linear work during WebSocket layer construction, with no added per-request work. No materially smaller correct shape was identified. The direct count supersedes reviewer B's approximate count; its opening “costs nothing” means no per-request work, not zero construction cost.
  • Proof audit — VERDICT: SUFFICIENT. Fresh +6 probe at head: vp run typecheck scoped to apps/server, exit 0, zero errors. Same installed worktree and probe with only merge-base ws.ts: exit 2, 20 TS377030 requirement-channel errors. This rerun emitted no TS2589 diagnostic; the body's 22-error result is historical, not the count observed here. agent-job was absent. Probe files were restored to head.
  • Live isolated server at head, seeding disabled (T3CODE_DEV_SEED=0, --no-seed), fresh --home-dir /tmp/ev-23813/home: server.getSettings and scheduledTasks.list both succeeded on one WebSocket. With only orchestration:read, server.updateSettings {patch:{}} was rejected with EnvironmentAuthorizationError, missing settings:write. Clean close 1000. No real T3 database was read, copied, opened or seeded.
  • The +60/318-method probes and six WebSocket tests remain historical evidence; this round did not rerun them. Finite headroom remains disclosed. Server port-owner PID was recorded and cwd-checked before shutdown; the owned runner was stopped. Temporary state and the review worktree are removed as the final cleanup step.

Audit transcript · Full sanitized proof bundle. Compiler wrapper exits, full compiler logs, partition counts, runtime probe/results, and both review transcripts are included. No credentials or databases are uploaded.

Model/harness: proof audit and synthesis by GPT-6.1-Sol through Codex in T3 Code; independent reviews by GPT-6.1-Sol through Codex and Claude Opus 5.5 through claudeAgent.

juliusmarminge and others added 2 commits October 22, 2026 19:58
RpcGroup.toLayer types each handler's requirements by scanning every RPC in
the group, so the cost grows with handlers x RPCs. Near 200 WebSocket methods
it crossed TypeScript's instantiation limit, the layer's requirements fell
back to `any`, and typecheck failed (TS2589 / TS377030).

Register the handlers through two disjoint groups built from the same
middleware-wrapped RPCs, which halves the cost. Handler behavior, contracts,
and the layer's requirement, error, and output types are unchanged.

Fixes #22364

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@github-actions github-actions Bot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:M 30-99 changed lines (additions + deletions). labels Oct 22, 2026
@github-actions

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 −7 B (−0.1%) 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 −7 B (−0.6%) 2.0 KiB ✅
Codex Live turn WebSocket decoded 20.9 KiB 20.9 KiB 0 B (0.0%) 29.3 KiB ✅
Codex Live turn messages 2 2 0 (0.0%) 8 ✅
Claude Total thread wire 5.0 KiB 5.0 KiB +7 B (+0.1%) 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 +7 B (+0.6%) 2.0 KiB ✅
Claude Live turn WebSocket decoded 21.2 KiB 21.2 KiB 0 B (0.0%) 29.3 KiB ✅
Claude Live turn messages 2 2 0 (0.0%) 8 ✅

Baseline: 22840ab · PR result: de44c6e · 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.

@coderabbitai

coderabbitai Bot commented Oct 22, 2026 •

Copy link
Copy Markdown
Contributor

Review in Change Stack →

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration
📥 Commits

Reviewing files that changed from the base of the PR and between 22840ab and de44c6e.

📒 Files selected for processing: 1
  • apps/server/src/ws.ts

Limit details: You’ve used all 10 included reviews currently available.

📝 Walkthrough

The WebSocket server now divides RPC requests into two groups based on tag prefixes. It converts each handler subset with its corresponding RPC group and merges the resulting contexts.

Changes: WebSocket RPC partitioning

Layer / File(s) Summary
Partition RPC handlers and merge contexts
apps/server/src/ws.ts
The server partitions tags with the server, pullRequests, provider, and orchestration prefixes from all other tags. It converts each handler subset through its RPC group and merges the resulting contexts.

Priority: ➖ Normal

Estimated code review effort: 2 (Simple) | ~10 minutes

Change: Bug fix · Severity of issue fixed: Low

Suggested reviewers: t3dotgg

Merge Risk: ⚪ Minimal · up to de44c

No actionable merge-blocking risk was found in the RPC partitioning change.

Pre-merge checks: Passed 3 · Failed 1

Failed Failed checks: 1 warning

Check name Status Explanation Resolution
Description check Warning The description clearly covers the problem, change, scope, verification results, limitations, evidence, and agent usage. The Scope and approval section links the triaged issue but does not include exp… Add the maintainer approval comment that confirms the fix direction and scope, or explain why this focused fix qualifies for the obvious-bug exemption without prior approval.
Passed Passed checks: 3 passed
Check name Status Explanation
Title check Passed The title clearly identifies the server fix and its purpose: preserving typed requirements as the RPC group grows.
Linked Issues check Passed Issue #22364 asks that the server typecheck keep layer requirements typed as WsRpcGroup grows past about 200 methods. The issue lists group splitting as a possible direction, not an acceptance criteri…
Out of Scope Changes check Passed The whole-PR diff against the merge base changes only apps/server/src/ws.ts, as shown by the per-file diff and the raw summary. The additions are an effect/Context import, an RpcGroup import, the pref…
Full details: Linked Issues check

Explanation

Issue #22364 asks that the server typecheck keep layer requirements typed as WsRpcGroup grows past about 200 methods. The issue lists group splitting as a possible direction, not an acceptance criterion. The whole-PR diff (mergeBase 22840ab to head de44c6e) changes apps/server/src/ws.ts only. It partitions ServerWsRpcGroup.requests into two disjoint sub-groups: tags starting with server, pullRequests, provider, or orchestration, and all other tags. layerWsRpc now builds each subset with toHandlers and merges the resulting contexts with Context.merge, instead of one ServerWsRpcGroup.toLayer call. The two predicates are complementary, so every RPC keeps a handler. The handlers object is type-checked against each Pick, so handler types are kept. ServerWsRpcGroup, which includes the RpcInstrumentation middleware, is still the source of each Rpc. This addresses the reduced type-expansion cost described in the issue. The typecheck results (204 and 258 probe methods passing, 318 still failing) and the runtime WebSocket check are author-reported through external links. I did not run them. No automated test was added to guard group size, but the issue does not require one.

Full details: Out of Scope Changes check

Explanation

The whole-PR diff against the merge base changes only apps/server/src/ws.ts, as shown by the per-file diff and the raw summary. The additions are an effect/Context import, an RpcGroup import, the prefix-based split groups with their type guards, and the replacement of the single toLayer call with the two-group handler merge. Each change supports the typecheck fix for #22364. The PR description's references to render paths, visual fixtures, and tooling notes do not map to code changes in this diff. I did not inspect the full list of changed files beyond the diff for ws.ts. The raw summary lists no other files.

Full details: Description check

Explanation

The description clearly covers the problem, change, scope, verification results, limitations, evidence, and agent usage. The Scope and approval section links the triaged issue but does not include explicit maintainer approval of the direction and scope or explain an exemption.

Resolution

Add the maintainer approval comment that confirms the fix direction and scope, or explain why this focused fix qualifies for the obvious-bug exemption without prior approval.

✨ Finishing Touches
📝 Generate docstrings
  • Commit to this branch
  • Create a new PR
🧪 Generate unit tests (beta)
  • Commit to this branch
  • Create a new PR
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Comment @coderabbitai help to get the list of available commands.

@macroscopeapp

macroscopeapp Bot commented Oct 22, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved at de44c6e

Macroscope's review found this PR approvable — This is a narrowly scoped server type-system fix that splits handler-context construction while retaining the complete existing RPC group, middleware, and dispatch behavior. It introduces no product-default changes, diagnostic suppressions, schema changes, or new user-facing capability.

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

@juliusmarminge juliusmarminge added the bugfix Fix PR opened by an issue lead; enters the PR loop label Oct 22, 2026 — with GitCafe Production
@juliusmarminge juliusmarminge added pr:gate-failed A land gate failed pr:in-progress A lead is working on this PR pr:ready Every gate passed; waits for Julius's land label and removed pr:gate-failed A land gate failed pr:in-progress A lead is working on this PR labels Oct 22, 2026
@juliusmarminge
juliusmarminge merged commit cf3acd9 into main Oct 22, 2026
49 checks passed
@juliusmarminge
juliusmarminge deleted the fix/issue-22364 branch October 22, 2026 22:24
github-actions Bot added a commit to omarcresp/t3code-flake that referenced this pull request Oct 23, 2026
## What's Changed
* fix(server): keep subagent transcript updates off shell stream by @Yash-Singh1 in pingdotgg/t3code#23783
* fix(deps): pin all patched package versions by @juliusmarminge in pingdotgg/t3code#23798
* docs: document the GitCafe mirror and refresh the dev setup by @juliusmarminge in pingdotgg/t3code#23808
* fix: no more em dashes in product copy by @t3dotgg in pingdotgg/t3code#23799
* chore(mobile): bump Clerk Expo SDKs to the new native client sync by @wobsoriano in pingdotgg/t3code#23047
* fix(mobile): capture folded and unfolded Duo store screenshots by @juliusmarminge in pingdotgg/t3code#23849
* fix(server): preserve typed requirements as the RPC group grows by @juliusmarminge in pingdotgg/t3code#23813
* fix(server): wake PR watches when no checks report by @juliusmarminge in pingdotgg/t3code#23863
* fix(server): resume Codex parents after native children finish by @juliusmarminge in pingdotgg/t3code#23840
* fix(gitcafe): authored lists, merge progress, and author reviews match git.cafe by @juliusmarminge in pingdotgg/t3code#23887
* fix(forgejo): merges follow the repository's delete-branch setting by @juliusmarminge in pingdotgg/t3code#23471
* fix(web): keep PR check counts in sync by @juliusmarminge in pingdotgg/t3code#23548
* fix(server): speed up shell snapshots on large databases by @Yash-Singh1 in pingdotgg/t3code#23751
* fix(server): keep managed Codex token renewal in the server by @juliusmarminge in pingdotgg/t3code#21786
* fix(server): renew active managed Codex turns through native auth by @juliusmarminge in pingdotgg/t3code#21787
* feat(web): telemetry export settings show where the running endpoint came from by @yordis in pingdotgg/t3code#23713
* fix(ui): preserve tool icon detail in light mode by @juliusmarminge in pingdotgg/t3code#23896
* fix(mcp): accept GitCafe pull request URLs in link/unlink/watch tools by @juliusmarminge in pingdotgg/t3code#23899
* feat(settings): add thread title instructions by @CadenEl in pingdotgg/t3code#21882

## New Contributors
* @CadenEl made their first contribution in pingdotgg/t3code#21882

**Full Changelog**: pingdotgg/t3code@v0.1.2-nightly.20261022.3541...v0.1.3-nightly.20261023.3553

Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.1.3-nightly.20261023.3553
vedprakash2302 added a commit to vedprakash2302/Cody that referenced this pull request Oct 23, 2026
Brings in upstream through 56c365c (pingdotgg#23967).

- ws.ts: kept Cody's side chat imports next to upstream's Context import (pingdotgg#23813). Side chat RPCs now register through upstream's split handler groups and need no other change.
- Reviewed, no change needed: approval feedback (pingdotgg#23657) is main-composer only, side chats keep button approvals; subagent transcript filtering on the shell stream (pingdotgg#23783) runs before Cody's side chat filter; SQLite reader routing (pingdotgg#23902) and faster shell snapshots (pingdotgg#23751) leave side chat reads intact; Git output parsing (pingdotgg#23953) does not touch Cody's base-ref resolution; offline new-thread fix (pingdotgg#23967) keeps Cody's worktree base ref; Codex token renewal (pingdotgg#21786, pingdotgg#21787) still returns through Cody's URL scheme.
- No superseded or adapted patches in this range.
- Sync notes: Cody copy must pass upstream's no-em-dash lint (pingdotgg#23799).
permissionBRICK added a commit to permissionBRICK/construct-t3-builds that referenced this pull request Oct 23, 2026
Upstream T3 Code 0.1.3-nightly.20261023.3553 (pingdotgg/t3code#23813) no
longer builds the ws handler layer with ServerWsRpcGroup.toLayer(); it
registers the handlers as two disjoint groups derived from ServerWsRpc and
serverWsRpcs. The transform that omitted Construct's RPCs from toLayer()
therefore had no anchor.

Omit Construct's RPCs where upstream derives those groups instead: from the
ServerWsRpc type and from ServerWsRpcGroup.requests. RpcServer still serves the
full ServerWsRpcGroup, with Construct's handlers from constructWsRpcHandlers.

The nightly voice input test overlay also gets the release inventory's
explicit fields, since parameter properties fail upstream's
erasableSyntaxOnly typecheck.
vladknysh pushed a commit to vladknysh/t3code that referenced this pull request Oct 23, 2026
mvkvc added a commit to cloudloom-ai/t3code that referenced this pull request Oct 23, 2026
* refactor(web): timeline user message rows and context chips live in their own files (pingdotgg#22676)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* refactor(web): timeline assistant and orchestration event rows live in their own files (pingdotgg#22677)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* refactor(web): timeline row derivation, position restore and find reader live in hooks (pingdotgg#22682)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* refactor(web): the command palette's theme items live in their own file (pingdotgg#22679)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* refactor(web): the command palette's thread items come from their own hook (pingdotgg#22687)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* refactor(web): the command palette's project items and pure helpers live in their own files (pingdotgg#22699)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* refactor(web): the command palette's add-project views are components (pingdotgg#22707)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* feat(cli): start, message, and read threads from the terminal with t3 thread (pingdotgg#22732)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* refactor(web): composer attachment tiles live in their own component (pingdotgg#22689)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* refactor(web): resting image previews and queued attachments are their own components (pingdotgg#22719)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* refactor(web): composer mode controls and footer actions live in ComposerFooterControls (pingdotgg#22720)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* refactor(web): typing no longer re-renders the composer model picker (pingdotgg#22721)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* refactor(web): composer suggestion lists are built by useComposerMenuItems (pingdotgg#22722)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* refactor(web): the sidebar's thread rows live in their own file (pingdotgg#22696)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* refactor(web): sidebar list markers and draft rows live in their own files (pingdotgg#22729)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* feat(dev): first dev start seeds real data and warms deps (pingdotgg#22744)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* refactor(web): the pull requests column lives in its own component (pingdotgg#22671)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* refactor(web): the pull request header's crumbs, title editor and base branch live in their own components (pingdotgg#22672)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* refactor(web): the pull request header's actions live in their own components (pingdotgg#22702)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* refactor(web): the pull request detail loader lives in its own hook (pingdotgg#22703)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* refactor(web): the pull request list's rows read the speed-mode modifier themselves (pingdotgg#22704)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* refactor(web): the pull requests page's scope and grouping hooks live in their own module (pingdotgg#22705)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* refactor(web): the pull requests route only validates its search; the page lives under components (pingdotgg#22706)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* perf(web): Shift re-renders only each row's quick-action group (pingdotgg#22726)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* refactor(web): the pull request list's grouping helper lives in a logic module (pingdotgg#22727)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* refactor(web): chat markdown code blocks live in their own module (pingdotgg#22690)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* refactor(web): the Mermaid code block lives in its own component file (pingdotgg#22691)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* refactor(web): chat markdown tables and details live in their own components (pingdotgg#22692)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* refactor(web): chat markdown links and file chips live in their own modules (pingdotgg#22693)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* refactor(web): chat markdown images and videos live in their own module (pingdotgg#22694)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* refactor(web): ChatView's module-level helpers live in their own files (pingdotgg#22665)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* refactor(web): ChatView's persistent terminal drawers live in their own component (pingdotgg#22680)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* refactor(web): ChatView's right panel lives in its own component (pingdotgg#22700)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* refactor(web): ChatView's timeline follow and anchoring lives in useTimelineFollow (pingdotgg#22701)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* refactor(web): ChatView's machine and server-update banners live in useSystemComposerBanners (pingdotgg#22710)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* refactor(web): ChatView's subagent, goal, background-work and branch banners are built in ThreadActivityBanners (pingdotgg#22725)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* refactor(web): ChatView's draft machine routing lives in useDraftEnvironmentRouting (pingdotgg#22728)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* refactor(web): ChatView's send preparation is pure functions in ChatView.logic (pingdotgg#22734)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* refactor(web): the archived threads settings page lives in its own file (pingdotgg#22666)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* refactor(web): the typography settings section lives in its own file (pingdotgg#22667)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* refactor(web): the appearance settings page lives in its own file (pingdotgg#22668)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* refactor(web): the background activity setting and its dialog live in their own file (pingdotgg#22669)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* refactor(web): the connections page's pure helpers live in ConnectionsSettings.logic (pingdotgg#22683)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* refactor(web): authorized clients and endpoint rows live in their own file (pingdotgg#22684)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* refactor(web): saved and T3 Connect environment rows live in their own file (pingdotgg#22685)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* perf(server): skip the macOS xcrun git shim (pingdotgg#22759)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* docs(agents): read vendored .repos with git show when sparse-excluded (pingdotgg#22764)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* fix(web): ⌘Z undoes a settle even when the composer has focus (pingdotgg#22607)

Co-authored-by: ishaanko <ishaanko.mail@gmail.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* feat(scripts): one command checks what the branch changed (pingdotgg#22767)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* fix(scripts): check:changed no longer skips knip after a removed import (pingdotgg#22784)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* perf(dev): faster first load for shared dev servers (pingdotgg#22776)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* fix(server): stalled clones say "Stalled" instead of a frozen speed (pingdotgg#22780)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* fix(web): steers split a finished turn's work instead of stacking under it (pingdotgg#22783)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* fix(web): images on their own line no longer sit beside their label (pingdotgg#22787)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* fix(release): include pnpm hook in Vercel uploads (pingdotgg#22813)

* fix(release): keep Vercel warnings out of deployment URLs (pingdotgg#22817)

* fix(queue): send selected held messages when a thread is stopped (pingdotgg#22790)

* fix(server): delegated Claude children follow your subagent cache TTL setting (pingdotgg#22841)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* fix(server): t3 pair in a worktree no longer falls back to the live install (pingdotgg#22855)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* fix(server): avoid expensive diff minimization in status refreshes (pingdotgg#21872)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* fix(codex): keep every path of a multi-file patch (pingdotgg#22541)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: GPT-6.1 Sol <noreply@openai.com>

* fix(gitlab): merge request diffs page 30 files at a time so GitLab 15.7 to 17.10 answer (pingdotgg#21909)

* fix(server): keep Antigravity question options and no-custom-answer flag in V2 (pingdotgg#22019)

* fix(server): commit prompts no longer repeat CLAUDE.md when it matches AGENTS.md (pingdotgg#22848)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* fix(mcp): point a bare thread uuid at its mcp: thread in thread_not_found (pingdotgg#22452)

* fix(opencode): out-of-funds failures show OpenCode's message instead of a usage limit (pingdotgg#22596)

* fix(shared): accept a pasted ChatGPT callback URL that is missing http:// (pingdotgg#21750)

* fix(server): the background service picks up JAVA_HOME from the login shell (pingdotgg#22856)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* fix(server): answered questions say "already answered" instead of "not found" (pingdotgg#22850)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* fix(desktop): an abandoned browser sign-in no longer blocks T3 Connect for 3 minutes (pingdotgg#22903)

On desktop, an abandoned browser sign-in blocked every T3 Connect sign-in for 3 minutes. A new attempt now replaces the stale Clerk flow, and a Cancel bar resets the sheet. Takeover of pingdotgg#22708.

Co-authored-by: steve-ai-vibe <steve.ai.vibe@gmail.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* fix(server): agents get a short, current model list instead of a 55k-character catalog dump (pingdotgg#22889)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* docs(agents): proof for a bug fix depends on the bug (pingdotgg#23008)

Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>

* fix(server): removing a worktree on Windows no longer deletes what its junctions point to (pingdotgg#21099)

Co-authored-by: sheehanmunim <80079528+sheehanmunim@users.noreply.github.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: Julius Marminge <julius0216@outlook.com>

* perf(web): a streaming thread re-renders only its own sidebar row (pingdotgg#22730)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* refactor(web): the add environment dialog owns its form state (pingdotgg#22686)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* fix(desktop): use Clerk's upstream fix for abandoned browser sign-ins (pingdotgg#23038)

* feat: show automation messages as compact timeline rows (pingdotgg#22638)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* feat(server,web,mobile): approvals in full access say why Claude asked (pingdotgg#22546)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* feat(claude): idle compaction has a global default and per-instance overrides (pingdotgg#23037)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* perf(web): typing no longer re-renders the traits picker or attach button (pingdotgg#23040)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* refactor(web): the composer's layout and provider hooks live in their own files (pingdotgg#23042)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* refactor(web): the prompt stash lives in useComposerStash (pingdotgg#23046)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* refactor(web): composer context imports live in useComposerContextImport (pingdotgg#23048)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* refactor(web): composer file intake lives in useComposerAttachmentIntake (pingdotgg#23049)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* refactor(web): the composer's footer controls render in ComposerControlsBar (pingdotgg#23058)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* refactor(web): composer key handling lives in useComposerCommandKey (pingdotgg#23060)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* refactor(web): ChatView's send paths live in useComposerSend (pingdotgg#23062)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* refactor(web): ChatView's terminal actions live in useChatTerminalActions (pingdotgg#23063)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* refactor(web): ChatView's right panel actions live in useRightPanelActions (pingdotgg#23064)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* refactor(web): ChatView's snooze, settle, and checkout actions live in useThreadLifecycle (pingdotgg#23065)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* refactor(web): ChatView's revert, rollback, and fork live in useTimelineRewind (pingdotgg#23066)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* refactor(web): ChatView's attachment preview handoff lives in useAttachmentPreviewHandoff (pingdotgg#23067)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* refactor(web): ChatView's project clone banner lives in useProjectCloneBanner (pingdotgg#23068)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* refactor(web): ChatView's model, mode, and workspace choices live in useComposerSelection (pingdotgg#23069)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* refactor(web): ChatView's pull request checkout lives in usePullRequestDraftThread (pingdotgg#23070)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* refactor(web): ChatView's thread derivations are tested functions in ChatView.logic (pingdotgg#23071)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* refactor(web): ChatView's paste-to-focus, titlebar controls, and timeline overlays move out (pingdotgg#23072)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* fix(cursor): a closed-stream write in the Cursor SDK no longer stops the server (pingdotgg#22897)

Co-authored-by: MarMarLabs <marmar9615@icloud.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* fix(server): Codex no longer offers a one-click update for installs it can't detect (pingdotgg#22504)

* fix(pi): declare properties on MCP tool schemas that omit them (pingdotgg#21822)

Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com>

* fix(server): a desktop backend whose launcher died shuts down cleanly instead of crashing (pingdotgg#22471)

* fix(mobile): chat feed no longer re-derives on every render (pingdotgg#22913)

Co-authored-by: flamboh <oliver.boorstein@gmail.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* docs(user): the outside agents guide says which addresses agents can sign in over (pingdotgg#22377)

Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com>

* fix(server): HTML preview reports a browser start error instead of an internal error (pingdotgg#22895)

Co-authored-by: ScottN-PV <snorteman@gmail.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* fix(tailscale): a timed-out tailscale probe no longer outlives its call (pingdotgg#22900)

Co-authored-by: fixfon <12512757+fixfon@users.noreply.github.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* docs(composer): queued messages follow the Follow-up behavior setting (pingdotgg#22857)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* fix(server): failed provider updates say why (pingdotgg#22506)

* test(telemetry): keep fixture PIDs from colliding with the test worker (pingdotgg#21446)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* fix(server): server tests resolve the macOS temp dir symlink (pingdotgg#21442)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* fix(scripts): mobile lint fails instead of passing when ktlint or detekt is missing (pingdotgg#22896)

Co-authored-by: Shubh <shubh@shubhxho.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* fix(server): t3_thread_read clamps oversized page sizes instead of failing (pingdotgg#22901)

Co-authored-by: fixfon <12512757+fixfon@users.noreply.github.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: grey-tsosie <45133231+grey-tsosie@users.noreply.github.com>

* fix(mobile): opening a pull request no longer crashes with "Maximum update depth exceeded" (pingdotgg#22600)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* fix(web): PR Code tab keeps its files after a refresh with an unchanged diff (pingdotgg#22917)

Co-authored-by: Rodrigo Brechard <rodrigo@clubtidy.fr>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* fix(web): finished provider updates no longer leave a hidden spinner in the sidebar (pingdotgg#22912)

Co-authored-by: 1kuna <47035140+1kuna@users.noreply.github.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* fix(composer): mentions of files like `posts.$postId.tsx` or `[id].tsx` stay chips (pingdotgg#22922)

Co-authored-by: Victor Vogel <satsdev@only21mil.xyz>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* refactor(web): resuming an interrupted run lives in its own hook (pingdotgg#23087)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* refactor(web): proposed-plan follow-ups and implement-in-new-thread live in their own hooks (pingdotgg#23091)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* refactor(web): multiple-model sends live in their own hook (pingdotgg#23094)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* refactor(web): the composer send reads its own settings and draft instead of taking them from ChatView (pingdotgg#23095)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* refactor(web): ComposerControlsBar renders without a memo() wrapper (pingdotgg#23093)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* refactor(web): chat shortcuts live with the hooks that own their actions (pingdotgg#23097)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* refactor(web): ChatView's timeline banners render in ChatBannerLane (pingdotgg#23101)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* fix(web): the branch toolbar and thread details panel stay cached while a reply streams (pingdotgg#23103)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* fix(server): scheduled tasks no longer jump to the top when toggled (pingdotgg#22899)

Co-authored-by: Victor Vogel <satsdev@only21mil.xyz>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* fix(server): Forgejo and GitCafe pull requests link to their threads again (pingdotgg#22937)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* fix(server): pushes the remote refuses say why instead of a generic failure (pingdotgg#22904)

Co-authored-by: fixfon <12512757+fixfon@users.noreply.github.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* fix(composer): typing a price no longer opens the skill menu (pingdotgg#21519)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* fix(web): thread details PR merge uses the last selected merge method (pingdotgg#22399)

* fix(web): a Usage toggle shortcut now goes back instead of staying on Usage (pingdotgg#22905)

Co-authored-by: Victor Vogel <satsdev@only21mil.xyz>
Co-authored-by: GPT-6.1 Sol <noreply@openai.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* fix(web): quote comment box stays on screen for long code lines (pingdotgg#22149)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* fix(web): right panel launcher letters open their surface instead of typing into the composer (pingdotgg#22898)

Co-authored-by: fixfon <12512757+fixfon@users.noreply.github.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* fix(web): ../ file links outside the workspace open as host files (pingdotgg#22853)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* fix(shared): recognize relative folder links with trailing slash (pingdotgg#22188)

Co-authored-by: macodev00 <macodev00@users.noreply.github.com>

* fix(client): usage limits skip disabled connections (pingdotgg#22936)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* fix(web): imported VS Code themes keep destructive buttons red (pingdotgg#21924)

* fix(shared): Azure DevOps repositories with a space in the name list their pull requests (pingdotgg#22782)

* fix(opencode): cancelled todos no longer keep the todo list running (pingdotgg#22938)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* fix(web): copy to machine clones the fork, not its upstream (pingdotgg#22492)

* fix(server): JetBrains IDEs open file links at the right column (pingdotgg#22826)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* fix(server): sync pull request draft status changes (pingdotgg#22832)

* test(web): chat shortcut test types through the composer handle (pingdotgg#23126)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* Merge commit from fork

A markdown image such as ![x](file://attacker.test/share/cat.jpg), or a raw
\\host\share path, was classified as a host file. Rendering it asked the
server for a signed asset URL, and the server's realpath on the resulting UNC
path made Windows open an SMB session and send the user's NetNTLMv2 response
to the attacker's host, with no click and no tool call. File-link chips did
the same through filesystem.getMetadata, which stats every absolute path, and
storage cleanup stats the store paths in a worktree's pnpm manifest, which an
agent can write.

Network paths (two leading separators, as Windows reads them: \\h, //h, /\h)
now only resolve inside the thread's project, so projects on a share keep
working:

- clients block them in markdown images and stop treating them as file links
- the web stops asking for their metadata
- the server refuses them for media assets and file reads outside the
  project, never stats one for metadata, and storage cleanup ignores a pnpm
  manifest that names one
- each check hands the filesystem the resolved path it approved, since
  Windows reads a `\\?\` path as written, `..` included

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* fix(source-control): merge messages drop Claude Code's current claude.com footer (pingdotgg#23133)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* fix(build): pin Node 26.12.1 for development and standalone releases (pingdotgg#23165)

* fix(mobile): keep Duo toolbar actions clear of workspace tabs (pingdotgg#22976)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* fix(mobile): respect Duo safe areas in overlays (pingdotgg#22977)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* fix(mobile): retain resting scroll offsets through Duo inset changes (pingdotgg#22978)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* fix(mobile): deliver the first tab selection after Duo folding (pingdotgg#22979)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* fix(mobile): use native full-width sheets on iPhone Duo (pingdotgg#22980)

Co-authored-by: Pixel Perfect <me@pixp.cc>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* fix(mobile): the pull requests tab's empty detail asks for a pull request (pingdotgg#23143)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* fix(mobile): the iPhone Duo keeps list titles through folds and unfolds with its sidebar (pingdotgg#23144)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* fix(mobile): the iPhone Duo searches from a field at the bottom of its list (pingdotgg#23145)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* fix(mobile): a closed search no longer risks freezing the app (pingdotgg#23146)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* fix(mobile): folding the Duo keeps the thread's end or the reader's line in place (pingdotgg#23147)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* fix(mobile): the iPhone Duo's search field and composer line up with its tab bar (pingdotgg#23148)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* fix(mobile): Screens 5.0.0-t3.36 stops an iPhone Duo unfold crash (pingdotgg#23149)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* fix(mobile): the iPhone Duo's inspector panes use the full column (pingdotgg#23150)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* fix(gitcafe): show line counts on linked and listed pull requests (pingdotgg#22633)

* docs(import): correct conversation size and batch limits (pingdotgg#23226)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* fix(server): stop abandoned turns before continuing threads (pingdotgg#23169)

* feat(server): export how long runs take and how they end (pingdotgg#22094)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* fix(mobile): new-thread heading clears the iPad header (pingdotgg#23206)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* fix(pi): fork completed turns while the next turn is running (pingdotgg#23052)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* fix(mobile): drafts swipe to discard and every row move animates (pingdotgg#23205)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* feat(server): webhook filters fan out over arrays with a [] path wildcard (pingdotgg#23282)

Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>

* fix(web): Arabic and Hebrew text reads and navigates right to left (pingdotgg#22777)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* fix(client-runtime): refresh Git refs when the RPC session changes (pingdotgg#23314)

* fix(web): cap list layout passes to prevent React error 185 (pingdotgg#23315)

* fix(mobile): align iPad composer without shifting on keyboard focus (pingdotgg#23355)

* feat(gitcafe): request reviewers and apply labels on GitCafe pull requests (pingdotgg#23034)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* fix(source-control): clones retry over HTTPS when the SSH key is refused (pingdotgg#23170)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* fix(mobile): the iOS composer reopens where you left a long draft (pingdotgg#23096)

Co-authored-by: Vishal <vishalprashantdoshi@gmail.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: PR Batch Tester <agent@local.test>
Co-authored-by: Vishal Doshi <vdoshi96@users.noreply.github.com>

* fix(mobile): preserve new-thread drafts and native header layout (pingdotgg#23366)

* feat: ChatGPT Business usage limits offer a copyable admin request (pingdotgg#23361)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* fix(web): paused sidebar videos stop reloading after every command (pingdotgg#23106)

Co-authored-by: PR Batch Tester <agent@local.test>
Co-authored-by: Nikita Maximilian Grimm <github@nikitagrimm.de>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* chore(typecheck): typescript is the tsc-rs drop-in, no effect-tsgo patch (pingdotgg#23023)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* fix(mobile): Dynamic Island status no longer wraps next to other Live Activities (pingdotgg#23327)

Fixes pingdotgg#15682. Takes over pingdotgg#23035.

Co-authored-by: Taylor Dolezal <onlydole@users.noreply.github.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* perf(web): streamed reply text no longer re-renders ChatView (pingdotgg#23117)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* perf(web): visit marks during a reply no longer re-render ChatView (pingdotgg#23124)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* fix(server): a Claude agent stops when the server that started it dies (pingdotgg#23389)

Co-authored-by: PR Batch Tester <agent@local.test>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* fix(server): SSH hosts no longer keep every old 300 MB runtime after desktop updates (pingdotgg#23113)

Co-authored-by: PR Batch Tester <agent@local.test>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* fix(settings): older clients connect again after idle compaction modes (pingdotgg#23454)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* fix(mobile): unify draft and thread navigation and composer behavior (pingdotgg#23467)

* ci: setup survives npm registry outages (pingdotgg#23582)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* feat(web,mobile): messages from other agents fold into one-line rows (pingdotgg#23135)

Co-authored-by: PR Batch Tester <agent@local.test>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* fix(web): subagent bar keeps model and status readable in narrow chat columns (pingdotgg#23502)

Co-authored-by: PR Batch Tester <agent@local.test>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* fix(chat): mark tool images beyond the preview limit (pingdotgg#23595)

Co-authored-by: GPT-6.1 Sol <noreply@openai.com>

* fix(web): provider updates no longer pop toasts on launch (pingdotgg#23233)

* fix(server): probe the Windows startup environment asynchronously (pingdotgg#21720)

* fix(usage): count initial Codex requests with inherited totals (pingdotgg#23729)

* chore(mobile): bump app version to 2.1.0

Co-authored-by: codex <codex@users.noreply.github.com>

* fix(web): let toast content use the full accordion width (pingdotgg#23777)

* fix(web): sidebar follows the active thread after history navigation (pingdotgg#23519)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* fix(server): keep subagent transcript updates off shell stream (pingdotgg#23783)

* fix(deps): pin all patched package versions (pingdotgg#23798)

* docs: document the GitCafe mirror and refresh the dev setup (pingdotgg#23808)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* fix: no more em dashes in product copy (pingdotgg#23799)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* chore(release): prepare v0.1.2

* chore(mobile): bump Clerk Expo SDKs to the new native client sync (pingdotgg#23047)

Co-authored-by: Julius Marminge <julius0216@outlook.com>
Co-authored-by: Claude Haiku 5.5 <noreply@anthropic.com>

* fix(mobile): capture folded and unfolded Duo store screenshots (pingdotgg#23849)

* fix(server): preserve typed requirements as the RPC group grows (pingdotgg#23813)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* fix(server): wake PR watches when no checks report (pingdotgg#23863)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* fix(server): resume Codex parents after native children finish (pingdotgg#23840)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* fix(gitcafe): authored lists, merge progress, and author reviews match git.cafe (pingdotgg#23887)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* fix(forgejo): merges follow the repository's delete-branch setting (pingdotgg#23471)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* fix(web): keep PR check counts in sync (pingdotgg#23548)

* fix(server): speed up shell snapshots on large databases (pingdotgg#23751)

Co-authored-by: Julius Marminge <julius0216@outlook.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* fix(server): keep managed Codex token renewal in the server (pingdotgg#21786)

* fix(server): renew active managed Codex turns through native auth (pingdotgg#21787)

* feat(web): telemetry export settings show where the running endpoint came from (pingdotgg#23713)

Co-authored-by: Julius Marminge <julius0216@outlook.com>
Signed-off-by: Yordis Prieto <yordis.prieto@gmail.com>

* fix(ui): preserve tool icon detail in light mode (pingdotgg#23896)

* fix(mcp): accept GitCafe pull request URLs in link/unlink/watch tools (pingdotgg#23899)

Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>

* feat(settings): add thread title instructions (pingdotgg#21882)

Co-authored-by: Yash Singh <saiansh2525@gmail.com>

* fix(mobile): undo toasts keep their action on one row (pingdotgg#23910)

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* docs(connect): correct the relay webhook endpoint key (pingdotgg#23526)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* fix(mobile): center Android composer text and pad wrapped drafts (pingdotgg#23829)

* fix(server): wake PR watches when remaining CI checks finish (pingdotgg#23904)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* fix(mobile): the empty composer row shows only the provider icon (pingdotgg#23570)

* fix(server): route SQLite reads around writer contention (pingdotgg#23902)

* fix(claude): route approval feedback to the requesting agent (pingdotgg#23657)

* fix(web): align pull request file counts with diff stats (pingdotgg#23905)

* fix(web): task durations over an hour no longer wrap in the tasks panel (pingdotgg#13472)

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
Co-authored-by: Julius Marminge <julius0216@outlook.com>

* fix(server): preserve Codex sign-in guidance in usage notices (pingdotgg#17055)

Co-authored-by: Codex (gpt-6-astra) <noreply@openai.com>
Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>

* fix(server): restore Claude subscription usage through proxies (pingdotgg#12069)

Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>

* fix(server): Forgejo skipped jobs no longer keep a pull request watch pending (pingdotgg#16668)

Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>

* fix(mobile): move Android undo toasts above bottom navigation (pingdotgg#23928)

* perf(server): skip unused Git output line parsing (pingdotgg#23953)

Co-authored-by: Jet <jet@extremist.software>
Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>

* fix(server): abort interrupted ACP MCP fetches (pingdotgg#23955)

Co-authored-by: kiiwee <6160452+kiiwee@users.noreply.github.com>
Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>

* fix(web): new threads no longer hang when a project's machine is offline (pingdotgg#23967)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* fix(pi): stop blank input placeholders from failing the run (pingdotgg#23235)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* fix(cursor): fail turns that end in a transport error after commentary (pingdotgg#23273)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* test(forgejo): answer the base branch read in the skipped-checks test (pingdotgg#23952)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* fix(opencode): retry failed model catalogs until they recover (pingdotgg#23939)

* fix(server): avoid full shell read on resume (pingdotgg#23987)

* test: delete low-value tests and dead test-only exports (pingdotgg#24058)

* test(server): restore DST scheduling tests deleted in the test snap (pingdotgg#23991)

* test(web): restore project settings permission tests deleted in the test snap (pingdotgg#24011)

* test(mobile): restore clipboard secret-redaction test deleted in the test snap (pingdotgg#23980)

* fix(web): Cmd+B toggles the sidebar unless text is selected (pingdotgg#24063)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* fix(server): agent-browser and Chrome no longer outlive the agent that started them (pingdotgg#21299)

Co-authored-by: Julius Marminge <julius0216@outlook.com>
Co-authored-by: Theo Browne <me@theo.li>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* test(client-runtime): restore render scheduler tests deleted in the test snap (pingdotgg#23977)

* fix(web): cmd+k search hides subagents and favors recent, whole-word matches (pingdotgg#24032)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* test(lint): new polling loops in tests now fail lint (pingdotgg#23983)

* ci: unused dependency patches fail in check:changed, not after push (pingdotgg#23988)

* fix(desktop): PDFs in the preview can be annotated (pingdotgg#24022)

Co-authored-by: PR Batch Tester <agent@local.test>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* fix(web): instructed compact runs without a bare compaction first (pingdotgg#24008)

Co-authored-by: fixfon <12512757+fixfon@users.noreply.github.com>
Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>

* fix(desktop): reduce app crashes when a preview tab's renderer dies during agent screenshots (pingdotgg#24056)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* fix(server): Stop stops a thread's subagents again (pingdotgg#23886)

Co-authored-by: PR Batch Tester <agent@local.test>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* fix(desktop): a stuck quit no longer leaves the app unkillable (pingdotgg#23873)

Co-authored-by: PR Batch Tester <agent@local.test>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

---------

Signed-off-by: Yordis Prieto <yordis.prieto@gmail.com>
Co-authored-by: Julius Marminge <julius0216@outlook.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: Theo Browne <me@t3.gg>
Co-authored-by: ishaanko <ishaanko.mail@gmail.com>
Co-authored-by: Yash Singh <saiansh2525@gmail.com>
Co-authored-by: Lakshmi Tanmay <lakshmi@voltcrash.com>
Co-authored-by: Victor Vogel <satsdev@only21mil.xyz>
Co-authored-by: GPT-6.1 Sol <noreply@openai.com>
Co-authored-by: Igor Makowski <56691628+Mnigos@users.noreply.github.com>
Co-authored-by: fixfon <12512757+fixfon@users.noreply.github.com>
Co-authored-by: project516 <138796702+Project516@users.noreply.github.com>
Co-authored-by: steve-ai-vibe <steve.ai.vibe@gmail.com>
Co-authored-by: Dara Adedeji <76637177+SunkenInTime@users.noreply.github.com>
Co-authored-by: sheehanmunim <80079528+sheehanmunim@users.noreply.github.com>
Co-authored-by: Robert Soriano <sorianorobertc@gmail.com>
Co-authored-by: MarMarLabs <marmar9615@icloud.com>
Co-authored-by: Koushik_xd <122906171+koushikxd@users.noreply.github.com>
Co-authored-by: Taissa <202353633+tlconde@users.noreply.github.com>
Co-authored-by: flamboh <oliver.boorstein@gmail.com>
Co-authored-by: Gourav Kumar Dhiman <gkrdhiman@gmail.com>
Co-authored-by: ScottN-PV <snorteman@gmail.com>
Co-authored-by: tatsuaki watanabe <tatsuaki.w@gmail.com>
Co-authored-by: Shubh <shubh@shubhxho.com>
Co-authored-by: grey-tsosie <45133231+grey-tsosie@users.noreply.github.com>
Co-authored-by: Rodrigo Brechard <rodrigo@clubtidy.fr>
Co-authored-by: 1kuna <47035140+1kuna@users.noreply.github.com>
Co-authored-by: MarcoDotIO <Marcus.Arnett10@gmail.com>
Co-authored-by: Tristan Knight <admin@snappeh.com>
Co-authored-by: Etan Heyman <93338119+EtanHey@users.noreply.github.com>
Co-authored-by: maco <gosarmarcel7@gmail.com>
Co-authored-by: macodev00 <macodev00@users.noreply.github.com>
Co-authored-by: M4NU5 <31220123+M4NU5@users.noreply.github.com>
Co-authored-by: Louis Gollut <louis.gollut@proton.me>
Co-authored-by: Pavel Kroupa <63880977+Tabonx@users.noreply.github.com>
Co-authored-by: AKolenda <akole779@mtroyal.ca>
Co-authored-by: Lev Poznyakov <62802017+levochkaa@users.noreply.github.com>
Co-authored-by: Alex <me@pixp.cc>
Co-authored-by: maria <maria@kuuro.net>
Co-authored-by: يزن حمزه <yznhamzeh@gmail.com>
Co-authored-by: shivam <91240327+shivamhwp@users.noreply.github.com>
Co-authored-by: Vishal <vishalprashantdoshi@gmail.com>
Co-authored-by: PR Batch Tester <agent@local.test>
Co-authored-by: Vishal Doshi <vdoshi96@users.noreply.github.com>
Co-authored-by: Nikita Maximilian Grimm <github@nikitagrimm.de>
Co-authored-by: Taylor Dolezal <onlydole@users.noreply.github.com>
Co-authored-by: oliver <97427849+flamboh@users.noreply.github.com>
Co-authored-by: Utkarsh Patil <73941998+UtkarshUsername@users.noreply.github.com>
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: codex <codex@users.noreply.github.com>
Co-authored-by: Yordis Prieto <yordis.prieto@gmail.com>
Co-authored-by: Caden Elrod <76628548+CadenEl@users.noreply.github.com>
Co-authored-by: Alex Southwell <saphid@gmail.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: James Villarrubia <8172873+jamesvillarrubia@users.noreply.github.com>
Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
Co-authored-by: 洁月星 <jieyuexing@outlook.com>
Co-authored-by: Nand <nand@rizvanolli.com>
Co-authored-by: Jet <jet@extremist.software>
Co-authored-by: kiiwee <6160452+kiiwee@users.noreply.github.com>
Co-authored-by: Joseph Vidal <135430578+josephv123@users.noreply.github.com>
Co-authored-by: Theo Browne <me@theo.li>
Pipyakas pushed a commit to Pipyakas/t3code that referenced this pull request Oct 23, 2026
…dotgg#23813)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
(cherry picked from commit cf3acd9)
aorwall added a commit to aorwall/t3code that referenced this pull request Oct 24, 2026
Merges upstream `pingdotgg/t3code` `18e2742519` (base `e07595714a`, 45
commits) into the fork. Branched from `main`; no open merge PR to stack
on.

## What needs a reviewer's eye

- **tsc-rs came back through silent auto-merges.** Upstream pingdotgg#23023 made
the catalog `typescript` `npm:@tsc-rs/typescript` and dropped
`@effect/tsgo` and the `effect-tsgo patch` prepare step. Most of that
landed in `pnpm-workspace.yaml` and `package.json` with no conflict.
Restored TypeScript 7.0.2, `@effect/tsgo` and the prepare step, and
added a `typecheck-toolchain` inventory entry so the next merge checks
these files. Upstream's 25 per-package `tsc-rs --noEmit` → `tsc
--noEmit` edits converge with what the fork already had.
- **`apps/server/src/ws.ts`:** upstream now splits the RPC group in two
to keep handler requirements typed (pingdotgg#23813). That fixes the same TS2589
problem the fork's `toWsRpcLayer`/`WsRpcHandlers` cast worked around, so
I took upstream's version and dropped the cast. The fork's sandbox,
subtask and scripts handlers fall into upstream's "other" group.
- **`no-em-dash-copy` lint (pingdotgg#23799)** flagged 16 lines of fork-only copy
(sandbox panel, Moatless settings, fork dialog, preview inspector).
Rewrote them, and placeholder `"—"` is now `"-"` to match upstream.
- **`resolution-check.mjs`** now reports a path as convergence, not as a
dropped upstream change, when a three-way merge of upstream's change
onto the fork's copy is a clean no-op.

Other conflicts: `SettingsPanels.tsx` puts upstream's
`ThreadTitleInstructionsSettings` inside the
`FEATURES.serverBehaviorSettings` gate, and its search item is mapped to
the same flag. `TimelineUserMessageRow.tsx` keeps the origin chip next
to upstream's folded agent rows. `PreviewView.tsx` takes upstream's copy
and keeps the fork's inspector reason. In `AGENTS.md` I kept the fork's
text and dropped upstream's tsc-rs, "never make a PR" and GitCafe lines.
`pnpm-lock.yaml` was re-derived from upstream's copy; the fork's
`moatless-api` edge is present and there are no `@tsc-rs` entries.

Counts: 323 files landed against 348 in the upstream range. The 25-file
gap is the converged typecheck scripts plus the two `decide` files. The
fork delta went from 825 files to 797.

## Verification

`verify.mjs`: duplicate-adds, tripwires, resolution-check,
unsupported-methods (ADD 0 / DROP 0 / KEEP 2), lockfile, fmt, lint,
typecheck and build all pass. The test step has failures that are all
environmental:
- Seen in earlier merges: `t3` `RepositoryIdentityResolver` and
`GitVcsDriver` (the sandbox's git `insteadOf` rewrite),
`ServerBrowserPage` (missing chromium build), and `provider-opencode`
`OpenCodeServerLedger`.
- New: `t3` `CodexChatGptAuth` and `CodexManagedRuntime` fail with
`Untrusted IPC parent`. The cause is the sandbox's `/tmp`, which is mode
2777 with no sticky bit. Both pass (58 tests) with a private `TMPDIR`.
Registered in `gaps.md`.
- With a Playwright browser-path shim and that `TMPDIR`, `@t3tools/web`
passes 381/381 files and `t3` fails only the two `insteadOf` files.

## Feature classification

**Usable as-is**
- Messages from other agents fold into one-line rows (pingdotgg#23135). Keyed on
`createdBy: "agent"`, which the Moatless projection already sends.
- Tool images beyond the preview limit are marked (pingdotgg#23595); tool icons
keep their detail in light mode (pingdotgg#23896); toast and subagent-bar layout
fixes (pingdotgg#23777, pingdotgg#23502).
- ChatView re-render work (pingdotgg#23117, pingdotgg#23124); the sidebar follows the
active thread after history navigation (pingdotgg#23519); paused sidebar videos
stop reloading (pingdotgg#23106).
- A ChatGPT Business usage limit offers a copyable admin request
(pingdotgg#23361). It shows when the thread error carries the code.
- Provider updates no longer pop toasts on launch (pingdotgg#23233).

**Unsupported in Moatless / needs implementation**
- Thread title instructions: the `threadTitleInstructions` server
setting (pingdotgg#21882). Hidden under `FEATURES.serverBehaviorSettings` because
Moatless names its own threads.
- Telemetry export endpoint source: the `otlp*Source` and
`otlp*Variable` fields (pingdotgg#23713). This is on the diagnostics surface,
which `FEATURES.diagnostics` already gates.
- GitCafe reviewers, labels and MCP URLs (pingdotgg#23034, pingdotgg#23887, pingdotgg#23899), and
managed Codex token renewal (pingdotgg#21786, pingdotgg#21787). These belong to upstream's
own server.

**Backend behavior to consider reproducing in Moatless** (added to
[runtime
fixes](docs/fork/gaps.md#runtime-fixes-upstream-made-to-its-own-server))
- `compactIdleThreads` is a boolean on the wire again, and the mode
moved to `idleCompaction` (pingdotgg#23454).
- A PR watch records `checksAwaitedSince` and wakes its thread when no
check ever reports (pingdotgg#23863).
- Shell snapshots on large databases no longer scan every thread
(pingdotgg#23751). Subagent transcript updates stay off the shell stream
(pingdotgg#23783).
- A Codex parent resumes once its native children finish (pingdotgg#23840). A
Claude agent stops when the server that started it dies (pingdotgg#23389).
- A clone retries over HTTPS when the SSH key is refused (pingdotgg#23170).
Forgejo merges follow the repository's delete-branch setting (pingdotgg#23471).
- Assets carry a `fileRevision` that does not change when the URL is
re-signed.

Sweep: 2 new-file hits (`apps/mobile/.../ThreadScreenHost.tsx` and the
Clerk Expo patch rename). Both are outside the web surface the fork
ships, so I took them as upstream's. No new workflows.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---
Moatless task:
https://moatless.soaplabstest.com/tasks/e677a17e-2f52-4c8d-b273-27a449d05732
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:ready Every gate passed; waits for Julius's land label size:M 30-99 changed lines (additions + deletions). vouch:trusted PR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant