Add full ChatStream support to the pico channel, enabling real-time token
streaming to connected WebSocket clients.
Changes:
- Add streamer tracking in turnState (acquire/release per conversation turn)
- Integrate ChatStream in pipeline_llm (use when streamer is available)
- Wire streamer lifecycle through agent loop
- Add Streaming field to PicoSettings config
- Skip bus publish when response was already streamed
- Add streaming test scaffold
When a channel supports streaming and has it enabled in config, the agent
loop calls ChatStream() instead of Chat(), allowing tokens to flow in
real-time through the WebSocket as the LLM generates them.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Remove the legacy EventKind/Event envelope mapping and let agent event emission build pkg/events.Event values directly.
Keep HookMeta as the shared hook metadata shape and preserve legacy observe string aliases by mapping them to runtime event kinds.
Validation: GOCACHE=/tmp/picoclaw-go-cache go test ./pkg/agent; make lint
- Add isNetworkError detection for connection reset, broken pipe, read/write tcp, EOF
- Add retry logic with configurable exponential backoff for network errors
- Add config options max_llm_retries and llm_retry_backoff_secs in agents.defaults
- Network errors now retry with backoff (was previously not retried)
- Timeout errors now use configurable backoff instead of hardcoded 5s
- Default: 2 retries with 2s backoff (3 total attempts)
- centralize web search provider readiness and resolution logic
- fall back when the configured provider is unavailable or invalid
- allow native-search-capable models to use built-in search without the client tool
- simplify the tools page and add direct access to web search settings
- add backend, agent, and integration tests for the new selection behavior