Brooklyn Nicholson
8f553a55b2
chore(tui): fix eslint/prettier nits from npm run fix
...
- drop inline `import()` type annotation in useSessionLifecycle (import
`PanelSection` at the top like everything else)
- include `panel` and `session.resumeById` in the useMainApp useMemo
deps now that the event handler depends on them
- wrap the derived `selected` range in a useMemo so it has stable
identity and stops invalidating the TextInput `rendered` memo every
render
- prettier re-sorting of a couple of export/import lines
2026-04-17 11:00:15 -05:00
Brooklyn Nicholson
5b386ced71
fix(tui): approval flow + input ergonomics + selection perf
...
- tui_gateway: route approvals through gateway callback (HERMES_GATEWAY_SESSION/
HERMES_EXEC_ASK) so dangerous commands emit approval.request instead of
silently falling through the CLI input() path and auto-denying
- approval UX: dedicated PromptZone between transcript and composer, safer
defaults (sel=0, numeric quick-picks, no Esc=deny), activity trail line,
outcome footer under the cost row
- text input: Ctrl+A select-all, real forward Delete, Ctrl+W always consumed
(fixes Ctrl+Backspace at cursor 0 inserting literal w)
- hermes-ink selection: swap synchronous onRender() for throttled
scheduleRender() on drag, and only notify React subscribers on presence
change — no more per-cell paint/subscribe spam
- useConfigSync: silence config.get polling failures instead of surfacing
'error: timeout: config.get' in the transcript
2026-04-17 10:37:48 -05:00
Brooklyn Nicholson
39231f29c6
refactor(tui): /clean pass across ui-tui — 49 files, −217 LOC
...
Full codebase pass using the /clean doctrine (KISS/DRY, no one-off
helpers, no variables-used-once, pure functional where natural,
inlined obvious one-liners, killed dead exports, narrowed types,
spaced JSX). All contracts preserved — no RPC method, event name,
or exported type shape changed.
app/ — 15 files, -134 LOC
- inlined 4 one-off helpers (titleCase, isLong, statusToneFrom,
focusOutside predicate)
- stores to arrow-const style (buildUiState, buildTurnState,
buildOverlayState plus get/patch/reset triplets)
- functional slash/registry byName map (flatMap over for-loops)
- dropped dead param `live` in cancelOverlayFromCtrlC
- DRY'd duplicate shift() call in scrollWithSelection
- consolidated sections.push calls in /help
components/ — 12 files, -40 LOC
- extracted inline prop types to interfaces at file bottom (13×)
- inlined 6 one-off vars (pctLabel, logoW, heroW, cwd, title, hint)
- promoted HEART_COLORS + OPTS/LABELS to module scope
- JSX sibling spacing across 9 files
- un-shadowed `raw` in textInput
- components/thinking.tsx + components/markdown.tsx untouched
(structurally load-bearing / edge-case-heavy)
config content domain protocol/ — 8 files, -77 LOC
- tightened 3 regexes (MOUSE_TRACKING, looksLikeSlashCommand,
hasInterpolation — dropped stateful lastIndex dance)
- dead export ParsedSlashCommand removed
- MODES narrowed to `as const`, `.find(m => m === s)` replaces
`.includes() ? (as cast) : null`
- fortunes.ts hash via reduce
- fmtDuration ternary chain
- inlined aboveViewport predicate in viewport.ts
hooks/ + lib/ — 9 files, -38 LOC
- ANSI_RE via String.fromCharCode(27) + WS_RE lifted to module
scope (no more eslint-disable no-control-regex)
- compactPreview/edgePreview/thinkingPreview → ternary arrows
- useCompletion: hoisted pathReplace, moved stale-ref guard earlier
- useInputHistory: dropped useCallback wrapper (append is stable)
- useVirtualHistory: replaced 4× any with unknown + narrow
MeasuredNode interface + one cast site
root TS — 3 files, -63 LOC
- banner.ts: parseRichMarkup via matchAll instead of exec/lastIndex,
artWidth via reduce
- gatewayClient.ts: resolvePython candidate list collapse, inlined
one-branch guards in dispatch/pushLog/drain/request
- types.ts: alpha-sorted ActiveTool / Msg / SudoReq / SecretReq
members
eslint config
- disabled react-hooks/exhaustive-deps on packages/hermes-ink/**
(compiled by react/compiler, deps live in $[N] memo arrays that
eslint can't introspect) and removed the now-orphan in-file
disable directive in ScrollBox.tsx
fixes (not from the cleaner pass)
- useComposerState: unlinkSync(file) + try/catch → rmSync(file,
{ force: true }) — kills the no-empty lint error and is more
idiomatic
- useConfigSync: added setBellOnComplete + setVoiceEnabled to the
two useEffect dep arrays (they're stable React setState setters;
adding is safe and silences exhaustive-deps)
verification
- npx eslint src/ packages/ → 0 errors, 0 warnings
- npm run type-check → clean
- npm test → 50/50
- npm run build → 394.8kb ink-bundle.js, 11ms esbuild
- pytest tests/tui_gateway/ tests/test_tui_gateway_server.py
tests/hermes_cli/test_tui_resume_flow.py
tests/hermes_cli/test_tui_npm_install.py → 57/57
2026-04-16 22:32:53 -05:00
Brooklyn Nicholson
4b4b4d47bc
feat: just more cleaning
2026-04-15 14:14:01 -05:00
Brooklyn Nicholson
52c11d172a
feat: add scrollbar and fix selection on scroll
2026-04-14 14:34:33 -05:00
Brooklyn Nicholson
9a3a2925ed
feat: scroll aware sticky prompt
2026-04-14 11:49:32 -05:00
Brooklyn Nicholson
6d6b3b03ac
feat: add clicky handles
2026-04-13 21:20:55 -05:00
Brooklyn Nicholson
aeb53131f3
fix(ui-tui): harden TUI error handling, model validation, command UX parity, and gateway lifecycle
2026-04-13 18:29:24 -05:00
Brooklyn Nicholson
0fd33a98cd
feat: ctrl t for diff thinking rendering types
2026-04-12 20:08:12 -05:00
Brooklyn Nicholson
4b026d6761
fix: little box typey thing
2026-04-12 16:31:30 -05:00
Austin Pickett
5552e1ffe1
Merge branch 'feat/ink-refactor' of github.com:NousResearch/hermes-agent into feat/ink-refactor
2026-04-11 22:10:11 -04:00
Austin Pickett
90890f8f04
feat: personality selector
2026-04-11 22:10:02 -04:00
Brooklyn Nicholson
32302c37dd
feat: fix types and add type checking plus lazybundle on launch andddd dev flag
2026-04-11 14:42:28 -05:00
Brooklyn Nicholson
3fd5cf6e3c
feat: fix img pasting in new ink plus newline after tools
2026-04-11 13:14:32 -05:00
Brooklyn Nicholson
8760faf991
feat: fork ink and make it work nicely
2026-04-11 11:29:08 -05:00
Austin Pickett
4406b4b100
fix: add delete support
2026-04-09 19:53:55 -04:00
Brooklyn Nicholson
17f13013eb
chore: fmt
2026-04-09 14:17:45 -05:00
Brooklyn Nicholson
00e1d42b9e
feat: image pasting
2026-04-09 13:45:23 -05:00
Brooklyn Nicholson
0d7c19a42f
fix(ui-tui): ref-based input buffer, gateway listener stability, usage display, and 6 correctness bugs
2026-04-09 12:21:24 -05:00
Brooklyn Nicholson
54bd25ff4a
fix(tui): -c resume, ctrl z, pasting updates, exit summary, session fix
2026-04-09 00:36:53 -05:00
Brooklyn Nicholson
b66550ed08
fix(tui): stabilize multiline input, persist tool traces, and port CLI-style context status bar
2026-04-08 23:59:56 -05:00
Brooklyn Nicholson
b597123489
feat: better bg tasks
2026-04-08 14:18:37 -05:00
Brooklyn Nicholson
af0f4a52fe
feat: cute spinners
2026-04-08 13:45:34 -05:00
Brooklyn Nicholson
b397c91d4a
chore: uptick
2026-04-07 20:44:18 -05:00
Brooklyn Nicholson
9c2c9e3a3e
chore: fmt
2026-04-07 20:30:22 -05:00
Brooklyn Nicholson
29f2610e4b
tui updates for rendering pipeline
2026-04-07 20:11:05 -05:00