fix(app): source composer cwd from agent state, not draft hook

The GitHub picker showed "No results found." for any running agent after
the first message was sent. useAgentInputDraft owned a local cwd state
that clear("sent") wiped to "", so the composer read cwd: "" even though
the agent's real cwd was correct on the wire.

Drop cwd ownership from the hook. Composer takes cwd as a prop sourced
by the parent — agentState.cwd for running agents, composerState.workingDir
for drafts, sourceDirectory for setup flows. The hook now persists only
{text, attachments}. Legacy persisted drafts with a cwd field still
hydrate; tagged COMPAT(draft-cwd) for removal after 2026-11-09.

Also moves attachment pills back inside the composer's bordered surface
via a new attachmentSlot prop on MessageInput, and shrinks pill height
from 48 to 32 — the subagents-track tuck previously had attachments
floating between it and the input.

Adds one Playwright spec asserting the draft-create-agent path submits
the workspace cwd.
This commit is contained in:
Mohamed Boudra
2026-05-09 18:32:43 +07:00
parent d241c24776
commit d1bda25a0b
14 changed files with 145 additions and 310 deletions
+9 -9
View File
@@ -948,6 +948,7 @@ function ChatAgentContent({
});
if (nonReadyView) return nonReadyView;
invariant(effectiveAgent, "effectiveAgent is defined when the non-ready view is absent");
invariant(agentState.cwd, "agent cwd is defined when agent content is ready");
return (
<View style={styles.root}>
@@ -977,7 +978,7 @@ function ChatAgentContent({
isPaneFocused={isPaneFocused}
isArchivingCurrentAgent={isArchivingCurrentAgent}
archivedAt={agentState.archivedAt}
initialCwd={agentState.cwd ?? ""}
cwd={agentState.cwd}
isSubmitLoading={showPendingCreateSubmitLoading}
onAttentionInputFocus={attentionController.clearOnInputFocus}
onAttentionPromptSend={attentionController.clearOnPromptSend}
@@ -1182,7 +1183,7 @@ function AgentComposerSection({
isPaneFocused,
isArchivingCurrentAgent,
archivedAt,
initialCwd,
cwd,
isSubmitLoading,
onAttentionInputFocus,
onAttentionPromptSend,
@@ -1195,7 +1196,7 @@ function AgentComposerSection({
isPaneFocused: boolean;
isArchivingCurrentAgent: boolean;
archivedAt: Date | null;
initialCwd: string;
cwd: string;
isSubmitLoading: boolean;
onAttentionInputFocus: () => void;
onAttentionPromptSend: () => void;
@@ -1218,7 +1219,7 @@ function AgentComposerSection({
agentId={agentId}
serverId={serverId}
isPaneFocused={isPaneFocused}
initialCwd={initialCwd}
cwd={cwd}
isSubmitLoading={isSubmitLoading}
onAttentionInputFocus={onAttentionInputFocus}
onAttentionPromptSend={onAttentionPromptSend}
@@ -1233,7 +1234,7 @@ function ActiveAgentComposer({
agentId,
serverId,
isPaneFocused,
initialCwd,
cwd,
isSubmitLoading,
onAttentionInputFocus,
onAttentionPromptSend,
@@ -1244,7 +1245,7 @@ function ActiveAgentComposer({
agentId: string;
serverId: string;
isPaneFocused: boolean;
initialCwd: string;
cwd: string;
isSubmitLoading: boolean;
onAttentionInputFocus: () => void;
onAttentionPromptSend: () => void;
@@ -1272,11 +1273,10 @@ function ActiveAgentComposer({
serverId,
agentId,
}),
initialCwd,
});
const workspaceAttachmentScopeKey = useWorkspaceAttachmentScopeKey({
serverId,
cwd: agentInputDraft.cwd,
cwd,
workspaceId,
});
const workspaceAttachments = useWorkspaceAttachments(workspaceAttachmentScopeKey);
@@ -1326,7 +1326,7 @@ function ActiveAgentComposer({
workspaceAttachments={workspaceAttachments}
onOpenWorkspaceAttachment={handleOpenWorkspaceAttachment}
onChangeAttachments={agentInputDraft.setAttachments}
cwd={agentInputDraft.cwd}
cwd={cwd}
clearDraft={agentInputDraft.clear}
autoFocus={isPaneFocused}
isSubmitLoading={isSubmitLoading}