Ctrl K
ComunidadGuías…

packages/app/perf/docks.bench.ts

Rama dev · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
// The composer giving way to request docks and back, under a 20-turn session: a permission request morphs the
// composer into its dock, an MCP elicitation grows in above it and closes, and the answered permission morphs back
// to the composer. Every frame of the four flights steps the docks' springs and writes their styles.
import { bench, web } from "@hona/strobe"
import type { OpenCodeEvent } from "@opencode/client/promise"
import { cached } from "./fixtures/mock"
import { composer, mockTimelineSession, timeline } from "./fixtures/timeline"

// The session `mockTimelineSession` serves.
const sessionID = "ses_timeline_state_regression"

const location = { directory: "C:/OpenCode/TimelineStateRegression" }

const permission = '[data-component="dock-prompt"][data-kind="permission"]'

// The elicitation dock shares the question dock's frame.
const elicitation = '[data-component="dock-prompt"][data-kind="question"]'

let round = 0

export default bench({
  targets: {
    web: web({
      expect: { title: "OpenCode" },
      viewport: { width: 1366, height: 768 },
      prepare: (ctx) =>
        mockTimelineSession(cached(ctx), {
          server: new URL(ctx.url).origin,
          historyTurns: 20,
          stream: true,
        }),
      url: ({ prepared }) => prepared.path,
    }),
  },

  async setup({ page }) {
    await page.waitFor(timeline, { timeout: 60_000 })
    await page.waitFor(composer)
    await page.idle()
  },

  teardown: ({ prepared }) => prepared.source?.stop(),

  cases: {
    // Each step waits for the page to settle, so the run spans every frame of all four flights.
    "open and close request docks": {
      primary: "main.work",
      metrics: ["main.script", "main.style", "main.layout", "frames.dropped.pct", "frames.interval.p95"],
      async run({ page, prepared }) {
        const events = requestDocks()
        prepared.source!.send([events.asked])
        await page.waitFor(permission)
        await page.idle()
        prepared.source!.send([events.elicited])
        await page.waitFor(elicitation)
        await page.idle()
        prepared.source!.send([events.cancelled])
        await page.idle()
        prepared.source!.send([events.replied])
        await page.waitFor(composer)
        await page.idle()
      },
    },
  },
})

// One round of request docks, with fresh IDs so the client never takes an event for a repeat.
function requestDocks() {
  round++
  const permission = `per_docks_bench_${round}`
  const form = `frm_docks_bench_${round}`

  const envelope = (step: number) => ({
    id: `evt_docks_bench_${round}_${step}`,
    created: 1700000003000 + round,
    location,
  })

  return {
    asked: {
      ...envelope(0),
      type: "permission.asked",
      data: { id: permission, sessionID, action: "shell", resources: ["bun test"], metadata: {} },
    } satisfies Extract<OpenCodeEvent, { type: "permission.asked" }>,
    elicited: {
      ...envelope(1),
      type: "form.created",
      data: {
        form: {
          id: form,
          sessionID,
          title: "Input",
          metadata: { kind: "mcp-elicitation" },
          fields: [{ key: "answer", type: "string", title: "Continue?" }],
        },
      },
    } satisfies Extract<OpenCodeEvent, { type: "form.created" }>,
    cancelled: {
      ...envelope(2),
      type: "form.cancelled",
      data: { sessionID, id: form },
    } satisfies Extract<OpenCodeEvent, { type: "form.cancelled" }>,
    replied: {
      ...envelope(3),
      type: "permission.replied",
      data: { sessionID, requestID: permission, reply: "once" },
    } satisfies Extract<OpenCodeEvent, { type: "permission.replied" }>,
  }
}