uploadBlob (binary body) and importRepo (CAR upload) are currently skipped by the generator; EXAMPLE_INPUTS has no way to express non-JSON inputs.
Add generator support for binary/CAR request bodies: an input kind in EndpointHint, fixture bytes the contract runner can attach, and content-type handling in the XRPC client path if needed. importRepo additionally needs a valid CAR fixture (can be produced via @atproto/repo writeCarStream from a seeded repo).
Done when: both endpoints get happy-path contract checks that pass against the oracle (pnpm tsx src/e2e.ts).
Done in 6eecf3f, e2e green against the oracle.
The generator handles binary bodies now.
EndpointHintgot two input kinds:inputBytesfor a static payload (uploadBlob uses a short text file) andfixture: 'car'for a CAR the contract runner builds at runtime. The binary flag is gone -- whether an endpoint takes a binary body comes from the lexiconencodingnow, which is where that information lives anyway.The CAR fixture works the way the issue suggested:
Repo.createwith a fresh throwaway keypair, one seeded record, exported throughgetFullRepo(thewriteCarStreampath). The importRepo check doesn't stop at the 200 either. It re-exports the repo oversync.getRepoand asserts the seeded record reads back out of the returned CAR, so an endpoint that accepts the bytes and drops them still fails.The XRPC client picked up the other half:
bytes/contentTypeon the request side (binary overrides JSON input), andrawBodyon every response, which should make the sync.getRepo / getBlob output checks easier when someone gets to those.One thing I tried and backed out: I wrote a "truncated CAR gets a 4xx envelope" expectation, and it immediately caught the reference PDS returning an uncaught 500 --
readCarStreamthrows before any error mapping kicks in. That's a real reference bug, but a contract check has to pass against the oracle, so I dropped the expectation instead of waiving it. Worth an upstream issue on its own.Both skipped lines are out of
EXAMPLE_INPUTS;pnpm generatenow writes 22 checks including both of these.