t3code/support non-image chat attachments - #3927

Closed
jakeleventhal wants to merge 7 commits into
pingdotgg:mainfrom
jakeleventhal:t3code/support-markdown-chat-attachments
Closed

t3code/support non-image chat attachments#3927
jakeleventhal wants to merge 7 commits into
pingdotgg:mainfrom
jakeleventhal:t3code/support-markdown-chat-attachments

Conversation

@jakeleventhal

@jakeleventhaljakeleventhal commented Jul 13, 2026

Copy link
Copy Markdown
Contributor

Verification

Screenshot 2026-07-12 at 3 07 25 PMScreenshot 2026-07-12 at 3 09 10 PM [t3code-attachment-tests.zip](https://github.com/user-attachments/files/29944548/t3code-attachment-tests.zip)

Summary

  • allow UTF-8 text files to be dragged into the chat composer alongside images
  • persist text attachments under .t3/attachments and insert standard file-link chips into the prompt
  • avoid collapsing otherwise short user prompts when attachment links contain long hidden paths

Why

The composer previously rejected every dropped file that was not an image. This made it impossible to attach Markdown, source, configuration, or other text files as agent context.

Text attachments now reuse the existing project file-writing and Markdown file-link paths, so they render and behave like other file references. Files are limited to 1 MB and rejected when they contain NUL bytes or invalid UTF-8.

The message collapse heuristic also now measures displayed link labels instead of their backing absolute paths. Without this, prompts containing several attachments could appear hidden even though their visible content was short.

Validation

  • pnpm exec vp test apps/web/src/components/chat/MessagesTimeline.test.tsx
  • pnpm exec vp check
  • pnpm exec vp run typecheck
  • manual drag-and-drop verification with extensionless, Markdown, source, and configuration text files

Note

Medium Risk
Attachment ID format now includes a hash suffix, which can break stored IDs from older threads; attachment persistence and projection cleanup logic also changed in non-trivial ways.

Overview
The chat composer now accepts UTF-8 text files (drag, paste, or picker) in addition to images. Valid files are written under .t3/attachments through a new projects.writeTextAttachment RPC, with server checks for UTF-8, non-empty content, and a contract-defined size cap (1 MB); the prompt gets standard file-link chips like other project references.

Attachment identity and cleanup change: owned segments include a SHA-256 hash suffix (toOwnedThreadAttachmentSegment) to avoid cross-thread slug collisions, and text attachments live as directories outside the workspace. runAttachmentSideEffects is reworked to prune only thread-owned directory attachments without removing legacy image attachments still referenced elsewhere.

Message collapse now measures visible markdown (measureComposerMarkdownVisibleLength) so short prompts with long hidden attachment paths are not collapsed incorrectly.

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

Note

Add support for non-image chat attachments

This PR contains only blank line modifications. Despite the title indicating support for non-image chat attachments, no functional changes are present.

Macroscope summarized 1f2cbca.

@coderabbitai

coderabbitaiBot commented Jul 13, 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: 43778ade-25c1-4623-af5c-fccebcd6ec43

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 size:M 30-99 changed lines (additions + deletions). vouch:unvouched PR author is not yet trusted in the VOUCHED list. labels Jul 13, 2026
@macroscopeapp

macroscopeappBot commented Jul 13, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved at 1f2cbca

Macroscope's review found this PR approvable — The specified base and head resolve to identical repository trees, with zero changed files or line changes. Despite the feature-oriented title, this PR has no runtime impact to review.

Notes:

  • No code objects were reviewed. Approvability was decided on eligibility alone.

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

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

@chatgpt-codex-connectorchatgpt-codex-connectorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit:f044e403be

ℹ️ About Codex in GitHub

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

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

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

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

@chatgpt-codex-connectorchatgpt-codex-connectorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit:c7e248cb18

ℹ️ About Codex in GitHub

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

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

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment threadapps/web/src/components/chat/ChatComposer.tsx Outdated
@jakeleventhaljakeleventhal changed the title t3code/support markdown chat attachmentst3code/support non-image chat attachmentsJul 18, 2026

@chatgpt-codex-connectorchatgpt-codex-connectorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit:3a5cf3e282

ℹ️ About Codex in GitHub

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

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

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

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

@chatgpt-codex-connectorchatgpt-codex-connectorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit:26a4c8e14f

ℹ️ About Codex in GitHub

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

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

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment threadapps/web/src/components/chat/ChatComposer.tsx Outdated
@jakeleventhal
jakeleventhalforce-pushed the t3code/support-markdown-chat-attachments branch from 26a4c8e to 2b01a69CompareJuly 25, 2026 01:24

@chatgpt-codex-connectorchatgpt-codex-connectorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

https://github.com/pingdotgg/t3code/blob/2b01a69e4de7bafb48e3f250af39db3f41a0d9c1/apps/web/src/components/chat/ChatComposer.tsx#L1926-L1928
P2 Badge Continue processing text files after reaching the image cap

When the composer already has eight images, or the current drop reaches that limit, encountering one additional image executes this break and silently skips every later file in the same drop. This now incorrectly discards otherwise supported text attachments that happen to follow the excess image, even though the reported limit applies only to images; record the image error and continue scanning the remaining files instead.

ℹ️ About Codex in GitHub

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

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

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment threadapps/web/src/components/chat/MessagesTimeline.tsx Outdated
Comment threadapps/web/src/components/chat/ChatComposer.tsx Outdated
@Reston

Copy link
Copy Markdown

I need this, plenty of times I want to give context to the chat and I had to copy the path manually in order to work, in codex cli automatically I can paste and it gives the filepath so the model can fetch it.

@jakeleventhal
jakeleventhalforce-pushed the t3code/support-markdown-chat-attachments branch from 2b01a69 to 58a0171CompareAugust 10, 2026 19:33
@github-actionsgithub-actionsBot added size:L 100-499 changed lines (additions + deletions). and removed size:M 30-99 changed lines (additions + deletions). labels Aug 10, 2026

@macroscopeappmacroscopeappBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Effect service conventions: two error-modeling issues in the new projects.writeTextAttachment path.

Posted via Macroscope — Effect Service Conventions

Comment threadapps/server/src/ws.ts Outdated
Comment threadpackages/contracts/src/project.ts Outdated
Comment threadapps/web/src/components/chat/ChatComposer.tsx Outdated
Comment threadapps/server/src/workspace/WorkspaceFileSystem.ts Outdated
Comment threadapps/web/src/components/chat/ChatComposer.tsx
Comment threadapps/server/src/workspace/WorkspaceFileSystem.ts Outdated
Comment threadapps/web/src/components/chat/ChatComposer.tsx Outdated
Comment threadapps/web/src/components/chat/ChatComposer.tsx Outdated
@jakeleventhal
jakeleventhalforce-pushed the t3code/support-markdown-chat-attachments branch from 58a0171 to 2955bbdCompareAugust 10, 2026 20:18
@github-actionsgithub-actionsBot added size:XL 500-999 changed lines (additions + deletions). and removed size:L 100-499 changed lines (additions + deletions). labels Aug 10, 2026
Comment threadapps/server/src/attachmentStore.ts Outdated
Comment threadapps/server/src/orchestration/Layers/ProjectionPipeline.ts
Comment threadpackages/shared/src/composerInlineTokens.ts Outdated
Comment threadpackages/shared/src/composerInlineTokens.ts Outdated
Comment threadpackages/shared/src/composerInlineTokens.ts Outdated
Comment threadapps/server/src/attachmentStore.ts Outdated
Comment threadapps/server/src/attachmentStore.ts
Comment threadapps/server/src/orchestration/Layers/ProjectionPipeline.ts
Comment threadapps/server/src/orchestration/Layers/ProjectionPipeline.ts

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

Reviewed by Cursor Bugbot for commit a36b386. Configure here.

Comment threadapps/server/src/orchestration/Layers/ProjectionPipeline.ts
@t3dotggt3dotgg added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. and removed vouch:unvouched PR author is not yet trusted in the VOUCHED list. labels Aug 24, 2026
@jakeleventhal

Copy link
Copy Markdown
ContributorAuthor

Synced this branch to current upstream main in 1f2cbca. The resulting tree is identical to main: the non-image attachment feature from this PR has now shipped upstream through the generic attachment upload/claim pipeline, with subsequent validation, cleanup, download, draft recovery, provider, web, and mobile hardening. All 32 review threads are resolved and there is no remaining diff, so I am closing this PR as superseded.

@github-actionsgithub-actionsBot added size:XS 0-9 changed lines (additions + deletions). and removed size:XL 500-999 changed lines (additions + deletions). labels Aug 26, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XS0-9 changed lines (additions + deletions).vouch:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@jakeleventhal@Reston@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

t3code/support non-image chat attachments - #3927

Closed
jakeleventhal wants to merge 7 commits into
pingdotgg:mainfrom
jakeleventhal:t3code/support-markdown-chat-attachments
Closed

t3code/support non-image chat attachments#3927
jakeleventhal wants to merge 7 commits into
pingdotgg:mainfrom
jakeleventhal:t3code/support-markdown-chat-attachments

Conversation

@jakeleventhal

@jakeleventhaljakeleventhal commented Jul 13, 2026

Copy link
Copy Markdown
Contributor

Verification

Screenshot 2026-07-12 at 3 07 25 PMScreenshot 2026-07-12 at 3 09 10 PM [t3code-attachment-tests.zip](https://github.com/user-attachments/files/29944548/t3code-attachment-tests.zip)

Summary

  • allow UTF-8 text files to be dragged into the chat composer alongside images
  • persist text attachments under .t3/attachments and insert standard file-link chips into the prompt
  • avoid collapsing otherwise short user prompts when attachment links contain long hidden paths

Why

The composer previously rejected every dropped file that was not an image. This made it impossible to attach Markdown, source, configuration, or other text files as agent context.

Text attachments now reuse the existing project file-writing and Markdown file-link paths, so they render and behave like other file references. Files are limited to 1 MB and rejected when they contain NUL bytes or invalid UTF-8.

The message collapse heuristic also now measures displayed link labels instead of their backing absolute paths. Without this, prompts containing several attachments could appear hidden even though their visible content was short.

Validation

  • pnpm exec vp test apps/web/src/components/chat/MessagesTimeline.test.tsx
  • pnpm exec vp check
  • pnpm exec vp run typecheck
  • manual drag-and-drop verification with extensionless, Markdown, source, and configuration text files

Note

Medium Risk
Attachment ID format now includes a hash suffix, which can break stored IDs from older threads; attachment persistence and projection cleanup logic also changed in non-trivial ways.

Overview
The chat composer now accepts UTF-8 text files (drag, paste, or picker) in addition to images. Valid files are written under .t3/attachments through a new projects.writeTextAttachment RPC, with server checks for UTF-8, non-empty content, and a contract-defined size cap (1 MB); the prompt gets standard file-link chips like other project references.

Attachment identity and cleanup change: owned segments include a SHA-256 hash suffix (toOwnedThreadAttachmentSegment) to avoid cross-thread slug collisions, and text attachments live as directories outside the workspace. runAttachmentSideEffects is reworked to prune only thread-owned directory attachments without removing legacy image attachments still referenced elsewhere.

Message collapse now measures visible markdown (measureComposerMarkdownVisibleLength) so short prompts with long hidden attachment paths are not collapsed incorrectly.

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

Note

Add support for non-image chat attachments

This PR contains only blank line modifications. Despite the title indicating support for non-image chat attachments, no functional changes are present.

Macroscope summarized 1f2cbca.

@coderabbitai

coderabbitaiBot commented Jul 13, 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: 43778ade-25c1-4623-af5c-fccebcd6ec43

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 size:M 30-99 changed lines (additions + deletions). vouch:unvouched PR author is not yet trusted in the VOUCHED list. labels Jul 13, 2026
@macroscopeapp

macroscopeappBot commented Jul 13, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved at 1f2cbca

Macroscope's review found this PR approvable — The specified base and head resolve to identical repository trees, with zero changed files or line changes. Despite the feature-oriented title, this PR has no runtime impact to review.

Notes:

  • No code objects were reviewed. Approvability was decided on eligibility alone.

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

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

@chatgpt-codex-connectorchatgpt-codex-connectorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit:f044e403be

ℹ️ About Codex in GitHub

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

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

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

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

@chatgpt-codex-connectorchatgpt-codex-connectorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit:c7e248cb18

ℹ️ About Codex in GitHub

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

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

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment threadapps/web/src/components/chat/ChatComposer.tsx Outdated
@jakeleventhaljakeleventhal changed the title t3code/support markdown chat attachmentst3code/support non-image chat attachmentsJul 18, 2026

@chatgpt-codex-connectorchatgpt-codex-connectorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit:3a5cf3e282

ℹ️ About Codex in GitHub

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

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

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

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

@chatgpt-codex-connectorchatgpt-codex-connectorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit:26a4c8e14f

ℹ️ About Codex in GitHub

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

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

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment threadapps/web/src/components/chat/ChatComposer.tsx Outdated
@jakeleventhal
jakeleventhalforce-pushed the t3code/support-markdown-chat-attachments branch from 26a4c8e to 2b01a69CompareJuly 25, 2026 01:24

@chatgpt-codex-connectorchatgpt-codex-connectorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

https://github.com/pingdotgg/t3code/blob/2b01a69e4de7bafb48e3f250af39db3f41a0d9c1/apps/web/src/components/chat/ChatComposer.tsx#L1926-L1928
P2 Badge Continue processing text files after reaching the image cap

When the composer already has eight images, or the current drop reaches that limit, encountering one additional image executes this break and silently skips every later file in the same drop. This now incorrectly discards otherwise supported text attachments that happen to follow the excess image, even though the reported limit applies only to images; record the image error and continue scanning the remaining files instead.

ℹ️ About Codex in GitHub

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

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

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment threadapps/web/src/components/chat/MessagesTimeline.tsx Outdated
Comment threadapps/web/src/components/chat/ChatComposer.tsx Outdated
@Reston

Copy link
Copy Markdown

I need this, plenty of times I want to give context to the chat and I had to copy the path manually in order to work, in codex cli automatically I can paste and it gives the filepath so the model can fetch it.

@jakeleventhal
jakeleventhalforce-pushed the t3code/support-markdown-chat-attachments branch from 2b01a69 to 58a0171CompareAugust 10, 2026 19:33
@github-actionsgithub-actionsBot added size:L 100-499 changed lines (additions + deletions). and removed size:M 30-99 changed lines (additions + deletions). labels Aug 10, 2026

@macroscopeappmacroscopeappBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Effect service conventions: two error-modeling issues in the new projects.writeTextAttachment path.

Posted via Macroscope — Effect Service Conventions

Comment threadapps/server/src/ws.ts Outdated
Comment threadpackages/contracts/src/project.ts Outdated
Comment threadapps/web/src/components/chat/ChatComposer.tsx Outdated
Comment threadapps/server/src/workspace/WorkspaceFileSystem.ts Outdated
Comment threadapps/web/src/components/chat/ChatComposer.tsx
Comment threadapps/server/src/workspace/WorkspaceFileSystem.ts Outdated
Comment threadapps/web/src/components/chat/ChatComposer.tsx Outdated
Comment threadapps/web/src/components/chat/ChatComposer.tsx Outdated
@jakeleventhal
jakeleventhalforce-pushed the t3code/support-markdown-chat-attachments branch from 58a0171 to 2955bbdCompareAugust 10, 2026 20:18
@github-actionsgithub-actionsBot added size:XL 500-999 changed lines (additions + deletions). and removed size:L 100-499 changed lines (additions + deletions). labels Aug 10, 2026
Comment threadapps/server/src/attachmentStore.ts Outdated
Comment threadapps/server/src/orchestration/Layers/ProjectionPipeline.ts
Comment threadpackages/shared/src/composerInlineTokens.ts Outdated
Comment threadpackages/shared/src/composerInlineTokens.ts Outdated
Comment threadpackages/shared/src/composerInlineTokens.ts Outdated
Comment threadapps/server/src/attachmentStore.ts Outdated
Comment threadapps/server/src/attachmentStore.ts
Comment threadapps/server/src/orchestration/Layers/ProjectionPipeline.ts
Comment threadapps/server/src/orchestration/Layers/ProjectionPipeline.ts

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

Reviewed by Cursor Bugbot for commit a36b386. Configure here.

Comment threadapps/server/src/orchestration/Layers/ProjectionPipeline.ts
@t3dotggt3dotgg added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. and removed vouch:unvouched PR author is not yet trusted in the VOUCHED list. labels Aug 24, 2026
@jakeleventhal

Copy link
Copy Markdown
ContributorAuthor

Synced this branch to current upstream main in 1f2cbca. The resulting tree is identical to main: the non-image attachment feature from this PR has now shipped upstream through the generic attachment upload/claim pipeline, with subsequent validation, cleanup, download, draft recovery, provider, web, and mobile hardening. All 32 review threads are resolved and there is no remaining diff, so I am closing this PR as superseded.

@github-actionsgithub-actionsBot added size:XS 0-9 changed lines (additions + deletions). and removed size:XL 500-999 changed lines (additions + deletions). labels Aug 26, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XS0-9 changed lines (additions + deletions).vouch:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@jakeleventhal@Reston@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

t3code/support non-image chat attachments - #3927

Closed
jakeleventhal wants to merge 7 commits into
pingdotgg:mainfrom
jakeleventhal:t3code/support-markdown-chat-attachments
Closed

t3code/support non-image chat attachments#3927
jakeleventhal wants to merge 7 commits into
pingdotgg:mainfrom
jakeleventhal:t3code/support-markdown-chat-attachments

Conversation

@jakeleventhal

@jakeleventhaljakeleventhal commented Jul 13, 2026

Copy link
Copy Markdown
Contributor

Verification

Screenshot 2026-07-12 at 3 07 25 PMScreenshot 2026-07-12 at 3 09 10 PM [t3code-attachment-tests.zip](https://github.com/user-attachments/files/29944548/t3code-attachment-tests.zip)

Summary

  • allow UTF-8 text files to be dragged into the chat composer alongside images
  • persist text attachments under .t3/attachments and insert standard file-link chips into the prompt
  • avoid collapsing otherwise short user prompts when attachment links contain long hidden paths

Why

The composer previously rejected every dropped file that was not an image. This made it impossible to attach Markdown, source, configuration, or other text files as agent context.

Text attachments now reuse the existing project file-writing and Markdown file-link paths, so they render and behave like other file references. Files are limited to 1 MB and rejected when they contain NUL bytes or invalid UTF-8.

The message collapse heuristic also now measures displayed link labels instead of their backing absolute paths. Without this, prompts containing several attachments could appear hidden even though their visible content was short.

Validation

  • pnpm exec vp test apps/web/src/components/chat/MessagesTimeline.test.tsx
  • pnpm exec vp check
  • pnpm exec vp run typecheck
  • manual drag-and-drop verification with extensionless, Markdown, source, and configuration text files

Note

Medium Risk
Attachment ID format now includes a hash suffix, which can break stored IDs from older threads; attachment persistence and projection cleanup logic also changed in non-trivial ways.

Overview
The chat composer now accepts UTF-8 text files (drag, paste, or picker) in addition to images. Valid files are written under .t3/attachments through a new projects.writeTextAttachment RPC, with server checks for UTF-8, non-empty content, and a contract-defined size cap (1 MB); the prompt gets standard file-link chips like other project references.

Attachment identity and cleanup change: owned segments include a SHA-256 hash suffix (toOwnedThreadAttachmentSegment) to avoid cross-thread slug collisions, and text attachments live as directories outside the workspace. runAttachmentSideEffects is reworked to prune only thread-owned directory attachments without removing legacy image attachments still referenced elsewhere.

Message collapse now measures visible markdown (measureComposerMarkdownVisibleLength) so short prompts with long hidden attachment paths are not collapsed incorrectly.

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

Note

Add support for non-image chat attachments

This PR contains only blank line modifications. Despite the title indicating support for non-image chat attachments, no functional changes are present.

Macroscope summarized 1f2cbca.

@coderabbitai

coderabbitaiBot commented Jul 13, 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: 43778ade-25c1-4623-af5c-fccebcd6ec43

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 size:M 30-99 changed lines (additions + deletions). vouch:unvouched PR author is not yet trusted in the VOUCHED list. labels Jul 13, 2026
@macroscopeapp

macroscopeappBot commented Jul 13, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved at 1f2cbca

Macroscope's review found this PR approvable — The specified base and head resolve to identical repository trees, with zero changed files or line changes. Despite the feature-oriented title, this PR has no runtime impact to review.

Notes:

  • No code objects were reviewed. Approvability was decided on eligibility alone.

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

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

@chatgpt-codex-connectorchatgpt-codex-connectorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit:f044e403be

ℹ️ About Codex in GitHub

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

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

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

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

@chatgpt-codex-connectorchatgpt-codex-connectorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit:c7e248cb18

ℹ️ About Codex in GitHub

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

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

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment threadapps/web/src/components/chat/ChatComposer.tsx Outdated
@jakeleventhaljakeleventhal changed the title t3code/support markdown chat attachmentst3code/support non-image chat attachmentsJul 18, 2026

@chatgpt-codex-connectorchatgpt-codex-connectorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit:3a5cf3e282

ℹ️ About Codex in GitHub

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

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

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

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

@chatgpt-codex-connectorchatgpt-codex-connectorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit:26a4c8e14f

ℹ️ About Codex in GitHub

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

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

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment threadapps/web/src/components/chat/ChatComposer.tsx Outdated
@jakeleventhal
jakeleventhalforce-pushed the t3code/support-markdown-chat-attachments branch from 26a4c8e to 2b01a69CompareJuly 25, 2026 01:24

@chatgpt-codex-connectorchatgpt-codex-connectorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

https://github.com/pingdotgg/t3code/blob/2b01a69e4de7bafb48e3f250af39db3f41a0d9c1/apps/web/src/components/chat/ChatComposer.tsx#L1926-L1928
P2 Badge Continue processing text files after reaching the image cap

When the composer already has eight images, or the current drop reaches that limit, encountering one additional image executes this break and silently skips every later file in the same drop. This now incorrectly discards otherwise supported text attachments that happen to follow the excess image, even though the reported limit applies only to images; record the image error and continue scanning the remaining files instead.

ℹ️ About Codex in GitHub

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

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

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment threadapps/web/src/components/chat/MessagesTimeline.tsx Outdated
Comment threadapps/web/src/components/chat/ChatComposer.tsx Outdated
@Reston

Copy link
Copy Markdown

I need this, plenty of times I want to give context to the chat and I had to copy the path manually in order to work, in codex cli automatically I can paste and it gives the filepath so the model can fetch it.

@jakeleventhal
jakeleventhalforce-pushed the t3code/support-markdown-chat-attachments branch from 2b01a69 to 58a0171CompareAugust 10, 2026 19:33
@github-actionsgithub-actionsBot added size:L 100-499 changed lines (additions + deletions). and removed size:M 30-99 changed lines (additions + deletions). labels Aug 10, 2026

@macroscopeappmacroscopeappBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Effect service conventions: two error-modeling issues in the new projects.writeTextAttachment path.

Posted via Macroscope — Effect Service Conventions

Comment threadapps/server/src/ws.ts Outdated
Comment threadpackages/contracts/src/project.ts Outdated
Comment threadapps/web/src/components/chat/ChatComposer.tsx Outdated
Comment threadapps/server/src/workspace/WorkspaceFileSystem.ts Outdated
Comment threadapps/web/src/components/chat/ChatComposer.tsx
Comment threadapps/server/src/workspace/WorkspaceFileSystem.ts Outdated
Comment threadapps/web/src/components/chat/ChatComposer.tsx Outdated
Comment threadapps/web/src/components/chat/ChatComposer.tsx Outdated
@jakeleventhal
jakeleventhalforce-pushed the t3code/support-markdown-chat-attachments branch from 58a0171 to 2955bbdCompareAugust 10, 2026 20:18
@github-actionsgithub-actionsBot added size:XL 500-999 changed lines (additions + deletions). and removed size:L 100-499 changed lines (additions + deletions). labels Aug 10, 2026
Comment threadapps/server/src/attachmentStore.ts Outdated
Comment threadapps/server/src/orchestration/Layers/ProjectionPipeline.ts
Comment threadpackages/shared/src/composerInlineTokens.ts Outdated
Comment threadpackages/shared/src/composerInlineTokens.ts Outdated
Comment threadpackages/shared/src/composerInlineTokens.ts Outdated
Comment threadapps/server/src/attachmentStore.ts Outdated
Comment threadapps/server/src/attachmentStore.ts
Comment threadapps/server/src/orchestration/Layers/ProjectionPipeline.ts
Comment threadapps/server/src/orchestration/Layers/ProjectionPipeline.ts

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

Reviewed by Cursor Bugbot for commit a36b386. Configure here.

Comment threadapps/server/src/orchestration/Layers/ProjectionPipeline.ts
@t3dotggt3dotgg added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. and removed vouch:unvouched PR author is not yet trusted in the VOUCHED list. labels Aug 24, 2026
@jakeleventhal

Copy link
Copy Markdown
ContributorAuthor

Synced this branch to current upstream main in 1f2cbca. The resulting tree is identical to main: the non-image attachment feature from this PR has now shipped upstream through the generic attachment upload/claim pipeline, with subsequent validation, cleanup, download, draft recovery, provider, web, and mobile hardening. All 32 review threads are resolved and there is no remaining diff, so I am closing this PR as superseded.

@github-actionsgithub-actionsBot added size:XS 0-9 changed lines (additions + deletions). and removed size:XL 500-999 changed lines (additions + deletions). labels Aug 26, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XS0-9 changed lines (additions + deletions).vouch:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@jakeleventhal@Reston@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

t3code/support non-image chat attachments - #3927

Closed
jakeleventhal wants to merge 7 commits into
pingdotgg:mainfrom
jakeleventhal:t3code/support-markdown-chat-attachments
Closed

t3code/support non-image chat attachments#3927
jakeleventhal wants to merge 7 commits into
pingdotgg:mainfrom
jakeleventhal:t3code/support-markdown-chat-attachments

Conversation

@jakeleventhal

@jakeleventhaljakeleventhal commented Jul 13, 2026

Copy link
Copy Markdown
Contributor

Verification

Screenshot 2026-07-12 at 3 07 25 PMScreenshot 2026-07-12 at 3 09 10 PM [t3code-attachment-tests.zip](https://github.com/user-attachments/files/29944548/t3code-attachment-tests.zip)

Summary

  • allow UTF-8 text files to be dragged into the chat composer alongside images
  • persist text attachments under .t3/attachments and insert standard file-link chips into the prompt
  • avoid collapsing otherwise short user prompts when attachment links contain long hidden paths

Why

The composer previously rejected every dropped file that was not an image. This made it impossible to attach Markdown, source, configuration, or other text files as agent context.

Text attachments now reuse the existing project file-writing and Markdown file-link paths, so they render and behave like other file references. Files are limited to 1 MB and rejected when they contain NUL bytes or invalid UTF-8.

The message collapse heuristic also now measures displayed link labels instead of their backing absolute paths. Without this, prompts containing several attachments could appear hidden even though their visible content was short.

Validation

  • pnpm exec vp test apps/web/src/components/chat/MessagesTimeline.test.tsx
  • pnpm exec vp check
  • pnpm exec vp run typecheck
  • manual drag-and-drop verification with extensionless, Markdown, source, and configuration text files

Note

Medium Risk
Attachment ID format now includes a hash suffix, which can break stored IDs from older threads; attachment persistence and projection cleanup logic also changed in non-trivial ways.

Overview
The chat composer now accepts UTF-8 text files (drag, paste, or picker) in addition to images. Valid files are written under .t3/attachments through a new projects.writeTextAttachment RPC, with server checks for UTF-8, non-empty content, and a contract-defined size cap (1 MB); the prompt gets standard file-link chips like other project references.

Attachment identity and cleanup change: owned segments include a SHA-256 hash suffix (toOwnedThreadAttachmentSegment) to avoid cross-thread slug collisions, and text attachments live as directories outside the workspace. runAttachmentSideEffects is reworked to prune only thread-owned directory attachments without removing legacy image attachments still referenced elsewhere.

Message collapse now measures visible markdown (measureComposerMarkdownVisibleLength) so short prompts with long hidden attachment paths are not collapsed incorrectly.

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

Note

Add support for non-image chat attachments

This PR contains only blank line modifications. Despite the title indicating support for non-image chat attachments, no functional changes are present.

Macroscope summarized 1f2cbca.

@coderabbitai

coderabbitaiBot commented Jul 13, 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: 43778ade-25c1-4623-af5c-fccebcd6ec43

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 size:M 30-99 changed lines (additions + deletions). vouch:unvouched PR author is not yet trusted in the VOUCHED list. labels Jul 13, 2026
@macroscopeapp

macroscopeappBot commented Jul 13, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved at 1f2cbca

Macroscope's review found this PR approvable — The specified base and head resolve to identical repository trees, with zero changed files or line changes. Despite the feature-oriented title, this PR has no runtime impact to review.

Notes:

  • No code objects were reviewed. Approvability was decided on eligibility alone.

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

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

@chatgpt-codex-connectorchatgpt-codex-connectorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit:f044e403be

ℹ️ About Codex in GitHub

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

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

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

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

@chatgpt-codex-connectorchatgpt-codex-connectorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit:c7e248cb18

ℹ️ About Codex in GitHub

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

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

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment threadapps/web/src/components/chat/ChatComposer.tsx Outdated
@jakeleventhaljakeleventhal changed the title t3code/support markdown chat attachmentst3code/support non-image chat attachmentsJul 18, 2026

@chatgpt-codex-connectorchatgpt-codex-connectorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit:3a5cf3e282

ℹ️ About Codex in GitHub

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

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

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

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

@chatgpt-codex-connectorchatgpt-codex-connectorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit:26a4c8e14f

ℹ️ About Codex in GitHub

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

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

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment threadapps/web/src/components/chat/ChatComposer.tsx Outdated
@jakeleventhal
jakeleventhalforce-pushed the t3code/support-markdown-chat-attachments branch from 26a4c8e to 2b01a69CompareJuly 25, 2026 01:24

@chatgpt-codex-connectorchatgpt-codex-connectorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

https://github.com/pingdotgg/t3code/blob/2b01a69e4de7bafb48e3f250af39db3f41a0d9c1/apps/web/src/components/chat/ChatComposer.tsx#L1926-L1928
P2 Badge Continue processing text files after reaching the image cap

When the composer already has eight images, or the current drop reaches that limit, encountering one additional image executes this break and silently skips every later file in the same drop. This now incorrectly discards otherwise supported text attachments that happen to follow the excess image, even though the reported limit applies only to images; record the image error and continue scanning the remaining files instead.

ℹ️ About Codex in GitHub

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

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

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment threadapps/web/src/components/chat/MessagesTimeline.tsx Outdated
Comment threadapps/web/src/components/chat/ChatComposer.tsx Outdated
@Reston

Copy link
Copy Markdown

I need this, plenty of times I want to give context to the chat and I had to copy the path manually in order to work, in codex cli automatically I can paste and it gives the filepath so the model can fetch it.

@jakeleventhal
jakeleventhalforce-pushed the t3code/support-markdown-chat-attachments branch from 2b01a69 to 58a0171CompareAugust 10, 2026 19:33
@github-actionsgithub-actionsBot added size:L 100-499 changed lines (additions + deletions). and removed size:M 30-99 changed lines (additions + deletions). labels Aug 10, 2026

@macroscopeappmacroscopeappBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Effect service conventions: two error-modeling issues in the new projects.writeTextAttachment path.

Posted via Macroscope — Effect Service Conventions

Comment threadapps/server/src/ws.ts Outdated
Comment threadpackages/contracts/src/project.ts Outdated
Comment threadapps/web/src/components/chat/ChatComposer.tsx Outdated
Comment threadapps/server/src/workspace/WorkspaceFileSystem.ts Outdated
Comment threadapps/web/src/components/chat/ChatComposer.tsx
Comment threadapps/server/src/workspace/WorkspaceFileSystem.ts Outdated
Comment threadapps/web/src/components/chat/ChatComposer.tsx Outdated
Comment threadapps/web/src/components/chat/ChatComposer.tsx Outdated
@jakeleventhal
jakeleventhalforce-pushed the t3code/support-markdown-chat-attachments branch from 58a0171 to 2955bbdCompareAugust 10, 2026 20:18
@github-actionsgithub-actionsBot added size:XL 500-999 changed lines (additions + deletions). and removed size:L 100-499 changed lines (additions + deletions). labels Aug 10, 2026
Comment threadapps/server/src/attachmentStore.ts Outdated
Comment threadapps/server/src/orchestration/Layers/ProjectionPipeline.ts
Comment threadpackages/shared/src/composerInlineTokens.ts Outdated
Comment threadpackages/shared/src/composerInlineTokens.ts Outdated
Comment threadpackages/shared/src/composerInlineTokens.ts Outdated
Comment threadapps/server/src/attachmentStore.ts Outdated
Comment threadapps/server/src/attachmentStore.ts
Comment threadapps/server/src/orchestration/Layers/ProjectionPipeline.ts
Comment threadapps/server/src/orchestration/Layers/ProjectionPipeline.ts

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

Reviewed by Cursor Bugbot for commit a36b386. Configure here.

Comment threadapps/server/src/orchestration/Layers/ProjectionPipeline.ts
@t3dotggt3dotgg added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. and removed vouch:unvouched PR author is not yet trusted in the VOUCHED list. labels Aug 24, 2026
@jakeleventhal

Copy link
Copy Markdown
ContributorAuthor

Synced this branch to current upstream main in 1f2cbca. The resulting tree is identical to main: the non-image attachment feature from this PR has now shipped upstream through the generic attachment upload/claim pipeline, with subsequent validation, cleanup, download, draft recovery, provider, web, and mobile hardening. All 32 review threads are resolved and there is no remaining diff, so I am closing this PR as superseded.

@github-actionsgithub-actionsBot added size:XS 0-9 changed lines (additions + deletions). and removed size:XL 500-999 changed lines (additions + deletions). labels Aug 26, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XS0-9 changed lines (additions + deletions).vouch:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@jakeleventhal@Reston@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

t3code/support non-image chat attachments - #3927

Closed
jakeleventhal wants to merge 7 commits into
pingdotgg:mainfrom
jakeleventhal:t3code/support-markdown-chat-attachments
Closed

t3code/support non-image chat attachments#3927
jakeleventhal wants to merge 7 commits into
pingdotgg:mainfrom
jakeleventhal:t3code/support-markdown-chat-attachments

Conversation

@jakeleventhal

@jakeleventhaljakeleventhal commented Jul 13, 2026

Copy link
Copy Markdown
Contributor

Verification

Screenshot 2026-07-12 at 3 07 25 PMScreenshot 2026-07-12 at 3 09 10 PM [t3code-attachment-tests.zip](https://github.com/user-attachments/files/29944548/t3code-attachment-tests.zip)

Summary

  • allow UTF-8 text files to be dragged into the chat composer alongside images
  • persist text attachments under .t3/attachments and insert standard file-link chips into the prompt
  • avoid collapsing otherwise short user prompts when attachment links contain long hidden paths

Why

The composer previously rejected every dropped file that was not an image. This made it impossible to attach Markdown, source, configuration, or other text files as agent context.

Text attachments now reuse the existing project file-writing and Markdown file-link paths, so they render and behave like other file references. Files are limited to 1 MB and rejected when they contain NUL bytes or invalid UTF-8.

The message collapse heuristic also now measures displayed link labels instead of their backing absolute paths. Without this, prompts containing several attachments could appear hidden even though their visible content was short.

Validation

  • pnpm exec vp test apps/web/src/components/chat/MessagesTimeline.test.tsx
  • pnpm exec vp check
  • pnpm exec vp run typecheck
  • manual drag-and-drop verification with extensionless, Markdown, source, and configuration text files

Note

Medium Risk
Attachment ID format now includes a hash suffix, which can break stored IDs from older threads; attachment persistence and projection cleanup logic also changed in non-trivial ways.

Overview
The chat composer now accepts UTF-8 text files (drag, paste, or picker) in addition to images. Valid files are written under .t3/attachments through a new projects.writeTextAttachment RPC, with server checks for UTF-8, non-empty content, and a contract-defined size cap (1 MB); the prompt gets standard file-link chips like other project references.

Attachment identity and cleanup change: owned segments include a SHA-256 hash suffix (toOwnedThreadAttachmentSegment) to avoid cross-thread slug collisions, and text attachments live as directories outside the workspace. runAttachmentSideEffects is reworked to prune only thread-owned directory attachments without removing legacy image attachments still referenced elsewhere.

Message collapse now measures visible markdown (measureComposerMarkdownVisibleLength) so short prompts with long hidden attachment paths are not collapsed incorrectly.

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

Note

Add support for non-image chat attachments

This PR contains only blank line modifications. Despite the title indicating support for non-image chat attachments, no functional changes are present.

Macroscope summarized 1f2cbca.

@coderabbitai

coderabbitaiBot commented Jul 13, 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: 43778ade-25c1-4623-af5c-fccebcd6ec43

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 size:M 30-99 changed lines (additions + deletions). vouch:unvouched PR author is not yet trusted in the VOUCHED list. labels Jul 13, 2026
@macroscopeapp

macroscopeappBot commented Jul 13, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved at 1f2cbca

Macroscope's review found this PR approvable — The specified base and head resolve to identical repository trees, with zero changed files or line changes. Despite the feature-oriented title, this PR has no runtime impact to review.

Notes:

  • No code objects were reviewed. Approvability was decided on eligibility alone.

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

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

@chatgpt-codex-connectorchatgpt-codex-connectorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit:f044e403be

ℹ️ About Codex in GitHub

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

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

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

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

@chatgpt-codex-connectorchatgpt-codex-connectorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit:c7e248cb18

ℹ️ About Codex in GitHub

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

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

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment threadapps/web/src/components/chat/ChatComposer.tsx Outdated
@jakeleventhaljakeleventhal changed the title t3code/support markdown chat attachmentst3code/support non-image chat attachmentsJul 18, 2026

@chatgpt-codex-connectorchatgpt-codex-connectorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit:3a5cf3e282

ℹ️ About Codex in GitHub

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

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

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

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

@chatgpt-codex-connectorchatgpt-codex-connectorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit:26a4c8e14f

ℹ️ About Codex in GitHub

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

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

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment threadapps/web/src/components/chat/ChatComposer.tsx Outdated
@jakeleventhal
jakeleventhalforce-pushed the t3code/support-markdown-chat-attachments branch from 26a4c8e to 2b01a69CompareJuly 25, 2026 01:24

@chatgpt-codex-connectorchatgpt-codex-connectorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

https://github.com/pingdotgg/t3code/blob/2b01a69e4de7bafb48e3f250af39db3f41a0d9c1/apps/web/src/components/chat/ChatComposer.tsx#L1926-L1928
P2 Badge Continue processing text files after reaching the image cap

When the composer already has eight images, or the current drop reaches that limit, encountering one additional image executes this break and silently skips every later file in the same drop. This now incorrectly discards otherwise supported text attachments that happen to follow the excess image, even though the reported limit applies only to images; record the image error and continue scanning the remaining files instead.

ℹ️ About Codex in GitHub

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

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

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment threadapps/web/src/components/chat/MessagesTimeline.tsx Outdated
Comment threadapps/web/src/components/chat/ChatComposer.tsx Outdated
@Reston

Copy link
Copy Markdown

I need this, plenty of times I want to give context to the chat and I had to copy the path manually in order to work, in codex cli automatically I can paste and it gives the filepath so the model can fetch it.

@jakeleventhal
jakeleventhalforce-pushed the t3code/support-markdown-chat-attachments branch from 2b01a69 to 58a0171CompareAugust 10, 2026 19:33
@github-actionsgithub-actionsBot added size:L 100-499 changed lines (additions + deletions). and removed size:M 30-99 changed lines (additions + deletions). labels Aug 10, 2026

@macroscopeappmacroscopeappBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Effect service conventions: two error-modeling issues in the new projects.writeTextAttachment path.

Posted via Macroscope — Effect Service Conventions

Comment threadapps/server/src/ws.ts Outdated
Comment threadpackages/contracts/src/project.ts Outdated
Comment threadapps/web/src/components/chat/ChatComposer.tsx Outdated
Comment threadapps/server/src/workspace/WorkspaceFileSystem.ts Outdated
Comment threadapps/web/src/components/chat/ChatComposer.tsx
Comment threadapps/server/src/workspace/WorkspaceFileSystem.ts Outdated
Comment threadapps/web/src/components/chat/ChatComposer.tsx Outdated
Comment threadapps/web/src/components/chat/ChatComposer.tsx Outdated
@jakeleventhal
jakeleventhalforce-pushed the t3code/support-markdown-chat-attachments branch from 58a0171 to 2955bbdCompareAugust 10, 2026 20:18
@github-actionsgithub-actionsBot added size:XL 500-999 changed lines (additions + deletions). and removed size:L 100-499 changed lines (additions + deletions). labels Aug 10, 2026
Comment threadapps/server/src/attachmentStore.ts Outdated
Comment threadapps/server/src/orchestration/Layers/ProjectionPipeline.ts
Comment threadpackages/shared/src/composerInlineTokens.ts Outdated
Comment threadpackages/shared/src/composerInlineTokens.ts Outdated
Comment threadpackages/shared/src/composerInlineTokens.ts Outdated
Comment threadapps/server/src/attachmentStore.ts Outdated
Comment threadapps/server/src/attachmentStore.ts
Comment threadapps/server/src/orchestration/Layers/ProjectionPipeline.ts
Comment threadapps/server/src/orchestration/Layers/ProjectionPipeline.ts

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

Reviewed by Cursor Bugbot for commit a36b386. Configure here.

Comment threadapps/server/src/orchestration/Layers/ProjectionPipeline.ts
@t3dotggt3dotgg added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. and removed vouch:unvouched PR author is not yet trusted in the VOUCHED list. labels Aug 24, 2026
@jakeleventhal

Copy link
Copy Markdown
ContributorAuthor

Synced this branch to current upstream main in 1f2cbca. The resulting tree is identical to main: the non-image attachment feature from this PR has now shipped upstream through the generic attachment upload/claim pipeline, with subsequent validation, cleanup, download, draft recovery, provider, web, and mobile hardening. All 32 review threads are resolved and there is no remaining diff, so I am closing this PR as superseded.

@github-actionsgithub-actionsBot added size:XS 0-9 changed lines (additions + deletions). and removed size:XL 500-999 changed lines (additions + deletions). labels Aug 26, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XS0-9 changed lines (additions + deletions).vouch:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@jakeleventhal@Reston@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

t3code/support non-image chat attachments - #3927

Closed
jakeleventhal wants to merge 7 commits into
pingdotgg:mainfrom
jakeleventhal:t3code/support-markdown-chat-attachments
Closed

t3code/support non-image chat attachments#3927
jakeleventhal wants to merge 7 commits into
pingdotgg:mainfrom
jakeleventhal:t3code/support-markdown-chat-attachments

Conversation

@jakeleventhal

@jakeleventhaljakeleventhal commented Jul 13, 2026

Copy link
Copy Markdown
Contributor

Verification

Screenshot 2026-07-12 at 3 07 25 PMScreenshot 2026-07-12 at 3 09 10 PM [t3code-attachment-tests.zip](https://github.com/user-attachments/files/29944548/t3code-attachment-tests.zip)

Summary

  • allow UTF-8 text files to be dragged into the chat composer alongside images
  • persist text attachments under .t3/attachments and insert standard file-link chips into the prompt
  • avoid collapsing otherwise short user prompts when attachment links contain long hidden paths

Why

The composer previously rejected every dropped file that was not an image. This made it impossible to attach Markdown, source, configuration, or other text files as agent context.

Text attachments now reuse the existing project file-writing and Markdown file-link paths, so they render and behave like other file references. Files are limited to 1 MB and rejected when they contain NUL bytes or invalid UTF-8.

The message collapse heuristic also now measures displayed link labels instead of their backing absolute paths. Without this, prompts containing several attachments could appear hidden even though their visible content was short.

Validation

  • pnpm exec vp test apps/web/src/components/chat/MessagesTimeline.test.tsx
  • pnpm exec vp check
  • pnpm exec vp run typecheck
  • manual drag-and-drop verification with extensionless, Markdown, source, and configuration text files

Note

Medium Risk
Attachment ID format now includes a hash suffix, which can break stored IDs from older threads; attachment persistence and projection cleanup logic also changed in non-trivial ways.

Overview
The chat composer now accepts UTF-8 text files (drag, paste, or picker) in addition to images. Valid files are written under .t3/attachments through a new projects.writeTextAttachment RPC, with server checks for UTF-8, non-empty content, and a contract-defined size cap (1 MB); the prompt gets standard file-link chips like other project references.

Attachment identity and cleanup change: owned segments include a SHA-256 hash suffix (toOwnedThreadAttachmentSegment) to avoid cross-thread slug collisions, and text attachments live as directories outside the workspace. runAttachmentSideEffects is reworked to prune only thread-owned directory attachments without removing legacy image attachments still referenced elsewhere.

Message collapse now measures visible markdown (measureComposerMarkdownVisibleLength) so short prompts with long hidden attachment paths are not collapsed incorrectly.

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

Note

Add support for non-image chat attachments

This PR contains only blank line modifications. Despite the title indicating support for non-image chat attachments, no functional changes are present.

Macroscope summarized 1f2cbca.

@coderabbitai

coderabbitaiBot commented Jul 13, 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: 43778ade-25c1-4623-af5c-fccebcd6ec43

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 size:M 30-99 changed lines (additions + deletions). vouch:unvouched PR author is not yet trusted in the VOUCHED list. labels Jul 13, 2026
@macroscopeapp

macroscopeappBot commented Jul 13, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved at 1f2cbca

Macroscope's review found this PR approvable — The specified base and head resolve to identical repository trees, with zero changed files or line changes. Despite the feature-oriented title, this PR has no runtime impact to review.

Notes:

  • No code objects were reviewed. Approvability was decided on eligibility alone.

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

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

@chatgpt-codex-connectorchatgpt-codex-connectorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit:f044e403be

ℹ️ About Codex in GitHub

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

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

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

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

@chatgpt-codex-connectorchatgpt-codex-connectorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit:c7e248cb18

ℹ️ About Codex in GitHub

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

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

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment threadapps/web/src/components/chat/ChatComposer.tsx Outdated
@jakeleventhaljakeleventhal changed the title t3code/support markdown chat attachmentst3code/support non-image chat attachmentsJul 18, 2026

@chatgpt-codex-connectorchatgpt-codex-connectorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit:3a5cf3e282

ℹ️ About Codex in GitHub

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

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

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

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

@chatgpt-codex-connectorchatgpt-codex-connectorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit:26a4c8e14f

ℹ️ About Codex in GitHub

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

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

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment threadapps/web/src/components/chat/ChatComposer.tsx Outdated
@jakeleventhal
jakeleventhalforce-pushed the t3code/support-markdown-chat-attachments branch from 26a4c8e to 2b01a69CompareJuly 25, 2026 01:24

@chatgpt-codex-connectorchatgpt-codex-connectorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

https://github.com/pingdotgg/t3code/blob/2b01a69e4de7bafb48e3f250af39db3f41a0d9c1/apps/web/src/components/chat/ChatComposer.tsx#L1926-L1928
P2 Badge Continue processing text files after reaching the image cap

When the composer already has eight images, or the current drop reaches that limit, encountering one additional image executes this break and silently skips every later file in the same drop. This now incorrectly discards otherwise supported text attachments that happen to follow the excess image, even though the reported limit applies only to images; record the image error and continue scanning the remaining files instead.

ℹ️ About Codex in GitHub

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

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

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment threadapps/web/src/components/chat/MessagesTimeline.tsx Outdated
Comment threadapps/web/src/components/chat/ChatComposer.tsx Outdated
@Reston

Copy link
Copy Markdown

I need this, plenty of times I want to give context to the chat and I had to copy the path manually in order to work, in codex cli automatically I can paste and it gives the filepath so the model can fetch it.

@jakeleventhal
jakeleventhalforce-pushed the t3code/support-markdown-chat-attachments branch from 2b01a69 to 58a0171CompareAugust 10, 2026 19:33
@github-actionsgithub-actionsBot added size:L 100-499 changed lines (additions + deletions). and removed size:M 30-99 changed lines (additions + deletions). labels Aug 10, 2026

@macroscopeappmacroscopeappBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Effect service conventions: two error-modeling issues in the new projects.writeTextAttachment path.

Posted via Macroscope — Effect Service Conventions

Comment threadapps/server/src/ws.ts Outdated
Comment threadpackages/contracts/src/project.ts Outdated
Comment threadapps/web/src/components/chat/ChatComposer.tsx Outdated
Comment threadapps/server/src/workspace/WorkspaceFileSystem.ts Outdated
Comment threadapps/web/src/components/chat/ChatComposer.tsx
Comment threadapps/server/src/workspace/WorkspaceFileSystem.ts Outdated
Comment threadapps/web/src/components/chat/ChatComposer.tsx Outdated
Comment threadapps/web/src/components/chat/ChatComposer.tsx Outdated
@jakeleventhal
jakeleventhalforce-pushed the t3code/support-markdown-chat-attachments branch from 58a0171 to 2955bbdCompareAugust 10, 2026 20:18
@github-actionsgithub-actionsBot added size:XL 500-999 changed lines (additions + deletions). and removed size:L 100-499 changed lines (additions + deletions). labels Aug 10, 2026
Comment threadapps/server/src/attachmentStore.ts Outdated
Comment threadapps/server/src/orchestration/Layers/ProjectionPipeline.ts
Comment threadpackages/shared/src/composerInlineTokens.ts Outdated
Comment threadpackages/shared/src/composerInlineTokens.ts Outdated
Comment threadpackages/shared/src/composerInlineTokens.ts Outdated
Comment threadapps/server/src/attachmentStore.ts Outdated
Comment threadapps/server/src/attachmentStore.ts
Comment threadapps/server/src/orchestration/Layers/ProjectionPipeline.ts
Comment threadapps/server/src/orchestration/Layers/ProjectionPipeline.ts

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

Reviewed by Cursor Bugbot for commit a36b386. Configure here.

Comment threadapps/server/src/orchestration/Layers/ProjectionPipeline.ts
@t3dotggt3dotgg added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. and removed vouch:unvouched PR author is not yet trusted in the VOUCHED list. labels Aug 24, 2026
@jakeleventhal

Copy link
Copy Markdown
ContributorAuthor

Synced this branch to current upstream main in 1f2cbca. The resulting tree is identical to main: the non-image attachment feature from this PR has now shipped upstream through the generic attachment upload/claim pipeline, with subsequent validation, cleanup, download, draft recovery, provider, web, and mobile hardening. All 32 review threads are resolved and there is no remaining diff, so I am closing this PR as superseded.

@github-actionsgithub-actionsBot added size:XS 0-9 changed lines (additions + deletions). and removed size:XL 500-999 changed lines (additions + deletions). labels Aug 26, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XS0-9 changed lines (additions + deletions).vouch:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@jakeleventhal@Reston@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

t3code/support non-image chat attachments - #3927

Closed
jakeleventhal wants to merge 7 commits into
pingdotgg:mainfrom
jakeleventhal:t3code/support-markdown-chat-attachments
Closed

t3code/support non-image chat attachments#3927
jakeleventhal wants to merge 7 commits into
pingdotgg:mainfrom
jakeleventhal:t3code/support-markdown-chat-attachments

Conversation

@jakeleventhal

@jakeleventhaljakeleventhal commented Jul 13, 2026

Copy link
Copy Markdown
Contributor

Verification

Screenshot 2026-07-12 at 3 07 25 PMScreenshot 2026-07-12 at 3 09 10 PM [t3code-attachment-tests.zip](https://github.com/user-attachments/files/29944548/t3code-attachment-tests.zip)

Summary

  • allow UTF-8 text files to be dragged into the chat composer alongside images
  • persist text attachments under .t3/attachments and insert standard file-link chips into the prompt
  • avoid collapsing otherwise short user prompts when attachment links contain long hidden paths

Why

The composer previously rejected every dropped file that was not an image. This made it impossible to attach Markdown, source, configuration, or other text files as agent context.

Text attachments now reuse the existing project file-writing and Markdown file-link paths, so they render and behave like other file references. Files are limited to 1 MB and rejected when they contain NUL bytes or invalid UTF-8.

The message collapse heuristic also now measures displayed link labels instead of their backing absolute paths. Without this, prompts containing several attachments could appear hidden even though their visible content was short.

Validation

  • pnpm exec vp test apps/web/src/components/chat/MessagesTimeline.test.tsx
  • pnpm exec vp check
  • pnpm exec vp run typecheck
  • manual drag-and-drop verification with extensionless, Markdown, source, and configuration text files

Note

Medium Risk
Attachment ID format now includes a hash suffix, which can break stored IDs from older threads; attachment persistence and projection cleanup logic also changed in non-trivial ways.

Overview
The chat composer now accepts UTF-8 text files (drag, paste, or picker) in addition to images. Valid files are written under .t3/attachments through a new projects.writeTextAttachment RPC, with server checks for UTF-8, non-empty content, and a contract-defined size cap (1 MB); the prompt gets standard file-link chips like other project references.

Attachment identity and cleanup change: owned segments include a SHA-256 hash suffix (toOwnedThreadAttachmentSegment) to avoid cross-thread slug collisions, and text attachments live as directories outside the workspace. runAttachmentSideEffects is reworked to prune only thread-owned directory attachments without removing legacy image attachments still referenced elsewhere.

Message collapse now measures visible markdown (measureComposerMarkdownVisibleLength) so short prompts with long hidden attachment paths are not collapsed incorrectly.

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

Note

Add support for non-image chat attachments

This PR contains only blank line modifications. Despite the title indicating support for non-image chat attachments, no functional changes are present.

Macroscope summarized 1f2cbca.

@coderabbitai

coderabbitaiBot commented Jul 13, 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: 43778ade-25c1-4623-af5c-fccebcd6ec43

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 size:M 30-99 changed lines (additions + deletions). vouch:unvouched PR author is not yet trusted in the VOUCHED list. labels Jul 13, 2026
@macroscopeapp

macroscopeappBot commented Jul 13, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved at 1f2cbca

Macroscope's review found this PR approvable — The specified base and head resolve to identical repository trees, with zero changed files or line changes. Despite the feature-oriented title, this PR has no runtime impact to review.

Notes:

  • No code objects were reviewed. Approvability was decided on eligibility alone.

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

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

@chatgpt-codex-connectorchatgpt-codex-connectorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit:f044e403be

ℹ️ About Codex in GitHub

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

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

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

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

@chatgpt-codex-connectorchatgpt-codex-connectorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit:c7e248cb18

ℹ️ About Codex in GitHub

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

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

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment threadapps/web/src/components/chat/ChatComposer.tsx Outdated
@jakeleventhaljakeleventhal changed the title t3code/support markdown chat attachmentst3code/support non-image chat attachmentsJul 18, 2026

@chatgpt-codex-connectorchatgpt-codex-connectorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit:3a5cf3e282

ℹ️ About Codex in GitHub

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

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

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

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

@chatgpt-codex-connectorchatgpt-codex-connectorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit:26a4c8e14f

ℹ️ About Codex in GitHub

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

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

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment threadapps/web/src/components/chat/ChatComposer.tsx Outdated
@jakeleventhal
jakeleventhalforce-pushed the t3code/support-markdown-chat-attachments branch from 26a4c8e to 2b01a69CompareJuly 25, 2026 01:24

@chatgpt-codex-connectorchatgpt-codex-connectorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

https://github.com/pingdotgg/t3code/blob/2b01a69e4de7bafb48e3f250af39db3f41a0d9c1/apps/web/src/components/chat/ChatComposer.tsx#L1926-L1928
P2 Badge Continue processing text files after reaching the image cap

When the composer already has eight images, or the current drop reaches that limit, encountering one additional image executes this break and silently skips every later file in the same drop. This now incorrectly discards otherwise supported text attachments that happen to follow the excess image, even though the reported limit applies only to images; record the image error and continue scanning the remaining files instead.

ℹ️ About Codex in GitHub

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

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

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment threadapps/web/src/components/chat/MessagesTimeline.tsx Outdated
Comment threadapps/web/src/components/chat/ChatComposer.tsx Outdated
@Reston

Copy link
Copy Markdown

I need this, plenty of times I want to give context to the chat and I had to copy the path manually in order to work, in codex cli automatically I can paste and it gives the filepath so the model can fetch it.

@jakeleventhal
jakeleventhalforce-pushed the t3code/support-markdown-chat-attachments branch from 2b01a69 to 58a0171CompareAugust 10, 2026 19:33
@github-actionsgithub-actionsBot added size:L 100-499 changed lines (additions + deletions). and removed size:M 30-99 changed lines (additions + deletions). labels Aug 10, 2026

@macroscopeappmacroscopeappBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Effect service conventions: two error-modeling issues in the new projects.writeTextAttachment path.

Posted via Macroscope — Effect Service Conventions

Comment threadapps/server/src/ws.ts Outdated
Comment threadpackages/contracts/src/project.ts Outdated
Comment threadapps/web/src/components/chat/ChatComposer.tsx Outdated
Comment threadapps/server/src/workspace/WorkspaceFileSystem.ts Outdated
Comment threadapps/web/src/components/chat/ChatComposer.tsx
Comment threadapps/server/src/workspace/WorkspaceFileSystem.ts Outdated
Comment threadapps/web/src/components/chat/ChatComposer.tsx Outdated
Comment threadapps/web/src/components/chat/ChatComposer.tsx Outdated
@jakeleventhal
jakeleventhalforce-pushed the t3code/support-markdown-chat-attachments branch from 58a0171 to 2955bbdCompareAugust 10, 2026 20:18
@github-actionsgithub-actionsBot added size:XL 500-999 changed lines (additions + deletions). and removed size:L 100-499 changed lines (additions + deletions). labels Aug 10, 2026
Comment threadapps/server/src/attachmentStore.ts Outdated
Comment threadapps/server/src/orchestration/Layers/ProjectionPipeline.ts
Comment threadpackages/shared/src/composerInlineTokens.ts Outdated
Comment threadpackages/shared/src/composerInlineTokens.ts Outdated
Comment threadpackages/shared/src/composerInlineTokens.ts Outdated
Comment threadapps/server/src/attachmentStore.ts Outdated
Comment threadapps/server/src/attachmentStore.ts
Comment threadapps/server/src/orchestration/Layers/ProjectionPipeline.ts
Comment threadapps/server/src/orchestration/Layers/ProjectionPipeline.ts

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

Reviewed by Cursor Bugbot for commit a36b386. Configure here.

Comment threadapps/server/src/orchestration/Layers/ProjectionPipeline.ts
@t3dotggt3dotgg added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. and removed vouch:unvouched PR author is not yet trusted in the VOUCHED list. labels Aug 24, 2026
@jakeleventhal

Copy link
Copy Markdown
ContributorAuthor

Synced this branch to current upstream main in 1f2cbca. The resulting tree is identical to main: the non-image attachment feature from this PR has now shipped upstream through the generic attachment upload/claim pipeline, with subsequent validation, cleanup, download, draft recovery, provider, web, and mobile hardening. All 32 review threads are resolved and there is no remaining diff, so I am closing this PR as superseded.

@github-actionsgithub-actionsBot added size:XS 0-9 changed lines (additions + deletions). and removed size:XL 500-999 changed lines (additions + deletions). labels Aug 26, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XS0-9 changed lines (additions + deletions).vouch:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@jakeleventhal@Reston@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

t3code/support non-image chat attachments - #3927

Closed
jakeleventhal wants to merge 7 commits into
pingdotgg:mainfrom
jakeleventhal:t3code/support-markdown-chat-attachments
Closed

t3code/support non-image chat attachments#3927
jakeleventhal wants to merge 7 commits into
pingdotgg:mainfrom
jakeleventhal:t3code/support-markdown-chat-attachments

Conversation

@jakeleventhal

@jakeleventhaljakeleventhal commented Jul 13, 2026

Copy link
Copy Markdown
Contributor

Verification

Screenshot 2026-07-12 at 3 07 25 PMScreenshot 2026-07-12 at 3 09 10 PM [t3code-attachment-tests.zip](https://github.com/user-attachments/files/29944548/t3code-attachment-tests.zip)

Summary

  • allow UTF-8 text files to be dragged into the chat composer alongside images
  • persist text attachments under .t3/attachments and insert standard file-link chips into the prompt
  • avoid collapsing otherwise short user prompts when attachment links contain long hidden paths

Why

The composer previously rejected every dropped file that was not an image. This made it impossible to attach Markdown, source, configuration, or other text files as agent context.

Text attachments now reuse the existing project file-writing and Markdown file-link paths, so they render and behave like other file references. Files are limited to 1 MB and rejected when they contain NUL bytes or invalid UTF-8.

The message collapse heuristic also now measures displayed link labels instead of their backing absolute paths. Without this, prompts containing several attachments could appear hidden even though their visible content was short.

Validation

  • pnpm exec vp test apps/web/src/components/chat/MessagesTimeline.test.tsx
  • pnpm exec vp check
  • pnpm exec vp run typecheck
  • manual drag-and-drop verification with extensionless, Markdown, source, and configuration text files

Note

Medium Risk
Attachment ID format now includes a hash suffix, which can break stored IDs from older threads; attachment persistence and projection cleanup logic also changed in non-trivial ways.

Overview
The chat composer now accepts UTF-8 text files (drag, paste, or picker) in addition to images. Valid files are written under .t3/attachments through a new projects.writeTextAttachment RPC, with server checks for UTF-8, non-empty content, and a contract-defined size cap (1 MB); the prompt gets standard file-link chips like other project references.

Attachment identity and cleanup change: owned segments include a SHA-256 hash suffix (toOwnedThreadAttachmentSegment) to avoid cross-thread slug collisions, and text attachments live as directories outside the workspace. runAttachmentSideEffects is reworked to prune only thread-owned directory attachments without removing legacy image attachments still referenced elsewhere.

Message collapse now measures visible markdown (measureComposerMarkdownVisibleLength) so short prompts with long hidden attachment paths are not collapsed incorrectly.

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

Note

Add support for non-image chat attachments

This PR contains only blank line modifications. Despite the title indicating support for non-image chat attachments, no functional changes are present.

Macroscope summarized 1f2cbca.

@coderabbitai

coderabbitaiBot commented Jul 13, 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: 43778ade-25c1-4623-af5c-fccebcd6ec43

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 size:M 30-99 changed lines (additions + deletions). vouch:unvouched PR author is not yet trusted in the VOUCHED list. labels Jul 13, 2026
@macroscopeapp

macroscopeappBot commented Jul 13, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved at 1f2cbca

Macroscope's review found this PR approvable — The specified base and head resolve to identical repository trees, with zero changed files or line changes. Despite the feature-oriented title, this PR has no runtime impact to review.

Notes:

  • No code objects were reviewed. Approvability was decided on eligibility alone.

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

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

@chatgpt-codex-connectorchatgpt-codex-connectorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit:f044e403be

ℹ️ About Codex in GitHub

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

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

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

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

@chatgpt-codex-connectorchatgpt-codex-connectorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit:c7e248cb18

ℹ️ About Codex in GitHub

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

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

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment threadapps/web/src/components/chat/ChatComposer.tsx Outdated
@jakeleventhaljakeleventhal changed the title t3code/support markdown chat attachmentst3code/support non-image chat attachmentsJul 18, 2026

@chatgpt-codex-connectorchatgpt-codex-connectorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit:3a5cf3e282

ℹ️ About Codex in GitHub

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

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

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

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

@chatgpt-codex-connectorchatgpt-codex-connectorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit:26a4c8e14f

ℹ️ About Codex in GitHub

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

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

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment threadapps/web/src/components/chat/ChatComposer.tsx Outdated
@jakeleventhal
jakeleventhalforce-pushed the t3code/support-markdown-chat-attachments branch from 26a4c8e to 2b01a69CompareJuly 25, 2026 01:24

@chatgpt-codex-connectorchatgpt-codex-connectorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

https://github.com/pingdotgg/t3code/blob/2b01a69e4de7bafb48e3f250af39db3f41a0d9c1/apps/web/src/components/chat/ChatComposer.tsx#L1926-L1928
P2 Badge Continue processing text files after reaching the image cap

When the composer already has eight images, or the current drop reaches that limit, encountering one additional image executes this break and silently skips every later file in the same drop. This now incorrectly discards otherwise supported text attachments that happen to follow the excess image, even though the reported limit applies only to images; record the image error and continue scanning the remaining files instead.

ℹ️ About Codex in GitHub

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

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

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment threadapps/web/src/components/chat/MessagesTimeline.tsx Outdated
Comment threadapps/web/src/components/chat/ChatComposer.tsx Outdated
@Reston

Copy link
Copy Markdown

I need this, plenty of times I want to give context to the chat and I had to copy the path manually in order to work, in codex cli automatically I can paste and it gives the filepath so the model can fetch it.

@jakeleventhal
jakeleventhalforce-pushed the t3code/support-markdown-chat-attachments branch from 2b01a69 to 58a0171CompareAugust 10, 2026 19:33
@github-actionsgithub-actionsBot added size:L 100-499 changed lines (additions + deletions). and removed size:M 30-99 changed lines (additions + deletions). labels Aug 10, 2026

@macroscopeappmacroscopeappBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Effect service conventions: two error-modeling issues in the new projects.writeTextAttachment path.

Posted via Macroscope — Effect Service Conventions

Comment threadapps/server/src/ws.ts Outdated
Comment threadpackages/contracts/src/project.ts Outdated
Comment threadapps/web/src/components/chat/ChatComposer.tsx Outdated
Comment threadapps/server/src/workspace/WorkspaceFileSystem.ts Outdated
Comment threadapps/web/src/components/chat/ChatComposer.tsx
Comment threadapps/server/src/workspace/WorkspaceFileSystem.ts Outdated
Comment threadapps/web/src/components/chat/ChatComposer.tsx Outdated
Comment threadapps/web/src/components/chat/ChatComposer.tsx Outdated
@jakeleventhal
jakeleventhalforce-pushed the t3code/support-markdown-chat-attachments branch from 58a0171 to 2955bbdCompareAugust 10, 2026 20:18
@github-actionsgithub-actionsBot added size:XL 500-999 changed lines (additions + deletions). and removed size:L 100-499 changed lines (additions + deletions). labels Aug 10, 2026
Comment threadapps/server/src/attachmentStore.ts Outdated
Comment threadapps/server/src/orchestration/Layers/ProjectionPipeline.ts
Comment threadpackages/shared/src/composerInlineTokens.ts Outdated
Comment threadpackages/shared/src/composerInlineTokens.ts Outdated
Comment threadpackages/shared/src/composerInlineTokens.ts Outdated
Comment threadapps/server/src/attachmentStore.ts Outdated
Comment threadapps/server/src/attachmentStore.ts
Comment threadapps/server/src/orchestration/Layers/ProjectionPipeline.ts
Comment threadapps/server/src/orchestration/Layers/ProjectionPipeline.ts

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

Reviewed by Cursor Bugbot for commit a36b386. Configure here.

Comment threadapps/server/src/orchestration/Layers/ProjectionPipeline.ts
@t3dotggt3dotgg added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. and removed vouch:unvouched PR author is not yet trusted in the VOUCHED list. labels Aug 24, 2026
@jakeleventhal

Copy link
Copy Markdown
ContributorAuthor

Synced this branch to current upstream main in 1f2cbca. The resulting tree is identical to main: the non-image attachment feature from this PR has now shipped upstream through the generic attachment upload/claim pipeline, with subsequent validation, cleanup, download, draft recovery, provider, web, and mobile hardening. All 32 review threads are resolved and there is no remaining diff, so I am closing this PR as superseded.

@github-actionsgithub-actionsBot added size:XS 0-9 changed lines (additions + deletions). and removed size:XL 500-999 changed lines (additions + deletions). labels Aug 26, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XS0-9 changed lines (additions + deletions).vouch:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@jakeleventhal@Reston@t3dotgg