Conversation
eb3c36d to
e9fd7f1
Compare
e9fd7f1 to
85a3556
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
This PR was opened by the Changesets release GitHub action. When you're ready to do a release, you can merge this and the packages will be published to npm automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to main, this PR will be updated.
Releases
@adcp/client@5.9.1
Patch Changes
b1497f9: ci: consolidate pipeline and drop redundant jobs
CI-only change, no runtime/library behaviour affected. Published package contents are unchanged.
ci.yml: collapsetest/quality/securityinto a single job. Each was re-runningcheckout + setup-node + npm ci, wasting ~1–2 min of setup per PR. Also removes theclean && build:libre-build in the old quality job and the redundantbuildstep (alias ofbuild:lib).ci.yml: droppublish-dry-run.release.yml'sprepublishOnlyalready validates packaging on the actual release PR.ci.yml: drop deaddevelopbranch from the push trigger.schema-sync.yml: drop the PR-triggeredvalidate-schemasjob —ci.ymlalready syncs schemas and diffs generated files on every PR. Scheduled auto-update job preserved.commitlint.yml: usenpm ciinstead ofnpm install --save-dev; the@commitlint/*packages are already indevDependencies.933eb2d: Two response-layer fixes for agents built from partial skill coverage:
buildCreativeResponse/buildCreativeMultiResponseno longer crash on missing fields. The default summary previously dereferenceddata.creative_manifest.format_id.idwithout guards — handlers that dropformat_id(required bycreative-manifest.json) crashed the dispatcher withCannot read properties of undefined (reading 'id'), swallowing the real schema violation behind an opaqueSERVICE_UNAVAILABLE. Now the summary optional-chains through the field chain and falls back to a generic string, so the response reaches wire-level validation and the buyer sees the actual missing-field error.replayed: falseis no longer injected on fresh executions.protocol-envelope.jsonpermits the field to be "omitted when the request was executed fresh"; emittingfalseviolates strict task response schemas that declareadditionalProperties: false(create-property-list-response, etc.). Fresh responses now drop any priorreplayedmarker; replays still carryreplayed: true. The existingtest/lib/idempotency-client.test.js"replayed omitted is surfaced as undefined" test aligns with this shift.Surfaced by matrix v10: six
creative_generativepairs crashed with the dereference, and everyproperty_listspair hit theadditionalPropertiesviolation.5eb2ae9: fix(testing):
context.no_secret_echowalks structuredTestOptions.auth, andregisterAssertionaccepts{ override: true }The default
context.no_secret_echoassertion in@adcp/client/testingpreviously treated
options.authas a string and added the wholediscriminated-union object to its secret set.
String.includes(obj)against
[object Object]matched nothing, so the assertion waseffectively a no-op for every consumer passing structured auth (bearer,
basic, oauth, oauth_client_credentials). It now extracts the leaf
secrets across every variant:
tokenusername,password, and the base64user:passblob anAuthorization: Basicheader would carrytokens.access_token,tokens.refresh_token,client.client_secret(confidential clients)credentials.client_idandcredentials.client_secret— resolving$ENV:VARreferences to theirruntime values so echoes of the real secret (not the reference string)
are caught — plus
tokens.access_token/tokens.refresh_tokenA minimum-length guard (8 chars) skips substring matching on fixture
values that would otherwise collide with benign JSON.
registerAssertion(spec, { override: true })now replaces an existingregistration instead of throwing. Lets consumers swap in a stricter
version of an SDK default (e.g. their own
context.no_secret_echo)without calling
clearAssertionRegistry()and re-registering every otherdefault. Default behaviour (
{ override: false }/ no options) isunchanged and still throws on duplicate ids.
afc01f1: Widen two bundled default assertions per security-review feedback on spec(compliance): drop redundant assertion modules, use bundled 5.9 defaults (#2639) adcp#2769.
idempotency.conflict_no_payload_leak— flip the denylist-of-5-fields to an allowlist of 7 envelope keys (code,message,status,retry_after,correlation_id,request_id,operation_id). The previous implementation only flaggedpayload,stored_payload,request_body,original_request,original_response— a seller inliningbudget,start_time,product_id, oraccount_idat theadcp_errorroot slipped past, turning idempotency-key reuse into a read oracle for stolen-key attackers. Allowlisting closes the hole: anything a seller adds beyond the 7 envelope fields now fails the assertion.context.no_secret_echo— scan the full response body recursively (not just.context), add a bearer-token literal regex (/\bbearer\s+[A-Za-z0-9._~+/=-]{10,}/i), add recursive suspect-property-name match (authorization,api_key,apikey,bearer,x-api-key), and pick upoptions.test_kit.auth.api_keyas a verbatim-secret source. The previous scope (response.contextonly, verbatimoptions.auth_token/.auth/.secrets[]only) missed the common cases where sellers echo credentials intoerror.message,audit.incoming_auth, nested debug fields, or as header-shaped properties. All caller-supplied secrets gate on a minimum length (8 chars) to avoid false positives on placeholder values.Both changes are patch-level — the assertion ids, public registration API, and passing-case behavior are unchanged; the narrowing on main was fresh in 5.9 and had no adopters broad enough for the strictening to break in practice.
governance.denial_blocks_mutationis unchanged.16 new unit tests cover both widenings: allowlist hits (valid envelope passes), denylist vestigial names still fail, non-allowlisted field leaks (including stable sorted error output), plus bearer literals, verbatim
options.auth_tokenecho,options.secrets[]echo,test_kit.auth.api_keyecho, suspect property names at any depth, array walking, short-value false-positive guard, and prose-"bearer" ignore.