Opt-in, permission-aware browser clipboard support for @gespenst/core, including MIME-aware paste
events from the Kitty clipboard protocol.
pnpm add @gespenst/core @gespenst/clipboard
import { ClipboardAddon } from '@gespenst/clipboard';
const clipboard = new ClipboardAddon({
confirmUnsafePaste: async ({ text }) => {
return showPasteConfirmation(text);
},
onError(error) {
showToast(`Clipboard failed: ${error.message}`);
},
});
terminal.loadAddon(clipboard);
await clipboard.ready;
Loading the addon intercepts native paste events inside the terminal. Text falls back to normal bracketed paste when the running application does not enable Kitty mode 5522. Applications that do enable mode 5522 receive an event containing the available MIME types and can request an image, rich text, or another representation through the PTY.
For a custom paste button, keep the clipboard read in the click handler so browser user activation is still valid:
pasteButton.addEventListener('click', async () => {
const result = await clipboard.pasteFromClipboard();
if (result.status === 'unsafe') showToast('Paste cancelled');
});
pasteFromClipboard().confirmUnsafePaste is the only opt-in override.Browser clipboard reads generally require HTTPS or localhost and a current user activation. Native
paste events are the most portable route because the browser supplies their DataTransfer
directly.
When navigator.clipboard.read() is available, every representation exposed by each
ClipboardItem is forwarded as raw bytes. Otherwise readText() provides text/plain. Duplicate
MIME types are removed, MIME names are normalized to lowercase, and the total byte limit is checked
before data reaches the terminal worker.