- 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
41 lines
1.0 KiB
TypeScript
41 lines
1.0 KiB
TypeScript
import { atom } from 'nanostores'
|
|
|
|
import type { ActiveTool, ActivityItem, SubagentProgress } from '../types.js'
|
|
|
|
const buildTurnState = (): TurnState => ({
|
|
activity: [],
|
|
outcome: '',
|
|
reasoning: '',
|
|
reasoningActive: false,
|
|
reasoningStreaming: false,
|
|
reasoningTokens: 0,
|
|
streaming: '',
|
|
subagents: [],
|
|
toolTokens: 0,
|
|
tools: [],
|
|
turnTrail: []
|
|
})
|
|
|
|
export const $turnState = atom<TurnState>(buildTurnState())
|
|
|
|
export const getTurnState = () => $turnState.get()
|
|
|
|
export const patchTurnState = (next: Partial<TurnState> | ((state: TurnState) => TurnState)) =>
|
|
$turnState.set(typeof next === 'function' ? next($turnState.get()) : { ...$turnState.get(), ...next })
|
|
|
|
export const resetTurnState = () => $turnState.set(buildTurnState())
|
|
|
|
export interface TurnState {
|
|
activity: ActivityItem[]
|
|
outcome: string
|
|
reasoning: string
|
|
reasoningActive: boolean
|
|
reasoningStreaming: boolean
|
|
reasoningTokens: number
|
|
streaming: string
|
|
subagents: SubagentProgress[]
|
|
toolTokens: number
|
|
tools: ActiveTool[]
|
|
turnTrail: string[]
|
|
}
|