Fix inline Markdown image previews in chat - #4785

Closed
Aculnaj wants to merge 2 commits into
pingdotgg:mainfrom
Aculnaj:t3code/inline-chat-image-previews
Closed

Fix inline Markdown image previews in chat#4785
Aculnaj wants to merge 2 commits into
pingdotgg:mainfrom
Aculnaj:t3code/inline-chat-image-previews

Conversation

@Aculnaj

@AculnajAculnaj commented Jul 28, 2026

Copy link
Copy Markdown

What Changed

  • Render Markdown images in assistant messages as compact inline previews.
  • Resolve workspace-local image paths through T3 Code's existing signed asset route, including relative, absolute, and file:// paths.
  • Add loading and unavailable states while preserving external image URLs.
  • Reuse the existing expanded-image dialog when an inline preview is clicked.
  • Keep linked Markdown images under the surrounding link's interaction instead of nesting an image-preview button inside the anchor.
  • Add focused tests for Markdown image path resolution and linked-image semantics.

Why

When the T3 Code server runs on one device and the web client is opened on another, local image paths from assistant messages cannot be loaded directly by the browser. They currently render as broken images with only their alt text visible.

Using the existing thread-scoped asset flow lets the environment that owns the workspace serve the image securely to the connected client without broadening filesystem access.

UI Changes

Before

Workspace-local Markdown images render as broken image icons and alt text.

Before screenshot to be attached.

After

Images render as compact previews with a subtle outline. Clicking a preview opens the existing expanded-image dialog, and Escape closes it again.

After screenshot and short interaction recording to be attached.

Verification

  • vp test run apps/web/src/markdown-images.test.ts apps/web/src/components/chat/MessagesTimeline.test.tsx — 19 tests passed.
  • vp run --filter @t3tools/web typecheck passed.
  • Targeted formatting and linting completed without errors.
  • Integrated browser verification in an isolated T3 environment confirmed that workspace images were served through /api/assets/; standalone images expanded and closed with Escape, while a linked image opened only its link without rendering a nested button or opening the image dialog.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes
  • I included a video for animation/interaction changes

Note

Medium Risk
Touches chat rendering and workspace file asset URLs for assistant messages; scope is bounded to image paths and existing asset APIs, but remote clients now depend on signed asset delivery for local paths.

Overview
Assistant chat Markdown now renders img nodes as inline previews instead of raw broken <img> tags when paths point at workspace images.

Workspace-local sources (relative, absolute, and file://) are resolved with new resolveMarkdownImageFile and loaded through the existing thread-scoped signed asset route via useAssetUrlState, with loading and unavailable placeholders. External URLs still use direct src. Standalone previews can open the existing expanded-image dialog through a new onImageExpand prop wired from MessagesTimeline.

Linked images ([![alt](img)](url)) no longer nest a zoom button inside the anchor—a context flag disables expand so the link keeps sole click behavior.

Tests cover path resolution and linked-vs-standalone image semantics in the timeline markup.

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

Note

Fix inline Markdown image previews in chat with workspace file resolution and expansion

  • Adds a custom image renderer in ChatMarkdown.tsx that resolves workspace-relative image paths to asset URLs, shows loading/unavailable placeholders, and triggers an onImageExpand callback on click.
  • Introduces markdown-images.ts with resolveMarkdownImageFile to determine when a markdown image src refers to a workspace file eligible for asset resolution.
  • Images nested inside links (anchor tags) suppress the expansion button and remain link-clickable only, detected via a new MarkdownImageInsideLinkContext.
  • Wires onImageExpand through AssistantTimelineRow in MessagesTimeline.tsx so assistant message images trigger the timeline's existing image expansion handler.

Macroscope summarized a8dbe3e.

- Resolve workspace image paths against the thread cwd
- Add loading, unavailable, and expandable image states
- Cover markdown image path resolution with focused tests
@coderabbitai

coderabbitaiBot commented Jul 28, 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: a4a354d3-5d8f-485e-b335-0c5e4ec3e64f

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

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

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

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Jul 28, 2026
Comment threadapps/web/src/components/ChatMarkdown.tsx
@Aculnaj
Aculnaj marked this pull request as ready for review July 29, 2026 21:31

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

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Want fixes drafted automatically? Bugbot Autofix can create code changes for findings. A team admin can enable Autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit a8dbe3e. Configure here.

className?: string;
/** Treat single newlines as hard breaks — chat-style user input. */
lineBreaks?: boolean;
onImageExpand?: ((preview: ExpandedImagePreview) => void) | undefined;

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.

File image URLs sanitized away

Medium Severity

rehype-sanitize strips file:// image src attributes because CHAT_MARKDOWN_SANITIZE_SCHEMA only permits the file protocol for href. This prevents file:// workspace images from rendering, as the custom image component never receives the original source to process.

Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit a8dbe3e. Configure here.

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

@Aculnaj can you please take a look?

@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR introduces a new feature (inline Markdown image previews) with multiple new components and UI capabilities. There is also an unresolved review comment identifying a potential bug where file:// URLs get sanitized, which could prevent workspace images from rendering correctly.

You can customize Macroscope's approvability policy. Learn more.

@TheBit

Copy link
Copy Markdown

When the T3 Code server runs on one device and the web client is opened on another

It doesn't matter if this is on one device/client or another. You can't just see any pics in the chat, which is very sad :(
Just prompt:

Take the screenshot of https://example.com/ and paste it here

Знімок екрана 2026-08-09 о 18 23 16

@t3dotgg

Copy link
Copy Markdown
Member

Note

🤖 GPT-5.6 Sol responding on behalf of Theo

Closing this PR after an automated pass over open pull requests. Workspace image rendering already shipped in #6433.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:L100-499 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@Aculnaj@TheBit@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

Fix inline Markdown image previews in chat - #4785

Closed
Aculnaj wants to merge 2 commits into
pingdotgg:mainfrom
Aculnaj:t3code/inline-chat-image-previews
Closed

Fix inline Markdown image previews in chat#4785
Aculnaj wants to merge 2 commits into
pingdotgg:mainfrom
Aculnaj:t3code/inline-chat-image-previews

Conversation

@Aculnaj

@AculnajAculnaj commented Jul 28, 2026

Copy link
Copy Markdown

What Changed

  • Render Markdown images in assistant messages as compact inline previews.
  • Resolve workspace-local image paths through T3 Code's existing signed asset route, including relative, absolute, and file:// paths.
  • Add loading and unavailable states while preserving external image URLs.
  • Reuse the existing expanded-image dialog when an inline preview is clicked.
  • Keep linked Markdown images under the surrounding link's interaction instead of nesting an image-preview button inside the anchor.
  • Add focused tests for Markdown image path resolution and linked-image semantics.

Why

When the T3 Code server runs on one device and the web client is opened on another, local image paths from assistant messages cannot be loaded directly by the browser. They currently render as broken images with only their alt text visible.

Using the existing thread-scoped asset flow lets the environment that owns the workspace serve the image securely to the connected client without broadening filesystem access.

UI Changes

Before

Workspace-local Markdown images render as broken image icons and alt text.

Before screenshot to be attached.

After

Images render as compact previews with a subtle outline. Clicking a preview opens the existing expanded-image dialog, and Escape closes it again.

After screenshot and short interaction recording to be attached.

Verification

  • vp test run apps/web/src/markdown-images.test.ts apps/web/src/components/chat/MessagesTimeline.test.tsx — 19 tests passed.
  • vp run --filter @t3tools/web typecheck passed.
  • Targeted formatting and linting completed without errors.
  • Integrated browser verification in an isolated T3 environment confirmed that workspace images were served through /api/assets/; standalone images expanded and closed with Escape, while a linked image opened only its link without rendering a nested button or opening the image dialog.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes
  • I included a video for animation/interaction changes

Note

Medium Risk
Touches chat rendering and workspace file asset URLs for assistant messages; scope is bounded to image paths and existing asset APIs, but remote clients now depend on signed asset delivery for local paths.

Overview
Assistant chat Markdown now renders img nodes as inline previews instead of raw broken <img> tags when paths point at workspace images.

Workspace-local sources (relative, absolute, and file://) are resolved with new resolveMarkdownImageFile and loaded through the existing thread-scoped signed asset route via useAssetUrlState, with loading and unavailable placeholders. External URLs still use direct src. Standalone previews can open the existing expanded-image dialog through a new onImageExpand prop wired from MessagesTimeline.

Linked images ([![alt](img)](url)) no longer nest a zoom button inside the anchor—a context flag disables expand so the link keeps sole click behavior.

Tests cover path resolution and linked-vs-standalone image semantics in the timeline markup.

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

Note

Fix inline Markdown image previews in chat with workspace file resolution and expansion

  • Adds a custom image renderer in ChatMarkdown.tsx that resolves workspace-relative image paths to asset URLs, shows loading/unavailable placeholders, and triggers an onImageExpand callback on click.
  • Introduces markdown-images.ts with resolveMarkdownImageFile to determine when a markdown image src refers to a workspace file eligible for asset resolution.
  • Images nested inside links (anchor tags) suppress the expansion button and remain link-clickable only, detected via a new MarkdownImageInsideLinkContext.
  • Wires onImageExpand through AssistantTimelineRow in MessagesTimeline.tsx so assistant message images trigger the timeline's existing image expansion handler.

Macroscope summarized a8dbe3e.

- Resolve workspace image paths against the thread cwd
- Add loading, unavailable, and expandable image states
- Cover markdown image path resolution with focused tests
@coderabbitai

coderabbitaiBot commented Jul 28, 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: a4a354d3-5d8f-485e-b335-0c5e4ec3e64f

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

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

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

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Jul 28, 2026
Comment threadapps/web/src/components/ChatMarkdown.tsx
@Aculnaj
Aculnaj marked this pull request as ready for review July 29, 2026 21:31

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

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Want fixes drafted automatically? Bugbot Autofix can create code changes for findings. A team admin can enable Autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit a8dbe3e. Configure here.

className?: string;
/** Treat single newlines as hard breaks — chat-style user input. */
lineBreaks?: boolean;
onImageExpand?: ((preview: ExpandedImagePreview) => void) | undefined;

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.

File image URLs sanitized away

Medium Severity

rehype-sanitize strips file:// image src attributes because CHAT_MARKDOWN_SANITIZE_SCHEMA only permits the file protocol for href. This prevents file:// workspace images from rendering, as the custom image component never receives the original source to process.

Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit a8dbe3e. Configure here.

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

@Aculnaj can you please take a look?

@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR introduces a new feature (inline Markdown image previews) with multiple new components and UI capabilities. There is also an unresolved review comment identifying a potential bug where file:// URLs get sanitized, which could prevent workspace images from rendering correctly.

You can customize Macroscope's approvability policy. Learn more.

@TheBit

Copy link
Copy Markdown

When the T3 Code server runs on one device and the web client is opened on another

It doesn't matter if this is on one device/client or another. You can't just see any pics in the chat, which is very sad :(
Just prompt:

Take the screenshot of https://example.com/ and paste it here

Знімок екрана 2026-08-09 о 18 23 16

@t3dotgg

Copy link
Copy Markdown
Member

Note

🤖 GPT-5.6 Sol responding on behalf of Theo

Closing this PR after an automated pass over open pull requests. Workspace image rendering already shipped in #6433.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:L100-499 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@Aculnaj@TheBit@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

Fix inline Markdown image previews in chat - #4785

Closed
Aculnaj wants to merge 2 commits into
pingdotgg:mainfrom
Aculnaj:t3code/inline-chat-image-previews
Closed

Fix inline Markdown image previews in chat#4785
Aculnaj wants to merge 2 commits into
pingdotgg:mainfrom
Aculnaj:t3code/inline-chat-image-previews

Conversation

@Aculnaj

@AculnajAculnaj commented Jul 28, 2026

Copy link
Copy Markdown

What Changed

  • Render Markdown images in assistant messages as compact inline previews.
  • Resolve workspace-local image paths through T3 Code's existing signed asset route, including relative, absolute, and file:// paths.
  • Add loading and unavailable states while preserving external image URLs.
  • Reuse the existing expanded-image dialog when an inline preview is clicked.
  • Keep linked Markdown images under the surrounding link's interaction instead of nesting an image-preview button inside the anchor.
  • Add focused tests for Markdown image path resolution and linked-image semantics.

Why

When the T3 Code server runs on one device and the web client is opened on another, local image paths from assistant messages cannot be loaded directly by the browser. They currently render as broken images with only their alt text visible.

Using the existing thread-scoped asset flow lets the environment that owns the workspace serve the image securely to the connected client without broadening filesystem access.

UI Changes

Before

Workspace-local Markdown images render as broken image icons and alt text.

Before screenshot to be attached.

After

Images render as compact previews with a subtle outline. Clicking a preview opens the existing expanded-image dialog, and Escape closes it again.

After screenshot and short interaction recording to be attached.

Verification

  • vp test run apps/web/src/markdown-images.test.ts apps/web/src/components/chat/MessagesTimeline.test.tsx — 19 tests passed.
  • vp run --filter @t3tools/web typecheck passed.
  • Targeted formatting and linting completed without errors.
  • Integrated browser verification in an isolated T3 environment confirmed that workspace images were served through /api/assets/; standalone images expanded and closed with Escape, while a linked image opened only its link without rendering a nested button or opening the image dialog.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes
  • I included a video for animation/interaction changes

Note

Medium Risk
Touches chat rendering and workspace file asset URLs for assistant messages; scope is bounded to image paths and existing asset APIs, but remote clients now depend on signed asset delivery for local paths.

Overview
Assistant chat Markdown now renders img nodes as inline previews instead of raw broken <img> tags when paths point at workspace images.

Workspace-local sources (relative, absolute, and file://) are resolved with new resolveMarkdownImageFile and loaded through the existing thread-scoped signed asset route via useAssetUrlState, with loading and unavailable placeholders. External URLs still use direct src. Standalone previews can open the existing expanded-image dialog through a new onImageExpand prop wired from MessagesTimeline.

Linked images ([![alt](img)](url)) no longer nest a zoom button inside the anchor—a context flag disables expand so the link keeps sole click behavior.

Tests cover path resolution and linked-vs-standalone image semantics in the timeline markup.

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

Note

Fix inline Markdown image previews in chat with workspace file resolution and expansion

  • Adds a custom image renderer in ChatMarkdown.tsx that resolves workspace-relative image paths to asset URLs, shows loading/unavailable placeholders, and triggers an onImageExpand callback on click.
  • Introduces markdown-images.ts with resolveMarkdownImageFile to determine when a markdown image src refers to a workspace file eligible for asset resolution.
  • Images nested inside links (anchor tags) suppress the expansion button and remain link-clickable only, detected via a new MarkdownImageInsideLinkContext.
  • Wires onImageExpand through AssistantTimelineRow in MessagesTimeline.tsx so assistant message images trigger the timeline's existing image expansion handler.

Macroscope summarized a8dbe3e.

- Resolve workspace image paths against the thread cwd
- Add loading, unavailable, and expandable image states
- Cover markdown image path resolution with focused tests
@coderabbitai

coderabbitaiBot commented Jul 28, 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: a4a354d3-5d8f-485e-b335-0c5e4ec3e64f

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

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

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

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Jul 28, 2026
Comment threadapps/web/src/components/ChatMarkdown.tsx
@Aculnaj
Aculnaj marked this pull request as ready for review July 29, 2026 21:31

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

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Want fixes drafted automatically? Bugbot Autofix can create code changes for findings. A team admin can enable Autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit a8dbe3e. Configure here.

className?: string;
/** Treat single newlines as hard breaks — chat-style user input. */
lineBreaks?: boolean;
onImageExpand?: ((preview: ExpandedImagePreview) => void) | undefined;

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.

File image URLs sanitized away

Medium Severity

rehype-sanitize strips file:// image src attributes because CHAT_MARKDOWN_SANITIZE_SCHEMA only permits the file protocol for href. This prevents file:// workspace images from rendering, as the custom image component never receives the original source to process.

Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit a8dbe3e. Configure here.

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

@Aculnaj can you please take a look?

@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR introduces a new feature (inline Markdown image previews) with multiple new components and UI capabilities. There is also an unresolved review comment identifying a potential bug where file:// URLs get sanitized, which could prevent workspace images from rendering correctly.

You can customize Macroscope's approvability policy. Learn more.

@TheBit

Copy link
Copy Markdown

When the T3 Code server runs on one device and the web client is opened on another

It doesn't matter if this is on one device/client or another. You can't just see any pics in the chat, which is very sad :(
Just prompt:

Take the screenshot of https://example.com/ and paste it here

Знімок екрана 2026-08-09 о 18 23 16

@t3dotgg

Copy link
Copy Markdown
Member

Note

🤖 GPT-5.6 Sol responding on behalf of Theo

Closing this PR after an automated pass over open pull requests. Workspace image rendering already shipped in #6433.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:L100-499 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@Aculnaj@TheBit@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

Fix inline Markdown image previews in chat - #4785

Closed
Aculnaj wants to merge 2 commits into
pingdotgg:mainfrom
Aculnaj:t3code/inline-chat-image-previews
Closed

Fix inline Markdown image previews in chat#4785
Aculnaj wants to merge 2 commits into
pingdotgg:mainfrom
Aculnaj:t3code/inline-chat-image-previews

Conversation

@Aculnaj

@AculnajAculnaj commented Jul 28, 2026

Copy link
Copy Markdown

What Changed

  • Render Markdown images in assistant messages as compact inline previews.
  • Resolve workspace-local image paths through T3 Code's existing signed asset route, including relative, absolute, and file:// paths.
  • Add loading and unavailable states while preserving external image URLs.
  • Reuse the existing expanded-image dialog when an inline preview is clicked.
  • Keep linked Markdown images under the surrounding link's interaction instead of nesting an image-preview button inside the anchor.
  • Add focused tests for Markdown image path resolution and linked-image semantics.

Why

When the T3 Code server runs on one device and the web client is opened on another, local image paths from assistant messages cannot be loaded directly by the browser. They currently render as broken images with only their alt text visible.

Using the existing thread-scoped asset flow lets the environment that owns the workspace serve the image securely to the connected client without broadening filesystem access.

UI Changes

Before

Workspace-local Markdown images render as broken image icons and alt text.

Before screenshot to be attached.

After

Images render as compact previews with a subtle outline. Clicking a preview opens the existing expanded-image dialog, and Escape closes it again.

After screenshot and short interaction recording to be attached.

Verification

  • vp test run apps/web/src/markdown-images.test.ts apps/web/src/components/chat/MessagesTimeline.test.tsx — 19 tests passed.
  • vp run --filter @t3tools/web typecheck passed.
  • Targeted formatting and linting completed without errors.
  • Integrated browser verification in an isolated T3 environment confirmed that workspace images were served through /api/assets/; standalone images expanded and closed with Escape, while a linked image opened only its link without rendering a nested button or opening the image dialog.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes
  • I included a video for animation/interaction changes

Note

Medium Risk
Touches chat rendering and workspace file asset URLs for assistant messages; scope is bounded to image paths and existing asset APIs, but remote clients now depend on signed asset delivery for local paths.

Overview
Assistant chat Markdown now renders img nodes as inline previews instead of raw broken <img> tags when paths point at workspace images.

Workspace-local sources (relative, absolute, and file://) are resolved with new resolveMarkdownImageFile and loaded through the existing thread-scoped signed asset route via useAssetUrlState, with loading and unavailable placeholders. External URLs still use direct src. Standalone previews can open the existing expanded-image dialog through a new onImageExpand prop wired from MessagesTimeline.

Linked images ([![alt](img)](url)) no longer nest a zoom button inside the anchor—a context flag disables expand so the link keeps sole click behavior.

Tests cover path resolution and linked-vs-standalone image semantics in the timeline markup.

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

Note

Fix inline Markdown image previews in chat with workspace file resolution and expansion

  • Adds a custom image renderer in ChatMarkdown.tsx that resolves workspace-relative image paths to asset URLs, shows loading/unavailable placeholders, and triggers an onImageExpand callback on click.
  • Introduces markdown-images.ts with resolveMarkdownImageFile to determine when a markdown image src refers to a workspace file eligible for asset resolution.
  • Images nested inside links (anchor tags) suppress the expansion button and remain link-clickable only, detected via a new MarkdownImageInsideLinkContext.
  • Wires onImageExpand through AssistantTimelineRow in MessagesTimeline.tsx so assistant message images trigger the timeline's existing image expansion handler.

Macroscope summarized a8dbe3e.

- Resolve workspace image paths against the thread cwd
- Add loading, unavailable, and expandable image states
- Cover markdown image path resolution with focused tests
@coderabbitai

coderabbitaiBot commented Jul 28, 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: a4a354d3-5d8f-485e-b335-0c5e4ec3e64f

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

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

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

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Jul 28, 2026
Comment threadapps/web/src/components/ChatMarkdown.tsx
@Aculnaj
Aculnaj marked this pull request as ready for review July 29, 2026 21:31

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

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Want fixes drafted automatically? Bugbot Autofix can create code changes for findings. A team admin can enable Autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit a8dbe3e. Configure here.

className?: string;
/** Treat single newlines as hard breaks — chat-style user input. */
lineBreaks?: boolean;
onImageExpand?: ((preview: ExpandedImagePreview) => void) | undefined;

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.

File image URLs sanitized away

Medium Severity

rehype-sanitize strips file:// image src attributes because CHAT_MARKDOWN_SANITIZE_SCHEMA only permits the file protocol for href. This prevents file:// workspace images from rendering, as the custom image component never receives the original source to process.

Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit a8dbe3e. Configure here.

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

@Aculnaj can you please take a look?

@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR introduces a new feature (inline Markdown image previews) with multiple new components and UI capabilities. There is also an unresolved review comment identifying a potential bug where file:// URLs get sanitized, which could prevent workspace images from rendering correctly.

You can customize Macroscope's approvability policy. Learn more.

@TheBit

Copy link
Copy Markdown

When the T3 Code server runs on one device and the web client is opened on another

It doesn't matter if this is on one device/client or another. You can't just see any pics in the chat, which is very sad :(
Just prompt:

Take the screenshot of https://example.com/ and paste it here

Знімок екрана 2026-08-09 о 18 23 16

@t3dotgg

Copy link
Copy Markdown
Member

Note

🤖 GPT-5.6 Sol responding on behalf of Theo

Closing this PR after an automated pass over open pull requests. Workspace image rendering already shipped in #6433.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:L100-499 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@Aculnaj@TheBit@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

Fix inline Markdown image previews in chat - #4785

Closed
Aculnaj wants to merge 2 commits into
pingdotgg:mainfrom
Aculnaj:t3code/inline-chat-image-previews
Closed

Fix inline Markdown image previews in chat#4785
Aculnaj wants to merge 2 commits into
pingdotgg:mainfrom
Aculnaj:t3code/inline-chat-image-previews

Conversation

@Aculnaj

@AculnajAculnaj commented Jul 28, 2026

Copy link
Copy Markdown

What Changed

  • Render Markdown images in assistant messages as compact inline previews.
  • Resolve workspace-local image paths through T3 Code's existing signed asset route, including relative, absolute, and file:// paths.
  • Add loading and unavailable states while preserving external image URLs.
  • Reuse the existing expanded-image dialog when an inline preview is clicked.
  • Keep linked Markdown images under the surrounding link's interaction instead of nesting an image-preview button inside the anchor.
  • Add focused tests for Markdown image path resolution and linked-image semantics.

Why

When the T3 Code server runs on one device and the web client is opened on another, local image paths from assistant messages cannot be loaded directly by the browser. They currently render as broken images with only their alt text visible.

Using the existing thread-scoped asset flow lets the environment that owns the workspace serve the image securely to the connected client without broadening filesystem access.

UI Changes

Before

Workspace-local Markdown images render as broken image icons and alt text.

Before screenshot to be attached.

After

Images render as compact previews with a subtle outline. Clicking a preview opens the existing expanded-image dialog, and Escape closes it again.

After screenshot and short interaction recording to be attached.

Verification

  • vp test run apps/web/src/markdown-images.test.ts apps/web/src/components/chat/MessagesTimeline.test.tsx — 19 tests passed.
  • vp run --filter @t3tools/web typecheck passed.
  • Targeted formatting and linting completed without errors.
  • Integrated browser verification in an isolated T3 environment confirmed that workspace images were served through /api/assets/; standalone images expanded and closed with Escape, while a linked image opened only its link without rendering a nested button or opening the image dialog.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes
  • I included a video for animation/interaction changes

Note

Medium Risk
Touches chat rendering and workspace file asset URLs for assistant messages; scope is bounded to image paths and existing asset APIs, but remote clients now depend on signed asset delivery for local paths.

Overview
Assistant chat Markdown now renders img nodes as inline previews instead of raw broken <img> tags when paths point at workspace images.

Workspace-local sources (relative, absolute, and file://) are resolved with new resolveMarkdownImageFile and loaded through the existing thread-scoped signed asset route via useAssetUrlState, with loading and unavailable placeholders. External URLs still use direct src. Standalone previews can open the existing expanded-image dialog through a new onImageExpand prop wired from MessagesTimeline.

Linked images ([![alt](img)](url)) no longer nest a zoom button inside the anchor—a context flag disables expand so the link keeps sole click behavior.

Tests cover path resolution and linked-vs-standalone image semantics in the timeline markup.

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

Note

Fix inline Markdown image previews in chat with workspace file resolution and expansion

  • Adds a custom image renderer in ChatMarkdown.tsx that resolves workspace-relative image paths to asset URLs, shows loading/unavailable placeholders, and triggers an onImageExpand callback on click.
  • Introduces markdown-images.ts with resolveMarkdownImageFile to determine when a markdown image src refers to a workspace file eligible for asset resolution.
  • Images nested inside links (anchor tags) suppress the expansion button and remain link-clickable only, detected via a new MarkdownImageInsideLinkContext.
  • Wires onImageExpand through AssistantTimelineRow in MessagesTimeline.tsx so assistant message images trigger the timeline's existing image expansion handler.

Macroscope summarized a8dbe3e.

- Resolve workspace image paths against the thread cwd
- Add loading, unavailable, and expandable image states
- Cover markdown image path resolution with focused tests
@coderabbitai

coderabbitaiBot commented Jul 28, 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: a4a354d3-5d8f-485e-b335-0c5e4ec3e64f

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

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

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

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Jul 28, 2026
Comment threadapps/web/src/components/ChatMarkdown.tsx
@Aculnaj
Aculnaj marked this pull request as ready for review July 29, 2026 21:31

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

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Want fixes drafted automatically? Bugbot Autofix can create code changes for findings. A team admin can enable Autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit a8dbe3e. Configure here.

className?: string;
/** Treat single newlines as hard breaks — chat-style user input. */
lineBreaks?: boolean;
onImageExpand?: ((preview: ExpandedImagePreview) => void) | undefined;

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.

File image URLs sanitized away

Medium Severity

rehype-sanitize strips file:// image src attributes because CHAT_MARKDOWN_SANITIZE_SCHEMA only permits the file protocol for href. This prevents file:// workspace images from rendering, as the custom image component never receives the original source to process.

Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit a8dbe3e. Configure here.

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

@Aculnaj can you please take a look?

@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR introduces a new feature (inline Markdown image previews) with multiple new components and UI capabilities. There is also an unresolved review comment identifying a potential bug where file:// URLs get sanitized, which could prevent workspace images from rendering correctly.

You can customize Macroscope's approvability policy. Learn more.

@TheBit

Copy link
Copy Markdown

When the T3 Code server runs on one device and the web client is opened on another

It doesn't matter if this is on one device/client or another. You can't just see any pics in the chat, which is very sad :(
Just prompt:

Take the screenshot of https://example.com/ and paste it here

Знімок екрана 2026-08-09 о 18 23 16

@t3dotgg

Copy link
Copy Markdown
Member

Note

🤖 GPT-5.6 Sol responding on behalf of Theo

Closing this PR after an automated pass over open pull requests. Workspace image rendering already shipped in #6433.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:L100-499 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@Aculnaj@TheBit@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

Fix inline Markdown image previews in chat - #4785

Closed
Aculnaj wants to merge 2 commits into
pingdotgg:mainfrom
Aculnaj:t3code/inline-chat-image-previews
Closed

Fix inline Markdown image previews in chat#4785
Aculnaj wants to merge 2 commits into
pingdotgg:mainfrom
Aculnaj:t3code/inline-chat-image-previews

Conversation

@Aculnaj

@AculnajAculnaj commented Jul 28, 2026

Copy link
Copy Markdown

What Changed

  • Render Markdown images in assistant messages as compact inline previews.
  • Resolve workspace-local image paths through T3 Code's existing signed asset route, including relative, absolute, and file:// paths.
  • Add loading and unavailable states while preserving external image URLs.
  • Reuse the existing expanded-image dialog when an inline preview is clicked.
  • Keep linked Markdown images under the surrounding link's interaction instead of nesting an image-preview button inside the anchor.
  • Add focused tests for Markdown image path resolution and linked-image semantics.

Why

When the T3 Code server runs on one device and the web client is opened on another, local image paths from assistant messages cannot be loaded directly by the browser. They currently render as broken images with only their alt text visible.

Using the existing thread-scoped asset flow lets the environment that owns the workspace serve the image securely to the connected client without broadening filesystem access.

UI Changes

Before

Workspace-local Markdown images render as broken image icons and alt text.

Before screenshot to be attached.

After

Images render as compact previews with a subtle outline. Clicking a preview opens the existing expanded-image dialog, and Escape closes it again.

After screenshot and short interaction recording to be attached.

Verification

  • vp test run apps/web/src/markdown-images.test.ts apps/web/src/components/chat/MessagesTimeline.test.tsx — 19 tests passed.
  • vp run --filter @t3tools/web typecheck passed.
  • Targeted formatting and linting completed without errors.
  • Integrated browser verification in an isolated T3 environment confirmed that workspace images were served through /api/assets/; standalone images expanded and closed with Escape, while a linked image opened only its link without rendering a nested button or opening the image dialog.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes
  • I included a video for animation/interaction changes

Note

Medium Risk
Touches chat rendering and workspace file asset URLs for assistant messages; scope is bounded to image paths and existing asset APIs, but remote clients now depend on signed asset delivery for local paths.

Overview
Assistant chat Markdown now renders img nodes as inline previews instead of raw broken <img> tags when paths point at workspace images.

Workspace-local sources (relative, absolute, and file://) are resolved with new resolveMarkdownImageFile and loaded through the existing thread-scoped signed asset route via useAssetUrlState, with loading and unavailable placeholders. External URLs still use direct src. Standalone previews can open the existing expanded-image dialog through a new onImageExpand prop wired from MessagesTimeline.

Linked images ([![alt](img)](url)) no longer nest a zoom button inside the anchor—a context flag disables expand so the link keeps sole click behavior.

Tests cover path resolution and linked-vs-standalone image semantics in the timeline markup.

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

Note

Fix inline Markdown image previews in chat with workspace file resolution and expansion

  • Adds a custom image renderer in ChatMarkdown.tsx that resolves workspace-relative image paths to asset URLs, shows loading/unavailable placeholders, and triggers an onImageExpand callback on click.
  • Introduces markdown-images.ts with resolveMarkdownImageFile to determine when a markdown image src refers to a workspace file eligible for asset resolution.
  • Images nested inside links (anchor tags) suppress the expansion button and remain link-clickable only, detected via a new MarkdownImageInsideLinkContext.
  • Wires onImageExpand through AssistantTimelineRow in MessagesTimeline.tsx so assistant message images trigger the timeline's existing image expansion handler.

Macroscope summarized a8dbe3e.

- Resolve workspace image paths against the thread cwd
- Add loading, unavailable, and expandable image states
- Cover markdown image path resolution with focused tests
@coderabbitai

coderabbitaiBot commented Jul 28, 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: a4a354d3-5d8f-485e-b335-0c5e4ec3e64f

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

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

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

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Jul 28, 2026
Comment threadapps/web/src/components/ChatMarkdown.tsx
@Aculnaj
Aculnaj marked this pull request as ready for review July 29, 2026 21:31

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

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Want fixes drafted automatically? Bugbot Autofix can create code changes for findings. A team admin can enable Autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit a8dbe3e. Configure here.

className?: string;
/** Treat single newlines as hard breaks — chat-style user input. */
lineBreaks?: boolean;
onImageExpand?: ((preview: ExpandedImagePreview) => void) | undefined;

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.

File image URLs sanitized away

Medium Severity

rehype-sanitize strips file:// image src attributes because CHAT_MARKDOWN_SANITIZE_SCHEMA only permits the file protocol for href. This prevents file:// workspace images from rendering, as the custom image component never receives the original source to process.

Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit a8dbe3e. Configure here.

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

@Aculnaj can you please take a look?

@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR introduces a new feature (inline Markdown image previews) with multiple new components and UI capabilities. There is also an unresolved review comment identifying a potential bug where file:// URLs get sanitized, which could prevent workspace images from rendering correctly.

You can customize Macroscope's approvability policy. Learn more.

@TheBit

Copy link
Copy Markdown

When the T3 Code server runs on one device and the web client is opened on another

It doesn't matter if this is on one device/client or another. You can't just see any pics in the chat, which is very sad :(
Just prompt:

Take the screenshot of https://example.com/ and paste it here

Знімок екрана 2026-08-09 о 18 23 16

@t3dotgg

Copy link
Copy Markdown
Member

Note

🤖 GPT-5.6 Sol responding on behalf of Theo

Closing this PR after an automated pass over open pull requests. Workspace image rendering already shipped in #6433.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:L100-499 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@Aculnaj@TheBit@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

Fix inline Markdown image previews in chat - #4785

Closed
Aculnaj wants to merge 2 commits into
pingdotgg:mainfrom
Aculnaj:t3code/inline-chat-image-previews
Closed

Fix inline Markdown image previews in chat#4785
Aculnaj wants to merge 2 commits into
pingdotgg:mainfrom
Aculnaj:t3code/inline-chat-image-previews

Conversation

@Aculnaj

@AculnajAculnaj commented Jul 28, 2026

Copy link
Copy Markdown

What Changed

  • Render Markdown images in assistant messages as compact inline previews.
  • Resolve workspace-local image paths through T3 Code's existing signed asset route, including relative, absolute, and file:// paths.
  • Add loading and unavailable states while preserving external image URLs.
  • Reuse the existing expanded-image dialog when an inline preview is clicked.
  • Keep linked Markdown images under the surrounding link's interaction instead of nesting an image-preview button inside the anchor.
  • Add focused tests for Markdown image path resolution and linked-image semantics.

Why

When the T3 Code server runs on one device and the web client is opened on another, local image paths from assistant messages cannot be loaded directly by the browser. They currently render as broken images with only their alt text visible.

Using the existing thread-scoped asset flow lets the environment that owns the workspace serve the image securely to the connected client without broadening filesystem access.

UI Changes

Before

Workspace-local Markdown images render as broken image icons and alt text.

Before screenshot to be attached.

After

Images render as compact previews with a subtle outline. Clicking a preview opens the existing expanded-image dialog, and Escape closes it again.

After screenshot and short interaction recording to be attached.

Verification

  • vp test run apps/web/src/markdown-images.test.ts apps/web/src/components/chat/MessagesTimeline.test.tsx — 19 tests passed.
  • vp run --filter @t3tools/web typecheck passed.
  • Targeted formatting and linting completed without errors.
  • Integrated browser verification in an isolated T3 environment confirmed that workspace images were served through /api/assets/; standalone images expanded and closed with Escape, while a linked image opened only its link without rendering a nested button or opening the image dialog.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes
  • I included a video for animation/interaction changes

Note

Medium Risk
Touches chat rendering and workspace file asset URLs for assistant messages; scope is bounded to image paths and existing asset APIs, but remote clients now depend on signed asset delivery for local paths.

Overview
Assistant chat Markdown now renders img nodes as inline previews instead of raw broken <img> tags when paths point at workspace images.

Workspace-local sources (relative, absolute, and file://) are resolved with new resolveMarkdownImageFile and loaded through the existing thread-scoped signed asset route via useAssetUrlState, with loading and unavailable placeholders. External URLs still use direct src. Standalone previews can open the existing expanded-image dialog through a new onImageExpand prop wired from MessagesTimeline.

Linked images ([![alt](img)](url)) no longer nest a zoom button inside the anchor—a context flag disables expand so the link keeps sole click behavior.

Tests cover path resolution and linked-vs-standalone image semantics in the timeline markup.

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

Note

Fix inline Markdown image previews in chat with workspace file resolution and expansion

  • Adds a custom image renderer in ChatMarkdown.tsx that resolves workspace-relative image paths to asset URLs, shows loading/unavailable placeholders, and triggers an onImageExpand callback on click.
  • Introduces markdown-images.ts with resolveMarkdownImageFile to determine when a markdown image src refers to a workspace file eligible for asset resolution.
  • Images nested inside links (anchor tags) suppress the expansion button and remain link-clickable only, detected via a new MarkdownImageInsideLinkContext.
  • Wires onImageExpand through AssistantTimelineRow in MessagesTimeline.tsx so assistant message images trigger the timeline's existing image expansion handler.

Macroscope summarized a8dbe3e.

- Resolve workspace image paths against the thread cwd
- Add loading, unavailable, and expandable image states
- Cover markdown image path resolution with focused tests
@coderabbitai

coderabbitaiBot commented Jul 28, 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: a4a354d3-5d8f-485e-b335-0c5e4ec3e64f

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

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

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

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Jul 28, 2026
Comment threadapps/web/src/components/ChatMarkdown.tsx
@Aculnaj
Aculnaj marked this pull request as ready for review July 29, 2026 21:31

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

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Want fixes drafted automatically? Bugbot Autofix can create code changes for findings. A team admin can enable Autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit a8dbe3e. Configure here.

className?: string;
/** Treat single newlines as hard breaks — chat-style user input. */
lineBreaks?: boolean;
onImageExpand?: ((preview: ExpandedImagePreview) => void) | undefined;

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.

File image URLs sanitized away

Medium Severity

rehype-sanitize strips file:// image src attributes because CHAT_MARKDOWN_SANITIZE_SCHEMA only permits the file protocol for href. This prevents file:// workspace images from rendering, as the custom image component never receives the original source to process.

Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit a8dbe3e. Configure here.

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

@Aculnaj can you please take a look?

@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR introduces a new feature (inline Markdown image previews) with multiple new components and UI capabilities. There is also an unresolved review comment identifying a potential bug where file:// URLs get sanitized, which could prevent workspace images from rendering correctly.

You can customize Macroscope's approvability policy. Learn more.

@TheBit

Copy link
Copy Markdown

When the T3 Code server runs on one device and the web client is opened on another

It doesn't matter if this is on one device/client or another. You can't just see any pics in the chat, which is very sad :(
Just prompt:

Take the screenshot of https://example.com/ and paste it here

Знімок екрана 2026-08-09 о 18 23 16

@t3dotgg

Copy link
Copy Markdown
Member

Note

🤖 GPT-5.6 Sol responding on behalf of Theo

Closing this PR after an automated pass over open pull requests. Workspace image rendering already shipped in #6433.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:L100-499 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@Aculnaj@TheBit@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

Fix inline Markdown image previews in chat - #4785

Closed
Aculnaj wants to merge 2 commits into
pingdotgg:mainfrom
Aculnaj:t3code/inline-chat-image-previews
Closed

Fix inline Markdown image previews in chat#4785
Aculnaj wants to merge 2 commits into
pingdotgg:mainfrom
Aculnaj:t3code/inline-chat-image-previews

Conversation

@Aculnaj

@AculnajAculnaj commented Jul 28, 2026

Copy link
Copy Markdown

What Changed

  • Render Markdown images in assistant messages as compact inline previews.
  • Resolve workspace-local image paths through T3 Code's existing signed asset route, including relative, absolute, and file:// paths.
  • Add loading and unavailable states while preserving external image URLs.
  • Reuse the existing expanded-image dialog when an inline preview is clicked.
  • Keep linked Markdown images under the surrounding link's interaction instead of nesting an image-preview button inside the anchor.
  • Add focused tests for Markdown image path resolution and linked-image semantics.

Why

When the T3 Code server runs on one device and the web client is opened on another, local image paths from assistant messages cannot be loaded directly by the browser. They currently render as broken images with only their alt text visible.

Using the existing thread-scoped asset flow lets the environment that owns the workspace serve the image securely to the connected client without broadening filesystem access.

UI Changes

Before

Workspace-local Markdown images render as broken image icons and alt text.

Before screenshot to be attached.

After

Images render as compact previews with a subtle outline. Clicking a preview opens the existing expanded-image dialog, and Escape closes it again.

After screenshot and short interaction recording to be attached.

Verification

  • vp test run apps/web/src/markdown-images.test.ts apps/web/src/components/chat/MessagesTimeline.test.tsx — 19 tests passed.
  • vp run --filter @t3tools/web typecheck passed.
  • Targeted formatting and linting completed without errors.
  • Integrated browser verification in an isolated T3 environment confirmed that workspace images were served through /api/assets/; standalone images expanded and closed with Escape, while a linked image opened only its link without rendering a nested button or opening the image dialog.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes
  • I included a video for animation/interaction changes

Note

Medium Risk
Touches chat rendering and workspace file asset URLs for assistant messages; scope is bounded to image paths and existing asset APIs, but remote clients now depend on signed asset delivery for local paths.

Overview
Assistant chat Markdown now renders img nodes as inline previews instead of raw broken <img> tags when paths point at workspace images.

Workspace-local sources (relative, absolute, and file://) are resolved with new resolveMarkdownImageFile and loaded through the existing thread-scoped signed asset route via useAssetUrlState, with loading and unavailable placeholders. External URLs still use direct src. Standalone previews can open the existing expanded-image dialog through a new onImageExpand prop wired from MessagesTimeline.

Linked images ([![alt](img)](url)) no longer nest a zoom button inside the anchor—a context flag disables expand so the link keeps sole click behavior.

Tests cover path resolution and linked-vs-standalone image semantics in the timeline markup.

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

Note

Fix inline Markdown image previews in chat with workspace file resolution and expansion

  • Adds a custom image renderer in ChatMarkdown.tsx that resolves workspace-relative image paths to asset URLs, shows loading/unavailable placeholders, and triggers an onImageExpand callback on click.
  • Introduces markdown-images.ts with resolveMarkdownImageFile to determine when a markdown image src refers to a workspace file eligible for asset resolution.
  • Images nested inside links (anchor tags) suppress the expansion button and remain link-clickable only, detected via a new MarkdownImageInsideLinkContext.
  • Wires onImageExpand through AssistantTimelineRow in MessagesTimeline.tsx so assistant message images trigger the timeline's existing image expansion handler.

Macroscope summarized a8dbe3e.

- Resolve workspace image paths against the thread cwd
- Add loading, unavailable, and expandable image states
- Cover markdown image path resolution with focused tests
@coderabbitai

coderabbitaiBot commented Jul 28, 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: a4a354d3-5d8f-485e-b335-0c5e4ec3e64f

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

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

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

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Jul 28, 2026
Comment threadapps/web/src/components/ChatMarkdown.tsx
@Aculnaj
Aculnaj marked this pull request as ready for review July 29, 2026 21:31

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

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Want fixes drafted automatically? Bugbot Autofix can create code changes for findings. A team admin can enable Autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit a8dbe3e. Configure here.

className?: string;
/** Treat single newlines as hard breaks — chat-style user input. */
lineBreaks?: boolean;
onImageExpand?: ((preview: ExpandedImagePreview) => void) | undefined;

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.

File image URLs sanitized away

Medium Severity

rehype-sanitize strips file:// image src attributes because CHAT_MARKDOWN_SANITIZE_SCHEMA only permits the file protocol for href. This prevents file:// workspace images from rendering, as the custom image component never receives the original source to process.

Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit a8dbe3e. Configure here.

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

@Aculnaj can you please take a look?

@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR introduces a new feature (inline Markdown image previews) with multiple new components and UI capabilities. There is also an unresolved review comment identifying a potential bug where file:// URLs get sanitized, which could prevent workspace images from rendering correctly.

You can customize Macroscope's approvability policy. Learn more.

@TheBit

Copy link
Copy Markdown

When the T3 Code server runs on one device and the web client is opened on another

It doesn't matter if this is on one device/client or another. You can't just see any pics in the chat, which is very sad :(
Just prompt:

Take the screenshot of https://example.com/ and paste it here

Знімок екрана 2026-08-09 о 18 23 16

@t3dotgg

Copy link
Copy Markdown
Member

Note

🤖 GPT-5.6 Sol responding on behalf of Theo

Closing this PR after an automated pass over open pull requests. Workspace image rendering already shipped in #6433.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:L100-499 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@Aculnaj@TheBit@t3dotgg