mirror of
https://github.com/getpaseo/paseo.git
synced 2026-08-15 04:42:45 +00:00
Fork assistant turns into new drafts (#1788)
* feat(chat): fork assistant turns into new drafts Builds chat-history attachments on the daemon and routes them into draft composers so users can continue an assistant turn in an existing workspace tab or New Workspace. * fix(chat): clean up fork draft handling * fix(chat): address fork draft review feedback * fix(server): build fork context from bounded timeline * fix(app): restore assistant turn footer in streams * fix(app): preserve fork draft setup * fix(app): tighten assistant fork footers * fix(app): lock active fork draft handoff * fix(app): preserve attachment-only draft retries * fix(app): unify composer attachment scopes * fix(app): align chat history attachment labels * fix(app): centralize attachment pill content * fix(app): trim fork context for workspace naming
This commit is contained in:
72
packages/app/src/composer/attachments/workspace.test.ts
Normal file
72
packages/app/src/composer/attachments/workspace.test.ts
Normal file
@@ -0,0 +1,72 @@
|
||||
import { describe, expect, it } from "vitest";
|
||||
import type { WorkspaceComposerAttachment } from "@/attachments/types";
|
||||
import {
|
||||
buildDraftWorkspaceAttachmentScopeKey,
|
||||
resetWorkspaceAttachmentsStore,
|
||||
useWorkspaceAttachmentsStore,
|
||||
} from "@/attachments/workspace-attachments-store";
|
||||
import { removeSentContextAttachments } from "./workspace-cleanup";
|
||||
|
||||
function chatHistoryAttachment(): WorkspaceComposerAttachment {
|
||||
return {
|
||||
kind: "chat_history",
|
||||
id: "chat_history:draft-1",
|
||||
attachment: {
|
||||
type: "text",
|
||||
mimeType: "text/plain",
|
||||
contextKind: "chat_history",
|
||||
title: "Chat history",
|
||||
text: "Previous chat.",
|
||||
},
|
||||
source: {
|
||||
serverId: "local",
|
||||
agentId: "agent-1",
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
function pullRequestContextAttachment(): WorkspaceComposerAttachment {
|
||||
return {
|
||||
kind: "github.pull_request_comment",
|
||||
id: "comment-1",
|
||||
title: "Comment",
|
||||
text: "Please check this.",
|
||||
};
|
||||
}
|
||||
|
||||
function browserElementAttachment(): WorkspaceComposerAttachment {
|
||||
return {
|
||||
kind: "browser_element",
|
||||
attachment: {
|
||||
url: "https://example.com",
|
||||
selector: "button.primary",
|
||||
tag: "button",
|
||||
text: "Click me",
|
||||
outerHTML: '<button class="primary">Click me</button>',
|
||||
computedStyles: {},
|
||||
boundingRect: { x: 0, y: 0, width: 100, height: 40 },
|
||||
reactSource: null,
|
||||
parentChain: [],
|
||||
children: [],
|
||||
formatted: "button.primary\nClick me",
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
describe("workspace composer attachment cleanup", () => {
|
||||
it("clears sent scoped context attachments from their stores", () => {
|
||||
resetWorkspaceAttachmentsStore();
|
||||
const scopeKey = buildDraftWorkspaceAttachmentScopeKey("draft-1");
|
||||
const chatHistory = chatHistoryAttachment();
|
||||
const pullRequestContext = pullRequestContextAttachment();
|
||||
const browserElement = browserElementAttachment();
|
||||
useWorkspaceAttachmentsStore.getState().setWorkspaceAttachments({
|
||||
scopeKey,
|
||||
attachments: [chatHistory, pullRequestContext, browserElement],
|
||||
});
|
||||
|
||||
removeSentContextAttachments([chatHistory, pullRequestContext, browserElement]);
|
||||
|
||||
expect(useWorkspaceAttachmentsStore.getState().attachmentsByScope[scopeKey]).toBeUndefined();
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user