feat(block-reply): deliver intermediate text during tool iterations with 2-tier config (#55)

Add block.reply event that delivers intermediate assistant text to non-streaming
channels during multi-tool iterations. Includes 2-tier config toggle:
gateway-level default (disabled) + per-channel override (inherit/on/off).

Backend:
- Emit block.reply events from agent loop between tool iterations
- Add BlockReply *bool to GatewayConfig and all 6 channel config structs
- Add BlockReplyChannel interface with ResolveBlockReply() resolution
- Guard delivery in HandleAgentEvent by RunContext.BlockReplyEnabled
- Resolve config at RegisterRun time, pass to consumer goroutine
- Conditional dedup: skip final message if identical to last block reply

UI:
- Gateway settings: Switch toggle for global default
- Per-channel: tri-state select (Inherit from gateway / Enabled / Disabled)
- Protocol: BLOCK_REPLY constant in AgentEventTypes
- Form: coerceBoolSelects for proper JSON boolean serialization
This commit is contained in:
viettranx committed 2026-03-07 01:06:10 +07:00
1 parent 3dfdc8ca39
commit faa47abfb6
23 files changed
+226 -32

No files matched your search

+1
View File
@@ -72,6 +72,7 @@ const (
AgentEventRunRetrying = "run.retrying"
AgentEventToolCall = "tool.call"
AgentEventToolResult = "tool.result"
AgentEventBlockReply = "block.reply"
)
// Chat event subtypes (in payload.type)