mirror of
https://github.com/getpaseo/paseo.git
synced 2026-07-29 12:01:31 +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
71 lines
2.2 KiB
TypeScript
71 lines
2.2 KiB
TypeScript
import type { Page } from "@playwright/test";
|
|
import { seedWorkspace, type SeedDaemonClient } from "./seed-client";
|
|
import { getServerId } from "./server-id";
|
|
import { buildHostAgentDetailRoute } from "../../src/utils/host-routes";
|
|
|
|
export interface MockAgentWorkspace {
|
|
agentId: string;
|
|
workspaceId: string;
|
|
cwd: string;
|
|
client: SeedDaemonClient;
|
|
cleanup(): Promise<void>;
|
|
}
|
|
|
|
export interface MockAgentOptions {
|
|
repoPrefix: string;
|
|
title: string;
|
|
initialPrompt?: string;
|
|
model?: string;
|
|
modeId?: string;
|
|
featureValues?: Record<string, unknown>;
|
|
}
|
|
|
|
/**
|
|
* Seeds a temp git repo, opens it as a project, and creates a ready mock-provider
|
|
* agent in it via the daemon. Returns the agent id plus a cleanup that closes the
|
|
* client and removes the repo. Pair with {@link openAgentRoute} to drive the UI.
|
|
*/
|
|
export async function seedMockAgentWorkspace(
|
|
options: MockAgentOptions,
|
|
): Promise<MockAgentWorkspace> {
|
|
const workspace = await seedWorkspace({ repoPrefix: options.repoPrefix });
|
|
try {
|
|
const agent = await workspace.client.createAgent({
|
|
provider: "mock",
|
|
cwd: workspace.repoPath,
|
|
workspaceId: workspace.workspaceId,
|
|
title: options.title,
|
|
modeId: options.modeId ?? "load-test",
|
|
model: options.model ?? "ten-second-stream",
|
|
initialPrompt: options.initialPrompt,
|
|
featureValues: options.featureValues,
|
|
});
|
|
return {
|
|
agentId: agent.id,
|
|
workspaceId: workspace.workspaceId,
|
|
cwd: workspace.repoPath,
|
|
client: workspace.client,
|
|
cleanup: workspace.cleanup,
|
|
};
|
|
} catch (error) {
|
|
await workspace.cleanup();
|
|
throw error;
|
|
}
|
|
}
|
|
|
|
export function buildAgentRoute(workspaceId: string, agentId: string): string {
|
|
return buildHostAgentDetailRoute(getServerId(), agentId, workspaceId);
|
|
}
|
|
|
|
/** Boots the app directly at the agent's workspace route and waits for the open intent to settle. */
|
|
export async function openAgentRoute(
|
|
page: Page,
|
|
input: { workspaceId: string; agentId: string },
|
|
): Promise<void> {
|
|
await page.goto(buildAgentRoute(input.workspaceId, input.agentId));
|
|
await page.waitForURL(
|
|
(url) => url.pathname.includes("/workspace/") && !url.searchParams.has("open"),
|
|
{ timeout: 60_000 },
|
|
);
|
|
}
|