@vibecook/ghosttea-react 0.10.1 → 0.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/README.md +50 -0
  2. package/dist/TerminalSurface.d.ts +5 -0
  3. package/dist/TerminalSurface.d.ts.map +1 -1
  4. package/dist/TerminalSurface.js +19 -4
  5. package/dist/TerminalSurface.js.map +1 -1
  6. package/dist/index.d.ts +4 -3
  7. package/dist/index.d.ts.map +1 -1
  8. package/dist/index.js +2 -1
  9. package/dist/index.js.map +1 -1
  10. package/dist/performance.d.ts +31 -0
  11. package/dist/performance.d.ts.map +1 -1
  12. package/dist/performance.js.map +1 -1
  13. package/dist/routed-activation.d.ts +110 -0
  14. package/dist/routed-activation.d.ts.map +1 -0
  15. package/dist/routed-activation.js +287 -0
  16. package/dist/routed-activation.js.map +1 -0
  17. package/dist/routed-control.d.ts +69 -0
  18. package/dist/routed-control.d.ts.map +1 -0
  19. package/dist/routed-control.js +383 -0
  20. package/dist/routed-control.js.map +1 -0
  21. package/dist/routed-frames.d.ts +69 -0
  22. package/dist/routed-frames.d.ts.map +1 -0
  23. package/dist/routed-frames.js +660 -0
  24. package/dist/routed-frames.js.map +1 -0
  25. package/dist/runtime.d.ts +73 -4
  26. package/dist/runtime.d.ts.map +1 -1
  27. package/dist/runtime.js +1034 -53
  28. package/dist/runtime.js.map +1 -1
  29. package/dist/terminal-render.worker.js +1089 -45
  30. package/dist/terminal-render.worker.js.map +3 -3
  31. package/dist/worker-messages.d.ts +18 -1
  32. package/dist/worker-messages.d.ts.map +1 -1
  33. package/dist/workspace/Workspace.d.ts +12 -1
  34. package/dist/workspace/Workspace.d.ts.map +1 -1
  35. package/dist/workspace/Workspace.js +77 -14
  36. package/dist/workspace/Workspace.js.map +1 -1
  37. package/dist/workspace/index.d.ts +1 -1
  38. package/dist/workspace/index.d.ts.map +1 -1
  39. package/dist/workspace/index.js.map +1 -1
  40. package/package.json +4 -4
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../../ghosttea-frame/src/index.ts", "../src/performance.ts", "../src/renderers/types.ts", "../src/renderers/canvas-renderer.ts", "../src/cell-width.ts", "../src/renderers/render-damage.ts", "../src/renderers/shader-effects.ts", "../src/renderers/webgpu-renderer.ts", "../src/frame-sequence.ts", "../src/cursor-invalidation.ts", "../src/catalog-budget.ts", "../src/terminal-render.worker.ts"],
4
- "sourcesContent": ["export const FRAME_MAGIC = 0x31465254;\nexport const FRAME_PROTOCOL_VERSION = 1;\nexport const FRAME_HEADER_BYTES = 64;\nexport const SECTION_HEADER_BYTES = 16;\nexport const MAX_FRAME_BYTES = 16 * 1024 * 1024;\nexport const FrameFlag = {\n FullSnapshot: 1 << 0,\n MouseTracking: 1 << 1,\n CatalogReset: 1 << 2,\n} as const;\n\nexport enum SectionKind {\n GlyphDefinitions = 1,\n StyleDefinitions = 2,\n RowReplacements = 3,\n CursorState = 4,\n SelectionSpans = 5,\n ImageDefinitions = 6,\n ImagePlacements = 7,\n ScrollbarState = 8,\n ViewportMetadata = 9,\n AccessibilityText = 10,\n ClipboardWrite = 11,\n}\n\nexport interface FrameSection {\n kind: SectionKind;\n flags: number;\n itemCount: number;\n bytes: Uint8Array;\n}\n\nexport interface TerminalFrame {\n protocolVersion: number;\n flags: number;\n sessionHandle: bigint;\n viewHandle: bigint;\n sessionEpoch: bigint;\n layoutEpoch: bigint;\n frameSequence: bigint;\n terminalRevision: bigint;\n cols: number;\n rows: number;\n sections: FrameSection[];\n}\n\nexport interface TextRow {\n row: number;\n text: string;\n}\n\nexport interface RowReplacement extends TextRow {\n revision: bigint;\n glyphs: GlyphInstance[];\n styles: StyleRun[];\n}\n\nexport enum GlyphFormat {\n Alpha8 = 0,\n Rgba8Premultiplied = 1,\n}\n\nexport interface GlyphDefinition {\n id: number;\n width: number;\n height: number;\n bearingX: number;\n bearingY: number;\n format: GlyphFormat;\n pixels: Uint8Array;\n}\n\nexport interface GlyphInstance {\n glyphId: number;\n styleId: number;\n x: number;\n y: number;\n width: number;\n height: number;\n cellStart: number;\n cellSpan: number;\n}\n\nexport interface StyleDefinition {\n id: number;\n bold: boolean;\n italic: boolean;\n faint: boolean;\n inverse: boolean;\n invisible: boolean;\n strikethrough: boolean;\n underline: boolean;\n foreground?: readonly [number, number, number];\n background?: readonly [number, number, number];\n}\n\nexport interface StyleRun {\n styleId: number;\n cellStart: number;\n cellSpan: number;\n}\n\nexport interface CursorState {\n x: number;\n y: number;\n visible: boolean;\n style: CursorStyle;\n blinking: boolean;\n}\n\nexport interface ScrollbarState {\n total: bigint;\n offset: bigint;\n length: bigint;\n}\n\nexport enum CursorStyle {\n Bar = 0,\n Block = 1,\n Underline = 2,\n HollowBlock = 3,\n}\n\nfunction assertRange(condition: boolean, message: string): asserts condition {\n if (!condition) throw new RangeError(`Invalid terminal frame: ${message}`);\n}\n\nexport function decodeFrame(buffer: ArrayBuffer): TerminalFrame {\n assertRange(buffer.byteLength >= FRAME_HEADER_BYTES, \"truncated header\");\n assertRange(buffer.byteLength <= MAX_FRAME_BYTES, \"packet exceeds limit\");\n const view = new DataView(buffer);\n assertRange(view.getUint32(0, true) === FRAME_MAGIC, \"bad magic\");\n assertRange(view.getUint16(4, true) === FRAME_PROTOCOL_VERSION, \"unsupported protocol version\");\n\n const sectionCount = view.getUint16(60, true);\n const tableEnd = FRAME_HEADER_BYTES + sectionCount * SECTION_HEADER_BYTES;\n assertRange(tableEnd <= buffer.byteLength, \"truncated section table\");\n\n const sections: FrameSection[] = [];\n for (let index = 0; index < sectionCount; index += 1) {\n const base = FRAME_HEADER_BYTES + index * SECTION_HEADER_BYTES;\n const kind = view.getUint16(base, true) as SectionKind;\n const flags = view.getUint16(base + 2, true);\n const offset = view.getUint32(base + 4, true);\n const length = view.getUint32(base + 8, true);\n const itemCount = view.getUint32(base + 12, true);\n const end = offset + length;\n assertRange(end >= offset && offset >= tableEnd && end <= buffer.byteLength, \"section out of bounds\");\n sections.push({ kind, flags, itemCount, bytes: new Uint8Array(buffer, offset, length) });\n }\n\n return {\n protocolVersion: view.getUint16(4, true),\n flags: view.getUint16(6, true),\n sessionHandle: view.getBigUint64(8, true),\n viewHandle: view.getBigUint64(16, true),\n sessionEpoch: view.getBigUint64(24, true),\n layoutEpoch: view.getBigUint64(32, true),\n frameSequence: view.getBigUint64(40, true),\n terminalRevision: view.getBigUint64(48, true),\n cols: view.getUint16(56, true),\n rows: view.getUint16(58, true),\n sections,\n };\n}\n\nexport function decodeAccessibilityRows(section: FrameSection): TextRow[] {\n const view = new DataView(section.bytes.buffer, section.bytes.byteOffset, section.bytes.byteLength);\n assertRange(section.bytes.byteLength >= 2, \"truncated text row header\");\n const count = view.getUint16(0, true);\n assertRange(count === section.itemCount, \"text row count mismatch\");\n const decoder = new TextDecoder(\"utf-8\", { fatal: true });\n const rows: TextRow[] = [];\n let offset = 2;\n for (let index = 0; index < count; index += 1) {\n assertRange(offset + 6 <= section.bytes.byteLength, \"truncated text row\");\n const row = view.getUint16(offset, true);\n const length = view.getUint32(offset + 2, true);\n offset += 6;\n assertRange(offset + length <= section.bytes.byteLength, \"text row payload out of bounds\");\n rows.push({ row, text: decoder.decode(section.bytes.subarray(offset, offset + length)) });\n offset += length;\n }\n assertRange(offset === section.bytes.byteLength, \"trailing text row bytes\");\n return rows;\n}\n\nexport function decodeRowReplacements(section: FrameSection): RowReplacement[] {\n assertRange(section.kind === SectionKind.RowReplacements, \"wrong row replacement section kind\");\n assertRange(section.bytes.byteLength >= 2, \"truncated row replacement header\");\n const view = new DataView(section.bytes.buffer, section.bytes.byteOffset, section.bytes.byteLength);\n const count = view.getUint16(0, true);\n assertRange(count === section.itemCount, \"row replacement count mismatch\");\n const decoder = new TextDecoder(\"utf-8\", { fatal: true });\n const rows: RowReplacement[] = [];\n let offset = 2;\n for (let index = 0; index < count; index += 1) {\n assertRange(offset + 18 <= section.bytes.byteLength, \"truncated row replacement\");\n const row = view.getUint16(offset, true);\n const revision = view.getBigUint64(offset + 2, true);\n const length = view.getUint32(offset + 10, true);\n const glyphCount = view.getUint16(offset + 14, true);\n const styleCount = view.getUint16(offset + 16, true);\n offset += 18;\n assertRange(offset + length <= section.bytes.byteLength, \"row replacement payload out of bounds\");\n const text = decoder.decode(section.bytes.subarray(offset, offset + length));\n offset += length;\n const glyphs: GlyphInstance[] = [];\n for (let glyphIndex = 0; glyphIndex < glyphCount; glyphIndex += 1) {\n assertRange(offset + 28 <= section.bytes.byteLength, \"truncated glyph instance\");\n glyphs.push({\n glyphId: view.getUint32(offset, true),\n styleId: view.getUint32(offset + 4, true),\n x: view.getFloat32(offset + 8, true),\n y: view.getFloat32(offset + 12, true),\n width: view.getFloat32(offset + 16, true),\n height: view.getFloat32(offset + 20, true),\n cellStart: view.getUint16(offset + 24, true),\n cellSpan: view.getUint16(offset + 26, true),\n });\n offset += 28;\n }\n const styles: StyleRun[] = [];\n for (let styleIndex = 0; styleIndex < styleCount; styleIndex += 1) {\n assertRange(offset + 8 <= section.bytes.byteLength, \"truncated row style run\");\n styles.push({\n styleId: view.getUint32(offset, true),\n cellStart: view.getUint16(offset + 4, true),\n cellSpan: view.getUint16(offset + 6, true),\n });\n offset += 8;\n }\n rows.push({ row, revision, text, glyphs, styles });\n }\n assertRange(offset === section.bytes.byteLength, \"trailing row replacement bytes\");\n return rows;\n}\n\nexport function decodeGlyphDefinitions(section: FrameSection): GlyphDefinition[] {\n assertRange(section.kind === SectionKind.GlyphDefinitions, \"wrong glyph definition section kind\");\n assertRange(section.bytes.byteLength >= 4, \"truncated glyph definition header\");\n const view = new DataView(section.bytes.buffer, section.bytes.byteOffset, section.bytes.byteLength);\n const count = view.getUint32(0, true);\n assertRange(count === section.itemCount, \"glyph definition count mismatch\");\n const definitions: GlyphDefinition[] = [];\n let offset = 4;\n for (let index = 0; index < count; index += 1) {\n assertRange(offset + 20 <= section.bytes.byteLength, \"truncated glyph definition\");\n const format = view.getUint8(offset + 12) as GlyphFormat;\n assertRange(format === GlyphFormat.Alpha8 || format === GlyphFormat.Rgba8Premultiplied, \"invalid glyph format\");\n assertRange(\n view.getUint8(offset + 13) === 0 && view.getUint16(offset + 14, true) === 0,\n \"nonzero glyph reserved bytes\",\n );\n const pixelLength = view.getUint32(offset + 16, true);\n const width = view.getUint16(offset + 4, true);\n const height = view.getUint16(offset + 6, true);\n const expectedLength = width * height * (format === GlyphFormat.Alpha8 ? 1 : 4);\n assertRange(pixelLength === expectedLength, \"glyph pixel length mismatch\");\n offset += 20;\n assertRange(offset + pixelLength <= section.bytes.byteLength, \"glyph pixels out of bounds\");\n definitions.push({\n id: view.getUint32(offset - 20, true),\n width,\n height,\n bearingX: view.getInt16(offset - 12, true),\n bearingY: view.getInt16(offset - 10, true),\n format,\n pixels: section.bytes.slice(offset, offset + pixelLength),\n });\n offset += pixelLength;\n }\n assertRange(offset === section.bytes.byteLength, \"trailing glyph definition bytes\");\n return definitions;\n}\n\nexport function decodeStyleDefinitions(section: FrameSection): StyleDefinition[] {\n assertRange(section.kind === SectionKind.StyleDefinitions, \"wrong style definition section kind\");\n assertRange(section.bytes.byteLength >= 4, \"truncated style definition header\");\n const view = new DataView(section.bytes.buffer, section.bytes.byteOffset, section.bytes.byteLength);\n const count = view.getUint32(0, true);\n assertRange(count === section.itemCount, \"style definition count mismatch\");\n assertRange(section.bytes.byteLength === 4 + count * 16, \"invalid style definition length\");\n const styles: StyleDefinition[] = [];\n for (let index = 0; index < count; index += 1) {\n const offset = 4 + index * 16;\n const flags = view.getUint16(offset + 4, true);\n const foregroundKind = view.getUint8(offset + 6);\n const backgroundKind = view.getUint8(offset + 7);\n assertRange((flags & ~0x7f) === 0, \"invalid style flags\");\n assertRange(foregroundKind <= 1 && backgroundKind <= 1, \"invalid style color kind\");\n assertRange(view.getUint16(offset + 14, true) === 0, \"nonzero style reserved bytes\");\n styles.push({\n id: view.getUint32(offset, true),\n bold: (flags & 1) !== 0,\n italic: (flags & 2) !== 0,\n faint: (flags & 4) !== 0,\n inverse: (flags & 8) !== 0,\n invisible: (flags & 16) !== 0,\n strikethrough: (flags & 32) !== 0,\n underline: (flags & 64) !== 0,\n ...(foregroundKind === 1\n ? { foreground: [view.getUint8(offset + 8), view.getUint8(offset + 9), view.getUint8(offset + 10)] as const }\n : {}),\n ...(backgroundKind === 1\n ? { background: [view.getUint8(offset + 11), view.getUint8(offset + 12), view.getUint8(offset + 13)] as const }\n : {}),\n });\n }\n return styles;\n}\n\nexport function decodeCursorState(section: FrameSection): CursorState {\n assertRange(section.kind === SectionKind.CursorState, \"wrong cursor section kind\");\n assertRange(section.itemCount === 1, \"cursor item count mismatch\");\n assertRange(section.bytes.byteLength === 8, \"invalid cursor payload length\");\n const view = new DataView(section.bytes.buffer, section.bytes.byteOffset, section.bytes.byteLength);\n const visible = view.getUint8(4);\n const style = view.getUint8(5) as CursorStyle;\n const blinking = view.getUint8(6);\n assertRange(visible <= 1, \"invalid cursor visibility\");\n assertRange(style <= CursorStyle.HollowBlock, \"invalid cursor style\");\n assertRange(blinking <= 1, \"invalid cursor blinking state\");\n assertRange(view.getUint8(7) === 0, \"nonzero cursor reserved byte\");\n return {\n x: view.getUint16(0, true),\n y: view.getUint16(2, true),\n visible: visible === 1,\n style,\n blinking: blinking === 1,\n };\n}\n\nexport function decodeScrollbarState(section: FrameSection): ScrollbarState {\n assertRange(section.kind === SectionKind.ScrollbarState, \"wrong scrollbar section kind\");\n assertRange(section.itemCount === 1, \"scrollbar item count mismatch\");\n assertRange(section.bytes.byteLength === 24, \"invalid scrollbar payload size\");\n const view = new DataView(section.bytes.buffer, section.bytes.byteOffset, section.bytes.byteLength);\n const total = view.getBigUint64(0, true);\n const offset = view.getBigUint64(8, true);\n const length = view.getBigUint64(16, true);\n assertRange(length <= total, \"scrollbar viewport exceeds total rows\");\n assertRange(offset <= total - length, \"scrollbar offset exceeds scrollable range\");\n return { total, offset, length };\n}\n\nexport function decodeClipboardWrite(section: FrameSection): string {\n assertRange(section.kind === SectionKind.ClipboardWrite, \"wrong clipboard section kind\");\n assertRange(section.itemCount === 1, \"clipboard item count mismatch\");\n assertRange(section.bytes.byteLength >= 4, \"truncated clipboard payload\");\n const view = new DataView(section.bytes.buffer, section.bytes.byteOffset, section.bytes.byteLength);\n const length = view.getUint32(0, true);\n assertRange(length === section.bytes.byteLength - 4, \"clipboard length mismatch\");\n return new TextDecoder(\"utf-8\", { fatal: true }).decode(section.bytes.subarray(4));\n}\n", "export interface TerminalRenderMetrics {\n queueSubmits: number;\n fullRenders: number;\n partialRenders: number;\n damagedRows: number;\n geometryCacheHits: number;\n geometryCacheMisses: number;\n canvasPixels: number;\n renderPasses: number;\n drawCalls: number;\n rectangleVertices: number;\n monoGlyphVertices: number;\n colorGlyphVertices: number;\n fallbackGlyphVertices: number;\n vertexUploadBytes: number;\n atlasUploadBytes: number;\n atlasUploadCalls: number;\n}\n\nexport interface TerminalRenderPerformanceSnapshot {\n backend: string;\n durationMs: number;\n timedOutWaitingForIdle: boolean;\n gpuQueueDrainMs: number | null;\n frames: {\n received: number;\n bytes: number;\n full: number;\n incremental: number;\n stale: number;\n resyncRequested: number;\n rowsDecoded: number;\n glyphDefinitions: number;\n };\n scheduling: {\n flushes: number;\n renderCalls: number;\n maximumDirtyPanes: number;\n panesPerFlush: number[];\n };\n renderer: {\n queueSubmits: number;\n fullRenders: number;\n partialRenders: number;\n damagedRows: number;\n geometryCacheHits: number;\n geometryCacheMisses: number;\n canvasPixelFrames: number;\n renderPasses: number;\n drawCalls: number;\n rectangleVertices: number;\n monoGlyphVertices: number;\n colorGlyphVertices: number;\n fallbackGlyphVertices: number;\n vertexUploadBytes: number;\n atlasUploadBytes: number;\n atlasUploadCalls: number;\n };\n samples: {\n frameApplyMs: number[];\n renderCpuMs: number[];\n dirtyToRenderMs: number[];\n frameArrivalToRenderMs: number[];\n };\n}\n\nexport function emptyRenderMetrics(): TerminalRenderMetrics {\n return {\n queueSubmits: 0,\n fullRenders: 0,\n partialRenders: 0,\n damagedRows: 0,\n geometryCacheHits: 0,\n geometryCacheMisses: 0,\n canvasPixels: 0,\n renderPasses: 0,\n drawCalls: 0,\n rectangleVertices: 0,\n monoGlyphVertices: 0,\n colorGlyphVertices: 0,\n fallbackGlyphVertices: 0,\n vertexUploadBytes: 0,\n atlasUploadBytes: 0,\n atlasUploadCalls: 0,\n };\n}\n", "import {\n CursorStyle,\n type CursorState,\n type GlyphDefinition,\n type GlyphInstance,\n type StyleDefinition,\n type StyleRun,\n} from \"@vibecook/ghosttea-frame\";\nimport type { TerminalRenderMetrics } from \"../performance.js\";\n\nexport type Rgba = readonly [number, number, number, number];\n\nexport interface TerminalTheme {\n background: Rgba;\n foreground: Rgba;\n cursor: Rgba;\n cursorText?: Rgba;\n selection: Rgba;\n selectionForeground: Rgba;\n /** Apply the window background alpha to explicit cell backgrounds too. */\n backgroundOpacityCells?: boolean;\n}\n\nexport type TerminalPostProcess = \"none\" | \"better-crt\";\nexport type TerminalShaderEffect =\n \"ghosttea:better-crt\" | \"ghosttea:crt\" | \"ghosttea:vhs\" | \"ghosttea:sparks-from-fire\";\n\nexport interface TerminalEffects {\n postProcess: TerminalPostProcess;\n shaderEffects?: readonly TerminalShaderEffect[];\n animate?: boolean;\n}\n\nconst ANIMATED_SHADER_EFFECTS: ReadonlySet<TerminalShaderEffect> = new Set([\n \"ghosttea:vhs\",\n \"ghosttea:sparks-from-fire\",\n]);\n\nexport function terminalEffectsNeedAnimation(effects: TerminalEffects): boolean {\n return (\n effects.animate === true && (effects.shaderEffects?.some((effect) => ANIMATED_SHADER_EFFECTS.has(effect)) ?? false)\n );\n}\n\nexport interface CellPoint {\n column: number;\n row: number;\n}\n\nexport interface CellSelection {\n anchor: CellPoint;\n focus: CellPoint;\n}\n\nexport interface RenderView {\n rows: string[];\n nativeRows: GlyphInstance[][];\n nativeStyleRows: StyleRun[][];\n rowRevisions: readonly bigint[];\n glyphDefinitions: Map<number, GlyphDefinition>;\n styleDefinitions: Map<number, StyleDefinition>;\n sessionEpoch: bigint;\n layoutEpoch: bigint;\n cursor: CursorState;\n focused: boolean;\n cursorBlinkVisible: boolean;\n selection: CellSelection | null;\n theme: TerminalTheme;\n effects?: TerminalEffects;\n damage?: RenderDamage;\n}\n\nexport interface RenderDamage {\n full: boolean;\n rows: ReadonlySet<number>;\n geometryChanged: boolean;\n}\n\nexport function effectiveCursorStyle(view: RenderView): CursorStyle | null {\n if (!view.cursor.visible) return null;\n if (!view.focused) return CursorStyle.HollowBlock;\n if (view.cursor.blinking && !view.cursorBlinkVisible) return null;\n return view.cursor.style;\n}\n\nexport interface PixelSize {\n width: number;\n height: number;\n dpr: number;\n}\n\nfunction physicalPixels(value: number, dpr: number): number {\n return Math.max(1, Math.round(value * dpr));\n}\n\nexport function renderedSizeChanged(current: PixelSize, next: PixelSize): boolean {\n return (\n current.dpr !== next.dpr ||\n physicalPixels(current.width, current.dpr) !== physicalPixels(next.width, next.dpr) ||\n physicalPixels(current.height, current.dpr) !== physicalPixels(next.height, next.dpr)\n );\n}\n\nexport interface TerminalRenderer {\n readonly kind: \"webgpu\" | \"canvas2d\";\n mount(id: string, canvas: OffscreenCanvas): void;\n unmount(id: string): void;\n resize(id: string, size: PixelSize): void;\n render(id: string, view: RenderView): TerminalRenderMetrics | undefined;\n renderBatch?(entries: ReadonlyArray<{ id: string; view: RenderView }>): Array<TerminalRenderMetrics | undefined>;\n setPerformanceMeasurementEnabled?(enabled: boolean): void;\n settle?(): Promise<void>;\n}\n\nexport const DEFAULT_THEME: TerminalTheme = {\n background: [40 / 255, 44 / 255, 52 / 255, 1],\n foreground: [1, 1, 1, 1],\n cursor: [1, 1, 1, 1],\n cursorText: [40 / 255, 44 / 255, 52 / 255, 1],\n selection: [1, 1, 1, 1],\n selectionForeground: [40 / 255, 44 / 255, 52 / 255, 1],\n backgroundOpacityCells: false,\n};\n\nexport const DEFAULT_EFFECTS: TerminalEffects = {\n postProcess: \"none\",\n shaderEffects: [],\n animate: false,\n};\n\nexport const CELL_WIDTH = 7.83;\nexport const LINE_HEIGHT = 19;\n// Ghostty defaults window-padding-x/y to two device-independent points.\nexport const ORIGIN_X = 2;\nexport const ORIGIN_Y = 2;\n", "import { CursorStyle } from \"@vibecook/ghosttea-frame\";\nimport { emptyRenderMetrics, type TerminalRenderMetrics } from \"../performance.js\";\nimport {\n CELL_WIDTH,\n LINE_HEIGHT,\n ORIGIN_X,\n ORIGIN_Y,\n effectiveCursorStyle,\n renderedSizeChanged,\n type CellPoint,\n type PixelSize,\n type RenderView,\n type Rgba,\n type TerminalRenderer,\n} from \"./types.js\";\n\ninterface CanvasSurface extends PixelSize {\n canvas: OffscreenCanvas;\n context: OffscreenCanvasRenderingContext2D;\n}\n\nfunction css(color: Rgba): string {\n const [red, green, blue, alpha] = color;\n return `rgba(${Math.round(red * 255)}, ${Math.round(green * 255)}, ${Math.round(blue * 255)}, ${alpha})`;\n}\n\nfunction ordered(selection: RenderView[\"selection\"]): [CellPoint, CellPoint] | null {\n if (!selection) return null;\n const { anchor, focus } = selection;\n return anchor.row < focus.row || (anchor.row === focus.row && anchor.column <= focus.column)\n ? [anchor, focus]\n : [focus, anchor];\n}\n\nexport class CanvasTerminalRenderer implements TerminalRenderer {\n readonly kind = \"canvas2d\" as const;\n readonly #surfaces = new Map<string, CanvasSurface>();\n #performanceMeasurementEnabled = false;\n\n setPerformanceMeasurementEnabled(enabled: boolean): void {\n this.#performanceMeasurementEnabled = enabled;\n }\n\n mount(id: string, canvas: OffscreenCanvas): void {\n const context = canvas.getContext(\"2d\", { alpha: true });\n if (!context) throw new Error(\"Canvas2D worker backend unavailable\");\n this.#surfaces.set(id, { canvas, context, width: 1, height: 1, dpr: 1 });\n }\n\n unmount(id: string): void {\n this.#surfaces.delete(id);\n }\n\n resize(id: string, size: PixelSize): void {\n const surface = this.#surfaces.get(id);\n if (!surface) return;\n const changed = renderedSizeChanged(surface, size);\n Object.assign(surface, size);\n if (!changed) return;\n surface.canvas.width = Math.max(1, Math.round(size.width * size.dpr));\n surface.canvas.height = Math.max(1, Math.round(size.height * size.dpr));\n }\n\n render(id: string, view: RenderView): TerminalRenderMetrics | undefined {\n const surface = this.#surfaces.get(id);\n if (!surface) return;\n const { context, width, height, dpr } = surface;\n context.clearRect(0, 0, surface.canvas.width, surface.canvas.height);\n context.save();\n context.setTransform(dpr, 0, 0, dpr, 0, 0);\n context.fillStyle = css(view.theme.background);\n context.fillRect(0, 0, width, height);\n const selection = ordered(view.selection);\n if (selection) {\n context.fillStyle = css(view.theme.selection);\n const [start, end] = selection;\n for (let row = start.row; row <= end.row; row += 1) {\n const first = row === start.row ? start.column : 0;\n const last = row === end.row ? end.column : Math.max(0, view.rows[row]?.length ?? 0);\n context.fillRect(\n ORIGIN_X + first * CELL_WIDTH,\n ORIGIN_Y + row * LINE_HEIGHT,\n Math.max(1, last - first + 1) * CELL_WIDTH,\n LINE_HEIGHT,\n );\n }\n }\n context.font = \"13px ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace\";\n context.textBaseline = \"top\";\n context.fillStyle = css(view.theme.foreground);\n for (let row = 0; row < view.rows.length; row += 1) {\n context.fillText(view.rows[row] ?? \"\", ORIGIN_X, ORIGIN_Y + row * LINE_HEIGHT);\n }\n if (selection) {\n const [start, end] = selection;\n context.fillStyle = css(view.theme.selectionForeground);\n for (let row = start.row; row <= end.row; row += 1) {\n const first = row === start.row ? start.column : 0;\n const last = row === end.row ? end.column : Math.max(0, view.rows[row]?.length ?? 0);\n context.save();\n context.beginPath();\n context.rect(\n ORIGIN_X + first * CELL_WIDTH,\n ORIGIN_Y + row * LINE_HEIGHT,\n Math.max(1, last - first + 1) * CELL_WIDTH,\n LINE_HEIGHT,\n );\n context.clip();\n context.fillText(view.rows[row] ?? \"\", ORIGIN_X, ORIGIN_Y + row * LINE_HEIGHT);\n context.restore();\n }\n }\n const cursorStyle = effectiveCursorStyle(view);\n if (cursorStyle !== null) {\n const x = ORIGIN_X + view.cursor.x * CELL_WIDTH;\n const y = ORIGIN_Y + view.cursor.y * LINE_HEIGHT;\n const color =\n cursorStyle === CursorStyle.HollowBlock\n ? ([view.theme.cursor[0], view.theme.cursor[1], view.theme.cursor[2], 1] as const)\n : view.theme.cursor;\n context.fillStyle = css(color);\n if (cursorStyle === CursorStyle.Bar) {\n context.fillRect(x, y, 2, LINE_HEIGHT);\n } else if (cursorStyle === CursorStyle.Underline) {\n context.fillRect(x, y + LINE_HEIGHT - 2, CELL_WIDTH, 2);\n } else if (cursorStyle === CursorStyle.HollowBlock) {\n context.strokeStyle = css(color);\n context.lineWidth = 1;\n context.strokeRect(x + 0.5, y + 0.5, CELL_WIDTH - 1, LINE_HEIGHT - 1);\n } else {\n context.fillRect(x, y, CELL_WIDTH, LINE_HEIGHT);\n context.save();\n context.beginPath();\n context.rect(x, y, CELL_WIDTH, LINE_HEIGHT);\n context.clip();\n context.fillStyle = css(view.theme.cursorText ?? view.theme.background);\n context.fillText(view.rows[view.cursor.y] ?? \"\", ORIGIN_X, ORIGIN_Y + view.cursor.y * LINE_HEIGHT);\n context.restore();\n }\n }\n context.restore();\n if (!this.#performanceMeasurementEnabled) return undefined;\n const metrics = emptyRenderMetrics();\n metrics.fullRenders = 1;\n metrics.damagedRows = Math.max(view.rows.length, view.nativeRows.length, view.nativeStyleRows.length);\n metrics.canvasPixels = surface.canvas.width * surface.canvas.height;\n metrics.renderPasses = 1;\n metrics.drawCalls = 1;\n return metrics;\n }\n}\n", "const graphemeSegmenter = new Intl.Segmenter(undefined, { granularity: \"grapheme\" });\n\nexport function splitGraphemes(text: string): string[] {\n return Array.from(graphemeSegmenter.segment(text), ({ segment }) => segment);\n}\n\nexport function graphemeCellWidth(grapheme: string): 1 | 2 {\n const codepoint = grapheme.codePointAt(0) ?? 0;\n return /\\p{Extended_Pictographic}/u.test(grapheme) ||\n (codepoint >= 0x1100 && codepoint <= 0x115f) ||\n (codepoint >= 0x2e80 && codepoint <= 0xa4cf) ||\n (codepoint >= 0xac00 && codepoint <= 0xd7a3) ||\n (codepoint >= 0xf900 && codepoint <= 0xfaff) ||\n (codepoint >= 0xfe10 && codepoint <= 0xfe6f) ||\n (codepoint >= 0xff00 && codepoint <= 0xff60) ||\n (codepoint >= 0x1f300 && codepoint <= 0x1faff) ||\n (codepoint >= 0x20000 && codepoint <= 0x3fffd)\n ? 2\n : 1;\n}\n", "import type { RenderDamage } from \"./types.js\";\n\nexport interface RenderRows {\n full: boolean;\n rows: number[];\n}\n\nexport function rowsForDamage(rowCount: number, damage: RenderDamage | undefined, sceneValid: boolean): RenderRows {\n const full = !sceneValid || !damage || damage.full;\n if (full) return { full: true, rows: Array.from({ length: rowCount }, (_, row) => row) };\n\n const rows = new Set<number>();\n for (const damagedRow of damage.rows) {\n // Native glyph bearings can cross a row boundary. Repaint one neighbor\n // on each side so clearing stale overhang never clips combining marks.\n for (let row = damagedRow - 1; row <= damagedRow + 1; row += 1) {\n if (row >= 0 && row < rowCount) rows.add(row);\n }\n }\n return { full: false, rows: [...rows].sort((left, right) => left - right) };\n}\n", "// One pipeline serves the ordered effect registry. Each pass gets its own\n// uniform buffer and samples the previous pass, allowing an arbitrary stack\n// without recompiling pipelines or reading and writing the same texture.\nexport const SHADER_EFFECT_WGSL: string = /* wgsl */ `\n@group(0) @binding(0) var terminal_image: texture_2d<f32>;\n@group(0) @binding(1) var terminal_sampler: sampler;\n\nstruct EffectConfig {\n mode: u32,\n frame: u32,\n effect_index: u32,\n effect_count: u32,\n resolution: vec2f,\n time: f32,\n time_delta: f32,\n cursor: vec4f,\n}\n@group(0) @binding(2) var<uniform> effect: EffectConfig;\n\n@vertex fn vertex_main(@builtin(vertex_index) vertex_index: u32) -> @builtin(position) vec4f {\n let positions = array<vec2f, 3>(\n vec2f(-1.0, -1.0),\n vec2f(3.0, -1.0),\n vec2f(-1.0, 3.0),\n );\n return vec4f(positions[vertex_index], 0.0, 1.0);\n}\n\nfn sample_image(uv: vec2f) -> vec4f {\n return textureSample(terminal_image, terminal_sampler, clamp(uv, vec2f(0.0), vec2f(1.0)));\n}\n\nfn straight_rgb(sampled: vec4f) -> vec3f {\n if (sampled.a <= 0.00001) { return vec3f(0.0); }\n return sampled.rgb / sampled.a;\n}\n\nfn premultiplied(rgb: vec3f, alpha: f32) -> vec4f {\n return vec4f(max(rgb, vec3f(0.0)) * alpha, alpha);\n}\n\nfn hash21(p0: vec2f) -> f32 {\n var p = fract(p0 * vec2f(443.8975, 397.2973));\n p += dot(p, p.yx + vec2f(19.19));\n return fract(p.x * p.y);\n}\n\n// Existing Better CRT compatibility port. Its source carries the upstream\n// Shadertoy default CC BY-NC-SA terms; this mode preserves the already-bundled\n// behavior while keeping alpha intact.\nfn better_crt(position: vec2f, uv0: vec2f) -> vec4f {\n var uv = uv0;\n var dc = abs(vec2f(0.5) - uv);\n dc *= dc;\n uv.x = (uv.x - 0.5) * (1.0 + dc.y * 0.075) + 0.5;\n uv.y = (uv.y - 0.5) * (1.0 + dc.x * 0.10) + 0.5;\n let scanline = abs(sin(position.y) * 0.125);\n let sampled = sample_image(uv);\n return vec4f(sampled.rgb * (1.0 - scanline), sampled.a);\n}\n\nfn from_srgb1(value: f32) -> f32 {\n return select(pow(value / 1.055 + 0.055 / 1.055, 2.4), value / 12.92, value <= 0.04045);\n}\n\nfn to_srgb1(value: f32) -> f32 {\n return select(1.055 * pow(max(value, 0.0), 0.41666) - 0.055, value * 12.92, value < 0.0031308);\n}\n\nfn from_srgb(value: vec3f) -> vec3f {\n return vec3f(from_srgb1(value.r), from_srgb1(value.g), from_srgb1(value.b));\n}\n\nfn to_srgb(value: vec3f) -> vec3f {\n return vec3f(to_srgb1(value.r), to_srgb1(value.g), to_srgb1(value.b));\n}\n\n// WebGPU adaptation of Timothy Lottes' public-domain CRT scalar. The source\n// port is Unlicensed/public domain. This retains its warp, scan blur, shadow\n// mask, linear-light processing, and corner vignette in a compact GPU form.\nfn public_domain_crt(position: vec2f, uv0: vec2f) -> vec4f {\n let aspect = effect.resolution.x / max(1.0, effect.resolution.y);\n var centered = uv0 * 2.0 - 1.0;\n centered *= vec2f(\n 1.0 + centered.y * centered.y / (50.0 * aspect),\n 1.0 + centered.x * centered.x / 50.0,\n );\n let uv = centered * 0.5 + 0.5;\n let pixel = 1.0 / effect.resolution;\n let center_sample = sample_image(uv);\n let left = from_srgb(straight_rgb(sample_image(uv - vec2f(pixel.x, 0.0))));\n let center = from_srgb(straight_rgb(center_sample));\n let right = from_srgb(straight_rgb(sample_image(uv + vec2f(pixel.x, 0.0))));\n var color = left * 0.18 + center * 0.64 + right * 0.18;\n let scan = 0.58 + 0.42 * pow(max(0.0, cos(position.y * 2.0943951)), 2.0);\n let mask_index = u32(position.x + position.y * 3.0) % 6u;\n var mask = vec3f(0.65);\n if (mask_index < 2u) { mask.r = 1.0; }\n else if (mask_index < 4u) { mask.g = 1.0; }\n else { mask.b = 1.0; }\n color *= scan * mask;\n let vignette_axis = clamp(1.0 - centered * centered, vec2f(0.0), vec2f(1.0));\n color *= mix(0.5, 1.0, vignette_axis.x * vignette_axis.y);\n let peak = max(0.00001, max(color.r, max(color.g, color.b)));\n let tone = peak / (peak * 0.72 + 0.28);\n color *= tone / peak;\n let inside = all(uv >= vec2f(0.0)) && all(uv <= vec2f(1.0));\n let alpha = select(0.0, center_sample.a, inside);\n return premultiplied(to_srgb(color), alpha);\n}\n\n// MIT-licensed VHS effect by Alex Brinsmead, adapted from the upstream GLSL\n// to premultiplied WebGPU output.\nfn vhs(position: vec2f, uv0: vec2f) -> vec4f {\n let distortion = 1.0;\n let tape_wear = 1.75;\n let color_bleed = 2.0;\n var cc = uv0 - 0.5;\n var warped = clamp(uv0 + cc * (dot(cc, cc) * 0.02), vec2f(0.0), vec2f(1.0));\n warped.x += (\n sin(warped.y * 40.0 + effect.time * 0.5) * 0.000375 +\n sin(warped.y * 80.0 + effect.time * 0.2) * 0.0001875 +\n (hash21(vec2f(floor(position.y), floor(effect.time * 20.0))) - 0.5) * 0.0006\n ) * distortion;\n let tracking_y = fract(effect.time * 0.04);\n let band_distance = min(abs(warped.y - tracking_y), 1.0 - abs(warped.y - tracking_y));\n let band = smoothstep(0.05, 0.0, band_distance);\n let horizontal_offset = band * (hash21(vec2f(floor(position.y * 0.5), effect.time * 3.0)) - 0.5) * 0.006;\n let burst_cycle = floor(effect.time / 30.0);\n let burst_start = hash21(vec2f(burst_cycle, 88.0)) * 25.0;\n let burst_time = effect.time - floor(effect.time / 30.0) * 30.0;\n let burst = burst_time > burst_start && burst_time < burst_start + 5.0;\n let jump = select(0.0, (hash21(vec2f(floor(effect.time * 2.0), 11.3)) - 0.5) * 0.08, burst);\n let sample_uv = fract(warped + vec2f(horizontal_offset, jump));\n let aberration = (0.0003 + band * 0.0015) * color_bleed;\n let center_sample = sample_image(sample_uv);\n let red_sample = straight_rgb(sample_image(sample_uv + vec2f(aberration, 0.0)));\n let blue_sample = straight_rgb(sample_image(sample_uv - vec2f(aberration, 0.0)));\n var color = vec3f(red_sample.r, straight_rgb(center_sample).g, blue_sample.b);\n let pixel = 1.0 / effect.resolution.x;\n let neighbor = straight_rgb(sample_image(sample_uv + vec2f(pixel, 0.0))) * 0.4 +\n straight_rgb(sample_image(sample_uv + vec2f(pixel * 3.0, 0.0))) * 0.6;\n let luma_weights = vec3f(0.299, 0.587, 0.114);\n let luma = dot(color, luma_weights);\n color = vec3f(luma) + mix(color - vec3f(luma), neighbor - vec3f(dot(neighbor, luma_weights)), 0.5 * color_bleed);\n color *= 1.8;\n let grain_time = fract(effect.time);\n let noise1 = hash21(position + vec2f(grain_time * 100.0)) - 0.5;\n let noise2 = hash21(position + vec2f(grain_time * 200.0)) - 0.5;\n let gray = dot(color, luma_weights);\n color += (color - vec3f(gray)) * vec3f(noise1, noise2, -noise1) * 0.15 * tape_wear;\n color += vec3f(noise1 * 0.05 * tape_wear);\n color *= mix(vec3f(1.0), vec3f(1.03, 1.01, 0.96), tape_wear);\n let vignette = uv0 * (1.0 - uv0);\n color *= mix(1.0, clamp(vignette.x * vignette.y * 15.0, 0.0, 1.0), 0.35);\n let static_time = fract(effect.time * 20.0);\n let static_hash = hash21(vec2f(floor(position.x / 10.0), floor(position.y / 2.0) + static_time * 500.0) + vec2f(static_time * 77.0));\n color = mix(color, vec3f(1.0), step(0.9991, static_hash) * 0.135);\n return premultiplied(color, center_sample.a);\n}\n\n// Ember overlay inspired by Jan Mr\u00F3z's CC BY 3.0 shader, adapted for the\n// Ghostty pipeline. Attribution is retained in THIRD_PARTY_NOTICES.md.\nfn sparks(position: vec2f, uv: vec2f) -> vec4f {\n let terminal = sample_image(uv);\n var spark = vec3f(0.0);\n var spark_alpha = 0.0;\n for (var layer = 0u; layer < 8u; layer += 1u) {\n let layer_value = f32(layer);\n let scale = 18.0 + layer_value * 7.0;\n let drift = vec2f(effect.time * (0.35 + layer_value * 0.025), -effect.time * (0.7 + layer_value * 0.05));\n let grid = uv * vec2f(scale, scale * 1.6) + drift;\n let cell = floor(grid);\n let random = hash21(cell + vec2f(layer_value * 13.7, layer_value * 5.1));\n let local = fract(grid) - vec2f(random, fract(random * 17.17));\n let radius = 0.018 + 0.045 * hash21(cell + vec2f(31.0));\n let intensity = smoothstep(radius, 0.0, length(local)) * step(0.79, random);\n let flicker = 0.55 + 0.45 * sin(effect.time * (5.0 + random * 4.0) + random * 31.0);\n let value = intensity * flicker;\n spark += vec3f(1.5, 0.42, 0.05) * value;\n spark_alpha = max(spark_alpha, value * 0.78);\n }\n let terminal_rgb = straight_rgb(terminal);\n let background_weight = 1.0 - smoothstep(0.12, 0.55, dot(terminal_rgb, vec3f(0.2126, 0.7152, 0.0722)));\n let overlay_alpha = spark_alpha * background_weight;\n let alpha = overlay_alpha + terminal.a * (1.0 - overlay_alpha);\n let rgb = select(\n vec3f(0.0),\n (spark * overlay_alpha + terminal_rgb * terminal.a * (1.0 - overlay_alpha)) / max(alpha, 0.00001),\n alpha > 0.00001,\n );\n return premultiplied(rgb, alpha);\n}\n\n@fragment fn fragment_main(@builtin(position) position: vec4f) -> @location(0) vec4f {\n let uv = position.xy / effect.resolution;\n switch effect.mode {\n case 1u: { return better_crt(position.xy, uv); }\n case 2u: { return public_domain_crt(position.xy, uv); }\n case 3u: { return vhs(position.xy, uv); }\n case 4u: { return sparks(position.xy, uv); }\n default: { return sample_image(uv); }\n }\n}\n`;\n", "/// <reference types=\"@webgpu/types\" />\n\nimport { CursorStyle, GlyphFormat, type GlyphDefinition, type StyleDefinition } from \"@vibecook/ghosttea-frame\";\nimport { emptyRenderMetrics, type TerminalRenderMetrics } from \"../performance.js\";\n\nimport {\n CELL_WIDTH,\n LINE_HEIGHT,\n ORIGIN_X,\n ORIGIN_Y,\n effectiveCursorStyle,\n renderedSizeChanged,\n type CellPoint,\n type PixelSize,\n type RenderView,\n type Rgba,\n type TerminalRenderer,\n type TerminalShaderEffect,\n} from \"./types.js\";\nimport { graphemeCellWidth, splitGraphemes } from \"../cell-width.js\";\nimport { rowsForDamage } from \"./render-damage.js\";\nimport { SHADER_EFFECT_WGSL } from \"./shader-effects.js\";\n\nconst ATLAS_SIZE = 2048;\nconst GEOMETRY_CACHE_LIMIT = 8;\nconst FONT_STACK = \"ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace\";\n\nconst EFFECT_MODES: Readonly<Record<TerminalShaderEffect, number>> = {\n \"ghosttea:better-crt\": 1,\n \"ghosttea:crt\": 2,\n \"ghosttea:vhs\": 3,\n \"ghosttea:sparks-from-fire\": 4,\n};\n\nexport function effectIntermediateTextureCount(effectPassCount: number): number {\n return Math.min(2, Math.max(0, Math.trunc(effectPassCount) - 1));\n}\n\nconst RECT_SHADER = /* wgsl */ `\nstruct VertexOutput {\n @builtin(position) position: vec4f,\n @location(0) color: vec4f,\n}\n\n@vertex fn vertex_main(\n @builtin(vertex_index) vertex_index: u32,\n @location(0) p0: vec2f,\n @location(1) p1: vec2f,\n @location(2) p2: vec2f,\n @location(3) color: vec4f,\n) -> VertexOutput {\n let p3 = p1 + p2 - p0;\n let positions = array<vec2f, 6>(\n p0,\n p1,\n p2,\n p2,\n p1,\n p3,\n );\n var output: VertexOutput;\n output.position = vec4f(positions[vertex_index], 0.0, 1.0);\n output.color = color;\n return output;\n}\n\n@fragment fn fragment_main(input: VertexOutput) -> @location(0) vec4f {\n return vec4f(input.color.rgb * input.color.a, input.color.a);\n}\n`;\n\nfunction glyphShader(coverageChannel: \"r\" | \"a\"): string {\n return /* wgsl */ `\n@group(0) @binding(0) var atlas: texture_2d<f32>;\n@group(0) @binding(1) var atlas_sampler: sampler;\n\nstruct VertexOutput {\n @builtin(position) position: vec4f,\n @location(0) uv: vec2f,\n @location(1) color: vec4f,\n}\n\n@vertex fn vertex_main(\n @builtin(vertex_index) vertex_index: u32,\n @location(0) bounds: vec4f,\n @location(1) uv_bounds: vec4f,\n @location(2) color: vec4f,\n) -> VertexOutput {\n let positions = array<vec2f, 6>(\n vec2f(bounds.x, bounds.z),\n vec2f(bounds.y, bounds.z),\n vec2f(bounds.x, bounds.w),\n vec2f(bounds.x, bounds.w),\n vec2f(bounds.y, bounds.z),\n vec2f(bounds.y, bounds.w),\n );\n let uvs = array<vec2f, 6>(\n vec2f(uv_bounds.x, uv_bounds.z),\n vec2f(uv_bounds.y, uv_bounds.z),\n vec2f(uv_bounds.x, uv_bounds.w),\n vec2f(uv_bounds.x, uv_bounds.w),\n vec2f(uv_bounds.y, uv_bounds.z),\n vec2f(uv_bounds.y, uv_bounds.w),\n );\n var output: VertexOutput;\n output.position = vec4f(positions[vertex_index], 0.0, 1.0);\n output.uv = uvs[vertex_index];\n output.color = color;\n return output;\n}\n\n@fragment fn fragment_main(input: VertexOutput) -> @location(0) vec4f {\n let coverage = textureSample(atlas, atlas_sampler, input.uv).${coverageChannel};\n let alpha = input.color.a * coverage;\n return vec4f(input.color.rgb * alpha, alpha);\n}\n`;\n}\n\nconst MONO_GLYPH_SHADER = glyphShader(\"r\");\nconst FALLBACK_GLYPH_SHADER = glyphShader(\"a\");\n\nconst COLOR_GLYPH_SHADER = /* wgsl */ `\n@group(0) @binding(0) var atlas: texture_2d<f32>;\n@group(0) @binding(1) var atlas_sampler: sampler;\n\nstruct VertexOutput {\n @builtin(position) position: vec4f,\n @location(0) uv: vec2f,\n @location(1) color: vec4f,\n}\n\n@vertex fn vertex_main(\n @builtin(vertex_index) vertex_index: u32,\n @location(0) bounds: vec4f,\n @location(1) uv_bounds: vec4f,\n @location(2) color: vec4f,\n) -> VertexOutput {\n let positions = array<vec2f, 6>(\n vec2f(bounds.x, bounds.z),\n vec2f(bounds.y, bounds.z),\n vec2f(bounds.x, bounds.w),\n vec2f(bounds.x, bounds.w),\n vec2f(bounds.y, bounds.z),\n vec2f(bounds.y, bounds.w),\n );\n let uvs = array<vec2f, 6>(\n vec2f(uv_bounds.x, uv_bounds.z),\n vec2f(uv_bounds.y, uv_bounds.z),\n vec2f(uv_bounds.x, uv_bounds.w),\n vec2f(uv_bounds.x, uv_bounds.w),\n vec2f(uv_bounds.y, uv_bounds.z),\n vec2f(uv_bounds.y, uv_bounds.w),\n );\n var output: VertexOutput;\n output.position = vec4f(positions[vertex_index], 0.0, 1.0);\n output.uv = uvs[vertex_index];\n output.color = color;\n return output;\n}\n\n@fragment fn fragment_main(input: VertexOutput) -> @location(0) vec4f {\n return textureSample(atlas, atlas_sampler, input.uv);\n}\n`;\n\nconst premultipliedBlend: GPUBlendState = {\n color: { srcFactor: \"one\", dstFactor: \"one-minus-src-alpha\", operation: \"add\" },\n alpha: { srcFactor: \"one\", dstFactor: \"one-minus-src-alpha\", operation: \"add\" },\n};\n\nfunction premultipliedClear(color: Rgba): GPUColorDict {\n return { r: color[0] * color[3], g: color[1] * color[3], b: color[2] * color[3], a: color[3] };\n}\n\nclass DynamicVertexBuffer {\n #buffer: GPUBuffer | undefined;\n #capacity = 0;\n\n constructor(\n readonly device: GPUDevice,\n readonly label: string,\n ) {}\n\n write(vertices: Float32Array): GPUBuffer | undefined {\n if (vertices.byteLength === 0) return undefined;\n if (!this.#buffer || this.#capacity < vertices.byteLength) {\n this.#buffer?.destroy();\n this.#capacity = Math.max(4096, 2 ** Math.ceil(Math.log2(vertices.byteLength)));\n this.#buffer = this.device.createBuffer({\n label: this.label,\n size: this.#capacity,\n usage: GPUBufferUsage.VERTEX | GPUBufferUsage.COPY_DST,\n });\n }\n this.device.queue.writeBuffer(this.#buffer, 0, vertices);\n return this.#buffer;\n }\n\n destroy(): void {\n this.#buffer?.destroy();\n this.#buffer = undefined;\n }\n}\n\ninterface GlyphLocation {\n u0: number;\n v0: number;\n u1: number;\n v1: number;\n cells: number;\n}\n\nclass FallbackGlyphAtlas {\n readonly #texture: GPUTexture;\n readonly #sampler: GPUSampler;\n readonly #bindGroup: GPUBindGroup;\n readonly #cache = new Map<string, GlyphLocation>();\n readonly #scratch = new OffscreenCanvas(1, 1);\n #x = 1;\n #y = 1;\n #rowHeight = 0;\n #uploadBytes = 0;\n #uploadCalls = 0;\n #generation = 0;\n\n constructor(\n readonly device: GPUDevice,\n bindGroupLayout: GPUBindGroupLayout,\n ) {\n this.#texture = device.createTexture({\n label: \"terminal glyph atlas\",\n size: [ATLAS_SIZE, ATLAS_SIZE],\n format: \"rgba8unorm\",\n usage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST,\n });\n this.#sampler = device.createSampler({ minFilter: \"linear\", magFilter: \"linear\" });\n this.#bindGroup = device.createBindGroup({\n label: \"terminal glyph atlas bindings\",\n layout: bindGroupLayout,\n entries: [\n { binding: 0, resource: this.#texture.createView() },\n { binding: 1, resource: this.#sampler },\n ],\n });\n }\n\n get bindGroup(): GPUBindGroup {\n return this.#bindGroup;\n }\n\n get generation(): number {\n return this.#generation;\n }\n\n prepare(values: Iterable<string>, dpr: number): void {\n const scale = Math.max(1, Math.min(3, dpr));\n const all = [...new Set(values)].filter((value) => value.trim().length > 0);\n const missing = all.filter((value) => !this.#cache.has(`${scale.toFixed(2)}:${value}`));\n if (this.#fits(missing, scale, this.#x, this.#y, this.#rowHeight)) return;\n this.#cache.clear();\n this.#generation += 1;\n this.#x = 1;\n this.#y = 1;\n this.#rowHeight = 0;\n if (!this.#fits(all, scale, this.#x, this.#y, this.#rowHeight)) {\n throw new Error(\"The diagnostic glyph atlas cannot fit the text visible in one frame\");\n }\n }\n\n #fits(values: Iterable<string>, scale: number, startX: number, startY: number, startRowHeight: number): boolean {\n let x = startX;\n let y = startY;\n let rowHeight = startRowHeight;\n for (const value of values) {\n const width = Math.max(1, Math.ceil(CELL_WIDTH * graphemeCellWidth(value) * scale));\n const height = Math.max(1, Math.ceil(LINE_HEIGHT * scale));\n if (x + width + 1 > ATLAS_SIZE) {\n x = 1;\n y += rowHeight + 1;\n rowHeight = 0;\n }\n if (y + height + 1 > ATLAS_SIZE) return false;\n x += width + 1;\n rowHeight = Math.max(rowHeight, height);\n }\n return true;\n }\n\n glyph(grapheme: string, dpr: number): GlyphLocation | undefined {\n if (grapheme.trim().length === 0) return undefined;\n const scale = Math.max(1, Math.min(3, dpr));\n const cells = graphemeCellWidth(grapheme);\n const key = `${scale.toFixed(2)}:${grapheme}`;\n const cached = this.#cache.get(key);\n if (cached) return cached;\n\n const width = Math.max(1, Math.ceil(CELL_WIDTH * cells * scale));\n const height = Math.max(1, Math.ceil(LINE_HEIGHT * scale));\n if (this.#x + width + 1 > ATLAS_SIZE) {\n this.#x = 1;\n this.#y += this.#rowHeight + 1;\n this.#rowHeight = 0;\n }\n if (this.#y + height + 1 > ATLAS_SIZE) {\n throw new Error(\"Temporary glyph atlas exhausted\");\n }\n\n this.#scratch.width = width;\n this.#scratch.height = height;\n const context = this.#scratch.getContext(\"2d\", { willReadFrequently: true });\n if (!context) throw new Error(\"Glyph raster canvas unavailable\");\n context.clearRect(0, 0, width, height);\n context.fillStyle = \"white\";\n context.font = `${13 * scale}px ${FONT_STACK}`;\n context.textBaseline = \"top\";\n context.fillText(grapheme, 0, Math.max(0, Math.floor((height - 15 * scale) / 2)));\n const image = context.getImageData(0, 0, width, height);\n this.device.queue.writeTexture(\n { texture: this.#texture, origin: [this.#x, this.#y] },\n image.data,\n { bytesPerRow: width * 4, rowsPerImage: height },\n [width, height],\n );\n this.#uploadBytes += image.data.byteLength;\n this.#uploadCalls += 1;\n const location: GlyphLocation = {\n u0: this.#x / ATLAS_SIZE,\n v0: this.#y / ATLAS_SIZE,\n u1: (this.#x + width) / ATLAS_SIZE,\n v1: (this.#y + height) / ATLAS_SIZE,\n cells,\n };\n this.#cache.set(key, location);\n this.#x += width + 1;\n this.#rowHeight = Math.max(this.#rowHeight, height);\n return location;\n }\n\n destroy(): void {\n this.#texture.destroy();\n }\n\n uploadMetrics(): { bytes: number; calls: number } {\n return { bytes: this.#uploadBytes, calls: this.#uploadCalls };\n }\n}\n\nclass NativeGlyphAtlas {\n readonly #texture: GPUTexture;\n readonly #sampler: GPUSampler;\n readonly #bindGroup: GPUBindGroup;\n readonly #cache = new Map<number, GlyphLocation>();\n #x = 1;\n #y = 1;\n #rowHeight = 0;\n #uploadBytes = 0;\n #uploadCalls = 0;\n #generation = 0;\n\n constructor(\n readonly device: GPUDevice,\n bindGroupLayout: GPUBindGroupLayout,\n readonly label: string,\n readonly format: \"r8unorm\" | \"rgba8unorm\",\n ) {\n this.#texture = device.createTexture({\n label,\n size: [ATLAS_SIZE, ATLAS_SIZE],\n format,\n usage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST,\n });\n this.#sampler = device.createSampler({ minFilter: \"linear\", magFilter: \"linear\" });\n this.#bindGroup = device.createBindGroup({\n label: `${label} bindings`,\n layout: bindGroupLayout,\n entries: [\n { binding: 0, resource: this.#texture.createView() },\n { binding: 1, resource: this.#sampler },\n ],\n });\n }\n\n get bindGroup(): GPUBindGroup {\n return this.#bindGroup;\n }\n\n get generation(): number {\n return this.#generation;\n }\n\n prepare(definitions: Iterable<GlyphDefinition>): void {\n const all = new Map<number, GlyphDefinition>();\n const missing = new Map<number, GlyphDefinition>();\n for (const definition of definitions) {\n all.set(definition.id, definition);\n if (!this.#cache.has(definition.id)) missing.set(definition.id, definition);\n }\n if (this.#fits(missing.values(), this.#x, this.#y, this.#rowHeight)) return;\n this.#cache.clear();\n this.#generation += 1;\n this.#x = 1;\n this.#y = 1;\n this.#rowHeight = 0;\n if (!this.#fits(all.values(), this.#x, this.#y, this.#rowHeight)) {\n throw new Error(`${this.label} cannot fit the glyphs visible in one frame`);\n }\n }\n\n #fits(definitions: Iterable<GlyphDefinition>, startX: number, startY: number, startRowHeight: number): boolean {\n let x = startX;\n let y = startY;\n let rowHeight = startRowHeight;\n for (const { width, height } of definitions) {\n if (width + 2 > ATLAS_SIZE || height + 2 > ATLAS_SIZE) return false;\n if (x + width + 1 > ATLAS_SIZE) {\n x = 1;\n y += rowHeight + 1;\n rowHeight = 0;\n }\n if (y + height + 1 > ATLAS_SIZE) return false;\n x += width + 1;\n rowHeight = Math.max(rowHeight, height);\n }\n return true;\n }\n\n glyph(definition: GlyphDefinition): GlyphLocation {\n const cached = this.#cache.get(definition.id);\n if (cached) return cached;\n const { width, height } = definition;\n if (this.#x + width + 1 > ATLAS_SIZE) {\n this.#x = 1;\n this.#y += this.#rowHeight + 1;\n this.#rowHeight = 0;\n }\n if (this.#y + height + 1 > ATLAS_SIZE) throw new Error(`${this.label} exhausted`);\n const pixels = definition.pixels;\n const bytesPerPixel = this.format === \"r8unorm\" ? 1 : 4;\n this.device.queue.writeTexture(\n { texture: this.#texture, origin: [this.#x, this.#y] },\n pixels,\n { bytesPerRow: width * bytesPerPixel, rowsPerImage: height },\n [width, height],\n );\n this.#uploadBytes += pixels.byteLength;\n this.#uploadCalls += 1;\n const location: GlyphLocation = {\n u0: this.#x / ATLAS_SIZE,\n v0: this.#y / ATLAS_SIZE,\n u1: (this.#x + width) / ATLAS_SIZE,\n v1: (this.#y + height) / ATLAS_SIZE,\n cells: 0,\n };\n this.#cache.set(definition.id, location);\n this.#x += width + 1;\n this.#rowHeight = Math.max(this.#rowHeight, height);\n return location;\n }\n\n destroy(): void {\n this.#texture.destroy();\n }\n\n uploadMetrics(): { bytes: number; calls: number } {\n return { bytes: this.#uploadBytes, calls: this.#uploadCalls };\n }\n}\n\ninterface WebGpuSurface extends PixelSize {\n canvas: OffscreenCanvas;\n context: GPUCanvasContext;\n sceneTexture: GPUTexture;\n effectTextures: GPUTexture[];\n effectPasses: EffectPass[];\n effectSignature: string;\n effectFrame: number;\n lastEffectTime: number;\n rectangleBuffer: DynamicVertexBuffer;\n glyphBuffer: DynamicVertexBuffer;\n colorGlyphBuffer: DynamicVertexBuffer;\n fallbackGlyphBuffer: DynamicVertexBuffer;\n cursorBuffer: DynamicVertexBuffer;\n geometryCache: Map<string, CachedGeometry>;\n geometryCandidates: Map<string, true>;\n sceneValid: boolean;\n}\n\ninterface EffectPass {\n mode: number;\n configBuffer: GPUBuffer;\n bindGroup: GPUBindGroup;\n}\n\ninterface GeometryLayout {\n rowResetInstanceCount: number;\n backgroundInstanceCount: number;\n selectionInstanceCount: number;\n decorationInstanceStart: number;\n decorationInstanceCount: number;\n rectangleInstanceCount: number;\n glyphInstanceCount: number;\n colorGlyphInstanceCount: number;\n fallbackGlyphInstanceCount: number;\n}\n\ninterface CpuGeometry extends GeometryLayout {\n rectangleData: Float32Array;\n glyphData: Float32Array;\n colorGlyphData: Float32Array;\n fallbackGlyphData: Float32Array;\n}\n\ninterface CachedGeometry extends GeometryLayout {\n rectangleBuffer: GPUBuffer | undefined;\n glyphBuffer: GPUBuffer | undefined;\n colorGlyphBuffer: GPUBuffer | undefined;\n fallbackGlyphBuffer: GPUBuffer | undefined;\n}\n\nfunction destroyCachedGeometry(geometry: CachedGeometry): void {\n geometry.rectangleBuffer?.destroy();\n geometry.glyphBuffer?.destroy();\n geometry.colorGlyphBuffer?.destroy();\n geometry.fallbackGlyphBuffer?.destroy();\n}\n\nfunction clearGeometryCache(surface: WebGpuSurface): void {\n for (const geometry of surface.geometryCache.values()) destroyCachedGeometry(geometry);\n surface.geometryCache.clear();\n surface.geometryCandidates.clear();\n}\n\nfunction createCachedVertexBuffer(device: GPUDevice, label: string, data: Float32Array): GPUBuffer | undefined {\n if (data.byteLength === 0) return undefined;\n const buffer = device.createBuffer({\n label,\n size: data.byteLength,\n usage: GPUBufferUsage.VERTEX | GPUBufferUsage.COPY_DST,\n });\n device.queue.writeBuffer(buffer, 0, data);\n return buffer;\n}\n\nfunction geometryCacheKey(\n view: RenderView,\n rows: readonly number[],\n hasNativeRows: boolean,\n atlasGenerations: readonly [number, number, number],\n): string {\n const selection = view.selection\n ? `${view.selection.anchor.row},${view.selection.anchor.column},${view.selection.focus.row},${view.selection.focus.column}`\n : \"-\";\n return [\n view.sessionEpoch.toString(),\n view.layoutEpoch.toString(),\n hasNativeRows ? \"native\" : \"fallback\",\n rows.map((row) => `${row}:${view.rowRevisions[row]?.toString() ?? \"-\"}`).join(\",\"),\n [\n ...view.theme.background,\n ...view.theme.foreground,\n ...view.theme.cursor,\n ...(view.theme.cursorText ?? view.theme.background),\n ...view.theme.selection,\n ...view.theme.selectionForeground,\n ].join(\",\"),\n view.theme.backgroundOpacityCells ? \"opacity-cells\" : \"opaque-cells\",\n selection,\n effectiveCursorStyle(view) === CursorStyle.Block ? `${view.cursor.x},${view.cursor.y}` : \"-\",\n atlasGenerations.join(\",\"),\n ].join(\"|\");\n}\n\nfunction pushCursorVertices(\n vertices: number[],\n view: RenderView,\n renderRowSet: ReadonlySet<number>,\n scale: number,\n viewportWidth: number,\n viewportHeight: number,\n): void {\n const cursorStyle = effectiveCursorStyle(view);\n if (cursorStyle === null || cursorStyle === CursorStyle.Block || !renderRowSet.has(view.cursor.y)) return;\n const x = (ORIGIN_X + view.cursor.x * CELL_WIDTH) * scale;\n const y = (ORIGIN_Y + view.cursor.y * LINE_HEIGHT) * scale;\n const width = CELL_WIDTH * scale;\n const height = LINE_HEIGHT * scale;\n const stroke = Math.max(1, Math.round(scale));\n const cursorColor: Rgba =\n cursorStyle === CursorStyle.HollowBlock\n ? [view.theme.cursor[0], view.theme.cursor[1], view.theme.cursor[2], 1]\n : view.theme.cursor;\n if (cursorStyle === CursorStyle.Bar) {\n pushRectangle(\n vertices,\n x,\n y,\n Math.max(2, Math.round(2 * scale)),\n height,\n cursorColor,\n viewportWidth,\n viewportHeight,\n );\n } else if (cursorStyle === CursorStyle.Underline) {\n const thickness = Math.max(2, Math.round(2 * scale));\n pushRectangle(vertices, x, y + height - thickness, width, thickness, cursorColor, viewportWidth, viewportHeight);\n } else if (cursorStyle === CursorStyle.HollowBlock) {\n pushRectangle(vertices, x, y, width, stroke, cursorColor, viewportWidth, viewportHeight);\n pushRectangle(vertices, x, y + height - stroke, width, stroke, cursorColor, viewportWidth, viewportHeight);\n pushRectangle(\n vertices,\n x,\n y + stroke,\n stroke,\n Math.max(0, height - stroke * 2),\n cursorColor,\n viewportWidth,\n viewportHeight,\n );\n pushRectangle(\n vertices,\n x + width - stroke,\n y + stroke,\n stroke,\n Math.max(0, height - stroke * 2),\n cursorColor,\n viewportWidth,\n viewportHeight,\n );\n } else {\n pushRectangle(vertices, x, y, width, height, cursorColor, viewportWidth, viewportHeight);\n }\n}\n\nfunction clipX(pixel: number, width: number): number {\n return (pixel / Math.max(1, width)) * 2 - 1;\n}\n\nfunction clipY(pixel: number, height: number): number {\n return 1 - (pixel / Math.max(1, height)) * 2;\n}\n\nfunction pushRectangle(\n output: number[],\n x: number,\n y: number,\n width: number,\n height: number,\n color: Rgba,\n viewportWidth: number,\n viewportHeight: number,\n): void {\n const left = clipX(x, viewportWidth);\n const right = clipX(x + width, viewportWidth);\n const top = clipY(y, viewportHeight);\n const bottom = clipY(y + height, viewportHeight);\n output.push(left, top, right, top, left, bottom, ...color);\n}\n\nfunction pushGlyph(\n output: number[],\n x: number,\n y: number,\n width: number,\n height: number,\n glyph: GlyphLocation,\n color: Rgba,\n viewportWidth: number,\n viewportHeight: number,\n): void {\n const left = clipX(x, viewportWidth);\n const right = clipX(x + width, viewportWidth);\n const top = clipY(y, viewportHeight);\n const bottom = clipY(y + height, viewportHeight);\n output.push(left, right, top, bottom, glyph.u0, glyph.u1, glyph.v0, glyph.v1, ...color);\n}\n\nfunction ordered(selection: RenderView[\"selection\"]): [CellPoint, CellPoint] | null {\n if (!selection) return null;\n const { anchor, focus } = selection;\n return anchor.row < focus.row || (anchor.row === focus.row && anchor.column <= focus.column)\n ? [anchor, focus]\n : [focus, anchor];\n}\n\nfunction cellLength(text: string): number {\n return splitGraphemes(text).reduce((total, grapheme) => total + graphemeCellWidth(grapheme), 0);\n}\n\nconst BOX_DIRECTIONS = new Map<string, string>([\n [\"\u2500\", \"lr\"],\n [\"\u2501\", \"lr\"],\n [\"\u2502\", \"ud\"],\n [\"\u2503\", \"ud\"],\n [\"\u250C\", \"rd\"],\n [\"\u250D\", \"rd\"],\n [\"\u250E\", \"rd\"],\n [\"\u250F\", \"rd\"],\n [\"\u2510\", \"ld\"],\n [\"\u2511\", \"ld\"],\n [\"\u2512\", \"ld\"],\n [\"\u2513\", \"ld\"],\n [\"\u2514\", \"ru\"],\n [\"\u2515\", \"ru\"],\n [\"\u2516\", \"ru\"],\n [\"\u2517\", \"ru\"],\n [\"\u2518\", \"lu\"],\n [\"\u2519\", \"lu\"],\n [\"\u251A\", \"lu\"],\n [\"\u251B\", \"lu\"],\n [\"\u251C\", \"udr\"],\n [\"\u251D\", \"udr\"],\n [\"\u251E\", \"udr\"],\n [\"\u2523\", \"udr\"],\n [\"\u2524\", \"udl\"],\n [\"\u2525\", \"udl\"],\n [\"\u2526\", \"udl\"],\n [\"\u252B\", \"udl\"],\n [\"\u252C\", \"lrd\"],\n [\"\u252F\", \"lrd\"],\n [\"\u2530\", \"lrd\"],\n [\"\u2533\", \"lrd\"],\n [\"\u2534\", \"lru\"],\n [\"\u2537\", \"lru\"],\n [\"\u2538\", \"lru\"],\n [\"\u253B\", \"lru\"],\n [\"\u253C\", \"lrud\"],\n [\"\u254B\", \"lrud\"],\n [\"\u2574\", \"l\"],\n [\"\u2576\", \"r\"],\n [\"\u2575\", \"u\"],\n [\"\u2577\", \"d\"],\n [\"\u2550\", \"lr\"],\n [\"\u2551\", \"ud\"],\n [\"\u2554\", \"rd\"],\n [\"\u2557\", \"ld\"],\n [\"\u255A\", \"ru\"],\n [\"\u255D\", \"lu\"],\n [\"\u2560\", \"udr\"],\n [\"\u2563\", \"udl\"],\n [\"\u2566\", \"lrd\"],\n [\"\u2569\", \"lru\"],\n [\"\u256C\", \"lrud\"],\n [\"\u256D\", \"rd\"],\n [\"\u256E\", \"ld\"],\n [\"\u256F\", \"lu\"],\n [\"\u2570\", \"ru\"],\n]);\n\nconst ROUNDED_BOX_CORNERS = new Set([\"\u256D\", \"\u256E\", \"\u256F\", \"\u2570\"]);\n\nexport interface SpecialDrawingCells {\n box: Map<number, string>;\n block: Map<number, string>;\n}\n\nexport function specialDrawingCells(text: string): SpecialDrawingCells {\n const box = new Map<number, string>();\n const block = new Map<number, string>();\n let column = 0;\n let simple = true;\n for (let index = 0; index < text.length; index += 1) {\n const codepoint = text.charCodeAt(index);\n if (codepoint <= 0x7f) {\n column += 1;\n } else if (codepoint >= 0x2580 && codepoint <= 0x259f) {\n block.set(column, text[index]!);\n column += 1;\n } else if (BOX_DIRECTIONS.has(text[index]!)) {\n box.set(column, text[index]!);\n column += 1;\n } else {\n simple = false;\n break;\n }\n }\n if (simple) return { box, block };\n\n box.clear();\n block.clear();\n column = 0;\n for (const grapheme of splitGraphemes(text)) {\n const codepoint = grapheme.codePointAt(0) ?? 0;\n if (codepoint >= 0x2580 && codepoint <= 0x259f) block.set(column, grapheme);\n else if (BOX_DIRECTIONS.has(grapheme)) box.set(column, grapheme);\n column += graphemeCellWidth(grapheme);\n }\n return { box, block };\n}\n\nfunction rgb(color: readonly [number, number, number]): Rgba {\n return [color[0] / 255, color[1] / 255, color[2] / 255, 1];\n}\n\nfunction over(source: Rgba, backdrop: Rgba): Rgba {\n if (source[3] >= 1) return source;\n if (source[3] <= 0) return backdrop;\n const alpha = source[3] + backdrop[3] * (1 - source[3]);\n if (alpha <= Number.EPSILON) return [0, 0, 0, 0];\n return [\n (source[0] * source[3] + backdrop[0] * backdrop[3] * (1 - source[3])) / alpha,\n (source[1] * source[3] + backdrop[1] * backdrop[3] * (1 - source[3])) / alpha,\n (source[2] * source[3] + backdrop[2] * backdrop[3] * (1 - source[3])) / alpha,\n alpha,\n ];\n}\n\nfunction selectionContains(selection: [CellPoint, CellPoint] | null, row: number, column: number): boolean {\n if (!selection) return false;\n const [start, end] = selection;\n if (row < start.row || row > end.row) return false;\n const first = row === start.row ? start.column : 0;\n const last = row === end.row ? end.column : Number.MAX_SAFE_INTEGER;\n return column >= first && column <= last;\n}\n\nfunction blockCursorContains(view: RenderView, row: number, column: number, span = 1): boolean {\n return (\n effectiveCursorStyle(view) === CursorStyle.Block &&\n view.cursor.y === row &&\n view.cursor.x >= column &&\n view.cursor.x < column + Math.max(1, span)\n );\n}\n\nfunction pushBlockCursorBackground(\n vertices: number[],\n view: RenderView,\n renderRows: readonly number[],\n scale: number,\n viewportWidth: number,\n viewportHeight: number,\n): void {\n if (effectiveCursorStyle(view) !== CursorStyle.Block || !renderRows.includes(view.cursor.y)) return;\n pushRectangle(\n vertices,\n (ORIGIN_X + view.cursor.x * CELL_WIDTH) * scale,\n (ORIGIN_Y + view.cursor.y * LINE_HEIGHT) * scale,\n CELL_WIDTH * scale,\n LINE_HEIGHT * scale,\n view.theme.cursor,\n viewportWidth,\n viewportHeight,\n );\n}\n\ninterface ResolvedStyle {\n foreground: Rgba;\n background: Rgba | null;\n underline: boolean;\n strikethrough: boolean;\n invisible: boolean;\n}\n\nfunction resolveStyle(style: StyleDefinition | undefined, theme: RenderView[\"theme\"]): ResolvedStyle {\n let foreground: Rgba = style?.foreground ? rgb(style.foreground) : theme.foreground;\n let background: Rgba | null = style?.background ? rgb(style.background) : null;\n if (style?.inverse) {\n const originalForeground = foreground;\n foreground = background ?? theme.background;\n background = originalForeground;\n }\n if (background && theme.backgroundOpacityCells) {\n background = [background[0], background[1], background[2], theme.background[3]];\n }\n if (style?.faint) foreground = [foreground[0], foreground[1], foreground[2], foreground[3] * 0.55];\n return {\n foreground,\n background,\n underline: style?.underline ?? false,\n strikethrough: style?.strikethrough ?? false,\n invisible: style?.invisible ?? false,\n };\n}\n\nfunction pushBoxDrawing(\n output: number[],\n grapheme: string,\n column: number,\n row: number,\n scale: number,\n color: Rgba,\n viewportWidth: number,\n viewportHeight: number,\n): void {\n const directions = BOX_DIRECTIONS.get(grapheme);\n if (!directions) return;\n const left = (ORIGIN_X + column * CELL_WIDTH) * scale;\n const right = (ORIGIN_X + (column + 1) * CELL_WIDTH) * scale;\n const top = (ORIGIN_Y + row * LINE_HEIGHT) * scale;\n const bottom = (ORIGIN_Y + (row + 1) * LINE_HEIGHT) * scale;\n const stroke = Math.max(1, Math.round(scale));\n const centerX = Math.round((left + right - stroke) / 2);\n const centerY = Math.round((top + bottom - stroke) / 2);\n if (ROUNDED_BOX_CORNERS.has(grapheme)) {\n const x = centerX + stroke / 2;\n const y = centerY + stroke / 2;\n const points: Array<readonly [number, number]> = [];\n const [originX, originY, startAngle, endAngle] =\n grapheme === \"\u256D\"\n ? [right, bottom, -Math.PI / 2, -Math.PI]\n : grapheme === \"\u256E\"\n ? [left, bottom, -Math.PI / 2, 0]\n : grapheme === \"\u256F\"\n ? [left, top, Math.PI / 2, 0]\n : [right, top, Math.PI, Math.PI / 2];\n const radiusX = Math.abs(right - x);\n const radiusY = Math.abs(bottom - y);\n const steps = Math.max(5, Math.ceil(Math.max(radiusX, radiusY) / 2));\n for (let step = 0; step <= steps; step += 1) {\n const angle = startAngle + (endAngle - startAngle) * (step / steps);\n points.push([originX + Math.cos(angle) * radiusX, originY + Math.sin(angle) * radiusY]);\n }\n for (let index = 1; index < points.length; index += 1) {\n const from = points[index - 1]!;\n const to = points[index]!;\n const dx = to[0] - from[0];\n const dy = to[1] - from[1];\n const length = Math.hypot(dx, dy);\n if (length <= Number.EPSILON) continue;\n const nx = ((-dy / length) * stroke) / 2;\n const ny = ((dx / length) * stroke) / 2;\n output.push(\n clipX(from[0] + nx, viewportWidth),\n clipY(from[1] + ny, viewportHeight),\n clipX(to[0] + nx, viewportWidth),\n clipY(to[1] + ny, viewportHeight),\n clipX(from[0] - nx, viewportWidth),\n clipY(from[1] - ny, viewportHeight),\n ...color,\n );\n }\n return;\n }\n if (directions.includes(\"u\"))\n pushRectangle(output, centerX, top, stroke, centerY + stroke - top, color, viewportWidth, viewportHeight);\n if (directions.includes(\"d\"))\n pushRectangle(output, centerX, centerY, stroke, bottom - centerY, color, viewportWidth, viewportHeight);\n if (directions.includes(\"l\"))\n pushRectangle(output, left, centerY, centerX + stroke - left, stroke, color, viewportWidth, viewportHeight);\n if (directions.includes(\"r\"))\n pushRectangle(output, centerX, centerY, right - centerX, stroke, color, viewportWidth, viewportHeight);\n}\n\ntype FractionRect = readonly [left: number, top: number, right: number, bottom: number];\n\nconst LOWER_BLOCK_RECTANGLES = Array.from({ length: 7 }, (_, index): readonly FractionRect[] => [\n [0, 1 - (index + 1) / 8, 1, 1],\n]);\nconst LEFT_BLOCK_RECTANGLES = Array.from({ length: 7 }, (_, index): readonly FractionRect[] => [\n [0, 0, (7 - index) / 8, 1],\n]);\nconst FULL_BLOCK_RECTANGLES: readonly FractionRect[] = [[0, 0, 1, 1]];\nconst RIGHT_HALF_RECTANGLES: readonly FractionRect[] = [[0.5, 0, 1, 1]];\nconst UPPER_EIGHTH_RECTANGLES: readonly FractionRect[] = [[0, 0, 1, 1 / 8]];\nconst RIGHT_EIGHTH_RECTANGLES: readonly FractionRect[] = [[7 / 8, 0, 1, 1]];\nconst QUADRANT_RECTANGLES: readonly FractionRect[] = [\n [0, 0, 0.5, 0.5],\n [0.5, 0, 1, 0.5],\n [0, 0.5, 0.5, 1],\n [0.5, 0.5, 1, 1],\n];\nconst QUADRANT_BLOCK_RECTANGLES = new Map<number, readonly FractionRect[]>(\n [\n [0x2596, [2]],\n [0x2597, [3]],\n [0x2598, [0]],\n [0x2599, [0, 2, 3]],\n [0x259a, [0, 3]],\n [0x259b, [0, 1, 2]],\n [0x259c, [0, 1, 3]],\n [0x259d, [1]],\n [0x259e, [1, 2]],\n [0x259f, [1, 2, 3]],\n ].map(([codepoint, quadrants]) => [\n codepoint as number,\n (quadrants as number[]).map((quadrant) => QUADRANT_RECTANGLES[quadrant]!),\n ]),\n);\n\nfunction blockElementRectangles(codepoint: number): readonly FractionRect[] | undefined {\n if (codepoint >= 0x2581 && codepoint <= 0x2587) return LOWER_BLOCK_RECTANGLES[codepoint - 0x2581];\n if (codepoint === 0x2588) return FULL_BLOCK_RECTANGLES;\n if (codepoint >= 0x2589 && codepoint <= 0x258f) return LEFT_BLOCK_RECTANGLES[codepoint - 0x2589];\n if (codepoint === 0x2590) return RIGHT_HALF_RECTANGLES;\n if (codepoint === 0x2594) return UPPER_EIGHTH_RECTANGLES;\n if (codepoint === 0x2595) return RIGHT_EIGHTH_RECTANGLES;\n return QUADRANT_BLOCK_RECTANGLES.get(codepoint);\n}\n\nfunction pushBlockElement(\n output: number[],\n grapheme: string,\n column: number,\n row: number,\n scale: number,\n color: Rgba,\n viewportWidth: number,\n viewportHeight: number,\n): boolean {\n const codepoint = grapheme.charCodeAt(0);\n if (codepoint < 0x2580 || codepoint > 0x259f) return false;\n const cellLeft = (ORIGIN_X + column * CELL_WIDTH) * scale;\n const cellRight = (ORIGIN_X + (column + 1) * CELL_WIDTH) * scale;\n const cellTop = (ORIGIN_Y + row * LINE_HEIGHT) * scale;\n const cellBottom = (ORIGIN_Y + (row + 1) * LINE_HEIGHT) * scale;\n if (codepoint === 0x2580) {\n const x0 = Math.round(cellLeft);\n const x1 = Math.round(cellRight);\n const y0 = Math.round(cellTop);\n const y1 = Math.round(cellTop + (cellBottom - cellTop) * 0.5);\n pushRectangle(output, x0, y0, x1 - x0, y1 - y0, color, viewportWidth, viewportHeight);\n return true;\n }\n const rectangles = blockElementRectangles(codepoint);\n if (!rectangles) return false;\n for (const [left, top, right, bottom] of rectangles) {\n const x0 = Math.round(cellLeft + (cellRight - cellLeft) * left);\n const x1 = Math.round(cellLeft + (cellRight - cellLeft) * right);\n const y0 = Math.round(cellTop + (cellBottom - cellTop) * top);\n const y1 = Math.round(cellTop + (cellBottom - cellTop) * bottom);\n pushRectangle(output, x0, y0, x1 - x0, y1 - y0, color, viewportWidth, viewportHeight);\n }\n return true;\n}\n\nexport class WebGpuTerminalRenderer implements TerminalRenderer {\n readonly kind = \"webgpu\" as const;\n readonly #surfaces = new Map<string, WebGpuSurface>();\n readonly #rectanglePipeline: GPURenderPipeline;\n readonly #rectangleOverwritePipeline: GPURenderPipeline;\n readonly #glyphPipeline: GPURenderPipeline;\n readonly #fallbackGlyphPipeline: GPURenderPipeline;\n readonly #colorGlyphPipeline: GPURenderPipeline;\n readonly #effectPipeline: GPURenderPipeline;\n readonly #effectSampler: GPUSampler;\n readonly #monoAtlas: NativeGlyphAtlas;\n readonly #colorAtlas: NativeGlyphAtlas;\n readonly #fallbackAtlas: FallbackGlyphAtlas;\n #performanceMeasurementEnabled = false;\n\n private constructor(\n readonly device: GPUDevice,\n readonly format: GPUTextureFormat,\n ) {\n const rectangleModule = device.createShaderModule({ label: \"terminal rectangle shader\", code: RECT_SHADER });\n const glyphModule = device.createShaderModule({ label: \"terminal glyph shader\", code: MONO_GLYPH_SHADER });\n const fallbackGlyphModule = device.createShaderModule({\n label: \"terminal fallback glyph shader\",\n code: FALLBACK_GLYPH_SHADER,\n });\n const colorGlyphModule = device.createShaderModule({\n label: \"terminal color glyph shader\",\n code: COLOR_GLYPH_SHADER,\n });\n const effectModule = device.createShaderModule({\n label: \"Ghosttea shader effect registry\",\n code: SHADER_EFFECT_WGSL,\n });\n this.#rectanglePipeline = device.createRenderPipeline({\n label: \"terminal rectangle pipeline\",\n layout: \"auto\",\n vertex: {\n module: rectangleModule,\n entryPoint: \"vertex_main\",\n buffers: [\n {\n arrayStride: 40,\n stepMode: \"instance\",\n attributes: [\n { shaderLocation: 0, offset: 0, format: \"float32x2\" },\n { shaderLocation: 1, offset: 8, format: \"float32x2\" },\n { shaderLocation: 2, offset: 16, format: \"float32x2\" },\n { shaderLocation: 3, offset: 24, format: \"float32x4\" },\n ],\n },\n ],\n },\n fragment: {\n module: rectangleModule,\n entryPoint: \"fragment_main\",\n targets: [{ format, blend: premultipliedBlend }],\n },\n primitive: { topology: \"triangle-list\" },\n });\n this.#rectangleOverwritePipeline = device.createRenderPipeline({\n label: \"terminal row-reset overwrite pipeline\",\n layout: \"auto\",\n vertex: {\n module: rectangleModule,\n entryPoint: \"vertex_main\",\n buffers: [\n {\n arrayStride: 40,\n stepMode: \"instance\",\n attributes: [\n { shaderLocation: 0, offset: 0, format: \"float32x2\" },\n { shaderLocation: 1, offset: 8, format: \"float32x2\" },\n { shaderLocation: 2, offset: 16, format: \"float32x2\" },\n { shaderLocation: 3, offset: 24, format: \"float32x4\" },\n ],\n },\n ],\n },\n fragment: { module: rectangleModule, entryPoint: \"fragment_main\", targets: [{ format }] },\n primitive: { topology: \"triangle-list\" },\n });\n this.#glyphPipeline = device.createRenderPipeline({\n label: \"terminal glyph pipeline\",\n layout: \"auto\",\n vertex: {\n module: glyphModule,\n entryPoint: \"vertex_main\",\n buffers: [\n {\n arrayStride: 48,\n stepMode: \"instance\",\n attributes: [\n { shaderLocation: 0, offset: 0, format: \"float32x4\" },\n { shaderLocation: 1, offset: 16, format: \"float32x4\" },\n { shaderLocation: 2, offset: 32, format: \"float32x4\" },\n ],\n },\n ],\n },\n fragment: { module: glyphModule, entryPoint: \"fragment_main\", targets: [{ format, blend: premultipliedBlend }] },\n primitive: { topology: \"triangle-list\" },\n });\n this.#fallbackGlyphPipeline = device.createRenderPipeline({\n label: \"terminal fallback glyph pipeline\",\n layout: \"auto\",\n vertex: {\n module: fallbackGlyphModule,\n entryPoint: \"vertex_main\",\n buffers: [\n {\n arrayStride: 48,\n stepMode: \"instance\",\n attributes: [\n { shaderLocation: 0, offset: 0, format: \"float32x4\" },\n { shaderLocation: 1, offset: 16, format: \"float32x4\" },\n { shaderLocation: 2, offset: 32, format: \"float32x4\" },\n ],\n },\n ],\n },\n fragment: {\n module: fallbackGlyphModule,\n entryPoint: \"fragment_main\",\n targets: [{ format, blend: premultipliedBlend }],\n },\n primitive: { topology: \"triangle-list\" },\n });\n this.#colorGlyphPipeline = device.createRenderPipeline({\n label: \"terminal color glyph pipeline\",\n layout: \"auto\",\n vertex: {\n module: colorGlyphModule,\n entryPoint: \"vertex_main\",\n buffers: [\n {\n arrayStride: 48,\n stepMode: \"instance\",\n attributes: [\n { shaderLocation: 0, offset: 0, format: \"float32x4\" },\n { shaderLocation: 1, offset: 16, format: \"float32x4\" },\n { shaderLocation: 2, offset: 32, format: \"float32x4\" },\n ],\n },\n ],\n },\n fragment: {\n module: colorGlyphModule,\n entryPoint: \"fragment_main\",\n targets: [{ format, blend: premultipliedBlend }],\n },\n primitive: { topology: \"triangle-list\" },\n });\n this.#effectPipeline = device.createRenderPipeline({\n label: \"Ghosttea ordered shader effect pipeline\",\n layout: \"auto\",\n vertex: { module: effectModule, entryPoint: \"vertex_main\" },\n fragment: { module: effectModule, entryPoint: \"fragment_main\", targets: [{ format }] },\n primitive: { topology: \"triangle-list\" },\n });\n this.#effectSampler = device.createSampler({\n label: \"Ghosttea shader effect sampler\",\n addressModeU: \"clamp-to-edge\",\n addressModeV: \"clamp-to-edge\",\n minFilter: \"linear\",\n magFilter: \"linear\",\n });\n this.#monoAtlas = new NativeGlyphAtlas(\n device,\n this.#glyphPipeline.getBindGroupLayout(0),\n \"native monochrome glyph atlas\",\n \"r8unorm\",\n );\n this.#colorAtlas = new NativeGlyphAtlas(\n device,\n this.#colorGlyphPipeline.getBindGroupLayout(0),\n \"native color glyph atlas\",\n \"rgba8unorm\",\n );\n this.#fallbackAtlas = new FallbackGlyphAtlas(device, this.#fallbackGlyphPipeline.getBindGroupLayout(0));\n }\n\n static async create(onLost: (info: GPUDeviceLostInfo) => void): Promise<WebGpuTerminalRenderer> {\n if (!navigator.gpu) throw new Error(\"WebGPU is unavailable\");\n const adapter = await navigator.gpu.requestAdapter();\n if (!adapter) throw new Error(\"No WebGPU adapter is available\");\n const device = await adapter.requestDevice({ label: \"Electron Ghostty terminal renderer\" });\n device.addEventListener(\"uncapturederror\", (event) => {\n console.error(\"[terminal-renderer] WebGPU validation error\", event.error);\n });\n void device.lost.then((info) => {\n if (info.reason !== \"destroyed\") onLost(info);\n });\n return new WebGpuTerminalRenderer(device, navigator.gpu.getPreferredCanvasFormat());\n }\n\n setPerformanceMeasurementEnabled(enabled: boolean): void {\n this.#performanceMeasurementEnabled = enabled;\n }\n\n mount(id: string, canvas: OffscreenCanvas): void {\n const context = canvas.getContext(\"webgpu\") as GPUCanvasContext | null;\n if (!context) throw new Error(\"WebGPU canvas context unavailable\");\n const sceneTexture = this.#createSceneTexture(canvas.width, canvas.height);\n const surface: WebGpuSurface = {\n canvas,\n context,\n sceneTexture,\n effectTextures: [],\n effectPasses: [],\n effectSignature: \"\",\n effectFrame: 0,\n lastEffectTime: 0,\n width: 1,\n height: 1,\n dpr: 1,\n rectangleBuffer: new DynamicVertexBuffer(this.device, `rectangles ${id}`),\n glyphBuffer: new DynamicVertexBuffer(this.device, `glyphs ${id}`),\n colorGlyphBuffer: new DynamicVertexBuffer(this.device, `color glyphs ${id}`),\n fallbackGlyphBuffer: new DynamicVertexBuffer(this.device, `fallback glyphs ${id}`),\n cursorBuffer: new DynamicVertexBuffer(this.device, `cursor ${id}`),\n geometryCache: new Map(),\n geometryCandidates: new Map(),\n sceneValid: false,\n };\n this.#surfaces.set(id, surface);\n this.#configure(surface);\n }\n\n unmount(id: string): void {\n const surface = this.#surfaces.get(id);\n if (!surface) return;\n surface.context.unconfigure();\n surface.sceneTexture.destroy();\n for (const texture of surface.effectTextures) texture.destroy();\n for (const pass of surface.effectPasses) pass.configBuffer.destroy();\n surface.rectangleBuffer.destroy();\n surface.glyphBuffer.destroy();\n surface.colorGlyphBuffer.destroy();\n surface.fallbackGlyphBuffer.destroy();\n surface.cursorBuffer.destroy();\n clearGeometryCache(surface);\n this.#surfaces.delete(id);\n }\n\n resize(id: string, size: PixelSize): void {\n const surface = this.#surfaces.get(id);\n if (!surface) return;\n const changed = renderedSizeChanged(surface, size);\n Object.assign(surface, size);\n if (!changed) return;\n surface.canvas.width = Math.max(1, Math.round(size.width * size.dpr));\n surface.canvas.height = Math.max(1, Math.round(size.height * size.dpr));\n this.#configure(surface);\n }\n\n #configure(surface: WebGpuSurface): void {\n surface.context.configure({ device: this.device, format: this.format, alphaMode: \"premultiplied\" });\n surface.sceneTexture.destroy();\n for (const texture of surface.effectTextures) texture.destroy();\n for (const pass of surface.effectPasses) pass.configBuffer.destroy();\n surface.sceneTexture = this.#createSceneTexture(surface.canvas.width, surface.canvas.height);\n surface.effectTextures = [];\n surface.effectPasses = [];\n surface.effectSignature = \"\";\n clearGeometryCache(surface);\n surface.sceneValid = false;\n }\n\n #createSceneTexture(width: number, height: number): GPUTexture {\n return this.device.createTexture({\n label: \"terminal scene before Ghostty custom shaders\",\n size: [Math.max(1, width), Math.max(1, height)],\n format: this.format,\n usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING,\n });\n }\n\n #createEffectTexture(width: number, height: number, suffix: string): GPUTexture {\n return this.device.createTexture({\n label: `terminal shader ping-pong ${suffix}`,\n size: [Math.max(1, width), Math.max(1, height)],\n format: this.format,\n usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING,\n });\n }\n\n #createEffectBindGroup(texture: GPUTexture, configBuffer: GPUBuffer): GPUBindGroup {\n return this.device.createBindGroup({\n label: \"Ghosttea shader effect bindings\",\n layout: this.#effectPipeline.getBindGroupLayout(0),\n entries: [\n { binding: 0, resource: texture.createView() },\n { binding: 1, resource: this.#effectSampler },\n { binding: 2, resource: { buffer: configBuffer } },\n ],\n });\n }\n\n #shaderStack(view: RenderView): TerminalShaderEffect[] {\n const configured = view.effects?.shaderEffects?.filter((id) => EFFECT_MODES[id] !== undefined) ?? [];\n if (configured.length > 0) return [...configured];\n return view.effects?.postProcess === \"better-crt\" ? [\"ghosttea:better-crt\"] : [];\n }\n\n #ensureEffectPasses(surface: WebGpuSurface, stack: readonly TerminalShaderEffect[]): void {\n const signature = stack.join(\"\\0\") || \"ghosttea:blit\";\n if (surface.effectSignature === signature) return;\n for (const pass of surface.effectPasses) pass.configBuffer.destroy();\n const modes = stack.length > 0 ? stack.map((id) => EFFECT_MODES[id]) : [0];\n const intermediateCount = effectIntermediateTextureCount(modes.length);\n while (surface.effectTextures.length > intermediateCount) surface.effectTextures.pop()!.destroy();\n while (surface.effectTextures.length < intermediateCount) {\n const suffix = surface.effectTextures.length === 0 ? \"A\" : \"B\";\n surface.effectTextures.push(this.#createEffectTexture(surface.canvas.width, surface.canvas.height, suffix));\n }\n surface.effectPasses = modes.map((mode, index) => {\n const configBuffer = this.device.createBuffer({\n label: `Ghosttea shader effect configuration ${index}`,\n size: 48,\n usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST,\n });\n const inputTexture = index === 0 ? surface.sceneTexture : surface.effectTextures[(index - 1) % 2]!;\n return {\n mode,\n configBuffer,\n bindGroup: this.#createEffectBindGroup(inputTexture, configBuffer),\n };\n });\n surface.effectSignature = signature;\n surface.effectFrame = 0;\n surface.lastEffectTime = 0;\n }\n\n #encodeEffectStack(surface: WebGpuSurface, view: RenderView, encoder: GPUCommandEncoder): number {\n const stack = this.#shaderStack(view);\n this.#ensureEffectPasses(surface, stack);\n const now = view.effects?.animate ? performance.now() / 1_000 : 0;\n const delta = surface.lastEffectTime > 0 ? Math.min(0.1, Math.max(0, now - surface.lastEffectTime)) : 0;\n surface.lastEffectTime = now;\n const passCount = surface.effectPasses.length;\n for (let index = 0; index < passCount; index += 1) {\n const effectPass = surface.effectPasses[index]!;\n const storage = new ArrayBuffer(48);\n const values = new DataView(storage);\n values.setUint32(0, effectPass.mode, true);\n values.setUint32(4, surface.effectFrame, true);\n values.setUint32(8, index, true);\n values.setUint32(12, passCount, true);\n values.setFloat32(16, surface.canvas.width, true);\n values.setFloat32(20, surface.canvas.height, true);\n values.setFloat32(24, now, true);\n values.setFloat32(28, delta, true);\n values.setFloat32(32, (ORIGIN_X + view.cursor.x * CELL_WIDTH) * surface.dpr, true);\n values.setFloat32(36, (ORIGIN_Y + view.cursor.y * LINE_HEIGHT) * surface.dpr, true);\n values.setFloat32(40, view.cursor.visible ? 1 : 0, true);\n values.setFloat32(44, view.cursor.style, true);\n this.device.queue.writeBuffer(effectPass.configBuffer, 0, storage);\n const last = index === passCount - 1;\n const output = last\n ? surface.context.getCurrentTexture().createView()\n : surface.effectTextures[index % 2]!.createView();\n const pass = encoder.beginRenderPass({\n label: `Ghosttea shader effect pass ${index + 1}/${passCount}`,\n colorAttachments: [\n {\n view: output,\n clearValue: { r: 0, g: 0, b: 0, a: 0 },\n loadOp: \"clear\",\n storeOp: \"store\",\n },\n ],\n });\n pass.setPipeline(this.#effectPipeline);\n pass.setBindGroup(0, effectPass.bindGroup);\n pass.draw(3);\n pass.end();\n }\n surface.effectFrame += 1;\n return passCount;\n }\n\n #encodeEffectsOnly(\n surface: WebGpuSurface,\n view: RenderView,\n encoder: GPUCommandEncoder,\n ): TerminalRenderMetrics | undefined {\n const effectPassCount = this.#encodeEffectStack(surface, view, encoder);\n if (!this.#performanceMeasurementEnabled) return undefined;\n return {\n ...emptyRenderMetrics(),\n canvasPixels: surface.canvas.width * surface.canvas.height,\n renderPasses: effectPassCount,\n drawCalls: effectPassCount,\n };\n }\n\n render(id: string, view: RenderView): TerminalRenderMetrics | undefined {\n const surface = this.#surfaces.get(id);\n if (!surface) return;\n const encoder = this.device.createCommandEncoder({ label: `terminal frame ${id}` });\n const metrics =\n view.damage?.geometryChanged === false\n ? this.#encodeCachedRender(id, view, encoder)\n : this.#encodeRender(id, view, encoder);\n this.device.queue.submit([encoder.finish()]);\n if (metrics) metrics.queueSubmits = 1;\n return metrics;\n }\n\n renderBatch(entries: ReadonlyArray<{ id: string; view: RenderView }>): Array<TerminalRenderMetrics | undefined> {\n const active = entries.filter(({ id }) => this.#surfaces.has(id));\n if (active.length === 0) return entries.map(() => undefined);\n const encoder = this.device.createCommandEncoder({ label: `terminal frame batch (${active.length} panes)` });\n const byId = new Map<string, TerminalRenderMetrics | undefined>();\n for (const { id, view } of active) {\n byId.set(\n id,\n view.damage?.geometryChanged === false\n ? this.#encodeCachedRender(id, view, encoder)\n : this.#encodeRender(id, view, encoder),\n );\n }\n this.device.queue.submit([encoder.finish()]);\n const firstMetrics = [...byId.values()].find((metrics) => metrics !== undefined);\n if (firstMetrics) firstMetrics.queueSubmits = 1;\n return entries.map(({ id }) => byId.get(id));\n }\n\n #buildGeometry(\n view: RenderView,\n renderRows: readonly number[],\n rowCount: number,\n fullRedraw: boolean,\n hasNativeRows: boolean,\n scale: number,\n viewportWidth: number,\n viewportHeight: number,\n ): CpuGeometry {\n const rectangleVertices: number[] = [];\n const glyphVertices: number[] = [];\n const colorGlyphVertices: number[] = [];\n const fallbackGlyphVertices: number[] = [];\n const resolvedStyles = new Map<number, ResolvedStyle>();\n const styleFor = (styleId: number): ResolvedStyle => {\n const cached = resolvedStyles.get(styleId);\n if (cached) return cached;\n const resolved = resolveStyle(view.styleDefinitions.get(styleId), view.theme);\n resolvedStyles.set(styleId, resolved);\n return resolved;\n };\n const monoDefinitions = new Map<number, GlyphDefinition>();\n const colorDefinitions = new Map<number, GlyphDefinition>();\n for (const row of renderRows) {\n for (const glyph of view.nativeRows[row] ?? []) {\n const definition = view.glyphDefinitions.get(glyph.glyphId);\n if (!definition) continue;\n (definition.format === GlyphFormat.Rgba8Premultiplied ? colorDefinitions : monoDefinitions).set(\n definition.id,\n definition,\n );\n }\n }\n this.#monoAtlas.prepare(monoDefinitions.values());\n this.#colorAtlas.prepare(colorDefinitions.values());\n\n if (!fullRedraw) {\n for (const row of renderRows) {\n const top = row === 0 ? 0 : (ORIGIN_Y + row * LINE_HEIGHT) * scale;\n const bottom =\n row === rowCount - 1\n ? viewportHeight\n : Math.min(viewportHeight, (ORIGIN_Y + (row + 1) * LINE_HEIGHT) * scale);\n pushRectangle(\n rectangleVertices,\n 0,\n top,\n viewportWidth,\n Math.max(0, bottom - top),\n view.theme.background,\n viewportWidth,\n viewportHeight,\n );\n }\n }\n const rowResetInstanceCount = rectangleVertices.length / 10;\n\n for (const row of renderRows) {\n for (const run of view.nativeStyleRows[row] ?? []) {\n const style = styleFor(run.styleId);\n if (!style.background) continue;\n pushRectangle(\n rectangleVertices,\n (ORIGIN_X + run.cellStart * CELL_WIDTH) * scale,\n (ORIGIN_Y + row * LINE_HEIGHT) * scale,\n run.cellSpan * CELL_WIDTH * scale,\n LINE_HEIGHT * scale,\n style.background,\n viewportWidth,\n viewportHeight,\n );\n }\n }\n const backgroundInstanceCount = rectangleVertices.length / 10;\n\n const selection = ordered(view.selection);\n if (selection) {\n const [start, end] = selection;\n for (const row of renderRows) {\n if (row < start.row || row > end.row) continue;\n const first = row === start.row ? start.column : 0;\n const last = row === end.row ? end.column : Math.max(0, cellLength(view.rows[row] ?? \"\") - 1);\n pushRectangle(\n rectangleVertices,\n (ORIGIN_X + first * CELL_WIDTH) * scale,\n (ORIGIN_Y + row * LINE_HEIGHT) * scale,\n Math.max(1, last - first + 1) * CELL_WIDTH * scale,\n LINE_HEIGHT * scale,\n view.theme.selection,\n viewportWidth,\n viewportHeight,\n );\n }\n }\n pushBlockCursorBackground(rectangleVertices, view, renderRows, scale, viewportWidth, viewportHeight);\n const selectionInstanceCount = rectangleVertices.length / 10 - backgroundInstanceCount;\n\n if (!hasNativeRows) {\n this.#fallbackAtlas.prepare(\n renderRows.flatMap((row) => splitGraphemes(view.rows[row] ?? \"\")),\n scale,\n );\n }\n if (hasNativeRows) {\n for (const row of renderRows) {\n const { box: boxCells, block: blockCells } = specialDrawingCells(view.rows[row] ?? \"\");\n for (const instance of view.nativeRows[row] ?? []) {\n const definition = view.glyphDefinitions.get(instance.glyphId);\n if (!definition) continue;\n const style = styleFor(instance.styleId);\n if (style.invisible) continue;\n const isSelected = selectionContains(selection, row, instance.cellStart);\n const foreground = blockCursorContains(view, row, instance.cellStart, instance.cellSpan)\n ? (view.theme.cursorText ?? view.theme.background)\n : isSelected\n ? view.theme.selectionForeground\n : style.foreground;\n const boxDrawing = boxCells.get(instance.cellStart);\n if (boxDrawing) {\n let backdrop = style.background ?? view.theme.background;\n if (isSelected) backdrop = view.theme.selection;\n // Box glyphs are overlapping primitives. Flatten faint opacity\n // against the cell backdrop so joins are blended only once.\n pushBoxDrawing(\n rectangleVertices,\n boxDrawing,\n instance.cellStart,\n row,\n scale,\n over(foreground, backdrop),\n viewportWidth,\n viewportHeight,\n );\n continue;\n }\n const blockElement = blockCells.get(instance.cellStart);\n if (blockElement) {\n let backdrop = style.background ?? view.theme.background;\n if (isSelected) backdrop = view.theme.selection;\n if (\n pushBlockElement(\n rectangleVertices,\n blockElement,\n instance.cellStart,\n row,\n scale,\n over(foreground, backdrop),\n viewportWidth,\n viewportHeight,\n )\n )\n continue;\n }\n const atlas = definition.format === GlyphFormat.Alpha8 ? this.#monoAtlas : this.#colorAtlas;\n const vertices = definition.format === GlyphFormat.Alpha8 ? glyphVertices : colorGlyphVertices;\n pushGlyph(\n vertices,\n (ORIGIN_X + instance.x) * scale,\n (ORIGIN_Y + row * LINE_HEIGHT + instance.y) * scale,\n instance.width * scale,\n instance.height * scale,\n atlas.glyph(definition),\n foreground,\n viewportWidth,\n viewportHeight,\n );\n }\n }\n } else {\n for (const row of renderRows) {\n let column = 0;\n for (const grapheme of splitGraphemes(view.rows[row] ?? \"\")) {\n const glyph = this.#fallbackAtlas.glyph(grapheme, scale);\n const cells = glyph?.cells ?? graphemeCellWidth(grapheme);\n if (glyph) {\n const foreground = blockCursorContains(view, row, column, cells)\n ? (view.theme.cursorText ?? view.theme.background)\n : selectionContains(selection, row, column)\n ? view.theme.selectionForeground\n : view.theme.foreground;\n pushGlyph(\n fallbackGlyphVertices,\n (ORIGIN_X + column * CELL_WIDTH) * scale,\n (ORIGIN_Y + row * LINE_HEIGHT) * scale,\n CELL_WIDTH * cells * scale,\n LINE_HEIGHT * scale,\n glyph,\n foreground,\n viewportWidth,\n viewportHeight,\n );\n }\n column += cells;\n }\n }\n }\n\n for (const row of renderRows) {\n for (const run of view.nativeStyleRows[row] ?? []) {\n const style = styleFor(run.styleId);\n if (style.invisible) continue;\n const x = (ORIGIN_X + run.cellStart * CELL_WIDTH) * scale;\n const width = run.cellSpan * CELL_WIDTH * scale;\n const rowTop = (ORIGIN_Y + row * LINE_HEIGHT) * scale;\n const stroke = Math.max(1, Math.round(scale));\n if (style.underline) {\n pushRectangle(\n rectangleVertices,\n x,\n Math.round(rowTop + 16 * scale),\n width,\n stroke,\n style.foreground,\n viewportWidth,\n viewportHeight,\n );\n }\n if (style.strikethrough) {\n pushRectangle(\n rectangleVertices,\n x,\n Math.round(rowTop + 9 * scale),\n width,\n stroke,\n style.foreground,\n viewportWidth,\n viewportHeight,\n );\n }\n }\n }\n const decorationInstanceStart = backgroundInstanceCount + selectionInstanceCount;\n const decorationInstanceCount = rectangleVertices.length / 10 - decorationInstanceStart;\n return {\n rectangleData: new Float32Array(rectangleVertices),\n glyphData: new Float32Array(glyphVertices),\n colorGlyphData: new Float32Array(colorGlyphVertices),\n fallbackGlyphData: new Float32Array(fallbackGlyphVertices),\n rowResetInstanceCount,\n backgroundInstanceCount,\n selectionInstanceCount,\n decorationInstanceStart,\n decorationInstanceCount,\n rectangleInstanceCount: rectangleVertices.length / 10,\n glyphInstanceCount: glyphVertices.length / 12,\n colorGlyphInstanceCount: colorGlyphVertices.length / 12,\n fallbackGlyphInstanceCount: fallbackGlyphVertices.length / 12,\n };\n }\n\n #encodeRender(id: string, view: RenderView, encoder: GPUCommandEncoder): TerminalRenderMetrics | undefined {\n const surface = this.#surfaces.get(id);\n if (!surface) return;\n const monoUploadsBefore = this.#performanceMeasurementEnabled ? this.#monoAtlas.uploadMetrics() : undefined;\n const colorUploadsBefore = this.#performanceMeasurementEnabled ? this.#colorAtlas.uploadMetrics() : undefined;\n const fallbackUploadsBefore = this.#performanceMeasurementEnabled ? this.#fallbackAtlas.uploadMetrics() : undefined;\n const scale = surface.dpr;\n const viewportWidth = surface.canvas.width;\n const viewportHeight = surface.canvas.height;\n const rowCount = Math.max(view.rows.length, view.nativeRows.length, view.nativeStyleRows.length);\n const { full: fullRedraw, rows: renderRows } = rowsForDamage(rowCount, view.damage, surface.sceneValid);\n const renderRowSet = new Set(renderRows);\n const rectangleVertices: number[] = [];\n const glyphVertices: number[] = [];\n const colorGlyphVertices: number[] = [];\n const fallbackGlyphVertices: number[] = [];\n const resolvedStyles = new Map<number, ResolvedStyle>();\n const styleFor = (styleId: number): ResolvedStyle => {\n const cached = resolvedStyles.get(styleId);\n if (cached) return cached;\n const resolved = resolveStyle(view.styleDefinitions.get(styleId), view.theme);\n resolvedStyles.set(styleId, resolved);\n return resolved;\n };\n const monoDefinitions = new Map<number, GlyphDefinition>();\n const colorDefinitions = new Map<number, GlyphDefinition>();\n for (const row of renderRows) {\n for (const glyph of view.nativeRows[row] ?? []) {\n const definition = view.glyphDefinitions.get(glyph.glyphId);\n if (!definition) continue;\n (definition.format === GlyphFormat.Rgba8Premultiplied ? colorDefinitions : monoDefinitions).set(\n definition.id,\n definition,\n );\n }\n }\n this.#monoAtlas.prepare(monoDefinitions.values());\n this.#colorAtlas.prepare(colorDefinitions.values());\n\n if (!fullRedraw) {\n for (const row of renderRows) {\n const top = row === 0 ? 0 : (ORIGIN_Y + row * LINE_HEIGHT) * scale;\n const bottom =\n row === rowCount - 1\n ? viewportHeight\n : Math.min(viewportHeight, (ORIGIN_Y + (row + 1) * LINE_HEIGHT) * scale);\n pushRectangle(\n rectangleVertices,\n 0,\n top,\n viewportWidth,\n Math.max(0, bottom - top),\n view.theme.background,\n viewportWidth,\n viewportHeight,\n );\n }\n }\n const rowResetInstanceCount = rectangleVertices.length / 10;\n\n for (const row of renderRows) {\n for (const run of view.nativeStyleRows[row] ?? []) {\n const style = styleFor(run.styleId);\n if (!style.background) continue;\n pushRectangle(\n rectangleVertices,\n (ORIGIN_X + run.cellStart * CELL_WIDTH) * scale,\n (ORIGIN_Y + row * LINE_HEIGHT) * scale,\n run.cellSpan * CELL_WIDTH * scale,\n LINE_HEIGHT * scale,\n style.background,\n viewportWidth,\n viewportHeight,\n );\n }\n }\n const backgroundInstanceCount = rectangleVertices.length / 10;\n\n const selection = ordered(view.selection);\n if (selection) {\n const [start, end] = selection;\n for (const row of renderRows) {\n if (row < start.row || row > end.row) continue;\n const first = row === start.row ? start.column : 0;\n const last = row === end.row ? end.column : Math.max(0, cellLength(view.rows[row] ?? \"\") - 1);\n pushRectangle(\n rectangleVertices,\n (ORIGIN_X + first * CELL_WIDTH) * scale,\n (ORIGIN_Y + row * LINE_HEIGHT) * scale,\n Math.max(1, last - first + 1) * CELL_WIDTH * scale,\n LINE_HEIGHT * scale,\n view.theme.selection,\n viewportWidth,\n viewportHeight,\n );\n }\n }\n pushBlockCursorBackground(rectangleVertices, view, renderRows, scale, viewportWidth, viewportHeight);\n const selectionInstanceCount = rectangleVertices.length / 10 - backgroundInstanceCount;\n\n const hasNativeRows = view.nativeRows.some((row) => row.length > 0);\n if (!hasNativeRows) {\n this.#fallbackAtlas.prepare(\n renderRows.flatMap((row) => splitGraphemes(view.rows[row] ?? \"\")),\n scale,\n );\n }\n if (hasNativeRows) {\n for (const row of renderRows) {\n const { box: boxCells, block: blockCells } = specialDrawingCells(view.rows[row] ?? \"\");\n for (const instance of view.nativeRows[row] ?? []) {\n const definition = view.glyphDefinitions.get(instance.glyphId);\n if (!definition) continue;\n const style = styleFor(instance.styleId);\n if (style.invisible) continue;\n const isSelected = selectionContains(selection, row, instance.cellStart);\n const foreground = blockCursorContains(view, row, instance.cellStart, instance.cellSpan)\n ? (view.theme.cursorText ?? view.theme.background)\n : isSelected\n ? view.theme.selectionForeground\n : style.foreground;\n const boxDrawing = boxCells.get(instance.cellStart);\n if (boxDrawing) {\n let backdrop = style.background ?? view.theme.background;\n if (isSelected) backdrop = view.theme.selection;\n // Box glyphs are assembled from several overlapping primitives. Flatten\n // faint opacity against the cell backdrop first so joins are blended once,\n // instead of producing a brighter seam at every cell boundary.\n const boxColor = over(foreground, backdrop);\n pushBoxDrawing(\n rectangleVertices,\n boxDrawing,\n instance.cellStart,\n row,\n scale,\n boxColor,\n viewportWidth,\n viewportHeight,\n );\n continue;\n }\n const blockElement = blockCells.get(instance.cellStart);\n if (blockElement) {\n let backdrop = style.background ?? view.theme.background;\n if (isSelected) backdrop = view.theme.selection;\n const blockColor = over(foreground, backdrop);\n if (\n pushBlockElement(\n rectangleVertices,\n blockElement,\n instance.cellStart,\n row,\n scale,\n blockColor,\n viewportWidth,\n viewportHeight,\n )\n )\n continue;\n }\n const atlas = definition.format === GlyphFormat.Alpha8 ? this.#monoAtlas : this.#colorAtlas;\n const vertices = definition.format === GlyphFormat.Alpha8 ? glyphVertices : colorGlyphVertices;\n pushGlyph(\n vertices,\n (ORIGIN_X + instance.x) * scale,\n (ORIGIN_Y + row * LINE_HEIGHT + instance.y) * scale,\n instance.width * scale,\n instance.height * scale,\n atlas.glyph(definition),\n foreground,\n viewportWidth,\n viewportHeight,\n );\n }\n }\n } else {\n for (const row of renderRows) {\n let column = 0;\n for (const grapheme of splitGraphemes(view.rows[row] ?? \"\")) {\n const glyph = this.#fallbackAtlas.glyph(grapheme, scale);\n const cells = glyph?.cells ?? graphemeCellWidth(grapheme);\n if (glyph) {\n const foreground = blockCursorContains(view, row, column, cells)\n ? (view.theme.cursorText ?? view.theme.background)\n : selectionContains(selection, row, column)\n ? view.theme.selectionForeground\n : view.theme.foreground;\n pushGlyph(\n fallbackGlyphVertices,\n (ORIGIN_X + column * CELL_WIDTH) * scale,\n (ORIGIN_Y + row * LINE_HEIGHT) * scale,\n CELL_WIDTH * cells * scale,\n LINE_HEIGHT * scale,\n glyph,\n foreground,\n viewportWidth,\n viewportHeight,\n );\n }\n column += cells;\n }\n }\n }\n\n for (const row of renderRows) {\n for (const run of view.nativeStyleRows[row] ?? []) {\n const style = styleFor(run.styleId);\n if (style.invisible) continue;\n const x = (ORIGIN_X + run.cellStart * CELL_WIDTH) * scale;\n const width = run.cellSpan * CELL_WIDTH * scale;\n const rowTop = (ORIGIN_Y + row * LINE_HEIGHT) * scale;\n const stroke = Math.max(1, Math.round(scale));\n if (style.underline) {\n pushRectangle(\n rectangleVertices,\n x,\n Math.round(rowTop + 16 * scale),\n width,\n stroke,\n style.foreground,\n viewportWidth,\n viewportHeight,\n );\n }\n if (style.strikethrough) {\n pushRectangle(\n rectangleVertices,\n x,\n Math.round(rowTop + 9 * scale),\n width,\n stroke,\n style.foreground,\n viewportWidth,\n viewportHeight,\n );\n }\n }\n }\n const decorationInstanceStart = backgroundInstanceCount + selectionInstanceCount;\n const decorationInstanceCount = rectangleVertices.length / 10 - decorationInstanceStart;\n\n const cursorStyle = effectiveCursorStyle(view);\n if (cursorStyle !== null && renderRowSet.has(view.cursor.y)) {\n const x = (ORIGIN_X + view.cursor.x * CELL_WIDTH) * scale;\n const y = (ORIGIN_Y + view.cursor.y * LINE_HEIGHT) * scale;\n const width = CELL_WIDTH * scale;\n const height = LINE_HEIGHT * scale;\n const stroke = Math.max(1, Math.round(scale));\n const cursorColor: Rgba =\n cursorStyle === CursorStyle.HollowBlock\n ? [view.theme.cursor[0], view.theme.cursor[1], view.theme.cursor[2], 1]\n : view.theme.cursor;\n if (cursorStyle === CursorStyle.Bar) {\n pushRectangle(\n rectangleVertices,\n x,\n y,\n Math.max(2, Math.round(2 * scale)),\n height,\n cursorColor,\n viewportWidth,\n viewportHeight,\n );\n } else if (cursorStyle === CursorStyle.Underline) {\n const thickness = Math.max(2, Math.round(2 * scale));\n pushRectangle(\n rectangleVertices,\n x,\n y + height - thickness,\n width,\n thickness,\n cursorColor,\n viewportWidth,\n viewportHeight,\n );\n } else if (cursorStyle === CursorStyle.HollowBlock) {\n pushRectangle(rectangleVertices, x, y, width, stroke, cursorColor, viewportWidth, viewportHeight);\n pushRectangle(\n rectangleVertices,\n x,\n y + height - stroke,\n width,\n stroke,\n cursorColor,\n viewportWidth,\n viewportHeight,\n );\n pushRectangle(\n rectangleVertices,\n x,\n y + stroke,\n stroke,\n Math.max(0, height - stroke * 2),\n cursorColor,\n viewportWidth,\n viewportHeight,\n );\n pushRectangle(\n rectangleVertices,\n x + width - stroke,\n y + stroke,\n stroke,\n Math.max(0, height - stroke * 2),\n cursorColor,\n viewportWidth,\n viewportHeight,\n );\n } else if (cursorStyle !== CursorStyle.Block) {\n pushRectangle(rectangleVertices, x, y, width, height, cursorColor, viewportWidth, viewportHeight);\n }\n }\n const rectangleData = new Float32Array(rectangleVertices);\n const glyphData = new Float32Array(glyphVertices);\n const colorGlyphData = new Float32Array(colorGlyphVertices);\n const fallbackGlyphData = new Float32Array(fallbackGlyphVertices);\n const rectangleBuffer = surface.rectangleBuffer.write(rectangleData);\n const glyphBuffer = surface.glyphBuffer.write(glyphData);\n const colorGlyphBuffer = surface.colorGlyphBuffer.write(colorGlyphData);\n const fallbackGlyphBuffer = surface.fallbackGlyphBuffer.write(fallbackGlyphData);\n const cursorInstanceStart = decorationInstanceStart + decorationInstanceCount;\n const cursorInstanceCount = rectangleVertices.length / 10 - cursorInstanceStart;\n\n const pass = encoder.beginRenderPass({\n label: `terminal pass ${id}`,\n colorAttachments: [\n {\n view: surface.sceneTexture.createView(),\n clearValue: premultipliedClear(view.theme.background),\n loadOp: fullRedraw ? \"clear\" : \"load\",\n storeOp: \"store\",\n },\n ],\n });\n if (rectangleBuffer && rowResetInstanceCount > 0) {\n pass.setPipeline(this.#rectangleOverwritePipeline);\n pass.setVertexBuffer(0, rectangleBuffer);\n pass.draw(6, rowResetInstanceCount);\n }\n if (rectangleBuffer && backgroundInstanceCount > rowResetInstanceCount) {\n pass.setPipeline(this.#rectanglePipeline);\n pass.setVertexBuffer(0, rectangleBuffer);\n pass.draw(6, backgroundInstanceCount - rowResetInstanceCount, 0, rowResetInstanceCount);\n }\n if (rectangleBuffer && selectionInstanceCount > 0) {\n pass.setPipeline(this.#rectanglePipeline);\n pass.setVertexBuffer(0, rectangleBuffer);\n pass.draw(6, selectionInstanceCount, 0, backgroundInstanceCount);\n }\n if (glyphBuffer && glyphData.length > 0) {\n pass.setPipeline(this.#glyphPipeline);\n pass.setBindGroup(0, this.#monoAtlas.bindGroup);\n pass.setVertexBuffer(0, glyphBuffer);\n pass.draw(6, glyphVertices.length / 12);\n }\n if (colorGlyphBuffer && colorGlyphData.length > 0) {\n pass.setPipeline(this.#colorGlyphPipeline);\n pass.setBindGroup(0, this.#colorAtlas.bindGroup);\n pass.setVertexBuffer(0, colorGlyphBuffer);\n pass.draw(6, colorGlyphVertices.length / 12);\n }\n if (fallbackGlyphBuffer && fallbackGlyphData.length > 0) {\n pass.setPipeline(this.#fallbackGlyphPipeline);\n pass.setBindGroup(0, this.#fallbackAtlas.bindGroup);\n pass.setVertexBuffer(0, fallbackGlyphBuffer);\n pass.draw(6, fallbackGlyphVertices.length / 12);\n }\n if (rectangleBuffer && decorationInstanceCount > 0) {\n pass.setPipeline(this.#rectanglePipeline);\n pass.setVertexBuffer(0, rectangleBuffer);\n pass.draw(6, decorationInstanceCount, 0, decorationInstanceStart);\n }\n if (rectangleBuffer && cursorInstanceCount > 0) {\n pass.setPipeline(this.#rectanglePipeline);\n pass.setVertexBuffer(0, rectangleBuffer);\n pass.draw(6, cursorInstanceCount, 0, cursorInstanceStart);\n }\n pass.end();\n\n const effectPassCount = this.#encodeEffectStack(surface, view, encoder);\n surface.sceneValid = true;\n if (!this.#performanceMeasurementEnabled) return undefined;\n const monoUploadsAfter = this.#monoAtlas.uploadMetrics();\n const colorUploadsAfter = this.#colorAtlas.uploadMetrics();\n const fallbackUploadsAfter = this.#fallbackAtlas.uploadMetrics();\n return {\n queueSubmits: 0,\n fullRenders: Number(fullRedraw),\n partialRenders: Number(!fullRedraw),\n damagedRows: renderRows.length,\n geometryCacheHits: 0,\n geometryCacheMisses: 0,\n canvasPixels: viewportWidth * viewportHeight,\n renderPasses: 1 + effectPassCount,\n drawCalls:\n Number(rowResetInstanceCount > 0) +\n Number(backgroundInstanceCount > rowResetInstanceCount) +\n Number(selectionInstanceCount > 0) +\n Number(glyphData.length > 0) +\n Number(colorGlyphData.length > 0) +\n Number(fallbackGlyphData.length > 0) +\n Number(decorationInstanceCount > 0) +\n Number(cursorInstanceCount > 0) +\n effectPassCount,\n rectangleVertices: (rectangleVertices.length / 10) * 6,\n monoGlyphVertices: (glyphVertices.length / 12) * 6,\n colorGlyphVertices: (colorGlyphVertices.length / 12) * 6,\n fallbackGlyphVertices: (fallbackGlyphVertices.length / 12) * 6,\n vertexUploadBytes:\n rectangleData.byteLength + glyphData.byteLength + colorGlyphData.byteLength + fallbackGlyphData.byteLength,\n atlasUploadBytes:\n monoUploadsAfter.bytes -\n monoUploadsBefore!.bytes +\n (colorUploadsAfter.bytes - colorUploadsBefore!.bytes) +\n (fallbackUploadsAfter.bytes - fallbackUploadsBefore!.bytes),\n atlasUploadCalls:\n monoUploadsAfter.calls -\n monoUploadsBefore!.calls +\n (colorUploadsAfter.calls - colorUploadsBefore!.calls) +\n (fallbackUploadsAfter.calls - fallbackUploadsBefore!.calls),\n };\n }\n\n #encodeCachedRender(id: string, view: RenderView, encoder: GPUCommandEncoder): TerminalRenderMetrics | undefined {\n const surface = this.#surfaces.get(id);\n if (!surface) return;\n if (!surface.sceneValid || !view.damage || view.damage.full) {\n return this.#encodeRender(id, view, encoder);\n }\n const rowCount = Math.max(view.rows.length, view.nativeRows.length, view.nativeStyleRows.length);\n const damage = rowsForDamage(rowCount, view.damage, surface.sceneValid);\n if (damage.rows.length === 0) return this.#encodeEffectsOnly(surface, view, encoder);\n const monoUploadsBefore = this.#performanceMeasurementEnabled ? this.#monoAtlas.uploadMetrics() : undefined;\n const colorUploadsBefore = this.#performanceMeasurementEnabled ? this.#colorAtlas.uploadMetrics() : undefined;\n const fallbackUploadsBefore = this.#performanceMeasurementEnabled ? this.#fallbackAtlas.uploadMetrics() : undefined;\n const scale = surface.dpr;\n const viewportWidth = surface.canvas.width;\n const viewportHeight = surface.canvas.height;\n const renderRowSet = new Set(damage.rows);\n const hasNativeRows = view.nativeRows.some((row) => row.length > 0);\n let geometry: CachedGeometry;\n let geometryUploadBytes = 0;\n const generations = (): [number, number, number] => [\n this.#monoAtlas.generation,\n this.#colorAtlas.generation,\n this.#fallbackAtlas.generation,\n ];\n let key = geometryCacheKey(view, damage.rows, hasNativeRows, generations());\n const cached = surface.geometryCache.get(key);\n const cacheHit = cached !== undefined;\n if (cached) {\n geometry = cached;\n surface.geometryCache.delete(key);\n surface.geometryCache.set(key, cached);\n } else {\n const admitted = surface.geometryCandidates.has(key);\n const candidateKey = key;\n const cpu = this.#buildGeometry(\n view,\n damage.rows,\n rowCount,\n false,\n hasNativeRows,\n scale,\n viewportWidth,\n viewportHeight,\n );\n key = geometryCacheKey(view, damage.rows, hasNativeRows, generations());\n const promote = admitted && key === candidateKey;\n geometry = {\n rectangleBuffer: promote\n ? createCachedVertexBuffer(this.device, `cached rectangles ${id}`, cpu.rectangleData)\n : surface.rectangleBuffer.write(cpu.rectangleData),\n glyphBuffer: promote\n ? createCachedVertexBuffer(this.device, `cached glyphs ${id}`, cpu.glyphData)\n : surface.glyphBuffer.write(cpu.glyphData),\n colorGlyphBuffer: promote\n ? createCachedVertexBuffer(this.device, `cached color glyphs ${id}`, cpu.colorGlyphData)\n : surface.colorGlyphBuffer.write(cpu.colorGlyphData),\n fallbackGlyphBuffer: promote\n ? createCachedVertexBuffer(this.device, `cached fallback glyphs ${id}`, cpu.fallbackGlyphData)\n : surface.fallbackGlyphBuffer.write(cpu.fallbackGlyphData),\n rowResetInstanceCount: cpu.rowResetInstanceCount,\n backgroundInstanceCount: cpu.backgroundInstanceCount,\n selectionInstanceCount: cpu.selectionInstanceCount,\n decorationInstanceStart: cpu.decorationInstanceStart,\n decorationInstanceCount: cpu.decorationInstanceCount,\n rectangleInstanceCount: cpu.rectangleInstanceCount,\n glyphInstanceCount: cpu.glyphInstanceCount,\n colorGlyphInstanceCount: cpu.colorGlyphInstanceCount,\n fallbackGlyphInstanceCount: cpu.fallbackGlyphInstanceCount,\n };\n geometryUploadBytes =\n cpu.rectangleData.byteLength +\n cpu.glyphData.byteLength +\n cpu.colorGlyphData.byteLength +\n cpu.fallbackGlyphData.byteLength;\n if (promote) {\n surface.geometryCandidates.delete(key);\n surface.geometryCache.set(key, geometry);\n while (surface.geometryCache.size > GEOMETRY_CACHE_LIMIT) {\n const oldestKey = surface.geometryCache.keys().next().value as string | undefined;\n if (oldestKey === undefined) break;\n const oldest = surface.geometryCache.get(oldestKey);\n if (oldest) destroyCachedGeometry(oldest);\n surface.geometryCache.delete(oldestKey);\n }\n } else {\n surface.geometryCandidates.delete(key);\n surface.geometryCandidates.set(key, true);\n while (surface.geometryCandidates.size > GEOMETRY_CACHE_LIMIT) {\n const oldestKey = surface.geometryCandidates.keys().next().value as string | undefined;\n if (oldestKey === undefined) break;\n surface.geometryCandidates.delete(oldestKey);\n }\n }\n }\n\n const cursorVertices: number[] = [];\n pushCursorVertices(cursorVertices, view, renderRowSet, scale, viewportWidth, viewportHeight);\n const cursorData = new Float32Array(cursorVertices);\n const cursorBuffer = surface.cursorBuffer.write(cursorData);\n const cursorInstanceStart = 0;\n const cursorInstanceCount = cursorData.length / 10;\n const pass = encoder.beginRenderPass({\n label: `terminal pass ${id}`,\n colorAttachments: [\n {\n view: surface.sceneTexture.createView(),\n clearValue: premultipliedClear(view.theme.background),\n loadOp: \"load\",\n storeOp: \"store\",\n },\n ],\n });\n if (geometry.rectangleBuffer && geometry.rowResetInstanceCount > 0) {\n pass.setPipeline(this.#rectangleOverwritePipeline);\n pass.setVertexBuffer(0, geometry.rectangleBuffer);\n pass.draw(6, geometry.rowResetInstanceCount);\n }\n if (geometry.rectangleBuffer && geometry.backgroundInstanceCount > geometry.rowResetInstanceCount) {\n pass.setPipeline(this.#rectanglePipeline);\n pass.setVertexBuffer(0, geometry.rectangleBuffer);\n pass.draw(\n 6,\n geometry.backgroundInstanceCount - geometry.rowResetInstanceCount,\n 0,\n geometry.rowResetInstanceCount,\n );\n }\n if (geometry.rectangleBuffer && geometry.selectionInstanceCount > 0) {\n pass.setPipeline(this.#rectanglePipeline);\n pass.setVertexBuffer(0, geometry.rectangleBuffer);\n pass.draw(6, geometry.selectionInstanceCount, 0, geometry.backgroundInstanceCount);\n }\n if (geometry.glyphBuffer && geometry.glyphInstanceCount > 0) {\n pass.setPipeline(this.#glyphPipeline);\n pass.setBindGroup(0, this.#monoAtlas.bindGroup);\n pass.setVertexBuffer(0, geometry.glyphBuffer);\n pass.draw(6, geometry.glyphInstanceCount);\n }\n if (geometry.colorGlyphBuffer && geometry.colorGlyphInstanceCount > 0) {\n pass.setPipeline(this.#colorGlyphPipeline);\n pass.setBindGroup(0, this.#colorAtlas.bindGroup);\n pass.setVertexBuffer(0, geometry.colorGlyphBuffer);\n pass.draw(6, geometry.colorGlyphInstanceCount);\n }\n if (geometry.fallbackGlyphBuffer && geometry.fallbackGlyphInstanceCount > 0) {\n pass.setPipeline(this.#fallbackGlyphPipeline);\n pass.setBindGroup(0, this.#fallbackAtlas.bindGroup);\n pass.setVertexBuffer(0, geometry.fallbackGlyphBuffer);\n pass.draw(6, geometry.fallbackGlyphInstanceCount);\n }\n if (geometry.rectangleBuffer && geometry.decorationInstanceCount > 0) {\n pass.setPipeline(this.#rectanglePipeline);\n pass.setVertexBuffer(0, geometry.rectangleBuffer);\n pass.draw(6, geometry.decorationInstanceCount, 0, geometry.decorationInstanceStart);\n }\n if (cursorBuffer && cursorInstanceCount > 0) {\n pass.setPipeline(this.#rectanglePipeline);\n pass.setVertexBuffer(0, cursorBuffer);\n pass.draw(6, cursorInstanceCount, 0, cursorInstanceStart);\n }\n pass.end();\n\n const effectPassCount = this.#encodeEffectStack(surface, view, encoder);\n surface.sceneValid = true;\n if (!this.#performanceMeasurementEnabled) return undefined;\n const monoUploadsAfter = this.#monoAtlas.uploadMetrics();\n const colorUploadsAfter = this.#colorAtlas.uploadMetrics();\n const fallbackUploadsAfter = this.#fallbackAtlas.uploadMetrics();\n return {\n queueSubmits: 0,\n fullRenders: 0,\n partialRenders: 1,\n damagedRows: damage.rows.length,\n geometryCacheHits: Number(cacheHit),\n geometryCacheMisses: Number(!cacheHit),\n canvasPixels: viewportWidth * viewportHeight,\n renderPasses: 1 + effectPassCount,\n drawCalls:\n Number(geometry.rowResetInstanceCount > 0) +\n Number(geometry.backgroundInstanceCount > geometry.rowResetInstanceCount) +\n Number(geometry.selectionInstanceCount > 0) +\n Number(geometry.glyphInstanceCount > 0) +\n Number(geometry.colorGlyphInstanceCount > 0) +\n Number(geometry.fallbackGlyphInstanceCount > 0) +\n Number(geometry.decorationInstanceCount > 0) +\n Number(cursorInstanceCount > 0) +\n effectPassCount,\n rectangleVertices: (geometry.rectangleInstanceCount + cursorInstanceCount) * 6,\n monoGlyphVertices: geometry.glyphInstanceCount * 6,\n colorGlyphVertices: geometry.colorGlyphInstanceCount * 6,\n fallbackGlyphVertices: geometry.fallbackGlyphInstanceCount * 6,\n vertexUploadBytes: geometryUploadBytes + cursorData.byteLength,\n atlasUploadBytes:\n monoUploadsAfter.bytes -\n monoUploadsBefore!.bytes +\n (colorUploadsAfter.bytes - colorUploadsBefore!.bytes) +\n (fallbackUploadsAfter.bytes - fallbackUploadsBefore!.bytes),\n atlasUploadCalls:\n monoUploadsAfter.calls -\n monoUploadsBefore!.calls +\n (colorUploadsAfter.calls - colorUploadsBefore!.calls) +\n (fallbackUploadsAfter.calls - fallbackUploadsBefore!.calls),\n };\n }\n\n settle(): Promise<void> {\n return this.device.queue.onSubmittedWorkDone();\n }\n\n destroy(): void {\n for (const id of [...this.#surfaces.keys()]) this.unmount(id);\n this.#monoAtlas.destroy();\n this.#colorAtlas.destroy();\n this.#fallbackAtlas.destroy();\n this.device.destroy();\n }\n}\n", "export interface AppliedFrameState {\n sessionEpoch: bigint;\n layoutEpoch: bigint;\n sequence: bigint;\n awaitingResync: boolean;\n}\n\nexport interface IncomingFrameState {\n sessionEpoch: bigint;\n layoutEpoch: bigint;\n sequence: bigint;\n full: boolean;\n}\n\nexport function classifyFrame(\n previous: AppliedFrameState,\n incoming: IncomingFrameState,\n): \"accept\" | \"stale\" | \"resync\" {\n const sameSession = previous.sessionEpoch === 0n || incoming.sessionEpoch === previous.sessionEpoch;\n if (\n sameSession &&\n (incoming.layoutEpoch < previous.layoutEpoch ||\n (incoming.layoutEpoch === previous.layoutEpoch && incoming.sequence <= previous.sequence))\n )\n return \"stale\";\n if (previous.awaitingResync && !incoming.full) return \"resync\";\n const changedSession = !sameSession;\n const missingInitialSnapshot = previous.sessionEpoch === 0n && !incoming.full;\n const sequenceGap =\n previous.sessionEpoch === incoming.sessionEpoch &&\n previous.sequence !== 0n &&\n incoming.sequence !== previous.sequence + 1n;\n return !incoming.full && (changedSession || missingInitialSnapshot || sequenceGap) ? \"resync\" : \"accept\";\n}\n", "import type { CursorState } from \"@vibecook/ghosttea-frame\";\n\nexport function cursorActivityChangesPixels(\n cursor: CursorState,\n focused: boolean,\n cursorBlinkVisible: boolean,\n): boolean {\n return focused && cursor.visible && cursor.blinking && !cursorBlinkVisible;\n}\n", "export interface GlyphCatalogBudget {\n maxDefinitions: number;\n maxSharedDefinitions: number;\n maxSessionPixelBytes: number;\n maxSharedPixelBytes: number;\n}\n\nexport type CatalogAdmission = \"install\" | \"request-full\" | \"text-fallback\";\n\nexport function catalogAdmission(\n resetsCatalog: boolean,\n alreadyUsingFallback: boolean,\n fits: boolean,\n): CatalogAdmission {\n if (alreadyUsingFallback && !resetsCatalog) return \"text-fallback\";\n if (fits) return \"install\";\n return resetsCatalog ? \"text-fallback\" : \"request-full\";\n}\n\ninterface GlyphLike {\n id: number;\n pixels: { byteLength: number };\n}\n\nexport function glyphCatalogFits<T extends GlyphLike>(\n sessionDefinitions: ReadonlyMap<number, T>,\n sessionPixelBytes: number,\n sharedDefinitions: ReadonlyMap<number, { definition: T }>,\n sharedPixelBytes: number,\n definitions: readonly T[],\n budget: GlyphCatalogBudget,\n): boolean {\n if (definitions.length === 0) return true;\n let nextDefinitionCount = sessionDefinitions.size;\n let nextSharedDefinitionCount = sharedDefinitions.size;\n let nextSessionPixelBytes = sessionPixelBytes;\n let nextSharedPixelBytes = sharedPixelBytes;\n const pending = new Set<number>();\n for (const definition of definitions) {\n if (sessionDefinitions.has(definition.id) || pending.has(definition.id)) continue;\n pending.add(definition.id);\n const shared = sharedDefinitions.get(definition.id);\n const pixelBytes = shared?.definition.pixels.byteLength ?? definition.pixels.byteLength;\n nextDefinitionCount += 1;\n nextSessionPixelBytes += pixelBytes;\n if (!shared) {\n nextSharedDefinitionCount += 1;\n nextSharedPixelBytes += pixelBytes;\n }\n if (\n nextDefinitionCount > budget.maxDefinitions ||\n nextSharedDefinitionCount > budget.maxSharedDefinitions ||\n nextSessionPixelBytes > budget.maxSessionPixelBytes ||\n nextSharedPixelBytes > budget.maxSharedPixelBytes\n )\n return false;\n }\n return true;\n}\n\nexport function definitionCatalogFits<T extends { id: number }>(\n installed: ReadonlyMap<number, T>,\n definitions: readonly T[],\n maxDefinitions: number,\n retainedDefinitions = installed.size,\n maxRetainedDefinitions = Number.MAX_SAFE_INTEGER,\n): boolean {\n if (definitions.length === 0) return true;\n let nextDefinitionCount = installed.size;\n let nextRetainedDefinitions = retainedDefinitions;\n const pending = new Set<number>();\n for (const definition of definitions) {\n if (installed.has(definition.id) || pending.has(definition.id)) continue;\n pending.add(definition.id);\n nextDefinitionCount += 1;\n nextRetainedDefinitions += 1;\n if (nextDefinitionCount > maxDefinitions || nextRetainedDefinitions > maxRetainedDefinitions) return false;\n }\n return true;\n}\n", "/// <reference lib=\"webworker\" />\n/// <reference types=\"@webgpu/types\" />\n\nimport {\n decodeClipboardWrite,\n decodeCursorState,\n decodeFrame,\n decodeGlyphDefinitions,\n decodeRowReplacements,\n decodeScrollbarState,\n decodeStyleDefinitions,\n FrameFlag,\n type CursorState,\n type GlyphDefinition,\n type GlyphInstance,\n type StyleDefinition,\n type StyleRun,\n SectionKind,\n} from \"@vibecook/ghosttea-frame\";\nimport type { TerminalScrollbarState } from \"@vibecook/ghosttea-protocol\";\nimport { CanvasTerminalRenderer } from \"./renderers/canvas-renderer.js\";\nimport {\n DEFAULT_EFFECTS,\n DEFAULT_THEME,\n type CellSelection,\n type PixelSize,\n type RenderView,\n type TerminalRenderer,\n type TerminalEffects,\n type TerminalTheme,\n renderedSizeChanged,\n terminalEffectsNeedAnimation,\n} from \"./renderers/types.js\";\nimport { WebGpuTerminalRenderer } from \"./renderers/webgpu-renderer.js\";\nimport { classifyFrame } from \"./frame-sequence.js\";\nimport { cursorActivityChangesPixels } from \"./cursor-invalidation.js\";\nimport { emptyRenderMetrics, type TerminalRenderPerformanceSnapshot } from \"./performance.js\";\nimport type { RendererToWorkerMessage, WorkerToRendererMessage } from \"./worker-messages.js\";\nimport { catalogAdmission, definitionCatalogFits, glyphCatalogFits } from \"./catalog-budget.js\";\n\ninterface SessionSnapshot {\n rows: string[];\n nativeRows: GlyphInstance[][];\n nativeStyleRows: StyleRun[][];\n glyphDefinitions: Map<number, GlyphDefinition>;\n glyphPixelBytes: number;\n styleDefinitions: Map<number, StyleDefinition>;\n rowRevisions: bigint[];\n cursor: CursorState;\n layoutEpoch: bigint;\n sessionEpoch: bigint;\n sequence: bigint;\n awaitingResync: boolean;\n catalogFallback: boolean;\n scrollbar: TerminalScrollbarState | null;\n}\n\ninterface SurfaceSnapshot {\n sessionHandle: string;\n focused: boolean;\n cursorBlinkVisible: boolean;\n selection: CellSelection | null;\n theme: TerminalTheme;\n effects: TerminalEffects;\n damage: { full: boolean; rows: Set<number>; geometryChanged: boolean };\n}\n\ninterface MountedCanvas {\n canvas: OffscreenCanvas;\n size: PixelSize;\n sessionHandle: string;\n}\n\ninterface SessionPresentationDefaults {\n theme: TerminalTheme;\n effects: TerminalEffects;\n selection: CellSelection | null;\n visible: boolean;\n}\n\nconst hiddenCursor: CursorState = { x: 0, y: 0, visible: false, style: 1, blinking: false };\nconst CURSOR_BLINK_INTERVAL_MS = 600;\nconst MAX_SESSION_GLYPH_DEFINITIONS = 65_536;\nconst MAX_SESSION_GLYPH_PIXEL_BYTES = 64 * 1024 * 1024;\nconst MAX_SESSION_STYLE_DEFINITIONS = 65_536;\nconst MAX_SHARED_GLYPH_DEFINITIONS = 131_072;\nconst MAX_SHARED_GLYPH_PIXEL_BYTES = 128 * 1024 * 1024;\nconst MAX_RETAINED_STYLE_DEFINITIONS = 262_144;\nconst GLYPH_CATALOG_BUDGET = {\n maxDefinitions: MAX_SESSION_GLYPH_DEFINITIONS,\n maxSharedDefinitions: MAX_SHARED_GLYPH_DEFINITIONS,\n maxSessionPixelBytes: MAX_SESSION_GLYPH_PIXEL_BYTES,\n maxSharedPixelBytes: MAX_SHARED_GLYPH_PIXEL_BYTES,\n} as const;\nconst NO_GLYPH_DEFINITIONS: readonly GlyphDefinition[] = [];\nconst NO_STYLE_DEFINITIONS: readonly StyleDefinition[] = [];\nconst MAX_PERFORMANCE_SAMPLES = 100_000;\nconst FRAME_CREDIT_BATCH_BYTES = 4 * 1024 * 1024;\nconst FRAME_CREDIT_MAX_DELAY_MS = 8;\nconst snapshots = new Map<string, SessionSnapshot>();\nconst sharedGlyphDefinitions = new Map<number, { definition: GlyphDefinition; references: number }>();\nlet sharedGlyphPixelBytes = 0;\nlet retainedStyleDefinitions = 0;\nconst surfaces = new Map<string, SurfaceSnapshot>();\nconst surfaceIdsBySession = new Map<string, Set<string>>();\nconst noSurfaceIds: ReadonlySet<string> = new Set();\nconst presentationDefaults = new Map<string, SessionPresentationDefaults>();\nconst mounts = new Map<string, MountedCanvas>();\nconst cursorBlinkTimers = new Map<string, ReturnType<typeof setTimeout>>();\nconst dirty = new Set<string>();\n// Occluded surfaces continue ingesting frames so they resume from current state,\n// but do not schedule GPU flushes or cursor timers while their native tab is hidden.\nconst occluded = new Set<string>();\n// A frozen replica must not animate: a blinking cursor on a screen the host\n// stopped updating reads as a live session. Focus is left untouched, since the\n// runtime owns focus truth for control reclaim.\nconst frozenCursors = new Set<string>();\nlet renderer: TerminalRenderer | undefined;\nlet rendererPromise: Promise<TerminalRenderer> | undefined;\nlet flushScheduled = false;\nlet recoveryAttempts = 0;\nlet recovering = false;\nlet nativeTextAnnounced = false;\nlet forceCanvasFallback = false;\nlet partialRenderingEnabled = true;\nlet pendingFrameCreditBytes = 0;\nlet frameCreditTimer: ReturnType<typeof setTimeout> | undefined;\nlet shaderAnimationScheduled = false;\n\ninterface ActivePerformanceMeasurement {\n startedAt: number;\n lastActivityAt: number;\n lastFrameAt: Map<string, number>;\n dirtySince: Map<string, number>;\n frames: TerminalRenderPerformanceSnapshot[\"frames\"];\n scheduling: TerminalRenderPerformanceSnapshot[\"scheduling\"];\n renderer: TerminalRenderPerformanceSnapshot[\"renderer\"];\n samples: TerminalRenderPerformanceSnapshot[\"samples\"];\n}\n\nlet performanceMeasurement: ActivePerformanceMeasurement | undefined;\n\nfunction appendPerformanceSample(samples: number[], value: number): void {\n if (samples.length < MAX_PERFORMANCE_SAMPLES) samples.push(value);\n}\n\nfunction flushFrameCredit(): void {\n if (frameCreditTimer !== undefined) clearTimeout(frameCreditTimer);\n frameCreditTimer = undefined;\n if (pendingFrameCreditBytes === 0) return;\n const bytes = pendingFrameCreditBytes;\n pendingFrameCreditBytes = 0;\n postToRenderer({ type: \"frame-credit\", bytes });\n}\n\nfunction returnFrameCredit(bytes: number): void {\n pendingFrameCreditBytes += bytes;\n if (pendingFrameCreditBytes >= FRAME_CREDIT_BATCH_BYTES) {\n flushFrameCredit();\n } else if (frameCreditTimer === undefined) {\n frameCreditTimer = setTimeout(flushFrameCredit, FRAME_CREDIT_MAX_DELAY_MS);\n }\n}\n\nfunction beginPerformanceMeasurement(): void {\n const now = performance.now();\n performanceMeasurement = {\n startedAt: now,\n lastActivityAt: now,\n lastFrameAt: new Map(),\n dirtySince: new Map(),\n frames: {\n received: 0,\n bytes: 0,\n full: 0,\n incremental: 0,\n stale: 0,\n resyncRequested: 0,\n rowsDecoded: 0,\n glyphDefinitions: 0,\n },\n scheduling: { flushes: 0, renderCalls: 0, maximumDirtyPanes: 0, panesPerFlush: [] },\n renderer: {\n queueSubmits: 0,\n fullRenders: 0,\n partialRenders: 0,\n damagedRows: 0,\n geometryCacheHits: 0,\n geometryCacheMisses: 0,\n canvasPixelFrames: 0,\n renderPasses: 0,\n drawCalls: 0,\n rectangleVertices: 0,\n monoGlyphVertices: 0,\n colorGlyphVertices: 0,\n fallbackGlyphVertices: 0,\n vertexUploadBytes: 0,\n atlasUploadBytes: 0,\n atlasUploadCalls: 0,\n },\n samples: { frameApplyMs: [], renderCpuMs: [], dirtyToRenderMs: [], frameArrivalToRenderMs: [] },\n };\n renderer?.setPerformanceMeasurementEnabled?.(true);\n}\n\nfunction notePerformanceActivity(now = performance.now()): void {\n if (performanceMeasurement) performanceMeasurement.lastActivityAt = now;\n}\n\nfunction recordRenderMetrics(metrics: ReturnType<typeof emptyRenderMetrics>): void {\n const target = performanceMeasurement?.renderer;\n if (!target) return;\n target.queueSubmits += metrics.queueSubmits;\n target.fullRenders += metrics.fullRenders;\n target.partialRenders += metrics.partialRenders;\n target.damagedRows += metrics.damagedRows;\n target.geometryCacheHits += metrics.geometryCacheHits;\n target.geometryCacheMisses += metrics.geometryCacheMisses;\n target.canvasPixelFrames += metrics.canvasPixels;\n target.renderPasses += metrics.renderPasses;\n target.drawCalls += metrics.drawCalls;\n target.rectangleVertices += metrics.rectangleVertices;\n target.monoGlyphVertices += metrics.monoGlyphVertices;\n target.colorGlyphVertices += metrics.colorGlyphVertices;\n target.fallbackGlyphVertices += metrics.fallbackGlyphVertices;\n target.vertexUploadBytes += metrics.vertexUploadBytes;\n target.atlasUploadBytes += metrics.atlasUploadBytes;\n target.atlasUploadCalls += metrics.atlasUploadCalls;\n}\n\nasync function finishPerformanceMeasurement(requestId: number, quietMs: number, timeoutMs: number): Promise<void> {\n const active = performanceMeasurement;\n if (!active) throw new Error(\"No terminal render performance measurement is active\");\n const deadline = performance.now() + timeoutMs;\n let timedOutWaitingForIdle = false;\n let gpuQueueDrainMs: number | null = null;\n\n while (true) {\n const now = performance.now();\n const hasVisibleDirty = [...dirty].some((id) => !occluded.has(id));\n if (!flushScheduled && !hasVisibleDirty && now - active.lastActivityAt >= quietMs) {\n const beforeDrainActivity = active.lastActivityAt;\n if (renderer?.settle) {\n const drainStarted = performance.now();\n await renderer.settle();\n gpuQueueDrainMs = performance.now() - drainStarted;\n }\n if (active.lastActivityAt === beforeDrainActivity && !flushScheduled) break;\n }\n if (now >= deadline) {\n timedOutWaitingForIdle = true;\n break;\n }\n await new Promise((resolve) => setTimeout(resolve, Math.min(25, Math.max(1, quietMs / 4))));\n }\n\n if (timedOutWaitingForIdle && renderer?.settle) {\n const drainStarted = performance.now();\n await renderer.settle();\n gpuQueueDrainMs = performance.now() - drainStarted;\n }\n const snapshot: TerminalRenderPerformanceSnapshot = {\n backend: renderer?.kind ?? \"starting\",\n durationMs: performance.now() - active.startedAt,\n timedOutWaitingForIdle,\n gpuQueueDrainMs,\n frames: active.frames,\n scheduling: active.scheduling,\n renderer: active.renderer,\n samples: active.samples,\n };\n renderer?.setPerformanceMeasurementEnabled?.(false);\n if (performanceMeasurement === active) performanceMeasurement = undefined;\n postToRenderer({ type: \"performance-result\", requestId, snapshot });\n}\n\nfunction postToRenderer(message: WorkerToRendererMessage): void {\n self.postMessage(message);\n}\n\nfunction snapshot(sessionHandle: string): SessionSnapshot {\n let value = snapshots.get(sessionHandle);\n if (!value) {\n value = {\n rows: [],\n nativeRows: [],\n nativeStyleRows: [],\n glyphDefinitions: new Map(),\n glyphPixelBytes: 0,\n styleDefinitions: new Map(),\n rowRevisions: [],\n cursor: hiddenCursor,\n layoutEpoch: 0n,\n sessionEpoch: 0n,\n sequence: 0n,\n awaitingResync: false,\n catalogFallback: false,\n scrollbar: null,\n };\n snapshots.set(sessionHandle, value);\n }\n return value;\n}\n\nfunction clearSessionCatalog(session: SessionSnapshot): void {\n for (const glyphId of session.glyphDefinitions.keys()) {\n const shared = sharedGlyphDefinitions.get(glyphId);\n if (!shared) continue;\n shared.references -= 1;\n if (shared.references <= 0) {\n sharedGlyphDefinitions.delete(glyphId);\n sharedGlyphPixelBytes -= shared.definition.pixels.byteLength;\n }\n }\n session.glyphDefinitions.clear();\n session.glyphPixelBytes = 0;\n retainedStyleDefinitions -= session.styleDefinitions.size;\n session.styleDefinitions.clear();\n}\n\nfunction installGlyphDefinitions(session: SessionSnapshot, definitions: readonly GlyphDefinition[]): void {\n for (const decoded of definitions) {\n if (session.glyphDefinitions.has(decoded.id)) continue;\n let shared = sharedGlyphDefinitions.get(decoded.id);\n const pixelBytes = shared?.definition.pixels.byteLength ?? decoded.pixels.byteLength;\n if (shared) {\n shared.references += 1;\n } else {\n shared = { definition: decoded, references: 1 };\n sharedGlyphDefinitions.set(decoded.id, shared);\n sharedGlyphPixelBytes += decoded.pixels.byteLength;\n }\n session.glyphDefinitions.set(decoded.id, shared.definition);\n session.glyphPixelBytes += pixelBytes;\n }\n}\n\nfunction installStyleDefinitions(session: SessionSnapshot, definitions: readonly StyleDefinition[]): void {\n for (const definition of definitions) {\n if (session.styleDefinitions.has(definition.id)) continue;\n session.styleDefinitions.set(definition.id, definition);\n retainedStyleDefinitions += 1;\n }\n}\n\nfunction dropSessionSnapshot(sessionHandle: string): void {\n const session = snapshots.get(sessionHandle);\n if (session) clearSessionCatalog(session);\n snapshots.delete(sessionHandle);\n}\n\nfunction defaults(sessionHandle: string): SessionPresentationDefaults {\n let value = presentationDefaults.get(sessionHandle);\n if (!value) {\n value = { theme: DEFAULT_THEME, effects: DEFAULT_EFFECTS, selection: null, visible: true };\n presentationDefaults.set(sessionHandle, value);\n }\n return value;\n}\n\nfunction surface(surfaceId: string, sessionHandle: string): SurfaceSnapshot {\n const existing = surfaces.get(surfaceId);\n if (existing) {\n if (existing.sessionHandle !== sessionHandle) throw new Error(`Surface ${surfaceId} changed sessions`);\n return existing;\n }\n const initial = defaults(sessionHandle);\n const value: SurfaceSnapshot = {\n sessionHandle,\n focused: false,\n cursorBlinkVisible: true,\n selection: initial.selection,\n theme: initial.theme,\n effects: initial.effects,\n damage: { full: true, rows: new Set(), geometryChanged: true },\n };\n surfaces.set(surfaceId, value);\n let sessionSurfaceIds = surfaceIdsBySession.get(sessionHandle);\n if (!sessionSurfaceIds) {\n sessionSurfaceIds = new Set();\n surfaceIdsBySession.set(sessionHandle, sessionSurfaceIds);\n }\n sessionSurfaceIds.add(surfaceId);\n if (!initial.visible) occluded.add(surfaceId);\n return value;\n}\n\nfunction surfaceIdsForSession(sessionHandle: string): ReadonlySet<string> {\n return surfaceIdsBySession.get(sessionHandle) ?? noSurfaceIds;\n}\n\nfunction deleteSurface(surfaceId: string): SurfaceSnapshot | undefined {\n const value = surfaces.get(surfaceId);\n if (!value) return undefined;\n surfaces.delete(surfaceId);\n const sessionSurfaceIds = surfaceIdsBySession.get(value.sessionHandle);\n sessionSurfaceIds?.delete(surfaceId);\n if (sessionSurfaceIds?.size === 0) surfaceIdsBySession.delete(value.sessionHandle);\n return value;\n}\n\nfunction renderView(session: SessionSnapshot, presentation: SurfaceSnapshot): RenderView {\n return {\n rows: session.rows,\n nativeRows: session.nativeRows,\n nativeStyleRows: session.nativeStyleRows,\n rowRevisions: session.rowRevisions,\n glyphDefinitions: session.glyphDefinitions,\n styleDefinitions: session.styleDefinitions,\n sessionEpoch: session.sessionEpoch,\n layoutEpoch: session.layoutEpoch,\n cursor: session.cursor,\n focused: presentation.focused,\n cursorBlinkVisible: presentation.cursorBlinkVisible,\n selection: presentation.selection,\n theme: presentation.theme,\n effects: presentation.effects,\n damage: presentation.damage,\n };\n}\n\nfunction scheduleCursorBlink(surfaceId: string, reset: boolean): void {\n const existing = cursorBlinkTimers.get(surfaceId);\n if (existing !== undefined) clearTimeout(existing);\n cursorBlinkTimers.delete(surfaceId);\n const value = surfaces.get(surfaceId);\n if (!value) return;\n const session = snapshot(value.sessionHandle);\n if (reset) value.cursorBlinkVisible = true;\n if (\n occluded.has(surfaceId) ||\n frozenCursors.has(surfaceId) ||\n !value.focused ||\n !session.cursor.visible ||\n !session.cursor.blinking\n )\n return;\n cursorBlinkTimers.set(\n surfaceId,\n setTimeout(() => {\n cursorBlinkTimers.delete(surfaceId);\n const current = surfaces.get(surfaceId);\n const currentSession = current ? snapshots.get(current.sessionHandle) : undefined;\n if (\n occluded.has(surfaceId) ||\n !current ||\n !currentSession ||\n !current.focused ||\n !currentSession.cursor.visible ||\n !currentSession.cursor.blinking\n )\n return;\n current.cursorBlinkVisible = !current.cursorBlinkVisible;\n invalidateRows(surfaceId, [currentSession.cursor.y]);\n scheduleCursorBlink(surfaceId, false);\n }, CURSOR_BLINK_INTERVAL_MS),\n );\n}\n\nasync function createRenderer(): Promise<TerminalRenderer> {\n if (forceCanvasFallback) {\n const canvas = new CanvasTerminalRenderer();\n postToRenderer({ type: \"renderer-status\", backend: canvas.kind, recovered: true });\n return canvas;\n }\n try {\n const gpu = await WebGpuTerminalRenderer.create((info) => void recoverDevice(info));\n recoveryAttempts = 0;\n postToRenderer({ type: \"renderer-status\", backend: gpu.kind });\n return gpu;\n } catch (error) {\n console.warn(\"[terminal-renderer] WebGPU unavailable; using diagnostic Canvas2D\", error);\n const canvas = new CanvasTerminalRenderer();\n postToRenderer({ type: \"renderer-status\", backend: canvas.kind });\n return canvas;\n }\n}\n\nasync function ensureRenderer(): Promise<TerminalRenderer> {\n rendererPromise ??= createRenderer();\n renderer = await rendererPromise;\n return renderer;\n}\n\nasync function recoverDevice(info: GPUDeviceLostInfo): Promise<void> {\n if (recovering || renderer?.kind === \"canvas2d\") return;\n recovering = true;\n recoveryAttempts += 1;\n console.warn(`[terminal-renderer] WebGPU device lost (${info.reason}): ${info.message}`);\n renderer = undefined;\n rendererPromise = WebGpuTerminalRenderer.create((nextInfo) => void recoverDevice(nextInfo));\n try {\n const next = await rendererPromise;\n renderer = next;\n recoveryAttempts = 0;\n recovering = false;\n for (const [id, mount] of mounts) {\n next.mount(id, mount.canvas);\n next.resize(id, mount.size);\n invalidateFull(id);\n }\n scheduleShaderAnimation();\n postToRenderer({ type: \"renderer-status\", backend: next.kind, recovered: true });\n } catch (error) {\n console.error(\"[terminal-renderer] WebGPU recovery failed\", error);\n rendererPromise = undefined;\n recovering = false;\n if (recoveryAttempts >= 3) {\n postToRenderer({ type: \"renderer-reload-required\", reason: \"webgpu-device-loss\" });\n return;\n }\n const delay = Math.min(5_000, 250 * 2 ** Math.min(recoveryAttempts, 4));\n setTimeout(() => void recoverDevice(info), delay);\n }\n}\n\nfunction scheduleFlush(): void {\n if (flushScheduled) return;\n flushScheduled = true;\n const run = (): void => {\n flushScheduled = false;\n void flush();\n };\n if (typeof self.requestAnimationFrame === \"function\") self.requestAnimationFrame(run);\n else setTimeout(run, 8);\n}\n\nfunction shaderAnimationActive(surfaceId: string, presentation: SurfaceSnapshot): boolean {\n return (\n renderer?.kind === \"webgpu\" &&\n mounts.has(surfaceId) &&\n !occluded.has(surfaceId) &&\n presentation.focused &&\n terminalEffectsNeedAnimation(presentation.effects)\n );\n}\n\nfunction scheduleShaderAnimation(): void {\n if (\n shaderAnimationScheduled ||\n ![...surfaces].some(([surfaceId, presentation]) => shaderAnimationActive(surfaceId, presentation))\n )\n return;\n shaderAnimationScheduled = true;\n const run = (): void => {\n shaderAnimationScheduled = false;\n for (const [surfaceId, presentation] of surfaces) {\n if (shaderAnimationActive(surfaceId, presentation)) markDirty(surfaceId);\n }\n scheduleShaderAnimation();\n };\n if (typeof self.requestAnimationFrame === \"function\") self.requestAnimationFrame(run);\n else setTimeout(run, 16);\n}\n\nasync function flush(): Promise<void> {\n const backend = await ensureRenderer();\n const ids = [...dirty].filter((id) => !occluded.has(id));\n if (performanceMeasurement && ids.length > 0) {\n performanceMeasurement.scheduling.flushes += 1;\n appendPerformanceSample(performanceMeasurement.scheduling.panesPerFlush, ids.length);\n performanceMeasurement.scheduling.maximumDirtyPanes = Math.max(\n performanceMeasurement.scheduling.maximumDirtyPanes,\n ids.length,\n );\n }\n for (const id of ids) dirty.delete(id);\n const entries = ids.flatMap((id) => {\n const presentation = surfaces.get(id);\n const session = presentation ? snapshots.get(presentation.sessionHandle) : undefined;\n return mounts.has(id) && presentation && session ? [{ id, view: renderView(session, presentation) }] : [];\n });\n if (entries.length > 0) {\n try {\n const active = performanceMeasurement;\n const beforeRender = active ? performance.now() : 0;\n const metrics = backend.renderBatch\n ? backend.renderBatch(entries)\n : entries.map(({ id, view }) => backend.render(id, view));\n const renderedAt = active ? performance.now() : 0;\n for (const { id } of entries) {\n const damage = surfaces.get(id)?.damage;\n if (!damage) continue;\n damage.full = false;\n damage.rows.clear();\n damage.geometryChanged = false;\n }\n if (active && performanceMeasurement === active) {\n active.scheduling.renderCalls += entries.length;\n appendPerformanceSample(active.samples.renderCpuMs, renderedAt - beforeRender);\n for (let index = 0; index < entries.length; index += 1) {\n const { id } = entries[index]!;\n const dirtySince = active.dirtySince.get(id);\n const sessionHandle = surfaces.get(id)?.sessionHandle;\n const lastFrameAt = sessionHandle ? active.lastFrameAt.get(sessionHandle) : undefined;\n if (dirtySince !== undefined)\n appendPerformanceSample(active.samples.dirtyToRenderMs, renderedAt - dirtySince);\n if (lastFrameAt !== undefined)\n appendPerformanceSample(active.samples.frameArrivalToRenderMs, renderedAt - lastFrameAt);\n active.dirtySince.delete(id);\n recordRenderMetrics(metrics[index] ?? emptyRenderMetrics());\n }\n notePerformanceActivity(renderedAt);\n }\n } catch (error) {\n console.error(`[terminal-renderer] failed to render ${entries.length} view(s)`, error);\n }\n }\n if ([...dirty].some((id) => !occluded.has(id))) scheduleFlush();\n}\n\nfunction markDirty(id: string): void {\n if (performanceMeasurement && !performanceMeasurement.dirtySince.has(id)) {\n performanceMeasurement.dirtySince.set(id, performance.now());\n }\n dirty.add(id);\n if (!occluded.has(id)) scheduleFlush();\n}\n\nfunction invalidateFull(id: string): void {\n const value = surfaces.get(id);\n if (!value) return;\n const damage = value.damage;\n damage.full = true;\n damage.rows.clear();\n damage.geometryChanged = true;\n markDirty(id);\n}\n\nfunction invalidateRows(id: string, rows: Iterable<number>, geometryChanged = false): void {\n if (!partialRenderingEnabled) {\n invalidateFull(id);\n return;\n }\n const value = surfaces.get(id);\n if (!value) return;\n const damage = value.damage;\n if (!damage.full) {\n damage.geometryChanged ||= geometryChanged;\n for (const row of rows) {\n if (Number.isSafeInteger(row) && row >= 0) damage.rows.add(row);\n }\n }\n markDirty(id);\n}\n\nfunction invalidateSessionFull(sessionHandle: string): void {\n for (const surfaceId of surfaceIdsForSession(sessionHandle)) invalidateFull(surfaceId);\n}\n\nfunction invalidateSessionRows(sessionHandle: string, rows: Iterable<number>, geometryChanged = false): void {\n const damagedRows = [...rows];\n for (const surfaceId of surfaceIdsForSession(sessionHandle)) invalidateRows(surfaceId, damagedRows, geometryChanged);\n}\n\nasync function mount(surfaceId: string, sessionHandle: string, canvas: OffscreenCanvas): Promise<void> {\n if (mounts.has(surfaceId)) renderer?.unmount(surfaceId);\n snapshot(sessionHandle);\n surface(surfaceId, sessionHandle);\n const entry: MountedCanvas = { canvas, size: { width: 1, height: 1, dpr: 1 }, sessionHandle };\n mounts.set(surfaceId, entry);\n const backend = await ensureRenderer();\n if (mounts.get(surfaceId) !== entry) return;\n backend.mount(surfaceId, canvas);\n backend.resize(surfaceId, entry.size);\n invalidateFull(surfaceId);\n scheduleShaderAnimation();\n}\n\nfunction applyFrame(packet: ArrayBuffer): void {\n const active = performanceMeasurement;\n const applyStarted = active ? performance.now() : 0;\n if (active) {\n active.frames.received += 1;\n active.frames.bytes += packet.byteLength;\n active.lastActivityAt = applyStarted;\n }\n const frame = decodeFrame(packet);\n const id = frame.sessionHandle.toString();\n if (active) {\n active.lastFrameAt.set(id, applyStarted);\n if ((frame.flags & FrameFlag.FullSnapshot) !== 0) active.frames.full += 1;\n else active.frames.incremental += 1;\n }\n const previous = snapshot(id);\n const fullFrame = (frame.flags & FrameFlag.FullSnapshot) !== 0;\n const catalogReset = (frame.flags & FrameFlag.CatalogReset) !== 0;\n if (catalogReset && !fullFrame) {\n if (active) {\n active.frames.resyncRequested += 1;\n appendPerformanceSample(active.samples.frameApplyMs, performance.now() - applyStarted);\n }\n previous.awaitingResync = true;\n postToRenderer({ type: \"frame-resync-needed\", sessionHandle: id });\n return;\n }\n const classification = classifyFrame(previous, {\n sessionEpoch: frame.sessionEpoch,\n layoutEpoch: frame.layoutEpoch,\n sequence: frame.frameSequence,\n full: fullFrame,\n });\n if (classification === \"stale\") {\n if (active) {\n active.frames.stale += 1;\n appendPerformanceSample(active.samples.frameApplyMs, performance.now() - applyStarted);\n }\n return;\n }\n const changedSession = previous.sessionEpoch !== 0n && frame.sessionEpoch !== previous.sessionEpoch;\n if (classification === \"resync\") {\n if (active) {\n active.frames.resyncRequested += 1;\n appendPerformanceSample(active.samples.frameApplyMs, performance.now() - applyStarted);\n }\n previous.awaitingResync = true;\n postToRenderer({ type: \"frame-resync-needed\", sessionHandle: id });\n return;\n }\n const completingResync = previous.awaitingResync;\n const rowSection = frame.sections.find((candidate) => candidate.kind === SectionKind.RowReplacements);\n const cursorSection = frame.sections.find((candidate) => candidate.kind === SectionKind.CursorState);\n const glyphSection = frame.sections.find((candidate) => candidate.kind === SectionKind.GlyphDefinitions);\n const styleSection = frame.sections.find((candidate) => candidate.kind === SectionKind.StyleDefinitions);\n const clipboardSection = frame.sections.find((candidate) => candidate.kind === SectionKind.ClipboardWrite);\n const scrollbarSection = frame.sections.find((candidate) => candidate.kind === SectionKind.ScrollbarState);\n if (!rowSection || !cursorSection) {\n if (active) appendPerformanceSample(active.samples.frameApplyMs, performance.now() - applyStarted);\n return;\n }\n\n const glyphDefinitions = glyphSection ? decodeGlyphDefinitions(glyphSection) : NO_GLYPH_DEFINITIONS;\n const styleDefinitions = styleSection ? decodeStyleDefinitions(styleSection) : NO_STYLE_DEFINITIONS;\n if (active) active.frames.glyphDefinitions += glyphDefinitions.length;\n const resetsCatalog = changedSession || completingResync || catalogReset;\n const wasCatalogFallback = previous.catalogFallback;\n if (resetsCatalog) {\n previous.rows = [];\n previous.nativeRows = [];\n previous.nativeStyleRows = [];\n clearSessionCatalog(previous);\n previous.rowRevisions = [];\n const catalogFits =\n glyphCatalogFits(\n previous.glyphDefinitions,\n previous.glyphPixelBytes,\n sharedGlyphDefinitions,\n sharedGlyphPixelBytes,\n glyphDefinitions,\n GLYPH_CATALOG_BUDGET,\n ) &&\n definitionCatalogFits(\n previous.styleDefinitions,\n styleDefinitions,\n MAX_SESSION_STYLE_DEFINITIONS,\n retainedStyleDefinitions,\n MAX_RETAINED_STYLE_DEFINITIONS,\n );\n const admission = catalogAdmission(true, wasCatalogFallback, catalogFits);\n previous.catalogFallback = admission === \"text-fallback\";\n if (admission === \"install\") {\n installGlyphDefinitions(previous, glyphDefinitions);\n installStyleDefinitions(previous, styleDefinitions);\n } else if (!wasCatalogFallback) {\n postToRenderer({\n type: \"catalog-pressure\",\n sessionHandle: id,\n reason: \"working-set-exceeds-budget\",\n });\n }\n } else if (!previous.catalogFallback) {\n const catalogFits =\n glyphCatalogFits(\n previous.glyphDefinitions,\n previous.glyphPixelBytes,\n sharedGlyphDefinitions,\n sharedGlyphPixelBytes,\n glyphDefinitions,\n GLYPH_CATALOG_BUDGET,\n ) &&\n definitionCatalogFits(\n previous.styleDefinitions,\n styleDefinitions,\n MAX_SESSION_STYLE_DEFINITIONS,\n retainedStyleDefinitions,\n MAX_RETAINED_STYLE_DEFINITIONS,\n );\n const admission = catalogAdmission(false, false, catalogFits);\n if (admission === \"request-full\") {\n if (active) {\n active.frames.resyncRequested += 1;\n appendPerformanceSample(active.samples.frameApplyMs, performance.now() - applyStarted);\n }\n previous.awaitingResync = true;\n postToRenderer({ type: \"frame-resync-needed\", sessionHandle: id });\n return;\n }\n if (admission === \"install\") {\n installGlyphDefinitions(previous, glyphDefinitions);\n installStyleDefinitions(previous, styleDefinitions);\n }\n }\n if (!previous.catalogFallback && !nativeTextAnnounced && glyphDefinitions.length > 0) {\n nativeTextAnnounced = true;\n postToRenderer({ type: \"renderer-status\", backend: renderer?.kind ?? \"starting\", textEngine: \"native\" });\n }\n if (clipboardSection) {\n postToRenderer({ type: \"clipboard-write\", text: decodeClipboardWrite(clipboardSection) });\n }\n if (scrollbarSection) {\n const decoded = decodeScrollbarState(scrollbarSection);\n const scrollbar = {\n total: Number(decoded.total),\n offset: Number(decoded.offset),\n length: Number(decoded.length),\n };\n if (\n !Number.isSafeInteger(scrollbar.total) ||\n !Number.isSafeInteger(scrollbar.offset) ||\n !Number.isSafeInteger(scrollbar.length)\n )\n throw new RangeError(\"Scrollbar state exceeds JavaScript's safe integer range\");\n if (\n !previous.scrollbar ||\n previous.scrollbar.total !== scrollbar.total ||\n previous.scrollbar.offset !== scrollbar.offset ||\n previous.scrollbar.length !== scrollbar.length\n ) {\n previous.scrollbar = scrollbar;\n postToRenderer({ type: \"scrollbar-state\", sessionHandle: id, scrollbar });\n }\n }\n\n const full = (rowSection.flags & 1) !== 0;\n const useNativeCatalog = !previous.catalogFallback;\n const rows = full ? Array<string>(frame.rows).fill(\"\") : previous.rows.slice();\n const nativeRows = full\n ? Array.from({ length: frame.rows }, () => [] as GlyphInstance[])\n : previous.nativeRows.slice();\n const nativeStyleRows = full\n ? Array.from({ length: frame.rows }, () => [] as StyleRun[])\n : previous.nativeStyleRows.slice();\n const rowRevisions = full ? Array<bigint>(frame.rows).fill(0n) : previous.rowRevisions.slice();\n const replacements = decodeRowReplacements(rowSection);\n const damagedRows: number[] = [];\n if (active) active.frames.rowsDecoded += replacements.length;\n for (const replacement of replacements) {\n if (replacement.row >= frame.rows) throw new RangeError(\"Row replacement exceeds viewport\");\n if (replacement.revision < (rowRevisions[replacement.row] ?? 0n)) continue;\n rows[replacement.row] = replacement.text;\n nativeRows[replacement.row] = useNativeCatalog ? replacement.glyphs : [];\n nativeStyleRows[replacement.row] = useNativeCatalog ? replacement.styles : [];\n rowRevisions[replacement.row] = replacement.revision;\n damagedRows.push(replacement.row);\n }\n previous.rows = rows;\n previous.nativeRows = nativeRows;\n previous.nativeStyleRows = nativeStyleRows;\n previous.rowRevisions = rowRevisions;\n const geometryChanged = damagedRows.length > 0;\n const previousCursor = previous.cursor;\n const nextCursor = decodeCursorState(cursorSection);\n const cursorChanged =\n nextCursor.x !== previousCursor.x ||\n nextCursor.y !== previousCursor.y ||\n nextCursor.visible !== previousCursor.visible ||\n nextCursor.style !== previousCursor.style ||\n nextCursor.blinking !== previousCursor.blinking;\n previous.cursor = nextCursor;\n previous.layoutEpoch = frame.layoutEpoch;\n previous.sessionEpoch = frame.sessionEpoch;\n previous.sequence = frame.frameSequence;\n previous.awaitingResync = false;\n if (completingResync) postToRenderer({ type: \"frame-resync-complete\", sessionHandle: id });\n const requiresFullRedraw = full || changedSession || completingResync;\n if (!requiresFullRedraw && cursorChanged) damagedRows.push(previousCursor.y, nextCursor.y);\n const hasRowDamage = damagedRows.length > 0;\n for (const surfaceId of surfaceIdsForSession(id)) {\n if (cursorChanged) scheduleCursorBlink(surfaceId, true);\n if (requiresFullRedraw) invalidateFull(surfaceId);\n else if (hasRowDamage) invalidateRows(surfaceId, damagedRows, geometryChanged);\n }\n // Announced only once the frame is committed and its redraw scheduled, so a\n // consumer waiting on recovery is never told \"done\" ahead of the pixels.\n postToRenderer({\n type: \"frame-committed\",\n sessionHandle: id,\n sessionEpoch: frame.sessionEpoch,\n frameSequence: frame.frameSequence,\n // A resume publishes a full refresh, and `classifyFrame` only accepts a\n // resync-completing frame that carries one, so this flag is what tells a\n // recovered screen apart from a partial update of the stale one.\n fullSnapshot: fullFrame,\n });\n if (active) appendPerformanceSample(active.samples.frameApplyMs, performance.now() - applyStarted);\n}\n\nself.onmessage = (event: MessageEvent<RendererToWorkerMessage>) => {\n const message = event.data;\n try {\n if (message.type === \"mount\") {\n void mount(message.surfaceId, message.sessionHandle, message.canvas).catch((error) => {\n console.error(\"[terminal-renderer] mount failed\", error);\n });\n } else if (message.type === \"renderer-config\") {\n forceCanvasFallback = Boolean(message.forceCanvasFallback);\n } else if (message.type === \"partial-rendering\") {\n partialRenderingEnabled = Boolean(message.enabled);\n for (const id of mounts.keys()) invalidateFull(id);\n } else if (message.type === \"unmount\") {\n mounts.delete(message.surfaceId);\n dirty.delete(message.surfaceId);\n deleteSurface(message.surfaceId);\n occluded.delete(message.surfaceId);\n frozenCursors.delete(message.surfaceId);\n renderer?.unmount(message.surfaceId);\n const timer = cursorBlinkTimers.get(message.surfaceId);\n if (timer !== undefined) clearTimeout(timer);\n cursorBlinkTimers.delete(message.surfaceId);\n // The session may be remounted after zoom/layout changes. Keep its decoded\n // snapshot; only drop-session represents terminal lifetime ending.\n } else if (message.type === \"drop-session\") {\n for (const surfaceId of surfaceIdsForSession(message.sessionHandle)) {\n mounts.delete(surfaceId);\n dirty.delete(surfaceId);\n surfaces.delete(surfaceId);\n occluded.delete(surfaceId);\n frozenCursors.delete(surfaceId);\n renderer?.unmount(surfaceId);\n const timer = cursorBlinkTimers.get(surfaceId);\n if (timer !== undefined) clearTimeout(timer);\n cursorBlinkTimers.delete(surfaceId);\n }\n surfaceIdsBySession.delete(message.sessionHandle);\n dropSessionSnapshot(message.sessionHandle);\n presentationDefaults.delete(message.sessionHandle);\n performanceMeasurement?.lastFrameAt.delete(message.sessionHandle);\n } else if (message.type === \"resize\") {\n const mounted = mounts.get(message.surfaceId);\n if (!mounted) return;\n const nextSize = { width: message.width, height: message.height, dpr: message.dpr };\n const changed = renderedSizeChanged(mounted.size, nextSize);\n mounted.size = nextSize;\n if (!changed) return;\n renderer?.resize(message.surfaceId, mounted.size);\n invalidateFull(message.surfaceId);\n } else if (message.type === \"frame\") {\n try {\n applyFrame(message.packet);\n } finally {\n returnFrameCredit(message.packet.byteLength);\n }\n } else if (message.type === \"frame-gap\") {\n for (const sessionHandle of message.sessionHandles) {\n const session = snapshot(sessionHandle);\n if (session.awaitingResync) continue;\n session.awaitingResync = true;\n postToRenderer({ type: \"frame-resync-needed\", sessionHandle });\n }\n } else if (message.type === \"expect-full\") {\n snapshot(message.sessionHandle).awaitingResync = true;\n } else if (message.type === \"theme\") {\n if (message.surfaceId) {\n surface(message.surfaceId, message.sessionHandle).theme = message.theme;\n invalidateFull(message.surfaceId);\n } else {\n defaults(message.sessionHandle).theme = message.theme;\n for (const surfaceId of surfaceIdsForSession(message.sessionHandle)) {\n surfaces.get(surfaceId)!.theme = message.theme;\n invalidateFull(surfaceId);\n }\n }\n } else if (message.type === \"effects\") {\n if (message.surfaceId) {\n surface(message.surfaceId, message.sessionHandle).effects = message.effects;\n invalidateFull(message.surfaceId);\n } else {\n defaults(message.sessionHandle).effects = message.effects;\n for (const surfaceId of surfaceIdsForSession(message.sessionHandle)) {\n surfaces.get(surfaceId)!.effects = message.effects;\n invalidateFull(surfaceId);\n }\n }\n scheduleShaderAnimation();\n } else if (message.type === \"selection\") {\n if (message.surfaceId) {\n surface(message.surfaceId, message.sessionHandle).selection = message.selection;\n invalidateFull(message.surfaceId);\n } else {\n defaults(message.sessionHandle).selection = message.selection;\n for (const surfaceId of surfaceIdsForSession(message.sessionHandle)) {\n surfaces.get(surfaceId)!.selection = message.selection;\n invalidateFull(surfaceId);\n }\n }\n } else if (message.type === \"visibility\") {\n if (!message.surfaceId) defaults(message.sessionHandle).visible = message.visible;\n if (message.surfaceId) surface(message.surfaceId, message.sessionHandle);\n const targetIds = message.surfaceId ? [message.surfaceId] : surfaceIdsForSession(message.sessionHandle);\n for (const surfaceId of targetIds) {\n if (message.visible) {\n occluded.delete(surfaceId);\n invalidateFull(surfaceId);\n scheduleCursorBlink(surfaceId, true);\n } else {\n occluded.add(surfaceId);\n const timer = cursorBlinkTimers.get(surfaceId);\n if (timer !== undefined) clearTimeout(timer);\n cursorBlinkTimers.delete(surfaceId);\n }\n }\n scheduleShaderAnimation();\n } else if (message.type === \"focus\") {\n const value = surface(message.surfaceId, message.sessionHandle);\n value.focused = Boolean(message.focused);\n scheduleCursorBlink(message.surfaceId, value.focused);\n invalidateRows(message.surfaceId, [snapshot(message.sessionHandle).cursor.y]);\n scheduleShaderAnimation();\n } else if (message.type === \"cursor-frozen\") {\n const value = surfaces.get(message.surfaceId);\n if (!value) return;\n if (message.frozen) {\n frozenCursors.add(message.surfaceId);\n const timer = cursorBlinkTimers.get(message.surfaceId);\n if (timer !== undefined) clearTimeout(timer);\n cursorBlinkTimers.delete(message.surfaceId);\n // Rest on the visible half of the blink so the frozen screen shows the\n // cursor where the host left it.\n if (!value.cursorBlinkVisible) {\n value.cursorBlinkVisible = true;\n invalidateRows(message.surfaceId, [snapshot(value.sessionHandle).cursor.y]);\n }\n } else {\n frozenCursors.delete(message.surfaceId);\n scheduleCursorBlink(message.surfaceId, true);\n }\n } else if (message.type === \"cursor-activity\") {\n const session = snapshot(message.sessionHandle);\n for (const surfaceId of surfaceIdsForSession(message.sessionHandle)) {\n const value = surfaces.get(surfaceId)!;\n const changesPixels = cursorActivityChangesPixels(session.cursor, value.focused, value.cursorBlinkVisible);\n scheduleCursorBlink(surfaceId, true);\n if (changesPixels) invalidateRows(surfaceId, [session.cursor.y]);\n }\n } else if (message.type === \"force-full-redraw\") {\n invalidateSessionFull(message.sessionHandle);\n } else if (message.type === \"force-row-redraw\") {\n invalidateSessionRows(message.sessionHandle, [message.row]);\n } else if (message.type === \"performance-start\") {\n void ensureRenderer()\n .then(() => {\n beginPerformanceMeasurement();\n postToRenderer({ type: \"performance-started\", requestId: message.requestId });\n })\n .catch((error) => console.error(\"[terminal-renderer] failed to start performance measurement\", error));\n } else if (message.type === \"performance-finish\") {\n void finishPerformanceMeasurement(message.requestId, message.quietMs, message.timeoutMs).catch((error) => {\n console.error(\"[terminal-renderer] failed to finish performance measurement\", error);\n });\n }\n } catch (error) {\n console.error(\"[terminal-renderer] rejected worker message\", error);\n }\n};\n"],
5
- "mappings": "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",
3
+ "sources": ["../../ghosttea-frame/src/index.ts", "../src/performance.ts", "../src/renderers/types.ts", "../src/renderers/canvas-renderer.ts", "../src/cell-width.ts", "../src/renderers/render-damage.ts", "../src/renderers/shader-effects.ts", "../src/renderers/webgpu-renderer.ts", "../src/frame-sequence.ts", "../src/cursor-invalidation.ts", "../src/catalog-budget.ts", "../../ghosttea-protocol/src/routed.ts", "../src/routed-frames.ts", "../src/terminal-render.worker.ts"],
4
+ "sourcesContent": ["export const FRAME_MAGIC = 0x31465254;\nexport const FRAME_PROTOCOL_VERSION = 1;\nexport const FRAME_HEADER_BYTES = 64;\nexport const SECTION_HEADER_BYTES = 16;\nexport const MAX_FRAME_BYTES = 16 * 1024 * 1024;\nexport const FrameFlag = {\n FullSnapshot: 1 << 0,\n MouseTracking: 1 << 1,\n CatalogReset: 1 << 2,\n} as const;\n\nexport enum SectionKind {\n GlyphDefinitions = 1,\n StyleDefinitions = 2,\n RowReplacements = 3,\n CursorState = 4,\n SelectionSpans = 5,\n ImageDefinitions = 6,\n ImagePlacements = 7,\n ScrollbarState = 8,\n ViewportMetadata = 9,\n AccessibilityText = 10,\n ClipboardWrite = 11,\n}\n\nexport interface FrameSection {\n kind: SectionKind;\n flags: number;\n itemCount: number;\n bytes: Uint8Array;\n}\n\nexport interface TerminalFrame {\n protocolVersion: number;\n flags: number;\n sessionHandle: bigint;\n viewHandle: bigint;\n sessionEpoch: bigint;\n layoutEpoch: bigint;\n frameSequence: bigint;\n terminalRevision: bigint;\n cols: number;\n rows: number;\n sections: FrameSection[];\n}\n\nexport interface TextRow {\n row: number;\n text: string;\n}\n\nexport interface RowReplacement extends TextRow {\n revision: bigint;\n glyphs: GlyphInstance[];\n styles: StyleRun[];\n}\n\nexport enum GlyphFormat {\n Alpha8 = 0,\n Rgba8Premultiplied = 1,\n}\n\nexport interface GlyphDefinition {\n id: number;\n width: number;\n height: number;\n bearingX: number;\n bearingY: number;\n format: GlyphFormat;\n pixels: Uint8Array;\n}\n\nexport interface GlyphInstance {\n glyphId: number;\n styleId: number;\n x: number;\n y: number;\n width: number;\n height: number;\n cellStart: number;\n cellSpan: number;\n}\n\nexport interface StyleDefinition {\n id: number;\n bold: boolean;\n italic: boolean;\n faint: boolean;\n inverse: boolean;\n invisible: boolean;\n strikethrough: boolean;\n underline: boolean;\n foreground?: readonly [number, number, number];\n background?: readonly [number, number, number];\n}\n\nexport interface StyleRun {\n styleId: number;\n cellStart: number;\n cellSpan: number;\n}\n\nexport interface CursorState {\n x: number;\n y: number;\n visible: boolean;\n style: CursorStyle;\n blinking: boolean;\n}\n\nexport interface ScrollbarState {\n total: bigint;\n offset: bigint;\n length: bigint;\n}\n\nexport enum CursorStyle {\n Bar = 0,\n Block = 1,\n Underline = 2,\n HollowBlock = 3,\n}\n\nfunction assertRange(condition: boolean, message: string): asserts condition {\n if (!condition) throw new RangeError(`Invalid terminal frame: ${message}`);\n}\n\nexport function decodeFrame(buffer: ArrayBuffer): TerminalFrame {\n assertRange(buffer.byteLength >= FRAME_HEADER_BYTES, \"truncated header\");\n assertRange(buffer.byteLength <= MAX_FRAME_BYTES, \"packet exceeds limit\");\n const view = new DataView(buffer);\n assertRange(view.getUint32(0, true) === FRAME_MAGIC, \"bad magic\");\n assertRange(view.getUint16(4, true) === FRAME_PROTOCOL_VERSION, \"unsupported protocol version\");\n\n const sectionCount = view.getUint16(60, true);\n const tableEnd = FRAME_HEADER_BYTES + sectionCount * SECTION_HEADER_BYTES;\n assertRange(tableEnd <= buffer.byteLength, \"truncated section table\");\n\n const sections: FrameSection[] = [];\n for (let index = 0; index < sectionCount; index += 1) {\n const base = FRAME_HEADER_BYTES + index * SECTION_HEADER_BYTES;\n const kind = view.getUint16(base, true) as SectionKind;\n const flags = view.getUint16(base + 2, true);\n const offset = view.getUint32(base + 4, true);\n const length = view.getUint32(base + 8, true);\n const itemCount = view.getUint32(base + 12, true);\n const end = offset + length;\n assertRange(end >= offset && offset >= tableEnd && end <= buffer.byteLength, \"section out of bounds\");\n sections.push({ kind, flags, itemCount, bytes: new Uint8Array(buffer, offset, length) });\n }\n\n return {\n protocolVersion: view.getUint16(4, true),\n flags: view.getUint16(6, true),\n sessionHandle: view.getBigUint64(8, true),\n viewHandle: view.getBigUint64(16, true),\n sessionEpoch: view.getBigUint64(24, true),\n layoutEpoch: view.getBigUint64(32, true),\n frameSequence: view.getBigUint64(40, true),\n terminalRevision: view.getBigUint64(48, true),\n cols: view.getUint16(56, true),\n rows: view.getUint16(58, true),\n sections,\n };\n}\n\nexport function decodeAccessibilityRows(section: FrameSection): TextRow[] {\n const view = new DataView(section.bytes.buffer, section.bytes.byteOffset, section.bytes.byteLength);\n assertRange(section.bytes.byteLength >= 2, \"truncated text row header\");\n const count = view.getUint16(0, true);\n assertRange(count === section.itemCount, \"text row count mismatch\");\n const decoder = new TextDecoder(\"utf-8\", { fatal: true });\n const rows: TextRow[] = [];\n let offset = 2;\n for (let index = 0; index < count; index += 1) {\n assertRange(offset + 6 <= section.bytes.byteLength, \"truncated text row\");\n const row = view.getUint16(offset, true);\n const length = view.getUint32(offset + 2, true);\n offset += 6;\n assertRange(offset + length <= section.bytes.byteLength, \"text row payload out of bounds\");\n rows.push({ row, text: decoder.decode(section.bytes.subarray(offset, offset + length)) });\n offset += length;\n }\n assertRange(offset === section.bytes.byteLength, \"trailing text row bytes\");\n return rows;\n}\n\nexport function decodeRowReplacements(section: FrameSection): RowReplacement[] {\n assertRange(section.kind === SectionKind.RowReplacements, \"wrong row replacement section kind\");\n assertRange(section.bytes.byteLength >= 2, \"truncated row replacement header\");\n const view = new DataView(section.bytes.buffer, section.bytes.byteOffset, section.bytes.byteLength);\n const count = view.getUint16(0, true);\n assertRange(count === section.itemCount, \"row replacement count mismatch\");\n const decoder = new TextDecoder(\"utf-8\", { fatal: true });\n const rows: RowReplacement[] = [];\n let offset = 2;\n for (let index = 0; index < count; index += 1) {\n assertRange(offset + 18 <= section.bytes.byteLength, \"truncated row replacement\");\n const row = view.getUint16(offset, true);\n const revision = view.getBigUint64(offset + 2, true);\n const length = view.getUint32(offset + 10, true);\n const glyphCount = view.getUint16(offset + 14, true);\n const styleCount = view.getUint16(offset + 16, true);\n offset += 18;\n assertRange(offset + length <= section.bytes.byteLength, \"row replacement payload out of bounds\");\n const text = decoder.decode(section.bytes.subarray(offset, offset + length));\n offset += length;\n const glyphs: GlyphInstance[] = [];\n for (let glyphIndex = 0; glyphIndex < glyphCount; glyphIndex += 1) {\n assertRange(offset + 28 <= section.bytes.byteLength, \"truncated glyph instance\");\n glyphs.push({\n glyphId: view.getUint32(offset, true),\n styleId: view.getUint32(offset + 4, true),\n x: view.getFloat32(offset + 8, true),\n y: view.getFloat32(offset + 12, true),\n width: view.getFloat32(offset + 16, true),\n height: view.getFloat32(offset + 20, true),\n cellStart: view.getUint16(offset + 24, true),\n cellSpan: view.getUint16(offset + 26, true),\n });\n offset += 28;\n }\n const styles: StyleRun[] = [];\n for (let styleIndex = 0; styleIndex < styleCount; styleIndex += 1) {\n assertRange(offset + 8 <= section.bytes.byteLength, \"truncated row style run\");\n styles.push({\n styleId: view.getUint32(offset, true),\n cellStart: view.getUint16(offset + 4, true),\n cellSpan: view.getUint16(offset + 6, true),\n });\n offset += 8;\n }\n rows.push({ row, revision, text, glyphs, styles });\n }\n assertRange(offset === section.bytes.byteLength, \"trailing row replacement bytes\");\n return rows;\n}\n\nexport function decodeGlyphDefinitions(section: FrameSection): GlyphDefinition[] {\n assertRange(section.kind === SectionKind.GlyphDefinitions, \"wrong glyph definition section kind\");\n assertRange(section.bytes.byteLength >= 4, \"truncated glyph definition header\");\n const view = new DataView(section.bytes.buffer, section.bytes.byteOffset, section.bytes.byteLength);\n const count = view.getUint32(0, true);\n assertRange(count === section.itemCount, \"glyph definition count mismatch\");\n const definitions: GlyphDefinition[] = [];\n let offset = 4;\n for (let index = 0; index < count; index += 1) {\n assertRange(offset + 20 <= section.bytes.byteLength, \"truncated glyph definition\");\n const format = view.getUint8(offset + 12) as GlyphFormat;\n assertRange(format === GlyphFormat.Alpha8 || format === GlyphFormat.Rgba8Premultiplied, \"invalid glyph format\");\n assertRange(\n view.getUint8(offset + 13) === 0 && view.getUint16(offset + 14, true) === 0,\n \"nonzero glyph reserved bytes\",\n );\n const pixelLength = view.getUint32(offset + 16, true);\n const width = view.getUint16(offset + 4, true);\n const height = view.getUint16(offset + 6, true);\n const expectedLength = width * height * (format === GlyphFormat.Alpha8 ? 1 : 4);\n assertRange(pixelLength === expectedLength, \"glyph pixel length mismatch\");\n offset += 20;\n assertRange(offset + pixelLength <= section.bytes.byteLength, \"glyph pixels out of bounds\");\n definitions.push({\n id: view.getUint32(offset - 20, true),\n width,\n height,\n bearingX: view.getInt16(offset - 12, true),\n bearingY: view.getInt16(offset - 10, true),\n format,\n pixels: section.bytes.slice(offset, offset + pixelLength),\n });\n offset += pixelLength;\n }\n assertRange(offset === section.bytes.byteLength, \"trailing glyph definition bytes\");\n return definitions;\n}\n\nexport function decodeStyleDefinitions(section: FrameSection): StyleDefinition[] {\n assertRange(section.kind === SectionKind.StyleDefinitions, \"wrong style definition section kind\");\n assertRange(section.bytes.byteLength >= 4, \"truncated style definition header\");\n const view = new DataView(section.bytes.buffer, section.bytes.byteOffset, section.bytes.byteLength);\n const count = view.getUint32(0, true);\n assertRange(count === section.itemCount, \"style definition count mismatch\");\n assertRange(section.bytes.byteLength === 4 + count * 16, \"invalid style definition length\");\n const styles: StyleDefinition[] = [];\n for (let index = 0; index < count; index += 1) {\n const offset = 4 + index * 16;\n const flags = view.getUint16(offset + 4, true);\n const foregroundKind = view.getUint8(offset + 6);\n const backgroundKind = view.getUint8(offset + 7);\n assertRange((flags & ~0x7f) === 0, \"invalid style flags\");\n assertRange(foregroundKind <= 1 && backgroundKind <= 1, \"invalid style color kind\");\n assertRange(view.getUint16(offset + 14, true) === 0, \"nonzero style reserved bytes\");\n styles.push({\n id: view.getUint32(offset, true),\n bold: (flags & 1) !== 0,\n italic: (flags & 2) !== 0,\n faint: (flags & 4) !== 0,\n inverse: (flags & 8) !== 0,\n invisible: (flags & 16) !== 0,\n strikethrough: (flags & 32) !== 0,\n underline: (flags & 64) !== 0,\n ...(foregroundKind === 1\n ? { foreground: [view.getUint8(offset + 8), view.getUint8(offset + 9), view.getUint8(offset + 10)] as const }\n : {}),\n ...(backgroundKind === 1\n ? { background: [view.getUint8(offset + 11), view.getUint8(offset + 12), view.getUint8(offset + 13)] as const }\n : {}),\n });\n }\n return styles;\n}\n\nexport function decodeCursorState(section: FrameSection): CursorState {\n assertRange(section.kind === SectionKind.CursorState, \"wrong cursor section kind\");\n assertRange(section.itemCount === 1, \"cursor item count mismatch\");\n assertRange(section.bytes.byteLength === 8, \"invalid cursor payload length\");\n const view = new DataView(section.bytes.buffer, section.bytes.byteOffset, section.bytes.byteLength);\n const visible = view.getUint8(4);\n const style = view.getUint8(5) as CursorStyle;\n const blinking = view.getUint8(6);\n assertRange(visible <= 1, \"invalid cursor visibility\");\n assertRange(style <= CursorStyle.HollowBlock, \"invalid cursor style\");\n assertRange(blinking <= 1, \"invalid cursor blinking state\");\n assertRange(view.getUint8(7) === 0, \"nonzero cursor reserved byte\");\n return {\n x: view.getUint16(0, true),\n y: view.getUint16(2, true),\n visible: visible === 1,\n style,\n blinking: blinking === 1,\n };\n}\n\nexport function decodeScrollbarState(section: FrameSection): ScrollbarState {\n assertRange(section.kind === SectionKind.ScrollbarState, \"wrong scrollbar section kind\");\n assertRange(section.itemCount === 1, \"scrollbar item count mismatch\");\n assertRange(section.bytes.byteLength === 24, \"invalid scrollbar payload size\");\n const view = new DataView(section.bytes.buffer, section.bytes.byteOffset, section.bytes.byteLength);\n const total = view.getBigUint64(0, true);\n const offset = view.getBigUint64(8, true);\n const length = view.getBigUint64(16, true);\n assertRange(length <= total, \"scrollbar viewport exceeds total rows\");\n assertRange(offset <= total - length, \"scrollbar offset exceeds scrollable range\");\n return { total, offset, length };\n}\n\nexport function decodeClipboardWrite(section: FrameSection): string {\n assertRange(section.kind === SectionKind.ClipboardWrite, \"wrong clipboard section kind\");\n assertRange(section.itemCount === 1, \"clipboard item count mismatch\");\n assertRange(section.bytes.byteLength >= 4, \"truncated clipboard payload\");\n const view = new DataView(section.bytes.buffer, section.bytes.byteOffset, section.bytes.byteLength);\n const length = view.getUint32(0, true);\n assertRange(length === section.bytes.byteLength - 4, \"clipboard length mismatch\");\n return new TextDecoder(\"utf-8\", { fatal: true }).decode(section.bytes.subarray(4));\n}\n", "export interface TerminalRenderMetrics {\n queueSubmits: number;\n fullRenders: number;\n partialRenders: number;\n damagedRows: number;\n geometryCacheHits: number;\n geometryCacheMisses: number;\n canvasPixels: number;\n renderPasses: number;\n drawCalls: number;\n rectangleVertices: number;\n monoGlyphVertices: number;\n colorGlyphVertices: number;\n fallbackGlyphVertices: number;\n vertexUploadBytes: number;\n atlasUploadBytes: number;\n atlasUploadCalls: number;\n}\n\nexport interface TerminalRenderPerformanceSnapshot {\n backend: string;\n durationMs: number;\n timedOutWaitingForIdle: boolean;\n gpuQueueDrainMs: number | null;\n frames: {\n received: number;\n bytes: number;\n full: number;\n incremental: number;\n stale: number;\n resyncRequested: number;\n rowsDecoded: number;\n glyphDefinitions: number;\n };\n scheduling: {\n flushes: number;\n renderCalls: number;\n maximumDirtyPanes: number;\n panesPerFlush: number[];\n };\n renderer: {\n queueSubmits: number;\n fullRenders: number;\n partialRenders: number;\n damagedRows: number;\n geometryCacheHits: number;\n geometryCacheMisses: number;\n canvasPixelFrames: number;\n renderPasses: number;\n drawCalls: number;\n rectangleVertices: number;\n monoGlyphVertices: number;\n colorGlyphVertices: number;\n fallbackGlyphVertices: number;\n vertexUploadBytes: number;\n atlasUploadBytes: number;\n atlasUploadCalls: number;\n };\n samples: {\n frameApplyMs: number[];\n renderCpuMs: number[];\n dirtyToRenderMs: number[];\n frameArrivalToRenderMs: number[];\n };\n}\n\n/** Cheap, monotonic production counters. Reading them never waits for GPU idle. */\nexport interface TerminalRenderCounterSnapshot {\n backend: string;\n durationMs: number;\n frames: {\n received: number;\n bytes: number;\n full: number;\n incremental: number;\n stale: number;\n decodes: number;\n applies: number;\n };\n renderer: {\n queueSubmits: number;\n presents: number;\n };\n flow: {\n creditBytesReturned: number;\n creditBatchesReturned: number;\n };\n sessions: Record<\n string,\n {\n received: number;\n bytes: number;\n full: number;\n incremental: number;\n stale: number;\n decodes: number;\n applies: number;\n }\n >;\n}\n\nexport function emptyRenderMetrics(): TerminalRenderMetrics {\n return {\n queueSubmits: 0,\n fullRenders: 0,\n partialRenders: 0,\n damagedRows: 0,\n geometryCacheHits: 0,\n geometryCacheMisses: 0,\n canvasPixels: 0,\n renderPasses: 0,\n drawCalls: 0,\n rectangleVertices: 0,\n monoGlyphVertices: 0,\n colorGlyphVertices: 0,\n fallbackGlyphVertices: 0,\n vertexUploadBytes: 0,\n atlasUploadBytes: 0,\n atlasUploadCalls: 0,\n };\n}\n", "import {\n CursorStyle,\n type CursorState,\n type GlyphDefinition,\n type GlyphInstance,\n type StyleDefinition,\n type StyleRun,\n} from \"@vibecook/ghosttea-frame\";\nimport type { TerminalRenderMetrics } from \"../performance.js\";\n\nexport type Rgba = readonly [number, number, number, number];\n\nexport interface TerminalTheme {\n background: Rgba;\n foreground: Rgba;\n cursor: Rgba;\n cursorText?: Rgba;\n selection: Rgba;\n selectionForeground: Rgba;\n /** Apply the window background alpha to explicit cell backgrounds too. */\n backgroundOpacityCells?: boolean;\n}\n\nexport type TerminalPostProcess = \"none\" | \"better-crt\";\nexport type TerminalShaderEffect =\n \"ghosttea:better-crt\" | \"ghosttea:crt\" | \"ghosttea:vhs\" | \"ghosttea:sparks-from-fire\";\n\nexport interface TerminalEffects {\n postProcess: TerminalPostProcess;\n shaderEffects?: readonly TerminalShaderEffect[];\n animate?: boolean;\n}\n\nconst ANIMATED_SHADER_EFFECTS: ReadonlySet<TerminalShaderEffect> = new Set([\n \"ghosttea:vhs\",\n \"ghosttea:sparks-from-fire\",\n]);\n\nexport function terminalEffectsNeedAnimation(effects: TerminalEffects): boolean {\n return (\n effects.animate === true && (effects.shaderEffects?.some((effect) => ANIMATED_SHADER_EFFECTS.has(effect)) ?? false)\n );\n}\n\nexport interface CellPoint {\n column: number;\n row: number;\n}\n\nexport interface CellSelection {\n anchor: CellPoint;\n focus: CellPoint;\n}\n\nexport interface RenderView {\n rows: string[];\n nativeRows: GlyphInstance[][];\n nativeStyleRows: StyleRun[][];\n rowRevisions: readonly bigint[];\n glyphDefinitions: Map<number, GlyphDefinition>;\n styleDefinitions: Map<number, StyleDefinition>;\n sessionEpoch: bigint;\n layoutEpoch: bigint;\n cursor: CursorState;\n focused: boolean;\n cursorBlinkVisible: boolean;\n selection: CellSelection | null;\n theme: TerminalTheme;\n effects?: TerminalEffects;\n damage?: RenderDamage;\n}\n\nexport interface RenderDamage {\n full: boolean;\n rows: ReadonlySet<number>;\n geometryChanged: boolean;\n}\n\nexport function effectiveCursorStyle(view: RenderView): CursorStyle | null {\n if (!view.cursor.visible) return null;\n if (!view.focused) return CursorStyle.HollowBlock;\n if (view.cursor.blinking && !view.cursorBlinkVisible) return null;\n return view.cursor.style;\n}\n\nexport interface PixelSize {\n width: number;\n height: number;\n dpr: number;\n}\n\nfunction physicalPixels(value: number, dpr: number): number {\n return Math.max(1, Math.round(value * dpr));\n}\n\nexport function renderedSizeChanged(current: PixelSize, next: PixelSize): boolean {\n return (\n current.dpr !== next.dpr ||\n physicalPixels(current.width, current.dpr) !== physicalPixels(next.width, next.dpr) ||\n physicalPixels(current.height, current.dpr) !== physicalPixels(next.height, next.dpr)\n );\n}\n\nexport interface TerminalRenderer {\n readonly kind: \"webgpu\" | \"canvas2d\";\n mount(id: string, canvas: OffscreenCanvas): void;\n unmount(id: string): void;\n resize(id: string, size: PixelSize): void;\n render(id: string, view: RenderView): TerminalRenderMetrics | undefined;\n renderBatch?(entries: ReadonlyArray<{ id: string; view: RenderView }>): Array<TerminalRenderMetrics | undefined>;\n setPerformanceMeasurementEnabled?(enabled: boolean): void;\n settle?(): Promise<void>;\n}\n\nexport const DEFAULT_THEME: TerminalTheme = {\n background: [40 / 255, 44 / 255, 52 / 255, 1],\n foreground: [1, 1, 1, 1],\n cursor: [1, 1, 1, 1],\n cursorText: [40 / 255, 44 / 255, 52 / 255, 1],\n selection: [1, 1, 1, 1],\n selectionForeground: [40 / 255, 44 / 255, 52 / 255, 1],\n backgroundOpacityCells: false,\n};\n\nexport const DEFAULT_EFFECTS: TerminalEffects = {\n postProcess: \"none\",\n shaderEffects: [],\n animate: false,\n};\n\nexport const CELL_WIDTH = 7.83;\nexport const LINE_HEIGHT = 19;\n// Ghostty defaults window-padding-x/y to two device-independent points.\nexport const ORIGIN_X = 2;\nexport const ORIGIN_Y = 2;\n", "import { CursorStyle } from \"@vibecook/ghosttea-frame\";\nimport { emptyRenderMetrics, type TerminalRenderMetrics } from \"../performance.js\";\nimport {\n CELL_WIDTH,\n LINE_HEIGHT,\n ORIGIN_X,\n ORIGIN_Y,\n effectiveCursorStyle,\n renderedSizeChanged,\n type CellPoint,\n type PixelSize,\n type RenderView,\n type Rgba,\n type TerminalRenderer,\n} from \"./types.js\";\n\ninterface CanvasSurface extends PixelSize {\n canvas: OffscreenCanvas;\n context: OffscreenCanvasRenderingContext2D;\n}\n\nfunction css(color: Rgba): string {\n const [red, green, blue, alpha] = color;\n return `rgba(${Math.round(red * 255)}, ${Math.round(green * 255)}, ${Math.round(blue * 255)}, ${alpha})`;\n}\n\nfunction ordered(selection: RenderView[\"selection\"]): [CellPoint, CellPoint] | null {\n if (!selection) return null;\n const { anchor, focus } = selection;\n return anchor.row < focus.row || (anchor.row === focus.row && anchor.column <= focus.column)\n ? [anchor, focus]\n : [focus, anchor];\n}\n\nexport class CanvasTerminalRenderer implements TerminalRenderer {\n readonly kind = \"canvas2d\" as const;\n readonly #surfaces = new Map<string, CanvasSurface>();\n #performanceMeasurementEnabled = false;\n\n setPerformanceMeasurementEnabled(enabled: boolean): void {\n this.#performanceMeasurementEnabled = enabled;\n }\n\n mount(id: string, canvas: OffscreenCanvas): void {\n const context = canvas.getContext(\"2d\", { alpha: true });\n if (!context) throw new Error(\"Canvas2D worker backend unavailable\");\n this.#surfaces.set(id, { canvas, context, width: 1, height: 1, dpr: 1 });\n }\n\n unmount(id: string): void {\n this.#surfaces.delete(id);\n }\n\n resize(id: string, size: PixelSize): void {\n const surface = this.#surfaces.get(id);\n if (!surface) return;\n const changed = renderedSizeChanged(surface, size);\n Object.assign(surface, size);\n if (!changed) return;\n surface.canvas.width = Math.max(1, Math.round(size.width * size.dpr));\n surface.canvas.height = Math.max(1, Math.round(size.height * size.dpr));\n }\n\n render(id: string, view: RenderView): TerminalRenderMetrics | undefined {\n const surface = this.#surfaces.get(id);\n if (!surface) return;\n const { context, width, height, dpr } = surface;\n context.clearRect(0, 0, surface.canvas.width, surface.canvas.height);\n context.save();\n context.setTransform(dpr, 0, 0, dpr, 0, 0);\n context.fillStyle = css(view.theme.background);\n context.fillRect(0, 0, width, height);\n const selection = ordered(view.selection);\n if (selection) {\n context.fillStyle = css(view.theme.selection);\n const [start, end] = selection;\n for (let row = start.row; row <= end.row; row += 1) {\n const first = row === start.row ? start.column : 0;\n const last = row === end.row ? end.column : Math.max(0, view.rows[row]?.length ?? 0);\n context.fillRect(\n ORIGIN_X + first * CELL_WIDTH,\n ORIGIN_Y + row * LINE_HEIGHT,\n Math.max(1, last - first + 1) * CELL_WIDTH,\n LINE_HEIGHT,\n );\n }\n }\n context.font = \"13px ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace\";\n context.textBaseline = \"top\";\n context.fillStyle = css(view.theme.foreground);\n for (let row = 0; row < view.rows.length; row += 1) {\n context.fillText(view.rows[row] ?? \"\", ORIGIN_X, ORIGIN_Y + row * LINE_HEIGHT);\n }\n if (selection) {\n const [start, end] = selection;\n context.fillStyle = css(view.theme.selectionForeground);\n for (let row = start.row; row <= end.row; row += 1) {\n const first = row === start.row ? start.column : 0;\n const last = row === end.row ? end.column : Math.max(0, view.rows[row]?.length ?? 0);\n context.save();\n context.beginPath();\n context.rect(\n ORIGIN_X + first * CELL_WIDTH,\n ORIGIN_Y + row * LINE_HEIGHT,\n Math.max(1, last - first + 1) * CELL_WIDTH,\n LINE_HEIGHT,\n );\n context.clip();\n context.fillText(view.rows[row] ?? \"\", ORIGIN_X, ORIGIN_Y + row * LINE_HEIGHT);\n context.restore();\n }\n }\n const cursorStyle = effectiveCursorStyle(view);\n if (cursorStyle !== null) {\n const x = ORIGIN_X + view.cursor.x * CELL_WIDTH;\n const y = ORIGIN_Y + view.cursor.y * LINE_HEIGHT;\n const color =\n cursorStyle === CursorStyle.HollowBlock\n ? ([view.theme.cursor[0], view.theme.cursor[1], view.theme.cursor[2], 1] as const)\n : view.theme.cursor;\n context.fillStyle = css(color);\n if (cursorStyle === CursorStyle.Bar) {\n context.fillRect(x, y, 2, LINE_HEIGHT);\n } else if (cursorStyle === CursorStyle.Underline) {\n context.fillRect(x, y + LINE_HEIGHT - 2, CELL_WIDTH, 2);\n } else if (cursorStyle === CursorStyle.HollowBlock) {\n context.strokeStyle = css(color);\n context.lineWidth = 1;\n context.strokeRect(x + 0.5, y + 0.5, CELL_WIDTH - 1, LINE_HEIGHT - 1);\n } else {\n context.fillRect(x, y, CELL_WIDTH, LINE_HEIGHT);\n context.save();\n context.beginPath();\n context.rect(x, y, CELL_WIDTH, LINE_HEIGHT);\n context.clip();\n context.fillStyle = css(view.theme.cursorText ?? view.theme.background);\n context.fillText(view.rows[view.cursor.y] ?? \"\", ORIGIN_X, ORIGIN_Y + view.cursor.y * LINE_HEIGHT);\n context.restore();\n }\n }\n context.restore();\n if (!this.#performanceMeasurementEnabled) return undefined;\n const metrics = emptyRenderMetrics();\n metrics.fullRenders = 1;\n metrics.damagedRows = Math.max(view.rows.length, view.nativeRows.length, view.nativeStyleRows.length);\n metrics.canvasPixels = surface.canvas.width * surface.canvas.height;\n metrics.renderPasses = 1;\n metrics.drawCalls = 1;\n return metrics;\n }\n}\n", "const graphemeSegmenter = new Intl.Segmenter(undefined, { granularity: \"grapheme\" });\n\nexport function splitGraphemes(text: string): string[] {\n return Array.from(graphemeSegmenter.segment(text), ({ segment }) => segment);\n}\n\nexport function graphemeCellWidth(grapheme: string): 1 | 2 {\n const codepoint = grapheme.codePointAt(0) ?? 0;\n return /\\p{Extended_Pictographic}/u.test(grapheme) ||\n (codepoint >= 0x1100 && codepoint <= 0x115f) ||\n (codepoint >= 0x2e80 && codepoint <= 0xa4cf) ||\n (codepoint >= 0xac00 && codepoint <= 0xd7a3) ||\n (codepoint >= 0xf900 && codepoint <= 0xfaff) ||\n (codepoint >= 0xfe10 && codepoint <= 0xfe6f) ||\n (codepoint >= 0xff00 && codepoint <= 0xff60) ||\n (codepoint >= 0x1f300 && codepoint <= 0x1faff) ||\n (codepoint >= 0x20000 && codepoint <= 0x3fffd)\n ? 2\n : 1;\n}\n", "import type { RenderDamage } from \"./types.js\";\n\nexport interface RenderRows {\n full: boolean;\n rows: number[];\n}\n\nexport function rowsForDamage(rowCount: number, damage: RenderDamage | undefined, sceneValid: boolean): RenderRows {\n const full = !sceneValid || !damage || damage.full;\n if (full) return { full: true, rows: Array.from({ length: rowCount }, (_, row) => row) };\n\n const rows = new Set<number>();\n for (const damagedRow of damage.rows) {\n // Native glyph bearings can cross a row boundary. Repaint one neighbor\n // on each side so clearing stale overhang never clips combining marks.\n for (let row = damagedRow - 1; row <= damagedRow + 1; row += 1) {\n if (row >= 0 && row < rowCount) rows.add(row);\n }\n }\n return { full: false, rows: [...rows].sort((left, right) => left - right) };\n}\n", "// One pipeline serves the ordered effect registry. Each pass gets its own\n// uniform buffer and samples the previous pass, allowing an arbitrary stack\n// without recompiling pipelines or reading and writing the same texture.\nexport const SHADER_EFFECT_WGSL: string = /* wgsl */ `\n@group(0) @binding(0) var terminal_image: texture_2d<f32>;\n@group(0) @binding(1) var terminal_sampler: sampler;\n\nstruct EffectConfig {\n mode: u32,\n frame: u32,\n effect_index: u32,\n effect_count: u32,\n resolution: vec2f,\n time: f32,\n time_delta: f32,\n cursor: vec4f,\n}\n@group(0) @binding(2) var<uniform> effect: EffectConfig;\n\n@vertex fn vertex_main(@builtin(vertex_index) vertex_index: u32) -> @builtin(position) vec4f {\n let positions = array<vec2f, 3>(\n vec2f(-1.0, -1.0),\n vec2f(3.0, -1.0),\n vec2f(-1.0, 3.0),\n );\n return vec4f(positions[vertex_index], 0.0, 1.0);\n}\n\nfn sample_image(uv: vec2f) -> vec4f {\n return textureSample(terminal_image, terminal_sampler, clamp(uv, vec2f(0.0), vec2f(1.0)));\n}\n\nfn straight_rgb(sampled: vec4f) -> vec3f {\n if (sampled.a <= 0.00001) { return vec3f(0.0); }\n return sampled.rgb / sampled.a;\n}\n\nfn premultiplied(rgb: vec3f, alpha: f32) -> vec4f {\n return vec4f(max(rgb, vec3f(0.0)) * alpha, alpha);\n}\n\nfn hash21(p0: vec2f) -> f32 {\n var p = fract(p0 * vec2f(443.8975, 397.2973));\n p += dot(p, p.yx + vec2f(19.19));\n return fract(p.x * p.y);\n}\n\n// Existing Better CRT compatibility port. Its source carries the upstream\n// Shadertoy default CC BY-NC-SA terms; this mode preserves the already-bundled\n// behavior while keeping alpha intact.\nfn better_crt(position: vec2f, uv0: vec2f) -> vec4f {\n var uv = uv0;\n var dc = abs(vec2f(0.5) - uv);\n dc *= dc;\n uv.x = (uv.x - 0.5) * (1.0 + dc.y * 0.075) + 0.5;\n uv.y = (uv.y - 0.5) * (1.0 + dc.x * 0.10) + 0.5;\n let scanline = abs(sin(position.y) * 0.125);\n let sampled = sample_image(uv);\n return vec4f(sampled.rgb * (1.0 - scanline), sampled.a);\n}\n\nfn from_srgb1(value: f32) -> f32 {\n return select(pow(value / 1.055 + 0.055 / 1.055, 2.4), value / 12.92, value <= 0.04045);\n}\n\nfn to_srgb1(value: f32) -> f32 {\n return select(1.055 * pow(max(value, 0.0), 0.41666) - 0.055, value * 12.92, value < 0.0031308);\n}\n\nfn from_srgb(value: vec3f) -> vec3f {\n return vec3f(from_srgb1(value.r), from_srgb1(value.g), from_srgb1(value.b));\n}\n\nfn to_srgb(value: vec3f) -> vec3f {\n return vec3f(to_srgb1(value.r), to_srgb1(value.g), to_srgb1(value.b));\n}\n\n// WebGPU adaptation of Timothy Lottes' public-domain CRT scalar. The source\n// port is Unlicensed/public domain. This retains its warp, scan blur, shadow\n// mask, linear-light processing, and corner vignette in a compact GPU form.\nfn public_domain_crt(position: vec2f, uv0: vec2f) -> vec4f {\n let aspect = effect.resolution.x / max(1.0, effect.resolution.y);\n var centered = uv0 * 2.0 - 1.0;\n centered *= vec2f(\n 1.0 + centered.y * centered.y / (50.0 * aspect),\n 1.0 + centered.x * centered.x / 50.0,\n );\n let uv = centered * 0.5 + 0.5;\n let pixel = 1.0 / effect.resolution;\n let center_sample = sample_image(uv);\n let left = from_srgb(straight_rgb(sample_image(uv - vec2f(pixel.x, 0.0))));\n let center = from_srgb(straight_rgb(center_sample));\n let right = from_srgb(straight_rgb(sample_image(uv + vec2f(pixel.x, 0.0))));\n var color = left * 0.18 + center * 0.64 + right * 0.18;\n let scan = 0.58 + 0.42 * pow(max(0.0, cos(position.y * 2.0943951)), 2.0);\n let mask_index = u32(position.x + position.y * 3.0) % 6u;\n var mask = vec3f(0.65);\n if (mask_index < 2u) { mask.r = 1.0; }\n else if (mask_index < 4u) { mask.g = 1.0; }\n else { mask.b = 1.0; }\n color *= scan * mask;\n let vignette_axis = clamp(1.0 - centered * centered, vec2f(0.0), vec2f(1.0));\n color *= mix(0.5, 1.0, vignette_axis.x * vignette_axis.y);\n let peak = max(0.00001, max(color.r, max(color.g, color.b)));\n let tone = peak / (peak * 0.72 + 0.28);\n color *= tone / peak;\n let inside = all(uv >= vec2f(0.0)) && all(uv <= vec2f(1.0));\n let alpha = select(0.0, center_sample.a, inside);\n return premultiplied(to_srgb(color), alpha);\n}\n\n// MIT-licensed VHS effect by Alex Brinsmead, adapted from the upstream GLSL\n// to premultiplied WebGPU output.\nfn vhs(position: vec2f, uv0: vec2f) -> vec4f {\n let distortion = 1.0;\n let tape_wear = 1.75;\n let color_bleed = 2.0;\n var cc = uv0 - 0.5;\n var warped = clamp(uv0 + cc * (dot(cc, cc) * 0.02), vec2f(0.0), vec2f(1.0));\n warped.x += (\n sin(warped.y * 40.0 + effect.time * 0.5) * 0.000375 +\n sin(warped.y * 80.0 + effect.time * 0.2) * 0.0001875 +\n (hash21(vec2f(floor(position.y), floor(effect.time * 20.0))) - 0.5) * 0.0006\n ) * distortion;\n let tracking_y = fract(effect.time * 0.04);\n let band_distance = min(abs(warped.y - tracking_y), 1.0 - abs(warped.y - tracking_y));\n let band = smoothstep(0.05, 0.0, band_distance);\n let horizontal_offset = band * (hash21(vec2f(floor(position.y * 0.5), effect.time * 3.0)) - 0.5) * 0.006;\n let burst_cycle = floor(effect.time / 30.0);\n let burst_start = hash21(vec2f(burst_cycle, 88.0)) * 25.0;\n let burst_time = effect.time - floor(effect.time / 30.0) * 30.0;\n let burst = burst_time > burst_start && burst_time < burst_start + 5.0;\n let jump = select(0.0, (hash21(vec2f(floor(effect.time * 2.0), 11.3)) - 0.5) * 0.08, burst);\n let sample_uv = fract(warped + vec2f(horizontal_offset, jump));\n let aberration = (0.0003 + band * 0.0015) * color_bleed;\n let center_sample = sample_image(sample_uv);\n let red_sample = straight_rgb(sample_image(sample_uv + vec2f(aberration, 0.0)));\n let blue_sample = straight_rgb(sample_image(sample_uv - vec2f(aberration, 0.0)));\n var color = vec3f(red_sample.r, straight_rgb(center_sample).g, blue_sample.b);\n let pixel = 1.0 / effect.resolution.x;\n let neighbor = straight_rgb(sample_image(sample_uv + vec2f(pixel, 0.0))) * 0.4 +\n straight_rgb(sample_image(sample_uv + vec2f(pixel * 3.0, 0.0))) * 0.6;\n let luma_weights = vec3f(0.299, 0.587, 0.114);\n let luma = dot(color, luma_weights);\n color = vec3f(luma) + mix(color - vec3f(luma), neighbor - vec3f(dot(neighbor, luma_weights)), 0.5 * color_bleed);\n color *= 1.8;\n let grain_time = fract(effect.time);\n let noise1 = hash21(position + vec2f(grain_time * 100.0)) - 0.5;\n let noise2 = hash21(position + vec2f(grain_time * 200.0)) - 0.5;\n let gray = dot(color, luma_weights);\n color += (color - vec3f(gray)) * vec3f(noise1, noise2, -noise1) * 0.15 * tape_wear;\n color += vec3f(noise1 * 0.05 * tape_wear);\n color *= mix(vec3f(1.0), vec3f(1.03, 1.01, 0.96), tape_wear);\n let vignette = uv0 * (1.0 - uv0);\n color *= mix(1.0, clamp(vignette.x * vignette.y * 15.0, 0.0, 1.0), 0.35);\n let static_time = fract(effect.time * 20.0);\n let static_hash = hash21(vec2f(floor(position.x / 10.0), floor(position.y / 2.0) + static_time * 500.0) + vec2f(static_time * 77.0));\n color = mix(color, vec3f(1.0), step(0.9991, static_hash) * 0.135);\n return premultiplied(color, center_sample.a);\n}\n\n// Ember overlay inspired by Jan Mr\u00F3z's CC BY 3.0 shader, adapted for the\n// Ghostty pipeline. Attribution is retained in THIRD_PARTY_NOTICES.md.\nfn sparks(position: vec2f, uv: vec2f) -> vec4f {\n let terminal = sample_image(uv);\n var spark = vec3f(0.0);\n var spark_alpha = 0.0;\n for (var layer = 0u; layer < 8u; layer += 1u) {\n let layer_value = f32(layer);\n let scale = 18.0 + layer_value * 7.0;\n let drift = vec2f(effect.time * (0.35 + layer_value * 0.025), -effect.time * (0.7 + layer_value * 0.05));\n let grid = uv * vec2f(scale, scale * 1.6) + drift;\n let cell = floor(grid);\n let random = hash21(cell + vec2f(layer_value * 13.7, layer_value * 5.1));\n let local = fract(grid) - vec2f(random, fract(random * 17.17));\n let radius = 0.018 + 0.045 * hash21(cell + vec2f(31.0));\n let intensity = smoothstep(radius, 0.0, length(local)) * step(0.79, random);\n let flicker = 0.55 + 0.45 * sin(effect.time * (5.0 + random * 4.0) + random * 31.0);\n let value = intensity * flicker;\n spark += vec3f(1.5, 0.42, 0.05) * value;\n spark_alpha = max(spark_alpha, value * 0.78);\n }\n let terminal_rgb = straight_rgb(terminal);\n let background_weight = 1.0 - smoothstep(0.12, 0.55, dot(terminal_rgb, vec3f(0.2126, 0.7152, 0.0722)));\n let overlay_alpha = spark_alpha * background_weight;\n let alpha = overlay_alpha + terminal.a * (1.0 - overlay_alpha);\n let rgb = select(\n vec3f(0.0),\n (spark * overlay_alpha + terminal_rgb * terminal.a * (1.0 - overlay_alpha)) / max(alpha, 0.00001),\n alpha > 0.00001,\n );\n return premultiplied(rgb, alpha);\n}\n\n@fragment fn fragment_main(@builtin(position) position: vec4f) -> @location(0) vec4f {\n let uv = position.xy / effect.resolution;\n switch effect.mode {\n case 1u: { return better_crt(position.xy, uv); }\n case 2u: { return public_domain_crt(position.xy, uv); }\n case 3u: { return vhs(position.xy, uv); }\n case 4u: { return sparks(position.xy, uv); }\n default: { return sample_image(uv); }\n }\n}\n`;\n", "/// <reference types=\"@webgpu/types\" />\n\nimport { CursorStyle, GlyphFormat, type GlyphDefinition, type StyleDefinition } from \"@vibecook/ghosttea-frame\";\nimport { emptyRenderMetrics, type TerminalRenderMetrics } from \"../performance.js\";\n\nimport {\n CELL_WIDTH,\n LINE_HEIGHT,\n ORIGIN_X,\n ORIGIN_Y,\n effectiveCursorStyle,\n renderedSizeChanged,\n type CellPoint,\n type PixelSize,\n type RenderView,\n type Rgba,\n type TerminalRenderer,\n type TerminalShaderEffect,\n} from \"./types.js\";\nimport { graphemeCellWidth, splitGraphemes } from \"../cell-width.js\";\nimport { rowsForDamage } from \"./render-damage.js\";\nimport { SHADER_EFFECT_WGSL } from \"./shader-effects.js\";\n\nconst ATLAS_SIZE = 2048;\nconst GEOMETRY_CACHE_LIMIT = 8;\nconst FONT_STACK = \"ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace\";\n\nconst EFFECT_MODES: Readonly<Record<TerminalShaderEffect, number>> = {\n \"ghosttea:better-crt\": 1,\n \"ghosttea:crt\": 2,\n \"ghosttea:vhs\": 3,\n \"ghosttea:sparks-from-fire\": 4,\n};\n\nexport function effectIntermediateTextureCount(effectPassCount: number): number {\n return Math.min(2, Math.max(0, Math.trunc(effectPassCount) - 1));\n}\n\nconst RECT_SHADER = /* wgsl */ `\nstruct VertexOutput {\n @builtin(position) position: vec4f,\n @location(0) color: vec4f,\n}\n\n@vertex fn vertex_main(\n @builtin(vertex_index) vertex_index: u32,\n @location(0) p0: vec2f,\n @location(1) p1: vec2f,\n @location(2) p2: vec2f,\n @location(3) color: vec4f,\n) -> VertexOutput {\n let p3 = p1 + p2 - p0;\n let positions = array<vec2f, 6>(\n p0,\n p1,\n p2,\n p2,\n p1,\n p3,\n );\n var output: VertexOutput;\n output.position = vec4f(positions[vertex_index], 0.0, 1.0);\n output.color = color;\n return output;\n}\n\n@fragment fn fragment_main(input: VertexOutput) -> @location(0) vec4f {\n return vec4f(input.color.rgb * input.color.a, input.color.a);\n}\n`;\n\nfunction glyphShader(coverageChannel: \"r\" | \"a\"): string {\n return /* wgsl */ `\n@group(0) @binding(0) var atlas: texture_2d<f32>;\n@group(0) @binding(1) var atlas_sampler: sampler;\n\nstruct VertexOutput {\n @builtin(position) position: vec4f,\n @location(0) uv: vec2f,\n @location(1) color: vec4f,\n}\n\n@vertex fn vertex_main(\n @builtin(vertex_index) vertex_index: u32,\n @location(0) bounds: vec4f,\n @location(1) uv_bounds: vec4f,\n @location(2) color: vec4f,\n) -> VertexOutput {\n let positions = array<vec2f, 6>(\n vec2f(bounds.x, bounds.z),\n vec2f(bounds.y, bounds.z),\n vec2f(bounds.x, bounds.w),\n vec2f(bounds.x, bounds.w),\n vec2f(bounds.y, bounds.z),\n vec2f(bounds.y, bounds.w),\n );\n let uvs = array<vec2f, 6>(\n vec2f(uv_bounds.x, uv_bounds.z),\n vec2f(uv_bounds.y, uv_bounds.z),\n vec2f(uv_bounds.x, uv_bounds.w),\n vec2f(uv_bounds.x, uv_bounds.w),\n vec2f(uv_bounds.y, uv_bounds.z),\n vec2f(uv_bounds.y, uv_bounds.w),\n );\n var output: VertexOutput;\n output.position = vec4f(positions[vertex_index], 0.0, 1.0);\n output.uv = uvs[vertex_index];\n output.color = color;\n return output;\n}\n\n@fragment fn fragment_main(input: VertexOutput) -> @location(0) vec4f {\n let coverage = textureSample(atlas, atlas_sampler, input.uv).${coverageChannel};\n let alpha = input.color.a * coverage;\n return vec4f(input.color.rgb * alpha, alpha);\n}\n`;\n}\n\nconst MONO_GLYPH_SHADER = glyphShader(\"r\");\nconst FALLBACK_GLYPH_SHADER = glyphShader(\"a\");\n\nconst COLOR_GLYPH_SHADER = /* wgsl */ `\n@group(0) @binding(0) var atlas: texture_2d<f32>;\n@group(0) @binding(1) var atlas_sampler: sampler;\n\nstruct VertexOutput {\n @builtin(position) position: vec4f,\n @location(0) uv: vec2f,\n @location(1) color: vec4f,\n}\n\n@vertex fn vertex_main(\n @builtin(vertex_index) vertex_index: u32,\n @location(0) bounds: vec4f,\n @location(1) uv_bounds: vec4f,\n @location(2) color: vec4f,\n) -> VertexOutput {\n let positions = array<vec2f, 6>(\n vec2f(bounds.x, bounds.z),\n vec2f(bounds.y, bounds.z),\n vec2f(bounds.x, bounds.w),\n vec2f(bounds.x, bounds.w),\n vec2f(bounds.y, bounds.z),\n vec2f(bounds.y, bounds.w),\n );\n let uvs = array<vec2f, 6>(\n vec2f(uv_bounds.x, uv_bounds.z),\n vec2f(uv_bounds.y, uv_bounds.z),\n vec2f(uv_bounds.x, uv_bounds.w),\n vec2f(uv_bounds.x, uv_bounds.w),\n vec2f(uv_bounds.y, uv_bounds.z),\n vec2f(uv_bounds.y, uv_bounds.w),\n );\n var output: VertexOutput;\n output.position = vec4f(positions[vertex_index], 0.0, 1.0);\n output.uv = uvs[vertex_index];\n output.color = color;\n return output;\n}\n\n@fragment fn fragment_main(input: VertexOutput) -> @location(0) vec4f {\n return textureSample(atlas, atlas_sampler, input.uv);\n}\n`;\n\nconst premultipliedBlend: GPUBlendState = {\n color: { srcFactor: \"one\", dstFactor: \"one-minus-src-alpha\", operation: \"add\" },\n alpha: { srcFactor: \"one\", dstFactor: \"one-minus-src-alpha\", operation: \"add\" },\n};\n\nfunction premultipliedClear(color: Rgba): GPUColorDict {\n return { r: color[0] * color[3], g: color[1] * color[3], b: color[2] * color[3], a: color[3] };\n}\n\nclass DynamicVertexBuffer {\n #buffer: GPUBuffer | undefined;\n #capacity = 0;\n\n constructor(\n readonly device: GPUDevice,\n readonly label: string,\n ) {}\n\n write(vertices: Float32Array): GPUBuffer | undefined {\n if (vertices.byteLength === 0) return undefined;\n if (!this.#buffer || this.#capacity < vertices.byteLength) {\n this.#buffer?.destroy();\n this.#capacity = Math.max(4096, 2 ** Math.ceil(Math.log2(vertices.byteLength)));\n this.#buffer = this.device.createBuffer({\n label: this.label,\n size: this.#capacity,\n usage: GPUBufferUsage.VERTEX | GPUBufferUsage.COPY_DST,\n });\n }\n this.device.queue.writeBuffer(this.#buffer, 0, vertices);\n return this.#buffer;\n }\n\n destroy(): void {\n this.#buffer?.destroy();\n this.#buffer = undefined;\n }\n}\n\ninterface GlyphLocation {\n u0: number;\n v0: number;\n u1: number;\n v1: number;\n cells: number;\n}\n\nclass FallbackGlyphAtlas {\n readonly #texture: GPUTexture;\n readonly #sampler: GPUSampler;\n readonly #bindGroup: GPUBindGroup;\n readonly #cache = new Map<string, GlyphLocation>();\n readonly #scratch = new OffscreenCanvas(1, 1);\n #x = 1;\n #y = 1;\n #rowHeight = 0;\n #uploadBytes = 0;\n #uploadCalls = 0;\n #generation = 0;\n\n constructor(\n readonly device: GPUDevice,\n bindGroupLayout: GPUBindGroupLayout,\n ) {\n this.#texture = device.createTexture({\n label: \"terminal glyph atlas\",\n size: [ATLAS_SIZE, ATLAS_SIZE],\n format: \"rgba8unorm\",\n usage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST,\n });\n this.#sampler = device.createSampler({ minFilter: \"linear\", magFilter: \"linear\" });\n this.#bindGroup = device.createBindGroup({\n label: \"terminal glyph atlas bindings\",\n layout: bindGroupLayout,\n entries: [\n { binding: 0, resource: this.#texture.createView() },\n { binding: 1, resource: this.#sampler },\n ],\n });\n }\n\n get bindGroup(): GPUBindGroup {\n return this.#bindGroup;\n }\n\n get generation(): number {\n return this.#generation;\n }\n\n prepare(values: Iterable<string>, dpr: number): void {\n const scale = Math.max(1, Math.min(3, dpr));\n const all = [...new Set(values)].filter((value) => value.trim().length > 0);\n const missing = all.filter((value) => !this.#cache.has(`${scale.toFixed(2)}:${value}`));\n if (this.#fits(missing, scale, this.#x, this.#y, this.#rowHeight)) return;\n this.#cache.clear();\n this.#generation += 1;\n this.#x = 1;\n this.#y = 1;\n this.#rowHeight = 0;\n if (!this.#fits(all, scale, this.#x, this.#y, this.#rowHeight)) {\n throw new Error(\"The diagnostic glyph atlas cannot fit the text visible in one frame\");\n }\n }\n\n #fits(values: Iterable<string>, scale: number, startX: number, startY: number, startRowHeight: number): boolean {\n let x = startX;\n let y = startY;\n let rowHeight = startRowHeight;\n for (const value of values) {\n const width = Math.max(1, Math.ceil(CELL_WIDTH * graphemeCellWidth(value) * scale));\n const height = Math.max(1, Math.ceil(LINE_HEIGHT * scale));\n if (x + width + 1 > ATLAS_SIZE) {\n x = 1;\n y += rowHeight + 1;\n rowHeight = 0;\n }\n if (y + height + 1 > ATLAS_SIZE) return false;\n x += width + 1;\n rowHeight = Math.max(rowHeight, height);\n }\n return true;\n }\n\n glyph(grapheme: string, dpr: number): GlyphLocation | undefined {\n if (grapheme.trim().length === 0) return undefined;\n const scale = Math.max(1, Math.min(3, dpr));\n const cells = graphemeCellWidth(grapheme);\n const key = `${scale.toFixed(2)}:${grapheme}`;\n const cached = this.#cache.get(key);\n if (cached) return cached;\n\n const width = Math.max(1, Math.ceil(CELL_WIDTH * cells * scale));\n const height = Math.max(1, Math.ceil(LINE_HEIGHT * scale));\n if (this.#x + width + 1 > ATLAS_SIZE) {\n this.#x = 1;\n this.#y += this.#rowHeight + 1;\n this.#rowHeight = 0;\n }\n if (this.#y + height + 1 > ATLAS_SIZE) {\n throw new Error(\"Temporary glyph atlas exhausted\");\n }\n\n this.#scratch.width = width;\n this.#scratch.height = height;\n const context = this.#scratch.getContext(\"2d\", { willReadFrequently: true });\n if (!context) throw new Error(\"Glyph raster canvas unavailable\");\n context.clearRect(0, 0, width, height);\n context.fillStyle = \"white\";\n context.font = `${13 * scale}px ${FONT_STACK}`;\n context.textBaseline = \"top\";\n context.fillText(grapheme, 0, Math.max(0, Math.floor((height - 15 * scale) / 2)));\n const image = context.getImageData(0, 0, width, height);\n this.device.queue.writeTexture(\n { texture: this.#texture, origin: [this.#x, this.#y] },\n image.data,\n { bytesPerRow: width * 4, rowsPerImage: height },\n [width, height],\n );\n this.#uploadBytes += image.data.byteLength;\n this.#uploadCalls += 1;\n const location: GlyphLocation = {\n u0: this.#x / ATLAS_SIZE,\n v0: this.#y / ATLAS_SIZE,\n u1: (this.#x + width) / ATLAS_SIZE,\n v1: (this.#y + height) / ATLAS_SIZE,\n cells,\n };\n this.#cache.set(key, location);\n this.#x += width + 1;\n this.#rowHeight = Math.max(this.#rowHeight, height);\n return location;\n }\n\n destroy(): void {\n this.#texture.destroy();\n }\n\n uploadMetrics(): { bytes: number; calls: number } {\n return { bytes: this.#uploadBytes, calls: this.#uploadCalls };\n }\n}\n\nclass NativeGlyphAtlas {\n readonly #texture: GPUTexture;\n readonly #sampler: GPUSampler;\n readonly #bindGroup: GPUBindGroup;\n readonly #cache = new Map<number, GlyphLocation>();\n #x = 1;\n #y = 1;\n #rowHeight = 0;\n #uploadBytes = 0;\n #uploadCalls = 0;\n #generation = 0;\n\n constructor(\n readonly device: GPUDevice,\n bindGroupLayout: GPUBindGroupLayout,\n readonly label: string,\n readonly format: \"r8unorm\" | \"rgba8unorm\",\n ) {\n this.#texture = device.createTexture({\n label,\n size: [ATLAS_SIZE, ATLAS_SIZE],\n format,\n usage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST,\n });\n this.#sampler = device.createSampler({ minFilter: \"linear\", magFilter: \"linear\" });\n this.#bindGroup = device.createBindGroup({\n label: `${label} bindings`,\n layout: bindGroupLayout,\n entries: [\n { binding: 0, resource: this.#texture.createView() },\n { binding: 1, resource: this.#sampler },\n ],\n });\n }\n\n get bindGroup(): GPUBindGroup {\n return this.#bindGroup;\n }\n\n get generation(): number {\n return this.#generation;\n }\n\n prepare(definitions: Iterable<GlyphDefinition>): void {\n const all = new Map<number, GlyphDefinition>();\n const missing = new Map<number, GlyphDefinition>();\n for (const definition of definitions) {\n all.set(definition.id, definition);\n if (!this.#cache.has(definition.id)) missing.set(definition.id, definition);\n }\n if (this.#fits(missing.values(), this.#x, this.#y, this.#rowHeight)) return;\n this.#cache.clear();\n this.#generation += 1;\n this.#x = 1;\n this.#y = 1;\n this.#rowHeight = 0;\n if (!this.#fits(all.values(), this.#x, this.#y, this.#rowHeight)) {\n throw new Error(`${this.label} cannot fit the glyphs visible in one frame`);\n }\n }\n\n #fits(definitions: Iterable<GlyphDefinition>, startX: number, startY: number, startRowHeight: number): boolean {\n let x = startX;\n let y = startY;\n let rowHeight = startRowHeight;\n for (const { width, height } of definitions) {\n if (width + 2 > ATLAS_SIZE || height + 2 > ATLAS_SIZE) return false;\n if (x + width + 1 > ATLAS_SIZE) {\n x = 1;\n y += rowHeight + 1;\n rowHeight = 0;\n }\n if (y + height + 1 > ATLAS_SIZE) return false;\n x += width + 1;\n rowHeight = Math.max(rowHeight, height);\n }\n return true;\n }\n\n glyph(definition: GlyphDefinition): GlyphLocation {\n const cached = this.#cache.get(definition.id);\n if (cached) return cached;\n const { width, height } = definition;\n if (this.#x + width + 1 > ATLAS_SIZE) {\n this.#x = 1;\n this.#y += this.#rowHeight + 1;\n this.#rowHeight = 0;\n }\n if (this.#y + height + 1 > ATLAS_SIZE) throw new Error(`${this.label} exhausted`);\n const pixels = definition.pixels;\n const bytesPerPixel = this.format === \"r8unorm\" ? 1 : 4;\n this.device.queue.writeTexture(\n { texture: this.#texture, origin: [this.#x, this.#y] },\n pixels,\n { bytesPerRow: width * bytesPerPixel, rowsPerImage: height },\n [width, height],\n );\n this.#uploadBytes += pixels.byteLength;\n this.#uploadCalls += 1;\n const location: GlyphLocation = {\n u0: this.#x / ATLAS_SIZE,\n v0: this.#y / ATLAS_SIZE,\n u1: (this.#x + width) / ATLAS_SIZE,\n v1: (this.#y + height) / ATLAS_SIZE,\n cells: 0,\n };\n this.#cache.set(definition.id, location);\n this.#x += width + 1;\n this.#rowHeight = Math.max(this.#rowHeight, height);\n return location;\n }\n\n destroy(): void {\n this.#texture.destroy();\n }\n\n uploadMetrics(): { bytes: number; calls: number } {\n return { bytes: this.#uploadBytes, calls: this.#uploadCalls };\n }\n}\n\ninterface WebGpuSurface extends PixelSize {\n canvas: OffscreenCanvas;\n context: GPUCanvasContext;\n sceneTexture: GPUTexture;\n effectTextures: GPUTexture[];\n effectPasses: EffectPass[];\n effectSignature: string;\n effectFrame: number;\n lastEffectTime: number;\n rectangleBuffer: DynamicVertexBuffer;\n glyphBuffer: DynamicVertexBuffer;\n colorGlyphBuffer: DynamicVertexBuffer;\n fallbackGlyphBuffer: DynamicVertexBuffer;\n cursorBuffer: DynamicVertexBuffer;\n geometryCache: Map<string, CachedGeometry>;\n geometryCandidates: Map<string, true>;\n sceneValid: boolean;\n}\n\ninterface EffectPass {\n mode: number;\n configBuffer: GPUBuffer;\n bindGroup: GPUBindGroup;\n}\n\ninterface GeometryLayout {\n rowResetInstanceCount: number;\n backgroundInstanceCount: number;\n selectionInstanceCount: number;\n decorationInstanceStart: number;\n decorationInstanceCount: number;\n rectangleInstanceCount: number;\n glyphInstanceCount: number;\n colorGlyphInstanceCount: number;\n fallbackGlyphInstanceCount: number;\n}\n\ninterface CpuGeometry extends GeometryLayout {\n rectangleData: Float32Array;\n glyphData: Float32Array;\n colorGlyphData: Float32Array;\n fallbackGlyphData: Float32Array;\n}\n\ninterface CachedGeometry extends GeometryLayout {\n rectangleBuffer: GPUBuffer | undefined;\n glyphBuffer: GPUBuffer | undefined;\n colorGlyphBuffer: GPUBuffer | undefined;\n fallbackGlyphBuffer: GPUBuffer | undefined;\n}\n\nfunction destroyCachedGeometry(geometry: CachedGeometry): void {\n geometry.rectangleBuffer?.destroy();\n geometry.glyphBuffer?.destroy();\n geometry.colorGlyphBuffer?.destroy();\n geometry.fallbackGlyphBuffer?.destroy();\n}\n\nfunction clearGeometryCache(surface: WebGpuSurface): void {\n for (const geometry of surface.geometryCache.values()) destroyCachedGeometry(geometry);\n surface.geometryCache.clear();\n surface.geometryCandidates.clear();\n}\n\nfunction createCachedVertexBuffer(device: GPUDevice, label: string, data: Float32Array): GPUBuffer | undefined {\n if (data.byteLength === 0) return undefined;\n const buffer = device.createBuffer({\n label,\n size: data.byteLength,\n usage: GPUBufferUsage.VERTEX | GPUBufferUsage.COPY_DST,\n });\n device.queue.writeBuffer(buffer, 0, data);\n return buffer;\n}\n\nfunction geometryCacheKey(\n view: RenderView,\n rows: readonly number[],\n hasNativeRows: boolean,\n atlasGenerations: readonly [number, number, number],\n): string {\n const selection = view.selection\n ? `${view.selection.anchor.row},${view.selection.anchor.column},${view.selection.focus.row},${view.selection.focus.column}`\n : \"-\";\n return [\n view.sessionEpoch.toString(),\n view.layoutEpoch.toString(),\n hasNativeRows ? \"native\" : \"fallback\",\n rows.map((row) => `${row}:${view.rowRevisions[row]?.toString() ?? \"-\"}`).join(\",\"),\n [\n ...view.theme.background,\n ...view.theme.foreground,\n ...view.theme.cursor,\n ...(view.theme.cursorText ?? view.theme.background),\n ...view.theme.selection,\n ...view.theme.selectionForeground,\n ].join(\",\"),\n view.theme.backgroundOpacityCells ? \"opacity-cells\" : \"opaque-cells\",\n selection,\n effectiveCursorStyle(view) === CursorStyle.Block ? `${view.cursor.x},${view.cursor.y}` : \"-\",\n atlasGenerations.join(\",\"),\n ].join(\"|\");\n}\n\nfunction pushCursorVertices(\n vertices: number[],\n view: RenderView,\n renderRowSet: ReadonlySet<number>,\n scale: number,\n viewportWidth: number,\n viewportHeight: number,\n): void {\n const cursorStyle = effectiveCursorStyle(view);\n if (cursorStyle === null || cursorStyle === CursorStyle.Block || !renderRowSet.has(view.cursor.y)) return;\n const x = (ORIGIN_X + view.cursor.x * CELL_WIDTH) * scale;\n const y = (ORIGIN_Y + view.cursor.y * LINE_HEIGHT) * scale;\n const width = CELL_WIDTH * scale;\n const height = LINE_HEIGHT * scale;\n const stroke = Math.max(1, Math.round(scale));\n const cursorColor: Rgba =\n cursorStyle === CursorStyle.HollowBlock\n ? [view.theme.cursor[0], view.theme.cursor[1], view.theme.cursor[2], 1]\n : view.theme.cursor;\n if (cursorStyle === CursorStyle.Bar) {\n pushRectangle(\n vertices,\n x,\n y,\n Math.max(2, Math.round(2 * scale)),\n height,\n cursorColor,\n viewportWidth,\n viewportHeight,\n );\n } else if (cursorStyle === CursorStyle.Underline) {\n const thickness = Math.max(2, Math.round(2 * scale));\n pushRectangle(vertices, x, y + height - thickness, width, thickness, cursorColor, viewportWidth, viewportHeight);\n } else if (cursorStyle === CursorStyle.HollowBlock) {\n pushRectangle(vertices, x, y, width, stroke, cursorColor, viewportWidth, viewportHeight);\n pushRectangle(vertices, x, y + height - stroke, width, stroke, cursorColor, viewportWidth, viewportHeight);\n pushRectangle(\n vertices,\n x,\n y + stroke,\n stroke,\n Math.max(0, height - stroke * 2),\n cursorColor,\n viewportWidth,\n viewportHeight,\n );\n pushRectangle(\n vertices,\n x + width - stroke,\n y + stroke,\n stroke,\n Math.max(0, height - stroke * 2),\n cursorColor,\n viewportWidth,\n viewportHeight,\n );\n } else {\n pushRectangle(vertices, x, y, width, height, cursorColor, viewportWidth, viewportHeight);\n }\n}\n\nfunction clipX(pixel: number, width: number): number {\n return (pixel / Math.max(1, width)) * 2 - 1;\n}\n\nfunction clipY(pixel: number, height: number): number {\n return 1 - (pixel / Math.max(1, height)) * 2;\n}\n\nfunction pushRectangle(\n output: number[],\n x: number,\n y: number,\n width: number,\n height: number,\n color: Rgba,\n viewportWidth: number,\n viewportHeight: number,\n): void {\n const left = clipX(x, viewportWidth);\n const right = clipX(x + width, viewportWidth);\n const top = clipY(y, viewportHeight);\n const bottom = clipY(y + height, viewportHeight);\n output.push(left, top, right, top, left, bottom, ...color);\n}\n\nfunction pushGlyph(\n output: number[],\n x: number,\n y: number,\n width: number,\n height: number,\n glyph: GlyphLocation,\n color: Rgba,\n viewportWidth: number,\n viewportHeight: number,\n): void {\n const left = clipX(x, viewportWidth);\n const right = clipX(x + width, viewportWidth);\n const top = clipY(y, viewportHeight);\n const bottom = clipY(y + height, viewportHeight);\n output.push(left, right, top, bottom, glyph.u0, glyph.u1, glyph.v0, glyph.v1, ...color);\n}\n\nfunction ordered(selection: RenderView[\"selection\"]): [CellPoint, CellPoint] | null {\n if (!selection) return null;\n const { anchor, focus } = selection;\n return anchor.row < focus.row || (anchor.row === focus.row && anchor.column <= focus.column)\n ? [anchor, focus]\n : [focus, anchor];\n}\n\nfunction cellLength(text: string): number {\n return splitGraphemes(text).reduce((total, grapheme) => total + graphemeCellWidth(grapheme), 0);\n}\n\nconst BOX_DIRECTIONS = new Map<string, string>([\n [\"\u2500\", \"lr\"],\n [\"\u2501\", \"lr\"],\n [\"\u2502\", \"ud\"],\n [\"\u2503\", \"ud\"],\n [\"\u250C\", \"rd\"],\n [\"\u250D\", \"rd\"],\n [\"\u250E\", \"rd\"],\n [\"\u250F\", \"rd\"],\n [\"\u2510\", \"ld\"],\n [\"\u2511\", \"ld\"],\n [\"\u2512\", \"ld\"],\n [\"\u2513\", \"ld\"],\n [\"\u2514\", \"ru\"],\n [\"\u2515\", \"ru\"],\n [\"\u2516\", \"ru\"],\n [\"\u2517\", \"ru\"],\n [\"\u2518\", \"lu\"],\n [\"\u2519\", \"lu\"],\n [\"\u251A\", \"lu\"],\n [\"\u251B\", \"lu\"],\n [\"\u251C\", \"udr\"],\n [\"\u251D\", \"udr\"],\n [\"\u251E\", \"udr\"],\n [\"\u2523\", \"udr\"],\n [\"\u2524\", \"udl\"],\n [\"\u2525\", \"udl\"],\n [\"\u2526\", \"udl\"],\n [\"\u252B\", \"udl\"],\n [\"\u252C\", \"lrd\"],\n [\"\u252F\", \"lrd\"],\n [\"\u2530\", \"lrd\"],\n [\"\u2533\", \"lrd\"],\n [\"\u2534\", \"lru\"],\n [\"\u2537\", \"lru\"],\n [\"\u2538\", \"lru\"],\n [\"\u253B\", \"lru\"],\n [\"\u253C\", \"lrud\"],\n [\"\u254B\", \"lrud\"],\n [\"\u2574\", \"l\"],\n [\"\u2576\", \"r\"],\n [\"\u2575\", \"u\"],\n [\"\u2577\", \"d\"],\n [\"\u2550\", \"lr\"],\n [\"\u2551\", \"ud\"],\n [\"\u2554\", \"rd\"],\n [\"\u2557\", \"ld\"],\n [\"\u255A\", \"ru\"],\n [\"\u255D\", \"lu\"],\n [\"\u2560\", \"udr\"],\n [\"\u2563\", \"udl\"],\n [\"\u2566\", \"lrd\"],\n [\"\u2569\", \"lru\"],\n [\"\u256C\", \"lrud\"],\n [\"\u256D\", \"rd\"],\n [\"\u256E\", \"ld\"],\n [\"\u256F\", \"lu\"],\n [\"\u2570\", \"ru\"],\n]);\n\nconst ROUNDED_BOX_CORNERS = new Set([\"\u256D\", \"\u256E\", \"\u256F\", \"\u2570\"]);\n\nexport interface SpecialDrawingCells {\n box: Map<number, string>;\n block: Map<number, string>;\n}\n\nexport function specialDrawingCells(text: string): SpecialDrawingCells {\n const box = new Map<number, string>();\n const block = new Map<number, string>();\n let column = 0;\n let simple = true;\n for (let index = 0; index < text.length; index += 1) {\n const codepoint = text.charCodeAt(index);\n if (codepoint <= 0x7f) {\n column += 1;\n } else if (codepoint >= 0x2580 && codepoint <= 0x259f) {\n block.set(column, text[index]!);\n column += 1;\n } else if (BOX_DIRECTIONS.has(text[index]!)) {\n box.set(column, text[index]!);\n column += 1;\n } else {\n simple = false;\n break;\n }\n }\n if (simple) return { box, block };\n\n box.clear();\n block.clear();\n column = 0;\n for (const grapheme of splitGraphemes(text)) {\n const codepoint = grapheme.codePointAt(0) ?? 0;\n if (codepoint >= 0x2580 && codepoint <= 0x259f) block.set(column, grapheme);\n else if (BOX_DIRECTIONS.has(grapheme)) box.set(column, grapheme);\n column += graphemeCellWidth(grapheme);\n }\n return { box, block };\n}\n\nfunction rgb(color: readonly [number, number, number]): Rgba {\n return [color[0] / 255, color[1] / 255, color[2] / 255, 1];\n}\n\nfunction over(source: Rgba, backdrop: Rgba): Rgba {\n if (source[3] >= 1) return source;\n if (source[3] <= 0) return backdrop;\n const alpha = source[3] + backdrop[3] * (1 - source[3]);\n if (alpha <= Number.EPSILON) return [0, 0, 0, 0];\n return [\n (source[0] * source[3] + backdrop[0] * backdrop[3] * (1 - source[3])) / alpha,\n (source[1] * source[3] + backdrop[1] * backdrop[3] * (1 - source[3])) / alpha,\n (source[2] * source[3] + backdrop[2] * backdrop[3] * (1 - source[3])) / alpha,\n alpha,\n ];\n}\n\nfunction selectionContains(selection: [CellPoint, CellPoint] | null, row: number, column: number): boolean {\n if (!selection) return false;\n const [start, end] = selection;\n if (row < start.row || row > end.row) return false;\n const first = row === start.row ? start.column : 0;\n const last = row === end.row ? end.column : Number.MAX_SAFE_INTEGER;\n return column >= first && column <= last;\n}\n\nfunction blockCursorContains(view: RenderView, row: number, column: number, span = 1): boolean {\n return (\n effectiveCursorStyle(view) === CursorStyle.Block &&\n view.cursor.y === row &&\n view.cursor.x >= column &&\n view.cursor.x < column + Math.max(1, span)\n );\n}\n\nfunction pushBlockCursorBackground(\n vertices: number[],\n view: RenderView,\n renderRows: readonly number[],\n scale: number,\n viewportWidth: number,\n viewportHeight: number,\n): void {\n if (effectiveCursorStyle(view) !== CursorStyle.Block || !renderRows.includes(view.cursor.y)) return;\n pushRectangle(\n vertices,\n (ORIGIN_X + view.cursor.x * CELL_WIDTH) * scale,\n (ORIGIN_Y + view.cursor.y * LINE_HEIGHT) * scale,\n CELL_WIDTH * scale,\n LINE_HEIGHT * scale,\n view.theme.cursor,\n viewportWidth,\n viewportHeight,\n );\n}\n\ninterface ResolvedStyle {\n foreground: Rgba;\n background: Rgba | null;\n underline: boolean;\n strikethrough: boolean;\n invisible: boolean;\n}\n\nfunction resolveStyle(style: StyleDefinition | undefined, theme: RenderView[\"theme\"]): ResolvedStyle {\n let foreground: Rgba = style?.foreground ? rgb(style.foreground) : theme.foreground;\n let background: Rgba | null = style?.background ? rgb(style.background) : null;\n if (style?.inverse) {\n const originalForeground = foreground;\n foreground = background ?? theme.background;\n background = originalForeground;\n }\n if (background && theme.backgroundOpacityCells) {\n background = [background[0], background[1], background[2], theme.background[3]];\n }\n if (style?.faint) foreground = [foreground[0], foreground[1], foreground[2], foreground[3] * 0.55];\n return {\n foreground,\n background,\n underline: style?.underline ?? false,\n strikethrough: style?.strikethrough ?? false,\n invisible: style?.invisible ?? false,\n };\n}\n\nfunction pushBoxDrawing(\n output: number[],\n grapheme: string,\n column: number,\n row: number,\n scale: number,\n color: Rgba,\n viewportWidth: number,\n viewportHeight: number,\n): void {\n const directions = BOX_DIRECTIONS.get(grapheme);\n if (!directions) return;\n const left = (ORIGIN_X + column * CELL_WIDTH) * scale;\n const right = (ORIGIN_X + (column + 1) * CELL_WIDTH) * scale;\n const top = (ORIGIN_Y + row * LINE_HEIGHT) * scale;\n const bottom = (ORIGIN_Y + (row + 1) * LINE_HEIGHT) * scale;\n const stroke = Math.max(1, Math.round(scale));\n const centerX = Math.round((left + right - stroke) / 2);\n const centerY = Math.round((top + bottom - stroke) / 2);\n if (ROUNDED_BOX_CORNERS.has(grapheme)) {\n const x = centerX + stroke / 2;\n const y = centerY + stroke / 2;\n const points: Array<readonly [number, number]> = [];\n const [originX, originY, startAngle, endAngle] =\n grapheme === \"\u256D\"\n ? [right, bottom, -Math.PI / 2, -Math.PI]\n : grapheme === \"\u256E\"\n ? [left, bottom, -Math.PI / 2, 0]\n : grapheme === \"\u256F\"\n ? [left, top, Math.PI / 2, 0]\n : [right, top, Math.PI, Math.PI / 2];\n const radiusX = Math.abs(right - x);\n const radiusY = Math.abs(bottom - y);\n const steps = Math.max(5, Math.ceil(Math.max(radiusX, radiusY) / 2));\n for (let step = 0; step <= steps; step += 1) {\n const angle = startAngle + (endAngle - startAngle) * (step / steps);\n points.push([originX + Math.cos(angle) * radiusX, originY + Math.sin(angle) * radiusY]);\n }\n for (let index = 1; index < points.length; index += 1) {\n const from = points[index - 1]!;\n const to = points[index]!;\n const dx = to[0] - from[0];\n const dy = to[1] - from[1];\n const length = Math.hypot(dx, dy);\n if (length <= Number.EPSILON) continue;\n const nx = ((-dy / length) * stroke) / 2;\n const ny = ((dx / length) * stroke) / 2;\n output.push(\n clipX(from[0] + nx, viewportWidth),\n clipY(from[1] + ny, viewportHeight),\n clipX(to[0] + nx, viewportWidth),\n clipY(to[1] + ny, viewportHeight),\n clipX(from[0] - nx, viewportWidth),\n clipY(from[1] - ny, viewportHeight),\n ...color,\n );\n }\n return;\n }\n if (directions.includes(\"u\"))\n pushRectangle(output, centerX, top, stroke, centerY + stroke - top, color, viewportWidth, viewportHeight);\n if (directions.includes(\"d\"))\n pushRectangle(output, centerX, centerY, stroke, bottom - centerY, color, viewportWidth, viewportHeight);\n if (directions.includes(\"l\"))\n pushRectangle(output, left, centerY, centerX + stroke - left, stroke, color, viewportWidth, viewportHeight);\n if (directions.includes(\"r\"))\n pushRectangle(output, centerX, centerY, right - centerX, stroke, color, viewportWidth, viewportHeight);\n}\n\ntype FractionRect = readonly [left: number, top: number, right: number, bottom: number];\n\nconst LOWER_BLOCK_RECTANGLES = Array.from({ length: 7 }, (_, index): readonly FractionRect[] => [\n [0, 1 - (index + 1) / 8, 1, 1],\n]);\nconst LEFT_BLOCK_RECTANGLES = Array.from({ length: 7 }, (_, index): readonly FractionRect[] => [\n [0, 0, (7 - index) / 8, 1],\n]);\nconst FULL_BLOCK_RECTANGLES: readonly FractionRect[] = [[0, 0, 1, 1]];\nconst RIGHT_HALF_RECTANGLES: readonly FractionRect[] = [[0.5, 0, 1, 1]];\nconst UPPER_EIGHTH_RECTANGLES: readonly FractionRect[] = [[0, 0, 1, 1 / 8]];\nconst RIGHT_EIGHTH_RECTANGLES: readonly FractionRect[] = [[7 / 8, 0, 1, 1]];\nconst QUADRANT_RECTANGLES: readonly FractionRect[] = [\n [0, 0, 0.5, 0.5],\n [0.5, 0, 1, 0.5],\n [0, 0.5, 0.5, 1],\n [0.5, 0.5, 1, 1],\n];\nconst QUADRANT_BLOCK_RECTANGLES = new Map<number, readonly FractionRect[]>(\n [\n [0x2596, [2]],\n [0x2597, [3]],\n [0x2598, [0]],\n [0x2599, [0, 2, 3]],\n [0x259a, [0, 3]],\n [0x259b, [0, 1, 2]],\n [0x259c, [0, 1, 3]],\n [0x259d, [1]],\n [0x259e, [1, 2]],\n [0x259f, [1, 2, 3]],\n ].map(([codepoint, quadrants]) => [\n codepoint as number,\n (quadrants as number[]).map((quadrant) => QUADRANT_RECTANGLES[quadrant]!),\n ]),\n);\n\nfunction blockElementRectangles(codepoint: number): readonly FractionRect[] | undefined {\n if (codepoint >= 0x2581 && codepoint <= 0x2587) return LOWER_BLOCK_RECTANGLES[codepoint - 0x2581];\n if (codepoint === 0x2588) return FULL_BLOCK_RECTANGLES;\n if (codepoint >= 0x2589 && codepoint <= 0x258f) return LEFT_BLOCK_RECTANGLES[codepoint - 0x2589];\n if (codepoint === 0x2590) return RIGHT_HALF_RECTANGLES;\n if (codepoint === 0x2594) return UPPER_EIGHTH_RECTANGLES;\n if (codepoint === 0x2595) return RIGHT_EIGHTH_RECTANGLES;\n return QUADRANT_BLOCK_RECTANGLES.get(codepoint);\n}\n\nfunction pushBlockElement(\n output: number[],\n grapheme: string,\n column: number,\n row: number,\n scale: number,\n color: Rgba,\n viewportWidth: number,\n viewportHeight: number,\n): boolean {\n const codepoint = grapheme.charCodeAt(0);\n if (codepoint < 0x2580 || codepoint > 0x259f) return false;\n const cellLeft = (ORIGIN_X + column * CELL_WIDTH) * scale;\n const cellRight = (ORIGIN_X + (column + 1) * CELL_WIDTH) * scale;\n const cellTop = (ORIGIN_Y + row * LINE_HEIGHT) * scale;\n const cellBottom = (ORIGIN_Y + (row + 1) * LINE_HEIGHT) * scale;\n if (codepoint === 0x2580) {\n const x0 = Math.round(cellLeft);\n const x1 = Math.round(cellRight);\n const y0 = Math.round(cellTop);\n const y1 = Math.round(cellTop + (cellBottom - cellTop) * 0.5);\n pushRectangle(output, x0, y0, x1 - x0, y1 - y0, color, viewportWidth, viewportHeight);\n return true;\n }\n const rectangles = blockElementRectangles(codepoint);\n if (!rectangles) return false;\n for (const [left, top, right, bottom] of rectangles) {\n const x0 = Math.round(cellLeft + (cellRight - cellLeft) * left);\n const x1 = Math.round(cellLeft + (cellRight - cellLeft) * right);\n const y0 = Math.round(cellTop + (cellBottom - cellTop) * top);\n const y1 = Math.round(cellTop + (cellBottom - cellTop) * bottom);\n pushRectangle(output, x0, y0, x1 - x0, y1 - y0, color, viewportWidth, viewportHeight);\n }\n return true;\n}\n\nexport class WebGpuTerminalRenderer implements TerminalRenderer {\n readonly kind = \"webgpu\" as const;\n readonly #surfaces = new Map<string, WebGpuSurface>();\n readonly #rectanglePipeline: GPURenderPipeline;\n readonly #rectangleOverwritePipeline: GPURenderPipeline;\n readonly #glyphPipeline: GPURenderPipeline;\n readonly #fallbackGlyphPipeline: GPURenderPipeline;\n readonly #colorGlyphPipeline: GPURenderPipeline;\n readonly #effectPipeline: GPURenderPipeline;\n readonly #effectSampler: GPUSampler;\n readonly #monoAtlas: NativeGlyphAtlas;\n readonly #colorAtlas: NativeGlyphAtlas;\n readonly #fallbackAtlas: FallbackGlyphAtlas;\n #performanceMeasurementEnabled = false;\n\n private constructor(\n readonly device: GPUDevice,\n readonly format: GPUTextureFormat,\n ) {\n const rectangleModule = device.createShaderModule({ label: \"terminal rectangle shader\", code: RECT_SHADER });\n const glyphModule = device.createShaderModule({ label: \"terminal glyph shader\", code: MONO_GLYPH_SHADER });\n const fallbackGlyphModule = device.createShaderModule({\n label: \"terminal fallback glyph shader\",\n code: FALLBACK_GLYPH_SHADER,\n });\n const colorGlyphModule = device.createShaderModule({\n label: \"terminal color glyph shader\",\n code: COLOR_GLYPH_SHADER,\n });\n const effectModule = device.createShaderModule({\n label: \"Ghosttea shader effect registry\",\n code: SHADER_EFFECT_WGSL,\n });\n this.#rectanglePipeline = device.createRenderPipeline({\n label: \"terminal rectangle pipeline\",\n layout: \"auto\",\n vertex: {\n module: rectangleModule,\n entryPoint: \"vertex_main\",\n buffers: [\n {\n arrayStride: 40,\n stepMode: \"instance\",\n attributes: [\n { shaderLocation: 0, offset: 0, format: \"float32x2\" },\n { shaderLocation: 1, offset: 8, format: \"float32x2\" },\n { shaderLocation: 2, offset: 16, format: \"float32x2\" },\n { shaderLocation: 3, offset: 24, format: \"float32x4\" },\n ],\n },\n ],\n },\n fragment: {\n module: rectangleModule,\n entryPoint: \"fragment_main\",\n targets: [{ format, blend: premultipliedBlend }],\n },\n primitive: { topology: \"triangle-list\" },\n });\n this.#rectangleOverwritePipeline = device.createRenderPipeline({\n label: \"terminal row-reset overwrite pipeline\",\n layout: \"auto\",\n vertex: {\n module: rectangleModule,\n entryPoint: \"vertex_main\",\n buffers: [\n {\n arrayStride: 40,\n stepMode: \"instance\",\n attributes: [\n { shaderLocation: 0, offset: 0, format: \"float32x2\" },\n { shaderLocation: 1, offset: 8, format: \"float32x2\" },\n { shaderLocation: 2, offset: 16, format: \"float32x2\" },\n { shaderLocation: 3, offset: 24, format: \"float32x4\" },\n ],\n },\n ],\n },\n fragment: { module: rectangleModule, entryPoint: \"fragment_main\", targets: [{ format }] },\n primitive: { topology: \"triangle-list\" },\n });\n this.#glyphPipeline = device.createRenderPipeline({\n label: \"terminal glyph pipeline\",\n layout: \"auto\",\n vertex: {\n module: glyphModule,\n entryPoint: \"vertex_main\",\n buffers: [\n {\n arrayStride: 48,\n stepMode: \"instance\",\n attributes: [\n { shaderLocation: 0, offset: 0, format: \"float32x4\" },\n { shaderLocation: 1, offset: 16, format: \"float32x4\" },\n { shaderLocation: 2, offset: 32, format: \"float32x4\" },\n ],\n },\n ],\n },\n fragment: { module: glyphModule, entryPoint: \"fragment_main\", targets: [{ format, blend: premultipliedBlend }] },\n primitive: { topology: \"triangle-list\" },\n });\n this.#fallbackGlyphPipeline = device.createRenderPipeline({\n label: \"terminal fallback glyph pipeline\",\n layout: \"auto\",\n vertex: {\n module: fallbackGlyphModule,\n entryPoint: \"vertex_main\",\n buffers: [\n {\n arrayStride: 48,\n stepMode: \"instance\",\n attributes: [\n { shaderLocation: 0, offset: 0, format: \"float32x4\" },\n { shaderLocation: 1, offset: 16, format: \"float32x4\" },\n { shaderLocation: 2, offset: 32, format: \"float32x4\" },\n ],\n },\n ],\n },\n fragment: {\n module: fallbackGlyphModule,\n entryPoint: \"fragment_main\",\n targets: [{ format, blend: premultipliedBlend }],\n },\n primitive: { topology: \"triangle-list\" },\n });\n this.#colorGlyphPipeline = device.createRenderPipeline({\n label: \"terminal color glyph pipeline\",\n layout: \"auto\",\n vertex: {\n module: colorGlyphModule,\n entryPoint: \"vertex_main\",\n buffers: [\n {\n arrayStride: 48,\n stepMode: \"instance\",\n attributes: [\n { shaderLocation: 0, offset: 0, format: \"float32x4\" },\n { shaderLocation: 1, offset: 16, format: \"float32x4\" },\n { shaderLocation: 2, offset: 32, format: \"float32x4\" },\n ],\n },\n ],\n },\n fragment: {\n module: colorGlyphModule,\n entryPoint: \"fragment_main\",\n targets: [{ format, blend: premultipliedBlend }],\n },\n primitive: { topology: \"triangle-list\" },\n });\n this.#effectPipeline = device.createRenderPipeline({\n label: \"Ghosttea ordered shader effect pipeline\",\n layout: \"auto\",\n vertex: { module: effectModule, entryPoint: \"vertex_main\" },\n fragment: { module: effectModule, entryPoint: \"fragment_main\", targets: [{ format }] },\n primitive: { topology: \"triangle-list\" },\n });\n this.#effectSampler = device.createSampler({\n label: \"Ghosttea shader effect sampler\",\n addressModeU: \"clamp-to-edge\",\n addressModeV: \"clamp-to-edge\",\n minFilter: \"linear\",\n magFilter: \"linear\",\n });\n this.#monoAtlas = new NativeGlyphAtlas(\n device,\n this.#glyphPipeline.getBindGroupLayout(0),\n \"native monochrome glyph atlas\",\n \"r8unorm\",\n );\n this.#colorAtlas = new NativeGlyphAtlas(\n device,\n this.#colorGlyphPipeline.getBindGroupLayout(0),\n \"native color glyph atlas\",\n \"rgba8unorm\",\n );\n this.#fallbackAtlas = new FallbackGlyphAtlas(device, this.#fallbackGlyphPipeline.getBindGroupLayout(0));\n }\n\n static async create(onLost: (info: GPUDeviceLostInfo) => void): Promise<WebGpuTerminalRenderer> {\n if (!navigator.gpu) throw new Error(\"WebGPU is unavailable\");\n const adapter = await navigator.gpu.requestAdapter();\n if (!adapter) throw new Error(\"No WebGPU adapter is available\");\n const device = await adapter.requestDevice({ label: \"Electron Ghostty terminal renderer\" });\n device.addEventListener(\"uncapturederror\", (event) => {\n console.error(\"[terminal-renderer] WebGPU validation error\", event.error);\n });\n void device.lost.then((info) => {\n if (info.reason !== \"destroyed\") onLost(info);\n });\n return new WebGpuTerminalRenderer(device, navigator.gpu.getPreferredCanvasFormat());\n }\n\n setPerformanceMeasurementEnabled(enabled: boolean): void {\n this.#performanceMeasurementEnabled = enabled;\n }\n\n mount(id: string, canvas: OffscreenCanvas): void {\n const context = canvas.getContext(\"webgpu\") as GPUCanvasContext | null;\n if (!context) throw new Error(\"WebGPU canvas context unavailable\");\n const sceneTexture = this.#createSceneTexture(canvas.width, canvas.height);\n const surface: WebGpuSurface = {\n canvas,\n context,\n sceneTexture,\n effectTextures: [],\n effectPasses: [],\n effectSignature: \"\",\n effectFrame: 0,\n lastEffectTime: 0,\n width: 1,\n height: 1,\n dpr: 1,\n rectangleBuffer: new DynamicVertexBuffer(this.device, `rectangles ${id}`),\n glyphBuffer: new DynamicVertexBuffer(this.device, `glyphs ${id}`),\n colorGlyphBuffer: new DynamicVertexBuffer(this.device, `color glyphs ${id}`),\n fallbackGlyphBuffer: new DynamicVertexBuffer(this.device, `fallback glyphs ${id}`),\n cursorBuffer: new DynamicVertexBuffer(this.device, `cursor ${id}`),\n geometryCache: new Map(),\n geometryCandidates: new Map(),\n sceneValid: false,\n };\n this.#surfaces.set(id, surface);\n this.#configure(surface);\n }\n\n unmount(id: string): void {\n const surface = this.#surfaces.get(id);\n if (!surface) return;\n surface.context.unconfigure();\n surface.sceneTexture.destroy();\n for (const texture of surface.effectTextures) texture.destroy();\n for (const pass of surface.effectPasses) pass.configBuffer.destroy();\n surface.rectangleBuffer.destroy();\n surface.glyphBuffer.destroy();\n surface.colorGlyphBuffer.destroy();\n surface.fallbackGlyphBuffer.destroy();\n surface.cursorBuffer.destroy();\n clearGeometryCache(surface);\n this.#surfaces.delete(id);\n }\n\n resize(id: string, size: PixelSize): void {\n const surface = this.#surfaces.get(id);\n if (!surface) return;\n const changed = renderedSizeChanged(surface, size);\n Object.assign(surface, size);\n if (!changed) return;\n surface.canvas.width = Math.max(1, Math.round(size.width * size.dpr));\n surface.canvas.height = Math.max(1, Math.round(size.height * size.dpr));\n this.#configure(surface);\n }\n\n #configure(surface: WebGpuSurface): void {\n surface.context.configure({ device: this.device, format: this.format, alphaMode: \"premultiplied\" });\n surface.sceneTexture.destroy();\n for (const texture of surface.effectTextures) texture.destroy();\n for (const pass of surface.effectPasses) pass.configBuffer.destroy();\n surface.sceneTexture = this.#createSceneTexture(surface.canvas.width, surface.canvas.height);\n surface.effectTextures = [];\n surface.effectPasses = [];\n surface.effectSignature = \"\";\n clearGeometryCache(surface);\n surface.sceneValid = false;\n }\n\n #createSceneTexture(width: number, height: number): GPUTexture {\n return this.device.createTexture({\n label: \"terminal scene before Ghostty custom shaders\",\n size: [Math.max(1, width), Math.max(1, height)],\n format: this.format,\n usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING,\n });\n }\n\n #createEffectTexture(width: number, height: number, suffix: string): GPUTexture {\n return this.device.createTexture({\n label: `terminal shader ping-pong ${suffix}`,\n size: [Math.max(1, width), Math.max(1, height)],\n format: this.format,\n usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING,\n });\n }\n\n #createEffectBindGroup(texture: GPUTexture, configBuffer: GPUBuffer): GPUBindGroup {\n return this.device.createBindGroup({\n label: \"Ghosttea shader effect bindings\",\n layout: this.#effectPipeline.getBindGroupLayout(0),\n entries: [\n { binding: 0, resource: texture.createView() },\n { binding: 1, resource: this.#effectSampler },\n { binding: 2, resource: { buffer: configBuffer } },\n ],\n });\n }\n\n #shaderStack(view: RenderView): TerminalShaderEffect[] {\n const configured = view.effects?.shaderEffects?.filter((id) => EFFECT_MODES[id] !== undefined) ?? [];\n if (configured.length > 0) return [...configured];\n return view.effects?.postProcess === \"better-crt\" ? [\"ghosttea:better-crt\"] : [];\n }\n\n #ensureEffectPasses(surface: WebGpuSurface, stack: readonly TerminalShaderEffect[]): void {\n const signature = stack.join(\"\\0\") || \"ghosttea:blit\";\n if (surface.effectSignature === signature) return;\n for (const pass of surface.effectPasses) pass.configBuffer.destroy();\n const modes = stack.length > 0 ? stack.map((id) => EFFECT_MODES[id]) : [0];\n const intermediateCount = effectIntermediateTextureCount(modes.length);\n while (surface.effectTextures.length > intermediateCount) surface.effectTextures.pop()!.destroy();\n while (surface.effectTextures.length < intermediateCount) {\n const suffix = surface.effectTextures.length === 0 ? \"A\" : \"B\";\n surface.effectTextures.push(this.#createEffectTexture(surface.canvas.width, surface.canvas.height, suffix));\n }\n surface.effectPasses = modes.map((mode, index) => {\n const configBuffer = this.device.createBuffer({\n label: `Ghosttea shader effect configuration ${index}`,\n size: 48,\n usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST,\n });\n const inputTexture = index === 0 ? surface.sceneTexture : surface.effectTextures[(index - 1) % 2]!;\n return {\n mode,\n configBuffer,\n bindGroup: this.#createEffectBindGroup(inputTexture, configBuffer),\n };\n });\n surface.effectSignature = signature;\n surface.effectFrame = 0;\n surface.lastEffectTime = 0;\n }\n\n #encodeEffectStack(surface: WebGpuSurface, view: RenderView, encoder: GPUCommandEncoder): number {\n const stack = this.#shaderStack(view);\n this.#ensureEffectPasses(surface, stack);\n const now = view.effects?.animate ? performance.now() / 1_000 : 0;\n const delta = surface.lastEffectTime > 0 ? Math.min(0.1, Math.max(0, now - surface.lastEffectTime)) : 0;\n surface.lastEffectTime = now;\n const passCount = surface.effectPasses.length;\n for (let index = 0; index < passCount; index += 1) {\n const effectPass = surface.effectPasses[index]!;\n const storage = new ArrayBuffer(48);\n const values = new DataView(storage);\n values.setUint32(0, effectPass.mode, true);\n values.setUint32(4, surface.effectFrame, true);\n values.setUint32(8, index, true);\n values.setUint32(12, passCount, true);\n values.setFloat32(16, surface.canvas.width, true);\n values.setFloat32(20, surface.canvas.height, true);\n values.setFloat32(24, now, true);\n values.setFloat32(28, delta, true);\n values.setFloat32(32, (ORIGIN_X + view.cursor.x * CELL_WIDTH) * surface.dpr, true);\n values.setFloat32(36, (ORIGIN_Y + view.cursor.y * LINE_HEIGHT) * surface.dpr, true);\n values.setFloat32(40, view.cursor.visible ? 1 : 0, true);\n values.setFloat32(44, view.cursor.style, true);\n this.device.queue.writeBuffer(effectPass.configBuffer, 0, storage);\n const last = index === passCount - 1;\n const output = last\n ? surface.context.getCurrentTexture().createView()\n : surface.effectTextures[index % 2]!.createView();\n const pass = encoder.beginRenderPass({\n label: `Ghosttea shader effect pass ${index + 1}/${passCount}`,\n colorAttachments: [\n {\n view: output,\n clearValue: { r: 0, g: 0, b: 0, a: 0 },\n loadOp: \"clear\",\n storeOp: \"store\",\n },\n ],\n });\n pass.setPipeline(this.#effectPipeline);\n pass.setBindGroup(0, effectPass.bindGroup);\n pass.draw(3);\n pass.end();\n }\n surface.effectFrame += 1;\n return passCount;\n }\n\n #encodeEffectsOnly(\n surface: WebGpuSurface,\n view: RenderView,\n encoder: GPUCommandEncoder,\n ): TerminalRenderMetrics | undefined {\n const effectPassCount = this.#encodeEffectStack(surface, view, encoder);\n if (!this.#performanceMeasurementEnabled) return undefined;\n return {\n ...emptyRenderMetrics(),\n canvasPixels: surface.canvas.width * surface.canvas.height,\n renderPasses: effectPassCount,\n drawCalls: effectPassCount,\n };\n }\n\n render(id: string, view: RenderView): TerminalRenderMetrics | undefined {\n const surface = this.#surfaces.get(id);\n if (!surface) return;\n const encoder = this.device.createCommandEncoder({ label: `terminal frame ${id}` });\n const metrics =\n view.damage?.geometryChanged === false\n ? this.#encodeCachedRender(id, view, encoder)\n : this.#encodeRender(id, view, encoder);\n this.device.queue.submit([encoder.finish()]);\n if (metrics) metrics.queueSubmits = 1;\n return metrics;\n }\n\n renderBatch(entries: ReadonlyArray<{ id: string; view: RenderView }>): Array<TerminalRenderMetrics | undefined> {\n const active = entries.filter(({ id }) => this.#surfaces.has(id));\n if (active.length === 0) return entries.map(() => undefined);\n const encoder = this.device.createCommandEncoder({ label: `terminal frame batch (${active.length} panes)` });\n const byId = new Map<string, TerminalRenderMetrics | undefined>();\n for (const { id, view } of active) {\n byId.set(\n id,\n view.damage?.geometryChanged === false\n ? this.#encodeCachedRender(id, view, encoder)\n : this.#encodeRender(id, view, encoder),\n );\n }\n this.device.queue.submit([encoder.finish()]);\n const firstMetrics = [...byId.values()].find((metrics) => metrics !== undefined);\n if (firstMetrics) firstMetrics.queueSubmits = 1;\n return entries.map(({ id }) => byId.get(id));\n }\n\n #buildGeometry(\n view: RenderView,\n renderRows: readonly number[],\n rowCount: number,\n fullRedraw: boolean,\n hasNativeRows: boolean,\n scale: number,\n viewportWidth: number,\n viewportHeight: number,\n ): CpuGeometry {\n const rectangleVertices: number[] = [];\n const glyphVertices: number[] = [];\n const colorGlyphVertices: number[] = [];\n const fallbackGlyphVertices: number[] = [];\n const resolvedStyles = new Map<number, ResolvedStyle>();\n const styleFor = (styleId: number): ResolvedStyle => {\n const cached = resolvedStyles.get(styleId);\n if (cached) return cached;\n const resolved = resolveStyle(view.styleDefinitions.get(styleId), view.theme);\n resolvedStyles.set(styleId, resolved);\n return resolved;\n };\n const monoDefinitions = new Map<number, GlyphDefinition>();\n const colorDefinitions = new Map<number, GlyphDefinition>();\n for (const row of renderRows) {\n for (const glyph of view.nativeRows[row] ?? []) {\n const definition = view.glyphDefinitions.get(glyph.glyphId);\n if (!definition) continue;\n (definition.format === GlyphFormat.Rgba8Premultiplied ? colorDefinitions : monoDefinitions).set(\n definition.id,\n definition,\n );\n }\n }\n this.#monoAtlas.prepare(monoDefinitions.values());\n this.#colorAtlas.prepare(colorDefinitions.values());\n\n if (!fullRedraw) {\n for (const row of renderRows) {\n const top = row === 0 ? 0 : (ORIGIN_Y + row * LINE_HEIGHT) * scale;\n const bottom =\n row === rowCount - 1\n ? viewportHeight\n : Math.min(viewportHeight, (ORIGIN_Y + (row + 1) * LINE_HEIGHT) * scale);\n pushRectangle(\n rectangleVertices,\n 0,\n top,\n viewportWidth,\n Math.max(0, bottom - top),\n view.theme.background,\n viewportWidth,\n viewportHeight,\n );\n }\n }\n const rowResetInstanceCount = rectangleVertices.length / 10;\n\n for (const row of renderRows) {\n for (const run of view.nativeStyleRows[row] ?? []) {\n const style = styleFor(run.styleId);\n if (!style.background) continue;\n pushRectangle(\n rectangleVertices,\n (ORIGIN_X + run.cellStart * CELL_WIDTH) * scale,\n (ORIGIN_Y + row * LINE_HEIGHT) * scale,\n run.cellSpan * CELL_WIDTH * scale,\n LINE_HEIGHT * scale,\n style.background,\n viewportWidth,\n viewportHeight,\n );\n }\n }\n const backgroundInstanceCount = rectangleVertices.length / 10;\n\n const selection = ordered(view.selection);\n if (selection) {\n const [start, end] = selection;\n for (const row of renderRows) {\n if (row < start.row || row > end.row) continue;\n const first = row === start.row ? start.column : 0;\n const last = row === end.row ? end.column : Math.max(0, cellLength(view.rows[row] ?? \"\") - 1);\n pushRectangle(\n rectangleVertices,\n (ORIGIN_X + first * CELL_WIDTH) * scale,\n (ORIGIN_Y + row * LINE_HEIGHT) * scale,\n Math.max(1, last - first + 1) * CELL_WIDTH * scale,\n LINE_HEIGHT * scale,\n view.theme.selection,\n viewportWidth,\n viewportHeight,\n );\n }\n }\n pushBlockCursorBackground(rectangleVertices, view, renderRows, scale, viewportWidth, viewportHeight);\n const selectionInstanceCount = rectangleVertices.length / 10 - backgroundInstanceCount;\n\n if (!hasNativeRows) {\n this.#fallbackAtlas.prepare(\n renderRows.flatMap((row) => splitGraphemes(view.rows[row] ?? \"\")),\n scale,\n );\n }\n if (hasNativeRows) {\n for (const row of renderRows) {\n const { box: boxCells, block: blockCells } = specialDrawingCells(view.rows[row] ?? \"\");\n for (const instance of view.nativeRows[row] ?? []) {\n const definition = view.glyphDefinitions.get(instance.glyphId);\n if (!definition) continue;\n const style = styleFor(instance.styleId);\n if (style.invisible) continue;\n const isSelected = selectionContains(selection, row, instance.cellStart);\n const foreground = blockCursorContains(view, row, instance.cellStart, instance.cellSpan)\n ? (view.theme.cursorText ?? view.theme.background)\n : isSelected\n ? view.theme.selectionForeground\n : style.foreground;\n const boxDrawing = boxCells.get(instance.cellStart);\n if (boxDrawing) {\n let backdrop = style.background ?? view.theme.background;\n if (isSelected) backdrop = view.theme.selection;\n // Box glyphs are overlapping primitives. Flatten faint opacity\n // against the cell backdrop so joins are blended only once.\n pushBoxDrawing(\n rectangleVertices,\n boxDrawing,\n instance.cellStart,\n row,\n scale,\n over(foreground, backdrop),\n viewportWidth,\n viewportHeight,\n );\n continue;\n }\n const blockElement = blockCells.get(instance.cellStart);\n if (blockElement) {\n let backdrop = style.background ?? view.theme.background;\n if (isSelected) backdrop = view.theme.selection;\n if (\n pushBlockElement(\n rectangleVertices,\n blockElement,\n instance.cellStart,\n row,\n scale,\n over(foreground, backdrop),\n viewportWidth,\n viewportHeight,\n )\n )\n continue;\n }\n const atlas = definition.format === GlyphFormat.Alpha8 ? this.#monoAtlas : this.#colorAtlas;\n const vertices = definition.format === GlyphFormat.Alpha8 ? glyphVertices : colorGlyphVertices;\n pushGlyph(\n vertices,\n (ORIGIN_X + instance.x) * scale,\n (ORIGIN_Y + row * LINE_HEIGHT + instance.y) * scale,\n instance.width * scale,\n instance.height * scale,\n atlas.glyph(definition),\n foreground,\n viewportWidth,\n viewportHeight,\n );\n }\n }\n } else {\n for (const row of renderRows) {\n let column = 0;\n for (const grapheme of splitGraphemes(view.rows[row] ?? \"\")) {\n const glyph = this.#fallbackAtlas.glyph(grapheme, scale);\n const cells = glyph?.cells ?? graphemeCellWidth(grapheme);\n if (glyph) {\n const foreground = blockCursorContains(view, row, column, cells)\n ? (view.theme.cursorText ?? view.theme.background)\n : selectionContains(selection, row, column)\n ? view.theme.selectionForeground\n : view.theme.foreground;\n pushGlyph(\n fallbackGlyphVertices,\n (ORIGIN_X + column * CELL_WIDTH) * scale,\n (ORIGIN_Y + row * LINE_HEIGHT) * scale,\n CELL_WIDTH * cells * scale,\n LINE_HEIGHT * scale,\n glyph,\n foreground,\n viewportWidth,\n viewportHeight,\n );\n }\n column += cells;\n }\n }\n }\n\n for (const row of renderRows) {\n for (const run of view.nativeStyleRows[row] ?? []) {\n const style = styleFor(run.styleId);\n if (style.invisible) continue;\n const x = (ORIGIN_X + run.cellStart * CELL_WIDTH) * scale;\n const width = run.cellSpan * CELL_WIDTH * scale;\n const rowTop = (ORIGIN_Y + row * LINE_HEIGHT) * scale;\n const stroke = Math.max(1, Math.round(scale));\n if (style.underline) {\n pushRectangle(\n rectangleVertices,\n x,\n Math.round(rowTop + 16 * scale),\n width,\n stroke,\n style.foreground,\n viewportWidth,\n viewportHeight,\n );\n }\n if (style.strikethrough) {\n pushRectangle(\n rectangleVertices,\n x,\n Math.round(rowTop + 9 * scale),\n width,\n stroke,\n style.foreground,\n viewportWidth,\n viewportHeight,\n );\n }\n }\n }\n const decorationInstanceStart = backgroundInstanceCount + selectionInstanceCount;\n const decorationInstanceCount = rectangleVertices.length / 10 - decorationInstanceStart;\n return {\n rectangleData: new Float32Array(rectangleVertices),\n glyphData: new Float32Array(glyphVertices),\n colorGlyphData: new Float32Array(colorGlyphVertices),\n fallbackGlyphData: new Float32Array(fallbackGlyphVertices),\n rowResetInstanceCount,\n backgroundInstanceCount,\n selectionInstanceCount,\n decorationInstanceStart,\n decorationInstanceCount,\n rectangleInstanceCount: rectangleVertices.length / 10,\n glyphInstanceCount: glyphVertices.length / 12,\n colorGlyphInstanceCount: colorGlyphVertices.length / 12,\n fallbackGlyphInstanceCount: fallbackGlyphVertices.length / 12,\n };\n }\n\n #encodeRender(id: string, view: RenderView, encoder: GPUCommandEncoder): TerminalRenderMetrics | undefined {\n const surface = this.#surfaces.get(id);\n if (!surface) return;\n const monoUploadsBefore = this.#performanceMeasurementEnabled ? this.#monoAtlas.uploadMetrics() : undefined;\n const colorUploadsBefore = this.#performanceMeasurementEnabled ? this.#colorAtlas.uploadMetrics() : undefined;\n const fallbackUploadsBefore = this.#performanceMeasurementEnabled ? this.#fallbackAtlas.uploadMetrics() : undefined;\n const scale = surface.dpr;\n const viewportWidth = surface.canvas.width;\n const viewportHeight = surface.canvas.height;\n const rowCount = Math.max(view.rows.length, view.nativeRows.length, view.nativeStyleRows.length);\n const { full: fullRedraw, rows: renderRows } = rowsForDamage(rowCount, view.damage, surface.sceneValid);\n const renderRowSet = new Set(renderRows);\n const rectangleVertices: number[] = [];\n const glyphVertices: number[] = [];\n const colorGlyphVertices: number[] = [];\n const fallbackGlyphVertices: number[] = [];\n const resolvedStyles = new Map<number, ResolvedStyle>();\n const styleFor = (styleId: number): ResolvedStyle => {\n const cached = resolvedStyles.get(styleId);\n if (cached) return cached;\n const resolved = resolveStyle(view.styleDefinitions.get(styleId), view.theme);\n resolvedStyles.set(styleId, resolved);\n return resolved;\n };\n const monoDefinitions = new Map<number, GlyphDefinition>();\n const colorDefinitions = new Map<number, GlyphDefinition>();\n for (const row of renderRows) {\n for (const glyph of view.nativeRows[row] ?? []) {\n const definition = view.glyphDefinitions.get(glyph.glyphId);\n if (!definition) continue;\n (definition.format === GlyphFormat.Rgba8Premultiplied ? colorDefinitions : monoDefinitions).set(\n definition.id,\n definition,\n );\n }\n }\n this.#monoAtlas.prepare(monoDefinitions.values());\n this.#colorAtlas.prepare(colorDefinitions.values());\n\n if (!fullRedraw) {\n for (const row of renderRows) {\n const top = row === 0 ? 0 : (ORIGIN_Y + row * LINE_HEIGHT) * scale;\n const bottom =\n row === rowCount - 1\n ? viewportHeight\n : Math.min(viewportHeight, (ORIGIN_Y + (row + 1) * LINE_HEIGHT) * scale);\n pushRectangle(\n rectangleVertices,\n 0,\n top,\n viewportWidth,\n Math.max(0, bottom - top),\n view.theme.background,\n viewportWidth,\n viewportHeight,\n );\n }\n }\n const rowResetInstanceCount = rectangleVertices.length / 10;\n\n for (const row of renderRows) {\n for (const run of view.nativeStyleRows[row] ?? []) {\n const style = styleFor(run.styleId);\n if (!style.background) continue;\n pushRectangle(\n rectangleVertices,\n (ORIGIN_X + run.cellStart * CELL_WIDTH) * scale,\n (ORIGIN_Y + row * LINE_HEIGHT) * scale,\n run.cellSpan * CELL_WIDTH * scale,\n LINE_HEIGHT * scale,\n style.background,\n viewportWidth,\n viewportHeight,\n );\n }\n }\n const backgroundInstanceCount = rectangleVertices.length / 10;\n\n const selection = ordered(view.selection);\n if (selection) {\n const [start, end] = selection;\n for (const row of renderRows) {\n if (row < start.row || row > end.row) continue;\n const first = row === start.row ? start.column : 0;\n const last = row === end.row ? end.column : Math.max(0, cellLength(view.rows[row] ?? \"\") - 1);\n pushRectangle(\n rectangleVertices,\n (ORIGIN_X + first * CELL_WIDTH) * scale,\n (ORIGIN_Y + row * LINE_HEIGHT) * scale,\n Math.max(1, last - first + 1) * CELL_WIDTH * scale,\n LINE_HEIGHT * scale,\n view.theme.selection,\n viewportWidth,\n viewportHeight,\n );\n }\n }\n pushBlockCursorBackground(rectangleVertices, view, renderRows, scale, viewportWidth, viewportHeight);\n const selectionInstanceCount = rectangleVertices.length / 10 - backgroundInstanceCount;\n\n const hasNativeRows = view.nativeRows.some((row) => row.length > 0);\n if (!hasNativeRows) {\n this.#fallbackAtlas.prepare(\n renderRows.flatMap((row) => splitGraphemes(view.rows[row] ?? \"\")),\n scale,\n );\n }\n if (hasNativeRows) {\n for (const row of renderRows) {\n const { box: boxCells, block: blockCells } = specialDrawingCells(view.rows[row] ?? \"\");\n for (const instance of view.nativeRows[row] ?? []) {\n const definition = view.glyphDefinitions.get(instance.glyphId);\n if (!definition) continue;\n const style = styleFor(instance.styleId);\n if (style.invisible) continue;\n const isSelected = selectionContains(selection, row, instance.cellStart);\n const foreground = blockCursorContains(view, row, instance.cellStart, instance.cellSpan)\n ? (view.theme.cursorText ?? view.theme.background)\n : isSelected\n ? view.theme.selectionForeground\n : style.foreground;\n const boxDrawing = boxCells.get(instance.cellStart);\n if (boxDrawing) {\n let backdrop = style.background ?? view.theme.background;\n if (isSelected) backdrop = view.theme.selection;\n // Box glyphs are assembled from several overlapping primitives. Flatten\n // faint opacity against the cell backdrop first so joins are blended once,\n // instead of producing a brighter seam at every cell boundary.\n const boxColor = over(foreground, backdrop);\n pushBoxDrawing(\n rectangleVertices,\n boxDrawing,\n instance.cellStart,\n row,\n scale,\n boxColor,\n viewportWidth,\n viewportHeight,\n );\n continue;\n }\n const blockElement = blockCells.get(instance.cellStart);\n if (blockElement) {\n let backdrop = style.background ?? view.theme.background;\n if (isSelected) backdrop = view.theme.selection;\n const blockColor = over(foreground, backdrop);\n if (\n pushBlockElement(\n rectangleVertices,\n blockElement,\n instance.cellStart,\n row,\n scale,\n blockColor,\n viewportWidth,\n viewportHeight,\n )\n )\n continue;\n }\n const atlas = definition.format === GlyphFormat.Alpha8 ? this.#monoAtlas : this.#colorAtlas;\n const vertices = definition.format === GlyphFormat.Alpha8 ? glyphVertices : colorGlyphVertices;\n pushGlyph(\n vertices,\n (ORIGIN_X + instance.x) * scale,\n (ORIGIN_Y + row * LINE_HEIGHT + instance.y) * scale,\n instance.width * scale,\n instance.height * scale,\n atlas.glyph(definition),\n foreground,\n viewportWidth,\n viewportHeight,\n );\n }\n }\n } else {\n for (const row of renderRows) {\n let column = 0;\n for (const grapheme of splitGraphemes(view.rows[row] ?? \"\")) {\n const glyph = this.#fallbackAtlas.glyph(grapheme, scale);\n const cells = glyph?.cells ?? graphemeCellWidth(grapheme);\n if (glyph) {\n const foreground = blockCursorContains(view, row, column, cells)\n ? (view.theme.cursorText ?? view.theme.background)\n : selectionContains(selection, row, column)\n ? view.theme.selectionForeground\n : view.theme.foreground;\n pushGlyph(\n fallbackGlyphVertices,\n (ORIGIN_X + column * CELL_WIDTH) * scale,\n (ORIGIN_Y + row * LINE_HEIGHT) * scale,\n CELL_WIDTH * cells * scale,\n LINE_HEIGHT * scale,\n glyph,\n foreground,\n viewportWidth,\n viewportHeight,\n );\n }\n column += cells;\n }\n }\n }\n\n for (const row of renderRows) {\n for (const run of view.nativeStyleRows[row] ?? []) {\n const style = styleFor(run.styleId);\n if (style.invisible) continue;\n const x = (ORIGIN_X + run.cellStart * CELL_WIDTH) * scale;\n const width = run.cellSpan * CELL_WIDTH * scale;\n const rowTop = (ORIGIN_Y + row * LINE_HEIGHT) * scale;\n const stroke = Math.max(1, Math.round(scale));\n if (style.underline) {\n pushRectangle(\n rectangleVertices,\n x,\n Math.round(rowTop + 16 * scale),\n width,\n stroke,\n style.foreground,\n viewportWidth,\n viewportHeight,\n );\n }\n if (style.strikethrough) {\n pushRectangle(\n rectangleVertices,\n x,\n Math.round(rowTop + 9 * scale),\n width,\n stroke,\n style.foreground,\n viewportWidth,\n viewportHeight,\n );\n }\n }\n }\n const decorationInstanceStart = backgroundInstanceCount + selectionInstanceCount;\n const decorationInstanceCount = rectangleVertices.length / 10 - decorationInstanceStart;\n\n const cursorStyle = effectiveCursorStyle(view);\n if (cursorStyle !== null && renderRowSet.has(view.cursor.y)) {\n const x = (ORIGIN_X + view.cursor.x * CELL_WIDTH) * scale;\n const y = (ORIGIN_Y + view.cursor.y * LINE_HEIGHT) * scale;\n const width = CELL_WIDTH * scale;\n const height = LINE_HEIGHT * scale;\n const stroke = Math.max(1, Math.round(scale));\n const cursorColor: Rgba =\n cursorStyle === CursorStyle.HollowBlock\n ? [view.theme.cursor[0], view.theme.cursor[1], view.theme.cursor[2], 1]\n : view.theme.cursor;\n if (cursorStyle === CursorStyle.Bar) {\n pushRectangle(\n rectangleVertices,\n x,\n y,\n Math.max(2, Math.round(2 * scale)),\n height,\n cursorColor,\n viewportWidth,\n viewportHeight,\n );\n } else if (cursorStyle === CursorStyle.Underline) {\n const thickness = Math.max(2, Math.round(2 * scale));\n pushRectangle(\n rectangleVertices,\n x,\n y + height - thickness,\n width,\n thickness,\n cursorColor,\n viewportWidth,\n viewportHeight,\n );\n } else if (cursorStyle === CursorStyle.HollowBlock) {\n pushRectangle(rectangleVertices, x, y, width, stroke, cursorColor, viewportWidth, viewportHeight);\n pushRectangle(\n rectangleVertices,\n x,\n y + height - stroke,\n width,\n stroke,\n cursorColor,\n viewportWidth,\n viewportHeight,\n );\n pushRectangle(\n rectangleVertices,\n x,\n y + stroke,\n stroke,\n Math.max(0, height - stroke * 2),\n cursorColor,\n viewportWidth,\n viewportHeight,\n );\n pushRectangle(\n rectangleVertices,\n x + width - stroke,\n y + stroke,\n stroke,\n Math.max(0, height - stroke * 2),\n cursorColor,\n viewportWidth,\n viewportHeight,\n );\n } else if (cursorStyle !== CursorStyle.Block) {\n pushRectangle(rectangleVertices, x, y, width, height, cursorColor, viewportWidth, viewportHeight);\n }\n }\n const rectangleData = new Float32Array(rectangleVertices);\n const glyphData = new Float32Array(glyphVertices);\n const colorGlyphData = new Float32Array(colorGlyphVertices);\n const fallbackGlyphData = new Float32Array(fallbackGlyphVertices);\n const rectangleBuffer = surface.rectangleBuffer.write(rectangleData);\n const glyphBuffer = surface.glyphBuffer.write(glyphData);\n const colorGlyphBuffer = surface.colorGlyphBuffer.write(colorGlyphData);\n const fallbackGlyphBuffer = surface.fallbackGlyphBuffer.write(fallbackGlyphData);\n const cursorInstanceStart = decorationInstanceStart + decorationInstanceCount;\n const cursorInstanceCount = rectangleVertices.length / 10 - cursorInstanceStart;\n\n const pass = encoder.beginRenderPass({\n label: `terminal pass ${id}`,\n colorAttachments: [\n {\n view: surface.sceneTexture.createView(),\n clearValue: premultipliedClear(view.theme.background),\n loadOp: fullRedraw ? \"clear\" : \"load\",\n storeOp: \"store\",\n },\n ],\n });\n if (rectangleBuffer && rowResetInstanceCount > 0) {\n pass.setPipeline(this.#rectangleOverwritePipeline);\n pass.setVertexBuffer(0, rectangleBuffer);\n pass.draw(6, rowResetInstanceCount);\n }\n if (rectangleBuffer && backgroundInstanceCount > rowResetInstanceCount) {\n pass.setPipeline(this.#rectanglePipeline);\n pass.setVertexBuffer(0, rectangleBuffer);\n pass.draw(6, backgroundInstanceCount - rowResetInstanceCount, 0, rowResetInstanceCount);\n }\n if (rectangleBuffer && selectionInstanceCount > 0) {\n pass.setPipeline(this.#rectanglePipeline);\n pass.setVertexBuffer(0, rectangleBuffer);\n pass.draw(6, selectionInstanceCount, 0, backgroundInstanceCount);\n }\n if (glyphBuffer && glyphData.length > 0) {\n pass.setPipeline(this.#glyphPipeline);\n pass.setBindGroup(0, this.#monoAtlas.bindGroup);\n pass.setVertexBuffer(0, glyphBuffer);\n pass.draw(6, glyphVertices.length / 12);\n }\n if (colorGlyphBuffer && colorGlyphData.length > 0) {\n pass.setPipeline(this.#colorGlyphPipeline);\n pass.setBindGroup(0, this.#colorAtlas.bindGroup);\n pass.setVertexBuffer(0, colorGlyphBuffer);\n pass.draw(6, colorGlyphVertices.length / 12);\n }\n if (fallbackGlyphBuffer && fallbackGlyphData.length > 0) {\n pass.setPipeline(this.#fallbackGlyphPipeline);\n pass.setBindGroup(0, this.#fallbackAtlas.bindGroup);\n pass.setVertexBuffer(0, fallbackGlyphBuffer);\n pass.draw(6, fallbackGlyphVertices.length / 12);\n }\n if (rectangleBuffer && decorationInstanceCount > 0) {\n pass.setPipeline(this.#rectanglePipeline);\n pass.setVertexBuffer(0, rectangleBuffer);\n pass.draw(6, decorationInstanceCount, 0, decorationInstanceStart);\n }\n if (rectangleBuffer && cursorInstanceCount > 0) {\n pass.setPipeline(this.#rectanglePipeline);\n pass.setVertexBuffer(0, rectangleBuffer);\n pass.draw(6, cursorInstanceCount, 0, cursorInstanceStart);\n }\n pass.end();\n\n const effectPassCount = this.#encodeEffectStack(surface, view, encoder);\n surface.sceneValid = true;\n if (!this.#performanceMeasurementEnabled) return undefined;\n const monoUploadsAfter = this.#monoAtlas.uploadMetrics();\n const colorUploadsAfter = this.#colorAtlas.uploadMetrics();\n const fallbackUploadsAfter = this.#fallbackAtlas.uploadMetrics();\n return {\n queueSubmits: 0,\n fullRenders: Number(fullRedraw),\n partialRenders: Number(!fullRedraw),\n damagedRows: renderRows.length,\n geometryCacheHits: 0,\n geometryCacheMisses: 0,\n canvasPixels: viewportWidth * viewportHeight,\n renderPasses: 1 + effectPassCount,\n drawCalls:\n Number(rowResetInstanceCount > 0) +\n Number(backgroundInstanceCount > rowResetInstanceCount) +\n Number(selectionInstanceCount > 0) +\n Number(glyphData.length > 0) +\n Number(colorGlyphData.length > 0) +\n Number(fallbackGlyphData.length > 0) +\n Number(decorationInstanceCount > 0) +\n Number(cursorInstanceCount > 0) +\n effectPassCount,\n rectangleVertices: (rectangleVertices.length / 10) * 6,\n monoGlyphVertices: (glyphVertices.length / 12) * 6,\n colorGlyphVertices: (colorGlyphVertices.length / 12) * 6,\n fallbackGlyphVertices: (fallbackGlyphVertices.length / 12) * 6,\n vertexUploadBytes:\n rectangleData.byteLength + glyphData.byteLength + colorGlyphData.byteLength + fallbackGlyphData.byteLength,\n atlasUploadBytes:\n monoUploadsAfter.bytes -\n monoUploadsBefore!.bytes +\n (colorUploadsAfter.bytes - colorUploadsBefore!.bytes) +\n (fallbackUploadsAfter.bytes - fallbackUploadsBefore!.bytes),\n atlasUploadCalls:\n monoUploadsAfter.calls -\n monoUploadsBefore!.calls +\n (colorUploadsAfter.calls - colorUploadsBefore!.calls) +\n (fallbackUploadsAfter.calls - fallbackUploadsBefore!.calls),\n };\n }\n\n #encodeCachedRender(id: string, view: RenderView, encoder: GPUCommandEncoder): TerminalRenderMetrics | undefined {\n const surface = this.#surfaces.get(id);\n if (!surface) return;\n if (!surface.sceneValid || !view.damage || view.damage.full) {\n return this.#encodeRender(id, view, encoder);\n }\n const rowCount = Math.max(view.rows.length, view.nativeRows.length, view.nativeStyleRows.length);\n const damage = rowsForDamage(rowCount, view.damage, surface.sceneValid);\n if (damage.rows.length === 0) return this.#encodeEffectsOnly(surface, view, encoder);\n const monoUploadsBefore = this.#performanceMeasurementEnabled ? this.#monoAtlas.uploadMetrics() : undefined;\n const colorUploadsBefore = this.#performanceMeasurementEnabled ? this.#colorAtlas.uploadMetrics() : undefined;\n const fallbackUploadsBefore = this.#performanceMeasurementEnabled ? this.#fallbackAtlas.uploadMetrics() : undefined;\n const scale = surface.dpr;\n const viewportWidth = surface.canvas.width;\n const viewportHeight = surface.canvas.height;\n const renderRowSet = new Set(damage.rows);\n const hasNativeRows = view.nativeRows.some((row) => row.length > 0);\n let geometry: CachedGeometry;\n let geometryUploadBytes = 0;\n const generations = (): [number, number, number] => [\n this.#monoAtlas.generation,\n this.#colorAtlas.generation,\n this.#fallbackAtlas.generation,\n ];\n let key = geometryCacheKey(view, damage.rows, hasNativeRows, generations());\n const cached = surface.geometryCache.get(key);\n const cacheHit = cached !== undefined;\n if (cached) {\n geometry = cached;\n surface.geometryCache.delete(key);\n surface.geometryCache.set(key, cached);\n } else {\n const admitted = surface.geometryCandidates.has(key);\n const candidateKey = key;\n const cpu = this.#buildGeometry(\n view,\n damage.rows,\n rowCount,\n false,\n hasNativeRows,\n scale,\n viewportWidth,\n viewportHeight,\n );\n key = geometryCacheKey(view, damage.rows, hasNativeRows, generations());\n const promote = admitted && key === candidateKey;\n geometry = {\n rectangleBuffer: promote\n ? createCachedVertexBuffer(this.device, `cached rectangles ${id}`, cpu.rectangleData)\n : surface.rectangleBuffer.write(cpu.rectangleData),\n glyphBuffer: promote\n ? createCachedVertexBuffer(this.device, `cached glyphs ${id}`, cpu.glyphData)\n : surface.glyphBuffer.write(cpu.glyphData),\n colorGlyphBuffer: promote\n ? createCachedVertexBuffer(this.device, `cached color glyphs ${id}`, cpu.colorGlyphData)\n : surface.colorGlyphBuffer.write(cpu.colorGlyphData),\n fallbackGlyphBuffer: promote\n ? createCachedVertexBuffer(this.device, `cached fallback glyphs ${id}`, cpu.fallbackGlyphData)\n : surface.fallbackGlyphBuffer.write(cpu.fallbackGlyphData),\n rowResetInstanceCount: cpu.rowResetInstanceCount,\n backgroundInstanceCount: cpu.backgroundInstanceCount,\n selectionInstanceCount: cpu.selectionInstanceCount,\n decorationInstanceStart: cpu.decorationInstanceStart,\n decorationInstanceCount: cpu.decorationInstanceCount,\n rectangleInstanceCount: cpu.rectangleInstanceCount,\n glyphInstanceCount: cpu.glyphInstanceCount,\n colorGlyphInstanceCount: cpu.colorGlyphInstanceCount,\n fallbackGlyphInstanceCount: cpu.fallbackGlyphInstanceCount,\n };\n geometryUploadBytes =\n cpu.rectangleData.byteLength +\n cpu.glyphData.byteLength +\n cpu.colorGlyphData.byteLength +\n cpu.fallbackGlyphData.byteLength;\n if (promote) {\n surface.geometryCandidates.delete(key);\n surface.geometryCache.set(key, geometry);\n while (surface.geometryCache.size > GEOMETRY_CACHE_LIMIT) {\n const oldestKey = surface.geometryCache.keys().next().value as string | undefined;\n if (oldestKey === undefined) break;\n const oldest = surface.geometryCache.get(oldestKey);\n if (oldest) destroyCachedGeometry(oldest);\n surface.geometryCache.delete(oldestKey);\n }\n } else {\n surface.geometryCandidates.delete(key);\n surface.geometryCandidates.set(key, true);\n while (surface.geometryCandidates.size > GEOMETRY_CACHE_LIMIT) {\n const oldestKey = surface.geometryCandidates.keys().next().value as string | undefined;\n if (oldestKey === undefined) break;\n surface.geometryCandidates.delete(oldestKey);\n }\n }\n }\n\n const cursorVertices: number[] = [];\n pushCursorVertices(cursorVertices, view, renderRowSet, scale, viewportWidth, viewportHeight);\n const cursorData = new Float32Array(cursorVertices);\n const cursorBuffer = surface.cursorBuffer.write(cursorData);\n const cursorInstanceStart = 0;\n const cursorInstanceCount = cursorData.length / 10;\n const pass = encoder.beginRenderPass({\n label: `terminal pass ${id}`,\n colorAttachments: [\n {\n view: surface.sceneTexture.createView(),\n clearValue: premultipliedClear(view.theme.background),\n loadOp: \"load\",\n storeOp: \"store\",\n },\n ],\n });\n if (geometry.rectangleBuffer && geometry.rowResetInstanceCount > 0) {\n pass.setPipeline(this.#rectangleOverwritePipeline);\n pass.setVertexBuffer(0, geometry.rectangleBuffer);\n pass.draw(6, geometry.rowResetInstanceCount);\n }\n if (geometry.rectangleBuffer && geometry.backgroundInstanceCount > geometry.rowResetInstanceCount) {\n pass.setPipeline(this.#rectanglePipeline);\n pass.setVertexBuffer(0, geometry.rectangleBuffer);\n pass.draw(\n 6,\n geometry.backgroundInstanceCount - geometry.rowResetInstanceCount,\n 0,\n geometry.rowResetInstanceCount,\n );\n }\n if (geometry.rectangleBuffer && geometry.selectionInstanceCount > 0) {\n pass.setPipeline(this.#rectanglePipeline);\n pass.setVertexBuffer(0, geometry.rectangleBuffer);\n pass.draw(6, geometry.selectionInstanceCount, 0, geometry.backgroundInstanceCount);\n }\n if (geometry.glyphBuffer && geometry.glyphInstanceCount > 0) {\n pass.setPipeline(this.#glyphPipeline);\n pass.setBindGroup(0, this.#monoAtlas.bindGroup);\n pass.setVertexBuffer(0, geometry.glyphBuffer);\n pass.draw(6, geometry.glyphInstanceCount);\n }\n if (geometry.colorGlyphBuffer && geometry.colorGlyphInstanceCount > 0) {\n pass.setPipeline(this.#colorGlyphPipeline);\n pass.setBindGroup(0, this.#colorAtlas.bindGroup);\n pass.setVertexBuffer(0, geometry.colorGlyphBuffer);\n pass.draw(6, geometry.colorGlyphInstanceCount);\n }\n if (geometry.fallbackGlyphBuffer && geometry.fallbackGlyphInstanceCount > 0) {\n pass.setPipeline(this.#fallbackGlyphPipeline);\n pass.setBindGroup(0, this.#fallbackAtlas.bindGroup);\n pass.setVertexBuffer(0, geometry.fallbackGlyphBuffer);\n pass.draw(6, geometry.fallbackGlyphInstanceCount);\n }\n if (geometry.rectangleBuffer && geometry.decorationInstanceCount > 0) {\n pass.setPipeline(this.#rectanglePipeline);\n pass.setVertexBuffer(0, geometry.rectangleBuffer);\n pass.draw(6, geometry.decorationInstanceCount, 0, geometry.decorationInstanceStart);\n }\n if (cursorBuffer && cursorInstanceCount > 0) {\n pass.setPipeline(this.#rectanglePipeline);\n pass.setVertexBuffer(0, cursorBuffer);\n pass.draw(6, cursorInstanceCount, 0, cursorInstanceStart);\n }\n pass.end();\n\n const effectPassCount = this.#encodeEffectStack(surface, view, encoder);\n surface.sceneValid = true;\n if (!this.#performanceMeasurementEnabled) return undefined;\n const monoUploadsAfter = this.#monoAtlas.uploadMetrics();\n const colorUploadsAfter = this.#colorAtlas.uploadMetrics();\n const fallbackUploadsAfter = this.#fallbackAtlas.uploadMetrics();\n return {\n queueSubmits: 0,\n fullRenders: 0,\n partialRenders: 1,\n damagedRows: damage.rows.length,\n geometryCacheHits: Number(cacheHit),\n geometryCacheMisses: Number(!cacheHit),\n canvasPixels: viewportWidth * viewportHeight,\n renderPasses: 1 + effectPassCount,\n drawCalls:\n Number(geometry.rowResetInstanceCount > 0) +\n Number(geometry.backgroundInstanceCount > geometry.rowResetInstanceCount) +\n Number(geometry.selectionInstanceCount > 0) +\n Number(geometry.glyphInstanceCount > 0) +\n Number(geometry.colorGlyphInstanceCount > 0) +\n Number(geometry.fallbackGlyphInstanceCount > 0) +\n Number(geometry.decorationInstanceCount > 0) +\n Number(cursorInstanceCount > 0) +\n effectPassCount,\n rectangleVertices: (geometry.rectangleInstanceCount + cursorInstanceCount) * 6,\n monoGlyphVertices: geometry.glyphInstanceCount * 6,\n colorGlyphVertices: geometry.colorGlyphInstanceCount * 6,\n fallbackGlyphVertices: geometry.fallbackGlyphInstanceCount * 6,\n vertexUploadBytes: geometryUploadBytes + cursorData.byteLength,\n atlasUploadBytes:\n monoUploadsAfter.bytes -\n monoUploadsBefore!.bytes +\n (colorUploadsAfter.bytes - colorUploadsBefore!.bytes) +\n (fallbackUploadsAfter.bytes - fallbackUploadsBefore!.bytes),\n atlasUploadCalls:\n monoUploadsAfter.calls -\n monoUploadsBefore!.calls +\n (colorUploadsAfter.calls - colorUploadsBefore!.calls) +\n (fallbackUploadsAfter.calls - fallbackUploadsBefore!.calls),\n };\n }\n\n settle(): Promise<void> {\n return this.device.queue.onSubmittedWorkDone();\n }\n\n destroy(): void {\n for (const id of [...this.#surfaces.keys()]) this.unmount(id);\n this.#monoAtlas.destroy();\n this.#colorAtlas.destroy();\n this.#fallbackAtlas.destroy();\n this.device.destroy();\n }\n}\n", "export interface AppliedFrameState {\n sessionEpoch: bigint;\n layoutEpoch: bigint;\n sequence: bigint;\n awaitingResync: boolean;\n}\n\nexport interface IncomingFrameState {\n sessionEpoch: bigint;\n layoutEpoch: bigint;\n sequence: bigint;\n full: boolean;\n}\n\nexport function classifyFrame(\n previous: AppliedFrameState,\n incoming: IncomingFrameState,\n): \"accept\" | \"stale\" | \"resync\" {\n const sameSession = previous.sessionEpoch === 0n || incoming.sessionEpoch === previous.sessionEpoch;\n if (\n sameSession &&\n (incoming.layoutEpoch < previous.layoutEpoch ||\n (incoming.layoutEpoch === previous.layoutEpoch && incoming.sequence <= previous.sequence))\n )\n return \"stale\";\n if (previous.awaitingResync && !incoming.full) return \"resync\";\n const changedSession = !sameSession;\n const missingInitialSnapshot = previous.sessionEpoch === 0n && !incoming.full;\n const sequenceGap =\n previous.sessionEpoch === incoming.sessionEpoch &&\n previous.sequence !== 0n &&\n incoming.sequence !== previous.sequence + 1n;\n return !incoming.full && (changedSession || missingInitialSnapshot || sequenceGap) ? \"resync\" : \"accept\";\n}\n", "import type { CursorState } from \"@vibecook/ghosttea-frame\";\n\nexport function cursorActivityChangesPixels(\n cursor: CursorState,\n focused: boolean,\n cursorBlinkVisible: boolean,\n): boolean {\n return focused && cursor.visible && cursor.blinking && !cursorBlinkVisible;\n}\n", "export interface GlyphCatalogBudget {\n maxDefinitions: number;\n maxSharedDefinitions: number;\n maxSessionPixelBytes: number;\n maxSharedPixelBytes: number;\n}\n\nexport type CatalogAdmission = \"install\" | \"request-full\" | \"text-fallback\";\n\nexport function catalogAdmission(\n resetsCatalog: boolean,\n alreadyUsingFallback: boolean,\n fits: boolean,\n): CatalogAdmission {\n if (alreadyUsingFallback && !resetsCatalog) return \"text-fallback\";\n if (fits) return \"install\";\n return resetsCatalog ? \"text-fallback\" : \"request-full\";\n}\n\ninterface GlyphLike {\n id: number;\n pixels: { byteLength: number };\n}\n\nexport function glyphCatalogFits<T extends GlyphLike>(\n sessionDefinitions: ReadonlyMap<number, T>,\n sessionPixelBytes: number,\n sharedDefinitions: ReadonlyMap<number, { definition: T }>,\n sharedPixelBytes: number,\n definitions: readonly T[],\n budget: GlyphCatalogBudget,\n): boolean {\n if (definitions.length === 0) return true;\n let nextDefinitionCount = sessionDefinitions.size;\n let nextSharedDefinitionCount = sharedDefinitions.size;\n let nextSessionPixelBytes = sessionPixelBytes;\n let nextSharedPixelBytes = sharedPixelBytes;\n const pending = new Set<number>();\n for (const definition of definitions) {\n if (sessionDefinitions.has(definition.id) || pending.has(definition.id)) continue;\n pending.add(definition.id);\n const shared = sharedDefinitions.get(definition.id);\n const pixelBytes = shared?.definition.pixels.byteLength ?? definition.pixels.byteLength;\n nextDefinitionCount += 1;\n nextSessionPixelBytes += pixelBytes;\n if (!shared) {\n nextSharedDefinitionCount += 1;\n nextSharedPixelBytes += pixelBytes;\n }\n if (\n nextDefinitionCount > budget.maxDefinitions ||\n nextSharedDefinitionCount > budget.maxSharedDefinitions ||\n nextSessionPixelBytes > budget.maxSessionPixelBytes ||\n nextSharedPixelBytes > budget.maxSharedPixelBytes\n )\n return false;\n }\n return true;\n}\n\nexport function definitionCatalogFits<T extends { id: number }>(\n installed: ReadonlyMap<number, T>,\n definitions: readonly T[],\n maxDefinitions: number,\n retainedDefinitions = installed.size,\n maxRetainedDefinitions = Number.MAX_SAFE_INTEGER,\n): boolean {\n if (definitions.length === 0) return true;\n let nextDefinitionCount = installed.size;\n let nextRetainedDefinitions = retainedDefinitions;\n const pending = new Set<number>();\n for (const definition of definitions) {\n if (installed.has(definition.id) || pending.has(definition.id)) continue;\n pending.add(definition.id);\n nextDefinitionCount += 1;\n nextRetainedDefinitions += 1;\n if (nextDefinitionCount > maxDefinitions || nextRetainedDefinitions > maxRetainedDefinitions) return false;\n }\n return true;\n}\n", "/**\n * Public client-side contract for the TPv3 routed terminal transport.\n *\n * The authority which mints and verifies grants lives outside Ghosttea. Grants\n * are therefore represented structurally and are transported unchanged. The\n * helpers in this module validate the renderer-facing wire invariants without\n * taking a dependency on an authority-specific schema package.\n */\n\nexport type RoutedTransportChannel = \"control\" | \"frames\";\nexport type RoutedCapability = \"resume\" | \"snapshot-demand\" | \"profiling-envelope\" | (string & {});\nexport type RoutedSessionRight = \"geometry\" | \"geometryAdmin\" | \"input\" | \"read\" | (string & {});\n\nexport interface RoutedCellEndpoints {\n controlUrl: string;\n framesUrl: string;\n [key: string]: unknown;\n}\n\nexport interface RoutedRouteBinding {\n cellBootId: string;\n routeRevision: number;\n leaseEpoch?: number;\n [key: string]: unknown;\n}\n\nexport interface RoutedGrantProtectedHeader {\n v: 1;\n typ: \"CellTransportGrant\" | \"SessionAttachGrant\";\n iss: \"fieldd\";\n alg: \"HS256\";\n kid: {\n cellBootId: string;\n keyGeneration: number;\n [key: string]: unknown;\n };\n [key: string]: unknown;\n}\n\nexport interface RoutedCellTransportGrantClaims {\n audienceCellBootId: string;\n clientId: string;\n connectionSetId: string;\n allowedChannels: RoutedTransportChannel[];\n transportGrantGeneration: number;\n issuedAt: number;\n expiresAt: number;\n nonce: string;\n [key: string]: unknown;\n}\n\nexport interface RoutedSessionAttachGrantClaims {\n audienceCellBootId: string;\n clientId: string;\n sessionId: string;\n leaseEpoch?: number;\n routeRevision: number;\n grantGeneration: number;\n rights: RoutedSessionRight[];\n issuedAt: number;\n expiresAt: number;\n [key: string]: unknown;\n}\n\nexport interface RoutedAuthenticatedGrant<TType extends RoutedGrantProtectedHeader[\"typ\"], TClaims> {\n protected: RoutedGrantProtectedHeader & { typ: TType };\n claims: TClaims;\n mac: string;\n [key: string]: unknown;\n}\n\nexport type RoutedCellTransportGrant = RoutedAuthenticatedGrant<\"CellTransportGrant\", RoutedCellTransportGrantClaims>;\nexport type RoutedSessionAttachGrant = RoutedAuthenticatedGrant<\"SessionAttachGrant\", RoutedSessionAttachGrantClaims>;\n\nexport interface RoutedTerminalOpenTicket {\n route: RoutedRouteBinding;\n endpoints?: RoutedCellEndpoints;\n transportGrant: RoutedCellTransportGrant;\n attachGrant: RoutedSessionAttachGrant;\n [key: string]: unknown;\n}\n\nexport interface RoutedReceiverCapacities {\n connectionCreditBytes: number;\n perActivationCreditBytes: number;\n stagingBytesPerSession: number;\n stagingBytesTotal: number;\n maxConcurrentActivations: number;\n maxConcurrentSeeds: number;\n [key: string]: unknown;\n}\n\nexport interface RoutedProtocolLimits {\n maxControlMessageBytes: number;\n maxPresentationChunkBytes: number;\n maxBatchLatencyMs: number;\n maxCreditReturnDelayMs: number;\n maxSceneAppliedDelayMs: number;\n sceneAppliedRefreshMs: number;\n presentationStatusRefreshMs: number;\n activationAttachDeadlineMs: number;\n maxActivationCatchupMs: number;\n maxCatchupBytes: number;\n creditAccountDrainTtlMs: number;\n urgentReserveBytes: number;\n maxBulkBytesAdmittedAhead: number;\n maxUrgentPresentationUnitBytes: number;\n [key: string]: unknown;\n}\n\nexport const ROUTED_PROTOCOL_VERSION = { major: 1, minor: 0 } as const;\n\n/** Conservative browser-worker capacities from the TPv3 golden HELLO. */\nexport const DEFAULT_ROUTED_RECEIVER_CAPACITIES: RoutedReceiverCapacities = {\n connectionCreditBytes: 8_388_608,\n perActivationCreditBytes: 2_097_152,\n stagingBytesPerSession: 16_777_216,\n stagingBytesTotal: 67_108_864,\n maxConcurrentActivations: 128,\n maxConcurrentSeeds: 4,\n};\n\n/** Ratified T1 limits. The cell repeats its authoritative values on accept. */\nexport const DEFAULT_ROUTED_PROTOCOL_LIMITS: RoutedProtocolLimits = {\n maxControlMessageBytes: 262_144,\n maxPresentationChunkBytes: 1_048_576,\n maxBatchLatencyMs: 4,\n maxCreditReturnDelayMs: 16,\n maxSceneAppliedDelayMs: 1_000,\n sceneAppliedRefreshMs: 2_000,\n presentationStatusRefreshMs: 2_000,\n activationAttachDeadlineMs: 5_000,\n maxActivationCatchupMs: 3_000,\n maxCatchupBytes: 8_388_608,\n creditAccountDrainTtlMs: 5_000,\n urgentReserveBytes: 2_097_152,\n maxBulkBytesAdmittedAhead: 4_194_304,\n maxUrgentPresentationUnitBytes: 262_144,\n};\n\nexport const ROUTED_DOOR_LIMITS = {\n helloDeadlineMs: 5_000,\n preAuthMaxBytes: 65_536,\n preAuthConnectionCap: 64,\n maxConnectionSets: 256,\n heartbeatIntervalMs: 5_000,\n heartbeatTtlMs: 15_000,\n} as const;\n\nexport const ROUTED_CLOSE_CODES = {\n GOING_AWAY: 1001,\n POLICY_PRE_AUTH: 1008,\n SERVER_ERROR: 1011,\n STALE_ROUTE: 4000,\n FENCED: 4001,\n SUPERSEDED: 4002,\n PROTOCOL: 4003,\n LEG_TIMEOUT: 4004,\n} as const;\n\nexport type RoutedCloseReason =\n | \"going-away\"\n | \"pre-auth\"\n | \"server-error\"\n | \"stale-route\"\n | \"fenced\"\n | \"superseded\"\n | \"protocol\"\n | \"leg-timeout\"\n | \"unknown\";\n\nexport function classifyRoutedClose(code: number): RoutedCloseReason {\n switch (code) {\n case ROUTED_CLOSE_CODES.GOING_AWAY:\n return \"going-away\";\n case ROUTED_CLOSE_CODES.POLICY_PRE_AUTH:\n return \"pre-auth\";\n case ROUTED_CLOSE_CODES.SERVER_ERROR:\n return \"server-error\";\n case ROUTED_CLOSE_CODES.STALE_ROUTE:\n return \"stale-route\";\n case ROUTED_CLOSE_CODES.FENCED:\n return \"fenced\";\n case ROUTED_CLOSE_CODES.SUPERSEDED:\n return \"superseded\";\n case ROUTED_CLOSE_CODES.PROTOCOL:\n return \"protocol\";\n case ROUTED_CLOSE_CODES.LEG_TIMEOUT:\n return \"leg-timeout\";\n default:\n return \"unknown\";\n }\n}\n\nexport interface RoutedSceneEpoch {\n cellBootId: string;\n modelGeneration: number;\n [key: string]: unknown;\n}\n\nexport interface RoutedSceneContentStamp {\n sceneEpoch: RoutedSceneEpoch;\n sceneRevision: number;\n [key: string]: unknown;\n}\n\nexport function compareRoutedSceneContent(\n left: RoutedSceneContentStamp,\n right: RoutedSceneContentStamp,\n): -1 | 0 | 1 | null {\n if (\n left.sceneEpoch.cellBootId !== right.sceneEpoch.cellBootId ||\n left.sceneEpoch.modelGeneration !== right.sceneEpoch.modelGeneration\n ) {\n return null;\n }\n if (left.sceneRevision === right.sceneRevision) return 0;\n return left.sceneRevision < right.sceneRevision ? -1 : 1;\n}\n\nexport interface RoutedSourceDemand {\n mode: \"none\" | \"snapshot\" | \"live\";\n cadenceClass?: \"low\" | \"normal\" | \"high\";\n urgency?: \"background\" | \"normal\" | \"urgent\";\n [key: string]: unknown;\n}\n\nexport interface RoutedConnectionHello {\n protocolMajor: number;\n protocolMinor: number;\n channel: RoutedTransportChannel;\n transportGrant: RoutedCellTransportGrant;\n receiverCapacities?: RoutedReceiverCapacities;\n capabilities: string[];\n [key: string]: unknown;\n}\n\nexport interface RoutedConnectionAccepted {\n selectedProtocolVersion: { major: number; minor: number; [key: string]: unknown };\n connectionSetId: string;\n channel: RoutedTransportChannel;\n legGeneration: number;\n heartbeatTtlMs: number;\n creditEpoch?: number;\n initialWindows?: RoutedReceiverCapacities;\n protocolLimits: RoutedProtocolLimits;\n capabilities: string[];\n [key: string]: unknown;\n}\n\nexport interface RoutedConnectionRefused {\n code: string;\n retryable: boolean;\n [key: string]: unknown;\n}\n\nexport interface RoutedLegHeartbeat {\n connectionSetId: string;\n channel: RoutedTransportChannel;\n legGeneration: number;\n sequence: number;\n [key: string]: unknown;\n}\n\nexport interface RoutedLegHeartbeatAck {\n sequence: number;\n [key: string]: unknown;\n}\n\nexport interface RoutedAttachControlLeg {\n activationId: string;\n attachGrant: RoutedSessionAttachGrant;\n replacesActivationId?: string;\n initialDemand: RoutedSourceDemand;\n [key: string]: unknown;\n}\n\nexport interface RoutedControlLegAttached {\n sessionId: string;\n activationId: string;\n grantGenerationAccepted: number;\n rights: RoutedSessionRight[];\n [key: string]: unknown;\n}\n\nexport interface RoutedAttachRefused {\n activationId?: string;\n code: string;\n retryable: boolean;\n [key: string]: unknown;\n}\n\nexport interface RoutedResumeRequest {\n resumeToken: string;\n from: RoutedSceneContentStamp;\n [key: string]: unknown;\n}\n\nexport interface RoutedAttachFramesLeg {\n activationId: string;\n attachGrant: RoutedSessionAttachGrant;\n resume?: RoutedResumeRequest;\n [key: string]: unknown;\n}\n\nexport interface RoutedTrfIdentity {\n sessionHandle: string;\n viewHandle: string;\n [key: string]: unknown;\n}\n\nexport interface RoutedFramesAttachOutcome {\n kind: \"resume-accepted\" | \"seed-required\";\n from?: RoutedSceneContentStamp;\n newestAvailable?: RoutedSceneContentStamp;\n reason?: string;\n [key: string]: unknown;\n}\n\nexport interface RoutedFramesLegAttached {\n sessionId: string;\n activationId: string;\n resumeToken: string;\n trfIdentity: RoutedTrfIdentity;\n outcome: RoutedFramesAttachOutcome;\n [key: string]: unknown;\n}\n\nexport interface RoutedDeclareDemand {\n sessionId: string;\n activationId: string;\n leaseEpoch: number;\n demandSequence: number;\n demand: RoutedSourceDemand;\n [key: string]: unknown;\n}\n\nexport interface RoutedDemandAccepted {\n demandSequence: number;\n [key: string]: unknown;\n}\n\nexport interface RoutedPresentationDimension {\n state: \"presenting\" | \"stopped\" | \"revoked\";\n reason?: string;\n [key: string]: unknown;\n}\n\nexport interface RoutedInputDimension {\n state: \"allowed\" | \"suspended\" | \"revoked\";\n reason?: string;\n [key: string]: unknown;\n}\n\nexport interface RoutedCellActivationStatus {\n sessionId: string;\n activationId: string;\n cellStatusSequence: number;\n leaseTtlMs: number;\n acceptedContent?: RoutedSceneContentStamp;\n presentation: RoutedPresentationDimension;\n input: RoutedInputDimension;\n [key: string]: unknown;\n}\n\nexport interface RoutedPresentationStatus {\n activationId: string;\n workerStatusSequence: number;\n state: \"connecting\" | \"seeding\" | \"active\" | \"recovering\";\n sceneContent?: RoutedSceneContentStamp;\n leaseTtlMs: number;\n [key: string]: unknown;\n}\n\nexport interface RoutedFramesLegState {\n activationId: string;\n state: \"attaching\" | \"resuming\" | \"seeding\" | \"applying\" | \"active\" | \"failed\";\n resumeToken?: string;\n appliedContent?: RoutedSceneContentStamp;\n [key: string]: unknown;\n}\n\nexport interface RoutedGeometryClaimant {\n clientId: string;\n viewId: string;\n [key: string]: unknown;\n}\n\nexport interface RoutedGeometryHolder extends RoutedGeometryClaimant {\n holderGeneration: number;\n}\n\ninterface RoutedActivationTriple {\n sessionId: string;\n activationId: string;\n leaseEpoch: number;\n}\n\nexport interface RoutedClaimGeometry extends RoutedActivationTriple {\n claimant: RoutedGeometryClaimant;\n cols: number;\n rows: number;\n expectRevision: number;\n [key: string]: unknown;\n}\n\nexport interface RoutedReleaseGeometry extends RoutedActivationTriple {\n holder: RoutedGeometryHolder;\n [key: string]: unknown;\n}\n\nexport interface RoutedTransferGeometry extends RoutedActivationTriple {\n from: RoutedGeometryHolder;\n to: RoutedGeometryClaimant;\n expectRevision: number;\n cols: number;\n rows: number;\n [key: string]: unknown;\n}\n\nexport interface RoutedGeometryCommitted {\n holder: RoutedGeometryHolder;\n geometryRevision: number;\n cols: number;\n rows: number;\n [key: string]: unknown;\n}\n\nexport interface RoutedGeometryRefused {\n code: string;\n currentHolder?: RoutedGeometryHolder;\n geometryRevision?: number;\n [key: string]: unknown;\n}\n\nexport interface RoutedTransportCredit {\n creditEpoch: number;\n creditSequence: number;\n connectionBytesReturned: number;\n accounts: Array<{ activationId: string; bytesReturned: number; [key: string]: unknown }>;\n [key: string]: unknown;\n}\n\nexport interface RoutedSceneApplied {\n sessionId: string;\n activationId: string;\n leaseEpoch: number;\n appliedContent: RoutedSceneContentStamp;\n [key: string]: unknown;\n}\n\nexport interface RoutedCalibrationPing {\n sequence: number;\n t0: number;\n [key: string]: unknown;\n}\n\nexport type RoutedMessageBodyMap = {\n ConnectionHello: RoutedConnectionHello;\n ConnectionAccepted: RoutedConnectionAccepted;\n ConnectionRefused: RoutedConnectionRefused;\n LegHeartbeat: RoutedLegHeartbeat;\n LegHeartbeatAck: RoutedLegHeartbeatAck;\n AttachControlLeg: RoutedAttachControlLeg;\n ControlLegAttached: RoutedControlLegAttached;\n AttachRefused: RoutedAttachRefused;\n DeclareDemand: RoutedDeclareDemand;\n DemandAccepted: RoutedDemandAccepted;\n CellActivationStatus: RoutedCellActivationStatus;\n ClaimGeometry: RoutedClaimGeometry;\n ReleaseGeometry: RoutedReleaseGeometry;\n TransferGeometry: RoutedTransferGeometry;\n GeometryCommitted: RoutedGeometryCommitted;\n GeometryRefused: RoutedGeometryRefused;\n AttachFramesLeg: RoutedAttachFramesLeg;\n FramesLegAttached: RoutedFramesLegAttached;\n TransportCredit: RoutedTransportCredit;\n SceneApplied: RoutedSceneApplied;\n CalibrationPing: RoutedCalibrationPing;\n};\n\nexport type RoutedMessageType = keyof RoutedMessageBodyMap;\nexport type RoutedTaggedMessage<T extends RoutedMessageType = RoutedMessageType> = T extends RoutedMessageType\n ? { type: T } & RoutedMessageBodyMap[T]\n : never;\n\nexport const ROUTED_MESSAGE_TYPES = [\n \"ConnectionHello\",\n \"ConnectionAccepted\",\n \"ConnectionRefused\",\n \"LegHeartbeat\",\n \"LegHeartbeatAck\",\n \"AttachControlLeg\",\n \"ControlLegAttached\",\n \"AttachRefused\",\n \"DeclareDemand\",\n \"DemandAccepted\",\n \"CellActivationStatus\",\n \"ClaimGeometry\",\n \"ReleaseGeometry\",\n \"TransferGeometry\",\n \"GeometryCommitted\",\n \"GeometryRefused\",\n \"AttachFramesLeg\",\n \"FramesLegAttached\",\n \"TransportCredit\",\n \"SceneApplied\",\n \"CalibrationPing\",\n] as const satisfies readonly RoutedMessageType[];\n\nexport const ROUTED_LEG_INBOUND = {\n control: [\n \"ConnectionHello\",\n \"LegHeartbeat\",\n \"AttachControlLeg\",\n \"DeclareDemand\",\n \"ClaimGeometry\",\n \"ReleaseGeometry\",\n \"TransferGeometry\",\n ],\n frames: [\"ConnectionHello\", \"LegHeartbeat\", \"AttachFramesLeg\", \"TransportCredit\", \"SceneApplied\", \"CalibrationPing\"],\n} as const satisfies Readonly<Record<RoutedTransportChannel, readonly RoutedMessageType[]>>;\n\nexport const ROUTED_LEG_OUTBOUND = {\n control: [\n \"ConnectionAccepted\",\n \"ConnectionRefused\",\n \"LegHeartbeatAck\",\n \"ControlLegAttached\",\n \"AttachRefused\",\n \"DemandAccepted\",\n \"CellActivationStatus\",\n \"GeometryCommitted\",\n \"GeometryRefused\",\n ],\n frames: [\"ConnectionAccepted\", \"ConnectionRefused\", \"LegHeartbeatAck\", \"FramesLegAttached\", \"AttachRefused\"],\n} as const satisfies Readonly<Record<RoutedTransportChannel, readonly RoutedMessageType[]>>;\n\nconst routedMessageTypeSet = new Set<string>(ROUTED_MESSAGE_TYPES);\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isCounter(value: unknown): value is number {\n return Number.isSafeInteger(value) && Number(value) >= 0;\n}\n\nfunction isPositiveInteger(value: unknown): value is number {\n return Number.isSafeInteger(value) && Number(value) > 0;\n}\n\nfunction isNonEmptyString(value: unknown): value is string {\n return typeof value === \"string\" && value.length > 0;\n}\n\nfunction isStringArray(value: unknown): value is string[] {\n return Array.isArray(value) && value.every((item) => typeof item === \"string\");\n}\n\nfunction isSortedUniqueStringArray(value: unknown, allowed?: ReadonlySet<string>): value is string[] {\n return (\n isStringArray(value) &&\n value.every(\n (item, index) => (allowed === undefined || allowed.has(item)) && (index === 0 || String(value[index - 1]) < item),\n )\n );\n}\n\nfunction hasOptionalCounter(record: Record<string, unknown>, key: string): boolean {\n return record[key] === undefined || isCounter(record[key]);\n}\n\nfunction hasOptionalString(record: Record<string, unknown>, key: string): boolean {\n return record[key] === undefined || typeof record[key] === \"string\";\n}\n\nfunction isStamp(value: unknown): value is RoutedSceneContentStamp {\n if (!isRecord(value) || !isRecord(value.sceneEpoch)) return false;\n return (\n isNonEmptyString(value.sceneEpoch.cellBootId) &&\n isCounter(value.sceneEpoch.modelGeneration) &&\n isCounter(value.sceneRevision)\n );\n}\n\nconst transportChannels = new Set<string>([\"control\", \"frames\"]);\nconst sessionRights = new Set<string>([\"geometry\", \"geometryAdmin\", \"input\", \"read\"]);\nconst loopbackWebSocket = /^wss?:\\/\\/(127\\.0\\.0\\.1|\\[::1\\]|localhost)(:\\d{1,5})?(\\/[^?#]*)?$/;\n\nfunction isGrantProtectedHeader(value: unknown, type: RoutedGrantProtectedHeader[\"typ\"]): boolean {\n return (\n isRecord(value) &&\n value.v === 1 &&\n value.typ === type &&\n value.iss === \"fieldd\" &&\n value.alg === \"HS256\" &&\n isRecord(value.kid) &&\n isNonEmptyString(value.kid.cellBootId) &&\n isCounter(value.kid.keyGeneration)\n );\n}\n\n/** Runtime guard for a cell transport grant. MAC verification remains the cell's responsibility. */\nexport function isRoutedCellTransportGrant(value: unknown): value is RoutedCellTransportGrant {\n if (!isRecord(value) || !isGrantProtectedHeader(value.protected, \"CellTransportGrant\")) return false;\n const claims = value.claims;\n return (\n isRecord(claims) &&\n isNonEmptyString(claims.audienceCellBootId) &&\n isNonEmptyString(claims.clientId) &&\n isNonEmptyString(claims.connectionSetId) &&\n isSortedUniqueStringArray(claims.allowedChannels, transportChannels) &&\n claims.allowedChannels.length > 0 &&\n isCounter(claims.transportGrantGeneration) &&\n isCounter(claims.issuedAt) &&\n isCounter(claims.expiresAt) &&\n isNonEmptyString(claims.nonce) &&\n isNonEmptyString(value.mac)\n );\n}\n\n/** Runtime guard for an attach grant. MAC verification remains the cell's responsibility. */\nexport function isRoutedSessionAttachGrant(value: unknown): value is RoutedSessionAttachGrant {\n if (!isRecord(value) || !isGrantProtectedHeader(value.protected, \"SessionAttachGrant\")) return false;\n const claims = value.claims;\n return (\n isRecord(claims) &&\n isNonEmptyString(claims.audienceCellBootId) &&\n isNonEmptyString(claims.clientId) &&\n isNonEmptyString(claims.sessionId) &&\n hasOptionalCounter(claims, \"leaseEpoch\") &&\n isCounter(claims.routeRevision) &&\n isCounter(claims.grantGeneration) &&\n isSortedUniqueStringArray(claims.rights, sessionRights) &&\n isCounter(claims.issuedAt) &&\n isCounter(claims.expiresAt) &&\n isNonEmptyString(value.mac)\n );\n}\n\nexport function isRoutedReceiverCapacities(value: unknown): value is RoutedReceiverCapacities {\n return (\n isRecord(value) &&\n isCounter(value.connectionCreditBytes) &&\n isCounter(value.perActivationCreditBytes) &&\n isCounter(value.stagingBytesPerSession) &&\n isCounter(value.stagingBytesTotal) &&\n isCounter(value.maxConcurrentActivations) &&\n isCounter(value.maxConcurrentSeeds)\n );\n}\n\nexport function isRoutedProtocolLimits(value: unknown): value is RoutedProtocolLimits {\n return (\n isRecord(value) &&\n isCounter(value.maxControlMessageBytes) &&\n isCounter(value.maxPresentationChunkBytes) &&\n isCounter(value.maxBatchLatencyMs) &&\n isCounter(value.maxCreditReturnDelayMs) &&\n isCounter(value.maxSceneAppliedDelayMs) &&\n isCounter(value.sceneAppliedRefreshMs) &&\n isCounter(value.presentationStatusRefreshMs) &&\n isCounter(value.activationAttachDeadlineMs) &&\n isCounter(value.maxActivationCatchupMs) &&\n isCounter(value.maxCatchupBytes) &&\n isCounter(value.creditAccountDrainTtlMs) &&\n isCounter(value.urgentReserveBytes) &&\n isCounter(value.maxBulkBytesAdmittedAhead) &&\n isCounter(value.maxUrgentPresentationUnitBytes)\n );\n}\n\nfunction isSourceDemand(value: unknown): value is RoutedSourceDemand {\n return (\n isRecord(value) &&\n (value.mode === \"none\" || value.mode === \"snapshot\" || value.mode === \"live\") &&\n (value.cadenceClass === undefined ||\n value.cadenceClass === \"low\" ||\n value.cadenceClass === \"normal\" ||\n value.cadenceClass === \"high\") &&\n (value.urgency === undefined ||\n value.urgency === \"background\" ||\n value.urgency === \"normal\" ||\n value.urgency === \"urgent\")\n );\n}\n\nfunction isTrfIdentity(value: unknown): value is RoutedTrfIdentity {\n return (\n isRecord(value) &&\n typeof value.sessionHandle === \"string\" &&\n /^(0|[1-9][0-9]*)$/.test(value.sessionHandle) &&\n typeof value.viewHandle === \"string\" &&\n /^(0|[1-9][0-9]*)$/.test(value.viewHandle)\n );\n}\n\nfunction isFramesAttachOutcome(value: unknown): value is RoutedFramesAttachOutcome {\n if (!isRecord(value) || (value.kind !== \"resume-accepted\" && value.kind !== \"seed-required\")) return false;\n if (!hasOptionalString(value, \"reason\")) return false;\n if (value.kind === \"resume-accepted\") return isStamp(value.from) && isStamp(value.newestAvailable);\n return (\n (value.from === undefined || isStamp(value.from)) &&\n (value.newestAvailable === undefined || isStamp(value.newestAvailable))\n );\n}\n\nfunction isGeometryClaimant(value: unknown): value is RoutedGeometryClaimant {\n return isRecord(value) && isNonEmptyString(value.clientId) && isNonEmptyString(value.viewId);\n}\n\nfunction isGeometryHolder(value: unknown): value is RoutedGeometryHolder {\n return isGeometryClaimant(value) && isCounter(value.holderGeneration);\n}\n\n/** Validate the transport-private ticket before any endpoint is dialled. */\nexport function isRoutedTerminalOpenTicket(value: unknown): value is RoutedTerminalOpenTicket {\n if (!isRecord(value) || !isRecord(value.route)) return false;\n if (\n !isNonEmptyString(value.route.cellBootId) ||\n !isCounter(value.route.routeRevision) ||\n !hasOptionalCounter(value.route, \"leaseEpoch\") ||\n !isRoutedCellTransportGrant(value.transportGrant) ||\n !isRoutedSessionAttachGrant(value.attachGrant)\n ) {\n return false;\n }\n return (\n value.endpoints === undefined ||\n (isRecord(value.endpoints) &&\n typeof value.endpoints.controlUrl === \"string\" &&\n loopbackWebSocket.test(value.endpoints.controlUrl) &&\n typeof value.endpoints.framesUrl === \"string\" &&\n loopbackWebSocket.test(value.endpoints.framesUrl))\n );\n}\n\nfunction hasActivation(record: Record<string, unknown>): boolean {\n return isNonEmptyString(record.activationId);\n}\n\nfunction validateRoutedBody(type: RoutedMessageType, body: Record<string, unknown>): boolean {\n switch (type) {\n case \"ConnectionHello\":\n return (\n isCounter(body.protocolMajor) &&\n isCounter(body.protocolMinor) &&\n (body.channel === \"control\" || body.channel === \"frames\") &&\n isRoutedCellTransportGrant(body.transportGrant) &&\n (body.receiverCapacities === undefined || isRoutedReceiverCapacities(body.receiverCapacities)) &&\n isStringArray(body.capabilities)\n );\n case \"ConnectionAccepted\":\n return (\n isRecord(body.selectedProtocolVersion) &&\n isCounter(body.selectedProtocolVersion.major) &&\n isCounter(body.selectedProtocolVersion.minor) &&\n isNonEmptyString(body.connectionSetId) &&\n (body.channel === \"control\" || body.channel === \"frames\") &&\n isCounter(body.legGeneration) &&\n isCounter(body.heartbeatTtlMs) &&\n hasOptionalCounter(body, \"creditEpoch\") &&\n (body.initialWindows === undefined || isRoutedReceiverCapacities(body.initialWindows)) &&\n isRoutedProtocolLimits(body.protocolLimits) &&\n isStringArray(body.capabilities)\n );\n case \"ConnectionRefused\":\n return typeof body.code === \"string\" && typeof body.retryable === \"boolean\";\n case \"LegHeartbeat\":\n return (\n isNonEmptyString(body.connectionSetId) &&\n (body.channel === \"control\" || body.channel === \"frames\") &&\n isCounter(body.legGeneration) &&\n isCounter(body.sequence)\n );\n case \"LegHeartbeatAck\":\n return isCounter(body.sequence);\n case \"AttachControlLeg\":\n return (\n hasActivation(body) &&\n isRoutedSessionAttachGrant(body.attachGrant) &&\n (body.replacesActivationId === undefined || isNonEmptyString(body.replacesActivationId)) &&\n isSourceDemand(body.initialDemand)\n );\n case \"ControlLegAttached\":\n return (\n isNonEmptyString(body.sessionId) &&\n hasActivation(body) &&\n isCounter(body.grantGenerationAccepted) &&\n isSortedUniqueStringArray(body.rights, sessionRights)\n );\n case \"AttachRefused\":\n return (\n (body.activationId === undefined || isNonEmptyString(body.activationId)) &&\n typeof body.code === \"string\" &&\n typeof body.retryable === \"boolean\"\n );\n case \"DeclareDemand\":\n return (\n isNonEmptyString(body.sessionId) &&\n hasActivation(body) &&\n isCounter(body.leaseEpoch) &&\n isCounter(body.demandSequence) &&\n isSourceDemand(body.demand)\n );\n case \"DemandAccepted\":\n return isCounter(body.demandSequence);\n case \"CellActivationStatus\":\n if (\n !isNonEmptyString(body.sessionId) ||\n !hasActivation(body) ||\n !isCounter(body.cellStatusSequence) ||\n !isCounter(body.leaseTtlMs) ||\n (body.acceptedContent !== undefined && !isStamp(body.acceptedContent)) ||\n !isRecord(body.presentation) ||\n ![\"presenting\", \"stopped\", \"revoked\"].includes(String(body.presentation.state)) ||\n !hasOptionalString(body.presentation, \"reason\") ||\n !isRecord(body.input) ||\n ![\"allowed\", \"suspended\", \"revoked\"].includes(String(body.input.state)) ||\n !hasOptionalString(body.input, \"reason\")\n ) {\n return false;\n }\n return body.input.state !== \"allowed\" || body.presentation.state === \"presenting\";\n case \"ClaimGeometry\":\n return (\n isNonEmptyString(body.sessionId) &&\n hasActivation(body) &&\n isCounter(body.leaseEpoch) &&\n isGeometryClaimant(body.claimant) &&\n isPositiveInteger(body.cols) &&\n isPositiveInteger(body.rows) &&\n isCounter(body.expectRevision)\n );\n case \"ReleaseGeometry\":\n return (\n isNonEmptyString(body.sessionId) &&\n hasActivation(body) &&\n isCounter(body.leaseEpoch) &&\n isGeometryHolder(body.holder)\n );\n case \"TransferGeometry\":\n return (\n isNonEmptyString(body.sessionId) &&\n hasActivation(body) &&\n isCounter(body.leaseEpoch) &&\n isGeometryHolder(body.from) &&\n isGeometryClaimant(body.to) &&\n isCounter(body.expectRevision) &&\n isPositiveInteger(body.cols) &&\n isPositiveInteger(body.rows)\n );\n case \"GeometryCommitted\":\n return (\n isGeometryHolder(body.holder) &&\n isCounter(body.geometryRevision) &&\n isPositiveInteger(body.cols) &&\n isPositiveInteger(body.rows)\n );\n case \"GeometryRefused\":\n return (\n typeof body.code === \"string\" &&\n (body.currentHolder === undefined || isGeometryHolder(body.currentHolder)) &&\n hasOptionalCounter(body, \"geometryRevision\")\n );\n case \"AttachFramesLeg\":\n return (\n hasActivation(body) &&\n isRoutedSessionAttachGrant(body.attachGrant) &&\n (body.resume === undefined ||\n (isRecord(body.resume) && isNonEmptyString(body.resume.resumeToken) && isStamp(body.resume.from)))\n );\n case \"FramesLegAttached\":\n return (\n isNonEmptyString(body.sessionId) &&\n hasActivation(body) &&\n isNonEmptyString(body.resumeToken) &&\n isTrfIdentity(body.trfIdentity) &&\n isFramesAttachOutcome(body.outcome)\n );\n case \"TransportCredit\":\n return (\n isCounter(body.creditEpoch) &&\n isCounter(body.creditSequence) &&\n isCounter(body.connectionBytesReturned) &&\n Array.isArray(body.accounts) &&\n body.accounts.every(\n (account) => isRecord(account) && isNonEmptyString(account.activationId) && isCounter(account.bytesReturned),\n )\n );\n case \"SceneApplied\":\n return (\n isNonEmptyString(body.sessionId) &&\n hasActivation(body) &&\n isCounter(body.leaseEpoch) &&\n isStamp(body.appliedContent)\n );\n case \"CalibrationPing\":\n return isCounter(body.sequence) && typeof body.t0 === \"number\" && Number.isFinite(body.t0);\n }\n}\n\nexport type RoutedMessageDecodeError =\n \"not-json\" | \"not-an-object\" | \"missing-type\" | \"unknown-type\" | \"not-allowed-here\" | \"invalid\";\n\nexport type RoutedMessageDecodeResult =\n { ok: true; message: RoutedTaggedMessage } | { ok: false; error: RoutedMessageDecodeError };\n\n/** Decode a text message and enforce the caller-provided leg/direction tag set. */\nexport function decodeRoutedMessage(\n raw: string | unknown,\n allowed: readonly RoutedMessageType[] = ROUTED_MESSAGE_TYPES,\n): RoutedMessageDecodeResult {\n let value: unknown = raw;\n if (typeof raw === \"string\") {\n try {\n value = JSON.parse(raw);\n } catch {\n return { ok: false, error: \"not-json\" };\n }\n }\n if (!isRecord(value)) return { ok: false, error: \"not-an-object\" };\n if (typeof value.type !== \"string\") return { ok: false, error: \"missing-type\" };\n if (!routedMessageTypeSet.has(value.type)) return { ok: false, error: \"unknown-type\" };\n const type = value.type as RoutedMessageType;\n if (!allowed.includes(type)) return { ok: false, error: \"not-allowed-here\" };\n const body = { ...value };\n delete body.type;\n if (!validateRoutedBody(type, body)) return { ok: false, error: \"invalid\" };\n return { ok: true, message: value as RoutedTaggedMessage };\n}\n\nexport function encodeRoutedMessage<T extends RoutedMessageType>(type: T, body: RoutedMessageBodyMap[T]): string {\n if (!isRecord(body) || Object.hasOwn(body, \"type\") || !validateRoutedBody(type, body)) {\n throw new TypeError(`invalid routed ${type} message`);\n }\n return JSON.stringify({ type, ...body });\n}\n\n/** RFC 8785 JSON canonicalization for authenticated-grant MAC input. */\nexport function canonicalRoutedJson(value: unknown): string {\n if (value === null || typeof value === \"boolean\") return JSON.stringify(value);\n if (typeof value === \"number\") {\n if (!Number.isFinite(value)) throw new TypeError(\"canonicalRoutedJson: non-finite number\");\n return JSON.stringify(value);\n }\n if (typeof value === \"string\") return JSON.stringify(value);\n if (Array.isArray(value)) {\n return `[${value\n .map((item) => {\n if (item === undefined) throw new TypeError(\"canonicalRoutedJson: undefined array element\");\n return canonicalRoutedJson(item);\n })\n .join(\",\")}]`;\n }\n if (isRecord(value)) {\n const entries = Object.keys(value)\n .filter((key) => value[key] !== undefined)\n .sort()\n .map((key) => `${JSON.stringify(key)}:${canonicalRoutedJson(value[key])}`);\n return `{${entries.join(\",\")}}`;\n }\n throw new TypeError(`canonicalRoutedJson: unsupported value of type ${typeof value}`);\n}\n\nexport function routedGrantSigningInput(protectedHeader: RoutedGrantProtectedHeader, claims: unknown): string {\n return canonicalRoutedJson({ protected: protectedHeader, claims });\n}\n\nexport type RoutedPresentationEnvelopeKind =\n \"trf1-frame\" | \"transfer-begin\" | \"transfer-chunk\" | \"transfer-end\" | \"calibration\";\nexport type RoutedTransferKind = \"seed\" | \"catchup\";\n\nexport interface RoutedTransferHeader {\n transferId: string;\n kind?: RoutedTransferKind;\n totalBytes?: number;\n chunkCount?: number;\n targetLayout?: { cols: number; rows: number; scrollbackRows: number; [key: string]: unknown };\n checksum?: { alg: \"crc32c\"; value: number; [key: string]: unknown };\n chunkIndex?: number;\n byteOffset?: number;\n [key: string]: unknown;\n}\n\nexport interface RoutedPresentationEnvelopeHeader {\n creditEpoch: number;\n activationSequence: number;\n sessionId: string;\n activationId: string;\n leaseEpoch: number;\n kind: RoutedPresentationEnvelopeKind;\n baseContent?: RoutedSceneContentStamp | null;\n resultContent?: RoutedSceneContentStamp;\n transfer?: RoutedTransferHeader;\n calibration?: { sequence: number; t0: number; t1: number; t2: number; [key: string]: unknown };\n profiling?: {\n damageFirstTs: number;\n damageLastTs: number;\n encodeTs: number;\n probeId?: string;\n [key: string]: unknown;\n };\n [key: string]: unknown;\n}\n\nexport interface RoutedPresentationEnvelope {\n header: RoutedPresentationEnvelopeHeader;\n /** A zero-copy view into the received message. Copy it before retaining. */\n payload: Uint8Array;\n}\n\nexport const ROUTED_PRESENTATION_ENVELOPE_MAGIC = [0x54, 0x50] as const;\nexport const ROUTED_PRESENTATION_ENVELOPE_VERSION = 1 as const;\nexport const ROUTED_PRESENTATION_ENVELOPE_PREFIX_BYTES = 8 as const;\nexport const ROUTED_PRESENTATION_ENVELOPE_MAX_HEADER_BYTES = 4096 as const;\n\nconst routedUtf8Encoder = new TextEncoder();\nconst routedUtf8Decoder = new TextDecoder(\"utf-8\", { fatal: true });\n\nfunction isFiniteNumber(value: unknown): value is number {\n return typeof value === \"number\" && Number.isFinite(value);\n}\n\nfunction isTransferLayout(value: unknown): boolean {\n return (\n isRecord(value) && isPositiveInteger(value.cols) && isPositiveInteger(value.rows) && isCounter(value.scrollbackRows)\n );\n}\n\nfunction isTransferChecksum(value: unknown): boolean {\n return isRecord(value) && value.alg === \"crc32c\" && isCounter(value.value);\n}\n\nfunction isCalibrationEcho(value: unknown): boolean {\n return (\n isRecord(value) &&\n isCounter(value.sequence) &&\n isFiniteNumber(value.t0) &&\n isFiniteNumber(value.t1) &&\n isFiniteNumber(value.t2)\n );\n}\n\nfunction isProfilingEnvelope(value: unknown): boolean {\n return (\n isRecord(value) &&\n isFiniteNumber(value.damageFirstTs) &&\n isFiniteNumber(value.damageLastTs) &&\n isFiniteNumber(value.encodeTs) &&\n (value.probeId === undefined || typeof value.probeId === \"string\")\n );\n}\n\nfunction validateEnvelopeHeader(value: unknown): value is RoutedPresentationEnvelopeHeader {\n if (!isRecord(value)) return false;\n if (\n !isCounter(value.creditEpoch) ||\n !isCounter(value.activationSequence) ||\n !isNonEmptyString(value.sessionId) ||\n !isNonEmptyString(value.activationId) ||\n !isCounter(value.leaseEpoch) ||\n ![\"trf1-frame\", \"transfer-begin\", \"transfer-chunk\", \"transfer-end\", \"calibration\"].includes(String(value.kind))\n ) {\n return false;\n }\n const base = value.baseContent;\n const result = value.resultContent;\n if (base !== undefined && base !== null && !isStamp(base)) return false;\n if (result !== undefined && !isStamp(result)) return false;\n if (value.profiling !== undefined && !isProfilingEnvelope(value.profiling)) return false;\n if (isStamp(base) && isStamp(result) && compareRoutedSceneContent(base, result) === null) return false;\n switch (value.kind) {\n case \"trf1-frame\":\n return Object.hasOwn(value, \"baseContent\") && isStamp(result);\n case \"transfer-begin\": {\n if (!isRecord(value.transfer) || !isNonEmptyString(value.transfer.transferId)) return false;\n if (value.transfer.kind !== \"seed\" && value.transfer.kind !== \"catchup\") return false;\n if (!isCounter(value.transfer.totalBytes) || !isCounter(value.transfer.chunkCount)) return false;\n if (\n !isTransferLayout(value.transfer.targetLayout) ||\n !isTransferChecksum(value.transfer.checksum) ||\n !isStamp(result)\n ) {\n return false;\n }\n if (value.transfer.kind === \"seed\") return base === null;\n return isStamp(base);\n }\n case \"transfer-chunk\":\n return (\n isRecord(value.transfer) &&\n isNonEmptyString(value.transfer.transferId) &&\n isCounter(value.transfer.chunkIndex) &&\n isCounter(value.transfer.byteOffset)\n );\n case \"transfer-end\":\n return isRecord(value.transfer) && isNonEmptyString(value.transfer.transferId);\n case \"calibration\":\n return isCalibrationEcho(value.calibration);\n default:\n return false;\n }\n}\n\nexport function encodeRoutedPresentationEnvelope(\n header: RoutedPresentationEnvelopeHeader,\n payload: Uint8Array,\n): Uint8Array {\n if (!validateEnvelopeHeader(header)) throw new TypeError(\"invalid routed presentation envelope header\");\n const headerBytes = routedUtf8Encoder.encode(JSON.stringify(header));\n if (headerBytes.byteLength > ROUTED_PRESENTATION_ENVELOPE_MAX_HEADER_BYTES) {\n throw new RangeError(`routed presentation envelope header too large: ${headerBytes.byteLength}`);\n }\n const output = new Uint8Array(\n ROUTED_PRESENTATION_ENVELOPE_PREFIX_BYTES + headerBytes.byteLength + payload.byteLength,\n );\n output[0] = ROUTED_PRESENTATION_ENVELOPE_MAGIC[0];\n output[1] = ROUTED_PRESENTATION_ENVELOPE_MAGIC[1];\n output[2] = ROUTED_PRESENTATION_ENVELOPE_VERSION;\n output[3] = 0;\n new DataView(output.buffer, output.byteOffset, output.byteLength).setUint32(4, headerBytes.byteLength, false);\n output.set(headerBytes, ROUTED_PRESENTATION_ENVELOPE_PREFIX_BYTES);\n output.set(payload, ROUTED_PRESENTATION_ENVELOPE_PREFIX_BYTES + headerBytes.byteLength);\n return output;\n}\n\nexport type RoutedPresentationEnvelopeDecodeError =\n | \"short\"\n | \"bad-magic\"\n | \"bad-version\"\n | \"bad-reserved\"\n | \"header-too-large\"\n | \"header-truncated\"\n | \"header-not-utf8\"\n | \"header-not-json\"\n | \"header-invalid\";\n\nexport type RoutedPresentationEnvelopeDecodeResult =\n | { ok: true; envelope: RoutedPresentationEnvelope; chargedBytes: number }\n | { ok: false; error: RoutedPresentationEnvelopeDecodeError };\n\nexport function decodeRoutedPresentationEnvelope(bytes: Uint8Array): RoutedPresentationEnvelopeDecodeResult {\n if (bytes.byteLength < ROUTED_PRESENTATION_ENVELOPE_PREFIX_BYTES) return { ok: false, error: \"short\" };\n if (bytes[0] !== ROUTED_PRESENTATION_ENVELOPE_MAGIC[0] || bytes[1] !== ROUTED_PRESENTATION_ENVELOPE_MAGIC[1]) {\n return { ok: false, error: \"bad-magic\" };\n }\n if (bytes[2] !== ROUTED_PRESENTATION_ENVELOPE_VERSION) return { ok: false, error: \"bad-version\" };\n if (bytes[3] !== 0) return { ok: false, error: \"bad-reserved\" };\n const headerLength = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength).getUint32(4, false);\n if (headerLength > ROUTED_PRESENTATION_ENVELOPE_MAX_HEADER_BYTES) {\n return { ok: false, error: \"header-too-large\" };\n }\n const headerEnd = ROUTED_PRESENTATION_ENVELOPE_PREFIX_BYTES + headerLength;\n if (headerEnd > bytes.byteLength) return { ok: false, error: \"header-truncated\" };\n let text: string;\n try {\n text = routedUtf8Decoder.decode(bytes.subarray(ROUTED_PRESENTATION_ENVELOPE_PREFIX_BYTES, headerEnd));\n } catch {\n return { ok: false, error: \"header-not-utf8\" };\n }\n let header: unknown;\n try {\n header = JSON.parse(text);\n } catch {\n return { ok: false, error: \"header-not-json\" };\n }\n if (!validateEnvelopeHeader(header)) return { ok: false, error: \"header-invalid\" };\n return {\n ok: true,\n envelope: { header, payload: bytes.subarray(headerEnd) },\n chargedBytes: bytes.byteLength,\n };\n}\n\n/** CRC-32C (Castagnoli), returned as an unsigned 32-bit integer. */\nexport function routedCrc32c(bytes: Uint8Array, seed = 0): number {\n let crc = (seed ^ 0xffff_ffff) >>> 0;\n for (const byte of bytes) {\n crc ^= byte;\n for (let bit = 0; bit < 8; bit += 1) {\n crc = ((crc >>> 1) ^ (0x82f6_3b78 & -(crc & 1))) >>> 0;\n }\n }\n return (crc ^ 0xffff_ffff) >>> 0;\n}\n", "import {\n DEFAULT_ROUTED_RECEIVER_CAPACITIES,\n ROUTED_CLOSE_CODES,\n ROUTED_DOOR_LIMITS,\n ROUTED_LEG_OUTBOUND,\n ROUTED_PROTOCOL_VERSION,\n compareRoutedSceneContent,\n decodeRoutedMessage,\n decodeRoutedPresentationEnvelope,\n encodeRoutedMessage,\n routedCrc32c,\n type RoutedAttachFramesLeg,\n type RoutedCellTransportGrant,\n type RoutedConnectionAccepted,\n type RoutedConnectionRefused,\n type RoutedFramesLegAttached,\n type RoutedPresentationEnvelopeHeader,\n type RoutedPresentationStatus,\n type RoutedProtocolLimits,\n type RoutedReceiverCapacities,\n type RoutedResumeRequest,\n type RoutedSceneContentStamp,\n type RoutedSessionAttachGrant,\n type RoutedTrfIdentity,\n} from \"@vibecook/ghosttea-protocol\";\n\nexport interface RoutedFramesAttachRequest {\n cellBootId: string;\n /** Scene key already used by the mounted surfaces for this session. */\n sessionHandle: string;\n framesUrl: string;\n transportGrant: RoutedCellTransportGrant;\n attachGrant: RoutedSessionAttachGrant;\n activationId: string;\n replacesActivationId?: string;\n resume?: RoutedResumeRequest;\n receiverCapacities?: RoutedReceiverCapacities;\n capabilities?: string[];\n}\n\nexport type RoutedFramesTransportEvent =\n | { type: \"frames-attached\"; attached: RoutedFramesLegAttached }\n | { type: \"attach-refused\"; activationId?: string; code: string; retryable: boolean }\n | {\n type: \"frames-state\";\n activationId: string;\n state: \"attaching\" | \"resuming\" | \"seeding\" | \"applying\" | \"active\" | \"failed\";\n resumeToken?: string;\n appliedContent?: RoutedSceneContentStamp;\n reason?: string;\n }\n | { type: \"presentation-status\"; status: RoutedPresentationStatus }\n | {\n type: \"transport-closed\";\n cellBootId: string;\n code: number;\n reason: string;\n activationIds: string[];\n preAuth: boolean;\n refusal?: RoutedConnectionRefused;\n };\n\nexport interface RoutedAppliedFrame {\n sessionHandle: string;\n viewHandle: string;\n cols: number;\n rows: number;\n}\n\nexport interface RoutedExpectedLayout {\n cols: number;\n rows: number;\n scrollbackRows: number;\n}\n\nexport interface RoutedFramesTransportOptions {\n socketFactory?: (url: string) => WebSocket;\n applyFrame: (\n packet: ArrayBuffer,\n identity: RoutedTrfIdentity,\n expectedLayout?: RoutedExpectedLayout,\n ) => RoutedAppliedFrame;\n emit: (event: RoutedFramesTransportEvent) => void;\n creditReturned?: (bytes: number) => void;\n}\n\ninterface StagedTransfer {\n transferId: string;\n kind: \"seed\" | \"catchup\";\n bytes: Uint8Array;\n chunkCount: number;\n chunks: Set<number>;\n ranges: Array<{ start: number; end: number }>;\n checksum: number;\n targetLayout: { cols: number; rows: number; scrollbackRows: number };\n baseContent: RoutedSceneContentStamp | null;\n resultContent: RoutedSceneContentStamp;\n}\n\ninterface FramesActivation {\n request: RoutedFramesAttachRequest;\n sessionId: string;\n leaseEpoch: number;\n identity?: RoutedTrfIdentity;\n resumeToken?: string;\n appliedContent?: RoutedSceneContentStamp;\n lastActivationSequence: number;\n workerStatusSequence: number;\n transfer?: StagedTransfer;\n sceneRefreshTimer?: number;\n presentationRefreshTimer?: number;\n}\n\ninterface FramesConnection {\n cellBootId: string;\n framesUrl: string;\n transportGrant: RoutedCellTransportGrant;\n receiverCapacities: RoutedReceiverCapacities;\n capabilities: string[];\n socket: WebSocket;\n accepted?: RoutedConnectionAccepted;\n activationIds: Set<string>;\n heartbeatSequence: number;\n heartbeatAckSequence: number;\n heartbeatTimer?: number;\n heartbeatDeadlineTimer?: number;\n creditSequence: number;\n connectionBytesReturned: number;\n connectionBytesReported: number;\n accountBytesReturned: Map<string, number>;\n accountDrainTimers: Map<string, number>;\n creditTimer?: number;\n refusal?: RoutedConnectionRefused;\n}\n\nconst socketOpen = 1;\nconst socketClosing = 2;\n\nfunction exactStamp(left: RoutedSceneContentStamp | undefined, right: RoutedSceneContentStamp): boolean {\n return left !== undefined && compareRoutedSceneContent(left, right) === 0;\n}\n\nfunction copyArrayBuffer(bytes: Uint8Array): ArrayBuffer {\n const copy = bytes.slice();\n return copy.buffer as ArrayBuffer;\n}\n\nfunction capacitiesFitWithin(accepted: RoutedReceiverCapacities, advertised: RoutedReceiverCapacities): boolean {\n return (\n accepted.connectionCreditBytes <= advertised.connectionCreditBytes &&\n accepted.perActivationCreditBytes <= advertised.perActivationCreditBytes &&\n accepted.stagingBytesPerSession <= advertised.stagingBytesPerSession &&\n accepted.stagingBytesTotal <= advertised.stagingBytesTotal &&\n accepted.maxConcurrentActivations <= advertised.maxConcurrentActivations &&\n accepted.maxConcurrentSeeds <= advertised.maxConcurrentSeeds\n );\n}\n\n/** Worker-owned T1 frames connection pool. It never posts presentation bytes to main. */\nexport class RoutedFramesTransport {\n readonly #socketFactory: (url: string) => WebSocket;\n readonly #applyFrame: RoutedFramesTransportOptions[\"applyFrame\"];\n readonly #emit: RoutedFramesTransportOptions[\"emit\"];\n readonly #creditReturned: ((bytes: number) => void) | undefined;\n readonly #connections = new Map<string, FramesConnection>();\n readonly #activations = new Map<string, FramesActivation>();\n #stagingBytes = 0;\n #disposed = false;\n\n constructor(options: RoutedFramesTransportOptions) {\n this.#socketFactory = options.socketFactory ?? ((url) => new WebSocket(url));\n this.#applyFrame = options.applyFrame;\n this.#emit = options.emit;\n this.#creditReturned = options.creditReturned;\n }\n\n attach(request: RoutedFramesAttachRequest): void {\n if (this.#disposed) return;\n const claims = request.attachGrant.claims;\n if (\n claims.sessionId.length === 0 ||\n request.activationId.length === 0 ||\n !/^(0|[1-9][0-9]*)$/.test(request.sessionHandle) ||\n claims.audienceCellBootId !== request.cellBootId ||\n request.transportGrant.claims.audienceCellBootId !== request.cellBootId\n ) {\n throw new Error(\"Routed frames attach grant does not match the requested cell\");\n }\n const previous = this.#activations.get(request.activationId);\n if (\n previous?.appliedContent !== undefined &&\n request.resume !== undefined &&\n !exactStamp(previous.appliedContent, request.resume.from)\n ) {\n throw new Error(\"Routed frames resume does not name the worker's applied scene\");\n }\n const appliedContent = request.resume?.from ?? previous?.appliedContent;\n const lastActivationSequence = previous?.lastActivationSequence ?? -1;\n const workerStatusSequence = previous?.workerStatusSequence ?? 0;\n if (previous) this.detach(request.activationId);\n const activation: FramesActivation = {\n request,\n sessionId: claims.sessionId,\n leaseEpoch: claims.leaseEpoch ?? 0,\n ...(appliedContent === undefined ? {} : { appliedContent }),\n lastActivationSequence,\n workerStatusSequence,\n };\n this.#activations.set(request.activationId, activation);\n this.#emit({ type: \"frames-state\", activationId: request.activationId, state: \"attaching\" });\n const connection = this.#connection(request);\n connection.activationIds.add(request.activationId);\n if (connection.accepted) this.#sendAttach(connection, activation);\n }\n\n detach(activationId: string): void {\n const activation = this.#activations.get(activationId);\n if (!activation) return;\n this.#releaseTransfer(activation);\n if (activation.sceneRefreshTimer !== undefined) clearTimeout(activation.sceneRefreshTimer);\n if (activation.presentationRefreshTimer !== undefined) clearTimeout(activation.presentationRefreshTimer);\n this.#activations.delete(activationId);\n const connection = this.#connections.get(activation.request.cellBootId);\n if (connection) {\n connection.activationIds.delete(activationId);\n this.#scheduleAccountDrain(connection, activationId);\n }\n }\n\n dispose(): void {\n if (this.#disposed) return;\n this.#disposed = true;\n for (const activationId of [...this.#activations.keys()]) this.detach(activationId);\n for (const connection of this.#connections.values()) {\n if (connection.heartbeatTimer !== undefined) clearTimeout(connection.heartbeatTimer);\n if (connection.heartbeatDeadlineTimer !== undefined) clearTimeout(connection.heartbeatDeadlineTimer);\n if (connection.creditTimer !== undefined) clearTimeout(connection.creditTimer);\n for (const timer of connection.accountDrainTimers.values()) clearTimeout(timer);\n if (connection.socket.readyState < socketClosing) connection.socket.close(1000, \"runtime-destroyed\");\n }\n this.#connections.clear();\n }\n\n #connection(request: RoutedFramesAttachRequest): FramesConnection {\n const existing = this.#connections.get(request.cellBootId);\n if (\n existing &&\n existing.framesUrl === request.framesUrl &&\n existing.transportGrant.claims.connectionSetId === request.transportGrant.claims.connectionSetId &&\n existing.socket.readyState < socketClosing\n ) {\n return existing;\n }\n if (existing) this.#closeConnection(existing, 1000, \"connection-replaced\", true);\n const socket = this.#socketFactory(request.framesUrl);\n socket.binaryType = \"arraybuffer\";\n const connection: FramesConnection = {\n cellBootId: request.cellBootId,\n framesUrl: request.framesUrl,\n transportGrant: request.transportGrant,\n receiverCapacities: request.receiverCapacities ?? DEFAULT_ROUTED_RECEIVER_CAPACITIES,\n capabilities: request.capabilities ?? [\"resume\"],\n socket,\n activationIds: new Set(),\n heartbeatSequence: 0,\n heartbeatAckSequence: 0,\n creditSequence: 0,\n connectionBytesReturned: 0,\n connectionBytesReported: 0,\n accountBytesReturned: new Map(),\n accountDrainTimers: new Map(),\n };\n this.#connections.set(request.cellBootId, connection);\n socket.addEventListener(\"open\", () => this.#hello(connection));\n socket.addEventListener(\"message\", (event) => void this.#message(connection, event));\n socket.addEventListener(\"close\", (event) => this.#closed(connection, event.code, event.reason));\n socket.addEventListener(\"error\", () => {\n // The close event carries the protocol-classifying code. Browsers expose\n // no useful error detail here and logging a grant-bearing request is forbidden.\n });\n return connection;\n }\n\n #hello(connection: FramesConnection): void {\n this.#send(\n connection,\n encodeRoutedMessage(\"ConnectionHello\", {\n protocolMajor: ROUTED_PROTOCOL_VERSION.major,\n protocolMinor: ROUTED_PROTOCOL_VERSION.minor,\n channel: \"frames\",\n transportGrant: connection.transportGrant,\n receiverCapacities: connection.receiverCapacities,\n capabilities: connection.capabilities,\n }),\n );\n }\n\n async #message(connection: FramesConnection, event: MessageEvent): Promise<void> {\n if (this.#connections.get(connection.cellBootId) !== connection) return;\n if (typeof event.data === \"string\") {\n this.#text(connection, event.data);\n return;\n }\n let bytes: Uint8Array;\n if (event.data instanceof ArrayBuffer) bytes = new Uint8Array(event.data);\n else if (ArrayBuffer.isView(event.data)) {\n bytes = new Uint8Array(event.data.buffer, event.data.byteOffset, event.data.byteLength);\n } else if (event.data instanceof Blob) {\n bytes = new Uint8Array(await event.data.arrayBuffer());\n } else {\n this.#protocolFailure(connection, undefined, 0, \"unsupported binary message\");\n return;\n }\n this.#binary(connection, bytes);\n }\n\n #text(connection: FramesConnection, text: string): void {\n const maxBytes = connection.accepted?.protocolLimits.maxControlMessageBytes ?? 262_144;\n if (new TextEncoder().encode(text).byteLength > maxBytes) {\n this.#protocolFailure(connection, undefined, 0, \"frames control message too large\");\n return;\n }\n const decoded = decodeRoutedMessage(text, ROUTED_LEG_OUTBOUND.frames);\n if (!decoded.ok) {\n this.#protocolFailure(connection, undefined, 0, `invalid frames message: ${decoded.error}`);\n return;\n }\n const message = decoded.message;\n if (message.type === \"ConnectionAccepted\") {\n if (\n connection.accepted ||\n message.channel !== \"frames\" ||\n message.connectionSetId !== connection.transportGrant.claims.connectionSetId ||\n message.selectedProtocolVersion.major !== ROUTED_PROTOCOL_VERSION.major ||\n message.selectedProtocolVersion.minor > ROUTED_PROTOCOL_VERSION.minor ||\n message.capabilities.some((capability) => !connection.capabilities.includes(capability)) ||\n message.creditEpoch === undefined ||\n message.initialWindows === undefined ||\n !capacitiesFitWithin(message.initialWindows, connection.receiverCapacities)\n ) {\n this.#protocolFailure(connection, undefined, 0, \"invalid frames acceptance\");\n return;\n }\n connection.accepted = message;\n this.#armHeartbeatDeadline(connection);\n this.#scheduleHeartbeat(connection);\n for (const activationId of connection.activationIds) {\n const activation = this.#activations.get(activationId);\n if (activation) this.#sendAttach(connection, activation);\n }\n return;\n }\n if (message.type === \"ConnectionRefused\") {\n connection.refusal = message;\n this.#closeConnection(connection, 1000, message.code, true);\n return;\n }\n if (!connection.accepted) {\n this.#protocolFailure(connection, undefined, 0, \"message before ConnectionAccepted\");\n return;\n }\n if (message.type === \"LegHeartbeatAck\") {\n if (message.sequence > connection.heartbeatSequence) {\n this.#protocolFailure(connection, undefined, 0, \"heartbeat ack is ahead\");\n return;\n }\n if (message.sequence > connection.heartbeatAckSequence) {\n connection.heartbeatAckSequence = message.sequence;\n this.#armHeartbeatDeadline(connection);\n }\n return;\n }\n if (message.type === \"AttachRefused\") {\n if (message.activationId !== undefined && !connection.activationIds.has(message.activationId)) {\n if (!this.#activations.has(message.activationId)) return;\n this.#protocolFailure(connection, undefined, 0, \"attach refusal binding mismatch\");\n return;\n }\n this.#emit({\n type: \"attach-refused\",\n ...(message.activationId === undefined ? {} : { activationId: message.activationId }),\n code: message.code,\n retryable: message.retryable,\n });\n return;\n }\n if (message.type === \"FramesLegAttached\") {\n const activation = this.#activations.get(message.activationId);\n if (!connection.activationIds.has(message.activationId) && !activation) return;\n const duplicateIdentity = [...connection.activationIds].some((activationId) => {\n if (activationId === message.activationId) return false;\n const identity = this.#activations.get(activationId)?.identity;\n return (\n identity?.sessionHandle === message.trfIdentity.sessionHandle &&\n identity.viewHandle === message.trfIdentity.viewHandle\n );\n });\n if (\n !activation ||\n !connection.activationIds.has(message.activationId) ||\n message.sessionId !== activation.sessionId ||\n message.trfIdentity.sessionHandle !== activation.request.sessionHandle ||\n duplicateIdentity ||\n (message.outcome.kind === \"resume-accepted\" &&\n (!connection.accepted.capabilities.includes(\"resume\") ||\n activation.request.resume === undefined ||\n message.outcome.from === undefined ||\n !exactStamp(activation.request.resume.from, message.outcome.from)))\n ) {\n this.#protocolFailure(connection, message.activationId, 0, \"frames attach identity mismatch\");\n return;\n }\n activation.identity = message.trfIdentity;\n activation.resumeToken = message.resumeToken;\n this.#emit({ type: \"frames-attached\", attached: message });\n this.#emit({\n type: \"frames-state\",\n activationId: message.activationId,\n state: message.outcome.kind === \"resume-accepted\" ? \"resuming\" : \"seeding\",\n resumeToken: message.resumeToken,\n });\n this.#reportPresentation(\n connection,\n activation,\n message.outcome.kind === \"resume-accepted\" ? \"recovering\" : \"seeding\",\n );\n return;\n }\n this.#protocolFailure(connection, undefined, 0, `unexpected frames message ${message.type}`);\n }\n\n #sendAttach(connection: FramesConnection, activation: FramesActivation): void {\n const resume = connection.accepted?.capabilities.includes(\"resume\") ? activation.request.resume : undefined;\n const body: RoutedAttachFramesLeg = {\n activationId: activation.request.activationId,\n attachGrant: activation.request.attachGrant,\n ...(resume === undefined ? {} : { resume }),\n };\n this.#send(connection, encodeRoutedMessage(\"AttachFramesLeg\", body));\n }\n\n #binary(connection: FramesConnection, bytes: Uint8Array): void {\n if (!connection.accepted) {\n this.#protocolFailure(connection, undefined, bytes.byteLength, \"binary message before acceptance\");\n return;\n }\n const decoded = decodeRoutedPresentationEnvelope(bytes);\n if (!decoded.ok) {\n this.#protocolFailure(connection, undefined, bytes.byteLength, `bad envelope: ${decoded.error}`);\n return;\n }\n const { header, payload } = decoded.envelope;\n if (header.creditEpoch !== connection.accepted.creditEpoch) {\n this.#protocolFailure(connection, header.activationId, decoded.chargedBytes, \"credit epoch mismatch\");\n return;\n }\n if (header.profiling !== undefined && !connection.accepted.capabilities.includes(\"profiling-envelope\")) {\n this.#protocolFailure(connection, header.activationId, decoded.chargedBytes, \"unnegotiated profiling envelope\");\n return;\n }\n if (header.kind === \"calibration\") {\n if (payload.byteLength !== 0) {\n this.#protocolFailure(connection, undefined, decoded.chargedBytes, \"calibration payload is not empty\");\n return;\n }\n const sequence = header.calibration!.sequence;\n if (sequence > connection.heartbeatSequence) {\n this.#protocolFailure(connection, undefined, decoded.chargedBytes, \"calibration echo is ahead\");\n return;\n }\n if (sequence > connection.heartbeatAckSequence) {\n connection.heartbeatAckSequence = sequence;\n this.#armHeartbeatDeadline(connection);\n }\n this.#returnCredit(connection, undefined, decoded.chargedBytes);\n return;\n }\n const activation = this.#activations.get(header.activationId);\n if (!activation || !connection.activationIds.has(header.activationId) || !activation.identity) {\n this.#returnCredit(connection, header.activationId, decoded.chargedBytes);\n if (activation)\n this.#protocolFailure(connection, header.activationId, 0, \"presentation activation binding mismatch\");\n return;\n }\n if (\n header.sessionId !== activation.sessionId ||\n header.leaseEpoch !== activation.leaseEpoch ||\n header.activationSequence <= activation.lastActivationSequence\n ) {\n this.#protocolFailure(\n connection,\n header.activationId,\n decoded.chargedBytes,\n \"presentation identity or sequence mismatch\",\n );\n return;\n }\n activation.lastActivationSequence = header.activationSequence;\n if ((header.kind === \"transfer-begin\" || header.kind === \"transfer-end\") && payload.byteLength !== 0) {\n this.#protocolFailure(connection, header.activationId, decoded.chargedBytes, \"transfer metadata carries payload\");\n return;\n }\n switch (header.kind) {\n case \"trf1-frame\":\n this.#incremental(connection, activation, header, payload, decoded.chargedBytes);\n break;\n case \"transfer-begin\":\n this.#beginTransfer(connection, activation, header, decoded.chargedBytes);\n break;\n case \"transfer-chunk\":\n this.#transferChunk(connection, activation, header, payload, decoded.chargedBytes);\n break;\n case \"transfer-end\":\n this.#endTransfer(connection, activation, header, decoded.chargedBytes);\n break;\n }\n }\n\n #incremental(\n connection: FramesConnection,\n activation: FramesActivation,\n header: RoutedPresentationEnvelopeHeader,\n payload: Uint8Array,\n chargedBytes: number,\n ): void {\n if (\n payload.byteLength > connection.accepted!.protocolLimits.maxPresentationChunkBytes ||\n !header.resultContent ||\n header.baseContent === undefined ||\n (header.baseContent !== null && !exactStamp(activation.appliedContent, header.baseContent))\n ) {\n this.#protocolFailure(connection, header.activationId, chargedBytes, \"incremental base mismatch\");\n return;\n }\n try {\n this.#emit({ type: \"frames-state\", activationId: header.activationId, state: \"applying\" });\n this.#applyFrame(copyArrayBuffer(payload), activation.identity!);\n activation.appliedContent = header.resultContent;\n this.#returnCredit(connection, header.activationId, chargedBytes);\n this.#sceneApplied(connection, activation);\n } catch (error) {\n this.#protocolFailure(connection, header.activationId, chargedBytes, String(error));\n }\n }\n\n #beginTransfer(\n connection: FramesConnection,\n activation: FramesActivation,\n header: RoutedPresentationEnvelopeHeader,\n chargedBytes: number,\n ): void {\n const transfer = header.transfer;\n const limits = connection.accepted!.protocolLimits;\n const windows = connection.accepted!.initialWindows!;\n if (\n activation.transfer ||\n !transfer?.kind ||\n transfer.totalBytes === undefined ||\n transfer.chunkCount === undefined ||\n !transfer.targetLayout ||\n !transfer.checksum ||\n !header.resultContent ||\n transfer.totalBytes > windows.stagingBytesPerSession ||\n this.#stagingBytes + transfer.totalBytes > windows.stagingBytesTotal ||\n (transfer.kind === \"catchup\" && transfer.totalBytes > limits.maxCatchupBytes) ||\n (transfer.kind === \"catchup\" &&\n (header.baseContent == null || !exactStamp(activation.appliedContent, header.baseContent)))\n ) {\n this.#protocolFailure(connection, header.activationId, chargedBytes, \"transfer budget or header invalid\");\n return;\n }\n const activeSeeds = [...this.#activations.values()].filter(\n (candidate) => candidate.transfer?.kind === \"seed\",\n ).length;\n if (transfer.kind === \"seed\" && activeSeeds >= windows.maxConcurrentSeeds) {\n this.#protocolFailure(connection, header.activationId, chargedBytes, \"seed concurrency exceeded\");\n return;\n }\n activation.transfer = {\n transferId: transfer.transferId,\n kind: transfer.kind,\n bytes: new Uint8Array(transfer.totalBytes),\n chunkCount: transfer.chunkCount,\n chunks: new Set(),\n ranges: [],\n checksum: transfer.checksum.value,\n targetLayout: transfer.targetLayout,\n baseContent: header.baseContent ?? null,\n resultContent: header.resultContent,\n };\n this.#stagingBytes += transfer.totalBytes;\n this.#returnCredit(connection, header.activationId, chargedBytes);\n this.#emit({ type: \"frames-state\", activationId: header.activationId, state: \"seeding\" });\n }\n\n #transferChunk(\n connection: FramesConnection,\n activation: FramesActivation,\n header: RoutedPresentationEnvelopeHeader,\n payload: Uint8Array,\n chargedBytes: number,\n ): void {\n const staging = activation.transfer;\n const transfer = header.transfer;\n const chunkIndex = transfer?.chunkIndex;\n const byteOffset = transfer?.byteOffset;\n if (\n !staging ||\n transfer?.transferId !== staging.transferId ||\n chunkIndex === undefined ||\n byteOffset === undefined ||\n chunkIndex >= staging.chunkCount ||\n staging.chunks.has(chunkIndex) ||\n payload.byteLength > connection.accepted!.protocolLimits.maxPresentationChunkBytes ||\n byteOffset + payload.byteLength > staging.bytes.byteLength\n ) {\n this.#protocolFailure(connection, header.activationId, chargedBytes, \"transfer chunk invalid\");\n return;\n }\n const end = byteOffset + payload.byteLength;\n if (staging.ranges.some((range) => byteOffset < range.end && end > range.start)) {\n this.#protocolFailure(connection, header.activationId, chargedBytes, \"transfer chunk overlap\");\n return;\n }\n staging.bytes.set(payload, byteOffset);\n staging.chunks.add(chunkIndex);\n staging.ranges.push({ start: byteOffset, end });\n // Transfer bytes become reclaimable as soon as the staging copy completes.\n this.#returnCredit(connection, header.activationId, chargedBytes);\n }\n\n #endTransfer(\n connection: FramesConnection,\n activation: FramesActivation,\n header: RoutedPresentationEnvelopeHeader,\n chargedBytes: number,\n ): void {\n const staging = activation.transfer;\n if (!staging || header.transfer?.transferId !== staging.transferId) {\n this.#protocolFailure(connection, header.activationId, chargedBytes, \"transfer end without begin\");\n return;\n }\n this.#returnCredit(connection, header.activationId, chargedBytes);\n const ranges = [...staging.ranges].sort((left, right) => left.start - right.start);\n let cursor = 0;\n for (const range of ranges) {\n if (range.start !== cursor) {\n this.#protocolFailure(connection, header.activationId, 0, \"transfer has a range gap\");\n return;\n }\n cursor = range.end;\n }\n if (\n staging.chunks.size !== staging.chunkCount ||\n cursor !== staging.bytes.byteLength ||\n routedCrc32c(staging.bytes) !== staging.checksum ||\n (staging.kind === \"catchup\" &&\n (staging.baseContent === null || !exactStamp(activation.appliedContent, staging.baseContent)))\n ) {\n this.#protocolFailure(connection, header.activationId, 0, \"transfer validation failed\");\n return;\n }\n try {\n this.#emit({ type: \"frames-state\", activationId: header.activationId, state: \"applying\" });\n this.#applyFrame(staging.bytes.buffer as ArrayBuffer, activation.identity!, staging.targetLayout);\n activation.appliedContent = staging.resultContent;\n this.#releaseTransfer(activation);\n this.#sceneApplied(connection, activation);\n } catch (error) {\n this.#protocolFailure(connection, header.activationId, 0, String(error));\n }\n }\n\n #releaseTransfer(activation: FramesActivation): void {\n if (!activation.transfer) return;\n this.#stagingBytes = Math.max(0, this.#stagingBytes - activation.transfer.bytes.byteLength);\n delete activation.transfer;\n }\n\n #sceneApplied(connection: FramesConnection, activation: FramesActivation): void {\n const appliedContent = activation.appliedContent;\n if (!appliedContent) return;\n this.#send(\n connection,\n encodeRoutedMessage(\"SceneApplied\", {\n sessionId: activation.sessionId,\n activationId: activation.request.activationId,\n leaseEpoch: activation.leaseEpoch,\n appliedContent,\n }),\n );\n this.#emit({\n type: \"frames-state\",\n activationId: activation.request.activationId,\n state: \"active\",\n ...(activation.resumeToken === undefined ? {} : { resumeToken: activation.resumeToken }),\n appliedContent,\n });\n this.#reportPresentation(connection, activation, \"active\");\n if (activation.sceneRefreshTimer !== undefined) clearTimeout(activation.sceneRefreshTimer);\n activation.sceneRefreshTimer = setTimeout(\n () => this.#sceneApplied(connection, activation),\n connection.accepted!.protocolLimits.sceneAppliedRefreshMs,\n );\n }\n\n #reportPresentation(\n connection: FramesConnection,\n activation: FramesActivation,\n state: RoutedPresentationStatus[\"state\"],\n ): void {\n activation.workerStatusSequence += 1;\n const status: RoutedPresentationStatus = {\n activationId: activation.request.activationId,\n workerStatusSequence: activation.workerStatusSequence,\n state,\n ...(activation.appliedContent === undefined ? {} : { sceneContent: activation.appliedContent }),\n leaseTtlMs: Math.max(\n connection.accepted?.protocolLimits.presentationStatusRefreshMs ?? 2_000,\n connection.accepted?.heartbeatTtlMs ?? ROUTED_DOOR_LIMITS.heartbeatTtlMs,\n ),\n };\n this.#emit({ type: \"presentation-status\", status });\n if (activation.presentationRefreshTimer !== undefined) clearTimeout(activation.presentationRefreshTimer);\n const refreshMs = connection.accepted?.protocolLimits.presentationStatusRefreshMs ?? 2_000;\n activation.presentationRefreshTimer = setTimeout(\n () => this.#reportPresentation(connection, activation, state),\n refreshMs,\n );\n }\n\n #returnCredit(connection: FramesConnection, activationId: string | undefined, bytes: number): void {\n if (bytes <= 0) return;\n connection.connectionBytesReturned += bytes;\n if (activationId) {\n connection.accountBytesReturned.set(\n activationId,\n (connection.accountBytesReturned.get(activationId) ?? 0) + bytes,\n );\n if (!connection.activationIds.has(activationId)) this.#scheduleAccountDrain(connection, activationId);\n }\n const limits = connection.accepted?.protocolLimits;\n if (connection.creditTimer !== undefined) return;\n connection.creditTimer = setTimeout(() => this.#flushCredit(connection), limits?.maxCreditReturnDelayMs ?? 16);\n }\n\n #flushCredit(connection: FramesConnection): void {\n if (connection.creditTimer !== undefined) clearTimeout(connection.creditTimer);\n delete connection.creditTimer;\n if (!connection.accepted || connection.connectionBytesReturned === 0) return;\n connection.creditSequence += 1;\n const newlyReturned = connection.connectionBytesReturned - connection.connectionBytesReported;\n connection.connectionBytesReported = connection.connectionBytesReturned;\n this.#send(\n connection,\n encodeRoutedMessage(\"TransportCredit\", {\n creditEpoch: connection.accepted.creditEpoch!,\n creditSequence: connection.creditSequence,\n connectionBytesReturned: connection.connectionBytesReturned,\n accounts: [...connection.accountBytesReturned].map(([activationId, bytesReturned]) => ({\n activationId,\n bytesReturned,\n })),\n }),\n );\n this.#creditReturned?.(newlyReturned);\n }\n\n #scheduleAccountDrain(connection: FramesConnection, activationId: string): void {\n const previous = connection.accountDrainTimers.get(activationId);\n if (previous !== undefined) clearTimeout(previous);\n const ttl = connection.accepted?.protocolLimits.creditAccountDrainTtlMs ?? 5_000;\n connection.accountDrainTimers.set(\n activationId,\n setTimeout(() => {\n connection.accountDrainTimers.delete(activationId);\n if (!connection.activationIds.has(activationId)) connection.accountBytesReturned.delete(activationId);\n }, ttl),\n );\n }\n\n #scheduleHeartbeat(connection: FramesConnection): void {\n if (connection.heartbeatTimer !== undefined) clearTimeout(connection.heartbeatTimer);\n connection.heartbeatTimer = setTimeout(\n () => {\n if (!connection.accepted || connection.socket.readyState !== socketOpen) return;\n connection.heartbeatSequence += 1;\n this.#send(\n connection,\n encodeRoutedMessage(\"CalibrationPing\", {\n sequence: connection.heartbeatSequence,\n t0: Date.now(),\n }),\n );\n this.#scheduleHeartbeat(connection);\n },\n Math.max(\n 100,\n Math.min(\n ROUTED_DOOR_LIMITS.heartbeatIntervalMs,\n Math.floor((connection.accepted?.heartbeatTtlMs ?? ROUTED_DOOR_LIMITS.heartbeatTtlMs) / 3),\n ),\n ),\n );\n }\n\n #armHeartbeatDeadline(connection: FramesConnection): void {\n if (connection.heartbeatDeadlineTimer !== undefined) clearTimeout(connection.heartbeatDeadlineTimer);\n const ttl = connection.accepted?.heartbeatTtlMs ?? ROUTED_DOOR_LIMITS.heartbeatTtlMs;\n connection.heartbeatDeadlineTimer = setTimeout(() => {\n if (this.#connections.get(connection.cellBootId) !== connection) return;\n this.#closeConnection(connection, ROUTED_CLOSE_CODES.LEG_TIMEOUT, \"heartbeat timeout\", true);\n }, ttl);\n }\n\n #protocolFailure(\n connection: FramesConnection,\n activationId: string | undefined,\n chargedBytes: number,\n reason: string,\n ): void {\n this.#returnCredit(connection, activationId, chargedBytes);\n this.#flushCredit(connection);\n if (activationId) this.#emit({ type: \"frames-state\", activationId, state: \"failed\", reason: \"PROTOCOL\" });\n this.#closeConnection(connection, ROUTED_CLOSE_CODES.PROTOCOL, reason, true);\n }\n\n #send(connection: FramesConnection, text: string): void {\n if (connection.socket.readyState === socketOpen) connection.socket.send(text);\n }\n\n #closeConnection(connection: FramesConnection, code: number, reason: string, closeSocket: boolean): void {\n if (connection.heartbeatTimer !== undefined) clearTimeout(connection.heartbeatTimer);\n if (connection.heartbeatDeadlineTimer !== undefined) clearTimeout(connection.heartbeatDeadlineTimer);\n if (connection.creditTimer !== undefined) clearTimeout(connection.creditTimer);\n for (const timer of connection.accountDrainTimers.values()) clearTimeout(timer);\n if (closeSocket && connection.socket.readyState < socketClosing)\n connection.socket.close(code, reason.slice(0, 123));\n this.#closed(connection, code, reason);\n }\n\n #closed(connection: FramesConnection, code: number, reason: string): void {\n if (this.#connections.get(connection.cellBootId) !== connection) return;\n this.#connections.delete(connection.cellBootId);\n if (connection.heartbeatTimer !== undefined) clearTimeout(connection.heartbeatTimer);\n if (connection.heartbeatDeadlineTimer !== undefined) clearTimeout(connection.heartbeatDeadlineTimer);\n if (connection.creditTimer !== undefined) clearTimeout(connection.creditTimer);\n for (const timer of connection.accountDrainTimers.values()) clearTimeout(timer);\n connection.accountDrainTimers.clear();\n const activationIds = [...connection.activationIds];\n for (const activationId of activationIds) {\n const activation = this.#activations.get(activationId);\n if (!activation) continue;\n this.#releaseTransfer(activation);\n if (activation.sceneRefreshTimer !== undefined) clearTimeout(activation.sceneRefreshTimer);\n if (activation.presentationRefreshTimer !== undefined) clearTimeout(activation.presentationRefreshTimer);\n }\n this.#emit({\n type: \"transport-closed\",\n cellBootId: connection.cellBootId,\n code,\n reason,\n activationIds,\n preAuth: connection.refusal === undefined && connection.accepted === undefined && code === 1008,\n ...(connection.refusal === undefined ? {} : { refusal: connection.refusal }),\n });\n }\n}\n\n/** Kept local to avoid a second source of protocol defaults in the worker. */\nexport function routedCreditDelay(limits: RoutedProtocolLimits | undefined): number {\n return limits?.maxCreditReturnDelayMs ?? 16;\n}\n", "/// <reference lib=\"webworker\" />\n/// <reference types=\"@webgpu/types\" />\n\nimport {\n decodeClipboardWrite,\n decodeCursorState,\n decodeFrame,\n decodeGlyphDefinitions,\n decodeRowReplacements,\n decodeScrollbarState,\n decodeStyleDefinitions,\n FrameFlag,\n type CursorState,\n type GlyphDefinition,\n type GlyphInstance,\n type StyleDefinition,\n type StyleRun,\n SectionKind,\n} from \"@vibecook/ghosttea-frame\";\nimport type { RoutedTrfIdentity, TerminalScrollbarState } from \"@vibecook/ghosttea-protocol\";\nimport { CanvasTerminalRenderer } from \"./renderers/canvas-renderer.js\";\nimport {\n DEFAULT_EFFECTS,\n DEFAULT_THEME,\n type CellSelection,\n type PixelSize,\n type RenderView,\n type TerminalRenderer,\n type TerminalEffects,\n type TerminalTheme,\n renderedSizeChanged,\n terminalEffectsNeedAnimation,\n} from \"./renderers/types.js\";\nimport { WebGpuTerminalRenderer } from \"./renderers/webgpu-renderer.js\";\nimport { classifyFrame } from \"./frame-sequence.js\";\nimport { cursorActivityChangesPixels } from \"./cursor-invalidation.js\";\nimport {\n emptyRenderMetrics,\n type TerminalRenderCounterSnapshot,\n type TerminalRenderPerformanceSnapshot,\n} from \"./performance.js\";\nimport type { RendererToWorkerMessage, WorkerToRendererMessage } from \"./worker-messages.js\";\nimport { catalogAdmission, definitionCatalogFits, glyphCatalogFits } from \"./catalog-budget.js\";\nimport { RoutedFramesTransport, type RoutedAppliedFrame, type RoutedExpectedLayout } from \"./routed-frames.js\";\n\ninterface SessionSnapshot {\n rows: string[];\n nativeRows: GlyphInstance[][];\n nativeStyleRows: StyleRun[][];\n glyphDefinitions: Map<number, GlyphDefinition>;\n glyphPixelBytes: number;\n styleDefinitions: Map<number, StyleDefinition>;\n rowRevisions: bigint[];\n cursor: CursorState;\n layoutEpoch: bigint;\n sessionEpoch: bigint;\n sequence: bigint;\n awaitingResync: boolean;\n catalogFallback: boolean;\n scrollbar: TerminalScrollbarState | null;\n}\n\ninterface SurfaceSnapshot {\n sessionHandle: string;\n focused: boolean;\n cursorBlinkVisible: boolean;\n selection: CellSelection | null;\n theme: TerminalTheme;\n effects: TerminalEffects;\n damage: { full: boolean; rows: Set<number>; geometryChanged: boolean };\n}\n\ninterface MountedCanvas {\n canvas: OffscreenCanvas;\n size: PixelSize;\n sessionHandle: string;\n}\n\ninterface SessionPresentationDefaults {\n theme: TerminalTheme;\n effects: TerminalEffects;\n selection: CellSelection | null;\n visible: boolean;\n}\n\nconst hiddenCursor: CursorState = { x: 0, y: 0, visible: false, style: 1, blinking: false };\nconst CURSOR_BLINK_INTERVAL_MS = 600;\nconst MAX_SESSION_GLYPH_DEFINITIONS = 65_536;\nconst MAX_SESSION_GLYPH_PIXEL_BYTES = 64 * 1024 * 1024;\nconst MAX_SESSION_STYLE_DEFINITIONS = 65_536;\nconst MAX_SHARED_GLYPH_DEFINITIONS = 131_072;\nconst MAX_SHARED_GLYPH_PIXEL_BYTES = 128 * 1024 * 1024;\nconst MAX_RETAINED_STYLE_DEFINITIONS = 262_144;\nconst GLYPH_CATALOG_BUDGET = {\n maxDefinitions: MAX_SESSION_GLYPH_DEFINITIONS,\n maxSharedDefinitions: MAX_SHARED_GLYPH_DEFINITIONS,\n maxSessionPixelBytes: MAX_SESSION_GLYPH_PIXEL_BYTES,\n maxSharedPixelBytes: MAX_SHARED_GLYPH_PIXEL_BYTES,\n} as const;\nconst NO_GLYPH_DEFINITIONS: readonly GlyphDefinition[] = [];\nconst NO_STYLE_DEFINITIONS: readonly StyleDefinition[] = [];\nconst MAX_PERFORMANCE_SAMPLES = 100_000;\nconst FRAME_CREDIT_BATCH_BYTES = 4 * 1024 * 1024;\nconst FRAME_CREDIT_MAX_DELAY_MS = 8;\nconst snapshots = new Map<string, SessionSnapshot>();\nconst sharedGlyphDefinitions = new Map<number, { definition: GlyphDefinition; references: number }>();\nlet sharedGlyphPixelBytes = 0;\nlet retainedStyleDefinitions = 0;\nconst surfaces = new Map<string, SurfaceSnapshot>();\nconst surfaceIdsBySession = new Map<string, Set<string>>();\nconst noSurfaceIds: ReadonlySet<string> = new Set();\nconst presentationDefaults = new Map<string, SessionPresentationDefaults>();\nconst mounts = new Map<string, MountedCanvas>();\nconst cursorBlinkTimers = new Map<string, ReturnType<typeof setTimeout>>();\nconst dirty = new Set<string>();\n// Occluded surfaces continue ingesting frames so they resume from current state,\n// but do not schedule GPU flushes or cursor timers while their native tab is hidden.\nconst occluded = new Set<string>();\n// A frozen replica must not animate: a blinking cursor on a screen the host\n// stopped updating reads as a live session. Focus is left untouched, since the\n// runtime owns focus truth for control reclaim.\nconst frozenCursors = new Set<string>();\nlet renderer: TerminalRenderer | undefined;\nlet rendererPromise: Promise<TerminalRenderer> | undefined;\nlet flushScheduled = false;\nlet recoveryAttempts = 0;\nlet recovering = false;\nlet nativeTextAnnounced = false;\nlet forceCanvasFallback = false;\nlet partialRenderingEnabled = true;\nlet pendingFrameCreditBytes = 0;\nlet frameCreditTimer: ReturnType<typeof setTimeout> | undefined;\nlet shaderAnimationScheduled = false;\n\ninterface ActivePerformanceMeasurement {\n startedAt: number;\n lastActivityAt: number;\n lastFrameAt: Map<string, number>;\n dirtySince: Map<string, number>;\n frames: TerminalRenderPerformanceSnapshot[\"frames\"];\n scheduling: TerminalRenderPerformanceSnapshot[\"scheduling\"];\n renderer: TerminalRenderPerformanceSnapshot[\"renderer\"];\n samples: TerminalRenderPerformanceSnapshot[\"samples\"];\n}\n\nlet performanceMeasurement: ActivePerformanceMeasurement | undefined;\n\ntype SessionCounters = TerminalRenderCounterSnapshot[\"sessions\"][string];\nconst lifetimeStartedAt = performance.now();\nconst lifetimeFrames: SessionCounters = {\n received: 0,\n bytes: 0,\n full: 0,\n incremental: 0,\n stale: 0,\n decodes: 0,\n applies: 0,\n};\nconst lifetimeSessions = new Map<string, SessionCounters>();\nconst lifetimeRenderer = { queueSubmits: 0, presents: 0 };\nconst lifetimeFlow = { creditBytesReturned: 0, creditBatchesReturned: 0 };\n\nfunction sessionCounters(sessionHandle: string): SessionCounters {\n let counters = lifetimeSessions.get(sessionHandle);\n if (!counters) {\n counters = { received: 0, bytes: 0, full: 0, incremental: 0, stale: 0, decodes: 0, applies: 0 };\n lifetimeSessions.set(sessionHandle, counters);\n }\n return counters;\n}\n\nfunction counterSnapshot(): TerminalRenderCounterSnapshot {\n return {\n backend: renderer?.kind ?? \"starting\",\n durationMs: performance.now() - lifetimeStartedAt,\n frames: { ...lifetimeFrames },\n renderer: { ...lifetimeRenderer },\n flow: { ...lifetimeFlow },\n sessions: Object.fromEntries([...lifetimeSessions].map(([id, counters]) => [id, { ...counters }])),\n };\n}\n\nfunction appendPerformanceSample(samples: number[], value: number): void {\n if (samples.length < MAX_PERFORMANCE_SAMPLES) samples.push(value);\n}\n\nfunction flushFrameCredit(): void {\n if (frameCreditTimer !== undefined) clearTimeout(frameCreditTimer);\n frameCreditTimer = undefined;\n if (pendingFrameCreditBytes === 0) return;\n const bytes = pendingFrameCreditBytes;\n pendingFrameCreditBytes = 0;\n lifetimeFlow.creditBytesReturned += bytes;\n lifetimeFlow.creditBatchesReturned += 1;\n postToRenderer({ type: \"frame-credit\", bytes });\n}\n\nfunction returnFrameCredit(bytes: number): void {\n pendingFrameCreditBytes += bytes;\n if (pendingFrameCreditBytes >= FRAME_CREDIT_BATCH_BYTES) {\n flushFrameCredit();\n } else if (frameCreditTimer === undefined) {\n frameCreditTimer = setTimeout(flushFrameCredit, FRAME_CREDIT_MAX_DELAY_MS);\n }\n}\n\nfunction beginPerformanceMeasurement(): void {\n const now = performance.now();\n performanceMeasurement = {\n startedAt: now,\n lastActivityAt: now,\n lastFrameAt: new Map(),\n dirtySince: new Map(),\n frames: {\n received: 0,\n bytes: 0,\n full: 0,\n incremental: 0,\n stale: 0,\n resyncRequested: 0,\n rowsDecoded: 0,\n glyphDefinitions: 0,\n },\n scheduling: { flushes: 0, renderCalls: 0, maximumDirtyPanes: 0, panesPerFlush: [] },\n renderer: {\n queueSubmits: 0,\n fullRenders: 0,\n partialRenders: 0,\n damagedRows: 0,\n geometryCacheHits: 0,\n geometryCacheMisses: 0,\n canvasPixelFrames: 0,\n renderPasses: 0,\n drawCalls: 0,\n rectangleVertices: 0,\n monoGlyphVertices: 0,\n colorGlyphVertices: 0,\n fallbackGlyphVertices: 0,\n vertexUploadBytes: 0,\n atlasUploadBytes: 0,\n atlasUploadCalls: 0,\n },\n samples: { frameApplyMs: [], renderCpuMs: [], dirtyToRenderMs: [], frameArrivalToRenderMs: [] },\n };\n renderer?.setPerformanceMeasurementEnabled?.(true);\n}\n\nfunction notePerformanceActivity(now = performance.now()): void {\n if (performanceMeasurement) performanceMeasurement.lastActivityAt = now;\n}\n\nfunction recordRenderMetrics(metrics: ReturnType<typeof emptyRenderMetrics>): void {\n const target = performanceMeasurement?.renderer;\n if (!target) return;\n target.queueSubmits += metrics.queueSubmits;\n target.fullRenders += metrics.fullRenders;\n target.partialRenders += metrics.partialRenders;\n target.damagedRows += metrics.damagedRows;\n target.geometryCacheHits += metrics.geometryCacheHits;\n target.geometryCacheMisses += metrics.geometryCacheMisses;\n target.canvasPixelFrames += metrics.canvasPixels;\n target.renderPasses += metrics.renderPasses;\n target.drawCalls += metrics.drawCalls;\n target.rectangleVertices += metrics.rectangleVertices;\n target.monoGlyphVertices += metrics.monoGlyphVertices;\n target.colorGlyphVertices += metrics.colorGlyphVertices;\n target.fallbackGlyphVertices += metrics.fallbackGlyphVertices;\n target.vertexUploadBytes += metrics.vertexUploadBytes;\n target.atlasUploadBytes += metrics.atlasUploadBytes;\n target.atlasUploadCalls += metrics.atlasUploadCalls;\n}\n\nfunction recordLifetimeRenderMetrics(metrics: ReturnType<typeof emptyRenderMetrics>): void {\n lifetimeRenderer.queueSubmits += metrics.queueSubmits;\n lifetimeRenderer.presents += metrics.fullRenders + metrics.partialRenders;\n}\n\nasync function finishPerformanceMeasurement(requestId: number, quietMs: number, timeoutMs: number): Promise<void> {\n const active = performanceMeasurement;\n if (!active) throw new Error(\"No terminal render performance measurement is active\");\n const deadline = performance.now() + timeoutMs;\n let timedOutWaitingForIdle = false;\n let gpuQueueDrainMs: number | null = null;\n\n while (true) {\n const now = performance.now();\n const hasVisibleDirty = [...dirty].some((id) => !occluded.has(id));\n if (!flushScheduled && !hasVisibleDirty && now - active.lastActivityAt >= quietMs) {\n const beforeDrainActivity = active.lastActivityAt;\n if (renderer?.settle) {\n const drainStarted = performance.now();\n await renderer.settle();\n gpuQueueDrainMs = performance.now() - drainStarted;\n }\n if (active.lastActivityAt === beforeDrainActivity && !flushScheduled) break;\n }\n if (now >= deadline) {\n timedOutWaitingForIdle = true;\n break;\n }\n await new Promise((resolve) => setTimeout(resolve, Math.min(25, Math.max(1, quietMs / 4))));\n }\n\n if (timedOutWaitingForIdle && renderer?.settle) {\n const drainStarted = performance.now();\n await renderer.settle();\n gpuQueueDrainMs = performance.now() - drainStarted;\n }\n const snapshot: TerminalRenderPerformanceSnapshot = {\n backend: renderer?.kind ?? \"starting\",\n durationMs: performance.now() - active.startedAt,\n timedOutWaitingForIdle,\n gpuQueueDrainMs,\n frames: active.frames,\n scheduling: active.scheduling,\n renderer: active.renderer,\n samples: active.samples,\n };\n renderer?.setPerformanceMeasurementEnabled?.(false);\n if (performanceMeasurement === active) performanceMeasurement = undefined;\n postToRenderer({ type: \"performance-result\", requestId, snapshot });\n}\n\nfunction postToRenderer(message: WorkerToRendererMessage): void {\n self.postMessage(message);\n}\n\nfunction emptySessionSnapshot(): SessionSnapshot {\n return {\n rows: [],\n nativeRows: [],\n nativeStyleRows: [],\n glyphDefinitions: new Map(),\n glyphPixelBytes: 0,\n styleDefinitions: new Map(),\n rowRevisions: [],\n cursor: hiddenCursor,\n layoutEpoch: 0n,\n sessionEpoch: 0n,\n sequence: 0n,\n awaitingResync: false,\n catalogFallback: false,\n scrollbar: null,\n };\n}\n\nfunction snapshot(sessionHandle: string): SessionSnapshot {\n let value = snapshots.get(sessionHandle);\n if (!value) {\n value = emptySessionSnapshot();\n snapshots.set(sessionHandle, value);\n }\n return value;\n}\n\nfunction clearSessionCatalog(session: SessionSnapshot): void {\n for (const glyphId of session.glyphDefinitions.keys()) {\n const shared = sharedGlyphDefinitions.get(glyphId);\n if (!shared) continue;\n shared.references -= 1;\n if (shared.references <= 0) {\n sharedGlyphDefinitions.delete(glyphId);\n sharedGlyphPixelBytes -= shared.definition.pixels.byteLength;\n }\n }\n session.glyphDefinitions.clear();\n session.glyphPixelBytes = 0;\n retainedStyleDefinitions -= session.styleDefinitions.size;\n session.styleDefinitions.clear();\n}\n\nfunction installGlyphDefinitions(session: SessionSnapshot, definitions: readonly GlyphDefinition[]): void {\n for (const decoded of definitions) {\n if (session.glyphDefinitions.has(decoded.id)) continue;\n let shared = sharedGlyphDefinitions.get(decoded.id);\n const pixelBytes = shared?.definition.pixels.byteLength ?? decoded.pixels.byteLength;\n if (shared) {\n shared.references += 1;\n } else {\n shared = { definition: decoded, references: 1 };\n sharedGlyphDefinitions.set(decoded.id, shared);\n sharedGlyphPixelBytes += decoded.pixels.byteLength;\n }\n session.glyphDefinitions.set(decoded.id, shared.definition);\n session.glyphPixelBytes += pixelBytes;\n }\n}\n\nfunction installStyleDefinitions(session: SessionSnapshot, definitions: readonly StyleDefinition[]): void {\n for (const definition of definitions) {\n if (session.styleDefinitions.has(definition.id)) continue;\n session.styleDefinitions.set(definition.id, definition);\n retainedStyleDefinitions += 1;\n }\n}\n\nfunction dropSessionSnapshot(sessionHandle: string): void {\n const session = snapshots.get(sessionHandle);\n if (session) clearSessionCatalog(session);\n snapshots.delete(sessionHandle);\n}\n\nfunction defaults(sessionHandle: string): SessionPresentationDefaults {\n let value = presentationDefaults.get(sessionHandle);\n if (!value) {\n value = { theme: DEFAULT_THEME, effects: DEFAULT_EFFECTS, selection: null, visible: true };\n presentationDefaults.set(sessionHandle, value);\n }\n return value;\n}\n\nfunction surface(surfaceId: string, sessionHandle: string): SurfaceSnapshot {\n const existing = surfaces.get(surfaceId);\n if (existing) {\n if (existing.sessionHandle !== sessionHandle) throw new Error(`Surface ${surfaceId} changed sessions`);\n return existing;\n }\n const initial = defaults(sessionHandle);\n const value: SurfaceSnapshot = {\n sessionHandle,\n focused: false,\n cursorBlinkVisible: true,\n selection: initial.selection,\n theme: initial.theme,\n effects: initial.effects,\n damage: { full: true, rows: new Set(), geometryChanged: true },\n };\n surfaces.set(surfaceId, value);\n let sessionSurfaceIds = surfaceIdsBySession.get(sessionHandle);\n if (!sessionSurfaceIds) {\n sessionSurfaceIds = new Set();\n surfaceIdsBySession.set(sessionHandle, sessionSurfaceIds);\n }\n sessionSurfaceIds.add(surfaceId);\n if (!initial.visible) occluded.add(surfaceId);\n return value;\n}\n\nfunction surfaceIdsForSession(sessionHandle: string): ReadonlySet<string> {\n return surfaceIdsBySession.get(sessionHandle) ?? noSurfaceIds;\n}\n\nfunction deleteSurface(surfaceId: string): SurfaceSnapshot | undefined {\n const value = surfaces.get(surfaceId);\n if (!value) return undefined;\n surfaces.delete(surfaceId);\n const sessionSurfaceIds = surfaceIdsBySession.get(value.sessionHandle);\n sessionSurfaceIds?.delete(surfaceId);\n if (sessionSurfaceIds?.size === 0) surfaceIdsBySession.delete(value.sessionHandle);\n return value;\n}\n\nfunction renderView(session: SessionSnapshot, presentation: SurfaceSnapshot): RenderView {\n return {\n rows: session.rows,\n nativeRows: session.nativeRows,\n nativeStyleRows: session.nativeStyleRows,\n rowRevisions: session.rowRevisions,\n glyphDefinitions: session.glyphDefinitions,\n styleDefinitions: session.styleDefinitions,\n sessionEpoch: session.sessionEpoch,\n layoutEpoch: session.layoutEpoch,\n cursor: session.cursor,\n focused: presentation.focused,\n cursorBlinkVisible: presentation.cursorBlinkVisible,\n selection: presentation.selection,\n theme: presentation.theme,\n effects: presentation.effects,\n damage: presentation.damage,\n };\n}\n\nfunction scheduleCursorBlink(surfaceId: string, reset: boolean): void {\n const existing = cursorBlinkTimers.get(surfaceId);\n if (existing !== undefined) clearTimeout(existing);\n cursorBlinkTimers.delete(surfaceId);\n const value = surfaces.get(surfaceId);\n if (!value) return;\n const session = snapshot(value.sessionHandle);\n if (reset) value.cursorBlinkVisible = true;\n if (\n occluded.has(surfaceId) ||\n frozenCursors.has(surfaceId) ||\n !value.focused ||\n !session.cursor.visible ||\n !session.cursor.blinking\n )\n return;\n cursorBlinkTimers.set(\n surfaceId,\n setTimeout(() => {\n cursorBlinkTimers.delete(surfaceId);\n const current = surfaces.get(surfaceId);\n const currentSession = current ? snapshots.get(current.sessionHandle) : undefined;\n if (\n occluded.has(surfaceId) ||\n !current ||\n !currentSession ||\n !current.focused ||\n !currentSession.cursor.visible ||\n !currentSession.cursor.blinking\n )\n return;\n current.cursorBlinkVisible = !current.cursorBlinkVisible;\n invalidateRows(surfaceId, [currentSession.cursor.y]);\n scheduleCursorBlink(surfaceId, false);\n }, CURSOR_BLINK_INTERVAL_MS),\n );\n}\n\nasync function createRenderer(): Promise<TerminalRenderer> {\n if (forceCanvasFallback) {\n const canvas = new CanvasTerminalRenderer();\n postToRenderer({ type: \"renderer-status\", backend: canvas.kind, recovered: true });\n return canvas;\n }\n try {\n const gpu = await WebGpuTerminalRenderer.create((info) => void recoverDevice(info));\n recoveryAttempts = 0;\n postToRenderer({ type: \"renderer-status\", backend: gpu.kind });\n return gpu;\n } catch (error) {\n console.warn(\"[terminal-renderer] WebGPU unavailable; using diagnostic Canvas2D\", error);\n const canvas = new CanvasTerminalRenderer();\n postToRenderer({ type: \"renderer-status\", backend: canvas.kind });\n return canvas;\n }\n}\n\nasync function ensureRenderer(): Promise<TerminalRenderer> {\n rendererPromise ??= createRenderer();\n renderer = await rendererPromise;\n return renderer;\n}\n\nasync function recoverDevice(info: GPUDeviceLostInfo): Promise<void> {\n if (recovering || renderer?.kind === \"canvas2d\") return;\n recovering = true;\n recoveryAttempts += 1;\n console.warn(`[terminal-renderer] WebGPU device lost (${info.reason}): ${info.message}`);\n renderer = undefined;\n rendererPromise = WebGpuTerminalRenderer.create((nextInfo) => void recoverDevice(nextInfo));\n try {\n const next = await rendererPromise;\n renderer = next;\n recoveryAttempts = 0;\n recovering = false;\n for (const [id, mount] of mounts) {\n next.mount(id, mount.canvas);\n next.resize(id, mount.size);\n invalidateFull(id);\n }\n scheduleShaderAnimation();\n postToRenderer({ type: \"renderer-status\", backend: next.kind, recovered: true });\n } catch (error) {\n console.error(\"[terminal-renderer] WebGPU recovery failed\", error);\n rendererPromise = undefined;\n recovering = false;\n if (recoveryAttempts >= 3) {\n postToRenderer({ type: \"renderer-reload-required\", reason: \"webgpu-device-loss\" });\n return;\n }\n const delay = Math.min(5_000, 250 * 2 ** Math.min(recoveryAttempts, 4));\n setTimeout(() => void recoverDevice(info), delay);\n }\n}\n\nfunction scheduleFlush(): void {\n if (flushScheduled) return;\n flushScheduled = true;\n const run = (): void => {\n flushScheduled = false;\n void flush();\n };\n if (typeof self.requestAnimationFrame === \"function\") self.requestAnimationFrame(run);\n else setTimeout(run, 8);\n}\n\nfunction shaderAnimationActive(surfaceId: string, presentation: SurfaceSnapshot): boolean {\n return (\n renderer?.kind === \"webgpu\" &&\n mounts.has(surfaceId) &&\n !occluded.has(surfaceId) &&\n presentation.focused &&\n terminalEffectsNeedAnimation(presentation.effects)\n );\n}\n\nfunction scheduleShaderAnimation(): void {\n if (\n shaderAnimationScheduled ||\n ![...surfaces].some(([surfaceId, presentation]) => shaderAnimationActive(surfaceId, presentation))\n )\n return;\n shaderAnimationScheduled = true;\n const run = (): void => {\n shaderAnimationScheduled = false;\n for (const [surfaceId, presentation] of surfaces) {\n if (shaderAnimationActive(surfaceId, presentation)) markDirty(surfaceId);\n }\n scheduleShaderAnimation();\n };\n if (typeof self.requestAnimationFrame === \"function\") self.requestAnimationFrame(run);\n else setTimeout(run, 16);\n}\n\nasync function flush(): Promise<void> {\n const backend = await ensureRenderer();\n const ids = [...dirty].filter((id) => !occluded.has(id));\n if (performanceMeasurement && ids.length > 0) {\n performanceMeasurement.scheduling.flushes += 1;\n appendPerformanceSample(performanceMeasurement.scheduling.panesPerFlush, ids.length);\n performanceMeasurement.scheduling.maximumDirtyPanes = Math.max(\n performanceMeasurement.scheduling.maximumDirtyPanes,\n ids.length,\n );\n }\n for (const id of ids) dirty.delete(id);\n const entries = ids.flatMap((id) => {\n const presentation = surfaces.get(id);\n const session = presentation ? snapshots.get(presentation.sessionHandle) : undefined;\n return mounts.has(id) && presentation && session ? [{ id, view: renderView(session, presentation) }] : [];\n });\n if (entries.length > 0) {\n try {\n const active = performanceMeasurement;\n const beforeRender = active ? performance.now() : 0;\n const metrics = backend.renderBatch\n ? backend.renderBatch(entries)\n : entries.map(({ id, view }) => backend.render(id, view));\n for (const metric of metrics) recordLifetimeRenderMetrics(metric ?? emptyRenderMetrics());\n const renderedAt = active ? performance.now() : 0;\n for (const { id } of entries) {\n const damage = surfaces.get(id)?.damage;\n if (!damage) continue;\n damage.full = false;\n damage.rows.clear();\n damage.geometryChanged = false;\n }\n if (active && performanceMeasurement === active) {\n active.scheduling.renderCalls += entries.length;\n appendPerformanceSample(active.samples.renderCpuMs, renderedAt - beforeRender);\n for (let index = 0; index < entries.length; index += 1) {\n const { id } = entries[index]!;\n const dirtySince = active.dirtySince.get(id);\n const sessionHandle = surfaces.get(id)?.sessionHandle;\n const lastFrameAt = sessionHandle ? active.lastFrameAt.get(sessionHandle) : undefined;\n if (dirtySince !== undefined)\n appendPerformanceSample(active.samples.dirtyToRenderMs, renderedAt - dirtySince);\n if (lastFrameAt !== undefined)\n appendPerformanceSample(active.samples.frameArrivalToRenderMs, renderedAt - lastFrameAt);\n active.dirtySince.delete(id);\n recordRenderMetrics(metrics[index] ?? emptyRenderMetrics());\n }\n notePerformanceActivity(renderedAt);\n }\n } catch (error) {\n console.error(`[terminal-renderer] failed to render ${entries.length} view(s)`, error);\n }\n }\n if ([...dirty].some((id) => !occluded.has(id))) scheduleFlush();\n}\n\nfunction markDirty(id: string): void {\n if (performanceMeasurement && !performanceMeasurement.dirtySince.has(id)) {\n performanceMeasurement.dirtySince.set(id, performance.now());\n }\n dirty.add(id);\n if (!occluded.has(id)) scheduleFlush();\n}\n\nfunction invalidateFull(id: string): void {\n const value = surfaces.get(id);\n if (!value) return;\n const damage = value.damage;\n damage.full = true;\n damage.rows.clear();\n damage.geometryChanged = true;\n markDirty(id);\n}\n\nfunction invalidateRows(id: string, rows: Iterable<number>, geometryChanged = false): void {\n if (!partialRenderingEnabled) {\n invalidateFull(id);\n return;\n }\n const value = surfaces.get(id);\n if (!value) return;\n const damage = value.damage;\n if (!damage.full) {\n damage.geometryChanged ||= geometryChanged;\n for (const row of rows) {\n if (Number.isSafeInteger(row) && row >= 0) damage.rows.add(row);\n }\n }\n markDirty(id);\n}\n\nfunction invalidateSessionFull(sessionHandle: string): void {\n for (const surfaceId of surfaceIdsForSession(sessionHandle)) invalidateFull(surfaceId);\n}\n\nfunction invalidateSessionRows(sessionHandle: string, rows: Iterable<number>, geometryChanged = false): void {\n const damagedRows = [...rows];\n for (const surfaceId of surfaceIdsForSession(sessionHandle)) invalidateRows(surfaceId, damagedRows, geometryChanged);\n}\n\nasync function mount(surfaceId: string, sessionHandle: string, canvas: OffscreenCanvas): Promise<void> {\n if (mounts.has(surfaceId)) renderer?.unmount(surfaceId);\n snapshot(sessionHandle);\n surface(surfaceId, sessionHandle);\n const entry: MountedCanvas = { canvas, size: { width: 1, height: 1, dpr: 1 }, sessionHandle };\n mounts.set(surfaceId, entry);\n const backend = await ensureRenderer();\n if (mounts.get(surfaceId) !== entry) return;\n backend.mount(surfaceId, canvas);\n backend.resize(surfaceId, entry.size);\n invalidateFull(surfaceId);\n scheduleShaderAnimation();\n}\n\nfunction applyFrame(\n packet: ArrayBuffer,\n expectedIdentity?: RoutedTrfIdentity,\n expectedLayout?: RoutedExpectedLayout,\n): RoutedAppliedFrame | undefined {\n const active = performanceMeasurement;\n const applyStarted = active ? performance.now() : 0;\n lifetimeFrames.received += 1;\n lifetimeFrames.bytes += packet.byteLength;\n if (active) {\n active.frames.received += 1;\n active.frames.bytes += packet.byteLength;\n active.lastActivityAt = applyStarted;\n }\n const frame = decodeFrame(packet);\n const id = frame.sessionHandle.toString();\n if (\n expectedIdentity &&\n (id !== expectedIdentity.sessionHandle || frame.viewHandle.toString() !== expectedIdentity.viewHandle)\n ) {\n throw new Error(\"TRF1 identity does not match the routed activation binding\");\n }\n if (expectedLayout && (frame.cols !== expectedLayout.cols || frame.rows !== expectedLayout.rows)) {\n throw new Error(\"transfer layout does not match TRF1\");\n }\n if (expectedLayout && (frame.flags & FrameFlag.FullSnapshot) === 0) {\n throw new Error(\"routed transfer is not a full TRF1 snapshot\");\n }\n const counters = sessionCounters(id);\n lifetimeFrames.decodes += 1;\n counters.received += 1;\n counters.bytes += packet.byteLength;\n counters.decodes += 1;\n if ((frame.flags & FrameFlag.FullSnapshot) !== 0) {\n lifetimeFrames.full += 1;\n counters.full += 1;\n } else {\n lifetimeFrames.incremental += 1;\n counters.incremental += 1;\n }\n if (active) {\n active.lastFrameAt.set(id, applyStarted);\n if ((frame.flags & FrameFlag.FullSnapshot) !== 0) active.frames.full += 1;\n else active.frames.incremental += 1;\n }\n const replacingScene = expectedLayout !== undefined;\n const installedScene = replacingScene ? snapshots.get(id) : undefined;\n const previous = replacingScene ? emptySessionSnapshot() : snapshot(id);\n const fullFrame = (frame.flags & FrameFlag.FullSnapshot) !== 0;\n const catalogReset = (frame.flags & FrameFlag.CatalogReset) !== 0;\n if (catalogReset && !fullFrame) {\n if (expectedIdentity) throw new Error(\"catalog reset without a full routed frame\");\n if (active) {\n active.frames.resyncRequested += 1;\n appendPerformanceSample(active.samples.frameApplyMs, performance.now() - applyStarted);\n }\n previous.awaitingResync = true;\n postToRenderer({ type: \"frame-resync-needed\", sessionHandle: id });\n return;\n }\n const classification = classifyFrame(previous, {\n sessionEpoch: frame.sessionEpoch,\n layoutEpoch: frame.layoutEpoch,\n sequence: frame.frameSequence,\n full: fullFrame,\n });\n if (classification === \"stale\") {\n lifetimeFrames.stale += 1;\n counters.stale += 1;\n if (active) {\n active.frames.stale += 1;\n appendPerformanceSample(active.samples.frameApplyMs, performance.now() - applyStarted);\n }\n if (expectedIdentity) throw new Error(\"stale routed TRF1 frame\");\n return undefined;\n }\n const changedSession = previous.sessionEpoch !== 0n && frame.sessionEpoch !== previous.sessionEpoch;\n if (classification === \"resync\") {\n if (expectedIdentity) throw new Error(\"routed TRF1 continuity requires a transfer\");\n if (active) {\n active.frames.resyncRequested += 1;\n appendPerformanceSample(active.samples.frameApplyMs, performance.now() - applyStarted);\n }\n previous.awaitingResync = true;\n postToRenderer({ type: \"frame-resync-needed\", sessionHandle: id });\n return undefined;\n }\n const completingResync = previous.awaitingResync;\n const rowSection = frame.sections.find((candidate) => candidate.kind === SectionKind.RowReplacements);\n const cursorSection = frame.sections.find((candidate) => candidate.kind === SectionKind.CursorState);\n const glyphSection = frame.sections.find((candidate) => candidate.kind === SectionKind.GlyphDefinitions);\n const styleSection = frame.sections.find((candidate) => candidate.kind === SectionKind.StyleDefinitions);\n const clipboardSection = frame.sections.find((candidate) => candidate.kind === SectionKind.ClipboardWrite);\n const scrollbarSection = frame.sections.find((candidate) => candidate.kind === SectionKind.ScrollbarState);\n if (!rowSection || !cursorSection) {\n if (expectedIdentity) throw new Error(\"routed TRF1 frame is missing required sections\");\n if (active) appendPerformanceSample(active.samples.frameApplyMs, performance.now() - applyStarted);\n return undefined;\n }\n const fullRows = (rowSection.flags & 1) !== 0;\n if (replacingScene && !fullRows) {\n throw new Error(\"routed transfer row section is not a full snapshot\");\n }\n\n const glyphDefinitions = glyphSection ? decodeGlyphDefinitions(glyphSection) : NO_GLYPH_DEFINITIONS;\n const styleDefinitions = styleSection ? decodeStyleDefinitions(styleSection) : NO_STYLE_DEFINITIONS;\n const replacements = decodeRowReplacements(rowSection);\n for (const replacement of replacements) {\n if (replacement.row >= frame.rows) throw new RangeError(\"Row replacement exceeds viewport\");\n }\n const nextCursor = decodeCursorState(cursorSection);\n const clipboardText = clipboardSection ? decodeClipboardWrite(clipboardSection) : undefined;\n let scrollbar: TerminalScrollbarState | undefined;\n if (scrollbarSection) {\n const decoded = decodeScrollbarState(scrollbarSection);\n scrollbar = {\n total: Number(decoded.total),\n offset: Number(decoded.offset),\n length: Number(decoded.length),\n };\n if (\n !Number.isSafeInteger(scrollbar.total) ||\n !Number.isSafeInteger(scrollbar.offset) ||\n !Number.isSafeInteger(scrollbar.length)\n ) {\n throw new RangeError(\"Scrollbar state exceeds JavaScript's safe integer range\");\n }\n }\n if (\n expectedLayout &&\n (scrollbar === undefined ||\n scrollbar.length !== expectedLayout.rows ||\n scrollbar.total - scrollbar.length !== expectedLayout.scrollbackRows)\n ) {\n throw new Error(\"transfer scrollback layout does not match TRF1\");\n }\n if (active) active.frames.glyphDefinitions += glyphDefinitions.length;\n const resetsCatalog = replacingScene || changedSession || completingResync || catalogReset;\n const wasCatalogFallback = previous.catalogFallback;\n if (resetsCatalog) {\n previous.rows = [];\n previous.nativeRows = [];\n previous.nativeStyleRows = [];\n clearSessionCatalog(previous);\n previous.rowRevisions = [];\n const catalogFits =\n glyphCatalogFits(\n previous.glyphDefinitions,\n previous.glyphPixelBytes,\n sharedGlyphDefinitions,\n sharedGlyphPixelBytes,\n glyphDefinitions,\n GLYPH_CATALOG_BUDGET,\n ) &&\n definitionCatalogFits(\n previous.styleDefinitions,\n styleDefinitions,\n MAX_SESSION_STYLE_DEFINITIONS,\n retainedStyleDefinitions,\n MAX_RETAINED_STYLE_DEFINITIONS,\n );\n const admission = catalogAdmission(true, wasCatalogFallback, catalogFits);\n previous.catalogFallback = admission === \"text-fallback\";\n if (admission === \"install\") {\n installGlyphDefinitions(previous, glyphDefinitions);\n installStyleDefinitions(previous, styleDefinitions);\n } else if (!wasCatalogFallback) {\n postToRenderer({\n type: \"catalog-pressure\",\n sessionHandle: id,\n reason: \"working-set-exceeds-budget\",\n });\n }\n } else if (!previous.catalogFallback) {\n const catalogFits =\n glyphCatalogFits(\n previous.glyphDefinitions,\n previous.glyphPixelBytes,\n sharedGlyphDefinitions,\n sharedGlyphPixelBytes,\n glyphDefinitions,\n GLYPH_CATALOG_BUDGET,\n ) &&\n definitionCatalogFits(\n previous.styleDefinitions,\n styleDefinitions,\n MAX_SESSION_STYLE_DEFINITIONS,\n retainedStyleDefinitions,\n MAX_RETAINED_STYLE_DEFINITIONS,\n );\n const admission = catalogAdmission(false, false, catalogFits);\n if (admission === \"request-full\") {\n if (expectedIdentity) throw new Error(\"routed catalog pressure requires a fresh transfer\");\n if (active) {\n active.frames.resyncRequested += 1;\n appendPerformanceSample(active.samples.frameApplyMs, performance.now() - applyStarted);\n }\n previous.awaitingResync = true;\n postToRenderer({ type: \"frame-resync-needed\", sessionHandle: id });\n return undefined;\n }\n if (admission === \"install\") {\n installGlyphDefinitions(previous, glyphDefinitions);\n installStyleDefinitions(previous, styleDefinitions);\n }\n }\n if (!previous.catalogFallback && !nativeTextAnnounced && glyphDefinitions.length > 0) {\n nativeTextAnnounced = true;\n postToRenderer({ type: \"renderer-status\", backend: renderer?.kind ?? \"starting\", textEngine: \"native\" });\n }\n let scrollbarChanged = false;\n if (scrollbar) {\n if (\n !previous.scrollbar ||\n previous.scrollbar.total !== scrollbar.total ||\n previous.scrollbar.offset !== scrollbar.offset ||\n previous.scrollbar.length !== scrollbar.length\n ) {\n previous.scrollbar = scrollbar;\n scrollbarChanged = true;\n }\n }\n\n const useNativeCatalog = !previous.catalogFallback;\n const rows = fullRows ? Array<string>(frame.rows).fill(\"\") : previous.rows.slice();\n const nativeRows = fullRows\n ? Array.from({ length: frame.rows }, () => [] as GlyphInstance[])\n : previous.nativeRows.slice();\n const nativeStyleRows = fullRows\n ? Array.from({ length: frame.rows }, () => [] as StyleRun[])\n : previous.nativeStyleRows.slice();\n const rowRevisions = fullRows ? Array<bigint>(frame.rows).fill(0n) : previous.rowRevisions.slice();\n const damagedRows: number[] = [];\n if (active) active.frames.rowsDecoded += replacements.length;\n for (const replacement of replacements) {\n if (replacement.revision < (rowRevisions[replacement.row] ?? 0n)) continue;\n rows[replacement.row] = replacement.text;\n nativeRows[replacement.row] = useNativeCatalog ? replacement.glyphs : [];\n nativeStyleRows[replacement.row] = useNativeCatalog ? replacement.styles : [];\n rowRevisions[replacement.row] = replacement.revision;\n damagedRows.push(replacement.row);\n }\n previous.rows = rows;\n previous.nativeRows = nativeRows;\n previous.nativeStyleRows = nativeStyleRows;\n previous.rowRevisions = rowRevisions;\n const geometryChanged = damagedRows.length > 0;\n const previousCursor = previous.cursor;\n const cursorChanged =\n nextCursor.x !== previousCursor.x ||\n nextCursor.y !== previousCursor.y ||\n nextCursor.visible !== previousCursor.visible ||\n nextCursor.style !== previousCursor.style ||\n nextCursor.blinking !== previousCursor.blinking;\n previous.cursor = nextCursor;\n previous.layoutEpoch = frame.layoutEpoch;\n previous.sessionEpoch = frame.sessionEpoch;\n previous.sequence = frame.frameSequence;\n previous.awaitingResync = false;\n if (replacingScene) {\n snapshots.set(id, previous);\n if (installedScene) clearSessionCatalog(installedScene);\n }\n if (clipboardText !== undefined) postToRenderer({ type: \"clipboard-write\", text: clipboardText });\n if (scrollbarChanged && scrollbar) postToRenderer({ type: \"scrollbar-state\", sessionHandle: id, scrollbar });\n if (completingResync) postToRenderer({ type: \"frame-resync-complete\", sessionHandle: id });\n const requiresFullRedraw = fullRows || changedSession || completingResync;\n if (!requiresFullRedraw && cursorChanged) damagedRows.push(previousCursor.y, nextCursor.y);\n const hasRowDamage = damagedRows.length > 0;\n for (const surfaceId of surfaceIdsForSession(id)) {\n if (cursorChanged) scheduleCursorBlink(surfaceId, true);\n if (requiresFullRedraw) invalidateFull(surfaceId);\n else if (hasRowDamage) invalidateRows(surfaceId, damagedRows, geometryChanged);\n }\n // Announced only once the frame is committed and its redraw scheduled, so a\n // consumer waiting on recovery is never told \"done\" ahead of the pixels.\n postToRenderer({\n type: \"frame-committed\",\n sessionHandle: id,\n sessionEpoch: frame.sessionEpoch,\n frameSequence: frame.frameSequence,\n // A resume publishes a full refresh, and `classifyFrame` only accepts a\n // resync-completing frame that carries one, so this flag is what tells a\n // recovered screen apart from a partial update of the stale one.\n fullSnapshot: fullFrame,\n });\n lifetimeFrames.applies += 1;\n counters.applies += 1;\n if (active) appendPerformanceSample(active.samples.frameApplyMs, performance.now() - applyStarted);\n return {\n sessionHandle: id,\n viewHandle: frame.viewHandle.toString(),\n cols: frame.cols,\n rows: frame.rows,\n };\n}\n\nconst routedFrames = new RoutedFramesTransport({\n applyFrame: (packet, identity, expectedLayout) => {\n const applied = applyFrame(packet, identity, expectedLayout);\n if (!applied) throw new Error(\"routed TRF1 frame was not applied\");\n return applied;\n },\n emit: (event) => postToRenderer({ type: \"routed-frames-event\", event }),\n creditReturned: (bytes) => {\n lifetimeFlow.creditBytesReturned += bytes;\n lifetimeFlow.creditBatchesReturned += 1;\n },\n});\n\nself.onmessage = (event: MessageEvent<RendererToWorkerMessage>) => {\n const message = event.data;\n try {\n if (message.type === \"mount\") {\n void mount(message.surfaceId, message.sessionHandle, message.canvas).catch((error) => {\n console.error(\"[terminal-renderer] mount failed\", error);\n });\n } else if (message.type === \"renderer-config\") {\n forceCanvasFallback = Boolean(message.forceCanvasFallback);\n } else if (message.type === \"partial-rendering\") {\n partialRenderingEnabled = Boolean(message.enabled);\n for (const id of mounts.keys()) invalidateFull(id);\n } else if (message.type === \"unmount\") {\n mounts.delete(message.surfaceId);\n dirty.delete(message.surfaceId);\n deleteSurface(message.surfaceId);\n occluded.delete(message.surfaceId);\n frozenCursors.delete(message.surfaceId);\n renderer?.unmount(message.surfaceId);\n const timer = cursorBlinkTimers.get(message.surfaceId);\n if (timer !== undefined) clearTimeout(timer);\n cursorBlinkTimers.delete(message.surfaceId);\n // The session may be remounted after zoom/layout changes. Keep its decoded\n // snapshot; only drop-session represents terminal lifetime ending.\n } else if (message.type === \"drop-session\") {\n for (const surfaceId of surfaceIdsForSession(message.sessionHandle)) {\n mounts.delete(surfaceId);\n dirty.delete(surfaceId);\n surfaces.delete(surfaceId);\n occluded.delete(surfaceId);\n frozenCursors.delete(surfaceId);\n renderer?.unmount(surfaceId);\n const timer = cursorBlinkTimers.get(surfaceId);\n if (timer !== undefined) clearTimeout(timer);\n cursorBlinkTimers.delete(surfaceId);\n }\n surfaceIdsBySession.delete(message.sessionHandle);\n dropSessionSnapshot(message.sessionHandle);\n presentationDefaults.delete(message.sessionHandle);\n performanceMeasurement?.lastFrameAt.delete(message.sessionHandle);\n } else if (message.type === \"resize\") {\n const mounted = mounts.get(message.surfaceId);\n if (!mounted) return;\n const nextSize = { width: message.width, height: message.height, dpr: message.dpr };\n const changed = renderedSizeChanged(mounted.size, nextSize);\n mounted.size = nextSize;\n if (!changed) return;\n renderer?.resize(message.surfaceId, mounted.size);\n invalidateFull(message.surfaceId);\n } else if (message.type === \"frame\") {\n try {\n applyFrame(message.packet);\n } finally {\n returnFrameCredit(message.packet.byteLength);\n }\n } else if (message.type === \"frame-gap\") {\n for (const sessionHandle of message.sessionHandles) {\n const session = snapshot(sessionHandle);\n if (session.awaitingResync) continue;\n session.awaitingResync = true;\n postToRenderer({ type: \"frame-resync-needed\", sessionHandle });\n }\n } else if (message.type === \"expect-full\") {\n snapshot(message.sessionHandle).awaitingResync = true;\n } else if (message.type === \"theme\") {\n if (message.surfaceId) {\n surface(message.surfaceId, message.sessionHandle).theme = message.theme;\n invalidateFull(message.surfaceId);\n } else {\n defaults(message.sessionHandle).theme = message.theme;\n for (const surfaceId of surfaceIdsForSession(message.sessionHandle)) {\n surfaces.get(surfaceId)!.theme = message.theme;\n invalidateFull(surfaceId);\n }\n }\n } else if (message.type === \"effects\") {\n if (message.surfaceId) {\n surface(message.surfaceId, message.sessionHandle).effects = message.effects;\n invalidateFull(message.surfaceId);\n } else {\n defaults(message.sessionHandle).effects = message.effects;\n for (const surfaceId of surfaceIdsForSession(message.sessionHandle)) {\n surfaces.get(surfaceId)!.effects = message.effects;\n invalidateFull(surfaceId);\n }\n }\n scheduleShaderAnimation();\n } else if (message.type === \"selection\") {\n if (message.surfaceId) {\n surface(message.surfaceId, message.sessionHandle).selection = message.selection;\n invalidateFull(message.surfaceId);\n } else {\n defaults(message.sessionHandle).selection = message.selection;\n for (const surfaceId of surfaceIdsForSession(message.sessionHandle)) {\n surfaces.get(surfaceId)!.selection = message.selection;\n invalidateFull(surfaceId);\n }\n }\n } else if (message.type === \"visibility\") {\n if (!message.surfaceId) defaults(message.sessionHandle).visible = message.visible;\n if (message.surfaceId) surface(message.surfaceId, message.sessionHandle);\n const targetIds = message.surfaceId ? [message.surfaceId] : surfaceIdsForSession(message.sessionHandle);\n for (const surfaceId of targetIds) {\n if (message.visible) {\n occluded.delete(surfaceId);\n invalidateFull(surfaceId);\n scheduleCursorBlink(surfaceId, true);\n } else {\n occluded.add(surfaceId);\n const timer = cursorBlinkTimers.get(surfaceId);\n if (timer !== undefined) clearTimeout(timer);\n cursorBlinkTimers.delete(surfaceId);\n }\n }\n scheduleShaderAnimation();\n } else if (message.type === \"focus\") {\n const value = surface(message.surfaceId, message.sessionHandle);\n value.focused = Boolean(message.focused);\n scheduleCursorBlink(message.surfaceId, value.focused);\n invalidateRows(message.surfaceId, [snapshot(message.sessionHandle).cursor.y]);\n scheduleShaderAnimation();\n } else if (message.type === \"cursor-frozen\") {\n const value = surfaces.get(message.surfaceId);\n if (!value) return;\n if (message.frozen) {\n frozenCursors.add(message.surfaceId);\n const timer = cursorBlinkTimers.get(message.surfaceId);\n if (timer !== undefined) clearTimeout(timer);\n cursorBlinkTimers.delete(message.surfaceId);\n // Rest on the visible half of the blink so the frozen screen shows the\n // cursor where the host left it.\n if (!value.cursorBlinkVisible) {\n value.cursorBlinkVisible = true;\n invalidateRows(message.surfaceId, [snapshot(value.sessionHandle).cursor.y]);\n }\n } else {\n frozenCursors.delete(message.surfaceId);\n scheduleCursorBlink(message.surfaceId, true);\n }\n } else if (message.type === \"cursor-activity\") {\n const session = snapshot(message.sessionHandle);\n for (const surfaceId of surfaceIdsForSession(message.sessionHandle)) {\n const value = surfaces.get(surfaceId)!;\n const changesPixels = cursorActivityChangesPixels(session.cursor, value.focused, value.cursorBlinkVisible);\n scheduleCursorBlink(surfaceId, true);\n if (changesPixels) invalidateRows(surfaceId, [session.cursor.y]);\n }\n } else if (message.type === \"force-full-redraw\") {\n invalidateSessionFull(message.sessionHandle);\n } else if (message.type === \"force-row-redraw\") {\n invalidateSessionRows(message.sessionHandle, [message.row]);\n } else if (message.type === \"performance-start\") {\n void ensureRenderer()\n .then(() => {\n beginPerformanceMeasurement();\n postToRenderer({ type: \"performance-started\", requestId: message.requestId });\n })\n .catch((error) => console.error(\"[terminal-renderer] failed to start performance measurement\", error));\n } else if (message.type === \"performance-finish\") {\n void finishPerformanceMeasurement(message.requestId, message.quietMs, message.timeoutMs).catch((error) => {\n console.error(\"[terminal-renderer] failed to finish performance measurement\", error);\n });\n } else if (message.type === \"performance-counters\") {\n postToRenderer({ type: \"performance-counters\", requestId: message.requestId, snapshot: counterSnapshot() });\n } else if (message.type === \"routed-frames-attach\") {\n routedFrames.attach(message.request);\n } else if (message.type === \"routed-frames-detach\") {\n routedFrames.detach(message.activationId);\n }\n } catch (error) {\n console.error(\"[terminal-renderer] rejected worker message\", error);\n }\n};\n"],
5
+ "mappings": "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",
6
6
  "names": ["SectionKind", "GlyphFormat", "CursorStyle", "surface", "surface", "ordered", "snapshot", "mount"]
7
7
  }