@hex1b/web-terminal 0.1.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/LICENSE +21 -0
- package/README.md +243 -0
- package/dist/fonts/cascadia-mono-nf/CascadiaMonoNF.woff2 +0 -0
- package/dist/fonts/cascadia-mono-nf/LICENSE.txt +94 -0
- package/dist/fonts/cascadia-mono-nf/README.md +29 -0
- package/dist/history-state.d.ts +27 -0
- package/dist/history-state.d.ts.map +1 -0
- package/dist/history-state.js +194 -0
- package/dist/history-state.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/dist/input-policy.d.ts +42 -0
- package/dist/input-policy.d.ts.map +1 -0
- package/dist/input-policy.js +143 -0
- package/dist/input-policy.js.map +1 -0
- package/dist/mouse-input.d.ts +26 -0
- package/dist/mouse-input.d.ts.map +1 -0
- package/dist/mouse-input.js +356 -0
- package/dist/mouse-input.js.map +1 -0
- package/dist/protocol.d.ts +17 -0
- package/dist/protocol.d.ts.map +1 -0
- package/dist/protocol.js +270 -0
- package/dist/protocol.js.map +1 -0
- package/dist/renderer.d.ts +113 -0
- package/dist/renderer.d.ts.map +1 -0
- package/dist/renderer.js +595 -0
- package/dist/renderer.js.map +1 -0
- package/dist/selection-input.d.ts +36 -0
- package/dist/selection-input.d.ts.map +1 -0
- package/dist/selection-input.js +69 -0
- package/dist/selection-input.js.map +1 -0
- package/dist/selection-ui.d.ts +24 -0
- package/dist/selection-ui.d.ts.map +1 -0
- package/dist/selection-ui.js +113 -0
- package/dist/selection-ui.js.map +1 -0
- package/dist/terminal-font.d.ts +23 -0
- package/dist/terminal-font.d.ts.map +1 -0
- package/dist/terminal-font.js +85 -0
- package/dist/terminal-font.js.map +1 -0
- package/dist/terminal-sizing.d.ts +8 -0
- package/dist/terminal-sizing.d.ts.map +1 -0
- package/dist/terminal-sizing.js +38 -0
- package/dist/terminal-sizing.js.map +1 -0
- package/dist/terminal-theme.d.ts +2 -0
- package/dist/terminal-theme.d.ts.map +1 -0
- package/dist/terminal-theme.js +39 -0
- package/dist/terminal-theme.js.map +1 -0
- package/dist/terminal-worker.d.ts +2 -0
- package/dist/terminal-worker.d.ts.map +1 -0
- package/dist/terminal-worker.js +285 -0
- package/dist/terminal-worker.js.map +1 -0
- package/dist/types.d.ts +312 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/validation.d.ts +3 -0
- package/dist/validation.d.ts.map +1 -0
- package/dist/validation.js +7 -0
- package/dist/validation.js.map +1 -0
- package/dist/web-terminal.d.ts +51 -0
- package/dist/web-terminal.d.ts.map +1 -0
- package/dist/web-terminal.js +728 -0
- package/dist/web-terminal.js.map +1 -0
- package/dist/wire-types.d.ts +218 -0
- package/dist/wire-types.d.ts.map +1 -0
- package/dist/wire-types.js +2 -0
- package/dist/wire-types.js.map +1 -0
- package/package.json +42 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"web-terminal.js","sourceRoot":"","sources":["../src/web-terminal.ts"],"names":[],"mappings":"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","sourcesContent":["import { captureMouse } from \"./mouse-input.js\";\nimport { normalizeFont } from \"./terminal-font.js\";\nimport { dimensions, normalizeSizing, requestedGrid, fittedScale } from \"./terminal-sizing.js\";\nimport { HistoryState } from \"./history-state.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 type { MouseCapture } from \"./mouse-input.js\";\nimport type { CopySelectionOptions, InputActionHandler, InputDecision, InputBinding,\n TerminalActionName, TerminalGeometry, TerminalInput, TerminalInputContext, TerminalPeer,\n TerminalSelection, TerminalSizing, TerminalSizingState, TerminalStats, TerminalViewport,\n WebTerminalHandle, WebTerminalOptions } from \"./types.js\";\nimport type { 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 // 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 #disposed = false;\n #hasGeometry = false;\n #resizeTimer: ReturnType<typeof setTimeout> | undefined;\n #lastRequested: string | undefined;\n #compositionTimer: ReturnType<typeof setTimeout> | undefined;\n #ready = Promise.withResolvers<WebTerminal>();\n #readyTimer: ReturnType<typeof setTimeout> | undefined;\n #stats: TerminalStats = {};\n #screenText = \"\";\n #history: HistoryState;\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\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 if (!options?.url) throw new TypeError(\"A terminal WebSocket URL is required\");\n if (options.signal?.aborted) throw options.signal.reason;\n if (!window.isSecureContext || !navigator.gpu) throw new Error(\"WebTerminal requires WebGPU over HTTPS or localhost\");\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);\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) {\n this.#options = options;\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.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.#history = new HistoryState(command => this.#send(command), () => this.#inspectionChanged());\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 stats(): TerminalStats { return { ...this.#stats }; }\n get screenText() { return this.#screenText; }\n get sizing(): TerminalSizingState { return { ...this.#sizing }; }\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 = new URL(this.#options.url, 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 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: relative; flex: none; overflow: hidden; }\n canvas { display: block; width: 100%; height: 100%; user-select: none; touch-action: none; }\n .highlights { position: absolute; inset: 0; pointer-events: none; overflow: hidden; }\n .highlight { position: absolute; background: var(--cp-view-accent); opacity: .3; }\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><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.#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.#options.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 state: () => ({ historical: !this.viewport.following || this.viewport.pending, readOnly: !!this.#options.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(() => this.#history.scroll(delta, endpoint)),\n end: cancelled => this.#history.endGesture(cancelled),\n resolve: input => this.#resolveInput(input),\n execute: (decision, input) => this.#executeInputAction(decision, 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(new URL(\"./terminal-worker.js\", import.meta.url), { 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.#post({ type: \"init\", canvas, url: url.href, scale, font }, [canvas]);\n }\n\n #message(message: WorkerOutputMessage): void {\n if (this.#disposed) return;\n if (message.type === \"connected\") {\n this.#connected = true;\n this.#input.disabled = !this.#canInput();\n } else if (message.type === \"disconnected\") {\n this.#disconnect();\n } else if (message.type === \"status\") {\n if (message.level === \"error\") {\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 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.#mouse?.update(message.columns, message.rows, message.mouseTracking);\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.#history.accept(message.history, message.revision);\n }\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 } else if (message.type === \"history\") {\n this.#screenText = message.text;\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.#connected && (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 width = this.#geometry.columns * this.#geometry.cellWidth;\n const height = this.#geometry.rows * this.#geometry.cellHeight;\n const scale = fittedScale(this.#size, this.#geometry, this.#peer.isPrimary, this.#sizing);\n this.#surface.style.width = `${width * scale}px`;\n this.#surface.style.height = `${height * scale}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 const dpr = window.devicePixelRatio || 1;\n this.#post({ type: \"viewport\", width: Math.ceil(width * scale * dpr), height: Math.ceil(height * scale * dpr) });\n }\n\n #fittedGrid() {\n return requestedGrid(this.#size, this.#geometry, this.#sizing);\n }\n\n #queueResize(includeFixed = false) {\n if (this.#sizing.mode === \"fixed\" && !includeFixed) return;\n if (!this.#hasGeometry || !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.#connected) 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 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 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 element.style.cssText = `left:${range.startColumn / this.#geometry.columns * 100}%;top:${range.row / this.#geometry.rows * 100}%;width:${(range.endColumn - range.startColumn) / 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.#options.onViewportChange?.(viewport);\n this.#options.onSelectionChange?.(selection);\n }\n\n scrollLines(delta: number): void { this.#history.scroll(delta); }\n scrollToLive() { this.#history.live(); }\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 ||\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 ||\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.#options.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.#geometry.mouseTracking !== 0,\n historical: !this.viewport.following || this.viewport.pending,\n readOnly: !!this.#options.readOnly, connected: this.#connected, peer: this.peer\n });\n }\n\n #resolveInput(input: TerminalInput): InputDecision {\n try { return this.#policy.resolve(Object.freeze(input), this.inputContext); }\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.#options.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 #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.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 composing = true;\n compositionCommit = null;\n clearTimeout(this.#compositionTimer);\n }, options);\n input.addEventListener(\"compositionend\", event => {\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.#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.#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.#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 if (this.#input) this.#input.disabled = true;\n this.#mouse?.update(1, 1, 0);\n this.#history.disconnect();\n this.#inspectionChanged();\n clearTimeout(this.#resizeTimer);\n this.#resizeTimer = undefined;\n }\n\n #fail(error: Error): void {\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.#disconnect();\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.#mouse?.dispose();\n this.#listeners.abort();\n this.#post({ type: \"stop\" });\n this.#worker?.terminate();\n this.element.remove();\n }\n}\n"]}
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
import type { InputModifiers, PointerButton, SelectionMode, SelectionRange, TerminalBuffer, TerminalFont, TerminalGeometry, TerminalPeer, TerminalSize, TerminalStats, TerminalStatusLevel } from "./types.js";
|
|
2
|
+
export type SelectionText = {
|
|
3
|
+
status: "valid";
|
|
4
|
+
text: string;
|
|
5
|
+
} | {
|
|
6
|
+
status: "none" | "invalidated";
|
|
7
|
+
text: null;
|
|
8
|
+
};
|
|
9
|
+
export type HistorySelection = SelectionText & {
|
|
10
|
+
requestId: number;
|
|
11
|
+
mode: SelectionMode;
|
|
12
|
+
ranges: SelectionRange[];
|
|
13
|
+
};
|
|
14
|
+
export interface HistoryMetadata {
|
|
15
|
+
generation: string;
|
|
16
|
+
buffer: TerminalBuffer;
|
|
17
|
+
totalRows: number;
|
|
18
|
+
liveTop: number;
|
|
19
|
+
top: number;
|
|
20
|
+
following: boolean;
|
|
21
|
+
requestId: number;
|
|
22
|
+
rowIds: string[];
|
|
23
|
+
selection: HistorySelection;
|
|
24
|
+
copy: (SelectionText & {
|
|
25
|
+
requestId: number;
|
|
26
|
+
}) | null;
|
|
27
|
+
}
|
|
28
|
+
export interface TerminalCell {
|
|
29
|
+
index: number;
|
|
30
|
+
foreground: number;
|
|
31
|
+
background: number;
|
|
32
|
+
underlineColor: number;
|
|
33
|
+
attributes: number;
|
|
34
|
+
width: number;
|
|
35
|
+
underlineStyle: number;
|
|
36
|
+
text: string;
|
|
37
|
+
}
|
|
38
|
+
export interface ImageMetadata {
|
|
39
|
+
key: string;
|
|
40
|
+
width: number;
|
|
41
|
+
height: number;
|
|
42
|
+
byteLength: number;
|
|
43
|
+
format: "rgba" | "png";
|
|
44
|
+
}
|
|
45
|
+
export interface FrameImage extends ImageMetadata {
|
|
46
|
+
bytes: Uint8Array<ArrayBuffer>;
|
|
47
|
+
}
|
|
48
|
+
export interface ImagePlacement {
|
|
49
|
+
key: string;
|
|
50
|
+
kind: "kgp" | "sixel";
|
|
51
|
+
x: number;
|
|
52
|
+
y: number;
|
|
53
|
+
width: number;
|
|
54
|
+
height: number;
|
|
55
|
+
sourceX: number;
|
|
56
|
+
sourceY: number;
|
|
57
|
+
sourceWidth: number;
|
|
58
|
+
sourceHeight: number;
|
|
59
|
+
clipX: number;
|
|
60
|
+
clipY: number;
|
|
61
|
+
clipWidth: number;
|
|
62
|
+
clipHeight: number;
|
|
63
|
+
z: number;
|
|
64
|
+
}
|
|
65
|
+
export interface FrameMetadata extends TerminalGeometry {
|
|
66
|
+
version: 1;
|
|
67
|
+
full: boolean;
|
|
68
|
+
revision: number;
|
|
69
|
+
baseRevision: number;
|
|
70
|
+
peer: TerminalPeer;
|
|
71
|
+
history: HistoryMetadata | null;
|
|
72
|
+
defaultBackground?: number;
|
|
73
|
+
defaultForeground?: number;
|
|
74
|
+
cursor: {
|
|
75
|
+
visible: boolean;
|
|
76
|
+
x: number;
|
|
77
|
+
y: number;
|
|
78
|
+
shape: number;
|
|
79
|
+
};
|
|
80
|
+
images: ImageMetadata[];
|
|
81
|
+
retainedImages: string[];
|
|
82
|
+
placements: ImagePlacement[];
|
|
83
|
+
warnings: string[];
|
|
84
|
+
stats: {
|
|
85
|
+
workloadBytes: number;
|
|
86
|
+
outputBatches: number;
|
|
87
|
+
captureMs: number;
|
|
88
|
+
elapsedMs: number;
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
export interface TerminalFrame {
|
|
92
|
+
metadata: FrameMetadata;
|
|
93
|
+
cells: TerminalCell[];
|
|
94
|
+
images: FrameImage[];
|
|
95
|
+
}
|
|
96
|
+
export type CellPosition = {
|
|
97
|
+
x: number;
|
|
98
|
+
y: number;
|
|
99
|
+
} & Partial<Pick<InputModifiers, "ctrl" | "alt" | "shift">>;
|
|
100
|
+
export type MouseButton = PointerButton | "none" | "wheelUp" | "wheelDown" | "wheelLeft" | "wheelRight";
|
|
101
|
+
export type MouseCommand = {
|
|
102
|
+
type: "mouse";
|
|
103
|
+
action: "down" | "up" | "move" | "wheel";
|
|
104
|
+
button: MouseButton;
|
|
105
|
+
count?: number;
|
|
106
|
+
} & CellPosition;
|
|
107
|
+
export type InputCommand = {
|
|
108
|
+
type: "input" | "paste";
|
|
109
|
+
text: string;
|
|
110
|
+
} | {
|
|
111
|
+
type: "key";
|
|
112
|
+
key: string;
|
|
113
|
+
ctrl: boolean;
|
|
114
|
+
alt: boolean;
|
|
115
|
+
shift: boolean;
|
|
116
|
+
} | MouseCommand;
|
|
117
|
+
export type TerminalCommand = InputCommand | {
|
|
118
|
+
type: "viewport";
|
|
119
|
+
requestId: number;
|
|
120
|
+
delta?: number;
|
|
121
|
+
live?: boolean;
|
|
122
|
+
extend?: {
|
|
123
|
+
row: number;
|
|
124
|
+
column: number;
|
|
125
|
+
};
|
|
126
|
+
} | {
|
|
127
|
+
type: "selection";
|
|
128
|
+
action: "clear";
|
|
129
|
+
requestId: number;
|
|
130
|
+
} | {
|
|
131
|
+
type: "selection";
|
|
132
|
+
action: "start" | "extend";
|
|
133
|
+
mode: SelectionMode;
|
|
134
|
+
requestId: number;
|
|
135
|
+
generation: string;
|
|
136
|
+
rowId: string;
|
|
137
|
+
column: number;
|
|
138
|
+
} | {
|
|
139
|
+
type: "copy";
|
|
140
|
+
requestId: number;
|
|
141
|
+
selectionRequestId: number;
|
|
142
|
+
generation: string;
|
|
143
|
+
} | {
|
|
144
|
+
type: "resize" | "requestPrimary";
|
|
145
|
+
columns: number;
|
|
146
|
+
rows: number;
|
|
147
|
+
} | {
|
|
148
|
+
type: "resync";
|
|
149
|
+
} | {
|
|
150
|
+
type: "ack";
|
|
151
|
+
revision: number;
|
|
152
|
+
};
|
|
153
|
+
export type WorkerInputMessage = {
|
|
154
|
+
type: "init";
|
|
155
|
+
canvas: OffscreenCanvas;
|
|
156
|
+
url: string;
|
|
157
|
+
scale: number;
|
|
158
|
+
font: TerminalFont;
|
|
159
|
+
} | ({
|
|
160
|
+
type: "viewport";
|
|
161
|
+
} & TerminalSize) | {
|
|
162
|
+
type: "command";
|
|
163
|
+
command: TerminalCommand;
|
|
164
|
+
} | {
|
|
165
|
+
type: "stop";
|
|
166
|
+
};
|
|
167
|
+
export interface WorkerStats extends TerminalStats {
|
|
168
|
+
revision: number;
|
|
169
|
+
fullFrames: number;
|
|
170
|
+
frames: number;
|
|
171
|
+
presentations: number;
|
|
172
|
+
changedCells: number;
|
|
173
|
+
lastChangedCells: number;
|
|
174
|
+
discardedFrames: number;
|
|
175
|
+
imageCount: number;
|
|
176
|
+
textureBytes: number;
|
|
177
|
+
atlasGlyphs: number;
|
|
178
|
+
atlasBytes: number;
|
|
179
|
+
bytesReceived: number;
|
|
180
|
+
imageUploadBytes: number;
|
|
181
|
+
imagePayloadBytes: number;
|
|
182
|
+
gpu: "initializing" | "ready" | "error" | "stopped";
|
|
183
|
+
connected: boolean;
|
|
184
|
+
warnings: string[];
|
|
185
|
+
fps: number;
|
|
186
|
+
receivedKBps: number;
|
|
187
|
+
workloadMBps: number;
|
|
188
|
+
captureMs: number;
|
|
189
|
+
rendererCpuMs: number;
|
|
190
|
+
preparationCpuMs: number;
|
|
191
|
+
workloadBytes: number;
|
|
192
|
+
outputBatches: number;
|
|
193
|
+
serverElapsedMs: number;
|
|
194
|
+
history?: HistoryMetadata | null;
|
|
195
|
+
}
|
|
196
|
+
export type WorkerOutputMessage = {
|
|
197
|
+
type: "connected" | "disconnected";
|
|
198
|
+
} | {
|
|
199
|
+
type: "status";
|
|
200
|
+
message: string;
|
|
201
|
+
level: TerminalStatusLevel;
|
|
202
|
+
} | ({
|
|
203
|
+
type: "geometry";
|
|
204
|
+
peer: TerminalPeer;
|
|
205
|
+
history: HistoryMetadata | null;
|
|
206
|
+
revision: number;
|
|
207
|
+
text: string;
|
|
208
|
+
} & TerminalGeometry) | {
|
|
209
|
+
type: "history";
|
|
210
|
+
history: HistoryMetadata | null;
|
|
211
|
+
revision: number;
|
|
212
|
+
text: string;
|
|
213
|
+
} | {
|
|
214
|
+
type: "stats";
|
|
215
|
+
stats: WorkerStats;
|
|
216
|
+
text?: string;
|
|
217
|
+
};
|
|
218
|
+
//# sourceMappingURL=wire-types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wire-types.d.ts","sourceRoot":"","sources":["../src/wire-types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wire-types.js","sourceRoot":"","sources":["../src/wire-types.ts"],"names":[],"mappings":"","sourcesContent":["import type { InputModifiers, PointerButton, SelectionMode, SelectionRange,\n TerminalBuffer, TerminalFont, TerminalGeometry, TerminalPeer, TerminalSize, TerminalStats,\n TerminalStatusLevel } from \"./types.js\";\n\nexport type SelectionText =\n | { status: \"valid\"; text: string }\n | { status: \"none\" | \"invalidated\"; text: null };\nexport type HistorySelection = SelectionText & {\n requestId: number; mode: SelectionMode; ranges: SelectionRange[];\n};\nexport interface HistoryMetadata {\n generation: string; buffer: TerminalBuffer; totalRows: number; liveTop: number; top: number;\n following: boolean; requestId: number; rowIds: string[];\n selection: HistorySelection;\n copy: (SelectionText & { requestId: number }) | null;\n}\nexport interface TerminalCell {\n index: number; foreground: number; background: number; underlineColor: number;\n attributes: number; width: number; underlineStyle: number; text: string;\n}\nexport interface ImageMetadata {\n key: string; width: number; height: number; byteLength: number; format: \"rgba\" | \"png\";\n}\nexport interface FrameImage extends ImageMetadata { bytes: Uint8Array<ArrayBuffer> }\nexport interface ImagePlacement {\n key: string; kind: \"kgp\" | \"sixel\";\n x: number; y: number; width: number; height: number;\n sourceX: number; sourceY: number; sourceWidth: number; sourceHeight: number;\n clipX: number; clipY: number; clipWidth: number; clipHeight: number; z: number;\n}\nexport interface FrameMetadata extends TerminalGeometry {\n version: 1; full: boolean; revision: number; baseRevision: number;\n peer: TerminalPeer; history: HistoryMetadata | null;\n defaultBackground?: number; defaultForeground?: number;\n cursor: { visible: boolean; x: number; y: number; shape: number };\n images: ImageMetadata[]; retainedImages: string[]; placements: ImagePlacement[]; warnings: string[];\n stats: { workloadBytes: number; outputBatches: number; captureMs: number; elapsedMs: number };\n}\nexport interface TerminalFrame { metadata: FrameMetadata; cells: TerminalCell[]; images: FrameImage[] }\nexport type CellPosition = { x: number; y: number } & Partial<Pick<InputModifiers, \"ctrl\" | \"alt\" | \"shift\">>;\nexport type MouseButton = PointerButton | \"none\" | \"wheelUp\" | \"wheelDown\" | \"wheelLeft\" | \"wheelRight\";\nexport type MouseCommand = {\n type: \"mouse\"; action: \"down\" | \"up\" | \"move\" | \"wheel\"; button: MouseButton; count?: number;\n} & CellPosition;\nexport type InputCommand =\n | { type: \"input\" | \"paste\"; text: string }\n | { type: \"key\"; key: string; ctrl: boolean; alt: boolean; shift: boolean }\n | MouseCommand;\nexport type TerminalCommand = InputCommand\n | { type: \"viewport\"; requestId: number; delta?: number; live?: boolean;\n extend?: { row: number; column: number } }\n | { type: \"selection\"; action: \"clear\"; requestId: number }\n | { type: \"selection\"; action: \"start\" | \"extend\"; mode: SelectionMode;\n requestId: number; generation: string; rowId: string; column: number }\n | { type: \"copy\"; requestId: number; selectionRequestId: number; generation: string }\n | { type: \"resize\" | \"requestPrimary\"; columns: number; rows: number }\n | { type: \"resync\" }\n | { type: \"ack\"; revision: number };\nexport type WorkerInputMessage =\n | { type: \"init\"; canvas: OffscreenCanvas; url: string; scale: number; font: TerminalFont }\n | ({ type: \"viewport\" } & TerminalSize)\n | { type: \"command\"; command: TerminalCommand }\n | { type: \"stop\" };\nexport interface WorkerStats extends TerminalStats {\n revision: number; fullFrames: number; frames: number; presentations: number;\n changedCells: number; lastChangedCells: number; discardedFrames: number;\n imageCount: number; textureBytes: number; atlasGlyphs: number; atlasBytes: number;\n bytesReceived: number; imageUploadBytes: number; imagePayloadBytes: number;\n gpu: \"initializing\" | \"ready\" | \"error\" | \"stopped\"; connected: boolean; warnings: string[];\n fps: number; receivedKBps: number; workloadMBps: number;\n captureMs: number; rendererCpuMs: number; preparationCpuMs: number;\n workloadBytes: number; outputBatches: number; serverElapsedMs: number;\n history?: HistoryMetadata | null;\n}\nexport type WorkerOutputMessage =\n | { type: \"connected\" | \"disconnected\" }\n | { type: \"status\"; message: string; level: TerminalStatusLevel }\n | ({ type: \"geometry\"; peer: TerminalPeer; history: HistoryMetadata | null;\n revision: number; text: string } & TerminalGeometry)\n | { type: \"history\"; history: HistoryMetadata | null; revision: number; text: string }\n | { type: \"stats\"; stats: WorkerStats; text?: string };\n"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@hex1b/web-terminal",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "First-party WebGPU browser terminal for Hex1b",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"import": "./dist/index.js"
|
|
12
|
+
}
|
|
13
|
+
},
|
|
14
|
+
"files": [
|
|
15
|
+
"dist",
|
|
16
|
+
"README.md",
|
|
17
|
+
"LICENSE"
|
|
18
|
+
],
|
|
19
|
+
"sideEffects": false,
|
|
20
|
+
"license": "MIT",
|
|
21
|
+
"repository": {
|
|
22
|
+
"type": "git",
|
|
23
|
+
"url": "git+https://github.com/mitchdenny/hex1b.git",
|
|
24
|
+
"directory": "src/web-terminal"
|
|
25
|
+
},
|
|
26
|
+
"publishConfig": {
|
|
27
|
+
"access": "public"
|
|
28
|
+
},
|
|
29
|
+
"engines": {
|
|
30
|
+
"node": ">=22"
|
|
31
|
+
},
|
|
32
|
+
"scripts": {
|
|
33
|
+
"build": "node scripts/clean.mjs && tsc -p tsconfig.json && node scripts/copy-assets.mjs",
|
|
34
|
+
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
35
|
+
"test": "node --test tests/*.test.mjs && tsc -p tests/types/tsconfig.json && tsc -p tests/types/tsconfig.bundler.json",
|
|
36
|
+
"prepack": "npm run build"
|
|
37
|
+
},
|
|
38
|
+
"devDependencies": {
|
|
39
|
+
"@webgpu/types": "0.1.69",
|
|
40
|
+
"typescript": "5.9.3"
|
|
41
|
+
}
|
|
42
|
+
}
|