@vibecook/ghosttea-react 0.11.1 → 0.13.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.
- package/README.md +86 -4
- package/dist/TerminalSurface.d.ts +53 -0
- package/dist/TerminalSurface.d.ts.map +1 -1
- package/dist/TerminalSurface.js +106 -12
- package/dist/TerminalSurface.js.map +1 -1
- package/dist/appearance/AppearanceSettings.d.ts +5 -2
- package/dist/appearance/AppearanceSettings.d.ts.map +1 -1
- package/dist/appearance/AppearanceSettings.js +14 -3
- package/dist/appearance/AppearanceSettings.js.map +1 -1
- package/dist/appearance/BackdropBlurControl.d.ts +5 -0
- package/dist/appearance/BackdropBlurControl.d.ts.map +1 -0
- package/dist/appearance/BackdropBlurControl.js +42 -0
- package/dist/appearance/BackdropBlurControl.js.map +1 -0
- package/dist/appearance/types.d.ts +10 -0
- package/dist/appearance/types.d.ts.map +1 -1
- package/dist/catalog-budget.d.ts +2 -2
- package/dist/catalog-budget.d.ts.map +1 -1
- package/dist/catalog-budget.js +2 -2
- package/dist/catalog-budget.js.map +1 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +2 -0
- package/dist/config.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/link-input.d.ts +18 -0
- package/dist/link-input.d.ts.map +1 -0
- package/dist/link-input.js +27 -0
- package/dist/link-input.js.map +1 -0
- package/dist/renderers/background-geometry.d.ts +16 -0
- package/dist/renderers/background-geometry.d.ts.map +1 -0
- package/dist/renderers/background-geometry.js +20 -0
- package/dist/renderers/background-geometry.js.map +1 -0
- package/dist/renderers/glyph-atlas.d.ts +43 -0
- package/dist/renderers/glyph-atlas.d.ts.map +1 -0
- package/dist/renderers/glyph-atlas.js +175 -0
- package/dist/renderers/glyph-atlas.js.map +1 -0
- package/dist/renderers/light-adaptation.d.ts +36 -0
- package/dist/renderers/light-adaptation.d.ts.map +1 -0
- package/dist/renderers/light-adaptation.js +332 -0
- package/dist/renderers/light-adaptation.js.map +1 -0
- package/dist/renderers/types.d.ts +23 -0
- package/dist/renderers/types.d.ts.map +1 -1
- package/dist/renderers/types.js.map +1 -1
- package/dist/renderers/webgpu-renderer.d.ts +4 -0
- package/dist/renderers/webgpu-renderer.d.ts.map +1 -1
- package/dist/renderers/webgpu-renderer.js +331 -239
- package/dist/renderers/webgpu-renderer.js.map +1 -1
- package/dist/routed-control.d.ts +26 -2
- package/dist/routed-control.d.ts.map +1 -1
- package/dist/routed-control.js +145 -27
- package/dist/routed-control.js.map +1 -1
- package/dist/routed-frames.d.ts +1 -1
- package/dist/routed-frames.d.ts.map +1 -1
- package/dist/routed-frames.js +3 -7
- package/dist/routed-frames.js.map +1 -1
- package/dist/row-damage.d.ts +21 -0
- package/dist/row-damage.d.ts.map +1 -0
- package/dist/row-damage.js +76 -0
- package/dist/row-damage.js.map +1 -0
- package/dist/runtime.d.ts +97 -3
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +489 -49
- package/dist/runtime.js.map +1 -1
- package/dist/styles.css +24 -0
- package/dist/terminal-render.worker.js +979 -297
- package/dist/terminal-render.worker.js.map +4 -4
- package/dist/use-terminal-links.d.ts +17 -0
- package/dist/use-terminal-links.d.ts.map +1 -0
- package/dist/use-terminal-links.js +101 -0
- package/dist/use-terminal-links.js.map +1 -0
- package/dist/worker-messages.d.ts +27 -1
- package/dist/worker-messages.d.ts.map +1 -1
- package/dist/workspace/Workspace.d.ts +19 -3
- package/dist/workspace/Workspace.d.ts.map +1 -1
- package/dist/workspace/Workspace.js +53 -20
- package/dist/workspace/Workspace.js.map +1 -1
- package/dist/workspace/index.d.ts +2 -2
- package/dist/workspace/index.d.ts.map +1 -1
- package/dist/workspace/index.js.map +1 -1
- package/dist/workspace/pane-focus.d.ts +8 -0
- package/dist/workspace/pane-focus.d.ts.map +1 -0
- package/dist/workspace/pane-focus.js +24 -0
- package/dist/workspace/pane-focus.js.map +1 -0
- package/dist/workspace/pane-layout.d.ts +5 -2
- package/dist/workspace/pane-layout.d.ts.map +1 -1
- package/dist/workspace/pane-layout.js +45 -6
- package/dist/workspace/pane-layout.js.map +1 -1
- 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", "../../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
|
-
"names": ["SectionKind", "GlyphFormat", "CursorStyle", "surface", "surface", "ordered", "snapshot", "mount"]
|
|
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/background-geometry.ts", "../src/renderers/render-damage.ts", "../src/renderers/shader-effects.ts", "../src/renderers/light-adaptation.ts", "../src/renderers/glyph-atlas.ts", "../src/renderers/webgpu-renderer.ts", "../src/frame-sequence.ts", "../src/cursor-invalidation.ts", "../src/row-damage.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 LinkTargets = 12,\n StylePalette = 13,\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 /** Palette index `foreground` was resolved from, when it came from the palette. */\n foregroundPalette?: number;\n /** Palette index `background` was resolved from, when it came from the palette. */\n backgroundPalette?: number;\n}\n\nexport interface StylePaletteEntry {\n styleId: number;\n foreground?: number;\n background?: 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 | Uint8Array): TerminalFrame {\n // Normalize subclasses (notably Node Buffer) without copying the frame.\n // Sections borrow this bounded view; retained glyph pixels must still copy.\n const bytes =\n buffer instanceof Uint8Array\n ? new Uint8Array(buffer.buffer, buffer.byteOffset, buffer.byteLength)\n : new Uint8Array(buffer);\n assertRange(bytes.byteLength >= FRAME_HEADER_BYTES, \"truncated header\");\n assertRange(bytes.byteLength <= MAX_FRAME_BYTES, \"packet exceeds limit\");\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\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 <= bytes.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 <= bytes.byteLength, \"section out of bounds\");\n sections.push({ kind, flags, itemCount, bytes: bytes.subarray(offset, end) });\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: new Uint8Array(section.bytes.subarray(offset, offset + pixelLength)),\n });\n offset += pixelLength;\n }\n assertRange(offset === section.bytes.byteLength, \"trailing glyph definition bytes\");\n return definitions;\n}\n\n/**\n * Decodes style definitions. Pass the frame's optional `StylePalette` section\n * to attach palette provenance; the RGB colors are complete without it.\n */\nexport function decodeStyleDefinitions(section: FrameSection, paletteSection?: 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 if (!paletteSection) return styles;\n const palette = new Map(decodeStylePalette(paletteSection).map((entry) => [entry.styleId, entry]));\n return styles.map((style) => {\n const entry = palette.get(style.id);\n if (!entry) return style;\n return {\n ...style,\n ...(entry.foreground !== undefined && style.foreground ? { foregroundPalette: entry.foreground } : {}),\n ...(entry.background !== undefined && style.background ? { backgroundPalette: entry.background } : {}),\n };\n });\n}\n\nexport function decodeStylePalette(section: FrameSection): StylePaletteEntry[] {\n assertRange(section.kind === SectionKind.StylePalette, \"wrong style palette section kind\");\n assertRange(section.bytes.byteLength >= 4, \"truncated style palette 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 palette count mismatch\");\n assertRange(section.bytes.byteLength === 4 + count * 8, \"invalid style palette length\");\n const entries: StylePaletteEntry[] = [];\n for (let index = 0; index < count; index += 1) {\n const offset = 4 + index * 8;\n const flags = view.getUint8(offset + 4);\n assertRange((flags & ~0x3) === 0, \"invalid style palette flags\");\n entries.push({\n styleId: view.getUint32(offset, true),\n ...(flags & 1 ? { foreground: view.getUint8(offset + 5) } : {}),\n ...(flags & 2 ? { background: view.getUint8(offset + 6) } : {}),\n });\n }\n return entries;\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\nexport interface TerminalLinkSpan {\n row: number;\n startColumn: number;\n endColumn: number;\n}\n\nexport interface TerminalLink {\n uri: string;\n explicit: boolean;\n spans: TerminalLinkSpan[];\n}\n\n/** Section 12 replaces the entire viewport link set, even on incremental frames. */\nexport function decodeLinkTargets(section: FrameSection, cols: number, rows: number): TerminalLink[] {\n const bytes = section.bytes;\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n assertRange(bytes.length >= 4, \"truncated link count\");\n const count = view.getUint32(0, true);\n assertRange(count === section.itemCount && count <= cols * rows, \"invalid link count\");\n const links: TerminalLink[] = [];\n const decoder = new TextDecoder(\"utf-8\", { fatal: true });\n let offset = 4;\n for (let index = 0; index < count; index++) {\n assertRange(offset + 8 <= bytes.length, \"truncated link header\");\n const length = view.getUint32(offset, true);\n const spanCount = view.getUint16(offset + 4, true);\n const flags = view.getUint16(offset + 6, true);\n offset += 8;\n assertRange(\n length > 0 && length <= 8192 && spanCount > 0 && spanCount <= rows && flags <= 1,\n \"invalid link header\",\n );\n assertRange(offset + length + spanCount * 6 <= bytes.length, \"truncated link target\");\n const uri = decoder.decode(bytes.subarray(offset, offset + length));\n offset += length;\n const spans: TerminalLinkSpan[] = [];\n for (let spanIndex = 0; spanIndex < spanCount; spanIndex++) {\n const row = view.getUint16(offset, true);\n const startColumn = view.getUint16(offset + 2, true);\n const endColumn = view.getUint16(offset + 4, true);\n assertRange(row < rows && startColumn < endColumn && endColumn <= cols, \"link span exceeds viewport\");\n spans.push({ row, startColumn, endColumn });\n offset += 6;\n }\n links.push({ uri, explicit: flags === 1, spans });\n }\n assertRange(offset === bytes.length, \"trailing link data\");\n return links;\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 * Under a light theme, remap panes that an application paints dark with its\n * own backgrounds (Grok, fixed-theme TUIs) into a light design. \"auto\"\n * engages per pane only when most cells carry an explicit dark background.\n */\n lightAdaptation?: \"auto\" | \"off\";\n /**\n * Ghostty `minimum-contrast`: the WCAG ratio text keeps against its cell\n * background (1\u201321; 1 is off). Box drawing, block elements, and color\n * glyphs are exempt.\n */\n minimumContrast?: number;\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 /** Columns in the committed terminal frame, independent of the canvas size. */\n cols: number;\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 /** Positive moves old rows upward. Accumulated since the last submitted scene. */\n scrollRows?: number;\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 RenderSubmission {\n queueSubmits: number;\n /** Submitted surfaces, including effects-only presentations. Not display timestamps. */\n surfaceIds: readonly string[];\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 /** Cheap accounting for the most recent render/renderBatch, independent of profiling. */\n submission?(): RenderSubmission;\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 { StyleRun } from \"@vibecook/ghosttea-frame\";\nimport { CELL_WIDTH, LINE_HEIGHT, ORIGIN_X, ORIGIN_Y } from \"./types.js\";\n\ninterface BackgroundBounds {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\n/**\n * Carry edge-cell backgrounds through the canvas padding and fractional cells.\n * Use the committed frame's grid: text can omit trailing blank cells, and the\n * canvas can resize before the terminal's replacement frame arrives. Expanding\n * the original rectangle avoids double blending translucent backgrounds.\n */\nexport function backgroundRunBounds(\n run: Pick<StyleRun, \"cellStart\" | \"cellSpan\">,\n row: number,\n cols: number,\n rows: number,\n scale: number,\n viewportWidth: number,\n viewportHeight: number,\n): BackgroundBounds | null {\n if (cols <= 0 || row < 0 || row >= rows || run.cellSpan <= 0 || run.cellStart >= cols) return null;\n const end = run.cellStart + run.cellSpan;\n const x = run.cellStart === 0 ? 0 : (ORIGIN_X + run.cellStart * CELL_WIDTH) * scale;\n const y = row === 0 ? 0 : (ORIGIN_Y + row * LINE_HEIGHT) * scale;\n const right = end >= cols ? viewportWidth : Math.min(viewportWidth, (ORIGIN_X + end * CELL_WIDTH) * scale);\n const bottom =\n row === rows - 1 ? viewportHeight : Math.min(viewportHeight, (ORIGIN_Y + (row + 1) * LINE_HEIGHT) * scale);\n if (right <= x || bottom <= y) return null;\n return { x, y, width: right - x, height: bottom - y };\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", "// Light adaptation: render a dark-painted application (one that fills the\n// screen with its own truecolor backgrounds) as a light design under a light\n// theme. Colors are remapped per style before blending, so glyph coverage,\n// color emoji, and the shader stack are untouched.\n//\n// The rules come from comparing candidate remaps with three applications' own\n// light designs (GrokDay, Codex, OpenCode):\n//\n// surfaces mirror around the paper in Lr (OKLab lightness with Ottosson's\n// toe, which tracks CIE L*): a panel 0.05 above the app's base\n// lands 0.05 below the theme background; the base's tint becomes\n// the paper's. Tinted rows step down until a visible tint fits.\n// neutral ink keeps its Lr distance from its own cell background, mirrored,\n// so primary/secondary/border grays keep their order.\n// accents land in a mid-tone band: APCA Lc = clamp(0.5\u00B7|Lc| + 28, 45, 70)\n// against the new background, chroma raised toward 0.12.\n//\n// Theme-owned colors (default fg/bg) are left to the theme, and so are\n// chromatic ANSI colors (palette 1\u20136, 9\u201314): the light theme designed them for\n// light paper, so they pass through unless the remapped surface beneath makes\n// them less legible than on the theme background. Neutral ANSI colors (0, 7,\n// 8, 15) carry a role \u2014 \"bright text\", \"dim panel\" \u2014 rather than a hue, so\n// they remap like truecolor.\n\nimport type { StyleDefinition } from \"@vibecook/ghosttea-frame\";\nimport type { RenderView, Rgba } from \"./types.js\";\n\nexport type Rgb = readonly [number, number, number];\ntype Lab = [number, number, number];\n\nconst clamp = (value: number, lo = 0, hi = 1): number => Math.min(hi, Math.max(lo, value));\nconst toLinear = (v: number): number => (v <= 0.04045 ? v / 12.92 : ((v + 0.055) / 1.055) ** 2.4);\nconst toGamma = (v: number): number => (v <= 0.0031308 ? v * 12.92 : 1.055 * v ** (1 / 2.4) - 0.055);\n\nfunction oklab([r8, g8, b8]: Rgb): Lab {\n const r = toLinear(r8 / 255);\n const g = toLinear(g8 / 255);\n const b = toLinear(b8 / 255);\n const l = Math.cbrt(0.4122214708 * r + 0.5363325363 * g + 0.0514459929 * b);\n const m = Math.cbrt(0.2119034982 * r + 0.6806995451 * g + 0.1073969566 * b);\n const s = Math.cbrt(0.0883024619 * r + 0.2817188376 * g + 0.6299787005 * b);\n return [\n 0.2104542553 * l + 0.793617785 * m - 0.0040720468 * s,\n 1.9779984951 * l - 2.428592205 * m + 0.4505937099 * s,\n 0.0259040371 * l + 0.7827717662 * m - 0.808675766 * s,\n ];\n}\n\nfunction oklabToLinear([L, a, b]: Lab): Lab {\n const l = (L + 0.3963377774 * a + 0.2158037573 * b) ** 3;\n const m = (L - 0.1055613458 * a - 0.0638541728 * b) ** 3;\n const s = (L - 0.0894841775 * a - 1.291485548 * b) ** 3;\n return [\n 4.0767416621 * l - 3.3077115913 * m + 0.2309699292 * s,\n -1.2684380046 * l + 2.6097574011 * m - 0.3413193965 * s,\n -0.0041960863 * l - 0.7034186147 * m + 1.707614701 * s,\n ];\n}\n\nconst inGamut = (linear: Lab): boolean => linear.every((v) => v >= -1e-4 && v <= 1 + 1e-4);\nconst fromLch = (L: number, C: number, h: number): Lab => [L, C * Math.cos(h), C * Math.sin(h)];\nconst toRgb = (lab: Lab): Rgb =>\n oklabToLinear(lab).map((v) => Math.round(clamp(toGamma(clamp(v))) * 255)) as unknown as Rgb;\n\n/** Keep L and hue; reduce chroma until the color fits sRGB. */\nfunction gamutMap(L: number, C: number, h: number): Rgb {\n L = clamp(L);\n if (inGamut(oklabToLinear(fromLch(L, C, h)))) return toRgb(fromLch(L, C, h));\n let lo = 0;\n let hi = C;\n for (let i = 0; i < 20; i += 1) {\n const mid = (lo + hi) / 2;\n if (inGamut(oklabToLinear(fromLch(L, mid, h)))) lo = mid;\n else hi = mid;\n }\n return toRgb(fromLch(L, lo, h));\n}\n\nfunction maxChroma(L: number, h: number): number {\n let lo = 0;\n let hi = 0.4;\n for (let i = 0; i < 16; i += 1) {\n const mid = (lo + hi) / 2;\n if (inGamut(oklabToLinear(fromLch(L, mid, h)))) lo = mid;\n else hi = mid;\n }\n return lo;\n}\n\nconst K1 = 0.206;\nconst K2 = 0.03;\nconst K3 = (1 + K1) / (1 + K2);\nconst toe = (L: number): number => 0.5 * (K3 * L - K1 + Math.sqrt((K3 * L - K1) ** 2 + 4 * K2 * K3 * L));\nconst toeInv = (Lr: number): number => (Lr * Lr + K1 * Lr) / (K3 * (Lr + K2));\n\n// APCA 0.0.98G-4g. Positive Lc = dark text on a light background.\nfunction apcaY([r, g, b]: Rgb): number {\n const y = 0.2126729 * (r / 255) ** 2.4 + 0.7151522 * (g / 255) ** 2.4 + 0.072175 * (b / 255) ** 2.4;\n return y < 0.022 ? y + (0.022 - y) ** 1.414 : y;\n}\nfunction apca(text: Rgb, background: Rgb): number {\n const yt = apcaY(text);\n const yb = apcaY(background);\n if (Math.abs(yb - yt) < 0.0005) return 0;\n if (yb > yt) {\n const sapc = (yb ** 0.56 - yt ** 0.57) * 1.14;\n return sapc < 0.1 ? 0 : (sapc - 0.027) * 100;\n }\n const sapc = (yb ** 0.65 - yt ** 0.62) * 1.14;\n return sapc > -0.1 ? 0 : (sapc + 0.027) * 100;\n}\n\nconst smoothstep = (e0: number, e1: number, x: number): number => {\n const t = clamp((x - e0) / (e1 - e0));\n return t * t * (3 - 2 * t);\n};\n\nconst toRgba = ([r, g, b]: Rgb): Rgba => [r / 255, g / 255, b / 255, 1];\nconst fromRgba = (color: Rgba): Rgb => [\n Math.round(clamp(color[0]) * 255),\n Math.round(clamp(color[1]) * 255),\n Math.round(clamp(color[2]) * 255),\n];\nconst keyOf = ([r, g, b]: Rgb): number => (r << 16) | (g << 8) | b;\n\nconst luminance = ([r, g, b]: Rgb): number =>\n 0.2126 * toLinear(r / 255) + 0.7152 * toLinear(g / 255) + 0.0722 * toLinear(b / 255);\nconst contrastRatio = (a: Rgb, b: Rgb): number => {\n const [hi, lo] = [luminance(a), luminance(b)].sort((x, y) => y - x) as [number, number];\n return (hi + 0.05) / (lo + 0.05);\n};\n\n/** Light when dark text out-contrasts light text: WCAG luminance above ~0.179. Matches the VT shim. */\nexport function isLightBackground(color: Rgb): boolean {\n const y = luminance(color);\n return (y + 0.05) / 0.05 > 1.05 / (y + 0.05);\n}\n\n/** null: the text already meets the ratio. */\nconst contrasted = new Map<string, Rgb | null>();\n\n/**\n * Ghostty's `minimum-contrast`: text below the WCAG ratio against its\n * background moves toward whichever of black or white contrasts more. Ghostty\n * snaps straight to that extreme; this keeps hue and chroma and moves OKLab\n * lightness only as far as the ratio needs, reaching black or white only when\n * nothing less suffices.\n */\nexport function ensureContrast(text: Rgba, background: Rgba, ratio: number): Rgba {\n if (!(ratio > 1)) return text;\n const fg = fromRgba(text);\n const bg = fromRgba(background);\n const cacheKey = `${keyOf(fg)}/${keyOf(bg)}/${ratio}`;\n let result = contrasted.get(cacheKey);\n if (result === undefined) {\n if (contrastRatio(fg, bg) >= ratio) result = null;\n else {\n const towardWhite = contrastRatio([255, 255, 255], bg) > contrastRatio([0, 0, 0], bg);\n const [L, a, b] = oklab(fg);\n const C = Math.hypot(a, b);\n const h = Math.atan2(b, a);\n let near = L;\n let far = towardWhite ? 1 : 0;\n let best: Rgb = towardWhite ? [255, 255, 255] : [0, 0, 0];\n if (contrastRatio(best, bg) >= ratio) {\n for (let i = 0; i < 20; i += 1) {\n const mid = (near + far) / 2;\n const candidate = gamutMap(mid, C, h);\n if (contrastRatio(candidate, bg) >= ratio) {\n far = mid;\n best = candidate;\n } else near = mid;\n }\n }\n result = best;\n }\n if (contrasted.size > 4096) contrasted.clear();\n contrasted.set(cacheKey, result);\n }\n if (result === null) return text;\n return [result[0] / 255, result[1] / 255, result[2] / 255, text[3]];\n}\n\nexport interface LightAdaptation {\n /** Stable identity for cache keys: base, paper, and ink. */\n readonly key: string;\n readonly base: Rgb;\n /** A color painted as an area: cell backgrounds and block-element art. */\n surface(color: Rgb): Rgba;\n /**\n * A glyph color, judged against the background it was designed on.\n * `paletteIndex` is the ANSI entry the color came from, when known.\n */\n ink(color: Rgb, sourceBackground: Rgb, paletteIndex?: number): Rgba;\n}\n\nexport function createLightAdaptation(base: Rgb, paperColor: Rgba, inkColor: Rgba): LightAdaptation {\n const paper = fromRgba(paperColor);\n const inkRgb = fromRgba(inkColor);\n const baseLab = oklab(base);\n const paperLab = oklab(paper);\n const inkLab = oklab(inkRgb);\n const baseLr = toe(baseLab[0]);\n const paperLr = toe(paperLab[0]);\n\n const surfaces = new Map<number, Rgb>();\n const surfaceRgb = (color: Rgb): Rgb => {\n const cached = surfaces.get(keyOf(color));\n if (cached) return cached;\n const [L, a, b] = oklab(color);\n let Lr = clamp(paperLr - (toe(L) - baseLr));\n const ap = a - baseLab[1] + paperLab[1];\n const bp = b - baseLab[2] + paperLab[2];\n const C = Math.hypot(ap, bp);\n const h = Math.atan2(bp, ap);\n if (C > 0.015) {\n const want = Math.min(C, 0.045);\n const stop = Lr - 0.15;\n while (Lr > stop && maxChroma(toeInv(Lr), h) < want) Lr -= 0.005;\n }\n const result = gamutMap(toeInv(Lr), C, h);\n surfaces.set(keyOf(color), result);\n return result;\n };\n\n const solveLc = (want: number, C: number, h: number, background: Rgb): Rgb => {\n const backgroundL = oklab(background)[0];\n let lo = want > 0 ? 0 : backgroundL;\n let hi = want > 0 ? backgroundL : 1;\n let best = gamutMap(want > 0 ? 0 : 1, C, h);\n for (let i = 0; i < 18; i += 1) {\n const mid = (lo + hi) / 2;\n const candidate = gamutMap(mid, C, h);\n const lc = apca(candidate, background);\n const enough = want > 0 ? lc >= want : lc <= want;\n if (enough) best = candidate;\n if (want > 0 === enough) lo = mid;\n else hi = mid;\n }\n return best;\n };\n\n const inks = new Map<string, Rgba>();\n const ink = (color: Rgb, sourceBackground: Rgb, paletteIndex?: number): Rgba => {\n const themeColor = paletteIndex !== undefined && CHROMATIC_ANSI.has(paletteIndex);\n const cacheKey = `${keyOf(color)}/${keyOf(sourceBackground)}${themeColor ? \"/p\" : \"\"}`;\n const cached = inks.get(cacheKey);\n if (cached) return cached;\n const mapped = surfaceRgb(sourceBackground);\n if (themeColor) {\n const legibility = Math.min(45, Math.abs(apca(color, paper)));\n if (Math.abs(apca(color, mapped)) >= legibility) {\n const rgba = toRgba(color);\n inks.set(cacheKey, rgba);\n return rgba;\n }\n }\n const [L, a0, b0] = oklab(color);\n const C0 = Math.hypot(a0, b0);\n // Neutral ink: mirror its Lr distance from the background, and lean\n // toward the theme ink's tint so app grays sit in the chosen theme.\n let a = a0;\n let b = b0;\n if (C0 < 0.03) {\n const w = (1 - C0 / 0.03) * 0.7;\n a = a0 * (1 - w) + inkLab[1] * w;\n b = b0 * (1 - w) + inkLab[2] * w;\n }\n const C = Math.hypot(a, b);\n const h = Math.atan2(b, a);\n const delta = toe(L) - toe(oklab(sourceBackground)[0]);\n const sign = delta >= 0 ? -1 : 1;\n const Lr = clamp(toe(oklab(mapped)[0]) + sign * Math.max(Math.abs(delta), 0.06));\n let result = gamutMap(toeInv(Lr), C, h);\n const w = smoothstep(0.03, 0.08, C0);\n if (w > 0) {\n const source = apca(color, sourceBackground);\n const lightOnDark = source < 0 || (source === 0 && delta >= 0);\n const magnitude = clamp(Math.abs(source) * 0.5 + 28, 45, 70);\n const boosted = C0 + w * clamp(0.12 - C0, 0, C0 * 0.8);\n const accent = solveLc(lightOnDark ? magnitude : -magnitude, boosted, Math.atan2(b0, a0), mapped);\n if (w >= 1) result = accent;\n else {\n const p = oklab(result);\n const q = oklab(accent);\n result = toRgb([p[0] * (1 - w) + q[0] * w, p[1] * (1 - w) + q[1] * w, p[2] * (1 - w) + q[2] * w]);\n }\n }\n const rgba = toRgba(result);\n inks.set(cacheKey, rgba);\n return rgba;\n };\n\n return {\n key: [base, paper, inkRgb].map((color) => keyOf(color).toString(16)).join(\"/\"),\n base,\n surface: (color) => toRgba(surfaceRgb(color)),\n ink,\n };\n}\n\nconst CHROMATIC_ANSI = new Set([1, 2, 3, 4, 5, 6, 9, 10, 11, 12, 13, 14]);\n\n/** Engage when this share of cells carries an explicit dark background\u2026 */\nexport const ENGAGE_SHARE = 0.6;\n/** \u2026and stay engaged until it drops below this, so scrolling content does not flicker. */\nexport const RELEASE_SHARE = 0.35;\n\n/**\n * The surface a dark-painted application uses as its base, or null when the\n * pane should render as-is: adaptation is off, the theme is dark, or too few\n * cells carry an explicit dark background (the app follows the theme).\n */\nexport function darkPaintedBase(view: RenderView, engaged: boolean): Rgb | null {\n if ((view.theme.lightAdaptation ?? \"off\") === \"off\") return null;\n if (!isLightBackground(fromRgba(view.theme.background))) return null;\n const rows = Math.max(view.rows.length, view.nativeStyleRows.length);\n const total = rows * view.cols;\n if (total === 0) return null;\n const areas = new Map<number, number>();\n let dark = 0;\n const darkness = new Map<number, boolean>();\n for (const runs of view.nativeStyleRows) {\n for (const run of runs) {\n const style: StyleDefinition | undefined = view.styleDefinitions.get(run.styleId);\n const background = style?.inverse ? style.foreground : style?.background;\n if (!background) continue;\n const key = keyOf(background);\n let isDark = darkness.get(key);\n if (isDark === undefined) {\n isDark = !isLightBackground(background);\n darkness.set(key, isDark);\n }\n if (!isDark) continue;\n dark += run.cellSpan;\n areas.set(key, (areas.get(key) ?? 0) + run.cellSpan);\n }\n }\n if (dark / total < (engaged ? RELEASE_SHARE : ENGAGE_SHARE)) return null;\n let bestKey = 0;\n let bestArea = -1;\n for (const [key, area] of areas) {\n if (area > bestArea) {\n bestKey = key;\n bestArea = area;\n }\n }\n return [(bestKey >> 16) & 0xff, (bestKey >> 8) & 0xff, bestKey & 0xff];\n}\n", "export class AtlasCapacityError extends Error {}\n\n/** The current batch must submit before an atlas page can be recycled. */\nexport class AtlasBatchFullError extends Error {}\n\nexport interface AtlasGlyph<K> {\n key: K;\n width: number;\n height: number;\n}\n\nexport interface GlyphLocation {\n u0: number;\n v0: number;\n u1: number;\n v1: number;\n cells: number;\n}\n\ninterface GlyphSlot {\n origin: [number, number];\n width: number;\n height: number;\n}\n\ninterface PackingPlan<K> {\n slots: Map<K, GlyphSlot>;\n x: number;\n y: number;\n rowHeight: number;\n}\n\ninterface Page<K> extends PackingPlan<K> {\n texture: GPUTexture;\n bindGroup: GPUBindGroup;\n cache: Map<K, GlyphLocation>;\n generation: number;\n used: number;\n pinned: boolean;\n}\n\n/** Lazy, bounded atlas pages. A page used by an unsubmitted draw cannot be\n * recycled. Appending into its unused space is safe. Each pane uses one page\n * per glyph format, preserving instanced draws without per-glyph bind changes. */\nexport class GlyphAtlasPages<K> {\n readonly #pages: Page<K>[] = [];\n readonly #sampler: GPUSampler;\n #current: Page<K> | undefined;\n #generation = 0;\n #clock = 0;\n\n constructor(\n readonly device: GPUDevice,\n readonly layout: GPUBindGroupLayout,\n readonly label: string,\n readonly format: \"r8unorm\" | \"rgba8unorm\",\n readonly maxPages: number,\n readonly size = 2048,\n ) {\n this.#sampler = device.createSampler({ minFilter: \"linear\", magFilter: \"linear\" });\n }\n\n get generation(): number {\n return this.#current?.generation ?? 0;\n }\n\n get bindGroup(): GPUBindGroup {\n if (!this.#current) throw new Error(`${this.label} has not been prepared`);\n return this.#current.bindGroup;\n }\n\n prepare(input: Iterable<AtlasGlyph<K>>): void {\n const glyphs = new Map<K, AtlasGlyph<K>>();\n for (const glyph of input) glyphs.set(glyph.key, glyph);\n if (glyphs.size === 0) return;\n let selected: Page<K> | undefined;\n let selectedPlan: PackingPlan<K> | undefined;\n let bestHits = -1;\n for (const page of this.#pages) {\n const plan = this.#plan(glyphs.values(), page);\n if (!plan) continue;\n let hits = 0;\n for (const key of glyphs.keys()) if (page.cache.has(key)) hits += 1;\n if (hits > bestHits || (hits === bestHits && page.used > (selected?.used ?? -1))) {\n selected = page;\n selectedPlan = plan;\n bestHits = hits;\n }\n }\n if (!selected) {\n selectedPlan = this.#plan(glyphs.values());\n if (!selectedPlan) {\n throw new AtlasCapacityError(`${this.label} cannot fit the glyphs visible in one frame`);\n }\n if (this.#pages.length === this.maxPages) {\n const recyclable = this.#pages.filter((page) => !page.pinned).sort((a, b) => a.used - b.used)[0];\n if (!recyclable) throw new AtlasBatchFullError(this.label);\n // A new texture also restores zero gutters; old texels must not bleed\n // around smaller replacement glyphs under linear filtering.\n recyclable.texture.destroy();\n this.#pages.splice(this.#pages.indexOf(recyclable), 1);\n }\n const texture = this.device.createTexture({\n label: this.label,\n size: [this.size, this.size],\n format: this.format,\n usage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST,\n });\n selected = {\n texture,\n bindGroup: this.device.createBindGroup({\n label: `${this.label} bindings`,\n layout: this.layout,\n entries: [\n { binding: 0, resource: texture.createView() },\n { binding: 1, resource: this.#sampler },\n ],\n }),\n cache: new Map(),\n slots: new Map(),\n generation: ++this.#generation,\n used: 0,\n pinned: false,\n x: 1,\n y: 1,\n rowHeight: 0,\n };\n this.#pages.push(selected);\n }\n // Commit preflight's exact positions, including glyphs geometry may skip.\n // Removing/reordering shelf-packed rectangles can change row breaks and\n // overflow even when the original sequence fit. Upload remains lazy.\n const plan = selectedPlan!;\n for (const [key, slot] of plan.slots) selected.slots.set(key, slot);\n selected.x = plan.x;\n selected.y = plan.y;\n selected.rowHeight = plan.rowHeight;\n selected.used = ++this.#clock;\n this.#current = selected;\n }\n\n pin(): void {\n if (this.#current) this.#current.pinned = true;\n }\n\n #plan(glyphs: Iterable<AtlasGlyph<K>>, page?: Page<K>): PackingPlan<K> | undefined {\n const slots = new Map<K, GlyphSlot>();\n let x = page?.x ?? 1;\n let y = page?.y ?? 1;\n let rowHeight = page?.rowHeight ?? 0;\n for (const { key, width, height } of glyphs) {\n if (page?.slots.has(key)) continue;\n if (width + 2 > this.size || height + 2 > this.size) return undefined;\n if (x + width + 1 > this.size) {\n x = 1;\n y += rowHeight + 1;\n rowHeight = 0;\n }\n if (y + height + 1 > this.size) return undefined;\n slots.set(key, { origin: [x, y], width, height });\n x += width + 1;\n rowHeight = Math.max(rowHeight, height);\n }\n return { slots, x, y, rowHeight };\n }\n\n get(key: K): GlyphLocation | undefined {\n return this.#current?.cache.get(key);\n }\n\n insert(\n key: K,\n width: number,\n height: number,\n cells: number,\n ): {\n location: GlyphLocation;\n texture: GPUTexture;\n origin: [number, number];\n } {\n const page = this.#current;\n if (!page) throw new Error(`${this.label} has not been prepared`);\n const slot = page.slots.get(key);\n if (!slot || slot.width !== width || slot.height !== height) {\n throw new Error(`${this.label} glyph does not match its prepared reservation`);\n }\n const origin = slot.origin;\n const [x, y] = origin;\n const location = {\n u0: x / this.size,\n v0: y / this.size,\n u1: (x + width) / this.size,\n v1: (y + height) / this.size,\n cells,\n };\n page.cache.set(key, location);\n return { location, texture: page.texture, origin };\n }\n\n releaseBatch(): void {\n for (const page of this.#pages) page.pinned = false;\n }\n\n destroy(): void {\n for (const page of this.#pages) page.texture.destroy();\n this.#pages.length = 0;\n this.#current = undefined;\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 { backgroundRunBounds } from \"./background-geometry.js\";\nimport { rowsForDamage } from \"./render-damage.js\";\nimport { SHADER_EFFECT_WGSL } from \"./shader-effects.js\";\nimport { createLightAdaptation, darkPaintedBase, ensureContrast, type LightAdaptation } from \"./light-adaptation.js\";\n\nimport { AtlasBatchFullError, AtlasCapacityError, GlyphAtlasPages, type GlyphLocation } from \"./glyph-atlas.js\";\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\nclass FallbackGlyphAtlas {\n readonly pages: GlyphAtlasPages<string>;\n readonly #scratch = new OffscreenCanvas(1, 1);\n #uploadBytes = 0;\n #uploadCalls = 0;\n\n constructor(\n readonly device: GPUDevice,\n bindGroupLayout: GPUBindGroupLayout,\n ) {\n this.pages = new GlyphAtlasPages(device, bindGroupLayout, \"terminal diagnostic glyph atlas\", \"rgba8unorm\", 1);\n }\n\n get bindGroup(): GPUBindGroup {\n return this.pages.bindGroup;\n }\n get generation(): number {\n return this.pages.generation;\n }\n\n prepare(values: Iterable<string>, dpr: number): void {\n const scale = Math.max(1, Math.min(3, dpr));\n this.pages.prepare(\n [...new Set(values)]\n .filter((value) => value.trim().length > 0)\n .map((value) => ({\n key: `${scale.toFixed(2)}:${value}`,\n width: Math.max(1, Math.ceil(CELL_WIDTH * graphemeCellWidth(value) * scale)),\n height: Math.max(1, Math.ceil(LINE_HEIGHT * scale)),\n })),\n );\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.pages.get(key);\n if (cached) return cached;\n const width = Math.max(1, Math.ceil(CELL_WIDTH * cells * scale));\n const height = Math.max(1, Math.ceil(LINE_HEIGHT * scale));\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 const { location, texture, origin } = this.pages.insert(key, width, height, cells);\n this.device.queue.writeTexture({ texture, origin }, image.data, { bytesPerRow: width * 4, rowsPerImage: height }, [\n width,\n height,\n ]);\n this.#uploadBytes += image.data.byteLength;\n this.#uploadCalls += 1;\n return location;\n }\n\n destroy(): void {\n this.pages.destroy();\n }\n uploadMetrics(): { bytes: number; calls: number } {\n return { bytes: this.#uploadBytes, calls: this.#uploadCalls };\n }\n}\n\nclass NativeGlyphAtlas {\n readonly pages: GlyphAtlasPages<number>;\n #uploadBytes = 0;\n #uploadCalls = 0;\n\n constructor(\n readonly device: GPUDevice,\n bindGroupLayout: GPUBindGroupLayout,\n readonly label: string,\n readonly format: \"r8unorm\" | \"rgba8unorm\",\n ) {\n // At most 16 MiB mono + 32 MiB color + 16 MiB diagnostic pages. Empty\n // formats allocate no textures. The ordinary ASCII working set uses 4 MiB.\n this.pages = new GlyphAtlasPages(device, bindGroupLayout, label, format, format === \"r8unorm\" ? 4 : 2);\n }\n\n get bindGroup(): GPUBindGroup {\n return this.pages.bindGroup;\n }\n get generation(): number {\n return this.pages.generation;\n }\n\n prepare(definitions: Iterable<GlyphDefinition>): void {\n this.pages.prepare(\n Array.from(definitions, (definition) => ({\n key: definition.id,\n width: definition.width,\n height: definition.height,\n })),\n );\n }\n\n glyph(definition: GlyphDefinition): GlyphLocation {\n const cached = this.pages.get(definition.id);\n if (cached) return cached;\n const { width, height } = definition;\n const { location, texture, origin } = this.pages.insert(definition.id, width, height, 0);\n const bytesPerPixel = this.format === \"r8unorm\" ? 1 : 4;\n this.device.queue.writeTexture(\n { texture, origin },\n definition.pixels,\n { bytesPerRow: width * bytesPerPixel, rowsPerImage: height },\n [width, height],\n );\n this.#uploadBytes += definition.pixels.byteLength;\n this.#uploadCalls += 1;\n return location;\n }\n\n destroy(): void {\n this.pages.destroy();\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 /** Engaged light adaptation for a dark-painted pane, or null. */\n adaptation: LightAdaptation | null;\n sceneHadSelection: boolean;\n sceneHadOverhang: boolean;\n sceneCursorRow: number | null;\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 adaptationKey: string,\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 view.cols,\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 view.theme.minimumContrast ?? 1,\n adaptationKey,\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 /** Foreground used as an area fill (block elements); differs only under light adaptation. */\n fill: Rgba;\n /** Foreground for text glyphs and their decorations, after `minimum-contrast`. */\n text: Rgba;\n underline: boolean;\n strikethrough: boolean;\n invisible: boolean;\n}\n\nfunction resolveStyle(\n style: StyleDefinition | undefined,\n theme: RenderView[\"theme\"],\n adaptation: LightAdaptation | null = null,\n): ResolvedStyle {\n let foreground: Rgba = style?.foreground ? rgb(style.foreground) : theme.foreground;\n let background: Rgba | null = style?.background ? rgb(style.background) : null;\n let fill = foreground;\n if (adaptation) {\n // Application colors were designed on the app's dark base; theme-owned\n // defaults already belong to the light theme and pass through.\n const source = { foreground: style?.foreground, background: style?.background };\n if (style?.inverse) {\n background = source.foreground ? adaptation.surface(source.foreground) : theme.foreground;\n foreground = source.background\n ? adaptation.ink(source.background, source.foreground ?? adaptation.base, style?.backgroundPalette)\n : theme.background;\n fill = foreground;\n } else {\n foreground = source.foreground\n ? adaptation.ink(source.foreground, source.background ?? adaptation.base, style?.foregroundPalette)\n : theme.foreground;\n background = source.background ? adaptation.surface(source.background) : null;\n fill = source.foreground ? adaptation.surface(source.foreground) : theme.foreground;\n }\n } else if (style?.inverse) {\n const originalForeground = foreground;\n foreground = background ?? theme.background;\n background = originalForeground;\n fill = foreground;\n }\n if (background && theme.backgroundOpacityCells) {\n background = [background[0], background[1], background[2], theme.background[3]];\n }\n // Graphics (box drawing, block elements) and color glyphs keep the raw\n // foreground, as in Ghostty; the backdrop ignores window transparency.\n let text = ensureContrast(\n foreground,\n over(background ?? theme.background, theme.background),\n theme.minimumContrast ?? 1,\n );\n if (style?.faint) {\n foreground = [foreground[0], foreground[1], foreground[2], foreground[3] * 0.55];\n fill = [fill[0], fill[1], fill[2], fill[3] * 0.55];\n text = [text[0], text[1], text[2], text[3] * 0.55];\n }\n return {\n foreground,\n background,\n fill,\n text,\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 readonly #adaptations = new Map<string, LightAdaptation>();\n #performanceMeasurementEnabled = false;\n #submission: { queueSubmits: number; surfaceIds: string[] } = { queueSubmits: 0, surfaceIds: [] };\n #scrollScratch: GPUTexture | undefined;\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 adaptation: null,\n sceneHadSelection: false,\n sceneHadOverhang: false,\n sceneCursorRow: null,\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 if (this.#surfaces.size === 0) {\n this.#scrollScratch?.destroy();\n this.#scrollScratch = undefined;\n }\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:\n GPUTextureUsage.RENDER_ATTACHMENT |\n GPUTextureUsage.TEXTURE_BINDING |\n GPUTextureUsage.COPY_SRC |\n GPUTextureUsage.COPY_DST,\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 /**\n * Engage, re-key, or release light adaptation for a pane. Any change remaps\n * every color, so the persistent scene and cached geometry are invalidated.\n */\n #prepareAdaptation(surface: WebGpuSurface, view: RenderView): void {\n const base = darkPaintedBase(view, surface.adaptation !== null);\n let next: LightAdaptation | null = null;\n if (base) {\n const key = `${base.join(\",\")}|${view.theme.background.join(\",\")}|${view.theme.foreground.join(\",\")}`;\n next = this.#adaptations.get(key) ?? null;\n if (!next) {\n next = createLightAdaptation(base, view.theme.background, view.theme.foreground);\n this.#adaptations.set(key, next);\n if (this.#adaptations.size > 8) this.#adaptations.delete(this.#adaptations.keys().next().value!);\n }\n }\n if ((next?.key ?? null) === (surface.adaptation?.key ?? null)) return;\n surface.adaptation = next;\n surface.sceneValid = false;\n clearGeometryCache(surface);\n }\n\n submission(): { queueSubmits: number; surfaceIds: readonly string[] } {\n return this.#submission;\n }\n\n #releaseAtlasBatch(): void {\n this.#monoAtlas.pages.releaseBatch();\n this.#colorAtlas.pages.releaseBatch();\n this.#fallbackAtlas.pages.releaseBatch();\n }\n\n #prepareAtlases(view: RenderView, renderRows: readonly number[], dpr: number): void {\n const mono = new Map<number, GlyphDefinition>();\n const color = 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) (definition.format === GlyphFormat.Alpha8 ? mono : color).set(definition.id, definition);\n }\n }\n this.#monoAtlas.prepare(mono.values());\n this.#colorAtlas.prepare(color.values());\n const fallback = !view.nativeRows.some((row) => row.length > 0);\n if (fallback) {\n this.#fallbackAtlas.prepare(\n renderRows.flatMap((row) => splitGraphemes(view.rows[row] ?? \"\")),\n dpr,\n );\n }\n // Pin only after every format fits, so a rejected pane cannot occupy the\n // batch budget with pages that no pending draw actually references.\n if (mono.size > 0) this.#monoAtlas.pages.pin();\n if (color.size > 0) this.#colorAtlas.pages.pin();\n if (fallback && renderRows.length > 0) this.#fallbackAtlas.pages.pin();\n }\n\n render(id: string, view: RenderView): TerminalRenderMetrics | undefined {\n return this.renderBatch([{ id, view }])[0];\n }\n\n #canCopyScroll(surface: WebGpuSurface, view: RenderView): boolean {\n const shift = view.damage?.scrollRows ?? 0;\n const top = ORIGIN_Y * surface.dpr;\n const line = LINE_HEIGHT * surface.dpr;\n const count = view.rows.length;\n return (\n surface.sceneValid &&\n !view.damage?.full &&\n Number.isSafeInteger(shift) &&\n shift !== 0 &&\n Math.abs(shift) < count &&\n !view.selection &&\n !surface.sceneHadSelection &&\n Number.isInteger(top) &&\n Number.isInteger(line) &&\n top + count * line <= surface.canvas.height\n );\n }\n\n #prepareScrollScratch(entries: ReadonlyArray<{ id: string; view: RenderView }>): boolean {\n let width = 0,\n height = 0;\n for (const { id, view } of entries) {\n const surface = this.#surfaces.get(id);\n if (!surface || !this.#canCopyScroll(surface, view)) continue;\n width = Math.max(width, surface.canvas.width);\n height = Math.max(height, view.rows.length * LINE_HEIGHT * surface.dpr);\n }\n if (width === 0) return false;\n // One shared staging texture, never one per pane. Fall back to redraw if\n // the batch's maximum extent would exceed this fixed memory ceiling.\n if (width * height * 4 > 64 * 1024 * 1024) return false;\n if (!this.#scrollScratch || this.#scrollScratch.width < width || this.#scrollScratch.height < height) {\n this.#scrollScratch?.destroy();\n this.#scrollScratch = this.device.createTexture({\n label: \"terminal shared scroll staging\",\n size: [width, height],\n format: this.format,\n usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.COPY_DST,\n });\n }\n return true;\n }\n\n #copyScroll(surface: WebGpuSurface, view: RenderView, encoder: GPUCommandEncoder): void {\n const dy = view.damage!.scrollRows! * LINE_HEIGHT * surface.dpr;\n const top = ORIGIN_Y * surface.dpr;\n const size = [surface.canvas.width, view.rows.length * LINE_HEIGHT * surface.dpr - Math.abs(dy)];\n // A texture cannot copy overlapping regions to itself. Encoder ordering\n // lets all panes safely share this scratch texture, even within one batch.\n encoder.copyTextureToTexture(\n { texture: surface.sceneTexture, origin: [0, top + Math.max(0, dy)] },\n { texture: this.#scrollScratch! },\n size,\n );\n encoder.copyTextureToTexture(\n { texture: this.#scrollScratch! },\n { texture: surface.sceneTexture, origin: [0, top + Math.max(0, -dy)] },\n size,\n );\n }\n\n renderBatch(entries: ReadonlyArray<{ id: string; view: RenderView }>): Array<TerminalRenderMetrics | undefined> {\n this.#submission = { queueSubmits: 0, surfaceIds: [] };\n this.#releaseAtlasBatch();\n const prepared = entries.map(({ id, view }) => {\n const surface = this.#surfaces.get(id);\n // Light adaptation first, for the whole batch: a change remaps every color\n // and invalidates the scene, so every decision below (the overhang\n // shortcut, the scroll staging, the scroll copy) sees it invalidated.\n if (surface) this.#prepareAdaptation(surface, view);\n const overhang =\n view.damage?.geometryChanged === false && surface?.sceneValid\n ? surface.sceneHadOverhang\n : view.nativeRows.some((row) => row.some((glyph) => glyph.y < 0 || glyph.y + glyph.height > LINE_HEIGHT));\n // Row clears cannot reconstruct cross-row alpha composition at the\n // repair boundary. Preserve those glyphs with a complete scene redraw.\n if (\n view.damage &&\n !view.damage.full &&\n (view.damage.scrollRows || view.damage.rows.size > 0) &&\n (overhang || surface?.sceneHadOverhang)\n ) {\n view = { ...view, damage: { full: true, rows: new Set(), geometryChanged: true } };\n }\n return { id, view, overhang };\n });\n const canStageScroll = this.#prepareScrollScratch(prepared);\n let encoder: GPUCommandEncoder | undefined;\n let pendingIds: string[] = [];\n const byId = new Map<string, TerminalRenderMetrics | undefined>();\n const submit = (): void => {\n if (encoder && pendingIds.length > 0) {\n this.device.queue.submit([encoder.finish()]);\n this.#submission.queueSubmits += 1;\n this.#submission.surfaceIds.push(...pendingIds);\n const first = pendingIds.map((id) => byId.get(id)).find((metric) => metric !== undefined);\n if (first) first.queueSubmits += 1;\n }\n encoder = undefined;\n pendingIds = [];\n this.#releaseAtlasBatch();\n };\n try {\n for (const { id, view: originalView, overhang } of prepared) {\n const surface = this.#surfaces.get(id);\n if (!surface) continue;\n let view = originalView;\n const copyScroll = canStageScroll && this.#canCopyScroll(surface, view);\n if (view.damage?.scrollRows) {\n if (copyScroll) {\n const rows = new Set(view.damage.rows);\n const shift = view.damage.scrollRows;\n // Repaint exposed rows, the two clipped edges and the cursor\n // baked into the last submitted scene (possibly several frames ago).\n rows.add(0);\n rows.add(view.rows.length - 1);\n for (let row = 0; row < view.rows.length; row++) {\n if (row + shift < 0 || row + shift >= view.rows.length) rows.add(row);\n }\n if (surface.sceneCursorRow !== null) rows.add(surface.sceneCursorRow - shift);\n if (effectiveCursorStyle(view) !== null) rows.add(view.cursor.y);\n view = { ...view, damage: { ...view.damage, rows, geometryChanged: true } };\n } else {\n view = { ...view, damage: { full: true, rows: new Set(), geometryChanged: true } };\n }\n }\n const count = Math.max(view.rows.length, view.nativeRows.length, view.nativeStyleRows.length);\n const { rows } = rowsForDamage(count, view.damage, surface.sceneValid);\n try {\n try {\n this.#prepareAtlases(view, rows, surface.dpr);\n } catch (error) {\n if (!(error instanceof AtlasBatchFullError) || pendingIds.length === 0) throw error;\n // All recyclable pages are referenced by pending draws. Submit\n // them before overwriting any texels, then retry this pane once.\n submit();\n this.#prepareAtlases(view, rows, surface.dpr);\n }\n } catch (error) {\n if (!(error instanceof AtlasCapacityError)) throw error;\n // Capacity failure is isolated to this pane and preserves its old\n // scene. Other panes still submit; new content/resize can retry it.\n console.error(`[terminal-renderer] cannot render ${id}`, error);\n continue;\n }\n encoder ??= this.device.createCommandEncoder({ label: \"terminal frame batch\" });\n if (copyScroll) this.#copyScroll(surface, view, encoder);\n byId.set(\n id,\n view.damage?.geometryChanged === false\n ? this.#encodeCachedRender(id, view, encoder)\n : this.#encodeRender(id, view, encoder),\n );\n surface.sceneHadSelection = view.selection !== null;\n surface.sceneHadOverhang = overhang;\n surface.sceneCursorRow = effectiveCursorStyle(view) === null ? null : view.cursor.y;\n pendingIds.push(id);\n }\n submit();\n } finally {\n this.#releaseAtlasBatch();\n }\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 adaptation: LightAdaptation | null,\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, adaptation);\n resolvedStyles.set(styleId, resolved);\n return resolved;\n };\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 const bounds = backgroundRunBounds(run, row, view.cols, rowCount, scale, viewportWidth, viewportHeight);\n if (!bounds) continue;\n pushRectangle(\n rectangleVertices,\n bounds.x,\n bounds.y,\n bounds.width,\n bounds.height,\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 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 const blockForeground = foreground === style.foreground ? style.fill : foreground;\n if (\n pushBlockElement(\n rectangleVertices,\n blockElement,\n instance.cellStart,\n row,\n scale,\n over(blockForeground, backdrop),\n viewportWidth,\n viewportHeight,\n )\n )\n continue;\n }\n const mono = definition.format === GlyphFormat.Alpha8;\n const atlas = mono ? this.#monoAtlas : this.#colorAtlas;\n const vertices = mono ? 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 mono && foreground === style.foreground ? style.text : 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.text,\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.text,\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, surface.adaptation);\n resolvedStyles.set(styleId, resolved);\n return resolved;\n };\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 const bounds = backgroundRunBounds(run, row, view.cols, rowCount, scale, viewportWidth, viewportHeight);\n if (!bounds) continue;\n pushRectangle(\n rectangleVertices,\n bounds.x,\n bounds.y,\n bounds.width,\n bounds.height,\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 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 blockForeground = foreground === style.foreground ? style.fill : foreground;\n const blockColor = over(blockForeground, 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 mono = definition.format === GlyphFormat.Alpha8;\n const atlas = mono ? this.#monoAtlas : this.#colorAtlas;\n const vertices = mono ? 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 mono && foreground === style.foreground ? style.text : 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.text,\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.text,\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(), surface.adaptation?.key ?? \"-\");\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 surface.adaptation,\n );\n key = geometryCacheKey(view, damage.rows, hasNativeRows, generations(), surface.adaptation?.key ?? \"-\");\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", "import type { GlyphInstance, StyleRun } from \"@vibecook/ghosttea-frame\";\nimport type { CellSelection } from \"./renderers/types.js\";\n\ninterface Rows {\n rows: readonly string[];\n nativeRows: readonly (readonly GlyphInstance[])[];\n nativeStyleRows: readonly (readonly StyleRun[])[];\n}\n\nfunction sameRow(before: Rows, from: number, after: Rows, to: number): boolean {\n if (from < 0 || from >= before.rows.length || before.rows[from] !== after.rows[to]) return false;\n const a = before.nativeRows[from] ?? [],\n b = after.nativeRows[to] ?? [];\n if (a.length !== b.length) return false;\n for (let i = 0; i < a.length; i++) {\n const x = a[i]!,\n y = b[i]!;\n if (\n x.glyphId !== y.glyphId ||\n x.styleId !== y.styleId ||\n x.x !== y.x ||\n x.y !== y.y ||\n x.width !== y.width ||\n x.height !== y.height ||\n x.cellStart !== y.cellStart ||\n x.cellSpan !== y.cellSpan\n )\n return false;\n }\n const as = before.nativeStyleRows[from] ?? [],\n bs = after.nativeStyleRows[to] ?? [];\n if (as.length !== bs.length) return false;\n return as.every(\n (x, i) => x.styleId === bs[i]!.styleId && x.cellStart === bs[i]!.cellStart && x.cellSpan === bs[i]!.cellSpan,\n );\n}\n\n/** Infer scrolling only from exact row content, never from a matching text\n * label alone. Unique text anchors keep candidate discovery linear even on a\n * screen full of repeated/blank lines. The final comparison includes geometry\n * and style. Callers fence catalog, layout and style-definition changes. */\nexport function rowDamage(before: Rows, after: Rows): { scrollRows: number; rows: number[] } {\n const positions = new Map<string, number>();\n for (let row = 0; row < before.rows.length; row++) {\n const text = before.rows[row]!;\n positions.set(text, positions.has(text) ? -1 : row);\n }\n const votes = new Map<number, number>();\n for (let row = 0; row < after.rows.length; row++) {\n const from = positions.get(after.rows[row]!);\n if (from !== undefined && from >= 0) {\n const delta = from - row;\n votes.set(delta, (votes.get(delta) ?? 0) + 1);\n }\n }\n let scrollRows = 0,\n best = votes.get(0) ?? 0;\n for (const [delta, count] of votes)\n if (count > best) {\n best = count;\n scrollRows = delta;\n }\n const changed = (delta: number): number[] =>\n after.rows.flatMap((_, row) => (sameRow(before, row + delta, after, row) ? [] : [row]));\n if (scrollRows !== 0) {\n const rows = changed(scrollRows);\n if (after.rows.length - rows.length >= Math.ceil(after.rows.length / 2)) return { scrollRows, rows };\n }\n return { scrollRows: 0, rows: changed(0) };\n}\n\n/** Compose shifts before the next paint, moving pending damage with the rows.\n * No intermediate decoded scene has been painted yet. */\nexport function shiftDamage(rows: Set<number>, shift: number, rowCount: number): void {\n const moved = [...rows].map((row) => row - shift).filter((row) => row >= 0 && row < rowCount);\n rows.clear();\n for (const row of moved) rows.add(row);\n}\n\nexport function selectionDamageRows(\n before: CellSelection | null,\n after: CellSelection | null,\n count: number,\n): number[] {\n const rows = new Set<number>();\n for (const selection of [before, after]) {\n if (!selection) continue;\n const start = Math.max(0, Math.min(selection.anchor.row, selection.focus.row));\n const end = Math.min(count - 1, Math.max(selection.anchor.row, selection.focus.row));\n for (let row = start; row <= end; row++) rows.add(row);\n }\n return [...rows];\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, K = number>(\n sessionDefinitions: ReadonlyMap<number, T>,\n sessionPixelBytes: number,\n sharedDefinitions: ReadonlyMap<K, { definition: T }>,\n sharedPixelBytes: number,\n definitions: readonly T[],\n budget: GlyphCatalogBudget,\n sharedKey: (id: number) => K = (id: number) => id as K,\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(sharedKey(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 | Uint8Array,\n identity: RoutedTrfIdentity,\n expectedLayout?: RoutedExpectedLayout,\n glyphNamespace?: string,\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 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.maxUrgentPresentationUnitBytes ||\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(payload, activation.identity!, undefined, header.resultContent.sceneEpoch.cellBootId);\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(\n staging.bytes.buffer as ArrayBuffer,\n activation.identity!,\n staging.targetLayout,\n staging.resultContent.sceneEpoch.cellBootId,\n );\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 decodeLinkTargets,\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 { rowDamage, selectionDamageRows, shiftDamage } from \"./row-damage.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 cols: number;\n rows: string[];\n nativeRows: GlyphInstance[][];\n nativeStyleRows: StyleRun[][];\n glyphDefinitions: Map<number, GlyphDefinition>;\n glyphNamespace: string;\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 linkSignature: string;\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; scrollRows?: number };\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>();\n/**\n * Handles whose committed frames have put something on screen. A host that just\n * started a program waits for this before revealing its terminal; checked only\n * until a handle has drawn once, and forgotten with its snapshot.\n */\nconst drawnSessions = new Set<string>();\n/**\n * The mouse-tracking flag each routed session's last committed frame carried,\n * as last said to the renderer (`terminal-modes`). Forgotten when the session's\n * activation attaches again, so a re-attached session says it once more.\n */\nconst routedMouseTracking = new Map<string, boolean>();\nconst sharedGlyphDefinitions = new Map<string, { definition: GlyphDefinition; references: number }>();\n// Renderer IDs never repeat while the GPU atlas survives, even after a cell restart.\nlet nextRendererGlyphId = 1;\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 cols: 0,\n rows: [],\n nativeRows: [],\n nativeStyleRows: [],\n glyphDefinitions: new Map(),\n glyphNamespace: \"\",\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 linkSignature: \"\",\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 key = `${session.glyphNamespace}:${glyphId}`;\n const shared = sharedGlyphDefinitions.get(key);\n if (!shared) continue;\n shared.references -= 1;\n if (shared.references <= 0) {\n sharedGlyphDefinitions.delete(key);\n sharedGlyphPixelBytes -= shared.definition.pixels.byteLength;\n }\n }\n session.glyphDefinitions = new Map();\n session.glyphPixelBytes = 0;\n retainedStyleDefinitions -= session.styleDefinitions.size;\n session.styleDefinitions.clear();\n}\n\nfunction installGlyphDefinitions(\n session: SessionSnapshot,\n definitions: readonly GlyphDefinition[],\n previousDefinitions?: ReadonlyMap<number, GlyphDefinition>,\n): void {\n for (const decoded of definitions) {\n if (session.glyphDefinitions.has(decoded.id)) continue;\n const key = `${session.glyphNamespace}:${decoded.id}`;\n let shared = sharedGlyphDefinitions.get(key);\n const pixelBytes = shared?.definition.pixels.byteLength ?? decoded.pixels.byteLength;\n if (shared) {\n shared.references += 1;\n } else {\n shared = {\n definition: { ...decoded, id: previousDefinitions?.get(decoded.id)?.id ?? nextRendererGlyphId++ },\n references: 1,\n };\n sharedGlyphDefinitions.set(key, 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 drawnSessions.delete(sessionHandle);\n}\n\n/** A row replacement that shows something: a glyph to rasterize, or text that is not blank. */\nfunction rowShowsContent(row: { text: string; glyphs: readonly unknown[] }): boolean {\n return row.glyphs.length > 0 || /\\S/.test(row.text);\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 cols: session.cols,\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 next.setPerformanceMeasurementEnabled?.(performanceMeasurement !== undefined);\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) => {\n const size = mounts.get(id)?.size;\n return !occluded.has(id) && size !== undefined && size.width > 0 && size.height > 0;\n });\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 submission = backend.submission?.();\n if (submission) {\n lifetimeRenderer.queueSubmits += submission.queueSubmits;\n lifetimeRenderer.presents += submission.surfaceIds.length;\n } else {\n for (const metric of metrics) recordLifetimeRenderMetrics(metric ?? emptyRenderMetrics());\n }\n const submitted = submission ? new Set(submission.surfaceIds) : undefined;\n const renderedAt = active ? performance.now() : 0;\n for (const { id } of entries) {\n if (submitted && !submitted.has(id)) continue;\n const damage = surfaces.get(id)?.damage;\n if (!damage) continue;\n damage.full = false;\n damage.rows.clear();\n damage.geometryChanged = false;\n delete damage.scrollRows;\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 delete damage.scrollRows;\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 invalidateScroll(id: string, shift: number, rows: number[], rowCount: number): void {\n const value = surfaces.get(id);\n if (!value) return;\n const damage = value.damage;\n if (\n !partialRenderingEnabled ||\n damage.full ||\n value.selection ||\n Math.abs((damage.scrollRows ?? 0) + shift) >= rowCount\n ) {\n invalidateFull(id);\n return;\n }\n shiftDamage(damage.rows, shift, rowCount);\n damage.scrollRows = (damage.scrollRows ?? 0) + shift;\n invalidateRows(id, rows, true);\n}\n\nfunction changeSelection(id: string, selection: CellSelection | null): void {\n const value = surfaces.get(id);\n if (!value || (value.selection === null && selection === null)) return;\n const rows = selectionDamageRows(value.selection, selection, snapshots.get(value.sessionHandle)?.rows.length ?? 0);\n value.selection = selection;\n // Selection is anchored to the viewport, whereas pending text moves with a\n // scroll. Avoid composing these two coordinate spaces before a paint.\n if (value.damage.scrollRows) invalidateFull(id);\n else invalidateRows(id, rows, true);\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(\n surfaceId: string,\n sessionHandle: string,\n canvas: OffscreenCanvas,\n size: PixelSize,\n): Promise<void> {\n if (mounts.has(surfaceId)) renderer?.unmount(surfaceId);\n snapshot(sessionHandle);\n surface(surfaceId, sessionHandle);\n const entry: MountedCanvas = { canvas, size, 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 | Uint8Array,\n expectedIdentity?: RoutedTrfIdentity,\n expectedLayout?: RoutedExpectedLayout,\n glyphNamespace?: string,\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 paletteSection = frame.sections.find((candidate) => candidate.kind === SectionKind.StylePalette);\n const styleDefinitions = styleSection ? decodeStyleDefinitions(styleSection, paletteSection) : 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 firstDrawn = !drawnSessions.has(id) && replacements.some(rowShowsContent);\n const linkSection = frame.sections.find((candidate) => candidate.kind === SectionKind.LinkTargets);\n const links = linkSection ? decodeLinkTargets(linkSection, frame.cols, frame.rows) : [];\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 // Routed frames name the process incarnation. Legacy/direct streams are\n // isolated by session epoch because they cannot prove a shared engine.\n const namespace = glyphNamespace === undefined ? `session:${id}:${frame.sessionEpoch}` : `cell:${glyphNamespace}`;\n const resetsCatalog =\n replacingScene || changedSession || completingResync || catalogReset || previous.glyphNamespace !== namespace;\n const styleChanged = styleDefinitions.some((definition) => {\n const old = previous.styleDefinitions.get(definition.id);\n return old !== undefined && JSON.stringify(old) !== JSON.stringify(definition);\n });\n const canReuseRows =\n !resetsCatalog &&\n !styleChanged &&\n previous.cols === frame.cols &&\n previous.rows.length === frame.rows &&\n previous.layoutEpoch === frame.layoutEpoch;\n const wasCatalogFallback = previous.catalogFallback;\n if (resetsCatalog) {\n // A reset replaces the retained CPU catalog, not the engine's immutable\n // glyph identities. Keep IDs for the overlap so the GPU can reuse its atlas.\n // This map lives only for this replacement; removed glyphs retain no cache\n // entry, and a new engine namespace can never inherit the old engine's IDs.\n const previousDefinitions = previous.glyphNamespace === namespace ? previous.glyphDefinitions : undefined;\n previous.rows = [];\n previous.nativeRows = [];\n previous.nativeStyleRows = [];\n clearSessionCatalog(previous);\n previous.glyphNamespace = namespace;\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 (glyphId) => `${namespace}:${glyphId}`,\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, previousDefinitions);\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 (glyphId) => `${namespace}:${glyphId}`,\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 let 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 let scrollRows = 0;\n if (fullRows && canReuseRows) {\n const damage = rowDamage(previous, { rows, nativeRows, nativeStyleRows });\n scrollRows = damage.scrollRows;\n damagedRows = damage.rows;\n const changed = new Set(damagedRows);\n for (let row = 0; row < rows.length; row++) {\n if (changed.has(row)) continue;\n nativeRows[row] = previous.nativeRows[row + scrollRows]!;\n nativeStyleRows[row] = previous.nativeStyleRows[row + scrollRows]!;\n }\n }\n previous.cols = frame.cols;\n previous.rows = rows;\n previous.nativeRows = nativeRows;\n previous.nativeStyleRows = nativeStyleRows;\n previous.rowRevisions = rowRevisions;\n const geometryChanged = damagedRows.length > 0 || scrollRows !== 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 const linkSignature = JSON.stringify(links);\n if (previous.linkSignature !== linkSignature || changedSession || completingResync) {\n previous.linkSignature = linkSignature;\n postToRenderer({ type: \"link-targets\", sessionHandle: id, links });\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 = !canReuseRows;\n if (!requiresFullRedraw && (cursorChanged || scrollRows !== 0))\n damagedRows.push(previousCursor.y - scrollRows, 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 (scrollRows !== 0) invalidateScroll(surfaceId, scrollRows, damagedRows, rows.length);\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 // The renderer sends the wheel to a program that tracks the mouse and\n // scrolls locally otherwise (`isMouseTracking`). Routed frames never pass the\n // main thread, where the legacy bridge reads the flag, so it is said here.\n if (expectedIdentity) {\n const mouseTracking = (frame.flags & FrameFlag.MouseTracking) !== 0;\n if (routedMouseTracking.get(id) !== mouseTracking) {\n routedMouseTracking.set(id, mouseTracking);\n postToRenderer({ type: \"terminal-modes\", sessionHandle: id, mouseTracking });\n }\n }\n if (firstDrawn) {\n drawnSessions.add(id);\n postToRenderer({ type: \"session-drawn\", sessionHandle: id });\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, glyphNamespace) => {\n const applied = applyFrame(packet, identity, expectedLayout, glyphNamespace);\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, message.size).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);\n changeSelection(message.surfaceId, message.selection);\n } else {\n defaults(message.sessionHandle).selection = message.selection;\n for (const surfaceId of surfaceIdsForSession(message.sessionHandle)) {\n changeSelection(surfaceId, message.selection);\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 routedMouseTracking.delete(message.request.sessionHandle);\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
|
+
"names": ["SectionKind", "GlyphFormat", "CursorStyle", "surface", "sapc", "surfaces", "rgba", "w", "plan", "surface", "ordered", "rows", "snapshot", "mount"]
|
|
7
7
|
}
|