Parent: #1316
Track: Slice A — OpenAI reference implementation
Goal
OpenAI streaming approval interrupt and approval continuation reach full parity with OpenAI's observed contract.
Acceptance Criteria
- Approval-required MCP calls in streaming mode emit, in order:
response.output_item.added with mcp_approval_request
response.output_item.done with the same item
response.completed
[DONE]
- Pending approval is never flattened into a placeholder
mcp_call.
previous_response_id + mcp_approval_response + stream=true is accepted as a 200 SSE response; approved continuation resumes the expected mcp_call.
- Approved continuation reuses the same
max_tool_calls budget and malformed-argument tool-error behavior as the non-streaming path; no adapter-local 500s.
- Tests:
- Streaming continuation-specific budget and malformed-argument coverage.
- End-to-end local flow: interrupt →
previous_response_id + mcp_approval_response → resumed mcp_call → final response.completed.
- Manual parity check against real OpenAI for the streaming approval interrupt sequence.
Dependencies
Out of Scope
- Generalized approval continuation across all routers (PR9).
- Router-common approval abstraction.
Parent: #1316
Track: Slice A — OpenAI reference implementation
Goal
OpenAI streaming approval interrupt and approval continuation reach full parity with OpenAI's observed contract.
Acceptance Criteria
response.output_item.addedwithmcp_approval_requestresponse.output_item.donewith the same itemresponse.completed[DONE]mcp_call.previous_response_id + mcp_approval_response + stream=trueis accepted as a200SSE response; approved continuation resumes the expectedmcp_call.max_tool_callsbudget and malformed-argument tool-error behavior as the non-streaming path; no adapter-local 500s.previous_response_id + mcp_approval_response→ resumedmcp_call→ finalresponse.completed.Dependencies
Out of Scope