feat(web): attach PDFs, ZIPs, and other files to a turn - #8236

Merged
t3dotgg merged 29 commits into
mainfrom
t3code/file-attachments-web
Aug 29, 2026
Merged

feat(web): attach PDFs, ZIPs, and other files to a turn#8236
t3dotgg merged 29 commits into
mainfrom
t3code/file-attachments-web

Conversation

@t3dotgg

@t3dotggt3dotgg commented Aug 25, 2026

Copy link
Copy Markdown
Member

The file upload APIs and tolerant attachment contracts from #8235 are now on main. This PR adds the web client for them.

The composer accepts PDFs, ZIPs, and other files up to the server's advertised limit through the paperclip button or paste. Uploads start while the user types, survive draft and stash moves, and render as rows that download with the original filename. Unknown attachment types render as inert rows instead of crashing the thread.

One shared upload flow in packages/client-runtime owns verification, transfer, release, and size limits. Draft discard, project delete, stash, file removal, and send cleanup all use that flow. Interrupted uploads return as "Attach again" markers instead of disappearing.

Release warning: clients with the old image-only attachment contract cannot decode threads that contain file attachments. The compatibility work in #8235 makes the merged server contract tolerant and keeps existing mobile code from treating files as images. Hold the web release until a compatible mobile build is available. #8237 adds mobile file support.

Original work by Theo Browne with Claude Fable 5 in the Claude Code harness. Modernized by GPT-5.6 Sol in the Codex harness.


Note

Medium Risk
Touches the turn send/upload pipeline and draft persistence; threads with file attachments require a tolerant client contract, so release coordination with older mobile builds matters.

Overview
Adds generic file attachments to the chat composer (paperclip, paste, drag) alongside images, with images and files sharing the per-turn attachment cap and server-advertised size limits.

Send and upload path:ChatView snapshots images and files together, runs shared upload/capability checks before and after upload, builds optimistic file rows, and wires timeline on-demand downloads via signed asset URLs. Annotation screenshots respect the combined attachment limit so prompts do not claim crops that were not sent.

Composer UX:ChatComposer stages file rows (upload progress, retry, “attach again” after interrupted uploads), blocks send when capabilities or limits fail, and extends stash restore/save to persisted file uploads with environment checks and expiry verification.

Persistence:composerDraftStore persists file metadata (upload ids or needs-reattach markers), enforces combined limits, and handles moves across threads/environments. Plan follow-up actions hide while any composer attachment is staged (shouldShowPlanFollowUpPrompt).

Timeline: User messages render non-image attachments as download links or inert rows for unknown types. Project/sidebar draft counts include files; project delete passes thread refs when releasing draft uploads.

Reviewed by Cursor Bugbot for commit 129f2ad. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Add PDF, ZIP, and generic file attachment support to chat turns

  • Extends the chat composer to support generic file attachments alongside images, including selection via paste or paperclip button, progress tracking, and retry controls
  • Updates composerDraftStore, attachmentUploadQueue, and prompt stash store to persist file metadata, deduplicate attachments, manage upload lifecycles, and handle cross-environment moves
  • Adds server capability checks to enforce staging limits and reject non-image files on servers that lack upload support
  • Renders received file attachments in the timeline as downloadable links or buttons using generated signed URLs
  • Risk: Non-image attachments now throw an error during send if the server does not support attachment uploads; cross-environment draft moves strip source upload linkage for byte-backed files

Macroscope summarized 129f2ad.

@coderabbitai

coderabbitaiBot commented Aug 25, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 7697ac98-d68b-4b0a-aa8c-fb19042ba35d

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

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

@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:XXL 1,000+ changed lines (additions + deletions). labels Aug 25, 2026
@github-actions

github-actionsBot commented Aug 25, 2026

Copy link
Copy Markdown
Contributor

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

ProviderMetricMain baselineThis PRImpactPR ceiling
CodexTotal thread wire13.3 KiB13.3 KiB−29 B (−0.2%)15.1 KiB
CodexThread snapshot wire6.9 KiB6.9 KiB−6 B (−0.1%)7.3 KiB
CodexLive turn WebSocket wire6.4 KiB6.4 KiB−23 B (−0.3%)7.8 KiB
CodexLive turn WebSocket decoded55.6 KiB55.6 KiB−44 B (−0.1%)66.4 KiB
CodexLive turn messages1110−1 (−9.1%)21
ClaudeTotal thread wire13.3 KiB13.3 KiB−56 B (−0.4%)15.1 KiB
ClaudeThread snapshot wire6.9 KiB6.9 KiB−1 B (−0.0%)7.3 KiB
ClaudeLive turn WebSocket wire6.4 KiB6.4 KiB−55 B (−0.8%)7.8 KiB
ClaudeLive turn WebSocket decoded56.4 KiB56.4 KiB−88 B (−0.2%)66.4 KiB
ClaudeLive turn messages119−2 (−18.2%)21

Baseline: 0e2905e · PR result: 129f2ad · 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: 109.4 KiB
  • Claude decoded thread snapshot: 110.1 KiB

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

@macroscopeappmacroscopeappBot 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.

Reviewed the new/changed Effect-adjacent code (packages/client-runtime/src/state/attachments.ts, apps/web/src/state/attachments.ts, and the web upload-queue call sites) against the service conventions. The new createAttachmentEnvironmentAtoms factory correctly mirrors createAssetEnvironmentAtoms (runtime passed in, no hidden globals, no ManagedRuntime/runPromise outside the existing atom-command boundary), and no service tags/layers were moved or redefined. One predicate convention issue below.

Posted via Macroscope — Effect Service Conventions

Comment threadpackages/client-runtime/src/state/attachments.ts Outdated
Comment threadapps/web/src/lib/attachmentUploadQueue.ts
Comment threaddocs/user/composer.md Outdated
Comment threadapps/web/src/composerDraftStore.ts
@macroscopeapp

macroscopeappBot commented Aug 25, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Not approved

Macroscope's review found this PR not approvable — This change introduces a substantial production workflow for uploading, persisting, transferring, deleting, and downloading user files alongside turns. Its broad runtime surface and server-side file lifecycle warrant human review despite extensive tests and backward-compatible persistence.

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

Comment threadapps/web/src/lib/attachmentUploadQueue.ts Outdated

@macroscopeappmacroscopeappBot 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.

Reviewed the web composer/timeline attachment UI. Two interaction findings on changed lines, both about the new needs-reattach / capacity paths giving the user no working path or feedback.

Posted via Macroscope — UI Consistency

Comment threadapps/web/src/components/chat/ChatComposer.tsx
Comment threadapps/web/src/composerDraftStore.ts
Comment threadapps/web/src/lib/attachmentUploadQueue.ts
Comment threadapps/web/src/composerDraftStore.ts Outdated
Comment threadapps/web/src/composerDraftStore.ts
Comment threadapps/web/src/composerDraftStore.ts Outdated
Comment threadapps/web/src/components/chat/ChatComposer.tsx

@macroscopeappmacroscopeappBot 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.

One finding: the new file-attachment download button in MessagesTimeline renders its filename center-aligned, unlike the visually identical anchor and inert rows next to it.

Posted via Macroscope — UI Consistency

Comment threadapps/web/src/components/chat/MessagesTimeline.tsx Outdated
@t3dotgg
t3dotggforce-pushed the t3code/file-attachments-web branch from c88f3df to 33d67f9CompareAugust 26, 2026 08:58
Comment threadapps/web/src/components/chat/ChatComposer.tsx
Comment threadapps/web/src/components/chat/composerAttachmentFiles.ts
Comment threadapps/web/src/components/chat/ChatComposer.tsx
@t3dotgg
t3dotggforce-pushed the t3code/file-attachments-web branch from 7abf833 to 1dd3cc0CompareAugust 26, 2026 09:29
Comment threadapps/web/src/components/ChatView.tsx
Comment threadapps/web/src/components/chat/ChatComposer.tsx Outdated
Comment threadapps/web/src/hooks/useHandleNewThread.ts

@macroscopeappmacroscopeappBot 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.

One finding on the new send-block wording in ChatComposer. The rest of the attachment UI (file rows, paperclip trigger, stash menu file badge, timeline file rows) reuses the existing primitives and row treatments consistently, and the earlier findings on the timeline download row alignment, the marker re-pick path, and the swallowed paste are resolved.

Posted via Macroscope — UI Consistency

Comment threadapps/web/src/components/chat/ChatComposer.tsx Outdated
Comment threadapps/web/src/components/chat/ChatComposer.tsx
Comment threadapps/web/src/components/ChatView.tsx Outdated

@macroscopeappmacroscopeappBot 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.

One finding: the needs-reattach file row label ignores the canReattachFiles guard that the send-block reason uses, so on a server without file-attachment support (or before the capability arrives) the row tells the user to attach again while no attach control is rendered.

Posted via Macroscope — UI Consistency

Comment threadapps/web/src/components/chat/ChatComposer.tsx
Comment threadapps/web/src/components/chat/ChatComposer.tsx
juliusmarminge added a commit that referenced this pull request Aug 29, 2026
PRs #8437 and #8236 crossed: one made stashShortcutLabel a required
ComposerStashMenu prop, the other added a test case without it, so
main fails web typecheck.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 29, 2026
Round-16 rebase onto main (5 commits, headlined by #8236 file
attachments in the client). Main's upload-aware send path — capability
probes, upload await/retry gating, uploaded-ref turn attachments with
dataUrl fallback, draft release on success — is woven into the v2
dispatch flow, timeline user rows render file attachments as download
links with the ChatView download handler, and the provider settings
editor cleanup keeps the branch's environment-field rows. The codex
feedback client flow stays unported, replay testkit configs gained
main's environmentThemesDir, and the rpc/settings/docs unions carry
both sides.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
github-actionsBot added a commit to omarcresp/t3code-flake that referenced this pull request Aug 29, 2026
## What's Changed
* feat(web): attach PDFs, ZIPs, and other files to a turn by @t3dotgg in pingdotgg/t3code#8236
* feat(web): keybinding settings as settings rows by @StiensWout in pingdotgg/t3code#8532
* feat: let an environment publish themes as a file by @ryanrhughes in pingdotgg/t3code#8569
* fix(web): clean up provider settings list and editor by @StiensWout in pingdotgg/t3code#8504
* fix(web): keep project picker popup inside the sidebar by @SunkenInTime in pingdotgg/t3code#8627
* fix(mobile): prevent header overflow and back-button artifacts by @juliusmarminge in pingdotgg/t3code#8624
## New Contributors
* @ryanrhughes made their first contribution in pingdotgg/t3code#8569
**Full Changelog**: pingdotgg/t3code@v0.0.37-nightly.20260829.1218...v0.0.37-nightly.20260829.1219
Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.37-nightly.20260829.1219
netpro2k added a commit to netpro2k/t3code that referenced this pull request Aug 29, 2026
Intent:
Expose the generic-file backend shipped in v0.0.36 through the web and desktop composer while following the official client implementation closely enough for its upstream PR to replace this patch cleanly.
Behavior:
- Accept images and generic files through the paperclip button, paste, and drag-and-drop; share the eight-attachment limit and use the server-advertised generic-file limit, currently 50 MB.
- Upload while the user composes, show progress/retry/reattach states, and render sent files as signed downloads with their original names.
- Preserve file drafts and stashes as server upload references or explicit needs-reattach markers instead of storing generic-file bytes in localStorage.
- Keep upload verification, cleanup, retry, environment moves, and unknown attachment rendering explicit.
- Show file names in the current mobile feed and include attachment names in transcript bootstrap context.
Design constraints:
- Backport official upstream PR pingdotgg#8236 at 129f2ad, rebased onto v0.0.36, rather than maintaining a parallel client upload architecture.
- Use packages/client-runtime for the shared upload lifecycle and clamp file sizes to the server capability and contract maximum.
- Require direct-upload support for generic files. Do not retain the fork inline-file protocol or serialize generic-file bytes into drafts and stashes.
- Upload local workspace drops like the official client; do not retain the competing desktop-only drop-to-mention behavior.
- Keep images on their established compression and compatibility path.
Integration:
- Shared client-runtime upload lifecycle and web environment atoms.
- Web composer, drafts, prompt stashes, upload queue, message timeline, signed asset downloads, sidebar counts, project cleanup, and user documentation.
- Minimal current mobile feed visibility and transcript bootstrap naming remain fork-only until the official follow-up covers them.
Verification:
- Official attachment-focused web and client-runtime tests pass (7 files, 196 tests).
- Targeted client-runtime, web, and mobile typechecks pass; the existing client-runtime Effect diagnostic remains advisory.
Rebase notes:
- Upstream PR pingdotgg#8236 should supersede the web/client-runtime implementation wholesale once merged.
- Upstream PR pingdotgg#8237 should supersede the temporary mobile filename row with signed mobile downloads and full mobile file picking/sharing.
- Recheck only the transcript-bootstrap filename summary after both PRs land.
- The v0.0.36 stashShortcutLabel test fixture is the only adaptation to the rebased official PR tree.
longtngo added a commit to longtngo/t3code that referenced this pull request Aug 29, 2026
Range f6f2be3..053affb, v0.0.36. 411 upstream files, 632 fork files,
81 touched by both, 19 conflicted.
Competing implementations resolved toward the fork's superset:
- Claude context usage (pingdotgg#8610). Upstream deleted `queryCurrentContextUsage` and
`normalizeClaudeContextUsageApiSnapshot` outright. `getContextUsage` is the ONLY
source of the compaction facts (`autocompactSource`, `autoCompactThreshold`,
`isAutoCompactEnabled`) the Vitals gauge's compaction note and marker render from,
and they travel on the wire contract, so the call is kept. Upstream's
`latestAssistantUsage` tracking and its post-compaction guard are adopted BELOW it
as the next-best fallback: `contextUsageSnapshot ?? latestAssistantSnapshot ?? ...`.
Upstream removed `getContextUsage` from `ClaudeQueryRuntime`, the
`SDKControlGetContextUsageResponse` import and the `Option` import outside every
conflict marker; all three restored.
- Provider settings editor (pingdotgg#8472). Upstream's `useEffect` + `lastPublishedEnvironmentRef`
re-seed is the superset of the fork's render-phase `seededRef` (8fe3190, one of four
silent-data-loss fixes). The merge had kept BOTH mechanisms; collapsed to upstream's,
with the fork's half-typed-row null guard on the publish path. `environmentKey` deleted
with the code it served.
- Sidebar project combobox (pingdotgg#5931). Upstream replaced the menu-based project filter,
whose `MenuRadioItem` carried the fork's project-actions button. Rebuilt on upstream's
`ComboboxItem` with the ellipsis button grafted back (invariant 6). The dead `Menu*`
import is gone.
- Composer attachments (pingdotgg#8236). Upstream's `addComposerAttachments` pipeline adopted; the
fork's drop split (image -> attach, other -> absolute path with upload fallback) kept
and repointed at the new handler.
- Mid-turn steer. Upstream's `steeringTurnState` branch rejected again (invariant 5); its
side of that hunk also opened an `if` whose brace lives below the hunk.
- Thread deletion drain (pingdotgg#8226). Upstream replaced `drain` with `drainThrough(sequence)`;
the fork's test retargeted. Its new drain test observed `ProviderService.stopSession`,
which this reactor never calls (it dispatches `thread.session.stop`), so it now counts
engine dispatches and provides the two services the fork's reactor needs.
Three defects the resolutions introduced, each caught by a check that is not the suite:
- `shouldShowBranchMismatchBanner` was resurrected into two import lists by resolving
them toward upstream. Fork commit cfdf255 replaced that function; the import had no
definition. Found by the RESURRECTED sweep.
- `scriptPath` ended up declared twice in CodexCollabRuntime.integration.test.ts: `both`
reintroduced upstream's fixture-dir copy that the fork deliberately moved to a temp dir.
Found by the RESURRECTED sweep.
- `setProjectScopeMenuOpen` survived in the fork's `handleProjectActions` after upstream
replaced that state with a reducer, outside every marker. Found by typecheck.
Upstream regressions of fork fixes, kept fixed:
- Raw NUL bytes returned to ChatComposer.tsx. A raw NUL renders as nothing in grep and
aborts BSD sed mid-file; the fork had converted all six to `\0` escapes and carries a
guard test for it. The guard failed, and the offending line reads as space-separated in
any normal diff. Converted back to escapes.
- `defaultTheme` / `defaultThemeSetAt` (pingdotgg#8569) are absent from `ServerSettingsPatch`; the
fork's patch-parity guard caught it. They are owned by `t3 theme set`, which rewrites
settings.json directly and which clients only read, so they are recorded as deliberately
unpatchable rather than mirrored.
- The fork's mobile held-messages strip used `dark:` variants that upstream's new Uniwind
theme rule (pingdotgg#7327) forbids; moved to the `text-foreground-muted` semantic token rather
than added to the rule's allowlist.
Invariants: all re-probed against the merged tree. 1 (49 migrations, ids unique and
monotonic, max 50, 34 burned), 2 (the fork-only @effect/platform-node patch survived the
Expo 57 rewrite of patchedDependencies, is pinned, resolved and applied on disk; effect
stays at beta.103 so no re-pin), 3, 4, 4b (4 `isSendBlocked=`), 5, 5b, 5c, 6, 7, 8, 9, 10,
11 all hold.
Sweeps: resurrected 3, dropped 21, fork-loss 45, both-kept 0. Every entry named: the 3
resurrected and the fork-loss in ProviderInstanceCard / ChatComposer / Sidebar are the
decisions above; the OpenCode fork-loss is 11 comment lines whose guard upstream extracted
into `deleteContextIfCurrent` (the rationale is restored on the helper); pnpm-lock churn is
the install. Test declarations 18,691 -> 19,081; one file lost one, upstream's own pingdotgg#8484.
Gate: pnpm run verify green, exit 0 read from the captured log line. 14 blocks,
10,744 passed, 20 skipped, 0 failures.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
netpro2k added a commit to netpro2k/t3code that referenced this pull request Aug 29, 2026
Intent:
Expose the generic-file backend shipped in v0.0.36 through the web and desktop composer while following the official client implementation closely enough for its upstream PR to replace this patch cleanly.
Behavior:
- Accept images and generic files through the paperclip button, paste, and drag-and-drop; share the eight-attachment limit and use the server-advertised generic-file limit, currently 50 MB.
- Upload while the user composes, show progress/retry/reattach states, and render sent files as signed downloads with their original names.
- Preserve file drafts and stashes as server upload references or explicit needs-reattach markers instead of storing generic-file bytes in localStorage.
- Keep upload verification, cleanup, retry, environment moves, and unknown attachment rendering explicit.
- Show file names in the current mobile feed and include attachment names in transcript bootstrap context.
Design constraints:
- Backport official upstream PR pingdotgg#8236 at 129f2ad, rebased onto v0.0.36, rather than maintaining a parallel client upload architecture.
- Use packages/client-runtime for the shared upload lifecycle and clamp file sizes to the server capability and contract maximum.
- Require direct-upload support for generic files. Do not retain the fork inline-file protocol or serialize generic-file bytes into drafts and stashes.
- Upload local workspace drops like the official client; do not retain the competing desktop-only drop-to-mention behavior.
- Keep images on their established compression and compatibility path.
Integration:
- Shared client-runtime upload lifecycle and web environment atoms.
- Web composer, drafts, prompt stashes, upload queue, message timeline, signed asset downloads, sidebar counts, project cleanup, and user documentation.
- Minimal current mobile feed visibility and transcript bootstrap naming remain fork-only until the official follow-up covers them.
Verification:
- Official attachment-focused web and client-runtime tests pass (7 files, 196 tests).
- Targeted client-runtime, web, and mobile typechecks pass; the existing client-runtime Effect diagnostic remains advisory.
Rebase notes:
- Upstream PR pingdotgg#8236 should supersede the web/client-runtime implementation wholesale once merged.
- Upstream PR pingdotgg#8237 should supersede the temporary mobile filename row with signed mobile downloads and full mobile file picking/sharing.
- Recheck only the transcript-bootstrap filename summary after both PRs land.
- The v0.0.36 stashShortcutLabel test fixture is the only adaptation to the rebased official PR tree.
juliusmarminge added a commit that referenced this pull request Aug 30, 2026
Round-16 rebase onto main (5 commits, headlined by #8236 file
attachments in the client). Main's upload-aware send path — capability
probes, upload await/retry gating, uploaded-ref turn attachments with
dataUrl fallback, draft release on success — is woven into the v2
dispatch flow, timeline user rows render file attachments as download
links with the ChatView download handler, and the provider settings
editor cleanup keeps the branch's environment-field rows. The codex
feedback client flow stays unported, replay testkit configs gained
main's environmentThemesDir, and the rpc/settings/docs unions carry
both sides.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
bcotrim pushed a commit to bcotrim/mognet that referenced this pull request Aug 30, 2026
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
(cherry picked from commit bcb855a)
bcotrim pushed a commit to bcotrim/mognet that referenced this pull request Aug 30, 2026
PRs pingdotgg#8437 and pingdotgg#8236 crossed: one made stashShortcutLabel a required
ComposerStashMenu prop, the other added a test case without it, so
main fails web typecheck.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
(cherry picked from commit d22709f)
juliusmarminge added a commit that referenced this pull request Aug 30, 2026
Round-16 rebase onto main (5 commits, headlined by #8236 file
attachments in the client). Main's upload-aware send path — capability
probes, upload await/retry gating, uploaded-ref turn attachments with
dataUrl fallback, draft release on success — is woven into the v2
dispatch flow, timeline user rows render file attachments as download
links with the ChatView download handler, and the provider settings
editor cleanup keeps the branch's environment-field rows. The codex
feedback client flow stays unported, replay testkit configs gained
main's environmentThemesDir, and the rpc/settings/docs unions carry
both sides.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
imsherrill pushed a commit to comprehensiveio/compadre that referenced this pull request Aug 31, 2026
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
(cherry picked from commit bcb855a)
imsherrill added a commit to comprehensiveio/compadre that referenced this pull request Aug 31, 2026
…) (#2)
(cherry picked from commit bcb855a)
Co-authored-by: Theo Browne <me@t3.gg>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
netpro2k added a commit to netpro2k/t3code that referenced this pull request Aug 31, 2026
Intent:
Keep transcript bootstrap context aware of generic file attachments now that upstream web and mobile clients support their full upload and rendering lifecycle.
Behavior:
- Count every message attachment in transcript bootstrap context, not only images.
- Include up to three attachment names plus an additional-count suffix.
- Preserve image/images wording when every attachment is an image; otherwise use file/files.
Design constraints:
- Rely entirely on upstream attachment upload, draft, stash, rendering, download, and mobile behavior.
- Keep this patch limited to the text supplied to transcript bootstrap.
Integration:
- Web transcript bootstrap summary only. No client upload, server, contract, mobile, or storage changes.
Verification:
- Upstream PRs pingdotgg#8236 and pingdotgg#8237 were audited as superseding the former attachment backport except for this summary behavior.
- Targeted web verification is rerun after the complete patch stack rebases.
Rebase notes:
- Drop this patch only when upstream transcript bootstrap includes generic attachment names rather than filtering to images.
github-actionsBot added a commit to omarcresp/t3code-flake that referenced this pull request Aug 31, 2026
## What's Changed
* Remove Messages Glass Lab experiment by @juliusmarminge in pingdotgg/t3code#8599
* Require human review for pull requests changing product defaults by @juliusmarminge in pingdotgg/t3code#8603
* fix(codex): avoid quadratic app-server input buffering by @juliusmarminge in pingdotgg/t3code#8605
* fix(mobile): stabilize iOS header item transitions by @juliusmarminge in pingdotgg/t3code#8607
* chore(mobile): upgrade to Expo SDK 57 by @juliusmarminge in pingdotgg/t3code#8609
* fix(mobile): harden native header toolbar items by @juliusmarminge in pingdotgg/t3code#8611
* fix(server): stop querying Claude context usage after turns by @t3dotgg in pingdotgg/t3code#8610
* chore: vouch ryanrhughes by @t3dotgg in pingdotgg/t3code#8613
* feat(web): attach PDFs, ZIPs, and other files to a turn by @t3dotgg in pingdotgg/t3code#8236
* feat(web): keybinding settings as settings rows by @StiensWout in pingdotgg/t3code#8532
* feat: let an environment publish themes as a file by @ryanrhughes in pingdotgg/t3code#8569
* fix(web): clean up provider settings list and editor by @StiensWout in pingdotgg/t3code#8504
* fix(web): keep project picker popup inside the sidebar by @SunkenInTime in pingdotgg/t3code#8627
* fix(mobile): prevent header overflow and back-button artifacts by @juliusmarminge in pingdotgg/t3code#8624
* fix(server): retry automatic thread title generation by @Bil0000 in pingdotgg/t3code#8087
* fix(client-runtime): refresh edited pull request comments by @Bil0000 in pingdotgg/t3code#8094
* fix(web): four composer spacing defects by @Bil0000 in pingdotgg/t3code#8090
* perf(desktop): skip duplicate browser updates by @Bil0000 in pingdotgg/t3code#8018
* fix(web): render nested markdown images correctly by @flamboh in pingdotgg/t3code#8501
* fix(web): unify activity logs and composer banners by @juliusmarminge in pingdotgg/t3code#8693
* fix(mobile): reduce dev-client reload and Metro startup cost by @juliusmarminge in pingdotgg/t3code#8694
* revert(web): restore previous composer banners by @t3dotgg in pingdotgg/t3code#8733
* test(web): remove tests for unreachable helpers by @t3-code[bot] in pingdotgg/t3code#8738
* feat(mobile): update tool summaries and chat transitions by @juliusmarminge in pingdotgg/t3code#8793
* feat(web): play video attachments in chat by @Bil0000 in pingdotgg/t3code#8688
* fix(web,mobile): snooze menu no longer offers the same wake time twice by @vitalyiegorov in pingdotgg/t3code#8741
* fix(grok): allow model changes in existing threads by @ahmed-besic in pingdotgg/t3code#8392
* feat(mobile): pick, share, and receive files in threads by @t3dotgg in pingdotgg/t3code#8237
* fix(web): reduce title bar scroll fade height by @maria-rcks in pingdotgg/t3code#8799
* fix(windows): strip quotes from repaired PATH by @UtkarshUsername in pingdotgg/t3code#8746
* fix(web): open agent images in expanded preview by @maria-rcks in pingdotgg/t3code#8807
* fix(git): follow repository instructions in generated source control text by @maria-rcks in pingdotgg/t3code#8804
* fix(server): stop overpricing cached Claude tokens by @SunkenInTime in pingdotgg/t3code#8806
* fix(web): keep image preview above sidebar control by @maria-rcks in pingdotgg/t3code#8811
* fix(web): keep right panel synced with agent edits by @maria-rcks in pingdotgg/t3code#8803
* fix(web,mobile): render Codex citations and artifact templates by @Yash-Singh1 in pingdotgg/t3code#8584
* chore: add Windows setup script to t3.json by @UtkarshUsername in pingdotgg/t3code#8814
* fix(web): fold interim turn responses by @maria-rcks in pingdotgg/t3code#8828
* fix(web): use circle alert for failed tool calls by @maria-rcks in pingdotgg/t3code#8840
* feat(mobile): add offline iPhone voice input by @t3dotgg in pingdotgg/t3code#8614
* fix(web): prevent pull request metadata overlap by @MatthewFeroz in pingdotgg/t3code#8790
## New Contributors
* @ryanrhughes made their first contribution in pingdotgg/t3code#8569
* @ahmed-besic made their first contribution in pingdotgg/t3code#8392
* @MatthewFeroz made their first contribution in pingdotgg/t3code#8790
**Full Changelog**: pingdotgg/t3code@v0.0.36...v0.0.37
Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.37
amitbet pushed a commit to amitbet/a2code that referenced this pull request Sep 1, 2026
Upstream shipped its own arbitrary file attachments (pingdotgg#8235/pingdotgg#8236/pingdotgg#8237), a
strict superset of the fork's, so that divergence is retired rather than
re-applied. Upstream also reverted its turn-plan chips, restructured provider
settings into list+editor, made the project picker a searchable combobox, and
replaced the mobile CSS-variable theme hook with useUniwindTheme.
Fork features preserved: thread forking, queued-prompt steering, in-chat find,
answered user-input rows, machine-scoped environments, provider health-check
cache, provider "Default traits", live quota meter, thread export/pinning,
payload hot-update channel, and the build-only CI surface.
See FORK_NOTES.md for the per-file migration notes.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Sep 1, 2026
Round-16 rebase onto main (5 commits, headlined by #8236 file
attachments in the client). Main's upload-aware send path — capability
probes, upload await/retry gating, uploaded-ref turn attachments with
dataUrl fallback, draft release on success — is woven into the v2
dispatch flow, timeline user rows render file attachments as download
links with the ChatView download handler, and the provider settings
editor cleanup keeps the branch's environment-field rows. The codex
feedback client flow stays unported, replay testkit configs gained
main's environmentThemesDir, and the rpc/settings/docs unions carry
both sides.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Coriou added a commit to Coriou/txcode that referenced this pull request Sep 1, 2026
Upstream tip (bcb855a, pingdotgg#8236) rewrote the third render's entries and
dropped the required stashShortcutLabel prop, leaving upstream's own web
typecheck red. Completed the fixture; candidate for an upstream report.
juliusmarminge added a commit that referenced this pull request Sep 2, 2026
Round-16 rebase onto main (5 commits, headlined by #8236 file
attachments in the client). Main's upload-aware send path — capability
probes, upload await/retry gating, uploaded-ref turn attachments with
dataUrl fallback, draft release on success — is woven into the v2
dispatch flow, timeline user rows render file attachments as download
links with the ChatView download handler, and the provider settings
editor cleanup keeps the branch's environment-field rows. The codex
feedback client flow stays unported, replay testkit configs gained
main's environmentThemesDir, and the rpc/settings/docs unions carry
both sides.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
brentkelly added a commit to brentkelly/t3code-orchestrator that referenced this pull request Sep 2, 2026
* feat(analytics): threads and turns now know which client started them (pingdotgg#7774)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(web): stop marking mixed tool runs as failed (pingdotgg#7893)
* fix(web): command-click spaced folder links (pingdotgg#6439)
Co-authored-by: shivam <91240327+shivamhwp@users.noreply.github.com>
* fix(chat): stop pushing follow-up messages to the top (pingdotgg#7897)
* test(desktop): remove redundant release note assertion (pingdotgg#7873)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
* fix(web): handle wide ordered-list marker edge cases (pingdotgg#7856)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(ssh): restore user PATH for remote servers (pingdotgg#7213)
* fix(desktop): keep tailscale spawn defects from breaking advertised endpoints (pingdotgg#7116)
* fix(web): keep Codex service tier labels readable (pingdotgg#4503)
* fix: render workspace images in chat markdown (pingdotgg#6433)
* fix(clients): keep opening responses visible after turns settle (pingdotgg#7723)
* feat(web): add appearance contrast control (pingdotgg#7906)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: maria <254055478+maria-rcks@users.noreply.github.com>
* fix(server): stop completed Codex threads from staying stuck on working (pingdotgg#7937)
* fix(mobile): preserve markdown image dimensions (pingdotgg#7940)
* fix(web): remove duplicate provider update progress (pingdotgg#7761)
* fix(server): fall back to the remote default branch instead of assuming main (pingdotgg#7078)
* fix(web): give sidebar project menu rows the same side padding as other menus (pingdotgg#7913)
* fix(clients): reconnect after credentials fail during remote server updates (pingdotgg#7953)
* feat(codex): submit thread feedback to OpenAI (pingdotgg#7949)
* fix(server): stop kills lingering Claude work (pingdotgg#5891)
* fix(ci): let Macroscope approve pull requests again (pingdotgg#7970)
* fix(clients): move settled pinned threads into the settled section (pingdotgg#7969)
* perf(ci): speed up release builds and Windows packaging (pingdotgg#7975)
* fix(web): stop tool calls from leaving a blank page in threads (pingdotgg#7971)
* fix(web): stop recovered tool failures from marking work logs red (pingdotgg#7999)
* fix(mobile): isolate markdown image requests (pingdotgg#7942)
* feat(web): redesign skills in `$` menu and in `/` menu (pingdotgg#8009)
* fix(web): restore right panel toggle clicks after closing on desktop (pingdotgg#8016)
* fix(web): keep server update banners flush with the composer (pingdotgg#8000)
* perf(web): reuse work log rows during streaming (pingdotgg#8006)
* fix(web): keep provider badge legible in dark themes (pingdotgg#7968)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: maria <254055478+maria-rcks@users.noreply.github.com>
* fix(web): treat configured urls with uppercase schemes as secure (pingdotgg#8005)
Co-authored-by: Simone <185146821+Lucenx9@users.noreply.github.com>
* fix(desktop): keep release notes visible while downloading (pingdotgg#6412)
* fix(web): show only providers with usage in usage views (pingdotgg#7563)
* fix(web): prevent expanded tool calls from hiding thread content (pingdotgg#8052)
* test(server): remove no-op live activity tests (pingdotgg#8056)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
* fix(web): clarify terminal sidebar grouping (pingdotgg#7967)
* fix(codex): show app access approval prompts (pingdotgg#8058)
* feat(web): upload image attachments before sending (pingdotgg#8048)
* fix(server): bound OpenCode skill discovery output (pingdotgg#7675)
Co-authored-by: Simone <185146821+Lucenx9@users.noreply.github.com>
* fix(mobile): persist thread shelf collapse state (pingdotgg#5152)
* fix(mobile): restore Android tablet thread controls, clean up header (pingdotgg#5385)
* fix(mobile): land the first thread open above the composer on Android (pingdotgg#5585)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: codex <codex@users.noreply.github.com>
Co-authored-by: Julius Marminge <julius0216@outlook.com>
* fix(server): check out submodules in a new worktree (pingdotgg#7674)
Co-authored-by: Rodrigo Brechard <rodrigo@clubtidy.fr>
* fix(server): preserve merged PR badges after branch deletion (pingdotgg#6216)
* fix(server): return fresh live pull request reads (pingdotgg#6472)
* fix(web): compare client and server versions as semver, not strings (pingdotgg#7579)
* fix(web): stop follow-ups from leaving giant blank space (pingdotgg#8068)
* fix(marketing): stop automatic Vercel deployments on pull requests (pingdotgg#8070)
* chore: vouch repeat contributors (pingdotgg#8071)
* fix(server): keep the authoritative subagent model when snapshots race task_started (pingdotgg#7583)
* fix(server): honor auto-accept edits for the OpenCode provider (pingdotgg#7100)
* fix(server): run the CLI on Node versions without import.meta.main (pingdotgg#7141)
* fix(server): recover from provider interrupt failures (pingdotgg#7412)
* fix(server): recreate a thread's worktree before starting a turn (pingdotgg#7839)
* fix(server): thread delete no longer fails on already-removed worktrees (pingdotgg#8076)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(web): stop update notices showing through the composer (pingdotgg#8083)
* fix(web): detect outdated nightly servers (pingdotgg#8124)
* fix(web): align usage page skeleton layout (pingdotgg#8111)
* fix(web): make terminal links appear clickable only when clickable (pingdotgg#7488)
* fix(web): make Windows file links clickable in chat (pingdotgg#8081)
* fix(web): sort usage models by token count (pingdotgg#8108)
* fix: open agent file links in the file viewer (pingdotgg#8098)
* fix(server): stop routine events from rescanning thread history (pingdotgg#8150)
* fix(deps): stop pnpm installs from changing the lockfile (pingdotgg#8163)
* feat(web): settle and restore threads with a keyboard shortcut (pingdotgg#8089)
* perf(desktop): cut macOS signing calls by 81% (pingdotgg#8093)
* feat: link pull requests to threads (pingdotgg#8160)
* feat(web): safely attach HEIC photos as JPEG images (pingdotgg#8161)
Co-authored-by: mweinbach <maxweinbach5@gmail.com>
* feat(mobile): track device models and OS versions (pingdotgg#8169)
* fix(grok): bound cumulative tool output updates (pingdotgg#7279)
* fix(web): delay thread shortcut hints by 200 ms (pingdotgg#8172)
* fix(server): stop probing Cursor until enabled (pingdotgg#8175)
* docs(release): verify remote updates with database migrations (pingdotgg#8177)
* fix(server): keep provider CLIs available in the macOS service (pingdotgg#8173)
* feat(claude): compact old threads before they burn through usage (pingdotgg#8144)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(client-runtime): retry queries after connection interruption (pingdotgg#8117)
* fix(server): keep previously used providers working after upgrades (pingdotgg#8176)
* feat(desktop): build macOS previews from a PR label (pingdotgg#8182)
* fix(web): thread jump hints no longer stick after a dictation paste (pingdotgg#8189)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(web): keep grouped project renames (pingdotgg#7831)
* feat(web): reveal chat file chips in the system file manager (pingdotgg#7140)
Co-authored-by: Dara Adedeji <daraaded@amazon.com>
Co-authored-by: shivam <91240327+shivamhwp@users.noreply.github.com>
* fix(server): push no longer writes a feature branch's commits to its base branch (pingdotgg#8228)
* chore(deps): bump @clerk/electron to 0.0.37 (pingdotgg#8240)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* feat(server): fetch legacy model classification from a hosted manifest (pingdotgg#8227)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* chore(release): prepare v0.0.34
* fix(desktop): let Clerk UI receive stable auth fixes (pingdotgg#8248)
* fix(app): un-settled threads return to the top of the list (pingdotgg#8231)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* perf(ci): cut about a minute from every release (pingdotgg#8250)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* feat(ci): download macOS preview DMGs without signing in (pingdotgg#8243)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(codex): accept Codex 0.150 multi-agent events (pingdotgg#8346)
* chore(release): prepare v0.0.35
* fix(grok): improve skills, plans, usage, and turn reliability (pingdotgg#8358)
Co-authored-by: Dara Adedeji <daraadedeji07@gmail.com>
Co-authored-by: Ahmed Besic <ahmed-besic@users.noreply.github.com>
Co-authored-by: Michael Brown <michaeltbrown.mtb@gmail.com>
Co-authored-by: Lars Nieuwenhuis <35393046+lnieuwenhuis@users.noreply.github.com>
Co-authored-by: Guilherme Barros <gbarros1095@gmail.com>
Co-authored-by: PC <pc@localhost>
Co-authored-by: 1xpixi <157762409+1xpixi@users.noreply.github.com>
* fix(server): recover stale Codex approval callbacks (pingdotgg#5195)
* test(server): remove duplicate missing worktree test (pingdotgg#8252)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
* fix(server): replay all un-applied events during projection bootstrap (pingdotgg#7538)
Co-authored-by: Theo Browne <me@t3.gg>
* test: remove low-signal test files (pingdotgg#8397)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
* test: prune trivial error and layout tests (pingdotgg#8400)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
* Fix Android adaptive launcher icon (pingdotgg#4332)
Co-authored-by: Yash Singh <saiansh2525@gmail.com>
* feat(web): split provider settings into list and editor (pingdotgg#8380)
* fix(codex): accept Codex 0.150 account plans (pingdotgg#8447)
* fix(tooling): allow ignored-only staged changes (pingdotgg#8468)
* fix(mobile): keep iOS home header stable (pingdotgg#8467)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(web): stop showing red x summaries for ordinary tool failures (pingdotgg#8395)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(mobile): refine Git action toast glass styling (pingdotgg#8399)
* fix(desktop): allow preview automation in agent-created threads (pingdotgg#8483)
* test(web): remove redundant cache key test (pingdotgg#8484)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
* fix(release): move nightly schedule to minute 38
Recent scheduled nightlies have been delayed or skipped.
Move the nightly cron from minute 7 to minute 38. Keep the existing three-hour interval. This tests a different point in each three-hour window without claiming it will fix GitHub schedule delivery.
Authored by GPT-5.6 Sol with the Codex harness.
* fix(web): stabilize the provider settings editor (pingdotgg#8472)
* fix(web): open GitHub pull requests in browser when loading fails (pingdotgg#8507)
* fix(codex): show sub-agent models (pingdotgg#8502)
* feat(analytics): report connected client platforms (pingdotgg#8481)
* feat(server): accept PDF, ZIP, and other file uploads up to 50MB (pingdotgg#8235)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* feat(web): toggle thread pin from the keyboard
Add a mod+shift+p shortcut that pins or unpins the active thread. Ignore the shortcut during terminal focus and when the server does not support thread pinning.
* fix(web): add back button to project settings (pingdotgg#8168)
* refactor(mobile): compile semantic themes for Uniwind (pingdotgg#7327)
Co-authored-by: codex <codex@users.noreply.github.com>
* fix(desktop): Cache Runtime locally on WSL Filesystem, dramatically improving launch times (pingdotgg#5769)
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: Utkarsh Patil <73941998+UtkarshUsername@users.noreply.github.com>
* fix(mobile): show OpenCode model sources in picker (pingdotgg#8573)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(clients): honor project default models in new threads (pingdotgg#6011)
Co-authored-by: Shivam Sharma <91240327+shivamhwp@users.noreply.github.com>
* fix(mobile): show file actions on Android (pingdotgg#8215)
Co-authored-by: Shivam Sharma <91240327+shivamhwp@users.noreply.github.com>
* fix(connect): explain DPoP connection failures (pingdotgg#8351)
Co-authored-by: Julius Marminge <julius0216@outlook.com>
* feat(web): make the sidebar project filter a searchable combobox (pingdotgg#5931)
* fix(server): a draft can retry its first send after a failed bootstrap (pingdotgg#8226)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(desktop): stop hidden previews draining battery (pingdotgg#8567)
* fix(desktop): oauth popups open from the browser preview (pingdotgg#8435)
Co-authored-by: Julius Marminge <julius0216@outlook.com>
* fix(web): keep long task drawers usable on small screens (pingdotgg#8313)
* fix(opencode): handle child approvals, stops, and model catalogs (pingdotgg#8480)
* fix: make thread auto-settling opt-in (pingdotgg#8321)
* fix(web): stop session activity timing test from blocking releases (pingdotgg#8585)
* fix(mobile): show composer menus when starting a task (pingdotgg#8587)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(web): show the configured stash shortcut (pingdotgg#8437)
Co-authored-by: Shivam Sharma <91240327+shivamhwp@users.noreply.github.com>
* feat(web): add toggleable confirmation before unpinning a thread (pingdotgg#7313)
Co-authored-by: Shivam Sharma <91240327+shivamhwp@users.noreply.github.com>
* fix: restore automatic thread settling defaults (pingdotgg#8596)
* fix(mobile): restore composer glass and rounded shadows (pingdotgg#8597)
Co-authored-by: Julius Marminge <julius@mac.lan>
* Remove Messages Glass Lab experiment (pingdotgg#8599)
* chore(release): prepare v0.0.36
* Require human review for pull requests changing product defaults (pingdotgg#8603)
* fix(codex): avoid quadratic app-server input buffering (pingdotgg#8605)
* fix(mobile): stabilize iOS header item transitions (pingdotgg#8607)
Co-authored-by: Julius Marminge <julius@mac.lan>
* chore(mobile): upgrade to Expo SDK 57 (pingdotgg#8609)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(mobile): harden native header toolbar items (pingdotgg#8611)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(server): stop querying Claude context usage after turns (pingdotgg#8610)
* chore: vouch ryanrhughes (pingdotgg#8613)
* feat(web): attach PDFs, ZIPs, and other files to a turn (pingdotgg#8236)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(web): pass stashShortcutLabel in the mixed-attachments stash test
PRs pingdotgg#8437 and pingdotgg#8236 crossed: one made stashShortcutLabel a required
ComposerStashMenu prop, the other added a test case without it, so
main fails web typecheck.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* feat(web): keybinding settings as settings rows (pingdotgg#8532)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Julius Marminge <julius0216@outlook.com>
* feat: let an environment publish themes as a file (pingdotgg#8569)
Co-authored-by: Theo Browne <me@t3.gg>
* fix(web): clean up provider settings list and editor (pingdotgg#8504)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Julius Marminge <julius0216@outlook.com>
* fix(web): keep project picker popup inside the sidebar (pingdotgg#8627)
* fix(mobile): prevent header overflow and back-button artifacts (pingdotgg#8624)
* fix(server): retry automatic thread title generation (pingdotgg#8087)
* fix(client-runtime): refresh edited pull request comments (pingdotgg#8094)
* fix(web): four composer spacing defects (pingdotgg#8090)
* perf(desktop): skip duplicate browser updates (pingdotgg#8018)
Co-authored-by: Julius Marminge <julius0216@outlook.com>
* fix(web): render nested markdown images correctly (pingdotgg#8501)
* fix(web): unify activity logs and composer banners (pingdotgg#8693)
* fix(mobile): reduce dev-client reload and Metro startup cost (pingdotgg#8694)
Co-authored-by: Julius Marminge <julius@mac.lan>
* revert(web): restore previous composer banners (pingdotgg#8733)
* test(web): remove tests for unreachable helpers (pingdotgg#8738)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
* feat(mobile): update tool summaries and chat transitions (pingdotgg#8793)
* feat(web): play video attachments in chat (pingdotgg#8688)
* fix(web,mobile): snooze menu no longer offers the same wake time twice (pingdotgg#8741)
* fix(grok): allow model changes in existing threads (pingdotgg#8392)
Co-authored-by: Ahmed Besic <ahmed-besic@users.noreply.github.com>
* feat(mobile): pick, share, and receive files in threads (pingdotgg#8237)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Julius Marminge <julius0216@outlook.com>
* fix(web): reduce title bar scroll fade height (pingdotgg#8799)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(windows): strip quotes from repaired PATH (pingdotgg#8746)
* fix(web): open agent images in expanded preview (pingdotgg#8807)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(git): follow repository instructions in generated source control text (pingdotgg#8804)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(server): stop overpricing cached Claude tokens (pingdotgg#8806)
* fix(web): keep image preview above sidebar control (pingdotgg#8811)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(web): keep right panel synced with agent edits (pingdotgg#8803)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(web,mobile): render Codex citations and artifact templates (pingdotgg#8584)
* chore: add Windows setup script to t3.json (pingdotgg#8814)
* fix(web): fold interim turn responses (pingdotgg#8828)
* fix(web): use circle alert for failed tool calls (pingdotgg#8840)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* feat(mobile): add offline iPhone voice input (pingdotgg#8614)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(web): prevent pull request metadata overlap (pingdotgg#8790)
* chore(release): prepare v0.0.37
* Add mobile composer attachment menu with video support (pingdotgg#8843)
* fix(mobile): map native menu icon colors explicitly
* fix(web): restore unified activity logs and composer banners (pingdotgg#8734)
Co-authored-by: Julius Marminge <julius0216@outlook.com>
Co-authored-by: Julius Marminge <jmarminge@gmail.com>
* fix(web): address composer banner review follow-ups (pingdotgg#8850)
* fix(web): widen sync banners and simplify the working timer (pingdotgg#8855)
* fix(preview): improve browser recording quality (pingdotgg#8839)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(web): mark pull request links as external (pingdotgg#8856)
* fix(mobile): replace Callstack glass with Expo glass (pingdotgg#8862)
* fix(server): skip IDE detection in Claude probes (pingdotgg#8634)
* chore(macroscope): review diagnostic overrides (pingdotgg#8917)
Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
* fix(contracts): accept CLI event origins (pingdotgg#8905)
* fix(web): hide invalid slash skill completions (pingdotgg#8904)
* fix(mobile): defer draft navigation until submission completes (pingdotgg#8914)
* chore: disable CodeRabbit review status (pingdotgg#8933)
* Delete app.json (pingdotgg#8934)
* fix(web): show scrollbar for wide markdown tables (pingdotgg#8868)
* fix(mobile): shimmer active tool rows (pingdotgg#8932)
Co-authored-by: Julius Marminge <julius@mac.lan>
* chore(deps): bump Electron to 43.4.1 (pingdotgg#8626)
* fix(chat): smooth worktree setup status (pingdotgg#8922)
* feat(mobile): add video playback with native iOS controls (pingdotgg#8919)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(web): prevent chat metadata overlap (pingdotgg#8851)
* fix(server): preserve usage cache outside walked roots (pingdotgg#8540)
Co-authored-by: Simone <185146821+Lucenx9@users.noreply.github.com>
* feat(mobile): add native image and PDF previews (pingdotgg#8959)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(server): allow long thread IDs in HTTP routes (pingdotgg#8898)
* fix(shared): preserve Windows shell PATH priority (pingdotgg#8748)
* fix(web): make WSL settings searchable (pingdotgg#8881)
* feat(web): add expand/collapse all control to the files surface (pingdotgg#8889)
* Add auto_review configuration to coderabbit.yaml
* style: format CodeRabbit configuration
* feat(mobile): upload attachments while composing (pingdotgg#8978)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(chat): keep agent activity visible between actions (pingdotgg#8984)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(server): isolate remote web session cookies (pingdotgg#8085)
Co-authored-by: Julius Marminge <julius0216@outlook.com>
* feat(pull-requests): link GitHub references in markdown (pingdotgg#8812)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* perf(server): reduce frequency of full tool call output being loaded into memory from db (pingdotgg#8988)
* feat(web): add pull request list filters (pingdotgg#8809)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* feat(web): search individual settings by detail (pingdotgg#8831)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* feat(client): render viewed images in work logs (pingdotgg#8936)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(client): use package import for markdown image helpers (pingdotgg#9010)
* test: remove static presentation snapshots (pingdotgg#9008)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
* perf(server): bound snapshot activity payload memory (pingdotgg#9000)
* perf(server): cut idle CPU use and stop provider event leaks (pingdotgg#8187)
* perf(server): scan only appended transcript bytes for usage summaries (pingdotgg#9024)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Theo Browne <me@t3.gg>
* perf(server): cut chatty tool-update frames by 90% (pingdotgg#8368)
* fix(server): settle threads server-side (pingdotgg#8600)
* fix(clients): dedupe skills in composer menus (pingdotgg#8043)
* fix(server): stop OpenCode child sessions (pingdotgg#9005)
* perf(web): defer pull request line stats until visible (pingdotgg#6471)
Co-authored-by: Theo Browne <me@t3.gg>
* perf(server): skip full-message reads while streaming (pingdotgg#9032)
* perf(client-runtime): halve server config bootstrap traffic (pingdotgg#8367)
Reuse one server config subscription for session bootstrap and live updates.
Preserve environment theme opt-in, replay, deletion, slow subscriber recovery, and config stream failure handling.
Co-authored-by: Adamulek123 <adam.bogucki2018@gmail.com>
* fix(web): align un-settle banner action (pingdotgg#9033)
* fix(web): block type-to-focus behind open dialogs (pingdotgg#8139)
Co-authored-by: Simone <185146821+Lucenx9@users.noreply.github.com>
* feat(shortcuts): copy active thread reference (pingdotgg#8994)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(mobile): keep thread scroll bounds current after animations (pingdotgg#9013)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(server): cache project favicon resolution (pingdotgg#9080)
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
* feat(claude): add Claude Fable 5.1 model (pingdotgg#9078)
* fix(preview): restore recording and macOS rendering after Electron 43 (pingdotgg#9001)
Co-authored-by: Guillermo Casanova <guillermo.casanova.b@gmail.com>
* feat(desktop): add configurable quit shortcut confirmation (pingdotgg#9076)
* feat(web): open project settings from thread menus (pingdotgg#8925)
* fix(chat): reuse one row for live activity (pingdotgg#9062)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* feat(models): discover Claude models from remote manifest (pingdotgg#9084)
* Revert "fix(chat): reuse one row for live activity" (pingdotgg#9096)
* fix(web): sync sidebar PR state from open panel (pingdotgg#9092)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: maria <254055478+maria-rcks@users.noreply.github.com>
* fix(web): changing projects no longer creates a draft (pingdotgg#9097)
* fix(web): keep theme placeholder text dimmer than entered text (pingdotgg#9104)
* fix(web): keep the selected environment when changing projects (pingdotgg#9102)
* docs(plans): t3o-31 upstream sync to v0.0.38
* fix(board): clear the ten pre-existing typecheck errors before the upstream sync (t3o-31 P0)
Two test fakes failed with a bare Error in the Effect failure channel, a
closure-assigned let narrowed to never, and a single-override pill read
overriddenRows[0] under noUncheckedIndexedAccess. None changed behaviour;
they were masked because the recursive typecheck never reached apps/server.
* fix(sync): the three type errors and two test failures the v0.0.38 merge caused
- BoardModelRow reads planModeEnabled from client settings, as the composer does.
- findBranchPullRequest resolves the default branch for upstream's widened PR
cache key instead of passing null.
- The orphaned-session integration test mocks the supervisor reactor that the
startup seam yields (new inventory row).
- The projection resume test seeds board projector watermarks into
boards.projection_state, where t3o-26 reads them, and asserts over the union.
- searchSettings("work") now also matches upstream's worktree/network items.
* refactor(board): native title attributes become BoardHint tooltips
Upstream's new no-native-title-tooltip rule flags every intrinsic-element
title= in the board (61 sites). BoardHint wraps the styled Tooltip primitive
and renders its child as the trigger, so layout is unchanged; a nullish label
renders the child alone.
* docs(seams): record the v0.0.38 sync (t3o-31)
Merge-log row, the decisions taken (plans stay tracked, upstream's settlement
reactor accepted after audit, projector-enumeration policy, launcher protocol
note), an unmarked-edits debt table for the next sync, a marker census, the
three new upstream workflows to disable, and the runbook's per-package
verification notes.
* review(t3o-31): announce the board's status dots, and order the merge log
Round-1 nitpicks: a bare span's aria-label is not announced, so the working,
running and awaiting dots now carry role="img"; the v0.0.38 merge-log row
moves below the two 2026-08-09 rows so the table reads chronologically.
---------
Co-authored-by: Theo Browne <me@t3.gg>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Dara Adedeji <76637177+SunkenInTime@users.noreply.github.com>
Co-authored-by: shivam <91240327+shivamhwp@users.noreply.github.com>
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: abcdmku <63693423+abcdmku@users.noreply.github.com>
Co-authored-by: Guilherme Barros <gbarros1095@gmail.com>
Co-authored-by: Rishet11 <154429365+Rishet11@users.noreply.github.com>
Co-authored-by: Alex <me@pixp.cc>
Co-authored-by: maria <254055478+maria-rcks@users.noreply.github.com>
Co-authored-by: Naveed Iqbal <naveediqbal949@gmail.com>
Co-authored-by: Ishaan Kothari <ishaanko.mail@gmail.com>
Co-authored-by: Exotic <118054752+extoci@users.noreply.github.com>
Co-authored-by: Utkarsh Patil <73941998+UtkarshUsername@users.noreply.github.com>
Co-authored-by: Bilal Bakr <62337003+Bil0000@users.noreply.github.com>
Co-authored-by: Rakshith Bhat <88523594+RakshithBhat03@users.noreply.github.com>
Co-authored-by: Simone <lucenz@proton.me>
Co-authored-by: Simone <185146821+Lucenx9@users.noreply.github.com>
Co-authored-by: Tristan Knight <admin@snappeh.com>
Co-authored-by: Wout Stiens <71498452+StiensWout@users.noreply.github.com>
Co-authored-by: Pavlo Trinko <paul.trinko95@gmail.com>
Co-authored-by: codex <codex@users.noreply.github.com>
Co-authored-by: Julius Marminge <julius0216@outlook.com>
Co-authored-by: Rodrigo Brechard <rodrigobrechard@gmail.com>
Co-authored-by: Rodrigo Brechard <rodrigo@clubtidy.fr>
Co-authored-by: Adamulek123 <adam.bogucki2018@gmail.com>
Co-authored-by: spiky02plateau <155588579+spiky02plateau@users.noreply.github.com>
Co-authored-by: Carlos Jimenez <cjimenez@r21digital.com>
Co-authored-by: Mark Griffin <mrmg@deflexion.net>
Co-authored-by: MacKinley Smith <smithmackinley@gmail.com>
Co-authored-by: oliver <97427849+flamboh@users.noreply.github.com>
Co-authored-by: mweinbach <maxweinbach5@gmail.com>
Co-authored-by: Lars Nieuwenhuis <35393046+lnieuwenhuis@users.noreply.github.com>
Co-authored-by: Mohtasham Murshid <154406804+MohtashamMurshid@users.noreply.github.com>
Co-authored-by: Dara Adedeji <daraaded@amazon.com>
Co-authored-by: Dara Adedeji <daraadedeji07@gmail.com>
Co-authored-by: Ahmed Besic <ahmed-besic@users.noreply.github.com>
Co-authored-by: Michael Brown <michaeltbrown.mtb@gmail.com>
Co-authored-by: PC <pc@localhost>
Co-authored-by: 1xpixi <157762409+1xpixi@users.noreply.github.com>
Co-authored-by: Josh <gitlucky@pipelab.org>
Co-authored-by: Tradi3 <56069280+krutftw@users.noreply.github.com>
Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
Co-authored-by: Ivan Malison <IvanMalison@gmail.com>
Co-authored-by: Yash Singh <saiansh2525@gmail.com>
Co-authored-by: Gianmarco <gianmarcosimone89@gmail.com>
Co-authored-by: Julius Marminge <julius@mac.lan>
Co-authored-by: Illia Panasenko <hello@ipanasenko.me>
Co-authored-by: Matheson Steplock <ikifar2012@users.noreply.github.com>
Co-authored-by: Anirudh Coontoor <anirudh@gosupernova.live>
Co-authored-by: Nick Anisimov <n.anisimov.23@gmail.com>
Co-authored-by: Muhammad Waleed <114993336+walid-baharwal@users.noreply.github.com>
Co-authored-by: Ryan Hughes <ryan@heyoodle.com>
Co-authored-by: Vitaly Iegorov <vitalyiegorov@gmail.com>
Co-authored-by: Ahmed Besic <ahmed.besic2000@gmail.com>
Co-authored-by: maria <maria@kuuro.net>
Co-authored-by: Matthew Feroz <136640686+MatthewFeroz@users.noreply.github.com>
Co-authored-by: Julius Marminge <jmarminge@gmail.com>
Co-authored-by: Aditya Garud <153842990+yashranaway@users.noreply.github.com>
Co-authored-by: Yukun Shan <92423096+nateEc@users.noreply.github.com>
Co-authored-by: Will Sheldon <will@autimo.com>
Co-authored-by: mic <85814106+q1@users.noreply.github.com>
Co-authored-by: Guillermo Casanova <guillermo.casanova.b@gmail.com>
juliusmarminge added a commit that referenced this pull request Sep 2, 2026
Round-16 rebase onto main (5 commits, headlined by #8236 file
attachments in the client). Main's upload-aware send path — capability
probes, upload await/retry gating, uploaded-ref turn attachments with
dataUrl fallback, draft release on success — is woven into the v2
dispatch flow, timeline user rows render file attachments as download
links with the ChatView download handler, and the provider settings
editor cleanup keeps the branch's environment-field rows. The codex
feedback client flow stays unported, replay testkit configs gained
main's environmentThemesDir, and the rpc/settings/docs unions carry
both sides.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XXL1,000+ changed lines (additions + deletions).vouch:trustedPR 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

@t3dotgg
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

feat(web): attach PDFs, ZIPs, and other files to a turn - #8236

Merged
t3dotgg merged 29 commits into
mainfrom
t3code/file-attachments-web
Aug 29, 2026
Merged

feat(web): attach PDFs, ZIPs, and other files to a turn#8236
t3dotgg merged 29 commits into
mainfrom
t3code/file-attachments-web

Conversation

@t3dotgg

@t3dotggt3dotgg commented Aug 25, 2026

Copy link
Copy Markdown
Member

The file upload APIs and tolerant attachment contracts from #8235 are now on main. This PR adds the web client for them.

The composer accepts PDFs, ZIPs, and other files up to the server's advertised limit through the paperclip button or paste. Uploads start while the user types, survive draft and stash moves, and render as rows that download with the original filename. Unknown attachment types render as inert rows instead of crashing the thread.

One shared upload flow in packages/client-runtime owns verification, transfer, release, and size limits. Draft discard, project delete, stash, file removal, and send cleanup all use that flow. Interrupted uploads return as "Attach again" markers instead of disappearing.

Release warning: clients with the old image-only attachment contract cannot decode threads that contain file attachments. The compatibility work in #8235 makes the merged server contract tolerant and keeps existing mobile code from treating files as images. Hold the web release until a compatible mobile build is available. #8237 adds mobile file support.

Original work by Theo Browne with Claude Fable 5 in the Claude Code harness. Modernized by GPT-5.6 Sol in the Codex harness.


Note

Medium Risk
Touches the turn send/upload pipeline and draft persistence; threads with file attachments require a tolerant client contract, so release coordination with older mobile builds matters.

Overview
Adds generic file attachments to the chat composer (paperclip, paste, drag) alongside images, with images and files sharing the per-turn attachment cap and server-advertised size limits.

Send and upload path:ChatView snapshots images and files together, runs shared upload/capability checks before and after upload, builds optimistic file rows, and wires timeline on-demand downloads via signed asset URLs. Annotation screenshots respect the combined attachment limit so prompts do not claim crops that were not sent.

Composer UX:ChatComposer stages file rows (upload progress, retry, “attach again” after interrupted uploads), blocks send when capabilities or limits fail, and extends stash restore/save to persisted file uploads with environment checks and expiry verification.

Persistence:composerDraftStore persists file metadata (upload ids or needs-reattach markers), enforces combined limits, and handles moves across threads/environments. Plan follow-up actions hide while any composer attachment is staged (shouldShowPlanFollowUpPrompt).

Timeline: User messages render non-image attachments as download links or inert rows for unknown types. Project/sidebar draft counts include files; project delete passes thread refs when releasing draft uploads.

Reviewed by Cursor Bugbot for commit 129f2ad. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Add PDF, ZIP, and generic file attachment support to chat turns

  • Extends the chat composer to support generic file attachments alongside images, including selection via paste or paperclip button, progress tracking, and retry controls
  • Updates composerDraftStore, attachmentUploadQueue, and prompt stash store to persist file metadata, deduplicate attachments, manage upload lifecycles, and handle cross-environment moves
  • Adds server capability checks to enforce staging limits and reject non-image files on servers that lack upload support
  • Renders received file attachments in the timeline as downloadable links or buttons using generated signed URLs
  • Risk: Non-image attachments now throw an error during send if the server does not support attachment uploads; cross-environment draft moves strip source upload linkage for byte-backed files

Macroscope summarized 129f2ad.

@coderabbitai

coderabbitaiBot commented Aug 25, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 7697ac98-d68b-4b0a-aa8c-fb19042ba35d

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

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

@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:XXL 1,000+ changed lines (additions + deletions). labels Aug 25, 2026
@github-actions

github-actionsBot commented Aug 25, 2026

Copy link
Copy Markdown
Contributor

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

ProviderMetricMain baselineThis PRImpactPR ceiling
CodexTotal thread wire13.3 KiB13.3 KiB−29 B (−0.2%)15.1 KiB
CodexThread snapshot wire6.9 KiB6.9 KiB−6 B (−0.1%)7.3 KiB
CodexLive turn WebSocket wire6.4 KiB6.4 KiB−23 B (−0.3%)7.8 KiB
CodexLive turn WebSocket decoded55.6 KiB55.6 KiB−44 B (−0.1%)66.4 KiB
CodexLive turn messages1110−1 (−9.1%)21
ClaudeTotal thread wire13.3 KiB13.3 KiB−56 B (−0.4%)15.1 KiB
ClaudeThread snapshot wire6.9 KiB6.9 KiB−1 B (−0.0%)7.3 KiB
ClaudeLive turn WebSocket wire6.4 KiB6.4 KiB−55 B (−0.8%)7.8 KiB
ClaudeLive turn WebSocket decoded56.4 KiB56.4 KiB−88 B (−0.2%)66.4 KiB
ClaudeLive turn messages119−2 (−18.2%)21

Baseline: 0e2905e · PR result: 129f2ad · 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: 109.4 KiB
  • Claude decoded thread snapshot: 110.1 KiB

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

@macroscopeappmacroscopeappBot 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.

Reviewed the new/changed Effect-adjacent code (packages/client-runtime/src/state/attachments.ts, apps/web/src/state/attachments.ts, and the web upload-queue call sites) against the service conventions. The new createAttachmentEnvironmentAtoms factory correctly mirrors createAssetEnvironmentAtoms (runtime passed in, no hidden globals, no ManagedRuntime/runPromise outside the existing atom-command boundary), and no service tags/layers were moved or redefined. One predicate convention issue below.

Posted via Macroscope — Effect Service Conventions

Comment threadpackages/client-runtime/src/state/attachments.ts Outdated
Comment threadapps/web/src/lib/attachmentUploadQueue.ts
Comment threaddocs/user/composer.md Outdated
Comment threadapps/web/src/composerDraftStore.ts
@macroscopeapp

macroscopeappBot commented Aug 25, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Not approved

Macroscope's review found this PR not approvable — This change introduces a substantial production workflow for uploading, persisting, transferring, deleting, and downloading user files alongside turns. Its broad runtime surface and server-side file lifecycle warrant human review despite extensive tests and backward-compatible persistence.

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

Comment threadapps/web/src/lib/attachmentUploadQueue.ts Outdated

@macroscopeappmacroscopeappBot 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.

Reviewed the web composer/timeline attachment UI. Two interaction findings on changed lines, both about the new needs-reattach / capacity paths giving the user no working path or feedback.

Posted via Macroscope — UI Consistency

Comment threadapps/web/src/components/chat/ChatComposer.tsx
Comment threadapps/web/src/composerDraftStore.ts
Comment threadapps/web/src/lib/attachmentUploadQueue.ts
Comment threadapps/web/src/composerDraftStore.ts Outdated
Comment threadapps/web/src/composerDraftStore.ts
Comment threadapps/web/src/composerDraftStore.ts Outdated
Comment threadapps/web/src/components/chat/ChatComposer.tsx

@macroscopeappmacroscopeappBot 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.

One finding: the new file-attachment download button in MessagesTimeline renders its filename center-aligned, unlike the visually identical anchor and inert rows next to it.

Posted via Macroscope — UI Consistency

Comment threadapps/web/src/components/chat/MessagesTimeline.tsx Outdated
@t3dotgg
t3dotggforce-pushed the t3code/file-attachments-web branch from c88f3df to 33d67f9CompareAugust 26, 2026 08:58
Comment threadapps/web/src/components/chat/ChatComposer.tsx
Comment threadapps/web/src/components/chat/composerAttachmentFiles.ts
Comment threadapps/web/src/components/chat/ChatComposer.tsx
@t3dotgg
t3dotggforce-pushed the t3code/file-attachments-web branch from 7abf833 to 1dd3cc0CompareAugust 26, 2026 09:29
Comment threadapps/web/src/components/ChatView.tsx
Comment threadapps/web/src/components/chat/ChatComposer.tsx Outdated
Comment threadapps/web/src/hooks/useHandleNewThread.ts

@macroscopeappmacroscopeappBot 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.

One finding on the new send-block wording in ChatComposer. The rest of the attachment UI (file rows, paperclip trigger, stash menu file badge, timeline file rows) reuses the existing primitives and row treatments consistently, and the earlier findings on the timeline download row alignment, the marker re-pick path, and the swallowed paste are resolved.

Posted via Macroscope — UI Consistency

Comment threadapps/web/src/components/chat/ChatComposer.tsx Outdated
Comment threadapps/web/src/components/chat/ChatComposer.tsx
Comment threadapps/web/src/components/ChatView.tsx Outdated

@macroscopeappmacroscopeappBot 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.

One finding: the needs-reattach file row label ignores the canReattachFiles guard that the send-block reason uses, so on a server without file-attachment support (or before the capability arrives) the row tells the user to attach again while no attach control is rendered.

Posted via Macroscope — UI Consistency

Comment threadapps/web/src/components/chat/ChatComposer.tsx
Comment threadapps/web/src/components/chat/ChatComposer.tsx
juliusmarminge added a commit that referenced this pull request Aug 29, 2026
PRs #8437 and #8236 crossed: one made stashShortcutLabel a required
ComposerStashMenu prop, the other added a test case without it, so
main fails web typecheck.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 29, 2026
Round-16 rebase onto main (5 commits, headlined by #8236 file
attachments in the client). Main's upload-aware send path — capability
probes, upload await/retry gating, uploaded-ref turn attachments with
dataUrl fallback, draft release on success — is woven into the v2
dispatch flow, timeline user rows render file attachments as download
links with the ChatView download handler, and the provider settings
editor cleanup keeps the branch's environment-field rows. The codex
feedback client flow stays unported, replay testkit configs gained
main's environmentThemesDir, and the rpc/settings/docs unions carry
both sides.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
github-actionsBot added a commit to omarcresp/t3code-flake that referenced this pull request Aug 29, 2026
## What's Changed
* feat(web): attach PDFs, ZIPs, and other files to a turn by @t3dotgg in pingdotgg/t3code#8236
* feat(web): keybinding settings as settings rows by @StiensWout in pingdotgg/t3code#8532
* feat: let an environment publish themes as a file by @ryanrhughes in pingdotgg/t3code#8569
* fix(web): clean up provider settings list and editor by @StiensWout in pingdotgg/t3code#8504
* fix(web): keep project picker popup inside the sidebar by @SunkenInTime in pingdotgg/t3code#8627
* fix(mobile): prevent header overflow and back-button artifacts by @juliusmarminge in pingdotgg/t3code#8624
## New Contributors
* @ryanrhughes made their first contribution in pingdotgg/t3code#8569
**Full Changelog**: pingdotgg/t3code@v0.0.37-nightly.20260829.1218...v0.0.37-nightly.20260829.1219
Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.37-nightly.20260829.1219
netpro2k added a commit to netpro2k/t3code that referenced this pull request Aug 29, 2026
Intent:
Expose the generic-file backend shipped in v0.0.36 through the web and desktop composer while following the official client implementation closely enough for its upstream PR to replace this patch cleanly.
Behavior:
- Accept images and generic files through the paperclip button, paste, and drag-and-drop; share the eight-attachment limit and use the server-advertised generic-file limit, currently 50 MB.
- Upload while the user composes, show progress/retry/reattach states, and render sent files as signed downloads with their original names.
- Preserve file drafts and stashes as server upload references or explicit needs-reattach markers instead of storing generic-file bytes in localStorage.
- Keep upload verification, cleanup, retry, environment moves, and unknown attachment rendering explicit.
- Show file names in the current mobile feed and include attachment names in transcript bootstrap context.
Design constraints:
- Backport official upstream PR pingdotgg#8236 at 129f2ad, rebased onto v0.0.36, rather than maintaining a parallel client upload architecture.
- Use packages/client-runtime for the shared upload lifecycle and clamp file sizes to the server capability and contract maximum.
- Require direct-upload support for generic files. Do not retain the fork inline-file protocol or serialize generic-file bytes into drafts and stashes.
- Upload local workspace drops like the official client; do not retain the competing desktop-only drop-to-mention behavior.
- Keep images on their established compression and compatibility path.
Integration:
- Shared client-runtime upload lifecycle and web environment atoms.
- Web composer, drafts, prompt stashes, upload queue, message timeline, signed asset downloads, sidebar counts, project cleanup, and user documentation.
- Minimal current mobile feed visibility and transcript bootstrap naming remain fork-only until the official follow-up covers them.
Verification:
- Official attachment-focused web and client-runtime tests pass (7 files, 196 tests).
- Targeted client-runtime, web, and mobile typechecks pass; the existing client-runtime Effect diagnostic remains advisory.
Rebase notes:
- Upstream PR pingdotgg#8236 should supersede the web/client-runtime implementation wholesale once merged.
- Upstream PR pingdotgg#8237 should supersede the temporary mobile filename row with signed mobile downloads and full mobile file picking/sharing.
- Recheck only the transcript-bootstrap filename summary after both PRs land.
- The v0.0.36 stashShortcutLabel test fixture is the only adaptation to the rebased official PR tree.
longtngo added a commit to longtngo/t3code that referenced this pull request Aug 29, 2026
Range f6f2be3..053affb, v0.0.36. 411 upstream files, 632 fork files,
81 touched by both, 19 conflicted.
Competing implementations resolved toward the fork's superset:
- Claude context usage (pingdotgg#8610). Upstream deleted `queryCurrentContextUsage` and
`normalizeClaudeContextUsageApiSnapshot` outright. `getContextUsage` is the ONLY
source of the compaction facts (`autocompactSource`, `autoCompactThreshold`,
`isAutoCompactEnabled`) the Vitals gauge's compaction note and marker render from,
and they travel on the wire contract, so the call is kept. Upstream's
`latestAssistantUsage` tracking and its post-compaction guard are adopted BELOW it
as the next-best fallback: `contextUsageSnapshot ?? latestAssistantSnapshot ?? ...`.
Upstream removed `getContextUsage` from `ClaudeQueryRuntime`, the
`SDKControlGetContextUsageResponse` import and the `Option` import outside every
conflict marker; all three restored.
- Provider settings editor (pingdotgg#8472). Upstream's `useEffect` + `lastPublishedEnvironmentRef`
re-seed is the superset of the fork's render-phase `seededRef` (8fe3190, one of four
silent-data-loss fixes). The merge had kept BOTH mechanisms; collapsed to upstream's,
with the fork's half-typed-row null guard on the publish path. `environmentKey` deleted
with the code it served.
- Sidebar project combobox (pingdotgg#5931). Upstream replaced the menu-based project filter,
whose `MenuRadioItem` carried the fork's project-actions button. Rebuilt on upstream's
`ComboboxItem` with the ellipsis button grafted back (invariant 6). The dead `Menu*`
import is gone.
- Composer attachments (pingdotgg#8236). Upstream's `addComposerAttachments` pipeline adopted; the
fork's drop split (image -> attach, other -> absolute path with upload fallback) kept
and repointed at the new handler.
- Mid-turn steer. Upstream's `steeringTurnState` branch rejected again (invariant 5); its
side of that hunk also opened an `if` whose brace lives below the hunk.
- Thread deletion drain (pingdotgg#8226). Upstream replaced `drain` with `drainThrough(sequence)`;
the fork's test retargeted. Its new drain test observed `ProviderService.stopSession`,
which this reactor never calls (it dispatches `thread.session.stop`), so it now counts
engine dispatches and provides the two services the fork's reactor needs.
Three defects the resolutions introduced, each caught by a check that is not the suite:
- `shouldShowBranchMismatchBanner` was resurrected into two import lists by resolving
them toward upstream. Fork commit cfdf255 replaced that function; the import had no
definition. Found by the RESURRECTED sweep.
- `scriptPath` ended up declared twice in CodexCollabRuntime.integration.test.ts: `both`
reintroduced upstream's fixture-dir copy that the fork deliberately moved to a temp dir.
Found by the RESURRECTED sweep.
- `setProjectScopeMenuOpen` survived in the fork's `handleProjectActions` after upstream
replaced that state with a reducer, outside every marker. Found by typecheck.
Upstream regressions of fork fixes, kept fixed:
- Raw NUL bytes returned to ChatComposer.tsx. A raw NUL renders as nothing in grep and
aborts BSD sed mid-file; the fork had converted all six to `\0` escapes and carries a
guard test for it. The guard failed, and the offending line reads as space-separated in
any normal diff. Converted back to escapes.
- `defaultTheme` / `defaultThemeSetAt` (pingdotgg#8569) are absent from `ServerSettingsPatch`; the
fork's patch-parity guard caught it. They are owned by `t3 theme set`, which rewrites
settings.json directly and which clients only read, so they are recorded as deliberately
unpatchable rather than mirrored.
- The fork's mobile held-messages strip used `dark:` variants that upstream's new Uniwind
theme rule (pingdotgg#7327) forbids; moved to the `text-foreground-muted` semantic token rather
than added to the rule's allowlist.
Invariants: all re-probed against the merged tree. 1 (49 migrations, ids unique and
monotonic, max 50, 34 burned), 2 (the fork-only @effect/platform-node patch survived the
Expo 57 rewrite of patchedDependencies, is pinned, resolved and applied on disk; effect
stays at beta.103 so no re-pin), 3, 4, 4b (4 `isSendBlocked=`), 5, 5b, 5c, 6, 7, 8, 9, 10,
11 all hold.
Sweeps: resurrected 3, dropped 21, fork-loss 45, both-kept 0. Every entry named: the 3
resurrected and the fork-loss in ProviderInstanceCard / ChatComposer / Sidebar are the
decisions above; the OpenCode fork-loss is 11 comment lines whose guard upstream extracted
into `deleteContextIfCurrent` (the rationale is restored on the helper); pnpm-lock churn is
the install. Test declarations 18,691 -> 19,081; one file lost one, upstream's own pingdotgg#8484.
Gate: pnpm run verify green, exit 0 read from the captured log line. 14 blocks,
10,744 passed, 20 skipped, 0 failures.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
netpro2k added a commit to netpro2k/t3code that referenced this pull request Aug 29, 2026
Intent:
Expose the generic-file backend shipped in v0.0.36 through the web and desktop composer while following the official client implementation closely enough for its upstream PR to replace this patch cleanly.
Behavior:
- Accept images and generic files through the paperclip button, paste, and drag-and-drop; share the eight-attachment limit and use the server-advertised generic-file limit, currently 50 MB.
- Upload while the user composes, show progress/retry/reattach states, and render sent files as signed downloads with their original names.
- Preserve file drafts and stashes as server upload references or explicit needs-reattach markers instead of storing generic-file bytes in localStorage.
- Keep upload verification, cleanup, retry, environment moves, and unknown attachment rendering explicit.
- Show file names in the current mobile feed and include attachment names in transcript bootstrap context.
Design constraints:
- Backport official upstream PR pingdotgg#8236 at 129f2ad, rebased onto v0.0.36, rather than maintaining a parallel client upload architecture.
- Use packages/client-runtime for the shared upload lifecycle and clamp file sizes to the server capability and contract maximum.
- Require direct-upload support for generic files. Do not retain the fork inline-file protocol or serialize generic-file bytes into drafts and stashes.
- Upload local workspace drops like the official client; do not retain the competing desktop-only drop-to-mention behavior.
- Keep images on their established compression and compatibility path.
Integration:
- Shared client-runtime upload lifecycle and web environment atoms.
- Web composer, drafts, prompt stashes, upload queue, message timeline, signed asset downloads, sidebar counts, project cleanup, and user documentation.
- Minimal current mobile feed visibility and transcript bootstrap naming remain fork-only until the official follow-up covers them.
Verification:
- Official attachment-focused web and client-runtime tests pass (7 files, 196 tests).
- Targeted client-runtime, web, and mobile typechecks pass; the existing client-runtime Effect diagnostic remains advisory.
Rebase notes:
- Upstream PR pingdotgg#8236 should supersede the web/client-runtime implementation wholesale once merged.
- Upstream PR pingdotgg#8237 should supersede the temporary mobile filename row with signed mobile downloads and full mobile file picking/sharing.
- Recheck only the transcript-bootstrap filename summary after both PRs land.
- The v0.0.36 stashShortcutLabel test fixture is the only adaptation to the rebased official PR tree.
juliusmarminge added a commit that referenced this pull request Aug 30, 2026
Round-16 rebase onto main (5 commits, headlined by #8236 file
attachments in the client). Main's upload-aware send path — capability
probes, upload await/retry gating, uploaded-ref turn attachments with
dataUrl fallback, draft release on success — is woven into the v2
dispatch flow, timeline user rows render file attachments as download
links with the ChatView download handler, and the provider settings
editor cleanup keeps the branch's environment-field rows. The codex
feedback client flow stays unported, replay testkit configs gained
main's environmentThemesDir, and the rpc/settings/docs unions carry
both sides.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
bcotrim pushed a commit to bcotrim/mognet that referenced this pull request Aug 30, 2026
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
(cherry picked from commit bcb855a)
bcotrim pushed a commit to bcotrim/mognet that referenced this pull request Aug 30, 2026
PRs pingdotgg#8437 and pingdotgg#8236 crossed: one made stashShortcutLabel a required
ComposerStashMenu prop, the other added a test case without it, so
main fails web typecheck.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
(cherry picked from commit d22709f)
juliusmarminge added a commit that referenced this pull request Aug 30, 2026
Round-16 rebase onto main (5 commits, headlined by #8236 file
attachments in the client). Main's upload-aware send path — capability
probes, upload await/retry gating, uploaded-ref turn attachments with
dataUrl fallback, draft release on success — is woven into the v2
dispatch flow, timeline user rows render file attachments as download
links with the ChatView download handler, and the provider settings
editor cleanup keeps the branch's environment-field rows. The codex
feedback client flow stays unported, replay testkit configs gained
main's environmentThemesDir, and the rpc/settings/docs unions carry
both sides.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
imsherrill pushed a commit to comprehensiveio/compadre that referenced this pull request Aug 31, 2026
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
(cherry picked from commit bcb855a)
imsherrill added a commit to comprehensiveio/compadre that referenced this pull request Aug 31, 2026
…) (#2)
(cherry picked from commit bcb855a)
Co-authored-by: Theo Browne <me@t3.gg>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
netpro2k added a commit to netpro2k/t3code that referenced this pull request Aug 31, 2026
Intent:
Keep transcript bootstrap context aware of generic file attachments now that upstream web and mobile clients support their full upload and rendering lifecycle.
Behavior:
- Count every message attachment in transcript bootstrap context, not only images.
- Include up to three attachment names plus an additional-count suffix.
- Preserve image/images wording when every attachment is an image; otherwise use file/files.
Design constraints:
- Rely entirely on upstream attachment upload, draft, stash, rendering, download, and mobile behavior.
- Keep this patch limited to the text supplied to transcript bootstrap.
Integration:
- Web transcript bootstrap summary only. No client upload, server, contract, mobile, or storage changes.
Verification:
- Upstream PRs pingdotgg#8236 and pingdotgg#8237 were audited as superseding the former attachment backport except for this summary behavior.
- Targeted web verification is rerun after the complete patch stack rebases.
Rebase notes:
- Drop this patch only when upstream transcript bootstrap includes generic attachment names rather than filtering to images.
github-actionsBot added a commit to omarcresp/t3code-flake that referenced this pull request Aug 31, 2026
## What's Changed
* Remove Messages Glass Lab experiment by @juliusmarminge in pingdotgg/t3code#8599
* Require human review for pull requests changing product defaults by @juliusmarminge in pingdotgg/t3code#8603
* fix(codex): avoid quadratic app-server input buffering by @juliusmarminge in pingdotgg/t3code#8605
* fix(mobile): stabilize iOS header item transitions by @juliusmarminge in pingdotgg/t3code#8607
* chore(mobile): upgrade to Expo SDK 57 by @juliusmarminge in pingdotgg/t3code#8609
* fix(mobile): harden native header toolbar items by @juliusmarminge in pingdotgg/t3code#8611
* fix(server): stop querying Claude context usage after turns by @t3dotgg in pingdotgg/t3code#8610
* chore: vouch ryanrhughes by @t3dotgg in pingdotgg/t3code#8613
* feat(web): attach PDFs, ZIPs, and other files to a turn by @t3dotgg in pingdotgg/t3code#8236
* feat(web): keybinding settings as settings rows by @StiensWout in pingdotgg/t3code#8532
* feat: let an environment publish themes as a file by @ryanrhughes in pingdotgg/t3code#8569
* fix(web): clean up provider settings list and editor by @StiensWout in pingdotgg/t3code#8504
* fix(web): keep project picker popup inside the sidebar by @SunkenInTime in pingdotgg/t3code#8627
* fix(mobile): prevent header overflow and back-button artifacts by @juliusmarminge in pingdotgg/t3code#8624
* fix(server): retry automatic thread title generation by @Bil0000 in pingdotgg/t3code#8087
* fix(client-runtime): refresh edited pull request comments by @Bil0000 in pingdotgg/t3code#8094
* fix(web): four composer spacing defects by @Bil0000 in pingdotgg/t3code#8090
* perf(desktop): skip duplicate browser updates by @Bil0000 in pingdotgg/t3code#8018
* fix(web): render nested markdown images correctly by @flamboh in pingdotgg/t3code#8501
* fix(web): unify activity logs and composer banners by @juliusmarminge in pingdotgg/t3code#8693
* fix(mobile): reduce dev-client reload and Metro startup cost by @juliusmarminge in pingdotgg/t3code#8694
* revert(web): restore previous composer banners by @t3dotgg in pingdotgg/t3code#8733
* test(web): remove tests for unreachable helpers by @t3-code[bot] in pingdotgg/t3code#8738
* feat(mobile): update tool summaries and chat transitions by @juliusmarminge in pingdotgg/t3code#8793
* feat(web): play video attachments in chat by @Bil0000 in pingdotgg/t3code#8688
* fix(web,mobile): snooze menu no longer offers the same wake time twice by @vitalyiegorov in pingdotgg/t3code#8741
* fix(grok): allow model changes in existing threads by @ahmed-besic in pingdotgg/t3code#8392
* feat(mobile): pick, share, and receive files in threads by @t3dotgg in pingdotgg/t3code#8237
* fix(web): reduce title bar scroll fade height by @maria-rcks in pingdotgg/t3code#8799
* fix(windows): strip quotes from repaired PATH by @UtkarshUsername in pingdotgg/t3code#8746
* fix(web): open agent images in expanded preview by @maria-rcks in pingdotgg/t3code#8807
* fix(git): follow repository instructions in generated source control text by @maria-rcks in pingdotgg/t3code#8804
* fix(server): stop overpricing cached Claude tokens by @SunkenInTime in pingdotgg/t3code#8806
* fix(web): keep image preview above sidebar control by @maria-rcks in pingdotgg/t3code#8811
* fix(web): keep right panel synced with agent edits by @maria-rcks in pingdotgg/t3code#8803
* fix(web,mobile): render Codex citations and artifact templates by @Yash-Singh1 in pingdotgg/t3code#8584
* chore: add Windows setup script to t3.json by @UtkarshUsername in pingdotgg/t3code#8814
* fix(web): fold interim turn responses by @maria-rcks in pingdotgg/t3code#8828
* fix(web): use circle alert for failed tool calls by @maria-rcks in pingdotgg/t3code#8840
* feat(mobile): add offline iPhone voice input by @t3dotgg in pingdotgg/t3code#8614
* fix(web): prevent pull request metadata overlap by @MatthewFeroz in pingdotgg/t3code#8790
## New Contributors
* @ryanrhughes made their first contribution in pingdotgg/t3code#8569
* @ahmed-besic made their first contribution in pingdotgg/t3code#8392
* @MatthewFeroz made their first contribution in pingdotgg/t3code#8790
**Full Changelog**: pingdotgg/t3code@v0.0.36...v0.0.37
Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.37
amitbet pushed a commit to amitbet/a2code that referenced this pull request Sep 1, 2026
Upstream shipped its own arbitrary file attachments (pingdotgg#8235/pingdotgg#8236/pingdotgg#8237), a
strict superset of the fork's, so that divergence is retired rather than
re-applied. Upstream also reverted its turn-plan chips, restructured provider
settings into list+editor, made the project picker a searchable combobox, and
replaced the mobile CSS-variable theme hook with useUniwindTheme.
Fork features preserved: thread forking, queued-prompt steering, in-chat find,
answered user-input rows, machine-scoped environments, provider health-check
cache, provider "Default traits", live quota meter, thread export/pinning,
payload hot-update channel, and the build-only CI surface.
See FORK_NOTES.md for the per-file migration notes.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Sep 1, 2026
Round-16 rebase onto main (5 commits, headlined by #8236 file
attachments in the client). Main's upload-aware send path — capability
probes, upload await/retry gating, uploaded-ref turn attachments with
dataUrl fallback, draft release on success — is woven into the v2
dispatch flow, timeline user rows render file attachments as download
links with the ChatView download handler, and the provider settings
editor cleanup keeps the branch's environment-field rows. The codex
feedback client flow stays unported, replay testkit configs gained
main's environmentThemesDir, and the rpc/settings/docs unions carry
both sides.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Coriou added a commit to Coriou/txcode that referenced this pull request Sep 1, 2026
Upstream tip (bcb855a, pingdotgg#8236) rewrote the third render's entries and
dropped the required stashShortcutLabel prop, leaving upstream's own web
typecheck red. Completed the fixture; candidate for an upstream report.
juliusmarminge added a commit that referenced this pull request Sep 2, 2026
Round-16 rebase onto main (5 commits, headlined by #8236 file
attachments in the client). Main's upload-aware send path — capability
probes, upload await/retry gating, uploaded-ref turn attachments with
dataUrl fallback, draft release on success — is woven into the v2
dispatch flow, timeline user rows render file attachments as download
links with the ChatView download handler, and the provider settings
editor cleanup keeps the branch's environment-field rows. The codex
feedback client flow stays unported, replay testkit configs gained
main's environmentThemesDir, and the rpc/settings/docs unions carry
both sides.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
brentkelly added a commit to brentkelly/t3code-orchestrator that referenced this pull request Sep 2, 2026
* feat(analytics): threads and turns now know which client started them (pingdotgg#7774)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(web): stop marking mixed tool runs as failed (pingdotgg#7893)
* fix(web): command-click spaced folder links (pingdotgg#6439)
Co-authored-by: shivam <91240327+shivamhwp@users.noreply.github.com>
* fix(chat): stop pushing follow-up messages to the top (pingdotgg#7897)
* test(desktop): remove redundant release note assertion (pingdotgg#7873)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
* fix(web): handle wide ordered-list marker edge cases (pingdotgg#7856)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(ssh): restore user PATH for remote servers (pingdotgg#7213)
* fix(desktop): keep tailscale spawn defects from breaking advertised endpoints (pingdotgg#7116)
* fix(web): keep Codex service tier labels readable (pingdotgg#4503)
* fix: render workspace images in chat markdown (pingdotgg#6433)
* fix(clients): keep opening responses visible after turns settle (pingdotgg#7723)
* feat(web): add appearance contrast control (pingdotgg#7906)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: maria <254055478+maria-rcks@users.noreply.github.com>
* fix(server): stop completed Codex threads from staying stuck on working (pingdotgg#7937)
* fix(mobile): preserve markdown image dimensions (pingdotgg#7940)
* fix(web): remove duplicate provider update progress (pingdotgg#7761)
* fix(server): fall back to the remote default branch instead of assuming main (pingdotgg#7078)
* fix(web): give sidebar project menu rows the same side padding as other menus (pingdotgg#7913)
* fix(clients): reconnect after credentials fail during remote server updates (pingdotgg#7953)
* feat(codex): submit thread feedback to OpenAI (pingdotgg#7949)
* fix(server): stop kills lingering Claude work (pingdotgg#5891)
* fix(ci): let Macroscope approve pull requests again (pingdotgg#7970)
* fix(clients): move settled pinned threads into the settled section (pingdotgg#7969)
* perf(ci): speed up release builds and Windows packaging (pingdotgg#7975)
* fix(web): stop tool calls from leaving a blank page in threads (pingdotgg#7971)
* fix(web): stop recovered tool failures from marking work logs red (pingdotgg#7999)
* fix(mobile): isolate markdown image requests (pingdotgg#7942)
* feat(web): redesign skills in `$` menu and in `/` menu (pingdotgg#8009)
* fix(web): restore right panel toggle clicks after closing on desktop (pingdotgg#8016)
* fix(web): keep server update banners flush with the composer (pingdotgg#8000)
* perf(web): reuse work log rows during streaming (pingdotgg#8006)
* fix(web): keep provider badge legible in dark themes (pingdotgg#7968)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: maria <254055478+maria-rcks@users.noreply.github.com>
* fix(web): treat configured urls with uppercase schemes as secure (pingdotgg#8005)
Co-authored-by: Simone <185146821+Lucenx9@users.noreply.github.com>
* fix(desktop): keep release notes visible while downloading (pingdotgg#6412)
* fix(web): show only providers with usage in usage views (pingdotgg#7563)
* fix(web): prevent expanded tool calls from hiding thread content (pingdotgg#8052)
* test(server): remove no-op live activity tests (pingdotgg#8056)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
* fix(web): clarify terminal sidebar grouping (pingdotgg#7967)
* fix(codex): show app access approval prompts (pingdotgg#8058)
* feat(web): upload image attachments before sending (pingdotgg#8048)
* fix(server): bound OpenCode skill discovery output (pingdotgg#7675)
Co-authored-by: Simone <185146821+Lucenx9@users.noreply.github.com>
* fix(mobile): persist thread shelf collapse state (pingdotgg#5152)
* fix(mobile): restore Android tablet thread controls, clean up header (pingdotgg#5385)
* fix(mobile): land the first thread open above the composer on Android (pingdotgg#5585)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: codex <codex@users.noreply.github.com>
Co-authored-by: Julius Marminge <julius0216@outlook.com>
* fix(server): check out submodules in a new worktree (pingdotgg#7674)
Co-authored-by: Rodrigo Brechard <rodrigo@clubtidy.fr>
* fix(server): preserve merged PR badges after branch deletion (pingdotgg#6216)
* fix(server): return fresh live pull request reads (pingdotgg#6472)
* fix(web): compare client and server versions as semver, not strings (pingdotgg#7579)
* fix(web): stop follow-ups from leaving giant blank space (pingdotgg#8068)
* fix(marketing): stop automatic Vercel deployments on pull requests (pingdotgg#8070)
* chore: vouch repeat contributors (pingdotgg#8071)
* fix(server): keep the authoritative subagent model when snapshots race task_started (pingdotgg#7583)
* fix(server): honor auto-accept edits for the OpenCode provider (pingdotgg#7100)
* fix(server): run the CLI on Node versions without import.meta.main (pingdotgg#7141)
* fix(server): recover from provider interrupt failures (pingdotgg#7412)
* fix(server): recreate a thread's worktree before starting a turn (pingdotgg#7839)
* fix(server): thread delete no longer fails on already-removed worktrees (pingdotgg#8076)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(web): stop update notices showing through the composer (pingdotgg#8083)
* fix(web): detect outdated nightly servers (pingdotgg#8124)
* fix(web): align usage page skeleton layout (pingdotgg#8111)
* fix(web): make terminal links appear clickable only when clickable (pingdotgg#7488)
* fix(web): make Windows file links clickable in chat (pingdotgg#8081)
* fix(web): sort usage models by token count (pingdotgg#8108)
* fix: open agent file links in the file viewer (pingdotgg#8098)
* fix(server): stop routine events from rescanning thread history (pingdotgg#8150)
* fix(deps): stop pnpm installs from changing the lockfile (pingdotgg#8163)
* feat(web): settle and restore threads with a keyboard shortcut (pingdotgg#8089)
* perf(desktop): cut macOS signing calls by 81% (pingdotgg#8093)
* feat: link pull requests to threads (pingdotgg#8160)
* feat(web): safely attach HEIC photos as JPEG images (pingdotgg#8161)
Co-authored-by: mweinbach <maxweinbach5@gmail.com>
* feat(mobile): track device models and OS versions (pingdotgg#8169)
* fix(grok): bound cumulative tool output updates (pingdotgg#7279)
* fix(web): delay thread shortcut hints by 200 ms (pingdotgg#8172)
* fix(server): stop probing Cursor until enabled (pingdotgg#8175)
* docs(release): verify remote updates with database migrations (pingdotgg#8177)
* fix(server): keep provider CLIs available in the macOS service (pingdotgg#8173)
* feat(claude): compact old threads before they burn through usage (pingdotgg#8144)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(client-runtime): retry queries after connection interruption (pingdotgg#8117)
* fix(server): keep previously used providers working after upgrades (pingdotgg#8176)
* feat(desktop): build macOS previews from a PR label (pingdotgg#8182)
* fix(web): thread jump hints no longer stick after a dictation paste (pingdotgg#8189)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(web): keep grouped project renames (pingdotgg#7831)
* feat(web): reveal chat file chips in the system file manager (pingdotgg#7140)
Co-authored-by: Dara Adedeji <daraaded@amazon.com>
Co-authored-by: shivam <91240327+shivamhwp@users.noreply.github.com>
* fix(server): push no longer writes a feature branch's commits to its base branch (pingdotgg#8228)
* chore(deps): bump @clerk/electron to 0.0.37 (pingdotgg#8240)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* feat(server): fetch legacy model classification from a hosted manifest (pingdotgg#8227)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* chore(release): prepare v0.0.34
* fix(desktop): let Clerk UI receive stable auth fixes (pingdotgg#8248)
* fix(app): un-settled threads return to the top of the list (pingdotgg#8231)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* perf(ci): cut about a minute from every release (pingdotgg#8250)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* feat(ci): download macOS preview DMGs without signing in (pingdotgg#8243)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(codex): accept Codex 0.150 multi-agent events (pingdotgg#8346)
* chore(release): prepare v0.0.35
* fix(grok): improve skills, plans, usage, and turn reliability (pingdotgg#8358)
Co-authored-by: Dara Adedeji <daraadedeji07@gmail.com>
Co-authored-by: Ahmed Besic <ahmed-besic@users.noreply.github.com>
Co-authored-by: Michael Brown <michaeltbrown.mtb@gmail.com>
Co-authored-by: Lars Nieuwenhuis <35393046+lnieuwenhuis@users.noreply.github.com>
Co-authored-by: Guilherme Barros <gbarros1095@gmail.com>
Co-authored-by: PC <pc@localhost>
Co-authored-by: 1xpixi <157762409+1xpixi@users.noreply.github.com>
* fix(server): recover stale Codex approval callbacks (pingdotgg#5195)
* test(server): remove duplicate missing worktree test (pingdotgg#8252)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
* fix(server): replay all un-applied events during projection bootstrap (pingdotgg#7538)
Co-authored-by: Theo Browne <me@t3.gg>
* test: remove low-signal test files (pingdotgg#8397)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
* test: prune trivial error and layout tests (pingdotgg#8400)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
* Fix Android adaptive launcher icon (pingdotgg#4332)
Co-authored-by: Yash Singh <saiansh2525@gmail.com>
* feat(web): split provider settings into list and editor (pingdotgg#8380)
* fix(codex): accept Codex 0.150 account plans (pingdotgg#8447)
* fix(tooling): allow ignored-only staged changes (pingdotgg#8468)
* fix(mobile): keep iOS home header stable (pingdotgg#8467)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(web): stop showing red x summaries for ordinary tool failures (pingdotgg#8395)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(mobile): refine Git action toast glass styling (pingdotgg#8399)
* fix(desktop): allow preview automation in agent-created threads (pingdotgg#8483)
* test(web): remove redundant cache key test (pingdotgg#8484)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
* fix(release): move nightly schedule to minute 38
Recent scheduled nightlies have been delayed or skipped.
Move the nightly cron from minute 7 to minute 38. Keep the existing three-hour interval. This tests a different point in each three-hour window without claiming it will fix GitHub schedule delivery.
Authored by GPT-5.6 Sol with the Codex harness.
* fix(web): stabilize the provider settings editor (pingdotgg#8472)
* fix(web): open GitHub pull requests in browser when loading fails (pingdotgg#8507)
* fix(codex): show sub-agent models (pingdotgg#8502)
* feat(analytics): report connected client platforms (pingdotgg#8481)
* feat(server): accept PDF, ZIP, and other file uploads up to 50MB (pingdotgg#8235)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* feat(web): toggle thread pin from the keyboard
Add a mod+shift+p shortcut that pins or unpins the active thread. Ignore the shortcut during terminal focus and when the server does not support thread pinning.
* fix(web): add back button to project settings (pingdotgg#8168)
* refactor(mobile): compile semantic themes for Uniwind (pingdotgg#7327)
Co-authored-by: codex <codex@users.noreply.github.com>
* fix(desktop): Cache Runtime locally on WSL Filesystem, dramatically improving launch times (pingdotgg#5769)
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: Utkarsh Patil <73941998+UtkarshUsername@users.noreply.github.com>
* fix(mobile): show OpenCode model sources in picker (pingdotgg#8573)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(clients): honor project default models in new threads (pingdotgg#6011)
Co-authored-by: Shivam Sharma <91240327+shivamhwp@users.noreply.github.com>
* fix(mobile): show file actions on Android (pingdotgg#8215)
Co-authored-by: Shivam Sharma <91240327+shivamhwp@users.noreply.github.com>
* fix(connect): explain DPoP connection failures (pingdotgg#8351)
Co-authored-by: Julius Marminge <julius0216@outlook.com>
* feat(web): make the sidebar project filter a searchable combobox (pingdotgg#5931)
* fix(server): a draft can retry its first send after a failed bootstrap (pingdotgg#8226)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(desktop): stop hidden previews draining battery (pingdotgg#8567)
* fix(desktop): oauth popups open from the browser preview (pingdotgg#8435)
Co-authored-by: Julius Marminge <julius0216@outlook.com>
* fix(web): keep long task drawers usable on small screens (pingdotgg#8313)
* fix(opencode): handle child approvals, stops, and model catalogs (pingdotgg#8480)
* fix: make thread auto-settling opt-in (pingdotgg#8321)
* fix(web): stop session activity timing test from blocking releases (pingdotgg#8585)
* fix(mobile): show composer menus when starting a task (pingdotgg#8587)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(web): show the configured stash shortcut (pingdotgg#8437)
Co-authored-by: Shivam Sharma <91240327+shivamhwp@users.noreply.github.com>
* feat(web): add toggleable confirmation before unpinning a thread (pingdotgg#7313)
Co-authored-by: Shivam Sharma <91240327+shivamhwp@users.noreply.github.com>
* fix: restore automatic thread settling defaults (pingdotgg#8596)
* fix(mobile): restore composer glass and rounded shadows (pingdotgg#8597)
Co-authored-by: Julius Marminge <julius@mac.lan>
* Remove Messages Glass Lab experiment (pingdotgg#8599)
* chore(release): prepare v0.0.36
* Require human review for pull requests changing product defaults (pingdotgg#8603)
* fix(codex): avoid quadratic app-server input buffering (pingdotgg#8605)
* fix(mobile): stabilize iOS header item transitions (pingdotgg#8607)
Co-authored-by: Julius Marminge <julius@mac.lan>
* chore(mobile): upgrade to Expo SDK 57 (pingdotgg#8609)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(mobile): harden native header toolbar items (pingdotgg#8611)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(server): stop querying Claude context usage after turns (pingdotgg#8610)
* chore: vouch ryanrhughes (pingdotgg#8613)
* feat(web): attach PDFs, ZIPs, and other files to a turn (pingdotgg#8236)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(web): pass stashShortcutLabel in the mixed-attachments stash test
PRs pingdotgg#8437 and pingdotgg#8236 crossed: one made stashShortcutLabel a required
ComposerStashMenu prop, the other added a test case without it, so
main fails web typecheck.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* feat(web): keybinding settings as settings rows (pingdotgg#8532)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Julius Marminge <julius0216@outlook.com>
* feat: let an environment publish themes as a file (pingdotgg#8569)
Co-authored-by: Theo Browne <me@t3.gg>
* fix(web): clean up provider settings list and editor (pingdotgg#8504)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Julius Marminge <julius0216@outlook.com>
* fix(web): keep project picker popup inside the sidebar (pingdotgg#8627)
* fix(mobile): prevent header overflow and back-button artifacts (pingdotgg#8624)
* fix(server): retry automatic thread title generation (pingdotgg#8087)
* fix(client-runtime): refresh edited pull request comments (pingdotgg#8094)
* fix(web): four composer spacing defects (pingdotgg#8090)
* perf(desktop): skip duplicate browser updates (pingdotgg#8018)
Co-authored-by: Julius Marminge <julius0216@outlook.com>
* fix(web): render nested markdown images correctly (pingdotgg#8501)
* fix(web): unify activity logs and composer banners (pingdotgg#8693)
* fix(mobile): reduce dev-client reload and Metro startup cost (pingdotgg#8694)
Co-authored-by: Julius Marminge <julius@mac.lan>
* revert(web): restore previous composer banners (pingdotgg#8733)
* test(web): remove tests for unreachable helpers (pingdotgg#8738)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
* feat(mobile): update tool summaries and chat transitions (pingdotgg#8793)
* feat(web): play video attachments in chat (pingdotgg#8688)
* fix(web,mobile): snooze menu no longer offers the same wake time twice (pingdotgg#8741)
* fix(grok): allow model changes in existing threads (pingdotgg#8392)
Co-authored-by: Ahmed Besic <ahmed-besic@users.noreply.github.com>
* feat(mobile): pick, share, and receive files in threads (pingdotgg#8237)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Julius Marminge <julius0216@outlook.com>
* fix(web): reduce title bar scroll fade height (pingdotgg#8799)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(windows): strip quotes from repaired PATH (pingdotgg#8746)
* fix(web): open agent images in expanded preview (pingdotgg#8807)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(git): follow repository instructions in generated source control text (pingdotgg#8804)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(server): stop overpricing cached Claude tokens (pingdotgg#8806)
* fix(web): keep image preview above sidebar control (pingdotgg#8811)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(web): keep right panel synced with agent edits (pingdotgg#8803)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(web,mobile): render Codex citations and artifact templates (pingdotgg#8584)
* chore: add Windows setup script to t3.json (pingdotgg#8814)
* fix(web): fold interim turn responses (pingdotgg#8828)
* fix(web): use circle alert for failed tool calls (pingdotgg#8840)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* feat(mobile): add offline iPhone voice input (pingdotgg#8614)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(web): prevent pull request metadata overlap (pingdotgg#8790)
* chore(release): prepare v0.0.37
* Add mobile composer attachment menu with video support (pingdotgg#8843)
* fix(mobile): map native menu icon colors explicitly
* fix(web): restore unified activity logs and composer banners (pingdotgg#8734)
Co-authored-by: Julius Marminge <julius0216@outlook.com>
Co-authored-by: Julius Marminge <jmarminge@gmail.com>
* fix(web): address composer banner review follow-ups (pingdotgg#8850)
* fix(web): widen sync banners and simplify the working timer (pingdotgg#8855)
* fix(preview): improve browser recording quality (pingdotgg#8839)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(web): mark pull request links as external (pingdotgg#8856)
* fix(mobile): replace Callstack glass with Expo glass (pingdotgg#8862)
* fix(server): skip IDE detection in Claude probes (pingdotgg#8634)
* chore(macroscope): review diagnostic overrides (pingdotgg#8917)
Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
* fix(contracts): accept CLI event origins (pingdotgg#8905)
* fix(web): hide invalid slash skill completions (pingdotgg#8904)
* fix(mobile): defer draft navigation until submission completes (pingdotgg#8914)
* chore: disable CodeRabbit review status (pingdotgg#8933)
* Delete app.json (pingdotgg#8934)
* fix(web): show scrollbar for wide markdown tables (pingdotgg#8868)
* fix(mobile): shimmer active tool rows (pingdotgg#8932)
Co-authored-by: Julius Marminge <julius@mac.lan>
* chore(deps): bump Electron to 43.4.1 (pingdotgg#8626)
* fix(chat): smooth worktree setup status (pingdotgg#8922)
* feat(mobile): add video playback with native iOS controls (pingdotgg#8919)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(web): prevent chat metadata overlap (pingdotgg#8851)
* fix(server): preserve usage cache outside walked roots (pingdotgg#8540)
Co-authored-by: Simone <185146821+Lucenx9@users.noreply.github.com>
* feat(mobile): add native image and PDF previews (pingdotgg#8959)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(server): allow long thread IDs in HTTP routes (pingdotgg#8898)
* fix(shared): preserve Windows shell PATH priority (pingdotgg#8748)
* fix(web): make WSL settings searchable (pingdotgg#8881)
* feat(web): add expand/collapse all control to the files surface (pingdotgg#8889)
* Add auto_review configuration to coderabbit.yaml
* style: format CodeRabbit configuration
* feat(mobile): upload attachments while composing (pingdotgg#8978)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(chat): keep agent activity visible between actions (pingdotgg#8984)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(server): isolate remote web session cookies (pingdotgg#8085)
Co-authored-by: Julius Marminge <julius0216@outlook.com>
* feat(pull-requests): link GitHub references in markdown (pingdotgg#8812)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* perf(server): reduce frequency of full tool call output being loaded into memory from db (pingdotgg#8988)
* feat(web): add pull request list filters (pingdotgg#8809)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* feat(web): search individual settings by detail (pingdotgg#8831)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* feat(client): render viewed images in work logs (pingdotgg#8936)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(client): use package import for markdown image helpers (pingdotgg#9010)
* test: remove static presentation snapshots (pingdotgg#9008)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
* perf(server): bound snapshot activity payload memory (pingdotgg#9000)
* perf(server): cut idle CPU use and stop provider event leaks (pingdotgg#8187)
* perf(server): scan only appended transcript bytes for usage summaries (pingdotgg#9024)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Theo Browne <me@t3.gg>
* perf(server): cut chatty tool-update frames by 90% (pingdotgg#8368)
* fix(server): settle threads server-side (pingdotgg#8600)
* fix(clients): dedupe skills in composer menus (pingdotgg#8043)
* fix(server): stop OpenCode child sessions (pingdotgg#9005)
* perf(web): defer pull request line stats until visible (pingdotgg#6471)
Co-authored-by: Theo Browne <me@t3.gg>
* perf(server): skip full-message reads while streaming (pingdotgg#9032)
* perf(client-runtime): halve server config bootstrap traffic (pingdotgg#8367)
Reuse one server config subscription for session bootstrap and live updates.
Preserve environment theme opt-in, replay, deletion, slow subscriber recovery, and config stream failure handling.
Co-authored-by: Adamulek123 <adam.bogucki2018@gmail.com>
* fix(web): align un-settle banner action (pingdotgg#9033)
* fix(web): block type-to-focus behind open dialogs (pingdotgg#8139)
Co-authored-by: Simone <185146821+Lucenx9@users.noreply.github.com>
* feat(shortcuts): copy active thread reference (pingdotgg#8994)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(mobile): keep thread scroll bounds current after animations (pingdotgg#9013)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(server): cache project favicon resolution (pingdotgg#9080)
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
* feat(claude): add Claude Fable 5.1 model (pingdotgg#9078)
* fix(preview): restore recording and macOS rendering after Electron 43 (pingdotgg#9001)
Co-authored-by: Guillermo Casanova <guillermo.casanova.b@gmail.com>
* feat(desktop): add configurable quit shortcut confirmation (pingdotgg#9076)
* feat(web): open project settings from thread menus (pingdotgg#8925)
* fix(chat): reuse one row for live activity (pingdotgg#9062)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* feat(models): discover Claude models from remote manifest (pingdotgg#9084)
* Revert "fix(chat): reuse one row for live activity" (pingdotgg#9096)
* fix(web): sync sidebar PR state from open panel (pingdotgg#9092)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: maria <254055478+maria-rcks@users.noreply.github.com>
* fix(web): changing projects no longer creates a draft (pingdotgg#9097)
* fix(web): keep theme placeholder text dimmer than entered text (pingdotgg#9104)
* fix(web): keep the selected environment when changing projects (pingdotgg#9102)
* docs(plans): t3o-31 upstream sync to v0.0.38
* fix(board): clear the ten pre-existing typecheck errors before the upstream sync (t3o-31 P0)
Two test fakes failed with a bare Error in the Effect failure channel, a
closure-assigned let narrowed to never, and a single-override pill read
overriddenRows[0] under noUncheckedIndexedAccess. None changed behaviour;
they were masked because the recursive typecheck never reached apps/server.
* fix(sync): the three type errors and two test failures the v0.0.38 merge caused
- BoardModelRow reads planModeEnabled from client settings, as the composer does.
- findBranchPullRequest resolves the default branch for upstream's widened PR
cache key instead of passing null.
- The orphaned-session integration test mocks the supervisor reactor that the
startup seam yields (new inventory row).
- The projection resume test seeds board projector watermarks into
boards.projection_state, where t3o-26 reads them, and asserts over the union.
- searchSettings("work") now also matches upstream's worktree/network items.
* refactor(board): native title attributes become BoardHint tooltips
Upstream's new no-native-title-tooltip rule flags every intrinsic-element
title= in the board (61 sites). BoardHint wraps the styled Tooltip primitive
and renders its child as the trigger, so layout is unchanged; a nullish label
renders the child alone.
* docs(seams): record the v0.0.38 sync (t3o-31)
Merge-log row, the decisions taken (plans stay tracked, upstream's settlement
reactor accepted after audit, projector-enumeration policy, launcher protocol
note), an unmarked-edits debt table for the next sync, a marker census, the
three new upstream workflows to disable, and the runbook's per-package
verification notes.
* review(t3o-31): announce the board's status dots, and order the merge log
Round-1 nitpicks: a bare span's aria-label is not announced, so the working,
running and awaiting dots now carry role="img"; the v0.0.38 merge-log row
moves below the two 2026-08-09 rows so the table reads chronologically.
---------
Co-authored-by: Theo Browne <me@t3.gg>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Dara Adedeji <76637177+SunkenInTime@users.noreply.github.com>
Co-authored-by: shivam <91240327+shivamhwp@users.noreply.github.com>
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: abcdmku <63693423+abcdmku@users.noreply.github.com>
Co-authored-by: Guilherme Barros <gbarros1095@gmail.com>
Co-authored-by: Rishet11 <154429365+Rishet11@users.noreply.github.com>
Co-authored-by: Alex <me@pixp.cc>
Co-authored-by: maria <254055478+maria-rcks@users.noreply.github.com>
Co-authored-by: Naveed Iqbal <naveediqbal949@gmail.com>
Co-authored-by: Ishaan Kothari <ishaanko.mail@gmail.com>
Co-authored-by: Exotic <118054752+extoci@users.noreply.github.com>
Co-authored-by: Utkarsh Patil <73941998+UtkarshUsername@users.noreply.github.com>
Co-authored-by: Bilal Bakr <62337003+Bil0000@users.noreply.github.com>
Co-authored-by: Rakshith Bhat <88523594+RakshithBhat03@users.noreply.github.com>
Co-authored-by: Simone <lucenz@proton.me>
Co-authored-by: Simone <185146821+Lucenx9@users.noreply.github.com>
Co-authored-by: Tristan Knight <admin@snappeh.com>
Co-authored-by: Wout Stiens <71498452+StiensWout@users.noreply.github.com>
Co-authored-by: Pavlo Trinko <paul.trinko95@gmail.com>
Co-authored-by: codex <codex@users.noreply.github.com>
Co-authored-by: Julius Marminge <julius0216@outlook.com>
Co-authored-by: Rodrigo Brechard <rodrigobrechard@gmail.com>
Co-authored-by: Rodrigo Brechard <rodrigo@clubtidy.fr>
Co-authored-by: Adamulek123 <adam.bogucki2018@gmail.com>
Co-authored-by: spiky02plateau <155588579+spiky02plateau@users.noreply.github.com>
Co-authored-by: Carlos Jimenez <cjimenez@r21digital.com>
Co-authored-by: Mark Griffin <mrmg@deflexion.net>
Co-authored-by: MacKinley Smith <smithmackinley@gmail.com>
Co-authored-by: oliver <97427849+flamboh@users.noreply.github.com>
Co-authored-by: mweinbach <maxweinbach5@gmail.com>
Co-authored-by: Lars Nieuwenhuis <35393046+lnieuwenhuis@users.noreply.github.com>
Co-authored-by: Mohtasham Murshid <154406804+MohtashamMurshid@users.noreply.github.com>
Co-authored-by: Dara Adedeji <daraaded@amazon.com>
Co-authored-by: Dara Adedeji <daraadedeji07@gmail.com>
Co-authored-by: Ahmed Besic <ahmed-besic@users.noreply.github.com>
Co-authored-by: Michael Brown <michaeltbrown.mtb@gmail.com>
Co-authored-by: PC <pc@localhost>
Co-authored-by: 1xpixi <157762409+1xpixi@users.noreply.github.com>
Co-authored-by: Josh <gitlucky@pipelab.org>
Co-authored-by: Tradi3 <56069280+krutftw@users.noreply.github.com>
Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
Co-authored-by: Ivan Malison <IvanMalison@gmail.com>
Co-authored-by: Yash Singh <saiansh2525@gmail.com>
Co-authored-by: Gianmarco <gianmarcosimone89@gmail.com>
Co-authored-by: Julius Marminge <julius@mac.lan>
Co-authored-by: Illia Panasenko <hello@ipanasenko.me>
Co-authored-by: Matheson Steplock <ikifar2012@users.noreply.github.com>
Co-authored-by: Anirudh Coontoor <anirudh@gosupernova.live>
Co-authored-by: Nick Anisimov <n.anisimov.23@gmail.com>
Co-authored-by: Muhammad Waleed <114993336+walid-baharwal@users.noreply.github.com>
Co-authored-by: Ryan Hughes <ryan@heyoodle.com>
Co-authored-by: Vitaly Iegorov <vitalyiegorov@gmail.com>
Co-authored-by: Ahmed Besic <ahmed.besic2000@gmail.com>
Co-authored-by: maria <maria@kuuro.net>
Co-authored-by: Matthew Feroz <136640686+MatthewFeroz@users.noreply.github.com>
Co-authored-by: Julius Marminge <jmarminge@gmail.com>
Co-authored-by: Aditya Garud <153842990+yashranaway@users.noreply.github.com>
Co-authored-by: Yukun Shan <92423096+nateEc@users.noreply.github.com>
Co-authored-by: Will Sheldon <will@autimo.com>
Co-authored-by: mic <85814106+q1@users.noreply.github.com>
Co-authored-by: Guillermo Casanova <guillermo.casanova.b@gmail.com>
juliusmarminge added a commit that referenced this pull request Sep 2, 2026
Round-16 rebase onto main (5 commits, headlined by #8236 file
attachments in the client). Main's upload-aware send path — capability
probes, upload await/retry gating, uploaded-ref turn attachments with
dataUrl fallback, draft release on success — is woven into the v2
dispatch flow, timeline user rows render file attachments as download
links with the ChatView download handler, and the provider settings
editor cleanup keeps the branch's environment-field rows. The codex
feedback client flow stays unported, replay testkit configs gained
main's environmentThemesDir, and the rpc/settings/docs unions carry
both sides.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XXL1,000+ changed lines (additions + deletions).vouch:trustedPR 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

@t3dotgg
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat(web): attach PDFs, ZIPs, and other files to a turn - #8236

Merged
t3dotgg merged 29 commits into
mainfrom
t3code/file-attachments-web
Aug 29, 2026
Merged

feat(web): attach PDFs, ZIPs, and other files to a turn#8236
t3dotgg merged 29 commits into
mainfrom
t3code/file-attachments-web

Conversation

@t3dotgg

@t3dotggt3dotgg commented Aug 25, 2026

Copy link
Copy Markdown
Member

The file upload APIs and tolerant attachment contracts from #8235 are now on main. This PR adds the web client for them.

The composer accepts PDFs, ZIPs, and other files up to the server's advertised limit through the paperclip button or paste. Uploads start while the user types, survive draft and stash moves, and render as rows that download with the original filename. Unknown attachment types render as inert rows instead of crashing the thread.

One shared upload flow in packages/client-runtime owns verification, transfer, release, and size limits. Draft discard, project delete, stash, file removal, and send cleanup all use that flow. Interrupted uploads return as "Attach again" markers instead of disappearing.

Release warning: clients with the old image-only attachment contract cannot decode threads that contain file attachments. The compatibility work in #8235 makes the merged server contract tolerant and keeps existing mobile code from treating files as images. Hold the web release until a compatible mobile build is available. #8237 adds mobile file support.

Original work by Theo Browne with Claude Fable 5 in the Claude Code harness. Modernized by GPT-5.6 Sol in the Codex harness.


Note

Medium Risk
Touches the turn send/upload pipeline and draft persistence; threads with file attachments require a tolerant client contract, so release coordination with older mobile builds matters.

Overview
Adds generic file attachments to the chat composer (paperclip, paste, drag) alongside images, with images and files sharing the per-turn attachment cap and server-advertised size limits.

Send and upload path:ChatView snapshots images and files together, runs shared upload/capability checks before and after upload, builds optimistic file rows, and wires timeline on-demand downloads via signed asset URLs. Annotation screenshots respect the combined attachment limit so prompts do not claim crops that were not sent.

Composer UX:ChatComposer stages file rows (upload progress, retry, “attach again” after interrupted uploads), blocks send when capabilities or limits fail, and extends stash restore/save to persisted file uploads with environment checks and expiry verification.

Persistence:composerDraftStore persists file metadata (upload ids or needs-reattach markers), enforces combined limits, and handles moves across threads/environments. Plan follow-up actions hide while any composer attachment is staged (shouldShowPlanFollowUpPrompt).

Timeline: User messages render non-image attachments as download links or inert rows for unknown types. Project/sidebar draft counts include files; project delete passes thread refs when releasing draft uploads.

Reviewed by Cursor Bugbot for commit 129f2ad. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Add PDF, ZIP, and generic file attachment support to chat turns

  • Extends the chat composer to support generic file attachments alongside images, including selection via paste or paperclip button, progress tracking, and retry controls
  • Updates composerDraftStore, attachmentUploadQueue, and prompt stash store to persist file metadata, deduplicate attachments, manage upload lifecycles, and handle cross-environment moves
  • Adds server capability checks to enforce staging limits and reject non-image files on servers that lack upload support
  • Renders received file attachments in the timeline as downloadable links or buttons using generated signed URLs
  • Risk: Non-image attachments now throw an error during send if the server does not support attachment uploads; cross-environment draft moves strip source upload linkage for byte-backed files

Macroscope summarized 129f2ad.

@coderabbitai

coderabbitaiBot commented Aug 25, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 7697ac98-d68b-4b0a-aa8c-fb19042ba35d

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

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

@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:XXL 1,000+ changed lines (additions + deletions). labels Aug 25, 2026
@github-actions

github-actionsBot commented Aug 25, 2026

Copy link
Copy Markdown
Contributor

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

ProviderMetricMain baselineThis PRImpactPR ceiling
CodexTotal thread wire13.3 KiB13.3 KiB−29 B (−0.2%)15.1 KiB
CodexThread snapshot wire6.9 KiB6.9 KiB−6 B (−0.1%)7.3 KiB
CodexLive turn WebSocket wire6.4 KiB6.4 KiB−23 B (−0.3%)7.8 KiB
CodexLive turn WebSocket decoded55.6 KiB55.6 KiB−44 B (−0.1%)66.4 KiB
CodexLive turn messages1110−1 (−9.1%)21
ClaudeTotal thread wire13.3 KiB13.3 KiB−56 B (−0.4%)15.1 KiB
ClaudeThread snapshot wire6.9 KiB6.9 KiB−1 B (−0.0%)7.3 KiB
ClaudeLive turn WebSocket wire6.4 KiB6.4 KiB−55 B (−0.8%)7.8 KiB
ClaudeLive turn WebSocket decoded56.4 KiB56.4 KiB−88 B (−0.2%)66.4 KiB
ClaudeLive turn messages119−2 (−18.2%)21

Baseline: 0e2905e · PR result: 129f2ad · 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: 109.4 KiB
  • Claude decoded thread snapshot: 110.1 KiB

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

@macroscopeappmacroscopeappBot 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.

Reviewed the new/changed Effect-adjacent code (packages/client-runtime/src/state/attachments.ts, apps/web/src/state/attachments.ts, and the web upload-queue call sites) against the service conventions. The new createAttachmentEnvironmentAtoms factory correctly mirrors createAssetEnvironmentAtoms (runtime passed in, no hidden globals, no ManagedRuntime/runPromise outside the existing atom-command boundary), and no service tags/layers were moved or redefined. One predicate convention issue below.

Posted via Macroscope — Effect Service Conventions

Comment threadpackages/client-runtime/src/state/attachments.ts Outdated
Comment threadapps/web/src/lib/attachmentUploadQueue.ts
Comment threaddocs/user/composer.md Outdated
Comment threadapps/web/src/composerDraftStore.ts
@macroscopeapp

macroscopeappBot commented Aug 25, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Not approved

Macroscope's review found this PR not approvable — This change introduces a substantial production workflow for uploading, persisting, transferring, deleting, and downloading user files alongside turns. Its broad runtime surface and server-side file lifecycle warrant human review despite extensive tests and backward-compatible persistence.

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

Comment threadapps/web/src/lib/attachmentUploadQueue.ts Outdated

@macroscopeappmacroscopeappBot 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.

Reviewed the web composer/timeline attachment UI. Two interaction findings on changed lines, both about the new needs-reattach / capacity paths giving the user no working path or feedback.

Posted via Macroscope — UI Consistency

Comment threadapps/web/src/components/chat/ChatComposer.tsx
Comment threadapps/web/src/composerDraftStore.ts
Comment threadapps/web/src/lib/attachmentUploadQueue.ts
Comment threadapps/web/src/composerDraftStore.ts Outdated
Comment threadapps/web/src/composerDraftStore.ts
Comment threadapps/web/src/composerDraftStore.ts Outdated
Comment threadapps/web/src/components/chat/ChatComposer.tsx

@macroscopeappmacroscopeappBot 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.

One finding: the new file-attachment download button in MessagesTimeline renders its filename center-aligned, unlike the visually identical anchor and inert rows next to it.

Posted via Macroscope — UI Consistency

Comment threadapps/web/src/components/chat/MessagesTimeline.tsx Outdated
@t3dotgg
t3dotggforce-pushed the t3code/file-attachments-web branch from c88f3df to 33d67f9CompareAugust 26, 2026 08:58
Comment threadapps/web/src/components/chat/ChatComposer.tsx
Comment threadapps/web/src/components/chat/composerAttachmentFiles.ts
Comment threadapps/web/src/components/chat/ChatComposer.tsx
@t3dotgg
t3dotggforce-pushed the t3code/file-attachments-web branch from 7abf833 to 1dd3cc0CompareAugust 26, 2026 09:29
Comment threadapps/web/src/components/ChatView.tsx
Comment threadapps/web/src/components/chat/ChatComposer.tsx Outdated
Comment threadapps/web/src/hooks/useHandleNewThread.ts

@macroscopeappmacroscopeappBot 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.

One finding on the new send-block wording in ChatComposer. The rest of the attachment UI (file rows, paperclip trigger, stash menu file badge, timeline file rows) reuses the existing primitives and row treatments consistently, and the earlier findings on the timeline download row alignment, the marker re-pick path, and the swallowed paste are resolved.

Posted via Macroscope — UI Consistency

Comment threadapps/web/src/components/chat/ChatComposer.tsx Outdated
Comment threadapps/web/src/components/chat/ChatComposer.tsx
Comment threadapps/web/src/components/ChatView.tsx Outdated

@macroscopeappmacroscopeappBot 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.

One finding: the needs-reattach file row label ignores the canReattachFiles guard that the send-block reason uses, so on a server without file-attachment support (or before the capability arrives) the row tells the user to attach again while no attach control is rendered.

Posted via Macroscope — UI Consistency

Comment threadapps/web/src/components/chat/ChatComposer.tsx
Comment threadapps/web/src/components/chat/ChatComposer.tsx
juliusmarminge added a commit that referenced this pull request Aug 29, 2026
PRs #8437 and #8236 crossed: one made stashShortcutLabel a required
ComposerStashMenu prop, the other added a test case without it, so
main fails web typecheck.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 29, 2026
Round-16 rebase onto main (5 commits, headlined by #8236 file
attachments in the client). Main's upload-aware send path — capability
probes, upload await/retry gating, uploaded-ref turn attachments with
dataUrl fallback, draft release on success — is woven into the v2
dispatch flow, timeline user rows render file attachments as download
links with the ChatView download handler, and the provider settings
editor cleanup keeps the branch's environment-field rows. The codex
feedback client flow stays unported, replay testkit configs gained
main's environmentThemesDir, and the rpc/settings/docs unions carry
both sides.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
github-actionsBot added a commit to omarcresp/t3code-flake that referenced this pull request Aug 29, 2026
## What's Changed
* feat(web): attach PDFs, ZIPs, and other files to a turn by @t3dotgg in pingdotgg/t3code#8236
* feat(web): keybinding settings as settings rows by @StiensWout in pingdotgg/t3code#8532
* feat: let an environment publish themes as a file by @ryanrhughes in pingdotgg/t3code#8569
* fix(web): clean up provider settings list and editor by @StiensWout in pingdotgg/t3code#8504
* fix(web): keep project picker popup inside the sidebar by @SunkenInTime in pingdotgg/t3code#8627
* fix(mobile): prevent header overflow and back-button artifacts by @juliusmarminge in pingdotgg/t3code#8624
## New Contributors
* @ryanrhughes made their first contribution in pingdotgg/t3code#8569
**Full Changelog**: pingdotgg/t3code@v0.0.37-nightly.20260829.1218...v0.0.37-nightly.20260829.1219
Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.37-nightly.20260829.1219
netpro2k added a commit to netpro2k/t3code that referenced this pull request Aug 29, 2026
Intent:
Expose the generic-file backend shipped in v0.0.36 through the web and desktop composer while following the official client implementation closely enough for its upstream PR to replace this patch cleanly.
Behavior:
- Accept images and generic files through the paperclip button, paste, and drag-and-drop; share the eight-attachment limit and use the server-advertised generic-file limit, currently 50 MB.
- Upload while the user composes, show progress/retry/reattach states, and render sent files as signed downloads with their original names.
- Preserve file drafts and stashes as server upload references or explicit needs-reattach markers instead of storing generic-file bytes in localStorage.
- Keep upload verification, cleanup, retry, environment moves, and unknown attachment rendering explicit.
- Show file names in the current mobile feed and include attachment names in transcript bootstrap context.
Design constraints:
- Backport official upstream PR pingdotgg#8236 at 129f2ad, rebased onto v0.0.36, rather than maintaining a parallel client upload architecture.
- Use packages/client-runtime for the shared upload lifecycle and clamp file sizes to the server capability and contract maximum.
- Require direct-upload support for generic files. Do not retain the fork inline-file protocol or serialize generic-file bytes into drafts and stashes.
- Upload local workspace drops like the official client; do not retain the competing desktop-only drop-to-mention behavior.
- Keep images on their established compression and compatibility path.
Integration:
- Shared client-runtime upload lifecycle and web environment atoms.
- Web composer, drafts, prompt stashes, upload queue, message timeline, signed asset downloads, sidebar counts, project cleanup, and user documentation.
- Minimal current mobile feed visibility and transcript bootstrap naming remain fork-only until the official follow-up covers them.
Verification:
- Official attachment-focused web and client-runtime tests pass (7 files, 196 tests).
- Targeted client-runtime, web, and mobile typechecks pass; the existing client-runtime Effect diagnostic remains advisory.
Rebase notes:
- Upstream PR pingdotgg#8236 should supersede the web/client-runtime implementation wholesale once merged.
- Upstream PR pingdotgg#8237 should supersede the temporary mobile filename row with signed mobile downloads and full mobile file picking/sharing.
- Recheck only the transcript-bootstrap filename summary after both PRs land.
- The v0.0.36 stashShortcutLabel test fixture is the only adaptation to the rebased official PR tree.
longtngo added a commit to longtngo/t3code that referenced this pull request Aug 29, 2026
Range f6f2be3..053affb, v0.0.36. 411 upstream files, 632 fork files,
81 touched by both, 19 conflicted.
Competing implementations resolved toward the fork's superset:
- Claude context usage (pingdotgg#8610). Upstream deleted `queryCurrentContextUsage` and
`normalizeClaudeContextUsageApiSnapshot` outright. `getContextUsage` is the ONLY
source of the compaction facts (`autocompactSource`, `autoCompactThreshold`,
`isAutoCompactEnabled`) the Vitals gauge's compaction note and marker render from,
and they travel on the wire contract, so the call is kept. Upstream's
`latestAssistantUsage` tracking and its post-compaction guard are adopted BELOW it
as the next-best fallback: `contextUsageSnapshot ?? latestAssistantSnapshot ?? ...`.
Upstream removed `getContextUsage` from `ClaudeQueryRuntime`, the
`SDKControlGetContextUsageResponse` import and the `Option` import outside every
conflict marker; all three restored.
- Provider settings editor (pingdotgg#8472). Upstream's `useEffect` + `lastPublishedEnvironmentRef`
re-seed is the superset of the fork's render-phase `seededRef` (8fe3190, one of four
silent-data-loss fixes). The merge had kept BOTH mechanisms; collapsed to upstream's,
with the fork's half-typed-row null guard on the publish path. `environmentKey` deleted
with the code it served.
- Sidebar project combobox (pingdotgg#5931). Upstream replaced the menu-based project filter,
whose `MenuRadioItem` carried the fork's project-actions button. Rebuilt on upstream's
`ComboboxItem` with the ellipsis button grafted back (invariant 6). The dead `Menu*`
import is gone.
- Composer attachments (pingdotgg#8236). Upstream's `addComposerAttachments` pipeline adopted; the
fork's drop split (image -> attach, other -> absolute path with upload fallback) kept
and repointed at the new handler.
- Mid-turn steer. Upstream's `steeringTurnState` branch rejected again (invariant 5); its
side of that hunk also opened an `if` whose brace lives below the hunk.
- Thread deletion drain (pingdotgg#8226). Upstream replaced `drain` with `drainThrough(sequence)`;
the fork's test retargeted. Its new drain test observed `ProviderService.stopSession`,
which this reactor never calls (it dispatches `thread.session.stop`), so it now counts
engine dispatches and provides the two services the fork's reactor needs.
Three defects the resolutions introduced, each caught by a check that is not the suite:
- `shouldShowBranchMismatchBanner` was resurrected into two import lists by resolving
them toward upstream. Fork commit cfdf255 replaced that function; the import had no
definition. Found by the RESURRECTED sweep.
- `scriptPath` ended up declared twice in CodexCollabRuntime.integration.test.ts: `both`
reintroduced upstream's fixture-dir copy that the fork deliberately moved to a temp dir.
Found by the RESURRECTED sweep.
- `setProjectScopeMenuOpen` survived in the fork's `handleProjectActions` after upstream
replaced that state with a reducer, outside every marker. Found by typecheck.
Upstream regressions of fork fixes, kept fixed:
- Raw NUL bytes returned to ChatComposer.tsx. A raw NUL renders as nothing in grep and
aborts BSD sed mid-file; the fork had converted all six to `\0` escapes and carries a
guard test for it. The guard failed, and the offending line reads as space-separated in
any normal diff. Converted back to escapes.
- `defaultTheme` / `defaultThemeSetAt` (pingdotgg#8569) are absent from `ServerSettingsPatch`; the
fork's patch-parity guard caught it. They are owned by `t3 theme set`, which rewrites
settings.json directly and which clients only read, so they are recorded as deliberately
unpatchable rather than mirrored.
- The fork's mobile held-messages strip used `dark:` variants that upstream's new Uniwind
theme rule (pingdotgg#7327) forbids; moved to the `text-foreground-muted` semantic token rather
than added to the rule's allowlist.
Invariants: all re-probed against the merged tree. 1 (49 migrations, ids unique and
monotonic, max 50, 34 burned), 2 (the fork-only @effect/platform-node patch survived the
Expo 57 rewrite of patchedDependencies, is pinned, resolved and applied on disk; effect
stays at beta.103 so no re-pin), 3, 4, 4b (4 `isSendBlocked=`), 5, 5b, 5c, 6, 7, 8, 9, 10,
11 all hold.
Sweeps: resurrected 3, dropped 21, fork-loss 45, both-kept 0. Every entry named: the 3
resurrected and the fork-loss in ProviderInstanceCard / ChatComposer / Sidebar are the
decisions above; the OpenCode fork-loss is 11 comment lines whose guard upstream extracted
into `deleteContextIfCurrent` (the rationale is restored on the helper); pnpm-lock churn is
the install. Test declarations 18,691 -> 19,081; one file lost one, upstream's own pingdotgg#8484.
Gate: pnpm run verify green, exit 0 read from the captured log line. 14 blocks,
10,744 passed, 20 skipped, 0 failures.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
netpro2k added a commit to netpro2k/t3code that referenced this pull request Aug 29, 2026
Intent:
Expose the generic-file backend shipped in v0.0.36 through the web and desktop composer while following the official client implementation closely enough for its upstream PR to replace this patch cleanly.
Behavior:
- Accept images and generic files through the paperclip button, paste, and drag-and-drop; share the eight-attachment limit and use the server-advertised generic-file limit, currently 50 MB.
- Upload while the user composes, show progress/retry/reattach states, and render sent files as signed downloads with their original names.
- Preserve file drafts and stashes as server upload references or explicit needs-reattach markers instead of storing generic-file bytes in localStorage.
- Keep upload verification, cleanup, retry, environment moves, and unknown attachment rendering explicit.
- Show file names in the current mobile feed and include attachment names in transcript bootstrap context.
Design constraints:
- Backport official upstream PR pingdotgg#8236 at 129f2ad, rebased onto v0.0.36, rather than maintaining a parallel client upload architecture.
- Use packages/client-runtime for the shared upload lifecycle and clamp file sizes to the server capability and contract maximum.
- Require direct-upload support for generic files. Do not retain the fork inline-file protocol or serialize generic-file bytes into drafts and stashes.
- Upload local workspace drops like the official client; do not retain the competing desktop-only drop-to-mention behavior.
- Keep images on their established compression and compatibility path.
Integration:
- Shared client-runtime upload lifecycle and web environment atoms.
- Web composer, drafts, prompt stashes, upload queue, message timeline, signed asset downloads, sidebar counts, project cleanup, and user documentation.
- Minimal current mobile feed visibility and transcript bootstrap naming remain fork-only until the official follow-up covers them.
Verification:
- Official attachment-focused web and client-runtime tests pass (7 files, 196 tests).
- Targeted client-runtime, web, and mobile typechecks pass; the existing client-runtime Effect diagnostic remains advisory.
Rebase notes:
- Upstream PR pingdotgg#8236 should supersede the web/client-runtime implementation wholesale once merged.
- Upstream PR pingdotgg#8237 should supersede the temporary mobile filename row with signed mobile downloads and full mobile file picking/sharing.
- Recheck only the transcript-bootstrap filename summary after both PRs land.
- The v0.0.36 stashShortcutLabel test fixture is the only adaptation to the rebased official PR tree.
juliusmarminge added a commit that referenced this pull request Aug 30, 2026
Round-16 rebase onto main (5 commits, headlined by #8236 file
attachments in the client). Main's upload-aware send path — capability
probes, upload await/retry gating, uploaded-ref turn attachments with
dataUrl fallback, draft release on success — is woven into the v2
dispatch flow, timeline user rows render file attachments as download
links with the ChatView download handler, and the provider settings
editor cleanup keeps the branch's environment-field rows. The codex
feedback client flow stays unported, replay testkit configs gained
main's environmentThemesDir, and the rpc/settings/docs unions carry
both sides.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
bcotrim pushed a commit to bcotrim/mognet that referenced this pull request Aug 30, 2026
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
(cherry picked from commit bcb855a)
bcotrim pushed a commit to bcotrim/mognet that referenced this pull request Aug 30, 2026
PRs pingdotgg#8437 and pingdotgg#8236 crossed: one made stashShortcutLabel a required
ComposerStashMenu prop, the other added a test case without it, so
main fails web typecheck.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
(cherry picked from commit d22709f)
juliusmarminge added a commit that referenced this pull request Aug 30, 2026
Round-16 rebase onto main (5 commits, headlined by #8236 file
attachments in the client). Main's upload-aware send path — capability
probes, upload await/retry gating, uploaded-ref turn attachments with
dataUrl fallback, draft release on success — is woven into the v2
dispatch flow, timeline user rows render file attachments as download
links with the ChatView download handler, and the provider settings
editor cleanup keeps the branch's environment-field rows. The codex
feedback client flow stays unported, replay testkit configs gained
main's environmentThemesDir, and the rpc/settings/docs unions carry
both sides.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
imsherrill pushed a commit to comprehensiveio/compadre that referenced this pull request Aug 31, 2026
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
(cherry picked from commit bcb855a)
imsherrill added a commit to comprehensiveio/compadre that referenced this pull request Aug 31, 2026
…) (#2)
(cherry picked from commit bcb855a)
Co-authored-by: Theo Browne <me@t3.gg>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
netpro2k added a commit to netpro2k/t3code that referenced this pull request Aug 31, 2026
Intent:
Keep transcript bootstrap context aware of generic file attachments now that upstream web and mobile clients support their full upload and rendering lifecycle.
Behavior:
- Count every message attachment in transcript bootstrap context, not only images.
- Include up to three attachment names plus an additional-count suffix.
- Preserve image/images wording when every attachment is an image; otherwise use file/files.
Design constraints:
- Rely entirely on upstream attachment upload, draft, stash, rendering, download, and mobile behavior.
- Keep this patch limited to the text supplied to transcript bootstrap.
Integration:
- Web transcript bootstrap summary only. No client upload, server, contract, mobile, or storage changes.
Verification:
- Upstream PRs pingdotgg#8236 and pingdotgg#8237 were audited as superseding the former attachment backport except for this summary behavior.
- Targeted web verification is rerun after the complete patch stack rebases.
Rebase notes:
- Drop this patch only when upstream transcript bootstrap includes generic attachment names rather than filtering to images.
github-actionsBot added a commit to omarcresp/t3code-flake that referenced this pull request Aug 31, 2026
## What's Changed
* Remove Messages Glass Lab experiment by @juliusmarminge in pingdotgg/t3code#8599
* Require human review for pull requests changing product defaults by @juliusmarminge in pingdotgg/t3code#8603
* fix(codex): avoid quadratic app-server input buffering by @juliusmarminge in pingdotgg/t3code#8605
* fix(mobile): stabilize iOS header item transitions by @juliusmarminge in pingdotgg/t3code#8607
* chore(mobile): upgrade to Expo SDK 57 by @juliusmarminge in pingdotgg/t3code#8609
* fix(mobile): harden native header toolbar items by @juliusmarminge in pingdotgg/t3code#8611
* fix(server): stop querying Claude context usage after turns by @t3dotgg in pingdotgg/t3code#8610
* chore: vouch ryanrhughes by @t3dotgg in pingdotgg/t3code#8613
* feat(web): attach PDFs, ZIPs, and other files to a turn by @t3dotgg in pingdotgg/t3code#8236
* feat(web): keybinding settings as settings rows by @StiensWout in pingdotgg/t3code#8532
* feat: let an environment publish themes as a file by @ryanrhughes in pingdotgg/t3code#8569
* fix(web): clean up provider settings list and editor by @StiensWout in pingdotgg/t3code#8504
* fix(web): keep project picker popup inside the sidebar by @SunkenInTime in pingdotgg/t3code#8627
* fix(mobile): prevent header overflow and back-button artifacts by @juliusmarminge in pingdotgg/t3code#8624
* fix(server): retry automatic thread title generation by @Bil0000 in pingdotgg/t3code#8087
* fix(client-runtime): refresh edited pull request comments by @Bil0000 in pingdotgg/t3code#8094
* fix(web): four composer spacing defects by @Bil0000 in pingdotgg/t3code#8090
* perf(desktop): skip duplicate browser updates by @Bil0000 in pingdotgg/t3code#8018
* fix(web): render nested markdown images correctly by @flamboh in pingdotgg/t3code#8501
* fix(web): unify activity logs and composer banners by @juliusmarminge in pingdotgg/t3code#8693
* fix(mobile): reduce dev-client reload and Metro startup cost by @juliusmarminge in pingdotgg/t3code#8694
* revert(web): restore previous composer banners by @t3dotgg in pingdotgg/t3code#8733
* test(web): remove tests for unreachable helpers by @t3-code[bot] in pingdotgg/t3code#8738
* feat(mobile): update tool summaries and chat transitions by @juliusmarminge in pingdotgg/t3code#8793
* feat(web): play video attachments in chat by @Bil0000 in pingdotgg/t3code#8688
* fix(web,mobile): snooze menu no longer offers the same wake time twice by @vitalyiegorov in pingdotgg/t3code#8741
* fix(grok): allow model changes in existing threads by @ahmed-besic in pingdotgg/t3code#8392
* feat(mobile): pick, share, and receive files in threads by @t3dotgg in pingdotgg/t3code#8237
* fix(web): reduce title bar scroll fade height by @maria-rcks in pingdotgg/t3code#8799
* fix(windows): strip quotes from repaired PATH by @UtkarshUsername in pingdotgg/t3code#8746
* fix(web): open agent images in expanded preview by @maria-rcks in pingdotgg/t3code#8807
* fix(git): follow repository instructions in generated source control text by @maria-rcks in pingdotgg/t3code#8804
* fix(server): stop overpricing cached Claude tokens by @SunkenInTime in pingdotgg/t3code#8806
* fix(web): keep image preview above sidebar control by @maria-rcks in pingdotgg/t3code#8811
* fix(web): keep right panel synced with agent edits by @maria-rcks in pingdotgg/t3code#8803
* fix(web,mobile): render Codex citations and artifact templates by @Yash-Singh1 in pingdotgg/t3code#8584
* chore: add Windows setup script to t3.json by @UtkarshUsername in pingdotgg/t3code#8814
* fix(web): fold interim turn responses by @maria-rcks in pingdotgg/t3code#8828
* fix(web): use circle alert for failed tool calls by @maria-rcks in pingdotgg/t3code#8840
* feat(mobile): add offline iPhone voice input by @t3dotgg in pingdotgg/t3code#8614
* fix(web): prevent pull request metadata overlap by @MatthewFeroz in pingdotgg/t3code#8790
## New Contributors
* @ryanrhughes made their first contribution in pingdotgg/t3code#8569
* @ahmed-besic made their first contribution in pingdotgg/t3code#8392
* @MatthewFeroz made their first contribution in pingdotgg/t3code#8790
**Full Changelog**: pingdotgg/t3code@v0.0.36...v0.0.37
Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.37
amitbet pushed a commit to amitbet/a2code that referenced this pull request Sep 1, 2026
Upstream shipped its own arbitrary file attachments (pingdotgg#8235/pingdotgg#8236/pingdotgg#8237), a
strict superset of the fork's, so that divergence is retired rather than
re-applied. Upstream also reverted its turn-plan chips, restructured provider
settings into list+editor, made the project picker a searchable combobox, and
replaced the mobile CSS-variable theme hook with useUniwindTheme.
Fork features preserved: thread forking, queued-prompt steering, in-chat find,
answered user-input rows, machine-scoped environments, provider health-check
cache, provider "Default traits", live quota meter, thread export/pinning,
payload hot-update channel, and the build-only CI surface.
See FORK_NOTES.md for the per-file migration notes.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Sep 1, 2026
Round-16 rebase onto main (5 commits, headlined by #8236 file
attachments in the client). Main's upload-aware send path — capability
probes, upload await/retry gating, uploaded-ref turn attachments with
dataUrl fallback, draft release on success — is woven into the v2
dispatch flow, timeline user rows render file attachments as download
links with the ChatView download handler, and the provider settings
editor cleanup keeps the branch's environment-field rows. The codex
feedback client flow stays unported, replay testkit configs gained
main's environmentThemesDir, and the rpc/settings/docs unions carry
both sides.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Coriou added a commit to Coriou/txcode that referenced this pull request Sep 1, 2026
Upstream tip (bcb855a, pingdotgg#8236) rewrote the third render's entries and
dropped the required stashShortcutLabel prop, leaving upstream's own web
typecheck red. Completed the fixture; candidate for an upstream report.
juliusmarminge added a commit that referenced this pull request Sep 2, 2026
Round-16 rebase onto main (5 commits, headlined by #8236 file
attachments in the client). Main's upload-aware send path — capability
probes, upload await/retry gating, uploaded-ref turn attachments with
dataUrl fallback, draft release on success — is woven into the v2
dispatch flow, timeline user rows render file attachments as download
links with the ChatView download handler, and the provider settings
editor cleanup keeps the branch's environment-field rows. The codex
feedback client flow stays unported, replay testkit configs gained
main's environmentThemesDir, and the rpc/settings/docs unions carry
both sides.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
brentkelly added a commit to brentkelly/t3code-orchestrator that referenced this pull request Sep 2, 2026
* feat(analytics): threads and turns now know which client started them (pingdotgg#7774)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(web): stop marking mixed tool runs as failed (pingdotgg#7893)
* fix(web): command-click spaced folder links (pingdotgg#6439)
Co-authored-by: shivam <91240327+shivamhwp@users.noreply.github.com>
* fix(chat): stop pushing follow-up messages to the top (pingdotgg#7897)
* test(desktop): remove redundant release note assertion (pingdotgg#7873)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
* fix(web): handle wide ordered-list marker edge cases (pingdotgg#7856)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(ssh): restore user PATH for remote servers (pingdotgg#7213)
* fix(desktop): keep tailscale spawn defects from breaking advertised endpoints (pingdotgg#7116)
* fix(web): keep Codex service tier labels readable (pingdotgg#4503)
* fix: render workspace images in chat markdown (pingdotgg#6433)
* fix(clients): keep opening responses visible after turns settle (pingdotgg#7723)
* feat(web): add appearance contrast control (pingdotgg#7906)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: maria <254055478+maria-rcks@users.noreply.github.com>
* fix(server): stop completed Codex threads from staying stuck on working (pingdotgg#7937)
* fix(mobile): preserve markdown image dimensions (pingdotgg#7940)
* fix(web): remove duplicate provider update progress (pingdotgg#7761)
* fix(server): fall back to the remote default branch instead of assuming main (pingdotgg#7078)
* fix(web): give sidebar project menu rows the same side padding as other menus (pingdotgg#7913)
* fix(clients): reconnect after credentials fail during remote server updates (pingdotgg#7953)
* feat(codex): submit thread feedback to OpenAI (pingdotgg#7949)
* fix(server): stop kills lingering Claude work (pingdotgg#5891)
* fix(ci): let Macroscope approve pull requests again (pingdotgg#7970)
* fix(clients): move settled pinned threads into the settled section (pingdotgg#7969)
* perf(ci): speed up release builds and Windows packaging (pingdotgg#7975)
* fix(web): stop tool calls from leaving a blank page in threads (pingdotgg#7971)
* fix(web): stop recovered tool failures from marking work logs red (pingdotgg#7999)
* fix(mobile): isolate markdown image requests (pingdotgg#7942)
* feat(web): redesign skills in `$` menu and in `/` menu (pingdotgg#8009)
* fix(web): restore right panel toggle clicks after closing on desktop (pingdotgg#8016)
* fix(web): keep server update banners flush with the composer (pingdotgg#8000)
* perf(web): reuse work log rows during streaming (pingdotgg#8006)
* fix(web): keep provider badge legible in dark themes (pingdotgg#7968)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: maria <254055478+maria-rcks@users.noreply.github.com>
* fix(web): treat configured urls with uppercase schemes as secure (pingdotgg#8005)
Co-authored-by: Simone <185146821+Lucenx9@users.noreply.github.com>
* fix(desktop): keep release notes visible while downloading (pingdotgg#6412)
* fix(web): show only providers with usage in usage views (pingdotgg#7563)
* fix(web): prevent expanded tool calls from hiding thread content (pingdotgg#8052)
* test(server): remove no-op live activity tests (pingdotgg#8056)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
* fix(web): clarify terminal sidebar grouping (pingdotgg#7967)
* fix(codex): show app access approval prompts (pingdotgg#8058)
* feat(web): upload image attachments before sending (pingdotgg#8048)
* fix(server): bound OpenCode skill discovery output (pingdotgg#7675)
Co-authored-by: Simone <185146821+Lucenx9@users.noreply.github.com>
* fix(mobile): persist thread shelf collapse state (pingdotgg#5152)
* fix(mobile): restore Android tablet thread controls, clean up header (pingdotgg#5385)
* fix(mobile): land the first thread open above the composer on Android (pingdotgg#5585)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: codex <codex@users.noreply.github.com>
Co-authored-by: Julius Marminge <julius0216@outlook.com>
* fix(server): check out submodules in a new worktree (pingdotgg#7674)
Co-authored-by: Rodrigo Brechard <rodrigo@clubtidy.fr>
* fix(server): preserve merged PR badges after branch deletion (pingdotgg#6216)
* fix(server): return fresh live pull request reads (pingdotgg#6472)
* fix(web): compare client and server versions as semver, not strings (pingdotgg#7579)
* fix(web): stop follow-ups from leaving giant blank space (pingdotgg#8068)
* fix(marketing): stop automatic Vercel deployments on pull requests (pingdotgg#8070)
* chore: vouch repeat contributors (pingdotgg#8071)
* fix(server): keep the authoritative subagent model when snapshots race task_started (pingdotgg#7583)
* fix(server): honor auto-accept edits for the OpenCode provider (pingdotgg#7100)
* fix(server): run the CLI on Node versions without import.meta.main (pingdotgg#7141)
* fix(server): recover from provider interrupt failures (pingdotgg#7412)
* fix(server): recreate a thread's worktree before starting a turn (pingdotgg#7839)
* fix(server): thread delete no longer fails on already-removed worktrees (pingdotgg#8076)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(web): stop update notices showing through the composer (pingdotgg#8083)
* fix(web): detect outdated nightly servers (pingdotgg#8124)
* fix(web): align usage page skeleton layout (pingdotgg#8111)
* fix(web): make terminal links appear clickable only when clickable (pingdotgg#7488)
* fix(web): make Windows file links clickable in chat (pingdotgg#8081)
* fix(web): sort usage models by token count (pingdotgg#8108)
* fix: open agent file links in the file viewer (pingdotgg#8098)
* fix(server): stop routine events from rescanning thread history (pingdotgg#8150)
* fix(deps): stop pnpm installs from changing the lockfile (pingdotgg#8163)
* feat(web): settle and restore threads with a keyboard shortcut (pingdotgg#8089)
* perf(desktop): cut macOS signing calls by 81% (pingdotgg#8093)
* feat: link pull requests to threads (pingdotgg#8160)
* feat(web): safely attach HEIC photos as JPEG images (pingdotgg#8161)
Co-authored-by: mweinbach <maxweinbach5@gmail.com>
* feat(mobile): track device models and OS versions (pingdotgg#8169)
* fix(grok): bound cumulative tool output updates (pingdotgg#7279)
* fix(web): delay thread shortcut hints by 200 ms (pingdotgg#8172)
* fix(server): stop probing Cursor until enabled (pingdotgg#8175)
* docs(release): verify remote updates with database migrations (pingdotgg#8177)
* fix(server): keep provider CLIs available in the macOS service (pingdotgg#8173)
* feat(claude): compact old threads before they burn through usage (pingdotgg#8144)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(client-runtime): retry queries after connection interruption (pingdotgg#8117)
* fix(server): keep previously used providers working after upgrades (pingdotgg#8176)
* feat(desktop): build macOS previews from a PR label (pingdotgg#8182)
* fix(web): thread jump hints no longer stick after a dictation paste (pingdotgg#8189)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(web): keep grouped project renames (pingdotgg#7831)
* feat(web): reveal chat file chips in the system file manager (pingdotgg#7140)
Co-authored-by: Dara Adedeji <daraaded@amazon.com>
Co-authored-by: shivam <91240327+shivamhwp@users.noreply.github.com>
* fix(server): push no longer writes a feature branch's commits to its base branch (pingdotgg#8228)
* chore(deps): bump @clerk/electron to 0.0.37 (pingdotgg#8240)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* feat(server): fetch legacy model classification from a hosted manifest (pingdotgg#8227)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* chore(release): prepare v0.0.34
* fix(desktop): let Clerk UI receive stable auth fixes (pingdotgg#8248)
* fix(app): un-settled threads return to the top of the list (pingdotgg#8231)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* perf(ci): cut about a minute from every release (pingdotgg#8250)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* feat(ci): download macOS preview DMGs without signing in (pingdotgg#8243)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(codex): accept Codex 0.150 multi-agent events (pingdotgg#8346)
* chore(release): prepare v0.0.35
* fix(grok): improve skills, plans, usage, and turn reliability (pingdotgg#8358)
Co-authored-by: Dara Adedeji <daraadedeji07@gmail.com>
Co-authored-by: Ahmed Besic <ahmed-besic@users.noreply.github.com>
Co-authored-by: Michael Brown <michaeltbrown.mtb@gmail.com>
Co-authored-by: Lars Nieuwenhuis <35393046+lnieuwenhuis@users.noreply.github.com>
Co-authored-by: Guilherme Barros <gbarros1095@gmail.com>
Co-authored-by: PC <pc@localhost>
Co-authored-by: 1xpixi <157762409+1xpixi@users.noreply.github.com>
* fix(server): recover stale Codex approval callbacks (pingdotgg#5195)
* test(server): remove duplicate missing worktree test (pingdotgg#8252)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
* fix(server): replay all un-applied events during projection bootstrap (pingdotgg#7538)
Co-authored-by: Theo Browne <me@t3.gg>
* test: remove low-signal test files (pingdotgg#8397)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
* test: prune trivial error and layout tests (pingdotgg#8400)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
* Fix Android adaptive launcher icon (pingdotgg#4332)
Co-authored-by: Yash Singh <saiansh2525@gmail.com>
* feat(web): split provider settings into list and editor (pingdotgg#8380)
* fix(codex): accept Codex 0.150 account plans (pingdotgg#8447)
* fix(tooling): allow ignored-only staged changes (pingdotgg#8468)
* fix(mobile): keep iOS home header stable (pingdotgg#8467)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(web): stop showing red x summaries for ordinary tool failures (pingdotgg#8395)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(mobile): refine Git action toast glass styling (pingdotgg#8399)
* fix(desktop): allow preview automation in agent-created threads (pingdotgg#8483)
* test(web): remove redundant cache key test (pingdotgg#8484)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
* fix(release): move nightly schedule to minute 38
Recent scheduled nightlies have been delayed or skipped.
Move the nightly cron from minute 7 to minute 38. Keep the existing three-hour interval. This tests a different point in each three-hour window without claiming it will fix GitHub schedule delivery.
Authored by GPT-5.6 Sol with the Codex harness.
* fix(web): stabilize the provider settings editor (pingdotgg#8472)
* fix(web): open GitHub pull requests in browser when loading fails (pingdotgg#8507)
* fix(codex): show sub-agent models (pingdotgg#8502)
* feat(analytics): report connected client platforms (pingdotgg#8481)
* feat(server): accept PDF, ZIP, and other file uploads up to 50MB (pingdotgg#8235)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* feat(web): toggle thread pin from the keyboard
Add a mod+shift+p shortcut that pins or unpins the active thread. Ignore the shortcut during terminal focus and when the server does not support thread pinning.
* fix(web): add back button to project settings (pingdotgg#8168)
* refactor(mobile): compile semantic themes for Uniwind (pingdotgg#7327)
Co-authored-by: codex <codex@users.noreply.github.com>
* fix(desktop): Cache Runtime locally on WSL Filesystem, dramatically improving launch times (pingdotgg#5769)
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: Utkarsh Patil <73941998+UtkarshUsername@users.noreply.github.com>
* fix(mobile): show OpenCode model sources in picker (pingdotgg#8573)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(clients): honor project default models in new threads (pingdotgg#6011)
Co-authored-by: Shivam Sharma <91240327+shivamhwp@users.noreply.github.com>
* fix(mobile): show file actions on Android (pingdotgg#8215)
Co-authored-by: Shivam Sharma <91240327+shivamhwp@users.noreply.github.com>
* fix(connect): explain DPoP connection failures (pingdotgg#8351)
Co-authored-by: Julius Marminge <julius0216@outlook.com>
* feat(web): make the sidebar project filter a searchable combobox (pingdotgg#5931)
* fix(server): a draft can retry its first send after a failed bootstrap (pingdotgg#8226)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(desktop): stop hidden previews draining battery (pingdotgg#8567)
* fix(desktop): oauth popups open from the browser preview (pingdotgg#8435)
Co-authored-by: Julius Marminge <julius0216@outlook.com>
* fix(web): keep long task drawers usable on small screens (pingdotgg#8313)
* fix(opencode): handle child approvals, stops, and model catalogs (pingdotgg#8480)
* fix: make thread auto-settling opt-in (pingdotgg#8321)
* fix(web): stop session activity timing test from blocking releases (pingdotgg#8585)
* fix(mobile): show composer menus when starting a task (pingdotgg#8587)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(web): show the configured stash shortcut (pingdotgg#8437)
Co-authored-by: Shivam Sharma <91240327+shivamhwp@users.noreply.github.com>
* feat(web): add toggleable confirmation before unpinning a thread (pingdotgg#7313)
Co-authored-by: Shivam Sharma <91240327+shivamhwp@users.noreply.github.com>
* fix: restore automatic thread settling defaults (pingdotgg#8596)
* fix(mobile): restore composer glass and rounded shadows (pingdotgg#8597)
Co-authored-by: Julius Marminge <julius@mac.lan>
* Remove Messages Glass Lab experiment (pingdotgg#8599)
* chore(release): prepare v0.0.36
* Require human review for pull requests changing product defaults (pingdotgg#8603)
* fix(codex): avoid quadratic app-server input buffering (pingdotgg#8605)
* fix(mobile): stabilize iOS header item transitions (pingdotgg#8607)
Co-authored-by: Julius Marminge <julius@mac.lan>
* chore(mobile): upgrade to Expo SDK 57 (pingdotgg#8609)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(mobile): harden native header toolbar items (pingdotgg#8611)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(server): stop querying Claude context usage after turns (pingdotgg#8610)
* chore: vouch ryanrhughes (pingdotgg#8613)
* feat(web): attach PDFs, ZIPs, and other files to a turn (pingdotgg#8236)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(web): pass stashShortcutLabel in the mixed-attachments stash test
PRs pingdotgg#8437 and pingdotgg#8236 crossed: one made stashShortcutLabel a required
ComposerStashMenu prop, the other added a test case without it, so
main fails web typecheck.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* feat(web): keybinding settings as settings rows (pingdotgg#8532)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Julius Marminge <julius0216@outlook.com>
* feat: let an environment publish themes as a file (pingdotgg#8569)
Co-authored-by: Theo Browne <me@t3.gg>
* fix(web): clean up provider settings list and editor (pingdotgg#8504)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Julius Marminge <julius0216@outlook.com>
* fix(web): keep project picker popup inside the sidebar (pingdotgg#8627)
* fix(mobile): prevent header overflow and back-button artifacts (pingdotgg#8624)
* fix(server): retry automatic thread title generation (pingdotgg#8087)
* fix(client-runtime): refresh edited pull request comments (pingdotgg#8094)
* fix(web): four composer spacing defects (pingdotgg#8090)
* perf(desktop): skip duplicate browser updates (pingdotgg#8018)
Co-authored-by: Julius Marminge <julius0216@outlook.com>
* fix(web): render nested markdown images correctly (pingdotgg#8501)
* fix(web): unify activity logs and composer banners (pingdotgg#8693)
* fix(mobile): reduce dev-client reload and Metro startup cost (pingdotgg#8694)
Co-authored-by: Julius Marminge <julius@mac.lan>
* revert(web): restore previous composer banners (pingdotgg#8733)
* test(web): remove tests for unreachable helpers (pingdotgg#8738)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
* feat(mobile): update tool summaries and chat transitions (pingdotgg#8793)
* feat(web): play video attachments in chat (pingdotgg#8688)
* fix(web,mobile): snooze menu no longer offers the same wake time twice (pingdotgg#8741)
* fix(grok): allow model changes in existing threads (pingdotgg#8392)
Co-authored-by: Ahmed Besic <ahmed-besic@users.noreply.github.com>
* feat(mobile): pick, share, and receive files in threads (pingdotgg#8237)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Julius Marminge <julius0216@outlook.com>
* fix(web): reduce title bar scroll fade height (pingdotgg#8799)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(windows): strip quotes from repaired PATH (pingdotgg#8746)
* fix(web): open agent images in expanded preview (pingdotgg#8807)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(git): follow repository instructions in generated source control text (pingdotgg#8804)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(server): stop overpricing cached Claude tokens (pingdotgg#8806)
* fix(web): keep image preview above sidebar control (pingdotgg#8811)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(web): keep right panel synced with agent edits (pingdotgg#8803)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(web,mobile): render Codex citations and artifact templates (pingdotgg#8584)
* chore: add Windows setup script to t3.json (pingdotgg#8814)
* fix(web): fold interim turn responses (pingdotgg#8828)
* fix(web): use circle alert for failed tool calls (pingdotgg#8840)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* feat(mobile): add offline iPhone voice input (pingdotgg#8614)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(web): prevent pull request metadata overlap (pingdotgg#8790)
* chore(release): prepare v0.0.37
* Add mobile composer attachment menu with video support (pingdotgg#8843)
* fix(mobile): map native menu icon colors explicitly
* fix(web): restore unified activity logs and composer banners (pingdotgg#8734)
Co-authored-by: Julius Marminge <julius0216@outlook.com>
Co-authored-by: Julius Marminge <jmarminge@gmail.com>
* fix(web): address composer banner review follow-ups (pingdotgg#8850)
* fix(web): widen sync banners and simplify the working timer (pingdotgg#8855)
* fix(preview): improve browser recording quality (pingdotgg#8839)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(web): mark pull request links as external (pingdotgg#8856)
* fix(mobile): replace Callstack glass with Expo glass (pingdotgg#8862)
* fix(server): skip IDE detection in Claude probes (pingdotgg#8634)
* chore(macroscope): review diagnostic overrides (pingdotgg#8917)
Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
* fix(contracts): accept CLI event origins (pingdotgg#8905)
* fix(web): hide invalid slash skill completions (pingdotgg#8904)
* fix(mobile): defer draft navigation until submission completes (pingdotgg#8914)
* chore: disable CodeRabbit review status (pingdotgg#8933)
* Delete app.json (pingdotgg#8934)
* fix(web): show scrollbar for wide markdown tables (pingdotgg#8868)
* fix(mobile): shimmer active tool rows (pingdotgg#8932)
Co-authored-by: Julius Marminge <julius@mac.lan>
* chore(deps): bump Electron to 43.4.1 (pingdotgg#8626)
* fix(chat): smooth worktree setup status (pingdotgg#8922)
* feat(mobile): add video playback with native iOS controls (pingdotgg#8919)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(web): prevent chat metadata overlap (pingdotgg#8851)
* fix(server): preserve usage cache outside walked roots (pingdotgg#8540)
Co-authored-by: Simone <185146821+Lucenx9@users.noreply.github.com>
* feat(mobile): add native image and PDF previews (pingdotgg#8959)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(server): allow long thread IDs in HTTP routes (pingdotgg#8898)
* fix(shared): preserve Windows shell PATH priority (pingdotgg#8748)
* fix(web): make WSL settings searchable (pingdotgg#8881)
* feat(web): add expand/collapse all control to the files surface (pingdotgg#8889)
* Add auto_review configuration to coderabbit.yaml
* style: format CodeRabbit configuration
* feat(mobile): upload attachments while composing (pingdotgg#8978)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(chat): keep agent activity visible between actions (pingdotgg#8984)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(server): isolate remote web session cookies (pingdotgg#8085)
Co-authored-by: Julius Marminge <julius0216@outlook.com>
* feat(pull-requests): link GitHub references in markdown (pingdotgg#8812)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* perf(server): reduce frequency of full tool call output being loaded into memory from db (pingdotgg#8988)
* feat(web): add pull request list filters (pingdotgg#8809)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* feat(web): search individual settings by detail (pingdotgg#8831)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* feat(client): render viewed images in work logs (pingdotgg#8936)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(client): use package import for markdown image helpers (pingdotgg#9010)
* test: remove static presentation snapshots (pingdotgg#9008)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
* perf(server): bound snapshot activity payload memory (pingdotgg#9000)
* perf(server): cut idle CPU use and stop provider event leaks (pingdotgg#8187)
* perf(server): scan only appended transcript bytes for usage summaries (pingdotgg#9024)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Theo Browne <me@t3.gg>
* perf(server): cut chatty tool-update frames by 90% (pingdotgg#8368)
* fix(server): settle threads server-side (pingdotgg#8600)
* fix(clients): dedupe skills in composer menus (pingdotgg#8043)
* fix(server): stop OpenCode child sessions (pingdotgg#9005)
* perf(web): defer pull request line stats until visible (pingdotgg#6471)
Co-authored-by: Theo Browne <me@t3.gg>
* perf(server): skip full-message reads while streaming (pingdotgg#9032)
* perf(client-runtime): halve server config bootstrap traffic (pingdotgg#8367)
Reuse one server config subscription for session bootstrap and live updates.
Preserve environment theme opt-in, replay, deletion, slow subscriber recovery, and config stream failure handling.
Co-authored-by: Adamulek123 <adam.bogucki2018@gmail.com>
* fix(web): align un-settle banner action (pingdotgg#9033)
* fix(web): block type-to-focus behind open dialogs (pingdotgg#8139)
Co-authored-by: Simone <185146821+Lucenx9@users.noreply.github.com>
* feat(shortcuts): copy active thread reference (pingdotgg#8994)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(mobile): keep thread scroll bounds current after animations (pingdotgg#9013)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(server): cache project favicon resolution (pingdotgg#9080)
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
* feat(claude): add Claude Fable 5.1 model (pingdotgg#9078)
* fix(preview): restore recording and macOS rendering after Electron 43 (pingdotgg#9001)
Co-authored-by: Guillermo Casanova <guillermo.casanova.b@gmail.com>
* feat(desktop): add configurable quit shortcut confirmation (pingdotgg#9076)
* feat(web): open project settings from thread menus (pingdotgg#8925)
* fix(chat): reuse one row for live activity (pingdotgg#9062)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* feat(models): discover Claude models from remote manifest (pingdotgg#9084)
* Revert "fix(chat): reuse one row for live activity" (pingdotgg#9096)
* fix(web): sync sidebar PR state from open panel (pingdotgg#9092)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: maria <254055478+maria-rcks@users.noreply.github.com>
* fix(web): changing projects no longer creates a draft (pingdotgg#9097)
* fix(web): keep theme placeholder text dimmer than entered text (pingdotgg#9104)
* fix(web): keep the selected environment when changing projects (pingdotgg#9102)
* docs(plans): t3o-31 upstream sync to v0.0.38
* fix(board): clear the ten pre-existing typecheck errors before the upstream sync (t3o-31 P0)
Two test fakes failed with a bare Error in the Effect failure channel, a
closure-assigned let narrowed to never, and a single-override pill read
overriddenRows[0] under noUncheckedIndexedAccess. None changed behaviour;
they were masked because the recursive typecheck never reached apps/server.
* fix(sync): the three type errors and two test failures the v0.0.38 merge caused
- BoardModelRow reads planModeEnabled from client settings, as the composer does.
- findBranchPullRequest resolves the default branch for upstream's widened PR
cache key instead of passing null.
- The orphaned-session integration test mocks the supervisor reactor that the
startup seam yields (new inventory row).
- The projection resume test seeds board projector watermarks into
boards.projection_state, where t3o-26 reads them, and asserts over the union.
- searchSettings("work") now also matches upstream's worktree/network items.
* refactor(board): native title attributes become BoardHint tooltips
Upstream's new no-native-title-tooltip rule flags every intrinsic-element
title= in the board (61 sites). BoardHint wraps the styled Tooltip primitive
and renders its child as the trigger, so layout is unchanged; a nullish label
renders the child alone.
* docs(seams): record the v0.0.38 sync (t3o-31)
Merge-log row, the decisions taken (plans stay tracked, upstream's settlement
reactor accepted after audit, projector-enumeration policy, launcher protocol
note), an unmarked-edits debt table for the next sync, a marker census, the
three new upstream workflows to disable, and the runbook's per-package
verification notes.
* review(t3o-31): announce the board's status dots, and order the merge log
Round-1 nitpicks: a bare span's aria-label is not announced, so the working,
running and awaiting dots now carry role="img"; the v0.0.38 merge-log row
moves below the two 2026-08-09 rows so the table reads chronologically.
---------
Co-authored-by: Theo Browne <me@t3.gg>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Dara Adedeji <76637177+SunkenInTime@users.noreply.github.com>
Co-authored-by: shivam <91240327+shivamhwp@users.noreply.github.com>
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: abcdmku <63693423+abcdmku@users.noreply.github.com>
Co-authored-by: Guilherme Barros <gbarros1095@gmail.com>
Co-authored-by: Rishet11 <154429365+Rishet11@users.noreply.github.com>
Co-authored-by: Alex <me@pixp.cc>
Co-authored-by: maria <254055478+maria-rcks@users.noreply.github.com>
Co-authored-by: Naveed Iqbal <naveediqbal949@gmail.com>
Co-authored-by: Ishaan Kothari <ishaanko.mail@gmail.com>
Co-authored-by: Exotic <118054752+extoci@users.noreply.github.com>
Co-authored-by: Utkarsh Patil <73941998+UtkarshUsername@users.noreply.github.com>
Co-authored-by: Bilal Bakr <62337003+Bil0000@users.noreply.github.com>
Co-authored-by: Rakshith Bhat <88523594+RakshithBhat03@users.noreply.github.com>
Co-authored-by: Simone <lucenz@proton.me>
Co-authored-by: Simone <185146821+Lucenx9@users.noreply.github.com>
Co-authored-by: Tristan Knight <admin@snappeh.com>
Co-authored-by: Wout Stiens <71498452+StiensWout@users.noreply.github.com>
Co-authored-by: Pavlo Trinko <paul.trinko95@gmail.com>
Co-authored-by: codex <codex@users.noreply.github.com>
Co-authored-by: Julius Marminge <julius0216@outlook.com>
Co-authored-by: Rodrigo Brechard <rodrigobrechard@gmail.com>
Co-authored-by: Rodrigo Brechard <rodrigo@clubtidy.fr>
Co-authored-by: Adamulek123 <adam.bogucki2018@gmail.com>
Co-authored-by: spiky02plateau <155588579+spiky02plateau@users.noreply.github.com>
Co-authored-by: Carlos Jimenez <cjimenez@r21digital.com>
Co-authored-by: Mark Griffin <mrmg@deflexion.net>
Co-authored-by: MacKinley Smith <smithmackinley@gmail.com>
Co-authored-by: oliver <97427849+flamboh@users.noreply.github.com>
Co-authored-by: mweinbach <maxweinbach5@gmail.com>
Co-authored-by: Lars Nieuwenhuis <35393046+lnieuwenhuis@users.noreply.github.com>
Co-authored-by: Mohtasham Murshid <154406804+MohtashamMurshid@users.noreply.github.com>
Co-authored-by: Dara Adedeji <daraaded@amazon.com>
Co-authored-by: Dara Adedeji <daraadedeji07@gmail.com>
Co-authored-by: Ahmed Besic <ahmed-besic@users.noreply.github.com>
Co-authored-by: Michael Brown <michaeltbrown.mtb@gmail.com>
Co-authored-by: PC <pc@localhost>
Co-authored-by: 1xpixi <157762409+1xpixi@users.noreply.github.com>
Co-authored-by: Josh <gitlucky@pipelab.org>
Co-authored-by: Tradi3 <56069280+krutftw@users.noreply.github.com>
Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
Co-authored-by: Ivan Malison <IvanMalison@gmail.com>
Co-authored-by: Yash Singh <saiansh2525@gmail.com>
Co-authored-by: Gianmarco <gianmarcosimone89@gmail.com>
Co-authored-by: Julius Marminge <julius@mac.lan>
Co-authored-by: Illia Panasenko <hello@ipanasenko.me>
Co-authored-by: Matheson Steplock <ikifar2012@users.noreply.github.com>
Co-authored-by: Anirudh Coontoor <anirudh@gosupernova.live>
Co-authored-by: Nick Anisimov <n.anisimov.23@gmail.com>
Co-authored-by: Muhammad Waleed <114993336+walid-baharwal@users.noreply.github.com>
Co-authored-by: Ryan Hughes <ryan@heyoodle.com>
Co-authored-by: Vitaly Iegorov <vitalyiegorov@gmail.com>
Co-authored-by: Ahmed Besic <ahmed.besic2000@gmail.com>
Co-authored-by: maria <maria@kuuro.net>
Co-authored-by: Matthew Feroz <136640686+MatthewFeroz@users.noreply.github.com>
Co-authored-by: Julius Marminge <jmarminge@gmail.com>
Co-authored-by: Aditya Garud <153842990+yashranaway@users.noreply.github.com>
Co-authored-by: Yukun Shan <92423096+nateEc@users.noreply.github.com>
Co-authored-by: Will Sheldon <will@autimo.com>
Co-authored-by: mic <85814106+q1@users.noreply.github.com>
Co-authored-by: Guillermo Casanova <guillermo.casanova.b@gmail.com>
juliusmarminge added a commit that referenced this pull request Sep 2, 2026
Round-16 rebase onto main (5 commits, headlined by #8236 file
attachments in the client). Main's upload-aware send path — capability
probes, upload await/retry gating, uploaded-ref turn attachments with
dataUrl fallback, draft release on success — is woven into the v2
dispatch flow, timeline user rows render file attachments as download
links with the ChatView download handler, and the provider settings
editor cleanup keeps the branch's environment-field rows. The codex
feedback client flow stays unported, replay testkit configs gained
main's environmentThemesDir, and the rpc/settings/docs unions carry
both sides.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XXL1,000+ changed lines (additions + deletions).vouch:trustedPR 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

@t3dotgg
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat(web): attach PDFs, ZIPs, and other files to a turn - #8236

Merged
t3dotgg merged 29 commits into
mainfrom
t3code/file-attachments-web
Aug 29, 2026
Merged

feat(web): attach PDFs, ZIPs, and other files to a turn#8236
t3dotgg merged 29 commits into
mainfrom
t3code/file-attachments-web

Conversation

@t3dotgg

@t3dotggt3dotgg commented Aug 25, 2026

Copy link
Copy Markdown
Member

The file upload APIs and tolerant attachment contracts from #8235 are now on main. This PR adds the web client for them.

The composer accepts PDFs, ZIPs, and other files up to the server's advertised limit through the paperclip button or paste. Uploads start while the user types, survive draft and stash moves, and render as rows that download with the original filename. Unknown attachment types render as inert rows instead of crashing the thread.

One shared upload flow in packages/client-runtime owns verification, transfer, release, and size limits. Draft discard, project delete, stash, file removal, and send cleanup all use that flow. Interrupted uploads return as "Attach again" markers instead of disappearing.

Release warning: clients with the old image-only attachment contract cannot decode threads that contain file attachments. The compatibility work in #8235 makes the merged server contract tolerant and keeps existing mobile code from treating files as images. Hold the web release until a compatible mobile build is available. #8237 adds mobile file support.

Original work by Theo Browne with Claude Fable 5 in the Claude Code harness. Modernized by GPT-5.6 Sol in the Codex harness.


Note

Medium Risk
Touches the turn send/upload pipeline and draft persistence; threads with file attachments require a tolerant client contract, so release coordination with older mobile builds matters.

Overview
Adds generic file attachments to the chat composer (paperclip, paste, drag) alongside images, with images and files sharing the per-turn attachment cap and server-advertised size limits.

Send and upload path:ChatView snapshots images and files together, runs shared upload/capability checks before and after upload, builds optimistic file rows, and wires timeline on-demand downloads via signed asset URLs. Annotation screenshots respect the combined attachment limit so prompts do not claim crops that were not sent.

Composer UX:ChatComposer stages file rows (upload progress, retry, “attach again” after interrupted uploads), blocks send when capabilities or limits fail, and extends stash restore/save to persisted file uploads with environment checks and expiry verification.

Persistence:composerDraftStore persists file metadata (upload ids or needs-reattach markers), enforces combined limits, and handles moves across threads/environments. Plan follow-up actions hide while any composer attachment is staged (shouldShowPlanFollowUpPrompt).

Timeline: User messages render non-image attachments as download links or inert rows for unknown types. Project/sidebar draft counts include files; project delete passes thread refs when releasing draft uploads.

Reviewed by Cursor Bugbot for commit 129f2ad. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Add PDF, ZIP, and generic file attachment support to chat turns

  • Extends the chat composer to support generic file attachments alongside images, including selection via paste or paperclip button, progress tracking, and retry controls
  • Updates composerDraftStore, attachmentUploadQueue, and prompt stash store to persist file metadata, deduplicate attachments, manage upload lifecycles, and handle cross-environment moves
  • Adds server capability checks to enforce staging limits and reject non-image files on servers that lack upload support
  • Renders received file attachments in the timeline as downloadable links or buttons using generated signed URLs
  • Risk: Non-image attachments now throw an error during send if the server does not support attachment uploads; cross-environment draft moves strip source upload linkage for byte-backed files

Macroscope summarized 129f2ad.

@coderabbitai

coderabbitaiBot commented Aug 25, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 7697ac98-d68b-4b0a-aa8c-fb19042ba35d

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

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

@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:XXL 1,000+ changed lines (additions + deletions). labels Aug 25, 2026
@github-actions

github-actionsBot commented Aug 25, 2026

Copy link
Copy Markdown
Contributor

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

ProviderMetricMain baselineThis PRImpactPR ceiling
CodexTotal thread wire13.3 KiB13.3 KiB−29 B (−0.2%)15.1 KiB
CodexThread snapshot wire6.9 KiB6.9 KiB−6 B (−0.1%)7.3 KiB
CodexLive turn WebSocket wire6.4 KiB6.4 KiB−23 B (−0.3%)7.8 KiB
CodexLive turn WebSocket decoded55.6 KiB55.6 KiB−44 B (−0.1%)66.4 KiB
CodexLive turn messages1110−1 (−9.1%)21
ClaudeTotal thread wire13.3 KiB13.3 KiB−56 B (−0.4%)15.1 KiB
ClaudeThread snapshot wire6.9 KiB6.9 KiB−1 B (−0.0%)7.3 KiB
ClaudeLive turn WebSocket wire6.4 KiB6.4 KiB−55 B (−0.8%)7.8 KiB
ClaudeLive turn WebSocket decoded56.4 KiB56.4 KiB−88 B (−0.2%)66.4 KiB
ClaudeLive turn messages119−2 (−18.2%)21

Baseline: 0e2905e · PR result: 129f2ad · 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: 109.4 KiB
  • Claude decoded thread snapshot: 110.1 KiB

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

@macroscopeappmacroscopeappBot 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.

Reviewed the new/changed Effect-adjacent code (packages/client-runtime/src/state/attachments.ts, apps/web/src/state/attachments.ts, and the web upload-queue call sites) against the service conventions. The new createAttachmentEnvironmentAtoms factory correctly mirrors createAssetEnvironmentAtoms (runtime passed in, no hidden globals, no ManagedRuntime/runPromise outside the existing atom-command boundary), and no service tags/layers were moved or redefined. One predicate convention issue below.

Posted via Macroscope — Effect Service Conventions

Comment threadpackages/client-runtime/src/state/attachments.ts Outdated
Comment threadapps/web/src/lib/attachmentUploadQueue.ts
Comment threaddocs/user/composer.md Outdated
Comment threadapps/web/src/composerDraftStore.ts
@macroscopeapp

macroscopeappBot commented Aug 25, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Not approved

Macroscope's review found this PR not approvable — This change introduces a substantial production workflow for uploading, persisting, transferring, deleting, and downloading user files alongside turns. Its broad runtime surface and server-side file lifecycle warrant human review despite extensive tests and backward-compatible persistence.

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

Comment threadapps/web/src/lib/attachmentUploadQueue.ts Outdated

@macroscopeappmacroscopeappBot 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.

Reviewed the web composer/timeline attachment UI. Two interaction findings on changed lines, both about the new needs-reattach / capacity paths giving the user no working path or feedback.

Posted via Macroscope — UI Consistency

Comment threadapps/web/src/components/chat/ChatComposer.tsx
Comment threadapps/web/src/composerDraftStore.ts
Comment threadapps/web/src/lib/attachmentUploadQueue.ts
Comment threadapps/web/src/composerDraftStore.ts Outdated
Comment threadapps/web/src/composerDraftStore.ts
Comment threadapps/web/src/composerDraftStore.ts Outdated
Comment threadapps/web/src/components/chat/ChatComposer.tsx

@macroscopeappmacroscopeappBot 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.

One finding: the new file-attachment download button in MessagesTimeline renders its filename center-aligned, unlike the visually identical anchor and inert rows next to it.

Posted via Macroscope — UI Consistency

Comment threadapps/web/src/components/chat/MessagesTimeline.tsx Outdated
@t3dotgg
t3dotggforce-pushed the t3code/file-attachments-web branch from c88f3df to 33d67f9CompareAugust 26, 2026 08:58
Comment threadapps/web/src/components/chat/ChatComposer.tsx
Comment threadapps/web/src/components/chat/composerAttachmentFiles.ts
Comment threadapps/web/src/components/chat/ChatComposer.tsx
@t3dotgg
t3dotggforce-pushed the t3code/file-attachments-web branch from 7abf833 to 1dd3cc0CompareAugust 26, 2026 09:29
Comment threadapps/web/src/components/ChatView.tsx
Comment threadapps/web/src/components/chat/ChatComposer.tsx Outdated
Comment threadapps/web/src/hooks/useHandleNewThread.ts

@macroscopeappmacroscopeappBot 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.

One finding on the new send-block wording in ChatComposer. The rest of the attachment UI (file rows, paperclip trigger, stash menu file badge, timeline file rows) reuses the existing primitives and row treatments consistently, and the earlier findings on the timeline download row alignment, the marker re-pick path, and the swallowed paste are resolved.

Posted via Macroscope — UI Consistency

Comment threadapps/web/src/components/chat/ChatComposer.tsx Outdated
Comment threadapps/web/src/components/chat/ChatComposer.tsx
Comment threadapps/web/src/components/ChatView.tsx Outdated

@macroscopeappmacroscopeappBot 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.

One finding: the needs-reattach file row label ignores the canReattachFiles guard that the send-block reason uses, so on a server without file-attachment support (or before the capability arrives) the row tells the user to attach again while no attach control is rendered.

Posted via Macroscope — UI Consistency

Comment threadapps/web/src/components/chat/ChatComposer.tsx
Comment threadapps/web/src/components/chat/ChatComposer.tsx
juliusmarminge added a commit that referenced this pull request Aug 29, 2026
PRs #8437 and #8236 crossed: one made stashShortcutLabel a required
ComposerStashMenu prop, the other added a test case without it, so
main fails web typecheck.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 29, 2026
Round-16 rebase onto main (5 commits, headlined by #8236 file
attachments in the client). Main's upload-aware send path — capability
probes, upload await/retry gating, uploaded-ref turn attachments with
dataUrl fallback, draft release on success — is woven into the v2
dispatch flow, timeline user rows render file attachments as download
links with the ChatView download handler, and the provider settings
editor cleanup keeps the branch's environment-field rows. The codex
feedback client flow stays unported, replay testkit configs gained
main's environmentThemesDir, and the rpc/settings/docs unions carry
both sides.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
github-actionsBot added a commit to omarcresp/t3code-flake that referenced this pull request Aug 29, 2026
## What's Changed
* feat(web): attach PDFs, ZIPs, and other files to a turn by @t3dotgg in pingdotgg/t3code#8236
* feat(web): keybinding settings as settings rows by @StiensWout in pingdotgg/t3code#8532
* feat: let an environment publish themes as a file by @ryanrhughes in pingdotgg/t3code#8569
* fix(web): clean up provider settings list and editor by @StiensWout in pingdotgg/t3code#8504
* fix(web): keep project picker popup inside the sidebar by @SunkenInTime in pingdotgg/t3code#8627
* fix(mobile): prevent header overflow and back-button artifacts by @juliusmarminge in pingdotgg/t3code#8624
## New Contributors
* @ryanrhughes made their first contribution in pingdotgg/t3code#8569
**Full Changelog**: pingdotgg/t3code@v0.0.37-nightly.20260829.1218...v0.0.37-nightly.20260829.1219
Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.37-nightly.20260829.1219
netpro2k added a commit to netpro2k/t3code that referenced this pull request Aug 29, 2026
Intent:
Expose the generic-file backend shipped in v0.0.36 through the web and desktop composer while following the official client implementation closely enough for its upstream PR to replace this patch cleanly.
Behavior:
- Accept images and generic files through the paperclip button, paste, and drag-and-drop; share the eight-attachment limit and use the server-advertised generic-file limit, currently 50 MB.
- Upload while the user composes, show progress/retry/reattach states, and render sent files as signed downloads with their original names.
- Preserve file drafts and stashes as server upload references or explicit needs-reattach markers instead of storing generic-file bytes in localStorage.
- Keep upload verification, cleanup, retry, environment moves, and unknown attachment rendering explicit.
- Show file names in the current mobile feed and include attachment names in transcript bootstrap context.
Design constraints:
- Backport official upstream PR pingdotgg#8236 at 129f2ad, rebased onto v0.0.36, rather than maintaining a parallel client upload architecture.
- Use packages/client-runtime for the shared upload lifecycle and clamp file sizes to the server capability and contract maximum.
- Require direct-upload support for generic files. Do not retain the fork inline-file protocol or serialize generic-file bytes into drafts and stashes.
- Upload local workspace drops like the official client; do not retain the competing desktop-only drop-to-mention behavior.
- Keep images on their established compression and compatibility path.
Integration:
- Shared client-runtime upload lifecycle and web environment atoms.
- Web composer, drafts, prompt stashes, upload queue, message timeline, signed asset downloads, sidebar counts, project cleanup, and user documentation.
- Minimal current mobile feed visibility and transcript bootstrap naming remain fork-only until the official follow-up covers them.
Verification:
- Official attachment-focused web and client-runtime tests pass (7 files, 196 tests).
- Targeted client-runtime, web, and mobile typechecks pass; the existing client-runtime Effect diagnostic remains advisory.
Rebase notes:
- Upstream PR pingdotgg#8236 should supersede the web/client-runtime implementation wholesale once merged.
- Upstream PR pingdotgg#8237 should supersede the temporary mobile filename row with signed mobile downloads and full mobile file picking/sharing.
- Recheck only the transcript-bootstrap filename summary after both PRs land.
- The v0.0.36 stashShortcutLabel test fixture is the only adaptation to the rebased official PR tree.
longtngo added a commit to longtngo/t3code that referenced this pull request Aug 29, 2026
Range f6f2be3..053affb, v0.0.36. 411 upstream files, 632 fork files,
81 touched by both, 19 conflicted.
Competing implementations resolved toward the fork's superset:
- Claude context usage (pingdotgg#8610). Upstream deleted `queryCurrentContextUsage` and
`normalizeClaudeContextUsageApiSnapshot` outright. `getContextUsage` is the ONLY
source of the compaction facts (`autocompactSource`, `autoCompactThreshold`,
`isAutoCompactEnabled`) the Vitals gauge's compaction note and marker render from,
and they travel on the wire contract, so the call is kept. Upstream's
`latestAssistantUsage` tracking and its post-compaction guard are adopted BELOW it
as the next-best fallback: `contextUsageSnapshot ?? latestAssistantSnapshot ?? ...`.
Upstream removed `getContextUsage` from `ClaudeQueryRuntime`, the
`SDKControlGetContextUsageResponse` import and the `Option` import outside every
conflict marker; all three restored.
- Provider settings editor (pingdotgg#8472). Upstream's `useEffect` + `lastPublishedEnvironmentRef`
re-seed is the superset of the fork's render-phase `seededRef` (8fe3190, one of four
silent-data-loss fixes). The merge had kept BOTH mechanisms; collapsed to upstream's,
with the fork's half-typed-row null guard on the publish path. `environmentKey` deleted
with the code it served.
- Sidebar project combobox (pingdotgg#5931). Upstream replaced the menu-based project filter,
whose `MenuRadioItem` carried the fork's project-actions button. Rebuilt on upstream's
`ComboboxItem` with the ellipsis button grafted back (invariant 6). The dead `Menu*`
import is gone.
- Composer attachments (pingdotgg#8236). Upstream's `addComposerAttachments` pipeline adopted; the
fork's drop split (image -> attach, other -> absolute path with upload fallback) kept
and repointed at the new handler.
- Mid-turn steer. Upstream's `steeringTurnState` branch rejected again (invariant 5); its
side of that hunk also opened an `if` whose brace lives below the hunk.
- Thread deletion drain (pingdotgg#8226). Upstream replaced `drain` with `drainThrough(sequence)`;
the fork's test retargeted. Its new drain test observed `ProviderService.stopSession`,
which this reactor never calls (it dispatches `thread.session.stop`), so it now counts
engine dispatches and provides the two services the fork's reactor needs.
Three defects the resolutions introduced, each caught by a check that is not the suite:
- `shouldShowBranchMismatchBanner` was resurrected into two import lists by resolving
them toward upstream. Fork commit cfdf255 replaced that function; the import had no
definition. Found by the RESURRECTED sweep.
- `scriptPath` ended up declared twice in CodexCollabRuntime.integration.test.ts: `both`
reintroduced upstream's fixture-dir copy that the fork deliberately moved to a temp dir.
Found by the RESURRECTED sweep.
- `setProjectScopeMenuOpen` survived in the fork's `handleProjectActions` after upstream
replaced that state with a reducer, outside every marker. Found by typecheck.
Upstream regressions of fork fixes, kept fixed:
- Raw NUL bytes returned to ChatComposer.tsx. A raw NUL renders as nothing in grep and
aborts BSD sed mid-file; the fork had converted all six to `\0` escapes and carries a
guard test for it. The guard failed, and the offending line reads as space-separated in
any normal diff. Converted back to escapes.
- `defaultTheme` / `defaultThemeSetAt` (pingdotgg#8569) are absent from `ServerSettingsPatch`; the
fork's patch-parity guard caught it. They are owned by `t3 theme set`, which rewrites
settings.json directly and which clients only read, so they are recorded as deliberately
unpatchable rather than mirrored.
- The fork's mobile held-messages strip used `dark:` variants that upstream's new Uniwind
theme rule (pingdotgg#7327) forbids; moved to the `text-foreground-muted` semantic token rather
than added to the rule's allowlist.
Invariants: all re-probed against the merged tree. 1 (49 migrations, ids unique and
monotonic, max 50, 34 burned), 2 (the fork-only @effect/platform-node patch survived the
Expo 57 rewrite of patchedDependencies, is pinned, resolved and applied on disk; effect
stays at beta.103 so no re-pin), 3, 4, 4b (4 `isSendBlocked=`), 5, 5b, 5c, 6, 7, 8, 9, 10,
11 all hold.
Sweeps: resurrected 3, dropped 21, fork-loss 45, both-kept 0. Every entry named: the 3
resurrected and the fork-loss in ProviderInstanceCard / ChatComposer / Sidebar are the
decisions above; the OpenCode fork-loss is 11 comment lines whose guard upstream extracted
into `deleteContextIfCurrent` (the rationale is restored on the helper); pnpm-lock churn is
the install. Test declarations 18,691 -> 19,081; one file lost one, upstream's own pingdotgg#8484.
Gate: pnpm run verify green, exit 0 read from the captured log line. 14 blocks,
10,744 passed, 20 skipped, 0 failures.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
netpro2k added a commit to netpro2k/t3code that referenced this pull request Aug 29, 2026
Intent:
Expose the generic-file backend shipped in v0.0.36 through the web and desktop composer while following the official client implementation closely enough for its upstream PR to replace this patch cleanly.
Behavior:
- Accept images and generic files through the paperclip button, paste, and drag-and-drop; share the eight-attachment limit and use the server-advertised generic-file limit, currently 50 MB.
- Upload while the user composes, show progress/retry/reattach states, and render sent files as signed downloads with their original names.
- Preserve file drafts and stashes as server upload references or explicit needs-reattach markers instead of storing generic-file bytes in localStorage.
- Keep upload verification, cleanup, retry, environment moves, and unknown attachment rendering explicit.
- Show file names in the current mobile feed and include attachment names in transcript bootstrap context.
Design constraints:
- Backport official upstream PR pingdotgg#8236 at 129f2ad, rebased onto v0.0.36, rather than maintaining a parallel client upload architecture.
- Use packages/client-runtime for the shared upload lifecycle and clamp file sizes to the server capability and contract maximum.
- Require direct-upload support for generic files. Do not retain the fork inline-file protocol or serialize generic-file bytes into drafts and stashes.
- Upload local workspace drops like the official client; do not retain the competing desktop-only drop-to-mention behavior.
- Keep images on their established compression and compatibility path.
Integration:
- Shared client-runtime upload lifecycle and web environment atoms.
- Web composer, drafts, prompt stashes, upload queue, message timeline, signed asset downloads, sidebar counts, project cleanup, and user documentation.
- Minimal current mobile feed visibility and transcript bootstrap naming remain fork-only until the official follow-up covers them.
Verification:
- Official attachment-focused web and client-runtime tests pass (7 files, 196 tests).
- Targeted client-runtime, web, and mobile typechecks pass; the existing client-runtime Effect diagnostic remains advisory.
Rebase notes:
- Upstream PR pingdotgg#8236 should supersede the web/client-runtime implementation wholesale once merged.
- Upstream PR pingdotgg#8237 should supersede the temporary mobile filename row with signed mobile downloads and full mobile file picking/sharing.
- Recheck only the transcript-bootstrap filename summary after both PRs land.
- The v0.0.36 stashShortcutLabel test fixture is the only adaptation to the rebased official PR tree.
juliusmarminge added a commit that referenced this pull request Aug 30, 2026
Round-16 rebase onto main (5 commits, headlined by #8236 file
attachments in the client). Main's upload-aware send path — capability
probes, upload await/retry gating, uploaded-ref turn attachments with
dataUrl fallback, draft release on success — is woven into the v2
dispatch flow, timeline user rows render file attachments as download
links with the ChatView download handler, and the provider settings
editor cleanup keeps the branch's environment-field rows. The codex
feedback client flow stays unported, replay testkit configs gained
main's environmentThemesDir, and the rpc/settings/docs unions carry
both sides.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
bcotrim pushed a commit to bcotrim/mognet that referenced this pull request Aug 30, 2026
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
(cherry picked from commit bcb855a)
bcotrim pushed a commit to bcotrim/mognet that referenced this pull request Aug 30, 2026
PRs pingdotgg#8437 and pingdotgg#8236 crossed: one made stashShortcutLabel a required
ComposerStashMenu prop, the other added a test case without it, so
main fails web typecheck.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
(cherry picked from commit d22709f)
juliusmarminge added a commit that referenced this pull request Aug 30, 2026
Round-16 rebase onto main (5 commits, headlined by #8236 file
attachments in the client). Main's upload-aware send path — capability
probes, upload await/retry gating, uploaded-ref turn attachments with
dataUrl fallback, draft release on success — is woven into the v2
dispatch flow, timeline user rows render file attachments as download
links with the ChatView download handler, and the provider settings
editor cleanup keeps the branch's environment-field rows. The codex
feedback client flow stays unported, replay testkit configs gained
main's environmentThemesDir, and the rpc/settings/docs unions carry
both sides.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
imsherrill pushed a commit to comprehensiveio/compadre that referenced this pull request Aug 31, 2026
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
(cherry picked from commit bcb855a)
imsherrill added a commit to comprehensiveio/compadre that referenced this pull request Aug 31, 2026
…) (#2)
(cherry picked from commit bcb855a)
Co-authored-by: Theo Browne <me@t3.gg>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
netpro2k added a commit to netpro2k/t3code that referenced this pull request Aug 31, 2026
Intent:
Keep transcript bootstrap context aware of generic file attachments now that upstream web and mobile clients support their full upload and rendering lifecycle.
Behavior:
- Count every message attachment in transcript bootstrap context, not only images.
- Include up to three attachment names plus an additional-count suffix.
- Preserve image/images wording when every attachment is an image; otherwise use file/files.
Design constraints:
- Rely entirely on upstream attachment upload, draft, stash, rendering, download, and mobile behavior.
- Keep this patch limited to the text supplied to transcript bootstrap.
Integration:
- Web transcript bootstrap summary only. No client upload, server, contract, mobile, or storage changes.
Verification:
- Upstream PRs pingdotgg#8236 and pingdotgg#8237 were audited as superseding the former attachment backport except for this summary behavior.
- Targeted web verification is rerun after the complete patch stack rebases.
Rebase notes:
- Drop this patch only when upstream transcript bootstrap includes generic attachment names rather than filtering to images.
github-actionsBot added a commit to omarcresp/t3code-flake that referenced this pull request Aug 31, 2026
## What's Changed
* Remove Messages Glass Lab experiment by @juliusmarminge in pingdotgg/t3code#8599
* Require human review for pull requests changing product defaults by @juliusmarminge in pingdotgg/t3code#8603
* fix(codex): avoid quadratic app-server input buffering by @juliusmarminge in pingdotgg/t3code#8605
* fix(mobile): stabilize iOS header item transitions by @juliusmarminge in pingdotgg/t3code#8607
* chore(mobile): upgrade to Expo SDK 57 by @juliusmarminge in pingdotgg/t3code#8609
* fix(mobile): harden native header toolbar items by @juliusmarminge in pingdotgg/t3code#8611
* fix(server): stop querying Claude context usage after turns by @t3dotgg in pingdotgg/t3code#8610
* chore: vouch ryanrhughes by @t3dotgg in pingdotgg/t3code#8613
* feat(web): attach PDFs, ZIPs, and other files to a turn by @t3dotgg in pingdotgg/t3code#8236
* feat(web): keybinding settings as settings rows by @StiensWout in pingdotgg/t3code#8532
* feat: let an environment publish themes as a file by @ryanrhughes in pingdotgg/t3code#8569
* fix(web): clean up provider settings list and editor by @StiensWout in pingdotgg/t3code#8504
* fix(web): keep project picker popup inside the sidebar by @SunkenInTime in pingdotgg/t3code#8627
* fix(mobile): prevent header overflow and back-button artifacts by @juliusmarminge in pingdotgg/t3code#8624
* fix(server): retry automatic thread title generation by @Bil0000 in pingdotgg/t3code#8087
* fix(client-runtime): refresh edited pull request comments by @Bil0000 in pingdotgg/t3code#8094
* fix(web): four composer spacing defects by @Bil0000 in pingdotgg/t3code#8090
* perf(desktop): skip duplicate browser updates by @Bil0000 in pingdotgg/t3code#8018
* fix(web): render nested markdown images correctly by @flamboh in pingdotgg/t3code#8501
* fix(web): unify activity logs and composer banners by @juliusmarminge in pingdotgg/t3code#8693
* fix(mobile): reduce dev-client reload and Metro startup cost by @juliusmarminge in pingdotgg/t3code#8694
* revert(web): restore previous composer banners by @t3dotgg in pingdotgg/t3code#8733
* test(web): remove tests for unreachable helpers by @t3-code[bot] in pingdotgg/t3code#8738
* feat(mobile): update tool summaries and chat transitions by @juliusmarminge in pingdotgg/t3code#8793
* feat(web): play video attachments in chat by @Bil0000 in pingdotgg/t3code#8688
* fix(web,mobile): snooze menu no longer offers the same wake time twice by @vitalyiegorov in pingdotgg/t3code#8741
* fix(grok): allow model changes in existing threads by @ahmed-besic in pingdotgg/t3code#8392
* feat(mobile): pick, share, and receive files in threads by @t3dotgg in pingdotgg/t3code#8237
* fix(web): reduce title bar scroll fade height by @maria-rcks in pingdotgg/t3code#8799
* fix(windows): strip quotes from repaired PATH by @UtkarshUsername in pingdotgg/t3code#8746
* fix(web): open agent images in expanded preview by @maria-rcks in pingdotgg/t3code#8807
* fix(git): follow repository instructions in generated source control text by @maria-rcks in pingdotgg/t3code#8804
* fix(server): stop overpricing cached Claude tokens by @SunkenInTime in pingdotgg/t3code#8806
* fix(web): keep image preview above sidebar control by @maria-rcks in pingdotgg/t3code#8811
* fix(web): keep right panel synced with agent edits by @maria-rcks in pingdotgg/t3code#8803
* fix(web,mobile): render Codex citations and artifact templates by @Yash-Singh1 in pingdotgg/t3code#8584
* chore: add Windows setup script to t3.json by @UtkarshUsername in pingdotgg/t3code#8814
* fix(web): fold interim turn responses by @maria-rcks in pingdotgg/t3code#8828
* fix(web): use circle alert for failed tool calls by @maria-rcks in pingdotgg/t3code#8840
* feat(mobile): add offline iPhone voice input by @t3dotgg in pingdotgg/t3code#8614
* fix(web): prevent pull request metadata overlap by @MatthewFeroz in pingdotgg/t3code#8790
## New Contributors
* @ryanrhughes made their first contribution in pingdotgg/t3code#8569
* @ahmed-besic made their first contribution in pingdotgg/t3code#8392
* @MatthewFeroz made their first contribution in pingdotgg/t3code#8790
**Full Changelog**: pingdotgg/t3code@v0.0.36...v0.0.37
Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.37
amitbet pushed a commit to amitbet/a2code that referenced this pull request Sep 1, 2026
Upstream shipped its own arbitrary file attachments (pingdotgg#8235/pingdotgg#8236/pingdotgg#8237), a
strict superset of the fork's, so that divergence is retired rather than
re-applied. Upstream also reverted its turn-plan chips, restructured provider
settings into list+editor, made the project picker a searchable combobox, and
replaced the mobile CSS-variable theme hook with useUniwindTheme.
Fork features preserved: thread forking, queued-prompt steering, in-chat find,
answered user-input rows, machine-scoped environments, provider health-check
cache, provider "Default traits", live quota meter, thread export/pinning,
payload hot-update channel, and the build-only CI surface.
See FORK_NOTES.md for the per-file migration notes.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Sep 1, 2026
Round-16 rebase onto main (5 commits, headlined by #8236 file
attachments in the client). Main's upload-aware send path — capability
probes, upload await/retry gating, uploaded-ref turn attachments with
dataUrl fallback, draft release on success — is woven into the v2
dispatch flow, timeline user rows render file attachments as download
links with the ChatView download handler, and the provider settings
editor cleanup keeps the branch's environment-field rows. The codex
feedback client flow stays unported, replay testkit configs gained
main's environmentThemesDir, and the rpc/settings/docs unions carry
both sides.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Coriou added a commit to Coriou/txcode that referenced this pull request Sep 1, 2026
Upstream tip (bcb855a, pingdotgg#8236) rewrote the third render's entries and
dropped the required stashShortcutLabel prop, leaving upstream's own web
typecheck red. Completed the fixture; candidate for an upstream report.
juliusmarminge added a commit that referenced this pull request Sep 2, 2026
Round-16 rebase onto main (5 commits, headlined by #8236 file
attachments in the client). Main's upload-aware send path — capability
probes, upload await/retry gating, uploaded-ref turn attachments with
dataUrl fallback, draft release on success — is woven into the v2
dispatch flow, timeline user rows render file attachments as download
links with the ChatView download handler, and the provider settings
editor cleanup keeps the branch's environment-field rows. The codex
feedback client flow stays unported, replay testkit configs gained
main's environmentThemesDir, and the rpc/settings/docs unions carry
both sides.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
brentkelly added a commit to brentkelly/t3code-orchestrator that referenced this pull request Sep 2, 2026
* feat(analytics): threads and turns now know which client started them (pingdotgg#7774)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(web): stop marking mixed tool runs as failed (pingdotgg#7893)
* fix(web): command-click spaced folder links (pingdotgg#6439)
Co-authored-by: shivam <91240327+shivamhwp@users.noreply.github.com>
* fix(chat): stop pushing follow-up messages to the top (pingdotgg#7897)
* test(desktop): remove redundant release note assertion (pingdotgg#7873)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
* fix(web): handle wide ordered-list marker edge cases (pingdotgg#7856)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(ssh): restore user PATH for remote servers (pingdotgg#7213)
* fix(desktop): keep tailscale spawn defects from breaking advertised endpoints (pingdotgg#7116)
* fix(web): keep Codex service tier labels readable (pingdotgg#4503)
* fix: render workspace images in chat markdown (pingdotgg#6433)
* fix(clients): keep opening responses visible after turns settle (pingdotgg#7723)
* feat(web): add appearance contrast control (pingdotgg#7906)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: maria <254055478+maria-rcks@users.noreply.github.com>
* fix(server): stop completed Codex threads from staying stuck on working (pingdotgg#7937)
* fix(mobile): preserve markdown image dimensions (pingdotgg#7940)
* fix(web): remove duplicate provider update progress (pingdotgg#7761)
* fix(server): fall back to the remote default branch instead of assuming main (pingdotgg#7078)
* fix(web): give sidebar project menu rows the same side padding as other menus (pingdotgg#7913)
* fix(clients): reconnect after credentials fail during remote server updates (pingdotgg#7953)
* feat(codex): submit thread feedback to OpenAI (pingdotgg#7949)
* fix(server): stop kills lingering Claude work (pingdotgg#5891)
* fix(ci): let Macroscope approve pull requests again (pingdotgg#7970)
* fix(clients): move settled pinned threads into the settled section (pingdotgg#7969)
* perf(ci): speed up release builds and Windows packaging (pingdotgg#7975)
* fix(web): stop tool calls from leaving a blank page in threads (pingdotgg#7971)
* fix(web): stop recovered tool failures from marking work logs red (pingdotgg#7999)
* fix(mobile): isolate markdown image requests (pingdotgg#7942)
* feat(web): redesign skills in `$` menu and in `/` menu (pingdotgg#8009)
* fix(web): restore right panel toggle clicks after closing on desktop (pingdotgg#8016)
* fix(web): keep server update banners flush with the composer (pingdotgg#8000)
* perf(web): reuse work log rows during streaming (pingdotgg#8006)
* fix(web): keep provider badge legible in dark themes (pingdotgg#7968)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: maria <254055478+maria-rcks@users.noreply.github.com>
* fix(web): treat configured urls with uppercase schemes as secure (pingdotgg#8005)
Co-authored-by: Simone <185146821+Lucenx9@users.noreply.github.com>
* fix(desktop): keep release notes visible while downloading (pingdotgg#6412)
* fix(web): show only providers with usage in usage views (pingdotgg#7563)
* fix(web): prevent expanded tool calls from hiding thread content (pingdotgg#8052)
* test(server): remove no-op live activity tests (pingdotgg#8056)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
* fix(web): clarify terminal sidebar grouping (pingdotgg#7967)
* fix(codex): show app access approval prompts (pingdotgg#8058)
* feat(web): upload image attachments before sending (pingdotgg#8048)
* fix(server): bound OpenCode skill discovery output (pingdotgg#7675)
Co-authored-by: Simone <185146821+Lucenx9@users.noreply.github.com>
* fix(mobile): persist thread shelf collapse state (pingdotgg#5152)
* fix(mobile): restore Android tablet thread controls, clean up header (pingdotgg#5385)
* fix(mobile): land the first thread open above the composer on Android (pingdotgg#5585)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: codex <codex@users.noreply.github.com>
Co-authored-by: Julius Marminge <julius0216@outlook.com>
* fix(server): check out submodules in a new worktree (pingdotgg#7674)
Co-authored-by: Rodrigo Brechard <rodrigo@clubtidy.fr>
* fix(server): preserve merged PR badges after branch deletion (pingdotgg#6216)
* fix(server): return fresh live pull request reads (pingdotgg#6472)
* fix(web): compare client and server versions as semver, not strings (pingdotgg#7579)
* fix(web): stop follow-ups from leaving giant blank space (pingdotgg#8068)
* fix(marketing): stop automatic Vercel deployments on pull requests (pingdotgg#8070)
* chore: vouch repeat contributors (pingdotgg#8071)
* fix(server): keep the authoritative subagent model when snapshots race task_started (pingdotgg#7583)
* fix(server): honor auto-accept edits for the OpenCode provider (pingdotgg#7100)
* fix(server): run the CLI on Node versions without import.meta.main (pingdotgg#7141)
* fix(server): recover from provider interrupt failures (pingdotgg#7412)
* fix(server): recreate a thread's worktree before starting a turn (pingdotgg#7839)
* fix(server): thread delete no longer fails on already-removed worktrees (pingdotgg#8076)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(web): stop update notices showing through the composer (pingdotgg#8083)
* fix(web): detect outdated nightly servers (pingdotgg#8124)
* fix(web): align usage page skeleton layout (pingdotgg#8111)
* fix(web): make terminal links appear clickable only when clickable (pingdotgg#7488)
* fix(web): make Windows file links clickable in chat (pingdotgg#8081)
* fix(web): sort usage models by token count (pingdotgg#8108)
* fix: open agent file links in the file viewer (pingdotgg#8098)
* fix(server): stop routine events from rescanning thread history (pingdotgg#8150)
* fix(deps): stop pnpm installs from changing the lockfile (pingdotgg#8163)
* feat(web): settle and restore threads with a keyboard shortcut (pingdotgg#8089)
* perf(desktop): cut macOS signing calls by 81% (pingdotgg#8093)
* feat: link pull requests to threads (pingdotgg#8160)
* feat(web): safely attach HEIC photos as JPEG images (pingdotgg#8161)
Co-authored-by: mweinbach <maxweinbach5@gmail.com>
* feat(mobile): track device models and OS versions (pingdotgg#8169)
* fix(grok): bound cumulative tool output updates (pingdotgg#7279)
* fix(web): delay thread shortcut hints by 200 ms (pingdotgg#8172)
* fix(server): stop probing Cursor until enabled (pingdotgg#8175)
* docs(release): verify remote updates with database migrations (pingdotgg#8177)
* fix(server): keep provider CLIs available in the macOS service (pingdotgg#8173)
* feat(claude): compact old threads before they burn through usage (pingdotgg#8144)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(client-runtime): retry queries after connection interruption (pingdotgg#8117)
* fix(server): keep previously used providers working after upgrades (pingdotgg#8176)
* feat(desktop): build macOS previews from a PR label (pingdotgg#8182)
* fix(web): thread jump hints no longer stick after a dictation paste (pingdotgg#8189)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(web): keep grouped project renames (pingdotgg#7831)
* feat(web): reveal chat file chips in the system file manager (pingdotgg#7140)
Co-authored-by: Dara Adedeji <daraaded@amazon.com>
Co-authored-by: shivam <91240327+shivamhwp@users.noreply.github.com>
* fix(server): push no longer writes a feature branch's commits to its base branch (pingdotgg#8228)
* chore(deps): bump @clerk/electron to 0.0.37 (pingdotgg#8240)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* feat(server): fetch legacy model classification from a hosted manifest (pingdotgg#8227)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* chore(release): prepare v0.0.34
* fix(desktop): let Clerk UI receive stable auth fixes (pingdotgg#8248)
* fix(app): un-settled threads return to the top of the list (pingdotgg#8231)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* perf(ci): cut about a minute from every release (pingdotgg#8250)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* feat(ci): download macOS preview DMGs without signing in (pingdotgg#8243)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(codex): accept Codex 0.150 multi-agent events (pingdotgg#8346)
* chore(release): prepare v0.0.35
* fix(grok): improve skills, plans, usage, and turn reliability (pingdotgg#8358)
Co-authored-by: Dara Adedeji <daraadedeji07@gmail.com>
Co-authored-by: Ahmed Besic <ahmed-besic@users.noreply.github.com>
Co-authored-by: Michael Brown <michaeltbrown.mtb@gmail.com>
Co-authored-by: Lars Nieuwenhuis <35393046+lnieuwenhuis@users.noreply.github.com>
Co-authored-by: Guilherme Barros <gbarros1095@gmail.com>
Co-authored-by: PC <pc@localhost>
Co-authored-by: 1xpixi <157762409+1xpixi@users.noreply.github.com>
* fix(server): recover stale Codex approval callbacks (pingdotgg#5195)
* test(server): remove duplicate missing worktree test (pingdotgg#8252)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
* fix(server): replay all un-applied events during projection bootstrap (pingdotgg#7538)
Co-authored-by: Theo Browne <me@t3.gg>
* test: remove low-signal test files (pingdotgg#8397)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
* test: prune trivial error and layout tests (pingdotgg#8400)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
* Fix Android adaptive launcher icon (pingdotgg#4332)
Co-authored-by: Yash Singh <saiansh2525@gmail.com>
* feat(web): split provider settings into list and editor (pingdotgg#8380)
* fix(codex): accept Codex 0.150 account plans (pingdotgg#8447)
* fix(tooling): allow ignored-only staged changes (pingdotgg#8468)
* fix(mobile): keep iOS home header stable (pingdotgg#8467)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(web): stop showing red x summaries for ordinary tool failures (pingdotgg#8395)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(mobile): refine Git action toast glass styling (pingdotgg#8399)
* fix(desktop): allow preview automation in agent-created threads (pingdotgg#8483)
* test(web): remove redundant cache key test (pingdotgg#8484)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
* fix(release): move nightly schedule to minute 38
Recent scheduled nightlies have been delayed or skipped.
Move the nightly cron from minute 7 to minute 38. Keep the existing three-hour interval. This tests a different point in each three-hour window without claiming it will fix GitHub schedule delivery.
Authored by GPT-5.6 Sol with the Codex harness.
* fix(web): stabilize the provider settings editor (pingdotgg#8472)
* fix(web): open GitHub pull requests in browser when loading fails (pingdotgg#8507)
* fix(codex): show sub-agent models (pingdotgg#8502)
* feat(analytics): report connected client platforms (pingdotgg#8481)
* feat(server): accept PDF, ZIP, and other file uploads up to 50MB (pingdotgg#8235)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* feat(web): toggle thread pin from the keyboard
Add a mod+shift+p shortcut that pins or unpins the active thread. Ignore the shortcut during terminal focus and when the server does not support thread pinning.
* fix(web): add back button to project settings (pingdotgg#8168)
* refactor(mobile): compile semantic themes for Uniwind (pingdotgg#7327)
Co-authored-by: codex <codex@users.noreply.github.com>
* fix(desktop): Cache Runtime locally on WSL Filesystem, dramatically improving launch times (pingdotgg#5769)
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: Utkarsh Patil <73941998+UtkarshUsername@users.noreply.github.com>
* fix(mobile): show OpenCode model sources in picker (pingdotgg#8573)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(clients): honor project default models in new threads (pingdotgg#6011)
Co-authored-by: Shivam Sharma <91240327+shivamhwp@users.noreply.github.com>
* fix(mobile): show file actions on Android (pingdotgg#8215)
Co-authored-by: Shivam Sharma <91240327+shivamhwp@users.noreply.github.com>
* fix(connect): explain DPoP connection failures (pingdotgg#8351)
Co-authored-by: Julius Marminge <julius0216@outlook.com>
* feat(web): make the sidebar project filter a searchable combobox (pingdotgg#5931)
* fix(server): a draft can retry its first send after a failed bootstrap (pingdotgg#8226)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(desktop): stop hidden previews draining battery (pingdotgg#8567)
* fix(desktop): oauth popups open from the browser preview (pingdotgg#8435)
Co-authored-by: Julius Marminge <julius0216@outlook.com>
* fix(web): keep long task drawers usable on small screens (pingdotgg#8313)
* fix(opencode): handle child approvals, stops, and model catalogs (pingdotgg#8480)
* fix: make thread auto-settling opt-in (pingdotgg#8321)
* fix(web): stop session activity timing test from blocking releases (pingdotgg#8585)
* fix(mobile): show composer menus when starting a task (pingdotgg#8587)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(web): show the configured stash shortcut (pingdotgg#8437)
Co-authored-by: Shivam Sharma <91240327+shivamhwp@users.noreply.github.com>
* feat(web): add toggleable confirmation before unpinning a thread (pingdotgg#7313)
Co-authored-by: Shivam Sharma <91240327+shivamhwp@users.noreply.github.com>
* fix: restore automatic thread settling defaults (pingdotgg#8596)
* fix(mobile): restore composer glass and rounded shadows (pingdotgg#8597)
Co-authored-by: Julius Marminge <julius@mac.lan>
* Remove Messages Glass Lab experiment (pingdotgg#8599)
* chore(release): prepare v0.0.36
* Require human review for pull requests changing product defaults (pingdotgg#8603)
* fix(codex): avoid quadratic app-server input buffering (pingdotgg#8605)
* fix(mobile): stabilize iOS header item transitions (pingdotgg#8607)
Co-authored-by: Julius Marminge <julius@mac.lan>
* chore(mobile): upgrade to Expo SDK 57 (pingdotgg#8609)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(mobile): harden native header toolbar items (pingdotgg#8611)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(server): stop querying Claude context usage after turns (pingdotgg#8610)
* chore: vouch ryanrhughes (pingdotgg#8613)
* feat(web): attach PDFs, ZIPs, and other files to a turn (pingdotgg#8236)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(web): pass stashShortcutLabel in the mixed-attachments stash test
PRs pingdotgg#8437 and pingdotgg#8236 crossed: one made stashShortcutLabel a required
ComposerStashMenu prop, the other added a test case without it, so
main fails web typecheck.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* feat(web): keybinding settings as settings rows (pingdotgg#8532)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Julius Marminge <julius0216@outlook.com>
* feat: let an environment publish themes as a file (pingdotgg#8569)
Co-authored-by: Theo Browne <me@t3.gg>
* fix(web): clean up provider settings list and editor (pingdotgg#8504)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Julius Marminge <julius0216@outlook.com>
* fix(web): keep project picker popup inside the sidebar (pingdotgg#8627)
* fix(mobile): prevent header overflow and back-button artifacts (pingdotgg#8624)
* fix(server): retry automatic thread title generation (pingdotgg#8087)
* fix(client-runtime): refresh edited pull request comments (pingdotgg#8094)
* fix(web): four composer spacing defects (pingdotgg#8090)
* perf(desktop): skip duplicate browser updates (pingdotgg#8018)
Co-authored-by: Julius Marminge <julius0216@outlook.com>
* fix(web): render nested markdown images correctly (pingdotgg#8501)
* fix(web): unify activity logs and composer banners (pingdotgg#8693)
* fix(mobile): reduce dev-client reload and Metro startup cost (pingdotgg#8694)
Co-authored-by: Julius Marminge <julius@mac.lan>
* revert(web): restore previous composer banners (pingdotgg#8733)
* test(web): remove tests for unreachable helpers (pingdotgg#8738)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
* feat(mobile): update tool summaries and chat transitions (pingdotgg#8793)
* feat(web): play video attachments in chat (pingdotgg#8688)
* fix(web,mobile): snooze menu no longer offers the same wake time twice (pingdotgg#8741)
* fix(grok): allow model changes in existing threads (pingdotgg#8392)
Co-authored-by: Ahmed Besic <ahmed-besic@users.noreply.github.com>
* feat(mobile): pick, share, and receive files in threads (pingdotgg#8237)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Julius Marminge <julius0216@outlook.com>
* fix(web): reduce title bar scroll fade height (pingdotgg#8799)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(windows): strip quotes from repaired PATH (pingdotgg#8746)
* fix(web): open agent images in expanded preview (pingdotgg#8807)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(git): follow repository instructions in generated source control text (pingdotgg#8804)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(server): stop overpricing cached Claude tokens (pingdotgg#8806)
* fix(web): keep image preview above sidebar control (pingdotgg#8811)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(web): keep right panel synced with agent edits (pingdotgg#8803)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(web,mobile): render Codex citations and artifact templates (pingdotgg#8584)
* chore: add Windows setup script to t3.json (pingdotgg#8814)
* fix(web): fold interim turn responses (pingdotgg#8828)
* fix(web): use circle alert for failed tool calls (pingdotgg#8840)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* feat(mobile): add offline iPhone voice input (pingdotgg#8614)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(web): prevent pull request metadata overlap (pingdotgg#8790)
* chore(release): prepare v0.0.37
* Add mobile composer attachment menu with video support (pingdotgg#8843)
* fix(mobile): map native menu icon colors explicitly
* fix(web): restore unified activity logs and composer banners (pingdotgg#8734)
Co-authored-by: Julius Marminge <julius0216@outlook.com>
Co-authored-by: Julius Marminge <jmarminge@gmail.com>
* fix(web): address composer banner review follow-ups (pingdotgg#8850)
* fix(web): widen sync banners and simplify the working timer (pingdotgg#8855)
* fix(preview): improve browser recording quality (pingdotgg#8839)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(web): mark pull request links as external (pingdotgg#8856)
* fix(mobile): replace Callstack glass with Expo glass (pingdotgg#8862)
* fix(server): skip IDE detection in Claude probes (pingdotgg#8634)
* chore(macroscope): review diagnostic overrides (pingdotgg#8917)
Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
* fix(contracts): accept CLI event origins (pingdotgg#8905)
* fix(web): hide invalid slash skill completions (pingdotgg#8904)
* fix(mobile): defer draft navigation until submission completes (pingdotgg#8914)
* chore: disable CodeRabbit review status (pingdotgg#8933)
* Delete app.json (pingdotgg#8934)
* fix(web): show scrollbar for wide markdown tables (pingdotgg#8868)
* fix(mobile): shimmer active tool rows (pingdotgg#8932)
Co-authored-by: Julius Marminge <julius@mac.lan>
* chore(deps): bump Electron to 43.4.1 (pingdotgg#8626)
* fix(chat): smooth worktree setup status (pingdotgg#8922)
* feat(mobile): add video playback with native iOS controls (pingdotgg#8919)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(web): prevent chat metadata overlap (pingdotgg#8851)
* fix(server): preserve usage cache outside walked roots (pingdotgg#8540)
Co-authored-by: Simone <185146821+Lucenx9@users.noreply.github.com>
* feat(mobile): add native image and PDF previews (pingdotgg#8959)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(server): allow long thread IDs in HTTP routes (pingdotgg#8898)
* fix(shared): preserve Windows shell PATH priority (pingdotgg#8748)
* fix(web): make WSL settings searchable (pingdotgg#8881)
* feat(web): add expand/collapse all control to the files surface (pingdotgg#8889)
* Add auto_review configuration to coderabbit.yaml
* style: format CodeRabbit configuration
* feat(mobile): upload attachments while composing (pingdotgg#8978)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(chat): keep agent activity visible between actions (pingdotgg#8984)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(server): isolate remote web session cookies (pingdotgg#8085)
Co-authored-by: Julius Marminge <julius0216@outlook.com>
* feat(pull-requests): link GitHub references in markdown (pingdotgg#8812)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* perf(server): reduce frequency of full tool call output being loaded into memory from db (pingdotgg#8988)
* feat(web): add pull request list filters (pingdotgg#8809)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* feat(web): search individual settings by detail (pingdotgg#8831)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* feat(client): render viewed images in work logs (pingdotgg#8936)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(client): use package import for markdown image helpers (pingdotgg#9010)
* test: remove static presentation snapshots (pingdotgg#9008)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
* perf(server): bound snapshot activity payload memory (pingdotgg#9000)
* perf(server): cut idle CPU use and stop provider event leaks (pingdotgg#8187)
* perf(server): scan only appended transcript bytes for usage summaries (pingdotgg#9024)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Theo Browne <me@t3.gg>
* perf(server): cut chatty tool-update frames by 90% (pingdotgg#8368)
* fix(server): settle threads server-side (pingdotgg#8600)
* fix(clients): dedupe skills in composer menus (pingdotgg#8043)
* fix(server): stop OpenCode child sessions (pingdotgg#9005)
* perf(web): defer pull request line stats until visible (pingdotgg#6471)
Co-authored-by: Theo Browne <me@t3.gg>
* perf(server): skip full-message reads while streaming (pingdotgg#9032)
* perf(client-runtime): halve server config bootstrap traffic (pingdotgg#8367)
Reuse one server config subscription for session bootstrap and live updates.
Preserve environment theme opt-in, replay, deletion, slow subscriber recovery, and config stream failure handling.
Co-authored-by: Adamulek123 <adam.bogucki2018@gmail.com>
* fix(web): align un-settle banner action (pingdotgg#9033)
* fix(web): block type-to-focus behind open dialogs (pingdotgg#8139)
Co-authored-by: Simone <185146821+Lucenx9@users.noreply.github.com>
* feat(shortcuts): copy active thread reference (pingdotgg#8994)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(mobile): keep thread scroll bounds current after animations (pingdotgg#9013)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(server): cache project favicon resolution (pingdotgg#9080)
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
* feat(claude): add Claude Fable 5.1 model (pingdotgg#9078)
* fix(preview): restore recording and macOS rendering after Electron 43 (pingdotgg#9001)
Co-authored-by: Guillermo Casanova <guillermo.casanova.b@gmail.com>
* feat(desktop): add configurable quit shortcut confirmation (pingdotgg#9076)
* feat(web): open project settings from thread menus (pingdotgg#8925)
* fix(chat): reuse one row for live activity (pingdotgg#9062)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* feat(models): discover Claude models from remote manifest (pingdotgg#9084)
* Revert "fix(chat): reuse one row for live activity" (pingdotgg#9096)
* fix(web): sync sidebar PR state from open panel (pingdotgg#9092)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: maria <254055478+maria-rcks@users.noreply.github.com>
* fix(web): changing projects no longer creates a draft (pingdotgg#9097)
* fix(web): keep theme placeholder text dimmer than entered text (pingdotgg#9104)
* fix(web): keep the selected environment when changing projects (pingdotgg#9102)
* docs(plans): t3o-31 upstream sync to v0.0.38
* fix(board): clear the ten pre-existing typecheck errors before the upstream sync (t3o-31 P0)
Two test fakes failed with a bare Error in the Effect failure channel, a
closure-assigned let narrowed to never, and a single-override pill read
overriddenRows[0] under noUncheckedIndexedAccess. None changed behaviour;
they were masked because the recursive typecheck never reached apps/server.
* fix(sync): the three type errors and two test failures the v0.0.38 merge caused
- BoardModelRow reads planModeEnabled from client settings, as the composer does.
- findBranchPullRequest resolves the default branch for upstream's widened PR
cache key instead of passing null.
- The orphaned-session integration test mocks the supervisor reactor that the
startup seam yields (new inventory row).
- The projection resume test seeds board projector watermarks into
boards.projection_state, where t3o-26 reads them, and asserts over the union.
- searchSettings("work") now also matches upstream's worktree/network items.
* refactor(board): native title attributes become BoardHint tooltips
Upstream's new no-native-title-tooltip rule flags every intrinsic-element
title= in the board (61 sites). BoardHint wraps the styled Tooltip primitive
and renders its child as the trigger, so layout is unchanged; a nullish label
renders the child alone.
* docs(seams): record the v0.0.38 sync (t3o-31)
Merge-log row, the decisions taken (plans stay tracked, upstream's settlement
reactor accepted after audit, projector-enumeration policy, launcher protocol
note), an unmarked-edits debt table for the next sync, a marker census, the
three new upstream workflows to disable, and the runbook's per-package
verification notes.
* review(t3o-31): announce the board's status dots, and order the merge log
Round-1 nitpicks: a bare span's aria-label is not announced, so the working,
running and awaiting dots now carry role="img"; the v0.0.38 merge-log row
moves below the two 2026-08-09 rows so the table reads chronologically.
---------
Co-authored-by: Theo Browne <me@t3.gg>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Dara Adedeji <76637177+SunkenInTime@users.noreply.github.com>
Co-authored-by: shivam <91240327+shivamhwp@users.noreply.github.com>
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: abcdmku <63693423+abcdmku@users.noreply.github.com>
Co-authored-by: Guilherme Barros <gbarros1095@gmail.com>
Co-authored-by: Rishet11 <154429365+Rishet11@users.noreply.github.com>
Co-authored-by: Alex <me@pixp.cc>
Co-authored-by: maria <254055478+maria-rcks@users.noreply.github.com>
Co-authored-by: Naveed Iqbal <naveediqbal949@gmail.com>
Co-authored-by: Ishaan Kothari <ishaanko.mail@gmail.com>
Co-authored-by: Exotic <118054752+extoci@users.noreply.github.com>
Co-authored-by: Utkarsh Patil <73941998+UtkarshUsername@users.noreply.github.com>
Co-authored-by: Bilal Bakr <62337003+Bil0000@users.noreply.github.com>
Co-authored-by: Rakshith Bhat <88523594+RakshithBhat03@users.noreply.github.com>
Co-authored-by: Simone <lucenz@proton.me>
Co-authored-by: Simone <185146821+Lucenx9@users.noreply.github.com>
Co-authored-by: Tristan Knight <admin@snappeh.com>
Co-authored-by: Wout Stiens <71498452+StiensWout@users.noreply.github.com>
Co-authored-by: Pavlo Trinko <paul.trinko95@gmail.com>
Co-authored-by: codex <codex@users.noreply.github.com>
Co-authored-by: Julius Marminge <julius0216@outlook.com>
Co-authored-by: Rodrigo Brechard <rodrigobrechard@gmail.com>
Co-authored-by: Rodrigo Brechard <rodrigo@clubtidy.fr>
Co-authored-by: Adamulek123 <adam.bogucki2018@gmail.com>
Co-authored-by: spiky02plateau <155588579+spiky02plateau@users.noreply.github.com>
Co-authored-by: Carlos Jimenez <cjimenez@r21digital.com>
Co-authored-by: Mark Griffin <mrmg@deflexion.net>
Co-authored-by: MacKinley Smith <smithmackinley@gmail.com>
Co-authored-by: oliver <97427849+flamboh@users.noreply.github.com>
Co-authored-by: mweinbach <maxweinbach5@gmail.com>
Co-authored-by: Lars Nieuwenhuis <35393046+lnieuwenhuis@users.noreply.github.com>
Co-authored-by: Mohtasham Murshid <154406804+MohtashamMurshid@users.noreply.github.com>
Co-authored-by: Dara Adedeji <daraaded@amazon.com>
Co-authored-by: Dara Adedeji <daraadedeji07@gmail.com>
Co-authored-by: Ahmed Besic <ahmed-besic@users.noreply.github.com>
Co-authored-by: Michael Brown <michaeltbrown.mtb@gmail.com>
Co-authored-by: PC <pc@localhost>
Co-authored-by: 1xpixi <157762409+1xpixi@users.noreply.github.com>
Co-authored-by: Josh <gitlucky@pipelab.org>
Co-authored-by: Tradi3 <56069280+krutftw@users.noreply.github.com>
Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
Co-authored-by: Ivan Malison <IvanMalison@gmail.com>
Co-authored-by: Yash Singh <saiansh2525@gmail.com>
Co-authored-by: Gianmarco <gianmarcosimone89@gmail.com>
Co-authored-by: Julius Marminge <julius@mac.lan>
Co-authored-by: Illia Panasenko <hello@ipanasenko.me>
Co-authored-by: Matheson Steplock <ikifar2012@users.noreply.github.com>
Co-authored-by: Anirudh Coontoor <anirudh@gosupernova.live>
Co-authored-by: Nick Anisimov <n.anisimov.23@gmail.com>
Co-authored-by: Muhammad Waleed <114993336+walid-baharwal@users.noreply.github.com>
Co-authored-by: Ryan Hughes <ryan@heyoodle.com>
Co-authored-by: Vitaly Iegorov <vitalyiegorov@gmail.com>
Co-authored-by: Ahmed Besic <ahmed.besic2000@gmail.com>
Co-authored-by: maria <maria@kuuro.net>
Co-authored-by: Matthew Feroz <136640686+MatthewFeroz@users.noreply.github.com>
Co-authored-by: Julius Marminge <jmarminge@gmail.com>
Co-authored-by: Aditya Garud <153842990+yashranaway@users.noreply.github.com>
Co-authored-by: Yukun Shan <92423096+nateEc@users.noreply.github.com>
Co-authored-by: Will Sheldon <will@autimo.com>
Co-authored-by: mic <85814106+q1@users.noreply.github.com>
Co-authored-by: Guillermo Casanova <guillermo.casanova.b@gmail.com>
juliusmarminge added a commit that referenced this pull request Sep 2, 2026
Round-16 rebase onto main (5 commits, headlined by #8236 file
attachments in the client). Main's upload-aware send path — capability
probes, upload await/retry gating, uploaded-ref turn attachments with
dataUrl fallback, draft release on success — is woven into the v2
dispatch flow, timeline user rows render file attachments as download
links with the ChatView download handler, and the provider settings
editor cleanup keeps the branch's environment-field rows. The codex
feedback client flow stays unported, replay testkit configs gained
main's environmentThemesDir, and the rpc/settings/docs unions carry
both sides.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XXL1,000+ changed lines (additions + deletions).vouch:trustedPR 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

@t3dotgg
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

feat(web): attach PDFs, ZIPs, and other files to a turn - #8236

Merged
t3dotgg merged 29 commits into
mainfrom
t3code/file-attachments-web
Aug 29, 2026
Merged

feat(web): attach PDFs, ZIPs, and other files to a turn#8236
t3dotgg merged 29 commits into
mainfrom
t3code/file-attachments-web

Conversation

@t3dotgg

@t3dotggt3dotgg commented Aug 25, 2026

Copy link
Copy Markdown
Member

The file upload APIs and tolerant attachment contracts from #8235 are now on main. This PR adds the web client for them.

The composer accepts PDFs, ZIPs, and other files up to the server's advertised limit through the paperclip button or paste. Uploads start while the user types, survive draft and stash moves, and render as rows that download with the original filename. Unknown attachment types render as inert rows instead of crashing the thread.

One shared upload flow in packages/client-runtime owns verification, transfer, release, and size limits. Draft discard, project delete, stash, file removal, and send cleanup all use that flow. Interrupted uploads return as "Attach again" markers instead of disappearing.

Release warning: clients with the old image-only attachment contract cannot decode threads that contain file attachments. The compatibility work in #8235 makes the merged server contract tolerant and keeps existing mobile code from treating files as images. Hold the web release until a compatible mobile build is available. #8237 adds mobile file support.

Original work by Theo Browne with Claude Fable 5 in the Claude Code harness. Modernized by GPT-5.6 Sol in the Codex harness.


Note

Medium Risk
Touches the turn send/upload pipeline and draft persistence; threads with file attachments require a tolerant client contract, so release coordination with older mobile builds matters.

Overview
Adds generic file attachments to the chat composer (paperclip, paste, drag) alongside images, with images and files sharing the per-turn attachment cap and server-advertised size limits.

Send and upload path:ChatView snapshots images and files together, runs shared upload/capability checks before and after upload, builds optimistic file rows, and wires timeline on-demand downloads via signed asset URLs. Annotation screenshots respect the combined attachment limit so prompts do not claim crops that were not sent.

Composer UX:ChatComposer stages file rows (upload progress, retry, “attach again” after interrupted uploads), blocks send when capabilities or limits fail, and extends stash restore/save to persisted file uploads with environment checks and expiry verification.

Persistence:composerDraftStore persists file metadata (upload ids or needs-reattach markers), enforces combined limits, and handles moves across threads/environments. Plan follow-up actions hide while any composer attachment is staged (shouldShowPlanFollowUpPrompt).

Timeline: User messages render non-image attachments as download links or inert rows for unknown types. Project/sidebar draft counts include files; project delete passes thread refs when releasing draft uploads.

Reviewed by Cursor Bugbot for commit 129f2ad. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Add PDF, ZIP, and generic file attachment support to chat turns

  • Extends the chat composer to support generic file attachments alongside images, including selection via paste or paperclip button, progress tracking, and retry controls
  • Updates composerDraftStore, attachmentUploadQueue, and prompt stash store to persist file metadata, deduplicate attachments, manage upload lifecycles, and handle cross-environment moves
  • Adds server capability checks to enforce staging limits and reject non-image files on servers that lack upload support
  • Renders received file attachments in the timeline as downloadable links or buttons using generated signed URLs
  • Risk: Non-image attachments now throw an error during send if the server does not support attachment uploads; cross-environment draft moves strip source upload linkage for byte-backed files

Macroscope summarized 129f2ad.

@coderabbitai

coderabbitaiBot commented Aug 25, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 7697ac98-d68b-4b0a-aa8c-fb19042ba35d

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

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

@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:XXL 1,000+ changed lines (additions + deletions). labels Aug 25, 2026
@github-actions

github-actionsBot commented Aug 25, 2026

Copy link
Copy Markdown
Contributor

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

ProviderMetricMain baselineThis PRImpactPR ceiling
CodexTotal thread wire13.3 KiB13.3 KiB−29 B (−0.2%)15.1 KiB
CodexThread snapshot wire6.9 KiB6.9 KiB−6 B (−0.1%)7.3 KiB
CodexLive turn WebSocket wire6.4 KiB6.4 KiB−23 B (−0.3%)7.8 KiB
CodexLive turn WebSocket decoded55.6 KiB55.6 KiB−44 B (−0.1%)66.4 KiB
CodexLive turn messages1110−1 (−9.1%)21
ClaudeTotal thread wire13.3 KiB13.3 KiB−56 B (−0.4%)15.1 KiB
ClaudeThread snapshot wire6.9 KiB6.9 KiB−1 B (−0.0%)7.3 KiB
ClaudeLive turn WebSocket wire6.4 KiB6.4 KiB−55 B (−0.8%)7.8 KiB
ClaudeLive turn WebSocket decoded56.4 KiB56.4 KiB−88 B (−0.2%)66.4 KiB
ClaudeLive turn messages119−2 (−18.2%)21

Baseline: 0e2905e · PR result: 129f2ad · 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: 109.4 KiB
  • Claude decoded thread snapshot: 110.1 KiB

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

@macroscopeappmacroscopeappBot 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.

Reviewed the new/changed Effect-adjacent code (packages/client-runtime/src/state/attachments.ts, apps/web/src/state/attachments.ts, and the web upload-queue call sites) against the service conventions. The new createAttachmentEnvironmentAtoms factory correctly mirrors createAssetEnvironmentAtoms (runtime passed in, no hidden globals, no ManagedRuntime/runPromise outside the existing atom-command boundary), and no service tags/layers were moved or redefined. One predicate convention issue below.

Posted via Macroscope — Effect Service Conventions

Comment threadpackages/client-runtime/src/state/attachments.ts Outdated
Comment threadapps/web/src/lib/attachmentUploadQueue.ts
Comment threaddocs/user/composer.md Outdated
Comment threadapps/web/src/composerDraftStore.ts
@macroscopeapp

macroscopeappBot commented Aug 25, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Not approved

Macroscope's review found this PR not approvable — This change introduces a substantial production workflow for uploading, persisting, transferring, deleting, and downloading user files alongside turns. Its broad runtime surface and server-side file lifecycle warrant human review despite extensive tests and backward-compatible persistence.

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

Comment threadapps/web/src/lib/attachmentUploadQueue.ts Outdated

@macroscopeappmacroscopeappBot 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.

Reviewed the web composer/timeline attachment UI. Two interaction findings on changed lines, both about the new needs-reattach / capacity paths giving the user no working path or feedback.

Posted via Macroscope — UI Consistency

Comment threadapps/web/src/components/chat/ChatComposer.tsx
Comment threadapps/web/src/composerDraftStore.ts
Comment threadapps/web/src/lib/attachmentUploadQueue.ts
Comment threadapps/web/src/composerDraftStore.ts Outdated
Comment threadapps/web/src/composerDraftStore.ts
Comment threadapps/web/src/composerDraftStore.ts Outdated
Comment threadapps/web/src/components/chat/ChatComposer.tsx

@macroscopeappmacroscopeappBot 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.

One finding: the new file-attachment download button in MessagesTimeline renders its filename center-aligned, unlike the visually identical anchor and inert rows next to it.

Posted via Macroscope — UI Consistency

Comment threadapps/web/src/components/chat/MessagesTimeline.tsx Outdated
@t3dotgg
t3dotggforce-pushed the t3code/file-attachments-web branch from c88f3df to 33d67f9CompareAugust 26, 2026 08:58
Comment threadapps/web/src/components/chat/ChatComposer.tsx
Comment threadapps/web/src/components/chat/composerAttachmentFiles.ts
Comment threadapps/web/src/components/chat/ChatComposer.tsx
@t3dotgg
t3dotggforce-pushed the t3code/file-attachments-web branch from 7abf833 to 1dd3cc0CompareAugust 26, 2026 09:29
Comment threadapps/web/src/components/ChatView.tsx
Comment threadapps/web/src/components/chat/ChatComposer.tsx Outdated
Comment threadapps/web/src/hooks/useHandleNewThread.ts

@macroscopeappmacroscopeappBot 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.

One finding on the new send-block wording in ChatComposer. The rest of the attachment UI (file rows, paperclip trigger, stash menu file badge, timeline file rows) reuses the existing primitives and row treatments consistently, and the earlier findings on the timeline download row alignment, the marker re-pick path, and the swallowed paste are resolved.

Posted via Macroscope — UI Consistency

Comment threadapps/web/src/components/chat/ChatComposer.tsx Outdated
Comment threadapps/web/src/components/chat/ChatComposer.tsx
Comment threadapps/web/src/components/ChatView.tsx Outdated

@macroscopeappmacroscopeappBot 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.

One finding: the needs-reattach file row label ignores the canReattachFiles guard that the send-block reason uses, so on a server without file-attachment support (or before the capability arrives) the row tells the user to attach again while no attach control is rendered.

Posted via Macroscope — UI Consistency

Comment threadapps/web/src/components/chat/ChatComposer.tsx
Comment threadapps/web/src/components/chat/ChatComposer.tsx
juliusmarminge added a commit that referenced this pull request Aug 29, 2026
PRs #8437 and #8236 crossed: one made stashShortcutLabel a required
ComposerStashMenu prop, the other added a test case without it, so
main fails web typecheck.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 29, 2026
Round-16 rebase onto main (5 commits, headlined by #8236 file
attachments in the client). Main's upload-aware send path — capability
probes, upload await/retry gating, uploaded-ref turn attachments with
dataUrl fallback, draft release on success — is woven into the v2
dispatch flow, timeline user rows render file attachments as download
links with the ChatView download handler, and the provider settings
editor cleanup keeps the branch's environment-field rows. The codex
feedback client flow stays unported, replay testkit configs gained
main's environmentThemesDir, and the rpc/settings/docs unions carry
both sides.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
github-actionsBot added a commit to omarcresp/t3code-flake that referenced this pull request Aug 29, 2026
## What's Changed
* feat(web): attach PDFs, ZIPs, and other files to a turn by @t3dotgg in pingdotgg/t3code#8236
* feat(web): keybinding settings as settings rows by @StiensWout in pingdotgg/t3code#8532
* feat: let an environment publish themes as a file by @ryanrhughes in pingdotgg/t3code#8569
* fix(web): clean up provider settings list and editor by @StiensWout in pingdotgg/t3code#8504
* fix(web): keep project picker popup inside the sidebar by @SunkenInTime in pingdotgg/t3code#8627
* fix(mobile): prevent header overflow and back-button artifacts by @juliusmarminge in pingdotgg/t3code#8624
## New Contributors
* @ryanrhughes made their first contribution in pingdotgg/t3code#8569
**Full Changelog**: pingdotgg/t3code@v0.0.37-nightly.20260829.1218...v0.0.37-nightly.20260829.1219
Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.37-nightly.20260829.1219
netpro2k added a commit to netpro2k/t3code that referenced this pull request Aug 29, 2026
Intent:
Expose the generic-file backend shipped in v0.0.36 through the web and desktop composer while following the official client implementation closely enough for its upstream PR to replace this patch cleanly.
Behavior:
- Accept images and generic files through the paperclip button, paste, and drag-and-drop; share the eight-attachment limit and use the server-advertised generic-file limit, currently 50 MB.
- Upload while the user composes, show progress/retry/reattach states, and render sent files as signed downloads with their original names.
- Preserve file drafts and stashes as server upload references or explicit needs-reattach markers instead of storing generic-file bytes in localStorage.
- Keep upload verification, cleanup, retry, environment moves, and unknown attachment rendering explicit.
- Show file names in the current mobile feed and include attachment names in transcript bootstrap context.
Design constraints:
- Backport official upstream PR pingdotgg#8236 at 129f2ad, rebased onto v0.0.36, rather than maintaining a parallel client upload architecture.
- Use packages/client-runtime for the shared upload lifecycle and clamp file sizes to the server capability and contract maximum.
- Require direct-upload support for generic files. Do not retain the fork inline-file protocol or serialize generic-file bytes into drafts and stashes.
- Upload local workspace drops like the official client; do not retain the competing desktop-only drop-to-mention behavior.
- Keep images on their established compression and compatibility path.
Integration:
- Shared client-runtime upload lifecycle and web environment atoms.
- Web composer, drafts, prompt stashes, upload queue, message timeline, signed asset downloads, sidebar counts, project cleanup, and user documentation.
- Minimal current mobile feed visibility and transcript bootstrap naming remain fork-only until the official follow-up covers them.
Verification:
- Official attachment-focused web and client-runtime tests pass (7 files, 196 tests).
- Targeted client-runtime, web, and mobile typechecks pass; the existing client-runtime Effect diagnostic remains advisory.
Rebase notes:
- Upstream PR pingdotgg#8236 should supersede the web/client-runtime implementation wholesale once merged.
- Upstream PR pingdotgg#8237 should supersede the temporary mobile filename row with signed mobile downloads and full mobile file picking/sharing.
- Recheck only the transcript-bootstrap filename summary after both PRs land.
- The v0.0.36 stashShortcutLabel test fixture is the only adaptation to the rebased official PR tree.
longtngo added a commit to longtngo/t3code that referenced this pull request Aug 29, 2026
Range f6f2be3..053affb, v0.0.36. 411 upstream files, 632 fork files,
81 touched by both, 19 conflicted.
Competing implementations resolved toward the fork's superset:
- Claude context usage (pingdotgg#8610). Upstream deleted `queryCurrentContextUsage` and
`normalizeClaudeContextUsageApiSnapshot` outright. `getContextUsage` is the ONLY
source of the compaction facts (`autocompactSource`, `autoCompactThreshold`,
`isAutoCompactEnabled`) the Vitals gauge's compaction note and marker render from,
and they travel on the wire contract, so the call is kept. Upstream's
`latestAssistantUsage` tracking and its post-compaction guard are adopted BELOW it
as the next-best fallback: `contextUsageSnapshot ?? latestAssistantSnapshot ?? ...`.
Upstream removed `getContextUsage` from `ClaudeQueryRuntime`, the
`SDKControlGetContextUsageResponse` import and the `Option` import outside every
conflict marker; all three restored.
- Provider settings editor (pingdotgg#8472). Upstream's `useEffect` + `lastPublishedEnvironmentRef`
re-seed is the superset of the fork's render-phase `seededRef` (8fe3190, one of four
silent-data-loss fixes). The merge had kept BOTH mechanisms; collapsed to upstream's,
with the fork's half-typed-row null guard on the publish path. `environmentKey` deleted
with the code it served.
- Sidebar project combobox (pingdotgg#5931). Upstream replaced the menu-based project filter,
whose `MenuRadioItem` carried the fork's project-actions button. Rebuilt on upstream's
`ComboboxItem` with the ellipsis button grafted back (invariant 6). The dead `Menu*`
import is gone.
- Composer attachments (pingdotgg#8236). Upstream's `addComposerAttachments` pipeline adopted; the
fork's drop split (image -> attach, other -> absolute path with upload fallback) kept
and repointed at the new handler.
- Mid-turn steer. Upstream's `steeringTurnState` branch rejected again (invariant 5); its
side of that hunk also opened an `if` whose brace lives below the hunk.
- Thread deletion drain (pingdotgg#8226). Upstream replaced `drain` with `drainThrough(sequence)`;
the fork's test retargeted. Its new drain test observed `ProviderService.stopSession`,
which this reactor never calls (it dispatches `thread.session.stop`), so it now counts
engine dispatches and provides the two services the fork's reactor needs.
Three defects the resolutions introduced, each caught by a check that is not the suite:
- `shouldShowBranchMismatchBanner` was resurrected into two import lists by resolving
them toward upstream. Fork commit cfdf255 replaced that function; the import had no
definition. Found by the RESURRECTED sweep.
- `scriptPath` ended up declared twice in CodexCollabRuntime.integration.test.ts: `both`
reintroduced upstream's fixture-dir copy that the fork deliberately moved to a temp dir.
Found by the RESURRECTED sweep.
- `setProjectScopeMenuOpen` survived in the fork's `handleProjectActions` after upstream
replaced that state with a reducer, outside every marker. Found by typecheck.
Upstream regressions of fork fixes, kept fixed:
- Raw NUL bytes returned to ChatComposer.tsx. A raw NUL renders as nothing in grep and
aborts BSD sed mid-file; the fork had converted all six to `\0` escapes and carries a
guard test for it. The guard failed, and the offending line reads as space-separated in
any normal diff. Converted back to escapes.
- `defaultTheme` / `defaultThemeSetAt` (pingdotgg#8569) are absent from `ServerSettingsPatch`; the
fork's patch-parity guard caught it. They are owned by `t3 theme set`, which rewrites
settings.json directly and which clients only read, so they are recorded as deliberately
unpatchable rather than mirrored.
- The fork's mobile held-messages strip used `dark:` variants that upstream's new Uniwind
theme rule (pingdotgg#7327) forbids; moved to the `text-foreground-muted` semantic token rather
than added to the rule's allowlist.
Invariants: all re-probed against the merged tree. 1 (49 migrations, ids unique and
monotonic, max 50, 34 burned), 2 (the fork-only @effect/platform-node patch survived the
Expo 57 rewrite of patchedDependencies, is pinned, resolved and applied on disk; effect
stays at beta.103 so no re-pin), 3, 4, 4b (4 `isSendBlocked=`), 5, 5b, 5c, 6, 7, 8, 9, 10,
11 all hold.
Sweeps: resurrected 3, dropped 21, fork-loss 45, both-kept 0. Every entry named: the 3
resurrected and the fork-loss in ProviderInstanceCard / ChatComposer / Sidebar are the
decisions above; the OpenCode fork-loss is 11 comment lines whose guard upstream extracted
into `deleteContextIfCurrent` (the rationale is restored on the helper); pnpm-lock churn is
the install. Test declarations 18,691 -> 19,081; one file lost one, upstream's own pingdotgg#8484.
Gate: pnpm run verify green, exit 0 read from the captured log line. 14 blocks,
10,744 passed, 20 skipped, 0 failures.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
netpro2k added a commit to netpro2k/t3code that referenced this pull request Aug 29, 2026
Intent:
Expose the generic-file backend shipped in v0.0.36 through the web and desktop composer while following the official client implementation closely enough for its upstream PR to replace this patch cleanly.
Behavior:
- Accept images and generic files through the paperclip button, paste, and drag-and-drop; share the eight-attachment limit and use the server-advertised generic-file limit, currently 50 MB.
- Upload while the user composes, show progress/retry/reattach states, and render sent files as signed downloads with their original names.
- Preserve file drafts and stashes as server upload references or explicit needs-reattach markers instead of storing generic-file bytes in localStorage.
- Keep upload verification, cleanup, retry, environment moves, and unknown attachment rendering explicit.
- Show file names in the current mobile feed and include attachment names in transcript bootstrap context.
Design constraints:
- Backport official upstream PR pingdotgg#8236 at 129f2ad, rebased onto v0.0.36, rather than maintaining a parallel client upload architecture.
- Use packages/client-runtime for the shared upload lifecycle and clamp file sizes to the server capability and contract maximum.
- Require direct-upload support for generic files. Do not retain the fork inline-file protocol or serialize generic-file bytes into drafts and stashes.
- Upload local workspace drops like the official client; do not retain the competing desktop-only drop-to-mention behavior.
- Keep images on their established compression and compatibility path.
Integration:
- Shared client-runtime upload lifecycle and web environment atoms.
- Web composer, drafts, prompt stashes, upload queue, message timeline, signed asset downloads, sidebar counts, project cleanup, and user documentation.
- Minimal current mobile feed visibility and transcript bootstrap naming remain fork-only until the official follow-up covers them.
Verification:
- Official attachment-focused web and client-runtime tests pass (7 files, 196 tests).
- Targeted client-runtime, web, and mobile typechecks pass; the existing client-runtime Effect diagnostic remains advisory.
Rebase notes:
- Upstream PR pingdotgg#8236 should supersede the web/client-runtime implementation wholesale once merged.
- Upstream PR pingdotgg#8237 should supersede the temporary mobile filename row with signed mobile downloads and full mobile file picking/sharing.
- Recheck only the transcript-bootstrap filename summary after both PRs land.
- The v0.0.36 stashShortcutLabel test fixture is the only adaptation to the rebased official PR tree.
juliusmarminge added a commit that referenced this pull request Aug 30, 2026
Round-16 rebase onto main (5 commits, headlined by #8236 file
attachments in the client). Main's upload-aware send path — capability
probes, upload await/retry gating, uploaded-ref turn attachments with
dataUrl fallback, draft release on success — is woven into the v2
dispatch flow, timeline user rows render file attachments as download
links with the ChatView download handler, and the provider settings
editor cleanup keeps the branch's environment-field rows. The codex
feedback client flow stays unported, replay testkit configs gained
main's environmentThemesDir, and the rpc/settings/docs unions carry
both sides.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
bcotrim pushed a commit to bcotrim/mognet that referenced this pull request Aug 30, 2026
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
(cherry picked from commit bcb855a)
bcotrim pushed a commit to bcotrim/mognet that referenced this pull request Aug 30, 2026
PRs pingdotgg#8437 and pingdotgg#8236 crossed: one made stashShortcutLabel a required
ComposerStashMenu prop, the other added a test case without it, so
main fails web typecheck.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
(cherry picked from commit d22709f)
juliusmarminge added a commit that referenced this pull request Aug 30, 2026
Round-16 rebase onto main (5 commits, headlined by #8236 file
attachments in the client). Main's upload-aware send path — capability
probes, upload await/retry gating, uploaded-ref turn attachments with
dataUrl fallback, draft release on success — is woven into the v2
dispatch flow, timeline user rows render file attachments as download
links with the ChatView download handler, and the provider settings
editor cleanup keeps the branch's environment-field rows. The codex
feedback client flow stays unported, replay testkit configs gained
main's environmentThemesDir, and the rpc/settings/docs unions carry
both sides.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
imsherrill pushed a commit to comprehensiveio/compadre that referenced this pull request Aug 31, 2026
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
(cherry picked from commit bcb855a)
imsherrill added a commit to comprehensiveio/compadre that referenced this pull request Aug 31, 2026
…) (#2)
(cherry picked from commit bcb855a)
Co-authored-by: Theo Browne <me@t3.gg>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
netpro2k added a commit to netpro2k/t3code that referenced this pull request Aug 31, 2026
Intent:
Keep transcript bootstrap context aware of generic file attachments now that upstream web and mobile clients support their full upload and rendering lifecycle.
Behavior:
- Count every message attachment in transcript bootstrap context, not only images.
- Include up to three attachment names plus an additional-count suffix.
- Preserve image/images wording when every attachment is an image; otherwise use file/files.
Design constraints:
- Rely entirely on upstream attachment upload, draft, stash, rendering, download, and mobile behavior.
- Keep this patch limited to the text supplied to transcript bootstrap.
Integration:
- Web transcript bootstrap summary only. No client upload, server, contract, mobile, or storage changes.
Verification:
- Upstream PRs pingdotgg#8236 and pingdotgg#8237 were audited as superseding the former attachment backport except for this summary behavior.
- Targeted web verification is rerun after the complete patch stack rebases.
Rebase notes:
- Drop this patch only when upstream transcript bootstrap includes generic attachment names rather than filtering to images.
github-actionsBot added a commit to omarcresp/t3code-flake that referenced this pull request Aug 31, 2026
## What's Changed
* Remove Messages Glass Lab experiment by @juliusmarminge in pingdotgg/t3code#8599
* Require human review for pull requests changing product defaults by @juliusmarminge in pingdotgg/t3code#8603
* fix(codex): avoid quadratic app-server input buffering by @juliusmarminge in pingdotgg/t3code#8605
* fix(mobile): stabilize iOS header item transitions by @juliusmarminge in pingdotgg/t3code#8607
* chore(mobile): upgrade to Expo SDK 57 by @juliusmarminge in pingdotgg/t3code#8609
* fix(mobile): harden native header toolbar items by @juliusmarminge in pingdotgg/t3code#8611
* fix(server): stop querying Claude context usage after turns by @t3dotgg in pingdotgg/t3code#8610
* chore: vouch ryanrhughes by @t3dotgg in pingdotgg/t3code#8613
* feat(web): attach PDFs, ZIPs, and other files to a turn by @t3dotgg in pingdotgg/t3code#8236
* feat(web): keybinding settings as settings rows by @StiensWout in pingdotgg/t3code#8532
* feat: let an environment publish themes as a file by @ryanrhughes in pingdotgg/t3code#8569
* fix(web): clean up provider settings list and editor by @StiensWout in pingdotgg/t3code#8504
* fix(web): keep project picker popup inside the sidebar by @SunkenInTime in pingdotgg/t3code#8627
* fix(mobile): prevent header overflow and back-button artifacts by @juliusmarminge in pingdotgg/t3code#8624
* fix(server): retry automatic thread title generation by @Bil0000 in pingdotgg/t3code#8087
* fix(client-runtime): refresh edited pull request comments by @Bil0000 in pingdotgg/t3code#8094
* fix(web): four composer spacing defects by @Bil0000 in pingdotgg/t3code#8090
* perf(desktop): skip duplicate browser updates by @Bil0000 in pingdotgg/t3code#8018
* fix(web): render nested markdown images correctly by @flamboh in pingdotgg/t3code#8501
* fix(web): unify activity logs and composer banners by @juliusmarminge in pingdotgg/t3code#8693
* fix(mobile): reduce dev-client reload and Metro startup cost by @juliusmarminge in pingdotgg/t3code#8694
* revert(web): restore previous composer banners by @t3dotgg in pingdotgg/t3code#8733
* test(web): remove tests for unreachable helpers by @t3-code[bot] in pingdotgg/t3code#8738
* feat(mobile): update tool summaries and chat transitions by @juliusmarminge in pingdotgg/t3code#8793
* feat(web): play video attachments in chat by @Bil0000 in pingdotgg/t3code#8688
* fix(web,mobile): snooze menu no longer offers the same wake time twice by @vitalyiegorov in pingdotgg/t3code#8741
* fix(grok): allow model changes in existing threads by @ahmed-besic in pingdotgg/t3code#8392
* feat(mobile): pick, share, and receive files in threads by @t3dotgg in pingdotgg/t3code#8237
* fix(web): reduce title bar scroll fade height by @maria-rcks in pingdotgg/t3code#8799
* fix(windows): strip quotes from repaired PATH by @UtkarshUsername in pingdotgg/t3code#8746
* fix(web): open agent images in expanded preview by @maria-rcks in pingdotgg/t3code#8807
* fix(git): follow repository instructions in generated source control text by @maria-rcks in pingdotgg/t3code#8804
* fix(server): stop overpricing cached Claude tokens by @SunkenInTime in pingdotgg/t3code#8806
* fix(web): keep image preview above sidebar control by @maria-rcks in pingdotgg/t3code#8811
* fix(web): keep right panel synced with agent edits by @maria-rcks in pingdotgg/t3code#8803
* fix(web,mobile): render Codex citations and artifact templates by @Yash-Singh1 in pingdotgg/t3code#8584
* chore: add Windows setup script to t3.json by @UtkarshUsername in pingdotgg/t3code#8814
* fix(web): fold interim turn responses by @maria-rcks in pingdotgg/t3code#8828
* fix(web): use circle alert for failed tool calls by @maria-rcks in pingdotgg/t3code#8840
* feat(mobile): add offline iPhone voice input by @t3dotgg in pingdotgg/t3code#8614
* fix(web): prevent pull request metadata overlap by @MatthewFeroz in pingdotgg/t3code#8790
## New Contributors
* @ryanrhughes made their first contribution in pingdotgg/t3code#8569
* @ahmed-besic made their first contribution in pingdotgg/t3code#8392
* @MatthewFeroz made their first contribution in pingdotgg/t3code#8790
**Full Changelog**: pingdotgg/t3code@v0.0.36...v0.0.37
Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.37
amitbet pushed a commit to amitbet/a2code that referenced this pull request Sep 1, 2026
Upstream shipped its own arbitrary file attachments (pingdotgg#8235/pingdotgg#8236/pingdotgg#8237), a
strict superset of the fork's, so that divergence is retired rather than
re-applied. Upstream also reverted its turn-plan chips, restructured provider
settings into list+editor, made the project picker a searchable combobox, and
replaced the mobile CSS-variable theme hook with useUniwindTheme.
Fork features preserved: thread forking, queued-prompt steering, in-chat find,
answered user-input rows, machine-scoped environments, provider health-check
cache, provider "Default traits", live quota meter, thread export/pinning,
payload hot-update channel, and the build-only CI surface.
See FORK_NOTES.md for the per-file migration notes.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Sep 1, 2026
Round-16 rebase onto main (5 commits, headlined by #8236 file
attachments in the client). Main's upload-aware send path — capability
probes, upload await/retry gating, uploaded-ref turn attachments with
dataUrl fallback, draft release on success — is woven into the v2
dispatch flow, timeline user rows render file attachments as download
links with the ChatView download handler, and the provider settings
editor cleanup keeps the branch's environment-field rows. The codex
feedback client flow stays unported, replay testkit configs gained
main's environmentThemesDir, and the rpc/settings/docs unions carry
both sides.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Coriou added a commit to Coriou/txcode that referenced this pull request Sep 1, 2026
Upstream tip (bcb855a, pingdotgg#8236) rewrote the third render's entries and
dropped the required stashShortcutLabel prop, leaving upstream's own web
typecheck red. Completed the fixture; candidate for an upstream report.
juliusmarminge added a commit that referenced this pull request Sep 2, 2026
Round-16 rebase onto main (5 commits, headlined by #8236 file
attachments in the client). Main's upload-aware send path — capability
probes, upload await/retry gating, uploaded-ref turn attachments with
dataUrl fallback, draft release on success — is woven into the v2
dispatch flow, timeline user rows render file attachments as download
links with the ChatView download handler, and the provider settings
editor cleanup keeps the branch's environment-field rows. The codex
feedback client flow stays unported, replay testkit configs gained
main's environmentThemesDir, and the rpc/settings/docs unions carry
both sides.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
brentkelly added a commit to brentkelly/t3code-orchestrator that referenced this pull request Sep 2, 2026
* feat(analytics): threads and turns now know which client started them (pingdotgg#7774)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(web): stop marking mixed tool runs as failed (pingdotgg#7893)
* fix(web): command-click spaced folder links (pingdotgg#6439)
Co-authored-by: shivam <91240327+shivamhwp@users.noreply.github.com>
* fix(chat): stop pushing follow-up messages to the top (pingdotgg#7897)
* test(desktop): remove redundant release note assertion (pingdotgg#7873)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
* fix(web): handle wide ordered-list marker edge cases (pingdotgg#7856)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(ssh): restore user PATH for remote servers (pingdotgg#7213)
* fix(desktop): keep tailscale spawn defects from breaking advertised endpoints (pingdotgg#7116)
* fix(web): keep Codex service tier labels readable (pingdotgg#4503)
* fix: render workspace images in chat markdown (pingdotgg#6433)
* fix(clients): keep opening responses visible after turns settle (pingdotgg#7723)
* feat(web): add appearance contrast control (pingdotgg#7906)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: maria <254055478+maria-rcks@users.noreply.github.com>
* fix(server): stop completed Codex threads from staying stuck on working (pingdotgg#7937)
* fix(mobile): preserve markdown image dimensions (pingdotgg#7940)
* fix(web): remove duplicate provider update progress (pingdotgg#7761)
* fix(server): fall back to the remote default branch instead of assuming main (pingdotgg#7078)
* fix(web): give sidebar project menu rows the same side padding as other menus (pingdotgg#7913)
* fix(clients): reconnect after credentials fail during remote server updates (pingdotgg#7953)
* feat(codex): submit thread feedback to OpenAI (pingdotgg#7949)
* fix(server): stop kills lingering Claude work (pingdotgg#5891)
* fix(ci): let Macroscope approve pull requests again (pingdotgg#7970)
* fix(clients): move settled pinned threads into the settled section (pingdotgg#7969)
* perf(ci): speed up release builds and Windows packaging (pingdotgg#7975)
* fix(web): stop tool calls from leaving a blank page in threads (pingdotgg#7971)
* fix(web): stop recovered tool failures from marking work logs red (pingdotgg#7999)
* fix(mobile): isolate markdown image requests (pingdotgg#7942)
* feat(web): redesign skills in `$` menu and in `/` menu (pingdotgg#8009)
* fix(web): restore right panel toggle clicks after closing on desktop (pingdotgg#8016)
* fix(web): keep server update banners flush with the composer (pingdotgg#8000)
* perf(web): reuse work log rows during streaming (pingdotgg#8006)
* fix(web): keep provider badge legible in dark themes (pingdotgg#7968)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: maria <254055478+maria-rcks@users.noreply.github.com>
* fix(web): treat configured urls with uppercase schemes as secure (pingdotgg#8005)
Co-authored-by: Simone <185146821+Lucenx9@users.noreply.github.com>
* fix(desktop): keep release notes visible while downloading (pingdotgg#6412)
* fix(web): show only providers with usage in usage views (pingdotgg#7563)
* fix(web): prevent expanded tool calls from hiding thread content (pingdotgg#8052)
* test(server): remove no-op live activity tests (pingdotgg#8056)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
* fix(web): clarify terminal sidebar grouping (pingdotgg#7967)
* fix(codex): show app access approval prompts (pingdotgg#8058)
* feat(web): upload image attachments before sending (pingdotgg#8048)
* fix(server): bound OpenCode skill discovery output (pingdotgg#7675)
Co-authored-by: Simone <185146821+Lucenx9@users.noreply.github.com>
* fix(mobile): persist thread shelf collapse state (pingdotgg#5152)
* fix(mobile): restore Android tablet thread controls, clean up header (pingdotgg#5385)
* fix(mobile): land the first thread open above the composer on Android (pingdotgg#5585)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: codex <codex@users.noreply.github.com>
Co-authored-by: Julius Marminge <julius0216@outlook.com>
* fix(server): check out submodules in a new worktree (pingdotgg#7674)
Co-authored-by: Rodrigo Brechard <rodrigo@clubtidy.fr>
* fix(server): preserve merged PR badges after branch deletion (pingdotgg#6216)
* fix(server): return fresh live pull request reads (pingdotgg#6472)
* fix(web): compare client and server versions as semver, not strings (pingdotgg#7579)
* fix(web): stop follow-ups from leaving giant blank space (pingdotgg#8068)
* fix(marketing): stop automatic Vercel deployments on pull requests (pingdotgg#8070)
* chore: vouch repeat contributors (pingdotgg#8071)
* fix(server): keep the authoritative subagent model when snapshots race task_started (pingdotgg#7583)
* fix(server): honor auto-accept edits for the OpenCode provider (pingdotgg#7100)
* fix(server): run the CLI on Node versions without import.meta.main (pingdotgg#7141)
* fix(server): recover from provider interrupt failures (pingdotgg#7412)
* fix(server): recreate a thread's worktree before starting a turn (pingdotgg#7839)
* fix(server): thread delete no longer fails on already-removed worktrees (pingdotgg#8076)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(web): stop update notices showing through the composer (pingdotgg#8083)
* fix(web): detect outdated nightly servers (pingdotgg#8124)
* fix(web): align usage page skeleton layout (pingdotgg#8111)
* fix(web): make terminal links appear clickable only when clickable (pingdotgg#7488)
* fix(web): make Windows file links clickable in chat (pingdotgg#8081)
* fix(web): sort usage models by token count (pingdotgg#8108)
* fix: open agent file links in the file viewer (pingdotgg#8098)
* fix(server): stop routine events from rescanning thread history (pingdotgg#8150)
* fix(deps): stop pnpm installs from changing the lockfile (pingdotgg#8163)
* feat(web): settle and restore threads with a keyboard shortcut (pingdotgg#8089)
* perf(desktop): cut macOS signing calls by 81% (pingdotgg#8093)
* feat: link pull requests to threads (pingdotgg#8160)
* feat(web): safely attach HEIC photos as JPEG images (pingdotgg#8161)
Co-authored-by: mweinbach <maxweinbach5@gmail.com>
* feat(mobile): track device models and OS versions (pingdotgg#8169)
* fix(grok): bound cumulative tool output updates (pingdotgg#7279)
* fix(web): delay thread shortcut hints by 200 ms (pingdotgg#8172)
* fix(server): stop probing Cursor until enabled (pingdotgg#8175)
* docs(release): verify remote updates with database migrations (pingdotgg#8177)
* fix(server): keep provider CLIs available in the macOS service (pingdotgg#8173)
* feat(claude): compact old threads before they burn through usage (pingdotgg#8144)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(client-runtime): retry queries after connection interruption (pingdotgg#8117)
* fix(server): keep previously used providers working after upgrades (pingdotgg#8176)
* feat(desktop): build macOS previews from a PR label (pingdotgg#8182)
* fix(web): thread jump hints no longer stick after a dictation paste (pingdotgg#8189)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(web): keep grouped project renames (pingdotgg#7831)
* feat(web): reveal chat file chips in the system file manager (pingdotgg#7140)
Co-authored-by: Dara Adedeji <daraaded@amazon.com>
Co-authored-by: shivam <91240327+shivamhwp@users.noreply.github.com>
* fix(server): push no longer writes a feature branch's commits to its base branch (pingdotgg#8228)
* chore(deps): bump @clerk/electron to 0.0.37 (pingdotgg#8240)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* feat(server): fetch legacy model classification from a hosted manifest (pingdotgg#8227)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* chore(release): prepare v0.0.34
* fix(desktop): let Clerk UI receive stable auth fixes (pingdotgg#8248)
* fix(app): un-settled threads return to the top of the list (pingdotgg#8231)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* perf(ci): cut about a minute from every release (pingdotgg#8250)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* feat(ci): download macOS preview DMGs without signing in (pingdotgg#8243)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(codex): accept Codex 0.150 multi-agent events (pingdotgg#8346)
* chore(release): prepare v0.0.35
* fix(grok): improve skills, plans, usage, and turn reliability (pingdotgg#8358)
Co-authored-by: Dara Adedeji <daraadedeji07@gmail.com>
Co-authored-by: Ahmed Besic <ahmed-besic@users.noreply.github.com>
Co-authored-by: Michael Brown <michaeltbrown.mtb@gmail.com>
Co-authored-by: Lars Nieuwenhuis <35393046+lnieuwenhuis@users.noreply.github.com>
Co-authored-by: Guilherme Barros <gbarros1095@gmail.com>
Co-authored-by: PC <pc@localhost>
Co-authored-by: 1xpixi <157762409+1xpixi@users.noreply.github.com>
* fix(server): recover stale Codex approval callbacks (pingdotgg#5195)
* test(server): remove duplicate missing worktree test (pingdotgg#8252)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
* fix(server): replay all un-applied events during projection bootstrap (pingdotgg#7538)
Co-authored-by: Theo Browne <me@t3.gg>
* test: remove low-signal test files (pingdotgg#8397)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
* test: prune trivial error and layout tests (pingdotgg#8400)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
* Fix Android adaptive launcher icon (pingdotgg#4332)
Co-authored-by: Yash Singh <saiansh2525@gmail.com>
* feat(web): split provider settings into list and editor (pingdotgg#8380)
* fix(codex): accept Codex 0.150 account plans (pingdotgg#8447)
* fix(tooling): allow ignored-only staged changes (pingdotgg#8468)
* fix(mobile): keep iOS home header stable (pingdotgg#8467)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(web): stop showing red x summaries for ordinary tool failures (pingdotgg#8395)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(mobile): refine Git action toast glass styling (pingdotgg#8399)
* fix(desktop): allow preview automation in agent-created threads (pingdotgg#8483)
* test(web): remove redundant cache key test (pingdotgg#8484)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
* fix(release): move nightly schedule to minute 38
Recent scheduled nightlies have been delayed or skipped.
Move the nightly cron from minute 7 to minute 38. Keep the existing three-hour interval. This tests a different point in each three-hour window without claiming it will fix GitHub schedule delivery.
Authored by GPT-5.6 Sol with the Codex harness.
* fix(web): stabilize the provider settings editor (pingdotgg#8472)
* fix(web): open GitHub pull requests in browser when loading fails (pingdotgg#8507)
* fix(codex): show sub-agent models (pingdotgg#8502)
* feat(analytics): report connected client platforms (pingdotgg#8481)
* feat(server): accept PDF, ZIP, and other file uploads up to 50MB (pingdotgg#8235)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* feat(web): toggle thread pin from the keyboard
Add a mod+shift+p shortcut that pins or unpins the active thread. Ignore the shortcut during terminal focus and when the server does not support thread pinning.
* fix(web): add back button to project settings (pingdotgg#8168)
* refactor(mobile): compile semantic themes for Uniwind (pingdotgg#7327)
Co-authored-by: codex <codex@users.noreply.github.com>
* fix(desktop): Cache Runtime locally on WSL Filesystem, dramatically improving launch times (pingdotgg#5769)
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: Utkarsh Patil <73941998+UtkarshUsername@users.noreply.github.com>
* fix(mobile): show OpenCode model sources in picker (pingdotgg#8573)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(clients): honor project default models in new threads (pingdotgg#6011)
Co-authored-by: Shivam Sharma <91240327+shivamhwp@users.noreply.github.com>
* fix(mobile): show file actions on Android (pingdotgg#8215)
Co-authored-by: Shivam Sharma <91240327+shivamhwp@users.noreply.github.com>
* fix(connect): explain DPoP connection failures (pingdotgg#8351)
Co-authored-by: Julius Marminge <julius0216@outlook.com>
* feat(web): make the sidebar project filter a searchable combobox (pingdotgg#5931)
* fix(server): a draft can retry its first send after a failed bootstrap (pingdotgg#8226)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(desktop): stop hidden previews draining battery (pingdotgg#8567)
* fix(desktop): oauth popups open from the browser preview (pingdotgg#8435)
Co-authored-by: Julius Marminge <julius0216@outlook.com>
* fix(web): keep long task drawers usable on small screens (pingdotgg#8313)
* fix(opencode): handle child approvals, stops, and model catalogs (pingdotgg#8480)
* fix: make thread auto-settling opt-in (pingdotgg#8321)
* fix(web): stop session activity timing test from blocking releases (pingdotgg#8585)
* fix(mobile): show composer menus when starting a task (pingdotgg#8587)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(web): show the configured stash shortcut (pingdotgg#8437)
Co-authored-by: Shivam Sharma <91240327+shivamhwp@users.noreply.github.com>
* feat(web): add toggleable confirmation before unpinning a thread (pingdotgg#7313)
Co-authored-by: Shivam Sharma <91240327+shivamhwp@users.noreply.github.com>
* fix: restore automatic thread settling defaults (pingdotgg#8596)
* fix(mobile): restore composer glass and rounded shadows (pingdotgg#8597)
Co-authored-by: Julius Marminge <julius@mac.lan>
* Remove Messages Glass Lab experiment (pingdotgg#8599)
* chore(release): prepare v0.0.36
* Require human review for pull requests changing product defaults (pingdotgg#8603)
* fix(codex): avoid quadratic app-server input buffering (pingdotgg#8605)
* fix(mobile): stabilize iOS header item transitions (pingdotgg#8607)
Co-authored-by: Julius Marminge <julius@mac.lan>
* chore(mobile): upgrade to Expo SDK 57 (pingdotgg#8609)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(mobile): harden native header toolbar items (pingdotgg#8611)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(server): stop querying Claude context usage after turns (pingdotgg#8610)
* chore: vouch ryanrhughes (pingdotgg#8613)
* feat(web): attach PDFs, ZIPs, and other files to a turn (pingdotgg#8236)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(web): pass stashShortcutLabel in the mixed-attachments stash test
PRs pingdotgg#8437 and pingdotgg#8236 crossed: one made stashShortcutLabel a required
ComposerStashMenu prop, the other added a test case without it, so
main fails web typecheck.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* feat(web): keybinding settings as settings rows (pingdotgg#8532)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Julius Marminge <julius0216@outlook.com>
* feat: let an environment publish themes as a file (pingdotgg#8569)
Co-authored-by: Theo Browne <me@t3.gg>
* fix(web): clean up provider settings list and editor (pingdotgg#8504)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Julius Marminge <julius0216@outlook.com>
* fix(web): keep project picker popup inside the sidebar (pingdotgg#8627)
* fix(mobile): prevent header overflow and back-button artifacts (pingdotgg#8624)
* fix(server): retry automatic thread title generation (pingdotgg#8087)
* fix(client-runtime): refresh edited pull request comments (pingdotgg#8094)
* fix(web): four composer spacing defects (pingdotgg#8090)
* perf(desktop): skip duplicate browser updates (pingdotgg#8018)
Co-authored-by: Julius Marminge <julius0216@outlook.com>
* fix(web): render nested markdown images correctly (pingdotgg#8501)
* fix(web): unify activity logs and composer banners (pingdotgg#8693)
* fix(mobile): reduce dev-client reload and Metro startup cost (pingdotgg#8694)
Co-authored-by: Julius Marminge <julius@mac.lan>
* revert(web): restore previous composer banners (pingdotgg#8733)
* test(web): remove tests for unreachable helpers (pingdotgg#8738)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
* feat(mobile): update tool summaries and chat transitions (pingdotgg#8793)
* feat(web): play video attachments in chat (pingdotgg#8688)
* fix(web,mobile): snooze menu no longer offers the same wake time twice (pingdotgg#8741)
* fix(grok): allow model changes in existing threads (pingdotgg#8392)
Co-authored-by: Ahmed Besic <ahmed-besic@users.noreply.github.com>
* feat(mobile): pick, share, and receive files in threads (pingdotgg#8237)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Julius Marminge <julius0216@outlook.com>
* fix(web): reduce title bar scroll fade height (pingdotgg#8799)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(windows): strip quotes from repaired PATH (pingdotgg#8746)
* fix(web): open agent images in expanded preview (pingdotgg#8807)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(git): follow repository instructions in generated source control text (pingdotgg#8804)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(server): stop overpricing cached Claude tokens (pingdotgg#8806)
* fix(web): keep image preview above sidebar control (pingdotgg#8811)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(web): keep right panel synced with agent edits (pingdotgg#8803)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(web,mobile): render Codex citations and artifact templates (pingdotgg#8584)
* chore: add Windows setup script to t3.json (pingdotgg#8814)
* fix(web): fold interim turn responses (pingdotgg#8828)
* fix(web): use circle alert for failed tool calls (pingdotgg#8840)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* feat(mobile): add offline iPhone voice input (pingdotgg#8614)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(web): prevent pull request metadata overlap (pingdotgg#8790)
* chore(release): prepare v0.0.37
* Add mobile composer attachment menu with video support (pingdotgg#8843)
* fix(mobile): map native menu icon colors explicitly
* fix(web): restore unified activity logs and composer banners (pingdotgg#8734)
Co-authored-by: Julius Marminge <julius0216@outlook.com>
Co-authored-by: Julius Marminge <jmarminge@gmail.com>
* fix(web): address composer banner review follow-ups (pingdotgg#8850)
* fix(web): widen sync banners and simplify the working timer (pingdotgg#8855)
* fix(preview): improve browser recording quality (pingdotgg#8839)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(web): mark pull request links as external (pingdotgg#8856)
* fix(mobile): replace Callstack glass with Expo glass (pingdotgg#8862)
* fix(server): skip IDE detection in Claude probes (pingdotgg#8634)
* chore(macroscope): review diagnostic overrides (pingdotgg#8917)
Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
* fix(contracts): accept CLI event origins (pingdotgg#8905)
* fix(web): hide invalid slash skill completions (pingdotgg#8904)
* fix(mobile): defer draft navigation until submission completes (pingdotgg#8914)
* chore: disable CodeRabbit review status (pingdotgg#8933)
* Delete app.json (pingdotgg#8934)
* fix(web): show scrollbar for wide markdown tables (pingdotgg#8868)
* fix(mobile): shimmer active tool rows (pingdotgg#8932)
Co-authored-by: Julius Marminge <julius@mac.lan>
* chore(deps): bump Electron to 43.4.1 (pingdotgg#8626)
* fix(chat): smooth worktree setup status (pingdotgg#8922)
* feat(mobile): add video playback with native iOS controls (pingdotgg#8919)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(web): prevent chat metadata overlap (pingdotgg#8851)
* fix(server): preserve usage cache outside walked roots (pingdotgg#8540)
Co-authored-by: Simone <185146821+Lucenx9@users.noreply.github.com>
* feat(mobile): add native image and PDF previews (pingdotgg#8959)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(server): allow long thread IDs in HTTP routes (pingdotgg#8898)
* fix(shared): preserve Windows shell PATH priority (pingdotgg#8748)
* fix(web): make WSL settings searchable (pingdotgg#8881)
* feat(web): add expand/collapse all control to the files surface (pingdotgg#8889)
* Add auto_review configuration to coderabbit.yaml
* style: format CodeRabbit configuration
* feat(mobile): upload attachments while composing (pingdotgg#8978)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(chat): keep agent activity visible between actions (pingdotgg#8984)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(server): isolate remote web session cookies (pingdotgg#8085)
Co-authored-by: Julius Marminge <julius0216@outlook.com>
* feat(pull-requests): link GitHub references in markdown (pingdotgg#8812)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* perf(server): reduce frequency of full tool call output being loaded into memory from db (pingdotgg#8988)
* feat(web): add pull request list filters (pingdotgg#8809)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* feat(web): search individual settings by detail (pingdotgg#8831)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* feat(client): render viewed images in work logs (pingdotgg#8936)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(client): use package import for markdown image helpers (pingdotgg#9010)
* test: remove static presentation snapshots (pingdotgg#9008)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
* perf(server): bound snapshot activity payload memory (pingdotgg#9000)
* perf(server): cut idle CPU use and stop provider event leaks (pingdotgg#8187)
* perf(server): scan only appended transcript bytes for usage summaries (pingdotgg#9024)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Theo Browne <me@t3.gg>
* perf(server): cut chatty tool-update frames by 90% (pingdotgg#8368)
* fix(server): settle threads server-side (pingdotgg#8600)
* fix(clients): dedupe skills in composer menus (pingdotgg#8043)
* fix(server): stop OpenCode child sessions (pingdotgg#9005)
* perf(web): defer pull request line stats until visible (pingdotgg#6471)
Co-authored-by: Theo Browne <me@t3.gg>
* perf(server): skip full-message reads while streaming (pingdotgg#9032)
* perf(client-runtime): halve server config bootstrap traffic (pingdotgg#8367)
Reuse one server config subscription for session bootstrap and live updates.
Preserve environment theme opt-in, replay, deletion, slow subscriber recovery, and config stream failure handling.
Co-authored-by: Adamulek123 <adam.bogucki2018@gmail.com>
* fix(web): align un-settle banner action (pingdotgg#9033)
* fix(web): block type-to-focus behind open dialogs (pingdotgg#8139)
Co-authored-by: Simone <185146821+Lucenx9@users.noreply.github.com>
* feat(shortcuts): copy active thread reference (pingdotgg#8994)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(mobile): keep thread scroll bounds current after animations (pingdotgg#9013)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(server): cache project favicon resolution (pingdotgg#9080)
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
* feat(claude): add Claude Fable 5.1 model (pingdotgg#9078)
* fix(preview): restore recording and macOS rendering after Electron 43 (pingdotgg#9001)
Co-authored-by: Guillermo Casanova <guillermo.casanova.b@gmail.com>
* feat(desktop): add configurable quit shortcut confirmation (pingdotgg#9076)
* feat(web): open project settings from thread menus (pingdotgg#8925)
* fix(chat): reuse one row for live activity (pingdotgg#9062)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* feat(models): discover Claude models from remote manifest (pingdotgg#9084)
* Revert "fix(chat): reuse one row for live activity" (pingdotgg#9096)
* fix(web): sync sidebar PR state from open panel (pingdotgg#9092)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: maria <254055478+maria-rcks@users.noreply.github.com>
* fix(web): changing projects no longer creates a draft (pingdotgg#9097)
* fix(web): keep theme placeholder text dimmer than entered text (pingdotgg#9104)
* fix(web): keep the selected environment when changing projects (pingdotgg#9102)
* docs(plans): t3o-31 upstream sync to v0.0.38
* fix(board): clear the ten pre-existing typecheck errors before the upstream sync (t3o-31 P0)
Two test fakes failed with a bare Error in the Effect failure channel, a
closure-assigned let narrowed to never, and a single-override pill read
overriddenRows[0] under noUncheckedIndexedAccess. None changed behaviour;
they were masked because the recursive typecheck never reached apps/server.
* fix(sync): the three type errors and two test failures the v0.0.38 merge caused
- BoardModelRow reads planModeEnabled from client settings, as the composer does.
- findBranchPullRequest resolves the default branch for upstream's widened PR
cache key instead of passing null.
- The orphaned-session integration test mocks the supervisor reactor that the
startup seam yields (new inventory row).
- The projection resume test seeds board projector watermarks into
boards.projection_state, where t3o-26 reads them, and asserts over the union.
- searchSettings("work") now also matches upstream's worktree/network items.
* refactor(board): native title attributes become BoardHint tooltips
Upstream's new no-native-title-tooltip rule flags every intrinsic-element
title= in the board (61 sites). BoardHint wraps the styled Tooltip primitive
and renders its child as the trigger, so layout is unchanged; a nullish label
renders the child alone.
* docs(seams): record the v0.0.38 sync (t3o-31)
Merge-log row, the decisions taken (plans stay tracked, upstream's settlement
reactor accepted after audit, projector-enumeration policy, launcher protocol
note), an unmarked-edits debt table for the next sync, a marker census, the
three new upstream workflows to disable, and the runbook's per-package
verification notes.
* review(t3o-31): announce the board's status dots, and order the merge log
Round-1 nitpicks: a bare span's aria-label is not announced, so the working,
running and awaiting dots now carry role="img"; the v0.0.38 merge-log row
moves below the two 2026-08-09 rows so the table reads chronologically.
---------
Co-authored-by: Theo Browne <me@t3.gg>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Dara Adedeji <76637177+SunkenInTime@users.noreply.github.com>
Co-authored-by: shivam <91240327+shivamhwp@users.noreply.github.com>
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: abcdmku <63693423+abcdmku@users.noreply.github.com>
Co-authored-by: Guilherme Barros <gbarros1095@gmail.com>
Co-authored-by: Rishet11 <154429365+Rishet11@users.noreply.github.com>
Co-authored-by: Alex <me@pixp.cc>
Co-authored-by: maria <254055478+maria-rcks@users.noreply.github.com>
Co-authored-by: Naveed Iqbal <naveediqbal949@gmail.com>
Co-authored-by: Ishaan Kothari <ishaanko.mail@gmail.com>
Co-authored-by: Exotic <118054752+extoci@users.noreply.github.com>
Co-authored-by: Utkarsh Patil <73941998+UtkarshUsername@users.noreply.github.com>
Co-authored-by: Bilal Bakr <62337003+Bil0000@users.noreply.github.com>
Co-authored-by: Rakshith Bhat <88523594+RakshithBhat03@users.noreply.github.com>
Co-authored-by: Simone <lucenz@proton.me>
Co-authored-by: Simone <185146821+Lucenx9@users.noreply.github.com>
Co-authored-by: Tristan Knight <admin@snappeh.com>
Co-authored-by: Wout Stiens <71498452+StiensWout@users.noreply.github.com>
Co-authored-by: Pavlo Trinko <paul.trinko95@gmail.com>
Co-authored-by: codex <codex@users.noreply.github.com>
Co-authored-by: Julius Marminge <julius0216@outlook.com>
Co-authored-by: Rodrigo Brechard <rodrigobrechard@gmail.com>
Co-authored-by: Rodrigo Brechard <rodrigo@clubtidy.fr>
Co-authored-by: Adamulek123 <adam.bogucki2018@gmail.com>
Co-authored-by: spiky02plateau <155588579+spiky02plateau@users.noreply.github.com>
Co-authored-by: Carlos Jimenez <cjimenez@r21digital.com>
Co-authored-by: Mark Griffin <mrmg@deflexion.net>
Co-authored-by: MacKinley Smith <smithmackinley@gmail.com>
Co-authored-by: oliver <97427849+flamboh@users.noreply.github.com>
Co-authored-by: mweinbach <maxweinbach5@gmail.com>
Co-authored-by: Lars Nieuwenhuis <35393046+lnieuwenhuis@users.noreply.github.com>
Co-authored-by: Mohtasham Murshid <154406804+MohtashamMurshid@users.noreply.github.com>
Co-authored-by: Dara Adedeji <daraaded@amazon.com>
Co-authored-by: Dara Adedeji <daraadedeji07@gmail.com>
Co-authored-by: Ahmed Besic <ahmed-besic@users.noreply.github.com>
Co-authored-by: Michael Brown <michaeltbrown.mtb@gmail.com>
Co-authored-by: PC <pc@localhost>
Co-authored-by: 1xpixi <157762409+1xpixi@users.noreply.github.com>
Co-authored-by: Josh <gitlucky@pipelab.org>
Co-authored-by: Tradi3 <56069280+krutftw@users.noreply.github.com>
Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
Co-authored-by: Ivan Malison <IvanMalison@gmail.com>
Co-authored-by: Yash Singh <saiansh2525@gmail.com>
Co-authored-by: Gianmarco <gianmarcosimone89@gmail.com>
Co-authored-by: Julius Marminge <julius@mac.lan>
Co-authored-by: Illia Panasenko <hello@ipanasenko.me>
Co-authored-by: Matheson Steplock <ikifar2012@users.noreply.github.com>
Co-authored-by: Anirudh Coontoor <anirudh@gosupernova.live>
Co-authored-by: Nick Anisimov <n.anisimov.23@gmail.com>
Co-authored-by: Muhammad Waleed <114993336+walid-baharwal@users.noreply.github.com>
Co-authored-by: Ryan Hughes <ryan@heyoodle.com>
Co-authored-by: Vitaly Iegorov <vitalyiegorov@gmail.com>
Co-authored-by: Ahmed Besic <ahmed.besic2000@gmail.com>
Co-authored-by: maria <maria@kuuro.net>
Co-authored-by: Matthew Feroz <136640686+MatthewFeroz@users.noreply.github.com>
Co-authored-by: Julius Marminge <jmarminge@gmail.com>
Co-authored-by: Aditya Garud <153842990+yashranaway@users.noreply.github.com>
Co-authored-by: Yukun Shan <92423096+nateEc@users.noreply.github.com>
Co-authored-by: Will Sheldon <will@autimo.com>
Co-authored-by: mic <85814106+q1@users.noreply.github.com>
Co-authored-by: Guillermo Casanova <guillermo.casanova.b@gmail.com>
juliusmarminge added a commit that referenced this pull request Sep 2, 2026
Round-16 rebase onto main (5 commits, headlined by #8236 file
attachments in the client). Main's upload-aware send path — capability
probes, upload await/retry gating, uploaded-ref turn attachments with
dataUrl fallback, draft release on success — is woven into the v2
dispatch flow, timeline user rows render file attachments as download
links with the ChatView download handler, and the provider settings
editor cleanup keeps the branch's environment-field rows. The codex
feedback client flow stays unported, replay testkit configs gained
main's environmentThemesDir, and the rpc/settings/docs unions carry
both sides.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XXL1,000+ changed lines (additions + deletions).vouch:trustedPR 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

@t3dotgg
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat(web): attach PDFs, ZIPs, and other files to a turn - #8236

Merged
t3dotgg merged 29 commits into
mainfrom
t3code/file-attachments-web
Aug 29, 2026
Merged

feat(web): attach PDFs, ZIPs, and other files to a turn#8236
t3dotgg merged 29 commits into
mainfrom
t3code/file-attachments-web

Conversation

@t3dotgg

@t3dotggt3dotgg commented Aug 25, 2026

Copy link
Copy Markdown
Member

The file upload APIs and tolerant attachment contracts from #8235 are now on main. This PR adds the web client for them.

The composer accepts PDFs, ZIPs, and other files up to the server's advertised limit through the paperclip button or paste. Uploads start while the user types, survive draft and stash moves, and render as rows that download with the original filename. Unknown attachment types render as inert rows instead of crashing the thread.

One shared upload flow in packages/client-runtime owns verification, transfer, release, and size limits. Draft discard, project delete, stash, file removal, and send cleanup all use that flow. Interrupted uploads return as "Attach again" markers instead of disappearing.

Release warning: clients with the old image-only attachment contract cannot decode threads that contain file attachments. The compatibility work in #8235 makes the merged server contract tolerant and keeps existing mobile code from treating files as images. Hold the web release until a compatible mobile build is available. #8237 adds mobile file support.

Original work by Theo Browne with Claude Fable 5 in the Claude Code harness. Modernized by GPT-5.6 Sol in the Codex harness.


Note

Medium Risk
Touches the turn send/upload pipeline and draft persistence; threads with file attachments require a tolerant client contract, so release coordination with older mobile builds matters.

Overview
Adds generic file attachments to the chat composer (paperclip, paste, drag) alongside images, with images and files sharing the per-turn attachment cap and server-advertised size limits.

Send and upload path:ChatView snapshots images and files together, runs shared upload/capability checks before and after upload, builds optimistic file rows, and wires timeline on-demand downloads via signed asset URLs. Annotation screenshots respect the combined attachment limit so prompts do not claim crops that were not sent.

Composer UX:ChatComposer stages file rows (upload progress, retry, “attach again” after interrupted uploads), blocks send when capabilities or limits fail, and extends stash restore/save to persisted file uploads with environment checks and expiry verification.

Persistence:composerDraftStore persists file metadata (upload ids or needs-reattach markers), enforces combined limits, and handles moves across threads/environments. Plan follow-up actions hide while any composer attachment is staged (shouldShowPlanFollowUpPrompt).

Timeline: User messages render non-image attachments as download links or inert rows for unknown types. Project/sidebar draft counts include files; project delete passes thread refs when releasing draft uploads.

Reviewed by Cursor Bugbot for commit 129f2ad. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Add PDF, ZIP, and generic file attachment support to chat turns

  • Extends the chat composer to support generic file attachments alongside images, including selection via paste or paperclip button, progress tracking, and retry controls
  • Updates composerDraftStore, attachmentUploadQueue, and prompt stash store to persist file metadata, deduplicate attachments, manage upload lifecycles, and handle cross-environment moves
  • Adds server capability checks to enforce staging limits and reject non-image files on servers that lack upload support
  • Renders received file attachments in the timeline as downloadable links or buttons using generated signed URLs
  • Risk: Non-image attachments now throw an error during send if the server does not support attachment uploads; cross-environment draft moves strip source upload linkage for byte-backed files

Macroscope summarized 129f2ad.

@coderabbitai

coderabbitaiBot commented Aug 25, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 7697ac98-d68b-4b0a-aa8c-fb19042ba35d

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

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

@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:XXL 1,000+ changed lines (additions + deletions). labels Aug 25, 2026
@github-actions

github-actionsBot commented Aug 25, 2026

Copy link
Copy Markdown
Contributor

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

ProviderMetricMain baselineThis PRImpactPR ceiling
CodexTotal thread wire13.3 KiB13.3 KiB−29 B (−0.2%)15.1 KiB
CodexThread snapshot wire6.9 KiB6.9 KiB−6 B (−0.1%)7.3 KiB
CodexLive turn WebSocket wire6.4 KiB6.4 KiB−23 B (−0.3%)7.8 KiB
CodexLive turn WebSocket decoded55.6 KiB55.6 KiB−44 B (−0.1%)66.4 KiB
CodexLive turn messages1110−1 (−9.1%)21
ClaudeTotal thread wire13.3 KiB13.3 KiB−56 B (−0.4%)15.1 KiB
ClaudeThread snapshot wire6.9 KiB6.9 KiB−1 B (−0.0%)7.3 KiB
ClaudeLive turn WebSocket wire6.4 KiB6.4 KiB−55 B (−0.8%)7.8 KiB
ClaudeLive turn WebSocket decoded56.4 KiB56.4 KiB−88 B (−0.2%)66.4 KiB
ClaudeLive turn messages119−2 (−18.2%)21

Baseline: 0e2905e · PR result: 129f2ad · 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: 109.4 KiB
  • Claude decoded thread snapshot: 110.1 KiB

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

@macroscopeappmacroscopeappBot 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.

Reviewed the new/changed Effect-adjacent code (packages/client-runtime/src/state/attachments.ts, apps/web/src/state/attachments.ts, and the web upload-queue call sites) against the service conventions. The new createAttachmentEnvironmentAtoms factory correctly mirrors createAssetEnvironmentAtoms (runtime passed in, no hidden globals, no ManagedRuntime/runPromise outside the existing atom-command boundary), and no service tags/layers were moved or redefined. One predicate convention issue below.

Posted via Macroscope — Effect Service Conventions

Comment threadpackages/client-runtime/src/state/attachments.ts Outdated
Comment threadapps/web/src/lib/attachmentUploadQueue.ts
Comment threaddocs/user/composer.md Outdated
Comment threadapps/web/src/composerDraftStore.ts
@macroscopeapp

macroscopeappBot commented Aug 25, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Not approved

Macroscope's review found this PR not approvable — This change introduces a substantial production workflow for uploading, persisting, transferring, deleting, and downloading user files alongside turns. Its broad runtime surface and server-side file lifecycle warrant human review despite extensive tests and backward-compatible persistence.

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

Comment threadapps/web/src/lib/attachmentUploadQueue.ts Outdated

@macroscopeappmacroscopeappBot 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.

Reviewed the web composer/timeline attachment UI. Two interaction findings on changed lines, both about the new needs-reattach / capacity paths giving the user no working path or feedback.

Posted via Macroscope — UI Consistency

Comment threadapps/web/src/components/chat/ChatComposer.tsx
Comment threadapps/web/src/composerDraftStore.ts
Comment threadapps/web/src/lib/attachmentUploadQueue.ts
Comment threadapps/web/src/composerDraftStore.ts Outdated
Comment threadapps/web/src/composerDraftStore.ts
Comment threadapps/web/src/composerDraftStore.ts Outdated
Comment threadapps/web/src/components/chat/ChatComposer.tsx

@macroscopeappmacroscopeappBot 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.

One finding: the new file-attachment download button in MessagesTimeline renders its filename center-aligned, unlike the visually identical anchor and inert rows next to it.

Posted via Macroscope — UI Consistency

Comment threadapps/web/src/components/chat/MessagesTimeline.tsx Outdated
@t3dotgg
t3dotggforce-pushed the t3code/file-attachments-web branch from c88f3df to 33d67f9CompareAugust 26, 2026 08:58
Comment threadapps/web/src/components/chat/ChatComposer.tsx
Comment threadapps/web/src/components/chat/composerAttachmentFiles.ts
Comment threadapps/web/src/components/chat/ChatComposer.tsx
@t3dotgg
t3dotggforce-pushed the t3code/file-attachments-web branch from 7abf833 to 1dd3cc0CompareAugust 26, 2026 09:29
Comment threadapps/web/src/components/ChatView.tsx
Comment threadapps/web/src/components/chat/ChatComposer.tsx Outdated
Comment threadapps/web/src/hooks/useHandleNewThread.ts

@macroscopeappmacroscopeappBot 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.

One finding on the new send-block wording in ChatComposer. The rest of the attachment UI (file rows, paperclip trigger, stash menu file badge, timeline file rows) reuses the existing primitives and row treatments consistently, and the earlier findings on the timeline download row alignment, the marker re-pick path, and the swallowed paste are resolved.

Posted via Macroscope — UI Consistency

Comment threadapps/web/src/components/chat/ChatComposer.tsx Outdated
Comment threadapps/web/src/components/chat/ChatComposer.tsx
Comment threadapps/web/src/components/ChatView.tsx Outdated

@macroscopeappmacroscopeappBot 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.

One finding: the needs-reattach file row label ignores the canReattachFiles guard that the send-block reason uses, so on a server without file-attachment support (or before the capability arrives) the row tells the user to attach again while no attach control is rendered.

Posted via Macroscope — UI Consistency

Comment threadapps/web/src/components/chat/ChatComposer.tsx
Comment threadapps/web/src/components/chat/ChatComposer.tsx
juliusmarminge added a commit that referenced this pull request Aug 29, 2026
PRs #8437 and #8236 crossed: one made stashShortcutLabel a required
ComposerStashMenu prop, the other added a test case without it, so
main fails web typecheck.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 29, 2026
Round-16 rebase onto main (5 commits, headlined by #8236 file
attachments in the client). Main's upload-aware send path — capability
probes, upload await/retry gating, uploaded-ref turn attachments with
dataUrl fallback, draft release on success — is woven into the v2
dispatch flow, timeline user rows render file attachments as download
links with the ChatView download handler, and the provider settings
editor cleanup keeps the branch's environment-field rows. The codex
feedback client flow stays unported, replay testkit configs gained
main's environmentThemesDir, and the rpc/settings/docs unions carry
both sides.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
github-actionsBot added a commit to omarcresp/t3code-flake that referenced this pull request Aug 29, 2026
## What's Changed
* feat(web): attach PDFs, ZIPs, and other files to a turn by @t3dotgg in pingdotgg/t3code#8236
* feat(web): keybinding settings as settings rows by @StiensWout in pingdotgg/t3code#8532
* feat: let an environment publish themes as a file by @ryanrhughes in pingdotgg/t3code#8569
* fix(web): clean up provider settings list and editor by @StiensWout in pingdotgg/t3code#8504
* fix(web): keep project picker popup inside the sidebar by @SunkenInTime in pingdotgg/t3code#8627
* fix(mobile): prevent header overflow and back-button artifacts by @juliusmarminge in pingdotgg/t3code#8624
## New Contributors
* @ryanrhughes made their first contribution in pingdotgg/t3code#8569
**Full Changelog**: pingdotgg/t3code@v0.0.37-nightly.20260829.1218...v0.0.37-nightly.20260829.1219
Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.37-nightly.20260829.1219
netpro2k added a commit to netpro2k/t3code that referenced this pull request Aug 29, 2026
Intent:
Expose the generic-file backend shipped in v0.0.36 through the web and desktop composer while following the official client implementation closely enough for its upstream PR to replace this patch cleanly.
Behavior:
- Accept images and generic files through the paperclip button, paste, and drag-and-drop; share the eight-attachment limit and use the server-advertised generic-file limit, currently 50 MB.
- Upload while the user composes, show progress/retry/reattach states, and render sent files as signed downloads with their original names.
- Preserve file drafts and stashes as server upload references or explicit needs-reattach markers instead of storing generic-file bytes in localStorage.
- Keep upload verification, cleanup, retry, environment moves, and unknown attachment rendering explicit.
- Show file names in the current mobile feed and include attachment names in transcript bootstrap context.
Design constraints:
- Backport official upstream PR pingdotgg#8236 at 129f2ad, rebased onto v0.0.36, rather than maintaining a parallel client upload architecture.
- Use packages/client-runtime for the shared upload lifecycle and clamp file sizes to the server capability and contract maximum.
- Require direct-upload support for generic files. Do not retain the fork inline-file protocol or serialize generic-file bytes into drafts and stashes.
- Upload local workspace drops like the official client; do not retain the competing desktop-only drop-to-mention behavior.
- Keep images on their established compression and compatibility path.
Integration:
- Shared client-runtime upload lifecycle and web environment atoms.
- Web composer, drafts, prompt stashes, upload queue, message timeline, signed asset downloads, sidebar counts, project cleanup, and user documentation.
- Minimal current mobile feed visibility and transcript bootstrap naming remain fork-only until the official follow-up covers them.
Verification:
- Official attachment-focused web and client-runtime tests pass (7 files, 196 tests).
- Targeted client-runtime, web, and mobile typechecks pass; the existing client-runtime Effect diagnostic remains advisory.
Rebase notes:
- Upstream PR pingdotgg#8236 should supersede the web/client-runtime implementation wholesale once merged.
- Upstream PR pingdotgg#8237 should supersede the temporary mobile filename row with signed mobile downloads and full mobile file picking/sharing.
- Recheck only the transcript-bootstrap filename summary after both PRs land.
- The v0.0.36 stashShortcutLabel test fixture is the only adaptation to the rebased official PR tree.
longtngo added a commit to longtngo/t3code that referenced this pull request Aug 29, 2026
Range f6f2be3..053affb, v0.0.36. 411 upstream files, 632 fork files,
81 touched by both, 19 conflicted.
Competing implementations resolved toward the fork's superset:
- Claude context usage (pingdotgg#8610). Upstream deleted `queryCurrentContextUsage` and
`normalizeClaudeContextUsageApiSnapshot` outright. `getContextUsage` is the ONLY
source of the compaction facts (`autocompactSource`, `autoCompactThreshold`,
`isAutoCompactEnabled`) the Vitals gauge's compaction note and marker render from,
and they travel on the wire contract, so the call is kept. Upstream's
`latestAssistantUsage` tracking and its post-compaction guard are adopted BELOW it
as the next-best fallback: `contextUsageSnapshot ?? latestAssistantSnapshot ?? ...`.
Upstream removed `getContextUsage` from `ClaudeQueryRuntime`, the
`SDKControlGetContextUsageResponse` import and the `Option` import outside every
conflict marker; all three restored.
- Provider settings editor (pingdotgg#8472). Upstream's `useEffect` + `lastPublishedEnvironmentRef`
re-seed is the superset of the fork's render-phase `seededRef` (8fe3190, one of four
silent-data-loss fixes). The merge had kept BOTH mechanisms; collapsed to upstream's,
with the fork's half-typed-row null guard on the publish path. `environmentKey` deleted
with the code it served.
- Sidebar project combobox (pingdotgg#5931). Upstream replaced the menu-based project filter,
whose `MenuRadioItem` carried the fork's project-actions button. Rebuilt on upstream's
`ComboboxItem` with the ellipsis button grafted back (invariant 6). The dead `Menu*`
import is gone.
- Composer attachments (pingdotgg#8236). Upstream's `addComposerAttachments` pipeline adopted; the
fork's drop split (image -> attach, other -> absolute path with upload fallback) kept
and repointed at the new handler.
- Mid-turn steer. Upstream's `steeringTurnState` branch rejected again (invariant 5); its
side of that hunk also opened an `if` whose brace lives below the hunk.
- Thread deletion drain (pingdotgg#8226). Upstream replaced `drain` with `drainThrough(sequence)`;
the fork's test retargeted. Its new drain test observed `ProviderService.stopSession`,
which this reactor never calls (it dispatches `thread.session.stop`), so it now counts
engine dispatches and provides the two services the fork's reactor needs.
Three defects the resolutions introduced, each caught by a check that is not the suite:
- `shouldShowBranchMismatchBanner` was resurrected into two import lists by resolving
them toward upstream. Fork commit cfdf255 replaced that function; the import had no
definition. Found by the RESURRECTED sweep.
- `scriptPath` ended up declared twice in CodexCollabRuntime.integration.test.ts: `both`
reintroduced upstream's fixture-dir copy that the fork deliberately moved to a temp dir.
Found by the RESURRECTED sweep.
- `setProjectScopeMenuOpen` survived in the fork's `handleProjectActions` after upstream
replaced that state with a reducer, outside every marker. Found by typecheck.
Upstream regressions of fork fixes, kept fixed:
- Raw NUL bytes returned to ChatComposer.tsx. A raw NUL renders as nothing in grep and
aborts BSD sed mid-file; the fork had converted all six to `\0` escapes and carries a
guard test for it. The guard failed, and the offending line reads as space-separated in
any normal diff. Converted back to escapes.
- `defaultTheme` / `defaultThemeSetAt` (pingdotgg#8569) are absent from `ServerSettingsPatch`; the
fork's patch-parity guard caught it. They are owned by `t3 theme set`, which rewrites
settings.json directly and which clients only read, so they are recorded as deliberately
unpatchable rather than mirrored.
- The fork's mobile held-messages strip used `dark:` variants that upstream's new Uniwind
theme rule (pingdotgg#7327) forbids; moved to the `text-foreground-muted` semantic token rather
than added to the rule's allowlist.
Invariants: all re-probed against the merged tree. 1 (49 migrations, ids unique and
monotonic, max 50, 34 burned), 2 (the fork-only @effect/platform-node patch survived the
Expo 57 rewrite of patchedDependencies, is pinned, resolved and applied on disk; effect
stays at beta.103 so no re-pin), 3, 4, 4b (4 `isSendBlocked=`), 5, 5b, 5c, 6, 7, 8, 9, 10,
11 all hold.
Sweeps: resurrected 3, dropped 21, fork-loss 45, both-kept 0. Every entry named: the 3
resurrected and the fork-loss in ProviderInstanceCard / ChatComposer / Sidebar are the
decisions above; the OpenCode fork-loss is 11 comment lines whose guard upstream extracted
into `deleteContextIfCurrent` (the rationale is restored on the helper); pnpm-lock churn is
the install. Test declarations 18,691 -> 19,081; one file lost one, upstream's own pingdotgg#8484.
Gate: pnpm run verify green, exit 0 read from the captured log line. 14 blocks,
10,744 passed, 20 skipped, 0 failures.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
netpro2k added a commit to netpro2k/t3code that referenced this pull request Aug 29, 2026
Intent:
Expose the generic-file backend shipped in v0.0.36 through the web and desktop composer while following the official client implementation closely enough for its upstream PR to replace this patch cleanly.
Behavior:
- Accept images and generic files through the paperclip button, paste, and drag-and-drop; share the eight-attachment limit and use the server-advertised generic-file limit, currently 50 MB.
- Upload while the user composes, show progress/retry/reattach states, and render sent files as signed downloads with their original names.
- Preserve file drafts and stashes as server upload references or explicit needs-reattach markers instead of storing generic-file bytes in localStorage.
- Keep upload verification, cleanup, retry, environment moves, and unknown attachment rendering explicit.
- Show file names in the current mobile feed and include attachment names in transcript bootstrap context.
Design constraints:
- Backport official upstream PR pingdotgg#8236 at 129f2ad, rebased onto v0.0.36, rather than maintaining a parallel client upload architecture.
- Use packages/client-runtime for the shared upload lifecycle and clamp file sizes to the server capability and contract maximum.
- Require direct-upload support for generic files. Do not retain the fork inline-file protocol or serialize generic-file bytes into drafts and stashes.
- Upload local workspace drops like the official client; do not retain the competing desktop-only drop-to-mention behavior.
- Keep images on their established compression and compatibility path.
Integration:
- Shared client-runtime upload lifecycle and web environment atoms.
- Web composer, drafts, prompt stashes, upload queue, message timeline, signed asset downloads, sidebar counts, project cleanup, and user documentation.
- Minimal current mobile feed visibility and transcript bootstrap naming remain fork-only until the official follow-up covers them.
Verification:
- Official attachment-focused web and client-runtime tests pass (7 files, 196 tests).
- Targeted client-runtime, web, and mobile typechecks pass; the existing client-runtime Effect diagnostic remains advisory.
Rebase notes:
- Upstream PR pingdotgg#8236 should supersede the web/client-runtime implementation wholesale once merged.
- Upstream PR pingdotgg#8237 should supersede the temporary mobile filename row with signed mobile downloads and full mobile file picking/sharing.
- Recheck only the transcript-bootstrap filename summary after both PRs land.
- The v0.0.36 stashShortcutLabel test fixture is the only adaptation to the rebased official PR tree.
juliusmarminge added a commit that referenced this pull request Aug 30, 2026
Round-16 rebase onto main (5 commits, headlined by #8236 file
attachments in the client). Main's upload-aware send path — capability
probes, upload await/retry gating, uploaded-ref turn attachments with
dataUrl fallback, draft release on success — is woven into the v2
dispatch flow, timeline user rows render file attachments as download
links with the ChatView download handler, and the provider settings
editor cleanup keeps the branch's environment-field rows. The codex
feedback client flow stays unported, replay testkit configs gained
main's environmentThemesDir, and the rpc/settings/docs unions carry
both sides.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
bcotrim pushed a commit to bcotrim/mognet that referenced this pull request Aug 30, 2026
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
(cherry picked from commit bcb855a)
bcotrim pushed a commit to bcotrim/mognet that referenced this pull request Aug 30, 2026
PRs pingdotgg#8437 and pingdotgg#8236 crossed: one made stashShortcutLabel a required
ComposerStashMenu prop, the other added a test case without it, so
main fails web typecheck.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
(cherry picked from commit d22709f)
juliusmarminge added a commit that referenced this pull request Aug 30, 2026
Round-16 rebase onto main (5 commits, headlined by #8236 file
attachments in the client). Main's upload-aware send path — capability
probes, upload await/retry gating, uploaded-ref turn attachments with
dataUrl fallback, draft release on success — is woven into the v2
dispatch flow, timeline user rows render file attachments as download
links with the ChatView download handler, and the provider settings
editor cleanup keeps the branch's environment-field rows. The codex
feedback client flow stays unported, replay testkit configs gained
main's environmentThemesDir, and the rpc/settings/docs unions carry
both sides.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
imsherrill pushed a commit to comprehensiveio/compadre that referenced this pull request Aug 31, 2026
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
(cherry picked from commit bcb855a)
imsherrill added a commit to comprehensiveio/compadre that referenced this pull request Aug 31, 2026
…) (#2)
(cherry picked from commit bcb855a)
Co-authored-by: Theo Browne <me@t3.gg>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
netpro2k added a commit to netpro2k/t3code that referenced this pull request Aug 31, 2026
Intent:
Keep transcript bootstrap context aware of generic file attachments now that upstream web and mobile clients support their full upload and rendering lifecycle.
Behavior:
- Count every message attachment in transcript bootstrap context, not only images.
- Include up to three attachment names plus an additional-count suffix.
- Preserve image/images wording when every attachment is an image; otherwise use file/files.
Design constraints:
- Rely entirely on upstream attachment upload, draft, stash, rendering, download, and mobile behavior.
- Keep this patch limited to the text supplied to transcript bootstrap.
Integration:
- Web transcript bootstrap summary only. No client upload, server, contract, mobile, or storage changes.
Verification:
- Upstream PRs pingdotgg#8236 and pingdotgg#8237 were audited as superseding the former attachment backport except for this summary behavior.
- Targeted web verification is rerun after the complete patch stack rebases.
Rebase notes:
- Drop this patch only when upstream transcript bootstrap includes generic attachment names rather than filtering to images.
github-actionsBot added a commit to omarcresp/t3code-flake that referenced this pull request Aug 31, 2026
## What's Changed
* Remove Messages Glass Lab experiment by @juliusmarminge in pingdotgg/t3code#8599
* Require human review for pull requests changing product defaults by @juliusmarminge in pingdotgg/t3code#8603
* fix(codex): avoid quadratic app-server input buffering by @juliusmarminge in pingdotgg/t3code#8605
* fix(mobile): stabilize iOS header item transitions by @juliusmarminge in pingdotgg/t3code#8607
* chore(mobile): upgrade to Expo SDK 57 by @juliusmarminge in pingdotgg/t3code#8609
* fix(mobile): harden native header toolbar items by @juliusmarminge in pingdotgg/t3code#8611
* fix(server): stop querying Claude context usage after turns by @t3dotgg in pingdotgg/t3code#8610
* chore: vouch ryanrhughes by @t3dotgg in pingdotgg/t3code#8613
* feat(web): attach PDFs, ZIPs, and other files to a turn by @t3dotgg in pingdotgg/t3code#8236
* feat(web): keybinding settings as settings rows by @StiensWout in pingdotgg/t3code#8532
* feat: let an environment publish themes as a file by @ryanrhughes in pingdotgg/t3code#8569
* fix(web): clean up provider settings list and editor by @StiensWout in pingdotgg/t3code#8504
* fix(web): keep project picker popup inside the sidebar by @SunkenInTime in pingdotgg/t3code#8627
* fix(mobile): prevent header overflow and back-button artifacts by @juliusmarminge in pingdotgg/t3code#8624
* fix(server): retry automatic thread title generation by @Bil0000 in pingdotgg/t3code#8087
* fix(client-runtime): refresh edited pull request comments by @Bil0000 in pingdotgg/t3code#8094
* fix(web): four composer spacing defects by @Bil0000 in pingdotgg/t3code#8090
* perf(desktop): skip duplicate browser updates by @Bil0000 in pingdotgg/t3code#8018
* fix(web): render nested markdown images correctly by @flamboh in pingdotgg/t3code#8501
* fix(web): unify activity logs and composer banners by @juliusmarminge in pingdotgg/t3code#8693
* fix(mobile): reduce dev-client reload and Metro startup cost by @juliusmarminge in pingdotgg/t3code#8694
* revert(web): restore previous composer banners by @t3dotgg in pingdotgg/t3code#8733
* test(web): remove tests for unreachable helpers by @t3-code[bot] in pingdotgg/t3code#8738
* feat(mobile): update tool summaries and chat transitions by @juliusmarminge in pingdotgg/t3code#8793
* feat(web): play video attachments in chat by @Bil0000 in pingdotgg/t3code#8688
* fix(web,mobile): snooze menu no longer offers the same wake time twice by @vitalyiegorov in pingdotgg/t3code#8741
* fix(grok): allow model changes in existing threads by @ahmed-besic in pingdotgg/t3code#8392
* feat(mobile): pick, share, and receive files in threads by @t3dotgg in pingdotgg/t3code#8237
* fix(web): reduce title bar scroll fade height by @maria-rcks in pingdotgg/t3code#8799
* fix(windows): strip quotes from repaired PATH by @UtkarshUsername in pingdotgg/t3code#8746
* fix(web): open agent images in expanded preview by @maria-rcks in pingdotgg/t3code#8807
* fix(git): follow repository instructions in generated source control text by @maria-rcks in pingdotgg/t3code#8804
* fix(server): stop overpricing cached Claude tokens by @SunkenInTime in pingdotgg/t3code#8806
* fix(web): keep image preview above sidebar control by @maria-rcks in pingdotgg/t3code#8811
* fix(web): keep right panel synced with agent edits by @maria-rcks in pingdotgg/t3code#8803
* fix(web,mobile): render Codex citations and artifact templates by @Yash-Singh1 in pingdotgg/t3code#8584
* chore: add Windows setup script to t3.json by @UtkarshUsername in pingdotgg/t3code#8814
* fix(web): fold interim turn responses by @maria-rcks in pingdotgg/t3code#8828
* fix(web): use circle alert for failed tool calls by @maria-rcks in pingdotgg/t3code#8840
* feat(mobile): add offline iPhone voice input by @t3dotgg in pingdotgg/t3code#8614
* fix(web): prevent pull request metadata overlap by @MatthewFeroz in pingdotgg/t3code#8790
## New Contributors
* @ryanrhughes made their first contribution in pingdotgg/t3code#8569
* @ahmed-besic made their first contribution in pingdotgg/t3code#8392
* @MatthewFeroz made their first contribution in pingdotgg/t3code#8790
**Full Changelog**: pingdotgg/t3code@v0.0.36...v0.0.37
Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.37
amitbet pushed a commit to amitbet/a2code that referenced this pull request Sep 1, 2026
Upstream shipped its own arbitrary file attachments (pingdotgg#8235/pingdotgg#8236/pingdotgg#8237), a
strict superset of the fork's, so that divergence is retired rather than
re-applied. Upstream also reverted its turn-plan chips, restructured provider
settings into list+editor, made the project picker a searchable combobox, and
replaced the mobile CSS-variable theme hook with useUniwindTheme.
Fork features preserved: thread forking, queued-prompt steering, in-chat find,
answered user-input rows, machine-scoped environments, provider health-check
cache, provider "Default traits", live quota meter, thread export/pinning,
payload hot-update channel, and the build-only CI surface.
See FORK_NOTES.md for the per-file migration notes.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Sep 1, 2026
Round-16 rebase onto main (5 commits, headlined by #8236 file
attachments in the client). Main's upload-aware send path — capability
probes, upload await/retry gating, uploaded-ref turn attachments with
dataUrl fallback, draft release on success — is woven into the v2
dispatch flow, timeline user rows render file attachments as download
links with the ChatView download handler, and the provider settings
editor cleanup keeps the branch's environment-field rows. The codex
feedback client flow stays unported, replay testkit configs gained
main's environmentThemesDir, and the rpc/settings/docs unions carry
both sides.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Coriou added a commit to Coriou/txcode that referenced this pull request Sep 1, 2026
Upstream tip (bcb855a, pingdotgg#8236) rewrote the third render's entries and
dropped the required stashShortcutLabel prop, leaving upstream's own web
typecheck red. Completed the fixture; candidate for an upstream report.
juliusmarminge added a commit that referenced this pull request Sep 2, 2026
Round-16 rebase onto main (5 commits, headlined by #8236 file
attachments in the client). Main's upload-aware send path — capability
probes, upload await/retry gating, uploaded-ref turn attachments with
dataUrl fallback, draft release on success — is woven into the v2
dispatch flow, timeline user rows render file attachments as download
links with the ChatView download handler, and the provider settings
editor cleanup keeps the branch's environment-field rows. The codex
feedback client flow stays unported, replay testkit configs gained
main's environmentThemesDir, and the rpc/settings/docs unions carry
both sides.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
brentkelly added a commit to brentkelly/t3code-orchestrator that referenced this pull request Sep 2, 2026
* feat(analytics): threads and turns now know which client started them (pingdotgg#7774)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(web): stop marking mixed tool runs as failed (pingdotgg#7893)
* fix(web): command-click spaced folder links (pingdotgg#6439)
Co-authored-by: shivam <91240327+shivamhwp@users.noreply.github.com>
* fix(chat): stop pushing follow-up messages to the top (pingdotgg#7897)
* test(desktop): remove redundant release note assertion (pingdotgg#7873)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
* fix(web): handle wide ordered-list marker edge cases (pingdotgg#7856)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(ssh): restore user PATH for remote servers (pingdotgg#7213)
* fix(desktop): keep tailscale spawn defects from breaking advertised endpoints (pingdotgg#7116)
* fix(web): keep Codex service tier labels readable (pingdotgg#4503)
* fix: render workspace images in chat markdown (pingdotgg#6433)
* fix(clients): keep opening responses visible after turns settle (pingdotgg#7723)
* feat(web): add appearance contrast control (pingdotgg#7906)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: maria <254055478+maria-rcks@users.noreply.github.com>
* fix(server): stop completed Codex threads from staying stuck on working (pingdotgg#7937)
* fix(mobile): preserve markdown image dimensions (pingdotgg#7940)
* fix(web): remove duplicate provider update progress (pingdotgg#7761)
* fix(server): fall back to the remote default branch instead of assuming main (pingdotgg#7078)
* fix(web): give sidebar project menu rows the same side padding as other menus (pingdotgg#7913)
* fix(clients): reconnect after credentials fail during remote server updates (pingdotgg#7953)
* feat(codex): submit thread feedback to OpenAI (pingdotgg#7949)
* fix(server): stop kills lingering Claude work (pingdotgg#5891)
* fix(ci): let Macroscope approve pull requests again (pingdotgg#7970)
* fix(clients): move settled pinned threads into the settled section (pingdotgg#7969)
* perf(ci): speed up release builds and Windows packaging (pingdotgg#7975)
* fix(web): stop tool calls from leaving a blank page in threads (pingdotgg#7971)
* fix(web): stop recovered tool failures from marking work logs red (pingdotgg#7999)
* fix(mobile): isolate markdown image requests (pingdotgg#7942)
* feat(web): redesign skills in `$` menu and in `/` menu (pingdotgg#8009)
* fix(web): restore right panel toggle clicks after closing on desktop (pingdotgg#8016)
* fix(web): keep server update banners flush with the composer (pingdotgg#8000)
* perf(web): reuse work log rows during streaming (pingdotgg#8006)
* fix(web): keep provider badge legible in dark themes (pingdotgg#7968)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: maria <254055478+maria-rcks@users.noreply.github.com>
* fix(web): treat configured urls with uppercase schemes as secure (pingdotgg#8005)
Co-authored-by: Simone <185146821+Lucenx9@users.noreply.github.com>
* fix(desktop): keep release notes visible while downloading (pingdotgg#6412)
* fix(web): show only providers with usage in usage views (pingdotgg#7563)
* fix(web): prevent expanded tool calls from hiding thread content (pingdotgg#8052)
* test(server): remove no-op live activity tests (pingdotgg#8056)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
* fix(web): clarify terminal sidebar grouping (pingdotgg#7967)
* fix(codex): show app access approval prompts (pingdotgg#8058)
* feat(web): upload image attachments before sending (pingdotgg#8048)
* fix(server): bound OpenCode skill discovery output (pingdotgg#7675)
Co-authored-by: Simone <185146821+Lucenx9@users.noreply.github.com>
* fix(mobile): persist thread shelf collapse state (pingdotgg#5152)
* fix(mobile): restore Android tablet thread controls, clean up header (pingdotgg#5385)
* fix(mobile): land the first thread open above the composer on Android (pingdotgg#5585)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: codex <codex@users.noreply.github.com>
Co-authored-by: Julius Marminge <julius0216@outlook.com>
* fix(server): check out submodules in a new worktree (pingdotgg#7674)
Co-authored-by: Rodrigo Brechard <rodrigo@clubtidy.fr>
* fix(server): preserve merged PR badges after branch deletion (pingdotgg#6216)
* fix(server): return fresh live pull request reads (pingdotgg#6472)
* fix(web): compare client and server versions as semver, not strings (pingdotgg#7579)
* fix(web): stop follow-ups from leaving giant blank space (pingdotgg#8068)
* fix(marketing): stop automatic Vercel deployments on pull requests (pingdotgg#8070)
* chore: vouch repeat contributors (pingdotgg#8071)
* fix(server): keep the authoritative subagent model when snapshots race task_started (pingdotgg#7583)
* fix(server): honor auto-accept edits for the OpenCode provider (pingdotgg#7100)
* fix(server): run the CLI on Node versions without import.meta.main (pingdotgg#7141)
* fix(server): recover from provider interrupt failures (pingdotgg#7412)
* fix(server): recreate a thread's worktree before starting a turn (pingdotgg#7839)
* fix(server): thread delete no longer fails on already-removed worktrees (pingdotgg#8076)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(web): stop update notices showing through the composer (pingdotgg#8083)
* fix(web): detect outdated nightly servers (pingdotgg#8124)
* fix(web): align usage page skeleton layout (pingdotgg#8111)
* fix(web): make terminal links appear clickable only when clickable (pingdotgg#7488)
* fix(web): make Windows file links clickable in chat (pingdotgg#8081)
* fix(web): sort usage models by token count (pingdotgg#8108)
* fix: open agent file links in the file viewer (pingdotgg#8098)
* fix(server): stop routine events from rescanning thread history (pingdotgg#8150)
* fix(deps): stop pnpm installs from changing the lockfile (pingdotgg#8163)
* feat(web): settle and restore threads with a keyboard shortcut (pingdotgg#8089)
* perf(desktop): cut macOS signing calls by 81% (pingdotgg#8093)
* feat: link pull requests to threads (pingdotgg#8160)
* feat(web): safely attach HEIC photos as JPEG images (pingdotgg#8161)
Co-authored-by: mweinbach <maxweinbach5@gmail.com>
* feat(mobile): track device models and OS versions (pingdotgg#8169)
* fix(grok): bound cumulative tool output updates (pingdotgg#7279)
* fix(web): delay thread shortcut hints by 200 ms (pingdotgg#8172)
* fix(server): stop probing Cursor until enabled (pingdotgg#8175)
* docs(release): verify remote updates with database migrations (pingdotgg#8177)
* fix(server): keep provider CLIs available in the macOS service (pingdotgg#8173)
* feat(claude): compact old threads before they burn through usage (pingdotgg#8144)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(client-runtime): retry queries after connection interruption (pingdotgg#8117)
* fix(server): keep previously used providers working after upgrades (pingdotgg#8176)
* feat(desktop): build macOS previews from a PR label (pingdotgg#8182)
* fix(web): thread jump hints no longer stick after a dictation paste (pingdotgg#8189)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(web): keep grouped project renames (pingdotgg#7831)
* feat(web): reveal chat file chips in the system file manager (pingdotgg#7140)
Co-authored-by: Dara Adedeji <daraaded@amazon.com>
Co-authored-by: shivam <91240327+shivamhwp@users.noreply.github.com>
* fix(server): push no longer writes a feature branch's commits to its base branch (pingdotgg#8228)
* chore(deps): bump @clerk/electron to 0.0.37 (pingdotgg#8240)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* feat(server): fetch legacy model classification from a hosted manifest (pingdotgg#8227)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* chore(release): prepare v0.0.34
* fix(desktop): let Clerk UI receive stable auth fixes (pingdotgg#8248)
* fix(app): un-settled threads return to the top of the list (pingdotgg#8231)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* perf(ci): cut about a minute from every release (pingdotgg#8250)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* feat(ci): download macOS preview DMGs without signing in (pingdotgg#8243)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(codex): accept Codex 0.150 multi-agent events (pingdotgg#8346)
* chore(release): prepare v0.0.35
* fix(grok): improve skills, plans, usage, and turn reliability (pingdotgg#8358)
Co-authored-by: Dara Adedeji <daraadedeji07@gmail.com>
Co-authored-by: Ahmed Besic <ahmed-besic@users.noreply.github.com>
Co-authored-by: Michael Brown <michaeltbrown.mtb@gmail.com>
Co-authored-by: Lars Nieuwenhuis <35393046+lnieuwenhuis@users.noreply.github.com>
Co-authored-by: Guilherme Barros <gbarros1095@gmail.com>
Co-authored-by: PC <pc@localhost>
Co-authored-by: 1xpixi <157762409+1xpixi@users.noreply.github.com>
* fix(server): recover stale Codex approval callbacks (pingdotgg#5195)
* test(server): remove duplicate missing worktree test (pingdotgg#8252)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
* fix(server): replay all un-applied events during projection bootstrap (pingdotgg#7538)
Co-authored-by: Theo Browne <me@t3.gg>
* test: remove low-signal test files (pingdotgg#8397)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
* test: prune trivial error and layout tests (pingdotgg#8400)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
* Fix Android adaptive launcher icon (pingdotgg#4332)
Co-authored-by: Yash Singh <saiansh2525@gmail.com>
* feat(web): split provider settings into list and editor (pingdotgg#8380)
* fix(codex): accept Codex 0.150 account plans (pingdotgg#8447)
* fix(tooling): allow ignored-only staged changes (pingdotgg#8468)
* fix(mobile): keep iOS home header stable (pingdotgg#8467)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(web): stop showing red x summaries for ordinary tool failures (pingdotgg#8395)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(mobile): refine Git action toast glass styling (pingdotgg#8399)
* fix(desktop): allow preview automation in agent-created threads (pingdotgg#8483)
* test(web): remove redundant cache key test (pingdotgg#8484)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
* fix(release): move nightly schedule to minute 38
Recent scheduled nightlies have been delayed or skipped.
Move the nightly cron from minute 7 to minute 38. Keep the existing three-hour interval. This tests a different point in each three-hour window without claiming it will fix GitHub schedule delivery.
Authored by GPT-5.6 Sol with the Codex harness.
* fix(web): stabilize the provider settings editor (pingdotgg#8472)
* fix(web): open GitHub pull requests in browser when loading fails (pingdotgg#8507)
* fix(codex): show sub-agent models (pingdotgg#8502)
* feat(analytics): report connected client platforms (pingdotgg#8481)
* feat(server): accept PDF, ZIP, and other file uploads up to 50MB (pingdotgg#8235)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* feat(web): toggle thread pin from the keyboard
Add a mod+shift+p shortcut that pins or unpins the active thread. Ignore the shortcut during terminal focus and when the server does not support thread pinning.
* fix(web): add back button to project settings (pingdotgg#8168)
* refactor(mobile): compile semantic themes for Uniwind (pingdotgg#7327)
Co-authored-by: codex <codex@users.noreply.github.com>
* fix(desktop): Cache Runtime locally on WSL Filesystem, dramatically improving launch times (pingdotgg#5769)
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: Utkarsh Patil <73941998+UtkarshUsername@users.noreply.github.com>
* fix(mobile): show OpenCode model sources in picker (pingdotgg#8573)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(clients): honor project default models in new threads (pingdotgg#6011)
Co-authored-by: Shivam Sharma <91240327+shivamhwp@users.noreply.github.com>
* fix(mobile): show file actions on Android (pingdotgg#8215)
Co-authored-by: Shivam Sharma <91240327+shivamhwp@users.noreply.github.com>
* fix(connect): explain DPoP connection failures (pingdotgg#8351)
Co-authored-by: Julius Marminge <julius0216@outlook.com>
* feat(web): make the sidebar project filter a searchable combobox (pingdotgg#5931)
* fix(server): a draft can retry its first send after a failed bootstrap (pingdotgg#8226)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(desktop): stop hidden previews draining battery (pingdotgg#8567)
* fix(desktop): oauth popups open from the browser preview (pingdotgg#8435)
Co-authored-by: Julius Marminge <julius0216@outlook.com>
* fix(web): keep long task drawers usable on small screens (pingdotgg#8313)
* fix(opencode): handle child approvals, stops, and model catalogs (pingdotgg#8480)
* fix: make thread auto-settling opt-in (pingdotgg#8321)
* fix(web): stop session activity timing test from blocking releases (pingdotgg#8585)
* fix(mobile): show composer menus when starting a task (pingdotgg#8587)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(web): show the configured stash shortcut (pingdotgg#8437)
Co-authored-by: Shivam Sharma <91240327+shivamhwp@users.noreply.github.com>
* feat(web): add toggleable confirmation before unpinning a thread (pingdotgg#7313)
Co-authored-by: Shivam Sharma <91240327+shivamhwp@users.noreply.github.com>
* fix: restore automatic thread settling defaults (pingdotgg#8596)
* fix(mobile): restore composer glass and rounded shadows (pingdotgg#8597)
Co-authored-by: Julius Marminge <julius@mac.lan>
* Remove Messages Glass Lab experiment (pingdotgg#8599)
* chore(release): prepare v0.0.36
* Require human review for pull requests changing product defaults (pingdotgg#8603)
* fix(codex): avoid quadratic app-server input buffering (pingdotgg#8605)
* fix(mobile): stabilize iOS header item transitions (pingdotgg#8607)
Co-authored-by: Julius Marminge <julius@mac.lan>
* chore(mobile): upgrade to Expo SDK 57 (pingdotgg#8609)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(mobile): harden native header toolbar items (pingdotgg#8611)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(server): stop querying Claude context usage after turns (pingdotgg#8610)
* chore: vouch ryanrhughes (pingdotgg#8613)
* feat(web): attach PDFs, ZIPs, and other files to a turn (pingdotgg#8236)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(web): pass stashShortcutLabel in the mixed-attachments stash test
PRs pingdotgg#8437 and pingdotgg#8236 crossed: one made stashShortcutLabel a required
ComposerStashMenu prop, the other added a test case without it, so
main fails web typecheck.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* feat(web): keybinding settings as settings rows (pingdotgg#8532)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Julius Marminge <julius0216@outlook.com>
* feat: let an environment publish themes as a file (pingdotgg#8569)
Co-authored-by: Theo Browne <me@t3.gg>
* fix(web): clean up provider settings list and editor (pingdotgg#8504)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Julius Marminge <julius0216@outlook.com>
* fix(web): keep project picker popup inside the sidebar (pingdotgg#8627)
* fix(mobile): prevent header overflow and back-button artifacts (pingdotgg#8624)
* fix(server): retry automatic thread title generation (pingdotgg#8087)
* fix(client-runtime): refresh edited pull request comments (pingdotgg#8094)
* fix(web): four composer spacing defects (pingdotgg#8090)
* perf(desktop): skip duplicate browser updates (pingdotgg#8018)
Co-authored-by: Julius Marminge <julius0216@outlook.com>
* fix(web): render nested markdown images correctly (pingdotgg#8501)
* fix(web): unify activity logs and composer banners (pingdotgg#8693)
* fix(mobile): reduce dev-client reload and Metro startup cost (pingdotgg#8694)
Co-authored-by: Julius Marminge <julius@mac.lan>
* revert(web): restore previous composer banners (pingdotgg#8733)
* test(web): remove tests for unreachable helpers (pingdotgg#8738)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
* feat(mobile): update tool summaries and chat transitions (pingdotgg#8793)
* feat(web): play video attachments in chat (pingdotgg#8688)
* fix(web,mobile): snooze menu no longer offers the same wake time twice (pingdotgg#8741)
* fix(grok): allow model changes in existing threads (pingdotgg#8392)
Co-authored-by: Ahmed Besic <ahmed-besic@users.noreply.github.com>
* feat(mobile): pick, share, and receive files in threads (pingdotgg#8237)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Julius Marminge <julius0216@outlook.com>
* fix(web): reduce title bar scroll fade height (pingdotgg#8799)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(windows): strip quotes from repaired PATH (pingdotgg#8746)
* fix(web): open agent images in expanded preview (pingdotgg#8807)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(git): follow repository instructions in generated source control text (pingdotgg#8804)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(server): stop overpricing cached Claude tokens (pingdotgg#8806)
* fix(web): keep image preview above sidebar control (pingdotgg#8811)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(web): keep right panel synced with agent edits (pingdotgg#8803)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(web,mobile): render Codex citations and artifact templates (pingdotgg#8584)
* chore: add Windows setup script to t3.json (pingdotgg#8814)
* fix(web): fold interim turn responses (pingdotgg#8828)
* fix(web): use circle alert for failed tool calls (pingdotgg#8840)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* feat(mobile): add offline iPhone voice input (pingdotgg#8614)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(web): prevent pull request metadata overlap (pingdotgg#8790)
* chore(release): prepare v0.0.37
* Add mobile composer attachment menu with video support (pingdotgg#8843)
* fix(mobile): map native menu icon colors explicitly
* fix(web): restore unified activity logs and composer banners (pingdotgg#8734)
Co-authored-by: Julius Marminge <julius0216@outlook.com>
Co-authored-by: Julius Marminge <jmarminge@gmail.com>
* fix(web): address composer banner review follow-ups (pingdotgg#8850)
* fix(web): widen sync banners and simplify the working timer (pingdotgg#8855)
* fix(preview): improve browser recording quality (pingdotgg#8839)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(web): mark pull request links as external (pingdotgg#8856)
* fix(mobile): replace Callstack glass with Expo glass (pingdotgg#8862)
* fix(server): skip IDE detection in Claude probes (pingdotgg#8634)
* chore(macroscope): review diagnostic overrides (pingdotgg#8917)
Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
* fix(contracts): accept CLI event origins (pingdotgg#8905)
* fix(web): hide invalid slash skill completions (pingdotgg#8904)
* fix(mobile): defer draft navigation until submission completes (pingdotgg#8914)
* chore: disable CodeRabbit review status (pingdotgg#8933)
* Delete app.json (pingdotgg#8934)
* fix(web): show scrollbar for wide markdown tables (pingdotgg#8868)
* fix(mobile): shimmer active tool rows (pingdotgg#8932)
Co-authored-by: Julius Marminge <julius@mac.lan>
* chore(deps): bump Electron to 43.4.1 (pingdotgg#8626)
* fix(chat): smooth worktree setup status (pingdotgg#8922)
* feat(mobile): add video playback with native iOS controls (pingdotgg#8919)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(web): prevent chat metadata overlap (pingdotgg#8851)
* fix(server): preserve usage cache outside walked roots (pingdotgg#8540)
Co-authored-by: Simone <185146821+Lucenx9@users.noreply.github.com>
* feat(mobile): add native image and PDF previews (pingdotgg#8959)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(server): allow long thread IDs in HTTP routes (pingdotgg#8898)
* fix(shared): preserve Windows shell PATH priority (pingdotgg#8748)
* fix(web): make WSL settings searchable (pingdotgg#8881)
* feat(web): add expand/collapse all control to the files surface (pingdotgg#8889)
* Add auto_review configuration to coderabbit.yaml
* style: format CodeRabbit configuration
* feat(mobile): upload attachments while composing (pingdotgg#8978)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(chat): keep agent activity visible between actions (pingdotgg#8984)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(server): isolate remote web session cookies (pingdotgg#8085)
Co-authored-by: Julius Marminge <julius0216@outlook.com>
* feat(pull-requests): link GitHub references in markdown (pingdotgg#8812)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* perf(server): reduce frequency of full tool call output being loaded into memory from db (pingdotgg#8988)
* feat(web): add pull request list filters (pingdotgg#8809)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* feat(web): search individual settings by detail (pingdotgg#8831)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* feat(client): render viewed images in work logs (pingdotgg#8936)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(client): use package import for markdown image helpers (pingdotgg#9010)
* test: remove static presentation snapshots (pingdotgg#9008)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
* perf(server): bound snapshot activity payload memory (pingdotgg#9000)
* perf(server): cut idle CPU use and stop provider event leaks (pingdotgg#8187)
* perf(server): scan only appended transcript bytes for usage summaries (pingdotgg#9024)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Theo Browne <me@t3.gg>
* perf(server): cut chatty tool-update frames by 90% (pingdotgg#8368)
* fix(server): settle threads server-side (pingdotgg#8600)
* fix(clients): dedupe skills in composer menus (pingdotgg#8043)
* fix(server): stop OpenCode child sessions (pingdotgg#9005)
* perf(web): defer pull request line stats until visible (pingdotgg#6471)
Co-authored-by: Theo Browne <me@t3.gg>
* perf(server): skip full-message reads while streaming (pingdotgg#9032)
* perf(client-runtime): halve server config bootstrap traffic (pingdotgg#8367)
Reuse one server config subscription for session bootstrap and live updates.
Preserve environment theme opt-in, replay, deletion, slow subscriber recovery, and config stream failure handling.
Co-authored-by: Adamulek123 <adam.bogucki2018@gmail.com>
* fix(web): align un-settle banner action (pingdotgg#9033)
* fix(web): block type-to-focus behind open dialogs (pingdotgg#8139)
Co-authored-by: Simone <185146821+Lucenx9@users.noreply.github.com>
* feat(shortcuts): copy active thread reference (pingdotgg#8994)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(mobile): keep thread scroll bounds current after animations (pingdotgg#9013)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(server): cache project favicon resolution (pingdotgg#9080)
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
* feat(claude): add Claude Fable 5.1 model (pingdotgg#9078)
* fix(preview): restore recording and macOS rendering after Electron 43 (pingdotgg#9001)
Co-authored-by: Guillermo Casanova <guillermo.casanova.b@gmail.com>
* feat(desktop): add configurable quit shortcut confirmation (pingdotgg#9076)
* feat(web): open project settings from thread menus (pingdotgg#8925)
* fix(chat): reuse one row for live activity (pingdotgg#9062)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* feat(models): discover Claude models from remote manifest (pingdotgg#9084)
* Revert "fix(chat): reuse one row for live activity" (pingdotgg#9096)
* fix(web): sync sidebar PR state from open panel (pingdotgg#9092)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: maria <254055478+maria-rcks@users.noreply.github.com>
* fix(web): changing projects no longer creates a draft (pingdotgg#9097)
* fix(web): keep theme placeholder text dimmer than entered text (pingdotgg#9104)
* fix(web): keep the selected environment when changing projects (pingdotgg#9102)
* docs(plans): t3o-31 upstream sync to v0.0.38
* fix(board): clear the ten pre-existing typecheck errors before the upstream sync (t3o-31 P0)
Two test fakes failed with a bare Error in the Effect failure channel, a
closure-assigned let narrowed to never, and a single-override pill read
overriddenRows[0] under noUncheckedIndexedAccess. None changed behaviour;
they were masked because the recursive typecheck never reached apps/server.
* fix(sync): the three type errors and two test failures the v0.0.38 merge caused
- BoardModelRow reads planModeEnabled from client settings, as the composer does.
- findBranchPullRequest resolves the default branch for upstream's widened PR
cache key instead of passing null.
- The orphaned-session integration test mocks the supervisor reactor that the
startup seam yields (new inventory row).
- The projection resume test seeds board projector watermarks into
boards.projection_state, where t3o-26 reads them, and asserts over the union.
- searchSettings("work") now also matches upstream's worktree/network items.
* refactor(board): native title attributes become BoardHint tooltips
Upstream's new no-native-title-tooltip rule flags every intrinsic-element
title= in the board (61 sites). BoardHint wraps the styled Tooltip primitive
and renders its child as the trigger, so layout is unchanged; a nullish label
renders the child alone.
* docs(seams): record the v0.0.38 sync (t3o-31)
Merge-log row, the decisions taken (plans stay tracked, upstream's settlement
reactor accepted after audit, projector-enumeration policy, launcher protocol
note), an unmarked-edits debt table for the next sync, a marker census, the
three new upstream workflows to disable, and the runbook's per-package
verification notes.
* review(t3o-31): announce the board's status dots, and order the merge log
Round-1 nitpicks: a bare span's aria-label is not announced, so the working,
running and awaiting dots now carry role="img"; the v0.0.38 merge-log row
moves below the two 2026-08-09 rows so the table reads chronologically.
---------
Co-authored-by: Theo Browne <me@t3.gg>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Dara Adedeji <76637177+SunkenInTime@users.noreply.github.com>
Co-authored-by: shivam <91240327+shivamhwp@users.noreply.github.com>
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: abcdmku <63693423+abcdmku@users.noreply.github.com>
Co-authored-by: Guilherme Barros <gbarros1095@gmail.com>
Co-authored-by: Rishet11 <154429365+Rishet11@users.noreply.github.com>
Co-authored-by: Alex <me@pixp.cc>
Co-authored-by: maria <254055478+maria-rcks@users.noreply.github.com>
Co-authored-by: Naveed Iqbal <naveediqbal949@gmail.com>
Co-authored-by: Ishaan Kothari <ishaanko.mail@gmail.com>
Co-authored-by: Exotic <118054752+extoci@users.noreply.github.com>
Co-authored-by: Utkarsh Patil <73941998+UtkarshUsername@users.noreply.github.com>
Co-authored-by: Bilal Bakr <62337003+Bil0000@users.noreply.github.com>
Co-authored-by: Rakshith Bhat <88523594+RakshithBhat03@users.noreply.github.com>
Co-authored-by: Simone <lucenz@proton.me>
Co-authored-by: Simone <185146821+Lucenx9@users.noreply.github.com>
Co-authored-by: Tristan Knight <admin@snappeh.com>
Co-authored-by: Wout Stiens <71498452+StiensWout@users.noreply.github.com>
Co-authored-by: Pavlo Trinko <paul.trinko95@gmail.com>
Co-authored-by: codex <codex@users.noreply.github.com>
Co-authored-by: Julius Marminge <julius0216@outlook.com>
Co-authored-by: Rodrigo Brechard <rodrigobrechard@gmail.com>
Co-authored-by: Rodrigo Brechard <rodrigo@clubtidy.fr>
Co-authored-by: Adamulek123 <adam.bogucki2018@gmail.com>
Co-authored-by: spiky02plateau <155588579+spiky02plateau@users.noreply.github.com>
Co-authored-by: Carlos Jimenez <cjimenez@r21digital.com>
Co-authored-by: Mark Griffin <mrmg@deflexion.net>
Co-authored-by: MacKinley Smith <smithmackinley@gmail.com>
Co-authored-by: oliver <97427849+flamboh@users.noreply.github.com>
Co-authored-by: mweinbach <maxweinbach5@gmail.com>
Co-authored-by: Lars Nieuwenhuis <35393046+lnieuwenhuis@users.noreply.github.com>
Co-authored-by: Mohtasham Murshid <154406804+MohtashamMurshid@users.noreply.github.com>
Co-authored-by: Dara Adedeji <daraaded@amazon.com>
Co-authored-by: Dara Adedeji <daraadedeji07@gmail.com>
Co-authored-by: Ahmed Besic <ahmed-besic@users.noreply.github.com>
Co-authored-by: Michael Brown <michaeltbrown.mtb@gmail.com>
Co-authored-by: PC <pc@localhost>
Co-authored-by: 1xpixi <157762409+1xpixi@users.noreply.github.com>
Co-authored-by: Josh <gitlucky@pipelab.org>
Co-authored-by: Tradi3 <56069280+krutftw@users.noreply.github.com>
Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
Co-authored-by: Ivan Malison <IvanMalison@gmail.com>
Co-authored-by: Yash Singh <saiansh2525@gmail.com>
Co-authored-by: Gianmarco <gianmarcosimone89@gmail.com>
Co-authored-by: Julius Marminge <julius@mac.lan>
Co-authored-by: Illia Panasenko <hello@ipanasenko.me>
Co-authored-by: Matheson Steplock <ikifar2012@users.noreply.github.com>
Co-authored-by: Anirudh Coontoor <anirudh@gosupernova.live>
Co-authored-by: Nick Anisimov <n.anisimov.23@gmail.com>
Co-authored-by: Muhammad Waleed <114993336+walid-baharwal@users.noreply.github.com>
Co-authored-by: Ryan Hughes <ryan@heyoodle.com>
Co-authored-by: Vitaly Iegorov <vitalyiegorov@gmail.com>
Co-authored-by: Ahmed Besic <ahmed.besic2000@gmail.com>
Co-authored-by: maria <maria@kuuro.net>
Co-authored-by: Matthew Feroz <136640686+MatthewFeroz@users.noreply.github.com>
Co-authored-by: Julius Marminge <jmarminge@gmail.com>
Co-authored-by: Aditya Garud <153842990+yashranaway@users.noreply.github.com>
Co-authored-by: Yukun Shan <92423096+nateEc@users.noreply.github.com>
Co-authored-by: Will Sheldon <will@autimo.com>
Co-authored-by: mic <85814106+q1@users.noreply.github.com>
Co-authored-by: Guillermo Casanova <guillermo.casanova.b@gmail.com>
juliusmarminge added a commit that referenced this pull request Sep 2, 2026
Round-16 rebase onto main (5 commits, headlined by #8236 file
attachments in the client). Main's upload-aware send path — capability
probes, upload await/retry gating, uploaded-ref turn attachments with
dataUrl fallback, draft release on success — is woven into the v2
dispatch flow, timeline user rows render file attachments as download
links with the ChatView download handler, and the provider settings
editor cleanup keeps the branch's environment-field rows. The codex
feedback client flow stays unported, replay testkit configs gained
main's environmentThemesDir, and the rpc/settings/docs unions carry
both sides.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XXL1,000+ changed lines (additions + deletions).vouch:trustedPR 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

@t3dotgg
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat(web): attach PDFs, ZIPs, and other files to a turn - #8236

Merged
t3dotgg merged 29 commits into
mainfrom
t3code/file-attachments-web
Aug 29, 2026
Merged

feat(web): attach PDFs, ZIPs, and other files to a turn#8236
t3dotgg merged 29 commits into
mainfrom
t3code/file-attachments-web

Conversation

@t3dotgg

@t3dotggt3dotgg commented Aug 25, 2026

Copy link
Copy Markdown
Member

The file upload APIs and tolerant attachment contracts from #8235 are now on main. This PR adds the web client for them.

The composer accepts PDFs, ZIPs, and other files up to the server's advertised limit through the paperclip button or paste. Uploads start while the user types, survive draft and stash moves, and render as rows that download with the original filename. Unknown attachment types render as inert rows instead of crashing the thread.

One shared upload flow in packages/client-runtime owns verification, transfer, release, and size limits. Draft discard, project delete, stash, file removal, and send cleanup all use that flow. Interrupted uploads return as "Attach again" markers instead of disappearing.

Release warning: clients with the old image-only attachment contract cannot decode threads that contain file attachments. The compatibility work in #8235 makes the merged server contract tolerant and keeps existing mobile code from treating files as images. Hold the web release until a compatible mobile build is available. #8237 adds mobile file support.

Original work by Theo Browne with Claude Fable 5 in the Claude Code harness. Modernized by GPT-5.6 Sol in the Codex harness.


Note

Medium Risk
Touches the turn send/upload pipeline and draft persistence; threads with file attachments require a tolerant client contract, so release coordination with older mobile builds matters.

Overview
Adds generic file attachments to the chat composer (paperclip, paste, drag) alongside images, with images and files sharing the per-turn attachment cap and server-advertised size limits.

Send and upload path:ChatView snapshots images and files together, runs shared upload/capability checks before and after upload, builds optimistic file rows, and wires timeline on-demand downloads via signed asset URLs. Annotation screenshots respect the combined attachment limit so prompts do not claim crops that were not sent.

Composer UX:ChatComposer stages file rows (upload progress, retry, “attach again” after interrupted uploads), blocks send when capabilities or limits fail, and extends stash restore/save to persisted file uploads with environment checks and expiry verification.

Persistence:composerDraftStore persists file metadata (upload ids or needs-reattach markers), enforces combined limits, and handles moves across threads/environments. Plan follow-up actions hide while any composer attachment is staged (shouldShowPlanFollowUpPrompt).

Timeline: User messages render non-image attachments as download links or inert rows for unknown types. Project/sidebar draft counts include files; project delete passes thread refs when releasing draft uploads.

Reviewed by Cursor Bugbot for commit 129f2ad. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Add PDF, ZIP, and generic file attachment support to chat turns

  • Extends the chat composer to support generic file attachments alongside images, including selection via paste or paperclip button, progress tracking, and retry controls
  • Updates composerDraftStore, attachmentUploadQueue, and prompt stash store to persist file metadata, deduplicate attachments, manage upload lifecycles, and handle cross-environment moves
  • Adds server capability checks to enforce staging limits and reject non-image files on servers that lack upload support
  • Renders received file attachments in the timeline as downloadable links or buttons using generated signed URLs
  • Risk: Non-image attachments now throw an error during send if the server does not support attachment uploads; cross-environment draft moves strip source upload linkage for byte-backed files

Macroscope summarized 129f2ad.

@coderabbitai

coderabbitaiBot commented Aug 25, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 7697ac98-d68b-4b0a-aa8c-fb19042ba35d

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

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

@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:XXL 1,000+ changed lines (additions + deletions). labels Aug 25, 2026
@github-actions

github-actionsBot commented Aug 25, 2026

Copy link
Copy Markdown
Contributor

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

ProviderMetricMain baselineThis PRImpactPR ceiling
CodexTotal thread wire13.3 KiB13.3 KiB−29 B (−0.2%)15.1 KiB
CodexThread snapshot wire6.9 KiB6.9 KiB−6 B (−0.1%)7.3 KiB
CodexLive turn WebSocket wire6.4 KiB6.4 KiB−23 B (−0.3%)7.8 KiB
CodexLive turn WebSocket decoded55.6 KiB55.6 KiB−44 B (−0.1%)66.4 KiB
CodexLive turn messages1110−1 (−9.1%)21
ClaudeTotal thread wire13.3 KiB13.3 KiB−56 B (−0.4%)15.1 KiB
ClaudeThread snapshot wire6.9 KiB6.9 KiB−1 B (−0.0%)7.3 KiB
ClaudeLive turn WebSocket wire6.4 KiB6.4 KiB−55 B (−0.8%)7.8 KiB
ClaudeLive turn WebSocket decoded56.4 KiB56.4 KiB−88 B (−0.2%)66.4 KiB
ClaudeLive turn messages119−2 (−18.2%)21

Baseline: 0e2905e · PR result: 129f2ad · 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: 109.4 KiB
  • Claude decoded thread snapshot: 110.1 KiB

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

@macroscopeappmacroscopeappBot 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.

Reviewed the new/changed Effect-adjacent code (packages/client-runtime/src/state/attachments.ts, apps/web/src/state/attachments.ts, and the web upload-queue call sites) against the service conventions. The new createAttachmentEnvironmentAtoms factory correctly mirrors createAssetEnvironmentAtoms (runtime passed in, no hidden globals, no ManagedRuntime/runPromise outside the existing atom-command boundary), and no service tags/layers were moved or redefined. One predicate convention issue below.

Posted via Macroscope — Effect Service Conventions

Comment threadpackages/client-runtime/src/state/attachments.ts Outdated
Comment threadapps/web/src/lib/attachmentUploadQueue.ts
Comment threaddocs/user/composer.md Outdated
Comment threadapps/web/src/composerDraftStore.ts
@macroscopeapp

macroscopeappBot commented Aug 25, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Not approved

Macroscope's review found this PR not approvable — This change introduces a substantial production workflow for uploading, persisting, transferring, deleting, and downloading user files alongside turns. Its broad runtime surface and server-side file lifecycle warrant human review despite extensive tests and backward-compatible persistence.

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

Comment threadapps/web/src/lib/attachmentUploadQueue.ts Outdated

@macroscopeappmacroscopeappBot 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.

Reviewed the web composer/timeline attachment UI. Two interaction findings on changed lines, both about the new needs-reattach / capacity paths giving the user no working path or feedback.

Posted via Macroscope — UI Consistency

Comment threadapps/web/src/components/chat/ChatComposer.tsx
Comment threadapps/web/src/composerDraftStore.ts
Comment threadapps/web/src/lib/attachmentUploadQueue.ts
Comment threadapps/web/src/composerDraftStore.ts Outdated
Comment threadapps/web/src/composerDraftStore.ts
Comment threadapps/web/src/composerDraftStore.ts Outdated
Comment threadapps/web/src/components/chat/ChatComposer.tsx

@macroscopeappmacroscopeappBot 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.

One finding: the new file-attachment download button in MessagesTimeline renders its filename center-aligned, unlike the visually identical anchor and inert rows next to it.

Posted via Macroscope — UI Consistency

Comment threadapps/web/src/components/chat/MessagesTimeline.tsx Outdated
@t3dotgg
t3dotggforce-pushed the t3code/file-attachments-web branch from c88f3df to 33d67f9CompareAugust 26, 2026 08:58
Comment threadapps/web/src/components/chat/ChatComposer.tsx
Comment threadapps/web/src/components/chat/composerAttachmentFiles.ts
Comment threadapps/web/src/components/chat/ChatComposer.tsx
@t3dotgg
t3dotggforce-pushed the t3code/file-attachments-web branch from 7abf833 to 1dd3cc0CompareAugust 26, 2026 09:29
Comment threadapps/web/src/components/ChatView.tsx
Comment threadapps/web/src/components/chat/ChatComposer.tsx Outdated
Comment threadapps/web/src/hooks/useHandleNewThread.ts

@macroscopeappmacroscopeappBot 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.

One finding on the new send-block wording in ChatComposer. The rest of the attachment UI (file rows, paperclip trigger, stash menu file badge, timeline file rows) reuses the existing primitives and row treatments consistently, and the earlier findings on the timeline download row alignment, the marker re-pick path, and the swallowed paste are resolved.

Posted via Macroscope — UI Consistency

Comment threadapps/web/src/components/chat/ChatComposer.tsx Outdated
Comment threadapps/web/src/components/chat/ChatComposer.tsx
Comment threadapps/web/src/components/ChatView.tsx Outdated

@macroscopeappmacroscopeappBot 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.

One finding: the needs-reattach file row label ignores the canReattachFiles guard that the send-block reason uses, so on a server without file-attachment support (or before the capability arrives) the row tells the user to attach again while no attach control is rendered.

Posted via Macroscope — UI Consistency

Comment threadapps/web/src/components/chat/ChatComposer.tsx
Comment threadapps/web/src/components/chat/ChatComposer.tsx
juliusmarminge added a commit that referenced this pull request Aug 29, 2026
PRs #8437 and #8236 crossed: one made stashShortcutLabel a required
ComposerStashMenu prop, the other added a test case without it, so
main fails web typecheck.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 29, 2026
Round-16 rebase onto main (5 commits, headlined by #8236 file
attachments in the client). Main's upload-aware send path — capability
probes, upload await/retry gating, uploaded-ref turn attachments with
dataUrl fallback, draft release on success — is woven into the v2
dispatch flow, timeline user rows render file attachments as download
links with the ChatView download handler, and the provider settings
editor cleanup keeps the branch's environment-field rows. The codex
feedback client flow stays unported, replay testkit configs gained
main's environmentThemesDir, and the rpc/settings/docs unions carry
both sides.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
github-actionsBot added a commit to omarcresp/t3code-flake that referenced this pull request Aug 29, 2026
## What's Changed
* feat(web): attach PDFs, ZIPs, and other files to a turn by @t3dotgg in pingdotgg/t3code#8236
* feat(web): keybinding settings as settings rows by @StiensWout in pingdotgg/t3code#8532
* feat: let an environment publish themes as a file by @ryanrhughes in pingdotgg/t3code#8569
* fix(web): clean up provider settings list and editor by @StiensWout in pingdotgg/t3code#8504
* fix(web): keep project picker popup inside the sidebar by @SunkenInTime in pingdotgg/t3code#8627
* fix(mobile): prevent header overflow and back-button artifacts by @juliusmarminge in pingdotgg/t3code#8624
## New Contributors
* @ryanrhughes made their first contribution in pingdotgg/t3code#8569
**Full Changelog**: pingdotgg/t3code@v0.0.37-nightly.20260829.1218...v0.0.37-nightly.20260829.1219
Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.37-nightly.20260829.1219
netpro2k added a commit to netpro2k/t3code that referenced this pull request Aug 29, 2026
Intent:
Expose the generic-file backend shipped in v0.0.36 through the web and desktop composer while following the official client implementation closely enough for its upstream PR to replace this patch cleanly.
Behavior:
- Accept images and generic files through the paperclip button, paste, and drag-and-drop; share the eight-attachment limit and use the server-advertised generic-file limit, currently 50 MB.
- Upload while the user composes, show progress/retry/reattach states, and render sent files as signed downloads with their original names.
- Preserve file drafts and stashes as server upload references or explicit needs-reattach markers instead of storing generic-file bytes in localStorage.
- Keep upload verification, cleanup, retry, environment moves, and unknown attachment rendering explicit.
- Show file names in the current mobile feed and include attachment names in transcript bootstrap context.
Design constraints:
- Backport official upstream PR pingdotgg#8236 at 129f2ad, rebased onto v0.0.36, rather than maintaining a parallel client upload architecture.
- Use packages/client-runtime for the shared upload lifecycle and clamp file sizes to the server capability and contract maximum.
- Require direct-upload support for generic files. Do not retain the fork inline-file protocol or serialize generic-file bytes into drafts and stashes.
- Upload local workspace drops like the official client; do not retain the competing desktop-only drop-to-mention behavior.
- Keep images on their established compression and compatibility path.
Integration:
- Shared client-runtime upload lifecycle and web environment atoms.
- Web composer, drafts, prompt stashes, upload queue, message timeline, signed asset downloads, sidebar counts, project cleanup, and user documentation.
- Minimal current mobile feed visibility and transcript bootstrap naming remain fork-only until the official follow-up covers them.
Verification:
- Official attachment-focused web and client-runtime tests pass (7 files, 196 tests).
- Targeted client-runtime, web, and mobile typechecks pass; the existing client-runtime Effect diagnostic remains advisory.
Rebase notes:
- Upstream PR pingdotgg#8236 should supersede the web/client-runtime implementation wholesale once merged.
- Upstream PR pingdotgg#8237 should supersede the temporary mobile filename row with signed mobile downloads and full mobile file picking/sharing.
- Recheck only the transcript-bootstrap filename summary after both PRs land.
- The v0.0.36 stashShortcutLabel test fixture is the only adaptation to the rebased official PR tree.
longtngo added a commit to longtngo/t3code that referenced this pull request Aug 29, 2026
Range f6f2be3..053affb, v0.0.36. 411 upstream files, 632 fork files,
81 touched by both, 19 conflicted.
Competing implementations resolved toward the fork's superset:
- Claude context usage (pingdotgg#8610). Upstream deleted `queryCurrentContextUsage` and
`normalizeClaudeContextUsageApiSnapshot` outright. `getContextUsage` is the ONLY
source of the compaction facts (`autocompactSource`, `autoCompactThreshold`,
`isAutoCompactEnabled`) the Vitals gauge's compaction note and marker render from,
and they travel on the wire contract, so the call is kept. Upstream's
`latestAssistantUsage` tracking and its post-compaction guard are adopted BELOW it
as the next-best fallback: `contextUsageSnapshot ?? latestAssistantSnapshot ?? ...`.
Upstream removed `getContextUsage` from `ClaudeQueryRuntime`, the
`SDKControlGetContextUsageResponse` import and the `Option` import outside every
conflict marker; all three restored.
- Provider settings editor (pingdotgg#8472). Upstream's `useEffect` + `lastPublishedEnvironmentRef`
re-seed is the superset of the fork's render-phase `seededRef` (8fe3190, one of four
silent-data-loss fixes). The merge had kept BOTH mechanisms; collapsed to upstream's,
with the fork's half-typed-row null guard on the publish path. `environmentKey` deleted
with the code it served.
- Sidebar project combobox (pingdotgg#5931). Upstream replaced the menu-based project filter,
whose `MenuRadioItem` carried the fork's project-actions button. Rebuilt on upstream's
`ComboboxItem` with the ellipsis button grafted back (invariant 6). The dead `Menu*`
import is gone.
- Composer attachments (pingdotgg#8236). Upstream's `addComposerAttachments` pipeline adopted; the
fork's drop split (image -> attach, other -> absolute path with upload fallback) kept
and repointed at the new handler.
- Mid-turn steer. Upstream's `steeringTurnState` branch rejected again (invariant 5); its
side of that hunk also opened an `if` whose brace lives below the hunk.
- Thread deletion drain (pingdotgg#8226). Upstream replaced `drain` with `drainThrough(sequence)`;
the fork's test retargeted. Its new drain test observed `ProviderService.stopSession`,
which this reactor never calls (it dispatches `thread.session.stop`), so it now counts
engine dispatches and provides the two services the fork's reactor needs.
Three defects the resolutions introduced, each caught by a check that is not the suite:
- `shouldShowBranchMismatchBanner` was resurrected into two import lists by resolving
them toward upstream. Fork commit cfdf255 replaced that function; the import had no
definition. Found by the RESURRECTED sweep.
- `scriptPath` ended up declared twice in CodexCollabRuntime.integration.test.ts: `both`
reintroduced upstream's fixture-dir copy that the fork deliberately moved to a temp dir.
Found by the RESURRECTED sweep.
- `setProjectScopeMenuOpen` survived in the fork's `handleProjectActions` after upstream
replaced that state with a reducer, outside every marker. Found by typecheck.
Upstream regressions of fork fixes, kept fixed:
- Raw NUL bytes returned to ChatComposer.tsx. A raw NUL renders as nothing in grep and
aborts BSD sed mid-file; the fork had converted all six to `\0` escapes and carries a
guard test for it. The guard failed, and the offending line reads as space-separated in
any normal diff. Converted back to escapes.
- `defaultTheme` / `defaultThemeSetAt` (pingdotgg#8569) are absent from `ServerSettingsPatch`; the
fork's patch-parity guard caught it. They are owned by `t3 theme set`, which rewrites
settings.json directly and which clients only read, so they are recorded as deliberately
unpatchable rather than mirrored.
- The fork's mobile held-messages strip used `dark:` variants that upstream's new Uniwind
theme rule (pingdotgg#7327) forbids; moved to the `text-foreground-muted` semantic token rather
than added to the rule's allowlist.
Invariants: all re-probed against the merged tree. 1 (49 migrations, ids unique and
monotonic, max 50, 34 burned), 2 (the fork-only @effect/platform-node patch survived the
Expo 57 rewrite of patchedDependencies, is pinned, resolved and applied on disk; effect
stays at beta.103 so no re-pin), 3, 4, 4b (4 `isSendBlocked=`), 5, 5b, 5c, 6, 7, 8, 9, 10,
11 all hold.
Sweeps: resurrected 3, dropped 21, fork-loss 45, both-kept 0. Every entry named: the 3
resurrected and the fork-loss in ProviderInstanceCard / ChatComposer / Sidebar are the
decisions above; the OpenCode fork-loss is 11 comment lines whose guard upstream extracted
into `deleteContextIfCurrent` (the rationale is restored on the helper); pnpm-lock churn is
the install. Test declarations 18,691 -> 19,081; one file lost one, upstream's own pingdotgg#8484.
Gate: pnpm run verify green, exit 0 read from the captured log line. 14 blocks,
10,744 passed, 20 skipped, 0 failures.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
netpro2k added a commit to netpro2k/t3code that referenced this pull request Aug 29, 2026
Intent:
Expose the generic-file backend shipped in v0.0.36 through the web and desktop composer while following the official client implementation closely enough for its upstream PR to replace this patch cleanly.
Behavior:
- Accept images and generic files through the paperclip button, paste, and drag-and-drop; share the eight-attachment limit and use the server-advertised generic-file limit, currently 50 MB.
- Upload while the user composes, show progress/retry/reattach states, and render sent files as signed downloads with their original names.
- Preserve file drafts and stashes as server upload references or explicit needs-reattach markers instead of storing generic-file bytes in localStorage.
- Keep upload verification, cleanup, retry, environment moves, and unknown attachment rendering explicit.
- Show file names in the current mobile feed and include attachment names in transcript bootstrap context.
Design constraints:
- Backport official upstream PR pingdotgg#8236 at 129f2ad, rebased onto v0.0.36, rather than maintaining a parallel client upload architecture.
- Use packages/client-runtime for the shared upload lifecycle and clamp file sizes to the server capability and contract maximum.
- Require direct-upload support for generic files. Do not retain the fork inline-file protocol or serialize generic-file bytes into drafts and stashes.
- Upload local workspace drops like the official client; do not retain the competing desktop-only drop-to-mention behavior.
- Keep images on their established compression and compatibility path.
Integration:
- Shared client-runtime upload lifecycle and web environment atoms.
- Web composer, drafts, prompt stashes, upload queue, message timeline, signed asset downloads, sidebar counts, project cleanup, and user documentation.
- Minimal current mobile feed visibility and transcript bootstrap naming remain fork-only until the official follow-up covers them.
Verification:
- Official attachment-focused web and client-runtime tests pass (7 files, 196 tests).
- Targeted client-runtime, web, and mobile typechecks pass; the existing client-runtime Effect diagnostic remains advisory.
Rebase notes:
- Upstream PR pingdotgg#8236 should supersede the web/client-runtime implementation wholesale once merged.
- Upstream PR pingdotgg#8237 should supersede the temporary mobile filename row with signed mobile downloads and full mobile file picking/sharing.
- Recheck only the transcript-bootstrap filename summary after both PRs land.
- The v0.0.36 stashShortcutLabel test fixture is the only adaptation to the rebased official PR tree.
juliusmarminge added a commit that referenced this pull request Aug 30, 2026
Round-16 rebase onto main (5 commits, headlined by #8236 file
attachments in the client). Main's upload-aware send path — capability
probes, upload await/retry gating, uploaded-ref turn attachments with
dataUrl fallback, draft release on success — is woven into the v2
dispatch flow, timeline user rows render file attachments as download
links with the ChatView download handler, and the provider settings
editor cleanup keeps the branch's environment-field rows. The codex
feedback client flow stays unported, replay testkit configs gained
main's environmentThemesDir, and the rpc/settings/docs unions carry
both sides.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
bcotrim pushed a commit to bcotrim/mognet that referenced this pull request Aug 30, 2026
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
(cherry picked from commit bcb855a)
bcotrim pushed a commit to bcotrim/mognet that referenced this pull request Aug 30, 2026
PRs pingdotgg#8437 and pingdotgg#8236 crossed: one made stashShortcutLabel a required
ComposerStashMenu prop, the other added a test case without it, so
main fails web typecheck.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
(cherry picked from commit d22709f)
juliusmarminge added a commit that referenced this pull request Aug 30, 2026
Round-16 rebase onto main (5 commits, headlined by #8236 file
attachments in the client). Main's upload-aware send path — capability
probes, upload await/retry gating, uploaded-ref turn attachments with
dataUrl fallback, draft release on success — is woven into the v2
dispatch flow, timeline user rows render file attachments as download
links with the ChatView download handler, and the provider settings
editor cleanup keeps the branch's environment-field rows. The codex
feedback client flow stays unported, replay testkit configs gained
main's environmentThemesDir, and the rpc/settings/docs unions carry
both sides.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
imsherrill pushed a commit to comprehensiveio/compadre that referenced this pull request Aug 31, 2026
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
(cherry picked from commit bcb855a)
imsherrill added a commit to comprehensiveio/compadre that referenced this pull request Aug 31, 2026
…) (#2)
(cherry picked from commit bcb855a)
Co-authored-by: Theo Browne <me@t3.gg>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
netpro2k added a commit to netpro2k/t3code that referenced this pull request Aug 31, 2026
Intent:
Keep transcript bootstrap context aware of generic file attachments now that upstream web and mobile clients support their full upload and rendering lifecycle.
Behavior:
- Count every message attachment in transcript bootstrap context, not only images.
- Include up to three attachment names plus an additional-count suffix.
- Preserve image/images wording when every attachment is an image; otherwise use file/files.
Design constraints:
- Rely entirely on upstream attachment upload, draft, stash, rendering, download, and mobile behavior.
- Keep this patch limited to the text supplied to transcript bootstrap.
Integration:
- Web transcript bootstrap summary only. No client upload, server, contract, mobile, or storage changes.
Verification:
- Upstream PRs pingdotgg#8236 and pingdotgg#8237 were audited as superseding the former attachment backport except for this summary behavior.
- Targeted web verification is rerun after the complete patch stack rebases.
Rebase notes:
- Drop this patch only when upstream transcript bootstrap includes generic attachment names rather than filtering to images.
github-actionsBot added a commit to omarcresp/t3code-flake that referenced this pull request Aug 31, 2026
## What's Changed
* Remove Messages Glass Lab experiment by @juliusmarminge in pingdotgg/t3code#8599
* Require human review for pull requests changing product defaults by @juliusmarminge in pingdotgg/t3code#8603
* fix(codex): avoid quadratic app-server input buffering by @juliusmarminge in pingdotgg/t3code#8605
* fix(mobile): stabilize iOS header item transitions by @juliusmarminge in pingdotgg/t3code#8607
* chore(mobile): upgrade to Expo SDK 57 by @juliusmarminge in pingdotgg/t3code#8609
* fix(mobile): harden native header toolbar items by @juliusmarminge in pingdotgg/t3code#8611
* fix(server): stop querying Claude context usage after turns by @t3dotgg in pingdotgg/t3code#8610
* chore: vouch ryanrhughes by @t3dotgg in pingdotgg/t3code#8613
* feat(web): attach PDFs, ZIPs, and other files to a turn by @t3dotgg in pingdotgg/t3code#8236
* feat(web): keybinding settings as settings rows by @StiensWout in pingdotgg/t3code#8532
* feat: let an environment publish themes as a file by @ryanrhughes in pingdotgg/t3code#8569
* fix(web): clean up provider settings list and editor by @StiensWout in pingdotgg/t3code#8504
* fix(web): keep project picker popup inside the sidebar by @SunkenInTime in pingdotgg/t3code#8627
* fix(mobile): prevent header overflow and back-button artifacts by @juliusmarminge in pingdotgg/t3code#8624
* fix(server): retry automatic thread title generation by @Bil0000 in pingdotgg/t3code#8087
* fix(client-runtime): refresh edited pull request comments by @Bil0000 in pingdotgg/t3code#8094
* fix(web): four composer spacing defects by @Bil0000 in pingdotgg/t3code#8090
* perf(desktop): skip duplicate browser updates by @Bil0000 in pingdotgg/t3code#8018
* fix(web): render nested markdown images correctly by @flamboh in pingdotgg/t3code#8501
* fix(web): unify activity logs and composer banners by @juliusmarminge in pingdotgg/t3code#8693
* fix(mobile): reduce dev-client reload and Metro startup cost by @juliusmarminge in pingdotgg/t3code#8694
* revert(web): restore previous composer banners by @t3dotgg in pingdotgg/t3code#8733
* test(web): remove tests for unreachable helpers by @t3-code[bot] in pingdotgg/t3code#8738
* feat(mobile): update tool summaries and chat transitions by @juliusmarminge in pingdotgg/t3code#8793
* feat(web): play video attachments in chat by @Bil0000 in pingdotgg/t3code#8688
* fix(web,mobile): snooze menu no longer offers the same wake time twice by @vitalyiegorov in pingdotgg/t3code#8741
* fix(grok): allow model changes in existing threads by @ahmed-besic in pingdotgg/t3code#8392
* feat(mobile): pick, share, and receive files in threads by @t3dotgg in pingdotgg/t3code#8237
* fix(web): reduce title bar scroll fade height by @maria-rcks in pingdotgg/t3code#8799
* fix(windows): strip quotes from repaired PATH by @UtkarshUsername in pingdotgg/t3code#8746
* fix(web): open agent images in expanded preview by @maria-rcks in pingdotgg/t3code#8807
* fix(git): follow repository instructions in generated source control text by @maria-rcks in pingdotgg/t3code#8804
* fix(server): stop overpricing cached Claude tokens by @SunkenInTime in pingdotgg/t3code#8806
* fix(web): keep image preview above sidebar control by @maria-rcks in pingdotgg/t3code#8811
* fix(web): keep right panel synced with agent edits by @maria-rcks in pingdotgg/t3code#8803
* fix(web,mobile): render Codex citations and artifact templates by @Yash-Singh1 in pingdotgg/t3code#8584
* chore: add Windows setup script to t3.json by @UtkarshUsername in pingdotgg/t3code#8814
* fix(web): fold interim turn responses by @maria-rcks in pingdotgg/t3code#8828
* fix(web): use circle alert for failed tool calls by @maria-rcks in pingdotgg/t3code#8840
* feat(mobile): add offline iPhone voice input by @t3dotgg in pingdotgg/t3code#8614
* fix(web): prevent pull request metadata overlap by @MatthewFeroz in pingdotgg/t3code#8790
## New Contributors
* @ryanrhughes made their first contribution in pingdotgg/t3code#8569
* @ahmed-besic made their first contribution in pingdotgg/t3code#8392
* @MatthewFeroz made their first contribution in pingdotgg/t3code#8790
**Full Changelog**: pingdotgg/t3code@v0.0.36...v0.0.37
Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.37
amitbet pushed a commit to amitbet/a2code that referenced this pull request Sep 1, 2026
Upstream shipped its own arbitrary file attachments (pingdotgg#8235/pingdotgg#8236/pingdotgg#8237), a
strict superset of the fork's, so that divergence is retired rather than
re-applied. Upstream also reverted its turn-plan chips, restructured provider
settings into list+editor, made the project picker a searchable combobox, and
replaced the mobile CSS-variable theme hook with useUniwindTheme.
Fork features preserved: thread forking, queued-prompt steering, in-chat find,
answered user-input rows, machine-scoped environments, provider health-check
cache, provider "Default traits", live quota meter, thread export/pinning,
payload hot-update channel, and the build-only CI surface.
See FORK_NOTES.md for the per-file migration notes.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Sep 1, 2026
Round-16 rebase onto main (5 commits, headlined by #8236 file
attachments in the client). Main's upload-aware send path — capability
probes, upload await/retry gating, uploaded-ref turn attachments with
dataUrl fallback, draft release on success — is woven into the v2
dispatch flow, timeline user rows render file attachments as download
links with the ChatView download handler, and the provider settings
editor cleanup keeps the branch's environment-field rows. The codex
feedback client flow stays unported, replay testkit configs gained
main's environmentThemesDir, and the rpc/settings/docs unions carry
both sides.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Coriou added a commit to Coriou/txcode that referenced this pull request Sep 1, 2026
Upstream tip (bcb855a, pingdotgg#8236) rewrote the third render's entries and
dropped the required stashShortcutLabel prop, leaving upstream's own web
typecheck red. Completed the fixture; candidate for an upstream report.
juliusmarminge added a commit that referenced this pull request Sep 2, 2026
Round-16 rebase onto main (5 commits, headlined by #8236 file
attachments in the client). Main's upload-aware send path — capability
probes, upload await/retry gating, uploaded-ref turn attachments with
dataUrl fallback, draft release on success — is woven into the v2
dispatch flow, timeline user rows render file attachments as download
links with the ChatView download handler, and the provider settings
editor cleanup keeps the branch's environment-field rows. The codex
feedback client flow stays unported, replay testkit configs gained
main's environmentThemesDir, and the rpc/settings/docs unions carry
both sides.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
brentkelly added a commit to brentkelly/t3code-orchestrator that referenced this pull request Sep 2, 2026
* feat(analytics): threads and turns now know which client started them (pingdotgg#7774)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(web): stop marking mixed tool runs as failed (pingdotgg#7893)
* fix(web): command-click spaced folder links (pingdotgg#6439)
Co-authored-by: shivam <91240327+shivamhwp@users.noreply.github.com>
* fix(chat): stop pushing follow-up messages to the top (pingdotgg#7897)
* test(desktop): remove redundant release note assertion (pingdotgg#7873)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
* fix(web): handle wide ordered-list marker edge cases (pingdotgg#7856)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(ssh): restore user PATH for remote servers (pingdotgg#7213)
* fix(desktop): keep tailscale spawn defects from breaking advertised endpoints (pingdotgg#7116)
* fix(web): keep Codex service tier labels readable (pingdotgg#4503)
* fix: render workspace images in chat markdown (pingdotgg#6433)
* fix(clients): keep opening responses visible after turns settle (pingdotgg#7723)
* feat(web): add appearance contrast control (pingdotgg#7906)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: maria <254055478+maria-rcks@users.noreply.github.com>
* fix(server): stop completed Codex threads from staying stuck on working (pingdotgg#7937)
* fix(mobile): preserve markdown image dimensions (pingdotgg#7940)
* fix(web): remove duplicate provider update progress (pingdotgg#7761)
* fix(server): fall back to the remote default branch instead of assuming main (pingdotgg#7078)
* fix(web): give sidebar project menu rows the same side padding as other menus (pingdotgg#7913)
* fix(clients): reconnect after credentials fail during remote server updates (pingdotgg#7953)
* feat(codex): submit thread feedback to OpenAI (pingdotgg#7949)
* fix(server): stop kills lingering Claude work (pingdotgg#5891)
* fix(ci): let Macroscope approve pull requests again (pingdotgg#7970)
* fix(clients): move settled pinned threads into the settled section (pingdotgg#7969)
* perf(ci): speed up release builds and Windows packaging (pingdotgg#7975)
* fix(web): stop tool calls from leaving a blank page in threads (pingdotgg#7971)
* fix(web): stop recovered tool failures from marking work logs red (pingdotgg#7999)
* fix(mobile): isolate markdown image requests (pingdotgg#7942)
* feat(web): redesign skills in `$` menu and in `/` menu (pingdotgg#8009)
* fix(web): restore right panel toggle clicks after closing on desktop (pingdotgg#8016)
* fix(web): keep server update banners flush with the composer (pingdotgg#8000)
* perf(web): reuse work log rows during streaming (pingdotgg#8006)
* fix(web): keep provider badge legible in dark themes (pingdotgg#7968)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: maria <254055478+maria-rcks@users.noreply.github.com>
* fix(web): treat configured urls with uppercase schemes as secure (pingdotgg#8005)
Co-authored-by: Simone <185146821+Lucenx9@users.noreply.github.com>
* fix(desktop): keep release notes visible while downloading (pingdotgg#6412)
* fix(web): show only providers with usage in usage views (pingdotgg#7563)
* fix(web): prevent expanded tool calls from hiding thread content (pingdotgg#8052)
* test(server): remove no-op live activity tests (pingdotgg#8056)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
* fix(web): clarify terminal sidebar grouping (pingdotgg#7967)
* fix(codex): show app access approval prompts (pingdotgg#8058)
* feat(web): upload image attachments before sending (pingdotgg#8048)
* fix(server): bound OpenCode skill discovery output (pingdotgg#7675)
Co-authored-by: Simone <185146821+Lucenx9@users.noreply.github.com>
* fix(mobile): persist thread shelf collapse state (pingdotgg#5152)
* fix(mobile): restore Android tablet thread controls, clean up header (pingdotgg#5385)
* fix(mobile): land the first thread open above the composer on Android (pingdotgg#5585)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: codex <codex@users.noreply.github.com>
Co-authored-by: Julius Marminge <julius0216@outlook.com>
* fix(server): check out submodules in a new worktree (pingdotgg#7674)
Co-authored-by: Rodrigo Brechard <rodrigo@clubtidy.fr>
* fix(server): preserve merged PR badges after branch deletion (pingdotgg#6216)
* fix(server): return fresh live pull request reads (pingdotgg#6472)
* fix(web): compare client and server versions as semver, not strings (pingdotgg#7579)
* fix(web): stop follow-ups from leaving giant blank space (pingdotgg#8068)
* fix(marketing): stop automatic Vercel deployments on pull requests (pingdotgg#8070)
* chore: vouch repeat contributors (pingdotgg#8071)
* fix(server): keep the authoritative subagent model when snapshots race task_started (pingdotgg#7583)
* fix(server): honor auto-accept edits for the OpenCode provider (pingdotgg#7100)
* fix(server): run the CLI on Node versions without import.meta.main (pingdotgg#7141)
* fix(server): recover from provider interrupt failures (pingdotgg#7412)
* fix(server): recreate a thread's worktree before starting a turn (pingdotgg#7839)
* fix(server): thread delete no longer fails on already-removed worktrees (pingdotgg#8076)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(web): stop update notices showing through the composer (pingdotgg#8083)
* fix(web): detect outdated nightly servers (pingdotgg#8124)
* fix(web): align usage page skeleton layout (pingdotgg#8111)
* fix(web): make terminal links appear clickable only when clickable (pingdotgg#7488)
* fix(web): make Windows file links clickable in chat (pingdotgg#8081)
* fix(web): sort usage models by token count (pingdotgg#8108)
* fix: open agent file links in the file viewer (pingdotgg#8098)
* fix(server): stop routine events from rescanning thread history (pingdotgg#8150)
* fix(deps): stop pnpm installs from changing the lockfile (pingdotgg#8163)
* feat(web): settle and restore threads with a keyboard shortcut (pingdotgg#8089)
* perf(desktop): cut macOS signing calls by 81% (pingdotgg#8093)
* feat: link pull requests to threads (pingdotgg#8160)
* feat(web): safely attach HEIC photos as JPEG images (pingdotgg#8161)
Co-authored-by: mweinbach <maxweinbach5@gmail.com>
* feat(mobile): track device models and OS versions (pingdotgg#8169)
* fix(grok): bound cumulative tool output updates (pingdotgg#7279)
* fix(web): delay thread shortcut hints by 200 ms (pingdotgg#8172)
* fix(server): stop probing Cursor until enabled (pingdotgg#8175)
* docs(release): verify remote updates with database migrations (pingdotgg#8177)
* fix(server): keep provider CLIs available in the macOS service (pingdotgg#8173)
* feat(claude): compact old threads before they burn through usage (pingdotgg#8144)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(client-runtime): retry queries after connection interruption (pingdotgg#8117)
* fix(server): keep previously used providers working after upgrades (pingdotgg#8176)
* feat(desktop): build macOS previews from a PR label (pingdotgg#8182)
* fix(web): thread jump hints no longer stick after a dictation paste (pingdotgg#8189)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(web): keep grouped project renames (pingdotgg#7831)
* feat(web): reveal chat file chips in the system file manager (pingdotgg#7140)
Co-authored-by: Dara Adedeji <daraaded@amazon.com>
Co-authored-by: shivam <91240327+shivamhwp@users.noreply.github.com>
* fix(server): push no longer writes a feature branch's commits to its base branch (pingdotgg#8228)
* chore(deps): bump @clerk/electron to 0.0.37 (pingdotgg#8240)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* feat(server): fetch legacy model classification from a hosted manifest (pingdotgg#8227)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* chore(release): prepare v0.0.34
* fix(desktop): let Clerk UI receive stable auth fixes (pingdotgg#8248)
* fix(app): un-settled threads return to the top of the list (pingdotgg#8231)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* perf(ci): cut about a minute from every release (pingdotgg#8250)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* feat(ci): download macOS preview DMGs without signing in (pingdotgg#8243)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(codex): accept Codex 0.150 multi-agent events (pingdotgg#8346)
* chore(release): prepare v0.0.35
* fix(grok): improve skills, plans, usage, and turn reliability (pingdotgg#8358)
Co-authored-by: Dara Adedeji <daraadedeji07@gmail.com>
Co-authored-by: Ahmed Besic <ahmed-besic@users.noreply.github.com>
Co-authored-by: Michael Brown <michaeltbrown.mtb@gmail.com>
Co-authored-by: Lars Nieuwenhuis <35393046+lnieuwenhuis@users.noreply.github.com>
Co-authored-by: Guilherme Barros <gbarros1095@gmail.com>
Co-authored-by: PC <pc@localhost>
Co-authored-by: 1xpixi <157762409+1xpixi@users.noreply.github.com>
* fix(server): recover stale Codex approval callbacks (pingdotgg#5195)
* test(server): remove duplicate missing worktree test (pingdotgg#8252)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
* fix(server): replay all un-applied events during projection bootstrap (pingdotgg#7538)
Co-authored-by: Theo Browne <me@t3.gg>
* test: remove low-signal test files (pingdotgg#8397)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
* test: prune trivial error and layout tests (pingdotgg#8400)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
* Fix Android adaptive launcher icon (pingdotgg#4332)
Co-authored-by: Yash Singh <saiansh2525@gmail.com>
* feat(web): split provider settings into list and editor (pingdotgg#8380)
* fix(codex): accept Codex 0.150 account plans (pingdotgg#8447)
* fix(tooling): allow ignored-only staged changes (pingdotgg#8468)
* fix(mobile): keep iOS home header stable (pingdotgg#8467)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(web): stop showing red x summaries for ordinary tool failures (pingdotgg#8395)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(mobile): refine Git action toast glass styling (pingdotgg#8399)
* fix(desktop): allow preview automation in agent-created threads (pingdotgg#8483)
* test(web): remove redundant cache key test (pingdotgg#8484)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
* fix(release): move nightly schedule to minute 38
Recent scheduled nightlies have been delayed or skipped.
Move the nightly cron from minute 7 to minute 38. Keep the existing three-hour interval. This tests a different point in each three-hour window without claiming it will fix GitHub schedule delivery.
Authored by GPT-5.6 Sol with the Codex harness.
* fix(web): stabilize the provider settings editor (pingdotgg#8472)
* fix(web): open GitHub pull requests in browser when loading fails (pingdotgg#8507)
* fix(codex): show sub-agent models (pingdotgg#8502)
* feat(analytics): report connected client platforms (pingdotgg#8481)
* feat(server): accept PDF, ZIP, and other file uploads up to 50MB (pingdotgg#8235)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* feat(web): toggle thread pin from the keyboard
Add a mod+shift+p shortcut that pins or unpins the active thread. Ignore the shortcut during terminal focus and when the server does not support thread pinning.
* fix(web): add back button to project settings (pingdotgg#8168)
* refactor(mobile): compile semantic themes for Uniwind (pingdotgg#7327)
Co-authored-by: codex <codex@users.noreply.github.com>
* fix(desktop): Cache Runtime locally on WSL Filesystem, dramatically improving launch times (pingdotgg#5769)
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: Utkarsh Patil <73941998+UtkarshUsername@users.noreply.github.com>
* fix(mobile): show OpenCode model sources in picker (pingdotgg#8573)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(clients): honor project default models in new threads (pingdotgg#6011)
Co-authored-by: Shivam Sharma <91240327+shivamhwp@users.noreply.github.com>
* fix(mobile): show file actions on Android (pingdotgg#8215)
Co-authored-by: Shivam Sharma <91240327+shivamhwp@users.noreply.github.com>
* fix(connect): explain DPoP connection failures (pingdotgg#8351)
Co-authored-by: Julius Marminge <julius0216@outlook.com>
* feat(web): make the sidebar project filter a searchable combobox (pingdotgg#5931)
* fix(server): a draft can retry its first send after a failed bootstrap (pingdotgg#8226)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(desktop): stop hidden previews draining battery (pingdotgg#8567)
* fix(desktop): oauth popups open from the browser preview (pingdotgg#8435)
Co-authored-by: Julius Marminge <julius0216@outlook.com>
* fix(web): keep long task drawers usable on small screens (pingdotgg#8313)
* fix(opencode): handle child approvals, stops, and model catalogs (pingdotgg#8480)
* fix: make thread auto-settling opt-in (pingdotgg#8321)
* fix(web): stop session activity timing test from blocking releases (pingdotgg#8585)
* fix(mobile): show composer menus when starting a task (pingdotgg#8587)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(web): show the configured stash shortcut (pingdotgg#8437)
Co-authored-by: Shivam Sharma <91240327+shivamhwp@users.noreply.github.com>
* feat(web): add toggleable confirmation before unpinning a thread (pingdotgg#7313)
Co-authored-by: Shivam Sharma <91240327+shivamhwp@users.noreply.github.com>
* fix: restore automatic thread settling defaults (pingdotgg#8596)
* fix(mobile): restore composer glass and rounded shadows (pingdotgg#8597)
Co-authored-by: Julius Marminge <julius@mac.lan>
* Remove Messages Glass Lab experiment (pingdotgg#8599)
* chore(release): prepare v0.0.36
* Require human review for pull requests changing product defaults (pingdotgg#8603)
* fix(codex): avoid quadratic app-server input buffering (pingdotgg#8605)
* fix(mobile): stabilize iOS header item transitions (pingdotgg#8607)
Co-authored-by: Julius Marminge <julius@mac.lan>
* chore(mobile): upgrade to Expo SDK 57 (pingdotgg#8609)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(mobile): harden native header toolbar items (pingdotgg#8611)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(server): stop querying Claude context usage after turns (pingdotgg#8610)
* chore: vouch ryanrhughes (pingdotgg#8613)
* feat(web): attach PDFs, ZIPs, and other files to a turn (pingdotgg#8236)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(web): pass stashShortcutLabel in the mixed-attachments stash test
PRs pingdotgg#8437 and pingdotgg#8236 crossed: one made stashShortcutLabel a required
ComposerStashMenu prop, the other added a test case without it, so
main fails web typecheck.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* feat(web): keybinding settings as settings rows (pingdotgg#8532)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Julius Marminge <julius0216@outlook.com>
* feat: let an environment publish themes as a file (pingdotgg#8569)
Co-authored-by: Theo Browne <me@t3.gg>
* fix(web): clean up provider settings list and editor (pingdotgg#8504)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Julius Marminge <julius0216@outlook.com>
* fix(web): keep project picker popup inside the sidebar (pingdotgg#8627)
* fix(mobile): prevent header overflow and back-button artifacts (pingdotgg#8624)
* fix(server): retry automatic thread title generation (pingdotgg#8087)
* fix(client-runtime): refresh edited pull request comments (pingdotgg#8094)
* fix(web): four composer spacing defects (pingdotgg#8090)
* perf(desktop): skip duplicate browser updates (pingdotgg#8018)
Co-authored-by: Julius Marminge <julius0216@outlook.com>
* fix(web): render nested markdown images correctly (pingdotgg#8501)
* fix(web): unify activity logs and composer banners (pingdotgg#8693)
* fix(mobile): reduce dev-client reload and Metro startup cost (pingdotgg#8694)
Co-authored-by: Julius Marminge <julius@mac.lan>
* revert(web): restore previous composer banners (pingdotgg#8733)
* test(web): remove tests for unreachable helpers (pingdotgg#8738)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
* feat(mobile): update tool summaries and chat transitions (pingdotgg#8793)
* feat(web): play video attachments in chat (pingdotgg#8688)
* fix(web,mobile): snooze menu no longer offers the same wake time twice (pingdotgg#8741)
* fix(grok): allow model changes in existing threads (pingdotgg#8392)
Co-authored-by: Ahmed Besic <ahmed-besic@users.noreply.github.com>
* feat(mobile): pick, share, and receive files in threads (pingdotgg#8237)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Julius Marminge <julius0216@outlook.com>
* fix(web): reduce title bar scroll fade height (pingdotgg#8799)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(windows): strip quotes from repaired PATH (pingdotgg#8746)
* fix(web): open agent images in expanded preview (pingdotgg#8807)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(git): follow repository instructions in generated source control text (pingdotgg#8804)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(server): stop overpricing cached Claude tokens (pingdotgg#8806)
* fix(web): keep image preview above sidebar control (pingdotgg#8811)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(web): keep right panel synced with agent edits (pingdotgg#8803)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(web,mobile): render Codex citations and artifact templates (pingdotgg#8584)
* chore: add Windows setup script to t3.json (pingdotgg#8814)
* fix(web): fold interim turn responses (pingdotgg#8828)
* fix(web): use circle alert for failed tool calls (pingdotgg#8840)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* feat(mobile): add offline iPhone voice input (pingdotgg#8614)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(web): prevent pull request metadata overlap (pingdotgg#8790)
* chore(release): prepare v0.0.37
* Add mobile composer attachment menu with video support (pingdotgg#8843)
* fix(mobile): map native menu icon colors explicitly
* fix(web): restore unified activity logs and composer banners (pingdotgg#8734)
Co-authored-by: Julius Marminge <julius0216@outlook.com>
Co-authored-by: Julius Marminge <jmarminge@gmail.com>
* fix(web): address composer banner review follow-ups (pingdotgg#8850)
* fix(web): widen sync banners and simplify the working timer (pingdotgg#8855)
* fix(preview): improve browser recording quality (pingdotgg#8839)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(web): mark pull request links as external (pingdotgg#8856)
* fix(mobile): replace Callstack glass with Expo glass (pingdotgg#8862)
* fix(server): skip IDE detection in Claude probes (pingdotgg#8634)
* chore(macroscope): review diagnostic overrides (pingdotgg#8917)
Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
* fix(contracts): accept CLI event origins (pingdotgg#8905)
* fix(web): hide invalid slash skill completions (pingdotgg#8904)
* fix(mobile): defer draft navigation until submission completes (pingdotgg#8914)
* chore: disable CodeRabbit review status (pingdotgg#8933)
* Delete app.json (pingdotgg#8934)
* fix(web): show scrollbar for wide markdown tables (pingdotgg#8868)
* fix(mobile): shimmer active tool rows (pingdotgg#8932)
Co-authored-by: Julius Marminge <julius@mac.lan>
* chore(deps): bump Electron to 43.4.1 (pingdotgg#8626)
* fix(chat): smooth worktree setup status (pingdotgg#8922)
* feat(mobile): add video playback with native iOS controls (pingdotgg#8919)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(web): prevent chat metadata overlap (pingdotgg#8851)
* fix(server): preserve usage cache outside walked roots (pingdotgg#8540)
Co-authored-by: Simone <185146821+Lucenx9@users.noreply.github.com>
* feat(mobile): add native image and PDF previews (pingdotgg#8959)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(server): allow long thread IDs in HTTP routes (pingdotgg#8898)
* fix(shared): preserve Windows shell PATH priority (pingdotgg#8748)
* fix(web): make WSL settings searchable (pingdotgg#8881)
* feat(web): add expand/collapse all control to the files surface (pingdotgg#8889)
* Add auto_review configuration to coderabbit.yaml
* style: format CodeRabbit configuration
* feat(mobile): upload attachments while composing (pingdotgg#8978)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(chat): keep agent activity visible between actions (pingdotgg#8984)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(server): isolate remote web session cookies (pingdotgg#8085)
Co-authored-by: Julius Marminge <julius0216@outlook.com>
* feat(pull-requests): link GitHub references in markdown (pingdotgg#8812)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* perf(server): reduce frequency of full tool call output being loaded into memory from db (pingdotgg#8988)
* feat(web): add pull request list filters (pingdotgg#8809)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* feat(web): search individual settings by detail (pingdotgg#8831)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* feat(client): render viewed images in work logs (pingdotgg#8936)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(client): use package import for markdown image helpers (pingdotgg#9010)
* test: remove static presentation snapshots (pingdotgg#9008)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
* perf(server): bound snapshot activity payload memory (pingdotgg#9000)
* perf(server): cut idle CPU use and stop provider event leaks (pingdotgg#8187)
* perf(server): scan only appended transcript bytes for usage summaries (pingdotgg#9024)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Theo Browne <me@t3.gg>
* perf(server): cut chatty tool-update frames by 90% (pingdotgg#8368)
* fix(server): settle threads server-side (pingdotgg#8600)
* fix(clients): dedupe skills in composer menus (pingdotgg#8043)
* fix(server): stop OpenCode child sessions (pingdotgg#9005)
* perf(web): defer pull request line stats until visible (pingdotgg#6471)
Co-authored-by: Theo Browne <me@t3.gg>
* perf(server): skip full-message reads while streaming (pingdotgg#9032)
* perf(client-runtime): halve server config bootstrap traffic (pingdotgg#8367)
Reuse one server config subscription for session bootstrap and live updates.
Preserve environment theme opt-in, replay, deletion, slow subscriber recovery, and config stream failure handling.
Co-authored-by: Adamulek123 <adam.bogucki2018@gmail.com>
* fix(web): align un-settle banner action (pingdotgg#9033)
* fix(web): block type-to-focus behind open dialogs (pingdotgg#8139)
Co-authored-by: Simone <185146821+Lucenx9@users.noreply.github.com>
* feat(shortcuts): copy active thread reference (pingdotgg#8994)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(mobile): keep thread scroll bounds current after animations (pingdotgg#9013)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(server): cache project favicon resolution (pingdotgg#9080)
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
* feat(claude): add Claude Fable 5.1 model (pingdotgg#9078)
* fix(preview): restore recording and macOS rendering after Electron 43 (pingdotgg#9001)
Co-authored-by: Guillermo Casanova <guillermo.casanova.b@gmail.com>
* feat(desktop): add configurable quit shortcut confirmation (pingdotgg#9076)
* feat(web): open project settings from thread menus (pingdotgg#8925)
* fix(chat): reuse one row for live activity (pingdotgg#9062)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* feat(models): discover Claude models from remote manifest (pingdotgg#9084)
* Revert "fix(chat): reuse one row for live activity" (pingdotgg#9096)
* fix(web): sync sidebar PR state from open panel (pingdotgg#9092)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: maria <254055478+maria-rcks@users.noreply.github.com>
* fix(web): changing projects no longer creates a draft (pingdotgg#9097)
* fix(web): keep theme placeholder text dimmer than entered text (pingdotgg#9104)
* fix(web): keep the selected environment when changing projects (pingdotgg#9102)
* docs(plans): t3o-31 upstream sync to v0.0.38
* fix(board): clear the ten pre-existing typecheck errors before the upstream sync (t3o-31 P0)
Two test fakes failed with a bare Error in the Effect failure channel, a
closure-assigned let narrowed to never, and a single-override pill read
overriddenRows[0] under noUncheckedIndexedAccess. None changed behaviour;
they were masked because the recursive typecheck never reached apps/server.
* fix(sync): the three type errors and two test failures the v0.0.38 merge caused
- BoardModelRow reads planModeEnabled from client settings, as the composer does.
- findBranchPullRequest resolves the default branch for upstream's widened PR
cache key instead of passing null.
- The orphaned-session integration test mocks the supervisor reactor that the
startup seam yields (new inventory row).
- The projection resume test seeds board projector watermarks into
boards.projection_state, where t3o-26 reads them, and asserts over the union.
- searchSettings("work") now also matches upstream's worktree/network items.
* refactor(board): native title attributes become BoardHint tooltips
Upstream's new no-native-title-tooltip rule flags every intrinsic-element
title= in the board (61 sites). BoardHint wraps the styled Tooltip primitive
and renders its child as the trigger, so layout is unchanged; a nullish label
renders the child alone.
* docs(seams): record the v0.0.38 sync (t3o-31)
Merge-log row, the decisions taken (plans stay tracked, upstream's settlement
reactor accepted after audit, projector-enumeration policy, launcher protocol
note), an unmarked-edits debt table for the next sync, a marker census, the
three new upstream workflows to disable, and the runbook's per-package
verification notes.
* review(t3o-31): announce the board's status dots, and order the merge log
Round-1 nitpicks: a bare span's aria-label is not announced, so the working,
running and awaiting dots now carry role="img"; the v0.0.38 merge-log row
moves below the two 2026-08-09 rows so the table reads chronologically.
---------
Co-authored-by: Theo Browne <me@t3.gg>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Dara Adedeji <76637177+SunkenInTime@users.noreply.github.com>
Co-authored-by: shivam <91240327+shivamhwp@users.noreply.github.com>
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: abcdmku <63693423+abcdmku@users.noreply.github.com>
Co-authored-by: Guilherme Barros <gbarros1095@gmail.com>
Co-authored-by: Rishet11 <154429365+Rishet11@users.noreply.github.com>
Co-authored-by: Alex <me@pixp.cc>
Co-authored-by: maria <254055478+maria-rcks@users.noreply.github.com>
Co-authored-by: Naveed Iqbal <naveediqbal949@gmail.com>
Co-authored-by: Ishaan Kothari <ishaanko.mail@gmail.com>
Co-authored-by: Exotic <118054752+extoci@users.noreply.github.com>
Co-authored-by: Utkarsh Patil <73941998+UtkarshUsername@users.noreply.github.com>
Co-authored-by: Bilal Bakr <62337003+Bil0000@users.noreply.github.com>
Co-authored-by: Rakshith Bhat <88523594+RakshithBhat03@users.noreply.github.com>
Co-authored-by: Simone <lucenz@proton.me>
Co-authored-by: Simone <185146821+Lucenx9@users.noreply.github.com>
Co-authored-by: Tristan Knight <admin@snappeh.com>
Co-authored-by: Wout Stiens <71498452+StiensWout@users.noreply.github.com>
Co-authored-by: Pavlo Trinko <paul.trinko95@gmail.com>
Co-authored-by: codex <codex@users.noreply.github.com>
Co-authored-by: Julius Marminge <julius0216@outlook.com>
Co-authored-by: Rodrigo Brechard <rodrigobrechard@gmail.com>
Co-authored-by: Rodrigo Brechard <rodrigo@clubtidy.fr>
Co-authored-by: Adamulek123 <adam.bogucki2018@gmail.com>
Co-authored-by: spiky02plateau <155588579+spiky02plateau@users.noreply.github.com>
Co-authored-by: Carlos Jimenez <cjimenez@r21digital.com>
Co-authored-by: Mark Griffin <mrmg@deflexion.net>
Co-authored-by: MacKinley Smith <smithmackinley@gmail.com>
Co-authored-by: oliver <97427849+flamboh@users.noreply.github.com>
Co-authored-by: mweinbach <maxweinbach5@gmail.com>
Co-authored-by: Lars Nieuwenhuis <35393046+lnieuwenhuis@users.noreply.github.com>
Co-authored-by: Mohtasham Murshid <154406804+MohtashamMurshid@users.noreply.github.com>
Co-authored-by: Dara Adedeji <daraaded@amazon.com>
Co-authored-by: Dara Adedeji <daraadedeji07@gmail.com>
Co-authored-by: Ahmed Besic <ahmed-besic@users.noreply.github.com>
Co-authored-by: Michael Brown <michaeltbrown.mtb@gmail.com>
Co-authored-by: PC <pc@localhost>
Co-authored-by: 1xpixi <157762409+1xpixi@users.noreply.github.com>
Co-authored-by: Josh <gitlucky@pipelab.org>
Co-authored-by: Tradi3 <56069280+krutftw@users.noreply.github.com>
Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
Co-authored-by: Ivan Malison <IvanMalison@gmail.com>
Co-authored-by: Yash Singh <saiansh2525@gmail.com>
Co-authored-by: Gianmarco <gianmarcosimone89@gmail.com>
Co-authored-by: Julius Marminge <julius@mac.lan>
Co-authored-by: Illia Panasenko <hello@ipanasenko.me>
Co-authored-by: Matheson Steplock <ikifar2012@users.noreply.github.com>
Co-authored-by: Anirudh Coontoor <anirudh@gosupernova.live>
Co-authored-by: Nick Anisimov <n.anisimov.23@gmail.com>
Co-authored-by: Muhammad Waleed <114993336+walid-baharwal@users.noreply.github.com>
Co-authored-by: Ryan Hughes <ryan@heyoodle.com>
Co-authored-by: Vitaly Iegorov <vitalyiegorov@gmail.com>
Co-authored-by: Ahmed Besic <ahmed.besic2000@gmail.com>
Co-authored-by: maria <maria@kuuro.net>
Co-authored-by: Matthew Feroz <136640686+MatthewFeroz@users.noreply.github.com>
Co-authored-by: Julius Marminge <jmarminge@gmail.com>
Co-authored-by: Aditya Garud <153842990+yashranaway@users.noreply.github.com>
Co-authored-by: Yukun Shan <92423096+nateEc@users.noreply.github.com>
Co-authored-by: Will Sheldon <will@autimo.com>
Co-authored-by: mic <85814106+q1@users.noreply.github.com>
Co-authored-by: Guillermo Casanova <guillermo.casanova.b@gmail.com>
juliusmarminge added a commit that referenced this pull request Sep 2, 2026
Round-16 rebase onto main (5 commits, headlined by #8236 file
attachments in the client). Main's upload-aware send path — capability
probes, upload await/retry gating, uploaded-ref turn attachments with
dataUrl fallback, draft release on success — is woven into the v2
dispatch flow, timeline user rows render file attachments as download
links with the ChatView download handler, and the provider settings
editor cleanup keeps the branch's environment-field rows. The codex
feedback client flow stays unported, replay testkit configs gained
main's environmentThemesDir, and the rpc/settings/docs unions carry
both sides.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XXL1,000+ changed lines (additions + deletions).vouch:trustedPR 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

@t3dotgg
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

feat(web): attach PDFs, ZIPs, and other files to a turn - #8236

Merged
t3dotgg merged 29 commits into
mainfrom
t3code/file-attachments-web
Aug 29, 2026
Merged

feat(web): attach PDFs, ZIPs, and other files to a turn#8236
t3dotgg merged 29 commits into
mainfrom
t3code/file-attachments-web

Conversation

@t3dotgg

@t3dotggt3dotgg commented Aug 25, 2026

Copy link
Copy Markdown
Member

The file upload APIs and tolerant attachment contracts from #8235 are now on main. This PR adds the web client for them.

The composer accepts PDFs, ZIPs, and other files up to the server's advertised limit through the paperclip button or paste. Uploads start while the user types, survive draft and stash moves, and render as rows that download with the original filename. Unknown attachment types render as inert rows instead of crashing the thread.

One shared upload flow in packages/client-runtime owns verification, transfer, release, and size limits. Draft discard, project delete, stash, file removal, and send cleanup all use that flow. Interrupted uploads return as "Attach again" markers instead of disappearing.

Release warning: clients with the old image-only attachment contract cannot decode threads that contain file attachments. The compatibility work in #8235 makes the merged server contract tolerant and keeps existing mobile code from treating files as images. Hold the web release until a compatible mobile build is available. #8237 adds mobile file support.

Original work by Theo Browne with Claude Fable 5 in the Claude Code harness. Modernized by GPT-5.6 Sol in the Codex harness.


Note

Medium Risk
Touches the turn send/upload pipeline and draft persistence; threads with file attachments require a tolerant client contract, so release coordination with older mobile builds matters.

Overview
Adds generic file attachments to the chat composer (paperclip, paste, drag) alongside images, with images and files sharing the per-turn attachment cap and server-advertised size limits.

Send and upload path:ChatView snapshots images and files together, runs shared upload/capability checks before and after upload, builds optimistic file rows, and wires timeline on-demand downloads via signed asset URLs. Annotation screenshots respect the combined attachment limit so prompts do not claim crops that were not sent.

Composer UX:ChatComposer stages file rows (upload progress, retry, “attach again” after interrupted uploads), blocks send when capabilities or limits fail, and extends stash restore/save to persisted file uploads with environment checks and expiry verification.

Persistence:composerDraftStore persists file metadata (upload ids or needs-reattach markers), enforces combined limits, and handles moves across threads/environments. Plan follow-up actions hide while any composer attachment is staged (shouldShowPlanFollowUpPrompt).

Timeline: User messages render non-image attachments as download links or inert rows for unknown types. Project/sidebar draft counts include files; project delete passes thread refs when releasing draft uploads.

Reviewed by Cursor Bugbot for commit 129f2ad. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Add PDF, ZIP, and generic file attachment support to chat turns

  • Extends the chat composer to support generic file attachments alongside images, including selection via paste or paperclip button, progress tracking, and retry controls
  • Updates composerDraftStore, attachmentUploadQueue, and prompt stash store to persist file metadata, deduplicate attachments, manage upload lifecycles, and handle cross-environment moves
  • Adds server capability checks to enforce staging limits and reject non-image files on servers that lack upload support
  • Renders received file attachments in the timeline as downloadable links or buttons using generated signed URLs
  • Risk: Non-image attachments now throw an error during send if the server does not support attachment uploads; cross-environment draft moves strip source upload linkage for byte-backed files

Macroscope summarized 129f2ad.

@coderabbitai

coderabbitaiBot commented Aug 25, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 7697ac98-d68b-4b0a-aa8c-fb19042ba35d

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

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

@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:XXL 1,000+ changed lines (additions + deletions). labels Aug 25, 2026
@github-actions

github-actionsBot commented Aug 25, 2026

Copy link
Copy Markdown
Contributor

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

ProviderMetricMain baselineThis PRImpactPR ceiling
CodexTotal thread wire13.3 KiB13.3 KiB−29 B (−0.2%)15.1 KiB
CodexThread snapshot wire6.9 KiB6.9 KiB−6 B (−0.1%)7.3 KiB
CodexLive turn WebSocket wire6.4 KiB6.4 KiB−23 B (−0.3%)7.8 KiB
CodexLive turn WebSocket decoded55.6 KiB55.6 KiB−44 B (−0.1%)66.4 KiB
CodexLive turn messages1110−1 (−9.1%)21
ClaudeTotal thread wire13.3 KiB13.3 KiB−56 B (−0.4%)15.1 KiB
ClaudeThread snapshot wire6.9 KiB6.9 KiB−1 B (−0.0%)7.3 KiB
ClaudeLive turn WebSocket wire6.4 KiB6.4 KiB−55 B (−0.8%)7.8 KiB
ClaudeLive turn WebSocket decoded56.4 KiB56.4 KiB−88 B (−0.2%)66.4 KiB
ClaudeLive turn messages119−2 (−18.2%)21

Baseline: 0e2905e · PR result: 129f2ad · 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: 109.4 KiB
  • Claude decoded thread snapshot: 110.1 KiB

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

@macroscopeappmacroscopeappBot 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.

Reviewed the new/changed Effect-adjacent code (packages/client-runtime/src/state/attachments.ts, apps/web/src/state/attachments.ts, and the web upload-queue call sites) against the service conventions. The new createAttachmentEnvironmentAtoms factory correctly mirrors createAssetEnvironmentAtoms (runtime passed in, no hidden globals, no ManagedRuntime/runPromise outside the existing atom-command boundary), and no service tags/layers were moved or redefined. One predicate convention issue below.

Posted via Macroscope — Effect Service Conventions

Comment threadpackages/client-runtime/src/state/attachments.ts Outdated
Comment threadapps/web/src/lib/attachmentUploadQueue.ts
Comment threaddocs/user/composer.md Outdated
Comment threadapps/web/src/composerDraftStore.ts
@macroscopeapp

macroscopeappBot commented Aug 25, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Not approved

Macroscope's review found this PR not approvable — This change introduces a substantial production workflow for uploading, persisting, transferring, deleting, and downloading user files alongside turns. Its broad runtime surface and server-side file lifecycle warrant human review despite extensive tests and backward-compatible persistence.

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

Comment threadapps/web/src/lib/attachmentUploadQueue.ts Outdated

@macroscopeappmacroscopeappBot 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.

Reviewed the web composer/timeline attachment UI. Two interaction findings on changed lines, both about the new needs-reattach / capacity paths giving the user no working path or feedback.

Posted via Macroscope — UI Consistency

Comment threadapps/web/src/components/chat/ChatComposer.tsx
Comment threadapps/web/src/composerDraftStore.ts
Comment threadapps/web/src/lib/attachmentUploadQueue.ts
Comment threadapps/web/src/composerDraftStore.ts Outdated
Comment threadapps/web/src/composerDraftStore.ts
Comment threadapps/web/src/composerDraftStore.ts Outdated
Comment threadapps/web/src/components/chat/ChatComposer.tsx

@macroscopeappmacroscopeappBot 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.

One finding: the new file-attachment download button in MessagesTimeline renders its filename center-aligned, unlike the visually identical anchor and inert rows next to it.

Posted via Macroscope — UI Consistency

Comment threadapps/web/src/components/chat/MessagesTimeline.tsx Outdated
@t3dotgg
t3dotggforce-pushed the t3code/file-attachments-web branch from c88f3df to 33d67f9CompareAugust 26, 2026 08:58
Comment threadapps/web/src/components/chat/ChatComposer.tsx
Comment threadapps/web/src/components/chat/composerAttachmentFiles.ts
Comment threadapps/web/src/components/chat/ChatComposer.tsx
@t3dotgg
t3dotggforce-pushed the t3code/file-attachments-web branch from 7abf833 to 1dd3cc0CompareAugust 26, 2026 09:29
Comment threadapps/web/src/components/ChatView.tsx
Comment threadapps/web/src/components/chat/ChatComposer.tsx Outdated
Comment threadapps/web/src/hooks/useHandleNewThread.ts

@macroscopeappmacroscopeappBot 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.

One finding on the new send-block wording in ChatComposer. The rest of the attachment UI (file rows, paperclip trigger, stash menu file badge, timeline file rows) reuses the existing primitives and row treatments consistently, and the earlier findings on the timeline download row alignment, the marker re-pick path, and the swallowed paste are resolved.

Posted via Macroscope — UI Consistency

Comment threadapps/web/src/components/chat/ChatComposer.tsx Outdated
Comment threadapps/web/src/components/chat/ChatComposer.tsx
Comment threadapps/web/src/components/ChatView.tsx Outdated

@macroscopeappmacroscopeappBot 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.

One finding: the needs-reattach file row label ignores the canReattachFiles guard that the send-block reason uses, so on a server without file-attachment support (or before the capability arrives) the row tells the user to attach again while no attach control is rendered.

Posted via Macroscope — UI Consistency

Comment threadapps/web/src/components/chat/ChatComposer.tsx
Comment threadapps/web/src/components/chat/ChatComposer.tsx
juliusmarminge added a commit that referenced this pull request Aug 29, 2026
PRs #8437 and #8236 crossed: one made stashShortcutLabel a required
ComposerStashMenu prop, the other added a test case without it, so
main fails web typecheck.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 29, 2026
Round-16 rebase onto main (5 commits, headlined by #8236 file
attachments in the client). Main's upload-aware send path — capability
probes, upload await/retry gating, uploaded-ref turn attachments with
dataUrl fallback, draft release on success — is woven into the v2
dispatch flow, timeline user rows render file attachments as download
links with the ChatView download handler, and the provider settings
editor cleanup keeps the branch's environment-field rows. The codex
feedback client flow stays unported, replay testkit configs gained
main's environmentThemesDir, and the rpc/settings/docs unions carry
both sides.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
github-actionsBot added a commit to omarcresp/t3code-flake that referenced this pull request Aug 29, 2026
## What's Changed
* feat(web): attach PDFs, ZIPs, and other files to a turn by @t3dotgg in pingdotgg/t3code#8236
* feat(web): keybinding settings as settings rows by @StiensWout in pingdotgg/t3code#8532
* feat: let an environment publish themes as a file by @ryanrhughes in pingdotgg/t3code#8569
* fix(web): clean up provider settings list and editor by @StiensWout in pingdotgg/t3code#8504
* fix(web): keep project picker popup inside the sidebar by @SunkenInTime in pingdotgg/t3code#8627
* fix(mobile): prevent header overflow and back-button artifacts by @juliusmarminge in pingdotgg/t3code#8624
## New Contributors
* @ryanrhughes made their first contribution in pingdotgg/t3code#8569
**Full Changelog**: pingdotgg/t3code@v0.0.37-nightly.20260829.1218...v0.0.37-nightly.20260829.1219
Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.37-nightly.20260829.1219
netpro2k added a commit to netpro2k/t3code that referenced this pull request Aug 29, 2026
Intent:
Expose the generic-file backend shipped in v0.0.36 through the web and desktop composer while following the official client implementation closely enough for its upstream PR to replace this patch cleanly.
Behavior:
- Accept images and generic files through the paperclip button, paste, and drag-and-drop; share the eight-attachment limit and use the server-advertised generic-file limit, currently 50 MB.
- Upload while the user composes, show progress/retry/reattach states, and render sent files as signed downloads with their original names.
- Preserve file drafts and stashes as server upload references or explicit needs-reattach markers instead of storing generic-file bytes in localStorage.
- Keep upload verification, cleanup, retry, environment moves, and unknown attachment rendering explicit.
- Show file names in the current mobile feed and include attachment names in transcript bootstrap context.
Design constraints:
- Backport official upstream PR pingdotgg#8236 at 129f2ad, rebased onto v0.0.36, rather than maintaining a parallel client upload architecture.
- Use packages/client-runtime for the shared upload lifecycle and clamp file sizes to the server capability and contract maximum.
- Require direct-upload support for generic files. Do not retain the fork inline-file protocol or serialize generic-file bytes into drafts and stashes.
- Upload local workspace drops like the official client; do not retain the competing desktop-only drop-to-mention behavior.
- Keep images on their established compression and compatibility path.
Integration:
- Shared client-runtime upload lifecycle and web environment atoms.
- Web composer, drafts, prompt stashes, upload queue, message timeline, signed asset downloads, sidebar counts, project cleanup, and user documentation.
- Minimal current mobile feed visibility and transcript bootstrap naming remain fork-only until the official follow-up covers them.
Verification:
- Official attachment-focused web and client-runtime tests pass (7 files, 196 tests).
- Targeted client-runtime, web, and mobile typechecks pass; the existing client-runtime Effect diagnostic remains advisory.
Rebase notes:
- Upstream PR pingdotgg#8236 should supersede the web/client-runtime implementation wholesale once merged.
- Upstream PR pingdotgg#8237 should supersede the temporary mobile filename row with signed mobile downloads and full mobile file picking/sharing.
- Recheck only the transcript-bootstrap filename summary after both PRs land.
- The v0.0.36 stashShortcutLabel test fixture is the only adaptation to the rebased official PR tree.
longtngo added a commit to longtngo/t3code that referenced this pull request Aug 29, 2026
Range f6f2be3..053affb, v0.0.36. 411 upstream files, 632 fork files,
81 touched by both, 19 conflicted.
Competing implementations resolved toward the fork's superset:
- Claude context usage (pingdotgg#8610). Upstream deleted `queryCurrentContextUsage` and
`normalizeClaudeContextUsageApiSnapshot` outright. `getContextUsage` is the ONLY
source of the compaction facts (`autocompactSource`, `autoCompactThreshold`,
`isAutoCompactEnabled`) the Vitals gauge's compaction note and marker render from,
and they travel on the wire contract, so the call is kept. Upstream's
`latestAssistantUsage` tracking and its post-compaction guard are adopted BELOW it
as the next-best fallback: `contextUsageSnapshot ?? latestAssistantSnapshot ?? ...`.
Upstream removed `getContextUsage` from `ClaudeQueryRuntime`, the
`SDKControlGetContextUsageResponse` import and the `Option` import outside every
conflict marker; all three restored.
- Provider settings editor (pingdotgg#8472). Upstream's `useEffect` + `lastPublishedEnvironmentRef`
re-seed is the superset of the fork's render-phase `seededRef` (8fe3190, one of four
silent-data-loss fixes). The merge had kept BOTH mechanisms; collapsed to upstream's,
with the fork's half-typed-row null guard on the publish path. `environmentKey` deleted
with the code it served.
- Sidebar project combobox (pingdotgg#5931). Upstream replaced the menu-based project filter,
whose `MenuRadioItem` carried the fork's project-actions button. Rebuilt on upstream's
`ComboboxItem` with the ellipsis button grafted back (invariant 6). The dead `Menu*`
import is gone.
- Composer attachments (pingdotgg#8236). Upstream's `addComposerAttachments` pipeline adopted; the
fork's drop split (image -> attach, other -> absolute path with upload fallback) kept
and repointed at the new handler.
- Mid-turn steer. Upstream's `steeringTurnState` branch rejected again (invariant 5); its
side of that hunk also opened an `if` whose brace lives below the hunk.
- Thread deletion drain (pingdotgg#8226). Upstream replaced `drain` with `drainThrough(sequence)`;
the fork's test retargeted. Its new drain test observed `ProviderService.stopSession`,
which this reactor never calls (it dispatches `thread.session.stop`), so it now counts
engine dispatches and provides the two services the fork's reactor needs.
Three defects the resolutions introduced, each caught by a check that is not the suite:
- `shouldShowBranchMismatchBanner` was resurrected into two import lists by resolving
them toward upstream. Fork commit cfdf255 replaced that function; the import had no
definition. Found by the RESURRECTED sweep.
- `scriptPath` ended up declared twice in CodexCollabRuntime.integration.test.ts: `both`
reintroduced upstream's fixture-dir copy that the fork deliberately moved to a temp dir.
Found by the RESURRECTED sweep.
- `setProjectScopeMenuOpen` survived in the fork's `handleProjectActions` after upstream
replaced that state with a reducer, outside every marker. Found by typecheck.
Upstream regressions of fork fixes, kept fixed:
- Raw NUL bytes returned to ChatComposer.tsx. A raw NUL renders as nothing in grep and
aborts BSD sed mid-file; the fork had converted all six to `\0` escapes and carries a
guard test for it. The guard failed, and the offending line reads as space-separated in
any normal diff. Converted back to escapes.
- `defaultTheme` / `defaultThemeSetAt` (pingdotgg#8569) are absent from `ServerSettingsPatch`; the
fork's patch-parity guard caught it. They are owned by `t3 theme set`, which rewrites
settings.json directly and which clients only read, so they are recorded as deliberately
unpatchable rather than mirrored.
- The fork's mobile held-messages strip used `dark:` variants that upstream's new Uniwind
theme rule (pingdotgg#7327) forbids; moved to the `text-foreground-muted` semantic token rather
than added to the rule's allowlist.
Invariants: all re-probed against the merged tree. 1 (49 migrations, ids unique and
monotonic, max 50, 34 burned), 2 (the fork-only @effect/platform-node patch survived the
Expo 57 rewrite of patchedDependencies, is pinned, resolved and applied on disk; effect
stays at beta.103 so no re-pin), 3, 4, 4b (4 `isSendBlocked=`), 5, 5b, 5c, 6, 7, 8, 9, 10,
11 all hold.
Sweeps: resurrected 3, dropped 21, fork-loss 45, both-kept 0. Every entry named: the 3
resurrected and the fork-loss in ProviderInstanceCard / ChatComposer / Sidebar are the
decisions above; the OpenCode fork-loss is 11 comment lines whose guard upstream extracted
into `deleteContextIfCurrent` (the rationale is restored on the helper); pnpm-lock churn is
the install. Test declarations 18,691 -> 19,081; one file lost one, upstream's own pingdotgg#8484.
Gate: pnpm run verify green, exit 0 read from the captured log line. 14 blocks,
10,744 passed, 20 skipped, 0 failures.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
netpro2k added a commit to netpro2k/t3code that referenced this pull request Aug 29, 2026
Intent:
Expose the generic-file backend shipped in v0.0.36 through the web and desktop composer while following the official client implementation closely enough for its upstream PR to replace this patch cleanly.
Behavior:
- Accept images and generic files through the paperclip button, paste, and drag-and-drop; share the eight-attachment limit and use the server-advertised generic-file limit, currently 50 MB.
- Upload while the user composes, show progress/retry/reattach states, and render sent files as signed downloads with their original names.
- Preserve file drafts and stashes as server upload references or explicit needs-reattach markers instead of storing generic-file bytes in localStorage.
- Keep upload verification, cleanup, retry, environment moves, and unknown attachment rendering explicit.
- Show file names in the current mobile feed and include attachment names in transcript bootstrap context.
Design constraints:
- Backport official upstream PR pingdotgg#8236 at 129f2ad, rebased onto v0.0.36, rather than maintaining a parallel client upload architecture.
- Use packages/client-runtime for the shared upload lifecycle and clamp file sizes to the server capability and contract maximum.
- Require direct-upload support for generic files. Do not retain the fork inline-file protocol or serialize generic-file bytes into drafts and stashes.
- Upload local workspace drops like the official client; do not retain the competing desktop-only drop-to-mention behavior.
- Keep images on their established compression and compatibility path.
Integration:
- Shared client-runtime upload lifecycle and web environment atoms.
- Web composer, drafts, prompt stashes, upload queue, message timeline, signed asset downloads, sidebar counts, project cleanup, and user documentation.
- Minimal current mobile feed visibility and transcript bootstrap naming remain fork-only until the official follow-up covers them.
Verification:
- Official attachment-focused web and client-runtime tests pass (7 files, 196 tests).
- Targeted client-runtime, web, and mobile typechecks pass; the existing client-runtime Effect diagnostic remains advisory.
Rebase notes:
- Upstream PR pingdotgg#8236 should supersede the web/client-runtime implementation wholesale once merged.
- Upstream PR pingdotgg#8237 should supersede the temporary mobile filename row with signed mobile downloads and full mobile file picking/sharing.
- Recheck only the transcript-bootstrap filename summary after both PRs land.
- The v0.0.36 stashShortcutLabel test fixture is the only adaptation to the rebased official PR tree.
juliusmarminge added a commit that referenced this pull request Aug 30, 2026
Round-16 rebase onto main (5 commits, headlined by #8236 file
attachments in the client). Main's upload-aware send path — capability
probes, upload await/retry gating, uploaded-ref turn attachments with
dataUrl fallback, draft release on success — is woven into the v2
dispatch flow, timeline user rows render file attachments as download
links with the ChatView download handler, and the provider settings
editor cleanup keeps the branch's environment-field rows. The codex
feedback client flow stays unported, replay testkit configs gained
main's environmentThemesDir, and the rpc/settings/docs unions carry
both sides.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
bcotrim pushed a commit to bcotrim/mognet that referenced this pull request Aug 30, 2026
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
(cherry picked from commit bcb855a)
bcotrim pushed a commit to bcotrim/mognet that referenced this pull request Aug 30, 2026
PRs pingdotgg#8437 and pingdotgg#8236 crossed: one made stashShortcutLabel a required
ComposerStashMenu prop, the other added a test case without it, so
main fails web typecheck.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
(cherry picked from commit d22709f)
juliusmarminge added a commit that referenced this pull request Aug 30, 2026
Round-16 rebase onto main (5 commits, headlined by #8236 file
attachments in the client). Main's upload-aware send path — capability
probes, upload await/retry gating, uploaded-ref turn attachments with
dataUrl fallback, draft release on success — is woven into the v2
dispatch flow, timeline user rows render file attachments as download
links with the ChatView download handler, and the provider settings
editor cleanup keeps the branch's environment-field rows. The codex
feedback client flow stays unported, replay testkit configs gained
main's environmentThemesDir, and the rpc/settings/docs unions carry
both sides.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
imsherrill pushed a commit to comprehensiveio/compadre that referenced this pull request Aug 31, 2026
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
(cherry picked from commit bcb855a)
imsherrill added a commit to comprehensiveio/compadre that referenced this pull request Aug 31, 2026
…) (#2)
(cherry picked from commit bcb855a)
Co-authored-by: Theo Browne <me@t3.gg>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
netpro2k added a commit to netpro2k/t3code that referenced this pull request Aug 31, 2026
Intent:
Keep transcript bootstrap context aware of generic file attachments now that upstream web and mobile clients support their full upload and rendering lifecycle.
Behavior:
- Count every message attachment in transcript bootstrap context, not only images.
- Include up to three attachment names plus an additional-count suffix.
- Preserve image/images wording when every attachment is an image; otherwise use file/files.
Design constraints:
- Rely entirely on upstream attachment upload, draft, stash, rendering, download, and mobile behavior.
- Keep this patch limited to the text supplied to transcript bootstrap.
Integration:
- Web transcript bootstrap summary only. No client upload, server, contract, mobile, or storage changes.
Verification:
- Upstream PRs pingdotgg#8236 and pingdotgg#8237 were audited as superseding the former attachment backport except for this summary behavior.
- Targeted web verification is rerun after the complete patch stack rebases.
Rebase notes:
- Drop this patch only when upstream transcript bootstrap includes generic attachment names rather than filtering to images.
github-actionsBot added a commit to omarcresp/t3code-flake that referenced this pull request Aug 31, 2026
## What's Changed
* Remove Messages Glass Lab experiment by @juliusmarminge in pingdotgg/t3code#8599
* Require human review for pull requests changing product defaults by @juliusmarminge in pingdotgg/t3code#8603
* fix(codex): avoid quadratic app-server input buffering by @juliusmarminge in pingdotgg/t3code#8605
* fix(mobile): stabilize iOS header item transitions by @juliusmarminge in pingdotgg/t3code#8607
* chore(mobile): upgrade to Expo SDK 57 by @juliusmarminge in pingdotgg/t3code#8609
* fix(mobile): harden native header toolbar items by @juliusmarminge in pingdotgg/t3code#8611
* fix(server): stop querying Claude context usage after turns by @t3dotgg in pingdotgg/t3code#8610
* chore: vouch ryanrhughes by @t3dotgg in pingdotgg/t3code#8613
* feat(web): attach PDFs, ZIPs, and other files to a turn by @t3dotgg in pingdotgg/t3code#8236
* feat(web): keybinding settings as settings rows by @StiensWout in pingdotgg/t3code#8532
* feat: let an environment publish themes as a file by @ryanrhughes in pingdotgg/t3code#8569
* fix(web): clean up provider settings list and editor by @StiensWout in pingdotgg/t3code#8504
* fix(web): keep project picker popup inside the sidebar by @SunkenInTime in pingdotgg/t3code#8627
* fix(mobile): prevent header overflow and back-button artifacts by @juliusmarminge in pingdotgg/t3code#8624
* fix(server): retry automatic thread title generation by @Bil0000 in pingdotgg/t3code#8087
* fix(client-runtime): refresh edited pull request comments by @Bil0000 in pingdotgg/t3code#8094
* fix(web): four composer spacing defects by @Bil0000 in pingdotgg/t3code#8090
* perf(desktop): skip duplicate browser updates by @Bil0000 in pingdotgg/t3code#8018
* fix(web): render nested markdown images correctly by @flamboh in pingdotgg/t3code#8501
* fix(web): unify activity logs and composer banners by @juliusmarminge in pingdotgg/t3code#8693
* fix(mobile): reduce dev-client reload and Metro startup cost by @juliusmarminge in pingdotgg/t3code#8694
* revert(web): restore previous composer banners by @t3dotgg in pingdotgg/t3code#8733
* test(web): remove tests for unreachable helpers by @t3-code[bot] in pingdotgg/t3code#8738
* feat(mobile): update tool summaries and chat transitions by @juliusmarminge in pingdotgg/t3code#8793
* feat(web): play video attachments in chat by @Bil0000 in pingdotgg/t3code#8688
* fix(web,mobile): snooze menu no longer offers the same wake time twice by @vitalyiegorov in pingdotgg/t3code#8741
* fix(grok): allow model changes in existing threads by @ahmed-besic in pingdotgg/t3code#8392
* feat(mobile): pick, share, and receive files in threads by @t3dotgg in pingdotgg/t3code#8237
* fix(web): reduce title bar scroll fade height by @maria-rcks in pingdotgg/t3code#8799
* fix(windows): strip quotes from repaired PATH by @UtkarshUsername in pingdotgg/t3code#8746
* fix(web): open agent images in expanded preview by @maria-rcks in pingdotgg/t3code#8807
* fix(git): follow repository instructions in generated source control text by @maria-rcks in pingdotgg/t3code#8804
* fix(server): stop overpricing cached Claude tokens by @SunkenInTime in pingdotgg/t3code#8806
* fix(web): keep image preview above sidebar control by @maria-rcks in pingdotgg/t3code#8811
* fix(web): keep right panel synced with agent edits by @maria-rcks in pingdotgg/t3code#8803
* fix(web,mobile): render Codex citations and artifact templates by @Yash-Singh1 in pingdotgg/t3code#8584
* chore: add Windows setup script to t3.json by @UtkarshUsername in pingdotgg/t3code#8814
* fix(web): fold interim turn responses by @maria-rcks in pingdotgg/t3code#8828
* fix(web): use circle alert for failed tool calls by @maria-rcks in pingdotgg/t3code#8840
* feat(mobile): add offline iPhone voice input by @t3dotgg in pingdotgg/t3code#8614
* fix(web): prevent pull request metadata overlap by @MatthewFeroz in pingdotgg/t3code#8790
## New Contributors
* @ryanrhughes made their first contribution in pingdotgg/t3code#8569
* @ahmed-besic made their first contribution in pingdotgg/t3code#8392
* @MatthewFeroz made their first contribution in pingdotgg/t3code#8790
**Full Changelog**: pingdotgg/t3code@v0.0.36...v0.0.37
Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.37
amitbet pushed a commit to amitbet/a2code that referenced this pull request Sep 1, 2026
Upstream shipped its own arbitrary file attachments (pingdotgg#8235/pingdotgg#8236/pingdotgg#8237), a
strict superset of the fork's, so that divergence is retired rather than
re-applied. Upstream also reverted its turn-plan chips, restructured provider
settings into list+editor, made the project picker a searchable combobox, and
replaced the mobile CSS-variable theme hook with useUniwindTheme.
Fork features preserved: thread forking, queued-prompt steering, in-chat find,
answered user-input rows, machine-scoped environments, provider health-check
cache, provider "Default traits", live quota meter, thread export/pinning,
payload hot-update channel, and the build-only CI surface.
See FORK_NOTES.md for the per-file migration notes.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Sep 1, 2026
Round-16 rebase onto main (5 commits, headlined by #8236 file
attachments in the client). Main's upload-aware send path — capability
probes, upload await/retry gating, uploaded-ref turn attachments with
dataUrl fallback, draft release on success — is woven into the v2
dispatch flow, timeline user rows render file attachments as download
links with the ChatView download handler, and the provider settings
editor cleanup keeps the branch's environment-field rows. The codex
feedback client flow stays unported, replay testkit configs gained
main's environmentThemesDir, and the rpc/settings/docs unions carry
both sides.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Coriou added a commit to Coriou/txcode that referenced this pull request Sep 1, 2026
Upstream tip (bcb855a, pingdotgg#8236) rewrote the third render's entries and
dropped the required stashShortcutLabel prop, leaving upstream's own web
typecheck red. Completed the fixture; candidate for an upstream report.
juliusmarminge added a commit that referenced this pull request Sep 2, 2026
Round-16 rebase onto main (5 commits, headlined by #8236 file
attachments in the client). Main's upload-aware send path — capability
probes, upload await/retry gating, uploaded-ref turn attachments with
dataUrl fallback, draft release on success — is woven into the v2
dispatch flow, timeline user rows render file attachments as download
links with the ChatView download handler, and the provider settings
editor cleanup keeps the branch's environment-field rows. The codex
feedback client flow stays unported, replay testkit configs gained
main's environmentThemesDir, and the rpc/settings/docs unions carry
both sides.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
brentkelly added a commit to brentkelly/t3code-orchestrator that referenced this pull request Sep 2, 2026
* feat(analytics): threads and turns now know which client started them (pingdotgg#7774)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(web): stop marking mixed tool runs as failed (pingdotgg#7893)
* fix(web): command-click spaced folder links (pingdotgg#6439)
Co-authored-by: shivam <91240327+shivamhwp@users.noreply.github.com>
* fix(chat): stop pushing follow-up messages to the top (pingdotgg#7897)
* test(desktop): remove redundant release note assertion (pingdotgg#7873)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
* fix(web): handle wide ordered-list marker edge cases (pingdotgg#7856)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(ssh): restore user PATH for remote servers (pingdotgg#7213)
* fix(desktop): keep tailscale spawn defects from breaking advertised endpoints (pingdotgg#7116)
* fix(web): keep Codex service tier labels readable (pingdotgg#4503)
* fix: render workspace images in chat markdown (pingdotgg#6433)
* fix(clients): keep opening responses visible after turns settle (pingdotgg#7723)
* feat(web): add appearance contrast control (pingdotgg#7906)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: maria <254055478+maria-rcks@users.noreply.github.com>
* fix(server): stop completed Codex threads from staying stuck on working (pingdotgg#7937)
* fix(mobile): preserve markdown image dimensions (pingdotgg#7940)
* fix(web): remove duplicate provider update progress (pingdotgg#7761)
* fix(server): fall back to the remote default branch instead of assuming main (pingdotgg#7078)
* fix(web): give sidebar project menu rows the same side padding as other menus (pingdotgg#7913)
* fix(clients): reconnect after credentials fail during remote server updates (pingdotgg#7953)
* feat(codex): submit thread feedback to OpenAI (pingdotgg#7949)
* fix(server): stop kills lingering Claude work (pingdotgg#5891)
* fix(ci): let Macroscope approve pull requests again (pingdotgg#7970)
* fix(clients): move settled pinned threads into the settled section (pingdotgg#7969)
* perf(ci): speed up release builds and Windows packaging (pingdotgg#7975)
* fix(web): stop tool calls from leaving a blank page in threads (pingdotgg#7971)
* fix(web): stop recovered tool failures from marking work logs red (pingdotgg#7999)
* fix(mobile): isolate markdown image requests (pingdotgg#7942)
* feat(web): redesign skills in `$` menu and in `/` menu (pingdotgg#8009)
* fix(web): restore right panel toggle clicks after closing on desktop (pingdotgg#8016)
* fix(web): keep server update banners flush with the composer (pingdotgg#8000)
* perf(web): reuse work log rows during streaming (pingdotgg#8006)
* fix(web): keep provider badge legible in dark themes (pingdotgg#7968)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: maria <254055478+maria-rcks@users.noreply.github.com>
* fix(web): treat configured urls with uppercase schemes as secure (pingdotgg#8005)
Co-authored-by: Simone <185146821+Lucenx9@users.noreply.github.com>
* fix(desktop): keep release notes visible while downloading (pingdotgg#6412)
* fix(web): show only providers with usage in usage views (pingdotgg#7563)
* fix(web): prevent expanded tool calls from hiding thread content (pingdotgg#8052)
* test(server): remove no-op live activity tests (pingdotgg#8056)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
* fix(web): clarify terminal sidebar grouping (pingdotgg#7967)
* fix(codex): show app access approval prompts (pingdotgg#8058)
* feat(web): upload image attachments before sending (pingdotgg#8048)
* fix(server): bound OpenCode skill discovery output (pingdotgg#7675)
Co-authored-by: Simone <185146821+Lucenx9@users.noreply.github.com>
* fix(mobile): persist thread shelf collapse state (pingdotgg#5152)
* fix(mobile): restore Android tablet thread controls, clean up header (pingdotgg#5385)
* fix(mobile): land the first thread open above the composer on Android (pingdotgg#5585)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: codex <codex@users.noreply.github.com>
Co-authored-by: Julius Marminge <julius0216@outlook.com>
* fix(server): check out submodules in a new worktree (pingdotgg#7674)
Co-authored-by: Rodrigo Brechard <rodrigo@clubtidy.fr>
* fix(server): preserve merged PR badges after branch deletion (pingdotgg#6216)
* fix(server): return fresh live pull request reads (pingdotgg#6472)
* fix(web): compare client and server versions as semver, not strings (pingdotgg#7579)
* fix(web): stop follow-ups from leaving giant blank space (pingdotgg#8068)
* fix(marketing): stop automatic Vercel deployments on pull requests (pingdotgg#8070)
* chore: vouch repeat contributors (pingdotgg#8071)
* fix(server): keep the authoritative subagent model when snapshots race task_started (pingdotgg#7583)
* fix(server): honor auto-accept edits for the OpenCode provider (pingdotgg#7100)
* fix(server): run the CLI on Node versions without import.meta.main (pingdotgg#7141)
* fix(server): recover from provider interrupt failures (pingdotgg#7412)
* fix(server): recreate a thread's worktree before starting a turn (pingdotgg#7839)
* fix(server): thread delete no longer fails on already-removed worktrees (pingdotgg#8076)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(web): stop update notices showing through the composer (pingdotgg#8083)
* fix(web): detect outdated nightly servers (pingdotgg#8124)
* fix(web): align usage page skeleton layout (pingdotgg#8111)
* fix(web): make terminal links appear clickable only when clickable (pingdotgg#7488)
* fix(web): make Windows file links clickable in chat (pingdotgg#8081)
* fix(web): sort usage models by token count (pingdotgg#8108)
* fix: open agent file links in the file viewer (pingdotgg#8098)
* fix(server): stop routine events from rescanning thread history (pingdotgg#8150)
* fix(deps): stop pnpm installs from changing the lockfile (pingdotgg#8163)
* feat(web): settle and restore threads with a keyboard shortcut (pingdotgg#8089)
* perf(desktop): cut macOS signing calls by 81% (pingdotgg#8093)
* feat: link pull requests to threads (pingdotgg#8160)
* feat(web): safely attach HEIC photos as JPEG images (pingdotgg#8161)
Co-authored-by: mweinbach <maxweinbach5@gmail.com>
* feat(mobile): track device models and OS versions (pingdotgg#8169)
* fix(grok): bound cumulative tool output updates (pingdotgg#7279)
* fix(web): delay thread shortcut hints by 200 ms (pingdotgg#8172)
* fix(server): stop probing Cursor until enabled (pingdotgg#8175)
* docs(release): verify remote updates with database migrations (pingdotgg#8177)
* fix(server): keep provider CLIs available in the macOS service (pingdotgg#8173)
* feat(claude): compact old threads before they burn through usage (pingdotgg#8144)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(client-runtime): retry queries after connection interruption (pingdotgg#8117)
* fix(server): keep previously used providers working after upgrades (pingdotgg#8176)
* feat(desktop): build macOS previews from a PR label (pingdotgg#8182)
* fix(web): thread jump hints no longer stick after a dictation paste (pingdotgg#8189)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(web): keep grouped project renames (pingdotgg#7831)
* feat(web): reveal chat file chips in the system file manager (pingdotgg#7140)
Co-authored-by: Dara Adedeji <daraaded@amazon.com>
Co-authored-by: shivam <91240327+shivamhwp@users.noreply.github.com>
* fix(server): push no longer writes a feature branch's commits to its base branch (pingdotgg#8228)
* chore(deps): bump @clerk/electron to 0.0.37 (pingdotgg#8240)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* feat(server): fetch legacy model classification from a hosted manifest (pingdotgg#8227)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* chore(release): prepare v0.0.34
* fix(desktop): let Clerk UI receive stable auth fixes (pingdotgg#8248)
* fix(app): un-settled threads return to the top of the list (pingdotgg#8231)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* perf(ci): cut about a minute from every release (pingdotgg#8250)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* feat(ci): download macOS preview DMGs without signing in (pingdotgg#8243)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(codex): accept Codex 0.150 multi-agent events (pingdotgg#8346)
* chore(release): prepare v0.0.35
* fix(grok): improve skills, plans, usage, and turn reliability (pingdotgg#8358)
Co-authored-by: Dara Adedeji <daraadedeji07@gmail.com>
Co-authored-by: Ahmed Besic <ahmed-besic@users.noreply.github.com>
Co-authored-by: Michael Brown <michaeltbrown.mtb@gmail.com>
Co-authored-by: Lars Nieuwenhuis <35393046+lnieuwenhuis@users.noreply.github.com>
Co-authored-by: Guilherme Barros <gbarros1095@gmail.com>
Co-authored-by: PC <pc@localhost>
Co-authored-by: 1xpixi <157762409+1xpixi@users.noreply.github.com>
* fix(server): recover stale Codex approval callbacks (pingdotgg#5195)
* test(server): remove duplicate missing worktree test (pingdotgg#8252)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
* fix(server): replay all un-applied events during projection bootstrap (pingdotgg#7538)
Co-authored-by: Theo Browne <me@t3.gg>
* test: remove low-signal test files (pingdotgg#8397)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
* test: prune trivial error and layout tests (pingdotgg#8400)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
* Fix Android adaptive launcher icon (pingdotgg#4332)
Co-authored-by: Yash Singh <saiansh2525@gmail.com>
* feat(web): split provider settings into list and editor (pingdotgg#8380)
* fix(codex): accept Codex 0.150 account plans (pingdotgg#8447)
* fix(tooling): allow ignored-only staged changes (pingdotgg#8468)
* fix(mobile): keep iOS home header stable (pingdotgg#8467)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(web): stop showing red x summaries for ordinary tool failures (pingdotgg#8395)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(mobile): refine Git action toast glass styling (pingdotgg#8399)
* fix(desktop): allow preview automation in agent-created threads (pingdotgg#8483)
* test(web): remove redundant cache key test (pingdotgg#8484)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
* fix(release): move nightly schedule to minute 38
Recent scheduled nightlies have been delayed or skipped.
Move the nightly cron from minute 7 to minute 38. Keep the existing three-hour interval. This tests a different point in each three-hour window without claiming it will fix GitHub schedule delivery.
Authored by GPT-5.6 Sol with the Codex harness.
* fix(web): stabilize the provider settings editor (pingdotgg#8472)
* fix(web): open GitHub pull requests in browser when loading fails (pingdotgg#8507)
* fix(codex): show sub-agent models (pingdotgg#8502)
* feat(analytics): report connected client platforms (pingdotgg#8481)
* feat(server): accept PDF, ZIP, and other file uploads up to 50MB (pingdotgg#8235)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* feat(web): toggle thread pin from the keyboard
Add a mod+shift+p shortcut that pins or unpins the active thread. Ignore the shortcut during terminal focus and when the server does not support thread pinning.
* fix(web): add back button to project settings (pingdotgg#8168)
* refactor(mobile): compile semantic themes for Uniwind (pingdotgg#7327)
Co-authored-by: codex <codex@users.noreply.github.com>
* fix(desktop): Cache Runtime locally on WSL Filesystem, dramatically improving launch times (pingdotgg#5769)
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: Utkarsh Patil <73941998+UtkarshUsername@users.noreply.github.com>
* fix(mobile): show OpenCode model sources in picker (pingdotgg#8573)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(clients): honor project default models in new threads (pingdotgg#6011)
Co-authored-by: Shivam Sharma <91240327+shivamhwp@users.noreply.github.com>
* fix(mobile): show file actions on Android (pingdotgg#8215)
Co-authored-by: Shivam Sharma <91240327+shivamhwp@users.noreply.github.com>
* fix(connect): explain DPoP connection failures (pingdotgg#8351)
Co-authored-by: Julius Marminge <julius0216@outlook.com>
* feat(web): make the sidebar project filter a searchable combobox (pingdotgg#5931)
* fix(server): a draft can retry its first send after a failed bootstrap (pingdotgg#8226)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(desktop): stop hidden previews draining battery (pingdotgg#8567)
* fix(desktop): oauth popups open from the browser preview (pingdotgg#8435)
Co-authored-by: Julius Marminge <julius0216@outlook.com>
* fix(web): keep long task drawers usable on small screens (pingdotgg#8313)
* fix(opencode): handle child approvals, stops, and model catalogs (pingdotgg#8480)
* fix: make thread auto-settling opt-in (pingdotgg#8321)
* fix(web): stop session activity timing test from blocking releases (pingdotgg#8585)
* fix(mobile): show composer menus when starting a task (pingdotgg#8587)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(web): show the configured stash shortcut (pingdotgg#8437)
Co-authored-by: Shivam Sharma <91240327+shivamhwp@users.noreply.github.com>
* feat(web): add toggleable confirmation before unpinning a thread (pingdotgg#7313)
Co-authored-by: Shivam Sharma <91240327+shivamhwp@users.noreply.github.com>
* fix: restore automatic thread settling defaults (pingdotgg#8596)
* fix(mobile): restore composer glass and rounded shadows (pingdotgg#8597)
Co-authored-by: Julius Marminge <julius@mac.lan>
* Remove Messages Glass Lab experiment (pingdotgg#8599)
* chore(release): prepare v0.0.36
* Require human review for pull requests changing product defaults (pingdotgg#8603)
* fix(codex): avoid quadratic app-server input buffering (pingdotgg#8605)
* fix(mobile): stabilize iOS header item transitions (pingdotgg#8607)
Co-authored-by: Julius Marminge <julius@mac.lan>
* chore(mobile): upgrade to Expo SDK 57 (pingdotgg#8609)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(mobile): harden native header toolbar items (pingdotgg#8611)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(server): stop querying Claude context usage after turns (pingdotgg#8610)
* chore: vouch ryanrhughes (pingdotgg#8613)
* feat(web): attach PDFs, ZIPs, and other files to a turn (pingdotgg#8236)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(web): pass stashShortcutLabel in the mixed-attachments stash test
PRs pingdotgg#8437 and pingdotgg#8236 crossed: one made stashShortcutLabel a required
ComposerStashMenu prop, the other added a test case without it, so
main fails web typecheck.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* feat(web): keybinding settings as settings rows (pingdotgg#8532)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Julius Marminge <julius0216@outlook.com>
* feat: let an environment publish themes as a file (pingdotgg#8569)
Co-authored-by: Theo Browne <me@t3.gg>
* fix(web): clean up provider settings list and editor (pingdotgg#8504)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Julius Marminge <julius0216@outlook.com>
* fix(web): keep project picker popup inside the sidebar (pingdotgg#8627)
* fix(mobile): prevent header overflow and back-button artifacts (pingdotgg#8624)
* fix(server): retry automatic thread title generation (pingdotgg#8087)
* fix(client-runtime): refresh edited pull request comments (pingdotgg#8094)
* fix(web): four composer spacing defects (pingdotgg#8090)
* perf(desktop): skip duplicate browser updates (pingdotgg#8018)
Co-authored-by: Julius Marminge <julius0216@outlook.com>
* fix(web): render nested markdown images correctly (pingdotgg#8501)
* fix(web): unify activity logs and composer banners (pingdotgg#8693)
* fix(mobile): reduce dev-client reload and Metro startup cost (pingdotgg#8694)
Co-authored-by: Julius Marminge <julius@mac.lan>
* revert(web): restore previous composer banners (pingdotgg#8733)
* test(web): remove tests for unreachable helpers (pingdotgg#8738)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
* feat(mobile): update tool summaries and chat transitions (pingdotgg#8793)
* feat(web): play video attachments in chat (pingdotgg#8688)
* fix(web,mobile): snooze menu no longer offers the same wake time twice (pingdotgg#8741)
* fix(grok): allow model changes in existing threads (pingdotgg#8392)
Co-authored-by: Ahmed Besic <ahmed-besic@users.noreply.github.com>
* feat(mobile): pick, share, and receive files in threads (pingdotgg#8237)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Julius Marminge <julius0216@outlook.com>
* fix(web): reduce title bar scroll fade height (pingdotgg#8799)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(windows): strip quotes from repaired PATH (pingdotgg#8746)
* fix(web): open agent images in expanded preview (pingdotgg#8807)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(git): follow repository instructions in generated source control text (pingdotgg#8804)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(server): stop overpricing cached Claude tokens (pingdotgg#8806)
* fix(web): keep image preview above sidebar control (pingdotgg#8811)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(web): keep right panel synced with agent edits (pingdotgg#8803)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(web,mobile): render Codex citations and artifact templates (pingdotgg#8584)
* chore: add Windows setup script to t3.json (pingdotgg#8814)
* fix(web): fold interim turn responses (pingdotgg#8828)
* fix(web): use circle alert for failed tool calls (pingdotgg#8840)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* feat(mobile): add offline iPhone voice input (pingdotgg#8614)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(web): prevent pull request metadata overlap (pingdotgg#8790)
* chore(release): prepare v0.0.37
* Add mobile composer attachment menu with video support (pingdotgg#8843)
* fix(mobile): map native menu icon colors explicitly
* fix(web): restore unified activity logs and composer banners (pingdotgg#8734)
Co-authored-by: Julius Marminge <julius0216@outlook.com>
Co-authored-by: Julius Marminge <jmarminge@gmail.com>
* fix(web): address composer banner review follow-ups (pingdotgg#8850)
* fix(web): widen sync banners and simplify the working timer (pingdotgg#8855)
* fix(preview): improve browser recording quality (pingdotgg#8839)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(web): mark pull request links as external (pingdotgg#8856)
* fix(mobile): replace Callstack glass with Expo glass (pingdotgg#8862)
* fix(server): skip IDE detection in Claude probes (pingdotgg#8634)
* chore(macroscope): review diagnostic overrides (pingdotgg#8917)
Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
* fix(contracts): accept CLI event origins (pingdotgg#8905)
* fix(web): hide invalid slash skill completions (pingdotgg#8904)
* fix(mobile): defer draft navigation until submission completes (pingdotgg#8914)
* chore: disable CodeRabbit review status (pingdotgg#8933)
* Delete app.json (pingdotgg#8934)
* fix(web): show scrollbar for wide markdown tables (pingdotgg#8868)
* fix(mobile): shimmer active tool rows (pingdotgg#8932)
Co-authored-by: Julius Marminge <julius@mac.lan>
* chore(deps): bump Electron to 43.4.1 (pingdotgg#8626)
* fix(chat): smooth worktree setup status (pingdotgg#8922)
* feat(mobile): add video playback with native iOS controls (pingdotgg#8919)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(web): prevent chat metadata overlap (pingdotgg#8851)
* fix(server): preserve usage cache outside walked roots (pingdotgg#8540)
Co-authored-by: Simone <185146821+Lucenx9@users.noreply.github.com>
* feat(mobile): add native image and PDF previews (pingdotgg#8959)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(server): allow long thread IDs in HTTP routes (pingdotgg#8898)
* fix(shared): preserve Windows shell PATH priority (pingdotgg#8748)
* fix(web): make WSL settings searchable (pingdotgg#8881)
* feat(web): add expand/collapse all control to the files surface (pingdotgg#8889)
* Add auto_review configuration to coderabbit.yaml
* style: format CodeRabbit configuration
* feat(mobile): upload attachments while composing (pingdotgg#8978)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(chat): keep agent activity visible between actions (pingdotgg#8984)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(server): isolate remote web session cookies (pingdotgg#8085)
Co-authored-by: Julius Marminge <julius0216@outlook.com>
* feat(pull-requests): link GitHub references in markdown (pingdotgg#8812)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* perf(server): reduce frequency of full tool call output being loaded into memory from db (pingdotgg#8988)
* feat(web): add pull request list filters (pingdotgg#8809)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* feat(web): search individual settings by detail (pingdotgg#8831)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* feat(client): render viewed images in work logs (pingdotgg#8936)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(client): use package import for markdown image helpers (pingdotgg#9010)
* test: remove static presentation snapshots (pingdotgg#9008)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
* perf(server): bound snapshot activity payload memory (pingdotgg#9000)
* perf(server): cut idle CPU use and stop provider event leaks (pingdotgg#8187)
* perf(server): scan only appended transcript bytes for usage summaries (pingdotgg#9024)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Theo Browne <me@t3.gg>
* perf(server): cut chatty tool-update frames by 90% (pingdotgg#8368)
* fix(server): settle threads server-side (pingdotgg#8600)
* fix(clients): dedupe skills in composer menus (pingdotgg#8043)
* fix(server): stop OpenCode child sessions (pingdotgg#9005)
* perf(web): defer pull request line stats until visible (pingdotgg#6471)
Co-authored-by: Theo Browne <me@t3.gg>
* perf(server): skip full-message reads while streaming (pingdotgg#9032)
* perf(client-runtime): halve server config bootstrap traffic (pingdotgg#8367)
Reuse one server config subscription for session bootstrap and live updates.
Preserve environment theme opt-in, replay, deletion, slow subscriber recovery, and config stream failure handling.
Co-authored-by: Adamulek123 <adam.bogucki2018@gmail.com>
* fix(web): align un-settle banner action (pingdotgg#9033)
* fix(web): block type-to-focus behind open dialogs (pingdotgg#8139)
Co-authored-by: Simone <185146821+Lucenx9@users.noreply.github.com>
* feat(shortcuts): copy active thread reference (pingdotgg#8994)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(mobile): keep thread scroll bounds current after animations (pingdotgg#9013)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(server): cache project favicon resolution (pingdotgg#9080)
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
* feat(claude): add Claude Fable 5.1 model (pingdotgg#9078)
* fix(preview): restore recording and macOS rendering after Electron 43 (pingdotgg#9001)
Co-authored-by: Guillermo Casanova <guillermo.casanova.b@gmail.com>
* feat(desktop): add configurable quit shortcut confirmation (pingdotgg#9076)
* feat(web): open project settings from thread menus (pingdotgg#8925)
* fix(chat): reuse one row for live activity (pingdotgg#9062)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* feat(models): discover Claude models from remote manifest (pingdotgg#9084)
* Revert "fix(chat): reuse one row for live activity" (pingdotgg#9096)
* fix(web): sync sidebar PR state from open panel (pingdotgg#9092)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: maria <254055478+maria-rcks@users.noreply.github.com>
* fix(web): changing projects no longer creates a draft (pingdotgg#9097)
* fix(web): keep theme placeholder text dimmer than entered text (pingdotgg#9104)
* fix(web): keep the selected environment when changing projects (pingdotgg#9102)
* docs(plans): t3o-31 upstream sync to v0.0.38
* fix(board): clear the ten pre-existing typecheck errors before the upstream sync (t3o-31 P0)
Two test fakes failed with a bare Error in the Effect failure channel, a
closure-assigned let narrowed to never, and a single-override pill read
overriddenRows[0] under noUncheckedIndexedAccess. None changed behaviour;
they were masked because the recursive typecheck never reached apps/server.
* fix(sync): the three type errors and two test failures the v0.0.38 merge caused
- BoardModelRow reads planModeEnabled from client settings, as the composer does.
- findBranchPullRequest resolves the default branch for upstream's widened PR
cache key instead of passing null.
- The orphaned-session integration test mocks the supervisor reactor that the
startup seam yields (new inventory row).
- The projection resume test seeds board projector watermarks into
boards.projection_state, where t3o-26 reads them, and asserts over the union.
- searchSettings("work") now also matches upstream's worktree/network items.
* refactor(board): native title attributes become BoardHint tooltips
Upstream's new no-native-title-tooltip rule flags every intrinsic-element
title= in the board (61 sites). BoardHint wraps the styled Tooltip primitive
and renders its child as the trigger, so layout is unchanged; a nullish label
renders the child alone.
* docs(seams): record the v0.0.38 sync (t3o-31)
Merge-log row, the decisions taken (plans stay tracked, upstream's settlement
reactor accepted after audit, projector-enumeration policy, launcher protocol
note), an unmarked-edits debt table for the next sync, a marker census, the
three new upstream workflows to disable, and the runbook's per-package
verification notes.
* review(t3o-31): announce the board's status dots, and order the merge log
Round-1 nitpicks: a bare span's aria-label is not announced, so the working,
running and awaiting dots now carry role="img"; the v0.0.38 merge-log row
moves below the two 2026-08-09 rows so the table reads chronologically.
---------
Co-authored-by: Theo Browne <me@t3.gg>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Dara Adedeji <76637177+SunkenInTime@users.noreply.github.com>
Co-authored-by: shivam <91240327+shivamhwp@users.noreply.github.com>
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: abcdmku <63693423+abcdmku@users.noreply.github.com>
Co-authored-by: Guilherme Barros <gbarros1095@gmail.com>
Co-authored-by: Rishet11 <154429365+Rishet11@users.noreply.github.com>
Co-authored-by: Alex <me@pixp.cc>
Co-authored-by: maria <254055478+maria-rcks@users.noreply.github.com>
Co-authored-by: Naveed Iqbal <naveediqbal949@gmail.com>
Co-authored-by: Ishaan Kothari <ishaanko.mail@gmail.com>
Co-authored-by: Exotic <118054752+extoci@users.noreply.github.com>
Co-authored-by: Utkarsh Patil <73941998+UtkarshUsername@users.noreply.github.com>
Co-authored-by: Bilal Bakr <62337003+Bil0000@users.noreply.github.com>
Co-authored-by: Rakshith Bhat <88523594+RakshithBhat03@users.noreply.github.com>
Co-authored-by: Simone <lucenz@proton.me>
Co-authored-by: Simone <185146821+Lucenx9@users.noreply.github.com>
Co-authored-by: Tristan Knight <admin@snappeh.com>
Co-authored-by: Wout Stiens <71498452+StiensWout@users.noreply.github.com>
Co-authored-by: Pavlo Trinko <paul.trinko95@gmail.com>
Co-authored-by: codex <codex@users.noreply.github.com>
Co-authored-by: Julius Marminge <julius0216@outlook.com>
Co-authored-by: Rodrigo Brechard <rodrigobrechard@gmail.com>
Co-authored-by: Rodrigo Brechard <rodrigo@clubtidy.fr>
Co-authored-by: Adamulek123 <adam.bogucki2018@gmail.com>
Co-authored-by: spiky02plateau <155588579+spiky02plateau@users.noreply.github.com>
Co-authored-by: Carlos Jimenez <cjimenez@r21digital.com>
Co-authored-by: Mark Griffin <mrmg@deflexion.net>
Co-authored-by: MacKinley Smith <smithmackinley@gmail.com>
Co-authored-by: oliver <97427849+flamboh@users.noreply.github.com>
Co-authored-by: mweinbach <maxweinbach5@gmail.com>
Co-authored-by: Lars Nieuwenhuis <35393046+lnieuwenhuis@users.noreply.github.com>
Co-authored-by: Mohtasham Murshid <154406804+MohtashamMurshid@users.noreply.github.com>
Co-authored-by: Dara Adedeji <daraaded@amazon.com>
Co-authored-by: Dara Adedeji <daraadedeji07@gmail.com>
Co-authored-by: Ahmed Besic <ahmed-besic@users.noreply.github.com>
Co-authored-by: Michael Brown <michaeltbrown.mtb@gmail.com>
Co-authored-by: PC <pc@localhost>
Co-authored-by: 1xpixi <157762409+1xpixi@users.noreply.github.com>
Co-authored-by: Josh <gitlucky@pipelab.org>
Co-authored-by: Tradi3 <56069280+krutftw@users.noreply.github.com>
Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
Co-authored-by: Ivan Malison <IvanMalison@gmail.com>
Co-authored-by: Yash Singh <saiansh2525@gmail.com>
Co-authored-by: Gianmarco <gianmarcosimone89@gmail.com>
Co-authored-by: Julius Marminge <julius@mac.lan>
Co-authored-by: Illia Panasenko <hello@ipanasenko.me>
Co-authored-by: Matheson Steplock <ikifar2012@users.noreply.github.com>
Co-authored-by: Anirudh Coontoor <anirudh@gosupernova.live>
Co-authored-by: Nick Anisimov <n.anisimov.23@gmail.com>
Co-authored-by: Muhammad Waleed <114993336+walid-baharwal@users.noreply.github.com>
Co-authored-by: Ryan Hughes <ryan@heyoodle.com>
Co-authored-by: Vitaly Iegorov <vitalyiegorov@gmail.com>
Co-authored-by: Ahmed Besic <ahmed.besic2000@gmail.com>
Co-authored-by: maria <maria@kuuro.net>
Co-authored-by: Matthew Feroz <136640686+MatthewFeroz@users.noreply.github.com>
Co-authored-by: Julius Marminge <jmarminge@gmail.com>
Co-authored-by: Aditya Garud <153842990+yashranaway@users.noreply.github.com>
Co-authored-by: Yukun Shan <92423096+nateEc@users.noreply.github.com>
Co-authored-by: Will Sheldon <will@autimo.com>
Co-authored-by: mic <85814106+q1@users.noreply.github.com>
Co-authored-by: Guillermo Casanova <guillermo.casanova.b@gmail.com>
juliusmarminge added a commit that referenced this pull request Sep 2, 2026
Round-16 rebase onto main (5 commits, headlined by #8236 file
attachments in the client). Main's upload-aware send path — capability
probes, upload await/retry gating, uploaded-ref turn attachments with
dataUrl fallback, draft release on success — is woven into the v2
dispatch flow, timeline user rows render file attachments as download
links with the ChatView download handler, and the provider settings
editor cleanup keeps the branch's environment-field rows. The codex
feedback client flow stays unported, replay testkit configs gained
main's environmentThemesDir, and the rpc/settings/docs unions carry
both sides.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XXL1,000+ changed lines (additions + deletions).vouch:trustedPR 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

@t3dotgg