feat: add workspace files to chat from Files and Changes

* feat(app): open changed files from context menu

* fix(app): preserve changed-file row behavior

* feat(app): add changed files to open chats

* feat(app): share file actions across explorer and changes

* feat(app): attach workspace files to focused chat

* feat(app): drag workspace files into chat

* refactor(app): use file actions menu for changed files

* fix(app): open changed-file actions on right click

* test(app): cover direct file attachment flow

* fix(app): enable add to chat on native

* fix(app): align workspace file pane rows

* refactor(app): simplify workspace file attachments

* fix(app): preserve uploaded file draft attachments

---------

Co-authored-by: Mohamed Boudra <boudra.moha@gmail.com>
This commit is contained in:
nikuscs
2026-07-22 15:58:24 +02:00
committed by GitHub
co-authored by Mohamed Boudra
parent 42ee5a5949
commit bd937850b3
42 changed files with 1665 additions and 342 deletions
+23 -3
View File
@@ -1160,8 +1160,16 @@ const ChatAgentReadyContent = memo(function ChatAgentReadyContent({
});
// Stabilize the agentInputDraft object identity so that memo(AgentComposerSection) can bail out
// when only toast state changes (which does not affect any draft field).
const { text, setText, attachments, setAttachments, clear, isHydrated, composerState } =
rawAgentInputDraft;
const {
text,
setText,
attachments,
setAttachments,
clear,
isHydrated,
attachmentFocusRequestId,
composerState,
} = rawAgentInputDraft;
const agentInputDraft = useMemo(
(): AgentInputDraft => ({
text,
@@ -1170,9 +1178,19 @@ const ChatAgentReadyContent = memo(function ChatAgentReadyContent({
setAttachments,
clear,
isHydrated,
attachmentFocusRequestId,
composerState,
}),
[text, setText, attachments, setAttachments, clear, isHydrated, composerState],
[
text,
setText,
attachments,
setAttachments,
clear,
isHydrated,
attachmentFocusRequestId,
composerState,
],
);
const streamSection = (
<RenderProfile id={`AgentStreamSection:${agentId}`}>
@@ -1537,6 +1555,7 @@ function ActiveAgentComposer({
<Composer
agentId={agentId}
serverId={serverId}
workspaceId={workspaceId}
externalKeyboardShift
isPaneFocused={isPaneFocused}
value={agentInputDraft.text}
@@ -1548,6 +1567,7 @@ function ActiveAgentComposer({
cwd={cwd}
clearDraft={agentInputDraft.clear}
autoFocus={isPaneFocused}
autoFocusKey={String(agentInputDraft.attachmentFocusRequestId)}
isSubmitLoading={isSubmitLoading}
onAttentionInputFocus={onAttentionInputFocus}
onAttentionPromptSend={onAttentionPromptSend}