@hex1b/web-terminal 0.173.0-alpha.1801.1.3dc2d9b → 0.173.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/dist/index.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/validation.ts", "../src/websocket-transport.ts", "../src/random-id.ts", "../src/marker-state.ts", "../src/terminal-palette.ts", "../src/protocol.ts", "../src/transport-session.ts", "../src/terminal-font.ts", "../src/renderer-options.ts", "../src/link-options.ts", "../src/link-worker-protocol.ts", "../src/render-backend.ts", "../src/webgpu-backend.ts", "../src/webgl2-backend.ts", "../src/backend-selection.ts", "../src/renderer.ts", "../src/link-presentation.ts", "../src/marker-pages.ts", "../src/terminal-worker.ts", "../src/link-detection-worker.ts", "../src/selection-input.ts", "../src/input-policy.ts", "../src/mouse-input.ts", "../src/worker-url.ts", "../src/web-terminal.ts", "../src/scrollbar-colors.ts", "../src/terminal-sizing.ts", "../src/history-state.ts", "../src/terminal-layout.ts", "../src/scrollbar-renderer.ts", "../src/scrollbar.ts", "../src/command-mark.ts", "../src/scrollbar-tooltip.ts", "../src/terminal-theme.ts", "../src/selection-ui.ts", "../src/hyperlinks.ts", "../src/link-detection.ts", "../src/link-text.ts", "../src/index.ts"],
4
- "sourcesContent": ["export function isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === \"object\" && !Array.isArray(value);\n}\n\nexport function errorMessage(error: unknown): string {\n return isRecord(error) && typeof error.message === \"string\" ? error.message : String(error);\n}\n", "import type { TerminalTransport, TerminalTransportConnection } from \"./transport-types.js\";\n\nconst websocketUrls = new WeakMap<TerminalTransport, string>();\n\nfunction normalizeUrl(value: string): string {\n const url = new URL(value, globalThis.location?.href);\n if (url.protocol === \"https:\") url.protocol = \"wss:\";\n if (url.protocol === \"http:\") url.protocol = \"ws:\";\n if (![\"ws:\", \"wss:\"].includes(url.protocol)) throw new TypeError(\"A ws: or wss: URL is required\");\n return url.href;\n}\n\n/** Creates the first-party live transport. Mount runs this transport in its rendering worker. */\nexport function createWebSocketTransport(url: string | URL): TerminalTransport {\n if (!(url instanceof URL) && (typeof url !== \"string\" || !url.trim()))\n throw new TypeError(\"A terminal WebSocket URL is required\");\n const value = String(url);\n const transport: TerminalTransport = {\n connect(context) {\n return new Promise<TerminalTransportConnection>((resolve, reject) => {\n context.signal.throwIfAborted();\n const socket = new WebSocket(normalizeUrl(value));\n socket.binaryType = \"arraybuffer\";\n const abort = () => {\n socket.close(1000, \"View detached\");\n reject(context.signal.reason);\n };\n context.signal.addEventListener(\"abort\", abort, { once: true });\n socket.addEventListener(\"open\", () => {\n if (context.signal.aborted) return;\n resolve({\n send(control) {\n if (socket.readyState !== WebSocket.OPEN) throw new Error(\"Terminal WebSocket is not open\");\n if (socket.bufferedAmount + new TextEncoder().encode(control).byteLength > 1024 * 1024)\n throw new Error(\"Terminal WebSocket control buffer exceeded 1 MiB\");\n socket.send(control);\n },\n dispose() {\n context.signal.removeEventListener(\"abort\", abort);\n socket.close(1000, \"View detached\");\n }\n });\n });\n socket.addEventListener(\"message\", event => {\n if (context.signal.aborted) return;\n if (!(event.data instanceof ArrayBuffer)) {\n context.onError(new Error(\"Expected binary HWT1 frame\"));\n return;\n }\n void context.onFrame(event.data).catch(error => context.onError(error));\n });\n // Browser errors are followed by close, which carries the actual native status.\n socket.addEventListener(\"close\", event => {\n context.signal.removeEventListener(\"abort\", abort);\n if (context.signal.aborted) return;\n context.onClose({ code: event.code, reason: event.reason, wasClean: event.wasClean });\n reject(new Error(`Terminal WebSocket closed (${event.code})`));\n });\n });\n }\n };\n websocketUrls.set(transport, value);\n return Object.freeze(transport);\n}\n\nexport function workerWebSocketUrl(transport: TerminalTransport): string | undefined {\n const url = websocketUrls.get(transport);\n return url === undefined ? undefined : normalizeUrl(url);\n}\n\nexport function selectTransport(options: { url?: string | URL; transport?: TerminalTransport }): TerminalTransport {\n if (!options || (options.url !== undefined) === (options.transport !== undefined))\n throw new TypeError(\"Exactly one of url or transport is required\");\n if (options.url !== undefined) return createWebSocketTransport(options.url);\n if (!options.transport || typeof options.transport.connect !== \"function\")\n throw new TypeError(\"transport must provide connect(context)\");\n return options.transport;\n}\n", "export function randomId(): string {\n if (typeof crypto.randomUUID === \"function\") return crypto.randomUUID();\n // getRandomValues is available on HTTP, unlike randomUUID.\n const bytes = crypto.getRandomValues(new Uint8Array(16));\n bytes[6] = (bytes[6] & 0x0f) | 0x40;\n bytes[8] = (bytes[8] & 0x3f) | 0x80;\n const hex = Array.from(bytes, byte => byte.toString(16).padStart(2, \"0\")).join(\"\");\n return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`;\n}\n", "import type { TerminalCommandMark } from \"./types.js\";\nimport type { TerminalMarker, TerminalMarkerOptions, MarkerResult } from \"./scrollbar-types.js\";\nimport type { HistoryMetadata, TerminalCommand } from \"./wire-types.js\";\nimport { randomId } from \"./random-id.js\";\n\ntype MarkerCommand = Extract<TerminalCommand, { type: \"marker\" }>;\ninterface Request {\n command: MarkerCommand;\n resolve: (result: MarkerResult) => void;\n reject: (error: Error) => void;\n timer?: ReturnType<typeof setTimeout>;\n}\n\n/** One RPC in flight lets a coalesced state frame acknowledge each operation without losing replies. */\nexport class MarkerState {\n #send: (command: TerminalCommand) => void;\n #change: () => void;\n #markers: readonly TerminalMarker[] = Object.freeze([]);\n #presentation = new Map<string, Pick<TerminalMarker, \"label\" | \"color\">>();\n #requests: Request[] = [];\n #serial = 0;\n #revision = 0;\n #presented = false;\n\n constructor(send: (command: TerminalCommand) => void, change: () => void) {\n this.#send = send;\n this.#change = change;\n }\n\n get markers(): readonly TerminalMarker[] { return this.#markers; }\n\n accept(history: HistoryMetadata | null, revision: number): void {\n if (revision <= this.#revision) return;\n this.#revision = revision;\n const next = (history?.markers ?? []).map(marker =>\n Object.freeze({ ...marker, ...this.#presentation.get(marker.id) }));\n const changed = !this.#presented || JSON.stringify(next) !== JSON.stringify(this.#markers);\n this.#presented = true;\n this.#markers = Object.freeze(next);\n const result = history?.markerResult;\n const request = this.#requests[0];\n if (result && request && result.requestId === request.command.requestId) {\n this.#requests.shift();\n clearTimeout(request.timer);\n if (result.success) request.resolve(result);\n else request.reject(new Error(result.error || \"Marker operation failed\"));\n this.#start();\n }\n const retained = new Set(next.map(marker => marker.id));\n for (const pending of this.#requests)\n if (pending.command.action === \"add\") retained.add(pending.command.id);\n for (const id of this.#presentation.keys())\n if (!retained.has(id)) this.#presentation.delete(id);\n if (changed) this.#change();\n }\n\n #request(command: Omit<MarkerCommand, \"type\" | \"requestId\">): Promise<MarkerResult> {\n const result = Promise.withResolvers<MarkerResult>();\n this.#requests.push({ command: { type: \"marker\", ...command, requestId: ++this.#serial },\n resolve: result.resolve, reject: result.reject });\n if (this.#requests.length === 1) this.#start();\n return result.promise;\n }\n\n #start(): void {\n const next = this.#requests[0];\n if (!next) return;\n try {\n this.#send(next.command);\n next.timer = setTimeout(() => {\n // The server may still process this request; do not issue further dependent operations.\n this.#rejectRequests(new Error(\"Timed out waiting for the marker operation; resync before retrying.\"));\n }, 10000);\n } catch (error) {\n this.#requests.shift();\n next.reject(error instanceof Error ? error : new Error(String(error)));\n this.#start();\n }\n }\n\n async add(options: TerminalMarkerOptions): Promise<TerminalMarker> {\n const position = options?.position;\n if (!position || !validIdentity(position.generation) || !validIdentity(position.rowId) ||\n !Number.isInteger(position.column) || position.column < 0 || position.column > 1024)\n throw new TypeError(\"A marker requires a valid presented generation, row ID, and column\");\n if (options.label !== undefined && (typeof options.label !== \"string\" || options.label.length > 4096))\n throw new TypeError(\"Marker label must be at most 4096 characters\");\n if (options.color !== undefined && (typeof options.color !== \"string\" || options.color.length > 256 ||\n !CSS.supports(\"color\", options.color))) throw new TypeError(\"Marker color must be a CSS color\");\n const id = `custom:${randomId()}`;\n this.#presentation.set(id, { ...(options.label === undefined ? {} : { label: options.label }),\n ...(options.color === undefined ? {} : { color: options.color }) });\n try {\n await this.#request({ action: \"add\", id, ...position });\n const marker = this.#markers.find(item => item.id === id);\n if (!marker) throw new Error(\"Marker registration succeeded without a retained marker\");\n return marker;\n } catch (error) {\n this.#presentation.delete(id);\n throw error;\n }\n }\n\n async remove(id: string): Promise<void> {\n validateMarkerId(id);\n await this.#request({ action: \"remove\", id });\n this.#presentation.delete(id);\n }\n\n async jump(id: string): Promise<void> {\n validateMarkerId(id);\n await this.#request({ action: \"jump\", id });\n }\n\n async details(id: string): Promise<TerminalCommandMark> {\n validateMarkerId(id);\n const result = await this.#request({ action: \"details\", id });\n if (!result.details) throw new Error(\"Command marker details were not returned\");\n return Object.freeze({ ...result.details });\n }\n\n disconnect(error = new Error(\"Terminal disconnected before the marker operation completed.\")): void {\n this.#rejectRequests(error);\n this.#presentation.clear();\n }\n\n #rejectRequests(error: Error): void {\n for (const request of this.#requests.splice(0)) {\n clearTimeout(request.timer);\n request.reject(error);\n }\n }\n}\n\nfunction validIdentity(value: unknown): value is string {\n return typeof value === \"string\" && /^[1-9][0-9]{0,18}$/u.test(value) && BigInt(value) <= 9223372036854775807n;\n}\n\nexport function validateMarkerId(id: string): void {\n if (typeof id !== \"string\" || !/^(?:custom|command):[A-Za-z0-9-]{1,100}$/u.test(id))\n throw new TypeError(\"Invalid terminal marker ID\");\n}\n", "import type { FrameMetadata, TerminalCell } from \"./wire-types.js\";\nimport { isRecord } from \"./validation.js\";\n\n/** Browser theme selection. System follows prefers-color-scheme. */\nexport type TerminalColorMode = \"light\" | \"dark\" | \"system\";\n\n/** JSON-compatible terminal colors. Every color is an opaque #RRGGBB string. */\nexport interface TerminalPalette {\n readonly foreground: string;\n readonly background: string;\n /** Exactly 16 entries: black, red, green, yellow, blue, magenta, cyan, white, then their bright variants. */\n readonly ansi: readonly string[];\n readonly cursor?: string;\n /** Selected text color; defaults to the palette background. */\n readonly selectionForeground?: string;\n /** Opaque selection fill; defaults to the palette foreground. */\n readonly selectionBackground?: string;\n /** Optional overrides for indices 16 through 255; otherwise the xterm cube and gray ramp apply. */\n readonly extended?: Readonly<Record<number, string>>;\n}\n\n/** Hex1b Dark: muted Tomorrow Night Eighties-derived hues on neutral charcoal. */\nexport const defaultDarkPalette: TerminalPalette = Object.freeze({\n foreground: \"#d4d0c8\", background: \"#323232\",\n selectionForeground: \"#323232\", selectionBackground: \"#d4d0c8\",\n ansi: Object.freeze([\n \"#242424\", \"#ed888f\", \"#8dae82\", \"#c3a150\", \"#7baad1\", \"#bc99c5\", \"#64b1b5\", \"#b7b4ae\",\n \"#9a9a9a\", \"#ff99a0\", \"#9bc08e\", \"#d7b156\", \"#87bbe7\", \"#d0a8da\", \"#6cc4c8\", \"#dedad3\",\n ]),\n});\n\n/** Hex1b Light swaps the default neutrals and retunes the same hues for warm stone. */\nexport const defaultLightPalette: TerminalPalette = Object.freeze({\n foreground: \"#323232\", background: \"#d4d0c8\",\n selectionForeground: \"#d4d0c8\", selectionBackground: \"#323232\",\n ansi: Object.freeze([\n \"#24262b\", \"#9e3141\", \"#3e6131\", \"#705402\", \"#255c86\", \"#704b7a\", \"#006367\", \"#b7b4ae\",\n \"#595959\", \"#982338\", \"#355a27\", \"#664d01\", \"#175480\", \"#694273\", \"#015a5e\", \"#e3dfd7\",\n ]),\n});\n\nexport function normalizeColorMode(value: unknown = \"dark\"): TerminalColorMode {\n if (value === \"light\" || value === \"dark\" || value === \"system\") return value;\n throw new TypeError('colorMode must be \"light\", \"dark\", or \"system\"');\n}\n\nfunction color(value: unknown, name: string): string {\n if (typeof value !== \"string\" || !/^#[0-9a-f]{6}$/iu.test(value))\n throw new TypeError(`${name} must be a #RRGGBB color`);\n return value.toLowerCase();\n}\n\nexport function normalizePalette(value: unknown): TerminalPalette {\n if (!isRecord(value)) throw new TypeError(\"A terminal palette object is required\");\n if (!Array.isArray(value.ansi) || value.ansi.length !== 16)\n throw new TypeError(\"palette.ansi must contain exactly 16 colors\");\n const ansi = Array.from(value.ansi, (entry, index) => color(entry, `palette.ansi[${index}]`));\n const extended: Record<number, string> = {};\n if (value.extended !== undefined) {\n if (!isRecord(value.extended)) throw new TypeError(\"palette.extended must be an object\");\n for (const [key, entry] of Object.entries(value.extended)) {\n const index = Number(key);\n if (!Number.isInteger(index) || index < 16 || index > 255 || String(index) !== key)\n throw new TypeError(\"palette.extended indices must be integers from 16 to 255\");\n extended[index] = color(entry, `palette.extended[${key}]`);\n }\n }\n return Object.freeze({\n foreground: color(value.foreground, \"palette.foreground\"),\n background: color(value.background, \"palette.background\"),\n ansi: Object.freeze(ansi),\n ...(value.cursor === undefined ? {} : { cursor: color(value.cursor, \"palette.cursor\") }),\n ...(value.selectionForeground === undefined ? {} :\n { selectionForeground: color(value.selectionForeground, \"palette.selectionForeground\") }),\n ...(value.selectionBackground === undefined ? {} :\n { selectionBackground: color(value.selectionBackground, \"palette.selectionBackground\") }),\n ...(value.extended === undefined ? {} : { extended: Object.freeze(extended) }),\n });\n}\n\nexport interface RenderPalette {\n foreground: number;\n background: number;\n selectionForeground: number;\n selectionBackground: number;\n cursor?: number;\n indexed: Uint32Array;\n}\n\nfunction pack(red: number, green: number, blue: number): number {\n return (red | green << 8 | blue << 16 | 0xff000000) >>> 0;\n}\n\nfunction packHex(value: string): number {\n const rgb = Number.parseInt(value.slice(1), 16);\n return pack(rgb >> 16, (rgb >> 8) & 255, rgb & 255);\n}\n\nexport function compilePalette(palette: TerminalPalette): RenderPalette {\n const indexed = new Uint32Array(256);\n for (let i = 0; i < 16; i++) indexed[i] = packHex(palette.ansi[i]);\n const levels = [0, 95, 135, 175, 215, 255];\n for (let i = 16; i < 232; i++) {\n const n = i - 16;\n indexed[i] = pack(levels[Math.floor(n / 36)], levels[Math.floor(n / 6) % 6], levels[n % 6]);\n }\n for (let i = 232; i < 256; i++) {\n const gray = 8 + (i - 232) * 10;\n indexed[i] = pack(gray, gray, gray);\n }\n for (const [index, value] of Object.entries(palette.extended ?? {})) indexed[Number(index)] = packHex(value);\n return { foreground: packHex(palette.foreground), background: packHex(palette.background),\n selectionForeground: packHex(palette.selectionForeground ?? palette.background),\n selectionBackground: packHex(palette.selectionBackground ?? palette.foreground),\n ...(palette.cursor === undefined ? {} : { cursor: packHex(palette.cursor) }), indexed };\n}\n\nexport function validateColorReference(value: number, underline = false): void {\n if ((value >>> 24) === 255 || (value >= 0x01000000 && value <= 0x010000ff) ||\n value === 0x02000000 || value === 0x03000000 || (underline && value === 0x04000000)) return;\n throw new Error(\"Invalid indexed-v1 color reference\");\n}\n\nfunction resolve(value: number, palette: RenderPalette): number {\n switch (value >>> 24) {\n case 1: return palette.indexed[value & 255];\n case 2: return palette.foreground;\n case 3: return palette.background;\n default: return value;\n }\n}\n\nexport function foregroundColor(cell: TerminalCell, metadata: FrameMetadata, palette: RenderPalette): number {\n if (metadata.colorEncoding !== \"indexed-v1\") return cell.foreground;\n const value = resolve(cell.attributes & 32 ? cell.background : cell.foreground, palette);\n return cell.attributes & 2\n ? (((value & 255) >> 1) | ((((value >>> 8) & 255) >> 1) << 8) |\n ((((value >>> 16) & 255) >> 1) << 16) | 0xff000000) >>> 0\n : value;\n}\n\nexport function backgroundColor(cell: TerminalCell, metadata: FrameMetadata, palette: RenderPalette): number {\n if (metadata.colorEncoding !== \"indexed-v1\") return cell.background;\n if (!(cell.attributes & 32) && cell.background === 0x03000000) return palette.background & 0x00ffffff;\n return resolve(cell.attributes & 32 ? cell.foreground : cell.background, palette);\n}\n\nexport function underlineColor(cell: TerminalCell, metadata: FrameMetadata, palette: RenderPalette): number {\n if (metadata.colorEncoding !== \"indexed-v1\") return cell.underlineColor;\n return cell.underlineColor === 0x04000000\n ? foregroundColor(cell, metadata, palette) : resolve(cell.underlineColor, palette);\n}\n", "import type { FrameMetadata, HistoryMetadata, SelectionText, TerminalCell, TerminalFrame } from \"./wire-types.js\";\nimport { isRecord } from \"./validation.js\";\nimport { validateMarkerId } from \"./marker-state.js\";\nimport { validateColorReference } from \"./terminal-palette.js\";\n\n// Binary validation is deliberately independent of the GPU and the transport.\nexport const LIMITS = Object.freeze({\n commandBytes: 64 * 1024,\n frameBytes: 96 * 1024 * 1024,\n metadataBytes: 8 * 1024 * 1024,\n titleUnits: 4096,\n commandMarkParameterUnits: 8192,\n cells: 262144,\n images: 4096,\n placements: 16384,\n textureBytes: 256 * 1024 * 1024,\n});\n\nconst utf8 = new TextDecoder(\"utf-8\", { fatal: true });\nconst utf8Encoder = new TextEncoder();\n\nexport function assertCommandSize(command: unknown): void {\n if (utf8Encoder.encode(JSON.stringify(command)).byteLength > LIMITS.commandBytes)\n throw new RangeError(\"Terminal input exceeds the 64 KiB message limit. Send a smaller amount of text.\");\n}\n\nfunction integer(value: unknown, name: string, min = 0, max = Number.MAX_SAFE_INTEGER): number {\n if (typeof value !== \"number\" || !Number.isSafeInteger(value) || value < min || value > max) {\n throw new Error(`Invalid ${name}: ${String(value)}`);\n }\n return value;\n}\n\nfunction array(value: unknown, name: string, limit: number): asserts value is unknown[] {\n if (!Array.isArray(value) || value.length > limit) throw new Error(`Invalid ${name}`);\n}\n\nfunction key(value: unknown): asserts value is string {\n if (typeof value !== \"string\" || !value.length || value.length > 1024) {\n throw new Error(\"Invalid image key\");\n }\n}\n\nfunction rowId(value: unknown, name: string): asserts value is string {\n if (typeof value !== \"string\" || !/^[1-9][0-9]{0,18}$/u.test(value) || BigInt(value) > 9223372036854775807n) {\n throw new Error(`Invalid ${name}`);\n }\n}\n\nexport function validateHistory(history: unknown, columns: number, rows: number): asserts history is HistoryMetadata | null {\n if (history === null) return;\n if (!isRecord(history)) throw new Error(\"Missing history metadata\");\n rowId(history.generation, \"history generation\");\n if (history.buffer !== \"main\" && history.buffer !== \"alternate\") throw new Error(\"Invalid history buffer\");\n const totalRows = integer(history.totalRows, \"history total rows\", rows, 2147483647);\n const liveTop = integer(history.liveTop, \"history live top\", 0, totalRows - rows);\n if (liveTop !== totalRows - rows) throw new Error(\"Inconsistent history extent\");\n integer(history.top, \"history top\", 0, liveTop);\n if (typeof history.following !== \"boolean\" || (history.following && history.top !== history.liveTop)) {\n throw new Error(\"Invalid history following state\");\n }\n integer(history.requestId, \"viewport request id\");\n if (history.viewportError !== undefined && history.viewportError !== null &&\n (typeof history.viewportError !== \"string\" || history.viewportError.length > 4096))\n throw new Error(\"Invalid viewport error\");\n array(history.rowIds, \"viewport row ids\", rows);\n if (history.rowIds.length !== rows || new Set(history.rowIds).size !== rows) throw new Error(\"Invalid viewport row ids\");\n for (const id of history.rowIds) rowId(id, \"viewport row id\");\n const selection = history.selection;\n if (!isRecord(selection) || typeof selection.status !== \"string\" ||\n ![\"none\", \"valid\", \"invalidated\"].includes(selection.status)) throw new Error(\"Invalid selection status\");\n integer(selection.requestId, \"selection request id\");\n if (typeof selection.mode !== \"string\" || ![\"character\", \"word\", \"line\", \"rectangle\"].includes(selection.mode)) throw new Error(\"Invalid selection mode\");\n array(selection.ranges, \"selection ranges\", rows);\n let previousRow = -1;\n for (const range of selection.ranges) {\n if (!isRecord(range)) throw new Error(\"Invalid selection range\");\n const row = integer(range.row, \"selection range row\", previousRow + 1, rows - 1);\n const startColumn = integer(range.startColumn, \"selection start column\", 0, columns - 1);\n integer(range.endColumn, \"selection end column\", startColumn + 1, columns);\n previousRow = row;\n }\n validateSelectionText(selection);\n if (selection.status !== \"valid\" && selection.ranges.length) throw new Error(\"Inactive selection has highlight ranges\");\n if (history.copy !== null) {\n if (!isRecord(history.copy)) throw new Error(\"Missing copy metadata\");\n integer(history.copy.requestId, \"copy request id\", 1);\n validateSelectionText(history.copy);\n }\n if (history.markers !== undefined) {\n array(history.markers, \"history markers\", LIMITS.metadataBytes / 48);\n const ids = new Set<string>();\n for (const marker of history.markers) {\n if (!isRecord(marker) || typeof marker.id !== \"string\") throw new Error(\"Invalid history marker\");\n validateMarkerId(marker.id);\n if (ids.has(marker.id)) throw new Error(\"Duplicate history marker ID\");\n ids.add(marker.id);\n if (marker.source !== \"command\" && marker.source !== \"custom\") throw new Error(\"Invalid marker source\");\n if (!marker.id.startsWith(`${marker.source}:`)) throw new Error(\"Marker source disagrees with its ID\");\n if (marker.buffer !== \"main\" && marker.buffer !== \"alternate\") throw new Error(\"Invalid marker buffer\");\n integer(marker.column, \"marker column\", 0, 1024);\n if (marker.row !== null) {\n integer(marker.row, \"marker row\", 0, totalRows - 1);\n if (marker.buffer !== history.buffer) throw new Error(\"Inactive-buffer marker has a resolved row\");\n }\n if (marker.source === \"command\") validateCommandMark({ ...marker, rawParameters: null });\n else if (marker.phase !== undefined && marker.phase !== null) throw new Error(\"Custom marker has a shell phase\");\n }\n }\n if (history.markerPage !== undefined && history.markerPage !== null) {\n const page = history.markerPage;\n if (!isRecord(page) || typeof page.revision !== \"string\" || !page.revision.length || page.revision.length > 64)\n throw new Error(\"Invalid marker page revision\");\n const total = integer(page.total, \"marker inventory count\", 1, Math.floor(LIMITS.metadataBytes / 48));\n const offset = integer(page.offset, \"marker page offset\", 0, total - 1);\n if (!Array.isArray(history.markers) || !history.markers.length || offset + history.markers.length > total)\n throw new Error(\"Invalid marker page length\");\n }\n if (history.markerResult !== undefined && history.markerResult !== null) {\n const result = history.markerResult;\n if (!isRecord(result) || typeof result.success !== \"boolean\") throw new Error(\"Invalid marker result\");\n integer(result.requestId, \"marker request ID\", 1);\n if (result.error !== undefined && result.error !== null &&\n (typeof result.error !== \"string\" || result.error.length > 4096)) throw new Error(\"Invalid marker error\");\n if (result.markerId !== undefined && result.markerId !== null) {\n if (typeof result.markerId !== \"string\") throw new Error(\"Invalid result marker ID\");\n validateMarkerId(result.markerId);\n }\n if (result.details !== undefined && result.details !== null) validateCommandMark(result.details);\n }\n}\n\nfunction validateCommandMark(commandMark: unknown): void {\n if (!isRecord(commandMark) || typeof commandMark.phase !== \"string\" ||\n ![\"unknown\", \"prompt\", \"commandLine\", \"executing\", \"finished\"].includes(commandMark.phase))\n throw new Error(\"Invalid terminal command mark\");\n if (commandMark.exitCode !== null) {\n integer(commandMark.exitCode, \"terminal command mark exit code\", -2147483648, 2147483647);\n if (commandMark.phase !== \"finished\") throw new Error(\"Non-finished terminal command mark has an exit code\");\n }\n if (commandMark.rawParameters !== null &&\n (typeof commandMark.rawParameters !== \"string\" || commandMark.rawParameters.length > LIMITS.commandMarkParameterUnits))\n throw new Error(\"Invalid terminal command mark parameters\");\n}\n\nfunction validateSelectionText(selection: Record<string, unknown>): asserts selection is Record<string, unknown> & SelectionText {\n if (typeof selection.status !== \"string\" || ![\"none\", \"valid\", \"invalidated\"].includes(selection.status) ||\n (selection.status === \"valid\"\n ? typeof selection.text !== \"string\" || selection.text.length > LIMITS.metadataBytes\n : selection.text !== null)) {\n throw new Error(\"Invalid selection text\");\n }\n}\n\nfunction validateMetadata(metadata: unknown): asserts metadata is FrameMetadata {\n if (!isRecord(metadata) || metadata.version !== 1 || typeof metadata.full !== \"boolean\") {\n throw new Error(\"Unsupported frame metadata version\");\n }\n integer(metadata.revision, \"revision\", 1);\n integer(metadata.baseRevision, \"base revision\");\n if (metadata.colorEncoding !== undefined && metadata.colorEncoding !== null &&\n metadata.colorEncoding !== \"indexed-v1\") throw new Error(\"Unsupported color encoding\");\n if (metadata.colorEncodings !== undefined) {\n array(metadata.colorEncodings, \"color encodings\", 16);\n if (metadata.colorEncodings.some(value => typeof value !== \"string\" || value.length > 64))\n throw new Error(\"Invalid color encodings\");\n }\n if (typeof metadata.title !== \"string\" || metadata.title.length > LIMITS.titleUnits ||\n /[\\u0000-\\u001f\\u007f-\\u009f\\ud800-\\udfff]/u.test(metadata.title)) {\n throw new Error(\"Invalid terminal title\");\n }\n const progress = metadata.progress;\n if (!isRecord(progress) || typeof progress.state !== \"string\" ||\n ![\"none\", \"normal\", \"error\", \"indeterminate\", \"warning\"].includes(progress.state)) {\n throw new Error(\"Invalid terminal progress\");\n }\n if (progress.state === \"none\" || progress.state === \"indeterminate\") {\n if (progress.percentage !== null) throw new Error(\"Unexpected terminal progress percentage\");\n } else {\n integer(progress.percentage, \"terminal progress percentage\", 0, 100);\n }\n const shell = metadata.shellIntegration;\n if (!isRecord(shell) || typeof shell.phase !== \"string\" ||\n ![\"unknown\", \"prompt\", \"commandLine\", \"executing\", \"finished\"].includes(shell.phase)) {\n throw new Error(\"Invalid terminal shell integration\");\n }\n if (shell.lastExitCode !== null)\n integer(shell.lastExitCode, \"terminal shell exit code\", -2147483648, 2147483647);\n if (shell.phase === \"unknown\" && shell.lastExitCode !== null)\n throw new Error(\"Unknown terminal shell phase has an exit code\");\n const workingDirectory = metadata.workingDirectory;\n if (!isRecord(workingDirectory)) throw new Error(\"Invalid terminal working directory\");\n const wdFields = [workingDirectory.uri, workingDirectory.host, workingDirectory.path];\n if (wdFields.every(field => field === null)) {\n // No directory reported yet.\n } else if (wdFields.some(field => typeof field !== \"string\" || field.length > LIMITS.metadataBytes)) {\n throw new Error(\"Invalid terminal working directory\");\n }\n const commandMark = metadata.commandMark;\n if (commandMark !== null) validateCommandMark(commandMark);\n const columns = integer(metadata.columns, \"columns\", 1, 1024);\n const rows = integer(metadata.rows, \"rows\", 1, 512);\n if (metadata.lineRenditions !== undefined) {\n array(metadata.lineRenditions, \"line renditions\", rows);\n if (metadata.lineRenditions.length !== rows) throw new Error(\"Invalid line rendition count\");\n for (const rendition of metadata.lineRenditions) integer(rendition, \"line rendition\", 0, 3);\n }\n if (typeof metadata.mouseTracking !== \"number\" || ![0, 9, 1000, 1002, 1003].includes(metadata.mouseTracking)) {\n throw new Error(\"Unsupported mouse tracking mode\");\n }\n if (!isRecord(metadata.peer) || typeof metadata.peer.isPrimary !== \"boolean\") throw new Error(\"Invalid peer state\");\n for (const field of [\"id\", \"primaryId\"]) {\n const id = metadata.peer[field];\n if (id !== null && (typeof id !== \"string\" || !id.length || id.length > 256)) {\n throw new Error(`Invalid peer ${field}`);\n }\n }\n if (metadata.peer.id !== null && metadata.peer.isPrimary !== (metadata.peer.id === metadata.peer.primaryId)) {\n throw new Error(\"Inconsistent primary peer state\");\n }\n integer(columns * rows, \"cell count\", 1, LIMITS.cells);\n validateHistory(metadata.history, columns, rows);\n array(metadata.hyperlinks, \"hyperlinks\", columns * rows);\n let previousLinkEnd = 0;\n for (const link of metadata.hyperlinks) {\n if (!isRecord(link)) throw new Error(\"Invalid hyperlink\");\n const row = integer(link.row, \"hyperlink row\", 0, rows - 1);\n const start = integer(link.startColumn, \"hyperlink start column\", 0, columns - 1);\n const end = integer(link.endColumn, \"hyperlink end column\", start + 1, columns);\n if (row * columns + start < previousLinkEnd) throw new Error(\"Unordered or overlapping hyperlinks\");\n previousLinkEnd = row * columns + end;\n if (typeof link.uri !== \"string\" || !link.uri.length || link.uri.length > LIMITS.metadataBytes)\n throw new Error(\"Invalid hyperlink URI\");\n }\n if (metadata.cellWidth !== 10 || metadata.cellHeight !== 20) {\n throw new Error(\"This spike requires server geometry of 10 \u00D7 20 logical pixels\");\n }\n for (const field of [\"defaultBackground\", \"defaultForeground\"]) {\n if (metadata[field] !== undefined) integer(metadata[field], field, 0, 0xffffffff);\n }\n if (!isRecord(metadata.cursor) || typeof metadata.cursor.visible !== \"boolean\") throw new Error(\"Invalid cursor\");\n integer(metadata.cursor.x, \"cursor x\", -1, 1024);\n integer(metadata.cursor.y, \"cursor y\", -1, 512);\n const shapes = [\"Default\", \"BlinkingBlock\", \"SteadyBlock\", \"BlinkingUnderline\", \"SteadyUnderline\", \"BlinkingBar\", \"SteadyBar\"];\n if (typeof metadata.cursor.shape === \"string\") metadata.cursor.shape = shapes.indexOf(metadata.cursor.shape);\n integer(metadata.cursor.shape, \"cursor shape\", 0, 6);\n array(metadata.images, \"images\", LIMITS.images);\n array(metadata.retainedImages, \"retained image keys\", LIMITS.images);\n array(metadata.placements, \"placements\", LIMITS.placements);\n array(metadata.warnings, \"warnings\", 256);\n if (metadata.warnings.some(w => typeof w !== \"string\")) throw new Error(\"Invalid warning\");\n if (!isRecord(metadata.stats)) throw new Error(\"Invalid server metrics\");\n for (const field of [\"workloadBytes\", \"outputBatches\", \"captureMs\", \"elapsedMs\"]) {\n const metric = metadata.stats[field];\n if (typeof metric !== \"number\" || !Number.isFinite(metric) || metric < 0) {\n throw new Error(`Invalid server metric ${field}`);\n }\n }\n const retained = new Set<string>();\n for (const imageKey of metadata.retainedImages) {\n key(imageKey);\n if (retained.has(imageKey)) throw new Error(\"Duplicate retained image key\");\n retained.add(imageKey);\n }\n const imageKeys = new Set<string>();\n let decodedImageBytes = 0;\n for (const image of metadata.images) {\n if (!isRecord(image)) throw new Error(\"Invalid image\");\n key(image.key);\n if (imageKeys.has(image.key) || !retained.has(image.key)) throw new Error(\"Inconsistent new image keys\");\n imageKeys.add(image.key);\n const width = integer(image.width, \"image width\", 1, 16384);\n const height = integer(image.height, \"image height\", 1, 16384);\n const byteLength = integer(image.byteLength, \"image byte length\", 1, LIMITS.frameBytes);\n if (image.format !== \"rgba\" && image.format !== \"png\") throw new Error(\"Unsupported image format\");\n if (image.format === \"rgba\" && byteLength !== width * height * 4) {\n throw new Error(\"RGBA image size mismatch\");\n }\n decodedImageBytes += width * height * 4;\n if (decodedImageBytes > LIMITS.textureBytes) throw new Error(\"New images exceed decoded texture budget\");\n }\n for (const placement of metadata.placements) {\n if (!isRecord(placement)) throw new Error(\"Invalid placement\");\n key(placement.key);\n if (!retained.has(placement.key)) throw new Error(\"Placement references an unretained image\");\n if (placement.kind !== \"kgp\" && placement.kind !== \"sixel\") throw new Error(\"Invalid placement kind\");\n for (const field of [\"x\", \"y\", \"width\", \"height\", \"sourceX\", \"sourceY\", \"sourceWidth\", \"sourceHeight\", \"clipX\", \"clipY\", \"clipWidth\", \"clipHeight\", \"z\"]) {\n const coordinate = placement[field];\n if (typeof coordinate !== \"number\" || !Number.isFinite(coordinate) || Math.abs(coordinate) > 2147483648) {\n throw new Error(`Invalid placement ${field}`);\n }\n }\n for (const field of [\"width\", \"height\", \"sourceWidth\", \"sourceHeight\", \"clipWidth\", \"clipHeight\"]) {\n const coordinate = placement[field];\n if (typeof coordinate !== \"number\" || coordinate < 0) throw new Error(`Negative placement ${field}`);\n }\n }\n}\n\n/** Decode one complete, experimental HWT1 message, checking every boundary before reading. */\nexport function decodeFrame(buffer: unknown): TerminalFrame {\n if (!(buffer instanceof ArrayBuffer) || buffer.byteLength > LIMITS.frameBytes) {\n throw new Error(\"Invalid or oversized binary frame\");\n }\n const view = new DataView(buffer);\n let offset = 0;\n const requireBytes = (count: number) => {\n if (count < 0 || count > view.byteLength - offset) throw new Error(\"Truncated HWT1 frame\");\n };\n const u32 = () => { requireBytes(4); const n = view.getUint32(offset, true); offset += 4; return n; };\n if (u32() !== 0x31545748) throw new Error(\"Unsupported frame magic (expected HWT1)\");\n const metadataLength = integer(u32(), \"metadata length\", 2, LIMITS.metadataBytes);\n requireBytes(metadataLength);\n const metadata: unknown = JSON.parse(utf8.decode(new Uint8Array(buffer, offset, metadataLength)));\n offset += metadataLength;\n validateMetadata(metadata);\n const cellCount = metadata.columns * metadata.rows;\n const changedCount = integer(u32(), \"changed cell count\", 0, cellCount);\n if (changedCount > Math.floor((view.byteLength - offset) / 22)) throw new Error(\"Truncated cell records\");\n if (metadata.full && changedCount !== cellCount) throw new Error(\"Incomplete full frame\");\n const cells = [];\n const seen = new Set();\n for (let i = 0; i < changedCount; i++) {\n requireBytes(22);\n const index = u32();\n if (index >= cellCount || seen.has(index)) throw new Error(\"Invalid or duplicate cell index\");\n seen.add(index);\n const foreground = u32();\n const background = u32();\n const underlineColor = u32();\n if (metadata.colorEncoding === \"indexed-v1\") {\n validateColorReference(foreground);\n validateColorReference(background);\n validateColorReference(underlineColor, true);\n }\n const attributes = view.getUint16(offset, true);\n const width = view.getUint8(offset + 2);\n const underlineStyle = view.getUint8(offset + 3);\n const textLength = view.getUint16(offset + 4, true);\n offset += 6;\n if (underlineStyle > 5) throw new Error(\"Unsupported underline style\");\n requireBytes(textLength);\n const text = utf8.decode(new Uint8Array(buffer, offset, textLength));\n offset += textLength;\n cells.push({ index, foreground, background, underlineColor, attributes, width, underlineStyle, text });\n }\n const imageBytes = metadata.images.reduce((total, image) => total + image.byteLength, 0);\n if (imageBytes !== view.byteLength - offset) throw new Error(\"Image payload length mismatch\");\n const images = metadata.images.map(image => {\n const bytes = new Uint8Array(buffer, offset, image.byteLength);\n offset += image.byteLength;\n return { ...image, bytes };\n });\n return { metadata, cells, images };\n}\n\n/** Mirror text, not ANSI; continuation cells are already represented by their lead glyph. */\nexport function screenText(cells: readonly (TerminalCell | undefined)[], columns: number, rows: number): string {\n const lines = [];\n for (let y = 0; y < rows; y++) {\n let line = \"\";\n for (let x = 0; x < columns; x++) {\n const cell = cells[y * columns + x];\n if (!cell || cell.width === 0) continue;\n line += cell.attributes & 64 ? \" \".repeat(cell.width) : (cell.text || \" \");\n }\n lines.push(line.replace(/ +$/u, \"\"));\n }\n return lines.join(\"\\n\");\n}\n", "import { LIMITS } from \"./protocol.js\";\nimport type { TerminalTransport, TerminalTransportCloseDetails, TerminalTransportConnection } from \"./transport-types.js\";\nimport { errorMessage } from \"./validation.js\";\n\ninterface Callbacks {\n onReady(): void;\n onFrame(frame: ArrayBuffer): Promise<void>;\n onClose(details: TerminalTransportCloseDetails): void;\n onError(error: Error): void;\n}\n\n/** Shared lifecycle and bounded delivery for worker-local and host-bridged transports. */\nexport class TransportSession {\n #abort = new AbortController();\n #ready = Promise.withResolvers<void>();\n #connection: TerminalTransportConnection | undefined;\n #frame = false;\n #sending = false;\n #queue: { control: string; bytes: number; resolve(): void; reject(error: unknown): void }[] = [];\n #bytes = 0;\n\n constructor(private callbacks: Callbacks) {\n // Disposal can precede the first frame waiting for readiness.\n void this.#ready.promise.catch(() => {});\n }\n\n start(transport: TerminalTransport): void {\n void this.#connect(transport);\n }\n\n async #connect(transport: TerminalTransport): Promise<void> {\n try {\n const connection = await transport.connect({\n signal: this.#abort.signal,\n onFrame: frame => this.#receive(frame),\n onClose: details => {\n if (this.#abort.signal.aborted) return;\n if (!details || typeof details.reason !== \"string\" ||\n (details.code !== undefined && (!Number.isInteger(details.code) || typeof details.wasClean !== \"boolean\"))) {\n this.#fail(new TypeError(\"Invalid terminal transport close details\"));\n return;\n }\n const snapshot = details.code === undefined ? { reason: details.reason }\n : { code: details.code, reason: details.reason, wasClean: details.wasClean };\n this.dispose();\n this.callbacks.onClose(snapshot);\n },\n onError: error => this.#fail(error)\n });\n if (!connection || typeof connection.send !== \"function\" || typeof connection.dispose !== \"function\")\n throw new TypeError(\"transport.connect must return a connection with send and dispose\");\n if (this.#abort.signal.aborted) { connection.dispose(); return; }\n this.#connection = connection;\n this.callbacks.onReady();\n this.#ready.resolve();\n } catch (error) { this.#fail(error); }\n }\n\n async #receive(frame: ArrayBuffer | Uint8Array<ArrayBuffer>): Promise<void> {\n try {\n this.#abort.signal.throwIfAborted();\n if (this.#frame) throw new Error(\"Concurrent terminal transport frames are not allowed\");\n if (!(frame instanceof ArrayBuffer) &&\n !(frame instanceof Uint8Array && frame.buffer instanceof ArrayBuffer))\n throw new TypeError(\"Transport frames must be ArrayBuffer or Uint8Array backed by ArrayBuffer\");\n if (!frame.byteLength || frame.byteLength > LIMITS.frameBytes)\n throw new RangeError(\"Invalid HWT1 frame size\");\n this.#frame = true;\n const buffer = frame instanceof ArrayBuffer ? frame : new Uint8Array(frame).buffer;\n await this.#ready.promise;\n this.#abort.signal.throwIfAborted();\n await this.callbacks.onFrame(buffer);\n this.#abort.signal.throwIfAborted();\n this.#frame = false;\n } catch (error) {\n this.#fail(error);\n throw error;\n }\n }\n\n send(control: string): Promise<void> {\n if (this.#abort.signal.aborted) return Promise.reject(this.#abort.signal.reason);\n const bytes = new TextEncoder().encode(control).byteLength;\n if (this.#queue.length >= 256 || this.#bytes + bytes > 1024 * 1024) {\n const error = new Error(\"Terminal transport control queue exceeded its bounded capacity\");\n this.#fail(error);\n return Promise.reject(error);\n }\n const pending = Promise.withResolvers<void>();\n this.#queue.push({ control, bytes, resolve: pending.resolve, reject: pending.reject });\n this.#bytes += bytes;\n void this.#drain();\n return pending.promise;\n }\n\n async #drain(): Promise<void> {\n if (this.#sending) return;\n this.#sending = true;\n try {\n await this.#ready.promise;\n while (!this.#abort.signal.aborted && this.#queue.length) {\n const item = this.#queue[0];\n await this.#connection!.send(item.control);\n if (this.#abort.signal.aborted) return;\n this.#queue.shift();\n this.#bytes -= item.bytes;\n item.resolve();\n }\n } catch (error) { this.#fail(error); }\n finally { this.#sending = false; }\n }\n\n #fail(error: unknown): void {\n if (this.#abort.signal.aborted) return;\n const failure = error instanceof Error ? error : new Error(errorMessage(error));\n this.#stop(failure);\n this.callbacks.onError(failure);\n }\n\n dispose(): void {\n this.#stop(new DOMException(\"Terminal transport was disposed or closed\", \"AbortError\"));\n }\n\n #stop(error: Error): void {\n if (this.#abort.signal.aborted) return;\n this.#abort.abort(error);\n this.#ready.reject(error);\n for (const item of this.#queue) item.reject(error);\n this.#queue = [];\n this.#bytes = 0;\n this.#connection?.dispose();\n this.#connection = undefined;\n }\n}\n", "const defaultFontUrl = new URL(\"./fonts/cascadia-mono-nf/CascadiaMonoNF.woff2\", import.meta.url).href;\nconst genericFamilies = new Set([\"monospace\", \"serif\", \"sans-serif\", \"system-ui\"]);\n\n/** Resolve caller-relative URLs before sending the configuration to the worker. */\nexport function normalizeFont(font?: TerminalFont, baseUrl = import.meta.url): NormalizedFont {\n font ??= { family: \"Cascadia Mono NF\", faces: [{ url: defaultFontUrl, weight: \"200 700\" }] };\n if (typeof font !== \"object\" || Array.isArray(font) ||\n typeof font.family !== \"string\" || !font.family.trim() || font.family.length > 256 ||\n /[\\u0000-\\u001f\\u007f]/u.test(font.family)) {\n throw new TypeError(\"font.family must be a single, nonempty font family name\");\n }\n const faces = font.faces ?? [];\n if (!Array.isArray(faces) || faces.length > 16) throw new TypeError(\"font.faces must contain at most 16 font sources\");\n return {\n family: font.family.trim(),\n faces: faces.map(face => {\n if (!face || typeof face.url !== \"string\" || !face.url.trim()) {\n throw new TypeError(\"Each font face requires a URL\");\n }\n for (const field of [\"weight\", \"style\"] as const) {\n if (face[field] !== undefined && (typeof face[field] !== \"string\" || face[field].length > 64)) {\n throw new TypeError(`Font face ${field} must be a CSS descriptor string`);\n }\n }\n return {\n url: new URL(face.url, baseUrl).href,\n weight: face.weight ?? \"400\",\n style: face.style ?? \"normal\"\n };\n })\n };\n}\n\n/** Use the rendering context's FontFaceSet; a worker cannot inherit page fonts. */\nexport async function loadFont(configuration: TerminalFont): Promise<LoadedFont> {\n const { family, faces } = normalizeFont(configuration);\n const scope: object = globalThis;\n const fontSet = \"fonts\" in scope && isFontSet(scope.fonts)\n ? scope.fonts : globalThis.document?.fonts;\n if (!fontSet || typeof FontFace !== \"function\") {\n throw new Error(\"Terminal font loading requires the CSS Font Loading API in the rendering context\");\n }\n const generic = genericFamilies.has(family.toLowerCase());\n const cssFamily = generic ? family.toLowerCase() : JSON.stringify(family);\n if (generic && faces.length) throw new TypeError(\"A generic font family cannot have downloadable faces\");\n const sources: (TerminalFontFace | { local: string; weight?: string; style?: string })[] =\n faces.length ? faces : generic ? [] : [{ local: family }];\n const loaded: FontFace[] = [];\n for (const source of sources) {\n try {\n const face = new FontFace(family,\n \"local\" in source ? `local(${JSON.stringify(source.local)})` : `url(${JSON.stringify(source.url)})`,\n { weight: source.weight ?? \"400\", style: source.style ?? \"normal\" });\n loaded.push(await face.load());\n } catch (error) {\n throw new Error(`Could not load terminal font \"${family}\" from ${\"url\" in source ? source.url : \"local fonts\"}`, { cause: error });\n }\n }\n for (const face of loaded) fontSet.add(face);\n return {\n family, cssFamily,\n dispose() { for (const face of loaded) fontSet.delete(face); }\n };\n}\n\n/** Fit one font-wide advance and line box to the authoritative cell dimensions. */\nexport function measureFont(raster: OffscreenCanvasRenderingContext2D, cssFamily: string,\n attributes: number, scale: number, cellWidth: number, cellHeight: number): FontMetrics {\n const font = `${attributes & 4 ? \"italic \" : \"\"}${attributes & 1 ? \"bold \" : \"\"}${16 * scale}px ${cssFamily}`;\n raster.font = font;\n raster.textBaseline = \"alphabetic\";\n raster.textAlign = \"left\";\n const metrics = raster.measureText(\"M\");\n const lineHeight = metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent;\n if (!Number.isFinite(metrics.width) || metrics.width <= 0 ||\n !Number.isFinite(lineHeight) || lineHeight <= 0) {\n throw new Error(`Invalid terminal font metrics for ${cssFamily}`);\n }\n const xScale = cellWidth * scale / metrics.width;\n const yScale = cellHeight * scale / lineHeight;\n return { font, xScale, yScale, baseline: metrics.fontBoundingBoxAscent * yScale };\n}\nimport type { TerminalFont, TerminalFontFace } from \"./types.js\";\nimport { isRecord } from \"./validation.js\";\n\nexport interface NormalizedFont { family: string; faces: Required<TerminalFontFace>[] }\nexport interface LoadedFont { family: string; cssFamily: string; dispose(): void }\nexport interface FontMetrics { font: string; xScale: number; yScale: number; baseline: number }\n\nfunction isFontSet(value: unknown): value is Pick<FontFaceSet, \"add\" | \"delete\"> {\n return isRecord(value) && typeof value.add === \"function\" && typeof value.delete === \"function\";\n}\n", "import type { TerminalRendererPreference } from \"./types.js\";\n\nexport function normalizeRenderer(value: unknown = \"auto\"): TerminalRendererPreference {\n if (value === \"auto\" || value === \"webgpu\" || value === \"webgl2\") return value;\n throw new TypeError('renderer must be \"auto\", \"webgpu\", or \"webgl2\"');\n}\n", "import type { InputActionHandler, TerminalInput, TerminalInputContext } from \"./types.js\";\nimport type { TerminalLinkAction, TerminalLinkActivation, TerminalLinkOptions, TerminalLinkRule } from \"./link-types.js\";\n\nexport const LINK_LIMITS = Object.freeze({\n rules: 32, pattern: 8192, chunk: 65536, totalText: 262144, cells: 262144,\n matches: 2048, resultText: 262144, cacheEntries: 2048, cacheText: 1048576, timeoutMs: 250,\n});\n\nexport function validateLinkAction(action: unknown, actions: ReadonlySet<string>): asserts action is TerminalLinkAction {\n if (typeof action !== \"function\" && !(typeof action === \"string\" && actions.has(action))) {\n throw new TypeError(\"Link action must be a registered custom action or callback\");\n }\n}\n\nfunction object(value: unknown): boolean {\n return value !== null && typeof value === \"object\" && !Array.isArray(value);\n}\n\nexport function normalizeLinks(options: false | TerminalLinkOptions | undefined,\n actions: ReadonlySet<string>): false | TerminalLinkOptions {\n if (options === false) return false;\n if (options === undefined) return {};\n if (!object(options)) throw new TypeError(\"Invalid links configuration\");\n const normalized: TerminalLinkOptions = {};\n if (options.osc8 === false) normalized.osc8 = false;\n else if (options.osc8 !== undefined) {\n if (!object(options.osc8)) throw new TypeError(\"Invalid OSC 8 configuration\");\n validateLinkAction(options.osc8.action, actions);\n normalized.osc8 = { action: options.osc8.action };\n }\n const detection = options.detection;\n if (detection === false) normalized.detection = false;\n else if (detection !== undefined) {\n if (!object(detection) || !Array.isArray(detection.rules)) throw new TypeError(\"Invalid detection configuration\");\n if (detection.rules.length > LINK_LIMITS.rules) throw new TypeError(\"Too many link rules\");\n if (detection.activation !== undefined && ![\"modifierClick\", \"click\"].includes(detection.activation)) {\n throw new TypeError(\"Invalid link activation\");\n }\n if (detection.decoration !== undefined && ![\"always\", \"hover\", \"none\"].includes(detection.decoration)) {\n throw new TypeError(\"Invalid link decoration\");\n }\n if (detection.underlineStyle !== undefined && ![\"solid\", \"dashed\"].includes(detection.underlineStyle)) {\n throw new TypeError(\"Invalid link underline style\");\n }\n const ids = new Set<string>();\n const rules = detection.rules.map((rule: TerminalLinkRule): TerminalLinkRule => {\n if (!object(rule) || typeof rule.id !== \"string\" || !rule.id.length || rule.id.length > 256 || ids.has(rule.id)) {\n throw new TypeError(\"Link rule IDs must be nonempty and unique\");\n }\n ids.add(rule.id);\n if (rule.enabled !== undefined && typeof rule.enabled !== \"boolean\") throw new TypeError(\"Invalid enabled flag\");\n if (rule.text !== undefined && ![\"physicalRow\", \"logicalLine\", \"viewport\"].includes(rule.text)) {\n throw new TypeError(\"Invalid link text mode\");\n }\n if (rule.resolve !== undefined && typeof rule.resolve !== \"function\") throw new TypeError(\"Invalid resolver\");\n validateLinkAction(rule.action, actions);\n const common = { id: rule.id, action: rule.action, enabled: rule.enabled ?? true,\n text: rule.text ?? \"logicalLine\", resolve: rule.resolve };\n if (rule.builtin !== undefined) {\n if (![\"url\", \"uri\", \"absolutePath\", \"homePath\"].includes(rule.builtin) ||\n rule.pattern !== undefined || rule.kind !== undefined) throw new TypeError(\"Invalid builtin rule\");\n return { ...common, builtin: rule.builtin };\n }\n if (!(rule.pattern instanceof RegExp) || ![\"uri\", \"path\", \"custom\"].includes(rule.kind)) {\n throw new TypeError(\"Custom rules require a RegExp and kind\");\n }\n if (rule.pattern.source.length > LINK_LIMITS.pattern || /[^dgimsuv]/u.test(rule.pattern.flags)) {\n throw new TypeError(\"Unsupported regex flags or oversized pattern (sticky is not supported)\");\n }\n return { ...common, kind: rule.kind, pattern: new RegExp(rule.pattern.source, rule.pattern.flags) };\n });\n normalized.detection = { rules, activation: detection.activation ?? \"modifierClick\",\n decoration: detection.decoration ?? \"always\", underlineStyle: detection.underlineStyle ?? \"solid\" };\n }\n return normalized;\n}\n\nexport function isLinkActivation(input: unknown): input is TerminalLinkActivation {\n if (!object(input)) return false;\n const value = input as Record<string, unknown>;\n if (![\"detected\", \"osc8\"].includes(value.source as string) ||\n ![\"uri\", \"path\", \"custom\"].includes(value.kind as string) ||\n typeof value.text !== \"string\" || typeof value.target !== \"string\" ||\n !Number.isSafeInteger(value.revision) || (value.revision as number) < 0 ||\n !Array.isArray(value.ranges) || value.ranges.length === 0) return false;\n if (value.source === \"osc8\" ? value.ruleId !== null || value.kind !== \"uri\"\n : typeof value.ruleId !== \"string\" || value.ruleId.length === 0) return false;\n return value.ranges.every(range => object(range) &&\n Number.isSafeInteger(range.row) && (range.row as number) >= 0 &&\n Number.isSafeInteger(range.startColumn) && (range.startColumn as number) >= 0 &&\n Number.isSafeInteger(range.endColumn) && (range.endColumn as number) > (range.startColumn as number));\n}\n\nexport function linkAction(handler: (context: TerminalInputContext, link: TerminalLinkActivation,\n input: Readonly<TerminalInput> | undefined) => unknown): InputActionHandler {\n if (typeof handler !== \"function\") throw new TypeError(\"Expected a link action callback\");\n return (context, args, input) => {\n if (!isLinkActivation(args)) throw new TypeError(\"Expected a terminal link activation\");\n return handler(context, args, input);\n };\n}\n", "import type { TerminalLinkRule } from \"./link-types.js\";\n\nexport interface LinkScanRequest {\n id: number;\n rule: { source: string; flags: string } | { builtin: NonNullable<TerminalLinkRule[\"builtin\"]> };\n chunks: { key: string; text: string }[];\n}\nexport interface LinkScanMatch {\n index: number; text: string; captures: (string | undefined)[];\n groups: Record<string, string | undefined>;\n}\nexport function linkMatchTextSize(match: LinkScanMatch): number {\n // Include entry overhead so empty capture groups cannot evade the payload budget.\n let size = match.text.length + 16;\n for (const capture of match.captures) size += 8 + (capture?.length ?? 0);\n for (const [name, group] of Object.entries(match.groups)) size += 8 + name.length + (group?.length ?? 0);\n return size;\n}\nexport interface LinkScanResponse {\n id: number;\n results?: { key: string; matches: LinkScanMatch[] }[];\n error?: \"limit\" | \"worker\";\n message?: string;\n}\n", "export const QUAD_STRIDE = 16;\n\nexport type RenderColor = [number, number, number, number];\nexport type RenderPixels = Uint8Array<ArrayBuffer> | Uint8ClampedArray<ArrayBuffer>;\n\nexport interface RenderTexture {\n readonly width: number;\n readonly height: number;\n writePixels(pixels: RenderPixels, width: number, height: number, x?: number, y?: number): void;\n writeBitmap(bitmap: ImageBitmap): void;\n destroy(): void;\n}\n\nexport interface RenderBatch { resource: RenderTexture; start: number; count: number }\n\n/** Internal graphics boundary; layout, rasterization and ordering belong to TerminalRenderer. */\nexport interface RenderBackend {\n readonly kind: \"webgpu\" | \"webgl2\";\n readonly maxTextureDimension2D: number;\n readonly maxCanvasDimension2D: number;\n readonly instanceBufferBytes: number;\n createTexture(width: number, height: number, label: string): RenderTexture;\n resize(width: number, height: number): void;\n submit(instances: Float32Array<ArrayBuffer>, quadCount: number, batches: readonly RenderBatch[],\n background: RenderColor): void;\n idle(): Promise<void>;\n dispose(): void;\n}\n\n/** Only capability/device acquisition failures may trigger automatic backend fallback. */\nexport class RendererUnavailableError extends Error {}\n", "import { QUAD_STRIDE, RendererUnavailableError } from \"./render-backend.js\";\nimport type { RenderBackend, RenderBatch, RenderColor, RenderPixels, RenderTexture } from \"./render-backend.js\";\n\n// The DOM library declares WebGPU interfaces but omits these runtime constants.\ndeclare const GPUBufferUsage: {\n readonly COPY_DST: number;\n readonly UNIFORM: number;\n readonly VERTEX: number;\n};\ndeclare const GPUTextureUsage: {\n readonly COPY_DST: number;\n readonly TEXTURE_BINDING: number;\n readonly RENDER_ATTACHMENT: number;\n};\n\nconst shader = /* wgsl */ `\nstruct Viewport { size: vec2f, padding: vec2f }\n@group(0) @binding(0) var<uniform> viewport: Viewport;\n@group(0) @binding(1) var image: texture_2d<f32>;\n@group(0) @binding(2) var imageSampler: sampler;\n\nstruct VertexOut {\n @builtin(position) position: vec4f,\n @location(0) uv: vec2f,\n @location(1) color: vec4f,\n @location(2) @interpolate(flat) mode: f32,\n}\n\n@vertex fn vertex(\n @builtin(vertex_index) index: u32,\n @location(0) rect: vec4f,\n @location(1) uvRect: vec4f,\n @location(2) color: vec4f,\n @location(3) mode: f32,\n) -> VertexOut {\n let corners = array<vec2f, 6>(\n vec2f(0, 0), vec2f(1, 0), vec2f(0, 1),\n vec2f(0, 1), vec2f(1, 0), vec2f(1, 1)\n );\n let corner = corners[index];\n let position = rect.xy + corner * rect.zw;\n var out: VertexOut;\n out.position = vec4f(position / viewport.size * vec2f(2, -2) + vec2f(-1, 1), 0, 1);\n out.uv = mix(uvRect.xy, uvRect.zw, corner);\n out.color = color;\n out.mode = mode;\n return out;\n}\n\n@fragment fn fragment(in: VertexOut) -> @location(0) vec4f {\n // Explicit LOD avoids derivative-uniformity requirements across solid/mask/image batches.\n let texel = textureSampleLevel(image, imageSampler, in.uv, 0);\n if (in.mode < 0.5) { return in.color; }\n if (in.mode < 1.5) { return vec4f(in.color.rgb, in.color.a * texel.a); }\n return texel * in.color;\n}`;\n\nclass WebGpuTexture implements RenderTexture {\n constructor(readonly device: GPUDevice, readonly texture: GPUTexture, readonly bindGroup: GPUBindGroup,\n readonly width: number, readonly height: number) {}\n\n writePixels(pixels: RenderPixels, width: number, height: number, x = 0, y = 0): void {\n this.device.queue.writeTexture({ texture: this.texture, origin: [x, y] }, pixels,\n { bytesPerRow: width * 4, rowsPerImage: height }, [width, height]);\n }\n\n writeBitmap(bitmap: ImageBitmap): void {\n this.device.queue.copyExternalImageToTexture({ source: bitmap },\n { texture: this.texture, premultipliedAlpha: false }, [this.width, this.height]);\n }\n\n destroy(): void { this.texture.destroy(); }\n}\n\nexport class WebGpuBackend implements RenderBackend {\n readonly kind = \"webgpu\";\n instanceBufferBytes = 0;\n instanceBuffer: GPUBuffer | undefined;\n disposed = false;\n context?: GPUCanvasContext;\n format: GPUTextureFormat;\n uniform: GPUBuffer;\n sampler: GPUSampler;\n pipeline?: GPURenderPipeline;\n\n static async create(canvas: OffscreenCanvas, onFatal: (error: Error) => void): Promise<WebGpuBackend> {\n if (!globalThis.isSecureContext) throw new RendererUnavailableError(\"WebGPU requires HTTPS or localhost\");\n if (!navigator.gpu) throw new RendererUnavailableError(\"WebGPU is unavailable in this browser worker\");\n const adapter = await navigator.gpu.requestAdapter();\n if (!adapter) throw new RendererUnavailableError(\"No WebGPU adapter is available\");\n let device: GPUDevice;\n try {\n device = await adapter.requestDevice();\n } catch (error) {\n if (error instanceof DOMException && error.name === \"OperationError\") {\n throw new RendererUnavailableError(`Could not acquire a WebGPU device: ${error.message}`, { cause: error });\n }\n throw error;\n }\n let backend: WebGpuBackend | undefined;\n try {\n backend = new WebGpuBackend(device);\n const active = backend;\n device.lost.then(info => {\n if (!active.disposed) onFatal(new Error(`WebGPU device lost: ${info.message || info.reason}`));\n });\n device.addEventListener(\"uncapturederror\", event => {\n if (!active.disposed) onFatal(new Error(`WebGPU error: ${event.error.message}`));\n });\n await backend.initialize(canvas);\n return backend;\n } catch (error) {\n if (backend) backend.dispose();\n else device.destroy();\n throw error;\n }\n }\n\n constructor(readonly device: GPUDevice) {\n this.format = navigator.gpu.getPreferredCanvasFormat();\n this.uniform = device.createBuffer({ size: 16, usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST });\n this.sampler = device.createSampler({ minFilter: \"linear\", magFilter: \"linear\" });\n }\n\n get maxTextureDimension2D(): number { return this.device.limits.maxTextureDimension2D; }\n get maxCanvasDimension2D(): number { return this.maxTextureDimension2D; }\n\n async initialize(canvas: OffscreenCanvas): Promise<void> {\n const module = this.device.createShaderModule({ code: shader });\n this.pipeline = await this.device.createRenderPipelineAsync({\n layout: \"auto\",\n vertex: {\n module,\n entryPoint: \"vertex\",\n buffers: [{\n arrayStride: QUAD_STRIDE * 4,\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 { shaderLocation: 3, offset: 48, format: \"float32\" },\n ],\n }],\n },\n fragment: {\n module,\n entryPoint: \"fragment\",\n targets: [{\n format: this.format,\n blend: {\n color: { srcFactor: \"src-alpha\", dstFactor: \"one-minus-src-alpha\" },\n alpha: { srcFactor: \"one\", dstFactor: \"one-minus-src-alpha\" },\n },\n }],\n },\n primitive: { topology: \"triangle-list\" },\n });\n // Acquire the presentation surface last. A null context leaves it usable by WebGL2.\n const context = canvas.getContext(\"webgpu\");\n if (!context || !(\"configure\" in context)) {\n throw new RendererUnavailableError(\"Could not create an OffscreenCanvas WebGPU context\");\n }\n this.context = context;\n context.configure({ device: this.device, format: this.format, alphaMode: \"opaque\" });\n }\n\n createTexture(width: number, height: number, label: string): RenderTexture {\n if (width > this.maxTextureDimension2D || height > this.maxTextureDimension2D) {\n throw new Error(`${label} exceeds the GPU texture dimension limit`);\n }\n if (!this.pipeline) throw new Error(\"WebGPU backend is not initialized\");\n const texture = this.device.createTexture({\n label, size: [width, height], format: \"rgba8unorm\",\n usage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST | GPUTextureUsage.RENDER_ATTACHMENT,\n });\n try {\n const bindGroup = this.device.createBindGroup({\n layout: this.pipeline.getBindGroupLayout(0),\n entries: [\n { binding: 0, resource: { buffer: this.uniform } },\n { binding: 1, resource: texture.createView() },\n { binding: 2, resource: this.sampler },\n ],\n });\n return new WebGpuTexture(this.device, texture, bindGroup, width, height);\n } catch (error) {\n texture.destroy();\n throw error;\n }\n }\n\n resize(width: number, height: number): void {\n this.device.queue.writeBuffer(this.uniform, 0, new Float32Array([width, height, 0, 0]));\n }\n\n submit(instances: Float32Array<ArrayBuffer>, quadCount: number, batches: readonly RenderBatch[],\n background: RenderColor): void {\n if (this.disposed || !this.context || !this.pipeline) throw new Error(\"WebGPU backend is not initialized\");\n const usedBytes = quadCount * QUAD_STRIDE * 4;\n if (!this.instanceBuffer || usedBytes > this.instanceBufferBytes) {\n this.instanceBuffer?.destroy();\n this.instanceBufferBytes = Math.max(256, instances.byteLength);\n this.instanceBuffer = this.device.createBuffer({\n size: this.instanceBufferBytes, usage: GPUBufferUsage.VERTEX | GPUBufferUsage.COPY_DST,\n });\n }\n if (usedBytes) this.device.queue.writeBuffer(this.instanceBuffer, 0, instances, 0, quadCount * QUAD_STRIDE);\n const encoder = this.device.createCommandEncoder();\n const pass = encoder.beginRenderPass({\n colorAttachments: [{\n view: this.context.getCurrentTexture().createView(),\n clearValue: { r: background[0], g: background[1], b: background[2], a: 1 },\n loadOp: \"clear\", storeOp: \"store\",\n }],\n });\n pass.setPipeline(this.pipeline);\n pass.setVertexBuffer(0, this.instanceBuffer);\n for (const batch of batches) {\n if (!(batch.resource instanceof WebGpuTexture)) throw new Error(\"Texture belongs to a different rendering backend\");\n pass.setBindGroup(0, batch.resource.bindGroup);\n pass.draw(6, batch.count, 0, batch.start);\n }\n pass.end();\n this.device.queue.submit([encoder.finish()]);\n }\n\n async idle(): Promise<void> { await this.device.queue.onSubmittedWorkDone(); }\n\n dispose(): void {\n if (this.disposed) return;\n this.disposed = true;\n this.instanceBuffer?.destroy();\n this.uniform.destroy();\n this.context?.unconfigure();\n this.device.destroy();\n }\n}\n", "import { QUAD_STRIDE, RendererUnavailableError } from \"./render-backend.js\";\nimport type { RenderBackend, RenderBatch, RenderColor, RenderPixels, RenderTexture } from \"./render-backend.js\";\n\nconst vertexShader = /* glsl */ `#version 300 es\nprecision highp float;\nprecision highp int;\n\nlayout(location = 0) in vec4 rect;\nlayout(location = 1) in vec4 uvRect;\nlayout(location = 2) in vec4 color;\nlayout(location = 3) in float mode;\nuniform vec2 viewport;\nout vec2 fragmentUv;\nout vec4 fragmentTint;\nflat out float fragmentMode;\n\nvoid main() {\n const vec2 corners[6] = vec2[6](\n vec2(0, 0), vec2(1, 0), vec2(0, 1),\n vec2(0, 1), vec2(1, 0), vec2(1, 1)\n );\n vec2 corner = corners[gl_VertexID];\n vec2 position = rect.xy + corner * rect.zw;\n gl_Position = vec4(position / viewport * vec2(2, -2) + vec2(-1, 1), 0, 1);\n fragmentUv = mix(uvRect.xy, uvRect.zw, corner);\n fragmentTint = color;\n fragmentMode = mode;\n}`;\n\nconst fragmentShader = /* glsl */ `#version 300 es\nprecision highp float;\nprecision highp int;\n\nuniform highp sampler2D image;\nin vec2 fragmentUv;\nin vec4 fragmentTint;\nflat in float fragmentMode;\nout vec4 fragmentColor;\n\nvoid main() {\n vec4 texel = textureLod(image, fragmentUv, 0.0);\n if (fragmentMode < 0.5) {\n fragmentColor = fragmentTint;\n } else if (fragmentMode < 1.5) {\n fragmentColor = vec4(fragmentTint.rgb, fragmentTint.a * texel.a);\n } else {\n fragmentColor = texel * fragmentTint;\n }\n}`;\n\nfunction errorFrom(value: unknown): Error {\n return value instanceof Error ? value : new Error(String(value));\n}\n\nfunction positiveInteger(value: number): boolean {\n return Number.isSafeInteger(value) && value > 0;\n}\n\nfunction prepareUpload(gl: WebGL2RenderingContext): void {\n gl.pixelStorei(gl.UNPACK_ALIGNMENT, 1);\n gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, false);\n gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, false);\n gl.pixelStorei(gl.UNPACK_COLORSPACE_CONVERSION_WEBGL, gl.NONE);\n gl.pixelStorei(gl.UNPACK_ROW_LENGTH, 0);\n gl.pixelStorei(gl.UNPACK_SKIP_PIXELS, 0);\n gl.pixelStorei(gl.UNPACK_SKIP_ROWS, 0);\n}\n\nclass WebGl2Texture implements RenderTexture {\n destroyed = false;\n\n constructor(readonly owner: WebGl2Backend, private readonly gl: WebGL2RenderingContext,\n readonly texture: WebGLTexture, readonly width: number, readonly height: number,\n private readonly assertActive: () => void, private readonly release: (texture: WebGl2Texture) => void) {}\n\n private bind(): void {\n this.assertActive();\n if (this.destroyed) throw new Error(\"WebGL2 texture is destroyed\");\n this.gl.bindTexture(this.gl.TEXTURE_2D, this.texture);\n prepareUpload(this.gl);\n }\n\n writePixels(pixels: RenderPixels, width: number, height: number, x = 0, y = 0): void {\n if (!positiveInteger(width) || !positiveInteger(height) ||\n !Number.isSafeInteger(x) || !Number.isSafeInteger(y) || x < 0 || y < 0 ||\n x + width > this.width || y + height > this.height || pixels.byteLength < width * height * 4) {\n throw new Error(\"Invalid WebGL2 texture upload dimensions or pixel data\");\n }\n this.bind();\n this.gl.texSubImage2D(this.gl.TEXTURE_2D, 0, x, y, width, height,\n this.gl.RGBA, this.gl.UNSIGNED_BYTE, pixels);\n }\n\n writeBitmap(bitmap: ImageBitmap): void {\n if (bitmap.width !== this.width || bitmap.height !== this.height) {\n throw new Error(\"WebGL2 bitmap dimensions do not match the texture\");\n }\n this.bind();\n // ImageBitmap ignores unpack conversion flags; the shared decoder supplies straight-alpha,\n // unconverted, top-down bitmaps. Raw RGBA uploads use the explicit unpack state above.\n this.gl.texSubImage2D(this.gl.TEXTURE_2D, 0, 0, 0, this.gl.RGBA, this.gl.UNSIGNED_BYTE, bitmap);\n }\n\n destroy(): void {\n if (this.destroyed) return;\n this.destroyed = true;\n this.release(this);\n this.gl.deleteTexture(this.texture);\n }\n}\n\ninterface PendingFence {\n sync: WebGLSync;\n timer?: ReturnType<typeof setTimeout>;\n resolve: () => void;\n reject: (error: Error) => void;\n}\n\nexport class WebGl2Backend implements RenderBackend {\n readonly kind = \"webgl2\";\n private textureLimit = 0;\n private canvasLimit = 0;\n private bufferBytes = 0;\n private disposed = false;\n private lostError?: Error;\n private program?: WebGLProgram;\n private instanceBuffer?: WebGLBuffer;\n private vertexArray?: WebGLVertexArrayObject;\n private viewport?: WebGLUniformLocation;\n private readonly shaders = new Set<WebGLShader>();\n private readonly textures = new Set<WebGl2Texture>();\n private readonly fences = new Set<PendingFence>();\n private readonly onContextLost = (event: Event): void => {\n const message = (event as WebGLContextEvent).statusMessage;\n this.contextLost(new Error(`WebGL2 context lost${message ? `: ${message}` : \"\"}`));\n };\n\n static async create(canvas: OffscreenCanvas, onFatal: (error: Error) => void): Promise<WebGl2Backend> {\n const gl = canvas.getContext(\"webgl2\", {\n alpha: false,\n antialias: false,\n depth: false,\n stencil: false,\n premultipliedAlpha: false,\n preserveDrawingBuffer: false,\n });\n if (!gl) throw new RendererUnavailableError(\"Could not create an OffscreenCanvas WebGL2 context\");\n const backend = new WebGl2Backend(canvas, gl, onFatal);\n try {\n backend.initialize();\n return backend;\n } catch (error) {\n backend.dispose();\n throw error;\n }\n }\n\n private constructor(private readonly canvas: OffscreenCanvas, readonly gl: WebGL2RenderingContext,\n private readonly onFatal: (error: Error) => void) {}\n\n get maxTextureDimension2D(): number { return this.textureLimit; }\n get maxCanvasDimension2D(): number { return this.canvasLimit; }\n get instanceBufferBytes(): number { return this.bufferBytes; }\n\n private initialize(): void {\n const gl = this.gl;\n this.canvas.addEventListener(\"webglcontextlost\", this.onContextLost);\n this.checkErrors(\"initialization\");\n this.textureLimit = gl.getParameter(gl.MAX_TEXTURE_SIZE);\n const viewportLimit = gl.getParameter(gl.MAX_VIEWPORT_DIMS) as Int32Array;\n this.canvasLimit = Math.min(this.textureLimit, gl.getParameter(gl.MAX_RENDERBUFFER_SIZE),\n viewportLimit[0], viewportLimit[1]);\n if (!positiveInteger(this.textureLimit) || !positiveInteger(this.canvasLimit)) {\n throw new Error(\"Invalid WebGL2 texture or viewport limits\");\n }\n\n const vertex = this.compile(gl.VERTEX_SHADER, vertexShader);\n const fragment = this.compile(gl.FRAGMENT_SHADER, fragmentShader);\n const program = gl.createProgram();\n if (!program) throw new Error(\"Could not allocate a WebGL2 shader program\");\n this.program = program;\n gl.attachShader(program, vertex);\n gl.attachShader(program, fragment);\n gl.linkProgram(program);\n if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {\n throw new Error(`WebGL2 shader link failed: ${gl.getProgramInfoLog(program) || \"No diagnostic available\"}`);\n }\n for (const shader of this.shaders) {\n gl.detachShader(program, shader);\n gl.deleteShader(shader);\n }\n this.shaders.clear();\n const viewport = gl.getUniformLocation(program, \"viewport\");\n const image = gl.getUniformLocation(program, \"image\");\n if (viewport === null || image === null) throw new Error(\"WebGL2 shader uniforms are unavailable\");\n this.viewport = viewport;\n const buffer = gl.createBuffer();\n if (!buffer) throw new Error(\"Could not allocate a WebGL2 instance buffer\");\n this.instanceBuffer = buffer;\n const vertexArray = gl.createVertexArray();\n if (!vertexArray) throw new Error(\"Could not allocate a WebGL2 vertex array\");\n this.vertexArray = vertexArray;\n\n gl.useProgram(program);\n gl.uniform1i(image, 0);\n gl.activeTexture(gl.TEXTURE0);\n gl.bindVertexArray(vertexArray);\n gl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n for (let attribute = 0; attribute < 4; attribute++) {\n gl.enableVertexAttribArray(attribute);\n gl.vertexAttribDivisor(attribute, 1);\n }\n gl.enable(gl.BLEND);\n gl.blendEquationSeparate(gl.FUNC_ADD, gl.FUNC_ADD);\n gl.blendFuncSeparate(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA);\n gl.disable(gl.DEPTH_TEST);\n gl.disable(gl.STENCIL_TEST);\n gl.disable(gl.CULL_FACE);\n gl.disable(gl.SCISSOR_TEST);\n gl.disable(gl.DITHER);\n this.resize(this.canvas.width, this.canvas.height);\n }\n\n private compile(type: number, source: string): WebGLShader {\n const gl = this.gl;\n const shader = gl.createShader(type);\n if (!shader) throw new Error(\"Could not allocate a WebGL2 shader\");\n this.shaders.add(shader);\n gl.shaderSource(shader, source);\n gl.compileShader(shader);\n if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {\n throw new Error(`WebGL2 shader compilation failed: ${gl.getShaderInfoLog(shader) || \"No diagnostic available\"}`);\n }\n return shader;\n }\n\n private assertActive(): void {\n if (this.disposed) throw new Error(\"WebGL2 backend is disposed\");\n if (this.lostError) throw this.lostError;\n }\n\n private contextLost(error: Error): void {\n if (this.disposed || this.lostError) return;\n this.lostError = error;\n for (const fence of this.fences) this.settleFence(fence, error);\n this.onFatal(error);\n }\n\n private checkErrors(operation: string): void {\n this.assertActive();\n const gl = this.gl;\n const code = gl.getError();\n if (code === gl.CONTEXT_LOST_WEBGL || gl.isContextLost()) {\n const error = new Error(\"WebGL2 context lost\");\n this.contextLost(error);\n throw error;\n }\n if (code !== gl.NO_ERROR) {\n const name = code === gl.OUT_OF_MEMORY ? \"OUT_OF_MEMORY\" :\n code === gl.INVALID_ENUM ? \"INVALID_ENUM\" :\n code === gl.INVALID_VALUE ? \"INVALID_VALUE\" :\n code === gl.INVALID_OPERATION ? \"INVALID_OPERATION\" :\n code === gl.INVALID_FRAMEBUFFER_OPERATION ? \"INVALID_FRAMEBUFFER_OPERATION\" : `0x${code.toString(16)}`;\n throw new Error(`WebGL2 ${operation} failed: ${name}`);\n }\n }\n\n createTexture(width: number, height: number, label: string): RenderTexture {\n this.assertActive();\n if (!positiveInteger(width) || !positiveInteger(height) ||\n width > this.textureLimit || height > this.textureLimit) {\n throw new Error(`${label} has invalid dimensions or exceeds the WebGL2 texture dimension limit`);\n }\n const gl = this.gl;\n const texture = gl.createTexture();\n if (!texture) {\n this.checkErrors(\"texture allocation\");\n throw new Error(`Could not allocate WebGL2 texture: ${label}`);\n }\n try {\n gl.bindTexture(gl.TEXTURE_2D, texture);\n prepareUpload(gl);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n // WebGL guarantees zero initialization for null data, including untouched atlas padding.\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA8, width, height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);\n this.checkErrors(`texture allocation (${label})`);\n const resource = new WebGl2Texture(this, gl, texture, width, height,\n () => this.assertActive(), resource => this.textures.delete(resource));\n this.textures.add(resource);\n return resource;\n } catch (error) {\n gl.deleteTexture(texture);\n throw error;\n }\n }\n\n resize(width: number, height: number): void {\n this.assertActive();\n if (!Number.isFinite(width) || !Number.isFinite(height) || width <= 0 || height <= 0) {\n throw new Error(\"Invalid WebGL2 logical viewport dimensions\");\n }\n if (!positiveInteger(this.canvas.width) || !positiveInteger(this.canvas.height) ||\n this.canvas.width > this.canvasLimit || this.canvas.height > this.canvasLimit) {\n throw new Error(\"Canvas exceeds the WebGL2 drawing buffer dimension limit\");\n }\n const gl = this.gl;\n if (gl.drawingBufferWidth !== this.canvas.width || gl.drawingBufferHeight !== this.canvas.height) {\n this.checkErrors(\"drawing buffer resize\");\n throw new Error(\"WebGL2 could not allocate the requested canvas drawing buffer\");\n }\n gl.viewport(0, 0, this.canvas.width, this.canvas.height);\n gl.useProgram(this.program!);\n gl.uniform2f(this.viewport!, width, height);\n this.checkErrors(\"resize\");\n }\n\n submit(instances: Float32Array<ArrayBuffer>, quadCount: number, batches: readonly RenderBatch[],\n background: RenderColor): void {\n this.assertActive();\n if (!Number.isSafeInteger(quadCount) || quadCount < 0 || quadCount * QUAD_STRIDE > instances.length) {\n throw new Error(\"Invalid WebGL2 instance data\");\n }\n for (const batch of batches) {\n if (!(batch.resource instanceof WebGl2Texture) || batch.resource.owner !== this) {\n throw new Error(\"Texture belongs to a different rendering backend\");\n }\n if (batch.resource.destroyed) throw new Error(\"WebGL2 texture is destroyed\");\n if (!Number.isSafeInteger(batch.start) || !Number.isSafeInteger(batch.count) ||\n batch.start < 0 || batch.count < 0 || batch.start + batch.count > quadCount) {\n throw new Error(\"Invalid WebGL2 batch instance range\");\n }\n }\n const gl = this.gl;\n const strideBytes = QUAD_STRIDE * Float32Array.BYTES_PER_ELEMENT;\n const usedBytes = quadCount * strideBytes;\n gl.bindVertexArray(this.vertexArray!);\n gl.bindBuffer(gl.ARRAY_BUFFER, this.instanceBuffer!);\n if (!this.bufferBytes || usedBytes > this.bufferBytes) {\n const bytes = Math.max(256, instances.byteLength);\n gl.bufferData(gl.ARRAY_BUFFER, bytes, gl.DYNAMIC_DRAW);\n this.checkErrors(\"instance buffer allocation\");\n this.bufferBytes = bytes;\n }\n if (usedBytes) gl.bufferSubData(gl.ARRAY_BUFFER, 0, instances, 0, quadCount * QUAD_STRIDE);\n gl.useProgram(this.program!);\n gl.activeTexture(gl.TEXTURE0);\n gl.clearColor(background[0], background[1], background[2], 1);\n gl.clear(gl.COLOR_BUFFER_BIT);\n for (const batch of batches) {\n if (!batch.count) continue;\n const resource = batch.resource as WebGl2Texture;\n gl.bindTexture(gl.TEXTURE_2D, resource.texture);\n // WebGL2 has no baseInstance; rebase all per-instance attributes for each ordered batch.\n const offset = batch.start * strideBytes;\n gl.vertexAttribPointer(0, 4, gl.FLOAT, false, strideBytes, offset);\n gl.vertexAttribPointer(1, 4, gl.FLOAT, false, strideBytes, offset + 16);\n gl.vertexAttribPointer(2, 4, gl.FLOAT, false, strideBytes, offset + 32);\n gl.vertexAttribPointer(3, 1, gl.FLOAT, false, strideBytes, offset + 48);\n gl.drawArraysInstanced(gl.TRIANGLES, 0, 6, batch.count);\n }\n // Upload errors are checked once per submission, not once per glyph.\n this.checkErrors(\"frame submission\");\n }\n\n async idle(): Promise<void> {\n this.checkErrors(\"GPU completion\");\n const gl = this.gl;\n const sync = gl.fenceSync(gl.SYNC_GPU_COMMANDS_COMPLETE, 0);\n if (!sync) {\n this.checkErrors(\"GPU fence allocation\");\n throw new Error(\"Could not allocate a WebGL2 GPU fence\");\n }\n return new Promise<void>((resolve, reject) => {\n const fence: PendingFence = { sync, resolve, reject };\n this.fences.add(fence);\n try {\n gl.flush();\n this.checkErrors(\"GPU fence submission\");\n this.pollFence(fence);\n } catch (error) {\n this.settleFence(fence, errorFrom(error));\n }\n });\n }\n\n private pollFence(fence: PendingFence): void {\n if (!this.fences.has(fence)) return;\n try {\n this.assertActive();\n const gl = this.gl;\n if (gl.isContextLost()) {\n const error = new Error(\"WebGL2 context lost\");\n this.contextLost(error);\n throw error;\n }\n const status = gl.clientWaitSync(fence.sync, 0, 0);\n if (status === gl.ALREADY_SIGNALED || status === gl.CONDITION_SATISFIED) {\n this.checkErrors(\"GPU completion\");\n this.settleFence(fence);\n } else if (status === gl.TIMEOUT_EXPIRED) {\n fence.timer = setTimeout(() => {\n fence.timer = undefined;\n this.pollFence(fence);\n }, 0);\n } else {\n this.checkErrors(\"GPU fence wait\");\n throw new Error(\"WebGL2 GPU fence wait failed\");\n }\n } catch (error) {\n this.settleFence(fence, errorFrom(error));\n }\n }\n\n private settleFence(fence: PendingFence, error?: Error): void {\n if (!this.fences.delete(fence)) return;\n if (fence.timer !== undefined) clearTimeout(fence.timer);\n this.gl.deleteSync(fence.sync);\n if (error) fence.reject(error);\n else fence.resolve();\n }\n\n dispose(): void {\n if (this.disposed) return;\n this.disposed = true;\n this.canvas.removeEventListener(\"webglcontextlost\", this.onContextLost);\n for (const fence of this.fences) this.settleFence(fence, new Error(\"WebGL2 backend is disposed\"));\n for (const texture of this.textures) texture.destroy();\n const gl = this.gl;\n if (this.instanceBuffer) gl.deleteBuffer(this.instanceBuffer);\n if (this.vertexArray) gl.deleteVertexArray(this.vertexArray);\n if (this.program) gl.deleteProgram(this.program);\n for (const shader of this.shaders) gl.deleteShader(shader);\n this.shaders.clear();\n this.instanceBuffer = undefined;\n this.vertexArray = undefined;\n this.program = undefined;\n this.bufferBytes = 0;\n if (!gl.isContextLost()) gl.getExtension(\"WEBGL_lose_context\")?.loseContext();\n }\n}\n", "import { RendererUnavailableError } from \"./render-backend.js\";\nimport type { RenderBackend } from \"./render-backend.js\";\nimport { normalizeRenderer } from \"./renderer-options.js\";\nimport { WebGpuBackend } from \"./webgpu-backend.js\";\nimport { WebGl2Backend } from \"./webgl2-backend.js\";\nimport type { TerminalRendererPreference } from \"./types.js\";\n\nexport async function createRenderBackend(canvas: OffscreenCanvas, onFatal: (error: Error) => void,\n preference: TerminalRendererPreference = \"auto\"): Promise<{ backend: RenderBackend; fallbackReason?: string }> {\n const requested = normalizeRenderer(preference);\n if (requested === \"webgl2\") return { backend: await WebGl2Backend.create(canvas, onFatal) };\n try {\n return { backend: await WebGpuBackend.create(canvas, onFatal) };\n } catch (error) {\n if (requested !== \"auto\" || !(error instanceof RendererUnavailableError)) throw error;\n try {\n return { backend: await WebGl2Backend.create(canvas, onFatal), fallbackReason: error.message };\n } catch (fallbackError) {\n throw new AggregateError([error, fallbackError],\n `WebGPU unavailable (${error.message}); WebGL2 initialization failed: ${\n fallbackError instanceof Error ? fallbackError.message : String(fallbackError)}`);\n }\n }\n}\n", "import { LIMITS } from \"./protocol.js\";\nimport { loadFont, measureFont, normalizeFont } from \"./terminal-font.js\";\nimport { createRenderBackend } from \"./backend-selection.js\";\nimport { QUAD_STRIDE } from \"./render-backend.js\";\nimport type { RenderBackend, RenderBatch, RenderColor, RenderTexture } from \"./render-backend.js\";\nimport type { FontMetrics, LoadedFont, NormalizedFont } from \"./terminal-font.js\";\nimport type { TerminalFont, TerminalRendererPreference, TerminalSize } from \"./types.js\";\nimport type { FrameImage, FrameMetadata, ImagePlacement, TerminalCell } from \"./wire-types.js\";\nimport { backgroundColor, compilePalette, defaultDarkPalette, foregroundColor, underlineColor } from \"./terminal-palette.js\";\nimport type { RenderPalette } from \"./terminal-palette.js\";\n\ntype Vector4 = RenderColor;\ntype TextureResource = RenderTexture;\ninterface Shelf { x: number; y: number; rowHeight: number }\ninterface GlyphPlacement { key: string; cell: TerminalCell; x: number; y: number; width: number; height: number }\ninterface Glyph { colored: boolean; u0: number; v0: number; u1: number; v1: number }\ntype Batch = RenderBatch;\n\nconst CELL_WIDTH = 10;\nconst CELL_HEIGHT = 20;\nconst MAX_QUADS = 1024 * 1024;\nconst MAX_GLYPHS = 16384;\nconst MAX_GLYPH_KEY_UNITS = 1024 * 1024;\nconst STRIDE = QUAD_STRIDE;\nconst WHITE: Vector4 = [1, 1, 1, 1];\nconst DEFAULT_PALETTE = compilePalette(defaultDarkPalette);\n\nfunction rgba(packed: number): Vector4 {\n return [\n (packed & 255) / 255,\n ((packed >>> 8) & 255) / 255,\n ((packed >>> 16) & 255) / 255,\n ((packed >>> 24) & 255) / 255,\n ];\n}\n\nfunction glyphKey(cell: TerminalCell): string {\n return `${cell.attributes & 5}/${cell.width}/${cell.text}`;\n}\n\nfunction isKgpPlaceholder(cell: TerminalCell): boolean {\n // The base scalar and following diacritics encode an image reference, not a glyph.\n // Keep the authoritative text and colors intact even when no image is placed.\n return cell.text.codePointAt(0) === 0x10eeee;\n}\n\n/** Shelf packer. Plans are computed before mutating the atlas used by a submitted frame. */\nfunction packGlyphs(glyphs: ReadonlyMap<string, TerminalCell>, size: number, scale: number,\n initial: Shelf = { x: 0, y: 0, rowHeight: 0 }): { placements: GlyphPlacement[]; shelf: Shelf } | null {\n let { x, y, rowHeight } = initial;\n const placements = [];\n for (const [key, cell] of glyphs) {\n const width = Math.ceil(cell.width * CELL_WIDTH * scale) + 4;\n const height = Math.ceil(CELL_HEIGHT * scale) + 4;\n if (width > size || height > size) return null;\n if (x + width > size) { x = 0; y += rowHeight; rowHeight = 0; }\n if (y + height > size) return null;\n placements.push({ key, cell, x, y, width, height });\n x += width;\n rowHeight = Math.max(rowHeight, height);\n }\n return { placements, shelf: { x, y, rowHeight } };\n}\n\n/** Shared instanced-quad preparation; Canvas2D rasterizes reusable glyphs for either backend. */\nexport class TerminalRenderer {\n canvas: OffscreenCanvas;\n scale: number;\n backingScale: number;\n backend: RenderBackend;\n fallbackReason?: string;\n fontConfiguration: NormalizedFont;\n fontMetrics: Map<number, FontMetrics>;\n images: Map<string, TextureResource>;\n glyphs: Map<string, Glyph>;\n imageUploadBytes: number;\n imagePayloadBytes: number;\n glyphUploadBytes: number;\n atlasRebuilds: number;\n textureBytes: number;\n instances: Float32Array<ArrayBuffer>;\n disposed: boolean;\n columns: number;\n rows: number;\n // Initialized by create() before the renderer can prepare or submit frames.\n font!: LoadedFont;\n rasterCanvas!: OffscreenCanvas;\n raster!: OffscreenCanvasRenderingContext2D;\n atlas!: TextureResource;\n glyphKeyUnits = 0;\n shelf: Shelf = { x: 0, y: 0, rowHeight: 0 };\n canvasLimited = false;\n width = 0;\n height = 0;\n quadCount = 0;\n batches: Batch[] = [];\n\n static async create(canvas: OffscreenCanvas, scale: number, onFatal: (error: Error) => void,\n font?: TerminalFont, preference: TerminalRendererPreference = \"auto\"): Promise<TerminalRenderer> {\n const normalizedFont = normalizeFont(font);\n if (!Number.isFinite(scale) || scale < 0.5 || scale > 3) throw new Error(\"Invalid backing scale\");\n const { backend, fallbackReason } = await createRenderBackend(canvas, onFatal, preference);\n const renderer = new TerminalRenderer(canvas, scale, backend, normalizedFont);\n renderer.fallbackReason = fallbackReason;\n try {\n await renderer.initialize();\n return renderer;\n } catch (error) {\n renderer.dispose();\n throw error;\n }\n }\n\n constructor(canvas: OffscreenCanvas, scale: number, backend: RenderBackend, font: NormalizedFont) {\n if (!Number.isFinite(scale) || scale < 0.5 || scale > 3) throw new Error(\"Invalid backing scale\");\n this.canvas = canvas;\n this.scale = scale;\n this.backingScale = scale;\n this.backend = backend;\n this.fontConfiguration = font;\n this.fontMetrics = new Map();\n this.images = new Map();\n this.glyphs = new Map();\n this.imageUploadBytes = 0;\n this.imagePayloadBytes = 0;\n this.glyphUploadBytes = 0;\n this.atlasRebuilds = 0;\n this.textureBytes = 0;\n this.instances = new Float32Array(4096 * STRIDE);\n this.disposed = false;\n this.columns = 0;\n this.rows = 0;\n }\n\n async initialize() {\n this.font = await loadFont(this.fontConfiguration);\n this.rasterCanvas = new OffscreenCanvas(1, 1);\n const raster = this.rasterCanvas.getContext(\"2d\", { willReadFrequently: true });\n if (!raster) throw new Error(\"Worker glyph rasterization is unavailable\");\n this.raster = raster;\n this.resetAtlas(Math.min(2048, this.backend.maxTextureDimension2D));\n }\n\n createTexture(width: number, height: number, label: string): TextureResource {\n return this.backend.createTexture(width, height, label);\n }\n\n resetAtlas(size: number): void {\n this.atlas?.destroy();\n this.atlas = this.createTexture(size, size, \"Glyph atlas\");\n this.glyphs.clear();\n this.glyphKeyUnits = 0;\n this.shelf = { x: 0, y: 0, rowHeight: 0 };\n }\n\n resize(columns: number, rows: number, viewport?: TerminalSize): void {\n const width = columns * CELL_WIDTH;\n const height = rows * CELL_HEIGHT;\n const limit = this.backend.maxCanvasDimension2D;\n const requested = Math.min(this.scale, viewport ? viewport.width / width : Infinity, viewport ? viewport.height / height : Infinity);\n this.canvasLimited = width * requested > limit || height * requested > limit;\n this.backingScale = Math.min(requested, limit / width, limit / height);\n const backingWidth = Math.max(1, Math.min(limit, Math.ceil(width * this.backingScale)));\n const backingHeight = Math.max(1, Math.min(limit, Math.ceil(height * this.backingScale)));\n if (this.columns === columns && this.rows === rows && this.canvas.width === backingWidth && this.canvas.height === backingHeight) return;\n this.columns = columns;\n this.rows = rows;\n this.width = width;\n this.height = height;\n this.canvas.width = backingWidth;\n this.canvas.height = backingHeight;\n this.backend.resize(width, height);\n }\n\n /** Call only between submissions. Missing/over-budget resources terminate the session. */\n async updateImages(incoming: readonly FrameImage[], retainedKeys: readonly string[]): Promise<void> {\n const retained = new Set(retainedKeys);\n const replacements = new Map(incoming.map(image => [image.key, image]));\n let projectedBytes = 0;\n for (const key of retained) {\n const image = replacements.get(key) || this.images.get(key);\n if (!image) throw new Error(`Missing retained image resource: ${key}`);\n projectedBytes += image.width * image.height * 4;\n }\n if (projectedBytes > LIMITS.textureBytes) throw new Error(\"Retained images exceed the 256 MiB texture budget\");\n for (const [key, image] of this.images) {\n if (!retained.has(key) || replacements.has(key)) {\n image.destroy();\n this.textureBytes -= image.width * image.height * 4;\n this.images.delete(key);\n }\n }\n for (const image of incoming) {\n const resource = this.createTexture(image.width, image.height, `Image ${image.key}`);\n try {\n if (image.format === \"rgba\") {\n resource.writePixels(image.bytes, image.width, image.height);\n } else {\n // Check IHDR before decoding so a tiny PNG cannot claim unbounded decoded dimensions.\n const png = new DataView(image.bytes.buffer, image.bytes.byteOffset, image.bytes.byteLength);\n if (png.byteLength < 33 || png.getUint32(0) !== 0x89504e47 || png.getUint32(4) !== 0x0d0a1a0a ||\n png.getUint32(8) !== 13 || png.getUint32(12) !== 0x49484452 ||\n png.getUint32(16) !== image.width || png.getUint32(20) !== image.height) {\n throw new Error(`PNG header dimensions do not match resource ${image.key}`);\n }\n const bitmap = await createImageBitmap(new Blob([image.bytes], { type: \"image/png\" }), {\n premultiplyAlpha: \"none\",\n colorSpaceConversion: \"none\",\n });\n try {\n if (bitmap.width !== image.width || bitmap.height !== image.height) throw new Error(\"Decoded PNG dimension mismatch\");\n resource.writeBitmap(bitmap);\n } finally {\n bitmap.close();\n }\n }\n this.images.set(image.key, resource);\n this.textureBytes += image.width * image.height * 4;\n this.imageUploadBytes += image.width * image.height * 4;\n this.imagePayloadBytes += image.byteLength;\n } catch (error) {\n resource.destroy();\n throw error;\n }\n }\n }\n\n prepareGlyphs(cells: readonly (TerminalCell | undefined)[]): void {\n const visible = new Map<string, TerminalCell>();\n for (const cell of cells) {\n if (!cell || !cell.width || !cell.text.trim() || (cell.attributes & 64) || isKgpPlaceholder(cell)) continue;\n visible.set(glyphKey(cell), cell);\n }\n const keyUnits = (glyphs: ReadonlyMap<string, TerminalCell>) => [...glyphs.keys()].reduce((total, key) => total + key.length, 0);\n if (visible.size > MAX_GLYPHS || keyUnits(visible) > MAX_GLYPH_KEY_UNITS) {\n throw new Error(\"Visible glyph metadata exceeds the bounded glyph cache\");\n }\n const missing = new Map([...visible].filter(([key]) => !this.glyphs.has(key)));\n if (!missing.size) return;\n const metadataFits = this.glyphs.size + missing.size <= MAX_GLYPHS &&\n this.glyphKeyUnits + keyUnits(missing) <= MAX_GLYPH_KEY_UNITS;\n let plan = metadataFits ? packGlyphs(missing, this.atlas.width, this.scale, this.shelf) : null;\n if (!plan) {\n let size = this.atlas.width;\n const maxSize = Math.min(4096, this.backend.maxTextureDimension2D);\n while (!(plan = packGlyphs(visible, size, this.scale)) && size < maxSize) {\n size = Math.min(size * 2, maxSize);\n }\n if (!plan) throw new Error(\"Visible glyphs exceed the bounded 4096\u00B2 mask atlas; reduce the grid or backing scale\");\n this.resetAtlas(size);\n this.atlasRebuilds++;\n }\n for (const placement of plan.placements) this.uploadGlyph(placement);\n this.shelf = plan.shelf;\n }\n\n uploadGlyph({ key, cell, x, y, width, height }: GlyphPlacement): void {\n const scale = this.scale;\n const raster = this.raster;\n const style = cell.attributes & 5;\n let metrics = this.fontMetrics.get(style);\n if (!metrics) {\n metrics = measureFont(raster, this.font.cssFamily, style, scale, CELL_WIDTH, CELL_HEIGHT);\n this.fontMetrics.set(style, metrics);\n }\n this.rasterCanvas.width = width;\n this.rasterCanvas.height = height;\n raster.font = metrics.font;\n raster.textBaseline = \"alphabetic\";\n raster.textAlign = \"left\";\n raster.fillStyle = \"white\";\n // One transform per font style, not per glyph: borders remain font outlines,\n // and graphemes are clipped to their server-owned span without individual stretching.\n raster.setTransform(metrics.xScale, 0, 0, metrics.yScale, 2, 2 + metrics.baseline);\n raster.fillText(cell.text, 0, 0);\n const pixels = raster.getImageData(0, 0, width, height);\n let colored = false;\n for (let i = 0; i < pixels.data.length; i += 4) {\n if (pixels.data[i + 3] && (pixels.data[i] !== pixels.data[i + 1] || pixels.data[i + 1] !== pixels.data[i + 2])) {\n colored = true;\n break;\n }\n }\n this.atlas.writePixels(pixels.data, width, height, x, y);\n this.glyphUploadBytes += width * height * 4;\n this.glyphs.set(key, {\n colored,\n u0: (x + 2) / this.atlas.width,\n v0: (y + 2) / this.atlas.height,\n u1: (x + 2 + cell.width * CELL_WIDTH * scale) / this.atlas.width,\n v1: (y + 2 + CELL_HEIGHT * scale) / this.atlas.height,\n });\n this.glyphKeyUnits += key.length;\n }\n\n /** Clip geometry and UVs together. Only adjacent compatible textures may coalesce. */\n quad(resource: TextureResource, x: number, y: number, width: number, height: number,\n color: Vector4, mode = 0, uv: Vector4 = [0, 0, 1, 1],\n clip: Vector4 = [0, 0, this.width, this.height]): void {\n if (width <= 0 || height <= 0 || color[3] <= 0) return;\n const left = Math.max(0, x, clip[0]);\n const top = Math.max(0, y, clip[1]);\n const right = Math.min(this.width, x + width, clip[0] + clip[2]);\n const bottom = Math.min(this.height, y + height, clip[1] + clip[3]);\n if (right <= left || bottom <= top) return;\n if (this.quadCount >= MAX_QUADS) throw new Error(\"Frame exceeds bounded quad budget\");\n const offset = this.quadCount * STRIDE;\n if (offset + STRIDE > this.instances.length) {\n const grown = new Float32Array(Math.min(this.instances.length * 2, MAX_QUADS * STRIDE));\n grown.set(this.instances);\n this.instances = grown;\n }\n const du = uv[2] - uv[0];\n const dv = uv[3] - uv[1];\n this.instances.set([\n left, top, right - left, bottom - top,\n uv[0] + (left - x) / width * du,\n uv[1] + (top - y) / height * dv,\n uv[0] + (right - x) / width * du,\n uv[1] + (bottom - y) / height * dv,\n ...color, mode, 0, 0, 0,\n ], offset);\n const last = this.batches[this.batches.length - 1];\n if (last?.resource === resource) last.count++;\n else this.batches.push({ resource, start: this.quadCount, count: 1 });\n this.quadCount++;\n }\n\n solid(x: number, y: number, width: number, height: number, color: Vector4, clip?: Vector4): void {\n this.quad(this.atlas, x, y, width, height, color, 0, undefined, clip);\n }\n\n placement(placement: ImagePlacement): void {\n const image = this.images.get(placement.key);\n if (!image) throw new Error(`Placement texture is missing: ${placement.key}`);\n const { sourceX: sx, sourceY: sy, sourceWidth: sw, sourceHeight: sh } = placement;\n if (!sw || !sh || !placement.width || !placement.height) return;\n // Clip out-of-texture source regions in destination space instead of stretching edge texels.\n const sourceLeft = placement.x + Math.max(0, -sx) / sw * placement.width;\n const sourceTop = placement.y + Math.max(0, -sy) / sh * placement.height;\n const sourceRight = placement.x + Math.min(sw, image.width - sx) / sw * placement.width;\n const sourceBottom = placement.y + Math.min(sh, image.height - sy) / sh * placement.height;\n const left = Math.max(sourceLeft, placement.clipX);\n const top = Math.max(sourceTop, placement.clipY);\n const right = Math.min(sourceRight, placement.clipX + placement.clipWidth);\n const bottom = Math.min(sourceBottom, placement.clipY + placement.clipHeight);\n this.quad(\n image, placement.x, placement.y, placement.width, placement.height, WHITE, 2,\n [sx / image.width, sy / image.height, (sx + sw) / image.width, (sy + sh) / image.height],\n [left, top, Math.max(0, right - left), Math.max(0, bottom - top)],\n );\n }\n\n decorations(cell: TerminalCell, x: number, y: number, width: number, foreground: Vector4,\n underline = cell.underlineColor, clip?: Vector4, scaleY = 1): void {\n if (cell.attributes & 128) this.solid(x, y + 10 * scaleY, width, scaleY, foreground, clip);\n if (cell.attributes & 256) this.solid(x, y + scaleY, width, scaleY, foreground, clip);\n const style = cell.underlineStyle || (cell.attributes & 8 ? 1 : 0);\n this.underline(style, x, y, width, rgba(underline), clip, scaleY);\n }\n\n private underline(style: number, x: number, y: number, width: number, color: Vector4, clip?: Vector4, scaleY = 1): void {\n if (style === 1) this.solid(x, y + 18 * scaleY, width, scaleY, color, clip);\n else if (style === 2) {\n this.solid(x, y + 16 * scaleY, width, scaleY, color, clip);\n this.solid(x, y + 18 * scaleY, width, scaleY, color, clip);\n } else if (style === 3) {\n for (let dx = 0; dx < width; dx++) {\n this.solid(x + dx, y + (17 + Math.round(Math.sin((x + dx) * Math.PI / 4))) * scaleY, 1, scaleY, color, clip);\n }\n } else if (style === 4 || style === 5) {\n const step = style === 4 ? 2 : 5;\n const segment = style === 4 ? 1 : 3;\n for (let dx = 0; dx < width; dx += step) this.solid(x + dx, y + 18 * scaleY, Math.min(segment, width - dx), scaleY, color, clip);\n }\n }\n\n private renderCell(cell: TerminalCell, index: number, metadata: FrameMetadata, blinkOn: boolean,\n palette: RenderPalette, linkDecoration: number, selectionClip?: Vector4): void {\n if (!cell.width || (cell.attributes & 64) || ((cell.attributes & 16) && !blinkOn)) return;\n const row = Math.floor(index / this.columns);\n const rendition = metadata.lineRenditions?.[row] ?? 0;\n const scaleX = rendition ? 2 : 1;\n const scaleY = rendition >= 2 ? 2 : 1;\n const column = index % this.columns;\n if (column >= Math.max(1, Math.floor(this.columns / scaleX))) return;\n const x = column * CELL_WIDTH * scaleX;\n const rowY = row * CELL_HEIGHT;\n const y = rowY - (rendition === 3 ? CELL_HEIGHT : 0);\n const width = Math.min(cell.width * CELL_WIDTH * scaleX, this.width - x);\n const clip: Vector4 | undefined = !rendition ? selectionClip : selectionClip\n ? [selectionClip[0], Math.max(rowY, selectionClip[1]), selectionClip[2],\n Math.min(rowY + CELL_HEIGHT, selectionClip[1] + selectionClip[3]) - Math.max(rowY, selectionClip[1])]\n : [0, rowY, this.width, CELL_HEIGHT];\n const foreground = rgba(selectionClip ? palette.selectionForeground : foregroundColor(cell, metadata, palette));\n const glyph = isKgpPlaceholder(cell) ? undefined : this.glyphs.get(glyphKey(cell));\n if (glyph) {\n const tint: Vector4 = glyph.colored\n ? (!selectionClip && (cell.attributes & 2) ? [0.5, 0.5, 0.5, 1] : WHITE) : foreground;\n this.quad(this.atlas, x, y, cell.width * CELL_WIDTH * scaleX, CELL_HEIGHT * scaleY,\n tint, glyph.colored ? 2 : 1, [glyph.u0, glyph.v0, glyph.u1, glyph.v1], clip);\n }\n this.decorations(cell, x, y, width, foreground,\n selectionClip ? palette.selectionForeground : underlineColor(cell, metadata, palette), clip, scaleY);\n if (linkDecoration && !cell.underlineStyle && !(cell.attributes & 8) && !isKgpPlaceholder(cell)) {\n this.underline(linkDecoration, x, y, width, foreground, clip, scaleY);\n }\n }\n\n render(cells: readonly (TerminalCell | undefined)[], metadata: FrameMetadata, blinkOn: boolean,\n linkDecorations?: Uint8Array, palette: RenderPalette = DEFAULT_PALETTE) {\n const start = performance.now();\n this.quadCount = 0;\n this.batches = [];\n const placements = metadata.placements.map((placement, order) => ({\n placement,\n order,\n z: placement.kind === \"sixel\" ? -1 : placement.z,\n })).sort((a, b) => a.z - b.z || a.order - b.order);\n for (const item of placements) if (item.z < -1073741824) this.placement(item.placement);\n for (let i = 0; i < cells.length; i++) {\n const cell = cells[i];\n if (!cell) continue;\n const row = Math.floor(i / this.columns);\n const scaleX = metadata.lineRenditions?.[row] ? 2 : 1;\n if (i % this.columns >= Math.max(1, Math.floor(this.columns / scaleX))) continue;\n this.solid((i % this.columns) * CELL_WIDTH * scaleX, row * CELL_HEIGHT,\n CELL_WIDTH * scaleX, CELL_HEIGHT, rgba(backgroundColor(cell, metadata, palette)));\n }\n for (const item of placements) if (item.z >= -1073741824 && item.z < 0) this.placement(item.placement);\n for (let i = 0; i < cells.length; i++) {\n const cell = cells[i];\n if (cell) this.renderCell(cell, i, metadata, blinkOn, palette, linkDecorations?.[i] ?? 0);\n }\n for (const item of placements) if (item.z >= 0) this.placement(item.placement);\n const selection = metadata.history?.selection;\n if (selection?.status === \"valid\") {\n for (const range of selection.ranges) {\n const scaleX = metadata.lineRenditions?.[range.row] ? 2 : 1;\n const clip: Vector4 = [range.startColumn * CELL_WIDTH * scaleX, range.row * CELL_HEIGHT,\n (range.endColumn - range.startColumn) * CELL_WIDTH * scaleX, CELL_HEIGHT];\n this.solid(...clip, rgba(palette.selectionBackground));\n const rowStart = range.row * this.columns;\n let start = rowStart + range.startColumn;\n // A rectangular selection can begin in the continuation of a wide glyph.\n while (start > rowStart && cells[start]?.width === 0) start--;\n for (let i = start; i < rowStart + range.endColumn; i++) {\n const cell = cells[i];\n if (cell) this.renderCell(cell, i, metadata, blinkOn, palette, linkDecorations?.[i] ?? 0, clip);\n }\n }\n }\n const cursor = metadata.cursor;\n const cursorBlink = cursor.shape === 0 || cursor.shape % 2 === 1;\n if (cursor.visible && (!cursorBlink || blinkOn) && cursor.x >= 0 && cursor.x < this.columns && cursor.y >= 0 && cursor.y < this.rows) {\n const cell = cells[cursor.y * this.columns + cursor.x];\n const color = rgba(palette.cursor ?? (cell ? foregroundColor(cell, metadata, palette) : palette.foreground));\n const scaleX = metadata.lineRenditions?.[cursor.y] ? 2 : 1;\n const x = cursor.x * CELL_WIDTH * scaleX;\n const y = cursor.y * CELL_HEIGHT;\n if (cursor.shape === 3 || cursor.shape === 4) this.solid(x, y + 18, CELL_WIDTH * scaleX, 2, color);\n else if (cursor.shape === 5 || cursor.shape === 6) this.solid(x, y, 2, CELL_HEIGHT, color);\n else {\n color[3] *= 0.55;\n this.solid(x, y, CELL_WIDTH * scaleX, CELL_HEIGHT, color);\n }\n }\n const base = rgba(metadata.colorEncoding === \"indexed-v1\" ? palette.background :\n metadata.defaultBackground ?? cells[0]?.background ?? 0xff000000);\n this.backend.submit(this.instances, this.quadCount, this.batches, base);\n return { cpuMs: performance.now() - start, quads: this.quadCount, drawCalls: this.batches.length };\n }\n\n metrics() {\n return {\n renderer: this.backend.kind,\n rendererFallbackReason: this.fallbackReason,\n fontFamily: this.font.family,\n rasterScale: this.scale,\n backingScale: this.backingScale,\n backingWidth: this.canvas.width,\n backingHeight: this.canvas.height,\n imageCount: this.images.size,\n textureBytes: this.textureBytes,\n atlasGlyphs: this.glyphs.size,\n atlasBytes: this.atlas.width * this.atlas.height * 4,\n atlasRebuilds: this.atlasRebuilds,\n imageUploadBytes: this.imageUploadBytes,\n imagePayloadBytes: this.imagePayloadBytes,\n glyphUploadBytes: this.glyphUploadBytes,\n instanceBufferBytes: this.backend.instanceBufferBytes,\n };\n }\n\n async idle() {\n await this.backend.idle();\n }\n\n dispose() {\n if (this.disposed) return;\n this.disposed = true;\n for (const image of this.images.values()) image.destroy();\n this.images.clear();\n this.textureBytes = 0;\n this.atlas?.destroy();\n this.glyphs.clear();\n this.glyphKeyUnits = 0;\n this.batches = [];\n this.quadCount = 0;\n this.instances = new Float32Array(0);\n this.font?.dispose();\n this.fontMetrics.clear();\n this.backend.dispose();\n }\n}\n", "import type { LinkDetectionSnapshot } from \"./link-detection.js\";\nimport type { SelectionRange, TerminalLinkUnderlineStyle } from \"./types.js\";\nimport type { FrameMetadata, TerminalCell } from \"./wire-types.js\";\n\ntype Cells = readonly (TerminalCell | undefined)[];\ntype Decorations = { revision: number; generation: number; serial: number; mask: Uint8Array };\nconst TEXT_ATTRIBUTES = 64 | 1024; // Hidden and soft-wrap; other SGR attributes are presentation-only.\n\nfunction sameContent(cells: Cells, metadata: FrameMetadata, previousCells: Cells, previous: FrameMetadata): boolean {\n if (cells === previousCells && metadata === previous) return true;\n if (metadata.columns !== previous.columns || metadata.rows !== previous.rows) return false;\n const history = metadata.history, oldHistory = previous.history;\n if (!!history !== !!oldHistory || history?.generation !== oldHistory?.generation ||\n history?.buffer !== oldHistory?.buffer || history?.rowIds.length !== oldHistory?.rowIds.length ||\n history?.rowIds.some((id, index) => id !== oldHistory?.rowIds[index])) return false;\n if (metadata.hyperlinks.length !== previous.hyperlinks.length ||\n metadata.hyperlinks.some((range, index) => {\n const old = previous.hyperlinks[index];\n return range.row !== old.row || range.startColumn !== old.startColumn ||\n range.endColumn !== old.endColumn || range.uri !== old.uri;\n })) return false;\n if (cells.length !== previousCells.length) return false;\n for (let index = 0; index < cells.length; index++) {\n const cell = cells[index], old = previousCells[index];\n if (cell === old) continue;\n if (!cell || !old || cell.text !== old.text || cell.width !== old.width ||\n (cell.attributes & TEXT_ATTRIBUTES) !== (old.attributes & TEXT_ATTRIBUTES)) return false;\n }\n return true;\n}\n\n/** Tracks only local presentation state; never modifies authoritative cells or runs matching. */\nexport class LinkPresentation {\n enabled = false;\n generation = 0;\n private presented?: { cells: Cells; metadata: FrameMetadata };\n private sent?: { cells: Cells; metadata: FrameMetadata };\n private forceSnapshot = false;\n private decorations?: Decorations;\n private pending?: Decorations;\n private lastSerial = -1;\n\n configure(enabled: boolean, generation: number): boolean {\n if (typeof enabled !== \"boolean\" || !Number.isSafeInteger(generation) || generation < 0) {\n throw new Error(\"Invalid link detection configuration\");\n }\n if (generation < this.generation || (enabled === this.enabled && generation === this.generation)) return false;\n this.enabled = enabled;\n this.generation = generation;\n this.sent = undefined;\n this.forceSnapshot = enabled;\n this.clear();\n this.lastSerial = -1;\n return true;\n }\n\n private clear(): void {\n this.decorations = undefined;\n this.pending = undefined;\n }\n\n prepare(cells: Cells, metadata: FrameMetadata): void {\n if (!this.enabled) return;\n if (!this.presented || !sameContent(cells, metadata, this.presented.cells, this.presented.metadata)) this.clear();\n // A pending acknowledgement belongs to its submitted revision, even if text is unchanged.\n if (this.pending?.revision !== metadata.revision) this.pending = undefined;\n }\n\n present(cells: Cells, metadata: FrameMetadata): { linkGeneration?: number; linkSnapshot?: LinkDetectionSnapshot } {\n this.presented = { cells, metadata };\n if (!this.enabled) return {};\n const snapshot = this.snapshot();\n return { linkGeneration: this.generation, ...(snapshot ? { linkSnapshot: snapshot } : {}) };\n }\n\n snapshot(): LinkDetectionSnapshot | undefined {\n const current = this.presented;\n if (!this.enabled || !current) return undefined;\n if (!this.forceSnapshot && this.sent &&\n sameContent(current.cells, current.metadata, this.sent.cells, this.sent.metadata)) {\n this.sent = current;\n return undefined;\n }\n this.forceSnapshot = false;\n this.sent = current;\n const { cells, metadata } = current;\n return { revision: metadata.revision, columns: metadata.columns, rows: metadata.rows,\n cells, hyperlinks: metadata.hyperlinks };\n }\n\n accept(revision: number, generation: number, serial: number, ranges: readonly SelectionRange[], busy: boolean,\n underlineStyle: TerminalLinkUnderlineStyle = \"solid\"): boolean {\n if (![revision, generation, serial].every(value => Number.isSafeInteger(value) && value >= 0) ||\n !Array.isArray(ranges) || ![\"solid\", \"dashed\"].includes(underlineStyle)) {\n throw new Error(\"Invalid link decorations\");\n }\n const metadata = this.presented?.metadata;\n if (!this.enabled || busy || !metadata || revision !== metadata.revision ||\n generation !== this.generation || serial <= this.lastSerial) return false;\n if (ranges.length > metadata.columns * metadata.rows || ranges.some(range => !range ||\n !Number.isInteger(range.row) || range.row < 0 || range.row >= metadata.rows ||\n !Number.isInteger(range.startColumn) || !Number.isInteger(range.endColumn) ||\n range.startColumn < 0 || range.endColumn <= range.startColumn || range.endColumn > metadata.columns)) {\n throw new Error(\"Invalid link decoration ranges\");\n }\n const mask = new Uint8Array(metadata.columns * metadata.rows);\n // Values share the renderer's SGR underline styles, without modifying any cell.\n const style = underlineStyle === \"dashed\" ? 5 : 1;\n for (const range of ranges) mask.fill(style, range.row * metadata.columns + range.startColumn,\n range.row * metadata.columns + range.endColumn);\n this.lastSerial = serial;\n this.decorations = this.pending = { revision, generation, serial, mask };\n return true;\n }\n\n submission(): { mask?: Uint8Array; acknowledgement?: Decorations } {\n return { mask: this.decorations?.mask, acknowledgement: this.pending };\n }\n\n acknowledge(submitted: Decorations | undefined, busy: boolean): { revision: number; generation: number; serial: number } | undefined {\n if (!submitted || submitted !== this.pending || busy || !this.enabled ||\n submitted.generation !== this.generation || submitted.revision !== this.presented?.metadata.revision) return undefined;\n this.pending = undefined;\n return { revision: submitted.revision, generation: submitted.generation, serial: submitted.serial };\n }\n}\n", "import type { HistoryMetadata } from \"./wire-types.js\";\nimport type { TerminalMarker } from \"./scrollbar-types.js\";\nimport { LIMITS } from \"./protocol.js\";\n\n/** Retained inventories are a single presentation transaction, even when delivered over several frames. */\nexport class MarkerPages {\n #current: { revision: string; total: number; signature: string; markers: TerminalMarker[];\n ids: Set<string>; bytes: number } | undefined;\n get pending(): boolean { return this.#current !== undefined; }\n reset(): void { this.#current = undefined; }\n\n accept(history: HistoryMetadata | null): HistoryMetadata | null | undefined {\n if (!history?.markerPage) {\n this.reset();\n return history;\n }\n const { markers = [], markerPage: page, ...snapshot } = history;\n const signature = JSON.stringify(snapshot);\n if (page.offset === 0) this.#current = {\n revision: page.revision, total: page.total, signature, markers: [], ids: new Set(), bytes: 0\n };\n const current = this.#current;\n if (!current || current.revision !== page.revision || current.total !== page.total ||\n current.markers.length !== page.offset || current.signature !== signature)\n throw new Error(\"Marker pages do not describe the same contiguous history snapshot\");\n current.bytes += new TextEncoder().encode(JSON.stringify(markers)).byteLength;\n if (current.bytes > LIMITS.metadataBytes) throw new Error(\"Retained marker inventory exceeds the 8 MiB client budget\");\n for (const marker of markers) {\n if (current.ids.has(marker.id)) throw new Error(\"Duplicate marker ID across inventory pages\");\n current.ids.add(marker.id);\n current.markers.push(marker);\n }\n if (current.markers.length < current.total) return undefined;\n this.reset();\n return { ...snapshot, markers: current.markers, markerPage: null };\n }\n}\n", "import { decodeFrame, screenText } from \"./protocol.js\";\nimport { TerminalRenderer } from \"./renderer.js\";\nimport { LinkPresentation } from \"./link-presentation.js\";\nimport { MarkerPages } from \"./marker-pages.js\";\nimport type { TerminalSize, TerminalStatusLevel } from \"./types.js\";\nimport type { FrameMetadata, TerminalCell, TerminalCommand, WorkerInputMessage, WorkerOutputMessage, WorkerStats } from \"./wire-types.js\";\nimport { errorMessage } from \"./validation.js\";\nimport { compilePalette, defaultDarkPalette, normalizePalette } from \"./terminal-palette.js\";\nimport { createWebSocketTransport } from \"./websocket-transport.js\";\nimport { TransportSession } from \"./transport-session.js\";\nimport type { TerminalTransportConnection, TerminalTransportContext } from \"./transport-types.js\";\n\n// This module is only executed as a dedicated worker. Keeping its global local to\n// this module avoids leaking worker/WebGPU ambient dependencies to public declarations.\ndeclare const self: {\n postMessage(message: WorkerOutputMessage): void;\n requestAnimationFrame(callback: FrameRequestCallback): number;\n close(): void;\n addEventListener(type: \"error\", callback: (event: ErrorEvent) => void): void;\n addEventListener(type: \"unhandledrejection\", callback: (event: PromiseRejectionEvent) => void): void;\n addEventListener(type: \"message\", callback: (event: MessageEvent<WorkerInputMessage>) => void): void;\n};\n\nlet renderer: TerminalRenderer | undefined;\nlet transport: TransportSession | undefined;\nlet bridge: TerminalTransportContext | undefined;\nlet bridgeReady: ReturnType<typeof Promise.withResolvers<TerminalTransportConnection>> | undefined;\nlet bridgeSent: ReturnType<typeof Promise.withResolvers<void>> | undefined;\nlet failed = false;\nlet stopped = false;\nlet processing = false;\nlet drawing = false;\nlet frameInFlight = false;\nlet scheduled = false;\nlet needsRender = false;\nlet hasBlink = false;\nlet lastBlink = true;\nlet metadata: FrameMetadata | undefined;\nlet cells: (TerminalCell | undefined)[] = [];\nlet localRevision = 0;\nlet pendingFrame: { revision: number; full: boolean; changedCells: number } | undefined;\nlet renderPromise = Promise.resolve();\nlet metricsTimer: ReturnType<typeof setInterval> | undefined;\nlet blinkTimer: ReturnType<typeof setInterval> | undefined;\nlet viewport: TerminalSize | undefined;\nconst links = new LinkPresentation();\nconst markerPages = new MarkerPages();\nlet awaitingFull = false;\nlet requestedColorEncoding = false;\nlet palette = compilePalette(defaultDarkPalette);\nconst stats: WorkerStats = {\n revision: 0, fullFrames: 0, frames: 0, presentations: 0,\n changedCells: 0, lastChangedCells: 0, discardedFrames: 0,\n imageCount: 0, textureBytes: 0, atlasGlyphs: 0, atlasBytes: 0,\n bytesReceived: 0, imageUploadBytes: 0, imagePayloadBytes: 0,\n gpu: \"initializing\", connected: false, warnings: [],\n fps: 0, receivedKBps: 0, workloadMBps: 0,\n captureMs: 0, rendererCpuMs: 0, preparationCpuMs: 0,\n workloadBytes: 0, outputBatches: 0, serverElapsedMs: 0,\n};\nlet sample = { time: performance.now(), presentations: 0, bytes: 0, workload: 0 };\n\nfunction postStatus(message: string, level: TerminalStatusLevel = \"info\"): void {\n self.postMessage({ type: \"status\", message, level });\n}\n\nfunction send(message: TerminalCommand): void {\n if (stats.connected && !failed && !stopped) void transport?.send(JSON.stringify(message)).catch(fail);\n}\n\nfunction emitStats(text?: string): void {\n if (renderer && !renderer.disposed) Object.assign(stats, renderer.metrics());\n self.postMessage({ type: \"stats\", stats: { ...stats }, ...(text === undefined ? {} : { text }) });\n}\n\nfunction fail(error: unknown): void {\n if (failed || stopped) return;\n failed = true;\n const message = errorMessage(error);\n stats.gpu = \"error\";\n stats.connected = false;\n clearInterval(metricsTimer);\n clearInterval(blinkTimer);\n transport?.dispose();\n emitStats();\n postStatus(message, \"error\");\n renderer?.dispose();\n}\n\nself.addEventListener(\"error\", event => {\n event.preventDefault();\n fail(event.error || new Error(event.message));\n});\nself.addEventListener(\"unhandledrejection\", event => {\n event.preventDefault();\n fail(event.reason);\n});\n\n/** At most one state frame, one decode, and one GPU submission are outstanding. */\nfunction scheduleRender() {\n needsRender = true;\n if (scheduled || drawing || processing || failed || stopped || !metadata || markerPages.pending || awaitingFull) return;\n scheduled = true;\n self.requestAnimationFrame(() => {\n scheduled = false;\n if (processing || drawing || failed || stopped || markerPages.pending || awaitingFull) return;\n renderPromise = drawFrame();\n });\n}\n\nasync function drawFrame() {\n if (!needsRender || !metadata || !renderer) return;\n needsRender = false;\n drawing = true;\n const frame = pendingFrame;\n try {\n if (frame) links.prepare(cells, metadata);\n const linkSubmission = links.submission();\n renderer.resize(metadata.columns, metadata.rows, viewport);\n const blink = Math.floor(performance.now() / 600) % 2 === 0;\n const result = renderer.render(cells, metadata, blink, linkSubmission.mask, palette);\n // This is bounded completion/backpressure, not GPU readback or a GPU timing measurement.\n await renderer.idle();\n if (failed || stopped) return;\n lastBlink = blink;\n stats.presentations++;\n stats.rendererCpuMs = result.cpuMs;\n stats.quads = result.quads;\n stats.drawCalls = result.drawCalls;\n stats.warnings = renderer.canvasLimited\n ? [...metadata.warnings, `Canvas resolution capped by the GPU; terminal grid remains ${metadata.columns}x${metadata.rows}`]\n : metadata.warnings;\n if (frame) {\n pendingFrame = undefined;\n frameInFlight = false;\n stats.frames++;\n if (frame.full) stats.fullFrames++;\n stats.revision = frame.revision;\n stats.changedCells += frame.changedCells;\n stats.lastChangedCells = frame.changedCells;\n stats.captureMs = metadata.stats.captureMs;\n stats.workloadBytes = metadata.stats.workloadBytes;\n stats.outputBatches = metadata.stats.outputBatches;\n stats.serverElapsedMs = metadata.stats.elapsedMs;\n stats.columns = metadata.columns;\n stats.rows = metadata.rows;\n stats.mouseTracking = metadata.mouseTracking;\n stats.peer = metadata.peer;\n stats.history = metadata.history;\n const text = screenText(cells, metadata.columns, metadata.rows);\n self.postMessage({\n type: \"geometry\", columns: metadata.columns, rows: metadata.rows,\n cellWidth: metadata.cellWidth, cellHeight: metadata.cellHeight,\n mouseTracking: metadata.mouseTracking, peer: metadata.peer,\n history: metadata.history, revision: frame.revision, title: metadata.title,\n progress: metadata.progress, shellIntegration: metadata.shellIntegration,\n workingDirectory: metadata.workingDirectory, commandMark: metadata.commandMark,\n text, hyperlinks: metadata.hyperlinks, lineRenditions: metadata.lineRenditions, ...links.present(cells, metadata)\n });\n send({ type: \"ack\", revision: frame.revision });\n emitStats(text);\n } else {\n const snapshot = links.snapshot();\n if (snapshot) self.postMessage({ type: \"linkSnapshot\", generation: links.generation, snapshot });\n }\n const acknowledgement = links.acknowledge(linkSubmission.acknowledgement, processing || frameInFlight);\n if (acknowledgement) self.postMessage({ type: \"linkDecorations\", ...acknowledgement });\n } catch (error) {\n fail(error);\n } finally {\n drawing = false;\n if (needsRender && !processing) scheduleRender();\n }\n}\n\nasync function receiveFrame(buffer: ArrayBuffer): Promise<void> {\n if (failed || stopped || !renderer) return;\n if (frameInFlight) throw new Error(\"Server sent a second state frame before acknowledgement\");\n frameInFlight = true;\n processing = true;\n stats.bytesReceived += buffer.byteLength || 0;\n try {\n const frame = decodeFrame(buffer);\n const next = frame.metadata;\n if (!requestedColorEncoding && next.colorEncodings?.includes(\"indexed-v1\")) {\n requestedColorEncoding = true;\n send({ type: \"colorEncoding\", value: \"indexed-v1\" });\n }\n if (!next.full && (awaitingFull || next.baseRevision !== localRevision || next.revision <= localRevision ||\n !metadata || next.columns !== metadata.columns || next.rows !== metadata.rows ||\n (next.colorEncoding ?? null) !== (metadata.colorEncoding ?? null))) {\n stats.discardedFrames++;\n frameInFlight = false;\n markerPages.reset();\n awaitingFull = true;\n needsRender = false;\n pendingFrame = undefined;\n // A discarded frame must release the server's one-in-flight gate before resync.\n send({ type: \"ack\", revision: next.revision });\n send({ type: \"resync\" });\n postStatus(`Revision mismatch (local ${localRevision}, base ${next.baseRevision}); requesting a full frame`);\n return;\n }\n await renderPromise;\n if (failed || stopped) return;\n // No blink presentation may reference textures while this resource transaction is in progress.\n await renderer.idle();\n await renderer.updateImages(frame.images, next.retainedImages);\n if (failed || stopped) return;\n const preparationStart = performance.now();\n const nextCells: (TerminalCell | undefined)[] = next.full\n ? new Array<TerminalCell | undefined>(next.columns * next.rows) : cells.slice();\n for (const cell of frame.cells) nextCells[cell.index] = cell;\n renderer.prepareGlyphs(nextCells);\n cells = nextCells;\n metadata = next;\n localRevision = next.revision;\n const wasPaging = markerPages.pending && !next.full;\n const history = markerPages.accept(next.history);\n awaitingFull = false;\n pendingFrame = { revision: next.revision,\n full: next.full || (wasPaging && !!pendingFrame?.full),\n changedCells: frame.cells.length + (wasPaging ? pendingFrame?.changedCells ?? 0 : 0) };\n hasBlink = cells.some(cell => cell && (cell.attributes & 16) && !(cell.attributes & 64)) ||\n (next.cursor.visible && (next.cursor.shape === 0 || next.cursor.shape % 2 === 1));\n stats.preparationCpuMs = performance.now() - preparationStart;\n if (history === undefined) {\n // Acknowledge an inventory fragment, but expose/draw only the completed snapshot.\n needsRender = false;\n frameInFlight = false;\n send({ type: \"ack\", revision: next.revision });\n return;\n }\n next.history = history;\n needsRender = true;\n } finally {\n processing = false;\n if (needsRender) scheduleRender();\n }\n}\n\nasync function initialize(message: Extract<WorkerInputMessage, { type: \"init\" }>): Promise<void> {\n if (renderer || transport) throw new Error(\"Worker is already initialized\");\n palette = compilePalette(normalizePalette(message.palette === undefined ? defaultDarkPalette : message.palette));\n if (typeof self.requestAnimationFrame !== \"function\") {\n throw new Error(\"This browser does not support requestAnimationFrame in a dedicated OffscreenCanvas worker\");\n }\n postStatus(\"Loading terminal font and initializing renderer...\");\n renderer = await TerminalRenderer.create(message.canvas, message.scale, fail, message.font, message.renderer);\n if (failed || stopped) {\n renderer?.dispose();\n return;\n }\n stats.gpu = \"ready\";\n stats.backingScale = message.scale;\n emitStats();\n const rendererName = renderer.backend.kind === \"webgpu\" ? \"WebGPU\" : \"WebGL2\";\n if (renderer.fallbackReason) postStatus(`Using WebGL2: ${renderer.fallbackReason}`);\n postStatus(`${rendererName} ready. Attaching terminal view...`);\n transport = new TransportSession({\n onReady() {\n if (failed || stopped) return;\n stats.connected = true;\n self.postMessage({ type: \"connected\" });\n postStatus(`Connected \u00B7 ${rendererName} worker \u00B7 server-authoritative cells and graphics`, \"ready\");\n emitStats();\n },\n onFrame: receiveFrame,\n onError: fail,\n onClose(details) {\n if (failed || stopped) return;\n stats.connected = false;\n stats.gpu = \"stopped\";\n stats.fps = 0;\n stopped = true;\n clearInterval(metricsTimer);\n clearInterval(blinkTimer);\n renderer?.dispose();\n self.postMessage({ type: \"closed\", details });\n postStatus(`View disconnected (${details.code === undefined ? details.reason :\n `${details.code}${details.reason ? `: ${details.reason}` : \"\"}`}). Attach another view to reconnect.`, \"error\");\n emitStats();\n }\n });\n metricsTimer = setInterval(() => {\n const now = performance.now();\n const seconds = (now - sample.time) / 1000;\n stats.fps = (stats.presentations - sample.presentations) / seconds;\n stats.receivedKBps = (stats.bytesReceived - sample.bytes) / seconds / 1000;\n stats.workloadMBps = Math.max(0, stats.workloadBytes - sample.workload) / seconds / 1000000;\n sample = { time: now, presentations: stats.presentations, bytes: stats.bytesReceived, workload: stats.workloadBytes };\n emitStats();\n }, 1000);\n blinkTimer = setInterval(() => {\n const blinkOn = Math.floor(performance.now() / 600) % 2 === 0;\n if (hasBlink && blinkOn !== lastBlink) scheduleRender();\n }, 100);\n transport.start(message.transport.type === \"websocket\" ? createWebSocketTransport(message.transport.url) : {\n connect(context) {\n bridge = context;\n bridgeReady = Promise.withResolvers<TerminalTransportConnection>();\n context.signal.addEventListener(\"abort\", () => {\n bridgeReady?.reject(context.signal.reason);\n bridgeSent?.reject(context.signal.reason);\n }, { once: true });\n self.postMessage({ type: \"transportConnect\" });\n return bridgeReady.promise;\n }\n });\n}\n\nself.addEventListener(\"message\", event => {\n const message = event.data;\n if (message.type === \"init\") {\n initialize(message).catch(fail);\n } else if (message.type === \"transportConnected\" && bridge && !failed && !stopped) {\n bridgeReady?.resolve({\n send(control) {\n bridgeSent = Promise.withResolvers<void>();\n self.postMessage({ type: \"transportSend\", control });\n return bridgeSent.promise;\n },\n dispose() {}\n });\n } else if (message.type === \"transportFrame\" && bridge && !failed && !stopped) {\n void bridge.onFrame(message.buffer).then(() => {\n if (!failed && !stopped) self.postMessage({ type: \"transportReceived\" });\n }).catch(fail);\n } else if (message.type === \"transportSent\" && !failed && !stopped) {\n bridgeSent?.resolve();\n bridgeSent = undefined;\n } else if (message.type === \"transportClosed\") {\n bridge?.onClose(message.details);\n } else if (message.type === \"transportError\") {\n bridge?.onError(new Error(message.message));\n } else if (message.type === \"stop\") {\n stopped = true;\n clearInterval(metricsTimer);\n clearInterval(blinkTimer);\n transport?.dispose();\n renderer?.dispose();\n self.close();\n } else if (message.type === \"viewport\" && !failed && !stopped) {\n if (!Number.isFinite(message.width) || !Number.isFinite(message.height) || message.width < 0 || message.height < 0) {\n fail(new Error(\"Invalid mounted viewport dimensions\"));\n return;\n }\n if (viewport?.width === message.width && viewport?.height === message.height) return;\n viewport = { width: message.width, height: message.height };\n scheduleRender();\n } else if (message.type === \"command\" && !failed && !stopped) {\n send(message.command);\n } else if (message.type === \"palette\" && !failed && !stopped) {\n try {\n palette = compilePalette(normalizePalette(message.palette));\n scheduleRender();\n } catch (error) { fail(error); }\n } else if (message.type === \"linkDetection\" && !failed && !stopped) {\n try {\n if (!links.configure(message.enabled, message.generation)) return;\n if (!processing && !drawing && !pendingFrame) {\n const snapshot = links.snapshot();\n if (snapshot) self.postMessage({ type: \"linkSnapshot\", generation: links.generation, snapshot });\n }\n scheduleRender();\n } catch (error) { fail(error); }\n } else if (message.type === \"linkDecorations\" && !failed && !stopped) {\n try {\n if (links.accept(message.revision, message.generation, message.serial, message.ranges,\n processing || frameInFlight || !!pendingFrame, message.underlineStyle)) scheduleRender();\n } catch (error) { fail(error); }\n }\n});\n", "import { LINK_LIMITS } from \"./link-options.js\";\nimport type { LinkScanRequest, LinkScanResponse, LinkScanMatch } from \"./link-worker-protocol.js\";\nimport { linkMatchTextSize } from \"./link-worker-protocol.js\";\n\nfunction trimProse(text: string): string {\n let end = text.length;\n const pairs: Record<string, string> = { \")\": \"(\", \"]\": \"[\", \"}\": \"{\" };\n while (end > 0) {\n const char = text[end - 1];\n if (\".,;:!?\".includes(char)) { end--; continue; }\n if (pairs[char]) {\n const current = text.slice(0, end);\n if (current.split(char).length > current.split(pairs[char]).length) { end--; continue; }\n }\n break;\n }\n return text.slice(0, end);\n}\n\nexport function scanLinks(request: LinkScanRequest): LinkScanResponse {\n try {\n const builtin = \"builtin\" in request.rule ? request.rule.builtin : undefined;\n let regex: RegExp;\n if (\"source\" in request.rule) {\n const flags = request.rule.flags.replaceAll(\"g\", \"\");\n regex = new RegExp(request.rule.source, `${flags}g`);\n } else {\n const sources = {\n url: String.raw`https?:\\/\\/[^\\s\\0<>\"'\\x60]+`,\n uri: String.raw`[A-Za-z][A-Za-z0-9+.-]*:[^\\s\\0<>\"'\\x60]+`,\n absolutePath: String.raw`(?:[A-Za-z]:[\\\\/]|/)[^\\s\\0<>\"'\\x60]*`,\n homePath: String.raw`~/[^\\s\\0<>\"'\\x60]+`,\n };\n regex = new RegExp(sources[request.rule.builtin], \"giu\");\n }\n let count = 0, attempts = 0, total = 0, resultText = 0;\n const results: NonNullable<LinkScanResponse[\"results\"]> = [];\n for (const chunk of request.chunks) {\n total += chunk.text.length;\n if (chunk.text.length > LINK_LIMITS.chunk || total > LINK_LIMITS.totalText) {\n return { id: request.id, error: \"limit\", message: \"Link scan text limit exceeded\" };\n }\n regex.lastIndex = 0;\n const matches: LinkScanMatch[] = [];\n let match: RegExpExecArray | null;\n while ((match = regex.exec(chunk.text)) !== null) {\n if (++attempts > LINK_LIMITS.totalText || count >= LINK_LIMITS.matches) {\n return { id: request.id, error: \"limit\", message: \"Link match limit exceeded\" };\n }\n if (!match[0].length) {\n const point = chunk.text.codePointAt(regex.lastIndex);\n regex.lastIndex += (regex.unicode || regex.unicodeSets) && point !== undefined && point > 0xffff ? 2 : 1;\n continue;\n }\n let text = match[0];\n if (builtin) {\n const before = chunk.text[match.index - 1];\n if (before !== undefined && !/[\\s([{\"'<>=]/u.test(before)) continue;\n if (builtin === \"uri\" && /^[a-z]:[\\\\/]/iu.test(text)) continue;\n text = trimProse(text);\n if (!text || (builtin === \"absolutePath\" && (text === \"/\" || /^[a-z]:[\\\\/]$/iu.test(text)))) continue;\n if (builtin === \"url\") {\n try { if (!new URL(text).hostname) continue; } catch { continue; }\n }\n }\n const candidate = { index: match.index, text, captures: match.slice(1), groups: { ...match.groups } };\n resultText += linkMatchTextSize(candidate);\n if (resultText > LINK_LIMITS.resultText) {\n return { id: request.id, error: \"limit\", message: \"Link result text limit exceeded\" };\n }\n matches.push(candidate);\n count++;\n }\n results.push({ key: chunk.key, matches });\n }\n return { id: request.id, results };\n } catch (error) {\n return { id: request.id, error: \"worker\", message: error instanceof Error ? error.message : String(error) };\n }\n}\n\nif (typeof self !== \"undefined\" && typeof self.postMessage === \"function\") {\n self.addEventListener(\"message\", (event: MessageEvent<LinkScanRequest>) => {\n self.postMessage(scanLinks(event.data));\n });\n}\n", "import type { MouseTrackingMode, SelectionMode, TerminalPoint, TerminalSelection } from \"./types.js\";\nimport type { CellPosition } from \"./wire-types.js\";\n\nexport interface GestureState {\n tracking: MouseTrackingMode;\n historical?: boolean;\n readOnly?: boolean;\n selection?: Pick<TerminalSelection, \"status\" | \"mode\" | \"canExtend\">;\n}\nexport type GestureStart = { owner: \"app\" } | { owner: \"local\"; mode: SelectionMode; extend: boolean };\ntype PointEvent = Pick<MouseEvent, \"clientX\" | \"clientY\" | \"shiftKey\" | \"altKey\" | \"ctrlKey\">;\n\nexport function cellPoint(event: PointEvent, bounds: Pick<DOMRect, \"left\" | \"top\" | \"width\" | \"height\">,\n columns: number, rows: number, clamp = false): CellPosition | null {\n if (!(bounds.width > 0) || !(bounds.height > 0)) return null;\n const x = Math.floor((event.clientX - bounds.left) * columns / bounds.width);\n const y = Math.floor((event.clientY - bounds.top) * rows / bounds.height);\n if (!clamp && (x < 0 || y < 0 || x >= columns || y >= rows)) return null;\n return {\n x: Math.max(0, Math.min(columns - 1, x)),\n y: Math.max(0, Math.min(rows - 1, y)),\n shift: !!event.shiftKey, alt: !!event.altKey, ctrl: !!event.ctrlKey\n };\n}\n\nexport class WheelAccumulator {\n x = 0;\n y = 0;\n reset() { this.x = this.y = 0; }\n take(event: Pick<WheelEvent, \"deltaMode\" | \"deltaX\" | \"deltaY\">, bounds: Pick<DOMRect, \"height\">, rows: number): TerminalPoint {\n const cellHeight = bounds.height / rows;\n if (!(cellHeight > 0)) return { x: 0, y: 0 };\n const unit = event.deltaMode === 1 ? 1 : event.deltaMode === 2 ? rows : 1 / cellHeight;\n this.x += event.deltaX * unit;\n this.y += event.deltaY * unit;\n const x = Math.trunc(this.x);\n const y = Math.trunc(this.y);\n this.x -= x;\n this.y -= y;\n return { x: Math.max(-32, Math.min(32, x)), y: Math.max(-32, Math.min(32, y)) };\n }\n}\n\n/** Ownership and granularity are latched, independent of subsequent modifiers. */\nexport class SelectionGesture {\n owner: \"local\" | \"app\" | null = null;\n mode: SelectionMode = \"character\";\n endpoint: TerminalPoint | null = null;\n begin(event: Pick<MouseEvent, \"button\" | \"shiftKey\" | \"altKey\" | \"detail\">, point: TerminalPoint,\n { tracking, historical, readOnly, selection }: GestureState): GestureStart | null {\n if (this.owner) return null;\n const local = historical || readOnly || !tracking || event.shiftKey;\n if (local && event.button !== 0) return null;\n this.owner = local ? \"local\" : \"app\";\n if (!local) return { owner: \"app\" };\n const extend = !!event.shiftKey && !!selection && [\"valid\", \"pending\"].includes(selection.status) && selection.canExtend !== false;\n this.mode = extend && selection ? selection.mode : event.altKey ? \"rectangle\"\n : event.detail >= 3 ? \"line\" : event.detail === 2 ? \"word\" : \"character\";\n this.endpoint = { x: point.x, y: point.y };\n return { owner: this.owner, mode: this.mode, extend };\n }\n move(point: TerminalPoint): TerminalPoint | null {\n if (this.owner !== \"local\") return null;\n this.endpoint = { x: point.x, y: point.y };\n return { ...this.endpoint };\n }\n scrollPoint(point: TerminalPoint): TerminalPoint | undefined {\n if (this.owner !== \"local\") return undefined;\n // A wheel cannot widen a rectangle; only actual pointer movement can.\n return { x: this.mode === \"rectangle\" && this.endpoint ? this.endpoint.x : point.x, y: point.y };\n }\n wheelOwner(event: Pick<MouseEvent, \"shiftKey\">, { tracking, historical, readOnly }: GestureState): \"local\" | \"app\" {\n return this.owner ?? (historical || readOnly || !tracking || event.shiftKey ? \"local\" : \"app\");\n }\n end() { this.owner = null; }\n}\n", "export const InputRoute = Object.freeze({\n Continue: \"continue\", Consume: \"consume\", Application: \"application\", Browser: \"browser\"\n});\n\nexport const TerminalAction = Object.freeze({\n CopySelection: \"copySelection\", PasteClipboard: \"pasteClipboard\", CopyOrPaste: \"copyOrPaste\",\n ClearSelection: \"clearSelection\", ScrollToLive: \"scrollToLive\", ScrollLines: \"scrollLines\"\n});\n\nconst browserCtrlKeys = new Set([\"l\", \"t\", \"v\", \"w\", \"+\", \"-\", \"=\", \"0\"]);\nconst browserFunctionKeys = new Set([\"F1\", \"F3\", \"F5\", \"F6\", \"F7\", \"F10\", \"F11\", \"F12\"]);\nconst terminalKeys = new Set([\"Tab\", \"Enter\", \"Backspace\", \"Delete\", \"Escape\", \"ArrowUp\", \"ArrowDown\",\n \"ArrowLeft\", \"ArrowRight\", \"Home\", \"End\", \"PageUp\", \"PageDown\", \"Insert\",\n ...Array.from({ length: 12 }, (_, index) => `F${index + 1}`)]);\nconst routes = new Set(Object.values(InputRoute));\n\n/** Fresh, inspectable defaults. Overrides are per mounted view, never global. */\nexport function defaultInputBindings(): InputBinding[] {\n return [\n {\n id: \"clipboard.copy-key\",\n match: input => input.type === \"key\" && input.key.toLowerCase() === \"c\" && !input.alt &&\n ((input.meta && !input.ctrl) || (input.ctrl && input.shift && !input.meta)),\n action: TerminalAction.CopySelection\n },\n {\n id: \"browser.shortcuts\",\n match: input => input.type === \"key\" && (input.meta || browserFunctionKeys.has(input.key) ||\n (input.ctrl && (input.key === \"Tab\" || input.key === \"F4\" || browserCtrlKeys.has(input.key.toLowerCase()) ||\n (input.shift && input.key.length === 1))) || (input.alt && !input.ctrl)),\n route: InputRoute.Browser\n },\n {\n id: \"terminal.keys\",\n match: input => input.type === \"key\" && (terminalKeys.has(input.key) || (input.ctrl && input.key.length === 1)),\n route: InputRoute.Application\n },\n {\n id: \"clipboard.context-click\",\n match: (input, context) => input.type === \"pointer\" && input.button === \"right\" && !input.meta &&\n (!context.mouseCaptured || input.shift || context.historical || context.readOnly),\n action: TerminalAction.CopyOrPaste\n }\n ];\n}\n\nfunction synchronous(callback: unknown, name: string): void {\n if (typeof callback !== \"function\" || callback.constructor.name === \"AsyncFunction\")\n throw new TypeError(`${name} must be a synchronous function`);\n}\n\n/** Resolves intent only. DOM cancellation and action execution belong to the mounted view. */\nexport class InputPolicy {\n #bindings: InputBinding[];\n #intercept: InputPolicyOptions[\"onInput\"];\n #actions: Set<string>;\n\n constructor({ inputBindings = [], onInput, actions = {} }: InputPolicyOptions = {}) {\n if (!Array.isArray(inputBindings)) throw new TypeError(\"inputBindings must be an array\");\n if (!actions || typeof actions !== \"object\" || Array.isArray(actions)) throw new TypeError(\"actions must be an object\");\n this.#actions = new Set(Object.values(TerminalAction));\n for (const [name, handler] of Object.entries(actions)) {\n if (!name || this.#actions.has(name) || typeof handler !== \"function\")\n throw new TypeError(`Invalid or reserved action: ${name}`);\n this.#actions.add(name);\n }\n if (onInput !== undefined) synchronous(onInput, \"onInput\");\n this.#intercept = onInput;\n const defaults = defaultInputBindings();\n const ids = new Set();\n const overrides = inputBindings.map((binding: InputBindingOverride): InputBinding | null => {\n if (!binding || typeof binding.id !== \"string\" || !binding.id || ids.has(binding.id))\n throw new TypeError(\"Each input binding needs a unique, nonempty id\");\n ids.add(binding.id);\n if (binding.remove === true) {\n if (!defaults.some(item => item.id === binding.id))\n throw new TypeError(`Cannot remove unknown default binding: ${binding.id}`);\n if (Object.keys(binding).some(key => ![\"id\", \"remove\"].includes(key)))\n throw new TypeError(`Removed binding ${binding.id} must contain only id and remove`);\n return null;\n }\n synchronous(binding.match, `Binding ${binding.id}.match`);\n if (binding.when !== undefined) synchronous(binding.when, `Binding ${binding.id}.when`);\n this.#decision(binding);\n return Object.freeze({ ...binding });\n }).filter((binding): binding is InputBinding => binding !== null);\n this.#bindings = [...overrides, ...defaults.filter(binding => !ids.has(binding.id))];\n }\n\n get bindings() { return this.#bindings.map(binding => ({ ...binding })); }\n\n #decision(value: unknown): InputDecision {\n if (isRoute(value)) return { route: value };\n if (!isRecord(value) || typeof value.then === \"function\")\n throw new TypeError(\"Input routing must synchronously return a route or action\");\n const hasAction = Object.hasOwn(value, \"action\");\n const hasRoute = Object.hasOwn(value, \"route\");\n if (hasAction === hasRoute) throw new TypeError(\"Specify exactly one action or route\");\n if (hasRoute) {\n if (!isRoute(value.route)) throw new TypeError(`Unknown input route: ${String(value.route)}`);\n return { route: value.route };\n }\n if (!isActionHandler(value.action) && (typeof value.action !== \"string\" || !this.#actions.has(value.action)))\n throw new TypeError(`Unknown terminal action: ${String(value.action)}`);\n return { action: value.action, args: value.args };\n }\n\n resolve(input: Readonly<TerminalInput>, context: TerminalInputContext): InputDecision {\n const intercepted = this.#intercept?.(input, context);\n if (intercepted !== undefined) {\n const decision = this.#decision(intercepted);\n if (decision.route !== InputRoute.Continue) return decision;\n }\n for (const binding of this.#bindings) {\n const matched = binding.match(input, context);\n if (typeof matched !== \"boolean\") throw new TypeError(`Binding ${binding.id}.match must return a boolean`);\n if (!matched) continue;\n if (binding.when) {\n const enabled = binding.when(context, input);\n if (typeof enabled !== \"boolean\") throw new TypeError(`Binding ${binding.id}.when must return a boolean`);\n if (!enabled) continue;\n }\n const decision = this.#decision(binding);\n if (decision.route !== InputRoute.Continue) return decision;\n }\n return { route: InputRoute.Continue };\n }\n}\n\nfunction isRoute(value: unknown): value is InputRouteValue {\n return typeof value === \"string\" && [...routes].some(route => route === value);\n}\n\nfunction isActionHandler(value: unknown): value is InputActionHandler {\n return typeof value === \"function\";\n}\n\nexport function inputModifiers(event: Pick<KeyboardEvent, \"ctrlKey\" | \"altKey\" | \"shiftKey\" | \"metaKey\">): InputModifiers {\n return { ctrl: !!event.ctrlKey, alt: !!event.altKey, shift: !!event.shiftKey, meta: !!event.metaKey };\n}\nimport type { InputActionHandler, InputBinding, InputBindingOverride, InputDecision, InputModifiers,\n InputPolicyOptions, InputRouteValue, TerminalInput, TerminalInputContext } from \"./types.js\";\nimport { isRecord } from \"./validation.js\";\n", "import { cellPoint, WheelAccumulator, SelectionGesture } from \"./selection-input.js\";\nimport { InputRoute, inputModifiers } from \"./input-policy.js\";\nimport type { GestureState } from \"./selection-input.js\";\nimport type { InputDecision, InputRouteValue, MouseTrackingMode, PointerButton, SelectionMode,\n TerminalInput, TerminalPoint } from \"./types.js\";\nimport type { CellPosition, MouseButton, MouseCommand } from \"./wire-types.js\";\n\nconst buttons: readonly (readonly [PointerButton, number])[] = [[\"left\", 1], [\"middle\", 4], [\"right\", 2]];\nconst pointerButtons: readonly PointerButton[] = [\"left\", \"middle\", \"right\"];\ninterface SelectionClick { point: TerminalPoint; mode: SelectionMode; extend: boolean; dragged: boolean }\nexport interface PointerHyperlink {\n id: string;\n target: string;\n activation?: \"modifierClick\" | \"click\";\n}\ninterface HyperlinkClick { link: PointerHyperlink; input: TerminalInput; x: number; y: number; dragged: boolean }\ninterface MouseInspection {\n lineRenditions?: () => readonly number[];\n state?: () => Omit<GestureState, \"tracking\">;\n begin?: (point: TerminalPoint, selection: { mode: SelectionMode; extend: boolean }) => void;\n extend?: (point: TerminalPoint) => void;\n scroll?: (delta: number, endpoint?: TerminalPoint) => void;\n end?: (cancelled: boolean) => void;\n resolve?: (input: TerminalInput) => InputDecision;\n execute?: (decision: Extract<InputDecision, { action: unknown }>, input: TerminalInput) => void;\n hyperlink?: (point: TerminalPoint) => PointerHyperlink | null;\n hoverHyperlink?: (link: PointerHyperlink | null) => void;\n openHyperlink?: (link: PointerHyperlink, input: TerminalInput) => void;\n}\nexport interface MouseCapture {\n update(columns: number, rows: number, tracking: MouseTrackingMode): void;\n refresh(): void;\n cancel(): void;\n dispose(): void;\n}\n\n/** Capture input intent only; the server chooses and encodes the mouse protocol. */\nexport function captureMouse(canvas: HTMLCanvasElement, send: (command: MouseCommand) => void,\n focus: () => void, inspection: MouseInspection = {}): MouseCapture {\n const listeners = new AbortController();\n const options = { signal: listeners.signal };\n let columns = 1, rows = 1;\n let tracking: MouseTrackingMode = 0;\n let pointerId: number | null = null;\n const pressed = new Set<PointerButton>();\n let lastPoint: CellPosition | undefined;\n let pendingMove: MouseCommand | undefined;\n let lastMove: string | undefined;\n let scheduled: number | undefined;\n const wheel = new WheelAccumulator();\n const gesture = new SelectionGesture();\n let wheelOwner: \"local\" | \"app\" | undefined;\n let pointerEvent: PointerEvent | undefined;\n let autoScroll: ReturnType<typeof setTimeout> | undefined;\n let click = { count: 0, time: 0, x: -1, y: -1 };\n let selectionClick: SelectionClick | undefined;\n let completedClick: SelectionClick | undefined;\n let routedGesture: InputRouteValue | undefined;\n let contextMenuRoute: InputRouteValue | undefined;\n let hyperlinkClick: HyperlinkClick | undefined;\n let hoverEvent: PointerEvent | undefined;\n let hoverModifiers: Pick<MouseEvent, \"ctrlKey\" | \"metaKey\" | \"altKey\" | \"shiftKey\"> | undefined;\n let hoveredLinkId: string | undefined;\n const originalTitle = canvas.title;\n const originalCursor = canvas.style.cursor;\n const state = () => ({ tracking, ...inspection.state?.() });\n\n function point(event: MouseEvent, clamp = false): CellPosition | null {\n const position = cellPoint(event, canvas.getBoundingClientRect(), columns, rows, clamp);\n if (position && inspection.lineRenditions?.()[position.y])\n position.x = Math.min(Math.max(0, Math.floor(columns / 2) - 1), Math.floor(position.x / 2));\n return position;\n }\n\n function refreshHover(modifiers = hoverModifiers) {\n if (!inspection.hyperlink) return;\n hoverModifiers = modifiers;\n const position = hoverEvent && point(hoverEvent);\n const link = position ? inspection.hyperlink(position) : null;\n canvas.title = link ? `${link.target}\\n${link.activation === \"click\" ? \"Click\" : \"Ctrl/Cmd+click\"} to activate link` : originalTitle;\n canvas.style.cursor = link && modifiers && (link.activation === \"click\" || modifiers.ctrlKey || modifiers.metaKey) &&\n !modifiers.altKey && !modifiers.shiftKey ? \"pointer\" : originalCursor;\n if (hyperlinkClick && hyperlinkClick.link.id !== link?.id) hyperlinkClick.dragged = true;\n if (hoveredLinkId !== link?.id) {\n hoveredLinkId = link?.id;\n inspection.hoverHyperlink?.(link);\n }\n }\n\n function updateAutoScroll() {\n clearTimeout(autoScroll);\n autoScroll = undefined;\n if (gesture.owner !== \"local\" || !pointerEvent) return;\n const bounds = canvas.getBoundingClientRect();\n const distance = pointerEvent.clientY < bounds.top ? pointerEvent.clientY - bounds.top\n : pointerEvent.clientY >= bounds.bottom ? pointerEvent.clientY - bounds.bottom + 1 : 0;\n if (!distance) return;\n autoScroll = setTimeout(() => {\n autoScroll = undefined;\n if (!pointerEvent) return;\n const position = point(pointerEvent, true);\n if (gesture.owner === \"local\" && position) {\n if (selectionClick) selectionClick.dragged = true;\n click.count = 0;\n const lines = Math.sign(distance) * Math.min(8, Math.max(1, Math.ceil(Math.abs(distance) / (bounds.height / rows))));\n inspection.scroll?.(lines, gesture.scrollPoint(position));\n updateAutoScroll();\n }\n }, 60);\n }\n\n function flushMove() {\n if (scheduled !== undefined) cancelAnimationFrame(scheduled);\n scheduled = undefined;\n if (pendingMove) send(pendingMove);\n pendingMove = undefined;\n }\n\n function changeButtons(event: PointerEvent, position: CellPosition): void {\n for (const [button, mask] of buttons) {\n const down = (event.buttons & mask) !== 0;\n if (down === pressed.has(button)) continue;\n flushMove();\n if (down) pressed.add(button);\n else pressed.delete(button);\n if (down || tracking !== 9)\n send({ type: \"mouse\", action: down ? \"down\" : \"up\", button, ...position });\n lastMove = undefined;\n }\n }\n\n function cancel(report = true, cancelled = true) {\n inspection.end?.(cancelled);\n clearTimeout(autoScroll);\n autoScroll = undefined;\n pointerEvent = undefined;\n selectionClick = undefined;\n completedClick = undefined;\n hyperlinkClick = undefined;\n gesture.end();\n routedGesture = undefined;\n if (report) flushMove();\n else {\n if (scheduled !== undefined) cancelAnimationFrame(scheduled);\n scheduled = undefined;\n pendingMove = undefined;\n }\n if (report && tracking !== 9 && lastPoint) {\n for (const button of pressed)\n send({ type: \"mouse\", action: \"up\", button, ...lastPoint });\n }\n pressed.clear();\n const captured = pointerId;\n pointerId = null;\n if (captured !== null && canvas.hasPointerCapture(captured))\n canvas.releasePointerCapture(captured);\n lastMove = undefined;\n wheel.reset();\n wheelOwner = undefined;\n }\n\n canvas.addEventListener(\"pointerdown\", event => {\n if (event.defaultPrevented && pointerId === null) return;\n if (event.pointerType !== \"mouse\" || ![0, 1, 2].includes(event.button)) return;\n const position = point(event);\n if (!position) return;\n if (pointerId !== null) {\n if (hyperlinkClick) hyperlinkClick.dragged = true;\n if (routedGesture !== InputRoute.Browser) event.preventDefault();\n if ((gesture.owner === \"app\" || routedGesture === InputRoute.Application) && pointerId === event.pointerId)\n changeButtons(event, position);\n return;\n }\n focus();\n const input: TerminalInput = { type: \"pointer\", button: pointerButtons[event.button],\n point: Object.freeze({ ...position }), ...inputModifiers(event) };\n const decision = inspection.resolve?.(input) ?? { route: InputRoute.Continue };\n let route = decision.action !== undefined ? InputRoute.Consume : decision.route;\n if (route === InputRoute.Continue && event.button === 0 && !event.altKey && !event.shiftKey) {\n const link = inspection.hyperlink?.(position);\n if (link && (link.activation === \"click\" || event.ctrlKey || event.metaKey)) {\n hyperlinkClick = { link, input, x: event.clientX, y: event.clientY, dragged: false };\n route = InputRoute.Consume;\n }\n }\n contextMenuRoute = event.button === 2 ? route : undefined;\n if (hyperlinkClick) contextMenuRoute = InputRoute.Consume;\n hoverEvent = event;\n refreshHover(event);\n if (route !== InputRoute.Continue) {\n completedClick = selectionClick = undefined;\n click.count = 0;\n routedGesture = route;\n pointerId = event.pointerId;\n lastPoint = position;\n canvas.setPointerCapture(pointerId);\n if (route !== InputRoute.Browser) event.preventDefault();\n if (route === InputRoute.Application) flushMove();\n else {\n if (scheduled !== undefined) cancelAnimationFrame(scheduled);\n scheduled = undefined;\n pendingMove = undefined;\n }\n if (route === InputRoute.Application) changeButtons(event, position);\n if (decision.action !== undefined) inspection.execute?.(decision, input);\n return;\n }\n // Keep focus on the hidden keyboard input instead of the canvas.\n event.preventDefault();\n if (event.metaKey) return;\n const now = performance.now();\n click.count = now - click.time < 500 && position.x === click.x && position.y === click.y\n ? click.count % 3 + 1 : 1;\n click = { count: click.count, time: now, x: position.x, y: position.y };\n const start = gesture.begin({ button: event.button, shiftKey: event.shiftKey, altKey: event.altKey,\n detail: event.detail || click.count }, position, state());\n if (!start) return;\n pointerId = event.pointerId;\n pointerEvent = event;\n lastPoint = position;\n completedClick = undefined;\n canvas.setPointerCapture(pointerId);\n if (start.owner === \"local\") {\n if (scheduled !== undefined) cancelAnimationFrame(scheduled);\n scheduled = undefined;\n pendingMove = undefined;\n lastMove = undefined;\n selectionClick = { point: position, mode: start.mode, extend: start.extend, dragged: false };\n inspection.begin?.(position, start);\n }\n else changeButtons(event, position);\n }, options);\n\n canvas.addEventListener(\"pointermove\", event => {\n if (event.pointerType !== \"mouse\") return;\n if (pointerId === null && event.buttons) return;\n if (pointerId !== null && pointerId !== event.pointerId) return;\n hoverEvent = event;\n refreshHover(event);\n if (hyperlinkClick && Math.hypot(event.clientX - hyperlinkClick.x, event.clientY - hyperlinkClick.y) >= 4)\n hyperlinkClick.dragged = true;\n const position = point(event, pointerId !== null);\n if (!position) return;\n lastPoint = position;\n if (routedGesture && routedGesture !== InputRoute.Application) return;\n if (gesture.owner === \"local\") {\n pointerEvent = event;\n const previous = gesture.endpoint;\n const endpoint = gesture.move(position);\n if (endpoint && previous && (endpoint.x !== previous.x || endpoint.y !== previous.y)) {\n click.count = 0;\n if (selectionClick) selectionClick.dragged = true;\n inspection.extend?.(endpoint);\n }\n updateAutoScroll();\n return;\n }\n if (!tracking || (!routedGesture && gesture.owner === null && (state().historical || state().readOnly || event.shiftKey))) return;\n if (pointerId === event.pointerId) changeButtons(event, position);\n if (event.metaKey || (tracking !== 1003 && !(tracking === 1002 && pressed.size))) return;\n const button = buttons.find(([name]) => pressed.has(name))?.[0] ?? \"none\";\n const move: MouseCommand = { type: \"mouse\", action: \"move\", button, ...position };\n const key = JSON.stringify(move);\n if (key === lastMove) return;\n lastMove = key;\n pendingMove = move;\n if (scheduled === undefined) scheduled = requestAnimationFrame(flushMove);\n }, options);\n\n canvas.addEventListener(\"pointerup\", event => {\n if (pointerId !== event.pointerId) return;\n if (hyperlinkClick) {\n event.preventDefault();\n const link = hyperlinkClick;\n const position = point(event);\n const activate = event.button === 0 && event.buttons === 0 && !link.dragged &&\n Math.hypot(event.clientX - link.x, event.clientY - link.y) < 4 &&\n position && inspection.hyperlink?.(position)?.id === link.link.id;\n if (event.buttons === 0) cancel(false, false);\n else link.dragged = true;\n if (activate) inspection.openHyperlink?.(link.link, link.input);\n return;\n }\n const position = point(event, true) ?? lastPoint;\n if (routedGesture) {\n if (routedGesture === InputRoute.Application && position) changeButtons(event, position);\n if (event.buttons === 0) cancel(routedGesture === InputRoute.Application);\n return;\n }\n if (gesture.owner === \"local\") {\n if (position && gesture.endpoint && (position.x !== gesture.endpoint.x || position.y !== gesture.endpoint.y)) {\n if (selectionClick) selectionClick.dragged = true;\n const endpoint = gesture.move(position);\n if (endpoint) inspection.extend?.(endpoint);\n }\n const completed = selectionClick;\n cancel(false, false);\n completedClick = completed;\n return;\n }\n if (position) changeButtons(event, position);\n if (!pressed.size) cancel();\n }, options);\n canvas.addEventListener(\"click\", event => {\n const completed = completedClick;\n completedClick = undefined;\n if (!completed || completed.dragged || !Number.isInteger(event.detail) || event.detail < 1) return;\n click.count = event.detail;\n // Some browsers expose native multiclick counts only on click, not pointerdown.\n const mode = event.detail >= 3 ? \"line\" : event.detail === 2 ? \"word\" : \"character\";\n if (!completed.extend && completed.mode !== \"rectangle\" && mode !== completed.mode)\n inspection.begin?.(completed.point, { mode, extend: false });\n }, options);\n canvas.addEventListener(\"pointercancel\", () => cancel(), options);\n canvas.addEventListener(\"pointerleave\", () => {\n hoverEvent = undefined;\n refreshHover();\n }, options);\n canvas.addEventListener(\"lostpointercapture\", () => {\n if (pointerId !== null) cancel();\n }, options);\n window.addEventListener(\"blur\", () => {\n cancel();\n hoverEvent = undefined;\n refreshHover();\n }, options);\n window.addEventListener(\"keydown\", event => refreshHover(event), { ...options, capture: true });\n window.addEventListener(\"keyup\", event => refreshHover(event), { ...options, capture: true });\n canvas.addEventListener(\"contextmenu\", event => {\n if (contextMenuRoute !== undefined && contextMenuRoute !== InputRoute.Continue) {\n const route = contextMenuRoute;\n contextMenuRoute = undefined;\n if (route !== InputRoute.Browser) event.preventDefault();\n return;\n }\n if (tracking || gesture.owner === \"local\") event.preventDefault();\n }, options);\n canvas.addEventListener(\"wheel\", event => {\n if (hyperlinkClick) hyperlinkClick.dragged = true;\n const input: TerminalInput = { type: \"wheel\", deltaX: event.deltaX, deltaY: event.deltaY,\n deltaMode: event.deltaMode, point: point(event), ...inputModifiers(event) };\n const decision: InputDecision = pointerId === null\n ? inspection.resolve?.(input) ?? { route: InputRoute.Continue }\n : { route: routedGesture ?? InputRoute.Continue };\n if (decision.route === InputRoute.Browser) return;\n if (decision.action !== undefined || decision.route === InputRoute.Consume) {\n event.preventDefault();\n if (decision.action !== undefined) inspection.execute?.(decision, input);\n return;\n }\n // Ctrl+wheel (including trackpad pinch) remains browser zoom.\n if (decision.route !== InputRoute.Application && (event.ctrlKey || event.metaKey)) return;\n const owner = decision.route === InputRoute.Application ? \"app\" : gesture.wheelOwner(event, state());\n if (owner === \"app\" && tracking === 9) return;\n const position = point(gesture.owner === \"local\" && pointerEvent ? pointerEvent : event, gesture.owner === \"local\");\n if (!position) return;\n event.preventDefault();\n flushMove();\n const bounds = canvas.getBoundingClientRect();\n if (wheelOwner !== owner) wheel.reset();\n wheelOwner = owner;\n const { x: horizontal, y: vertical } = wheel.take(event, bounds, rows);\n if (owner === \"local\") {\n if (vertical) {\n if (selectionClick) selectionClick.dragged = true;\n click.count = 0;\n inspection.scroll?.(vertical, gesture.scrollPoint(position));\n }\n return;\n }\n const wheelDirections: [number, MouseButton, MouseButton][] = [\n [vertical, \"wheelUp\", \"wheelDown\"],\n [horizontal, \"wheelLeft\", \"wheelRight\"]\n ];\n for (const [steps, negative, positive] of wheelDirections) {\n if (steps) send({\n type: \"mouse\", action: \"wheel\", button: steps < 0 ? negative : positive,\n count: Math.min(32, Math.abs(steps)), ...position\n });\n }\n }, { ...options, passive: false });\n\n return {\n update(nextColumns, nextRows, nextTracking) {\n if (columns !== nextColumns || rows !== nextRows || tracking !== nextTracking) {\n if (lastPoint) {\n lastPoint = { ...lastPoint,\n x: Math.min(lastPoint.x, nextColumns - 1),\n y: Math.min(lastPoint.y, nextRows - 1)\n };\n }\n // Application mode changes do not transfer ownership mid-gesture.\n if (columns !== nextColumns || rows !== nextRows) cancel(nextTracking !== 0);\n columns = nextColumns;\n rows = nextRows;\n tracking = nextTracking;\n }\n refreshHover();\n },\n refresh() { refreshHover(); },\n cancel() { cancel(); },\n dispose() {\n cancel(false);\n listeners.abort();\n canvas.title = originalTitle;\n canvas.style.cursor = originalCursor;\n }\n };\n}\n", "export function defaultWorkerUrl(kind: \"terminal\" | \"link-detection\"): URL {\n const url = new URL(import.meta.url);\n url.hash = `hex1b-${kind}-worker`;\n return url;\n}\n", "import { captureMouse } from \"./mouse-input.js\";\nimport { defaultWorkerUrl } from \"./worker-url.js\";\nimport { selectTransport, workerWebSocketUrl } from \"./websocket-transport.js\";\nimport { TransportSession } from \"./transport-session.js\";\nimport type { TerminalTransport } from \"./transport-types.js\";\nimport { randomId } from \"./random-id.js\";\nimport { normalizeFont } from \"./terminal-font.js\";\nimport { normalizeRenderer } from \"./renderer-options.js\";\nimport { defaultDarkPalette, defaultLightPalette, normalizeColorMode, normalizePalette } from \"./terminal-palette.js\";\nimport type { TerminalColorMode, TerminalPalette } from \"./terminal-palette.js\";\nimport { paletteScrollbarColors } from \"./scrollbar-colors.js\";\nimport { dimensions, normalizeSizing, requestedGrid } from \"./terminal-sizing.js\";\nimport { HistoryState } from \"./history-state.js\";\nimport { MarkerState } from \"./marker-state.js\";\nimport { normalizePadding, contentSpace, terminalLayout } from \"./terminal-layout.js\";\nimport { normalizeScrollbar, ScrollbarController } from \"./scrollbar.js\";\nimport { ScrollbarTooltip } from \"./scrollbar-tooltip.js\";\nimport type { TerminalInsets, TerminalLayout, TerminalMarker, TerminalMarkerOptions, TerminalPadding,\n TerminalScrollbar, TerminalScrollbarConfiguration } from \"./scrollbar-types.js\";\nimport { terminalThemeCss } from \"./terminal-theme.js\";\nimport { InputPolicy, InputRoute, TerminalAction, inputModifiers } from \"./input-policy.js\";\nimport { assertCommandSize } from \"./protocol.js\";\nimport { SelectionUI } from \"./selection-ui.js\";\nimport { Hyperlinks } from \"./hyperlinks.js\";\nimport { LinkDetection } from \"./link-detection.js\";\nimport { normalizeLinks } from \"./link-options.js\";\nimport type { DetectedLink, LinkDetectionSnapshot } from \"./link-detection.js\";\nimport type { MouseCapture, PointerHyperlink } from \"./mouse-input.js\";\nimport type { CopySelectionOptions, InputActionHandler, InputDecision, InputBinding,\n TerminalActionName, TerminalGeometry, TerminalInput, TerminalInputContext, TerminalPeer,\n TerminalRendererPreference, TerminalSelection, TerminalSizing, TerminalSizingState, TerminalStats, TerminalViewport,\n TerminalProgress, TerminalShellIntegration, TerminalWorkingDirectory, TerminalCommandMark,\n TerminalLinkOptions, TerminalLinkActivation, TerminalPoint,\n WebTerminalHandle, WebTerminalOptions } from \"./types.js\";\nimport type { HyperlinkRange, InputCommand, TerminalCommand, WorkerInputMessage, WorkerOutputMessage } from \"./wire-types.js\";\nimport { errorMessage, isRecord } from \"./validation.js\";\nexport { InputRoute, TerminalAction, defaultInputBindings } from \"./input-policy.js\";\n\nfunction requiredElement<T extends Element>(root: ParentNode, selector: string, type: new () => T): T {\n const element = root.querySelector(selector);\n if (!(element instanceof type)) throw new Error(`Missing terminal element: ${selector}`);\n return element;\n}\n\n/**\n * First-party HWT1 client. Owns only the element it appends, not the caller's\n * container or the server terminal. The HWT1 wire and this spike API evolve together.\n */\nexport class WebTerminal implements WebTerminalHandle {\n readonly element: HTMLDivElement;\n #options: WebTerminalOptions;\n #transport: TerminalTransport;\n #transportSession: TransportSession | undefined;\n #transportFrame: ReturnType<typeof Promise.withResolvers<void>> | undefined;\n #renderer: TerminalRendererPreference;\n #colorMode: TerminalColorMode;\n #palettes: { light: TerminalPalette; dark: TerminalPalette };\n #colorScheme: MediaQueryList | undefined;\n #systemColorChanged = () => {\n if (!this.#disposed && this.#colorMode === \"system\") this.#applyPalette();\n };\n // DOM and worker fields are initialized by mount before a handle is returned.\n #worker!: Worker;\n #surface!: HTMLDivElement;\n #canvas!: HTMLCanvasElement;\n #input!: HTMLTextAreaElement;\n #mouse: MouseCapture | undefined;\n #observer: ResizeObserver | undefined;\n #listeners = new AbortController();\n #size = { width: 0, height: 0 };\n #sizing = normalizeSizing();\n #geometry: TerminalGeometry = { columns: 80, rows: 24, cellWidth: 10, cellHeight: 20, mouseTracking: 0 };\n #peer: TerminalPeer = { id: null, primaryId: null, isPrimary: false };\n #connected = false;\n #closed = false;\n #readOnly: boolean;\n #disposed = false;\n #hasGeometry = false;\n #resizeTimer: ReturnType<typeof setTimeout> | undefined;\n #lastRequested: string | undefined;\n #compositionTimer: ReturnType<typeof setTimeout> | undefined;\n #resetComposition: (() => void) | undefined;\n #ready = Promise.withResolvers<WebTerminal>();\n #readyTimer: ReturnType<typeof setTimeout> | undefined;\n #stats: TerminalStats = {};\n #screenText = \"\";\n #title = \"\";\n #hasTitle = false;\n #progress: TerminalProgress = { state: \"none\", percentage: null };\n #shellIntegration: TerminalShellIntegration = { phase: \"unknown\", lastExitCode: null };\n #workingDirectory: TerminalWorkingDirectory = { uri: null, host: null, path: null };\n #commandMark: TerminalCommandMark | null = null;\n #hasActivity = false;\n #history: HistoryState;\n #markerState: MarkerState;\n #padding: TerminalInsets;\n #scrollbar: false | TerminalScrollbarConfiguration;\n #layout: TerminalLayout;\n #scrollbarController: ScrollbarController | undefined;\n #scrollbarTooltip: ScrollbarTooltip | undefined;\n #layoutNotification = false;\n #markerNotification = false;\n #highlights!: HTMLDivElement;\n #inspection!: HTMLDivElement;\n #inspectionError = \"\";\n #copySerial = 0;\n #copying = false;\n #policy: InputPolicy;\n #actions: Map<string, InputActionHandler>;\n #clipboardAction = false;\n #inputSerial = 0;\n #selectionUI: SelectionUI | undefined;\n #selectionOverlay!: HTMLDivElement;\n #selectionUIError = \"\";\n #canvasSize = { width: 0, height: 0 };\n #hyperlinks = new Hyperlinks();\n #lineRenditions: readonly number[] = [];\n #links: false | TerminalLinkOptions;\n #linkDetector: LinkDetection;\n #linkGeneration = 1;\n #linkRevision = 0;\n #linkSerial = 0;\n #linkSnapshot: LinkDetectionSnapshot | undefined;\n #osc8Rows = new Map<number, HyperlinkRange[]>();\n #detectedLinks: readonly DetectedLink[] = [];\n #presentedLinks: readonly DetectedLink[] = [];\n #detectedRows = new Map<number, { startColumn: number; endColumn: number; link: DetectedLink }[]>();\n #hoveredLinkId: string | undefined;\n #pendingLinks: { revision: number; generation: number; serial: number; links: readonly DetectedLink[] } | undefined;\n\n /** Resolves after a connected terminal frame is presented. Supply signal to cancel mounting. */\n static async mount(container: HTMLElement, options: WebTerminalOptions): Promise<WebTerminal> {\n if (!(container instanceof HTMLElement)) throw new TypeError(\"A terminal container HTMLElement is required\");\n const transport = selectTransport(options);\n if (options.signal?.aborted) throw options.signal.reason;\n if (normalizeRenderer(options.renderer) === \"webgpu\" && (!window.isSecureContext || !navigator.gpu)) {\n throw new Error(\"The requested WebGPU renderer requires WebGPU over HTTPS or localhost\");\n }\n if (!window.Worker || !window.ResizeObserver || !window.OffscreenCanvas ||\n !HTMLCanvasElement.prototype.transferControlToOffscreen) {\n throw new Error(\"WebTerminal requires module workers, ResizeObserver, and a transferable OffscreenCanvas\");\n }\n const terminal = new WebTerminal(options, transport);\n try {\n await Promise.all([terminal.#ready.promise, Promise.resolve().then(() => terminal.#start(container))]);\n return terminal;\n } catch (error) {\n terminal.dispose();\n throw error;\n }\n }\n\n private constructor(options: WebTerminalOptions, transport = selectTransport(options)) {\n this.#options = options;\n this.#transport = transport;\n if (options.readOnly !== undefined && typeof options.readOnly !== \"boolean\")\n throw new TypeError(\"readOnly must be a boolean\");\n this.#readOnly = options.readOnly ?? false;\n this.#renderer = normalizeRenderer(options.renderer);\n this.#colorMode = normalizeColorMode(options.colorMode);\n this.#palettes = {\n light: normalizePalette(options.lightModePalette === undefined ? defaultLightPalette : options.lightModePalette),\n dark: normalizePalette(options.darkModePalette === undefined ? defaultDarkPalette : options.darkModePalette),\n };\n this.#padding = normalizePadding(options.padding);\n this.#scrollbar = normalizeScrollbar(options.scrollbar);\n this.#layout = terminalLayout(this.#size, this.#geometry, false, this.#sizing, this.#padding, this.#scrollbar);\n if (options.workerUrl !== undefined && !(options.workerUrl instanceof URL) &&\n (typeof options.workerUrl !== \"string\" || !options.workerUrl.trim()))\n throw new TypeError(\"workerUrl must be a nonempty URL string or URL\");\n if (options.linkDetectionWorkerUrl !== undefined && !(options.linkDetectionWorkerUrl instanceof URL) &&\n (typeof options.linkDetectionWorkerUrl !== \"string\" || !options.linkDetectionWorkerUrl.trim()))\n throw new TypeError(\"linkDetectionWorkerUrl must be a nonempty URL string or URL\");\n if (options.onLinkDetectionError !== undefined && typeof options.onLinkDetectionError !== \"function\")\n throw new TypeError(\"onLinkDetectionError must be a function\");\n if (options.onSelectionUI !== undefined && (typeof options.onSelectionUI !== \"function\" ||\n options.onSelectionUI.constructor.name === \"AsyncFunction\"))\n throw new TypeError(\"onSelectionUI must be a synchronous event handler\");\n this.#policy = new InputPolicy(options);\n this.#actions = new Map(Object.entries(options.actions ?? {}));\n this.#links = normalizeLinks(options.links, new Set(this.#actions.keys()));\n this.#linkDetector = new LinkDetection({\n workerUrl: options.linkDetectionWorkerUrl === undefined ? undefined : new URL(options.linkDetectionWorkerUrl, location.href),\n actions: new Set(this.#actions.keys()),\n onChange: (revision, links) => {\n if (this.#disposed || !this.#connected || revision !== this.#linkRevision) return;\n this.#detectedLinks = links;\n this.#replacePresentedLinks([]);\n this.#requestLinkDecorations();\n },\n onError: error => {\n if (this.#disposed) return;\n try { this.#options.onStatus?.(`Link detection: ${error.message}`, \"error\"); }\n finally { this.#options.onLinkDetectionError?.(error); }\n },\n });\n this.#linkDetector.configure(this.#links ? this.#links.detection : false);\n this.#history = new HistoryState(command => this.#send(command), () => this.#inspectionChanged());\n this.#markerState = new MarkerState(command => this.#send(command), () => this.#markersChanged());\n this.element = document.createElement(\"div\");\n this.element.className = \"hex1b-terminal\";\n this.element.tabIndex = -1;\n this.element.style.cssText = \"width:100%;height:100%;min-width:0;min-height:0;contain:strict\";\n }\n\n get geometry(): TerminalGeometry { return { ...this.#geometry }; }\n get peer(): TerminalPeer { return { ...this.#peer }; }\n get connected() { return this.#connected; }\n get readOnly(): boolean { return this.#readOnly; }\n /** Current presented workload title; retained on disconnect/dispose. Treat as untrusted text. */\n get title(): string { return this.#title; }\n get progress(): TerminalProgress { return { ...this.#progress }; }\n get shellIntegration(): TerminalShellIntegration { return { ...this.#shellIntegration }; }\n get workingDirectory(): TerminalWorkingDirectory { return { ...this.#workingDirectory }; }\n get commandMark(): TerminalCommandMark | null { return this.#commandMark ? { ...this.#commandMark } : null; }\n get stats(): TerminalStats { return { ...this.#stats }; }\n get screenText() { return this.#screenText; }\n get sizing(): TerminalSizingState { return { ...this.#sizing }; }\n get layout(): TerminalLayout { return this.#layout; }\n get padding(): TerminalInsets { return this.#padding; }\n get scrollbar(): false | TerminalScrollbarConfiguration { return this.#scrollbar; }\n get markers(): readonly TerminalMarker[] { return this.#markerState.markers; }\n get inputBindings(): InputBinding[] { return this.#policy.bindings; }\n get viewport(): TerminalViewport {\n const viewport = this.#history.viewport;\n return { ...viewport, followTail: viewport.following,\n offset: viewport.available ? viewport.liveTop - viewport.top : 0 };\n }\n get selection(): TerminalSelection {\n const selection = this.#history.selection;\n return { ...selection, active: selection.status === \"valid\", pending: selection.status === \"pending\",\n copying: this.#copying, copyError: this.#inspectionError };\n }\n\n #start(container: HTMLElement): void {\n if (this.#options.signal?.aborted) throw this.#options.signal.reason;\n const url = workerWebSocketUrl(this.#transport);\n const scale = this.#options.scale === undefined || this.#options.scale === \"auto\"\n ? Math.min(3, Math.max(0.5, window.devicePixelRatio || 1)) : this.#options.scale;\n if (!Number.isFinite(scale) || scale < 0.5 || scale > 3) throw new RangeError(\"Backing scale must be 0.5-3 or 'auto'\");\n const font = normalizeFont(this.#options.font, location.href);\n this.#sizing = normalizeSizing(this.#options.sizing);\n const shadow = this.element.attachShadow({ mode: \"open\" });\n shadow.innerHTML = `\n <style>\n ${terminalThemeCss}\n :host { display: block; }\n .viewport { position: relative; width: 100%; height: 100%; display: flex; align-items: center; justify-content: center; overflow: hidden; }\n .surface { position: absolute; flex: none; overflow: hidden; }\n canvas { display: block; width: 100%; height: 100%; user-select: none; touch-action: none; }\n .scrollbar-canvas { position: absolute; inset: 0; pointer-events: none; }\n .scrollbar-tooltip-slot { position: absolute; inset: 0; display: block; pointer-events: none; }\n .scrollbar-accessibility { position: absolute; pointer-events: none; outline: none; }\n .highlights { position: absolute; inset: 0; pointer-events: none; overflow: hidden; }\n .highlight { position: absolute; }\n .selection-ui-slot { position: absolute; inset: 0; display: block; pointer-events: none; font: 11px/1.4 var(--cp-view-font-family); color: var(--cp-view-text); }\n .inspection { position: absolute; right: 4px; bottom: 4px; left: 4px; display: flex; flex-wrap: wrap; gap: 4px; justify-content: end; align-items: center; pointer-events: none; font: 11px/1.4 var(--cp-view-font-family); }\n .inspection [hidden] { display: none; }\n .inspection button, .inspection-message { font: inherit; background: var(--cp-view-surface); color: var(--cp-view-text); border: 1px solid var(--cp-view-border-strong); border-radius: .625rem; padding: 4px 8px; }\n .inspection button { pointer-events: auto; cursor: pointer; }\n .inspection button:disabled { opacity: .6; cursor: not-allowed; }\n .inspection button:hover { background: var(--cp-view-accent-soft); }\n .inspection button:focus-visible { outline: 2px solid var(--cp-view-accent); outline-offset: 2px; }\n .inspection-message { color: var(--cp-view-text-muted); max-width: 100%; }\n .inspection-message[data-level=error] { color: var(--cp-view-danger); }\n textarea { position: absolute; width: 1px; height: 1px; opacity: 0; left: 0; top: 0; padding: 0; border: 0; resize: none; }\n </style>\n <div class=\"viewport\"><div class=\"surface\">\n <canvas aria-hidden=\"true\"></canvas>\n <div class=\"highlights\" part=\"selection-highlights\" aria-hidden=\"true\"></div>\n <textarea autocomplete=\"off\" autocapitalize=\"off\" spellcheck=\"false\"></textarea>\n <slot name=\"selection-ui\" class=\"selection-ui-slot\"></slot>\n </div>\n <canvas class=\"scrollbar-canvas\" aria-hidden=\"true\"></canvas>\n <div class=\"scrollbar-accessibility\" role=\"scrollbar\" aria-label=\"Terminal scrollback\" aria-orientation=\"vertical\" tabindex=\"0\"></div>\n <slot name=\"scrollbar-tooltip\" class=\"scrollbar-tooltip-slot\"></slot>\n <div class=\"inspection\">\n <span class=\"inspection-message\" role=\"status\" aria-live=\"polite\" hidden></span>\n <button class=\"copy-selection\" part=\"selection-copy-button\" hidden disabled>Copy</button>\n <button class=\"return-live\" hidden>Return to live</button>\n </div></div>`;\n this.#surface = requiredElement(shadow, \".surface\", HTMLDivElement);\n this.#canvas = requiredElement(shadow, \"canvas\", HTMLCanvasElement);\n this.#input = requiredElement(shadow, \"textarea\", HTMLTextAreaElement);\n this.#highlights = requiredElement(shadow, \".highlights\", HTMLDivElement);\n this.#inspection = requiredElement(shadow, \".inspection\", HTMLDivElement);\n this.#canvas.id = `hex1b-content-${randomId()}`;\n const scrollbarAccessibility = requiredElement(shadow, \".scrollbar-accessibility\", HTMLDivElement);\n scrollbarAccessibility.setAttribute(\"aria-controls\", this.#canvas.id);\n const tooltipOverlay = document.createElement(\"div\");\n tooltipOverlay.slot = \"scrollbar-tooltip\";\n tooltipOverlay.className = \"hex1b-scrollbar-tooltip-overlay\";\n tooltipOverlay.style.cssText = \"position:relative;width:100%;height:100%;pointer-events:none\";\n this.element.append(tooltipOverlay);\n this.#scrollbarTooltip = new ScrollbarTooltip({\n overlay: tooltipOverlay, getDetails: id => this.getCommandMarkDetails(id),\n reportError: error => {\n this.#inspectionError = `Scrollbar tooltip: ${errorMessage(error)}`;\n this.#renderInspectionStatus();\n this.#options.onStatus?.(this.#inspectionError, \"error\");\n }\n });\n this.#scrollbarController = new ScrollbarController({\n element: requiredElement(shadow, \".viewport\", HTMLDivElement),\n canvas: requiredElement(shadow, \".scrollbar-canvas\", HTMLCanvasElement),\n accessibility: scrollbarAccessibility,\n getState: () => ({ layout: this.layout, viewport: this.viewport, markers: this.markers,\n connected: this.#connected, configuration: this.#scrollbar }),\n scrollToRow: top => this.scrollToRow(top),\n scrollToLive: () => this.scrollToLive(),\n scrollToMarker: id => this.scrollToMarker(id),\n onMarkerHover: marker => this.#scrollbarTooltip?.update(marker, this.layout,\n this.#scrollbar ? this.#scrollbar.tooltip : false),\n reportError: error => {\n this.#inspectionError = `Scrollbar: ${errorMessage(error)}`;\n this.#renderInspectionStatus();\n this.#options.onStatus?.(this.#inspectionError, \"error\");\n }\n });\n this.#selectionOverlay = document.createElement(\"div\");\n this.#selectionOverlay.slot = \"selection-ui\";\n this.#selectionOverlay.className = \"hex1b-selection-overlay\";\n this.#selectionOverlay.style.cssText = \"position:relative;width:100%;height:100%;pointer-events:none\";\n this.element.append(this.#selectionOverlay);\n this.#selectionUI = new SelectionUI({\n element: this.element, overlay: this.#selectionOverlay,\n button: requiredElement(this.#inspection, \".copy-selection\", HTMLButtonElement), signal: this.#listeners.signal,\n getState: () => ({ selection: this.selection, viewport: this.viewport, geometry: this.geometry,\n canvasSize: this.#canvasSize, connected: this.#connected, readOnly: this.#readOnly }),\n runAction: this.runAction.bind(this),\n onSelectionUI: this.#options.onSelectionUI,\n reportError: error => {\n this.#selectionUIError = error ? `Selection UI failed: ${errorMessage(error)}` : \"\";\n this.#selectionOverlay.hidden = !!error;\n this.#renderInspectionStatus();\n if (error) this.#options.onStatus?.(this.#selectionUIError, \"error\");\n }\n });\n this.#selectionUI.refresh();\n this.#input.setAttribute(\"aria-label\", this.#options.label || \"Terminal input. Click outside to use page controls.\");\n this.#input.disabled = true;\n container.append(this.element);\n const inspect = (operation: () => void) => {\n try { this.#inspectionError = \"\"; operation(); }\n catch (error) { this.#inspectionError = errorMessage(error); this.#inspectionChanged(); }\n };\n this.#mouse = captureMouse(this.#canvas, command => this.#inputCommand(command), () => this.focus(), {\n lineRenditions: () => this.#lineRenditions,\n state: () => ({ historical: !this.viewport.following || this.viewport.pending, readOnly: this.#readOnly,\n selection: this.selection }),\n begin: (point, selection) => inspect(() => this.#history.begin(point, selection)),\n extend: point => inspect(() => this.#history.extend(point)),\n scroll: (delta, endpoint) => inspect(() => {\n this.#history.scroll(delta, endpoint);\n this.#scrollbarController?.activity();\n }),\n end: cancelled => this.#history.endGesture(cancelled),\n resolve: input => this.#resolveInput(input),\n execute: (decision, input) => this.#executeInputAction(decision, input),\n hyperlink: point => this.#linkAt(point),\n hoverHyperlink: link => {\n this.#hoveredLinkId = link?.id;\n if (this.#links && this.#links.detection && this.#links.detection.decoration === \"hover\")\n this.#requestLinkDecorations();\n },\n openHyperlink: (link, input) => this.#activateLink(link, input),\n });\n this.#bindKeyboard();\n requiredElement(this.#inspection, \".return-live\", HTMLButtonElement).addEventListener(\"click\", () => {\n this.runAction(TerminalAction.ScrollToLive).catch(error => this.#actionFailed(error));\n }, { signal: this.#listeners.signal });\n requiredElement(this.#inspection, \".copy-selection\", HTMLButtonElement).addEventListener(\"click\", () => {\n this.runAction(TerminalAction.CopySelection).catch(error => this.#actionFailed(error));\n }, { signal: this.#listeners.signal });\n requiredElement(shadow, \".viewport\", HTMLDivElement).addEventListener(\"pointerdown\", event => {\n if (event.composedPath().includes(this.#selectionOverlay)) return;\n if ((event.target instanceof Element && event.target.closest(\"button\")) ||\n event.target === this.#canvas || event.target === this.#input) return;\n event.preventDefault();\n this.focus();\n }, { signal: this.#listeners.signal });\n this.#observer = new ResizeObserver(entries => {\n const { width, height } = entries[0].contentRect;\n const changed = width !== this.#size.width || height !== this.#size.height;\n this.#size = { width, height };\n this.#fit();\n if (changed) this.#queueResize();\n });\n // Observe the caller's outer box, never the fitted inner surface.\n this.#observer.observe(container);\n window.addEventListener(\"pagehide\", () => this.dispose(), { signal: this.#listeners.signal });\n this.#options.signal?.addEventListener(\"abort\", () => this.dispose(), { once: true, signal: this.#listeners.signal });\n this.#readyTimer = setTimeout(() => this.#fail(new Error(\"Timed out waiting for the terminal's first frame\")), 30000);\n this.#worker = this.#options.workerUrl === undefined\n ? new Worker(defaultWorkerUrl(\"terminal\"), { type: \"module\", name: \"Hex1b WebTerminal\" })\n : new Worker(new URL(this.#options.workerUrl, location.href), { type: \"module\", name: \"Hex1b WebTerminal\" });\n this.#worker.addEventListener(\"message\", (event: MessageEvent<WorkerOutputMessage>) => this.#message(event.data));\n this.#worker.addEventListener(\"error\", event => {\n event.preventDefault();\n this.#fail(new Error(event.message || \"Terminal worker failed\"));\n });\n this.#worker.addEventListener(\"messageerror\", () => this.#fail(new Error(\"Terminal worker message could not be decoded\")));\n const canvas = this.#canvas.transferControlToOffscreen();\n this.#colorScheme = window.matchMedia?.(\"(prefers-color-scheme: dark)\");\n this.#colorScheme?.addEventListener(\"change\", this.#systemColorChanged);\n this.#post({ type: \"init\", canvas, transport: url === undefined ? { type: \"custom\" } : { type: \"websocket\", url }, scale, font,\n renderer: this.#renderer, palette: this.#palettes[this.resolvedColorMode] }, [canvas]);\n this.#applyPalette();\n this.#postLinkConfiguration();\n }\n\n #message(message: WorkerOutputMessage): void {\n if (this.#disposed) return;\n if (message.type === \"transportConnect\") {\n if (this.#transportSession) { this.#fail(new Error(\"Transport is already initialized\")); return; }\n this.#transportSession = new TransportSession({\n onReady: () => this.#post({ type: \"transportConnected\" }),\n onFrame: buffer => {\n this.#transportFrame = Promise.withResolvers<void>();\n this.#post({ type: \"transportFrame\", buffer }, [buffer]);\n return this.#transportFrame.promise;\n },\n onClose: details => this.#post({ type: \"transportClosed\", details }),\n onError: error => this.#post({ type: \"transportError\", message: error.message })\n });\n this.#transportSession.start(this.#transport);\n } else if (message.type === \"transportSend\") {\n // An ACK can be emitted while accepting an inventory fragment. Release the\n // inbound bridge slot before the adapter can synchronously deliver its reply.\n void Promise.resolve(this.#transportFrame?.promise)\n .then(() => this.#transportSession?.send(message.control))\n .then(() => this.#post({ type: \"transportSent\" }))\n .catch(error => {\n if (!this.#disposed) this.#post({ type: \"transportError\", message: errorMessage(error) });\n });\n } else if (message.type === \"transportReceived\") {\n this.#transportFrame?.resolve();\n this.#transportFrame = undefined;\n } else if (message.type === \"connected\") {\n this.#connected = true;\n this.#input.disabled = !this.#canInput();\n } else if (message.type === \"closed\") {\n if (this.#closed) return;\n this.#closed = true;\n clearTimeout(this.#readyTimer);\n try {\n this.#disconnect();\n if (!this.#disposed) {\n const details = Object.freeze({ ...message.details });\n if (this.#options.transport !== undefined) this.#options.onClose?.(details);\n else if (details.code !== undefined) this.#options.onClose?.(details);\n }\n } finally {\n this.#ready.reject(new Error(`Terminal ${message.details.code === undefined ? \"transport\" : \"WebSocket\"} closed (${\n message.details.code === undefined ? message.details.reason :\n `${message.details.code}${message.details.reason ? `: ${message.details.reason}` : \"\"}`}) before mounting completed`));\n }\n } else if (message.type === \"status\") {\n if (message.level === \"error\") {\n this.#stopTransport();\n this.#disconnect();\n this.#ready.reject(new Error(message.message));\n }\n this.#options.onStatus?.(message.message, message.level);\n } else if (message.type === \"geometry\") {\n this.#lineRenditions = message.lineRenditions ?? [];\n this.#linkRevision = message.revision;\n this.#osc8Rows.clear();\n for (const range of message.hyperlinks) {\n const row = this.#osc8Rows.get(range.row) ?? [];\n row.push(range);\n this.#osc8Rows.set(range.row, row);\n }\n this.#replacePresentedLinks([]);\n this.#pendingLinks = undefined;\n const first = !this.#hasGeometry;\n const geometryChanged = first || ([\"columns\", \"rows\", \"cellWidth\", \"cellHeight\", \"mouseTracking\"] as const)\n .some(field => this.#geometry[field] !== message[field]);\n this.#geometry = {\n columns: message.columns, rows: message.rows,\n cellWidth: message.cellWidth, cellHeight: message.cellHeight, mouseTracking: message.mouseTracking\n };\n this.#hasGeometry = true;\n const oldPeer = this.#peer;\n this.#peer = message.peer;\n this.#input.disabled = !this.#canInput();\n if (this.#canInput() && document.activeElement === this.element && !this.element.shadowRoot?.activeElement) this.focus();\n this.#hyperlinks.update(message.hyperlinks);\n if (geometryChanged || oldPeer.isPrimary !== this.#peer.isPrimary) this.#fit();\n if (!this.#peer.isPrimary) {\n clearTimeout(this.#resizeTimer);\n this.#resizeTimer = undefined;\n this.#lastRequested = undefined;\n }\n if (first || (!oldPeer.isPrimary && this.#peer.isPrimary)) this.#queueResize(true);\n if (this.#lastRequested === `${message.columns}x${message.rows}`) this.#lastRequested = undefined;\n if (Object.hasOwn(message, \"history\")) {\n this.#screenText = message.text;\n this.#markerState.accept(message.history, message.revision);\n this.#history.accept(message.history, message.revision);\n }\n if (message.linkGeneration === this.#linkGeneration) {\n if (message.linkSnapshot) this.#acceptLinkSnapshot(message.linkSnapshot);\n else {\n if (this.#linkSnapshot) this.#linkSnapshot = { ...this.#linkSnapshot, revision: message.revision };\n this.#linkDetector.advance(message.revision);\n }\n }\n this.#mouse?.update(message.columns, message.rows, message.mouseTracking);\n if (geometryChanged) this.#options.onGeometry?.(this.geometry);\n if (first) this.#options.onSizingChange?.(this.sizing);\n if (oldPeer.id !== this.#peer.id || oldPeer.primaryId !== this.#peer.primaryId || oldPeer.isPrimary !== this.#peer.isPrimary) {\n this.#options.onRoleChange?.(this.peer);\n }\n if (!this.#disposed && this.#connected && (this.#peer.id !== null || this.#peer.isPrimary)) {\n const titleChanged = !this.#hasTitle || this.#title !== message.title;\n const progressChanged = !this.#hasActivity || this.#progress.state !== message.progress.state ||\n this.#progress.percentage !== message.progress.percentage;\n const shellChanged = !this.#hasActivity || this.#shellIntegration.phase !== message.shellIntegration.phase ||\n this.#shellIntegration.lastExitCode !== message.shellIntegration.lastExitCode;\n const workingDirectoryChanged = !this.#hasActivity ||\n this.#workingDirectory.uri !== message.workingDirectory.uri;\n const commandMarkChanged = !this.#hasActivity || this.#commandMark?.phase !== message.commandMark?.phase ||\n this.#commandMark?.exitCode !== message.commandMark?.exitCode ||\n this.#commandMark?.rawParameters !== message.commandMark?.rawParameters;\n this.#title = message.title;\n this.#hasTitle = true;\n this.#progress = { ...message.progress };\n this.#shellIntegration = { ...message.shellIntegration };\n this.#workingDirectory = { ...message.workingDirectory };\n this.#commandMark = message.commandMark ? { ...message.commandMark } : null;\n this.#hasActivity = true;\n if (titleChanged) this.#options.onTitleChange?.(this.#title);\n if (!this.#disposed && progressChanged) this.#options.onProgressChange?.(this.progress);\n if (!this.#disposed && shellChanged) this.#options.onShellIntegrationChange?.(this.shellIntegration);\n if (!this.#disposed && workingDirectoryChanged) this.#options.onWorkingDirectoryChange?.(this.workingDirectory);\n if (!this.#disposed && commandMarkChanged) this.#options.onCommandMarkChange?.(this.commandMark);\n }\n } else if (message.type === \"linkSnapshot\") {\n if (message.generation === this.#linkGeneration && message.snapshot.revision === this.#linkRevision)\n this.#acceptLinkSnapshot(message.snapshot);\n } else if (message.type === \"linkDecorations\") {\n const pending = this.#pendingLinks;\n if (this.#connected && pending && pending.serial === message.serial &&\n pending.generation === message.generation && message.generation === this.#linkGeneration &&\n pending.revision === message.revision && message.revision === this.#linkRevision) {\n this.#pendingLinks = undefined;\n this.#replacePresentedLinks(pending.links);\n this.#mouse?.refresh();\n }\n } else if (message.type === \"history\") {\n this.#screenText = message.text;\n this.#markerState.accept(message.history, message.revision);\n this.#history.accept(message.history, message.revision);\n } else if (message.type === \"stats\") {\n this.#stats = message.stats;\n if (message.text !== undefined) this.#screenText = message.text;\n if (message.stats.revision > 0 && this.#hasTitle && this.#hasActivity && this.#connected &&\n (this.#peer.id !== null || this.#peer.isPrimary)) {\n clearTimeout(this.#readyTimer);\n this.#ready.resolve(this);\n }\n this.#options.onStats?.(this.stats, message.text);\n }\n }\n\n #fit() {\n const next = terminalLayout(this.#size, this.#geometry, this.#peer.isPrimary, this.#sizing, this.#padding, this.#scrollbar);\n const changed = JSON.stringify(next) !== JSON.stringify(this.#layout);\n this.#layout = next;\n const { width, height, left, top } = next.content;\n this.#surface.style.width = `${width}px`;\n this.#surface.style.height = `${height}px`;\n this.#surface.style.left = `${left}px`;\n this.#surface.style.top = `${top}px`;\n // Overlay positions use layout pixels, before any ancestor CSS transforms.\n const style = getComputedStyle(this.#surface);\n this.#canvasSize = { width: Number.parseFloat(style.width), height: Number.parseFloat(style.height) };\n this.#selectionUI?.refresh();\n this.#scrollbarController?.refresh();\n if (changed && !this.#layoutNotification) {\n this.#layoutNotification = true;\n queueMicrotask(() => {\n this.#layoutNotification = false;\n if (!this.#disposed) this.#options.onLayoutChange?.(this.layout);\n });\n }\n const dpr = window.devicePixelRatio || 1;\n this.#post({ type: \"viewport\", width: Math.ceil(width * dpr), height: Math.ceil(height * dpr) });\n }\n\n #fittedGrid() {\n return requestedGrid(contentSpace(this.#size, this.#padding, this.#scrollbar), this.#geometry, this.#sizing);\n }\n\n #queueResize(includeFixed = false) {\n if (this.#sizing.mode === \"fixed\" && !includeFixed) return;\n if (!this.#canInput() || !this.#peer.isPrimary || this.#resizeTimer !== undefined || this.#disposed) return;\n // Throttle (rather than debounce) so dragging a primary view updates peers live.\n this.#resizeTimer = setTimeout(() => {\n this.#resizeTimer = undefined;\n const grid = this.#fittedGrid();\n if (!grid || !this.#peer.isPrimary || !this.#canInput()) return;\n const key = `${grid.columns}x${grid.rows}`;\n if ((grid.columns === this.#geometry.columns && grid.rows === this.#geometry.rows) || key === this.#lastRequested) return;\n this.resize(grid.columns, grid.rows);\n }, 50);\n }\n\n #post(message: WorkerInputMessage, transfer: Transferable[] = []): void {\n this.#worker?.postMessage(message, transfer);\n }\n\n #send(command: TerminalCommand): void {\n if (!this.#connected || this.#disposed) throw new Error(\"Terminal view is not connected\");\n if (this.#readOnly && [\"input\", \"paste\", \"key\", \"mouse\", \"resize\", \"requestPrimary\"].includes(command.type))\n throw new Error(\"Terminal view does not accept input\");\n this.#post({ type: \"command\", command });\n }\n\n #inputCommand(command: InputCommand): void {\n if (this.#disposed || !this.#canInput()) return;\n assertCommandSize(command);\n this.#inputSerial++;\n if ([\"input\", \"paste\", \"key\"].includes(command.type) && this.viewport.available) {\n this.#mouse?.cancel();\n if (this.selection.status !== \"none\") this.clearSelection();\n if (!this.viewport.following || this.viewport.pending) this.scrollToLive();\n }\n this.#send(command);\n }\n\n #inspectionChanged() {\n const viewport = this.viewport;\n const selection = this.selection;\n this.#mouse?.refresh();\n if (selection.status === \"invalidated\") this.#mouse?.cancel();\n if (this.#highlights) {\n this.#highlights.replaceChildren(...selection.ranges.map(range => {\n const element = document.createElement(\"span\");\n element.className = \"highlight\";\n element.setAttribute(\"part\", \"selection-highlight\");\n const scaleX = this.#lineRenditions[range.row] ? 2 : 1;\n element.style.cssText = `left:${range.startColumn * scaleX / this.#geometry.columns * 100}%;top:${range.row / this.#geometry.rows * 100}%;width:${(range.endColumn - range.startColumn) * scaleX / this.#geometry.columns * 100}%;height:${100 / this.#geometry.rows}%`;\n return element;\n }));\n const live = requiredElement(this.#inspection, \".return-live\", HTMLButtonElement);\n live.hidden = !viewport.available || (viewport.following && !viewport.pending);\n live.disabled = !this.#connected;\n this.#renderInspectionStatus();\n }\n if (!this.#disposed) this.#selectionUI?.refresh();\n this.#scrollbarController?.refresh();\n this.#options.onViewportChange?.(viewport);\n this.#options.onSelectionChange?.(selection);\n }\n\n scrollLines(delta: number): void { this.#history.scroll(delta); this.#scrollbarController?.activity(); }\n scrollToRow(top: number): void { this.#history.scrollTo(top); this.#scrollbarController?.activity(); }\n scrollToLive() { this.#history.live(); this.#scrollbarController?.activity(); }\n scrollToMarker(id: string): Promise<void> {\n this.#scrollbarController?.activity();\n return this.#markerState.jump(id);\n }\n addMarker(options: TerminalMarkerOptions): Promise<TerminalMarker> { return this.#markerState.add(options); }\n removeMarker(id: string): Promise<void> { return this.#markerState.remove(id); }\n getCommandMarkDetails(id: string): Promise<TerminalCommandMark> { return this.#markerState.details(id); }\n\n #markersChanged(): void {\n this.#scrollbarController?.activity();\n if (this.#markerNotification) return;\n this.#markerNotification = true;\n queueMicrotask(() => {\n this.#markerNotification = false;\n if (!this.#disposed) this.#options.onMarkersChange?.(this.markers);\n });\n }\n\n setPadding(padding: TerminalPadding): void {\n if (this.#disposed) throw new Error(\"Terminal view is disposed\");\n this.#padding = normalizePadding(padding);\n this.#fit();\n this.#queueResize(true);\n }\n\n setScrollbar(scrollbar: TerminalScrollbar): void {\n if (this.#disposed) throw new Error(\"Terminal view is disposed\");\n this.#scrollbar = normalizeScrollbar(scrollbar);\n this.#scrollbarController?.cancel();\n this.#fit();\n this.#queueResize(true);\n }\n\n refreshScrollbar(): void {\n if (this.#disposed) throw new Error(\"Terminal view is disposed\");\n this.#scrollbarController?.invalidate();\n }\n clearSelection() { this.#inspectionError = \"\"; this.#history.clear(); }\n\n /** Re-notifies selection UI hosts after an external styling/policy change. */\n refreshSelectionUI() {\n if (this.#disposed) throw new Error(\"Terminal view is disposed\");\n this.#selectionUI?.refresh(true);\n }\n\n #renderInspectionStatus() {\n if (!this.#inspection) return;\n const selection = this.selection;\n const viewport = this.viewport;\n const status = requiredElement(this.#inspection, \".inspection-message\", HTMLSpanElement);\n status.textContent = this.#selectionUIError || this.#inspectionError || viewport.navigationError ||\n (selection.status === \"unavailable\" ? \"\" : selection.message) ||\n (viewport.available && !viewport.following ? `${viewport.liveTop - viewport.top} rows above live` : \"\");\n status.hidden = !status.textContent;\n status.dataset.level = this.#selectionUIError || this.#inspectionError || viewport.navigationError ||\n selection.status === \"invalidated\" ? \"error\" : \"info\";\n }\n\n #actionFailed(error: unknown): void {\n const failure = error instanceof Error ? error : new Error(String(error));\n this.#inspectionError = `Input action failed: ${failure.message}`;\n this.#inspectionChanged();\n this.#options.onInputError?.(failure);\n }\n\n async copySelection({ clear = false }: CopySelectionOptions = {}): Promise<string> {\n if (typeof clear !== \"boolean\") throw new TypeError(\"Copy clear must be a boolean\");\n const serial = ++this.#copySerial;\n const selectionId = this.selection.requestId;\n const generation = this.viewport.generation;\n this.#inspectionError = \"\";\n try {\n if (!this.#connected || this.#disposed) throw new Error(\"Terminal view is not connected\");\n if (!navigator.clipboard?.write || typeof ClipboardItem !== \"function\") {\n throw new Error(\"Clipboard writing is unavailable. Use a secure browser context with clipboard permission.\");\n }\n const text = this.#history.copy();\n this.#copying = true;\n this.#inspectionChanged();\n // Invoke the clipboard during the user gesture; producer extraction can complete asynchronously.\n const item = new ClipboardItem({ \"text/plain\": text.then(value => new Blob([value], { type: \"text/plain\" })) });\n const [value] = await Promise.all([text, navigator.clipboard.write([item])]);\n if (clear && serial === this.#copySerial && this.selection.status === \"valid\" &&\n this.selection.requestId === selectionId && this.viewport.generation === generation)\n this.clearSelection();\n return value;\n } catch (error) {\n if (serial === this.#copySerial) {\n this.#history.cancelCopy(error);\n this.#inspectionError = `Copy failed: ${errorMessage(error)}`;\n }\n throw error;\n } finally {\n if (serial === this.#copySerial) this.#copying = false;\n this.#inspectionChanged();\n }\n }\n\n #canInput() {\n return this.#connected && this.#hasGeometry && !this.#readOnly &&\n (this.#peer.id !== null || this.#peer.isPrimary);\n }\n\n get inputContext(): TerminalInputContext {\n return Object.freeze({\n terminal: this, selection: this.selection, viewport: this.viewport,\n buffer: this.viewport.buffer ?? null, mouseCaptured: !this.#readOnly && this.#geometry.mouseTracking !== 0,\n historical: !this.viewport.following || this.viewport.pending,\n readOnly: this.#readOnly, connected: this.#connected, peer: this.peer\n });\n }\n\n #resolveInput(input: TerminalInput): InputDecision {\n try {\n const decision = this.#policy.resolve(Object.freeze(input), this.inputContext);\n if (this.#readOnly && decision.route === InputRoute.Application)\n return { route: input.type === \"pointer\" || input.type === \"wheel\" ? InputRoute.Continue : InputRoute.Consume };\n return decision;\n }\n catch (error) {\n this.#actionFailed(error);\n return { route: InputRoute.Consume };\n }\n }\n\n #executeInputAction(decision: Extract<InputDecision, { action: unknown }>, input: TerminalInput): void {\n this.#performAction(decision.action, decision.args, input).catch(error => this.#actionFailed(error));\n }\n\n /** Named actions are shared by controls and bindings. Custom callbacks receive context, args, and input. */\n runAction(action: \"copySelection\", args?: CopySelectionOptions, input?: TerminalInput): Promise<string>;\n runAction(action: \"pasteClipboard\", args?: undefined, input?: TerminalInput): Promise<string>;\n runAction(action: \"copyOrPaste\", args?: undefined, input?: TerminalInput): Promise<string | undefined>;\n runAction(action: \"clearSelection\" | \"scrollToLive\", args?: undefined, input?: TerminalInput): Promise<void>;\n runAction(action: \"scrollLines\", args: number, input?: TerminalInput): Promise<void>;\n runAction<Name extends string>(action: Name extends TerminalActionName ? never : Name,\n args?: unknown, input?: TerminalInput): Promise<unknown>;\n runAction(action: InputActionHandler, args?: unknown, input?: TerminalInput): Promise<unknown>;\n async runAction(action: string | InputActionHandler, args?: unknown, input?: TerminalInput): Promise<unknown> {\n return this.#performAction(action, args, input);\n }\n\n async #performAction(action: string | InputActionHandler, args?: unknown, input?: TerminalInput): Promise<unknown> {\n if (this.#disposed) throw new Error(\"Terminal view is disposed\");\n this.#inspectionError = \"\";\n if (typeof action === \"function\") return action(this.inputContext, args, input);\n const customAction = this.#actions.get(action);\n if (customAction) return customAction(this.inputContext, args, input);\n switch (action) {\n case TerminalAction.CopySelection:\n if (args === undefined) return this.copySelection();\n if (!isRecord(args)) throw new TypeError(\"Copy options must be an object\");\n if (args.clear !== undefined && typeof args.clear !== \"boolean\") throw new TypeError(\"Copy clear must be a boolean\");\n return this.copySelection({ clear: args.clear });\n case TerminalAction.PasteClipboard: return this.pasteClipboard();\n case TerminalAction.ClearSelection: return this.clearSelection();\n case TerminalAction.ScrollToLive: return this.scrollToLive();\n case TerminalAction.ScrollLines:\n if (typeof args !== \"number\") throw new RangeError(\"Scroll delta must be a signed 32-bit integer\");\n return this.scrollLines(args);\n case TerminalAction.CopyOrPaste:\n if (this.#clipboardAction) throw new Error(\"A clipboard action is still in progress. Try again when it finishes.\");\n this.#clipboardAction = true;\n try {\n if (this.selection.active || (this.selection.pending && this.selection.canExtend))\n return await this.copySelection({ clear: true });\n if (!this.#readOnly) return await this.pasteClipboard();\n return;\n } finally { this.#clipboardAction = false; }\n default: throw new TypeError(`Unknown terminal action: ${action}`);\n }\n }\n\n /** Sends an explicit paste through the producer's mode-aware input encoder. */\n paste(text: string): void {\n if (typeof text !== \"string\") throw new TypeError(\"Paste text must be a string\");\n if (!this.#canInput()) throw new Error(\"Terminal view does not accept input\");\n if (text) this.#inputCommand({ type: \"paste\", text });\n }\n\n async pasteClipboard(): Promise<string> {\n if (!this.#canInput()) throw new Error(\"Terminal view does not accept input\");\n if (!navigator.clipboard?.readText)\n throw new Error(\"Clipboard reading is unavailable. Use the browser's paste shortcut instead.\");\n const serial = this.#inputSerial;\n const generation = this.viewport.generation;\n const selectionId = this.selection.requestId;\n const focused = document.activeElement;\n const text = await navigator.clipboard.readText();\n if (!this.#canInput() || serial !== this.#inputSerial || generation !== this.viewport.generation ||\n selectionId !== this.selection.requestId || document.activeElement !== focused)\n throw new Error(\"Terminal input, selection, focus, or buffer changed while reading the clipboard. Paste again.\");\n this.paste(text);\n return text;\n }\n\n get colorMode(): TerminalColorMode { return this.#colorMode; }\n get resolvedColorMode(): \"light\" | \"dark\" {\n return this.#colorMode === \"system\" ? (this.#colorScheme?.matches ? \"dark\" : \"light\") : this.#colorMode;\n }\n\n setColorMode(mode: TerminalColorMode): void {\n if (this.#disposed) throw new Error(\"Terminal view is disposed\");\n if (mode === undefined) throw new TypeError(\"A color mode is required\");\n this.#colorMode = normalizeColorMode(mode);\n this.#applyPalette();\n }\n\n setPalette(mode: \"light\" | \"dark\", palette: TerminalPalette): void {\n if (this.#disposed) throw new Error(\"Terminal view is disposed\");\n if (mode !== \"light\" && mode !== \"dark\") throw new TypeError('Palette mode must be \"light\" or \"dark\"');\n this.#palettes[mode] = normalizePalette(palette);\n if (this.resolvedColorMode === mode) this.#applyPalette();\n }\n\n #applyPalette(): void {\n const palette = this.#palettes[this.resolvedColorMode];\n this.element.dataset.theme = this.resolvedColorMode;\n this.element.style.colorScheme = this.resolvedColorMode;\n this.element.style.backgroundColor = palette.background;\n for (const [name, color] of Object.entries(paletteScrollbarColors(palette)))\n this.element.style.setProperty(`--cp-terminal-scrollbar-${name}`, color);\n this.#post({ type: \"palette\", palette });\n this.#scrollbarController?.refresh();\n }\n\n /** Changes per-view input policy without reconnecting; server authorization remains host-owned. */\n setReadOnly(readOnly: boolean): void {\n if (typeof readOnly !== \"boolean\") throw new TypeError(\"readOnly must be a boolean\");\n if (this.#disposed) throw new Error(\"Terminal view is disposed\");\n if (this.#readOnly === readOnly) return;\n const inputFocused = document.activeElement === this.element &&\n (!this.element.shadowRoot?.activeElement || this.element.shadowRoot.activeElement === this.#input);\n this.#readOnly = readOnly;\n this.#inputSerial++;\n this.#resetComposition?.();\n if (this.#input) {\n this.#input.value = \"\";\n this.#input.disabled = !this.#canInput();\n }\n // Set the policy before cancelling so pending moves and button releases cannot leak.\n this.#mouse?.cancel();\n this.#mouse?.refresh();\n clearTimeout(this.#resizeTimer);\n this.#resizeTimer = undefined;\n this.#lastRequested = undefined;\n this.#queueResize(true);\n if (inputFocused) this.focus();\n this.#selectionUI?.refresh();\n }\n\n setLinks(options: false | TerminalLinkOptions): void {\n if (this.#disposed) throw new Error(\"Terminal view is disposed\");\n if (options === undefined) throw new TypeError(\"Link options must be an object or false\");\n const next = normalizeLinks(options, new Set(this.#actions.keys()));\n this.#links = next;\n this.#linkGeneration++;\n this.#detectedLinks = [];\n this.#replacePresentedLinks([]);\n this.#pendingLinks = undefined;\n this.#linkSnapshot = undefined;\n this.#hoveredLinkId = undefined;\n this.#linkDetector.configure(next ? next.detection : false);\n this.#mouse?.cancel();\n this.#mouse?.refresh();\n this.#postLinkConfiguration();\n }\n\n #postLinkConfiguration(): void {\n const enabled = !!(this.#links && (this.#links.osc8 ||\n (this.#links.detection && this.#links.detection.rules.some(rule => rule.enabled !== false))));\n this.#post({ type: \"linkDetection\", enabled, generation: this.#linkGeneration });\n }\n\n #acceptLinkSnapshot(snapshot: LinkDetectionSnapshot): void {\n this.#linkSnapshot = snapshot;\n this.#detectedLinks = [];\n this.#replacePresentedLinks([]);\n this.#pendingLinks = undefined;\n this.#linkDetector.update(snapshot);\n this.#mouse?.refresh();\n }\n\n #detectedPointerId(link: DetectedLink): string {\n return `detected/${this.#linkGeneration}/${this.#linkRevision}/${link.id}`;\n }\n\n #replacePresentedLinks(links: readonly DetectedLink[]): void {\n this.#presentedLinks = links;\n this.#detectedRows.clear();\n for (const link of links) {\n for (const range of link.activation.ranges) {\n const row = this.#detectedRows.get(range.row) ?? [];\n row.push({ startColumn: range.startColumn, endColumn: range.endColumn, link });\n this.#detectedRows.set(range.row, row);\n }\n }\n }\n\n #requestLinkDecorations(): void {\n if (!this.#worker || !this.#connected || !this.#linkRevision) return;\n const detection = this.#links && this.#links.detection;\n if (!detection) return;\n const visible = detection.decoration === \"none\" ? [] : detection.decoration === \"hover\"\n ? this.#detectedLinks.filter(link => this.#detectedPointerId(link) === this.#hoveredLinkId)\n : this.#detectedLinks;\n this.#pendingLinks = { revision: this.#linkRevision, generation: this.#linkGeneration,\n serial: ++this.#linkSerial, links: this.#detectedLinks };\n this.#post({ type: \"linkDecorations\", revision: this.#linkRevision, generation: this.#linkGeneration,\n serial: this.#linkSerial, ranges: visible.flatMap(link => link.activation.ranges),\n underlineStyle: detection.underlineStyle ?? \"solid\" });\n }\n\n #linkAt(point: TerminalPoint): PointerHyperlink | null {\n if (!this.#connected || this.viewport.pending || !this.#links) return null;\n const osc8 = this.#osc8Rows.get(point.y)?.find(range =>\n point.x >= range.startColumn && point.x < range.endColumn);\n if (osc8) {\n if (this.#links.osc8 === false) return null;\n const target = this.#links.osc8\n ? (!/[\\u0000-\\u0020\\u007f]/u.test(osc8.uri) && URL.canParse(osc8.uri) ? osc8.uri : null)\n : this.#hyperlinks.at(point);\n if (!target || (this.#links.osc8 && this.#linkSnapshot?.revision !== this.#linkRevision)) return null;\n return { id: `osc8/${this.#linkGeneration}/${this.#linkRevision}/${osc8.row}/${osc8.startColumn}/${osc8.endColumn}`,\n target, activation: \"modifierClick\" };\n }\n const detection = this.#links.detection;\n if (!detection) return null;\n const link = this.#detectedRows.get(point.y)?.find(range =>\n point.x >= range.startColumn && point.x < range.endColumn)?.link;\n return link ? { id: this.#detectedPointerId(link), target: link.activation.target,\n activation: detection.activation ?? \"modifierClick\" } : null;\n }\n\n #activateLink(pointer: PointerHyperlink, input: TerminalInput): void {\n if (input.type !== \"pointer\" || this.#linkAt(input.point)?.id !== pointer.id || !this.#links) return;\n const detected = this.#presentedLinks.find(link => this.#detectedPointerId(link) === pointer.id);\n if (detected) {\n this.#performAction(detected.action, detected.activation, input).catch(error => this.#actionFailed(error));\n return;\n }\n if (!this.#links.osc8) {\n try { window.open(pointer.target, \"_blank\", \"noopener,noreferrer\"); }\n catch (error) { this.#actionFailed(error); }\n return;\n }\n const range = this.#osc8Rows.get(input.point.y)?.find(range =>\n input.point.x >= range.startColumn && input.point.x < range.endColumn);\n const snapshot = this.#linkSnapshot;\n if (!range || !snapshot) return;\n let text = \"\";\n for (let column = range.startColumn; column < range.endColumn; column++) {\n const cell = snapshot.cells[range.row * snapshot.columns + column];\n if (cell?.width && !(cell.attributes & 64)) text += cell.text;\n }\n const activation: TerminalLinkActivation = Object.freeze({\n source: \"osc8\", ruleId: null, kind: \"uri\", target: pointer.target, text,\n revision: this.#linkRevision,\n ranges: Object.freeze([Object.freeze({ row: range.row, startColumn: range.startColumn, endColumn: range.endColumn })]),\n });\n this.#performAction(this.#links.osc8.action, activation, input).catch(error => this.#actionFailed(error));\n }\n\n #forwardInput(input: TerminalInput): void {\n if (input.type === \"key\") {\n if (input.meta) throw new Error(\"Meta has no terminal key encoding; bind this shortcut to a local action instead.\");\n this.#inputCommand({ type: \"key\", key: input.key, ctrl: input.ctrl, alt: input.alt, shift: input.shift });\n } else if (input.type === \"paste\") {\n if (this.#canInput()) this.paste(input.text);\n } else if (input.type === \"text\") {\n this.#inputCommand({ type: \"input\", text: input.text });\n }\n }\n\n #dispatchInput(input: TerminalInput, event?: Event, allowApplication = true): void {\n const decision = this.#resolveInput(input);\n // Shortcuts may run on inspection controls, but Enter/Space must still activate the control.\n if (!allowApplication && decision.action === undefined && decision.route !== InputRoute.Consume) return;\n if (decision.route === InputRoute.Browser ||\n (decision.route === InputRoute.Continue && input.type === \"key\")) return;\n event?.preventDefault();\n event?.stopPropagation();\n if (decision.action !== undefined) this.#executeInputAction(decision, input);\n else if (decision.route !== InputRoute.Consume) {\n try { this.#forwardInput(input); }\n catch (error) { this.#actionFailed(error); }\n }\n }\n\n #bindKeyboard() {\n const input = this.#input;\n const options = { signal: this.#listeners.signal };\n let composing = false;\n let compositionCommit: string | null = null;\n this.#resetComposition = () => {\n composing = false;\n compositionCommit = null;\n clearTimeout(this.#compositionTimer);\n };\n this.element.addEventListener(\"keydown\", event => {\n if (event.defaultPrevented) return;\n if (event.composedPath().includes(this.#selectionOverlay)) return;\n const target = event.composedPath()[0];\n if (!this.#connected || event.isComposing || composing || event.key === \"Process\" || event.key === \"Dead\") return;\n if (event.getModifierState(\"AltGraph\")) return;\n this.#dispatchInput({ type: \"key\", key: event.key, code: event.code, repeat: event.repeat,\n ...inputModifiers(event) }, event, target === input || target === this.element);\n }, { ...options, capture: true });\n input.addEventListener(\"paste\", event => {\n if (event.defaultPrevented || !this.#connected || !event.clipboardData) return;\n this.#dispatchInput({ type: \"paste\", text: event.clipboardData.getData(\"text/plain\") }, event);\n input.value = \"\";\n }, options);\n input.addEventListener(\"compositionstart\", () => {\n if (!this.#canInput()) return;\n composing = true;\n compositionCommit = null;\n clearTimeout(this.#compositionTimer);\n }, options);\n input.addEventListener(\"compositionend\", event => {\n if (!composing) return;\n composing = false;\n // Accommodate browsers placing the final input before or after compositionend.\n compositionCommit = typeof event.data === \"string\" ? event.data : input.value;\n this.#compositionTimer = setTimeout(() => {\n if (compositionCommit) this.#dispatchInput({ type: \"text\", text: compositionCommit });\n compositionCommit = null;\n input.value = \"\";\n }, 0);\n }, options);\n input.addEventListener(\"input\", event => {\n const inputEvent = event instanceof InputEvent ? event : undefined;\n if (inputEvent?.isComposing || composing) return;\n clearTimeout(this.#compositionTimer);\n const text = compositionCommit ?? inputEvent?.data ?? input.value;\n compositionCommit = null;\n if (text && inputEvent?.inputType !== \"insertFromPaste\") this.#dispatchInput({ type: \"text\", text }, event);\n input.value = \"\";\n }, options);\n }\n\n focus() {\n if (this.#disposed) return;\n const target = this.#canInput() ? this.#input : this.element;\n target.focus({ preventScroll: true });\n }\n\n /** Request HMP1 primary explicitly; peer notifications confirm the result. */\n requestPrimary() {\n if (!this.#canInput()) throw new Error(\"Terminal view does not accept input\");\n if (this.#size.width <= 0 || this.#size.height <= 0) throw new Error(\"Show the terminal container before taking primary\");\n const grid = this.#fittedGrid();\n if (!grid) throw new Error(\"Show the terminal container before taking primary\");\n if (this.#peer.id === null) {\n if (!this.#peer.isPrimary) throw new Error(\"Waiting for the HMP1 connection\");\n this.resize(grid.columns, grid.rows);\n return;\n }\n this.#send({ type: \"requestPrimary\", ...grid });\n }\n\n /** Request a grid; never reflow locally before the authoritative response. */\n resize(columns: number, rows: number): void {\n const grid = dimensions(columns, rows);\n if (!this.#canInput()) throw new Error(\"Terminal view does not accept input\");\n if (!this.#peer.isPrimary) throw new Error(\"Only the primary view can request a terminal resize\");\n this.#send({ type: \"resize\", ...grid });\n this.#lastRequested = `${columns}x${rows}`;\n }\n\n /** Change the primary's sizing policy; applied grid dimensions still come from the server. */\n setSizing(sizing: TerminalSizing): void {\n const next = normalizeSizing(sizing, this.#sizing.fontSize);\n if (!this.#connected || this.#disposed) throw new Error(\"Terminal view is not connected\");\n if (this.#readOnly) throw new Error(\"Terminal view does not accept input\");\n if (!this.#peer.isPrimary) throw new Error(\"Only the primary view can change terminal sizing\");\n this.#sizing = next;\n clearTimeout(this.#resizeTimer);\n this.#resizeTimer = undefined;\n this.#lastRequested = undefined;\n this.#fit();\n this.#queueResize(true);\n this.#options.onSizingChange?.(this.sizing);\n }\n\n resync() { this.#send({ type: \"resync\" }); }\n\n #disconnect() {\n this.#inputSerial++;\n this.#connected = false;\n this.#hyperlinks.update([]);\n this.#osc8Rows.clear();\n this.#detectedLinks = [];\n this.#replacePresentedLinks([]);\n this.#linkSnapshot = undefined;\n this.#pendingLinks = undefined;\n this.#linkDetector.clear();\n if (this.#input) this.#input.disabled = true;\n this.#mouse?.update(1, 1, 0);\n this.#history.disconnect();\n this.#markerState.disconnect();\n this.#scrollbarController?.cancel();\n this.#inspectionChanged();\n clearTimeout(this.#resizeTimer);\n this.#resizeTimer = undefined;\n }\n\n #fail(error: Error): void {\n if (this.#disposed) return;\n this.#stopTransport();\n this.#disconnect();\n this.#ready.reject(error);\n this.#options.onStatus?.(error.message, \"error\");\n this.#worker?.terminate();\n }\n\n /** Detach this view. The server-side shared terminal is not terminated. */\n dispose() {\n if (this.#disposed) return;\n this.#disposed = true;\n this.#stopTransport();\n this.#disconnect();\n this.#linkDetector.dispose();\n this.#ready.reject(new DOMException(\"Terminal view was disposed\", \"AbortError\"));\n clearTimeout(this.#readyTimer);\n clearTimeout(this.#compositionTimer);\n this.#observer?.disconnect();\n this.#colorScheme?.removeEventListener(\"change\", this.#systemColorChanged);\n this.#mouse?.dispose();\n this.#scrollbarController?.dispose();\n this.#scrollbarTooltip?.dispose();\n this.#listeners.abort();\n this.#post({ type: \"stop\" });\n this.#worker?.terminate();\n this.element.remove();\n }\n\n #stopTransport(): void {\n this.#transportSession?.dispose();\n this.#transportFrame?.reject(new DOMException(\"Terminal transport was disposed or closed\", \"AbortError\"));\n this.#transportFrame = undefined;\n }\n}\n", "import type { TerminalMarker } from \"./scrollbar-types.js\";\nimport type { TerminalPalette } from \"./terminal-palette.js\";\n\n// Fallbacks for standalone controllers without a mounted terminal's palette tokens.\nexport const scrollbarColors = Object.freeze({\n track: \"#202020\",\n thumb: \"#999999\",\n marker: \"#aaaaaa\",\n error: \"#eeeeee\",\n prompt: \"#666666\",\n \"command-line\": \"#888888\",\n executing: \"#bbbbbb\",\n success: \"#999999\",\n custom: \"#dddddd\"\n});\n\nexport function paletteScrollbarColors(palette: TerminalPalette) {\n const foreground = [1, 3, 5].map(offset => parseInt(palette.foreground.slice(offset, offset + 2), 16));\n const background = [1, 3, 5].map(offset => parseInt(palette.background.slice(offset, offset + 2), 16));\n const shade = (weight: number) => \"#\" + foreground.map((channel, index) =>\n Math.round(channel * weight + background[index]! * (1 - weight)).toString(16).padStart(2, \"0\")).join(\"\");\n return Object.freeze({\n track: shade(0.5),\n thumb: palette.foreground,\n marker: shade(0.78),\n error: palette.foreground,\n prompt: shade(0.45),\n \"command-line\": shade(0.6),\n executing: shade(0.85),\n success: shade(0.7),\n custom: shade(0.95)\n });\n}\n\nexport function scrollbarMarkerColor(\n marker: TerminalMarker, resolve: (name: keyof typeof scrollbarColors) => string\n): string {\n if (marker.source === \"custom\") return resolve(\"custom\");\n if (marker.exitCode != null && marker.exitCode !== 0) return resolve(\"error\");\n switch (marker.phase) {\n case \"prompt\": return resolve(\"prompt\");\n case \"commandLine\": return resolve(\"command-line\");\n case \"executing\": return resolve(\"executing\");\n case \"finished\": return resolve(marker.exitCode === 0 ? \"success\" : \"marker\");\n default: return resolve(\"marker\");\n }\n}\n", "export const MIN_FONT_SIZE = 8;\nexport const MAX_FONT_SIZE = 32;\nconst NATIVE_FONT_SIZE = 16;\n\nexport function dimensions(columns: number, rows: number): TerminalGrid {\n if (!Number.isInteger(columns) || columns < 1 || columns > 300 ||\n !Number.isInteger(rows) || rows < 1 || rows > 100) {\n throw new RangeError(\"Requested grid must be 1-300 columns by 1-100 rows\");\n }\n return { columns, rows };\n}\n\nexport function normalizeSizing(sizing: TerminalSizing = { mode: \"auto\" }, previousFontSize = NATIVE_FONT_SIZE): TerminalSizingState {\n if (!sizing || ![\"auto\", \"fixed\"].includes(sizing.mode)) {\n throw new TypeError(\"Sizing mode must be 'auto' or 'fixed'\");\n }\n const fontSize = sizing.fontSize ?? previousFontSize;\n if (!Number.isInteger(fontSize) || fontSize < MIN_FONT_SIZE || fontSize > MAX_FONT_SIZE) {\n throw new RangeError(`Font size must be an integer from ${MIN_FONT_SIZE} to ${MAX_FONT_SIZE}`);\n }\n return sizing.mode === \"fixed\"\n ? { mode: \"fixed\", fontSize, ...dimensions(sizing.columns, sizing.rows) }\n : { mode: \"auto\", fontSize };\n}\n\nexport function requestedGrid(size: TerminalSize, geometry: TerminalGeometry, sizing: TerminalSizingState): TerminalGrid | null {\n if (sizing.mode === \"fixed\") return { columns: sizing.columns, rows: sizing.rows };\n if (size.width <= 0 || size.height <= 0) return null;\n const scale = sizing.fontSize / NATIVE_FONT_SIZE;\n return {\n columns: Math.max(1, Math.min(300, Math.floor(size.width / (geometry.cellWidth * scale)))),\n rows: Math.max(1, Math.min(100, Math.floor(size.height / (geometry.cellHeight * scale))))\n };\n}\n\nexport function fittedScale(size: TerminalSize, geometry: TerminalGeometry, isPrimary: boolean, sizing: TerminalSizingState): number {\n const maximum = isPrimary && sizing.mode === \"auto\" ? sizing.fontSize / NATIVE_FONT_SIZE : Infinity;\n return Math.max(0, Math.min(maximum,\n size.width / (geometry.columns * geometry.cellWidth),\n size.height / (geometry.rows * geometry.cellHeight)));\n}\nimport type { TerminalGeometry, TerminalGrid, TerminalSize, TerminalSizing, TerminalSizingState } from \"./types.js\";\n", "const unavailable = \"Text history is not available for this terminal view\";\nconst expired = \"Selection expired: its text was changed, evicted, reset, or resized. Select the text again.\";\nconst changedBeforeCopy = \"Selection changed before copy completed. Copy the new selection again.\";\n\n/** Commands contain producer identities; text and ranges are never inferred from painted cells. */\nexport class HistoryState {\n #send: (command: TerminalCommand) => void;\n #change: () => void;\n #history: HistoryMetadata | null = null;\n #revision = 0;\n #nextRequest = 0;\n #selectionRequest = 0;\n #viewportRequest = 0;\n #pendingMode: SelectionMode = \"character\";\n #pendingAction = \"clear\";\n #pendingCopy: PendingCopy | undefined;\n #deferredEndpoint: TerminalPoint | undefined;\n\n constructor(send: (command: TerminalCommand) => void, change: () => void = () => {}) {\n this.#send = send;\n this.#change = change;\n }\n\n get viewport(): HistoryViewport {\n if (!this.#history) return { available: false, following: true, pending: false };\n const { selection, copy, markers, markerResult, markerPage, viewportError, ...viewport } = this.#history;\n return { ...viewport, rowIds: [...viewport.rowIds], available: true, revision: this.#revision,\n ...(viewportError && viewport.requestId >= this.#viewportRequest ? { navigationError: viewportError } : {}),\n pending: viewport.requestId < this.#viewportRequest };\n }\n\n get selection(): HistorySelectionState {\n if (!this.#history) return { status: \"unavailable\", mode: \"character\", ranges: [], text: null, message: unavailable };\n const selection = this.#history.selection;\n if (selection.requestId < this.#selectionRequest || this.#deferredEndpoint) {\n return { requestId: this.#selectionRequest, status: \"pending\", mode: this.#pendingMode,\n canExtend: this.#pendingAction !== \"clear\",\n ranges: this.#pendingAction === \"clear\" ? [] : selection.ranges.map(range => ({ ...range })), text: null,\n message: \"Resolving selection\u2026\" };\n }\n return { ...selection, canExtend: selection.status === \"valid\",\n ranges: selection.ranges.map(range => ({ ...range })), revision: this.#revision,\n message: selection.status === \"invalidated\" ? expired : \"\" };\n }\n\n accept(history: HistoryMetadata | null, revision: number): boolean {\n if (revision <= this.#revision) return false;\n const previousGeneration = this.#history?.generation;\n this.#history = history;\n this.#revision = revision;\n if (!history || (previousGeneration && previousGeneration !== history.generation) ||\n history.selection.status === \"invalidated\") {\n this.endGesture(true);\n this.#rejectCopy(new Error(expired));\n }\n const pending = this.#pendingCopy;\n if (pending && history?.copy?.requestId === pending.requestId) {\n if (history.copy.status !== \"valid\" || history.selection.status !== \"valid\" ||\n history.selection.requestId !== pending.selectionRequestId ||\n history.generation !== pending.generation || this.#selectionRequest > pending.selectionRequestId ||\n history.copy.text !== history.selection.text) {\n this.#rejectCopy(new Error(expired));\n } else {\n clearTimeout(pending.timer);\n this.#pendingCopy = undefined;\n pending.resolve(history.copy.text);\n }\n }\n if (this.#deferredEndpoint && !this.viewport.pending) {\n const point = this.#deferredEndpoint;\n this.#deferredEndpoint = undefined;\n this.extend(point);\n }\n this.#change();\n return true;\n }\n\n #requireHistory(): HistoryMetadata {\n if (!this.#history) throw new Error(unavailable);\n return this.#history;\n }\n\n #pointRowId(point: TerminalPoint): string {\n const history = this.#requireHistory();\n if (!point || !Number.isInteger(point.x) || point.x < 0 || point.x > 1023 ||\n !Number.isInteger(point.y) || point.y < 0 ||\n typeof history.rowIds[point.y] !== \"string\" || !history.rowIds[point.y].length) {\n throw new Error(\"Terminal viewport is not ready for that selection point. Wait for the next frame and try again.\");\n }\n return history.rowIds[point.y];\n }\n\n #selectionChanged(mode = this.selection.mode, action = \"extend\") {\n this.#rejectCopy(new Error(changedBeforeCopy));\n this.#pendingMode = mode;\n this.#pendingAction = action;\n this.#selectionRequest = ++this.#nextRequest;\n return this.#selectionRequest;\n }\n\n begin(point: TerminalPoint, { mode, extend = false }: { mode: SelectionMode; extend?: boolean }): void {\n const rowId = this.#pointRowId(point);\n this.#deferredEndpoint = undefined;\n const requestId = this.#selectionChanged(mode, extend ? \"extend\" : \"start\");\n this.#send({ type: \"selection\", action: extend ? \"extend\" : \"start\", mode, requestId,\n generation: this.#requireHistory().generation, rowId, column: point.x });\n this.#change();\n }\n\n extend(point: TerminalPoint): void {\n this.#pointRowId(point);\n if (this.viewport.pending) {\n this.#rejectCopy(new Error(changedBeforeCopy));\n this.#pendingMode = this.selection.mode;\n this.#pendingAction = \"extend\";\n this.#deferredEndpoint = { ...point };\n this.#change();\n return;\n }\n this.begin(point, { mode: this.selection.mode, extend: true });\n }\n\n scroll(delta: number, endpoint?: TerminalPoint): void {\n this.#requireHistory();\n if (!Number.isSafeInteger(delta) || delta < -2147483648 || delta > 2147483647) throw new RangeError(\"Scroll delta must be a signed 32-bit integer\");\n if (endpoint) this.#pointRowId(endpoint);\n if (!delta && !endpoint) return;\n if (endpoint) this.#deferredEndpoint = undefined;\n else this.#flushDeferredEndpoint();\n const requestId = endpoint ? this.#selectionChanged() : ++this.#nextRequest;\n this.#viewportRequest = requestId;\n this.#send({ type: \"viewport\", requestId, delta,\n ...(endpoint ? { extend: { row: endpoint.y, column: endpoint.x } } : {}) });\n this.#change();\n }\n\n live() {\n this.#requireHistory();\n this.#flushDeferredEndpoint();\n this.#viewportRequest = ++this.#nextRequest;\n this.#send({ type: \"viewport\", live: true, requestId: this.#viewportRequest });\n this.#change();\n }\n\n scrollTo(top: number): void {\n const history = this.#requireHistory();\n if (!Number.isSafeInteger(top) || top < 0 || top > 2147483647)\n throw new RangeError(\"Scroll top must be a nonnegative 32-bit integer\");\n this.#flushDeferredEndpoint();\n this.#viewportRequest = ++this.#nextRequest;\n this.#send({ type: \"viewport\", requestId: this.#viewportRequest,\n top: Math.min(top, history.liveTop), generation: history.generation,\n originRowId: history.rowIds[0], originTop: history.top });\n this.#change();\n }\n\n clear() {\n this.#requireHistory();\n this.#deferredEndpoint = undefined;\n const requestId = this.#selectionChanged(this.selection.mode, \"clear\");\n this.#send({ type: \"selection\", action: \"clear\", requestId });\n this.#change();\n }\n\n endGesture(cancelled = false) {\n if (cancelled && this.#deferredEndpoint) {\n this.#deferredEndpoint = undefined;\n this.#change();\n }\n }\n\n #flushDeferredEndpoint() {\n if (!this.#deferredEndpoint) return;\n const endpoint = this.#deferredEndpoint;\n this.#deferredEndpoint = undefined;\n // Preserve command order if another scroll overtakes the pending presentation.\n this.scroll(0, endpoint);\n }\n cancelCopy(error: unknown): void { this.#rejectCopy(error); }\n\n copy(): Promise<string> {\n const history = this.#requireHistory();\n const selection = this.selection;\n if (selection.status !== \"valid\") throw new Error(selection.message || \"Select text before copying.\");\n this.#rejectCopy(new Error(\"A newer copy request replaced this request.\"));\n const requestId = ++this.#nextRequest;\n const { promise, resolve, reject } = Promise.withResolvers<string>();\n const timer = setTimeout(() => this.#rejectCopy(new Error(\"Timed out resolving selection. Copy again.\")), 10000);\n this.#pendingCopy = { requestId, selectionRequestId: selection.requestId, generation: history.generation,\n resolve, reject, timer };\n try {\n this.#send({ type: \"copy\", requestId, selectionRequestId: selection.requestId, generation: history.generation });\n } catch (error) {\n this.#rejectCopy(error);\n }\n return promise;\n }\n\n #rejectCopy(error: unknown): void {\n if (!this.#pendingCopy) return;\n clearTimeout(this.#pendingCopy.timer);\n this.#pendingCopy.reject(error);\n this.#pendingCopy = undefined;\n }\n\n disconnect() {\n this.#rejectCopy(new Error(\"Terminal view disconnected before copy completed.\"));\n this.#deferredEndpoint = undefined;\n }\n}\nimport type { SelectionMode, TerminalPoint, TerminalSelection, TerminalViewport } from \"./types.js\";\nimport type { HistoryMetadata, TerminalCommand } from \"./wire-types.js\";\n\ntype OmitEach<T, K extends PropertyKey> = T extends unknown ? Omit<T, K> : never;\ntype HistoryViewport = OmitEach<TerminalViewport, \"followTail\" | \"offset\">;\ntype HistorySelectionState = OmitEach<TerminalSelection, \"active\" | \"pending\" | \"copying\" | \"copyError\">;\ninterface PendingCopy {\n requestId: number; selectionRequestId: number; generation: string;\n resolve: (text: string) => void; reject: (error: unknown) => void;\n timer: ReturnType<typeof setTimeout>;\n}\n", "import { fittedScale } from \"./terminal-sizing.js\";\nimport { isRecord } from \"./validation.js\";\nimport type { TerminalGeometry, TerminalSize, TerminalSizingState } from \"./types.js\";\nimport type { TerminalInsets, TerminalLayout, TerminalPadding, TerminalScrollbarConfiguration } from \"./scrollbar-types.js\";\n\nexport function normalizePadding(value: TerminalPadding = 0): TerminalInsets {\n if (typeof value !== \"number\" && !isRecord(value)) throw new TypeError(\"Padding must be a number or per-edge object\");\n const edge = (name: keyof TerminalInsets) => {\n const amount = typeof value === \"number\" ? value : value[name] === undefined ? 0 : value[name];\n if (typeof amount !== \"number\" || !Number.isFinite(amount) || amount < 0)\n throw new RangeError(`Padding ${name} must be finite nonnegative CSS pixels`);\n return amount;\n };\n return Object.freeze({ top: edge(\"top\"), right: edge(\"right\"), bottom: edge(\"bottom\"), left: edge(\"left\") });\n}\n\nexport function contentSpace(size: TerminalSize, padding: TerminalInsets,\n scrollbar: false | TerminalScrollbarConfiguration): TerminalSize {\n return {\n width: Math.max(0, size.width - padding.left - padding.right - (scrollbar && scrollbar.placement === \"beside\" ? scrollbar.width : 0)),\n height: Math.max(0, size.height - padding.top - padding.bottom)\n };\n}\n\nexport function terminalLayout(size: TerminalSize, geometry: TerminalGeometry, primary: boolean,\n sizing: TerminalSizingState, padding: TerminalInsets, scrollbar: false | TerminalScrollbarConfiguration): TerminalLayout {\n const available = contentSpace(size, padding, scrollbar);\n const scale = fittedScale(available, geometry, primary, sizing);\n const width = geometry.columns * geometry.cellWidth * scale;\n const height = geometry.rows * geometry.cellHeight * scale;\n const left = Math.min(size.width, padding.left) + (available.width - width) / 2;\n const top = Math.min(size.height, padding.top) + (available.height - height) / 2;\n const trackWidth = scrollbar ? Math.min(scrollbar.width,\n scrollbar.placement === \"overlay\" ? width : Math.max(0, size.width - padding.right - left - width)) : 0;\n return Object.freeze({\n width: size.width, height: size.height,\n content: Object.freeze({ left, top, width, height }),\n scrollbar: scrollbar ? Object.freeze({\n left: left + width - (scrollbar.placement === \"overlay\" ? trackWidth : 0),\n top, width: trackWidth, height\n }) : null,\n padding,\n cellWidth: width / geometry.columns,\n cellHeight: height / geometry.rows\n });\n}\n", "import type {\n TerminalScrollbarAppearance, TerminalScrollbarPartAppearance\n} from \"./scrollbar-appearance.js\";\nimport type { TerminalScrollbarFrame, TerminalScrollbarRenderer } from \"./scrollbar-types.js\";\n\n// Canvas accepts some environment-dependent colors (notably currentColor) as valid.\n// Reject them before asking the browser to parse concrete CSS color syntax.\nconst contextualColor = /\\b(?:var|env|attr|light-dark|currentcolor|inherit|initial|unset|revert|revert-layer|default|context-fill|context-stroke|accentcolor|accentcolortext|activetext|buttonborder|buttonface|buttontext|canvas|canvastext|field|fieldtext|graytext|highlight|highlighttext|linktext|mark|marktext|selecteditem|selecteditemtext|visitedtext|activeborder|activecaption|appworkspace|background|buttonhighlight|buttonshadow|captiontext|inactiveborder|inactivecaption|inactivecaptiontext|infobackground|infotext|menu|menutext|scrollbar|threeddarkshadow|threedface|threedhighlight|threedlightshadow|threedshadow|window|windowframe|windowtext)\\b/i;\n\nfunction assertObject(value: unknown, name: string): void {\n if (value === null || typeof value !== \"object\" ||\n Object.prototype.toString.call(value) !== \"[object Object]\")\n throw new TypeError(`${name} must be an options object`);\n}\n\nfunction snapshotAppearance(appearance: TerminalScrollbarAppearance = {}) {\n assertObject(appearance, \"scrollbar.appearance\");\n let validationContext: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D | null | undefined;\n const color = (value: unknown, name: string): string | undefined => {\n if (value === undefined) return undefined;\n if (typeof value !== \"string\" || value.length > 256 || !value.trim() ||\n /\\\\|\\/\\*|--/.test(value) || contextualColor.test(value))\n throw new TypeError(`${name} must be a concrete CSS color of 1-256 characters`);\n const result = value.trim();\n if (validationContext === undefined) {\n validationContext = typeof OffscreenCanvas !== \"undefined\"\n ? new OffscreenCanvas(1, 1).getContext(\"2d\")\n : typeof document !== \"undefined\" ? document.createElement(\"canvas\").getContext(\"2d\") : null;\n }\n if (!validationContext)\n throw new TypeError(`${name} requires a browser canvas to validate CSS colors`);\n // Invalid assignments retain the old fillStyle. Two different sentinels also\n // accept valid colors that happen to equal either sentinel after serialization.\n validationContext.fillStyle = \"#010203\";\n validationContext.fillStyle = result;\n const first = validationContext.fillStyle;\n validationContext.fillStyle = \"#040506\";\n validationContext.fillStyle = result;\n if (first !== validationContext.fillStyle)\n throw new TypeError(`${name} must be a valid concrete CSS color`);\n return result;\n };\n const part = (value: TerminalScrollbarPartAppearance | undefined, fallback: number, name: string) => {\n if (value !== undefined) assertObject(value, name);\n const { color: partColor, opacity = fallback } = value ?? {};\n if (typeof opacity !== \"number\" || !Number.isFinite(opacity) || opacity < 0 || opacity > 1)\n throw new RangeError(`${name}.opacity must be a finite number between 0 and 1`);\n return Object.freeze({ color: color(partColor, `${name}.color`), opacity });\n };\n const { track, thumb, markers } = appearance;\n const markerPart = part(markers, 1, \"scrollbar.appearance.markers\");\n return Object.freeze({\n track: part(track, 0.35, \"scrollbar.appearance.track\"),\n thumb: part(thumb, 1, \"scrollbar.appearance.thumb\"),\n markers: Object.freeze({\n ...markerPart, errorColor: color(markers?.errorColor, \"scrollbar.appearance.markers.errorColor\")\n })\n });\n}\n\n/**\n * Creates a synchronous capsule scrollbar painter with snapshotted paint overrides.\n * Omitted colors are read from each frame. Invalid options throw at creation time.\n * Circular markers move aside near the thumb and paint behind it.\n * One smooth contour surrounds nearby displaced markers and tapers back into the track.\n * Track ends are rounded; focus does not add an outline.\n */\nexport function createDefaultScrollbarRenderer(\n appearance?: TerminalScrollbarAppearance\n): TerminalScrollbarRenderer {\n const options = snapshotAppearance(appearance);\n return frame => {\n if (frame.opacity <= 0) return;\n const { context, track, thumb, colors } = frame;\n const alpha = context.globalAlpha * frame.opacity;\n context.save();\n try {\n context.globalAlpha = alpha * options.track.opacity;\n context.fillStyle = options.track.color ?? colors.track;\n if (track.width > 0 && track.height > 0) {\n const step = 2, padding = 6, taper = 12;\n const radius = Math.min(track.width, track.height) / 2;\n const right = track.left + track.width, bottom = track.top + track.height;\n let offsets: Float64Array | undefined;\n let left = track.left;\n for (const { bounds } of frame.markers) {\n if (bounds.width <= 0 || bounds.height <= 0 || bounds.left >= track.left ||\n bounds.top >= track.top + track.height || bounds.top + bounds.height <= track.top) continue;\n const buffer = padding * Math.min(1, (track.left - bounds.left) / bounds.width);\n const shadowLeft = Math.max(0, bounds.left - buffer);\n if (shadowLeft >= track.left) continue;\n left = Math.min(left, shadowLeft);\n offsets ??= new Float64Array(Math.ceil(track.height / step) + 1);\n const first = Math.max(0, Math.floor((bounds.top - padding - taper - track.top) / step));\n const last = Math.min(offsets.length - 1,\n Math.ceil((bounds.top + bounds.height + padding + taper - track.top) / step));\n for (let i = first; i <= last; i++) {\n const y = track.top + Math.min(i * step, track.height);\n const distance = Math.max(bounds.top - padding - y, y - bounds.top - bounds.height - padding, 0);\n const proximity = Math.max(0, 1 - distance / taper);\n const extent = (track.left - shadowLeft) * proximity * proximity * (3 - 2 * proximity);\n // A shared envelope bridges nearby marks without density-dependent darkening or scallops.\n offsets[i] = Math.max(offsets[i]!, extent);\n }\n }\n if (offsets) {\n const gradient = context.createLinearGradient(left, 0, track.left, 0);\n gradient.addColorStop(0, \"transparent\");\n gradient.addColorStop(1, options.track.color ?? colors.track);\n context.fillStyle = gradient;\n const topLeft = track.left - offsets[0]!;\n const bottomLeft = track.left - offsets[offsets.length - 1]!;\n // Round an extended shadow within its padding, without cutting into floated marks.\n const topRadius = topLeft < track.left ? Math.min(radius, padding) : radius;\n const bottomRadius = bottomLeft < track.left ? Math.min(radius, padding) : radius;\n context.beginPath();\n context.moveTo(right - radius, track.top);\n context.lineTo(topLeft + topRadius, track.top);\n context.quadraticCurveTo(topLeft, track.top, topLeft, track.top + topRadius);\n let straight = false;\n for (let i = 1; i < offsets.length - 1; i++) {\n const y = track.top + i * step;\n const nextY = track.top + Math.min((i + 1) * step, track.height);\n if (y - step / 2 <= track.top + topRadius || (y + nextY) / 2 >= bottom - bottomRadius) continue;\n if (offsets[i - 1] === offsets[i] && offsets[i] === offsets[i + 1]) {\n straight = true;\n continue;\n }\n const x = track.left - offsets[i]!, nextX = track.left - offsets[i + 1]!;\n if (straight) {\n context.lineTo((track.left - offsets[i - 1]! + x) / 2, y - step / 2);\n straight = false;\n }\n context.quadraticCurveTo(x, y, (x + nextX) / 2, (y + nextY) / 2);\n }\n context.lineTo(bottomLeft, bottom - bottomRadius);\n context.quadraticCurveTo(bottomLeft, bottom, bottomLeft + bottomRadius, bottom);\n context.lineTo(right - radius, bottom);\n context.quadraticCurveTo(right, bottom, right, bottom - radius);\n context.lineTo(right, track.top + radius);\n context.quadraticCurveTo(right, track.top, right - radius, track.top);\n context.closePath();\n context.fill();\n } else {\n context.beginPath();\n context.roundRect(track.left, track.top, track.width, track.height, radius);\n context.fill();\n }\n }\n context.globalAlpha = alpha * options.markers.opacity;\n for (const { marker, bounds, color } of frame.markers) {\n context.fillStyle = marker.exitCode != null && marker.exitCode !== 0\n ? options.markers.errorColor ?? color ?? colors.error : options.markers.color ?? color ?? colors.marker;\n // Keep the historical per-marker override and invalid-color fallback.\n if (marker.color) context.fillStyle = marker.color;\n if (bounds.width > 0 && bounds.height > 0) {\n context.beginPath();\n context.roundRect(bounds.left, bounds.top, bounds.width, bounds.height,\n Math.min(bounds.width, bounds.height) / 2);\n context.fill();\n }\n }\n\n if (thumb.width > 0 && thumb.height > 0) {\n const inset = Math.min(2, thumb.width / 4);\n const width = thumb.width - inset * 2;\n context.globalAlpha = alpha * options.thumb.opacity;\n context.fillStyle = options.thumb.color ?? colors.thumb;\n context.beginPath();\n context.roundRect(thumb.left + inset, thumb.top, width, thumb.height,\n Math.min(width, thumb.height) / 2);\n context.fill();\n }\n\n } finally {\n context.restore();\n }\n };\n}\n\nconst defaultRenderer = createDefaultScrollbarRenderer();\n\n/** Paints the built-in appearance without changing the caller's canvas drawing state. */\nexport function renderDefaultScrollbar(frame: TerminalScrollbarFrame): void {\n defaultRenderer(frame);\n}\n", "import type {\n TerminalLayout, TerminalMarker, TerminalRectangle, TerminalScrollbar,\n TerminalScrollbarConfiguration, TerminalScrollbarMarker\n} from \"./scrollbar-types.js\";\nimport type { TerminalViewport } from \"./types.js\";\nimport { renderDefaultScrollbar } from \"./scrollbar-renderer.js\";\nimport { scrollbarColors, scrollbarMarkerColor } from \"./scrollbar-colors.js\";\nexport { renderDefaultScrollbar } from \"./scrollbar-renderer.js\";\n\nexport function normalizeScrollbar(input?: TerminalScrollbar): false | TerminalScrollbarConfiguration {\n if (input === false) return false;\n if (input !== undefined && (input === null || typeof input !== \"object\" || Array.isArray(input)))\n throw new TypeError(\"scrollbar must be false or an options object\");\n const options = input ?? {};\n const number = (value: number | undefined, fallback: number, name: string, min = 0, max = Infinity) => {\n const result = value === undefined ? fallback : value;\n if (!Number.isFinite(result) || result < min || result > max)\n throw new RangeError(`scrollbar.${name} must be a finite number between ${min} and ${max}`);\n return result;\n };\n if (options.placement !== undefined && options.placement !== \"overlay\" && options.placement !== \"beside\")\n throw new TypeError(\"scrollbar.placement must be overlay or beside\");\n if (options.markers !== undefined && typeof options.markers !== \"boolean\")\n throw new TypeError(\"scrollbar.markers must be boolean\");\n if (options.render !== undefined && (typeof options.render !== \"function\" ||\n options.render.constructor.name === \"AsyncFunction\"))\n throw new TypeError(\"scrollbar.render must be a synchronous function\");\n if (options.tooltip !== undefined && options.tooltip !== false &&\n (typeof options.tooltip !== \"function\" || options.tooltip.constructor.name === \"AsyncFunction\"))\n throw new TypeError(\"scrollbar.tooltip must be false or a synchronous function\");\n return Object.freeze({\n placement: options.placement ?? \"overlay\",\n width: number(options.width, 12, \"width\", 4, 64),\n proximity: number(options.proximity, 24, \"proximity\"),\n hideDelay: number(options.hideDelay, 900, \"hideDelay\"),\n fadeDuration: number(options.fadeDuration, 300, \"fadeDuration\"),\n markers: options.markers ?? true,\n ...(options.render ? { render: options.render } : {}),\n ...(options.tooltip !== undefined ? { tooltip: options.tooltip } : {})\n });\n}\n\nconst clamp = (value: number, min: number, max: number) => Math.max(min, Math.min(max, value));\nconst contains = (rect: TerminalRectangle, x: number, y: number, margin = 0) =>\n x >= rect.left - margin && x < rect.left + rect.width + margin &&\n y >= rect.top - margin && y < rect.top + rect.height + margin;\nconst containsCircle = (rect: TerminalRectangle, x: number, y: number) => {\n if (!contains(rect, x, y)) return false;\n const radius = Math.min(rect.width, rect.height) / 2;\n const centerX = rect.left + rect.width / 2;\n return (x - centerX) ** 2 + (y - rect.top - rect.height / 2) ** 2 <= radius ** 2;\n};\n\nexport function scrollbarOpacity(now: number, lastActivityAt: number, active: boolean,\n configuration: TerminalScrollbarConfiguration, reducedMotion: boolean): number {\n if (configuration.placement === \"beside\" || active) return 1;\n const elapsed = now - lastActivityAt - configuration.hideDelay;\n if (elapsed < 0) return 1;\n if (reducedMotion || configuration.fadeDuration === 0) return 0;\n return clamp(1 - elapsed / configuration.fadeDuration, 0, 1);\n}\n\nexport function scrollbarGeometry(layout: TerminalLayout, viewport: TerminalViewport,\n markers: readonly TerminalMarker[], target: number | null = null) {\n const track = layout.scrollbar;\n if (!track || track.width <= 0 || track.height <= 0 || !viewport.available ||\n viewport.buffer !== \"main\" || viewport.liveTop <= 0) return null;\n const visibleRows = Math.max(1, viewport.totalRows - viewport.liveTop);\n const height = Math.min(track.height, Math.max(24, track.height * visibleRows / viewport.totalRows));\n const thumb = Object.freeze({\n left: track.left, top: track.top + (track.height - height) *\n clamp(target ?? viewport.top, 0, viewport.liveTop) / viewport.liveTop,\n width: track.width, height\n });\n const diameter = Math.min(5, track.height, (thumb.width - Math.min(2, thumb.width / 4) * 2) * 0.75);\n const circleLeft = track.left + (track.width - diameter) / 2;\n const displacedLeft = Math.max(0, track.left - diameter - 2);\n const approachRange = Math.min(8, track.height);\n const ticks: TerminalScrollbarMarker[] = markers\n .filter(marker => marker.buffer === viewport.buffer && marker.row !== null &&\n Number.isFinite(marker.row) && marker.row >= 0 && marker.row < viewport.totalRows &&\n (marker.source === \"custom\" || marker.phase !== \"prompt\"))\n .map(marker => {\n const top = track.top + (track.height - diameter) * marker.row! / Math.max(1, viewport.totalRows - 1);\n const distance = Math.max(thumb.top - top - diameter, top - thumb.top - thumb.height, 0);\n const proximity = 1 - clamp(distance / approachRange, 0, 1);\n const displacement = proximity * proximity * (3 - 2 * proximity);\n const left = circleLeft + (displacedLeft - circleLeft) * displacement;\n return Object.freeze({\n marker: Object.freeze({ ...marker }),\n bounds: Object.freeze({\n left, top, width: diameter, height: diameter\n })\n });\n });\n return Object.freeze({ track: Object.freeze({ ...track }), thumb, markers: Object.freeze(ticks) });\n}\n\nexport function scrollbarMarkerAt(markers: readonly TerminalScrollbarMarker[], x: number, y: number,\n track?: TerminalRectangle) {\n const inTrack = !!track && contains(track, x, y);\n return markers.filter(({ bounds }) => inTrack\n ? y >= bounds.top - 3 && y < bounds.top + bounds.height + 3\n : containsCircle(bounds, x, y))\n .sort((a, b) => Math.abs(a.bounds.top + a.bounds.height / 2 - y) -\n Math.abs(b.bounds.top + b.bounds.height / 2 - y) ||\n (a.marker.id < b.marker.id ? -1 : a.marker.id > b.marker.id ? 1 : 0))[0]?.marker;\n}\n\ninterface ScrollbarState {\n layout: TerminalLayout;\n viewport: TerminalViewport;\n markers: readonly TerminalMarker[];\n connected: boolean;\n configuration: false | TerminalScrollbarConfiguration;\n}\n\ninterface ScrollbarControllerOptions {\n element: HTMLElement;\n canvas: HTMLCanvasElement;\n accessibility: HTMLDivElement;\n getState: () => ScrollbarState;\n scrollToRow: (top: number) => void;\n scrollToLive: () => void;\n scrollToMarker: (id: string) => Promise<void>;\n reportError: (error: unknown) => void;\n onMarkerHover?: (marker: TerminalScrollbarMarker | null) => void;\n}\n\nexport class ScrollbarController {\n private context: CanvasRenderingContext2D | null | undefined;\n private readonly listeners: (() => void)[] = [];\n private readonly motion: MediaQueryList | undefined;\n private configuration: false | TerminalScrollbarConfiguration | undefined;\n private frameId: number | undefined;\n private fadeTimer: ReturnType<typeof setTimeout> | undefined;\n private disposed = false;\n private failed = false;\n private dormant = false;\n private near = false;\n private hovered = false;\n private focused = false;\n private lastActivityAt = -Infinity;\n private pointer: number | null = null;\n private dragOffset: number | null = null;\n private contentPointers = new Set<number>();\n private contentClick = false;\n private suppressClick = false;\n private desired: number | null = null;\n private dragTop: number | null = null;\n private visualTop: number | null = null;\n private visualTarget: number | null = null;\n private visualFrom = 0;\n private visualStartedAt = 0;\n private queued: number | null = null;\n private requestBaseline = 0;\n private generation: string | undefined;\n private wheelRemainder = 0;\n private hoverPoint: { clientX: number; clientY: number } | null = null;\n\n constructor(private readonly options: ScrollbarControllerOptions) {\n this.motion = typeof matchMedia === \"function\" ? matchMedia(\"(prefers-reduced-motion: reduce)\") : undefined;\n const on = <K extends keyof HTMLElementEventMap>(target: HTMLElement, name: K,\n handler: (event: HTMLElementEventMap[K]) => void, passive = false) => {\n target.addEventListener(name, handler, { capture: true, passive });\n this.listeners.push(() => target.removeEventListener?.(name, handler, { capture: true }));\n };\n on(options.element, \"pointerdown\", event => this.pointerDown(event));\n on(options.element, \"pointermove\", event => this.pointerMove(event));\n on(options.element, \"pointerup\", event => this.pointerEnd(event, false));\n on(options.element, \"pointercancel\", event => this.pointerEnd(event, true));\n on(options.element, \"lostpointercapture\", event => this.pointerEnd(event, true));\n on(options.element, \"pointerleave\", () => {\n this.near = this.hovered = false;\n this.clearHover();\n this.activity();\n });\n on(options.element, \"wheel\", event => this.wheel(event));\n for (const name of [\"mousedown\", \"mouseup\", \"click\", \"dblclick\", \"contextmenu\"] as const)\n on(options.element, name, event => {\n if (this.contentPointers.size || this.contentClick) return;\n if (this.pointer !== null || this.hit(event) ||\n (this.suppressClick && (name === \"click\" || name === \"mouseup\"))) {\n this.consume(event);\n if (name === \"click\") this.suppressClick = false;\n }\n });\n on(options.accessibility, \"keydown\", event => this.keyDown(event));\n on(options.accessibility, \"focus\", () => { this.focused = true; this.activity(); });\n on(options.accessibility, \"blur\", () => { this.focused = false; this.activity(); });\n if (this.motion) {\n const changed = () => this.invalidate();\n this.motion.addEventListener(\"change\", changed);\n this.listeners.push(() => this.motion?.removeEventListener(\"change\", changed));\n }\n options.accessibility.setAttribute(\"role\", \"scrollbar\");\n options.accessibility.setAttribute(\"aria-label\", \"Terminal scrollback\");\n options.accessibility.setAttribute(\"aria-orientation\", \"vertical\");\n options.accessibility.style.position = \"absolute\";\n options.accessibility.style.background = \"transparent\";\n this.refresh();\n }\n\n refresh(): void {\n if (this.disposed) return;\n const state = this.options.getState();\n if (state.configuration !== this.configuration) {\n this.cancel();\n this.configuration = state.configuration;\n this.failed = false;\n this.lastActivityAt = this.now();\n }\n if (state.viewport.generation !== this.generation) {\n this.endGesture();\n this.desired = this.queued = null;\n this.visualTop = this.visualTarget = null;\n this.generation = state.viewport.generation;\n }\n if (this.pointer === null && this.queued === null && state.viewport.available &&\n !state.viewport.pending && (state.viewport.top === this.desired ||\n state.viewport.requestId > this.requestBaseline)) this.desired = null;\n this.updateVisualPosition(state);\n const geometry = this.geometry(state);\n if (!geometry) {\n this.cancel();\n this.options.accessibility.hidden = true;\n this.options.accessibility.tabIndex = -1;\n this.clear();\n return;\n }\n const { track } = geometry;\n const accessibility = this.options.accessibility;\n accessibility.hidden = false;\n accessibility.tabIndex = 0;\n if (accessibility.matches?.(\":focus\")) this.focused = true;\n Object.assign(accessibility.style, {\n left: `${track.left}px`, top: `${track.top}px`,\n width: `${track.width}px`, height: `${track.height}px`\n });\n accessibility.setAttribute(\"aria-valuemin\", \"0\");\n accessibility.setAttribute(\"aria-valuemax\", String(state.viewport.liveTop));\n accessibility.setAttribute(\"aria-valuenow\", String(this.desired ?? state.viewport.top));\n accessibility.setAttribute(\"aria-valuetext\", state.viewport.following ? \"Live terminal output\" :\n `Scrollback row ${this.desired ?? state.viewport.top}`);\n accessibility.setAttribute(\"aria-busy\", String(state.viewport.pending));\n this.refreshHover(geometry);\n this.schedule();\n }\n\n activity(): void {\n if (this.disposed) return;\n this.dormant = false;\n this.lastActivityAt = this.now();\n if (this.fadeTimer !== undefined) clearTimeout(this.fadeTimer);\n this.fadeTimer = undefined;\n this.schedule();\n }\n\n invalidate(): void {\n this.dormant = false;\n this.refresh();\n }\n\n cancel(): void {\n this.clearHover();\n this.endGesture();\n this.contentPointers.clear();\n this.contentClick = false;\n this.desired = this.queued = null;\n this.visualTop = this.visualTarget = null;\n this.near = this.hovered = this.focused = this.suppressClick = false;\n this.dormant = false;\n this.wheelRemainder = 0;\n if (this.frameId !== undefined) cancelAnimationFrame(this.frameId);\n if (this.fadeTimer !== undefined) clearTimeout(this.fadeTimer);\n this.frameId = this.fadeTimer = undefined;\n this.options.accessibility.hidden = true;\n this.options.accessibility.tabIndex = -1;\n this.options.accessibility.title = \"\";\n this.clear();\n }\n\n dispose(): void {\n if (this.disposed) return;\n this.disposed = true;\n this.cancel();\n for (const remove of this.listeners) remove();\n this.options.accessibility.hidden = true;\n this.options.accessibility.tabIndex = -1;\n }\n\n private now() { return performance.now(); }\n\n private updateVisualPosition(state: ScrollbarState, advance = false) {\n if (!state.viewport.available) return;\n // Only presentation is fractional; desired/queued remain authoritative row requests.\n const target = clamp(this.dragTop ?? this.desired ?? state.viewport.top, 0, state.viewport.liveTop);\n const now = this.now();\n if (this.visualTop === null || this.dragTop !== null || this.motion?.matches || this.dormant) {\n this.visualFrom = this.visualTop = this.visualTarget = target;\n this.visualStartedAt = now;\n return;\n }\n if (target !== this.visualTarget) {\n this.visualFrom = this.visualTop;\n this.visualTarget = target;\n this.visualStartedAt = now;\n }\n if (advance) {\n const progress = clamp((now - this.visualStartedAt) / 120, 0, 1);\n this.visualTop = progress === 1 ? target :\n this.visualFrom + (target - this.visualFrom) * (1 - (1 - progress) ** 3);\n }\n }\n\n private geometry(state = this.options.getState()) {\n return state.connected && state.configuration ?\n scrollbarGeometry(state.layout, state.viewport, state.configuration.markers ? state.markers : [],\n this.visualTop ?? this.desired) : null;\n }\n\n private point(event: Pick<MouseEvent, \"clientX\" | \"clientY\">) {\n const bounds = this.options.element.getBoundingClientRect();\n const layout = this.options.getState().layout;\n return {\n x: bounds.width > 0 ? (event.clientX - bounds.left) * layout.width / bounds.width : -Infinity,\n y: bounds.height > 0 ? (event.clientY - bounds.top) * layout.height / bounds.height : -Infinity\n };\n }\n\n private hit(event: MouseEvent) {\n const geometry = this.geometry();\n const point = this.point(event);\n return !!geometry && (contains(geometry.track, point.x, point.y) || !!this.markerAt(geometry, point));\n }\n\n private markerAt(geometry: NonNullable<ReturnType<typeof scrollbarGeometry>>, point: { x: number; y: number }) {\n if (contains(geometry.thumb, point.x, point.y)) return undefined;\n const configuration = this.options.getState().configuration;\n if (!contains(geometry.track, point.x, point.y) &&\n (this.failed || !configuration || scrollbarOpacity(this.now(), this.lastActivityAt,\n this.near || this.hovered || this.focused || this.pointer !== null,\n configuration, this.motion?.matches ?? false) <= 0)) return undefined;\n return scrollbarMarkerAt(geometry.markers, point.x, point.y, geometry.track);\n }\n\n private consume(event: Event) {\n event.preventDefault();\n event.stopImmediatePropagation();\n }\n\n private pointerDown(event: PointerEvent) {\n this.clearHover();\n this.suppressClick = false;\n this.contentClick = false;\n if (!this.hit(event)) {\n this.contentPointers.add(event.pointerId);\n this.contentClick = true;\n return;\n }\n if (this.contentPointers.size) { this.contentClick = true; return; }\n this.consume(event);\n if (event.button !== 0 || this.pointer !== null) return;\n const geometry = this.geometry()!;\n const point = this.point(event);\n this.pointer = event.pointerId;\n try { this.options.element.setPointerCapture(event.pointerId); }\n catch (error) {\n this.endGesture();\n this.report(error);\n return;\n }\n this.options.accessibility.setAttribute(\"data-pointer-active\", \"true\");\n this.options.accessibility.focus({ preventScroll: true });\n this.focused = true;\n this.activity();\n if (contains(geometry.thumb, point.x, point.y)) {\n this.dragOffset = point.y - geometry.thumb.top;\n const viewport = this.options.getState().viewport;\n if (viewport.available) this.dragTop = this.visualTop ?? this.desired ?? viewport.top;\n return;\n }\n const marker = this.markerAt(geometry, point);\n if (marker) { this.jump(marker.id); return; }\n const viewport = this.options.getState().viewport;\n if (viewport.available) this.navigate((this.desired ?? viewport.top) +\n (point.y < geometry.thumb.top ? -1 : 1) * Math.max(1, viewport.totalRows - viewport.liveTop));\n }\n\n private pointerMove(event: PointerEvent) {\n const geometry = this.geometry();\n if (!geometry) return;\n const point = this.point(event);\n if (this.pointer === event.pointerId) {\n this.consume(event);\n if (this.dragOffset !== null) {\n const viewport = this.options.getState().viewport;\n const travel = geometry.track.height - geometry.thumb.height;\n if (viewport.available && travel > 0) {\n this.dragTop = clamp((point.y - this.dragOffset - geometry.track.top) / travel * viewport.liveTop,\n 0, viewport.liveTop);\n this.navigate(this.dragTop);\n }\n }\n this.activity();\n return;\n }\n if (this.contentPointers.size || event.buttons !== 0) { this.clearHover(); return; }\n const previous = this.hoveredMarker(geometry);\n this.hoverPoint = { clientX: event.clientX, clientY: event.clientY };\n const marker = this.refreshHover(geometry);\n if (previous?.marker.id !== marker?.marker.id) {\n this.dormant = false;\n this.schedule();\n }\n if (this.hovered) this.consume(event);\n }\n\n private refreshHover(geometry: NonNullable<ReturnType<typeof scrollbarGeometry>>) {\n if (geometry && this.hoverPoint && this.pointer === null && !this.contentPointers.size) {\n const point = this.point(this.hoverPoint);\n const configuration = this.options.getState().configuration;\n const near = contains(geometry.track, point.x, point.y, configuration ? configuration.proximity : 0);\n const hovered = contains(geometry.track, point.x, point.y) || !!this.markerAt(geometry, point);\n if (near !== this.near || hovered !== this.hovered) {\n this.near = near;\n this.hovered = hovered;\n this.activity();\n }\n // Proximity can reveal a previously faded circle under this same pointer.\n this.hovered = contains(geometry.track, point.x, point.y) || !!this.markerAt(geometry, point);\n }\n const marker = this.hoveredMarker(geometry);\n this.options.onMarkerHover?.(marker);\n return marker;\n }\n\n private clearHover() {\n this.hoverPoint = null;\n this.options.onMarkerHover?.(null);\n }\n\n private hoveredMarker(geometry = this.geometry()): TerminalScrollbarMarker | null {\n if (!this.hoverPoint || this.pointer !== null || this.contentPointers.size) return null;\n if (!geometry) return null;\n const point = this.point(this.hoverPoint);\n const marker = this.markerAt(geometry, point);\n return geometry.markers.find(tick => tick.marker.id === marker?.id) ?? null;\n }\n\n private pointerEnd(event: PointerEvent, cancelled: boolean) {\n this.contentPointers.delete(event.pointerId);\n if (this.pointer !== event.pointerId) return;\n this.consume(event);\n this.suppressClick = !cancelled;\n this.endGesture();\n if (cancelled) {\n this.desired = this.queued = null;\n this.visualTop = this.visualTarget = null;\n }\n this.updateVisualPosition(this.options.getState());\n this.activity();\n }\n\n private endGesture() {\n const pointer = this.pointer;\n this.pointer = this.dragOffset = null;\n this.dragTop = null;\n this.options.accessibility.setAttribute(\"data-pointer-active\", \"false\");\n if (pointer !== null) {\n try {\n if (this.options.element.hasPointerCapture(pointer)) this.options.element.releasePointerCapture(pointer);\n } catch (error) { this.report(error); }\n }\n }\n\n private wheel(event: WheelEvent) {\n if (this.contentPointers.size || !this.hit(event)) return;\n this.consume(event);\n const { viewport, layout } = this.options.getState();\n if (!viewport.available || !Number.isFinite(event.deltaY)) return;\n const rows = Math.max(1, viewport.totalRows - viewport.liveTop);\n const bounds = this.options.element.getBoundingClientRect();\n const scale = layout.height > 0 ? bounds.height / layout.height : 1;\n this.wheelRemainder += event.deltaY * (event.deltaMode === 2 ? rows :\n event.deltaMode === 1 ? 1 : 1 / Math.max(1, layout.cellHeight * scale));\n const amount = Math.trunc(this.wheelRemainder);\n this.wheelRemainder -= amount;\n if (amount !== 0) this.navigate((this.desired ?? viewport.top) + amount);\n this.activity();\n }\n\n private keyDown(event: KeyboardEvent) {\n const { viewport } = this.options.getState();\n if (!this.geometry() || !viewport.available || event.ctrlKey || event.metaKey) return;\n const top = this.desired ?? viewport.top;\n const page = Math.max(1, viewport.totalRows - viewport.liveTop);\n if (event.altKey && (event.key === \"ArrowDown\" || event.key === \"ArrowUp\")) {\n this.consume(event);\n const forward = event.key === \"ArrowDown\";\n const markers = this.geometry()!.markers.map(tick => tick.marker)\n .filter(marker => forward ? marker.row! > top : marker.row! < top)\n .sort((a, b) => (forward ? 1 : -1) * (a.row! - b.row!) ||\n (a.id < b.id ? -1 : a.id > b.id ? 1 : 0));\n if (markers[0]) this.jump(markers[0].id);\n this.activity();\n return;\n }\n if (event.altKey) return;\n const targets: Record<string, number> = {\n ArrowUp: top - 1, ArrowDown: top + 1, PageUp: top - page, PageDown: top + page,\n Home: 0, End: viewport.liveTop\n };\n if (!Object.hasOwn(targets, event.key)) return;\n this.consume(event);\n this.navigate(targets[event.key]!);\n this.activity();\n }\n\n private jump(id: string) {\n this.desired = this.queued = null;\n try { void this.options.scrollToMarker(id).catch(error => this.report(error)); }\n catch (error) { this.report(error); }\n }\n\n private navigate(top: number) {\n const state = this.options.getState();\n const viewport = state.viewport;\n if (!viewport.available || !Number.isFinite(top)) return;\n const target = Math.round(clamp(top, 0, viewport.liveTop));\n if (this.dragTop === null || target !== (this.desired ?? viewport.top)) {\n this.requestBaseline = viewport.requestId;\n this.queued = target;\n }\n this.desired = target;\n this.updateVisualPosition(state);\n this.schedule();\n }\n\n private schedule() {\n if (this.disposed || this.frameId !== undefined || !this.geometry() ||\n (this.dormant && this.queued === null) ||\n typeof requestAnimationFrame !== \"function\") return;\n this.frameId = requestAnimationFrame(() => {\n this.frameId = undefined;\n this.paint();\n });\n }\n\n private clear() {\n if (!this.context) return;\n this.context.save();\n this.context.setTransform(1, 0, 0, 1, 0, 0);\n this.context.clearRect(0, 0, this.options.canvas.width, this.options.canvas.height);\n this.context.restore();\n }\n\n private paint() {\n if (this.disposed) return;\n let state = this.options.getState();\n if (!this.geometry(state) || !state.configuration) return;\n if (this.queued !== null) {\n const target = this.queued;\n this.queued = null;\n try {\n if (state.viewport.available && target >= state.viewport.liveTop) this.options.scrollToLive();\n else this.options.scrollToRow(target);\n } catch (error) { this.desired = null; this.report(error); }\n }\n state = this.options.getState();\n this.updateVisualPosition(state, true);\n const geometry = this.geometry(state);\n if (!geometry || !state.configuration) return;\n this.refreshHover(geometry);\n if (this.disposed || state.configuration !== this.options.getState().configuration) return;\n const { canvas, accessibility } = this.options;\n accessibility.setAttribute(\"aria-valuenow\", String(this.desired ?? state.viewport.top));\n if (!this.failed && this.context === undefined) {\n try {\n this.context = canvas.getContext(\"2d\");\n if (!this.context) throw new Error(\"The scrollbar Canvas2D context is unavailable\");\n }\n catch (error) {\n this.failed = true;\n this.endGesture();\n this.report(error);\n }\n }\n if (!this.context || this.failed) return;\n const context = this.context;\n const dpr = clamp(typeof devicePixelRatio === \"number\" ? devicePixelRatio : 1, 1, 3);\n const width = Math.max(1, Math.round(state.layout.width * dpr));\n const height = Math.max(1, Math.round(state.layout.height * dpr));\n if (canvas.width !== width) canvas.width = width;\n if (canvas.height !== height) canvas.height = height;\n this.clear();\n const now = this.now();\n const active = this.near || this.hovered || this.focused || this.pointer !== null;\n const autoHide = state.configuration.placement === \"overlay\";\n const reducedMotion = this.motion?.matches ?? false;\n const opacity = scrollbarOpacity(now, this.lastActivityAt, active, state.configuration, reducedMotion);\n const style = typeof getComputedStyle === \"function\" ? getComputedStyle(this.options.element) : null;\n const color = (name: string, fallback: string) => style?.getPropertyValue?.(name).trim() || fallback;\n const scrollbarColor = (name: keyof typeof scrollbarColors) =>\n color(`--cp-view-scrollbar-${name}`, scrollbarColors[name]);\n const layout = Object.freeze({\n ...state.layout, content: Object.freeze({ ...state.layout.content }),\n padding: Object.freeze({ ...state.layout.padding }), scrollbar: geometry.track\n });\n const viewport = Object.freeze({ ...state.viewport,\n ...(state.viewport.rowIds ? { rowIds: Object.freeze([...state.viewport.rowIds]) } : {})\n }) as TerminalViewport;\n const frame = Object.freeze({\n canvas, context, layout, viewport, ...geometry, now, opacity, pendingTarget: this.desired,\n markers: Object.freeze(geometry.markers.map(tick => Object.freeze({\n ...tick, color: scrollbarMarkerColor(tick.marker, scrollbarColor)\n }))),\n hoveredMarker: this.hoveredMarker(geometry),\n interaction: Object.freeze({\n near: this.near, hovered: this.hovered, dragging: this.dragOffset !== null,\n focused: this.focused, lastActivityAt: this.lastActivityAt, reducedMotion\n }),\n colors: Object.freeze({\n track: scrollbarColor(\"track\"),\n thumb: scrollbarColor(\"thumb\"),\n marker: scrollbarColor(\"marker\"),\n error: scrollbarColor(\"error\")\n })\n });\n let again: boolean | void = false;\n context.save();\n try {\n context.setTransform(dpr, 0, 0, dpr, 0, 0);\n const result: unknown = (state.configuration.render ?? renderDefaultScrollbar)(frame);\n if (result !== undefined && typeof result !== \"boolean\") {\n // Attach a rejection observer before reporting an unsupported asynchronous painter.\n if (result instanceof Promise) void result.catch(error => {\n if (!this.disposed) this.report(error);\n });\n throw new TypeError(\"scrollbar.render must synchronously return boolean or undefined\");\n }\n again = result;\n } catch (error) {\n this.failed = true;\n this.endGesture();\n this.desired = this.queued = null;\n if (this.frameId !== undefined) cancelAnimationFrame(this.frameId);\n if (this.fadeTimer !== undefined) clearTimeout(this.fadeTimer);\n this.frameId = this.fadeTimer = undefined;\n this.report(error);\n } finally { context.restore(); }\n if (this.failed) { this.clear(); return; }\n if (this.disposed || state.configuration !== this.options.getState().configuration) return;\n this.dormant = !active && opacity === 0 && again !== true;\n if (again === true || (opacity > 0 && this.visualTop !== this.visualTarget) ||\n (autoHide && !active && opacity > 0 && now >= this.lastActivityAt + state.configuration.hideDelay))\n this.schedule();\n else if (autoHide && !active && opacity > 0 && this.fadeTimer === undefined) {\n this.fadeTimer = setTimeout(() => {\n this.fadeTimer = undefined;\n this.schedule();\n }, Math.min(2_147_483_647, Math.max(0, this.lastActivityAt + state.configuration.hideDelay - now)));\n }\n }\n\n private report(error: unknown) {\n if (!this.disposed) this.options.reportError(error);\n }\n}\n", "import type { TerminalCommandMark } from \"./types.js\";\n\n/**\n * Parses a {@link TerminalCommandMark.rawParameters} string into key/value pairs, mirroring the\n * server's `TerminalCommandMark.Parameters`: segments are split on `;`, each split on the first\n * `=`; segments without `=` are ignored. Values are not decoded (e.g. percent-decoding is left\n * to the caller for keys that use it, such as `cmdline_url`). Returns an empty map for null/\"\".\n */\nexport function parseCommandMarkParameters(rawParameters: string | null): ReadonlyMap<string, string> {\n const result = new Map<string, string>();\n if (!rawParameters) return result;\n for (const segment of rawParameters.split(\";\")) {\n const separator = segment.indexOf(\"=\");\n if (separator < 0) continue;\n result.set(segment.slice(0, separator), segment.slice(separator + 1));\n }\n return result;\n}\n\n/**\n * Gets the raw (still percent-encoded) `cmdline_url` parameter from a command mark, or null when\n * absent. This is a Contour-originated, non-universal extension to OSC 133;C.\n */\nexport function getCmdlineUrl(mark: TerminalCommandMark | null): string | null {\n return mark ? parseCommandMarkParameters(mark.rawParameters).get(\"cmdline_url\") ?? null : null;\n}\n", "import { getCmdlineUrl } from \"./command-mark.js\";\nimport { isRecord } from \"./validation.js\";\nimport type { TerminalCommandMark } from \"./types.js\";\nimport type {\n TerminalLayout, TerminalScrollbarMarker, TerminalScrollbarTooltipContext, TerminalScrollbarTooltipRenderer\n} from \"./scrollbar-types.js\";\n\n/** Creates safe, theme-aware tooltip content; the controller owns mounting and positioning. */\nexport function renderDefaultScrollbarTooltip(context: TerminalScrollbarTooltipContext): HTMLElement {\n const element = document.createElement(\"div\");\n element.className = \"hex1b-scrollbar-tooltip\";\n element.setAttribute(\"role\", \"tooltip\");\n element.style.cssText = \"padding:8px 10px;border:1px solid var(--cp-view-text-muted,#888);\" +\n \"border-radius:6px;background:var(--cp-view-surface,#202020);color:var(--cp-view-text,#eee);\" +\n \"font:12px/1.4 var(--cp-view-font-family,monospace);white-space:pre-wrap;overflow-wrap:anywhere\";\n const { marker, details } = context;\n const lines = [marker.label || (marker.source === \"custom\" ? \"Bookmark\" : \"Terminal command\")];\n if (marker.source === \"command\") {\n lines.push(`Phase: ${marker.phase ?? \"unknown\"}`);\n if (marker.exitCode != null) lines.push(`Exit code: ${marker.exitCode}`);\n if (context.loading) lines.push(\"Loading command details...\");\n if (context.error) lines.push(`Command details unavailable: ${context.error}`);\n if (details) {\n const encoded = getCmdlineUrl(details);\n if (encoded) {\n try { lines.push(decodeURIComponent(encoded)); }\n catch (error) {\n if (!(error instanceof URIError)) throw error;\n lines.push(`Command (invalid URL encoding): ${encoded}`);\n }\n } else if (details.rawParameters) lines.push(details.rawParameters);\n else lines.push(\"This shell did not provide command text.\");\n }\n }\n element.textContent = lines.join(\"\\n\");\n return element;\n}\n\ninterface TooltipTarget {\n tick: TerminalScrollbarMarker;\n layout: TerminalLayout;\n renderer: TerminalScrollbarTooltipRenderer;\n key: string;\n signature: string;\n}\n\n/** Owns only hover presentation; input and retained marker navigation stay in their controllers. */\nexport class ScrollbarTooltip {\n private target: TooltipTarget | null = null;\n private result: { key: string; details: TerminalCommandMark | null; error: string | null } | null = null;\n private fetching = false;\n private lifetime: AbortController | undefined;\n private observer: ResizeObserver | undefined;\n private element: HTMLElement | null = null;\n private failed = false;\n private disposed = false;\n\n constructor(private readonly options: {\n overlay: HTMLElement;\n getDetails: (id: string) => Promise<TerminalCommandMark>;\n reportError: (error: unknown) => void;\n }) {}\n\n update(tick: TerminalScrollbarMarker | null, layout: TerminalLayout,\n renderer: false | TerminalScrollbarTooltipRenderer = renderDefaultScrollbarTooltip): void {\n if (this.disposed) return;\n if (!tick || renderer === false) {\n this.target = this.result = null;\n this.failed = false;\n this.clearView();\n return;\n }\n const signature = JSON.stringify({ tick, layout });\n if (this.target?.signature === signature && this.target.renderer === renderer) return;\n const key = JSON.stringify([tick.marker.id, tick.marker.phase, tick.marker.exitCode]);\n if (this.target?.key !== key || this.target.renderer !== renderer) {\n this.result = null;\n this.failed = false;\n }\n this.target = { tick, layout, renderer, key, signature };\n this.render();\n this.loadDetails();\n }\n\n dispose(): void {\n this.disposed = true;\n this.target = this.result = null;\n this.clearView();\n }\n\n private clearView() {\n this.observer?.disconnect();\n this.observer = undefined;\n const lifetime = this.lifetime;\n this.lifetime = undefined;\n this.element = null;\n this.options.overlay.replaceChildren();\n lifetime?.abort();\n }\n\n private render() {\n const target = this.target;\n this.clearView();\n if (!target || this.target !== target || this.failed || this.disposed) return;\n const lifetime = this.lifetime = new AbortController();\n const result = this.result?.key === target.key ? this.result : null;\n const context: TerminalScrollbarTooltipContext = Object.freeze({\n marker: target.tick.marker, anchor: target.tick.bounds, layout: target.layout,\n details: result?.details ?? null, error: result?.error ?? null,\n loading: target.tick.marker.source === \"command\" && !result,\n signal: lifetime.signal\n });\n try {\n const element: unknown = target.renderer(context);\n if (isRecord(element) && typeof element.then === \"function\")\n void Promise.resolve(element).catch(error => {\n if (!lifetime.signal.aborted) this.options.reportError(error);\n });\n if (lifetime.signal.aborted) return;\n if (element !== null && !(element instanceof HTMLElement)) {\n throw new TypeError(\"scrollbar.tooltip must synchronously return an HTMLElement or null\");\n }\n if (!element) return;\n this.element = element;\n Object.assign(element.style, {\n position: \"absolute\", boxSizing: \"border-box\", margin: \"0\", pointerEvents: \"none\",\n maxWidth: `${Math.max(0, Math.min(360, target.layout.width - 16))}px`,\n maxHeight: `${Math.max(0, target.layout.height - 16)}px`, overflow: \"hidden\"\n });\n this.options.overlay.append(element);\n this.position();\n this.observer = new ResizeObserver(() => this.position());\n this.observer.observe(element);\n } catch (error) {\n this.failed = true;\n this.clearView();\n this.options.reportError(error);\n }\n }\n\n private position() {\n if (!this.target || !this.element) return;\n const { bounds } = this.target.tick;\n const { width, height } = this.target.layout;\n const left = bounds.left - this.element.offsetWidth - 8;\n const top = bounds.top + bounds.height / 2 - this.element.offsetHeight / 2;\n this.element.style.left = `${Math.max(0, Math.min(Math.max(8, left), width - this.element.offsetWidth - 8))}px`;\n this.element.style.top = `${Math.max(0, Math.min(Math.max(8, top), height - this.element.offsetHeight - 8))}px`;\n }\n\n private loadDetails() {\n const target = this.target;\n if (!target || this.fetching || this.failed || this.disposed ||\n target.tick.marker.source !== \"command\" || this.result?.key === target.key) return;\n this.fetching = true;\n // Coalesce rapid hover changes: at most one RPC, followed by only the latest hovered mark.\n void Promise.resolve().then(() => this.disposed || this.target?.key !== target.key\n ? null : this.options.getDetails(target.tick.marker.id)).then(details => {\n if (!details || this.target?.key !== target.key || this.disposed) return;\n this.result = { key: target.key, details: Object.freeze({ ...details }), error: null };\n this.render();\n }, error => {\n if (this.target?.key !== target.key || this.disposed) return;\n this.result = { key: target.key, details: null, error: error instanceof Error ? error.message : String(error) };\n this.render();\n }).finally(() => {\n this.fetching = false;\n this.loadDetails();\n });\n }\n}\n", "import { scrollbarColors } from \"./scrollbar-colors.js\";\n\nconst light = `\n --cp-terminal-surface: #ffffff;\n --cp-terminal-text: #242424;\n --cp-terminal-text-muted: #5c5c5c;\n --cp-terminal-border-strong: #919191;\n --cp-terminal-accent: #b11f4b;\n --cp-terminal-accent-soft: rgba(177, 31, 75, 0.08);\n --cp-terminal-danger: #dc2626;\n`;\n\nconst dark = `\n --cp-terminal-surface: #292929;\n --cp-terminal-text: #dedede;\n --cp-terminal-text-muted: #919191;\n --cp-terminal-border-strong: #5f5f5f;\n --cp-terminal-accent: #fd8ea1;\n --cp-terminal-accent-soft: rgba(253, 142, 161, 0.14);\n --cp-terminal-danger: #f87171;\n`;\n\n// Shared embedding tokens take precedence; defaults never overwrite inherited --cp-* colors.\nexport const terminalThemeCss = `\n :host {\n ${light}\n --cp-terminal-font-family: \"Segoe UI\", Aptos, Calibri, -apple-system, BlinkMacSystemFont, sans-serif;\n }\n @media (prefers-color-scheme: dark) { :host { ${dark} } }\n :host-context([data-theme=\"light\"]) { ${light} }\n :host-context([data-theme=\"dark\"]) { ${dark} }\n :host([data-theme=\"light\"]) { ${light} }\n :host([data-theme=\"dark\"]) { ${dark} }\n .viewport {\n ${Object.entries(scrollbarColors).map(([name, value]) =>\n `--cp-view-scrollbar-${name}: var(--cp-scrollbar-${name}, var(--cp-terminal-scrollbar-${name}, ${value}));`).join(\"\\n\")}\n --cp-view-surface: var(--cp-surface, var(--cp-terminal-surface));\n --cp-view-text: var(--cp-text, var(--cp-terminal-text));\n --cp-view-text-muted: var(--cp-text-muted, var(--cp-terminal-text-muted));\n --cp-view-border-strong: var(--cp-border-strong, var(--cp-terminal-border-strong));\n --cp-view-accent: var(--cp-accent, var(--cp-terminal-accent));\n --cp-view-accent-soft: var(--cp-accent-soft, var(--cp-terminal-accent-soft));\n --cp-view-danger: var(--cp-danger, var(--cp-terminal-danger));\n --cp-view-font-family: var(--cp-font-family, var(--cp-terminal-font-family));\n }\n`;\n", "import type { RunTerminalAction, SelectionRange, SelectionUIDetail, SelectionUIEvent,\n SelectionUIState, TerminalGeometry, TerminalSize, WebTerminalOptions } from \"./types.js\";\nimport { isRecord } from \"./validation.js\";\n\nconst selectionFields = [\"status\", \"mode\", \"requestId\", \"active\", \"pending\", \"canExtend\",\n \"text\", \"message\", \"copying\", \"copyError\"] as const;\nconst viewportFields = [\"available\", \"following\", \"pending\", \"generation\", \"buffer\",\n \"top\", \"liveTop\", \"totalRows\", \"requestId\", \"navigationError\"] as const;\nconst geometryFields = [\"columns\", \"rows\", \"cellWidth\", \"cellHeight\", \"mouseTracking\"] as const;\nconst rangeFields = [\"row\", \"startColumn\", \"endColumn\"] as const;\nconst equalFields = <T>(a: T | undefined, b: T | undefined, fields: readonly (keyof T)[]) =>\n fields.every(field => a?.[field] === b?.[field]);\n\nexport function sameSelectionUIState(a: SelectionUIState | undefined, b: SelectionUIState): boolean {\n return !!a && a.connected === b.connected && a.readOnly === b.readOnly &&\n equalFields(a.selection, b.selection, selectionFields) &&\n equalFields(a.viewport, b.viewport, viewportFields) &&\n equalFields(a.geometry, b.geometry, geometryFields) &&\n equalFields(a.canvasSize, b.canvasSize, [\"width\", \"height\"]) &&\n a.selection.ranges.length === b.selection.ranges.length &&\n a.selection.ranges.every((range, index) => equalFields(range, b.selection.ranges[index], rangeFields));\n}\n\nexport function selectionRectangles(ranges: readonly SelectionRange[], geometry: TerminalGeometry, canvasSize: TerminalSize) {\n const width = canvasSize.width / geometry.columns;\n const height = canvasSize.height / geometry.rows;\n return ranges.map(range => Object.freeze({\n left: range.startColumn * width, top: range.row * height,\n width: (range.endColumn - range.startColumn) * width, height\n }));\n}\n\n/** Owns UI notification/default rendering, not terminal selection or clipboard state. */\nexport class SelectionUI {\n #element: HTMLDivElement;\n #overlay: HTMLDivElement;\n #button: HTMLButtonElement;\n #signal: AbortSignal;\n #getState: () => SelectionUIState;\n #runAction: RunTerminalAction;\n #reportError: (error: unknown) => void;\n #previous: SelectionUIState | undefined;\n #notification: SelectionUIEvent | undefined;\n #queued = false;\n #force = false;\n\n constructor({ element, overlay, button, signal, getState, runAction, onSelectionUI, reportError }: {\n element: HTMLDivElement; overlay: HTMLDivElement; button: HTMLButtonElement; signal: AbortSignal;\n getState: () => SelectionUIState; runAction: RunTerminalAction;\n onSelectionUI?: WebTerminalOptions[\"onSelectionUI\"]; reportError: (error: unknown) => void;\n }) {\n this.#element = element;\n this.#overlay = overlay;\n this.#button = button;\n this.#signal = signal;\n this.#getState = getState;\n this.#runAction = runAction;\n this.#reportError = reportError;\n if (onSelectionUI) {\n element.addEventListener(\"selectionui\", event => {\n if (!this.#notification || event !== this.#notification) return;\n const snapshot = this.#previous;\n try {\n const result: unknown = onSelectionUI(this.#notification);\n if (result !== undefined) {\n if (isRecord(result) && typeof result.then === \"function\") Promise.resolve(result).catch(error => {\n if (!signal.aborted && this.#previous === snapshot) reportError(error);\n });\n throw new TypeError(\"onSelectionUI must finish synchronously; use preventDefault() and signal for UI ownership\");\n }\n } catch (error) {\n event.preventDefault();\n reportError(error);\n }\n }, { signal });\n }\n }\n\n refresh(force = false) {\n this.#force ||= force;\n if (this.#queued || this.#signal.aborted) return;\n this.#queued = true;\n // Coalesce geometry and history from the same presented frame before notifying the host.\n queueMicrotask(() => {\n this.#queued = false;\n if (this.#signal.aborted) return;\n const state = this.#getState();\n const force = this.#force;\n this.#force = false;\n if (!force && sameSelectionUIState(this.#previous, state)) return;\n const snapshot: SelectionUIState = Object.freeze({\n ...state,\n selection: Object.freeze({ ...state.selection,\n ranges: Object.freeze(state.selection.ranges.map(range => Object.freeze({ ...range }))) }),\n viewport: Object.freeze({ ...state.viewport, rowIds: Object.freeze([...(state.viewport.rowIds ?? [])]) }),\n geometry: Object.freeze({ ...state.geometry }),\n canvasSize: Object.freeze({ ...state.canvasSize })\n });\n this.#previous = snapshot;\n const detail = Object.freeze({\n ...snapshot, overlay: this.#overlay, signal: this.#signal, runAction: this.#runAction,\n rects: Object.freeze(selectionRectangles(snapshot.selection.ranges, snapshot.geometry, snapshot.canvasSize))\n });\n const event = new CustomEvent<SelectionUIDetail>(\"selectionui\", { cancelable: true, detail });\n this.#notification = event;\n this.#reportError(null);\n this.#element.dispatchEvent(event);\n if (this.#signal.aborted) return;\n const selection = snapshot.selection;\n this.#button.hidden = event.defaultPrevented || [\"none\", \"unavailable\"].includes(selection.status);\n this.#button.disabled = !snapshot.connected || selection.status !== \"valid\" || selection.copying;\n const label = selection.copying ? \"Copying\\u2026\" : \"Copy\";\n if (this.#button.textContent !== label) this.#button.textContent = label;\n });\n }\n}\n", "import type { TerminalPoint } from \"./types.js\";\nimport type { HyperlinkRange } from \"./wire-types.js\";\n\n/** OSC 8 destinations are untrusted output, not page-relative navigation. */\nexport function hyperlinkUri(uri: string): string | null {\n if (/[\\u0000-\\u0020\\u007f]/u.test(uri) || !URL.canParse(uri)) return null;\n const url = new URL(uri);\n return [\"https:\", \"http:\", \"mailto:\"].includes(url.protocol) ? url.href : null;\n}\n\nexport class Hyperlinks {\n #rows = new Map<number, HyperlinkRange[]>();\n\n update(ranges: readonly HyperlinkRange[]): void {\n this.#rows.clear();\n const destinations = new Map<string, string | null>();\n for (const range of ranges) {\n if (!destinations.has(range.uri)) destinations.set(range.uri, hyperlinkUri(range.uri));\n const uri = destinations.get(range.uri);\n if (!uri) continue;\n const row = this.#rows.get(range.row) ?? [];\n row.push({ ...range, uri });\n this.#rows.set(range.row, row);\n }\n }\n\n at(point: TerminalPoint): string | null {\n return this.#rows.get(point.y)?.find(range =>\n point.x >= range.startColumn && point.x < range.endColumn)?.uri ?? null;\n }\n}\n", "import type { HyperlinkRange, TerminalCell } from \"./wire-types.js\";\nimport type { SelectionRange } from \"./types.js\";\nimport type { TerminalLinkAction, TerminalLinkActivation, TerminalLinkDetectionError,\n TerminalLinkOptions, TerminalLinkRule, TerminalLinkTextMode } from \"./link-types.js\";\nimport { LINK_LIMITS, normalizeLinks, validateLinkAction } from \"./link-options.js\";\nimport { extractLinkText, mapLinkRange } from \"./link-text.js\";\nimport type { MappedLinkChunk } from \"./link-text.js\";\nimport type { LinkScanMatch, LinkScanRequest, LinkScanResponse } from \"./link-worker-protocol.js\";\nimport { linkMatchTextSize } from \"./link-worker-protocol.js\";\nimport { defaultWorkerUrl } from \"./worker-url.js\";\n\nexport interface LinkDetectionSnapshot {\n revision: number; columns: number; rows: number;\n cells: readonly (TerminalCell | undefined)[];\n hyperlinks: readonly HyperlinkRange[];\n}\nexport interface DetectedLink {\n id: string;\n action: TerminalLinkAction;\n activation: TerminalLinkActivation;\n}\ninterface Work {\n identity: number; revision: number; snapshot: LinkDetectionSnapshot;\n chunks: Map<TerminalLinkTextMode, MappedLinkChunk[]>;\n}\ninterface Job { id: number; work: Work; rule: TerminalLinkRule; keys: Map<string, string> }\n\nfunction validResponse(response: LinkScanResponse, job: Job): boolean {\n if (!Array.isArray(response.results) || response.results.length !== job.keys.size) return false;\n const keys = new Set<string>();\n let count = 0, resultText = 0;\n for (const result of response.results) {\n if (!result || !job.keys.has(result.key) || keys.has(result.key) || !Array.isArray(result.matches)) return false;\n keys.add(result.key);\n count += result.matches.length;\n if (count > LINK_LIMITS.matches) return false;\n for (const match of result.matches) {\n if (!match || !Number.isSafeInteger(match.index) || match.index < 0 ||\n typeof match.text !== \"string\" || !match.text.length || !Array.isArray(match.captures) ||\n !match.captures.every(capture => capture === undefined || typeof capture === \"string\") ||\n !match.groups || typeof match.groups !== \"object\" || Array.isArray(match.groups) ||\n !Object.values(match.groups).every(group => group === undefined || typeof group === \"string\")) return false;\n resultText += linkMatchTextSize(match);\n if (resultText > LINK_LIMITS.resultText) return false;\n }\n }\n return true;\n}\n\nexport class LinkDetection {\n #options: { workerUrl?: string | URL; actions: ReadonlySet<string>;\n onChange: (revision: number, links: readonly DetectedLink[]) => void;\n onError: (error: TerminalLinkDetectionError) => void };\n #detection: TerminalLinkOptions[\"detection\"];\n #worker: Worker | null = null;\n #timer: ReturnType<typeof setTimeout> | undefined;\n #job: Job | null = null;\n #work: Work | null = null;\n #links: readonly DetectedLink[] = [];\n #disabled = new Set<string>();\n #cache = new Map<string, LinkScanMatch[]>();\n #cacheSizes = new Map<string, number>();\n #cacheSize = 0;\n #identity = 0;\n #jobId = 0;\n #revision = 0;\n #disposed = false;\n #workerFailed = false;\n #pumping = false;\n\n constructor(options: { workerUrl?: string | URL; actions: ReadonlySet<string>;\n onChange: (revision: number, links: readonly DetectedLink[]) => void;\n onError: (error: TerminalLinkDetectionError) => void }) {\n this.#options = { ...options, actions: new Set(options.actions) };\n }\n\n configure(detection: TerminalLinkOptions[\"detection\"]): void {\n const normalized = normalizeLinks({ detection }, this.#options.actions);\n if (this.#disposed) return;\n this.#detection = normalized === false ? false : normalized.detection;\n this.#disabled.clear(); this.#workerFailed = false;\n this.clear();\n }\n\n update(snapshot: LinkDetectionSnapshot): void {\n if (this.#disposed || snapshot.revision < this.#revision) return;\n this.#revision = snapshot.revision;\n this.#work = null;\n this.#publish([]);\n if (!this.#detection || this.#workerFailed) return;\n const work: Work = { identity: ++this.#identity, revision: snapshot.revision,\n snapshot, chunks: new Map() };\n try {\n for (const rule of this.#detection.rules) {\n if (!rule.enabled || this.#disabled.has(rule.id)) continue;\n const mode = rule.text ?? \"logicalLine\";\n if (!work.chunks.has(mode)) work.chunks.set(mode, extractLinkText(snapshot, mode));\n }\n } catch (error) {\n this.#error(\"limit\", null, error);\n return;\n }\n this.#work = work;\n this.#pump();\n }\n\n advance(revision: number): void {\n if (this.#disposed || revision < this.#revision) return;\n this.#revision = revision;\n if (this.#work) this.#work.revision = revision;\n this.#publish(this.#links.map(link => Object.freeze({ ...link,\n activation: Object.freeze({ ...link.activation, revision }) })));\n }\n\n clear(): void {\n this.#terminate();\n this.#identity++;\n this.#work = null;\n this.#cache.clear(); this.#cacheSizes.clear(); this.#cacheSize = 0;\n if (!this.#disposed) this.#publish([]);\n }\n\n dispose(): void {\n if (this.#disposed) return;\n this.clear();\n this.#disposed = true;\n }\n\n #publish(links: readonly DetectedLink[]): void {\n this.#links = Object.freeze([...links]);\n this.#options.onChange(this.#revision, this.#links);\n }\n\n #error(code: TerminalLinkDetectionError[\"code\"], ruleId: string | null, error: unknown): void {\n this.#options.onError(Object.freeze({ code, ruleId, revision: this.#revision,\n message: error instanceof Error ? error.message : String(error) }));\n }\n\n #terminate(): void {\n clearTimeout(this.#timer); this.#timer = undefined;\n if (this.#worker) {\n this.#worker.terminate(); this.#worker = null;\n }\n this.#job = null;\n }\n\n #failWorker(error: unknown): void {\n const ruleId = this.#job?.rule.id ?? null;\n this.#terminate(); this.#workerFailed = true;\n this.#publish([]);\n this.#error(\"worker\", ruleId, error);\n }\n\n #pump(): void {\n if (this.#pumping || this.#disposed || this.#job || !this.#work || !this.#detection || this.#workerFailed) return;\n this.#pumping = true;\n try {\n const work = this.#work;\n for (const rule of this.#detection.rules) {\n if (!rule.enabled || this.#disabled.has(rule.id)) continue;\n const chunks = work.chunks.get(rule.text ?? \"logicalLine\") ?? [];\n const missing = chunks.filter(chunk => !this.#cache.has(this.#cacheKey(rule, chunk)));\n if (!missing.length) continue;\n try {\n if (!this.#worker) {\n const worker = new Worker(this.#options.workerUrl ?? defaultWorkerUrl(\"link-detection\"),\n { type: \"module\", name: \"hex1b-link-detection\" });\n this.#worker = worker;\n worker.addEventListener(\"message\", event => {\n if (this.#worker === worker) this.#receive(event.data as LinkScanResponse);\n });\n worker.addEventListener(\"error\", event => {\n if (this.#worker !== worker) return;\n event.preventDefault(); this.#failWorker(event.message);\n });\n worker.addEventListener(\"messageerror\", () => {\n if (this.#worker === worker) this.#failWorker(\"Invalid detection worker message\");\n });\n }\n const id = ++this.#jobId;\n this.#job = { id, work, rule, keys: new Map(missing.map(chunk => [chunk.key, this.#cacheKey(rule, chunk)])) };\n this.#timer = setTimeout(() => {\n if (this.#job?.id !== id) return;\n this.#terminate(); this.#disabled.add(rule.id);\n this.#error(\"timeout\", rule.id, `Link rule exceeded ${LINK_LIMITS.timeoutMs} ms`);\n this.#pump();\n }, LINK_LIMITS.timeoutMs);\n const request: LinkScanRequest = { id,\n rule: rule.builtin ? { builtin: rule.builtin } : { source: rule.pattern!.source, flags: rule.pattern!.flags },\n chunks: missing.map(({ chunk, key }) => ({ key, text: chunk.text })) };\n this.#worker.postMessage(request);\n } catch (error) { this.#failWorker(error); }\n return;\n }\n this.#resolve(work);\n } finally { this.#pumping = false; }\n }\n\n #cacheKey(rule: TerminalLinkRule, chunk: MappedLinkChunk): string {\n return JSON.stringify([rule.id, chunk.key]);\n }\n\n #receive(response: LinkScanResponse): void {\n const job = this.#job;\n if (!job || response?.id !== job.id || this.#disposed) return;\n clearTimeout(this.#timer); this.#timer = undefined; this.#job = null;\n if (response.error) {\n this.#disabled.add(job.rule.id);\n this.#error(response.error, job.rule.id, response.message ?? \"Link scan failed\");\n } else if (!validResponse(response, job)) {\n this.#failWorker(\"Malformed detection response\"); return;\n } else {\n for (const result of response.results!) {\n const key = job.keys.get(result.key)!;\n const size = key.length + result.matches.reduce((total, match) => total + linkMatchTextSize(match), 0);\n this.#cacheSize += size - (this.#cacheSizes.get(key) ?? 0);\n this.#cacheSizes.set(key, size);\n this.#cache.set(key, result.matches);\n }\n }\n if (this.#work !== job.work) this.#trimCache();\n this.#pump();\n }\n\n #resolve(work: Work): void {\n if (!this.#detection || this.#work !== work) return;\n const occupied: SelectionRange[] = [...work.snapshot.hyperlinks];\n const links: DetectedLink[] = [];\n const overlaps = (ranges: SelectionRange[]) => ranges.some(range => occupied.some(other =>\n range.row === other.row && range.startColumn < other.endColumn && range.endColumn > other.startColumn));\n for (const rule of this.#detection.rules) {\n if (!rule.enabled || this.#disabled.has(rule.id)) continue;\n const ruleLinks: DetectedLink[] = [], ruleRanges: SelectionRange[] = [];\n try {\n for (const mapped of work.chunks.get(rule.text ?? \"logicalLine\") ?? []) {\n for (const candidate of this.#cache.get(this.#cacheKey(rule, mapped)) ?? []) {\n const ranges = mapLinkRange(mapped, candidate.index, candidate.text.length);\n if (!ranges || overlaps(ranges)) continue;\n const match = Object.freeze({ ...candidate, captures: Object.freeze([...candidate.captures]),\n groups: Object.freeze({ ...candidate.groups }), chunk: mapped.chunk });\n const resolution = rule.resolve ? rule.resolve(match) : { target: candidate.text };\n if (this.#work !== work || this.#disposed) return;\n if (resolution === null) continue;\n if (typeof resolution !== \"object\" || resolution === undefined ||\n \"then\" in resolution || typeof resolution.target !== \"string\") throw new TypeError(\"Resolver must return a synchronous link resolution or null\");\n const action = resolution.action === undefined ? rule.action : resolution.action;\n validateLinkAction(action, this.#options.actions);\n if (links.length + ruleLinks.length >= LINK_LIMITS.matches) throw new RangeError(\"Resolved link limit exceeded\");\n const activation: TerminalLinkActivation = Object.freeze({\n source: \"detected\", ruleId: rule.id,\n kind: rule.builtin ? (rule.builtin === \"url\" || rule.builtin === \"uri\" ? \"uri\" : \"path\") : rule.kind!,\n text: candidate.text, target: resolution.target,\n ranges: Object.freeze(ranges.map(range => Object.freeze(range))),\n revision: work.revision, data: resolution.data,\n });\n ruleLinks.push(Object.freeze({ id: JSON.stringify([work.identity, rule.id,\n ranges[0].row, ranges[0].startColumn, candidate.index]),\n action, activation }));\n ruleRanges.push(...ranges);\n }\n }\n links.push(...ruleLinks); occupied.push(...ruleRanges);\n } catch (error) {\n this.#disabled.add(rule.id);\n this.#error(error instanceof RangeError ? \"limit\" : \"resolver\", rule.id, error);\n if (this.#work !== work || this.#disposed) return;\n }\n }\n // Evict only after resolution so a viewport larger than the cache cannot cause endless rescans.\n this.#trimCache();\n this.#publish(links);\n }\n\n #trimCache(): void {\n while (this.#cache.size > LINK_LIMITS.cacheEntries || this.#cacheSize > LINK_LIMITS.cacheText) {\n const key = this.#cache.keys().next().value!;\n this.#cache.delete(key); this.#cacheSize -= this.#cacheSizes.get(key)!;\n this.#cacheSizes.delete(key);\n }\n }\n}\n", "import type { SelectionRange } from \"./types.js\";\nimport type { TerminalLinkTextChunk, TerminalLinkTextMode } from \"./link-types.js\";\nimport type { LinkDetectionSnapshot } from \"./link-detection.js\";\nimport { LINK_LIMITS } from \"./link-options.js\";\n\ninterface Span extends SelectionRange { start: number; end: number }\nexport interface MappedLinkChunk {\n chunk: TerminalLinkTextChunk;\n spans: Span[];\n boundaries: Set<number>;\n unsafe: Set<number>;\n key: string;\n}\nconst SOFT_WRAP = 1024;\nconst HIDDEN = 64;\nconst segmenter = new Intl.Segmenter(undefined, { granularity: \"grapheme\" });\n\nexport function extractLinkText(snapshot: LinkDetectionSnapshot, mode: TerminalLinkTextMode): MappedLinkChunk[] {\n const { columns, rows, cells } = snapshot;\n if (!Number.isSafeInteger(columns) || !Number.isSafeInteger(rows) || columns < 1 || rows < 1 ||\n columns * rows > LINK_LIMITS.cells) throw new RangeError(\"Link grid exceeds cell limit\");\n const result: MappedLinkChunk[] = [];\n let text = \"\", spans: Span[] = [], unsafe = new Set<number>(), firstRow = 0, total = 0;\n let start: TerminalLinkTextChunk[\"start\"] = \"unknown\";\n const wrapped = (row: number) => row >= 0 && !!((cells[(row + 1) * columns - 1]?.attributes ?? 0) & SOFT_WRAP);\n const finish = (end: TerminalLinkTextChunk[\"end\"]) => {\n const chunk = Object.freeze({ text, mode, start, end });\n const boundaries = new Set<number>([text.length]);\n for (const segment of segmenter.segment(text)) boundaries.add(segment.index);\n result.push({ chunk, spans, unsafe, boundaries,\n key: JSON.stringify([mode, firstRow, start, end, text]) });\n text = \"\"; spans = []; unsafe = new Set();\n };\n for (let row = 0; row < rows; row++) {\n if (text.length === 0) { firstRow = row; start = row === 0 ? \"unknown\" : wrapped(row - 1) ? \"clipped\" : \"complete\"; }\n for (let col = 0; col < columns; col++) {\n const cell = cells[row * columns + col];\n const width = cell?.width ?? 1;\n const valid = width >= 1 && width <= 2 && col + width <= columns &&\n !(cell && ((cell.attributes & HIDDEN) || cell.text.codePointAt(0) === 0x10eeee)) &&\n (width !== 2 || cells[row * columns + col + 1]?.width === 0);\n const value = valid ? cell?.text || \" \" : \"\\0\";\n if (total + value.length > LINK_LIMITS.totalText || text.length + value.length > LINK_LIMITS.chunk) {\n throw new RangeError(\"Link text exceeds chunk or viewport limit\");\n }\n const offset = text.length;\n text += value; total += value.length;\n if (valid) spans.push({ start: offset, end: text.length, row, startColumn: col, endColumn: col + width });\n else { unsafe.add(offset); unsafe.add(text.length); }\n if (valid && width === 2) col++;\n }\n const soft = wrapped(row);\n if (!soft) unsafe.add(text.length); // HWT1 cannot distinguish a full hard row from a right crop.\n if (mode === \"physicalRow\" || (mode === \"logicalLine\" && !soft) || row === rows - 1) {\n finish(soft ? \"clipped\" : \"unknown\");\n } else if (!soft) {\n if (++total > LINK_LIMITS.totalText || text.length + 1 > LINK_LIMITS.chunk) throw new RangeError(\"Link text exceeds limit\");\n text += \"\\n\";\n }\n }\n return result;\n}\n\nexport function mapLinkRange(mapped: MappedLinkChunk, index: number, length: number): SelectionRange[] | null {\n const end = index + length, { chunk } = mapped;\n if (length <= 0 || index < 0 || end > chunk.text.length || !mapped.boundaries.has(index) ||\n !mapped.boundaries.has(end) || (index === 0 && chunk.start !== \"complete\") ||\n (end === chunk.text.length && chunk.end !== \"complete\") ||\n chunk.text.slice(index, end).includes(\"\\0\")) return null;\n for (const boundary of mapped.unsafe) {\n if (boundary === index || boundary === end ||\n (boundary > index && boundary < end && chunk.text[boundary - 1] !== \" \")) return null;\n }\n const ranges: SelectionRange[] = [];\n for (const span of mapped.spans) {\n if (span.end <= index || span.start >= end) continue;\n if (span.start < index || span.end > end) return null;\n const last = ranges.at(-1);\n if (last && last.row === span.row && last.endColumn === span.startColumn) last.endColumn = span.endColumn;\n else ranges.push({ row: span.row, startColumn: span.startColumn, endColumn: span.endColumn });\n }\n return ranges.length ? ranges : null;\n}\n", "export { WebTerminal } from \"./web-terminal.js\";\nexport { createWebSocketTransport } from \"./websocket-transport.js\";\nexport { defaultLightPalette, defaultDarkPalette } from \"./terminal-palette.js\";\nexport { InputRoute, TerminalAction, defaultInputBindings } from \"./input-policy.js\";\nexport { MIN_FONT_SIZE, MAX_FONT_SIZE } from \"./terminal-sizing.js\";\nexport { parseCommandMarkParameters, getCmdlineUrl } from \"./command-mark.js\";\nexport { linkAction } from \"./link-options.js\";\nexport { createDefaultScrollbarRenderer, renderDefaultScrollbar } from \"./scrollbar-renderer.js\";\nexport { renderDefaultScrollbarTooltip } from \"./scrollbar-tooltip.js\";\nexport type * from \"./types.js\";\n\n// Keep worker globals out of the public declarations' ambient requirements.\ndeclare const DedicatedWorkerGlobalScope: { new(): object };\n\nif (typeof DedicatedWorkerGlobalScope !== \"undefined\" && globalThis instanceof DedicatedWorkerGlobalScope) {\n switch (new URL(import.meta.url).hash) {\n case \"#hex1b-terminal-worker\":\n await import(\"./terminal-worker.js\");\n break;\n case \"#hex1b-link-detection-worker\":\n await import(\"./link-detection-worker.js\");\n break;\n }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["export function isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === \"object\" && !Array.isArray(value);\n}\n\nexport function errorMessage(error: unknown): string {\n return isRecord(error) && typeof error.message === \"string\" ? error.message : String(error);\n}\n", "import type { TerminalTransport, TerminalTransportConnection } from \"./transport-types.js\";\n\nconst websocketUrls = new WeakMap<TerminalTransport, string>();\n\nfunction normalizeUrl(value: string): string {\n const url = new URL(value, globalThis.location?.href);\n if (url.protocol === \"https:\") url.protocol = \"wss:\";\n if (url.protocol === \"http:\") url.protocol = \"ws:\";\n if (![\"ws:\", \"wss:\"].includes(url.protocol)) throw new TypeError(\"A ws: or wss: URL is required\");\n return url.href;\n}\n\n/** Creates the first-party live transport. Mount runs this transport in its rendering worker. */\nexport function createWebSocketTransport(url: string | URL): TerminalTransport {\n if (!(url instanceof URL) && (typeof url !== \"string\" || !url.trim()))\n throw new TypeError(\"A terminal WebSocket URL is required\");\n const value = String(url);\n const transport: TerminalTransport = {\n connect(context) {\n return new Promise<TerminalTransportConnection>((resolve, reject) => {\n context.signal.throwIfAborted();\n const socket = new WebSocket(normalizeUrl(value));\n socket.binaryType = \"arraybuffer\";\n const abort = () => {\n socket.close(1000, \"View detached\");\n reject(context.signal.reason);\n };\n context.signal.addEventListener(\"abort\", abort, { once: true });\n socket.addEventListener(\"open\", () => {\n if (context.signal.aborted) return;\n resolve({\n send(control) {\n if (socket.readyState !== WebSocket.OPEN) throw new Error(\"Terminal WebSocket is not open\");\n if (socket.bufferedAmount + new TextEncoder().encode(control).byteLength > 1024 * 1024)\n throw new Error(\"Terminal WebSocket control buffer exceeded 1 MiB\");\n socket.send(control);\n },\n dispose() {\n context.signal.removeEventListener(\"abort\", abort);\n socket.close(1000, \"View detached\");\n }\n });\n });\n socket.addEventListener(\"message\", event => {\n if (context.signal.aborted) return;\n if (!(event.data instanceof ArrayBuffer)) {\n context.onError(new Error(\"Expected binary HWT1 frame\"));\n return;\n }\n void context.onFrame(event.data).catch(error => context.onError(error));\n });\n // Browser errors are followed by close, which carries the actual native status.\n socket.addEventListener(\"close\", event => {\n context.signal.removeEventListener(\"abort\", abort);\n if (context.signal.aborted) return;\n context.onClose({ code: event.code, reason: event.reason, wasClean: event.wasClean });\n reject(new Error(`Terminal WebSocket closed (${event.code})`));\n });\n });\n }\n };\n websocketUrls.set(transport, value);\n return Object.freeze(transport);\n}\n\nexport function workerWebSocketUrl(transport: TerminalTransport): string | undefined {\n const url = websocketUrls.get(transport);\n return url === undefined ? undefined : normalizeUrl(url);\n}\n\nexport function selectTransport(options: { url?: string | URL; transport?: TerminalTransport }): TerminalTransport {\n if (!options || (options.url !== undefined) === (options.transport !== undefined))\n throw new TypeError(\"Exactly one of url or transport is required\");\n if (options.url !== undefined) return createWebSocketTransport(options.url);\n if (!options.transport || typeof options.transport.connect !== \"function\")\n throw new TypeError(\"transport must provide connect(context)\");\n return options.transport;\n}\n", "export function randomId(): string {\n if (typeof crypto.randomUUID === \"function\") return crypto.randomUUID();\n // getRandomValues is available on HTTP, unlike randomUUID.\n const bytes = crypto.getRandomValues(new Uint8Array(16));\n bytes[6] = (bytes[6] & 0x0f) | 0x40;\n bytes[8] = (bytes[8] & 0x3f) | 0x80;\n const hex = Array.from(bytes, byte => byte.toString(16).padStart(2, \"0\")).join(\"\");\n return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`;\n}\n", "import type { TerminalCommandMark } from \"./types.js\";\nimport type { TerminalMarker, TerminalMarkerOptions, MarkerResult } from \"./scrollbar-types.js\";\nimport type { HistoryMetadata, TerminalCommand } from \"./wire-types.js\";\nimport { randomId } from \"./random-id.js\";\n\ntype MarkerCommand = Extract<TerminalCommand, { type: \"marker\" }>;\ninterface Request {\n command: MarkerCommand;\n resolve: (result: MarkerResult) => void;\n reject: (error: Error) => void;\n timer?: ReturnType<typeof setTimeout>;\n}\n\n/** One RPC in flight lets a coalesced state frame acknowledge each operation without losing replies. */\nexport class MarkerState {\n #send: (command: TerminalCommand) => void;\n #change: () => void;\n #markers: readonly TerminalMarker[] = Object.freeze([]);\n #presentation = new Map<string, Pick<TerminalMarker, \"label\" | \"color\">>();\n #requests: Request[] = [];\n #serial = 0;\n #revision = 0;\n #presented = false;\n\n constructor(send: (command: TerminalCommand) => void, change: () => void) {\n this.#send = send;\n this.#change = change;\n }\n\n get markers(): readonly TerminalMarker[] { return this.#markers; }\n\n accept(history: HistoryMetadata | null, revision: number): void {\n if (revision <= this.#revision) return;\n this.#revision = revision;\n const next = (history?.markers ?? []).map(marker =>\n Object.freeze({ ...marker, ...this.#presentation.get(marker.id) }));\n const changed = !this.#presented || JSON.stringify(next) !== JSON.stringify(this.#markers);\n this.#presented = true;\n this.#markers = Object.freeze(next);\n const result = history?.markerResult;\n const request = this.#requests[0];\n if (result && request && result.requestId === request.command.requestId) {\n this.#requests.shift();\n clearTimeout(request.timer);\n if (result.success) request.resolve(result);\n else request.reject(new Error(result.error || \"Marker operation failed\"));\n this.#start();\n }\n const retained = new Set(next.map(marker => marker.id));\n for (const pending of this.#requests)\n if (pending.command.action === \"add\") retained.add(pending.command.id);\n for (const id of this.#presentation.keys())\n if (!retained.has(id)) this.#presentation.delete(id);\n if (changed) this.#change();\n }\n\n #request(command: Omit<MarkerCommand, \"type\" | \"requestId\">): Promise<MarkerResult> {\n const result = Promise.withResolvers<MarkerResult>();\n this.#requests.push({ command: { type: \"marker\", ...command, requestId: ++this.#serial },\n resolve: result.resolve, reject: result.reject });\n if (this.#requests.length === 1) this.#start();\n return result.promise;\n }\n\n #start(): void {\n const next = this.#requests[0];\n if (!next) return;\n try {\n this.#send(next.command);\n next.timer = setTimeout(() => {\n // The server may still process this request; do not issue further dependent operations.\n this.#rejectRequests(new Error(\"Timed out waiting for the marker operation; resync before retrying.\"));\n }, 10000);\n } catch (error) {\n this.#requests.shift();\n next.reject(error instanceof Error ? error : new Error(String(error)));\n this.#start();\n }\n }\n\n async add(options: TerminalMarkerOptions): Promise<TerminalMarker> {\n const position = options?.position;\n if (!position || !validIdentity(position.generation) || !validIdentity(position.rowId) ||\n !Number.isInteger(position.column) || position.column < 0 || position.column > 1024)\n throw new TypeError(\"A marker requires a valid presented generation, row ID, and column\");\n if (options.label !== undefined && (typeof options.label !== \"string\" || options.label.length > 4096))\n throw new TypeError(\"Marker label must be at most 4096 characters\");\n if (options.color !== undefined && (typeof options.color !== \"string\" || options.color.length > 256 ||\n !CSS.supports(\"color\", options.color))) throw new TypeError(\"Marker color must be a CSS color\");\n const id = `custom:${randomId()}`;\n this.#presentation.set(id, { ...(options.label === undefined ? {} : { label: options.label }),\n ...(options.color === undefined ? {} : { color: options.color }) });\n try {\n await this.#request({ action: \"add\", id, ...position });\n const marker = this.#markers.find(item => item.id === id);\n if (!marker) throw new Error(\"Marker registration succeeded without a retained marker\");\n return marker;\n } catch (error) {\n this.#presentation.delete(id);\n throw error;\n }\n }\n\n async remove(id: string): Promise<void> {\n validateMarkerId(id);\n await this.#request({ action: \"remove\", id });\n this.#presentation.delete(id);\n }\n\n async jump(id: string): Promise<void> {\n validateMarkerId(id);\n await this.#request({ action: \"jump\", id });\n }\n\n async details(id: string): Promise<TerminalCommandMark> {\n validateMarkerId(id);\n const result = await this.#request({ action: \"details\", id });\n if (!result.details) throw new Error(\"Command marker details were not returned\");\n return Object.freeze({ ...result.details });\n }\n\n disconnect(error = new Error(\"Terminal disconnected before the marker operation completed.\")): void {\n this.#rejectRequests(error);\n this.#presentation.clear();\n }\n\n #rejectRequests(error: Error): void {\n for (const request of this.#requests.splice(0)) {\n clearTimeout(request.timer);\n request.reject(error);\n }\n }\n}\n\nfunction validIdentity(value: unknown): value is string {\n return typeof value === \"string\" && /^[1-9][0-9]{0,18}$/u.test(value) && BigInt(value) <= 9223372036854775807n;\n}\n\nexport function validateMarkerId(id: string): void {\n if (typeof id !== \"string\" || !/^(?:custom|command):[A-Za-z0-9-]{1,100}$/u.test(id))\n throw new TypeError(\"Invalid terminal marker ID\");\n}\n", "import type { FrameMetadata, TerminalCell } from \"./wire-types.js\";\nimport { isRecord } from \"./validation.js\";\n\n/** Browser theme selection. System follows prefers-color-scheme. */\nexport type TerminalColorMode = \"light\" | \"dark\" | \"system\";\n\n/** JSON-compatible terminal colors. Every color is an opaque #RRGGBB string. */\nexport interface TerminalPalette {\n readonly foreground: string;\n readonly background: string;\n /** Exactly 16 entries: black, red, green, yellow, blue, magenta, cyan, white, then their bright variants. */\n readonly ansi: readonly string[];\n readonly cursor?: string;\n /** Selected text color; defaults to the palette background. */\n readonly selectionForeground?: string;\n /** Opaque selection fill; defaults to the palette foreground. */\n readonly selectionBackground?: string;\n /** Optional overrides for indices 16 through 255; otherwise the xterm cube and gray ramp apply. */\n readonly extended?: Readonly<Record<number, string>>;\n}\n\n/** Hex1b Dark: muted Tomorrow Night Eighties-derived hues on neutral charcoal. */\nexport const defaultDarkPalette: TerminalPalette = Object.freeze({\n foreground: \"#d4d0c8\", background: \"#323232\",\n selectionForeground: \"#323232\", selectionBackground: \"#d4d0c8\",\n ansi: Object.freeze([\n \"#242424\", \"#ed888f\", \"#8dae82\", \"#c3a150\", \"#7baad1\", \"#bc99c5\", \"#64b1b5\", \"#b7b4ae\",\n \"#9a9a9a\", \"#ff99a0\", \"#9bc08e\", \"#d7b156\", \"#87bbe7\", \"#d0a8da\", \"#6cc4c8\", \"#dedad3\",\n ]),\n});\n\n/** Hex1b Light swaps the default neutrals and retunes the same hues for warm stone. */\nexport const defaultLightPalette: TerminalPalette = Object.freeze({\n foreground: \"#323232\", background: \"#d4d0c8\",\n selectionForeground: \"#d4d0c8\", selectionBackground: \"#323232\",\n ansi: Object.freeze([\n \"#24262b\", \"#9e3141\", \"#3e6131\", \"#705402\", \"#255c86\", \"#704b7a\", \"#006367\", \"#b7b4ae\",\n \"#595959\", \"#982338\", \"#355a27\", \"#664d01\", \"#175480\", \"#694273\", \"#015a5e\", \"#e3dfd7\",\n ]),\n});\n\nexport function normalizeColorMode(value: unknown = \"dark\"): TerminalColorMode {\n if (value === \"light\" || value === \"dark\" || value === \"system\") return value;\n throw new TypeError('colorMode must be \"light\", \"dark\", or \"system\"');\n}\n\nfunction color(value: unknown, name: string): string {\n if (typeof value !== \"string\" || !/^#[0-9a-f]{6}$/iu.test(value))\n throw new TypeError(`${name} must be a #RRGGBB color`);\n return value.toLowerCase();\n}\n\nexport function normalizePalette(value: unknown): TerminalPalette {\n if (!isRecord(value)) throw new TypeError(\"A terminal palette object is required\");\n if (!Array.isArray(value.ansi) || value.ansi.length !== 16)\n throw new TypeError(\"palette.ansi must contain exactly 16 colors\");\n const ansi = Array.from(value.ansi, (entry, index) => color(entry, `palette.ansi[${index}]`));\n const extended: Record<number, string> = {};\n if (value.extended !== undefined) {\n if (!isRecord(value.extended)) throw new TypeError(\"palette.extended must be an object\");\n for (const [key, entry] of Object.entries(value.extended)) {\n const index = Number(key);\n if (!Number.isInteger(index) || index < 16 || index > 255 || String(index) !== key)\n throw new TypeError(\"palette.extended indices must be integers from 16 to 255\");\n extended[index] = color(entry, `palette.extended[${key}]`);\n }\n }\n return Object.freeze({\n foreground: color(value.foreground, \"palette.foreground\"),\n background: color(value.background, \"palette.background\"),\n ansi: Object.freeze(ansi),\n ...(value.cursor === undefined ? {} : { cursor: color(value.cursor, \"palette.cursor\") }),\n ...(value.selectionForeground === undefined ? {} :\n { selectionForeground: color(value.selectionForeground, \"palette.selectionForeground\") }),\n ...(value.selectionBackground === undefined ? {} :\n { selectionBackground: color(value.selectionBackground, \"palette.selectionBackground\") }),\n ...(value.extended === undefined ? {} : { extended: Object.freeze(extended) }),\n });\n}\n\nexport interface RenderPalette {\n foreground: number;\n background: number;\n selectionForeground: number;\n selectionBackground: number;\n cursor?: number;\n indexed: Uint32Array;\n}\n\nfunction pack(red: number, green: number, blue: number): number {\n return (red | green << 8 | blue << 16 | 0xff000000) >>> 0;\n}\n\nfunction packHex(value: string): number {\n const rgb = Number.parseInt(value.slice(1), 16);\n return pack(rgb >> 16, (rgb >> 8) & 255, rgb & 255);\n}\n\nexport function compilePalette(palette: TerminalPalette): RenderPalette {\n const indexed = new Uint32Array(256);\n for (let i = 0; i < 16; i++) indexed[i] = packHex(palette.ansi[i]);\n const levels = [0, 95, 135, 175, 215, 255];\n for (let i = 16; i < 232; i++) {\n const n = i - 16;\n indexed[i] = pack(levels[Math.floor(n / 36)], levels[Math.floor(n / 6) % 6], levels[n % 6]);\n }\n for (let i = 232; i < 256; i++) {\n const gray = 8 + (i - 232) * 10;\n indexed[i] = pack(gray, gray, gray);\n }\n for (const [index, value] of Object.entries(palette.extended ?? {})) indexed[Number(index)] = packHex(value);\n return { foreground: packHex(palette.foreground), background: packHex(palette.background),\n selectionForeground: packHex(palette.selectionForeground ?? palette.background),\n selectionBackground: packHex(palette.selectionBackground ?? palette.foreground),\n ...(palette.cursor === undefined ? {} : { cursor: packHex(palette.cursor) }), indexed };\n}\n\nexport function validateColorReference(value: number, underline = false): void {\n if ((value >>> 24) === 255 || (value >= 0x01000000 && value <= 0x010000ff) ||\n value === 0x02000000 || value === 0x03000000 || (underline && value === 0x04000000)) return;\n throw new Error(\"Invalid indexed-v1 color reference\");\n}\n\nfunction resolve(value: number, palette: RenderPalette): number {\n switch (value >>> 24) {\n case 1: return palette.indexed[value & 255];\n case 2: return palette.foreground;\n case 3: return palette.background;\n default: return value;\n }\n}\n\nexport function foregroundColor(cell: TerminalCell, metadata: FrameMetadata, palette: RenderPalette): number {\n if (metadata.colorEncoding !== \"indexed-v1\") return cell.foreground;\n const value = resolve(cell.attributes & 32 ? cell.background : cell.foreground, palette);\n return cell.attributes & 2\n ? (((value & 255) >> 1) | ((((value >>> 8) & 255) >> 1) << 8) |\n ((((value >>> 16) & 255) >> 1) << 16) | 0xff000000) >>> 0\n : value;\n}\n\nexport function backgroundColor(cell: TerminalCell, metadata: FrameMetadata, palette: RenderPalette): number {\n if (metadata.colorEncoding !== \"indexed-v1\") return cell.background;\n if (!(cell.attributes & 32) && cell.background === 0x03000000) return palette.background & 0x00ffffff;\n return resolve(cell.attributes & 32 ? cell.foreground : cell.background, palette);\n}\n\nexport function underlineColor(cell: TerminalCell, metadata: FrameMetadata, palette: RenderPalette): number {\n if (metadata.colorEncoding !== \"indexed-v1\") return cell.underlineColor;\n return cell.underlineColor === 0x04000000\n ? foregroundColor(cell, metadata, palette) : resolve(cell.underlineColor, palette);\n}\n", "import type { FrameMetadata, HistoryMetadata, SelectionText, TerminalCell, TerminalFrame } from \"./wire-types.js\";\nimport { isRecord } from \"./validation.js\";\nimport { validateMarkerId } from \"./marker-state.js\";\nimport { validateColorReference } from \"./terminal-palette.js\";\n\n// Binary validation is deliberately independent of the GPU and the transport.\nexport const LIMITS = Object.freeze({\n commandBytes: 64 * 1024,\n frameBytes: 96 * 1024 * 1024,\n metadataBytes: 8 * 1024 * 1024,\n titleUnits: 4096,\n commandMarkParameterUnits: 8192,\n cells: 262144,\n images: 4096,\n placements: 16384,\n textureBytes: 256 * 1024 * 1024,\n});\n\nconst utf8 = new TextDecoder(\"utf-8\", { fatal: true });\nconst utf8Encoder = new TextEncoder();\n\nexport function assertCommandSize(command: unknown): void {\n if (utf8Encoder.encode(JSON.stringify(command)).byteLength > LIMITS.commandBytes)\n throw new RangeError(\"Terminal input exceeds the 64 KiB message limit. Send a smaller amount of text.\");\n}\n\nfunction integer(value: unknown, name: string, min = 0, max = Number.MAX_SAFE_INTEGER): number {\n if (typeof value !== \"number\" || !Number.isSafeInteger(value) || value < min || value > max) {\n throw new Error(`Invalid ${name}: ${String(value)}`);\n }\n return value;\n}\n\nfunction array(value: unknown, name: string, limit: number): asserts value is unknown[] {\n if (!Array.isArray(value) || value.length > limit) throw new Error(`Invalid ${name}`);\n}\n\nfunction key(value: unknown): asserts value is string {\n if (typeof value !== \"string\" || !value.length || value.length > 1024) {\n throw new Error(\"Invalid image key\");\n }\n}\n\nfunction rowId(value: unknown, name: string): asserts value is string {\n if (typeof value !== \"string\" || !/^[1-9][0-9]{0,18}$/u.test(value) || BigInt(value) > 9223372036854775807n) {\n throw new Error(`Invalid ${name}`);\n }\n}\n\nexport function validateHistory(history: unknown, columns: number, rows: number): asserts history is HistoryMetadata | null {\n if (history === null) return;\n if (!isRecord(history)) throw new Error(\"Missing history metadata\");\n rowId(history.generation, \"history generation\");\n if (history.buffer !== \"main\" && history.buffer !== \"alternate\") throw new Error(\"Invalid history buffer\");\n const totalRows = integer(history.totalRows, \"history total rows\", rows, 2147483647);\n const liveTop = integer(history.liveTop, \"history live top\", 0, totalRows - rows);\n if (liveTop !== totalRows - rows) throw new Error(\"Inconsistent history extent\");\n integer(history.top, \"history top\", 0, liveTop);\n if (typeof history.following !== \"boolean\" || (history.following && history.top !== history.liveTop)) {\n throw new Error(\"Invalid history following state\");\n }\n integer(history.requestId, \"viewport request id\");\n if (history.viewportError !== undefined && history.viewportError !== null &&\n (typeof history.viewportError !== \"string\" || history.viewportError.length > 4096))\n throw new Error(\"Invalid viewport error\");\n array(history.rowIds, \"viewport row ids\", rows);\n if (history.rowIds.length !== rows || new Set(history.rowIds).size !== rows) throw new Error(\"Invalid viewport row ids\");\n for (const id of history.rowIds) rowId(id, \"viewport row id\");\n const selection = history.selection;\n if (!isRecord(selection) || typeof selection.status !== \"string\" ||\n ![\"none\", \"valid\", \"invalidated\"].includes(selection.status)) throw new Error(\"Invalid selection status\");\n integer(selection.requestId, \"selection request id\");\n if (typeof selection.mode !== \"string\" || ![\"character\", \"word\", \"line\", \"rectangle\"].includes(selection.mode)) throw new Error(\"Invalid selection mode\");\n array(selection.ranges, \"selection ranges\", rows);\n let previousRow = -1;\n for (const range of selection.ranges) {\n if (!isRecord(range)) throw new Error(\"Invalid selection range\");\n const row = integer(range.row, \"selection range row\", previousRow + 1, rows - 1);\n const startColumn = integer(range.startColumn, \"selection start column\", 0, columns - 1);\n integer(range.endColumn, \"selection end column\", startColumn + 1, columns);\n previousRow = row;\n }\n validateSelectionText(selection);\n if (selection.status !== \"valid\" && selection.ranges.length) throw new Error(\"Inactive selection has highlight ranges\");\n if (history.copy !== null) {\n if (!isRecord(history.copy)) throw new Error(\"Missing copy metadata\");\n integer(history.copy.requestId, \"copy request id\", 1);\n validateSelectionText(history.copy);\n }\n if (history.markers !== undefined) {\n array(history.markers, \"history markers\", LIMITS.metadataBytes / 48);\n const ids = new Set<string>();\n for (const marker of history.markers) {\n if (!isRecord(marker) || typeof marker.id !== \"string\") throw new Error(\"Invalid history marker\");\n validateMarkerId(marker.id);\n if (ids.has(marker.id)) throw new Error(\"Duplicate history marker ID\");\n ids.add(marker.id);\n if (marker.source !== \"command\" && marker.source !== \"custom\") throw new Error(\"Invalid marker source\");\n if (!marker.id.startsWith(`${marker.source}:`)) throw new Error(\"Marker source disagrees with its ID\");\n if (marker.buffer !== \"main\" && marker.buffer !== \"alternate\") throw new Error(\"Invalid marker buffer\");\n integer(marker.column, \"marker column\", 0, 1024);\n if (marker.row !== null) {\n integer(marker.row, \"marker row\", 0, totalRows - 1);\n if (marker.buffer !== history.buffer) throw new Error(\"Inactive-buffer marker has a resolved row\");\n }\n if (marker.source === \"command\") validateCommandMark({ ...marker, rawParameters: null });\n else if (marker.phase !== undefined && marker.phase !== null) throw new Error(\"Custom marker has a shell phase\");\n }\n }\n if (history.markerPage !== undefined && history.markerPage !== null) {\n const page = history.markerPage;\n if (!isRecord(page) || typeof page.revision !== \"string\" || !page.revision.length || page.revision.length > 64)\n throw new Error(\"Invalid marker page revision\");\n const total = integer(page.total, \"marker inventory count\", 1, Math.floor(LIMITS.metadataBytes / 48));\n const offset = integer(page.offset, \"marker page offset\", 0, total - 1);\n if (!Array.isArray(history.markers) || !history.markers.length || offset + history.markers.length > total)\n throw new Error(\"Invalid marker page length\");\n }\n if (history.markerResult !== undefined && history.markerResult !== null) {\n const result = history.markerResult;\n if (!isRecord(result) || typeof result.success !== \"boolean\") throw new Error(\"Invalid marker result\");\n integer(result.requestId, \"marker request ID\", 1);\n if (result.error !== undefined && result.error !== null &&\n (typeof result.error !== \"string\" || result.error.length > 4096)) throw new Error(\"Invalid marker error\");\n if (result.markerId !== undefined && result.markerId !== null) {\n if (typeof result.markerId !== \"string\") throw new Error(\"Invalid result marker ID\");\n validateMarkerId(result.markerId);\n }\n if (result.details !== undefined && result.details !== null) validateCommandMark(result.details);\n }\n}\n\nfunction validateCommandMark(commandMark: unknown): void {\n if (!isRecord(commandMark) || typeof commandMark.phase !== \"string\" ||\n ![\"unknown\", \"prompt\", \"commandLine\", \"executing\", \"finished\"].includes(commandMark.phase))\n throw new Error(\"Invalid terminal command mark\");\n if (commandMark.exitCode !== null) {\n integer(commandMark.exitCode, \"terminal command mark exit code\", -2147483648, 2147483647);\n if (commandMark.phase !== \"finished\") throw new Error(\"Non-finished terminal command mark has an exit code\");\n }\n if (commandMark.rawParameters !== null &&\n (typeof commandMark.rawParameters !== \"string\" || commandMark.rawParameters.length > LIMITS.commandMarkParameterUnits))\n throw new Error(\"Invalid terminal command mark parameters\");\n}\n\nfunction validateSelectionText(selection: Record<string, unknown>): asserts selection is Record<string, unknown> & SelectionText {\n if (typeof selection.status !== \"string\" || ![\"none\", \"valid\", \"invalidated\"].includes(selection.status) ||\n (selection.status === \"valid\"\n ? typeof selection.text !== \"string\" || selection.text.length > LIMITS.metadataBytes\n : selection.text !== null)) {\n throw new Error(\"Invalid selection text\");\n }\n}\n\nfunction validateMetadata(metadata: unknown): asserts metadata is FrameMetadata {\n if (!isRecord(metadata) || metadata.version !== 1 || typeof metadata.full !== \"boolean\") {\n throw new Error(\"Unsupported frame metadata version\");\n }\n integer(metadata.revision, \"revision\", 1);\n integer(metadata.baseRevision, \"base revision\");\n if (metadata.colorEncoding !== undefined && metadata.colorEncoding !== null &&\n metadata.colorEncoding !== \"indexed-v1\") throw new Error(\"Unsupported color encoding\");\n if (metadata.colorEncodings !== undefined) {\n array(metadata.colorEncodings, \"color encodings\", 16);\n if (metadata.colorEncodings.some(value => typeof value !== \"string\" || value.length > 64))\n throw new Error(\"Invalid color encodings\");\n }\n if (typeof metadata.title !== \"string\" || metadata.title.length > LIMITS.titleUnits ||\n /[\\u0000-\\u001f\\u007f-\\u009f\\ud800-\\udfff]/u.test(metadata.title)) {\n throw new Error(\"Invalid terminal title\");\n }\n const progress = metadata.progress;\n if (!isRecord(progress) || typeof progress.state !== \"string\" ||\n ![\"none\", \"normal\", \"error\", \"indeterminate\", \"warning\"].includes(progress.state)) {\n throw new Error(\"Invalid terminal progress\");\n }\n if (progress.state === \"none\" || progress.state === \"indeterminate\") {\n if (progress.percentage !== null) throw new Error(\"Unexpected terminal progress percentage\");\n } else {\n integer(progress.percentage, \"terminal progress percentage\", 0, 100);\n }\n const shell = metadata.shellIntegration;\n if (!isRecord(shell) || typeof shell.phase !== \"string\" ||\n ![\"unknown\", \"prompt\", \"commandLine\", \"executing\", \"finished\"].includes(shell.phase)) {\n throw new Error(\"Invalid terminal shell integration\");\n }\n if (shell.lastExitCode !== null)\n integer(shell.lastExitCode, \"terminal shell exit code\", -2147483648, 2147483647);\n if (shell.phase === \"unknown\" && shell.lastExitCode !== null)\n throw new Error(\"Unknown terminal shell phase has an exit code\");\n const workingDirectory = metadata.workingDirectory;\n if (!isRecord(workingDirectory)) throw new Error(\"Invalid terminal working directory\");\n const wdFields = [workingDirectory.uri, workingDirectory.host, workingDirectory.path];\n if (wdFields.every(field => field === null)) {\n // No directory reported yet.\n } else if (wdFields.some(field => typeof field !== \"string\" || field.length > LIMITS.metadataBytes)) {\n throw new Error(\"Invalid terminal working directory\");\n }\n const commandMark = metadata.commandMark;\n if (commandMark !== null) validateCommandMark(commandMark);\n const columns = integer(metadata.columns, \"columns\", 1, 1024);\n const rows = integer(metadata.rows, \"rows\", 1, 512);\n if (metadata.lineRenditions !== undefined) {\n array(metadata.lineRenditions, \"line renditions\", rows);\n if (metadata.lineRenditions.length !== rows) throw new Error(\"Invalid line rendition count\");\n for (const rendition of metadata.lineRenditions) integer(rendition, \"line rendition\", 0, 3);\n }\n if (typeof metadata.mouseTracking !== \"number\" || ![0, 9, 1000, 1002, 1003].includes(metadata.mouseTracking)) {\n throw new Error(\"Unsupported mouse tracking mode\");\n }\n if (!isRecord(metadata.peer) || typeof metadata.peer.isPrimary !== \"boolean\") throw new Error(\"Invalid peer state\");\n for (const field of [\"id\", \"primaryId\"]) {\n const id = metadata.peer[field];\n if (id !== null && (typeof id !== \"string\" || !id.length || id.length > 256)) {\n throw new Error(`Invalid peer ${field}`);\n }\n }\n if (metadata.peer.id !== null && metadata.peer.isPrimary !== (metadata.peer.id === metadata.peer.primaryId)) {\n throw new Error(\"Inconsistent primary peer state\");\n }\n integer(columns * rows, \"cell count\", 1, LIMITS.cells);\n validateHistory(metadata.history, columns, rows);\n array(metadata.hyperlinks, \"hyperlinks\", columns * rows);\n let previousLinkEnd = 0;\n for (const link of metadata.hyperlinks) {\n if (!isRecord(link)) throw new Error(\"Invalid hyperlink\");\n const row = integer(link.row, \"hyperlink row\", 0, rows - 1);\n const start = integer(link.startColumn, \"hyperlink start column\", 0, columns - 1);\n const end = integer(link.endColumn, \"hyperlink end column\", start + 1, columns);\n if (row * columns + start < previousLinkEnd) throw new Error(\"Unordered or overlapping hyperlinks\");\n previousLinkEnd = row * columns + end;\n if (typeof link.uri !== \"string\" || !link.uri.length || link.uri.length > LIMITS.metadataBytes)\n throw new Error(\"Invalid hyperlink URI\");\n }\n if (metadata.cellWidth !== 10 || metadata.cellHeight !== 20) {\n throw new Error(\"This spike requires server geometry of 10 \u00D7 20 logical pixels\");\n }\n for (const field of [\"defaultBackground\", \"defaultForeground\"]) {\n if (metadata[field] !== undefined) integer(metadata[field], field, 0, 0xffffffff);\n }\n if (!isRecord(metadata.cursor) || typeof metadata.cursor.visible !== \"boolean\") throw new Error(\"Invalid cursor\");\n integer(metadata.cursor.x, \"cursor x\", -1, 1024);\n integer(metadata.cursor.y, \"cursor y\", -1, 512);\n const shapes = [\"Default\", \"BlinkingBlock\", \"SteadyBlock\", \"BlinkingUnderline\", \"SteadyUnderline\", \"BlinkingBar\", \"SteadyBar\"];\n if (typeof metadata.cursor.shape === \"string\") metadata.cursor.shape = shapes.indexOf(metadata.cursor.shape);\n integer(metadata.cursor.shape, \"cursor shape\", 0, 6);\n array(metadata.images, \"images\", LIMITS.images);\n array(metadata.retainedImages, \"retained image keys\", LIMITS.images);\n array(metadata.placements, \"placements\", LIMITS.placements);\n array(metadata.warnings, \"warnings\", 256);\n if (metadata.warnings.some(w => typeof w !== \"string\")) throw new Error(\"Invalid warning\");\n if (!isRecord(metadata.stats)) throw new Error(\"Invalid server metrics\");\n for (const field of [\"workloadBytes\", \"outputBatches\", \"captureMs\", \"elapsedMs\"]) {\n const metric = metadata.stats[field];\n if (typeof metric !== \"number\" || !Number.isFinite(metric) || metric < 0) {\n throw new Error(`Invalid server metric ${field}`);\n }\n }\n const retained = new Set<string>();\n for (const imageKey of metadata.retainedImages) {\n key(imageKey);\n if (retained.has(imageKey)) throw new Error(\"Duplicate retained image key\");\n retained.add(imageKey);\n }\n const imageKeys = new Set<string>();\n let decodedImageBytes = 0;\n for (const image of metadata.images) {\n if (!isRecord(image)) throw new Error(\"Invalid image\");\n key(image.key);\n if (imageKeys.has(image.key) || !retained.has(image.key)) throw new Error(\"Inconsistent new image keys\");\n imageKeys.add(image.key);\n const width = integer(image.width, \"image width\", 1, 16384);\n const height = integer(image.height, \"image height\", 1, 16384);\n const byteLength = integer(image.byteLength, \"image byte length\", 1, LIMITS.frameBytes);\n if (image.format !== \"rgba\" && image.format !== \"png\") throw new Error(\"Unsupported image format\");\n if (image.format === \"rgba\" && byteLength !== width * height * 4) {\n throw new Error(\"RGBA image size mismatch\");\n }\n decodedImageBytes += width * height * 4;\n if (decodedImageBytes > LIMITS.textureBytes) throw new Error(\"New images exceed decoded texture budget\");\n }\n for (const placement of metadata.placements) {\n if (!isRecord(placement)) throw new Error(\"Invalid placement\");\n key(placement.key);\n if (!retained.has(placement.key)) throw new Error(\"Placement references an unretained image\");\n if (placement.kind !== \"kgp\" && placement.kind !== \"sixel\") throw new Error(\"Invalid placement kind\");\n for (const field of [\"x\", \"y\", \"width\", \"height\", \"sourceX\", \"sourceY\", \"sourceWidth\", \"sourceHeight\", \"clipX\", \"clipY\", \"clipWidth\", \"clipHeight\", \"z\"]) {\n const coordinate = placement[field];\n if (typeof coordinate !== \"number\" || !Number.isFinite(coordinate) || Math.abs(coordinate) > 2147483648) {\n throw new Error(`Invalid placement ${field}`);\n }\n }\n for (const field of [\"width\", \"height\", \"sourceWidth\", \"sourceHeight\", \"clipWidth\", \"clipHeight\"]) {\n const coordinate = placement[field];\n if (typeof coordinate !== \"number\" || coordinate < 0) throw new Error(`Negative placement ${field}`);\n }\n }\n}\n\n/** Decode one complete, experimental HWT1 message, checking every boundary before reading. */\nexport function decodeFrame(buffer: unknown): TerminalFrame {\n if (!(buffer instanceof ArrayBuffer) || buffer.byteLength > LIMITS.frameBytes) {\n throw new Error(\"Invalid or oversized binary frame\");\n }\n const view = new DataView(buffer);\n let offset = 0;\n const requireBytes = (count: number) => {\n if (count < 0 || count > view.byteLength - offset) throw new Error(\"Truncated HWT1 frame\");\n };\n const u32 = () => { requireBytes(4); const n = view.getUint32(offset, true); offset += 4; return n; };\n if (u32() !== 0x31545748) throw new Error(\"Unsupported frame magic (expected HWT1)\");\n const metadataLength = integer(u32(), \"metadata length\", 2, LIMITS.metadataBytes);\n requireBytes(metadataLength);\n const metadata: unknown = JSON.parse(utf8.decode(new Uint8Array(buffer, offset, metadataLength)));\n offset += metadataLength;\n validateMetadata(metadata);\n const cellCount = metadata.columns * metadata.rows;\n const changedCount = integer(u32(), \"changed cell count\", 0, cellCount);\n if (changedCount > Math.floor((view.byteLength - offset) / 22)) throw new Error(\"Truncated cell records\");\n if (metadata.full && changedCount !== cellCount) throw new Error(\"Incomplete full frame\");\n const cells = [];\n const seen = new Set();\n for (let i = 0; i < changedCount; i++) {\n requireBytes(22);\n const index = u32();\n if (index >= cellCount || seen.has(index)) throw new Error(\"Invalid or duplicate cell index\");\n seen.add(index);\n const foreground = u32();\n const background = u32();\n const underlineColor = u32();\n if (metadata.colorEncoding === \"indexed-v1\") {\n validateColorReference(foreground);\n validateColorReference(background);\n validateColorReference(underlineColor, true);\n }\n const attributes = view.getUint16(offset, true);\n const width = view.getUint8(offset + 2);\n const underlineStyle = view.getUint8(offset + 3);\n const textLength = view.getUint16(offset + 4, true);\n offset += 6;\n if (underlineStyle > 5) throw new Error(\"Unsupported underline style\");\n requireBytes(textLength);\n const text = utf8.decode(new Uint8Array(buffer, offset, textLength));\n offset += textLength;\n cells.push({ index, foreground, background, underlineColor, attributes, width, underlineStyle, text });\n }\n const imageBytes = metadata.images.reduce((total, image) => total + image.byteLength, 0);\n if (imageBytes !== view.byteLength - offset) throw new Error(\"Image payload length mismatch\");\n const images = metadata.images.map(image => {\n const bytes = new Uint8Array(buffer, offset, image.byteLength);\n offset += image.byteLength;\n return { ...image, bytes };\n });\n return { metadata, cells, images };\n}\n\n/** Mirror text, not ANSI; continuation cells are already represented by their lead glyph. */\nexport function screenText(cells: readonly (TerminalCell | undefined)[], columns: number, rows: number): string {\n const lines = [];\n for (let y = 0; y < rows; y++) {\n let line = \"\";\n for (let x = 0; x < columns; x++) {\n const cell = cells[y * columns + x];\n if (!cell || cell.width === 0) continue;\n line += cell.attributes & 64 ? \" \".repeat(cell.width) : (cell.text || \" \");\n }\n lines.push(line.replace(/ +$/u, \"\"));\n }\n return lines.join(\"\\n\");\n}\n", "import { LIMITS } from \"./protocol.js\";\nimport type { TerminalTransport, TerminalTransportCloseDetails, TerminalTransportConnection } from \"./transport-types.js\";\nimport { errorMessage } from \"./validation.js\";\n\ninterface Callbacks {\n onReady(): void;\n onFrame(frame: ArrayBuffer): Promise<void>;\n onClose(details: TerminalTransportCloseDetails): void;\n onError(error: Error): void;\n}\n\n/** Shared lifecycle and bounded delivery for worker-local and host-bridged transports. */\nexport class TransportSession {\n #abort = new AbortController();\n #ready = Promise.withResolvers<void>();\n #connection: TerminalTransportConnection | undefined;\n #frame = false;\n #receiving: Promise<void> | undefined;\n #closing = false;\n #sending = false;\n #queue: { control: string; bytes: number; resolve(): void; reject(error: unknown): void }[] = [];\n #bytes = 0;\n\n constructor(private callbacks: Callbacks) {\n // Disposal can precede the first frame waiting for readiness.\n void this.#ready.promise.catch(() => {});\n }\n\n get closing(): boolean { return this.#closing; }\n\n start(transport: TerminalTransport): void {\n void this.#connect(transport);\n }\n\n async #connect(transport: TerminalTransport): Promise<void> {\n try {\n const connection = await transport.connect({\n signal: this.#abort.signal,\n onFrame: frame => {\n const receiving = this.#receive(frame);\n this.#receiving = receiving;\n return receiving;\n },\n onClose: details => {\n if (this.#abort.signal.aborted || this.#closing) return;\n if (!details || typeof details.reason !== \"string\" ||\n (details.code !== undefined && (!Number.isInteger(details.code) || typeof details.wasClean !== \"boolean\"))) {\n this.#fail(new TypeError(\"Invalid terminal transport close details\"));\n return;\n }\n const snapshot = details.code === undefined ? { reason: details.reason }\n : { code: details.code, reason: details.reason, wasClean: details.wasClean };\n this.#closing = true;\n void this.#close(snapshot);\n },\n onError: error => this.#fail(error)\n });\n if (!connection || typeof connection.send !== \"function\" || typeof connection.dispose !== \"function\")\n throw new TypeError(\"transport.connect must return a connection with send and dispose\");\n if (this.#abort.signal.aborted) { connection.dispose(); return; }\n this.#connection = connection;\n this.callbacks.onReady();\n this.#ready.resolve();\n } catch (error) { this.#fail(error); }\n }\n\n async #receive(frame: ArrayBuffer | Uint8Array<ArrayBuffer>): Promise<void> {\n try {\n this.#abort.signal.throwIfAborted();\n if (this.#closing) throw new Error(\"Terminal transport is closing\");\n if (this.#frame) throw new Error(\"Concurrent terminal transport frames are not allowed\");\n if (!(frame instanceof ArrayBuffer) &&\n !(frame instanceof Uint8Array && frame.buffer instanceof ArrayBuffer))\n throw new TypeError(\"Transport frames must be ArrayBuffer or Uint8Array backed by ArrayBuffer\");\n if (!frame.byteLength || frame.byteLength > LIMITS.frameBytes)\n throw new RangeError(\"Invalid HWT1 frame size\");\n this.#frame = true;\n const buffer = frame instanceof ArrayBuffer ? frame : new Uint8Array(frame).buffer;\n await this.#ready.promise;\n this.#abort.signal.throwIfAborted();\n await this.callbacks.onFrame(buffer);\n this.#abort.signal.throwIfAborted();\n this.#frame = false;\n } catch (error) {\n this.#fail(error);\n throw error;\n }\n }\n\n async #close(details: TerminalTransportCloseDetails): Promise<void> {\n try {\n await this.#receiving;\n } catch {\n // Frame failures already notify onError and stop the session.\n return;\n }\n if (this.#abort.signal.aborted) return;\n this.dispose();\n this.callbacks.onClose(details);\n }\n\n send(control: string): Promise<void> {\n if (this.#abort.signal.aborted) return Promise.reject(this.#abort.signal.reason);\n if (this.#closing) return Promise.reject(new DOMException(\"Terminal transport is closing\", \"AbortError\"));\n const bytes = new TextEncoder().encode(control).byteLength;\n if (this.#queue.length >= 256 || this.#bytes + bytes > 1024 * 1024) {\n const error = new Error(\"Terminal transport control queue exceeded its bounded capacity\");\n this.#fail(error);\n return Promise.reject(error);\n }\n const pending = Promise.withResolvers<void>();\n this.#queue.push({ control, bytes, resolve: pending.resolve, reject: pending.reject });\n this.#bytes += bytes;\n void this.#drain();\n return pending.promise;\n }\n\n async #drain(): Promise<void> {\n if (this.#sending) return;\n this.#sending = true;\n try {\n await this.#ready.promise;\n while (!this.#abort.signal.aborted && !this.#closing && this.#queue.length) {\n const item = this.#queue[0];\n await this.#connection!.send(item.control);\n if (this.#abort.signal.aborted) return;\n this.#queue.shift();\n this.#bytes -= item.bytes;\n item.resolve();\n }\n } catch (error) {\n // Closing cancels outbound delivery, but must not abort the accepted final frame.\n if (!this.#closing) this.#fail(error);\n }\n finally { this.#sending = false; }\n }\n\n #fail(error: unknown): void {\n if (this.#abort.signal.aborted) return;\n const failure = error instanceof Error ? error : new Error(errorMessage(error));\n this.#stop(failure);\n this.callbacks.onError(failure);\n }\n\n dispose(): void {\n this.#stop(new DOMException(\"Terminal transport was disposed or closed\", \"AbortError\"));\n }\n\n #stop(error: Error): void {\n if (this.#abort.signal.aborted) return;\n this.#abort.abort(error);\n this.#ready.reject(error);\n for (const item of this.#queue) item.reject(error);\n this.#queue = [];\n this.#bytes = 0;\n this.#connection?.dispose();\n this.#connection = undefined;\n }\n}\n", "const defaultFontUrl = new URL(\"./fonts/cascadia-mono-nf/CascadiaMonoNF.woff2\", import.meta.url).href;\nconst genericFamilies = new Set([\"monospace\", \"serif\", \"sans-serif\", \"system-ui\"]);\n\n/** Resolve caller-relative URLs before sending the configuration to the worker. */\nexport function normalizeFont(font?: TerminalFont, baseUrl = import.meta.url): NormalizedFont {\n font ??= { family: \"Cascadia Mono NF\", faces: [{ url: defaultFontUrl, weight: \"200 700\" }] };\n if (typeof font !== \"object\" || Array.isArray(font) ||\n typeof font.family !== \"string\" || !font.family.trim() || font.family.length > 256 ||\n /[\\u0000-\\u001f\\u007f]/u.test(font.family)) {\n throw new TypeError(\"font.family must be a single, nonempty font family name\");\n }\n const faces = font.faces ?? [];\n if (!Array.isArray(faces) || faces.length > 16) throw new TypeError(\"font.faces must contain at most 16 font sources\");\n return {\n family: font.family.trim(),\n faces: faces.map(face => {\n if (!face || typeof face.url !== \"string\" || !face.url.trim()) {\n throw new TypeError(\"Each font face requires a URL\");\n }\n for (const field of [\"weight\", \"style\"] as const) {\n if (face[field] !== undefined && (typeof face[field] !== \"string\" || face[field].length > 64)) {\n throw new TypeError(`Font face ${field} must be a CSS descriptor string`);\n }\n }\n return {\n url: new URL(face.url, baseUrl).href,\n weight: face.weight ?? \"400\",\n style: face.style ?? \"normal\"\n };\n })\n };\n}\n\n/** Use the rendering context's FontFaceSet; a worker cannot inherit page fonts. */\nexport async function loadFont(configuration: TerminalFont): Promise<LoadedFont> {\n const { family, faces } = normalizeFont(configuration);\n const scope: object = globalThis;\n const fontSet = \"fonts\" in scope && isFontSet(scope.fonts)\n ? scope.fonts : globalThis.document?.fonts;\n if (!fontSet || typeof FontFace !== \"function\") {\n throw new Error(\"Terminal font loading requires the CSS Font Loading API in the rendering context\");\n }\n const generic = genericFamilies.has(family.toLowerCase());\n const cssFamily = generic ? family.toLowerCase() : JSON.stringify(family);\n if (generic && faces.length) throw new TypeError(\"A generic font family cannot have downloadable faces\");\n const sources: (TerminalFontFace | { local: string; weight?: string; style?: string })[] =\n faces.length ? faces : generic ? [] : [{ local: family }];\n const loaded: FontFace[] = [];\n for (const source of sources) {\n try {\n const face = new FontFace(family,\n \"local\" in source ? `local(${JSON.stringify(source.local)})` : `url(${JSON.stringify(source.url)})`,\n { weight: source.weight ?? \"400\", style: source.style ?? \"normal\" });\n loaded.push(await face.load());\n } catch (error) {\n throw new Error(`Could not load terminal font \"${family}\" from ${\"url\" in source ? source.url : \"local fonts\"}`, { cause: error });\n }\n }\n for (const face of loaded) fontSet.add(face);\n return {\n family, cssFamily,\n dispose() { for (const face of loaded) fontSet.delete(face); }\n };\n}\n\n/** Fit one font-wide advance and line box to the authoritative cell dimensions. */\nexport function measureFont(raster: OffscreenCanvasRenderingContext2D, cssFamily: string,\n attributes: number, scale: number, cellWidth: number, cellHeight: number): FontMetrics {\n const font = `${attributes & 4 ? \"italic \" : \"\"}${attributes & 1 ? \"bold \" : \"\"}${16 * scale}px ${cssFamily}`;\n raster.font = font;\n raster.textBaseline = \"alphabetic\";\n raster.textAlign = \"left\";\n const metrics = raster.measureText(\"M\");\n const lineHeight = metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent;\n if (!Number.isFinite(metrics.width) || metrics.width <= 0 ||\n !Number.isFinite(lineHeight) || lineHeight <= 0) {\n throw new Error(`Invalid terminal font metrics for ${cssFamily}`);\n }\n const xScale = cellWidth * scale / metrics.width;\n const yScale = cellHeight * scale / lineHeight;\n return { font, xScale, yScale, baseline: metrics.fontBoundingBoxAscent * yScale };\n}\nimport type { TerminalFont, TerminalFontFace } from \"./types.js\";\nimport { isRecord } from \"./validation.js\";\n\nexport interface NormalizedFont { family: string; faces: Required<TerminalFontFace>[] }\nexport interface LoadedFont { family: string; cssFamily: string; dispose(): void }\nexport interface FontMetrics { font: string; xScale: number; yScale: number; baseline: number }\n\nfunction isFontSet(value: unknown): value is Pick<FontFaceSet, \"add\" | \"delete\"> {\n return isRecord(value) && typeof value.add === \"function\" && typeof value.delete === \"function\";\n}\n", "import type { TerminalRendererPreference } from \"./types.js\";\n\nexport function normalizeRenderer(value: unknown = \"auto\"): TerminalRendererPreference {\n if (value === \"auto\" || value === \"webgpu\" || value === \"webgl2\") return value;\n throw new TypeError('renderer must be \"auto\", \"webgpu\", or \"webgl2\"');\n}\n", "import type { InputActionHandler, TerminalInput, TerminalInputContext } from \"./types.js\";\nimport type { TerminalLinkAction, TerminalLinkActivation, TerminalLinkOptions, TerminalLinkRule } from \"./link-types.js\";\n\nexport const LINK_LIMITS = Object.freeze({\n rules: 32, pattern: 8192, chunk: 65536, totalText: 262144, cells: 262144,\n matches: 2048, resultText: 262144, cacheEntries: 2048, cacheText: 1048576, timeoutMs: 250,\n});\n\nexport function validateLinkAction(action: unknown, actions: ReadonlySet<string>): asserts action is TerminalLinkAction {\n if (typeof action !== \"function\" && !(typeof action === \"string\" && actions.has(action))) {\n throw new TypeError(\"Link action must be a registered custom action or callback\");\n }\n}\n\nfunction object(value: unknown): boolean {\n return value !== null && typeof value === \"object\" && !Array.isArray(value);\n}\n\nexport function normalizeLinks(options: false | TerminalLinkOptions | undefined,\n actions: ReadonlySet<string>): false | TerminalLinkOptions {\n if (options === false) return false;\n if (options === undefined) return {};\n if (!object(options)) throw new TypeError(\"Invalid links configuration\");\n const normalized: TerminalLinkOptions = {};\n if (options.osc8 === false) normalized.osc8 = false;\n else if (options.osc8 !== undefined) {\n if (!object(options.osc8)) throw new TypeError(\"Invalid OSC 8 configuration\");\n validateLinkAction(options.osc8.action, actions);\n normalized.osc8 = { action: options.osc8.action };\n }\n const detection = options.detection;\n if (detection === false) normalized.detection = false;\n else if (detection !== undefined) {\n if (!object(detection) || !Array.isArray(detection.rules)) throw new TypeError(\"Invalid detection configuration\");\n if (detection.rules.length > LINK_LIMITS.rules) throw new TypeError(\"Too many link rules\");\n if (detection.activation !== undefined && ![\"modifierClick\", \"click\"].includes(detection.activation)) {\n throw new TypeError(\"Invalid link activation\");\n }\n if (detection.decoration !== undefined && ![\"always\", \"hover\", \"none\"].includes(detection.decoration)) {\n throw new TypeError(\"Invalid link decoration\");\n }\n if (detection.underlineStyle !== undefined && ![\"solid\", \"dashed\"].includes(detection.underlineStyle)) {\n throw new TypeError(\"Invalid link underline style\");\n }\n const ids = new Set<string>();\n const rules = detection.rules.map((rule: TerminalLinkRule): TerminalLinkRule => {\n if (!object(rule) || typeof rule.id !== \"string\" || !rule.id.length || rule.id.length > 256 || ids.has(rule.id)) {\n throw new TypeError(\"Link rule IDs must be nonempty and unique\");\n }\n ids.add(rule.id);\n if (rule.enabled !== undefined && typeof rule.enabled !== \"boolean\") throw new TypeError(\"Invalid enabled flag\");\n if (rule.text !== undefined && ![\"physicalRow\", \"logicalLine\", \"viewport\"].includes(rule.text)) {\n throw new TypeError(\"Invalid link text mode\");\n }\n if (rule.resolve !== undefined && typeof rule.resolve !== \"function\") throw new TypeError(\"Invalid resolver\");\n validateLinkAction(rule.action, actions);\n const common = { id: rule.id, action: rule.action, enabled: rule.enabled ?? true,\n text: rule.text ?? \"logicalLine\", resolve: rule.resolve };\n if (rule.builtin !== undefined) {\n if (![\"url\", \"uri\", \"absolutePath\", \"homePath\"].includes(rule.builtin) ||\n rule.pattern !== undefined || rule.kind !== undefined) throw new TypeError(\"Invalid builtin rule\");\n return { ...common, builtin: rule.builtin };\n }\n if (!(rule.pattern instanceof RegExp) || ![\"uri\", \"path\", \"custom\"].includes(rule.kind)) {\n throw new TypeError(\"Custom rules require a RegExp and kind\");\n }\n if (rule.pattern.source.length > LINK_LIMITS.pattern || /[^dgimsuv]/u.test(rule.pattern.flags)) {\n throw new TypeError(\"Unsupported regex flags or oversized pattern (sticky is not supported)\");\n }\n return { ...common, kind: rule.kind, pattern: new RegExp(rule.pattern.source, rule.pattern.flags) };\n });\n normalized.detection = { rules, activation: detection.activation ?? \"modifierClick\",\n decoration: detection.decoration ?? \"always\", underlineStyle: detection.underlineStyle ?? \"solid\" };\n }\n return normalized;\n}\n\nexport function isLinkActivation(input: unknown): input is TerminalLinkActivation {\n if (!object(input)) return false;\n const value = input as Record<string, unknown>;\n if (![\"detected\", \"osc8\"].includes(value.source as string) ||\n ![\"uri\", \"path\", \"custom\"].includes(value.kind as string) ||\n typeof value.text !== \"string\" || typeof value.target !== \"string\" ||\n !Number.isSafeInteger(value.revision) || (value.revision as number) < 0 ||\n !Array.isArray(value.ranges) || value.ranges.length === 0) return false;\n if (value.source === \"osc8\" ? value.ruleId !== null || value.kind !== \"uri\"\n : typeof value.ruleId !== \"string\" || value.ruleId.length === 0) return false;\n return value.ranges.every(range => object(range) &&\n Number.isSafeInteger(range.row) && (range.row as number) >= 0 &&\n Number.isSafeInteger(range.startColumn) && (range.startColumn as number) >= 0 &&\n Number.isSafeInteger(range.endColumn) && (range.endColumn as number) > (range.startColumn as number));\n}\n\nexport function linkAction(handler: (context: TerminalInputContext, link: TerminalLinkActivation,\n input: Readonly<TerminalInput> | undefined) => unknown): InputActionHandler {\n if (typeof handler !== \"function\") throw new TypeError(\"Expected a link action callback\");\n return (context, args, input) => {\n if (!isLinkActivation(args)) throw new TypeError(\"Expected a terminal link activation\");\n return handler(context, args, input);\n };\n}\n", "import type { TerminalLinkRule } from \"./link-types.js\";\n\nexport interface LinkScanRequest {\n id: number;\n rule: { source: string; flags: string } | { builtin: NonNullable<TerminalLinkRule[\"builtin\"]> };\n chunks: { key: string; text: string }[];\n}\nexport interface LinkScanMatch {\n index: number; text: string; captures: (string | undefined)[];\n groups: Record<string, string | undefined>;\n}\nexport function linkMatchTextSize(match: LinkScanMatch): number {\n // Include entry overhead so empty capture groups cannot evade the payload budget.\n let size = match.text.length + 16;\n for (const capture of match.captures) size += 8 + (capture?.length ?? 0);\n for (const [name, group] of Object.entries(match.groups)) size += 8 + name.length + (group?.length ?? 0);\n return size;\n}\nexport interface LinkScanResponse {\n id: number;\n results?: { key: string; matches: LinkScanMatch[] }[];\n error?: \"limit\" | \"worker\";\n message?: string;\n}\n", "export const QUAD_STRIDE = 16;\n\nexport type RenderColor = [number, number, number, number];\nexport type RenderPixels = Uint8Array<ArrayBuffer> | Uint8ClampedArray<ArrayBuffer>;\n\nexport interface RenderTexture {\n readonly width: number;\n readonly height: number;\n writePixels(pixels: RenderPixels, width: number, height: number, x?: number, y?: number): void;\n writeBitmap(bitmap: ImageBitmap): void;\n destroy(): void;\n}\n\nexport interface RenderBatch { resource: RenderTexture; start: number; count: number }\n\n/** Internal graphics boundary; layout, rasterization and ordering belong to TerminalRenderer. */\nexport interface RenderBackend {\n readonly kind: \"webgpu\" | \"webgl2\";\n readonly maxTextureDimension2D: number;\n readonly maxCanvasDimension2D: number;\n readonly instanceBufferBytes: number;\n createTexture(width: number, height: number, label: string): RenderTexture;\n resize(width: number, height: number): void;\n submit(instances: Float32Array<ArrayBuffer>, quadCount: number, batches: readonly RenderBatch[],\n background: RenderColor): void;\n idle(): Promise<void>;\n dispose(): void;\n}\n\n/** Only capability/device acquisition failures may trigger automatic backend fallback. */\nexport class RendererUnavailableError extends Error {}\n", "import { QUAD_STRIDE, RendererUnavailableError } from \"./render-backend.js\";\nimport type { RenderBackend, RenderBatch, RenderColor, RenderPixels, RenderTexture } from \"./render-backend.js\";\n\n// The DOM library declares WebGPU interfaces but omits these runtime constants.\ndeclare const GPUBufferUsage: {\n readonly COPY_DST: number;\n readonly UNIFORM: number;\n readonly VERTEX: number;\n};\ndeclare const GPUTextureUsage: {\n readonly COPY_DST: number;\n readonly TEXTURE_BINDING: number;\n readonly RENDER_ATTACHMENT: number;\n};\n\nconst shader = /* wgsl */ `\nstruct Viewport { size: vec2f, padding: vec2f }\n@group(0) @binding(0) var<uniform> viewport: Viewport;\n@group(0) @binding(1) var image: texture_2d<f32>;\n@group(0) @binding(2) var imageSampler: sampler;\n\nstruct VertexOut {\n @builtin(position) position: vec4f,\n @location(0) uv: vec2f,\n @location(1) color: vec4f,\n @location(2) @interpolate(flat) mode: f32,\n}\n\n@vertex fn vertex(\n @builtin(vertex_index) index: u32,\n @location(0) rect: vec4f,\n @location(1) uvRect: vec4f,\n @location(2) color: vec4f,\n @location(3) mode: f32,\n) -> VertexOut {\n let corners = array<vec2f, 6>(\n vec2f(0, 0), vec2f(1, 0), vec2f(0, 1),\n vec2f(0, 1), vec2f(1, 0), vec2f(1, 1)\n );\n let corner = corners[index];\n let position = rect.xy + corner * rect.zw;\n var out: VertexOut;\n out.position = vec4f(position / viewport.size * vec2f(2, -2) + vec2f(-1, 1), 0, 1);\n out.uv = mix(uvRect.xy, uvRect.zw, corner);\n out.color = color;\n out.mode = mode;\n return out;\n}\n\n@fragment fn fragment(in: VertexOut) -> @location(0) vec4f {\n // Explicit LOD avoids derivative-uniformity requirements across solid/mask/image batches.\n let texel = textureSampleLevel(image, imageSampler, in.uv, 0);\n if (in.mode < 0.5) { return in.color; }\n if (in.mode < 1.5) { return vec4f(in.color.rgb, in.color.a * texel.a); }\n return texel * in.color;\n}`;\n\nclass WebGpuTexture implements RenderTexture {\n constructor(readonly device: GPUDevice, readonly texture: GPUTexture, readonly bindGroup: GPUBindGroup,\n readonly width: number, readonly height: number) {}\n\n writePixels(pixels: RenderPixels, width: number, height: number, x = 0, y = 0): void {\n this.device.queue.writeTexture({ texture: this.texture, origin: [x, y] }, pixels,\n { bytesPerRow: width * 4, rowsPerImage: height }, [width, height]);\n }\n\n writeBitmap(bitmap: ImageBitmap): void {\n this.device.queue.copyExternalImageToTexture({ source: bitmap },\n { texture: this.texture, premultipliedAlpha: false }, [this.width, this.height]);\n }\n\n destroy(): void { this.texture.destroy(); }\n}\n\nexport class WebGpuBackend implements RenderBackend {\n readonly kind = \"webgpu\";\n instanceBufferBytes = 0;\n instanceBuffer: GPUBuffer | undefined;\n disposed = false;\n context?: GPUCanvasContext;\n format: GPUTextureFormat;\n uniform: GPUBuffer;\n sampler: GPUSampler;\n pipeline?: GPURenderPipeline;\n\n static async create(canvas: OffscreenCanvas, onFatal: (error: Error) => void): Promise<WebGpuBackend> {\n if (!globalThis.isSecureContext) throw new RendererUnavailableError(\"WebGPU requires HTTPS or localhost\");\n if (!navigator.gpu) throw new RendererUnavailableError(\"WebGPU is unavailable in this browser worker\");\n const adapter = await navigator.gpu.requestAdapter();\n if (!adapter) throw new RendererUnavailableError(\"No WebGPU adapter is available\");\n let device: GPUDevice;\n try {\n device = await adapter.requestDevice();\n } catch (error) {\n if (error instanceof DOMException && error.name === \"OperationError\") {\n throw new RendererUnavailableError(`Could not acquire a WebGPU device: ${error.message}`, { cause: error });\n }\n throw error;\n }\n let backend: WebGpuBackend | undefined;\n try {\n backend = new WebGpuBackend(device);\n const active = backend;\n device.lost.then(info => {\n if (!active.disposed) onFatal(new Error(`WebGPU device lost: ${info.message || info.reason}`));\n });\n device.addEventListener(\"uncapturederror\", event => {\n if (!active.disposed) onFatal(new Error(`WebGPU error: ${event.error.message}`));\n });\n await backend.initialize(canvas);\n return backend;\n } catch (error) {\n if (backend) backend.dispose();\n else device.destroy();\n throw error;\n }\n }\n\n constructor(readonly device: GPUDevice) {\n this.format = navigator.gpu.getPreferredCanvasFormat();\n this.uniform = device.createBuffer({ size: 16, usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST });\n this.sampler = device.createSampler({ minFilter: \"linear\", magFilter: \"linear\" });\n }\n\n get maxTextureDimension2D(): number { return this.device.limits.maxTextureDimension2D; }\n get maxCanvasDimension2D(): number { return this.maxTextureDimension2D; }\n\n async initialize(canvas: OffscreenCanvas): Promise<void> {\n const module = this.device.createShaderModule({ code: shader });\n this.pipeline = await this.device.createRenderPipelineAsync({\n layout: \"auto\",\n vertex: {\n module,\n entryPoint: \"vertex\",\n buffers: [{\n arrayStride: QUAD_STRIDE * 4,\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 { shaderLocation: 3, offset: 48, format: \"float32\" },\n ],\n }],\n },\n fragment: {\n module,\n entryPoint: \"fragment\",\n targets: [{\n format: this.format,\n blend: {\n color: { srcFactor: \"src-alpha\", dstFactor: \"one-minus-src-alpha\" },\n alpha: { srcFactor: \"one\", dstFactor: \"one-minus-src-alpha\" },\n },\n }],\n },\n primitive: { topology: \"triangle-list\" },\n });\n // Acquire the presentation surface last. A null context leaves it usable by WebGL2.\n const context = canvas.getContext(\"webgpu\");\n if (!context || !(\"configure\" in context)) {\n throw new RendererUnavailableError(\"Could not create an OffscreenCanvas WebGPU context\");\n }\n this.context = context;\n context.configure({ device: this.device, format: this.format, alphaMode: \"opaque\" });\n }\n\n createTexture(width: number, height: number, label: string): RenderTexture {\n if (width > this.maxTextureDimension2D || height > this.maxTextureDimension2D) {\n throw new Error(`${label} exceeds the GPU texture dimension limit`);\n }\n if (!this.pipeline) throw new Error(\"WebGPU backend is not initialized\");\n const texture = this.device.createTexture({\n label, size: [width, height], format: \"rgba8unorm\",\n usage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST | GPUTextureUsage.RENDER_ATTACHMENT,\n });\n try {\n const bindGroup = this.device.createBindGroup({\n layout: this.pipeline.getBindGroupLayout(0),\n entries: [\n { binding: 0, resource: { buffer: this.uniform } },\n { binding: 1, resource: texture.createView() },\n { binding: 2, resource: this.sampler },\n ],\n });\n return new WebGpuTexture(this.device, texture, bindGroup, width, height);\n } catch (error) {\n texture.destroy();\n throw error;\n }\n }\n\n resize(width: number, height: number): void {\n this.device.queue.writeBuffer(this.uniform, 0, new Float32Array([width, height, 0, 0]));\n }\n\n submit(instances: Float32Array<ArrayBuffer>, quadCount: number, batches: readonly RenderBatch[],\n background: RenderColor): void {\n if (this.disposed || !this.context || !this.pipeline) throw new Error(\"WebGPU backend is not initialized\");\n const usedBytes = quadCount * QUAD_STRIDE * 4;\n if (!this.instanceBuffer || usedBytes > this.instanceBufferBytes) {\n this.instanceBuffer?.destroy();\n this.instanceBufferBytes = Math.max(256, instances.byteLength);\n this.instanceBuffer = this.device.createBuffer({\n size: this.instanceBufferBytes, usage: GPUBufferUsage.VERTEX | GPUBufferUsage.COPY_DST,\n });\n }\n if (usedBytes) this.device.queue.writeBuffer(this.instanceBuffer, 0, instances, 0, quadCount * QUAD_STRIDE);\n const encoder = this.device.createCommandEncoder();\n const pass = encoder.beginRenderPass({\n colorAttachments: [{\n view: this.context.getCurrentTexture().createView(),\n clearValue: { r: background[0], g: background[1], b: background[2], a: 1 },\n loadOp: \"clear\", storeOp: \"store\",\n }],\n });\n pass.setPipeline(this.pipeline);\n pass.setVertexBuffer(0, this.instanceBuffer);\n for (const batch of batches) {\n if (!(batch.resource instanceof WebGpuTexture)) throw new Error(\"Texture belongs to a different rendering backend\");\n pass.setBindGroup(0, batch.resource.bindGroup);\n pass.draw(6, batch.count, 0, batch.start);\n }\n pass.end();\n this.device.queue.submit([encoder.finish()]);\n }\n\n async idle(): Promise<void> { await this.device.queue.onSubmittedWorkDone(); }\n\n dispose(): void {\n if (this.disposed) return;\n this.disposed = true;\n this.instanceBuffer?.destroy();\n this.uniform.destroy();\n this.context?.unconfigure();\n this.device.destroy();\n }\n}\n", "import { QUAD_STRIDE, RendererUnavailableError } from \"./render-backend.js\";\nimport type { RenderBackend, RenderBatch, RenderColor, RenderPixels, RenderTexture } from \"./render-backend.js\";\n\nconst vertexShader = /* glsl */ `#version 300 es\nprecision highp float;\nprecision highp int;\n\nlayout(location = 0) in vec4 rect;\nlayout(location = 1) in vec4 uvRect;\nlayout(location = 2) in vec4 color;\nlayout(location = 3) in float mode;\nuniform vec2 viewport;\nout vec2 fragmentUv;\nout vec4 fragmentTint;\nflat out float fragmentMode;\n\nvoid main() {\n const vec2 corners[6] = vec2[6](\n vec2(0, 0), vec2(1, 0), vec2(0, 1),\n vec2(0, 1), vec2(1, 0), vec2(1, 1)\n );\n vec2 corner = corners[gl_VertexID];\n vec2 position = rect.xy + corner * rect.zw;\n gl_Position = vec4(position / viewport * vec2(2, -2) + vec2(-1, 1), 0, 1);\n fragmentUv = mix(uvRect.xy, uvRect.zw, corner);\n fragmentTint = color;\n fragmentMode = mode;\n}`;\n\nconst fragmentShader = /* glsl */ `#version 300 es\nprecision highp float;\nprecision highp int;\n\nuniform highp sampler2D image;\nin vec2 fragmentUv;\nin vec4 fragmentTint;\nflat in float fragmentMode;\nout vec4 fragmentColor;\n\nvoid main() {\n vec4 texel = textureLod(image, fragmentUv, 0.0);\n if (fragmentMode < 0.5) {\n fragmentColor = fragmentTint;\n } else if (fragmentMode < 1.5) {\n fragmentColor = vec4(fragmentTint.rgb, fragmentTint.a * texel.a);\n } else {\n fragmentColor = texel * fragmentTint;\n }\n}`;\n\nfunction errorFrom(value: unknown): Error {\n return value instanceof Error ? value : new Error(String(value));\n}\n\nfunction positiveInteger(value: number): boolean {\n return Number.isSafeInteger(value) && value > 0;\n}\n\nfunction prepareUpload(gl: WebGL2RenderingContext): void {\n gl.pixelStorei(gl.UNPACK_ALIGNMENT, 1);\n gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, false);\n gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, false);\n gl.pixelStorei(gl.UNPACK_COLORSPACE_CONVERSION_WEBGL, gl.NONE);\n gl.pixelStorei(gl.UNPACK_ROW_LENGTH, 0);\n gl.pixelStorei(gl.UNPACK_SKIP_PIXELS, 0);\n gl.pixelStorei(gl.UNPACK_SKIP_ROWS, 0);\n}\n\nclass WebGl2Texture implements RenderTexture {\n destroyed = false;\n\n constructor(readonly owner: WebGl2Backend, private readonly gl: WebGL2RenderingContext,\n readonly texture: WebGLTexture, readonly width: number, readonly height: number,\n private readonly assertActive: () => void, private readonly release: (texture: WebGl2Texture) => void) {}\n\n private bind(): void {\n this.assertActive();\n if (this.destroyed) throw new Error(\"WebGL2 texture is destroyed\");\n this.gl.bindTexture(this.gl.TEXTURE_2D, this.texture);\n prepareUpload(this.gl);\n }\n\n writePixels(pixels: RenderPixels, width: number, height: number, x = 0, y = 0): void {\n if (!positiveInteger(width) || !positiveInteger(height) ||\n !Number.isSafeInteger(x) || !Number.isSafeInteger(y) || x < 0 || y < 0 ||\n x + width > this.width || y + height > this.height || pixels.byteLength < width * height * 4) {\n throw new Error(\"Invalid WebGL2 texture upload dimensions or pixel data\");\n }\n this.bind();\n this.gl.texSubImage2D(this.gl.TEXTURE_2D, 0, x, y, width, height,\n this.gl.RGBA, this.gl.UNSIGNED_BYTE, pixels);\n }\n\n writeBitmap(bitmap: ImageBitmap): void {\n if (bitmap.width !== this.width || bitmap.height !== this.height) {\n throw new Error(\"WebGL2 bitmap dimensions do not match the texture\");\n }\n this.bind();\n // ImageBitmap ignores unpack conversion flags; the shared decoder supplies straight-alpha,\n // unconverted, top-down bitmaps. Raw RGBA uploads use the explicit unpack state above.\n this.gl.texSubImage2D(this.gl.TEXTURE_2D, 0, 0, 0, this.gl.RGBA, this.gl.UNSIGNED_BYTE, bitmap);\n }\n\n destroy(): void {\n if (this.destroyed) return;\n this.destroyed = true;\n this.release(this);\n this.gl.deleteTexture(this.texture);\n }\n}\n\ninterface PendingFence {\n sync: WebGLSync;\n timer?: ReturnType<typeof setTimeout>;\n resolve: () => void;\n reject: (error: Error) => void;\n}\n\nexport class WebGl2Backend implements RenderBackend {\n readonly kind = \"webgl2\";\n private textureLimit = 0;\n private canvasLimit = 0;\n private bufferBytes = 0;\n private disposed = false;\n private lostError?: Error;\n private program?: WebGLProgram;\n private instanceBuffer?: WebGLBuffer;\n private vertexArray?: WebGLVertexArrayObject;\n private viewport?: WebGLUniformLocation;\n private readonly shaders = new Set<WebGLShader>();\n private readonly textures = new Set<WebGl2Texture>();\n private readonly fences = new Set<PendingFence>();\n private readonly onContextLost = (event: Event): void => {\n const message = (event as WebGLContextEvent).statusMessage;\n this.contextLost(new Error(`WebGL2 context lost${message ? `: ${message}` : \"\"}`));\n };\n\n static async create(canvas: OffscreenCanvas, onFatal: (error: Error) => void): Promise<WebGl2Backend> {\n const gl = canvas.getContext(\"webgl2\", {\n alpha: false,\n antialias: false,\n depth: false,\n stencil: false,\n premultipliedAlpha: false,\n preserveDrawingBuffer: false,\n });\n if (!gl) throw new RendererUnavailableError(\"Could not create an OffscreenCanvas WebGL2 context\");\n const backend = new WebGl2Backend(canvas, gl, onFatal);\n try {\n backend.initialize();\n return backend;\n } catch (error) {\n backend.dispose();\n throw error;\n }\n }\n\n private constructor(private readonly canvas: OffscreenCanvas, readonly gl: WebGL2RenderingContext,\n private readonly onFatal: (error: Error) => void) {}\n\n get maxTextureDimension2D(): number { return this.textureLimit; }\n get maxCanvasDimension2D(): number { return this.canvasLimit; }\n get instanceBufferBytes(): number { return this.bufferBytes; }\n\n private initialize(): void {\n const gl = this.gl;\n this.canvas.addEventListener(\"webglcontextlost\", this.onContextLost);\n this.checkErrors(\"initialization\");\n this.textureLimit = gl.getParameter(gl.MAX_TEXTURE_SIZE);\n const viewportLimit = gl.getParameter(gl.MAX_VIEWPORT_DIMS) as Int32Array;\n this.canvasLimit = Math.min(this.textureLimit, gl.getParameter(gl.MAX_RENDERBUFFER_SIZE),\n viewportLimit[0], viewportLimit[1]);\n if (!positiveInteger(this.textureLimit) || !positiveInteger(this.canvasLimit)) {\n throw new Error(\"Invalid WebGL2 texture or viewport limits\");\n }\n\n const vertex = this.compile(gl.VERTEX_SHADER, vertexShader);\n const fragment = this.compile(gl.FRAGMENT_SHADER, fragmentShader);\n const program = gl.createProgram();\n if (!program) throw new Error(\"Could not allocate a WebGL2 shader program\");\n this.program = program;\n gl.attachShader(program, vertex);\n gl.attachShader(program, fragment);\n gl.linkProgram(program);\n if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {\n throw new Error(`WebGL2 shader link failed: ${gl.getProgramInfoLog(program) || \"No diagnostic available\"}`);\n }\n for (const shader of this.shaders) {\n gl.detachShader(program, shader);\n gl.deleteShader(shader);\n }\n this.shaders.clear();\n const viewport = gl.getUniformLocation(program, \"viewport\");\n const image = gl.getUniformLocation(program, \"image\");\n if (viewport === null || image === null) throw new Error(\"WebGL2 shader uniforms are unavailable\");\n this.viewport = viewport;\n const buffer = gl.createBuffer();\n if (!buffer) throw new Error(\"Could not allocate a WebGL2 instance buffer\");\n this.instanceBuffer = buffer;\n const vertexArray = gl.createVertexArray();\n if (!vertexArray) throw new Error(\"Could not allocate a WebGL2 vertex array\");\n this.vertexArray = vertexArray;\n\n gl.useProgram(program);\n gl.uniform1i(image, 0);\n gl.activeTexture(gl.TEXTURE0);\n gl.bindVertexArray(vertexArray);\n gl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n for (let attribute = 0; attribute < 4; attribute++) {\n gl.enableVertexAttribArray(attribute);\n gl.vertexAttribDivisor(attribute, 1);\n }\n gl.enable(gl.BLEND);\n gl.blendEquationSeparate(gl.FUNC_ADD, gl.FUNC_ADD);\n gl.blendFuncSeparate(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA);\n gl.disable(gl.DEPTH_TEST);\n gl.disable(gl.STENCIL_TEST);\n gl.disable(gl.CULL_FACE);\n gl.disable(gl.SCISSOR_TEST);\n gl.disable(gl.DITHER);\n this.resize(this.canvas.width, this.canvas.height);\n }\n\n private compile(type: number, source: string): WebGLShader {\n const gl = this.gl;\n const shader = gl.createShader(type);\n if (!shader) throw new Error(\"Could not allocate a WebGL2 shader\");\n this.shaders.add(shader);\n gl.shaderSource(shader, source);\n gl.compileShader(shader);\n if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {\n throw new Error(`WebGL2 shader compilation failed: ${gl.getShaderInfoLog(shader) || \"No diagnostic available\"}`);\n }\n return shader;\n }\n\n private assertActive(): void {\n if (this.disposed) throw new Error(\"WebGL2 backend is disposed\");\n if (this.lostError) throw this.lostError;\n }\n\n private contextLost(error: Error): void {\n if (this.disposed || this.lostError) return;\n this.lostError = error;\n for (const fence of this.fences) this.settleFence(fence, error);\n this.onFatal(error);\n }\n\n private checkErrors(operation: string): void {\n this.assertActive();\n const gl = this.gl;\n const code = gl.getError();\n if (code === gl.CONTEXT_LOST_WEBGL || gl.isContextLost()) {\n const error = new Error(\"WebGL2 context lost\");\n this.contextLost(error);\n throw error;\n }\n if (code !== gl.NO_ERROR) {\n const name = code === gl.OUT_OF_MEMORY ? \"OUT_OF_MEMORY\" :\n code === gl.INVALID_ENUM ? \"INVALID_ENUM\" :\n code === gl.INVALID_VALUE ? \"INVALID_VALUE\" :\n code === gl.INVALID_OPERATION ? \"INVALID_OPERATION\" :\n code === gl.INVALID_FRAMEBUFFER_OPERATION ? \"INVALID_FRAMEBUFFER_OPERATION\" : `0x${code.toString(16)}`;\n throw new Error(`WebGL2 ${operation} failed: ${name}`);\n }\n }\n\n createTexture(width: number, height: number, label: string): RenderTexture {\n this.assertActive();\n if (!positiveInteger(width) || !positiveInteger(height) ||\n width > this.textureLimit || height > this.textureLimit) {\n throw new Error(`${label} has invalid dimensions or exceeds the WebGL2 texture dimension limit`);\n }\n const gl = this.gl;\n const texture = gl.createTexture();\n if (!texture) {\n this.checkErrors(\"texture allocation\");\n throw new Error(`Could not allocate WebGL2 texture: ${label}`);\n }\n try {\n gl.bindTexture(gl.TEXTURE_2D, texture);\n prepareUpload(gl);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n // WebGL guarantees zero initialization for null data, including untouched atlas padding.\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA8, width, height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);\n this.checkErrors(`texture allocation (${label})`);\n const resource = new WebGl2Texture(this, gl, texture, width, height,\n () => this.assertActive(), resource => this.textures.delete(resource));\n this.textures.add(resource);\n return resource;\n } catch (error) {\n gl.deleteTexture(texture);\n throw error;\n }\n }\n\n resize(width: number, height: number): void {\n this.assertActive();\n if (!Number.isFinite(width) || !Number.isFinite(height) || width <= 0 || height <= 0) {\n throw new Error(\"Invalid WebGL2 logical viewport dimensions\");\n }\n if (!positiveInteger(this.canvas.width) || !positiveInteger(this.canvas.height) ||\n this.canvas.width > this.canvasLimit || this.canvas.height > this.canvasLimit) {\n throw new Error(\"Canvas exceeds the WebGL2 drawing buffer dimension limit\");\n }\n const gl = this.gl;\n if (gl.drawingBufferWidth !== this.canvas.width || gl.drawingBufferHeight !== this.canvas.height) {\n this.checkErrors(\"drawing buffer resize\");\n throw new Error(\"WebGL2 could not allocate the requested canvas drawing buffer\");\n }\n gl.viewport(0, 0, this.canvas.width, this.canvas.height);\n gl.useProgram(this.program!);\n gl.uniform2f(this.viewport!, width, height);\n this.checkErrors(\"resize\");\n }\n\n submit(instances: Float32Array<ArrayBuffer>, quadCount: number, batches: readonly RenderBatch[],\n background: RenderColor): void {\n this.assertActive();\n if (!Number.isSafeInteger(quadCount) || quadCount < 0 || quadCount * QUAD_STRIDE > instances.length) {\n throw new Error(\"Invalid WebGL2 instance data\");\n }\n for (const batch of batches) {\n if (!(batch.resource instanceof WebGl2Texture) || batch.resource.owner !== this) {\n throw new Error(\"Texture belongs to a different rendering backend\");\n }\n if (batch.resource.destroyed) throw new Error(\"WebGL2 texture is destroyed\");\n if (!Number.isSafeInteger(batch.start) || !Number.isSafeInteger(batch.count) ||\n batch.start < 0 || batch.count < 0 || batch.start + batch.count > quadCount) {\n throw new Error(\"Invalid WebGL2 batch instance range\");\n }\n }\n const gl = this.gl;\n const strideBytes = QUAD_STRIDE * Float32Array.BYTES_PER_ELEMENT;\n const usedBytes = quadCount * strideBytes;\n gl.bindVertexArray(this.vertexArray!);\n gl.bindBuffer(gl.ARRAY_BUFFER, this.instanceBuffer!);\n if (!this.bufferBytes || usedBytes > this.bufferBytes) {\n const bytes = Math.max(256, instances.byteLength);\n gl.bufferData(gl.ARRAY_BUFFER, bytes, gl.DYNAMIC_DRAW);\n this.checkErrors(\"instance buffer allocation\");\n this.bufferBytes = bytes;\n }\n if (usedBytes) gl.bufferSubData(gl.ARRAY_BUFFER, 0, instances, 0, quadCount * QUAD_STRIDE);\n gl.useProgram(this.program!);\n gl.activeTexture(gl.TEXTURE0);\n gl.clearColor(background[0], background[1], background[2], 1);\n gl.clear(gl.COLOR_BUFFER_BIT);\n for (const batch of batches) {\n if (!batch.count) continue;\n const resource = batch.resource as WebGl2Texture;\n gl.bindTexture(gl.TEXTURE_2D, resource.texture);\n // WebGL2 has no baseInstance; rebase all per-instance attributes for each ordered batch.\n const offset = batch.start * strideBytes;\n gl.vertexAttribPointer(0, 4, gl.FLOAT, false, strideBytes, offset);\n gl.vertexAttribPointer(1, 4, gl.FLOAT, false, strideBytes, offset + 16);\n gl.vertexAttribPointer(2, 4, gl.FLOAT, false, strideBytes, offset + 32);\n gl.vertexAttribPointer(3, 1, gl.FLOAT, false, strideBytes, offset + 48);\n gl.drawArraysInstanced(gl.TRIANGLES, 0, 6, batch.count);\n }\n // Upload errors are checked once per submission, not once per glyph.\n this.checkErrors(\"frame submission\");\n }\n\n async idle(): Promise<void> {\n this.checkErrors(\"GPU completion\");\n const gl = this.gl;\n const sync = gl.fenceSync(gl.SYNC_GPU_COMMANDS_COMPLETE, 0);\n if (!sync) {\n this.checkErrors(\"GPU fence allocation\");\n throw new Error(\"Could not allocate a WebGL2 GPU fence\");\n }\n return new Promise<void>((resolve, reject) => {\n const fence: PendingFence = { sync, resolve, reject };\n this.fences.add(fence);\n try {\n gl.flush();\n this.checkErrors(\"GPU fence submission\");\n this.pollFence(fence);\n } catch (error) {\n this.settleFence(fence, errorFrom(error));\n }\n });\n }\n\n private pollFence(fence: PendingFence): void {\n if (!this.fences.has(fence)) return;\n try {\n this.assertActive();\n const gl = this.gl;\n if (gl.isContextLost()) {\n const error = new Error(\"WebGL2 context lost\");\n this.contextLost(error);\n throw error;\n }\n const status = gl.clientWaitSync(fence.sync, 0, 0);\n if (status === gl.ALREADY_SIGNALED || status === gl.CONDITION_SATISFIED) {\n this.checkErrors(\"GPU completion\");\n this.settleFence(fence);\n } else if (status === gl.TIMEOUT_EXPIRED) {\n fence.timer = setTimeout(() => {\n fence.timer = undefined;\n this.pollFence(fence);\n }, 0);\n } else {\n this.checkErrors(\"GPU fence wait\");\n throw new Error(\"WebGL2 GPU fence wait failed\");\n }\n } catch (error) {\n this.settleFence(fence, errorFrom(error));\n }\n }\n\n private settleFence(fence: PendingFence, error?: Error): void {\n if (!this.fences.delete(fence)) return;\n if (fence.timer !== undefined) clearTimeout(fence.timer);\n this.gl.deleteSync(fence.sync);\n if (error) fence.reject(error);\n else fence.resolve();\n }\n\n dispose(): void {\n if (this.disposed) return;\n this.disposed = true;\n this.canvas.removeEventListener(\"webglcontextlost\", this.onContextLost);\n for (const fence of this.fences) this.settleFence(fence, new Error(\"WebGL2 backend is disposed\"));\n for (const texture of this.textures) texture.destroy();\n const gl = this.gl;\n if (this.instanceBuffer) gl.deleteBuffer(this.instanceBuffer);\n if (this.vertexArray) gl.deleteVertexArray(this.vertexArray);\n if (this.program) gl.deleteProgram(this.program);\n for (const shader of this.shaders) gl.deleteShader(shader);\n this.shaders.clear();\n this.instanceBuffer = undefined;\n this.vertexArray = undefined;\n this.program = undefined;\n this.bufferBytes = 0;\n if (!gl.isContextLost()) gl.getExtension(\"WEBGL_lose_context\")?.loseContext();\n }\n}\n", "import { RendererUnavailableError } from \"./render-backend.js\";\nimport type { RenderBackend } from \"./render-backend.js\";\nimport { normalizeRenderer } from \"./renderer-options.js\";\nimport { WebGpuBackend } from \"./webgpu-backend.js\";\nimport { WebGl2Backend } from \"./webgl2-backend.js\";\nimport type { TerminalRendererPreference } from \"./types.js\";\n\nexport async function createRenderBackend(canvas: OffscreenCanvas, onFatal: (error: Error) => void,\n preference: TerminalRendererPreference = \"auto\"): Promise<{ backend: RenderBackend; fallbackReason?: string }> {\n const requested = normalizeRenderer(preference);\n if (requested === \"webgl2\") return { backend: await WebGl2Backend.create(canvas, onFatal) };\n try {\n return { backend: await WebGpuBackend.create(canvas, onFatal) };\n } catch (error) {\n if (requested !== \"auto\" || !(error instanceof RendererUnavailableError)) throw error;\n try {\n return { backend: await WebGl2Backend.create(canvas, onFatal), fallbackReason: error.message };\n } catch (fallbackError) {\n throw new AggregateError([error, fallbackError],\n `WebGPU unavailable (${error.message}); WebGL2 initialization failed: ${\n fallbackError instanceof Error ? fallbackError.message : String(fallbackError)}`);\n }\n }\n}\n", "import { LIMITS } from \"./protocol.js\";\nimport { loadFont, measureFont, normalizeFont } from \"./terminal-font.js\";\nimport { createRenderBackend } from \"./backend-selection.js\";\nimport { QUAD_STRIDE } from \"./render-backend.js\";\nimport type { RenderBackend, RenderBatch, RenderColor, RenderTexture } from \"./render-backend.js\";\nimport type { FontMetrics, LoadedFont, NormalizedFont } from \"./terminal-font.js\";\nimport type { TerminalFont, TerminalRendererPreference, TerminalSize } from \"./types.js\";\nimport type { FrameImage, FrameMetadata, ImagePlacement, TerminalCell } from \"./wire-types.js\";\nimport { backgroundColor, compilePalette, defaultDarkPalette, foregroundColor, underlineColor } from \"./terminal-palette.js\";\nimport type { RenderPalette } from \"./terminal-palette.js\";\n\ntype Vector4 = RenderColor;\ntype TextureResource = RenderTexture;\ninterface Shelf { x: number; y: number; rowHeight: number }\ninterface GlyphPlacement { key: string; cell: TerminalCell; x: number; y: number; width: number; height: number }\ninterface Glyph { colored: boolean; u0: number; v0: number; u1: number; v1: number }\ntype Batch = RenderBatch;\n\nconst CELL_WIDTH = 10;\nconst CELL_HEIGHT = 20;\nconst MAX_QUADS = 1024 * 1024;\nconst MAX_GLYPHS = 16384;\nconst MAX_GLYPH_KEY_UNITS = 1024 * 1024;\nconst STRIDE = QUAD_STRIDE;\nconst WHITE: Vector4 = [1, 1, 1, 1];\nconst DEFAULT_PALETTE = compilePalette(defaultDarkPalette);\n\nfunction rgba(packed: number): Vector4 {\n return [\n (packed & 255) / 255,\n ((packed >>> 8) & 255) / 255,\n ((packed >>> 16) & 255) / 255,\n ((packed >>> 24) & 255) / 255,\n ];\n}\n\nfunction glyphKey(cell: TerminalCell): string {\n return `${cell.attributes & 5}/${cell.width}/${cell.text}`;\n}\n\nfunction isKgpPlaceholder(cell: TerminalCell): boolean {\n // The base scalar and following diacritics encode an image reference, not a glyph.\n // Keep the authoritative text and colors intact even when no image is placed.\n return cell.text.codePointAt(0) === 0x10eeee;\n}\n\n/** Shelf packer. Plans are computed before mutating the atlas used by a submitted frame. */\nfunction packGlyphs(glyphs: ReadonlyMap<string, TerminalCell>, size: number, scale: number,\n initial: Shelf = { x: 0, y: 0, rowHeight: 0 }): { placements: GlyphPlacement[]; shelf: Shelf } | null {\n let { x, y, rowHeight } = initial;\n const placements = [];\n for (const [key, cell] of glyphs) {\n const width = Math.ceil(cell.width * CELL_WIDTH * scale) + 4;\n const height = Math.ceil(CELL_HEIGHT * scale) + 4;\n if (width > size || height > size) return null;\n if (x + width > size) { x = 0; y += rowHeight; rowHeight = 0; }\n if (y + height > size) return null;\n placements.push({ key, cell, x, y, width, height });\n x += width;\n rowHeight = Math.max(rowHeight, height);\n }\n return { placements, shelf: { x, y, rowHeight } };\n}\n\n/** Shared instanced-quad preparation; Canvas2D rasterizes reusable glyphs for either backend. */\nexport class TerminalRenderer {\n canvas: OffscreenCanvas;\n scale: number;\n backingScale: number;\n backend: RenderBackend;\n fallbackReason?: string;\n fontConfiguration: NormalizedFont;\n fontMetrics: Map<number, FontMetrics>;\n images: Map<string, TextureResource>;\n glyphs: Map<string, Glyph>;\n imageUploadBytes: number;\n imagePayloadBytes: number;\n glyphUploadBytes: number;\n atlasRebuilds: number;\n textureBytes: number;\n instances: Float32Array<ArrayBuffer>;\n disposed: boolean;\n columns: number;\n rows: number;\n // Initialized by create() before the renderer can prepare or submit frames.\n font!: LoadedFont;\n rasterCanvas!: OffscreenCanvas;\n raster!: OffscreenCanvasRenderingContext2D;\n atlas!: TextureResource;\n glyphKeyUnits = 0;\n shelf: Shelf = { x: 0, y: 0, rowHeight: 0 };\n canvasLimited = false;\n width = 0;\n height = 0;\n quadCount = 0;\n batches: Batch[] = [];\n\n static async create(canvas: OffscreenCanvas, scale: number, onFatal: (error: Error) => void,\n font?: TerminalFont, preference: TerminalRendererPreference = \"auto\"): Promise<TerminalRenderer> {\n const normalizedFont = normalizeFont(font);\n if (!Number.isFinite(scale) || scale < 0.5 || scale > 3) throw new Error(\"Invalid backing scale\");\n const { backend, fallbackReason } = await createRenderBackend(canvas, onFatal, preference);\n const renderer = new TerminalRenderer(canvas, scale, backend, normalizedFont);\n renderer.fallbackReason = fallbackReason;\n try {\n await renderer.initialize();\n return renderer;\n } catch (error) {\n renderer.dispose();\n throw error;\n }\n }\n\n constructor(canvas: OffscreenCanvas, scale: number, backend: RenderBackend, font: NormalizedFont) {\n if (!Number.isFinite(scale) || scale < 0.5 || scale > 3) throw new Error(\"Invalid backing scale\");\n this.canvas = canvas;\n this.scale = scale;\n this.backingScale = scale;\n this.backend = backend;\n this.fontConfiguration = font;\n this.fontMetrics = new Map();\n this.images = new Map();\n this.glyphs = new Map();\n this.imageUploadBytes = 0;\n this.imagePayloadBytes = 0;\n this.glyphUploadBytes = 0;\n this.atlasRebuilds = 0;\n this.textureBytes = 0;\n this.instances = new Float32Array(4096 * STRIDE);\n this.disposed = false;\n this.columns = 0;\n this.rows = 0;\n }\n\n async initialize() {\n this.font = await loadFont(this.fontConfiguration);\n this.rasterCanvas = new OffscreenCanvas(1, 1);\n const raster = this.rasterCanvas.getContext(\"2d\", { willReadFrequently: true });\n if (!raster) throw new Error(\"Worker glyph rasterization is unavailable\");\n this.raster = raster;\n this.resetAtlas(Math.min(2048, this.backend.maxTextureDimension2D));\n }\n\n createTexture(width: number, height: number, label: string): TextureResource {\n return this.backend.createTexture(width, height, label);\n }\n\n resetAtlas(size: number): void {\n this.atlas?.destroy();\n this.atlas = this.createTexture(size, size, \"Glyph atlas\");\n this.glyphs.clear();\n this.glyphKeyUnits = 0;\n this.shelf = { x: 0, y: 0, rowHeight: 0 };\n }\n\n resize(columns: number, rows: number, viewport?: TerminalSize): void {\n const width = columns * CELL_WIDTH;\n const height = rows * CELL_HEIGHT;\n const limit = this.backend.maxCanvasDimension2D;\n const requested = Math.min(this.scale, viewport ? viewport.width / width : Infinity, viewport ? viewport.height / height : Infinity);\n this.canvasLimited = width * requested > limit || height * requested > limit;\n this.backingScale = Math.min(requested, limit / width, limit / height);\n const backingWidth = Math.max(1, Math.min(limit, Math.ceil(width * this.backingScale)));\n const backingHeight = Math.max(1, Math.min(limit, Math.ceil(height * this.backingScale)));\n if (this.columns === columns && this.rows === rows && this.canvas.width === backingWidth && this.canvas.height === backingHeight) return;\n this.columns = columns;\n this.rows = rows;\n this.width = width;\n this.height = height;\n this.canvas.width = backingWidth;\n this.canvas.height = backingHeight;\n this.backend.resize(width, height);\n }\n\n /** Call only between submissions. Missing/over-budget resources terminate the session. */\n async updateImages(incoming: readonly FrameImage[], retainedKeys: readonly string[]): Promise<void> {\n const retained = new Set(retainedKeys);\n const replacements = new Map(incoming.map(image => [image.key, image]));\n let projectedBytes = 0;\n for (const key of retained) {\n const image = replacements.get(key) || this.images.get(key);\n if (!image) throw new Error(`Missing retained image resource: ${key}`);\n projectedBytes += image.width * image.height * 4;\n }\n if (projectedBytes > LIMITS.textureBytes) throw new Error(\"Retained images exceed the 256 MiB texture budget\");\n for (const [key, image] of this.images) {\n if (!retained.has(key) || replacements.has(key)) {\n image.destroy();\n this.textureBytes -= image.width * image.height * 4;\n this.images.delete(key);\n }\n }\n for (const image of incoming) {\n const resource = this.createTexture(image.width, image.height, `Image ${image.key}`);\n try {\n if (image.format === \"rgba\") {\n resource.writePixels(image.bytes, image.width, image.height);\n } else {\n // Check IHDR before decoding so a tiny PNG cannot claim unbounded decoded dimensions.\n const png = new DataView(image.bytes.buffer, image.bytes.byteOffset, image.bytes.byteLength);\n if (png.byteLength < 33 || png.getUint32(0) !== 0x89504e47 || png.getUint32(4) !== 0x0d0a1a0a ||\n png.getUint32(8) !== 13 || png.getUint32(12) !== 0x49484452 ||\n png.getUint32(16) !== image.width || png.getUint32(20) !== image.height) {\n throw new Error(`PNG header dimensions do not match resource ${image.key}`);\n }\n const bitmap = await createImageBitmap(new Blob([image.bytes], { type: \"image/png\" }), {\n premultiplyAlpha: \"none\",\n colorSpaceConversion: \"none\",\n });\n try {\n if (bitmap.width !== image.width || bitmap.height !== image.height) throw new Error(\"Decoded PNG dimension mismatch\");\n resource.writeBitmap(bitmap);\n } finally {\n bitmap.close();\n }\n }\n this.images.set(image.key, resource);\n this.textureBytes += image.width * image.height * 4;\n this.imageUploadBytes += image.width * image.height * 4;\n this.imagePayloadBytes += image.byteLength;\n } catch (error) {\n resource.destroy();\n throw error;\n }\n }\n }\n\n prepareGlyphs(cells: readonly (TerminalCell | undefined)[]): void {\n const visible = new Map<string, TerminalCell>();\n for (const cell of cells) {\n if (!cell || !cell.width || !cell.text.trim() || (cell.attributes & 64) || isKgpPlaceholder(cell)) continue;\n visible.set(glyphKey(cell), cell);\n }\n const keyUnits = (glyphs: ReadonlyMap<string, TerminalCell>) => [...glyphs.keys()].reduce((total, key) => total + key.length, 0);\n if (visible.size > MAX_GLYPHS || keyUnits(visible) > MAX_GLYPH_KEY_UNITS) {\n throw new Error(\"Visible glyph metadata exceeds the bounded glyph cache\");\n }\n const missing = new Map([...visible].filter(([key]) => !this.glyphs.has(key)));\n if (!missing.size) return;\n const metadataFits = this.glyphs.size + missing.size <= MAX_GLYPHS &&\n this.glyphKeyUnits + keyUnits(missing) <= MAX_GLYPH_KEY_UNITS;\n let plan = metadataFits ? packGlyphs(missing, this.atlas.width, this.scale, this.shelf) : null;\n if (!plan) {\n let size = this.atlas.width;\n const maxSize = Math.min(4096, this.backend.maxTextureDimension2D);\n while (!(plan = packGlyphs(visible, size, this.scale)) && size < maxSize) {\n size = Math.min(size * 2, maxSize);\n }\n if (!plan) throw new Error(\"Visible glyphs exceed the bounded 4096\u00B2 mask atlas; reduce the grid or backing scale\");\n this.resetAtlas(size);\n this.atlasRebuilds++;\n }\n for (const placement of plan.placements) this.uploadGlyph(placement);\n this.shelf = plan.shelf;\n }\n\n uploadGlyph({ key, cell, x, y, width, height }: GlyphPlacement): void {\n const scale = this.scale;\n const raster = this.raster;\n const style = cell.attributes & 5;\n let metrics = this.fontMetrics.get(style);\n if (!metrics) {\n metrics = measureFont(raster, this.font.cssFamily, style, scale, CELL_WIDTH, CELL_HEIGHT);\n this.fontMetrics.set(style, metrics);\n }\n this.rasterCanvas.width = width;\n this.rasterCanvas.height = height;\n raster.font = metrics.font;\n raster.textBaseline = \"alphabetic\";\n raster.textAlign = \"left\";\n raster.fillStyle = \"white\";\n // One transform per font style, not per glyph: borders remain font outlines,\n // and graphemes are clipped to their server-owned span without individual stretching.\n raster.setTransform(metrics.xScale, 0, 0, metrics.yScale, 2, 2 + metrics.baseline);\n raster.fillText(cell.text, 0, 0);\n const pixels = raster.getImageData(0, 0, width, height);\n let colored = false;\n for (let i = 0; i < pixels.data.length; i += 4) {\n if (pixels.data[i + 3] && (pixels.data[i] !== pixels.data[i + 1] || pixels.data[i + 1] !== pixels.data[i + 2])) {\n colored = true;\n break;\n }\n }\n this.atlas.writePixels(pixels.data, width, height, x, y);\n this.glyphUploadBytes += width * height * 4;\n this.glyphs.set(key, {\n colored,\n u0: (x + 2) / this.atlas.width,\n v0: (y + 2) / this.atlas.height,\n u1: (x + 2 + cell.width * CELL_WIDTH * scale) / this.atlas.width,\n v1: (y + 2 + CELL_HEIGHT * scale) / this.atlas.height,\n });\n this.glyphKeyUnits += key.length;\n }\n\n /** Clip geometry and UVs together. Only adjacent compatible textures may coalesce. */\n quad(resource: TextureResource, x: number, y: number, width: number, height: number,\n color: Vector4, mode = 0, uv: Vector4 = [0, 0, 1, 1],\n clip: Vector4 = [0, 0, this.width, this.height]): void {\n if (width <= 0 || height <= 0 || color[3] <= 0) return;\n const left = Math.max(0, x, clip[0]);\n const top = Math.max(0, y, clip[1]);\n const right = Math.min(this.width, x + width, clip[0] + clip[2]);\n const bottom = Math.min(this.height, y + height, clip[1] + clip[3]);\n if (right <= left || bottom <= top) return;\n if (this.quadCount >= MAX_QUADS) throw new Error(\"Frame exceeds bounded quad budget\");\n const offset = this.quadCount * STRIDE;\n if (offset + STRIDE > this.instances.length) {\n const grown = new Float32Array(Math.min(this.instances.length * 2, MAX_QUADS * STRIDE));\n grown.set(this.instances);\n this.instances = grown;\n }\n const du = uv[2] - uv[0];\n const dv = uv[3] - uv[1];\n this.instances.set([\n left, top, right - left, bottom - top,\n uv[0] + (left - x) / width * du,\n uv[1] + (top - y) / height * dv,\n uv[0] + (right - x) / width * du,\n uv[1] + (bottom - y) / height * dv,\n ...color, mode, 0, 0, 0,\n ], offset);\n const last = this.batches[this.batches.length - 1];\n if (last?.resource === resource) last.count++;\n else this.batches.push({ resource, start: this.quadCount, count: 1 });\n this.quadCount++;\n }\n\n solid(x: number, y: number, width: number, height: number, color: Vector4, clip?: Vector4): void {\n this.quad(this.atlas, x, y, width, height, color, 0, undefined, clip);\n }\n\n placement(placement: ImagePlacement): void {\n const image = this.images.get(placement.key);\n if (!image) throw new Error(`Placement texture is missing: ${placement.key}`);\n const { sourceX: sx, sourceY: sy, sourceWidth: sw, sourceHeight: sh } = placement;\n if (!sw || !sh || !placement.width || !placement.height) return;\n // Clip out-of-texture source regions in destination space instead of stretching edge texels.\n const sourceLeft = placement.x + Math.max(0, -sx) / sw * placement.width;\n const sourceTop = placement.y + Math.max(0, -sy) / sh * placement.height;\n const sourceRight = placement.x + Math.min(sw, image.width - sx) / sw * placement.width;\n const sourceBottom = placement.y + Math.min(sh, image.height - sy) / sh * placement.height;\n const left = Math.max(sourceLeft, placement.clipX);\n const top = Math.max(sourceTop, placement.clipY);\n const right = Math.min(sourceRight, placement.clipX + placement.clipWidth);\n const bottom = Math.min(sourceBottom, placement.clipY + placement.clipHeight);\n this.quad(\n image, placement.x, placement.y, placement.width, placement.height, WHITE, 2,\n [sx / image.width, sy / image.height, (sx + sw) / image.width, (sy + sh) / image.height],\n [left, top, Math.max(0, right - left), Math.max(0, bottom - top)],\n );\n }\n\n decorations(cell: TerminalCell, x: number, y: number, width: number, foreground: Vector4,\n underline = cell.underlineColor, clip?: Vector4, scaleY = 1): void {\n if (cell.attributes & 128) this.solid(x, y + 10 * scaleY, width, scaleY, foreground, clip);\n if (cell.attributes & 256) this.solid(x, y + scaleY, width, scaleY, foreground, clip);\n const style = cell.underlineStyle || (cell.attributes & 8 ? 1 : 0);\n this.underline(style, x, y, width, rgba(underline), clip, scaleY);\n }\n\n private underline(style: number, x: number, y: number, width: number, color: Vector4, clip?: Vector4, scaleY = 1): void {\n if (style === 1) this.solid(x, y + 18 * scaleY, width, scaleY, color, clip);\n else if (style === 2) {\n this.solid(x, y + 16 * scaleY, width, scaleY, color, clip);\n this.solid(x, y + 18 * scaleY, width, scaleY, color, clip);\n } else if (style === 3) {\n for (let dx = 0; dx < width; dx++) {\n this.solid(x + dx, y + (17 + Math.round(Math.sin((x + dx) * Math.PI / 4))) * scaleY, 1, scaleY, color, clip);\n }\n } else if (style === 4 || style === 5) {\n const step = style === 4 ? 2 : 5;\n const segment = style === 4 ? 1 : 3;\n for (let dx = 0; dx < width; dx += step) this.solid(x + dx, y + 18 * scaleY, Math.min(segment, width - dx), scaleY, color, clip);\n }\n }\n\n private renderCell(cell: TerminalCell, index: number, metadata: FrameMetadata, blinkOn: boolean,\n palette: RenderPalette, linkDecoration: number, selectionClip?: Vector4): void {\n if (!cell.width || (cell.attributes & 64) || ((cell.attributes & 16) && !blinkOn)) return;\n const row = Math.floor(index / this.columns);\n const rendition = metadata.lineRenditions?.[row] ?? 0;\n const scaleX = rendition ? 2 : 1;\n const scaleY = rendition >= 2 ? 2 : 1;\n const column = index % this.columns;\n if (column >= Math.max(1, Math.floor(this.columns / scaleX))) return;\n const x = column * CELL_WIDTH * scaleX;\n const rowY = row * CELL_HEIGHT;\n const y = rowY - (rendition === 3 ? CELL_HEIGHT : 0);\n const width = Math.min(cell.width * CELL_WIDTH * scaleX, this.width - x);\n const clip: Vector4 | undefined = !rendition ? selectionClip : selectionClip\n ? [selectionClip[0], Math.max(rowY, selectionClip[1]), selectionClip[2],\n Math.min(rowY + CELL_HEIGHT, selectionClip[1] + selectionClip[3]) - Math.max(rowY, selectionClip[1])]\n : [0, rowY, this.width, CELL_HEIGHT];\n const foreground = rgba(selectionClip ? palette.selectionForeground : foregroundColor(cell, metadata, palette));\n const glyph = isKgpPlaceholder(cell) ? undefined : this.glyphs.get(glyphKey(cell));\n if (glyph) {\n const tint: Vector4 = glyph.colored\n ? (!selectionClip && (cell.attributes & 2) ? [0.5, 0.5, 0.5, 1] : WHITE) : foreground;\n this.quad(this.atlas, x, y, cell.width * CELL_WIDTH * scaleX, CELL_HEIGHT * scaleY,\n tint, glyph.colored ? 2 : 1, [glyph.u0, glyph.v0, glyph.u1, glyph.v1], clip);\n }\n this.decorations(cell, x, y, width, foreground,\n selectionClip ? palette.selectionForeground : underlineColor(cell, metadata, palette), clip, scaleY);\n if (linkDecoration && !cell.underlineStyle && !(cell.attributes & 8) && !isKgpPlaceholder(cell)) {\n this.underline(linkDecoration, x, y, width, foreground, clip, scaleY);\n }\n }\n\n render(cells: readonly (TerminalCell | undefined)[], metadata: FrameMetadata, blinkOn: boolean,\n linkDecorations?: Uint8Array, palette: RenderPalette = DEFAULT_PALETTE) {\n const start = performance.now();\n this.quadCount = 0;\n this.batches = [];\n const placements = metadata.placements.map((placement, order) => ({\n placement,\n order,\n z: placement.kind === \"sixel\" ? -1 : placement.z,\n })).sort((a, b) => a.z - b.z || a.order - b.order);\n for (const item of placements) if (item.z < -1073741824) this.placement(item.placement);\n for (let i = 0; i < cells.length; i++) {\n const cell = cells[i];\n if (!cell) continue;\n const row = Math.floor(i / this.columns);\n const scaleX = metadata.lineRenditions?.[row] ? 2 : 1;\n if (i % this.columns >= Math.max(1, Math.floor(this.columns / scaleX))) continue;\n this.solid((i % this.columns) * CELL_WIDTH * scaleX, row * CELL_HEIGHT,\n CELL_WIDTH * scaleX, CELL_HEIGHT, rgba(backgroundColor(cell, metadata, palette)));\n }\n for (const item of placements) if (item.z >= -1073741824 && item.z < 0) this.placement(item.placement);\n for (let i = 0; i < cells.length; i++) {\n const cell = cells[i];\n if (cell) this.renderCell(cell, i, metadata, blinkOn, palette, linkDecorations?.[i] ?? 0);\n }\n for (const item of placements) if (item.z >= 0) this.placement(item.placement);\n const selection = metadata.history?.selection;\n if (selection?.status === \"valid\") {\n for (const range of selection.ranges) {\n const scaleX = metadata.lineRenditions?.[range.row] ? 2 : 1;\n const clip: Vector4 = [range.startColumn * CELL_WIDTH * scaleX, range.row * CELL_HEIGHT,\n (range.endColumn - range.startColumn) * CELL_WIDTH * scaleX, CELL_HEIGHT];\n this.solid(...clip, rgba(palette.selectionBackground));\n const rowStart = range.row * this.columns;\n let start = rowStart + range.startColumn;\n // A rectangular selection can begin in the continuation of a wide glyph.\n while (start > rowStart && cells[start]?.width === 0) start--;\n for (let i = start; i < rowStart + range.endColumn; i++) {\n const cell = cells[i];\n if (cell) this.renderCell(cell, i, metadata, blinkOn, palette, linkDecorations?.[i] ?? 0, clip);\n }\n }\n }\n const cursor = metadata.cursor;\n const cursorBlink = cursor.shape === 0 || cursor.shape % 2 === 1;\n if (cursor.visible && (!cursorBlink || blinkOn) && cursor.x >= 0 && cursor.x < this.columns && cursor.y >= 0 && cursor.y < this.rows) {\n const cell = cells[cursor.y * this.columns + cursor.x];\n const color = rgba(palette.cursor ?? (cell ? foregroundColor(cell, metadata, palette) : palette.foreground));\n const scaleX = metadata.lineRenditions?.[cursor.y] ? 2 : 1;\n const x = cursor.x * CELL_WIDTH * scaleX;\n const y = cursor.y * CELL_HEIGHT;\n if (cursor.shape === 3 || cursor.shape === 4) this.solid(x, y + 18, CELL_WIDTH * scaleX, 2, color);\n else if (cursor.shape === 5 || cursor.shape === 6) this.solid(x, y, 2, CELL_HEIGHT, color);\n else {\n color[3] *= 0.55;\n this.solid(x, y, CELL_WIDTH * scaleX, CELL_HEIGHT, color);\n }\n }\n const base = rgba(metadata.colorEncoding === \"indexed-v1\" ? palette.background :\n metadata.defaultBackground ?? cells[0]?.background ?? 0xff000000);\n this.backend.submit(this.instances, this.quadCount, this.batches, base);\n return { cpuMs: performance.now() - start, quads: this.quadCount, drawCalls: this.batches.length };\n }\n\n metrics() {\n return {\n renderer: this.backend.kind,\n rendererFallbackReason: this.fallbackReason,\n fontFamily: this.font.family,\n rasterScale: this.scale,\n backingScale: this.backingScale,\n backingWidth: this.canvas.width,\n backingHeight: this.canvas.height,\n imageCount: this.images.size,\n textureBytes: this.textureBytes,\n atlasGlyphs: this.glyphs.size,\n atlasBytes: this.atlas.width * this.atlas.height * 4,\n atlasRebuilds: this.atlasRebuilds,\n imageUploadBytes: this.imageUploadBytes,\n imagePayloadBytes: this.imagePayloadBytes,\n glyphUploadBytes: this.glyphUploadBytes,\n instanceBufferBytes: this.backend.instanceBufferBytes,\n };\n }\n\n async idle() {\n await this.backend.idle();\n }\n\n dispose() {\n if (this.disposed) return;\n this.disposed = true;\n for (const image of this.images.values()) image.destroy();\n this.images.clear();\n this.textureBytes = 0;\n this.atlas?.destroy();\n this.glyphs.clear();\n this.glyphKeyUnits = 0;\n this.batches = [];\n this.quadCount = 0;\n this.instances = new Float32Array(0);\n this.font?.dispose();\n this.fontMetrics.clear();\n this.backend.dispose();\n }\n}\n", "import type { LinkDetectionSnapshot } from \"./link-detection.js\";\nimport type { SelectionRange, TerminalLinkUnderlineStyle } from \"./types.js\";\nimport type { FrameMetadata, TerminalCell } from \"./wire-types.js\";\n\ntype Cells = readonly (TerminalCell | undefined)[];\ntype Decorations = { revision: number; generation: number; serial: number; mask: Uint8Array };\nconst TEXT_ATTRIBUTES = 64 | 1024; // Hidden and soft-wrap; other SGR attributes are presentation-only.\n\nfunction sameContent(cells: Cells, metadata: FrameMetadata, previousCells: Cells, previous: FrameMetadata): boolean {\n if (cells === previousCells && metadata === previous) return true;\n if (metadata.columns !== previous.columns || metadata.rows !== previous.rows) return false;\n const history = metadata.history, oldHistory = previous.history;\n if (!!history !== !!oldHistory || history?.generation !== oldHistory?.generation ||\n history?.buffer !== oldHistory?.buffer || history?.rowIds.length !== oldHistory?.rowIds.length ||\n history?.rowIds.some((id, index) => id !== oldHistory?.rowIds[index])) return false;\n if (metadata.hyperlinks.length !== previous.hyperlinks.length ||\n metadata.hyperlinks.some((range, index) => {\n const old = previous.hyperlinks[index];\n return range.row !== old.row || range.startColumn !== old.startColumn ||\n range.endColumn !== old.endColumn || range.uri !== old.uri;\n })) return false;\n if (cells.length !== previousCells.length) return false;\n for (let index = 0; index < cells.length; index++) {\n const cell = cells[index], old = previousCells[index];\n if (cell === old) continue;\n if (!cell || !old || cell.text !== old.text || cell.width !== old.width ||\n (cell.attributes & TEXT_ATTRIBUTES) !== (old.attributes & TEXT_ATTRIBUTES)) return false;\n }\n return true;\n}\n\n/** Tracks only local presentation state; never modifies authoritative cells or runs matching. */\nexport class LinkPresentation {\n enabled = false;\n generation = 0;\n private presented?: { cells: Cells; metadata: FrameMetadata };\n private sent?: { cells: Cells; metadata: FrameMetadata };\n private forceSnapshot = false;\n private decorations?: Decorations;\n private pending?: Decorations;\n private lastSerial = -1;\n\n configure(enabled: boolean, generation: number): boolean {\n if (typeof enabled !== \"boolean\" || !Number.isSafeInteger(generation) || generation < 0) {\n throw new Error(\"Invalid link detection configuration\");\n }\n if (generation < this.generation || (enabled === this.enabled && generation === this.generation)) return false;\n this.enabled = enabled;\n this.generation = generation;\n this.sent = undefined;\n this.forceSnapshot = enabled;\n this.clear();\n this.lastSerial = -1;\n return true;\n }\n\n private clear(): void {\n this.decorations = undefined;\n this.pending = undefined;\n }\n\n prepare(cells: Cells, metadata: FrameMetadata): void {\n if (!this.enabled) return;\n if (!this.presented || !sameContent(cells, metadata, this.presented.cells, this.presented.metadata)) this.clear();\n // A pending acknowledgement belongs to its submitted revision, even if text is unchanged.\n if (this.pending?.revision !== metadata.revision) this.pending = undefined;\n }\n\n present(cells: Cells, metadata: FrameMetadata): { linkGeneration?: number; linkSnapshot?: LinkDetectionSnapshot } {\n this.presented = { cells, metadata };\n if (!this.enabled) return {};\n const snapshot = this.snapshot();\n return { linkGeneration: this.generation, ...(snapshot ? { linkSnapshot: snapshot } : {}) };\n }\n\n snapshot(): LinkDetectionSnapshot | undefined {\n const current = this.presented;\n if (!this.enabled || !current) return undefined;\n if (!this.forceSnapshot && this.sent &&\n sameContent(current.cells, current.metadata, this.sent.cells, this.sent.metadata)) {\n this.sent = current;\n return undefined;\n }\n this.forceSnapshot = false;\n this.sent = current;\n const { cells, metadata } = current;\n return { revision: metadata.revision, columns: metadata.columns, rows: metadata.rows,\n cells, hyperlinks: metadata.hyperlinks };\n }\n\n accept(revision: number, generation: number, serial: number, ranges: readonly SelectionRange[], busy: boolean,\n underlineStyle: TerminalLinkUnderlineStyle = \"solid\"): boolean {\n if (![revision, generation, serial].every(value => Number.isSafeInteger(value) && value >= 0) ||\n !Array.isArray(ranges) || ![\"solid\", \"dashed\"].includes(underlineStyle)) {\n throw new Error(\"Invalid link decorations\");\n }\n const metadata = this.presented?.metadata;\n if (!this.enabled || busy || !metadata || revision !== metadata.revision ||\n generation !== this.generation || serial <= this.lastSerial) return false;\n if (ranges.length > metadata.columns * metadata.rows || ranges.some(range => !range ||\n !Number.isInteger(range.row) || range.row < 0 || range.row >= metadata.rows ||\n !Number.isInteger(range.startColumn) || !Number.isInteger(range.endColumn) ||\n range.startColumn < 0 || range.endColumn <= range.startColumn || range.endColumn > metadata.columns)) {\n throw new Error(\"Invalid link decoration ranges\");\n }\n const mask = new Uint8Array(metadata.columns * metadata.rows);\n // Values share the renderer's SGR underline styles, without modifying any cell.\n const style = underlineStyle === \"dashed\" ? 5 : 1;\n for (const range of ranges) mask.fill(style, range.row * metadata.columns + range.startColumn,\n range.row * metadata.columns + range.endColumn);\n this.lastSerial = serial;\n this.decorations = this.pending = { revision, generation, serial, mask };\n return true;\n }\n\n submission(): { mask?: Uint8Array; acknowledgement?: Decorations } {\n return { mask: this.decorations?.mask, acknowledgement: this.pending };\n }\n\n acknowledge(submitted: Decorations | undefined, busy: boolean): { revision: number; generation: number; serial: number } | undefined {\n if (!submitted || submitted !== this.pending || busy || !this.enabled ||\n submitted.generation !== this.generation || submitted.revision !== this.presented?.metadata.revision) return undefined;\n this.pending = undefined;\n return { revision: submitted.revision, generation: submitted.generation, serial: submitted.serial };\n }\n}\n", "import type { HistoryMetadata } from \"./wire-types.js\";\nimport type { TerminalMarker } from \"./scrollbar-types.js\";\nimport { LIMITS } from \"./protocol.js\";\n\n/** Retained inventories are a single presentation transaction, even when delivered over several frames. */\nexport class MarkerPages {\n #current: { revision: string; total: number; signature: string; markers: TerminalMarker[];\n ids: Set<string>; bytes: number } | undefined;\n get pending(): boolean { return this.#current !== undefined; }\n reset(): void { this.#current = undefined; }\n\n accept(history: HistoryMetadata | null): HistoryMetadata | null | undefined {\n if (!history?.markerPage) {\n this.reset();\n return history;\n }\n const { markers = [], markerPage: page, ...snapshot } = history;\n const signature = JSON.stringify(snapshot);\n if (page.offset === 0) this.#current = {\n revision: page.revision, total: page.total, signature, markers: [], ids: new Set(), bytes: 0\n };\n const current = this.#current;\n if (!current || current.revision !== page.revision || current.total !== page.total ||\n current.markers.length !== page.offset || current.signature !== signature)\n throw new Error(\"Marker pages do not describe the same contiguous history snapshot\");\n current.bytes += new TextEncoder().encode(JSON.stringify(markers)).byteLength;\n if (current.bytes > LIMITS.metadataBytes) throw new Error(\"Retained marker inventory exceeds the 8 MiB client budget\");\n for (const marker of markers) {\n if (current.ids.has(marker.id)) throw new Error(\"Duplicate marker ID across inventory pages\");\n current.ids.add(marker.id);\n current.markers.push(marker);\n }\n if (current.markers.length < current.total) return undefined;\n this.reset();\n return { ...snapshot, markers: current.markers, markerPage: null };\n }\n}\n", "import { decodeFrame, screenText } from \"./protocol.js\";\nimport { TerminalRenderer } from \"./renderer.js\";\nimport { LinkPresentation } from \"./link-presentation.js\";\nimport { MarkerPages } from \"./marker-pages.js\";\nimport type { TerminalSize, TerminalStatusLevel } from \"./types.js\";\nimport type { FrameMetadata, TerminalCell, TerminalCommand, WorkerInputMessage, WorkerOutputMessage, WorkerStats } from \"./wire-types.js\";\nimport { errorMessage } from \"./validation.js\";\nimport { compilePalette, defaultDarkPalette, normalizePalette } from \"./terminal-palette.js\";\nimport { createWebSocketTransport } from \"./websocket-transport.js\";\nimport { TransportSession } from \"./transport-session.js\";\nimport type { TerminalTransportConnection, TerminalTransportContext } from \"./transport-types.js\";\n\n// This module is only executed as a dedicated worker. Keeping its global local to\n// this module avoids leaking worker/WebGPU ambient dependencies to public declarations.\ndeclare const self: {\n postMessage(message: WorkerOutputMessage): void;\n requestAnimationFrame(callback: FrameRequestCallback): number;\n close(): void;\n addEventListener(type: \"error\", callback: (event: ErrorEvent) => void): void;\n addEventListener(type: \"unhandledrejection\", callback: (event: PromiseRejectionEvent) => void): void;\n addEventListener(type: \"message\", callback: (event: MessageEvent<WorkerInputMessage>) => void): void;\n};\n\nlet renderer: TerminalRenderer | undefined;\nlet transport: TransportSession | undefined;\nlet bridge: TerminalTransportContext | undefined;\nlet bridgeReady: ReturnType<typeof Promise.withResolvers<TerminalTransportConnection>> | undefined;\nlet bridgeSent: ReturnType<typeof Promise.withResolvers<void>> | undefined;\nlet failed = false;\nlet stopped = false;\nlet disconnected = false;\nlet preserveOnDisconnect = false;\nlet processing = false;\nlet drawing = false;\nlet frameInFlight = false;\nlet scheduled = false;\nlet needsRender = false;\nlet hasBlink = false;\nlet lastBlink = true;\nlet metadata: FrameMetadata | undefined;\nlet cells: (TerminalCell | undefined)[] = [];\nlet localRevision = 0;\nlet pendingFrame: { revision: number; full: boolean; changedCells: number } | undefined;\nlet renderPromise = Promise.resolve();\nlet metricsTimer: ReturnType<typeof setInterval> | undefined;\nlet blinkTimer: ReturnType<typeof setInterval> | undefined;\nlet viewport: TerminalSize | undefined;\nconst links = new LinkPresentation();\nconst markerPages = new MarkerPages();\nlet awaitingFull = false;\nlet requestedColorEncoding = false;\nlet palette = compilePalette(defaultDarkPalette);\nconst stats: WorkerStats = {\n revision: 0, fullFrames: 0, frames: 0, presentations: 0,\n changedCells: 0, lastChangedCells: 0, discardedFrames: 0,\n imageCount: 0, textureBytes: 0, atlasGlyphs: 0, atlasBytes: 0,\n bytesReceived: 0, imageUploadBytes: 0, imagePayloadBytes: 0,\n gpu: \"initializing\", connected: false, warnings: [],\n fps: 0, receivedKBps: 0, workloadMBps: 0,\n captureMs: 0, rendererCpuMs: 0, preparationCpuMs: 0,\n workloadBytes: 0, outputBatches: 0, serverElapsedMs: 0,\n};\nlet sample = { time: performance.now(), presentations: 0, bytes: 0, workload: 0 };\n\nfunction postStatus(message: string, level: TerminalStatusLevel = \"info\"): void {\n self.postMessage({ type: \"status\", message, level });\n}\n\nfunction send(message: TerminalCommand): void {\n if (stats.connected && !disconnected && !transport?.closing && !failed && !stopped) {\n void transport?.send(JSON.stringify(message)).catch(error => {\n if (!transport?.closing) fail(error);\n });\n }\n}\n\nfunction emitStats(text?: string): void {\n if (renderer && !renderer.disposed) Object.assign(stats, renderer.metrics());\n else if (renderer?.disposed) Object.assign(stats, {\n imageCount: 0, textureBytes: 0, atlasGlyphs: 0, atlasBytes: 0, instanceBufferBytes: 0,\n });\n self.postMessage({ type: \"stats\", stats: { ...stats }, ...(text === undefined ? {} : { text }) });\n}\n\nfunction fail(error: unknown): void {\n if (failed || stopped) return;\n failed = true;\n const message = errorMessage(error);\n stats.gpu = \"error\";\n stats.connected = false;\n clearInterval(metricsTimer);\n clearInterval(blinkTimer);\n transport?.dispose();\n emitStats();\n postStatus(message, \"error\");\n renderer?.dispose();\n}\n\nself.addEventListener(\"error\", event => {\n event.preventDefault();\n fail(event.error || new Error(event.message));\n});\nself.addEventListener(\"unhandledrejection\", event => {\n event.preventDefault();\n fail(event.reason);\n});\n\n/** At most one state frame, one decode, and one GPU submission are outstanding. */\nfunction scheduleRender() {\n needsRender = true;\n if (scheduled || drawing || processing || failed || stopped || (disconnected && stats.connected) ||\n !metadata || markerPages.pending || awaitingFull) return;\n scheduled = true;\n self.requestAnimationFrame(() => {\n scheduled = false;\n if (processing || drawing || failed || stopped || (disconnected && stats.connected) ||\n markerPages.pending || awaitingFull) return;\n renderPromise = drawFrame();\n });\n}\n\nasync function drawFrame() {\n if (!needsRender || !metadata || !renderer) return;\n needsRender = false;\n drawing = true;\n const frame = pendingFrame;\n try {\n if (frame) links.prepare(cells, metadata);\n const linkSubmission = links.submission();\n renderer.resize(metadata.columns, metadata.rows, viewport);\n const blink = disconnected || Math.floor(performance.now() / 600) % 2 === 0;\n const result = renderer.render(cells, metadata, blink, linkSubmission.mask, palette);\n // This is bounded completion/backpressure, not GPU readback or a GPU timing measurement.\n await renderer.idle();\n if (failed || stopped) return;\n lastBlink = blink;\n stats.presentations++;\n stats.rendererCpuMs = result.cpuMs;\n stats.quads = result.quads;\n stats.drawCalls = result.drawCalls;\n stats.warnings = renderer.canvasLimited\n ? [...metadata.warnings, `Canvas resolution capped by the GPU; terminal grid remains ${metadata.columns}x${metadata.rows}`]\n : metadata.warnings;\n if (frame) {\n pendingFrame = undefined;\n frameInFlight = false;\n stats.frames++;\n if (frame.full) stats.fullFrames++;\n stats.revision = frame.revision;\n stats.changedCells += frame.changedCells;\n stats.lastChangedCells = frame.changedCells;\n stats.captureMs = metadata.stats.captureMs;\n stats.workloadBytes = metadata.stats.workloadBytes;\n stats.outputBatches = metadata.stats.outputBatches;\n stats.serverElapsedMs = metadata.stats.elapsedMs;\n stats.columns = metadata.columns;\n stats.rows = metadata.rows;\n stats.mouseTracking = metadata.mouseTracking;\n stats.peer = metadata.peer;\n stats.history = metadata.history;\n const text = screenText(cells, metadata.columns, metadata.rows);\n self.postMessage({\n type: \"geometry\", columns: metadata.columns, rows: metadata.rows,\n cellWidth: metadata.cellWidth, cellHeight: metadata.cellHeight,\n mouseTracking: metadata.mouseTracking, peer: metadata.peer,\n history: metadata.history, revision: frame.revision, title: metadata.title,\n progress: metadata.progress, shellIntegration: metadata.shellIntegration,\n workingDirectory: metadata.workingDirectory, commandMark: metadata.commandMark,\n text, hyperlinks: metadata.hyperlinks, lineRenditions: metadata.lineRenditions, ...links.present(cells, metadata)\n });\n send({ type: \"ack\", revision: frame.revision });\n emitStats(text);\n } else {\n const snapshot = links.snapshot();\n if (snapshot) self.postMessage({ type: \"linkSnapshot\", generation: links.generation, snapshot });\n }\n const acknowledgement = links.acknowledge(linkSubmission.acknowledgement, processing || frameInFlight);\n if (acknowledgement) self.postMessage({ type: \"linkDecorations\", ...acknowledgement });\n } catch (error) {\n fail(error);\n } finally {\n drawing = false;\n if (needsRender && !processing) scheduleRender();\n }\n}\n\nasync function receiveFrame(buffer: ArrayBuffer): Promise<void> {\n if (failed || stopped || disconnected || !renderer) return;\n if (frameInFlight) throw new Error(\"Server sent a second state frame before acknowledgement\");\n frameInFlight = true;\n processing = true;\n stats.bytesReceived += buffer.byteLength || 0;\n try {\n const frame = decodeFrame(buffer);\n const next = frame.metadata;\n if (!requestedColorEncoding && next.colorEncodings?.includes(\"indexed-v1\")) {\n requestedColorEncoding = true;\n send({ type: \"colorEncoding\", value: \"indexed-v1\" });\n }\n if (!next.full && (awaitingFull || next.baseRevision !== localRevision || next.revision <= localRevision ||\n !metadata || next.columns !== metadata.columns || next.rows !== metadata.rows ||\n (next.colorEncoding ?? null) !== (metadata.colorEncoding ?? null))) {\n stats.discardedFrames++;\n frameInFlight = false;\n markerPages.reset();\n awaitingFull = true;\n needsRender = false;\n pendingFrame = undefined;\n // A discarded frame must release the server's one-in-flight gate before resync.\n send({ type: \"ack\", revision: next.revision });\n send({ type: \"resync\" });\n postStatus(`Revision mismatch (local ${localRevision}, base ${next.baseRevision}); requesting a full frame`);\n return;\n }\n await renderPromise;\n if (failed || stopped) return;\n // No blink presentation may reference textures while this resource transaction is in progress.\n await renderer.idle();\n await renderer.updateImages(frame.images, next.retainedImages);\n if (failed || stopped) return;\n const preparationStart = performance.now();\n const nextCells: (TerminalCell | undefined)[] = next.full\n ? new Array<TerminalCell | undefined>(next.columns * next.rows) : cells.slice();\n for (const cell of frame.cells) nextCells[cell.index] = cell;\n renderer.prepareGlyphs(nextCells);\n cells = nextCells;\n metadata = next;\n localRevision = next.revision;\n const wasPaging = markerPages.pending && !next.full;\n const history = markerPages.accept(next.history);\n awaitingFull = false;\n pendingFrame = { revision: next.revision,\n full: next.full || (wasPaging && !!pendingFrame?.full),\n changedCells: frame.cells.length + (wasPaging ? pendingFrame?.changedCells ?? 0 : 0) };\n hasBlink = cells.some(cell => cell && (cell.attributes & 16) && !(cell.attributes & 64)) ||\n (next.cursor.visible && (next.cursor.shape === 0 || next.cursor.shape % 2 === 1));\n stats.preparationCpuMs = performance.now() - preparationStart;\n if (history === undefined) {\n // Acknowledge an inventory fragment, but expose/draw only the completed snapshot.\n needsRender = false;\n frameInFlight = false;\n send({ type: \"ack\", revision: next.revision });\n return;\n }\n next.history = history;\n needsRender = true;\n } finally {\n processing = false;\n if (needsRender) scheduleRender();\n }\n}\n\nasync function initialize(message: Extract<WorkerInputMessage, { type: \"init\" }>): Promise<void> {\n if (renderer || transport) throw new Error(\"Worker is already initialized\");\n preserveOnDisconnect = message.preserveOnDisconnect ?? false;\n palette = compilePalette(normalizePalette(message.palette === undefined ? defaultDarkPalette : message.palette));\n if (typeof self.requestAnimationFrame !== \"function\") {\n throw new Error(\"This browser does not support requestAnimationFrame in a dedicated OffscreenCanvas worker\");\n }\n postStatus(\"Loading terminal font and initializing renderer...\");\n renderer = await TerminalRenderer.create(message.canvas, message.scale, fail, message.font, message.renderer);\n if (failed || stopped) {\n renderer?.dispose();\n return;\n }\n stats.gpu = \"ready\";\n stats.backingScale = message.scale;\n emitStats();\n const rendererName = renderer.backend.kind === \"webgpu\" ? \"WebGPU\" : \"WebGL2\";\n if (renderer.fallbackReason) postStatus(`Using WebGL2: ${renderer.fallbackReason}`);\n postStatus(`${rendererName} ready. Attaching terminal view...`);\n transport = new TransportSession({\n onReady() {\n if (failed || stopped) return;\n stats.connected = true;\n self.postMessage({ type: \"connected\" });\n postStatus(`Connected \u00B7 ${rendererName} worker \u00B7 server-authoritative cells and graphics`, \"ready\");\n emitStats();\n },\n onFrame: receiveFrame,\n onError: fail,\n onClose(details) {\n if (failed || stopped || disconnected) return;\n disconnected = true;\n clearInterval(metricsTimer);\n clearInterval(blinkTimer);\n void finishClose().catch(fail);\n\n async function finishClose() {\n if (preserveOnDisconnect) {\n await renderPromise;\n if (failed || stopped) return;\n // A transport close can overtake the worker's scheduled animation frame.\n if ((needsRender || (hasBlink && !lastBlink)) && !markerPages.pending && !awaitingFull) {\n needsRender = true;\n await drawFrame();\n }\n if (failed || stopped) return;\n } else {\n stopped = true;\n renderer?.dispose();\n }\n stats.connected = false;\n stats.gpu = \"stopped\";\n stats.fps = 0;\n self.postMessage({ type: \"closed\", details });\n postStatus(`View disconnected (${details.code === undefined ? details.reason :\n `${details.code}${details.reason ? `: ${details.reason}` : \"\"}`}). Attach another view to reconnect.`, \"error\");\n emitStats();\n }\n }\n });\n metricsTimer = setInterval(() => {\n const now = performance.now();\n const seconds = (now - sample.time) / 1000;\n stats.fps = (stats.presentations - sample.presentations) / seconds;\n stats.receivedKBps = (stats.bytesReceived - sample.bytes) / seconds / 1000;\n stats.workloadMBps = Math.max(0, stats.workloadBytes - sample.workload) / seconds / 1000000;\n sample = { time: now, presentations: stats.presentations, bytes: stats.bytesReceived, workload: stats.workloadBytes };\n emitStats();\n }, 1000);\n blinkTimer = setInterval(() => {\n const blinkOn = Math.floor(performance.now() / 600) % 2 === 0;\n if (hasBlink && blinkOn !== lastBlink) scheduleRender();\n }, 100);\n transport.start(message.transport.type === \"websocket\" ? createWebSocketTransport(message.transport.url) : {\n connect(context) {\n bridge = context;\n bridgeReady = Promise.withResolvers<TerminalTransportConnection>();\n context.signal.addEventListener(\"abort\", () => {\n bridgeReady?.reject(context.signal.reason);\n bridgeSent?.reject(context.signal.reason);\n }, { once: true });\n self.postMessage({ type: \"transportConnect\" });\n return bridgeReady.promise;\n }\n });\n}\n\nself.addEventListener(\"message\", event => {\n const message = event.data;\n if (message.type === \"init\") {\n initialize(message).catch(fail);\n } else if (message.type === \"transportConnected\" && bridge && !failed && !stopped) {\n bridgeReady?.resolve({\n send(control) {\n bridgeSent = Promise.withResolvers<void>();\n self.postMessage({ type: \"transportSend\", control });\n return bridgeSent.promise;\n },\n dispose() {}\n });\n } else if (message.type === \"transportFrame\" && bridge && !failed && !stopped) {\n void bridge.onFrame(message.buffer).then(() => {\n if (!failed && !stopped) self.postMessage({ type: \"transportReceived\" });\n }).catch(fail);\n } else if (message.type === \"transportSent\" && !failed && !stopped) {\n bridgeSent?.resolve();\n bridgeSent = undefined;\n } else if (message.type === \"transportClosed\") {\n bridge?.onClose(message.details);\n } else if (message.type === \"transportError\") {\n bridge?.onError(new Error(message.message));\n } else if (message.type === \"stop\") {\n stopped = true;\n clearInterval(metricsTimer);\n clearInterval(blinkTimer);\n transport?.dispose();\n renderer?.dispose();\n self.close();\n } else if (message.type === \"viewport\" && !failed && !stopped) {\n if (!Number.isFinite(message.width) || !Number.isFinite(message.height) || message.width < 0 || message.height < 0) {\n fail(new Error(\"Invalid mounted viewport dimensions\"));\n return;\n }\n if (viewport?.width === message.width && viewport?.height === message.height) return;\n viewport = { width: message.width, height: message.height };\n scheduleRender();\n } else if (message.type === \"command\" && !failed && !stopped) {\n send(message.command);\n } else if (message.type === \"palette\" && !failed && !stopped) {\n try {\n palette = compilePalette(normalizePalette(message.palette));\n scheduleRender();\n } catch (error) { fail(error); }\n } else if (message.type === \"linkDetection\" && !failed && !stopped && !disconnected) {\n try {\n if (!links.configure(message.enabled, message.generation)) return;\n if (!processing && !drawing && !pendingFrame) {\n const snapshot = links.snapshot();\n if (snapshot) self.postMessage({ type: \"linkSnapshot\", generation: links.generation, snapshot });\n }\n scheduleRender();\n } catch (error) { fail(error); }\n } else if (message.type === \"linkDecorations\" && !failed && !stopped && !disconnected) {\n try {\n if (links.accept(message.revision, message.generation, message.serial, message.ranges,\n processing || frameInFlight || !!pendingFrame, message.underlineStyle)) scheduleRender();\n } catch (error) { fail(error); }\n }\n});\n", "import { LINK_LIMITS } from \"./link-options.js\";\nimport type { LinkScanRequest, LinkScanResponse, LinkScanMatch } from \"./link-worker-protocol.js\";\nimport { linkMatchTextSize } from \"./link-worker-protocol.js\";\n\nfunction trimProse(text: string): string {\n let end = text.length;\n const pairs: Record<string, string> = { \")\": \"(\", \"]\": \"[\", \"}\": \"{\" };\n while (end > 0) {\n const char = text[end - 1];\n if (\".,;:!?\".includes(char)) { end--; continue; }\n if (pairs[char]) {\n const current = text.slice(0, end);\n if (current.split(char).length > current.split(pairs[char]).length) { end--; continue; }\n }\n break;\n }\n return text.slice(0, end);\n}\n\nexport function scanLinks(request: LinkScanRequest): LinkScanResponse {\n try {\n const builtin = \"builtin\" in request.rule ? request.rule.builtin : undefined;\n let regex: RegExp;\n if (\"source\" in request.rule) {\n const flags = request.rule.flags.replaceAll(\"g\", \"\");\n regex = new RegExp(request.rule.source, `${flags}g`);\n } else {\n const sources = {\n url: String.raw`https?:\\/\\/[^\\s\\0<>\"'\\x60]+`,\n uri: String.raw`[A-Za-z][A-Za-z0-9+.-]*:[^\\s\\0<>\"'\\x60]+`,\n absolutePath: String.raw`(?:[A-Za-z]:[\\\\/]|/)[^\\s\\0<>\"'\\x60]*`,\n homePath: String.raw`~/[^\\s\\0<>\"'\\x60]+`,\n };\n regex = new RegExp(sources[request.rule.builtin], \"giu\");\n }\n let count = 0, attempts = 0, total = 0, resultText = 0;\n const results: NonNullable<LinkScanResponse[\"results\"]> = [];\n for (const chunk of request.chunks) {\n total += chunk.text.length;\n if (chunk.text.length > LINK_LIMITS.chunk || total > LINK_LIMITS.totalText) {\n return { id: request.id, error: \"limit\", message: \"Link scan text limit exceeded\" };\n }\n regex.lastIndex = 0;\n const matches: LinkScanMatch[] = [];\n let match: RegExpExecArray | null;\n while ((match = regex.exec(chunk.text)) !== null) {\n if (++attempts > LINK_LIMITS.totalText || count >= LINK_LIMITS.matches) {\n return { id: request.id, error: \"limit\", message: \"Link match limit exceeded\" };\n }\n if (!match[0].length) {\n const point = chunk.text.codePointAt(regex.lastIndex);\n regex.lastIndex += (regex.unicode || regex.unicodeSets) && point !== undefined && point > 0xffff ? 2 : 1;\n continue;\n }\n let text = match[0];\n if (builtin) {\n const before = chunk.text[match.index - 1];\n if (before !== undefined && !/[\\s([{\"'<>=]/u.test(before)) continue;\n if (builtin === \"uri\" && /^[a-z]:[\\\\/]/iu.test(text)) continue;\n text = trimProse(text);\n if (!text || (builtin === \"absolutePath\" && (text === \"/\" || /^[a-z]:[\\\\/]$/iu.test(text)))) continue;\n if (builtin === \"url\") {\n try { if (!new URL(text).hostname) continue; } catch { continue; }\n }\n }\n const candidate = { index: match.index, text, captures: match.slice(1), groups: { ...match.groups } };\n resultText += linkMatchTextSize(candidate);\n if (resultText > LINK_LIMITS.resultText) {\n return { id: request.id, error: \"limit\", message: \"Link result text limit exceeded\" };\n }\n matches.push(candidate);\n count++;\n }\n results.push({ key: chunk.key, matches });\n }\n return { id: request.id, results };\n } catch (error) {\n return { id: request.id, error: \"worker\", message: error instanceof Error ? error.message : String(error) };\n }\n}\n\nif (typeof self !== \"undefined\" && typeof self.postMessage === \"function\") {\n self.addEventListener(\"message\", (event: MessageEvent<LinkScanRequest>) => {\n self.postMessage(scanLinks(event.data));\n });\n}\n", "import type { MouseTrackingMode, SelectionMode, TerminalPoint, TerminalSelection } from \"./types.js\";\nimport type { CellPosition } from \"./wire-types.js\";\n\nexport interface GestureState {\n tracking: MouseTrackingMode;\n historical?: boolean;\n readOnly?: boolean;\n selection?: Pick<TerminalSelection, \"status\" | \"mode\" | \"canExtend\">;\n}\nexport type GestureStart = { owner: \"app\" } | { owner: \"local\"; mode: SelectionMode; extend: boolean };\ntype PointEvent = Pick<MouseEvent, \"clientX\" | \"clientY\" | \"shiftKey\" | \"altKey\" | \"ctrlKey\">;\n\nexport function cellPoint(event: PointEvent, bounds: Pick<DOMRect, \"left\" | \"top\" | \"width\" | \"height\">,\n columns: number, rows: number, clamp = false): CellPosition | null {\n if (!(bounds.width > 0) || !(bounds.height > 0)) return null;\n const x = Math.floor((event.clientX - bounds.left) * columns / bounds.width);\n const y = Math.floor((event.clientY - bounds.top) * rows / bounds.height);\n if (!clamp && (x < 0 || y < 0 || x >= columns || y >= rows)) return null;\n return {\n x: Math.max(0, Math.min(columns - 1, x)),\n y: Math.max(0, Math.min(rows - 1, y)),\n shift: !!event.shiftKey, alt: !!event.altKey, ctrl: !!event.ctrlKey\n };\n}\n\nexport class WheelAccumulator {\n x = 0;\n y = 0;\n reset() { this.x = this.y = 0; }\n take(event: Pick<WheelEvent, \"deltaMode\" | \"deltaX\" | \"deltaY\">, bounds: Pick<DOMRect, \"height\">, rows: number): TerminalPoint {\n const cellHeight = bounds.height / rows;\n if (!(cellHeight > 0)) return { x: 0, y: 0 };\n const unit = event.deltaMode === 1 ? 1 : event.deltaMode === 2 ? rows : 1 / cellHeight;\n this.x += event.deltaX * unit;\n this.y += event.deltaY * unit;\n const x = Math.trunc(this.x);\n const y = Math.trunc(this.y);\n this.x -= x;\n this.y -= y;\n return { x: Math.max(-32, Math.min(32, x)), y: Math.max(-32, Math.min(32, y)) };\n }\n}\n\n/** Ownership and granularity are latched, independent of subsequent modifiers. */\nexport class SelectionGesture {\n owner: \"local\" | \"app\" | null = null;\n mode: SelectionMode = \"character\";\n endpoint: TerminalPoint | null = null;\n begin(event: Pick<MouseEvent, \"button\" | \"shiftKey\" | \"altKey\" | \"detail\">, point: TerminalPoint,\n { tracking, historical, readOnly, selection }: GestureState): GestureStart | null {\n if (this.owner) return null;\n const local = historical || readOnly || !tracking || event.shiftKey;\n if (local && event.button !== 0) return null;\n this.owner = local ? \"local\" : \"app\";\n if (!local) return { owner: \"app\" };\n const extend = !!event.shiftKey && !!selection && [\"valid\", \"pending\"].includes(selection.status) && selection.canExtend !== false;\n this.mode = extend && selection ? selection.mode : event.altKey ? \"rectangle\"\n : event.detail >= 3 ? \"line\" : event.detail === 2 ? \"word\" : \"character\";\n this.endpoint = { x: point.x, y: point.y };\n return { owner: this.owner, mode: this.mode, extend };\n }\n move(point: TerminalPoint): TerminalPoint | null {\n if (this.owner !== \"local\") return null;\n this.endpoint = { x: point.x, y: point.y };\n return { ...this.endpoint };\n }\n scrollPoint(point: TerminalPoint): TerminalPoint | undefined {\n if (this.owner !== \"local\") return undefined;\n // A wheel cannot widen a rectangle; only actual pointer movement can.\n return { x: this.mode === \"rectangle\" && this.endpoint ? this.endpoint.x : point.x, y: point.y };\n }\n wheelOwner(event: Pick<MouseEvent, \"shiftKey\">, { tracking, historical, readOnly }: GestureState): \"local\" | \"app\" {\n return this.owner ?? (historical || readOnly || !tracking || event.shiftKey ? \"local\" : \"app\");\n }\n end() { this.owner = null; }\n}\n", "export const InputRoute = Object.freeze({\n Continue: \"continue\", Consume: \"consume\", Application: \"application\", Browser: \"browser\"\n});\n\nexport const TerminalAction = Object.freeze({\n CopySelection: \"copySelection\", PasteClipboard: \"pasteClipboard\", CopyOrPaste: \"copyOrPaste\",\n ClearSelection: \"clearSelection\", ScrollToLive: \"scrollToLive\", ScrollLines: \"scrollLines\"\n});\n\nconst browserCtrlKeys = new Set([\"l\", \"t\", \"v\", \"w\", \"+\", \"-\", \"=\", \"0\"]);\nconst browserFunctionKeys = new Set([\"F1\", \"F3\", \"F5\", \"F6\", \"F7\", \"F10\", \"F11\", \"F12\"]);\nconst terminalKeys = new Set([\"Tab\", \"Enter\", \"Backspace\", \"Delete\", \"Escape\", \"ArrowUp\", \"ArrowDown\",\n \"ArrowLeft\", \"ArrowRight\", \"Home\", \"End\", \"PageUp\", \"PageDown\", \"Insert\",\n ...Array.from({ length: 12 }, (_, index) => `F${index + 1}`)]);\nconst routes = new Set(Object.values(InputRoute));\n\n/** Fresh, inspectable defaults. Overrides are per mounted view, never global. */\nexport function defaultInputBindings(): InputBinding[] {\n return [\n {\n id: \"clipboard.copy-key\",\n match: input => input.type === \"key\" && input.key.toLowerCase() === \"c\" && !input.alt &&\n ((input.meta && !input.ctrl) || (input.ctrl && input.shift && !input.meta)),\n action: TerminalAction.CopySelection\n },\n {\n id: \"browser.shortcuts\",\n match: input => input.type === \"key\" && (input.meta || browserFunctionKeys.has(input.key) ||\n (input.ctrl && (input.key === \"Tab\" || input.key === \"F4\" || browserCtrlKeys.has(input.key.toLowerCase()) ||\n (input.shift && input.key.length === 1))) || (input.alt && !input.ctrl)),\n route: InputRoute.Browser\n },\n {\n id: \"terminal.keys\",\n match: input => input.type === \"key\" && (terminalKeys.has(input.key) || (input.ctrl && input.key.length === 1)),\n route: InputRoute.Application\n },\n {\n id: \"clipboard.context-click\",\n match: (input, context) => input.type === \"pointer\" && input.button === \"right\" && !input.meta &&\n (!context.mouseCaptured || input.shift || context.historical || context.readOnly),\n action: TerminalAction.CopyOrPaste\n }\n ];\n}\n\nfunction synchronous(callback: unknown, name: string): void {\n if (typeof callback !== \"function\" || callback.constructor.name === \"AsyncFunction\")\n throw new TypeError(`${name} must be a synchronous function`);\n}\n\n/** Resolves intent only. DOM cancellation and action execution belong to the mounted view. */\nexport class InputPolicy {\n #bindings: InputBinding[];\n #intercept: InputPolicyOptions[\"onInput\"];\n #actions: Set<string>;\n\n constructor({ inputBindings = [], onInput, actions = {} }: InputPolicyOptions = {}) {\n if (!Array.isArray(inputBindings)) throw new TypeError(\"inputBindings must be an array\");\n if (!actions || typeof actions !== \"object\" || Array.isArray(actions)) throw new TypeError(\"actions must be an object\");\n this.#actions = new Set(Object.values(TerminalAction));\n for (const [name, handler] of Object.entries(actions)) {\n if (!name || this.#actions.has(name) || typeof handler !== \"function\")\n throw new TypeError(`Invalid or reserved action: ${name}`);\n this.#actions.add(name);\n }\n if (onInput !== undefined) synchronous(onInput, \"onInput\");\n this.#intercept = onInput;\n const defaults = defaultInputBindings();\n const ids = new Set();\n const overrides = inputBindings.map((binding: InputBindingOverride): InputBinding | null => {\n if (!binding || typeof binding.id !== \"string\" || !binding.id || ids.has(binding.id))\n throw new TypeError(\"Each input binding needs a unique, nonempty id\");\n ids.add(binding.id);\n if (binding.remove === true) {\n if (!defaults.some(item => item.id === binding.id))\n throw new TypeError(`Cannot remove unknown default binding: ${binding.id}`);\n if (Object.keys(binding).some(key => ![\"id\", \"remove\"].includes(key)))\n throw new TypeError(`Removed binding ${binding.id} must contain only id and remove`);\n return null;\n }\n synchronous(binding.match, `Binding ${binding.id}.match`);\n if (binding.when !== undefined) synchronous(binding.when, `Binding ${binding.id}.when`);\n this.#decision(binding);\n return Object.freeze({ ...binding });\n }).filter((binding): binding is InputBinding => binding !== null);\n this.#bindings = [...overrides, ...defaults.filter(binding => !ids.has(binding.id))];\n }\n\n get bindings() { return this.#bindings.map(binding => ({ ...binding })); }\n\n #decision(value: unknown): InputDecision {\n if (isRoute(value)) return { route: value };\n if (!isRecord(value) || typeof value.then === \"function\")\n throw new TypeError(\"Input routing must synchronously return a route or action\");\n const hasAction = Object.hasOwn(value, \"action\");\n const hasRoute = Object.hasOwn(value, \"route\");\n if (hasAction === hasRoute) throw new TypeError(\"Specify exactly one action or route\");\n if (hasRoute) {\n if (!isRoute(value.route)) throw new TypeError(`Unknown input route: ${String(value.route)}`);\n return { route: value.route };\n }\n if (!isActionHandler(value.action) && (typeof value.action !== \"string\" || !this.#actions.has(value.action)))\n throw new TypeError(`Unknown terminal action: ${String(value.action)}`);\n return { action: value.action, args: value.args };\n }\n\n resolve(input: Readonly<TerminalInput>, context: TerminalInputContext): InputDecision {\n const intercepted = this.#intercept?.(input, context);\n if (intercepted !== undefined) {\n const decision = this.#decision(intercepted);\n if (decision.route !== InputRoute.Continue) return decision;\n }\n for (const binding of this.#bindings) {\n const matched = binding.match(input, context);\n if (typeof matched !== \"boolean\") throw new TypeError(`Binding ${binding.id}.match must return a boolean`);\n if (!matched) continue;\n if (binding.when) {\n const enabled = binding.when(context, input);\n if (typeof enabled !== \"boolean\") throw new TypeError(`Binding ${binding.id}.when must return a boolean`);\n if (!enabled) continue;\n }\n const decision = this.#decision(binding);\n if (decision.route !== InputRoute.Continue) return decision;\n }\n return { route: InputRoute.Continue };\n }\n}\n\nfunction isRoute(value: unknown): value is InputRouteValue {\n return typeof value === \"string\" && [...routes].some(route => route === value);\n}\n\nfunction isActionHandler(value: unknown): value is InputActionHandler {\n return typeof value === \"function\";\n}\n\nexport function inputModifiers(event: Pick<KeyboardEvent, \"ctrlKey\" | \"altKey\" | \"shiftKey\" | \"metaKey\">): InputModifiers {\n return { ctrl: !!event.ctrlKey, alt: !!event.altKey, shift: !!event.shiftKey, meta: !!event.metaKey };\n}\nimport type { InputActionHandler, InputBinding, InputBindingOverride, InputDecision, InputModifiers,\n InputPolicyOptions, InputRouteValue, TerminalInput, TerminalInputContext } from \"./types.js\";\nimport { isRecord } from \"./validation.js\";\n", "import { cellPoint, WheelAccumulator, SelectionGesture } from \"./selection-input.js\";\nimport { InputRoute, inputModifiers } from \"./input-policy.js\";\nimport type { GestureState } from \"./selection-input.js\";\nimport type { InputDecision, InputRouteValue, MouseTrackingMode, PointerButton, SelectionMode,\n TerminalInput, TerminalPoint } from \"./types.js\";\nimport type { CellPosition, MouseButton, MouseCommand } from \"./wire-types.js\";\n\nconst buttons: readonly (readonly [PointerButton, number])[] = [[\"left\", 1], [\"middle\", 4], [\"right\", 2]];\nconst pointerButtons: readonly PointerButton[] = [\"left\", \"middle\", \"right\"];\ninterface SelectionClick { point: TerminalPoint; mode: SelectionMode; extend: boolean; dragged: boolean }\nexport interface PointerHyperlink {\n id: string;\n target: string;\n activation?: \"modifierClick\" | \"click\";\n}\ninterface HyperlinkClick { link: PointerHyperlink; input: TerminalInput; x: number; y: number; dragged: boolean }\ninterface MouseInspection {\n lineRenditions?: () => readonly number[];\n state?: () => Omit<GestureState, \"tracking\">;\n begin?: (point: TerminalPoint, selection: { mode: SelectionMode; extend: boolean }) => void;\n extend?: (point: TerminalPoint) => void;\n scroll?: (delta: number, endpoint?: TerminalPoint) => void;\n end?: (cancelled: boolean) => void;\n resolve?: (input: TerminalInput) => InputDecision;\n execute?: (decision: Extract<InputDecision, { action: unknown }>, input: TerminalInput) => void;\n hyperlink?: (point: TerminalPoint) => PointerHyperlink | null;\n hoverHyperlink?: (link: PointerHyperlink | null) => void;\n openHyperlink?: (link: PointerHyperlink, input: TerminalInput) => void;\n}\nexport interface MouseCapture {\n update(columns: number, rows: number, tracking: MouseTrackingMode): void;\n refresh(): void;\n cancel(): void;\n dispose(): void;\n}\n\n/** Capture input intent only; the server chooses and encodes the mouse protocol. */\nexport function captureMouse(canvas: HTMLCanvasElement, send: (command: MouseCommand) => void,\n focus: () => void, inspection: MouseInspection = {}): MouseCapture {\n const listeners = new AbortController();\n const options = { signal: listeners.signal };\n let columns = 1, rows = 1;\n let tracking: MouseTrackingMode = 0;\n let pointerId: number | null = null;\n const pressed = new Set<PointerButton>();\n let lastPoint: CellPosition | undefined;\n let pendingMove: MouseCommand | undefined;\n let lastMove: string | undefined;\n let scheduled: number | undefined;\n const wheel = new WheelAccumulator();\n const gesture = new SelectionGesture();\n let wheelOwner: \"local\" | \"app\" | undefined;\n let pointerEvent: PointerEvent | undefined;\n let autoScroll: ReturnType<typeof setTimeout> | undefined;\n let click = { count: 0, time: 0, x: -1, y: -1 };\n let selectionClick: SelectionClick | undefined;\n let completedClick: SelectionClick | undefined;\n let routedGesture: InputRouteValue | undefined;\n let contextMenuRoute: InputRouteValue | undefined;\n let hyperlinkClick: HyperlinkClick | undefined;\n let hoverEvent: PointerEvent | undefined;\n let hoverModifiers: Pick<MouseEvent, \"ctrlKey\" | \"metaKey\" | \"altKey\" | \"shiftKey\"> | undefined;\n let hoveredLinkId: string | undefined;\n const originalTitle = canvas.title;\n const originalCursor = canvas.style.cursor;\n const state = () => ({ tracking, ...inspection.state?.() });\n\n function point(event: MouseEvent, clamp = false): CellPosition | null {\n const position = cellPoint(event, canvas.getBoundingClientRect(), columns, rows, clamp);\n if (position && inspection.lineRenditions?.()[position.y])\n position.x = Math.min(Math.max(0, Math.floor(columns / 2) - 1), Math.floor(position.x / 2));\n return position;\n }\n\n function refreshHover(modifiers = hoverModifiers) {\n if (!inspection.hyperlink) return;\n hoverModifiers = modifiers;\n const position = hoverEvent && point(hoverEvent);\n const link = position ? inspection.hyperlink(position) : null;\n canvas.title = link ? `${link.target}\\n${link.activation === \"click\" ? \"Click\" : \"Ctrl/Cmd+click\"} to activate link` : originalTitle;\n canvas.style.cursor = link && modifiers && (link.activation === \"click\" || modifiers.ctrlKey || modifiers.metaKey) &&\n !modifiers.altKey && !modifiers.shiftKey ? \"pointer\" : originalCursor;\n if (hyperlinkClick && hyperlinkClick.link.id !== link?.id) hyperlinkClick.dragged = true;\n if (hoveredLinkId !== link?.id) {\n hoveredLinkId = link?.id;\n inspection.hoverHyperlink?.(link);\n }\n }\n\n function updateAutoScroll() {\n clearTimeout(autoScroll);\n autoScroll = undefined;\n if (gesture.owner !== \"local\" || !pointerEvent) return;\n const bounds = canvas.getBoundingClientRect();\n const distance = pointerEvent.clientY < bounds.top ? pointerEvent.clientY - bounds.top\n : pointerEvent.clientY >= bounds.bottom ? pointerEvent.clientY - bounds.bottom + 1 : 0;\n if (!distance) return;\n autoScroll = setTimeout(() => {\n autoScroll = undefined;\n if (!pointerEvent) return;\n const position = point(pointerEvent, true);\n if (gesture.owner === \"local\" && position) {\n if (selectionClick) selectionClick.dragged = true;\n click.count = 0;\n const lines = Math.sign(distance) * Math.min(8, Math.max(1, Math.ceil(Math.abs(distance) / (bounds.height / rows))));\n inspection.scroll?.(lines, gesture.scrollPoint(position));\n updateAutoScroll();\n }\n }, 60);\n }\n\n function flushMove() {\n if (scheduled !== undefined) cancelAnimationFrame(scheduled);\n scheduled = undefined;\n if (pendingMove) send(pendingMove);\n pendingMove = undefined;\n }\n\n function changeButtons(event: PointerEvent, position: CellPosition): void {\n for (const [button, mask] of buttons) {\n const down = (event.buttons & mask) !== 0;\n if (down === pressed.has(button)) continue;\n flushMove();\n if (down) pressed.add(button);\n else pressed.delete(button);\n if (down || tracking !== 9)\n send({ type: \"mouse\", action: down ? \"down\" : \"up\", button, ...position });\n lastMove = undefined;\n }\n }\n\n function cancel(report = true, cancelled = true) {\n inspection.end?.(cancelled);\n clearTimeout(autoScroll);\n autoScroll = undefined;\n pointerEvent = undefined;\n selectionClick = undefined;\n completedClick = undefined;\n hyperlinkClick = undefined;\n gesture.end();\n routedGesture = undefined;\n if (report) flushMove();\n else {\n if (scheduled !== undefined) cancelAnimationFrame(scheduled);\n scheduled = undefined;\n pendingMove = undefined;\n }\n if (report && tracking !== 9 && lastPoint) {\n for (const button of pressed)\n send({ type: \"mouse\", action: \"up\", button, ...lastPoint });\n }\n pressed.clear();\n const captured = pointerId;\n pointerId = null;\n if (captured !== null && canvas.hasPointerCapture(captured))\n canvas.releasePointerCapture(captured);\n lastMove = undefined;\n wheel.reset();\n wheelOwner = undefined;\n }\n\n canvas.addEventListener(\"pointerdown\", event => {\n if (event.defaultPrevented && pointerId === null) return;\n if (event.pointerType !== \"mouse\" || ![0, 1, 2].includes(event.button)) return;\n const position = point(event);\n if (!position) return;\n if (pointerId !== null) {\n if (hyperlinkClick) hyperlinkClick.dragged = true;\n if (routedGesture !== InputRoute.Browser) event.preventDefault();\n if ((gesture.owner === \"app\" || routedGesture === InputRoute.Application) && pointerId === event.pointerId)\n changeButtons(event, position);\n return;\n }\n focus();\n const input: TerminalInput = { type: \"pointer\", button: pointerButtons[event.button],\n point: Object.freeze({ ...position }), ...inputModifiers(event) };\n const decision = inspection.resolve?.(input) ?? { route: InputRoute.Continue };\n let route = decision.action !== undefined ? InputRoute.Consume : decision.route;\n if (route === InputRoute.Continue && event.button === 0 && !event.altKey && !event.shiftKey) {\n const link = inspection.hyperlink?.(position);\n if (link && (link.activation === \"click\" || event.ctrlKey || event.metaKey)) {\n hyperlinkClick = { link, input, x: event.clientX, y: event.clientY, dragged: false };\n route = InputRoute.Consume;\n }\n }\n contextMenuRoute = event.button === 2 ? route : undefined;\n if (hyperlinkClick) contextMenuRoute = InputRoute.Consume;\n hoverEvent = event;\n refreshHover(event);\n if (route !== InputRoute.Continue) {\n completedClick = selectionClick = undefined;\n click.count = 0;\n routedGesture = route;\n pointerId = event.pointerId;\n lastPoint = position;\n canvas.setPointerCapture(pointerId);\n if (route !== InputRoute.Browser) event.preventDefault();\n if (route === InputRoute.Application) flushMove();\n else {\n if (scheduled !== undefined) cancelAnimationFrame(scheduled);\n scheduled = undefined;\n pendingMove = undefined;\n }\n if (route === InputRoute.Application) changeButtons(event, position);\n if (decision.action !== undefined) inspection.execute?.(decision, input);\n return;\n }\n // Keep focus on the hidden keyboard input instead of the canvas.\n event.preventDefault();\n if (event.metaKey) return;\n const now = performance.now();\n click.count = now - click.time < 500 && position.x === click.x && position.y === click.y\n ? click.count % 3 + 1 : 1;\n click = { count: click.count, time: now, x: position.x, y: position.y };\n const start = gesture.begin({ button: event.button, shiftKey: event.shiftKey, altKey: event.altKey,\n detail: event.detail || click.count }, position, state());\n if (!start) return;\n pointerId = event.pointerId;\n pointerEvent = event;\n lastPoint = position;\n completedClick = undefined;\n canvas.setPointerCapture(pointerId);\n if (start.owner === \"local\") {\n if (scheduled !== undefined) cancelAnimationFrame(scheduled);\n scheduled = undefined;\n pendingMove = undefined;\n lastMove = undefined;\n selectionClick = { point: position, mode: start.mode, extend: start.extend, dragged: false };\n inspection.begin?.(position, start);\n }\n else changeButtons(event, position);\n }, options);\n\n canvas.addEventListener(\"pointermove\", event => {\n if (event.pointerType !== \"mouse\") return;\n if (pointerId === null && event.buttons) return;\n if (pointerId !== null && pointerId !== event.pointerId) return;\n hoverEvent = event;\n refreshHover(event);\n if (hyperlinkClick && Math.hypot(event.clientX - hyperlinkClick.x, event.clientY - hyperlinkClick.y) >= 4)\n hyperlinkClick.dragged = true;\n const position = point(event, pointerId !== null);\n if (!position) return;\n lastPoint = position;\n if (routedGesture && routedGesture !== InputRoute.Application) return;\n if (gesture.owner === \"local\") {\n pointerEvent = event;\n const previous = gesture.endpoint;\n const endpoint = gesture.move(position);\n if (endpoint && previous && (endpoint.x !== previous.x || endpoint.y !== previous.y)) {\n click.count = 0;\n if (selectionClick) selectionClick.dragged = true;\n inspection.extend?.(endpoint);\n }\n updateAutoScroll();\n return;\n }\n if (!tracking || (!routedGesture && gesture.owner === null && (state().historical || state().readOnly || event.shiftKey))) return;\n if (pointerId === event.pointerId) changeButtons(event, position);\n if (event.metaKey || (tracking !== 1003 && !(tracking === 1002 && pressed.size))) return;\n const button = buttons.find(([name]) => pressed.has(name))?.[0] ?? \"none\";\n const move: MouseCommand = { type: \"mouse\", action: \"move\", button, ...position };\n const key = JSON.stringify(move);\n if (key === lastMove) return;\n lastMove = key;\n pendingMove = move;\n if (scheduled === undefined) scheduled = requestAnimationFrame(flushMove);\n }, options);\n\n canvas.addEventListener(\"pointerup\", event => {\n if (pointerId !== event.pointerId) return;\n if (hyperlinkClick) {\n event.preventDefault();\n const link = hyperlinkClick;\n const position = point(event);\n const activate = event.button === 0 && event.buttons === 0 && !link.dragged &&\n Math.hypot(event.clientX - link.x, event.clientY - link.y) < 4 &&\n position && inspection.hyperlink?.(position)?.id === link.link.id;\n if (event.buttons === 0) cancel(false, false);\n else link.dragged = true;\n if (activate) inspection.openHyperlink?.(link.link, link.input);\n return;\n }\n const position = point(event, true) ?? lastPoint;\n if (routedGesture) {\n if (routedGesture === InputRoute.Application && position) changeButtons(event, position);\n if (event.buttons === 0) cancel(routedGesture === InputRoute.Application);\n return;\n }\n if (gesture.owner === \"local\") {\n if (position && gesture.endpoint && (position.x !== gesture.endpoint.x || position.y !== gesture.endpoint.y)) {\n if (selectionClick) selectionClick.dragged = true;\n const endpoint = gesture.move(position);\n if (endpoint) inspection.extend?.(endpoint);\n }\n const completed = selectionClick;\n cancel(false, false);\n completedClick = completed;\n return;\n }\n if (position) changeButtons(event, position);\n if (!pressed.size) cancel();\n }, options);\n canvas.addEventListener(\"click\", event => {\n const completed = completedClick;\n completedClick = undefined;\n if (!completed || completed.dragged || !Number.isInteger(event.detail) || event.detail < 1) return;\n click.count = event.detail;\n // Some browsers expose native multiclick counts only on click, not pointerdown.\n const mode = event.detail >= 3 ? \"line\" : event.detail === 2 ? \"word\" : \"character\";\n if (!completed.extend && completed.mode !== \"rectangle\" && mode !== completed.mode)\n inspection.begin?.(completed.point, { mode, extend: false });\n }, options);\n canvas.addEventListener(\"pointercancel\", () => cancel(), options);\n canvas.addEventListener(\"pointerleave\", () => {\n hoverEvent = undefined;\n refreshHover();\n }, options);\n canvas.addEventListener(\"lostpointercapture\", () => {\n if (pointerId !== null) cancel();\n }, options);\n window.addEventListener(\"blur\", () => {\n cancel();\n hoverEvent = undefined;\n refreshHover();\n }, options);\n window.addEventListener(\"keydown\", event => refreshHover(event), { ...options, capture: true });\n window.addEventListener(\"keyup\", event => refreshHover(event), { ...options, capture: true });\n canvas.addEventListener(\"contextmenu\", event => {\n if (contextMenuRoute !== undefined && contextMenuRoute !== InputRoute.Continue) {\n const route = contextMenuRoute;\n contextMenuRoute = undefined;\n if (route !== InputRoute.Browser) event.preventDefault();\n return;\n }\n if (tracking || gesture.owner === \"local\") event.preventDefault();\n }, options);\n canvas.addEventListener(\"wheel\", event => {\n if (hyperlinkClick) hyperlinkClick.dragged = true;\n const input: TerminalInput = { type: \"wheel\", deltaX: event.deltaX, deltaY: event.deltaY,\n deltaMode: event.deltaMode, point: point(event), ...inputModifiers(event) };\n const decision: InputDecision = pointerId === null\n ? inspection.resolve?.(input) ?? { route: InputRoute.Continue }\n : { route: routedGesture ?? InputRoute.Continue };\n if (decision.route === InputRoute.Browser) return;\n if (decision.action !== undefined || decision.route === InputRoute.Consume) {\n event.preventDefault();\n if (decision.action !== undefined) inspection.execute?.(decision, input);\n return;\n }\n // Ctrl+wheel (including trackpad pinch) remains browser zoom.\n if (decision.route !== InputRoute.Application && (event.ctrlKey || event.metaKey)) return;\n const owner = decision.route === InputRoute.Application ? \"app\" : gesture.wheelOwner(event, state());\n if (owner === \"app\" && tracking === 9) return;\n const position = point(gesture.owner === \"local\" && pointerEvent ? pointerEvent : event, gesture.owner === \"local\");\n if (!position) return;\n event.preventDefault();\n flushMove();\n const bounds = canvas.getBoundingClientRect();\n if (wheelOwner !== owner) wheel.reset();\n wheelOwner = owner;\n const { x: horizontal, y: vertical } = wheel.take(event, bounds, rows);\n if (owner === \"local\") {\n if (vertical) {\n if (selectionClick) selectionClick.dragged = true;\n click.count = 0;\n inspection.scroll?.(vertical, gesture.scrollPoint(position));\n }\n return;\n }\n const wheelDirections: [number, MouseButton, MouseButton][] = [\n [vertical, \"wheelUp\", \"wheelDown\"],\n [horizontal, \"wheelLeft\", \"wheelRight\"]\n ];\n for (const [steps, negative, positive] of wheelDirections) {\n if (steps) send({\n type: \"mouse\", action: \"wheel\", button: steps < 0 ? negative : positive,\n count: Math.min(32, Math.abs(steps)), ...position\n });\n }\n }, { ...options, passive: false });\n\n return {\n update(nextColumns, nextRows, nextTracking) {\n if (columns !== nextColumns || rows !== nextRows || tracking !== nextTracking) {\n if (lastPoint) {\n lastPoint = { ...lastPoint,\n x: Math.min(lastPoint.x, nextColumns - 1),\n y: Math.min(lastPoint.y, nextRows - 1)\n };\n }\n // Application mode changes do not transfer ownership mid-gesture.\n if (columns !== nextColumns || rows !== nextRows) cancel(nextTracking !== 0);\n columns = nextColumns;\n rows = nextRows;\n tracking = nextTracking;\n }\n refreshHover();\n },\n refresh() { refreshHover(); },\n cancel() { cancel(); },\n dispose() {\n cancel(false);\n listeners.abort();\n canvas.title = originalTitle;\n canvas.style.cursor = originalCursor;\n }\n };\n}\n", "export function defaultWorkerUrl(kind: \"terminal\" | \"link-detection\"): URL {\n const url = new URL(import.meta.url);\n url.hash = `hex1b-${kind}-worker`;\n return url;\n}\n", "import { captureMouse } from \"./mouse-input.js\";\nimport { defaultWorkerUrl } from \"./worker-url.js\";\nimport { selectTransport, workerWebSocketUrl } from \"./websocket-transport.js\";\nimport { TransportSession } from \"./transport-session.js\";\nimport type { TerminalTransport } from \"./transport-types.js\";\nimport { randomId } from \"./random-id.js\";\nimport { normalizeFont } from \"./terminal-font.js\";\nimport { normalizeRenderer } from \"./renderer-options.js\";\nimport { defaultDarkPalette, defaultLightPalette, normalizeColorMode, normalizePalette } from \"./terminal-palette.js\";\nimport type { TerminalColorMode, TerminalPalette } from \"./terminal-palette.js\";\nimport { paletteScrollbarColors } from \"./scrollbar-colors.js\";\nimport { dimensions, normalizeSizing, requestedGrid } from \"./terminal-sizing.js\";\nimport { HistoryState } from \"./history-state.js\";\nimport { MarkerState } from \"./marker-state.js\";\nimport { normalizePadding, contentSpace, terminalLayout } from \"./terminal-layout.js\";\nimport { normalizeScrollbar, ScrollbarController } from \"./scrollbar.js\";\nimport { ScrollbarTooltip } from \"./scrollbar-tooltip.js\";\nimport type { TerminalInsets, TerminalLayout, TerminalMarker, TerminalMarkerOptions, TerminalPadding,\n TerminalScrollbar, TerminalScrollbarConfiguration } from \"./scrollbar-types.js\";\nimport { terminalThemeCss } from \"./terminal-theme.js\";\nimport { InputPolicy, InputRoute, TerminalAction, inputModifiers } from \"./input-policy.js\";\nimport { assertCommandSize } from \"./protocol.js\";\nimport { SelectionUI } from \"./selection-ui.js\";\nimport { Hyperlinks } from \"./hyperlinks.js\";\nimport { LinkDetection } from \"./link-detection.js\";\nimport { normalizeLinks } from \"./link-options.js\";\nimport type { DetectedLink, LinkDetectionSnapshot } from \"./link-detection.js\";\nimport type { MouseCapture, PointerHyperlink } from \"./mouse-input.js\";\nimport type { CopySelectionOptions, InputActionHandler, InputDecision, InputBinding,\n TerminalActionName, TerminalGeometry, TerminalInput, TerminalInputContext, TerminalPeer,\n TerminalRendererPreference, TerminalSelection, TerminalSizing, TerminalSizingState, TerminalStats, TerminalViewport,\n TerminalProgress, TerminalShellIntegration, TerminalWorkingDirectory, TerminalCommandMark,\n TerminalLinkOptions, TerminalLinkActivation, TerminalPoint,\n WebTerminalHandle, WebTerminalOptions } from \"./types.js\";\nimport type { HyperlinkRange, InputCommand, TerminalCommand, WorkerInputMessage, WorkerOutputMessage } from \"./wire-types.js\";\nimport { errorMessage, isRecord } from \"./validation.js\";\nexport { InputRoute, TerminalAction, defaultInputBindings } from \"./input-policy.js\";\n\nfunction requiredElement<T extends Element>(root: ParentNode, selector: string, type: new () => T): T {\n const element = root.querySelector(selector);\n if (!(element instanceof type)) throw new Error(`Missing terminal element: ${selector}`);\n return element;\n}\n\n/**\n * First-party HWT1 client. Owns only the element it appends, not the caller's\n * container or the server terminal. The HWT1 wire and this spike API evolve together.\n */\nexport class WebTerminal implements WebTerminalHandle {\n readonly element: HTMLDivElement;\n #options: WebTerminalOptions;\n #transport: TerminalTransport;\n #transportSession: TransportSession | undefined;\n #transportFrame: ReturnType<typeof Promise.withResolvers<void>> | undefined;\n #renderer: TerminalRendererPreference;\n #colorMode: TerminalColorMode;\n #palettes: { light: TerminalPalette; dark: TerminalPalette };\n #colorScheme: MediaQueryList | undefined;\n #systemColorChanged = () => {\n if (!this.#disposed && this.#colorMode === \"system\") this.#applyPalette();\n };\n // DOM and worker fields are initialized by mount before a handle is returned.\n #worker!: Worker;\n #surface!: HTMLDivElement;\n #canvas!: HTMLCanvasElement;\n #input!: HTMLTextAreaElement;\n #mouse: MouseCapture | undefined;\n #observer: ResizeObserver | undefined;\n #listeners = new AbortController();\n #size = { width: 0, height: 0 };\n #sizing = normalizeSizing();\n #geometry: TerminalGeometry = { columns: 80, rows: 24, cellWidth: 10, cellHeight: 20, mouseTracking: 0 };\n #peer: TerminalPeer = { id: null, primaryId: null, isPrimary: false };\n #connected = false;\n #closed = false;\n #readOnly: boolean;\n #preserveOnDisconnect: boolean;\n #disposed = false;\n #hasGeometry = false;\n #resizeTimer: ReturnType<typeof setTimeout> | undefined;\n #lastRequested: string | undefined;\n #compositionTimer: ReturnType<typeof setTimeout> | undefined;\n #resetComposition: (() => void) | undefined;\n #ready = Promise.withResolvers<WebTerminal>();\n #readyTimer: ReturnType<typeof setTimeout> | undefined;\n #stats: TerminalStats = {};\n #screenText = \"\";\n #title = \"\";\n #hasTitle = false;\n #progress: TerminalProgress = { state: \"none\", percentage: null };\n #shellIntegration: TerminalShellIntegration = { phase: \"unknown\", lastExitCode: null };\n #workingDirectory: TerminalWorkingDirectory = { uri: null, host: null, path: null };\n #commandMark: TerminalCommandMark | null = null;\n #hasActivity = false;\n #history: HistoryState;\n #markerState: MarkerState;\n #padding: TerminalInsets;\n #scrollbar: false | TerminalScrollbarConfiguration;\n #layout: TerminalLayout;\n #scrollbarController: ScrollbarController | undefined;\n #scrollbarTooltip: ScrollbarTooltip | undefined;\n #layoutNotification = false;\n #markerNotification = false;\n #highlights!: HTMLDivElement;\n #inspection!: HTMLDivElement;\n #inspectionError = \"\";\n #copySerial = 0;\n #copying = false;\n #policy: InputPolicy;\n #actions: Map<string, InputActionHandler>;\n #clipboardAction = false;\n #inputSerial = 0;\n #selectionUI: SelectionUI | undefined;\n #selectionOverlay!: HTMLDivElement;\n #selectionUIError = \"\";\n #canvasSize = { width: 0, height: 0 };\n #hyperlinks = new Hyperlinks();\n #lineRenditions: readonly number[] = [];\n #links: false | TerminalLinkOptions;\n #linkDetector: LinkDetection;\n #linkGeneration = 1;\n #linkRevision = 0;\n #linkSerial = 0;\n #linkSnapshot: LinkDetectionSnapshot | undefined;\n #osc8Rows = new Map<number, HyperlinkRange[]>();\n #detectedLinks: readonly DetectedLink[] = [];\n #presentedLinks: readonly DetectedLink[] = [];\n #detectedRows = new Map<number, { startColumn: number; endColumn: number; link: DetectedLink }[]>();\n #hoveredLinkId: string | undefined;\n #pendingLinks: { revision: number; generation: number; serial: number; links: readonly DetectedLink[] } | undefined;\n\n /** Resolves after a connected terminal frame is presented. Supply signal to cancel mounting. */\n static async mount(container: HTMLElement, options: WebTerminalOptions): Promise<WebTerminal> {\n if (!(container instanceof HTMLElement)) throw new TypeError(\"A terminal container HTMLElement is required\");\n const transport = selectTransport(options);\n if (options.signal?.aborted) throw options.signal.reason;\n if (normalizeRenderer(options.renderer) === \"webgpu\" && (!window.isSecureContext || !navigator.gpu)) {\n throw new Error(\"The requested WebGPU renderer requires WebGPU over HTTPS or localhost\");\n }\n if (!window.Worker || !window.ResizeObserver || !window.OffscreenCanvas ||\n !HTMLCanvasElement.prototype.transferControlToOffscreen) {\n throw new Error(\"WebTerminal requires module workers, ResizeObserver, and a transferable OffscreenCanvas\");\n }\n const terminal = new WebTerminal(options, transport);\n try {\n await Promise.all([terminal.#ready.promise, Promise.resolve().then(() => terminal.#start(container))]);\n return terminal;\n } catch (error) {\n terminal.dispose();\n throw error;\n }\n }\n\n private constructor(options: WebTerminalOptions, transport = selectTransport(options)) {\n this.#options = options;\n this.#transport = transport;\n if (options.readOnly !== undefined && typeof options.readOnly !== \"boolean\")\n throw new TypeError(\"readOnly must be a boolean\");\n this.#readOnly = options.readOnly ?? false;\n if (options.preserveOnDisconnect !== undefined && typeof options.preserveOnDisconnect !== \"boolean\")\n throw new TypeError(\"preserveOnDisconnect must be a boolean\");\n this.#preserveOnDisconnect = options.preserveOnDisconnect ?? false;\n this.#renderer = normalizeRenderer(options.renderer);\n this.#colorMode = normalizeColorMode(options.colorMode);\n this.#palettes = {\n light: normalizePalette(options.lightModePalette === undefined ? defaultLightPalette : options.lightModePalette),\n dark: normalizePalette(options.darkModePalette === undefined ? defaultDarkPalette : options.darkModePalette),\n };\n this.#padding = normalizePadding(options.padding);\n this.#scrollbar = normalizeScrollbar(options.scrollbar);\n this.#layout = terminalLayout(this.#size, this.#geometry, false, this.#sizing, this.#padding, this.#scrollbar);\n if (options.workerUrl !== undefined && !(options.workerUrl instanceof URL) &&\n (typeof options.workerUrl !== \"string\" || !options.workerUrl.trim()))\n throw new TypeError(\"workerUrl must be a nonempty URL string or URL\");\n if (options.linkDetectionWorkerUrl !== undefined && !(options.linkDetectionWorkerUrl instanceof URL) &&\n (typeof options.linkDetectionWorkerUrl !== \"string\" || !options.linkDetectionWorkerUrl.trim()))\n throw new TypeError(\"linkDetectionWorkerUrl must be a nonempty URL string or URL\");\n if (options.onLinkDetectionError !== undefined && typeof options.onLinkDetectionError !== \"function\")\n throw new TypeError(\"onLinkDetectionError must be a function\");\n if (options.onSelectionUI !== undefined && (typeof options.onSelectionUI !== \"function\" ||\n options.onSelectionUI.constructor.name === \"AsyncFunction\"))\n throw new TypeError(\"onSelectionUI must be a synchronous event handler\");\n this.#policy = new InputPolicy(options);\n this.#actions = new Map(Object.entries(options.actions ?? {}));\n this.#links = normalizeLinks(options.links, new Set(this.#actions.keys()));\n this.#linkDetector = new LinkDetection({\n workerUrl: options.linkDetectionWorkerUrl === undefined ? undefined : new URL(options.linkDetectionWorkerUrl, location.href),\n actions: new Set(this.#actions.keys()),\n onChange: (revision, links) => {\n if (this.#disposed || !this.#connected || revision !== this.#linkRevision) return;\n this.#detectedLinks = links;\n this.#replacePresentedLinks([]);\n this.#requestLinkDecorations();\n },\n onError: error => {\n if (this.#disposed) return;\n try { this.#options.onStatus?.(`Link detection: ${error.message}`, \"error\"); }\n finally { this.#options.onLinkDetectionError?.(error); }\n },\n });\n this.#linkDetector.configure(this.#links ? this.#links.detection : false);\n this.#history = new HistoryState(command => this.#send(command), () => this.#inspectionChanged());\n this.#markerState = new MarkerState(command => this.#send(command), () => this.#markersChanged());\n this.element = document.createElement(\"div\");\n this.element.className = \"hex1b-terminal\";\n this.element.tabIndex = -1;\n this.element.style.cssText = \"width:100%;height:100%;min-width:0;min-height:0;contain:strict\";\n }\n\n get geometry(): TerminalGeometry { return { ...this.#geometry }; }\n get peer(): TerminalPeer { return { ...this.#peer }; }\n get connected() { return this.#connected; }\n get readOnly(): boolean { return this.#readOnly; }\n /** Current presented workload title; retained on disconnect/dispose. Treat as untrusted text. */\n get title(): string { return this.#title; }\n get progress(): TerminalProgress { return { ...this.#progress }; }\n get shellIntegration(): TerminalShellIntegration { return { ...this.#shellIntegration }; }\n get workingDirectory(): TerminalWorkingDirectory { return { ...this.#workingDirectory }; }\n get commandMark(): TerminalCommandMark | null { return this.#commandMark ? { ...this.#commandMark } : null; }\n get stats(): TerminalStats { return { ...this.#stats }; }\n get screenText() { return this.#screenText; }\n get sizing(): TerminalSizingState { return { ...this.#sizing }; }\n get layout(): TerminalLayout { return this.#layout; }\n get padding(): TerminalInsets { return this.#padding; }\n get scrollbar(): false | TerminalScrollbarConfiguration { return this.#scrollbar; }\n get markers(): readonly TerminalMarker[] { return this.#markerState.markers; }\n get inputBindings(): InputBinding[] { return this.#policy.bindings; }\n get viewport(): TerminalViewport {\n const viewport = this.#history.viewport;\n return { ...viewport, followTail: viewport.following,\n offset: viewport.available ? viewport.liveTop - viewport.top : 0 };\n }\n get selection(): TerminalSelection {\n const selection = this.#history.selection;\n return { ...selection, active: selection.status === \"valid\", pending: selection.status === \"pending\",\n copying: this.#copying, copyError: this.#inspectionError };\n }\n\n #start(container: HTMLElement): void {\n if (this.#options.signal?.aborted) throw this.#options.signal.reason;\n const url = workerWebSocketUrl(this.#transport);\n const scale = this.#options.scale === undefined || this.#options.scale === \"auto\"\n ? Math.min(3, Math.max(0.5, window.devicePixelRatio || 1)) : this.#options.scale;\n if (!Number.isFinite(scale) || scale < 0.5 || scale > 3) throw new RangeError(\"Backing scale must be 0.5-3 or 'auto'\");\n const font = normalizeFont(this.#options.font, location.href);\n this.#sizing = normalizeSizing(this.#options.sizing);\n const shadow = this.element.attachShadow({ mode: \"open\" });\n shadow.innerHTML = `\n <style>\n ${terminalThemeCss}\n :host { display: block; }\n .viewport { position: relative; width: 100%; height: 100%; display: flex; align-items: center; justify-content: center; overflow: hidden; }\n .surface { position: absolute; flex: none; overflow: hidden; }\n canvas { display: block; width: 100%; height: 100%; user-select: none; touch-action: none; }\n .scrollbar-canvas { position: absolute; inset: 0; pointer-events: none; }\n .scrollbar-tooltip-slot { position: absolute; inset: 0; display: block; pointer-events: none; }\n .scrollbar-accessibility { position: absolute; pointer-events: none; outline: none; }\n .highlights { position: absolute; inset: 0; pointer-events: none; overflow: hidden; }\n .highlight { position: absolute; }\n .selection-ui-slot { position: absolute; inset: 0; display: block; pointer-events: none; font: 11px/1.4 var(--cp-view-font-family); color: var(--cp-view-text); }\n .inspection { position: absolute; right: 4px; bottom: 4px; left: 4px; display: flex; flex-wrap: wrap; gap: 4px; justify-content: end; align-items: center; pointer-events: none; font: 11px/1.4 var(--cp-view-font-family); }\n .inspection [hidden] { display: none; }\n .inspection button, .inspection-message { font: inherit; background: var(--cp-view-surface); color: var(--cp-view-text); border: 1px solid var(--cp-view-border-strong); border-radius: .625rem; padding: 4px 8px; }\n .inspection button { pointer-events: auto; cursor: pointer; }\n .inspection button:disabled { opacity: .6; cursor: not-allowed; }\n .inspection button:hover { background: var(--cp-view-accent-soft); }\n .inspection button:focus-visible { outline: 2px solid var(--cp-view-accent); outline-offset: 2px; }\n .inspection-message { color: var(--cp-view-text-muted); max-width: 100%; }\n .inspection-message[data-level=error] { color: var(--cp-view-danger); }\n textarea { position: absolute; width: 1px; height: 1px; opacity: 0; left: 0; top: 0; padding: 0; border: 0; resize: none; }\n </style>\n <div class=\"viewport\"><div class=\"surface\">\n <canvas aria-hidden=\"true\"></canvas>\n <div class=\"highlights\" part=\"selection-highlights\" aria-hidden=\"true\"></div>\n <textarea autocomplete=\"off\" autocapitalize=\"off\" spellcheck=\"false\"></textarea>\n <slot name=\"selection-ui\" class=\"selection-ui-slot\"></slot>\n </div>\n <canvas class=\"scrollbar-canvas\" aria-hidden=\"true\"></canvas>\n <div class=\"scrollbar-accessibility\" role=\"scrollbar\" aria-label=\"Terminal scrollback\" aria-orientation=\"vertical\" tabindex=\"0\"></div>\n <slot name=\"scrollbar-tooltip\" class=\"scrollbar-tooltip-slot\"></slot>\n <div class=\"inspection\">\n <span class=\"inspection-message\" role=\"status\" aria-live=\"polite\" hidden></span>\n <button class=\"copy-selection\" part=\"selection-copy-button\" hidden disabled>Copy</button>\n <button class=\"return-live\" hidden>Return to live</button>\n </div></div>`;\n this.#surface = requiredElement(shadow, \".surface\", HTMLDivElement);\n this.#canvas = requiredElement(shadow, \"canvas\", HTMLCanvasElement);\n this.#input = requiredElement(shadow, \"textarea\", HTMLTextAreaElement);\n this.#highlights = requiredElement(shadow, \".highlights\", HTMLDivElement);\n this.#inspection = requiredElement(shadow, \".inspection\", HTMLDivElement);\n this.#canvas.id = `hex1b-content-${randomId()}`;\n const scrollbarAccessibility = requiredElement(shadow, \".scrollbar-accessibility\", HTMLDivElement);\n scrollbarAccessibility.setAttribute(\"aria-controls\", this.#canvas.id);\n const tooltipOverlay = document.createElement(\"div\");\n tooltipOverlay.slot = \"scrollbar-tooltip\";\n tooltipOverlay.className = \"hex1b-scrollbar-tooltip-overlay\";\n tooltipOverlay.style.cssText = \"position:relative;width:100%;height:100%;pointer-events:none\";\n this.element.append(tooltipOverlay);\n this.#scrollbarTooltip = new ScrollbarTooltip({\n overlay: tooltipOverlay, getDetails: id => this.getCommandMarkDetails(id),\n reportError: error => {\n this.#inspectionError = `Scrollbar tooltip: ${errorMessage(error)}`;\n this.#renderInspectionStatus();\n this.#options.onStatus?.(this.#inspectionError, \"error\");\n }\n });\n this.#scrollbarController = new ScrollbarController({\n element: requiredElement(shadow, \".viewport\", HTMLDivElement),\n canvas: requiredElement(shadow, \".scrollbar-canvas\", HTMLCanvasElement),\n accessibility: scrollbarAccessibility,\n getState: () => ({ layout: this.layout, viewport: this.viewport, markers: this.markers,\n connected: this.#connected, configuration: this.#scrollbar }),\n scrollToRow: top => this.scrollToRow(top),\n scrollToLive: () => this.scrollToLive(),\n scrollToMarker: id => this.scrollToMarker(id),\n onMarkerHover: marker => this.#scrollbarTooltip?.update(marker, this.layout,\n this.#scrollbar ? this.#scrollbar.tooltip : false),\n reportError: error => {\n this.#inspectionError = `Scrollbar: ${errorMessage(error)}`;\n this.#renderInspectionStatus();\n this.#options.onStatus?.(this.#inspectionError, \"error\");\n }\n });\n this.#selectionOverlay = document.createElement(\"div\");\n this.#selectionOverlay.slot = \"selection-ui\";\n this.#selectionOverlay.className = \"hex1b-selection-overlay\";\n this.#selectionOverlay.style.cssText = \"position:relative;width:100%;height:100%;pointer-events:none\";\n this.element.append(this.#selectionOverlay);\n this.#selectionUI = new SelectionUI({\n element: this.element, overlay: this.#selectionOverlay,\n button: requiredElement(this.#inspection, \".copy-selection\", HTMLButtonElement), signal: this.#listeners.signal,\n getState: () => ({ selection: this.selection, viewport: this.viewport, geometry: this.geometry,\n canvasSize: this.#canvasSize, connected: this.#connected, readOnly: this.#readOnly }),\n runAction: this.runAction.bind(this),\n onSelectionUI: this.#options.onSelectionUI,\n reportError: error => {\n this.#selectionUIError = error ? `Selection UI failed: ${errorMessage(error)}` : \"\";\n this.#selectionOverlay.hidden = !!error;\n this.#renderInspectionStatus();\n if (error) this.#options.onStatus?.(this.#selectionUIError, \"error\");\n }\n });\n this.#selectionUI.refresh();\n this.#input.setAttribute(\"aria-label\", this.#options.label || \"Terminal input. Click outside to use page controls.\");\n this.#input.disabled = true;\n container.append(this.element);\n const inspect = (operation: () => void) => {\n try { this.#inspectionError = \"\"; operation(); }\n catch (error) { this.#inspectionError = errorMessage(error); this.#inspectionChanged(); }\n };\n this.#mouse = captureMouse(this.#canvas, command => this.#inputCommand(command), () => this.focus(), {\n lineRenditions: () => this.#lineRenditions,\n state: () => ({ historical: !this.viewport.following || this.viewport.pending, readOnly: this.#readOnly,\n selection: this.selection }),\n begin: (point, selection) => inspect(() => this.#history.begin(point, selection)),\n extend: point => inspect(() => this.#history.extend(point)),\n scroll: (delta, endpoint) => inspect(() => {\n this.#history.scroll(delta, endpoint);\n this.#scrollbarController?.activity();\n }),\n end: cancelled => this.#history.endGesture(cancelled),\n resolve: input => this.#resolveInput(input),\n execute: (decision, input) => this.#executeInputAction(decision, input),\n hyperlink: point => this.#linkAt(point),\n hoverHyperlink: link => {\n this.#hoveredLinkId = link?.id;\n if (this.#links && this.#links.detection && this.#links.detection.decoration === \"hover\")\n this.#requestLinkDecorations();\n },\n openHyperlink: (link, input) => this.#activateLink(link, input),\n });\n this.#bindKeyboard();\n requiredElement(this.#inspection, \".return-live\", HTMLButtonElement).addEventListener(\"click\", () => {\n this.runAction(TerminalAction.ScrollToLive).catch(error => this.#actionFailed(error));\n }, { signal: this.#listeners.signal });\n requiredElement(this.#inspection, \".copy-selection\", HTMLButtonElement).addEventListener(\"click\", () => {\n this.runAction(TerminalAction.CopySelection).catch(error => this.#actionFailed(error));\n }, { signal: this.#listeners.signal });\n requiredElement(shadow, \".viewport\", HTMLDivElement).addEventListener(\"pointerdown\", event => {\n if (event.composedPath().includes(this.#selectionOverlay)) return;\n if ((event.target instanceof Element && event.target.closest(\"button\")) ||\n event.target === this.#canvas || event.target === this.#input) return;\n event.preventDefault();\n this.focus();\n }, { signal: this.#listeners.signal });\n this.#observer = new ResizeObserver(entries => {\n const { width, height } = entries[0].contentRect;\n const changed = width !== this.#size.width || height !== this.#size.height;\n this.#size = { width, height };\n this.#fit();\n if (changed) this.#queueResize();\n });\n // Observe the caller's outer box, never the fitted inner surface.\n this.#observer.observe(container);\n window.addEventListener(\"pagehide\", () => this.dispose(), { signal: this.#listeners.signal });\n this.#options.signal?.addEventListener(\"abort\", () => this.dispose(), { once: true, signal: this.#listeners.signal });\n this.#readyTimer = setTimeout(() => this.#fail(new Error(\"Timed out waiting for the terminal's first frame\")), 30000);\n this.#worker = this.#options.workerUrl === undefined\n ? new Worker(defaultWorkerUrl(\"terminal\"), { type: \"module\", name: \"Hex1b WebTerminal\" })\n : new Worker(new URL(this.#options.workerUrl, location.href), { type: \"module\", name: \"Hex1b WebTerminal\" });\n this.#worker.addEventListener(\"message\", (event: MessageEvent<WorkerOutputMessage>) => this.#message(event.data));\n this.#worker.addEventListener(\"error\", event => {\n event.preventDefault();\n this.#fail(new Error(event.message || \"Terminal worker failed\"));\n });\n this.#worker.addEventListener(\"messageerror\", () => this.#fail(new Error(\"Terminal worker message could not be decoded\")));\n const canvas = this.#canvas.transferControlToOffscreen();\n this.#colorScheme = window.matchMedia?.(\"(prefers-color-scheme: dark)\");\n this.#colorScheme?.addEventListener(\"change\", this.#systemColorChanged);\n this.#post({ type: \"init\", canvas, transport: url === undefined ? { type: \"custom\" } : { type: \"websocket\", url }, scale, font,\n renderer: this.#renderer, palette: this.#palettes[this.resolvedColorMode],\n preserveOnDisconnect: this.#preserveOnDisconnect }, [canvas]);\n this.#applyPalette();\n this.#postLinkConfiguration();\n }\n\n #message(message: WorkerOutputMessage): void {\n if (this.#disposed) return;\n if (message.type === \"transportConnect\") {\n if (this.#transportSession) { this.#fail(new Error(\"Transport is already initialized\")); return; }\n this.#transportSession = new TransportSession({\n onReady: () => this.#post({ type: \"transportConnected\" }),\n onFrame: buffer => {\n this.#transportFrame = Promise.withResolvers<void>();\n this.#post({ type: \"transportFrame\", buffer }, [buffer]);\n return this.#transportFrame.promise;\n },\n onClose: details => this.#post({ type: \"transportClosed\", details }),\n onError: error => this.#post({ type: \"transportError\", message: error.message })\n });\n this.#transportSession.start(this.#transport);\n } else if (message.type === \"transportSend\") {\n // An ACK can be emitted while accepting an inventory fragment. Release the\n // inbound bridge slot before the adapter can synchronously deliver its reply.\n void Promise.resolve(this.#transportFrame?.promise)\n .then(() => this.#transportSession?.send(message.control))\n .then(() => this.#post({ type: \"transportSent\" }))\n .catch(error => {\n if (!this.#disposed && !this.#transportSession?.closing)\n this.#post({ type: \"transportError\", message: errorMessage(error) });\n });\n } else if (message.type === \"transportReceived\") {\n this.#transportFrame?.resolve();\n this.#transportFrame = undefined;\n } else if (message.type === \"connected\") {\n this.#connected = true;\n this.#input.disabled = !this.#canInput();\n } else if (message.type === \"closed\") {\n if (this.#closed) return;\n this.#closed = true;\n clearTimeout(this.#readyTimer);\n try {\n this.#disconnect();\n if (!this.#disposed) {\n const details = Object.freeze({ ...message.details });\n if (this.#options.transport !== undefined) this.#options.onClose?.(details);\n else if (details.code !== undefined) this.#options.onClose?.(details);\n }\n } finally {\n this.#ready.reject(new Error(`Terminal ${message.details.code === undefined ? \"transport\" : \"WebSocket\"} closed (${\n message.details.code === undefined ? message.details.reason :\n `${message.details.code}${message.details.reason ? `: ${message.details.reason}` : \"\"}`}) before mounting completed`));\n }\n } else if (message.type === \"status\") {\n if (message.level === \"error\") {\n this.#stopTransport();\n this.#disconnect();\n this.#ready.reject(new Error(message.message));\n }\n this.#options.onStatus?.(message.message, message.level);\n } else if (message.type === \"geometry\") {\n this.#lineRenditions = message.lineRenditions ?? [];\n this.#linkRevision = message.revision;\n this.#osc8Rows.clear();\n for (const range of message.hyperlinks) {\n const row = this.#osc8Rows.get(range.row) ?? [];\n row.push(range);\n this.#osc8Rows.set(range.row, row);\n }\n this.#replacePresentedLinks([]);\n this.#pendingLinks = undefined;\n const first = !this.#hasGeometry;\n const geometryChanged = first || ([\"columns\", \"rows\", \"cellWidth\", \"cellHeight\", \"mouseTracking\"] as const)\n .some(field => this.#geometry[field] !== message[field]);\n this.#geometry = {\n columns: message.columns, rows: message.rows,\n cellWidth: message.cellWidth, cellHeight: message.cellHeight, mouseTracking: message.mouseTracking\n };\n this.#hasGeometry = true;\n const oldPeer = this.#peer;\n this.#peer = message.peer;\n this.#input.disabled = !this.#canInput();\n if (this.#canInput() && document.activeElement === this.element && !this.element.shadowRoot?.activeElement) this.focus();\n this.#hyperlinks.update(message.hyperlinks);\n if (geometryChanged || oldPeer.isPrimary !== this.#peer.isPrimary) this.#fit();\n if (!this.#peer.isPrimary) {\n clearTimeout(this.#resizeTimer);\n this.#resizeTimer = undefined;\n this.#lastRequested = undefined;\n }\n if (first || (!oldPeer.isPrimary && this.#peer.isPrimary)) this.#queueResize(true);\n if (this.#lastRequested === `${message.columns}x${message.rows}`) this.#lastRequested = undefined;\n if (Object.hasOwn(message, \"history\")) {\n this.#screenText = message.text;\n this.#markerState.accept(message.history, message.revision);\n this.#history.accept(message.history, message.revision);\n }\n if (message.linkGeneration === this.#linkGeneration) {\n if (message.linkSnapshot) this.#acceptLinkSnapshot(message.linkSnapshot);\n else {\n if (this.#linkSnapshot) this.#linkSnapshot = { ...this.#linkSnapshot, revision: message.revision };\n this.#linkDetector.advance(message.revision);\n }\n }\n this.#mouse?.update(message.columns, message.rows, message.mouseTracking);\n if (geometryChanged) this.#options.onGeometry?.(this.geometry);\n if (first) this.#options.onSizingChange?.(this.sizing);\n if (oldPeer.id !== this.#peer.id || oldPeer.primaryId !== this.#peer.primaryId || oldPeer.isPrimary !== this.#peer.isPrimary) {\n this.#options.onRoleChange?.(this.peer);\n }\n if (!this.#disposed && this.#connected && (this.#peer.id !== null || this.#peer.isPrimary)) {\n const titleChanged = !this.#hasTitle || this.#title !== message.title;\n const progressChanged = !this.#hasActivity || this.#progress.state !== message.progress.state ||\n this.#progress.percentage !== message.progress.percentage;\n const shellChanged = !this.#hasActivity || this.#shellIntegration.phase !== message.shellIntegration.phase ||\n this.#shellIntegration.lastExitCode !== message.shellIntegration.lastExitCode;\n const workingDirectoryChanged = !this.#hasActivity ||\n this.#workingDirectory.uri !== message.workingDirectory.uri;\n const commandMarkChanged = !this.#hasActivity || this.#commandMark?.phase !== message.commandMark?.phase ||\n this.#commandMark?.exitCode !== message.commandMark?.exitCode ||\n this.#commandMark?.rawParameters !== message.commandMark?.rawParameters;\n this.#title = message.title;\n this.#hasTitle = true;\n this.#progress = { ...message.progress };\n this.#shellIntegration = { ...message.shellIntegration };\n this.#workingDirectory = { ...message.workingDirectory };\n this.#commandMark = message.commandMark ? { ...message.commandMark } : null;\n this.#hasActivity = true;\n if (titleChanged) this.#options.onTitleChange?.(this.#title);\n if (!this.#disposed && progressChanged) this.#options.onProgressChange?.(this.progress);\n if (!this.#disposed && shellChanged) this.#options.onShellIntegrationChange?.(this.shellIntegration);\n if (!this.#disposed && workingDirectoryChanged) this.#options.onWorkingDirectoryChange?.(this.workingDirectory);\n if (!this.#disposed && commandMarkChanged) this.#options.onCommandMarkChange?.(this.commandMark);\n }\n } else if (message.type === \"linkSnapshot\") {\n if (message.generation === this.#linkGeneration && message.snapshot.revision === this.#linkRevision)\n this.#acceptLinkSnapshot(message.snapshot);\n } else if (message.type === \"linkDecorations\") {\n const pending = this.#pendingLinks;\n if (this.#connected && pending && pending.serial === message.serial &&\n pending.generation === message.generation && message.generation === this.#linkGeneration &&\n pending.revision === message.revision && message.revision === this.#linkRevision) {\n this.#pendingLinks = undefined;\n this.#replacePresentedLinks(pending.links);\n this.#mouse?.refresh();\n }\n } else if (message.type === \"history\") {\n this.#screenText = message.text;\n this.#markerState.accept(message.history, message.revision);\n this.#history.accept(message.history, message.revision);\n } else if (message.type === \"stats\") {\n this.#stats = message.stats;\n if (message.text !== undefined) this.#screenText = message.text;\n if (message.stats.revision > 0 && this.#hasTitle && this.#hasActivity && this.#connected &&\n (this.#peer.id !== null || this.#peer.isPrimary)) {\n clearTimeout(this.#readyTimer);\n this.#ready.resolve(this);\n }\n this.#options.onStats?.(this.stats, message.text);\n }\n }\n\n #fit() {\n const next = terminalLayout(this.#size, this.#geometry, this.#peer.isPrimary, this.#sizing, this.#padding, this.#scrollbar);\n const changed = JSON.stringify(next) !== JSON.stringify(this.#layout);\n this.#layout = next;\n const { width, height, left, top } = next.content;\n this.#surface.style.width = `${width}px`;\n this.#surface.style.height = `${height}px`;\n this.#surface.style.left = `${left}px`;\n this.#surface.style.top = `${top}px`;\n // Overlay positions use layout pixels, before any ancestor CSS transforms.\n const style = getComputedStyle(this.#surface);\n this.#canvasSize = { width: Number.parseFloat(style.width), height: Number.parseFloat(style.height) };\n this.#selectionUI?.refresh();\n this.#scrollbarController?.refresh();\n if (changed && !this.#layoutNotification) {\n this.#layoutNotification = true;\n queueMicrotask(() => {\n this.#layoutNotification = false;\n if (!this.#disposed) this.#options.onLayoutChange?.(this.layout);\n });\n }\n const dpr = window.devicePixelRatio || 1;\n this.#post({ type: \"viewport\", width: Math.ceil(width * dpr), height: Math.ceil(height * dpr) });\n }\n\n #fittedGrid() {\n return requestedGrid(contentSpace(this.#size, this.#padding, this.#scrollbar), this.#geometry, this.#sizing);\n }\n\n #queueResize(includeFixed = false) {\n if (this.#sizing.mode === \"fixed\" && !includeFixed) return;\n if (!this.#canInput() || !this.#peer.isPrimary || this.#resizeTimer !== undefined || this.#disposed) return;\n // Throttle (rather than debounce) so dragging a primary view updates peers live.\n this.#resizeTimer = setTimeout(() => {\n this.#resizeTimer = undefined;\n const grid = this.#fittedGrid();\n if (!grid || !this.#peer.isPrimary || !this.#canInput()) return;\n const key = `${grid.columns}x${grid.rows}`;\n if ((grid.columns === this.#geometry.columns && grid.rows === this.#geometry.rows) || key === this.#lastRequested) return;\n this.resize(grid.columns, grid.rows);\n }, 50);\n }\n\n #post(message: WorkerInputMessage, transfer: Transferable[] = []): void {\n this.#worker?.postMessage(message, transfer);\n }\n\n #send(command: TerminalCommand): void {\n if (!this.#connected || this.#disposed) throw new Error(\"Terminal view is not connected\");\n if (this.#readOnly && [\"input\", \"paste\", \"key\", \"mouse\", \"resize\", \"requestPrimary\"].includes(command.type))\n throw new Error(\"Terminal view does not accept input\");\n this.#post({ type: \"command\", command });\n }\n\n #inputCommand(command: InputCommand): void {\n if (this.#disposed || !this.#canInput()) return;\n assertCommandSize(command);\n this.#inputSerial++;\n if ([\"input\", \"paste\", \"key\"].includes(command.type) && this.viewport.available) {\n this.#mouse?.cancel();\n if (this.selection.status !== \"none\") this.clearSelection();\n if (!this.viewport.following || this.viewport.pending) this.scrollToLive();\n }\n this.#send(command);\n }\n\n #inspectionChanged() {\n const viewport = this.viewport;\n const selection = this.selection;\n this.#mouse?.refresh();\n if (selection.status === \"invalidated\") this.#mouse?.cancel();\n if (this.#highlights) {\n this.#highlights.replaceChildren(...selection.ranges.map(range => {\n const element = document.createElement(\"span\");\n element.className = \"highlight\";\n element.setAttribute(\"part\", \"selection-highlight\");\n const scaleX = this.#lineRenditions[range.row] ? 2 : 1;\n element.style.cssText = `left:${range.startColumn * scaleX / this.#geometry.columns * 100}%;top:${range.row / this.#geometry.rows * 100}%;width:${(range.endColumn - range.startColumn) * scaleX / this.#geometry.columns * 100}%;height:${100 / this.#geometry.rows}%`;\n return element;\n }));\n const live = requiredElement(this.#inspection, \".return-live\", HTMLButtonElement);\n live.hidden = !viewport.available || (viewport.following && !viewport.pending);\n live.disabled = !this.#connected;\n this.#renderInspectionStatus();\n }\n if (!this.#disposed) this.#selectionUI?.refresh();\n this.#scrollbarController?.refresh();\n this.#options.onViewportChange?.(viewport);\n this.#options.onSelectionChange?.(selection);\n }\n\n scrollLines(delta: number): void { this.#history.scroll(delta); this.#scrollbarController?.activity(); }\n scrollToRow(top: number): void { this.#history.scrollTo(top); this.#scrollbarController?.activity(); }\n scrollToLive() { this.#history.live(); this.#scrollbarController?.activity(); }\n scrollToMarker(id: string): Promise<void> {\n this.#scrollbarController?.activity();\n return this.#markerState.jump(id);\n }\n addMarker(options: TerminalMarkerOptions): Promise<TerminalMarker> { return this.#markerState.add(options); }\n removeMarker(id: string): Promise<void> { return this.#markerState.remove(id); }\n getCommandMarkDetails(id: string): Promise<TerminalCommandMark> { return this.#markerState.details(id); }\n\n #markersChanged(): void {\n this.#scrollbarController?.activity();\n if (this.#markerNotification) return;\n this.#markerNotification = true;\n queueMicrotask(() => {\n this.#markerNotification = false;\n if (!this.#disposed) this.#options.onMarkersChange?.(this.markers);\n });\n }\n\n setPadding(padding: TerminalPadding): void {\n if (this.#disposed) throw new Error(\"Terminal view is disposed\");\n this.#padding = normalizePadding(padding);\n this.#fit();\n this.#queueResize(true);\n }\n\n setScrollbar(scrollbar: TerminalScrollbar): void {\n if (this.#disposed) throw new Error(\"Terminal view is disposed\");\n this.#scrollbar = normalizeScrollbar(scrollbar);\n this.#scrollbarController?.cancel();\n this.#fit();\n this.#queueResize(true);\n }\n\n refreshScrollbar(): void {\n if (this.#disposed) throw new Error(\"Terminal view is disposed\");\n this.#scrollbarController?.invalidate();\n }\n clearSelection() { this.#inspectionError = \"\"; this.#history.clear(); }\n\n /** Re-notifies selection UI hosts after an external styling/policy change. */\n refreshSelectionUI() {\n if (this.#disposed) throw new Error(\"Terminal view is disposed\");\n this.#selectionUI?.refresh(true);\n }\n\n #renderInspectionStatus() {\n if (!this.#inspection) return;\n const selection = this.selection;\n const viewport = this.viewport;\n const status = requiredElement(this.#inspection, \".inspection-message\", HTMLSpanElement);\n status.textContent = this.#selectionUIError || this.#inspectionError || viewport.navigationError ||\n (selection.status === \"unavailable\" ? \"\" : selection.message) ||\n (viewport.available && !viewport.following ? `${viewport.liveTop - viewport.top} rows above live` : \"\");\n status.hidden = !status.textContent;\n status.dataset.level = this.#selectionUIError || this.#inspectionError || viewport.navigationError ||\n selection.status === \"invalidated\" ? \"error\" : \"info\";\n }\n\n #actionFailed(error: unknown): void {\n const failure = error instanceof Error ? error : new Error(String(error));\n this.#inspectionError = `Input action failed: ${failure.message}`;\n this.#inspectionChanged();\n this.#options.onInputError?.(failure);\n }\n\n async copySelection({ clear = false }: CopySelectionOptions = {}): Promise<string> {\n if (typeof clear !== \"boolean\") throw new TypeError(\"Copy clear must be a boolean\");\n const serial = ++this.#copySerial;\n const selectionId = this.selection.requestId;\n const generation = this.viewport.generation;\n this.#inspectionError = \"\";\n try {\n if (!this.#connected || this.#disposed) throw new Error(\"Terminal view is not connected\");\n if (!navigator.clipboard?.write || typeof ClipboardItem !== \"function\") {\n throw new Error(\"Clipboard writing is unavailable. Use a secure browser context with clipboard permission.\");\n }\n const text = this.#history.copy();\n this.#copying = true;\n this.#inspectionChanged();\n // Invoke the clipboard during the user gesture; producer extraction can complete asynchronously.\n const item = new ClipboardItem({ \"text/plain\": text.then(value => new Blob([value], { type: \"text/plain\" })) });\n const [value] = await Promise.all([text, navigator.clipboard.write([item])]);\n if (clear && serial === this.#copySerial && this.selection.status === \"valid\" &&\n this.selection.requestId === selectionId && this.viewport.generation === generation)\n this.clearSelection();\n return value;\n } catch (error) {\n if (serial === this.#copySerial) {\n this.#history.cancelCopy(error);\n this.#inspectionError = `Copy failed: ${errorMessage(error)}`;\n }\n throw error;\n } finally {\n if (serial === this.#copySerial) this.#copying = false;\n this.#inspectionChanged();\n }\n }\n\n #canInput() {\n return this.#connected && this.#hasGeometry && !this.#readOnly &&\n (this.#peer.id !== null || this.#peer.isPrimary);\n }\n\n get inputContext(): TerminalInputContext {\n return Object.freeze({\n terminal: this, selection: this.selection, viewport: this.viewport,\n buffer: this.viewport.buffer ?? null, mouseCaptured: !this.#readOnly && this.#geometry.mouseTracking !== 0,\n historical: !this.viewport.following || this.viewport.pending,\n readOnly: this.#readOnly, connected: this.#connected, peer: this.peer\n });\n }\n\n #resolveInput(input: TerminalInput): InputDecision {\n try {\n const decision = this.#policy.resolve(Object.freeze(input), this.inputContext);\n if (this.#readOnly && decision.route === InputRoute.Application)\n return { route: input.type === \"pointer\" || input.type === \"wheel\" ? InputRoute.Continue : InputRoute.Consume };\n return decision;\n }\n catch (error) {\n this.#actionFailed(error);\n return { route: InputRoute.Consume };\n }\n }\n\n #executeInputAction(decision: Extract<InputDecision, { action: unknown }>, input: TerminalInput): void {\n this.#performAction(decision.action, decision.args, input).catch(error => this.#actionFailed(error));\n }\n\n /** Named actions are shared by controls and bindings. Custom callbacks receive context, args, and input. */\n runAction(action: \"copySelection\", args?: CopySelectionOptions, input?: TerminalInput): Promise<string>;\n runAction(action: \"pasteClipboard\", args?: undefined, input?: TerminalInput): Promise<string>;\n runAction(action: \"copyOrPaste\", args?: undefined, input?: TerminalInput): Promise<string | undefined>;\n runAction(action: \"clearSelection\" | \"scrollToLive\", args?: undefined, input?: TerminalInput): Promise<void>;\n runAction(action: \"scrollLines\", args: number, input?: TerminalInput): Promise<void>;\n runAction<Name extends string>(action: Name extends TerminalActionName ? never : Name,\n args?: unknown, input?: TerminalInput): Promise<unknown>;\n runAction(action: InputActionHandler, args?: unknown, input?: TerminalInput): Promise<unknown>;\n async runAction(action: string | InputActionHandler, args?: unknown, input?: TerminalInput): Promise<unknown> {\n return this.#performAction(action, args, input);\n }\n\n async #performAction(action: string | InputActionHandler, args?: unknown, input?: TerminalInput): Promise<unknown> {\n if (this.#disposed) throw new Error(\"Terminal view is disposed\");\n this.#inspectionError = \"\";\n if (typeof action === \"function\") return action(this.inputContext, args, input);\n const customAction = this.#actions.get(action);\n if (customAction) return customAction(this.inputContext, args, input);\n switch (action) {\n case TerminalAction.CopySelection:\n if (args === undefined) return this.copySelection();\n if (!isRecord(args)) throw new TypeError(\"Copy options must be an object\");\n if (args.clear !== undefined && typeof args.clear !== \"boolean\") throw new TypeError(\"Copy clear must be a boolean\");\n return this.copySelection({ clear: args.clear });\n case TerminalAction.PasteClipboard: return this.pasteClipboard();\n case TerminalAction.ClearSelection: return this.clearSelection();\n case TerminalAction.ScrollToLive: return this.scrollToLive();\n case TerminalAction.ScrollLines:\n if (typeof args !== \"number\") throw new RangeError(\"Scroll delta must be a signed 32-bit integer\");\n return this.scrollLines(args);\n case TerminalAction.CopyOrPaste:\n if (this.#clipboardAction) throw new Error(\"A clipboard action is still in progress. Try again when it finishes.\");\n this.#clipboardAction = true;\n try {\n if (this.selection.active || (this.selection.pending && this.selection.canExtend))\n return await this.copySelection({ clear: true });\n if (!this.#readOnly) return await this.pasteClipboard();\n return;\n } finally { this.#clipboardAction = false; }\n default: throw new TypeError(`Unknown terminal action: ${action}`);\n }\n }\n\n /** Sends an explicit paste through the producer's mode-aware input encoder. */\n paste(text: string): void {\n if (typeof text !== \"string\") throw new TypeError(\"Paste text must be a string\");\n if (!this.#canInput()) throw new Error(\"Terminal view does not accept input\");\n if (text) this.#inputCommand({ type: \"paste\", text });\n }\n\n async pasteClipboard(): Promise<string> {\n if (!this.#canInput()) throw new Error(\"Terminal view does not accept input\");\n if (!navigator.clipboard?.readText)\n throw new Error(\"Clipboard reading is unavailable. Use the browser's paste shortcut instead.\");\n const serial = this.#inputSerial;\n const generation = this.viewport.generation;\n const selectionId = this.selection.requestId;\n const focused = document.activeElement;\n const text = await navigator.clipboard.readText();\n if (!this.#canInput() || serial !== this.#inputSerial || generation !== this.viewport.generation ||\n selectionId !== this.selection.requestId || document.activeElement !== focused)\n throw new Error(\"Terminal input, selection, focus, or buffer changed while reading the clipboard. Paste again.\");\n this.paste(text);\n return text;\n }\n\n get colorMode(): TerminalColorMode { return this.#colorMode; }\n get resolvedColorMode(): \"light\" | \"dark\" {\n return this.#colorMode === \"system\" ? (this.#colorScheme?.matches ? \"dark\" : \"light\") : this.#colorMode;\n }\n\n setColorMode(mode: TerminalColorMode): void {\n if (this.#disposed) throw new Error(\"Terminal view is disposed\");\n if (mode === undefined) throw new TypeError(\"A color mode is required\");\n this.#colorMode = normalizeColorMode(mode);\n this.#applyPalette();\n }\n\n setPalette(mode: \"light\" | \"dark\", palette: TerminalPalette): void {\n if (this.#disposed) throw new Error(\"Terminal view is disposed\");\n if (mode !== \"light\" && mode !== \"dark\") throw new TypeError('Palette mode must be \"light\" or \"dark\"');\n this.#palettes[mode] = normalizePalette(palette);\n if (this.resolvedColorMode === mode) this.#applyPalette();\n }\n\n #applyPalette(): void {\n const palette = this.#palettes[this.resolvedColorMode];\n this.element.dataset.theme = this.resolvedColorMode;\n this.element.style.colorScheme = this.resolvedColorMode;\n this.element.style.backgroundColor = palette.background;\n for (const [name, color] of Object.entries(paletteScrollbarColors(palette)))\n this.element.style.setProperty(`--cp-terminal-scrollbar-${name}`, color);\n this.#post({ type: \"palette\", palette });\n this.#scrollbarController?.refresh();\n }\n\n /** Changes per-view input policy without reconnecting; server authorization remains host-owned. */\n setReadOnly(readOnly: boolean): void {\n if (typeof readOnly !== \"boolean\") throw new TypeError(\"readOnly must be a boolean\");\n if (this.#disposed) throw new Error(\"Terminal view is disposed\");\n if (this.#readOnly === readOnly) return;\n const inputFocused = document.activeElement === this.element &&\n (!this.element.shadowRoot?.activeElement || this.element.shadowRoot.activeElement === this.#input);\n this.#readOnly = readOnly;\n this.#inputSerial++;\n this.#resetComposition?.();\n if (this.#input) {\n this.#input.value = \"\";\n this.#input.disabled = !this.#canInput();\n }\n // Set the policy before cancelling so pending moves and button releases cannot leak.\n this.#mouse?.cancel();\n this.#mouse?.refresh();\n clearTimeout(this.#resizeTimer);\n this.#resizeTimer = undefined;\n this.#lastRequested = undefined;\n this.#queueResize(true);\n if (inputFocused) this.focus();\n this.#selectionUI?.refresh();\n }\n\n setLinks(options: false | TerminalLinkOptions): void {\n if (this.#disposed) throw new Error(\"Terminal view is disposed\");\n if (options === undefined) throw new TypeError(\"Link options must be an object or false\");\n const next = normalizeLinks(options, new Set(this.#actions.keys()));\n this.#links = next;\n this.#linkGeneration++;\n this.#detectedLinks = [];\n this.#replacePresentedLinks([]);\n this.#pendingLinks = undefined;\n this.#linkSnapshot = undefined;\n this.#hoveredLinkId = undefined;\n this.#linkDetector.configure(next ? next.detection : false);\n this.#mouse?.cancel();\n this.#mouse?.refresh();\n this.#postLinkConfiguration();\n }\n\n #postLinkConfiguration(): void {\n const enabled = !!(this.#links && (this.#links.osc8 ||\n (this.#links.detection && this.#links.detection.rules.some(rule => rule.enabled !== false))));\n this.#post({ type: \"linkDetection\", enabled, generation: this.#linkGeneration });\n }\n\n #acceptLinkSnapshot(snapshot: LinkDetectionSnapshot): void {\n this.#linkSnapshot = snapshot;\n this.#detectedLinks = [];\n this.#replacePresentedLinks([]);\n this.#pendingLinks = undefined;\n this.#linkDetector.update(snapshot);\n this.#mouse?.refresh();\n }\n\n #detectedPointerId(link: DetectedLink): string {\n return `detected/${this.#linkGeneration}/${this.#linkRevision}/${link.id}`;\n }\n\n #replacePresentedLinks(links: readonly DetectedLink[]): void {\n this.#presentedLinks = links;\n this.#detectedRows.clear();\n for (const link of links) {\n for (const range of link.activation.ranges) {\n const row = this.#detectedRows.get(range.row) ?? [];\n row.push({ startColumn: range.startColumn, endColumn: range.endColumn, link });\n this.#detectedRows.set(range.row, row);\n }\n }\n }\n\n #requestLinkDecorations(): void {\n if (!this.#worker || !this.#connected || !this.#linkRevision) return;\n const detection = this.#links && this.#links.detection;\n if (!detection) return;\n const visible = detection.decoration === \"none\" ? [] : detection.decoration === \"hover\"\n ? this.#detectedLinks.filter(link => this.#detectedPointerId(link) === this.#hoveredLinkId)\n : this.#detectedLinks;\n this.#pendingLinks = { revision: this.#linkRevision, generation: this.#linkGeneration,\n serial: ++this.#linkSerial, links: this.#detectedLinks };\n this.#post({ type: \"linkDecorations\", revision: this.#linkRevision, generation: this.#linkGeneration,\n serial: this.#linkSerial, ranges: visible.flatMap(link => link.activation.ranges),\n underlineStyle: detection.underlineStyle ?? \"solid\" });\n }\n\n #linkAt(point: TerminalPoint): PointerHyperlink | null {\n if (!this.#connected || this.viewport.pending || !this.#links) return null;\n const osc8 = this.#osc8Rows.get(point.y)?.find(range =>\n point.x >= range.startColumn && point.x < range.endColumn);\n if (osc8) {\n if (this.#links.osc8 === false) return null;\n const target = this.#links.osc8\n ? (!/[\\u0000-\\u0020\\u007f]/u.test(osc8.uri) && URL.canParse(osc8.uri) ? osc8.uri : null)\n : this.#hyperlinks.at(point);\n if (!target || (this.#links.osc8 && this.#linkSnapshot?.revision !== this.#linkRevision)) return null;\n return { id: `osc8/${this.#linkGeneration}/${this.#linkRevision}/${osc8.row}/${osc8.startColumn}/${osc8.endColumn}`,\n target, activation: \"modifierClick\" };\n }\n const detection = this.#links.detection;\n if (!detection) return null;\n const link = this.#detectedRows.get(point.y)?.find(range =>\n point.x >= range.startColumn && point.x < range.endColumn)?.link;\n return link ? { id: this.#detectedPointerId(link), target: link.activation.target,\n activation: detection.activation ?? \"modifierClick\" } : null;\n }\n\n #activateLink(pointer: PointerHyperlink, input: TerminalInput): void {\n if (input.type !== \"pointer\" || this.#linkAt(input.point)?.id !== pointer.id || !this.#links) return;\n const detected = this.#presentedLinks.find(link => this.#detectedPointerId(link) === pointer.id);\n if (detected) {\n this.#performAction(detected.action, detected.activation, input).catch(error => this.#actionFailed(error));\n return;\n }\n if (!this.#links.osc8) {\n try { window.open(pointer.target, \"_blank\", \"noopener,noreferrer\"); }\n catch (error) { this.#actionFailed(error); }\n return;\n }\n const range = this.#osc8Rows.get(input.point.y)?.find(range =>\n input.point.x >= range.startColumn && input.point.x < range.endColumn);\n const snapshot = this.#linkSnapshot;\n if (!range || !snapshot) return;\n let text = \"\";\n for (let column = range.startColumn; column < range.endColumn; column++) {\n const cell = snapshot.cells[range.row * snapshot.columns + column];\n if (cell?.width && !(cell.attributes & 64)) text += cell.text;\n }\n const activation: TerminalLinkActivation = Object.freeze({\n source: \"osc8\", ruleId: null, kind: \"uri\", target: pointer.target, text,\n revision: this.#linkRevision,\n ranges: Object.freeze([Object.freeze({ row: range.row, startColumn: range.startColumn, endColumn: range.endColumn })]),\n });\n this.#performAction(this.#links.osc8.action, activation, input).catch(error => this.#actionFailed(error));\n }\n\n #forwardInput(input: TerminalInput): void {\n if (input.type === \"key\") {\n if (input.meta) throw new Error(\"Meta has no terminal key encoding; bind this shortcut to a local action instead.\");\n this.#inputCommand({ type: \"key\", key: input.key, ctrl: input.ctrl, alt: input.alt, shift: input.shift });\n } else if (input.type === \"paste\") {\n if (this.#canInput()) this.paste(input.text);\n } else if (input.type === \"text\") {\n this.#inputCommand({ type: \"input\", text: input.text });\n }\n }\n\n #dispatchInput(input: TerminalInput, event?: Event, allowApplication = true): void {\n const decision = this.#resolveInput(input);\n // Shortcuts may run on inspection controls, but Enter/Space must still activate the control.\n if (!allowApplication && decision.action === undefined && decision.route !== InputRoute.Consume) return;\n if (decision.route === InputRoute.Browser ||\n (decision.route === InputRoute.Continue && input.type === \"key\")) return;\n event?.preventDefault();\n event?.stopPropagation();\n if (decision.action !== undefined) this.#executeInputAction(decision, input);\n else if (decision.route !== InputRoute.Consume) {\n try { this.#forwardInput(input); }\n catch (error) { this.#actionFailed(error); }\n }\n }\n\n #bindKeyboard() {\n const input = this.#input;\n const options = { signal: this.#listeners.signal };\n let composing = false;\n let compositionCommit: string | null = null;\n this.#resetComposition = () => {\n composing = false;\n compositionCommit = null;\n clearTimeout(this.#compositionTimer);\n };\n this.element.addEventListener(\"keydown\", event => {\n if (event.defaultPrevented) return;\n if (event.composedPath().includes(this.#selectionOverlay)) return;\n const target = event.composedPath()[0];\n if (!this.#connected || event.isComposing || composing || event.key === \"Process\" || event.key === \"Dead\") return;\n if (event.getModifierState(\"AltGraph\")) return;\n this.#dispatchInput({ type: \"key\", key: event.key, code: event.code, repeat: event.repeat,\n ...inputModifiers(event) }, event, target === input || target === this.element);\n }, { ...options, capture: true });\n input.addEventListener(\"paste\", event => {\n if (event.defaultPrevented || !this.#connected || !event.clipboardData) return;\n this.#dispatchInput({ type: \"paste\", text: event.clipboardData.getData(\"text/plain\") }, event);\n input.value = \"\";\n }, options);\n input.addEventListener(\"compositionstart\", () => {\n if (!this.#canInput()) return;\n composing = true;\n compositionCommit = null;\n clearTimeout(this.#compositionTimer);\n }, options);\n input.addEventListener(\"compositionend\", event => {\n if (!composing) return;\n composing = false;\n // Accommodate browsers placing the final input before or after compositionend.\n compositionCommit = typeof event.data === \"string\" ? event.data : input.value;\n this.#compositionTimer = setTimeout(() => {\n if (compositionCommit) this.#dispatchInput({ type: \"text\", text: compositionCommit });\n compositionCommit = null;\n input.value = \"\";\n }, 0);\n }, options);\n input.addEventListener(\"input\", event => {\n const inputEvent = event instanceof InputEvent ? event : undefined;\n if (inputEvent?.isComposing || composing) return;\n clearTimeout(this.#compositionTimer);\n const text = compositionCommit ?? inputEvent?.data ?? input.value;\n compositionCommit = null;\n if (text && inputEvent?.inputType !== \"insertFromPaste\") this.#dispatchInput({ type: \"text\", text }, event);\n input.value = \"\";\n }, options);\n }\n\n focus() {\n if (this.#disposed) return;\n const target = this.#canInput() ? this.#input : this.element;\n target.focus({ preventScroll: true });\n }\n\n /** Request HMP1 primary explicitly; peer notifications confirm the result. */\n requestPrimary() {\n if (!this.#canInput()) throw new Error(\"Terminal view does not accept input\");\n if (this.#size.width <= 0 || this.#size.height <= 0) throw new Error(\"Show the terminal container before taking primary\");\n const grid = this.#fittedGrid();\n if (!grid) throw new Error(\"Show the terminal container before taking primary\");\n if (this.#peer.id === null) {\n if (!this.#peer.isPrimary) throw new Error(\"Waiting for the HMP1 connection\");\n this.resize(grid.columns, grid.rows);\n return;\n }\n this.#send({ type: \"requestPrimary\", ...grid });\n }\n\n /** Request a grid; never reflow locally before the authoritative response. */\n resize(columns: number, rows: number): void {\n const grid = dimensions(columns, rows);\n if (!this.#canInput()) throw new Error(\"Terminal view does not accept input\");\n if (!this.#peer.isPrimary) throw new Error(\"Only the primary view can request a terminal resize\");\n this.#send({ type: \"resize\", ...grid });\n this.#lastRequested = `${columns}x${rows}`;\n }\n\n /** Change the primary's sizing policy; applied grid dimensions still come from the server. */\n setSizing(sizing: TerminalSizing): void {\n const next = normalizeSizing(sizing, this.#sizing.fontSize);\n if (!this.#connected || this.#disposed) throw new Error(\"Terminal view is not connected\");\n if (this.#readOnly) throw new Error(\"Terminal view does not accept input\");\n if (!this.#peer.isPrimary) throw new Error(\"Only the primary view can change terminal sizing\");\n this.#sizing = next;\n clearTimeout(this.#resizeTimer);\n this.#resizeTimer = undefined;\n this.#lastRequested = undefined;\n this.#fit();\n this.#queueResize(true);\n this.#options.onSizingChange?.(this.sizing);\n }\n\n resync() { this.#send({ type: \"resync\" }); }\n\n #disconnect() {\n this.#inputSerial++;\n this.#connected = false;\n this.#hyperlinks.update([]);\n this.#osc8Rows.clear();\n this.#detectedLinks = [];\n this.#replacePresentedLinks([]);\n this.#linkSnapshot = undefined;\n this.#pendingLinks = undefined;\n this.#linkDetector.clear();\n if (this.#input) this.#input.disabled = true;\n this.#mouse?.update(1, 1, 0);\n this.#history.disconnect();\n this.#markerState.disconnect();\n this.#scrollbarController?.cancel();\n this.#inspectionChanged();\n clearTimeout(this.#resizeTimer);\n this.#resizeTimer = undefined;\n }\n\n #fail(error: Error): void {\n if (this.#disposed) return;\n this.#stopTransport();\n this.#disconnect();\n this.#ready.reject(error);\n this.#options.onStatus?.(error.message, \"error\");\n this.#worker?.terminate();\n }\n\n /** Detach this view. The server-side shared terminal is not terminated. */\n dispose() {\n if (this.#disposed) return;\n this.#disposed = true;\n this.#stopTransport();\n this.#disconnect();\n this.#linkDetector.dispose();\n this.#ready.reject(new DOMException(\"Terminal view was disposed\", \"AbortError\"));\n clearTimeout(this.#readyTimer);\n clearTimeout(this.#compositionTimer);\n this.#observer?.disconnect();\n this.#colorScheme?.removeEventListener(\"change\", this.#systemColorChanged);\n this.#mouse?.dispose();\n this.#scrollbarController?.dispose();\n this.#scrollbarTooltip?.dispose();\n this.#listeners.abort();\n this.#post({ type: \"stop\" });\n this.#worker?.terminate();\n this.element.remove();\n }\n\n #stopTransport(): void {\n this.#transportSession?.dispose();\n this.#transportFrame?.reject(new DOMException(\"Terminal transport was disposed or closed\", \"AbortError\"));\n this.#transportFrame = undefined;\n }\n}\n", "import type { TerminalMarker } from \"./scrollbar-types.js\";\nimport type { TerminalPalette } from \"./terminal-palette.js\";\n\n// Fallbacks for standalone controllers without a mounted terminal's palette tokens.\nexport const scrollbarColors = Object.freeze({\n track: \"#202020\",\n thumb: \"#999999\",\n marker: \"#aaaaaa\",\n error: \"#eeeeee\",\n prompt: \"#666666\",\n \"command-line\": \"#888888\",\n executing: \"#bbbbbb\",\n success: \"#999999\",\n custom: \"#dddddd\"\n});\n\nexport function paletteScrollbarColors(palette: TerminalPalette) {\n const foreground = [1, 3, 5].map(offset => parseInt(palette.foreground.slice(offset, offset + 2), 16));\n const background = [1, 3, 5].map(offset => parseInt(palette.background.slice(offset, offset + 2), 16));\n const shade = (weight: number) => \"#\" + foreground.map((channel, index) =>\n Math.round(channel * weight + background[index]! * (1 - weight)).toString(16).padStart(2, \"0\")).join(\"\");\n return Object.freeze({\n track: shade(0.5),\n thumb: palette.foreground,\n marker: shade(0.78),\n error: palette.foreground,\n prompt: shade(0.45),\n \"command-line\": shade(0.6),\n executing: shade(0.85),\n success: shade(0.7),\n custom: shade(0.95)\n });\n}\n\nexport function scrollbarMarkerColor(\n marker: TerminalMarker, resolve: (name: keyof typeof scrollbarColors) => string\n): string {\n if (marker.source === \"custom\") return resolve(\"custom\");\n if (marker.exitCode != null && marker.exitCode !== 0) return resolve(\"error\");\n switch (marker.phase) {\n case \"prompt\": return resolve(\"prompt\");\n case \"commandLine\": return resolve(\"command-line\");\n case \"executing\": return resolve(\"executing\");\n case \"finished\": return resolve(marker.exitCode === 0 ? \"success\" : \"marker\");\n default: return resolve(\"marker\");\n }\n}\n", "export const MIN_FONT_SIZE = 8;\nexport const MAX_FONT_SIZE = 32;\nconst NATIVE_FONT_SIZE = 16;\n\nexport function dimensions(columns: number, rows: number): TerminalGrid {\n if (!Number.isInteger(columns) || columns < 1 || columns > 300 ||\n !Number.isInteger(rows) || rows < 1 || rows > 100) {\n throw new RangeError(\"Requested grid must be 1-300 columns by 1-100 rows\");\n }\n return { columns, rows };\n}\n\nexport function normalizeSizing(sizing: TerminalSizing = { mode: \"auto\" }, previousFontSize = NATIVE_FONT_SIZE): TerminalSizingState {\n if (!sizing || ![\"auto\", \"fixed\"].includes(sizing.mode)) {\n throw new TypeError(\"Sizing mode must be 'auto' or 'fixed'\");\n }\n const fontSize = sizing.fontSize ?? previousFontSize;\n if (!Number.isInteger(fontSize) || fontSize < MIN_FONT_SIZE || fontSize > MAX_FONT_SIZE) {\n throw new RangeError(`Font size must be an integer from ${MIN_FONT_SIZE} to ${MAX_FONT_SIZE}`);\n }\n return sizing.mode === \"fixed\"\n ? { mode: \"fixed\", fontSize, ...dimensions(sizing.columns, sizing.rows) }\n : { mode: \"auto\", fontSize };\n}\n\nexport function requestedGrid(size: TerminalSize, geometry: TerminalGeometry, sizing: TerminalSizingState): TerminalGrid | null {\n if (sizing.mode === \"fixed\") return { columns: sizing.columns, rows: sizing.rows };\n if (size.width <= 0 || size.height <= 0) return null;\n const scale = sizing.fontSize / NATIVE_FONT_SIZE;\n return {\n columns: Math.max(1, Math.min(300, Math.floor(size.width / (geometry.cellWidth * scale)))),\n rows: Math.max(1, Math.min(100, Math.floor(size.height / (geometry.cellHeight * scale))))\n };\n}\n\nexport function fittedScale(size: TerminalSize, geometry: TerminalGeometry, isPrimary: boolean, sizing: TerminalSizingState): number {\n const maximum = isPrimary && sizing.mode === \"auto\" ? sizing.fontSize / NATIVE_FONT_SIZE : Infinity;\n return Math.max(0, Math.min(maximum,\n size.width / (geometry.columns * geometry.cellWidth),\n size.height / (geometry.rows * geometry.cellHeight)));\n}\nimport type { TerminalGeometry, TerminalGrid, TerminalSize, TerminalSizing, TerminalSizingState } from \"./types.js\";\n", "const unavailable = \"Text history is not available for this terminal view\";\nconst expired = \"Selection expired: its text was changed, evicted, reset, or resized. Select the text again.\";\nconst changedBeforeCopy = \"Selection changed before copy completed. Copy the new selection again.\";\n\n/** Commands contain producer identities; text and ranges are never inferred from painted cells. */\nexport class HistoryState {\n #send: (command: TerminalCommand) => void;\n #change: () => void;\n #history: HistoryMetadata | null = null;\n #revision = 0;\n #nextRequest = 0;\n #selectionRequest = 0;\n #viewportRequest = 0;\n #pendingMode: SelectionMode = \"character\";\n #pendingAction = \"clear\";\n #pendingCopy: PendingCopy | undefined;\n #deferredEndpoint: TerminalPoint | undefined;\n\n constructor(send: (command: TerminalCommand) => void, change: () => void = () => {}) {\n this.#send = send;\n this.#change = change;\n }\n\n get viewport(): HistoryViewport {\n if (!this.#history) return { available: false, following: true, pending: false };\n const { selection, copy, markers, markerResult, markerPage, viewportError, ...viewport } = this.#history;\n return { ...viewport, rowIds: [...viewport.rowIds], available: true, revision: this.#revision,\n ...(viewportError && viewport.requestId >= this.#viewportRequest ? { navigationError: viewportError } : {}),\n pending: viewport.requestId < this.#viewportRequest };\n }\n\n get selection(): HistorySelectionState {\n if (!this.#history) return { status: \"unavailable\", mode: \"character\", ranges: [], text: null, message: unavailable };\n const selection = this.#history.selection;\n if (selection.requestId < this.#selectionRequest || this.#deferredEndpoint) {\n return { requestId: this.#selectionRequest, status: \"pending\", mode: this.#pendingMode,\n canExtend: this.#pendingAction !== \"clear\",\n ranges: this.#pendingAction === \"clear\" ? [] : selection.ranges.map(range => ({ ...range })), text: null,\n message: \"Resolving selection\u2026\" };\n }\n return { ...selection, canExtend: selection.status === \"valid\",\n ranges: selection.ranges.map(range => ({ ...range })), revision: this.#revision,\n message: selection.status === \"invalidated\" ? expired : \"\" };\n }\n\n accept(history: HistoryMetadata | null, revision: number): boolean {\n if (revision <= this.#revision) return false;\n const previousGeneration = this.#history?.generation;\n this.#history = history;\n this.#revision = revision;\n if (!history || (previousGeneration && previousGeneration !== history.generation) ||\n history.selection.status === \"invalidated\") {\n this.endGesture(true);\n this.#rejectCopy(new Error(expired));\n }\n const pending = this.#pendingCopy;\n if (pending && history?.copy?.requestId === pending.requestId) {\n if (history.copy.status !== \"valid\" || history.selection.status !== \"valid\" ||\n history.selection.requestId !== pending.selectionRequestId ||\n history.generation !== pending.generation || this.#selectionRequest > pending.selectionRequestId ||\n history.copy.text !== history.selection.text) {\n this.#rejectCopy(new Error(expired));\n } else {\n clearTimeout(pending.timer);\n this.#pendingCopy = undefined;\n pending.resolve(history.copy.text);\n }\n }\n if (this.#deferredEndpoint && !this.viewport.pending) {\n const point = this.#deferredEndpoint;\n this.#deferredEndpoint = undefined;\n this.extend(point);\n }\n this.#change();\n return true;\n }\n\n #requireHistory(): HistoryMetadata {\n if (!this.#history) throw new Error(unavailable);\n return this.#history;\n }\n\n #pointRowId(point: TerminalPoint): string {\n const history = this.#requireHistory();\n if (!point || !Number.isInteger(point.x) || point.x < 0 || point.x > 1023 ||\n !Number.isInteger(point.y) || point.y < 0 ||\n typeof history.rowIds[point.y] !== \"string\" || !history.rowIds[point.y].length) {\n throw new Error(\"Terminal viewport is not ready for that selection point. Wait for the next frame and try again.\");\n }\n return history.rowIds[point.y];\n }\n\n #selectionChanged(mode = this.selection.mode, action = \"extend\") {\n this.#rejectCopy(new Error(changedBeforeCopy));\n this.#pendingMode = mode;\n this.#pendingAction = action;\n this.#selectionRequest = ++this.#nextRequest;\n return this.#selectionRequest;\n }\n\n begin(point: TerminalPoint, { mode, extend = false }: { mode: SelectionMode; extend?: boolean }): void {\n const rowId = this.#pointRowId(point);\n this.#deferredEndpoint = undefined;\n const requestId = this.#selectionChanged(mode, extend ? \"extend\" : \"start\");\n this.#send({ type: \"selection\", action: extend ? \"extend\" : \"start\", mode, requestId,\n generation: this.#requireHistory().generation, rowId, column: point.x });\n this.#change();\n }\n\n extend(point: TerminalPoint): void {\n this.#pointRowId(point);\n if (this.viewport.pending) {\n this.#rejectCopy(new Error(changedBeforeCopy));\n this.#pendingMode = this.selection.mode;\n this.#pendingAction = \"extend\";\n this.#deferredEndpoint = { ...point };\n this.#change();\n return;\n }\n this.begin(point, { mode: this.selection.mode, extend: true });\n }\n\n scroll(delta: number, endpoint?: TerminalPoint): void {\n this.#requireHistory();\n if (!Number.isSafeInteger(delta) || delta < -2147483648 || delta > 2147483647) throw new RangeError(\"Scroll delta must be a signed 32-bit integer\");\n if (endpoint) this.#pointRowId(endpoint);\n if (!delta && !endpoint) return;\n if (endpoint) this.#deferredEndpoint = undefined;\n else this.#flushDeferredEndpoint();\n const requestId = endpoint ? this.#selectionChanged() : ++this.#nextRequest;\n this.#viewportRequest = requestId;\n this.#send({ type: \"viewport\", requestId, delta,\n ...(endpoint ? { extend: { row: endpoint.y, column: endpoint.x } } : {}) });\n this.#change();\n }\n\n live() {\n this.#requireHistory();\n this.#flushDeferredEndpoint();\n this.#viewportRequest = ++this.#nextRequest;\n this.#send({ type: \"viewport\", live: true, requestId: this.#viewportRequest });\n this.#change();\n }\n\n scrollTo(top: number): void {\n const history = this.#requireHistory();\n if (!Number.isSafeInteger(top) || top < 0 || top > 2147483647)\n throw new RangeError(\"Scroll top must be a nonnegative 32-bit integer\");\n this.#flushDeferredEndpoint();\n this.#viewportRequest = ++this.#nextRequest;\n this.#send({ type: \"viewport\", requestId: this.#viewportRequest,\n top: Math.min(top, history.liveTop), generation: history.generation,\n originRowId: history.rowIds[0], originTop: history.top });\n this.#change();\n }\n\n clear() {\n this.#requireHistory();\n this.#deferredEndpoint = undefined;\n const requestId = this.#selectionChanged(this.selection.mode, \"clear\");\n this.#send({ type: \"selection\", action: \"clear\", requestId });\n this.#change();\n }\n\n endGesture(cancelled = false) {\n if (cancelled && this.#deferredEndpoint) {\n this.#deferredEndpoint = undefined;\n this.#change();\n }\n }\n\n #flushDeferredEndpoint() {\n if (!this.#deferredEndpoint) return;\n const endpoint = this.#deferredEndpoint;\n this.#deferredEndpoint = undefined;\n // Preserve command order if another scroll overtakes the pending presentation.\n this.scroll(0, endpoint);\n }\n cancelCopy(error: unknown): void { this.#rejectCopy(error); }\n\n copy(): Promise<string> {\n const history = this.#requireHistory();\n const selection = this.selection;\n if (selection.status !== \"valid\") throw new Error(selection.message || \"Select text before copying.\");\n this.#rejectCopy(new Error(\"A newer copy request replaced this request.\"));\n const requestId = ++this.#nextRequest;\n const { promise, resolve, reject } = Promise.withResolvers<string>();\n const timer = setTimeout(() => this.#rejectCopy(new Error(\"Timed out resolving selection. Copy again.\")), 10000);\n this.#pendingCopy = { requestId, selectionRequestId: selection.requestId, generation: history.generation,\n resolve, reject, timer };\n try {\n this.#send({ type: \"copy\", requestId, selectionRequestId: selection.requestId, generation: history.generation });\n } catch (error) {\n this.#rejectCopy(error);\n }\n return promise;\n }\n\n #rejectCopy(error: unknown): void {\n if (!this.#pendingCopy) return;\n clearTimeout(this.#pendingCopy.timer);\n this.#pendingCopy.reject(error);\n this.#pendingCopy = undefined;\n }\n\n disconnect() {\n this.#rejectCopy(new Error(\"Terminal view disconnected before copy completed.\"));\n this.#deferredEndpoint = undefined;\n }\n}\nimport type { SelectionMode, TerminalPoint, TerminalSelection, TerminalViewport } from \"./types.js\";\nimport type { HistoryMetadata, TerminalCommand } from \"./wire-types.js\";\n\ntype OmitEach<T, K extends PropertyKey> = T extends unknown ? Omit<T, K> : never;\ntype HistoryViewport = OmitEach<TerminalViewport, \"followTail\" | \"offset\">;\ntype HistorySelectionState = OmitEach<TerminalSelection, \"active\" | \"pending\" | \"copying\" | \"copyError\">;\ninterface PendingCopy {\n requestId: number; selectionRequestId: number; generation: string;\n resolve: (text: string) => void; reject: (error: unknown) => void;\n timer: ReturnType<typeof setTimeout>;\n}\n", "import { fittedScale } from \"./terminal-sizing.js\";\nimport { isRecord } from \"./validation.js\";\nimport type { TerminalGeometry, TerminalSize, TerminalSizingState } from \"./types.js\";\nimport type { TerminalInsets, TerminalLayout, TerminalPadding, TerminalScrollbarConfiguration } from \"./scrollbar-types.js\";\n\nexport function normalizePadding(value: TerminalPadding = 0): TerminalInsets {\n if (typeof value !== \"number\" && !isRecord(value)) throw new TypeError(\"Padding must be a number or per-edge object\");\n const edge = (name: keyof TerminalInsets) => {\n const amount = typeof value === \"number\" ? value : value[name] === undefined ? 0 : value[name];\n if (typeof amount !== \"number\" || !Number.isFinite(amount) || amount < 0)\n throw new RangeError(`Padding ${name} must be finite nonnegative CSS pixels`);\n return amount;\n };\n return Object.freeze({ top: edge(\"top\"), right: edge(\"right\"), bottom: edge(\"bottom\"), left: edge(\"left\") });\n}\n\nexport function contentSpace(size: TerminalSize, padding: TerminalInsets,\n scrollbar: false | TerminalScrollbarConfiguration): TerminalSize {\n return {\n width: Math.max(0, size.width - padding.left - padding.right - (scrollbar && scrollbar.placement === \"beside\" ? scrollbar.width : 0)),\n height: Math.max(0, size.height - padding.top - padding.bottom)\n };\n}\n\nexport function terminalLayout(size: TerminalSize, geometry: TerminalGeometry, primary: boolean,\n sizing: TerminalSizingState, padding: TerminalInsets, scrollbar: false | TerminalScrollbarConfiguration): TerminalLayout {\n const available = contentSpace(size, padding, scrollbar);\n const scale = fittedScale(available, geometry, primary, sizing);\n const width = geometry.columns * geometry.cellWidth * scale;\n const height = geometry.rows * geometry.cellHeight * scale;\n const left = Math.min(size.width, padding.left) + (available.width - width) / 2;\n const top = Math.min(size.height, padding.top) + (available.height - height) / 2;\n const trackWidth = scrollbar ? Math.min(scrollbar.width,\n scrollbar.placement === \"overlay\" ? width : Math.max(0, size.width - padding.right - left - width)) : 0;\n return Object.freeze({\n width: size.width, height: size.height,\n content: Object.freeze({ left, top, width, height }),\n scrollbar: scrollbar ? Object.freeze({\n left: left + width - (scrollbar.placement === \"overlay\" ? trackWidth : 0),\n top, width: trackWidth, height\n }) : null,\n padding,\n cellWidth: width / geometry.columns,\n cellHeight: height / geometry.rows\n });\n}\n", "import type {\n TerminalScrollbarAppearance, TerminalScrollbarPartAppearance\n} from \"./scrollbar-appearance.js\";\nimport type { TerminalScrollbarFrame, TerminalScrollbarRenderer } from \"./scrollbar-types.js\";\n\n// Canvas accepts some environment-dependent colors (notably currentColor) as valid.\n// Reject them before asking the browser to parse concrete CSS color syntax.\nconst contextualColor = /\\b(?:var|env|attr|light-dark|currentcolor|inherit|initial|unset|revert|revert-layer|default|context-fill|context-stroke|accentcolor|accentcolortext|activetext|buttonborder|buttonface|buttontext|canvas|canvastext|field|fieldtext|graytext|highlight|highlighttext|linktext|mark|marktext|selecteditem|selecteditemtext|visitedtext|activeborder|activecaption|appworkspace|background|buttonhighlight|buttonshadow|captiontext|inactiveborder|inactivecaption|inactivecaptiontext|infobackground|infotext|menu|menutext|scrollbar|threeddarkshadow|threedface|threedhighlight|threedlightshadow|threedshadow|window|windowframe|windowtext)\\b/i;\n\nfunction assertObject(value: unknown, name: string): void {\n if (value === null || typeof value !== \"object\" ||\n Object.prototype.toString.call(value) !== \"[object Object]\")\n throw new TypeError(`${name} must be an options object`);\n}\n\nfunction snapshotAppearance(appearance: TerminalScrollbarAppearance = {}) {\n assertObject(appearance, \"scrollbar.appearance\");\n let validationContext: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D | null | undefined;\n const color = (value: unknown, name: string): string | undefined => {\n if (value === undefined) return undefined;\n if (typeof value !== \"string\" || value.length > 256 || !value.trim() ||\n /\\\\|\\/\\*|--/.test(value) || contextualColor.test(value))\n throw new TypeError(`${name} must be a concrete CSS color of 1-256 characters`);\n const result = value.trim();\n if (validationContext === undefined) {\n validationContext = typeof OffscreenCanvas !== \"undefined\"\n ? new OffscreenCanvas(1, 1).getContext(\"2d\")\n : typeof document !== \"undefined\" ? document.createElement(\"canvas\").getContext(\"2d\") : null;\n }\n if (!validationContext)\n throw new TypeError(`${name} requires a browser canvas to validate CSS colors`);\n // Invalid assignments retain the old fillStyle. Two different sentinels also\n // accept valid colors that happen to equal either sentinel after serialization.\n validationContext.fillStyle = \"#010203\";\n validationContext.fillStyle = result;\n const first = validationContext.fillStyle;\n validationContext.fillStyle = \"#040506\";\n validationContext.fillStyle = result;\n if (first !== validationContext.fillStyle)\n throw new TypeError(`${name} must be a valid concrete CSS color`);\n return result;\n };\n const part = (value: TerminalScrollbarPartAppearance | undefined, fallback: number, name: string) => {\n if (value !== undefined) assertObject(value, name);\n const { color: partColor, opacity = fallback } = value ?? {};\n if (typeof opacity !== \"number\" || !Number.isFinite(opacity) || opacity < 0 || opacity > 1)\n throw new RangeError(`${name}.opacity must be a finite number between 0 and 1`);\n return Object.freeze({ color: color(partColor, `${name}.color`), opacity });\n };\n const { track, thumb, markers } = appearance;\n const markerPart = part(markers, 1, \"scrollbar.appearance.markers\");\n return Object.freeze({\n track: part(track, 0.35, \"scrollbar.appearance.track\"),\n thumb: part(thumb, 1, \"scrollbar.appearance.thumb\"),\n markers: Object.freeze({\n ...markerPart, errorColor: color(markers?.errorColor, \"scrollbar.appearance.markers.errorColor\")\n })\n });\n}\n\n/**\n * Creates a synchronous capsule scrollbar painter with snapshotted paint overrides.\n * Omitted colors are read from each frame. Invalid options throw at creation time.\n * Circular markers move aside near the thumb and paint behind it.\n * One smooth contour surrounds nearby displaced markers and tapers back into the track.\n * Track ends are rounded; focus does not add an outline.\n */\nexport function createDefaultScrollbarRenderer(\n appearance?: TerminalScrollbarAppearance\n): TerminalScrollbarRenderer {\n const options = snapshotAppearance(appearance);\n return frame => {\n if (frame.opacity <= 0) return;\n const { context, track, thumb, colors } = frame;\n const alpha = context.globalAlpha * frame.opacity;\n context.save();\n try {\n context.globalAlpha = alpha * options.track.opacity;\n context.fillStyle = options.track.color ?? colors.track;\n if (track.width > 0 && track.height > 0) {\n const step = 2, padding = 6, taper = 12;\n const radius = Math.min(track.width, track.height) / 2;\n const right = track.left + track.width, bottom = track.top + track.height;\n let offsets: Float64Array | undefined;\n let left = track.left;\n for (const { bounds } of frame.markers) {\n if (bounds.width <= 0 || bounds.height <= 0 || bounds.left >= track.left ||\n bounds.top >= track.top + track.height || bounds.top + bounds.height <= track.top) continue;\n const buffer = padding * Math.min(1, (track.left - bounds.left) / bounds.width);\n const shadowLeft = Math.max(0, bounds.left - buffer);\n if (shadowLeft >= track.left) continue;\n left = Math.min(left, shadowLeft);\n offsets ??= new Float64Array(Math.ceil(track.height / step) + 1);\n const first = Math.max(0, Math.floor((bounds.top - padding - taper - track.top) / step));\n const last = Math.min(offsets.length - 1,\n Math.ceil((bounds.top + bounds.height + padding + taper - track.top) / step));\n for (let i = first; i <= last; i++) {\n const y = track.top + Math.min(i * step, track.height);\n const distance = Math.max(bounds.top - padding - y, y - bounds.top - bounds.height - padding, 0);\n const proximity = Math.max(0, 1 - distance / taper);\n const extent = (track.left - shadowLeft) * proximity * proximity * (3 - 2 * proximity);\n // A shared envelope bridges nearby marks without density-dependent darkening or scallops.\n offsets[i] = Math.max(offsets[i]!, extent);\n }\n }\n if (offsets) {\n const gradient = context.createLinearGradient(left, 0, track.left, 0);\n gradient.addColorStop(0, \"transparent\");\n gradient.addColorStop(1, options.track.color ?? colors.track);\n context.fillStyle = gradient;\n const topLeft = track.left - offsets[0]!;\n const bottomLeft = track.left - offsets[offsets.length - 1]!;\n // Round an extended shadow within its padding, without cutting into floated marks.\n const topRadius = topLeft < track.left ? Math.min(radius, padding) : radius;\n const bottomRadius = bottomLeft < track.left ? Math.min(radius, padding) : radius;\n context.beginPath();\n context.moveTo(right - radius, track.top);\n context.lineTo(topLeft + topRadius, track.top);\n context.quadraticCurveTo(topLeft, track.top, topLeft, track.top + topRadius);\n let straight = false;\n for (let i = 1; i < offsets.length - 1; i++) {\n const y = track.top + i * step;\n const nextY = track.top + Math.min((i + 1) * step, track.height);\n if (y - step / 2 <= track.top + topRadius || (y + nextY) / 2 >= bottom - bottomRadius) continue;\n if (offsets[i - 1] === offsets[i] && offsets[i] === offsets[i + 1]) {\n straight = true;\n continue;\n }\n const x = track.left - offsets[i]!, nextX = track.left - offsets[i + 1]!;\n if (straight) {\n context.lineTo((track.left - offsets[i - 1]! + x) / 2, y - step / 2);\n straight = false;\n }\n context.quadraticCurveTo(x, y, (x + nextX) / 2, (y + nextY) / 2);\n }\n context.lineTo(bottomLeft, bottom - bottomRadius);\n context.quadraticCurveTo(bottomLeft, bottom, bottomLeft + bottomRadius, bottom);\n context.lineTo(right - radius, bottom);\n context.quadraticCurveTo(right, bottom, right, bottom - radius);\n context.lineTo(right, track.top + radius);\n context.quadraticCurveTo(right, track.top, right - radius, track.top);\n context.closePath();\n context.fill();\n } else {\n context.beginPath();\n context.roundRect(track.left, track.top, track.width, track.height, radius);\n context.fill();\n }\n }\n context.globalAlpha = alpha * options.markers.opacity;\n for (const { marker, bounds, color } of frame.markers) {\n context.fillStyle = marker.exitCode != null && marker.exitCode !== 0\n ? options.markers.errorColor ?? color ?? colors.error : options.markers.color ?? color ?? colors.marker;\n // Keep the historical per-marker override and invalid-color fallback.\n if (marker.color) context.fillStyle = marker.color;\n if (bounds.width > 0 && bounds.height > 0) {\n context.beginPath();\n context.roundRect(bounds.left, bounds.top, bounds.width, bounds.height,\n Math.min(bounds.width, bounds.height) / 2);\n context.fill();\n }\n }\n\n if (thumb.width > 0 && thumb.height > 0) {\n const inset = Math.min(2, thumb.width / 4);\n const width = thumb.width - inset * 2;\n context.globalAlpha = alpha * options.thumb.opacity;\n context.fillStyle = options.thumb.color ?? colors.thumb;\n context.beginPath();\n context.roundRect(thumb.left + inset, thumb.top, width, thumb.height,\n Math.min(width, thumb.height) / 2);\n context.fill();\n }\n\n } finally {\n context.restore();\n }\n };\n}\n\nconst defaultRenderer = createDefaultScrollbarRenderer();\n\n/** Paints the built-in appearance without changing the caller's canvas drawing state. */\nexport function renderDefaultScrollbar(frame: TerminalScrollbarFrame): void {\n defaultRenderer(frame);\n}\n", "import type {\n TerminalLayout, TerminalMarker, TerminalRectangle, TerminalScrollbar,\n TerminalScrollbarConfiguration, TerminalScrollbarMarker\n} from \"./scrollbar-types.js\";\nimport type { TerminalViewport } from \"./types.js\";\nimport { renderDefaultScrollbar } from \"./scrollbar-renderer.js\";\nimport { scrollbarColors, scrollbarMarkerColor } from \"./scrollbar-colors.js\";\nexport { renderDefaultScrollbar } from \"./scrollbar-renderer.js\";\n\nexport function normalizeScrollbar(input?: TerminalScrollbar): false | TerminalScrollbarConfiguration {\n if (input === false) return false;\n if (input !== undefined && (input === null || typeof input !== \"object\" || Array.isArray(input)))\n throw new TypeError(\"scrollbar must be false or an options object\");\n const options = input ?? {};\n const number = (value: number | undefined, fallback: number, name: string, min = 0, max = Infinity) => {\n const result = value === undefined ? fallback : value;\n if (!Number.isFinite(result) || result < min || result > max)\n throw new RangeError(`scrollbar.${name} must be a finite number between ${min} and ${max}`);\n return result;\n };\n if (options.placement !== undefined && options.placement !== \"overlay\" && options.placement !== \"beside\")\n throw new TypeError(\"scrollbar.placement must be overlay or beside\");\n if (options.markers !== undefined && typeof options.markers !== \"boolean\")\n throw new TypeError(\"scrollbar.markers must be boolean\");\n if (options.render !== undefined && (typeof options.render !== \"function\" ||\n options.render.constructor.name === \"AsyncFunction\"))\n throw new TypeError(\"scrollbar.render must be a synchronous function\");\n if (options.tooltip !== undefined && options.tooltip !== false &&\n (typeof options.tooltip !== \"function\" || options.tooltip.constructor.name === \"AsyncFunction\"))\n throw new TypeError(\"scrollbar.tooltip must be false or a synchronous function\");\n return Object.freeze({\n placement: options.placement ?? \"overlay\",\n width: number(options.width, 12, \"width\", 4, 64),\n proximity: number(options.proximity, 24, \"proximity\"),\n hideDelay: number(options.hideDelay, 900, \"hideDelay\"),\n fadeDuration: number(options.fadeDuration, 300, \"fadeDuration\"),\n markers: options.markers ?? true,\n ...(options.render ? { render: options.render } : {}),\n ...(options.tooltip !== undefined ? { tooltip: options.tooltip } : {})\n });\n}\n\nconst clamp = (value: number, min: number, max: number) => Math.max(min, Math.min(max, value));\nconst contains = (rect: TerminalRectangle, x: number, y: number, margin = 0) =>\n x >= rect.left - margin && x < rect.left + rect.width + margin &&\n y >= rect.top - margin && y < rect.top + rect.height + margin;\nconst containsCircle = (rect: TerminalRectangle, x: number, y: number) => {\n if (!contains(rect, x, y)) return false;\n const radius = Math.min(rect.width, rect.height) / 2;\n const centerX = rect.left + rect.width / 2;\n return (x - centerX) ** 2 + (y - rect.top - rect.height / 2) ** 2 <= radius ** 2;\n};\n\nexport function scrollbarOpacity(now: number, lastActivityAt: number, active: boolean,\n configuration: TerminalScrollbarConfiguration, reducedMotion: boolean): number {\n if (configuration.placement === \"beside\" || active) return 1;\n const elapsed = now - lastActivityAt - configuration.hideDelay;\n if (elapsed < 0) return 1;\n if (reducedMotion || configuration.fadeDuration === 0) return 0;\n return clamp(1 - elapsed / configuration.fadeDuration, 0, 1);\n}\n\nexport function scrollbarGeometry(layout: TerminalLayout, viewport: TerminalViewport,\n markers: readonly TerminalMarker[], target: number | null = null) {\n const track = layout.scrollbar;\n if (!track || track.width <= 0 || track.height <= 0 || !viewport.available ||\n viewport.buffer !== \"main\" || viewport.liveTop <= 0) return null;\n const visibleRows = Math.max(1, viewport.totalRows - viewport.liveTop);\n const height = Math.min(track.height, Math.max(24, track.height * visibleRows / viewport.totalRows));\n const thumb = Object.freeze({\n left: track.left, top: track.top + (track.height - height) *\n clamp(target ?? viewport.top, 0, viewport.liveTop) / viewport.liveTop,\n width: track.width, height\n });\n const diameter = Math.min(5, track.height, (thumb.width - Math.min(2, thumb.width / 4) * 2) * 0.75);\n const circleLeft = track.left + (track.width - diameter) / 2;\n const displacedLeft = Math.max(0, track.left - diameter - 2);\n const approachRange = Math.min(8, track.height);\n const ticks: TerminalScrollbarMarker[] = markers\n .filter(marker => marker.buffer === viewport.buffer && marker.row !== null &&\n Number.isFinite(marker.row) && marker.row >= 0 && marker.row < viewport.totalRows &&\n (marker.source === \"custom\" || marker.phase !== \"prompt\"))\n .map(marker => {\n const top = track.top + (track.height - diameter) * marker.row! / Math.max(1, viewport.totalRows - 1);\n const distance = Math.max(thumb.top - top - diameter, top - thumb.top - thumb.height, 0);\n const proximity = 1 - clamp(distance / approachRange, 0, 1);\n const displacement = proximity * proximity * (3 - 2 * proximity);\n const left = circleLeft + (displacedLeft - circleLeft) * displacement;\n return Object.freeze({\n marker: Object.freeze({ ...marker }),\n bounds: Object.freeze({\n left, top, width: diameter, height: diameter\n })\n });\n });\n return Object.freeze({ track: Object.freeze({ ...track }), thumb, markers: Object.freeze(ticks) });\n}\n\nexport function scrollbarMarkerAt(markers: readonly TerminalScrollbarMarker[], x: number, y: number,\n track?: TerminalRectangle) {\n const inTrack = !!track && contains(track, x, y);\n return markers.filter(({ bounds }) => inTrack\n ? y >= bounds.top - 3 && y < bounds.top + bounds.height + 3\n : containsCircle(bounds, x, y))\n .sort((a, b) => Math.abs(a.bounds.top + a.bounds.height / 2 - y) -\n Math.abs(b.bounds.top + b.bounds.height / 2 - y) ||\n (a.marker.id < b.marker.id ? -1 : a.marker.id > b.marker.id ? 1 : 0))[0]?.marker;\n}\n\ninterface ScrollbarState {\n layout: TerminalLayout;\n viewport: TerminalViewport;\n markers: readonly TerminalMarker[];\n connected: boolean;\n configuration: false | TerminalScrollbarConfiguration;\n}\n\ninterface ScrollbarControllerOptions {\n element: HTMLElement;\n canvas: HTMLCanvasElement;\n accessibility: HTMLDivElement;\n getState: () => ScrollbarState;\n scrollToRow: (top: number) => void;\n scrollToLive: () => void;\n scrollToMarker: (id: string) => Promise<void>;\n reportError: (error: unknown) => void;\n onMarkerHover?: (marker: TerminalScrollbarMarker | null) => void;\n}\n\nexport class ScrollbarController {\n private context: CanvasRenderingContext2D | null | undefined;\n private readonly listeners: (() => void)[] = [];\n private readonly motion: MediaQueryList | undefined;\n private configuration: false | TerminalScrollbarConfiguration | undefined;\n private frameId: number | undefined;\n private fadeTimer: ReturnType<typeof setTimeout> | undefined;\n private disposed = false;\n private failed = false;\n private dormant = false;\n private near = false;\n private hovered = false;\n private focused = false;\n private lastActivityAt = -Infinity;\n private pointer: number | null = null;\n private dragOffset: number | null = null;\n private contentPointers = new Set<number>();\n private contentClick = false;\n private suppressClick = false;\n private desired: number | null = null;\n private dragTop: number | null = null;\n private visualTop: number | null = null;\n private visualTarget: number | null = null;\n private visualFrom = 0;\n private visualStartedAt = 0;\n private queued: number | null = null;\n private requestBaseline = 0;\n private generation: string | undefined;\n private wheelRemainder = 0;\n private hoverPoint: { clientX: number; clientY: number } | null = null;\n\n constructor(private readonly options: ScrollbarControllerOptions) {\n this.motion = typeof matchMedia === \"function\" ? matchMedia(\"(prefers-reduced-motion: reduce)\") : undefined;\n const on = <K extends keyof HTMLElementEventMap>(target: HTMLElement, name: K,\n handler: (event: HTMLElementEventMap[K]) => void, passive = false) => {\n target.addEventListener(name, handler, { capture: true, passive });\n this.listeners.push(() => target.removeEventListener?.(name, handler, { capture: true }));\n };\n on(options.element, \"pointerdown\", event => this.pointerDown(event));\n on(options.element, \"pointermove\", event => this.pointerMove(event));\n on(options.element, \"pointerup\", event => this.pointerEnd(event, false));\n on(options.element, \"pointercancel\", event => this.pointerEnd(event, true));\n on(options.element, \"lostpointercapture\", event => this.pointerEnd(event, true));\n on(options.element, \"pointerleave\", () => {\n this.near = this.hovered = false;\n this.clearHover();\n this.activity();\n });\n on(options.element, \"wheel\", event => this.wheel(event));\n for (const name of [\"mousedown\", \"mouseup\", \"click\", \"dblclick\", \"contextmenu\"] as const)\n on(options.element, name, event => {\n if (this.contentPointers.size || this.contentClick) return;\n if (this.pointer !== null || this.hit(event) ||\n (this.suppressClick && (name === \"click\" || name === \"mouseup\"))) {\n this.consume(event);\n if (name === \"click\") this.suppressClick = false;\n }\n });\n on(options.accessibility, \"keydown\", event => this.keyDown(event));\n on(options.accessibility, \"focus\", () => { this.focused = true; this.activity(); });\n on(options.accessibility, \"blur\", () => { this.focused = false; this.activity(); });\n if (this.motion) {\n const changed = () => this.invalidate();\n this.motion.addEventListener(\"change\", changed);\n this.listeners.push(() => this.motion?.removeEventListener(\"change\", changed));\n }\n options.accessibility.setAttribute(\"role\", \"scrollbar\");\n options.accessibility.setAttribute(\"aria-label\", \"Terminal scrollback\");\n options.accessibility.setAttribute(\"aria-orientation\", \"vertical\");\n options.accessibility.style.position = \"absolute\";\n options.accessibility.style.background = \"transparent\";\n this.refresh();\n }\n\n refresh(): void {\n if (this.disposed) return;\n const state = this.options.getState();\n if (state.configuration !== this.configuration) {\n this.cancel();\n this.configuration = state.configuration;\n this.failed = false;\n this.lastActivityAt = this.now();\n }\n if (state.viewport.generation !== this.generation) {\n this.endGesture();\n this.desired = this.queued = null;\n this.visualTop = this.visualTarget = null;\n this.generation = state.viewport.generation;\n }\n if (this.pointer === null && this.queued === null && state.viewport.available &&\n !state.viewport.pending && (state.viewport.top === this.desired ||\n state.viewport.requestId > this.requestBaseline)) this.desired = null;\n this.updateVisualPosition(state);\n const geometry = this.geometry(state);\n if (!geometry) {\n this.cancel();\n this.options.accessibility.hidden = true;\n this.options.accessibility.tabIndex = -1;\n this.clear();\n return;\n }\n const { track } = geometry;\n const accessibility = this.options.accessibility;\n accessibility.hidden = false;\n accessibility.tabIndex = 0;\n if (accessibility.matches?.(\":focus\")) this.focused = true;\n Object.assign(accessibility.style, {\n left: `${track.left}px`, top: `${track.top}px`,\n width: `${track.width}px`, height: `${track.height}px`\n });\n accessibility.setAttribute(\"aria-valuemin\", \"0\");\n accessibility.setAttribute(\"aria-valuemax\", String(state.viewport.liveTop));\n accessibility.setAttribute(\"aria-valuenow\", String(this.desired ?? state.viewport.top));\n accessibility.setAttribute(\"aria-valuetext\", state.viewport.following ? \"Live terminal output\" :\n `Scrollback row ${this.desired ?? state.viewport.top}`);\n accessibility.setAttribute(\"aria-busy\", String(state.viewport.pending));\n this.refreshHover(geometry);\n this.schedule();\n }\n\n activity(): void {\n if (this.disposed) return;\n this.dormant = false;\n this.lastActivityAt = this.now();\n if (this.fadeTimer !== undefined) clearTimeout(this.fadeTimer);\n this.fadeTimer = undefined;\n this.schedule();\n }\n\n invalidate(): void {\n this.dormant = false;\n this.refresh();\n }\n\n cancel(): void {\n this.clearHover();\n this.endGesture();\n this.contentPointers.clear();\n this.contentClick = false;\n this.desired = this.queued = null;\n this.visualTop = this.visualTarget = null;\n this.near = this.hovered = this.focused = this.suppressClick = false;\n this.dormant = false;\n this.wheelRemainder = 0;\n if (this.frameId !== undefined) cancelAnimationFrame(this.frameId);\n if (this.fadeTimer !== undefined) clearTimeout(this.fadeTimer);\n this.frameId = this.fadeTimer = undefined;\n this.options.accessibility.hidden = true;\n this.options.accessibility.tabIndex = -1;\n this.options.accessibility.title = \"\";\n this.clear();\n }\n\n dispose(): void {\n if (this.disposed) return;\n this.disposed = true;\n this.cancel();\n for (const remove of this.listeners) remove();\n this.options.accessibility.hidden = true;\n this.options.accessibility.tabIndex = -1;\n }\n\n private now() { return performance.now(); }\n\n private updateVisualPosition(state: ScrollbarState, advance = false) {\n if (!state.viewport.available) return;\n // Only presentation is fractional; desired/queued remain authoritative row requests.\n const target = clamp(this.dragTop ?? this.desired ?? state.viewport.top, 0, state.viewport.liveTop);\n const now = this.now();\n if (this.visualTop === null || this.dragTop !== null || this.motion?.matches || this.dormant) {\n this.visualFrom = this.visualTop = this.visualTarget = target;\n this.visualStartedAt = now;\n return;\n }\n if (target !== this.visualTarget) {\n this.visualFrom = this.visualTop;\n this.visualTarget = target;\n this.visualStartedAt = now;\n }\n if (advance) {\n const progress = clamp((now - this.visualStartedAt) / 120, 0, 1);\n this.visualTop = progress === 1 ? target :\n this.visualFrom + (target - this.visualFrom) * (1 - (1 - progress) ** 3);\n }\n }\n\n private geometry(state = this.options.getState()) {\n return state.connected && state.configuration ?\n scrollbarGeometry(state.layout, state.viewport, state.configuration.markers ? state.markers : [],\n this.visualTop ?? this.desired) : null;\n }\n\n private point(event: Pick<MouseEvent, \"clientX\" | \"clientY\">) {\n const bounds = this.options.element.getBoundingClientRect();\n const layout = this.options.getState().layout;\n return {\n x: bounds.width > 0 ? (event.clientX - bounds.left) * layout.width / bounds.width : -Infinity,\n y: bounds.height > 0 ? (event.clientY - bounds.top) * layout.height / bounds.height : -Infinity\n };\n }\n\n private hit(event: MouseEvent) {\n const geometry = this.geometry();\n const point = this.point(event);\n return !!geometry && (contains(geometry.track, point.x, point.y) || !!this.markerAt(geometry, point));\n }\n\n private markerAt(geometry: NonNullable<ReturnType<typeof scrollbarGeometry>>, point: { x: number; y: number }) {\n if (contains(geometry.thumb, point.x, point.y)) return undefined;\n const configuration = this.options.getState().configuration;\n if (!contains(geometry.track, point.x, point.y) &&\n (this.failed || !configuration || scrollbarOpacity(this.now(), this.lastActivityAt,\n this.near || this.hovered || this.focused || this.pointer !== null,\n configuration, this.motion?.matches ?? false) <= 0)) return undefined;\n return scrollbarMarkerAt(geometry.markers, point.x, point.y, geometry.track);\n }\n\n private consume(event: Event) {\n event.preventDefault();\n event.stopImmediatePropagation();\n }\n\n private pointerDown(event: PointerEvent) {\n this.clearHover();\n this.suppressClick = false;\n this.contentClick = false;\n if (!this.hit(event)) {\n this.contentPointers.add(event.pointerId);\n this.contentClick = true;\n return;\n }\n if (this.contentPointers.size) { this.contentClick = true; return; }\n this.consume(event);\n if (event.button !== 0 || this.pointer !== null) return;\n const geometry = this.geometry()!;\n const point = this.point(event);\n this.pointer = event.pointerId;\n try { this.options.element.setPointerCapture(event.pointerId); }\n catch (error) {\n this.endGesture();\n this.report(error);\n return;\n }\n this.options.accessibility.setAttribute(\"data-pointer-active\", \"true\");\n this.options.accessibility.focus({ preventScroll: true });\n this.focused = true;\n this.activity();\n if (contains(geometry.thumb, point.x, point.y)) {\n this.dragOffset = point.y - geometry.thumb.top;\n const viewport = this.options.getState().viewport;\n if (viewport.available) this.dragTop = this.visualTop ?? this.desired ?? viewport.top;\n return;\n }\n const marker = this.markerAt(geometry, point);\n if (marker) { this.jump(marker.id); return; }\n const viewport = this.options.getState().viewport;\n if (viewport.available) this.navigate((this.desired ?? viewport.top) +\n (point.y < geometry.thumb.top ? -1 : 1) * Math.max(1, viewport.totalRows - viewport.liveTop));\n }\n\n private pointerMove(event: PointerEvent) {\n const geometry = this.geometry();\n if (!geometry) return;\n const point = this.point(event);\n if (this.pointer === event.pointerId) {\n this.consume(event);\n if (this.dragOffset !== null) {\n const viewport = this.options.getState().viewport;\n const travel = geometry.track.height - geometry.thumb.height;\n if (viewport.available && travel > 0) {\n this.dragTop = clamp((point.y - this.dragOffset - geometry.track.top) / travel * viewport.liveTop,\n 0, viewport.liveTop);\n this.navigate(this.dragTop);\n }\n }\n this.activity();\n return;\n }\n if (this.contentPointers.size || event.buttons !== 0) { this.clearHover(); return; }\n const previous = this.hoveredMarker(geometry);\n this.hoverPoint = { clientX: event.clientX, clientY: event.clientY };\n const marker = this.refreshHover(geometry);\n if (previous?.marker.id !== marker?.marker.id) {\n this.dormant = false;\n this.schedule();\n }\n if (this.hovered) this.consume(event);\n }\n\n private refreshHover(geometry: NonNullable<ReturnType<typeof scrollbarGeometry>>) {\n if (geometry && this.hoverPoint && this.pointer === null && !this.contentPointers.size) {\n const point = this.point(this.hoverPoint);\n const configuration = this.options.getState().configuration;\n const near = contains(geometry.track, point.x, point.y, configuration ? configuration.proximity : 0);\n const hovered = contains(geometry.track, point.x, point.y) || !!this.markerAt(geometry, point);\n if (near !== this.near || hovered !== this.hovered) {\n this.near = near;\n this.hovered = hovered;\n this.activity();\n }\n // Proximity can reveal a previously faded circle under this same pointer.\n this.hovered = contains(geometry.track, point.x, point.y) || !!this.markerAt(geometry, point);\n }\n const marker = this.hoveredMarker(geometry);\n this.options.onMarkerHover?.(marker);\n return marker;\n }\n\n private clearHover() {\n this.hoverPoint = null;\n this.options.onMarkerHover?.(null);\n }\n\n private hoveredMarker(geometry = this.geometry()): TerminalScrollbarMarker | null {\n if (!this.hoverPoint || this.pointer !== null || this.contentPointers.size) return null;\n if (!geometry) return null;\n const point = this.point(this.hoverPoint);\n const marker = this.markerAt(geometry, point);\n return geometry.markers.find(tick => tick.marker.id === marker?.id) ?? null;\n }\n\n private pointerEnd(event: PointerEvent, cancelled: boolean) {\n this.contentPointers.delete(event.pointerId);\n if (this.pointer !== event.pointerId) return;\n this.consume(event);\n this.suppressClick = !cancelled;\n this.endGesture();\n if (cancelled) {\n this.desired = this.queued = null;\n this.visualTop = this.visualTarget = null;\n }\n this.updateVisualPosition(this.options.getState());\n this.activity();\n }\n\n private endGesture() {\n const pointer = this.pointer;\n this.pointer = this.dragOffset = null;\n this.dragTop = null;\n this.options.accessibility.setAttribute(\"data-pointer-active\", \"false\");\n if (pointer !== null) {\n try {\n if (this.options.element.hasPointerCapture(pointer)) this.options.element.releasePointerCapture(pointer);\n } catch (error) { this.report(error); }\n }\n }\n\n private wheel(event: WheelEvent) {\n if (this.contentPointers.size || !this.hit(event)) return;\n this.consume(event);\n const { viewport, layout } = this.options.getState();\n if (!viewport.available || !Number.isFinite(event.deltaY)) return;\n const rows = Math.max(1, viewport.totalRows - viewport.liveTop);\n const bounds = this.options.element.getBoundingClientRect();\n const scale = layout.height > 0 ? bounds.height / layout.height : 1;\n this.wheelRemainder += event.deltaY * (event.deltaMode === 2 ? rows :\n event.deltaMode === 1 ? 1 : 1 / Math.max(1, layout.cellHeight * scale));\n const amount = Math.trunc(this.wheelRemainder);\n this.wheelRemainder -= amount;\n if (amount !== 0) this.navigate((this.desired ?? viewport.top) + amount);\n this.activity();\n }\n\n private keyDown(event: KeyboardEvent) {\n const { viewport } = this.options.getState();\n if (!this.geometry() || !viewport.available || event.ctrlKey || event.metaKey) return;\n const top = this.desired ?? viewport.top;\n const page = Math.max(1, viewport.totalRows - viewport.liveTop);\n if (event.altKey && (event.key === \"ArrowDown\" || event.key === \"ArrowUp\")) {\n this.consume(event);\n const forward = event.key === \"ArrowDown\";\n const markers = this.geometry()!.markers.map(tick => tick.marker)\n .filter(marker => forward ? marker.row! > top : marker.row! < top)\n .sort((a, b) => (forward ? 1 : -1) * (a.row! - b.row!) ||\n (a.id < b.id ? -1 : a.id > b.id ? 1 : 0));\n if (markers[0]) this.jump(markers[0].id);\n this.activity();\n return;\n }\n if (event.altKey) return;\n const targets: Record<string, number> = {\n ArrowUp: top - 1, ArrowDown: top + 1, PageUp: top - page, PageDown: top + page,\n Home: 0, End: viewport.liveTop\n };\n if (!Object.hasOwn(targets, event.key)) return;\n this.consume(event);\n this.navigate(targets[event.key]!);\n this.activity();\n }\n\n private jump(id: string) {\n this.desired = this.queued = null;\n try { void this.options.scrollToMarker(id).catch(error => this.report(error)); }\n catch (error) { this.report(error); }\n }\n\n private navigate(top: number) {\n const state = this.options.getState();\n const viewport = state.viewport;\n if (!viewport.available || !Number.isFinite(top)) return;\n const target = Math.round(clamp(top, 0, viewport.liveTop));\n if (this.dragTop === null || target !== (this.desired ?? viewport.top)) {\n this.requestBaseline = viewport.requestId;\n this.queued = target;\n }\n this.desired = target;\n this.updateVisualPosition(state);\n this.schedule();\n }\n\n private schedule() {\n if (this.disposed || this.frameId !== undefined || !this.geometry() ||\n (this.dormant && this.queued === null) ||\n typeof requestAnimationFrame !== \"function\") return;\n this.frameId = requestAnimationFrame(() => {\n this.frameId = undefined;\n this.paint();\n });\n }\n\n private clear() {\n if (!this.context) return;\n this.context.save();\n this.context.setTransform(1, 0, 0, 1, 0, 0);\n this.context.clearRect(0, 0, this.options.canvas.width, this.options.canvas.height);\n this.context.restore();\n }\n\n private paint() {\n if (this.disposed) return;\n let state = this.options.getState();\n if (!this.geometry(state) || !state.configuration) return;\n if (this.queued !== null) {\n const target = this.queued;\n this.queued = null;\n try {\n if (state.viewport.available && target >= state.viewport.liveTop) this.options.scrollToLive();\n else this.options.scrollToRow(target);\n } catch (error) { this.desired = null; this.report(error); }\n }\n state = this.options.getState();\n this.updateVisualPosition(state, true);\n const geometry = this.geometry(state);\n if (!geometry || !state.configuration) return;\n this.refreshHover(geometry);\n if (this.disposed || state.configuration !== this.options.getState().configuration) return;\n const { canvas, accessibility } = this.options;\n accessibility.setAttribute(\"aria-valuenow\", String(this.desired ?? state.viewport.top));\n if (!this.failed && this.context === undefined) {\n try {\n this.context = canvas.getContext(\"2d\");\n if (!this.context) throw new Error(\"The scrollbar Canvas2D context is unavailable\");\n }\n catch (error) {\n this.failed = true;\n this.endGesture();\n this.report(error);\n }\n }\n if (!this.context || this.failed) return;\n const context = this.context;\n const dpr = clamp(typeof devicePixelRatio === \"number\" ? devicePixelRatio : 1, 1, 3);\n const width = Math.max(1, Math.round(state.layout.width * dpr));\n const height = Math.max(1, Math.round(state.layout.height * dpr));\n if (canvas.width !== width) canvas.width = width;\n if (canvas.height !== height) canvas.height = height;\n this.clear();\n const now = this.now();\n const active = this.near || this.hovered || this.focused || this.pointer !== null;\n const autoHide = state.configuration.placement === \"overlay\";\n const reducedMotion = this.motion?.matches ?? false;\n const opacity = scrollbarOpacity(now, this.lastActivityAt, active, state.configuration, reducedMotion);\n const style = typeof getComputedStyle === \"function\" ? getComputedStyle(this.options.element) : null;\n const color = (name: string, fallback: string) => style?.getPropertyValue?.(name).trim() || fallback;\n const scrollbarColor = (name: keyof typeof scrollbarColors) =>\n color(`--cp-view-scrollbar-${name}`, scrollbarColors[name]);\n const layout = Object.freeze({\n ...state.layout, content: Object.freeze({ ...state.layout.content }),\n padding: Object.freeze({ ...state.layout.padding }), scrollbar: geometry.track\n });\n const viewport = Object.freeze({ ...state.viewport,\n ...(state.viewport.rowIds ? { rowIds: Object.freeze([...state.viewport.rowIds]) } : {})\n }) as TerminalViewport;\n const frame = Object.freeze({\n canvas, context, layout, viewport, ...geometry, now, opacity, pendingTarget: this.desired,\n markers: Object.freeze(geometry.markers.map(tick => Object.freeze({\n ...tick, color: scrollbarMarkerColor(tick.marker, scrollbarColor)\n }))),\n hoveredMarker: this.hoveredMarker(geometry),\n interaction: Object.freeze({\n near: this.near, hovered: this.hovered, dragging: this.dragOffset !== null,\n focused: this.focused, lastActivityAt: this.lastActivityAt, reducedMotion\n }),\n colors: Object.freeze({\n track: scrollbarColor(\"track\"),\n thumb: scrollbarColor(\"thumb\"),\n marker: scrollbarColor(\"marker\"),\n error: scrollbarColor(\"error\")\n })\n });\n let again: boolean | void = false;\n context.save();\n try {\n context.setTransform(dpr, 0, 0, dpr, 0, 0);\n const result: unknown = (state.configuration.render ?? renderDefaultScrollbar)(frame);\n if (result !== undefined && typeof result !== \"boolean\") {\n // Attach a rejection observer before reporting an unsupported asynchronous painter.\n if (result instanceof Promise) void result.catch(error => {\n if (!this.disposed) this.report(error);\n });\n throw new TypeError(\"scrollbar.render must synchronously return boolean or undefined\");\n }\n again = result;\n } catch (error) {\n this.failed = true;\n this.endGesture();\n this.desired = this.queued = null;\n if (this.frameId !== undefined) cancelAnimationFrame(this.frameId);\n if (this.fadeTimer !== undefined) clearTimeout(this.fadeTimer);\n this.frameId = this.fadeTimer = undefined;\n this.report(error);\n } finally { context.restore(); }\n if (this.failed) { this.clear(); return; }\n if (this.disposed || state.configuration !== this.options.getState().configuration) return;\n this.dormant = !active && opacity === 0 && again !== true;\n if (again === true || (opacity > 0 && this.visualTop !== this.visualTarget) ||\n (autoHide && !active && opacity > 0 && now >= this.lastActivityAt + state.configuration.hideDelay))\n this.schedule();\n else if (autoHide && !active && opacity > 0 && this.fadeTimer === undefined) {\n this.fadeTimer = setTimeout(() => {\n this.fadeTimer = undefined;\n this.schedule();\n }, Math.min(2_147_483_647, Math.max(0, this.lastActivityAt + state.configuration.hideDelay - now)));\n }\n }\n\n private report(error: unknown) {\n if (!this.disposed) this.options.reportError(error);\n }\n}\n", "import type { TerminalCommandMark } from \"./types.js\";\n\n/**\n * Parses a {@link TerminalCommandMark.rawParameters} string into key/value pairs, mirroring the\n * server's `TerminalCommandMark.Parameters`: segments are split on `;`, each split on the first\n * `=`; segments without `=` are ignored. Values are not decoded (e.g. percent-decoding is left\n * to the caller for keys that use it, such as `cmdline_url`). Returns an empty map for null/\"\".\n */\nexport function parseCommandMarkParameters(rawParameters: string | null): ReadonlyMap<string, string> {\n const result = new Map<string, string>();\n if (!rawParameters) return result;\n for (const segment of rawParameters.split(\";\")) {\n const separator = segment.indexOf(\"=\");\n if (separator < 0) continue;\n result.set(segment.slice(0, separator), segment.slice(separator + 1));\n }\n return result;\n}\n\n/**\n * Gets the raw (still percent-encoded) `cmdline_url` parameter from a command mark, or null when\n * absent. This is a Contour-originated, non-universal extension to OSC 133;C.\n */\nexport function getCmdlineUrl(mark: TerminalCommandMark | null): string | null {\n return mark ? parseCommandMarkParameters(mark.rawParameters).get(\"cmdline_url\") ?? null : null;\n}\n", "import { getCmdlineUrl } from \"./command-mark.js\";\nimport { isRecord } from \"./validation.js\";\nimport type { TerminalCommandMark } from \"./types.js\";\nimport type {\n TerminalLayout, TerminalScrollbarMarker, TerminalScrollbarTooltipContext, TerminalScrollbarTooltipRenderer\n} from \"./scrollbar-types.js\";\n\n/** Creates safe, theme-aware tooltip content; the controller owns mounting and positioning. */\nexport function renderDefaultScrollbarTooltip(context: TerminalScrollbarTooltipContext): HTMLElement {\n const element = document.createElement(\"div\");\n element.className = \"hex1b-scrollbar-tooltip\";\n element.setAttribute(\"role\", \"tooltip\");\n element.style.cssText = \"padding:8px 10px;border:1px solid var(--cp-view-text-muted,#888);\" +\n \"border-radius:6px;background:var(--cp-view-surface,#202020);color:var(--cp-view-text,#eee);\" +\n \"font:12px/1.4 var(--cp-view-font-family,monospace);white-space:pre-wrap;overflow-wrap:anywhere\";\n const { marker, details } = context;\n const lines = [marker.label || (marker.source === \"custom\" ? \"Bookmark\" : \"Terminal command\")];\n if (marker.source === \"command\") {\n lines.push(`Phase: ${marker.phase ?? \"unknown\"}`);\n if (marker.exitCode != null) lines.push(`Exit code: ${marker.exitCode}`);\n if (context.loading) lines.push(\"Loading command details...\");\n if (context.error) lines.push(`Command details unavailable: ${context.error}`);\n if (details) {\n const encoded = getCmdlineUrl(details);\n if (encoded) {\n try { lines.push(decodeURIComponent(encoded)); }\n catch (error) {\n if (!(error instanceof URIError)) throw error;\n lines.push(`Command (invalid URL encoding): ${encoded}`);\n }\n } else if (details.rawParameters) lines.push(details.rawParameters);\n else lines.push(\"This shell did not provide command text.\");\n }\n }\n element.textContent = lines.join(\"\\n\");\n return element;\n}\n\ninterface TooltipTarget {\n tick: TerminalScrollbarMarker;\n layout: TerminalLayout;\n renderer: TerminalScrollbarTooltipRenderer;\n key: string;\n signature: string;\n}\n\n/** Owns only hover presentation; input and retained marker navigation stay in their controllers. */\nexport class ScrollbarTooltip {\n private target: TooltipTarget | null = null;\n private result: { key: string; details: TerminalCommandMark | null; error: string | null } | null = null;\n private fetching = false;\n private lifetime: AbortController | undefined;\n private observer: ResizeObserver | undefined;\n private element: HTMLElement | null = null;\n private failed = false;\n private disposed = false;\n\n constructor(private readonly options: {\n overlay: HTMLElement;\n getDetails: (id: string) => Promise<TerminalCommandMark>;\n reportError: (error: unknown) => void;\n }) {}\n\n update(tick: TerminalScrollbarMarker | null, layout: TerminalLayout,\n renderer: false | TerminalScrollbarTooltipRenderer = renderDefaultScrollbarTooltip): void {\n if (this.disposed) return;\n if (!tick || renderer === false) {\n this.target = this.result = null;\n this.failed = false;\n this.clearView();\n return;\n }\n const signature = JSON.stringify({ tick, layout });\n if (this.target?.signature === signature && this.target.renderer === renderer) return;\n const key = JSON.stringify([tick.marker.id, tick.marker.phase, tick.marker.exitCode]);\n if (this.target?.key !== key || this.target.renderer !== renderer) {\n this.result = null;\n this.failed = false;\n }\n this.target = { tick, layout, renderer, key, signature };\n this.render();\n this.loadDetails();\n }\n\n dispose(): void {\n this.disposed = true;\n this.target = this.result = null;\n this.clearView();\n }\n\n private clearView() {\n this.observer?.disconnect();\n this.observer = undefined;\n const lifetime = this.lifetime;\n this.lifetime = undefined;\n this.element = null;\n this.options.overlay.replaceChildren();\n lifetime?.abort();\n }\n\n private render() {\n const target = this.target;\n this.clearView();\n if (!target || this.target !== target || this.failed || this.disposed) return;\n const lifetime = this.lifetime = new AbortController();\n const result = this.result?.key === target.key ? this.result : null;\n const context: TerminalScrollbarTooltipContext = Object.freeze({\n marker: target.tick.marker, anchor: target.tick.bounds, layout: target.layout,\n details: result?.details ?? null, error: result?.error ?? null,\n loading: target.tick.marker.source === \"command\" && !result,\n signal: lifetime.signal\n });\n try {\n const element: unknown = target.renderer(context);\n if (isRecord(element) && typeof element.then === \"function\")\n void Promise.resolve(element).catch(error => {\n if (!lifetime.signal.aborted) this.options.reportError(error);\n });\n if (lifetime.signal.aborted) return;\n if (element !== null && !(element instanceof HTMLElement)) {\n throw new TypeError(\"scrollbar.tooltip must synchronously return an HTMLElement or null\");\n }\n if (!element) return;\n this.element = element;\n Object.assign(element.style, {\n position: \"absolute\", boxSizing: \"border-box\", margin: \"0\", pointerEvents: \"none\",\n maxWidth: `${Math.max(0, Math.min(360, target.layout.width - 16))}px`,\n maxHeight: `${Math.max(0, target.layout.height - 16)}px`, overflow: \"hidden\"\n });\n this.options.overlay.append(element);\n this.position();\n this.observer = new ResizeObserver(() => this.position());\n this.observer.observe(element);\n } catch (error) {\n this.failed = true;\n this.clearView();\n this.options.reportError(error);\n }\n }\n\n private position() {\n if (!this.target || !this.element) return;\n const { bounds } = this.target.tick;\n const { width, height } = this.target.layout;\n const left = bounds.left - this.element.offsetWidth - 8;\n const top = bounds.top + bounds.height / 2 - this.element.offsetHeight / 2;\n this.element.style.left = `${Math.max(0, Math.min(Math.max(8, left), width - this.element.offsetWidth - 8))}px`;\n this.element.style.top = `${Math.max(0, Math.min(Math.max(8, top), height - this.element.offsetHeight - 8))}px`;\n }\n\n private loadDetails() {\n const target = this.target;\n if (!target || this.fetching || this.failed || this.disposed ||\n target.tick.marker.source !== \"command\" || this.result?.key === target.key) return;\n this.fetching = true;\n // Coalesce rapid hover changes: at most one RPC, followed by only the latest hovered mark.\n void Promise.resolve().then(() => this.disposed || this.target?.key !== target.key\n ? null : this.options.getDetails(target.tick.marker.id)).then(details => {\n if (!details || this.target?.key !== target.key || this.disposed) return;\n this.result = { key: target.key, details: Object.freeze({ ...details }), error: null };\n this.render();\n }, error => {\n if (this.target?.key !== target.key || this.disposed) return;\n this.result = { key: target.key, details: null, error: error instanceof Error ? error.message : String(error) };\n this.render();\n }).finally(() => {\n this.fetching = false;\n this.loadDetails();\n });\n }\n}\n", "import { scrollbarColors } from \"./scrollbar-colors.js\";\n\nconst light = `\n --cp-terminal-surface: #ffffff;\n --cp-terminal-text: #242424;\n --cp-terminal-text-muted: #5c5c5c;\n --cp-terminal-border-strong: #919191;\n --cp-terminal-accent: #b11f4b;\n --cp-terminal-accent-soft: rgba(177, 31, 75, 0.08);\n --cp-terminal-danger: #dc2626;\n`;\n\nconst dark = `\n --cp-terminal-surface: #292929;\n --cp-terminal-text: #dedede;\n --cp-terminal-text-muted: #919191;\n --cp-terminal-border-strong: #5f5f5f;\n --cp-terminal-accent: #fd8ea1;\n --cp-terminal-accent-soft: rgba(253, 142, 161, 0.14);\n --cp-terminal-danger: #f87171;\n`;\n\n// Shared embedding tokens take precedence; defaults never overwrite inherited --cp-* colors.\nexport const terminalThemeCss = `\n :host {\n ${light}\n --cp-terminal-font-family: \"Segoe UI\", Aptos, Calibri, -apple-system, BlinkMacSystemFont, sans-serif;\n }\n @media (prefers-color-scheme: dark) { :host { ${dark} } }\n :host-context([data-theme=\"light\"]) { ${light} }\n :host-context([data-theme=\"dark\"]) { ${dark} }\n :host([data-theme=\"light\"]) { ${light} }\n :host([data-theme=\"dark\"]) { ${dark} }\n .viewport {\n ${Object.entries(scrollbarColors).map(([name, value]) =>\n `--cp-view-scrollbar-${name}: var(--cp-scrollbar-${name}, var(--cp-terminal-scrollbar-${name}, ${value}));`).join(\"\\n\")}\n --cp-view-surface: var(--cp-surface, var(--cp-terminal-surface));\n --cp-view-text: var(--cp-text, var(--cp-terminal-text));\n --cp-view-text-muted: var(--cp-text-muted, var(--cp-terminal-text-muted));\n --cp-view-border-strong: var(--cp-border-strong, var(--cp-terminal-border-strong));\n --cp-view-accent: var(--cp-accent, var(--cp-terminal-accent));\n --cp-view-accent-soft: var(--cp-accent-soft, var(--cp-terminal-accent-soft));\n --cp-view-danger: var(--cp-danger, var(--cp-terminal-danger));\n --cp-view-font-family: var(--cp-font-family, var(--cp-terminal-font-family));\n }\n`;\n", "import type { RunTerminalAction, SelectionRange, SelectionUIDetail, SelectionUIEvent,\n SelectionUIState, TerminalGeometry, TerminalSize, WebTerminalOptions } from \"./types.js\";\nimport { isRecord } from \"./validation.js\";\n\nconst selectionFields = [\"status\", \"mode\", \"requestId\", \"active\", \"pending\", \"canExtend\",\n \"text\", \"message\", \"copying\", \"copyError\"] as const;\nconst viewportFields = [\"available\", \"following\", \"pending\", \"generation\", \"buffer\",\n \"top\", \"liveTop\", \"totalRows\", \"requestId\", \"navigationError\"] as const;\nconst geometryFields = [\"columns\", \"rows\", \"cellWidth\", \"cellHeight\", \"mouseTracking\"] as const;\nconst rangeFields = [\"row\", \"startColumn\", \"endColumn\"] as const;\nconst equalFields = <T>(a: T | undefined, b: T | undefined, fields: readonly (keyof T)[]) =>\n fields.every(field => a?.[field] === b?.[field]);\n\nexport function sameSelectionUIState(a: SelectionUIState | undefined, b: SelectionUIState): boolean {\n return !!a && a.connected === b.connected && a.readOnly === b.readOnly &&\n equalFields(a.selection, b.selection, selectionFields) &&\n equalFields(a.viewport, b.viewport, viewportFields) &&\n equalFields(a.geometry, b.geometry, geometryFields) &&\n equalFields(a.canvasSize, b.canvasSize, [\"width\", \"height\"]) &&\n a.selection.ranges.length === b.selection.ranges.length &&\n a.selection.ranges.every((range, index) => equalFields(range, b.selection.ranges[index], rangeFields));\n}\n\nexport function selectionRectangles(ranges: readonly SelectionRange[], geometry: TerminalGeometry, canvasSize: TerminalSize) {\n const width = canvasSize.width / geometry.columns;\n const height = canvasSize.height / geometry.rows;\n return ranges.map(range => Object.freeze({\n left: range.startColumn * width, top: range.row * height,\n width: (range.endColumn - range.startColumn) * width, height\n }));\n}\n\n/** Owns UI notification/default rendering, not terminal selection or clipboard state. */\nexport class SelectionUI {\n #element: HTMLDivElement;\n #overlay: HTMLDivElement;\n #button: HTMLButtonElement;\n #signal: AbortSignal;\n #getState: () => SelectionUIState;\n #runAction: RunTerminalAction;\n #reportError: (error: unknown) => void;\n #previous: SelectionUIState | undefined;\n #notification: SelectionUIEvent | undefined;\n #queued = false;\n #force = false;\n\n constructor({ element, overlay, button, signal, getState, runAction, onSelectionUI, reportError }: {\n element: HTMLDivElement; overlay: HTMLDivElement; button: HTMLButtonElement; signal: AbortSignal;\n getState: () => SelectionUIState; runAction: RunTerminalAction;\n onSelectionUI?: WebTerminalOptions[\"onSelectionUI\"]; reportError: (error: unknown) => void;\n }) {\n this.#element = element;\n this.#overlay = overlay;\n this.#button = button;\n this.#signal = signal;\n this.#getState = getState;\n this.#runAction = runAction;\n this.#reportError = reportError;\n if (onSelectionUI) {\n element.addEventListener(\"selectionui\", event => {\n if (!this.#notification || event !== this.#notification) return;\n const snapshot = this.#previous;\n try {\n const result: unknown = onSelectionUI(this.#notification);\n if (result !== undefined) {\n if (isRecord(result) && typeof result.then === \"function\") Promise.resolve(result).catch(error => {\n if (!signal.aborted && this.#previous === snapshot) reportError(error);\n });\n throw new TypeError(\"onSelectionUI must finish synchronously; use preventDefault() and signal for UI ownership\");\n }\n } catch (error) {\n event.preventDefault();\n reportError(error);\n }\n }, { signal });\n }\n }\n\n refresh(force = false) {\n this.#force ||= force;\n if (this.#queued || this.#signal.aborted) return;\n this.#queued = true;\n // Coalesce geometry and history from the same presented frame before notifying the host.\n queueMicrotask(() => {\n this.#queued = false;\n if (this.#signal.aborted) return;\n const state = this.#getState();\n const force = this.#force;\n this.#force = false;\n if (!force && sameSelectionUIState(this.#previous, state)) return;\n const snapshot: SelectionUIState = Object.freeze({\n ...state,\n selection: Object.freeze({ ...state.selection,\n ranges: Object.freeze(state.selection.ranges.map(range => Object.freeze({ ...range }))) }),\n viewport: Object.freeze({ ...state.viewport, rowIds: Object.freeze([...(state.viewport.rowIds ?? [])]) }),\n geometry: Object.freeze({ ...state.geometry }),\n canvasSize: Object.freeze({ ...state.canvasSize })\n });\n this.#previous = snapshot;\n const detail = Object.freeze({\n ...snapshot, overlay: this.#overlay, signal: this.#signal, runAction: this.#runAction,\n rects: Object.freeze(selectionRectangles(snapshot.selection.ranges, snapshot.geometry, snapshot.canvasSize))\n });\n const event = new CustomEvent<SelectionUIDetail>(\"selectionui\", { cancelable: true, detail });\n this.#notification = event;\n this.#reportError(null);\n this.#element.dispatchEvent(event);\n if (this.#signal.aborted) return;\n const selection = snapshot.selection;\n this.#button.hidden = event.defaultPrevented || [\"none\", \"unavailable\"].includes(selection.status);\n this.#button.disabled = !snapshot.connected || selection.status !== \"valid\" || selection.copying;\n const label = selection.copying ? \"Copying\\u2026\" : \"Copy\";\n if (this.#button.textContent !== label) this.#button.textContent = label;\n });\n }\n}\n", "import type { TerminalPoint } from \"./types.js\";\nimport type { HyperlinkRange } from \"./wire-types.js\";\n\n/** OSC 8 destinations are untrusted output, not page-relative navigation. */\nexport function hyperlinkUri(uri: string): string | null {\n if (/[\\u0000-\\u0020\\u007f]/u.test(uri) || !URL.canParse(uri)) return null;\n const url = new URL(uri);\n return [\"https:\", \"http:\", \"mailto:\"].includes(url.protocol) ? url.href : null;\n}\n\nexport class Hyperlinks {\n #rows = new Map<number, HyperlinkRange[]>();\n\n update(ranges: readonly HyperlinkRange[]): void {\n this.#rows.clear();\n const destinations = new Map<string, string | null>();\n for (const range of ranges) {\n if (!destinations.has(range.uri)) destinations.set(range.uri, hyperlinkUri(range.uri));\n const uri = destinations.get(range.uri);\n if (!uri) continue;\n const row = this.#rows.get(range.row) ?? [];\n row.push({ ...range, uri });\n this.#rows.set(range.row, row);\n }\n }\n\n at(point: TerminalPoint): string | null {\n return this.#rows.get(point.y)?.find(range =>\n point.x >= range.startColumn && point.x < range.endColumn)?.uri ?? null;\n }\n}\n", "import type { HyperlinkRange, TerminalCell } from \"./wire-types.js\";\nimport type { SelectionRange } from \"./types.js\";\nimport type { TerminalLinkAction, TerminalLinkActivation, TerminalLinkDetectionError,\n TerminalLinkOptions, TerminalLinkRule, TerminalLinkTextMode } from \"./link-types.js\";\nimport { LINK_LIMITS, normalizeLinks, validateLinkAction } from \"./link-options.js\";\nimport { extractLinkText, mapLinkRange } from \"./link-text.js\";\nimport type { MappedLinkChunk } from \"./link-text.js\";\nimport type { LinkScanMatch, LinkScanRequest, LinkScanResponse } from \"./link-worker-protocol.js\";\nimport { linkMatchTextSize } from \"./link-worker-protocol.js\";\nimport { defaultWorkerUrl } from \"./worker-url.js\";\n\nexport interface LinkDetectionSnapshot {\n revision: number; columns: number; rows: number;\n cells: readonly (TerminalCell | undefined)[];\n hyperlinks: readonly HyperlinkRange[];\n}\nexport interface DetectedLink {\n id: string;\n action: TerminalLinkAction;\n activation: TerminalLinkActivation;\n}\ninterface Work {\n identity: number; revision: number; snapshot: LinkDetectionSnapshot;\n chunks: Map<TerminalLinkTextMode, MappedLinkChunk[]>;\n}\ninterface Job { id: number; work: Work; rule: TerminalLinkRule; keys: Map<string, string> }\n\nfunction validResponse(response: LinkScanResponse, job: Job): boolean {\n if (!Array.isArray(response.results) || response.results.length !== job.keys.size) return false;\n const keys = new Set<string>();\n let count = 0, resultText = 0;\n for (const result of response.results) {\n if (!result || !job.keys.has(result.key) || keys.has(result.key) || !Array.isArray(result.matches)) return false;\n keys.add(result.key);\n count += result.matches.length;\n if (count > LINK_LIMITS.matches) return false;\n for (const match of result.matches) {\n if (!match || !Number.isSafeInteger(match.index) || match.index < 0 ||\n typeof match.text !== \"string\" || !match.text.length || !Array.isArray(match.captures) ||\n !match.captures.every(capture => capture === undefined || typeof capture === \"string\") ||\n !match.groups || typeof match.groups !== \"object\" || Array.isArray(match.groups) ||\n !Object.values(match.groups).every(group => group === undefined || typeof group === \"string\")) return false;\n resultText += linkMatchTextSize(match);\n if (resultText > LINK_LIMITS.resultText) return false;\n }\n }\n return true;\n}\n\nexport class LinkDetection {\n #options: { workerUrl?: string | URL; actions: ReadonlySet<string>;\n onChange: (revision: number, links: readonly DetectedLink[]) => void;\n onError: (error: TerminalLinkDetectionError) => void };\n #detection: TerminalLinkOptions[\"detection\"];\n #worker: Worker | null = null;\n #timer: ReturnType<typeof setTimeout> | undefined;\n #job: Job | null = null;\n #work: Work | null = null;\n #links: readonly DetectedLink[] = [];\n #disabled = new Set<string>();\n #cache = new Map<string, LinkScanMatch[]>();\n #cacheSizes = new Map<string, number>();\n #cacheSize = 0;\n #identity = 0;\n #jobId = 0;\n #revision = 0;\n #disposed = false;\n #workerFailed = false;\n #pumping = false;\n\n constructor(options: { workerUrl?: string | URL; actions: ReadonlySet<string>;\n onChange: (revision: number, links: readonly DetectedLink[]) => void;\n onError: (error: TerminalLinkDetectionError) => void }) {\n this.#options = { ...options, actions: new Set(options.actions) };\n }\n\n configure(detection: TerminalLinkOptions[\"detection\"]): void {\n const normalized = normalizeLinks({ detection }, this.#options.actions);\n if (this.#disposed) return;\n this.#detection = normalized === false ? false : normalized.detection;\n this.#disabled.clear(); this.#workerFailed = false;\n this.clear();\n }\n\n update(snapshot: LinkDetectionSnapshot): void {\n if (this.#disposed || snapshot.revision < this.#revision) return;\n this.#revision = snapshot.revision;\n this.#work = null;\n this.#publish([]);\n if (!this.#detection || this.#workerFailed) return;\n const work: Work = { identity: ++this.#identity, revision: snapshot.revision,\n snapshot, chunks: new Map() };\n try {\n for (const rule of this.#detection.rules) {\n if (!rule.enabled || this.#disabled.has(rule.id)) continue;\n const mode = rule.text ?? \"logicalLine\";\n if (!work.chunks.has(mode)) work.chunks.set(mode, extractLinkText(snapshot, mode));\n }\n } catch (error) {\n this.#error(\"limit\", null, error);\n return;\n }\n this.#work = work;\n this.#pump();\n }\n\n advance(revision: number): void {\n if (this.#disposed || revision < this.#revision) return;\n this.#revision = revision;\n if (this.#work) this.#work.revision = revision;\n this.#publish(this.#links.map(link => Object.freeze({ ...link,\n activation: Object.freeze({ ...link.activation, revision }) })));\n }\n\n clear(): void {\n this.#terminate();\n this.#identity++;\n this.#work = null;\n this.#cache.clear(); this.#cacheSizes.clear(); this.#cacheSize = 0;\n if (!this.#disposed) this.#publish([]);\n }\n\n dispose(): void {\n if (this.#disposed) return;\n this.clear();\n this.#disposed = true;\n }\n\n #publish(links: readonly DetectedLink[]): void {\n this.#links = Object.freeze([...links]);\n this.#options.onChange(this.#revision, this.#links);\n }\n\n #error(code: TerminalLinkDetectionError[\"code\"], ruleId: string | null, error: unknown): void {\n this.#options.onError(Object.freeze({ code, ruleId, revision: this.#revision,\n message: error instanceof Error ? error.message : String(error) }));\n }\n\n #terminate(): void {\n clearTimeout(this.#timer); this.#timer = undefined;\n if (this.#worker) {\n this.#worker.terminate(); this.#worker = null;\n }\n this.#job = null;\n }\n\n #failWorker(error: unknown): void {\n const ruleId = this.#job?.rule.id ?? null;\n this.#terminate(); this.#workerFailed = true;\n this.#publish([]);\n this.#error(\"worker\", ruleId, error);\n }\n\n #pump(): void {\n if (this.#pumping || this.#disposed || this.#job || !this.#work || !this.#detection || this.#workerFailed) return;\n this.#pumping = true;\n try {\n const work = this.#work;\n for (const rule of this.#detection.rules) {\n if (!rule.enabled || this.#disabled.has(rule.id)) continue;\n const chunks = work.chunks.get(rule.text ?? \"logicalLine\") ?? [];\n const missing = chunks.filter(chunk => !this.#cache.has(this.#cacheKey(rule, chunk)));\n if (!missing.length) continue;\n try {\n if (!this.#worker) {\n const worker = new Worker(this.#options.workerUrl ?? defaultWorkerUrl(\"link-detection\"),\n { type: \"module\", name: \"hex1b-link-detection\" });\n this.#worker = worker;\n worker.addEventListener(\"message\", event => {\n if (this.#worker === worker) this.#receive(event.data as LinkScanResponse);\n });\n worker.addEventListener(\"error\", event => {\n if (this.#worker !== worker) return;\n event.preventDefault(); this.#failWorker(event.message);\n });\n worker.addEventListener(\"messageerror\", () => {\n if (this.#worker === worker) this.#failWorker(\"Invalid detection worker message\");\n });\n }\n const id = ++this.#jobId;\n this.#job = { id, work, rule, keys: new Map(missing.map(chunk => [chunk.key, this.#cacheKey(rule, chunk)])) };\n this.#timer = setTimeout(() => {\n if (this.#job?.id !== id) return;\n this.#terminate(); this.#disabled.add(rule.id);\n this.#error(\"timeout\", rule.id, `Link rule exceeded ${LINK_LIMITS.timeoutMs} ms`);\n this.#pump();\n }, LINK_LIMITS.timeoutMs);\n const request: LinkScanRequest = { id,\n rule: rule.builtin ? { builtin: rule.builtin } : { source: rule.pattern!.source, flags: rule.pattern!.flags },\n chunks: missing.map(({ chunk, key }) => ({ key, text: chunk.text })) };\n this.#worker.postMessage(request);\n } catch (error) { this.#failWorker(error); }\n return;\n }\n this.#resolve(work);\n } finally { this.#pumping = false; }\n }\n\n #cacheKey(rule: TerminalLinkRule, chunk: MappedLinkChunk): string {\n return JSON.stringify([rule.id, chunk.key]);\n }\n\n #receive(response: LinkScanResponse): void {\n const job = this.#job;\n if (!job || response?.id !== job.id || this.#disposed) return;\n clearTimeout(this.#timer); this.#timer = undefined; this.#job = null;\n if (response.error) {\n this.#disabled.add(job.rule.id);\n this.#error(response.error, job.rule.id, response.message ?? \"Link scan failed\");\n } else if (!validResponse(response, job)) {\n this.#failWorker(\"Malformed detection response\"); return;\n } else {\n for (const result of response.results!) {\n const key = job.keys.get(result.key)!;\n const size = key.length + result.matches.reduce((total, match) => total + linkMatchTextSize(match), 0);\n this.#cacheSize += size - (this.#cacheSizes.get(key) ?? 0);\n this.#cacheSizes.set(key, size);\n this.#cache.set(key, result.matches);\n }\n }\n if (this.#work !== job.work) this.#trimCache();\n this.#pump();\n }\n\n #resolve(work: Work): void {\n if (!this.#detection || this.#work !== work) return;\n const occupied: SelectionRange[] = [...work.snapshot.hyperlinks];\n const links: DetectedLink[] = [];\n const overlaps = (ranges: SelectionRange[]) => ranges.some(range => occupied.some(other =>\n range.row === other.row && range.startColumn < other.endColumn && range.endColumn > other.startColumn));\n for (const rule of this.#detection.rules) {\n if (!rule.enabled || this.#disabled.has(rule.id)) continue;\n const ruleLinks: DetectedLink[] = [], ruleRanges: SelectionRange[] = [];\n try {\n for (const mapped of work.chunks.get(rule.text ?? \"logicalLine\") ?? []) {\n for (const candidate of this.#cache.get(this.#cacheKey(rule, mapped)) ?? []) {\n const ranges = mapLinkRange(mapped, candidate.index, candidate.text.length);\n if (!ranges || overlaps(ranges)) continue;\n const match = Object.freeze({ ...candidate, captures: Object.freeze([...candidate.captures]),\n groups: Object.freeze({ ...candidate.groups }), chunk: mapped.chunk });\n const resolution = rule.resolve ? rule.resolve(match) : { target: candidate.text };\n if (this.#work !== work || this.#disposed) return;\n if (resolution === null) continue;\n if (typeof resolution !== \"object\" || resolution === undefined ||\n \"then\" in resolution || typeof resolution.target !== \"string\") throw new TypeError(\"Resolver must return a synchronous link resolution or null\");\n const action = resolution.action === undefined ? rule.action : resolution.action;\n validateLinkAction(action, this.#options.actions);\n if (links.length + ruleLinks.length >= LINK_LIMITS.matches) throw new RangeError(\"Resolved link limit exceeded\");\n const activation: TerminalLinkActivation = Object.freeze({\n source: \"detected\", ruleId: rule.id,\n kind: rule.builtin ? (rule.builtin === \"url\" || rule.builtin === \"uri\" ? \"uri\" : \"path\") : rule.kind!,\n text: candidate.text, target: resolution.target,\n ranges: Object.freeze(ranges.map(range => Object.freeze(range))),\n revision: work.revision, data: resolution.data,\n });\n ruleLinks.push(Object.freeze({ id: JSON.stringify([work.identity, rule.id,\n ranges[0].row, ranges[0].startColumn, candidate.index]),\n action, activation }));\n ruleRanges.push(...ranges);\n }\n }\n links.push(...ruleLinks); occupied.push(...ruleRanges);\n } catch (error) {\n this.#disabled.add(rule.id);\n this.#error(error instanceof RangeError ? \"limit\" : \"resolver\", rule.id, error);\n if (this.#work !== work || this.#disposed) return;\n }\n }\n // Evict only after resolution so a viewport larger than the cache cannot cause endless rescans.\n this.#trimCache();\n this.#publish(links);\n }\n\n #trimCache(): void {\n while (this.#cache.size > LINK_LIMITS.cacheEntries || this.#cacheSize > LINK_LIMITS.cacheText) {\n const key = this.#cache.keys().next().value!;\n this.#cache.delete(key); this.#cacheSize -= this.#cacheSizes.get(key)!;\n this.#cacheSizes.delete(key);\n }\n }\n}\n", "import type { SelectionRange } from \"./types.js\";\nimport type { TerminalLinkTextChunk, TerminalLinkTextMode } from \"./link-types.js\";\nimport type { LinkDetectionSnapshot } from \"./link-detection.js\";\nimport { LINK_LIMITS } from \"./link-options.js\";\n\ninterface Span extends SelectionRange { start: number; end: number }\nexport interface MappedLinkChunk {\n chunk: TerminalLinkTextChunk;\n spans: Span[];\n boundaries: Set<number>;\n unsafe: Set<number>;\n key: string;\n}\nconst SOFT_WRAP = 1024;\nconst HIDDEN = 64;\nconst segmenter = new Intl.Segmenter(undefined, { granularity: \"grapheme\" });\n\nexport function extractLinkText(snapshot: LinkDetectionSnapshot, mode: TerminalLinkTextMode): MappedLinkChunk[] {\n const { columns, rows, cells } = snapshot;\n if (!Number.isSafeInteger(columns) || !Number.isSafeInteger(rows) || columns < 1 || rows < 1 ||\n columns * rows > LINK_LIMITS.cells) throw new RangeError(\"Link grid exceeds cell limit\");\n const result: MappedLinkChunk[] = [];\n let text = \"\", spans: Span[] = [], unsafe = new Set<number>(), firstRow = 0, total = 0;\n let start: TerminalLinkTextChunk[\"start\"] = \"unknown\";\n const wrapped = (row: number) => row >= 0 && !!((cells[(row + 1) * columns - 1]?.attributes ?? 0) & SOFT_WRAP);\n const finish = (end: TerminalLinkTextChunk[\"end\"]) => {\n const chunk = Object.freeze({ text, mode, start, end });\n const boundaries = new Set<number>([text.length]);\n for (const segment of segmenter.segment(text)) boundaries.add(segment.index);\n result.push({ chunk, spans, unsafe, boundaries,\n key: JSON.stringify([mode, firstRow, start, end, text]) });\n text = \"\"; spans = []; unsafe = new Set();\n };\n for (let row = 0; row < rows; row++) {\n if (text.length === 0) { firstRow = row; start = row === 0 ? \"unknown\" : wrapped(row - 1) ? \"clipped\" : \"complete\"; }\n for (let col = 0; col < columns; col++) {\n const cell = cells[row * columns + col];\n const width = cell?.width ?? 1;\n const valid = width >= 1 && width <= 2 && col + width <= columns &&\n !(cell && ((cell.attributes & HIDDEN) || cell.text.codePointAt(0) === 0x10eeee)) &&\n (width !== 2 || cells[row * columns + col + 1]?.width === 0);\n const value = valid ? cell?.text || \" \" : \"\\0\";\n if (total + value.length > LINK_LIMITS.totalText || text.length + value.length > LINK_LIMITS.chunk) {\n throw new RangeError(\"Link text exceeds chunk or viewport limit\");\n }\n const offset = text.length;\n text += value; total += value.length;\n if (valid) spans.push({ start: offset, end: text.length, row, startColumn: col, endColumn: col + width });\n else { unsafe.add(offset); unsafe.add(text.length); }\n if (valid && width === 2) col++;\n }\n const soft = wrapped(row);\n if (!soft) unsafe.add(text.length); // HWT1 cannot distinguish a full hard row from a right crop.\n if (mode === \"physicalRow\" || (mode === \"logicalLine\" && !soft) || row === rows - 1) {\n finish(soft ? \"clipped\" : \"unknown\");\n } else if (!soft) {\n if (++total > LINK_LIMITS.totalText || text.length + 1 > LINK_LIMITS.chunk) throw new RangeError(\"Link text exceeds limit\");\n text += \"\\n\";\n }\n }\n return result;\n}\n\nexport function mapLinkRange(mapped: MappedLinkChunk, index: number, length: number): SelectionRange[] | null {\n const end = index + length, { chunk } = mapped;\n if (length <= 0 || index < 0 || end > chunk.text.length || !mapped.boundaries.has(index) ||\n !mapped.boundaries.has(end) || (index === 0 && chunk.start !== \"complete\") ||\n (end === chunk.text.length && chunk.end !== \"complete\") ||\n chunk.text.slice(index, end).includes(\"\\0\")) return null;\n for (const boundary of mapped.unsafe) {\n if (boundary === index || boundary === end ||\n (boundary > index && boundary < end && chunk.text[boundary - 1] !== \" \")) return null;\n }\n const ranges: SelectionRange[] = [];\n for (const span of mapped.spans) {\n if (span.end <= index || span.start >= end) continue;\n if (span.start < index || span.end > end) return null;\n const last = ranges.at(-1);\n if (last && last.row === span.row && last.endColumn === span.startColumn) last.endColumn = span.endColumn;\n else ranges.push({ row: span.row, startColumn: span.startColumn, endColumn: span.endColumn });\n }\n return ranges.length ? ranges : null;\n}\n", "export { WebTerminal } from \"./web-terminal.js\";\nexport { createWebSocketTransport } from \"./websocket-transport.js\";\nexport { defaultLightPalette, defaultDarkPalette } from \"./terminal-palette.js\";\nexport { InputRoute, TerminalAction, defaultInputBindings } from \"./input-policy.js\";\nexport { MIN_FONT_SIZE, MAX_FONT_SIZE } from \"./terminal-sizing.js\";\nexport { parseCommandMarkParameters, getCmdlineUrl } from \"./command-mark.js\";\nexport { linkAction } from \"./link-options.js\";\nexport { createDefaultScrollbarRenderer, renderDefaultScrollbar } from \"./scrollbar-renderer.js\";\nexport { renderDefaultScrollbarTooltip } from \"./scrollbar-tooltip.js\";\nexport type * from \"./types.js\";\n\n// Keep worker globals out of the public declarations' ambient requirements.\ndeclare const DedicatedWorkerGlobalScope: { new(): object };\n\nif (typeof DedicatedWorkerGlobalScope !== \"undefined\" && globalThis instanceof DedicatedWorkerGlobalScope) {\n switch (new URL(import.meta.url).hash) {\n case \"#hex1b-terminal-worker\":\n await import(\"./terminal-worker.js\");\n break;\n case \"#hex1b-link-detection-worker\":\n await import(\"./link-detection-worker.js\");\n break;\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["transport", "resolve", "send", "key", "palette", "metadata", "metadata", "cells", "underlineColor", "transport", "shader", "viewport", "resource", "resolve", "key", "renderer", "viewport", "cells", "color", "metadata", "palette", "start", "cells", "metadata", "clamp", "key", "send", "scheduled", "clamp", "key", "position", "palette", "resolve", "send", "viewport", "rowId", "resolve", "color", "viewport", "color", "renderer", "key", "force", "cells", "links", "key", "transport", "links", "viewport", "key", "value", "palette", "color", "range"]
7
7
  }