Brooklyn Nicholson
6a3873942f
fix(tui): format thinking paragraphs
2026-04-26 15:38:18 -05:00
Brooklyn Nicholson
d4dde6b5f2
fix(tui): restore resumed transcript lineage
2026-04-26 15:16:12 -05:00
Brooklyn Nicholson
7b5b524fc7
refactor(tui): clean thinking and viewport helpers
2026-04-26 14:03:36 -05:00
Brooklyn Nicholson
c9f7b703dd
fix(tui): filter thinking status noise
2026-04-26 13:59:56 -05:00
IAvecilla
aa61831a14
fix(cli): keep snake_case underscores intact in strip markdown mode
2026-04-21 15:32:59 -03: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
68ecdb6e26
refactor(tui): store-driven turn state + slash registry + module split
...
Hoist turn state from a 286-line hook into $turnState atom + turnController
singleton. createGatewayEventHandler becomes a typed dispatch over the
controller; its ctx shrinks from 30 fields to 5. Event-handler refs and 16
threaded actions are gone.
Fold three createSlash*Handler factories into a data-driven SlashCommand[]
registry under slash/commands/{core,session,ops}.ts. Aliases are data;
findSlashCommand does name+alias lookup. Shared guarded/guardedErr combinator
in slash/guarded.ts.
Split constants.ts + app/helpers.ts into config/ (timing/limits/env),
content/ (faces/placeholders/hotkeys/verbs/charms/fortunes), domain/ (roles/
details/messages/paths/slash/viewport/usage), protocol/ (interpolation/paste).
Type every RPC response in gatewayTypes.ts (26 new interfaces); drop all
`(r: any)` across slash + main app.
Shrink useMainApp from 1216 -> 646 lines by extracting useSessionLifecycle,
useSubmission, useConfigSync. Add <Fg> themed primitive and strip ~50
`as any` color casts.
Tests: 50 passing. Build + type-check clean.
2026-04-16 12:34:45 -05:00
Brooklyn Nicholson
33c615504d
feat: add inline token count etc and fix venv
2026-04-15 10:20:56 -05:00
Brooklyn Nicholson
99d859ce4a
feat: refactor by splitting up app and doing proper state
2026-04-14 22:30:18 -05:00
Brooklyn Nicholson
c189d5e98b
fix: pasting
2026-04-13 22:39:03 -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
77b97b810a
chore: update how txt pasting ux feels
2026-04-13 14:49:10 -05:00
Brooklyn Nicholson
0642b6cc53
fix: clean newline paste thingy
2026-04-13 12:54:48 -05:00
Brooklyn Nicholson
0fd33a98cd
feat: ctrl t for diff thinking rendering types
2026-04-12 20:08:12 -05:00
Brooklyn Nicholson
ddb0871769
feat(tui): hierarchical tool progress with grouped parent/child rows and transient line pruning
2026-04-12 17:39:17 -05:00
Brooklyn Nicholson
e03bef684e
chore: fmt
2026-04-12 16:33:25 -05:00
Brooklyn Nicholson
ef51bb0091
fix: tool drafting stuff
2026-04-12 16:06:39 -05:00
Brooklyn Nicholson
24a498eb90
feat: better markdown
2026-04-11 17:15:36 -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
7803d21bcc
Merge branch 'feat/ink-refactor' of github.com:NousResearch/hermes-agent into feat/ink-refactor
2026-04-11 11:39:19 -05:00
Brooklyn Nicholson
8760faf991
feat: fork ink and make it work nicely
2026-04-11 11:29:08 -05:00
jonny
cab6447d58
fix(tui): render tool trail consistently between live and resume
...
Resumed sessions showed raw JSON tool output in content boxes instead
of the compact trail lines seen during live use. The root cause was
two separate rendering paths with no shared code.
Extract buildToolTrailLine() into lib/text.ts as the single source
of truth for formatting tool trail lines. Both the live tool.complete
handler and toTranscriptMessages now call it.
Server-side, reconstruct tool name and args from the assistant
message's tool_calls field (tool_name column is unpopulated) and
pass them through _tool_ctx/build_tool_preview — the same path
the live tool.start callback uses.
2026-04-11 06:35:00 +00:00
Brooklyn Nicholson
17ecdce936
feat: add slash commands to the history so it doesnt get lost
2026-04-09 18:51:17 -05:00
Brooklyn Nicholson
7e813a30e0
fix: sexier cots
2026-04-09 18:33:25 -05:00
Brooklyn Nicholson
b7d4ea1550
feat: better hyperlink formatting
2026-04-09 15:13:43 -05:00
Brooklyn Nicholson
8755b9dfc0
fix: resizing etc
2026-04-09 00:46:35 -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
afd670a36f
feat: small refactors
2026-04-06 18:38:13 -05:00
Brooklyn Nicholson
f116c59071
tui: inherit Python-side rendering via gateway bridge
2026-04-05 18:50:41 -05:00
Brooklyn Nicholson
bbba9ed4f2
feat: split apart main.tsx
2026-04-02 20:39:52 -05:00