This repository has no description
0

Configure Feed

Select the types of activity you want to include in your feed.

FDA docs, selectable group API, and display fixes

Nathan Herald (Apr 14, 2026, 4:05 PM +0200) b5ba5e9e 862d1ba4

+17 -8
+5
CHANGELOG.md
··· 25 25 - Supervisor logs every skip reason in `doRestart` for debugging 26 26 - Supervisor state directory moved to `~/.local/state/pty/supervisor/` (no longer pollutes session dir) 27 27 28 + ### TUI framework 29 + - Export `SelectableGroup<T>` interface from `@myobie/pty/tui` 30 + - `groupedSelectable` `renderHeader` callback now receives the full group object instead of `(title, count)` — allows custom group rendering 31 + - Empty groups are now rendered (header shown) instead of being silently skipped 32 + 28 33 ## 0.7.0 29 34 30 35 ### Supervisor
+1 -1
README.md
··· 192 192 tags = { strategy = "permanent" } 193 193 ``` 194 194 195 - For macOS auto-start on login: `pty supervisor launchd install`. 195 + For macOS auto-start on login: `pty supervisor launchd install`. The install will compile a small wrapper binary and prompt you to grant it Full Disk Access (required for sessions on external/removable volumes). Linux (systemd) and other OS integrations are a TODO — contributions welcome. 196 196 197 197 ### Plugins 198 198
+1 -1
src/cli.ts
··· 581 581 pty supervisor status Show supervised sessions 582 582 pty supervisor forget <name> Stop supervising a session 583 583 pty supervisor reset <name> Reset a failed session for retry 584 - pty supervisor launchd install [--path PATH] Register with macOS launchd 584 + pty supervisor launchd install [--path PATH] Register with macOS launchd (requires FDA) 585 585 pty supervisor launchd uninstall Remove from launchd`); 586 586 break; 587 587 }
+9 -5
src/tui/builders.ts
··· 166 166 * Headers and spacing rows are included in the visual output but the 167 167 * scroll offset is mapped from item-space to visual-row-space automatically. 168 168 */ 169 + export interface SelectableGroup<T> { 170 + title: string; 171 + items: T[]; 172 + } 173 + 169 174 export function groupedSelectable<T>( 170 175 region: ScrollRegion, 171 - groups: { title: string; items: T[] }[], 176 + groups: SelectableGroup<T>[], 172 177 renderItem: (item: T, globalIndex: number, selected: boolean) => UINode[], 173 - renderHeader: (title: string, count: number) => UINode[] = 174 - (title, count) => [text(title, "accent", { bold: true }), text(` (${count})`, "muted")], 178 + renderHeader: (group: SelectableGroup<T>) => UINode[] = 179 + (group) => [text(group.title, "accent", { bold: true }), text(` (${group.items.length})`, "muted")], 175 180 ): SelectableNode { 176 181 const allRows: UINode[][] = []; 177 182 let globalIdx = 0; ··· 179 184 let selectedVisualRow = 0; 180 185 181 186 for (const group of groups) { 182 - if (group.items.length === 0) continue; 183 187 if (allRows.length > 0) allRows.push([]); // spacing 184 - allRows.push(renderHeader(group.title, group.items.length)); // header 188 + allRows.push(renderHeader(group)); // header 185 189 for (const item of group.items) { 186 190 if (globalIdx === region.selectedIndex) { 187 191 selectedVisualRow = allRows.length;
+1 -1
src/tui/index.ts
··· 61 61 text, spacer, gap, separator, indent, 62 62 dot, checkbox, progressBar, spinner, icon, 63 63 row, column, hstack, panel, 64 - scrollable, selectable, groupedSelectable, 64 + scrollable, selectable, groupedSelectable, type SelectableGroup, 65 65 statusBar, footer, askBar, textInput, 66 66 fpsCounter, canvas, 67 67 createPty, attachPty, ptyView, themeToXterm,