Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
95 commits
Select commit Hold shift + click to select a range
0ff87f2
fix(web): keep citation comment when popover is dismissed (#10831)
flamboh Sep 20, 2026
c14f601
fix(web): keep narrow chat headers readable and aligned (#12453)
shivamhwp Sep 20, 2026
fa1e171
refactor(observability): hold OTLP export settings per signal (#12657)
yordis Sep 20, 2026
ead1dee
fix(web): explain what enabling network access means in its confirmat…
Mnigos Sep 20, 2026
9f0c9f7
fix(web): reuse current PR status in the sidebar (#12545)
flamboh Sep 20, 2026
6a699f0
fix(web): stabilize pull request loading layout (#12721)
flamboh Sep 20, 2026
55c2427
fix(desktop): align preview recording cursors and show input feedback…
juliusmarminge Sep 20, 2026
7ade2d2
fix(web): the Run on / Workspace menu closes after a pick (#12685)
Mnigos Sep 20, 2026
3cfebf4
fix(web): keep portaled menus clickable over Electron drag regions (#…
maria-rcks Sep 20, 2026
5d9e27a
fix(web): render citations in queued messages (#12403)
maria-rcks Sep 20, 2026
2d8f9a8
fix(web): keep the timeline still when the resting composer expands (…
flamboh Sep 20, 2026
45e06f4
fix: composer hero reads project name to screen readers (#12397)
Leos-Khai Sep 20, 2026
f6cc6bc
fix(mobile): respect word wrap in diffs (#12590)
jakeleventhal Sep 20, 2026
adcd908
fix(web): allow full contrast in assistant replies (#12405)
maria-rcks Sep 20, 2026
9334924
fix(web): pull request chips share the link hover preview (#12719)
flamboh Sep 20, 2026
584450a
fix(web): compact the worktree setup glass popover (#12802)
maria-rcks Sep 20, 2026
67285e4
fix(web): route keyboard submit through the primary worktree action (…
maria-rcks Sep 20, 2026
c789cd1
fix(web): skip image inline chip when composer is empty (#12528)
maria-rcks Sep 20, 2026
f4d979a
fix(web): only show notice details when text is clipped (#12760)
t3-code[bot] Sep 20, 2026
9f73ca3
fix(devices): recover simulator streams after failures (#12639)
juliusmarminge Sep 20, 2026
1ba471a
chore(server): bump device tooling versions (#12809)
juliusmarminge Sep 21, 2026
2b17823
fix: allow more attachments without raising the image payload budget …
Bil0000 Sep 21, 2026
051a405
fix(web): device Reconnect starts one stream instead of two (#12808)
juliusmarminge Sep 21, 2026
58f8981
fix(server): tolerate shutting down an iOS simulator that is already …
juliusmarminge Sep 21, 2026
411da2a
feat(web): use the linked pull request row layout on the pull request…
maria-rcks Sep 21, 2026
2efb817
fix(clients): keep backslashes in copied Codex citations (#12243)
Lucenx9 Sep 21, 2026
f7efb53
feat(web): truncate branch names and paths in the middle (#12805)
maria-rcks Sep 21, 2026
dca84ef
fix(web): paste markdown with inline code inside bold, italic, or str…
Gigioxx Sep 21, 2026
a9ab904
feat(web): show the pull request refresh spinning in the detail heade…
maria-rcks Sep 21, 2026
a4bc7de
fix(web): dismiss composer suggestions with Escape (#12836)
Yash-Singh1 Sep 21, 2026
a6cb1dd
fix(mobile): keep the source worktree when starting a thread on a bra…
SunkenInTime Sep 21, 2026
6cc7f70
fix(web): keep composer controls visible while they fit (#12837)
maria-rcks Sep 21, 2026
5c5fa5f
feat(devices): show installed and running tool versions per host (#12…
juliusmarminge Sep 21, 2026
3b836f9
feat(devices): show automatic update progress and host retry (#12817)
juliusmarminge Sep 21, 2026
61b25b8
feat(devices): add read-only update discovery and remote ownership (#…
juliusmarminge Sep 21, 2026
790be6d
fix(devices): safely reclaim obsolete managed tool versions (#12819)
juliusmarminge Sep 21, 2026
30e3649
fix(web): match thread notification icons to sidebar status (#12806)
maria-rcks Sep 21, 2026
f391b88
fix(web): move sidebar shelves as one block (#11772)
maria-rcks Sep 21, 2026
6b0a04a
fix(web): offer undo after unpinning a thread (#10744)
saphid Sep 21, 2026
5781b52
feat(web): undo settle, snooze and archive, with a mod+z shortcut (#1…
juliusmarminge Sep 21, 2026
1eeeabb
fix(mobile): use a proper pull request icon on iOS (#12855)
juliusmarminge Sep 21, 2026
b379b5b
test(web): remove redundant favicon test (#12856)
t3-code[bot] Sep 21, 2026
1de563c
feat(devices): offer manual updates in tool version details (#12877)
juliusmarminge Sep 21, 2026
371b52d
feat(web): answer pull request actions on the row at once (#12843)
maria-rcks Sep 21, 2026
33cb911
fix(mobile): stop iOS autocorrect from rewriting search queries (#12949)
juliusmarminge Sep 21, 2026
2c2fa8c
fix(web): pull request embed chip shows the state icon (#12951)
flamboh Sep 21, 2026
2d377bf
fix(web): dismiss selection actions when pressing buttons (#12950)
Yash-Singh1 Sep 21, 2026
d2a90b9
fix(web): name message copy actions accurately (#12865)
saphid Sep 21, 2026
80d9c18
fix(contracts): old message-sent events without turnId no longer stop…
Mnigos Sep 21, 2026
e1cbb70
fix(web): the custom snooze calendar starts the week where the locale…
Mnigos Sep 21, 2026
76cc9b0
chore(mobile): bump app version to 1.3.0
t3-code[bot] Sep 21, 2026
1262d2f
feat(server): let t3.json limit or disable submodule init in new work…
juliusmarminge Sep 22, 2026
742173a
feat(settings): resolve t3.json inside the project settings resolver …
juliusmarminge Sep 22, 2026
0141bc2
feat(settings): choose how new worktrees initialize submodules (#12955)
juliusmarminge Sep 22, 2026
9a609a4
fix(web): show thread undo notice in the sidebar (#12972)
juliusmarminge Sep 22, 2026
5423ba0
feat(web): merge the comment and review buttons into one composer (#1…
Bil0000 Sep 22, 2026
e65bc1c
fix(web): allow text selection when renaming threads (#12935)
carterwsmith Sep 22, 2026
5a61f50
chore(lint): report className restyling of components/ui exports (#12…
juliusmarminge Sep 22, 2026
c26119a
refactor(web): drop className overrides that repeat the base styles (…
juliusmarminge Sep 22, 2026
438bf46
fix(web): close menus when clicking into the browser tab (#11148)
Gigioxx Sep 22, 2026
b5a0f81
refactor(web): give Spinner and RefreshIcon a size prop (#12985)
juliusmarminge Sep 22, 2026
aff9318
fix(web): retry failed attachment uploads after reconnect (#10338)
StiensWout Sep 22, 2026
da6a85b
fix(web): respect panel motion in composer transitions (#11064)
gsimone Sep 22, 2026
7c2702d
fix(web): read panel animation settings in the composer (#13098)
juliusmarminge Sep 22, 2026
f25a8e4
feat(models): add opus 5.5 without changing existing aliases (#13094)
t3-code[bot] Sep 22, 2026
17e3477
Update model manifest with new timestamps and models
juliusmarminge Sep 22, 2026
558fdf8
chore(coil): merge upstream/main 17e34773b1 (66 commits)
radroid Sep 22, 2026
2041766
fix(coil): the offline queue releases the attachment uploads it drops
radroid Sep 22, 2026
85cc654
docs(coil): re-baseline the seam ledger for the 2026-09-22 sync
radroid Sep 22, 2026
c0490e9
refactor(web): use ghost-muted where ghost buttons restyled to muted …
juliusmarminge Sep 22, 2026
1a81ea8
refactor(web): fold repeated overrides into ui defaults (#13021)
juliusmarminge Sep 22, 2026
ce98d41
refactor(web): mark the current menu value with MenuRadioGroup (#13022)
juliusmarminge Sep 22, 2026
ed85694
refactor(web): add an active prop to CommandItem (#13023)
juliusmarminge Sep 22, 2026
bbd5cc0
chore(lint): exempt CollapsibleTrigger from no-restyle (#13024)
juliusmarminge Sep 22, 2026
9515016
refactor(web): use icon-xs where icon buttons were forced to size-6 (…
juliusmarminge Sep 22, 2026
b4f1f18
refactor(web): add radius="none" to ScrollArea (#13026)
juliusmarminge Sep 22, 2026
7b54af9
refactor(web): add font="mono" to Input (#13027)
juliusmarminge Sep 22, 2026
be80e36
refactor(web): add SidebarInput (#13028)
juliusmarminge Sep 22, 2026
8d02447
refactor(web): add a label variant to Badge (#13029)
juliusmarminge Sep 22, 2026
7d658c2
refactor(web): give Skeleton three shapes (#13030)
juliusmarminge Sep 22, 2026
aa2b25d
refactor(web): one wrap width for tooltips, plus a code variant (#13031)
juliusmarminge Sep 22, 2026
f3d3fe4
refactor(web): one vertical rhythm for dialog bodies (#13032)
juliusmarminge Sep 22, 2026
18aa703
refactor(web): ghost-muted icons follow the text; add ghost-destructi…
juliusmarminge Sep 22, 2026
4c9fbf1
refactor(web): InlineButton underlines on hover and takes a tone (#13…
juliusmarminge Sep 22, 2026
d7736e0
refactor(web): one minimum width for menus, three widths for popovers…
juliusmarminge Sep 22, 2026
da89e10
refactor(web): every textarea caps its growth; the diff comment box i…
juliusmarminge Sep 22, 2026
016cdb9
refactor(web): stacked sidebar groups share one inset (#13037)
juliusmarminge Sep 22, 2026
e420ef9
refactor(web): Collapsible stays a plain container (#13038)
juliusmarminge Sep 22, 2026
0fa4a85
refactor(web): show more / show less are ordinary sidebar sub-rows (#…
juliusmarminge Sep 22, 2026
0ee02eb
refactor(web): Empty has three sizes (#13040)
juliusmarminge Sep 22, 2026
4321aa2
refactor(web): one row height for select, combobox and radio items (#…
juliusmarminge Sep 22, 2026
1c2f933
refactor(web): render menu and popover triggers through Button (#13042)
juliusmarminge Sep 22, 2026
83bbfa7
refactor(web): sidebar alerts use the standard variants; one keycap (…
juliusmarminge Sep 22, 2026
4a7d0b9
chore(coil): merge upstream/main 83bbfa7e87 (24 commits)
radroid Sep 22, 2026
2edd690
docs(coil): repoint the seam ledger at the final merge-base
radroid Sep 22, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
1 change: 1 addition & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -164,6 +164,7 @@ Full glossary with file links: `docs/internals/glossary.md`
## Taste

- Complexity belongs at the adapter boundary. Orchestration stays pure, UI stays dumb.
- `apps/web/src/components/ui` exports own their look. Pick a `variant` or `size`; do not restyle one with `className`. If none fits, add a variant to the component, not classes at the call site. Layout classes (width, flex, margin, position) belong on the parent. `shadcn/no-restyle` reports violations and CI caps their count.
- Inferred types over annotations. `any` is the enemy.
- Comments describe how a thing is used, and move when the code moves. To be used mostly to describe functions, not to annotate every line of behavior.
- Our users drive agents all day and notice a dropped frame, a lying spinner, and a stale label. No continuously repainting animations; they peg the GPU on high-refresh displays.
Expand Down
2 changes: 2 additions & 0 deletions apps/desktop/src/ipc/channels.ts
Original file line number Diff line number Diff line change
Expand Up @@ -116,6 +116,8 @@ export const MAC_PERMISSION_HELPER_CHANNEL = "desktop:mac-permission-helper";

export const CHECK_SYSTEM_PERMISSION_CHANNEL = "desktop:check-system-permission";

export const PREVIEW_RECORDING_INPUT_CHANNEL = "desktop:preview-recording-input";

// coil: fork-owned update delivery. Distinct from the `desktop:update-*` channels above, which
// belong to upstream's electron-updater surface — the two must never share a channel, or a build
// with both enabled would have each answering the other's messages.
Expand Down
25 changes: 20 additions & 5 deletions apps/desktop/src/ipc/methods/preview.ts
Original file line number Diff line number Diff line change
Expand Up @@ -30,11 +30,13 @@ import {
} from "@t3tools/contracts";
import * as Effect from "effect/Effect";
import * as Schema from "effect/Schema";
import * as Option from "effect/Option";
import * as NodeURL from "node:url";

import * as ElectronWindow from "../../electron/ElectronWindow.ts";
import * as BrowserImport from "../../preview/BrowserImport/BrowserImport.ts";
import * as PreviewManager from "../../preview/Manager.ts";
import * as DesktopClientSettings from "../../settings/DesktopClientSettings.ts";
import { PREVIEW_WEBVIEW_PREFERENCES } from "../../preview/WebviewPreferences.ts";
import * as IpcChannels from "../channels.ts";
import * as DesktopIpc from "../DesktopIpc.ts";
Expand All @@ -50,6 +52,9 @@ export const installPreviewEventForwarding = Effect.fn(
yield* manager.subscribeRecordingFrames((frame) =>
electronWindow.sendAll(IpcChannels.PREVIEW_RECORDING_FRAME_CHANNEL, frame),
);
yield* manager.subscribeRecordingInputs((event) =>
electronWindow.sendAll(IpcChannels.PREVIEW_RECORDING_INPUT_CHANNEL, event),
);
yield* manager.subscribePointerEvents((event) =>
electronWindow.sendAll(IpcChannels.PREVIEW_POINTER_EVENT_CHANNEL, event),
);
Expand Down Expand Up @@ -180,11 +185,21 @@ export const cancelPickElement = tabMethod(
"desktop.ipc.preview.cancelPickElement",
(manager, tabId) => manager.cancelPickElement(tabId),
);
export const startRecording = tabMethod(
IpcChannels.PREVIEW_RECORDING_START_CHANNEL,
"desktop.ipc.preview.startRecording",
(manager, tabId) => manager.startRecording(tabId),
);
export const startRecording = DesktopIpc.makeIpcMethod({
channel: IpcChannels.PREVIEW_RECORDING_START_CHANNEL,
payload: DesktopPreviewTabInputSchema,
result: Schema.Void,
handler: Effect.fn("desktop.ipc.preview.startRecording")(function* ({ tabId }) {
const manager = yield* PreviewManager.PreviewManager;
const store = yield* DesktopClientSettings.DesktopClientSettings;
const settings = yield* store.get;
const options = Option.map(settings, (value) => ({
showKeyPresses: value.browserRecordingShowKeyPresses,
showMousePresses: value.browserRecordingShowMousePresses,
}));
yield* manager.startRecording(tabId, Option.getOrUndefined(options));
}),
});
export const stopRecording = tabMethod(
IpcChannels.PREVIEW_RECORDING_STOP_CHANNEL,
"desktop.ipc.preview.stopRecording",
Expand Down
10 changes: 10 additions & 0 deletions apps/desktop/src/preload.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import type {
DesktopBridge,
DesktopPreviewPointerEvent,
DesktopPreviewRecordingInputEvent,
DesktopPreviewRecordingFrame,
DesktopPreviewTabState,
DesktopSnapShotEvent,
Expand Down Expand Up @@ -356,6 +357,15 @@ contextBridge.exposeInMainWorld("desktopBridge", {
ipcRenderer.invoke(IpcChannels.PREVIEW_PICTURE_IN_PICTURE_CLOSE_CHANNEL, { tabId }),
},
recording: {
onInput: (listener) => {
const wrappedListener = (_event: Electron.IpcRendererEvent, event: unknown) => {
if (typeof event !== "object" || event === null) return;
listener(event as DesktopPreviewRecordingInputEvent);
};
ipcRenderer.on(IpcChannels.PREVIEW_RECORDING_INPUT_CHANNEL, wrappedListener);
return () =>
ipcRenderer.removeListener(IpcChannels.PREVIEW_RECORDING_INPUT_CHANNEL, wrappedListener);
},
startScreencast: (tabId) =>
ipcRenderer.invoke(IpcChannels.PREVIEW_RECORDING_START_CHANNEL, { tabId }),
stopScreencast: (tabId) =>
Expand Down
5 changes: 5 additions & 0 deletions apps/desktop/src/preview/GuestProtocol.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,3 +5,8 @@ export const ANNOTATION_CAPTURED_CHANNEL = "preview:annotation-captured";
export const ANNOTATION_THEME_CHANNEL = "preview:annotation-theme";
export const HUMAN_INPUT_CHANNEL = "preview:human-input";
export const MOUSE_NAVIGATE_CHANNEL = "preview:mouse-navigate";
export const RECORDING_CURSOR_CHANNEL = "preview:recording-cursor";
export const RECORDING_POINTER_CHANNEL = "preview:recording-pointer";
export const RECORDING_KEY_CHANNEL = "preview:recording-key";
export const RECORDING_INPUT_CHANNEL = "preview:recording-input";
export const RECORDING_CONTROLLER_CHANNEL = "preview:recording-controller";
Loading
Loading