mirror of
https://github.com/anomalyco/opencode.git
synced 2026-07-23 18:55:37 -04:00
9e0d3976e1
Co-authored-by: Frank <frank@anoma.ly> Co-authored-by: Aarav Sareen <96787824+arvsrn@users.noreply.github.com> Co-authored-by: Brendan Allan <git@brendonovich.dev> Co-authored-by: opencode-agent[bot] <opencode-agent[bot]@users.noreply.github.com> Co-authored-by: Jack <jack@anoma.ly> Co-authored-by: Brendan Allan <14191578+Brendonovich@users.noreply.github.com> Co-authored-by: Shoubhit Dash <shoubhit2005@gmail.com> Co-authored-by: opencode-agent[bot] <219766164+opencode-agent[bot]@users.noreply.github.com> Co-authored-by: James Long <longster@gmail.com> Co-authored-by: Dustin Deus <deusdustin@gmail.com> Co-authored-by: starptech <starptech@starptechs-MBP.fritz.box> Co-authored-by: Luke Parker <10430890+Hona@users.noreply.github.com> Co-authored-by: 𝓛𝓲𝓽𝓽𝓵𝓮 𝓕𝓻𝓪𝓷𝓴 <little-frank@opencord.local> Co-authored-by: Dax <mail@thdxr.com> Co-authored-by: usrnk1 <7547651+usrnk1@users.noreply.github.com> Co-authored-by: Jay <53023+jayair@users.noreply.github.com> Co-authored-by: runvip <164729189+runvip@users.noreply.github.com> Co-authored-by: opencode <opencode@sst.dev> Co-authored-by: Julian Coy <julian@ex-machina.co> Co-authored-by: Vladimir Glafirov <vglafirov@gitlab.com> Co-authored-by: Adam <2363879+adamdotdevin@users.noreply.github.com> Co-authored-by: Kit Langton <kit.langton@gmail.com> Co-authored-by: Simon Klee <hello@simonklee.dk> Co-authored-by: Jay <air@live.ca> Co-authored-by: David Hill <1879069+iamdavidhill@users.noreply.github.com>
107 lines
3.6 KiB
TypeScript
107 lines
3.6 KiB
TypeScript
import { expect, test } from "@playwright/test"
|
|
import {
|
|
defineVisualRegions,
|
|
reportVisualStability,
|
|
startVisualProbe,
|
|
stopVisualProbe,
|
|
visualPlan,
|
|
} from "../../utils/visual-stability"
|
|
import {
|
|
assistantMessage,
|
|
partUpdated,
|
|
session,
|
|
sessionID,
|
|
setupTimeline,
|
|
textPart,
|
|
toolPart,
|
|
userMessage,
|
|
} from "./fixture"
|
|
|
|
test("adds a task child-session link without replacing the task row", async ({ page }, testInfo) => {
|
|
const taskID = "prt_task_link"
|
|
const childID = "ses_task_child"
|
|
const input = { description: "Inspect child", subagent_type: "explore" }
|
|
const timeline = await setupTimeline(page, {
|
|
messages: [userMessage(), assistantMessage([toolPart(taskID, "task", "running", input)], { completed: false })],
|
|
sessions: [session(), session({ id: childID, parentID: sessionID, title: "Inspect child" })],
|
|
cpuRate: 4,
|
|
})
|
|
const regions = defineVisualRegions({
|
|
task: { selector: `[data-timeline-part-id="${taskID}"] [data-slot="collapsible-trigger"]` },
|
|
})
|
|
await startVisualProbe(page, regions)
|
|
await timeline.send(
|
|
partUpdated(toolPart(taskID, "task", "completed", input, { metadata: { sessionId: childID } })),
|
|
500,
|
|
)
|
|
const trace = await stopVisualProbe<keyof typeof regions>(page)
|
|
await reportVisualStability(
|
|
testInfo,
|
|
"task-link",
|
|
trace,
|
|
visualPlan(regions, [
|
|
{ type: "required", regions: ["task"] },
|
|
{ type: "unique", regions: ["task"] },
|
|
{ type: "stable", regions: ["task"] },
|
|
{ type: "opacity", regions: "all" },
|
|
{ type: "continuity", regions: "all" },
|
|
{ type: "motion", regions: "all", maxPositionReversals: 0 },
|
|
{ type: "label-stability", regions: "all" },
|
|
]),
|
|
)
|
|
await expect(
|
|
page.locator(`a[href$="/session/${childID}"]`, { has: page.locator('[data-component="task-tool-card"]') }),
|
|
).toBeVisible()
|
|
})
|
|
|
|
test("changes generic tool arguments without replacing the row", async ({ page }, testInfo) => {
|
|
const toolID = "prt_generic_mutation"
|
|
const followingID = "prt_generic_mutation_following"
|
|
const timeline = await setupTimeline(page, {
|
|
messages: [
|
|
userMessage(),
|
|
assistantMessage(
|
|
[
|
|
toolPart(toolID, "mcp_probe", "running", { target: "one", count: 1 }),
|
|
textPart(followingID, "Following generic tool"),
|
|
],
|
|
{ completed: false },
|
|
),
|
|
],
|
|
cpuRate: 4,
|
|
})
|
|
const regions = defineVisualRegions({
|
|
tool: { selector: `[data-timeline-part-id="${toolID}"]`, closest: '[data-timeline-row="AssistantPart"]' },
|
|
following: { selector: `[data-timeline-part-id="${followingID}"]`, closest: '[data-timeline-row="AssistantPart"]' },
|
|
})
|
|
await startVisualProbe(page, regions)
|
|
await timeline.send(
|
|
partUpdated(toolPart(toolID, "mcp_probe", "running", { target: "two", count: 2, mode: "deep" })),
|
|
200,
|
|
)
|
|
await timeline.send(
|
|
partUpdated(toolPart(toolID, "mcp_probe", "completed", { target: "two", count: 2, mode: "deep" })),
|
|
400,
|
|
)
|
|
const trace = await stopVisualProbe<keyof typeof regions>(page)
|
|
await reportVisualStability(
|
|
testInfo,
|
|
"generic-mutation",
|
|
trace,
|
|
visualPlan(
|
|
regions,
|
|
[
|
|
{ type: "required", regions: ["tool", "following"] },
|
|
{ type: "unique", regions: ["tool", "following"] },
|
|
{ type: "stable", regions: ["tool", "following"] },
|
|
{ type: "opacity", regions: "all" },
|
|
{ type: "continuity", regions: "all" },
|
|
{ type: "motion", regions: "all", maxPositionReversals: 0 },
|
|
{ type: "label-stability", regions: "all" },
|
|
{ type: "flow", regions: ["tool", "following"] },
|
|
],
|
|
{ perMarker: true },
|
|
),
|
|
)
|
|
})
|