mirror of
https://github.com/NousResearch/hermes-agent.git
synced 2026-06-27 11:22:03 +00:00
Conversation rhythm: - Single `--paragraph-gap` knob drives paragraph spacing both inside a markdown block and between consecutive prose parts, out-specifying Tailwind Typography's prose margins. Code cards carry the same gap themselves so it holds at any Streamdown nesting depth. - Two-tier vertical rhythm: `--turn-block-gap` separates scaffolding (tools / thinking) from the reply; `--tool-row-gap` keeps a tool run tight. - Drop the prose indent so prose, tools, todos, and thinking share one left edge. `---` renders as quiet spacing, not a heavy rule. Flat tool list: - Tools always render as a standalone-row stack, never a "Tool actions · N steps" group. assistant-ui slices the tool range unstably (interleaved live vs. reconstructed-consecutive when settled), so grouping reshuffled the whole turn the instant it settled. Flat rows are pixel-identical either way. - Inline approvals can no longer be buried in a collapsed group body. - Remove the now-dead grouping helpers from tool-fallback-model. Empty thinking: - Suppress reasoning disclosures with no visible text (encrypted / spinner- coerced reasoning) instead of leaving an empty "Thinking" header. - Tail stall indicator returns "thinking" when a running turn goes quiet. Streaming cadence: - Smooth character-reveal decouples visible cadence from bursty arrival. - Flush queued text deltas before applying tool events so a tool row can't jump ahead of its preceding text. - Disable Nagle on the GUI WebSocket so per-token frames aren't coalesced. Polish: clarify/patch/vision_analyze tool meta, queue-panel + diff-lines spacing, sticky human bubble expands on focus (not hover).
54 lines
1.8 KiB
TypeScript
54 lines
1.8 KiB
TypeScript
import * as React from 'react'
|
|
|
|
import { cn } from '@/lib/utils'
|
|
|
|
/**
|
|
* Per-line classed renderer for unified diffs. Lives outside `CodeCard` so
|
|
* tool-result panels (already nested inside a tool card) don't double-shell;
|
|
* for markdown ` ```diff ` fences the standard `CodeCard` + Shiki path runs
|
|
* instead and gives equivalent coloring.
|
|
*/
|
|
interface DiffLineKind {
|
|
className?: string
|
|
match: (line: string) => boolean
|
|
}
|
|
|
|
const DIFF_LINE_KINDS: DiffLineKind[] = [
|
|
{
|
|
className: 'text-emerald-700 dark:text-emerald-300',
|
|
match: line => line.startsWith('+') && !line.startsWith('+++')
|
|
},
|
|
{ className: 'text-rose-700 dark:text-rose-300', match: line => line.startsWith('-') && !line.startsWith('---') },
|
|
{ className: 'text-sky-700 dark:text-sky-300', match: line => line.startsWith('@@') },
|
|
{
|
|
className: 'text-muted-foreground/70',
|
|
match: line => line.startsWith('---') || line.startsWith('+++') || / → /.test(line.slice(0, 60))
|
|
}
|
|
]
|
|
|
|
function classifyLine(line: string): string | undefined {
|
|
return DIFF_LINE_KINDS.find(kind => kind.match(line))?.className
|
|
}
|
|
|
|
interface DiffLinesProps extends Omit<React.ComponentProps<'pre'>, 'children'> {
|
|
text: string
|
|
}
|
|
|
|
export function DiffLines({ className, text, ...props }: DiffLinesProps) {
|
|
return (
|
|
<pre
|
|
className={cn(
|
|
'mt-1 mb-1.5 max-h-96 max-w-full min-w-0 overflow-auto rounded-md border border-border/60 bg-muted/35 px-2.5 py-1.5 font-mono text-[0.7rem] leading-relaxed text-muted-foreground',
|
|
className
|
|
)}
|
|
data-slot="diff-lines"
|
|
{...props}
|
|
>
|
|
{text.split('\n').map((line, index) => (
|
|
<span className={cn('block min-w-max whitespace-pre', classifyLine(line))} key={`${index}-${line}`}>
|
|
{line || ' '}
|
|
</span>
|
|
))}
|
|
</pre>
|
|
)
|
|
}
|