v5.7.0
Minor Changes
-
7d33a92: AdCP 3.0 release blockers — SDK-level wiring for conformance-runner integration.
New subpath exports
@adcp/client/compliance-fixtures— canonicalCOMPLIANCE_FIXTURESdata for every hardcoded ID storyboards reference (test-product,sports_ctv_q2,video_30s,native_post,native_content,campaign_hero_video,gov_acme_q2_2027,mb_acme_q2_2026_auction,cpm_guaranteed, etc.) plus aseedComplianceFixtures(server)helper that writes fixtures into the state store under well-knowncompliance:*collections. Closes #663.@adcp/client/schemas— re-exports every generated Zod request schema plusTOOL_INPUT_SHAPES(ready-to-registerinputSchemamap covering non-framework tools likecreative_approvalandupdate_rights) and acustomToolFor(name, description, shape, handler)helper. Closes #667.
Server (
@adcp/client/server)createExpressAdapter({ mountPath, publicUrl, prm, server })returns the four pieces an Express-mounted agent needs:rawBodyVerify(captures raw bytes for RFC 9421),protectedResourceMiddleware(RFC 9728 PRM at the origin root),getUrl(mount-aware URL reconstruction for the signature verifier), andresetHook(delegates toserver.compliance.reset()). Closes #664.requireAuthenticatedOrSigned({ signature, fallback, requiredFor, resolveOperation })bundles presence-gated signature composition withrequired_forenforcement on the no-signature path.requireSignatureWhenPresentgrew an options parameter that carries the samerequiredFor+resolveOperationsemantics. Unsigned requests with no credentials on arequired_foroperation throwAuthErrorwhose cause isRequestSignatureError('request_signature_required'); valid bearer bypass stays valid. Closes #665.respondUnauthorized({ signatureError })emits aWWW-Authenticate: Signature error="<code>"challenge when the rejection comes from the RFC 9421 verifier.serve()auto-detects this viasignatureErrorCodeFromCause(err)— the signed_requests negative-vector grader reads the error code off the challenge, so previously callers had to override the 401 response by hand.AdcpServer.compliance.reset({ force? })drops session state and the idempotency cache between storyboards. Refuses to run in production-like deployments unlessforce: trueis passed.IdempotencyStore.clearAllis now an optional method on the store;memoryBackendimplements it, production backends leave it undefined. Closes #666.
Testing (
@adcp/client/testing)- Request-signing grader accepts an
agentCapabilityoption. When present, vectors whoseverifier_capabilitycan't coexist with the agent's declared profile (covers_content_digestdisagreement, vector-assertedrequired_fornot in agent's list) auto-skip withskip_reason: 'capability_profile_mismatch'.skipVectorsstays available for operator-driven overrides. Closes #668.
-
5b2ebb3: v3 audit follow-ups — tightened per expert review:
Build pipeline
build:libnow runssync-versionbeforetscsosrc/lib/version.tscan't drift frompackage.jsonacross changeset-driven bumps.sync-versionnow validates both version strings against/^[0-9A-Za-z.\-+]+$/to prevent template injection into the generated TS file.
sync_creatives validator
- New
SyncCreativesItemSchema,SyncCreativesSuccessStrictSchema, andSyncCreativesResponseStrictSchemaexports. The strict schema enforces: requiredcreative_id+action; spec's conditional thatstatusMUST be absent whenaction ∈ {failed, deleted};preview_urllimited tohttp(s):URLs; ISO-8601expires_at;assignment_errorskey regex. Wired intoTOOL_RESPONSE_SCHEMASso pipeline-level strict validation catches per-item drift forsync_creativesresponses automatically.
V3 guard
- New
VersionUnsupportedErrorwith typedreason('version' | 'idempotency' | 'synthetic'). Agent URL stays on the instance property but is omitted from the default message to prevent leakage into shared log sinks. client.requireV3()now corroborates the v3 claim: requiresmajorVersions.includes(3),adcp.idempotency.replayTtlSecondspresent, and rejects synthetic capabilities. Closes the "lying seller" bypass path.- New
allowV2config option onSingleAgentClientConfig— per-client bypass;ADCP_ALLOW_V2=1env fallback only applies whenallowV2isundefined. Enables safe use in multi-tenant deployments. requireV3ForMutations: trueopt-in gates mutating calls before dispatch.