harness-providers: OpenAI chat + responses codecs, provider, registry wiring (M3)
- codec/openai_chat.rs: /chat/completions request builder (flat messages,
tool_calls, system → leading system message, reasoning_effort) + SSE decoder
(content/tool_calls-by-index/reasoning_content accumulation, [DONE] sentinel,
include_usage). Also the fallback codec for OpenAI-compatible endpoints.
- codec/openai_responses.rs: /responses request builder (input items, tool calls
and results as top-level function_call/function_call_output, instructions,
reasoning {effort, summary}) + SSE decoder (output_item add/done, output_text
and reasoning_summary deltas, function_call_arguments, response.completed usage
with separate reasoning_tokens).
- openai.rs: OpenAiProvider routing gpt-*/o-* → responses, else chat; Bearer auth;
error classification incl. 400 context_length_exceeded → ContextOverflow.
- Registered in harness-app from config.providers["openai"] (api_key + optional
base_url), sourced from OPENAI_API_KEY by the existing config loader.
- 21 codec/provider unit tests (decode fixtures + request-builder assertions).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>