feat(client): render viewed images in work logs - #8936
Conversation
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Pro Plus Run ID: 📒 Files selected for processing (2)
Included review availability: Your plan provides up to 10 included reviews per hour; 8 remain after this review. 📝 WalkthroughWalkthroughThe change adds shared detection for viewed workspace image paths in work-log entries. Web and mobile thread views render eligible images above expanded work-log details. Web image rendering is exported for timeline reuse. ChangesWorkspace image previews
Estimated code review effort: 3 (Moderate) | ~20 minutes Merge Risk: ⚪ Minimal · up to The PR adds inline previews for qualifying viewed images in expanded work-log rows on web and mobile while reusing existing signed image rendering. No actionable merge-blocking risk remains beyond normal checks and review. Sequence Diagram(s)sequenceDiagram
participant ThreadView
participant WorkLogPresentation
participant WorkspaceImageRenderer
ThreadView->>WorkLogPresentation: derive viewed image path from work entry
WorkLogPresentation-->>ThreadView: return image path or null
ThreadView->>WorkspaceImageRenderer: render eligible image preview
WorkspaceImageRenderer-->>ThreadView: handle image expansion
Suggested reviewers: 🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
Full details: Description checkExplanation The description explains what changed, why it changed, UI evidence, validation steps, and known limitations. It is mostly complete, although it uses a Checks section instead of the template's Checklist heading.
✨ Finishing Touches🧪 Generate unit tests (beta)
Comment |
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.
❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.
Reviewed by Cursor Bugbot for commit 932970e. Configure here.
ApprovabilityVerdict: Not approved Macroscope's review found this PR not approvable — This PR adds automatic inline rendering and previewing of viewed images in work logs across web and mobile, including new signed-asset resolution for persisted attachments. The cross-platform capability and shared work-log behavior changes extend beyond a small isolated fix and merit human review. You can add or adjust custom eligibility rules. Learn more. |
There was a problem hiding this comment.
</antml de="">
Posted via Macroscope — UI Consistency
ddf9de1 to
22b6107
Compare
Restores main features dropped by the policy replay: #8569 theme wiring, #8850 composer banner follow-ups, #8855/#8904 composer fixes, #8831 settings search rework, #8803 workspace-mutation refresh (v2-adapted), #8840 circle-alert, #8584 codex artifact templates, #8688/#8807/#8936 video + image previews (web and mobile, v2-adapted), #8862 Expo glass, and the round's docs. Timeline thinking rows (#8984) stay on the v2 work-live system. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
## What's Changed * Add mobile composer attachment menu with video support by @juliusmarminge in pingdotgg/t3code#8843 * fix(web): restore unified activity logs and composer banners by @t3dotgg in pingdotgg/t3code#8734 * fix(web): address composer banner review follow-ups by @juliusmarminge in pingdotgg/t3code#8850 * fix(web): widen sync banners and simplify the working timer by @juliusmarminge in pingdotgg/t3code#8855 * fix(preview): improve browser recording quality by @maria-rcks in pingdotgg/t3code#8839 * fix(web): mark pull request links as external by @juliusmarminge in pingdotgg/t3code#8856 * fix(mobile): replace Callstack glass with Expo glass by @juliusmarminge in pingdotgg/t3code#8862 * fix(server): skip IDE detection in Claude probes by @yashranaway in pingdotgg/t3code#8634 * chore(macroscope): review diagnostic overrides by @t3-code[bot] in pingdotgg/t3code#8917 * fix(contracts): accept CLI event origins by @nateEc in pingdotgg/t3code#8905 * fix(web): hide invalid slash skill completions by @nateEc in pingdotgg/t3code#8904 * fix(mobile): defer draft navigation until submission completes by @juliusmarminge in pingdotgg/t3code#8914 * chore: disable CodeRabbit review status by @juliusmarminge in pingdotgg/t3code#8933 * Delete app.json by @juliusmarminge in pingdotgg/t3code#8934 * fix(web): show scrollbar for wide markdown tables by @UtkarshUsername in pingdotgg/t3code#8868 * fix(mobile): shimmer active tool rows by @juliusmarminge in pingdotgg/t3code#8932 * chore(deps): bump Electron to 43.4.1 by @StiensWout in pingdotgg/t3code#8626 * fix(chat): smooth worktree setup status by @juliusmarminge in pingdotgg/t3code#8922 * feat(mobile): add video playback with native iOS controls by @juliusmarminge in pingdotgg/t3code#8919 * fix(web): prevent chat metadata overlap by @MatthewFeroz in pingdotgg/t3code#8851 * fix(server): preserve usage cache outside walked roots by @Lucenx9 in pingdotgg/t3code#8540 * feat(mobile): add native image and PDF previews by @juliusmarminge in pingdotgg/t3code#8959 * fix(server): allow long thread IDs in HTTP routes by @nateEc in pingdotgg/t3code#8898 * fix(shared): preserve Windows shell PATH priority by @UtkarshUsername in pingdotgg/t3code#8748 * fix(web): make WSL settings searchable by @UtkarshUsername in pingdotgg/t3code#8881 * feat(web): add expand/collapse all control to the files surface by @UtkarshUsername in pingdotgg/t3code#8889 * feat(mobile): upload attachments while composing by @juliusmarminge in pingdotgg/t3code#8978 * fix(chat): keep agent activity visible between actions by @maria-rcks in pingdotgg/t3code#8984 * fix(server): isolate remote web session cookies by @Bil0000 in pingdotgg/t3code#8085 * feat(pull-requests): link GitHub references in markdown by @maria-rcks in pingdotgg/t3code#8812 * perf(server): reduce frequency of full tool call output being loaded into memory from db by @t3dotgg in pingdotgg/t3code#8988 * feat(web): add pull request list filters by @maria-rcks in pingdotgg/t3code#8809 * feat(web): search individual settings by detail by @maria-rcks in pingdotgg/t3code#8831 * feat(client): render viewed images in work logs by @maria-rcks in pingdotgg/t3code#8936 * fix(client): use package import for markdown image helpers by @juliusmarminge in pingdotgg/t3code#9010 * test: remove static presentation snapshots by @t3-code[bot] in pingdotgg/t3code#9008 * perf(server): bound snapshot activity payload memory by @t3dotgg in pingdotgg/t3code#9000 * perf(server): cut idle CPU use and stop provider event leaks by @t3dotgg in pingdotgg/t3code#8187 * perf(server): scan only appended transcript bytes for usage summaries by @StiensWout in pingdotgg/t3code#9024 * perf(server): cut chatty tool-update frames by 90% by @Adamulek123 in pingdotgg/t3code#8368 * fix(server): settle threads server-side by @t3dotgg in pingdotgg/t3code#8600 * fix(clients): dedupe skills in composer menus by @Adamulek123 in pingdotgg/t3code#8043 * fix(server): stop OpenCode child sessions by @t3dotgg in pingdotgg/t3code#9005 * perf(web): defer pull request line stats until visible by @Adamulek123 in pingdotgg/t3code#6471 * perf(server): skip full-message reads while streaming by @t3dotgg in pingdotgg/t3code#9032 * perf(client-runtime): halve server config bootstrap traffic by @Adamulek123 in pingdotgg/t3code#8367 * fix(web): align un-settle banner action by @StiensWout in pingdotgg/t3code#9033 * fix(web): block type-to-focus behind open dialogs by @Lucenx9 in pingdotgg/t3code#8139 * feat(shortcuts): copy active thread reference by @maria-rcks in pingdotgg/t3code#8994 * fix(mobile): keep thread scroll bounds current after animations by @juliusmarminge in pingdotgg/t3code#9013 * fix(server): cache project favicon resolution by @willsheldon in pingdotgg/t3code#9080 * feat(claude): add Claude Fable 5.1 model by @q1 in pingdotgg/t3code#9078 * fix(preview): restore recording and macOS rendering after Electron 43 by @StiensWout in pingdotgg/t3code#9001 * feat(desktop): add configurable quit shortcut confirmation by @juliusmarminge in pingdotgg/t3code#9076 * feat(web): open project settings from thread menus by @SunkenInTime in pingdotgg/t3code#8925 * fix(chat): reuse one row for live activity by @maria-rcks in pingdotgg/t3code#9062 * feat(models): discover Claude models from remote manifest by @juliusmarminge in pingdotgg/t3code#9084 * Revert "fix(chat): reuse one row for live activity" by @maria-rcks in pingdotgg/t3code#9096 * fix(web): sync sidebar PR state from open panel by @t3-code[bot] in pingdotgg/t3code#9092 * fix(web): changing projects no longer creates a draft by @extoci in pingdotgg/t3code#9097 * fix(web): keep theme placeholder text dimmer than entered text by @flamboh in pingdotgg/t3code#9104 * fix(web): keep the selected environment when changing projects by @t3dotgg in pingdotgg/t3code#9102 ## New Contributors * @willsheldon made their first contribution in pingdotgg/t3code#9080 * @q1 made their first contribution in pingdotgg/t3code#9078 **Full Changelog**: pingdotgg/t3code@v0.0.37...v0.0.38 Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.38

Expanded image-read work-log rows currently show only file paths, and persisted T3 attachment paths fail when treated as workspace files. This keeps the shared work-log selector, resolves each viewed image to either a workspace-file or attachment asset, reuses the signed asset renderers on web and mobile, and removes duplicate web grouping code.
Evidence
Before: an expanded
Read 1 filerow falls back toImage unavailablefor a persisted T3 attachment.After: the isolated T3 preview resolved the same path shape as an
attachmentasset, returned the SVG with HTTP 200, and rendered it without the unavailable fallback. The T3 snapshot and recording endpoints timed out, so the after screenshot is still unverified.Checks
vp run --filter @t3tools/client-runtime typecheckvp run --filter @t3tools/web typecheckvp run --filter @t3tools/mobile typecheckTypeError: Cannot read properties of undefined (reading 'config')Built with
gpt-5.6-solin T3 Code.Note
Medium Risk
Changes asset resolution and signed URL loading for work-log previews across web and mobile; incorrect path classification could still show unavailable images but does not touch auth or data persistence.
Overview
Expanded read work-log rows can now show an inline image preview instead of only a path string. Shared logic in
client-runtimepicks eligible image paths from entry detail (workEntryViewedImagePath) and resolves them to signed attachment or workspace-file assets (resolveViewedImageAsset), including persisted T3 attachment paths that previously broke when treated as workspace files.Web and mobile reuse the same asset image components (
ChatMarkdownAssetImage/ generalizedThreadMarkdownImage) inside expanded work-log detail, with URL fragments preserved for markdown-style sources. Web MessagesTimeline.logic drops duplicated tool-group summarization and re-exports it fromwork-log/presentation; dynamic “Read file” tool rows are matched case-insensitively.Reviewed by Cursor Bugbot for commit 22b6107. Bugbot is set up for automated code reviews on this repo. Configure here.
Note
Render viewed images in work-log entries on mobile and web
ThreadMarkdownImage(mobile) andChatMarkdownAssetImage(web) to accept either an attachment or a workspace-file resource, and to append optionalsrcFragment(hash/query) to the resolved asset URL.workEntryViewedImagePathandresolveViewedImageAssetin presentation.ts to detect when a work-log entry reflects an image read and to classify the source into anAssetResource.renderImage(mobile) orChatMarkdownAssetImage(web) callbacks.@t3tools/client-runtime/work-log/presentation.toolGroupActionto classify dynamic tool calls named "Read File" (case-insensitive, whitespace-trimmed) as areadaction.ThreadMarkdownImageprops changed fromthreadId/pathto aresourceprop; any out-of-tree callers of the old signature will break.Macroscope summarized 22b6107.