mirror of
https://github.com/getpaseo/paseo.git
synced 2026-08-14 20:32:46 +00:00
* 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
73 lines
2.2 KiB
TypeScript
73 lines
2.2 KiB
TypeScript
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();
|
|
});
|
|
});
|