feat(v2): add copy/paste, theme hot-swap, tree enhancements, session resume, drag-resize

- TerminalPane: Ctrl+Shift+C/V copy/paste via attachCustomKeyEventHandler
- TerminalPane: subscribe to onThemeChange() for live theme hot-swap
- theme.svelte.ts: callback registry (onThemeChange) notifies listeners on setFlavor()
- AgentPane: session resume with follow-up prompt and resume_session_id
- AgentPane: tree node click scrolls to corresponding message (scrollIntoView)
- AgentTree: subtree cost display below each node, NODE_H 32->40
- TilingGrid: pane drag-resize via splitter overlays with mouse drag (10-90% clamping)
This commit is contained in:
Hibryda 2026-03-06 15:09:52 +01:00
parent 1d028c67f7
commit f27543d8d8
5 changed files with 324 additions and 12 deletions

View file

@ -10,6 +10,17 @@ import {
let currentFlavor = $state<CatppuccinFlavor>('mocha');
/** Registered theme-change listeners */
const themeChangeCallbacks = new Set<() => void>();
/** Register a callback invoked after every flavor change. Returns an unsubscribe function. */
export function onThemeChange(callback: () => void): () => void {
themeChangeCallbacks.add(callback);
return () => {
themeChangeCallbacks.delete(callback);
};
}
export function getCurrentFlavor(): CatppuccinFlavor {
return currentFlavor;
}
@ -22,6 +33,15 @@ export function getXtermTheme(): XtermTheme {
export async function setFlavor(flavor: CatppuccinFlavor): Promise<void> {
currentFlavor = flavor;
applyCssVariables(flavor);
// Notify all listeners (e.g. open xterm.js terminals)
for (const cb of themeChangeCallbacks) {
try {
cb();
} catch (e) {
console.error('Theme change callback error:', e);
}
}
try {
await setSetting('theme', flavor);
} catch (e) {