--- id: adapter-from-openapi name: from_openapi adapter (parse + forwarding handlers) status: pending depends_on: [client-http-host] scope: broad risk: medium impact: component level: implementation tags: [adapters, phase-3] --- ## Description Port `adapters/from_openapi.rs` (~2k lines, the largest port) from `/workspace/@alkdev/alknet/crates/alknet-http/src/adapters/from_openapi.rs`: OpenAPISpec (from_json/from_yaml/from_str JSON-first per ADR-051, from_value), $ref resolution, HttpServiceConfig, per-op HandlerRegistration construction (Internal by default, FromOpenAPI leaf provenance), forwarding handlers (path-template substitution, query params, auth header from capabilities, content-type branching), SSE→StreamingHandler for Sub ops (HandlerKind::Stream), error fidelity (`HTTP_` codes). Type paths move to alkcall::client (adapter contract) and alkcall::registry. ## Acceptance Criteria - [ ] JSON + YAML + from_str detection ports with tests - [ ] Handler construction: Query/Mutation→Once, Sub→Stream; Pub never produced (v1) - [ ] Forwarding: path params, query params, auth injection from Capabilities, error mapping — unit tested (mock HTTP via local axum server) - [ ] No env-var reads - [ ] `cargo test` passes ## References - docs/architecture/http-adapters.md (§from_openapi, §Forwarding handler, §Error Fidelity) - docs/architecture/decisions/023-operation-error-schemas.md, 051-yaml-input-for-from-openapi.md - Old source: `/workspace/@alkdev/alknet/crates/alknet-http/src/adapters/from_openapi.rs` ## Notes > Agent fills during implementation. Largest single port — consider > splitting internally (parse half / handler half) if review flags it. ## Summary > Agent fills on completion.