Files
gnoma/internal/stream/event.go
vikingowl 88e6bdb2a4 feat(tui): Tier 3-4 UX improvements — split, routing, session naming, context bar
- Split app.go (2091→1378 lines) into rendering.go, events.go, init.go
- Add EventRouting stream event for router arm transparency
- Add session auto-naming from first user message
- Add context window progress bar in status bar
- Add /keys cheatsheet, /replay for resumed sessions
- Add inline cost-per-turn after assistant responses
- Add diff previews in fs.write/fs.edit permission prompts
- Collapse tool output to 3 lines by default (ctrl+o expands)
- Use AddPrefix for system context instead of InjectMessage
- Handle ContentThinking and ContentToolResult in session resume
- Show session title in resume picker
- Add /model numeric selection snapshot safety
2026-04-12 05:13:16 +02:00

91 lines
1.9 KiB
Go

package stream
import (
"encoding/json"
"fmt"
"somegit.dev/Owlibou/gnoma/internal/message"
)
// EventType discriminates streaming events.
type EventType int
const (
EventTextDelta EventType = iota + 1
EventThinkingDelta
EventToolCallStart
EventToolCallDelta
EventToolCallDone
EventToolResult // tool execution output
EventPermissionReq // permission prompt needed
EventUsage
EventRouting // router arm selection
EventError
)
func (et EventType) String() string {
switch et {
case EventTextDelta:
return "text_delta"
case EventThinkingDelta:
return "thinking_delta"
case EventToolCallStart:
return "tool_call_start"
case EventToolCallDelta:
return "tool_call_delta"
case EventToolCallDone:
return "tool_call_done"
case EventToolResult:
return "tool_result"
case EventPermissionReq:
return "permission_req"
case EventUsage:
return "usage"
case EventRouting:
return "routing"
case EventError:
return "error"
default:
return fmt.Sprintf("unknown(%d)", et)
}
}
// Event is a single streaming event from a provider.
type Event struct {
Type EventType
// TextDelta, ThinkingDelta
Text string
// ToolCallStart: ID + Name set
// ToolCallDelta: ID + ArgDelta set
// ToolCallDone: ID + Args set (complete JSON)
ToolCallID string
ToolCallName string
ArgDelta string // partial JSON fragment
Args json.RawMessage // complete arguments (on Done)
// ToolResult: tool name + output
ToolName string
ToolOutput string
// PermissionReq: tool requesting permission, response channel
PermissionResponse chan bool
// Usage
Usage *message.Usage
// Routing — arm selected by router
RoutingModel string // e.g. "anthropic/claude-sonnet-4-20250514"
RoutingTask string // classified task type
// Error
Err error
// StopReason — set on the final event of a stream
StopReason message.StopReason
// Model — set on first event if available
Model string
}