v0.107.0 — HITL everywhere
Human-in-the-loop, phase 2 (fork issue #4)
- All providers: client-executed tools and approval-required tools now work on every Text and Structured handler with a tool loop — Azure, DeepSeek, Gemini, Groq, Mistral, Ollama, OpenRouter, Qwen, Requesty, Vertex, xAI, Z, and OpenAI ChatCompletions join Anthropic + OpenAI Responses. Each handler resolves pending approvals before sending, stops its loop on marked tool calls, and carries approval requests on the assistant message for resume correlation.
- Streaming (Anthropic + OpenAI): pending approvals resolve at stream start (yielding their tool result events); marked tool calls yield
ToolApprovalRequestEvents and end the stream withFinishReason::ToolCalls. Stream fixtures + tests ported from upstream prism-php#932. - Docs: new core-concepts guide — Human-in-the-Loop — covering client tools, static/conditional approvals, the resume flow, deny-by-default semantics, and streaming events. Ships in the package, so the docs site picks it up automatically.
Remaining on issue #4: streaming emission for the other providers' streams, and the Reverb live demo in the docs site app.
Suite: 1868 passing, PHPStan clean.