mirror of
https://github.com/NousResearch/hermes-agent.git
synced 2026-04-28 06:51:16 +08:00
chore(tui): tighten todo-fix comments, drop dead archive call
- gateway handler: turnController always archives in recordMessageComplete, so the post-complete archiveTodosAtTurnEnd().forEach is dead code. Drop it and the now-unused import. - turnController: collapse archive prepend into a single spread expression. - gateway server: one-line comment for the tool.start todo skip.
This commit is contained in:
@@ -1040,15 +1040,9 @@ def _on_tool_start(sid: str, tool_call_id: str, name: str, args: dict):
|
|||||||
pass
|
pass
|
||||||
session.setdefault("tool_started_at", {})[tool_call_id] = time.time()
|
session.setdefault("tool_started_at", {})[tool_call_id] = time.time()
|
||||||
if _tool_progress_enabled(sid):
|
if _tool_progress_enabled(sid):
|
||||||
# Don't echo args.todos on tool.start — for merge=true (or partial
|
# tool.complete is the source of truth for todos (full list from the
|
||||||
# replacement) it's only the items being updated, not the full list,
|
# tool result). args.todos here may be a partial merge update.
|
||||||
# and would flicker the live count. tool.complete is the source of
|
_emit("tool.start", sid, {"tool_id": tool_call_id, "name": name, "context": _tool_ctx(name, args)})
|
||||||
# truth (always returns the full list from the tool result).
|
|
||||||
_emit(
|
|
||||||
"tool.start",
|
|
||||||
sid,
|
|
||||||
{"tool_id": tool_call_id, "name": name, "context": _tool_ctx(name, args)},
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
def _on_tool_complete(sid: str, tool_call_id: str, name: str, args: dict, result: str):
|
def _on_tool_complete(sid: str, tool_call_id: str, name: str, args: dict, result: str):
|
||||||
|
|||||||
@@ -11,7 +11,6 @@ import { applyDelegationStatus, getDelegationState } from './delegationStore.js'
|
|||||||
import type { GatewayEventHandlerContext } from './interfaces.js'
|
import type { GatewayEventHandlerContext } from './interfaces.js'
|
||||||
import { patchOverlayState } from './overlayStore.js'
|
import { patchOverlayState } from './overlayStore.js'
|
||||||
import { turnController } from './turnController.js'
|
import { turnController } from './turnController.js'
|
||||||
import { archiveTodosAtTurnEnd } from './turnStore.js'
|
|
||||||
import { getUiState, patchUiState } from './uiStore.js'
|
import { getUiState, patchUiState } from './uiStore.js'
|
||||||
|
|
||||||
const NO_PROVIDER_RE = /\bNo (?:LLM|inference) provider configured\b/i
|
const NO_PROVIDER_RE = /\bNo (?:LLM|inference) provider configured\b/i
|
||||||
@@ -537,12 +536,6 @@ export function createGatewayEventHandler(ctx: GatewayEventHandlerContext): (ev:
|
|||||||
const { finalMessages, finalText, wasInterrupted } = turnController.recordMessageComplete(ev.payload ?? {})
|
const { finalMessages, finalText, wasInterrupted } = turnController.recordMessageComplete(ev.payload ?? {})
|
||||||
|
|
||||||
if (!wasInterrupted) {
|
if (!wasInterrupted) {
|
||||||
// Defensive: turnController.recordMessageComplete already prepends
|
|
||||||
// the archive at the head of finalMessages. This is a no-op in the
|
|
||||||
// normal path (state.todos is empty) but covers any edge where
|
|
||||||
// todos linger past the controller archive.
|
|
||||||
archiveTodosAtTurnEnd().forEach(appendMessage)
|
|
||||||
|
|
||||||
const msgs: Msg[] = finalMessages.length ? finalMessages : [{ role: 'assistant', text: finalText }]
|
const msgs: Msg[] = finalMessages.length ? finalMessages : [{ role: 'assistant', text: finalText }]
|
||||||
msgs.forEach(appendMessage)
|
msgs.forEach(appendMessage)
|
||||||
|
|
||||||
|
|||||||
@@ -469,12 +469,13 @@ class TurnController {
|
|||||||
...(tools.length && { tools })
|
...(tools.length && { tools })
|
||||||
}
|
}
|
||||||
|
|
||||||
// Archive todos FIRST so the trail msg sits right after the user prompt,
|
// Archive prepended so the trail msg anchors under the user prompt,
|
||||||
// not between thinking/tools and the final assistant text. Keeps the
|
// not between thinking/tools and final assistant text.
|
||||||
// panel visually anchored where it lived during streaming.
|
const finalMessages: Msg[] = [
|
||||||
const archived = archiveDoneTodos()
|
...archiveDoneTodos(),
|
||||||
const body = hasDetails(finalDetails) ? [...segments, finalDetails] : segments
|
...segments,
|
||||||
const finalMessages: Msg[] = [...archived, ...body]
|
...(hasDetails(finalDetails) ? [finalDetails] : [])
|
||||||
|
]
|
||||||
|
|
||||||
if (finalText) {
|
if (finalText) {
|
||||||
finalMessages.push({ role: 'assistant', text: finalText })
|
finalMessages.push({ role: 'assistant', text: finalText })
|
||||||
|
|||||||
Reference in New Issue
Block a user