fix: resume workflow on revision requests

This commit is contained in:
lda
2026-07-11 23:04:47 +07:00 Verified
parent 31fb170dba
commit d99447ebd7
30 changed files with 411 additions and 187 deletions
@@ -60,7 +60,7 @@ describe("AssistantOperatorThread", () => {
it("renders schema approval through the existing approval surface", async () => {
const user = userEvent.setup();
const submit = vi.fn();
const cancel = vi.fn();
const requestRevision = vi.fn();
const messages: ReadonlyArray<AgentMessage> = [
{
id: "approval",
@@ -88,15 +88,15 @@ describe("AssistantOperatorThread", () => {
mode="dock"
messages={messages}
submitApproval={submit}
cancelApproval={cancel}
requestRevision={requestRevision}
/>,
);
expect(screen.getByRole("group", { name: /issue review resume/i })).toBeInTheDocument();
await user.click(screen.getByRole("button", { name: "Submit" }));
await user.click(screen.getByRole("button", { name: "Cancel" }));
await user.click(screen.getByRole("button", { name: "Request revision" }));
expect(submit).toHaveBeenCalledOnce();
expect(cancel).toHaveBeenCalledOnce();
expect(requestRevision).toHaveBeenCalledOnce();
});
it("renders a chat-owned run action", async () => {
@@ -25,7 +25,7 @@ type AssistantOperatorThreadProps = {
readonly messages: ReadonlyArray<AgentMessage>;
readonly runAction?: { readonly label: string; readonly disabled: boolean; readonly run: () => void } | undefined;
readonly submitApproval?: (() => void) | undefined;
readonly cancelApproval?: (() => void) | undefined;
readonly requestRevision?: (() => void) | undefined;
readonly ariaLabel?: string | undefined;
readonly surface?: "stage" | "dock" | undefined;
readonly activeToolGroupId?: string | undefined;
@@ -87,7 +87,7 @@ const resultForToolPart = (part: ToolRenderPart): unknown =>
const renderContentPart = (
part: AssistantContentPart,
submitApproval?: (() => void) | undefined,
cancelApproval?: (() => void) | undefined,
requestRevision?: (() => void) | undefined,
defaultOpen?: boolean,
pairedResult?: Extract<ToolRenderPart, { readonly type: "tool-result" }>,
): ReactNode => {
@@ -116,7 +116,7 @@ const renderContentPart = (
outcomes={contract.outcomes}
runId={contract.runId}
onSubmit={submitApproval}
onCancel={cancelApproval}
onRequestRevision={requestRevision}
/>
</div>
</ToolFallbackContent>
@@ -141,14 +141,14 @@ const AssistantMessageBody = ({
openToolGroups,
setToolGroupOpen,
submitApproval,
cancelApproval,
requestRevision,
}: {
readonly messageId: string;
readonly parts: readonly AssistantContentPart[];
readonly openToolGroups: ReadonlySet<string>;
readonly setToolGroupOpen: (groupId: string, open: boolean) => void;
readonly submitApproval?: (() => void) | undefined;
readonly cancelApproval?: (() => void) | undefined;
readonly requestRevision?: (() => void) | undefined;
}) => {
const rendered: ReactNode[] = [];
let index = 0;
@@ -176,7 +176,7 @@ const AssistantMessageBody = ({
if (logicalTools.length === 1 && !messageId.startsWith("authoring-")) {
rendered.push(
<div key={`tool-${logicalTools[0]!.toolCallId ?? logicalTools[0]!.toolName}`}>
{renderContentPart(logicalTools[0]!, submitApproval, cancelApproval)}
{renderContentPart(logicalTools[0]!, submitApproval, requestRevision)}
</div>,
);
continue;
@@ -209,7 +209,7 @@ const AssistantMessageBody = ({
: undefined;
return (
<div key={`${tool.type}-${tool.toolName}-${tool.toolCallId ?? "no-id"}`}>
{renderContentPart(tool, submitApproval, cancelApproval, false, pairedResult)}
{renderContentPart(tool, submitApproval, requestRevision, false, pairedResult)}
</div>
);
})}
@@ -246,7 +246,7 @@ export const AssistantOperatorThread = ({
messages,
runAction,
submitApproval,
cancelApproval,
requestRevision,
ariaLabel = "operator conversation",
surface,
activeToolGroupId,
@@ -324,7 +324,7 @@ export const AssistantOperatorThread = ({
openToolGroups={openToolGroups}
setToolGroupOpen={setToolGroupOpen}
submitApproval={submitApproval}
cancelApproval={cancelApproval}
requestRevision={requestRevision}
/>
</MessageBubble>
);