Repository navigation
Conversation
cuibonobo
force-pushed
the
changeset-release/main
branch
13 times, most recently
from
October 10, 2026 20:16
8f42912 to
29a4176
Compare
cuibonobo
force-pushed
the
changeset-release/main
branch
from
October 10, 2026 20:25
29a4176 to
49c7ad1
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
@haverstack/adapter-api@0.41.0
Minor Changes
#443
ffefeddThanks @cuibonobo! -APIAdapterno longer definesflush()orclose(). Both were no-ops, and both are optional onStackAdapter, soStackskips them already; a caller invoking them directly on anAPIAdaptercan drop the call.#443
ffefeddThanks @cuibonobo! - A discovery or auth handshake response that is empty or not JSON now throwsAPIAdapterErrornaming the endpoint, as every other success response does, rather than aSyntaxErrororTypeError.#444
ddad23cThanks @cuibonobo! - Only a refused credential is reported as an authentication failure. A handshake step answering a bare5xxnow throwsAPIAdapterErrorrather thanAPIAdapterHandshakeError, and a renewal that fails on a dropped connection or a server error surfaces as thatAPIAdapterConnectionErrororAPIAdapterErrorrather than asAPIAdapterReauthError. A change feed whose renewal fails that way keeps reconnecting instead of stopping.Patch Changes
#443
d82f64eThanks @cuibonobo! - Errors for a response missing its body now name the endpoint exactly as it was requested, encoded path and query string included.#436
90d800aThanks @cuibonobo! -StackRecordAdapter.subscribeChanges()takesSubscribeOptions, the same options a subscriber passes tosubscribe().SubscribeChangesOptionsis gone from@haverstack/core/adapter; it had the same fields, andStackalready forwarded every one of them, the subscriber's ownonErrorincluded. A newMutateOptionstype in@haverstack/core/adapternames the options every version-bumping adapter mutation takes.GrantContentandInstallRequestare now derived fromTypeGrant.#443
e18ddb7Thanks @cuibonobo! - Split the adapter into one module per layer. The package exports are unchanged.#442
59f34ceThanks @cuibonobo! -@haverstack/wire-typesno longer restates shapes@haverstack/corealready defines, and its auth handshake types share one prefix:AuthChallengeRequestandAuthTokenRequestare removed. UseWireAuthChallengeRequestandWireAuthTokenRequest, re-exported from@haverstack/core/wire, where the parsers that return them live.AuthChallengeResponseandAuthTokenResponseare renamedWireAuthChallengeResponseandWireAuthTokenResponseto match. Their shape is unchanged.WireActorandWireChangeActorare now aliases of core'sActorandChangeActor. Their shape is unchanged.WireAssociationEditsRequestis removed; nothing referenced it.Updated dependencies [
7d30040,98401c0,fdca4ca,90d800a,7d30040,da5148b,f616aaa,9b4adef,59f34ce,89e0a07]:@haverstack/adapter-conformance@0.11.0
Minor Changes
fdca4caThanks @cuibonobo! -enumis a field kind:{ kind: 'enum', values: [...] }replaces{ kind: 'string', enum: [...] }.defineType()refuses theenumkey on any field.isCompatible()now checks enums: a required enum accepts only an enum candidate whose values it lists all of, and a requiredstringortextaccepts an enum. An enum becoming a plainstringis additive; astringbecoming an enum needs a version bump. A typed read types an enum field as its listed values or any other string (StoredContentOf,UnlistedValue) and no longer throws on an unlisted value, since an enum can widen in place; typed writes still take only the listed values (ContentOf,PatchOf).migration()types both sides asStoredContentOf, so a step carries an unlisted value through. A typedsubscribe()delivers a record thatmigrateAll()moves off the handle's version without itsrecord, instead of throwing in the dispatcher. Conformance fixtures pin a 422 for a value outside the list and a 409 for removing values. The adapter conformance suite checks that an enum field sorts by value.Patch Changes
7d30040,98401c0,fdca4ca,90d800a,7d30040,da5148b,f616aaa,9b4adef,89e0a07]:@haverstack/adapter-local@0.41.0
Minor Changes
@haverstack/blob-adapter-disk,@haverstack/core,@haverstack/record-adapter-sqlite.Patch Changes
90d800aThanks @cuibonobo! -StackRecordAdapter.subscribeChanges()takesSubscribeOptions, the same options a subscriber passes tosubscribe().SubscribeChangesOptionsis gone from@haverstack/core/adapter; it had the same fields, andStackalready forwarded every one of them, the subscriber's ownonErrorincluded. A newMutateOptionstype in@haverstack/core/adapternames the options every version-bumping adapter mutation takes.GrantContentandInstallRequestare now derived fromTypeGrant.7d30040,98401c0,fdca4ca,90d800a,7d30040,da5148b,f616aaa,9b4adef,89e0a07]:@haverstack/blob-adapter-disk@0.40.0
Minor Changes
@haverstack/core.Patch Changes
7d30040,98401c0,fdca4ca,90d800a,7d30040,da5148b,f616aaa,9b4adef,89e0a07]:@haverstack/blob-adapter-s3@0.28.0
Minor Changes
@haverstack/core.Patch Changes
7d30040,98401c0,fdca4ca,90d800a,7d30040,da5148b,f616aaa,9b4adef,89e0a07]:@haverstack/commons@0.37.0
Minor Changes
f616aaaThanks @cuibonobo! - A type handle carries whatdefineType()takes:typeHandle({ id, name, schema, migratesFrom }), withmigratesFromgiven as a handle or aTypeId.defineType(handle)and a manifest'stypestake it as written. Migrations are typed values built withmigration(from, to, fn), wherefnis checked as the first handle's content to the second's, and are passed toStack.open(adapter, { migrations }).migratesFrommust name an earlier version of the same family, andtypeHandle()anddefineType()refuse anything else.migration()checks that pairing within a family and builds a step into another family without it, so an app's own type can migrate into a commons type.Stack.open()refuses a set of migrations it could not walk: a duplicatefrom, a malformed TypeId, a step backwards within a family, or a cycle.registerMigration()andMigrationFnare removed.@haverstack/commonsdropsCommonsType; its exports are plain type handles.Patch Changes
7d30040,98401c0,fdca4ca,90d800a,7d30040,da5148b,f616aaa,9b4adef,89e0a07]:@haverstack/conformance-fixtures@0.36.0
Minor Changes
#439
7d30040Thanks @cuibonobo! - Grantees are checked by one validator, whether they arrive as a permission element, in a_grantrecord, or as agrantType()/listTypeGrants()/revokeType()target:permissions[0].grantee.entityIdrather thanpermissions[0].grantee).groupIdandrolereports both problems, on every surface.Invalid grant target:._grantfixtures that pin these messages are updated to match.revokeType()now matches a stored grant's actions as a set, so the order they were named in, or an action named twice, no longer stops a revoke from matching.#433
fdca4caThanks @cuibonobo! -enumis a field kind:{ kind: 'enum', values: [...] }replaces{ kind: 'string', enum: [...] }.defineType()refuses theenumkey on any field.isCompatible()now checks enums: a required enum accepts only an enum candidate whose values it lists all of, and a requiredstringortextaccepts an enum. An enum becoming a plainstringis additive; astringbecoming an enum needs a version bump. A typed read types an enum field as its listed values or any other string (StoredContentOf,UnlistedValue) and no longer throws on an unlisted value, since an enum can widen in place; typed writes still take only the listed values (ContentOf,PatchOf).migration()types both sides asStoredContentOf, so a step carries an unlisted value through. A typedsubscribe()delivers a record thatmigrateAll()moves off the handle's version without itsrecord, instead of throwing in the dispatcher. Conformance fixtures pin a 422 for a value outside the list and a 409 for removing values. The adapter conformance suite checks that an enum field sorts by value.#439
7d30040Thanks @cuibonobo! - A recordidusing the reserved_prefix is now refused asInvalid ID "<id>": uses the reserved "_" prefix., the sameInvalid <field> "<value>": <reason>.shape every other record-ID refusal uses. Theerror-bad-request-id-reserved-prefixfixture pins the new wording.#413
9b4adefThanks @cuibonobo! -StackValidationError's message header names what was validated: record content keeps "Content validation failed", a type schema reads "Schema validation failed", and argument checks read "Invalid arguments".associate()/dissociate()andgrantAccess()/revokeAccess()report list errors underassociations/permissions, the parameter the caller passed, rather thanchanges.deserializeError()keeps the header a server sent.#441
6d6ab03Thanks @cuibonobo! - ReplacegetVersionsAfterMutateFixtureswithgetVersionsSequenceFixtures: one sequence that reads the version history before and after a restore, a migration and an association, so the order those reads depend on is part of the data. The history now includes the version 2 snapshot a record at version 3 holds.Patch Changes
#439
d0b7369Thanks @cuibonobo! - Correct the stated reason in theerror-reserved-content-keyfixture's description. The refusal and its response are unchanged.#440
07f1fbdThanks @cuibonobo! - Split the fixtures into one module per endpoint group. The package exports are unchanged.#442
59f34ceThanks @cuibonobo! -@haverstack/wire-typesno longer restates shapes@haverstack/corealready defines, and its auth handshake types share one prefix:AuthChallengeRequestandAuthTokenRequestare removed. UseWireAuthChallengeRequestandWireAuthTokenRequest, re-exported from@haverstack/core/wire, where the parsers that return them live.AuthChallengeResponseandAuthTokenResponseare renamedWireAuthChallengeResponseandWireAuthTokenResponseto match. Their shape is unchanged.WireActorandWireChangeActorare now aliases of core'sActorandChangeActor. Their shape is unchanged.WireAssociationEditsRequestis removed; nothing referenced it.Updated dependencies [
9b4adef,59f34ce]:@haverstack/core@0.42.0
Minor Changes
#439
7d30040Thanks @cuibonobo! - Grantees are checked by one validator, whether they arrive as a permission element, in a_grantrecord, or as agrantType()/listTypeGrants()/revokeType()target:permissions[0].grantee.entityIdrather thanpermissions[0].grantee).groupIdandrolereports both problems, on every surface.Invalid grant target:._grantfixtures that pin these messages are updated to match.revokeType()now matches a stored grant's actions as a set, so the order they were named in, or an action named twice, no longer stops a revoke from matching.#433
fdca4caThanks @cuibonobo! -enumis a field kind:{ kind: 'enum', values: [...] }replaces{ kind: 'string', enum: [...] }.defineType()refuses theenumkey on any field.isCompatible()now checks enums: a required enum accepts only an enum candidate whose values it lists all of, and a requiredstringortextaccepts an enum. An enum becoming a plainstringis additive; astringbecoming an enum needs a version bump. A typed read types an enum field as its listed values or any other string (StoredContentOf,UnlistedValue) and no longer throws on an unlisted value, since an enum can widen in place; typed writes still take only the listed values (ContentOf,PatchOf).migration()types both sides asStoredContentOf, so a step carries an unlisted value through. A typedsubscribe()delivers a record thatmigrateAll()moves off the handle's version without itsrecord, instead of throwing in the dispatcher. Conformance fixtures pin a 422 for a value outside the list and a 409 for removing values. The adapter conformance suite checks that an enum field sorts by value.#436
90d800aThanks @cuibonobo! -StackRecordAdapter.subscribeChanges()takesSubscribeOptions, the same options a subscriber passes tosubscribe().SubscribeChangesOptionsis gone from@haverstack/core/adapter; it had the same fields, andStackalready forwarded every one of them, the subscriber's ownonErrorincluded. A newMutateOptionstype in@haverstack/core/adapternames the options every version-bumping adapter mutation takes.GrantContentandInstallRequestare now derived fromTypeGrant.#439
7d30040Thanks @cuibonobo! - A recordidusing the reserved_prefix is now refused asInvalid ID "<id>": uses the reserved "_" prefix., the sameInvalid <field> "<value>": <reason>.shape every other record-ID refusal uses. Theerror-bad-request-id-reserved-prefixfixture pins the new wording.#415
f616aaaThanks @cuibonobo! - A type handle carries whatdefineType()takes:typeHandle({ id, name, schema, migratesFrom }), withmigratesFromgiven as a handle or aTypeId.defineType(handle)and a manifest'stypestake it as written. Migrations are typed values built withmigration(from, to, fn), wherefnis checked as the first handle's content to the second's, and are passed toStack.open(adapter, { migrations }).migratesFrommust name an earlier version of the same family, andtypeHandle()anddefineType()refuse anything else.migration()checks that pairing within a family and builds a step into another family without it, so an app's own type can migrate into a commons type.Stack.open()refuses a set of migrations it could not walk: a duplicatefrom, a malformed TypeId, a step backwards within a family, or a cycle.registerMigration()andMigrationFnare removed.@haverstack/commonsdropsCommonsType; its exports are plain type handles.#413
9b4adefThanks @cuibonobo! -StackValidationError's message header names what was validated: record content keeps "Content validation failed", a type schema reads "Schema validation failed", and argument checks read "Invalid arguments".associate()/dissociate()andgrantAccess()/revokeAccess()report list errors underassociations/permissions, the parameter the caller passed, rather thanchanges.deserializeError()keeps the header a server sent.#431
89e0a07Thanks @cuibonobo! -StackandScopedStackaccept an internal write expectation on every write verb — the record's Type family, and on a content write its exact version — checked against the read each write already makes, so a typed write is refused before anything lands and costs no extra round trip. A typedmutate()orpatchContent()now uses it: a record of another family is not found, and one stored at another version of the family is still refused withStackBadRequestError.ScopedStack.amendAssociations()andamendAccess()take their options third andsurfacefourth, asStack's do.Patch Changes
#437
98401c0Thanks @cuibonobo! - Organize the./wire,./didand./adaptersubpath modules into folders of their own. The subpath exports are unchanged.#438
da5148bThanks @cuibonobo! - SplitStackandScopedStackinto folders of smaller modules — theStackClientinterface and its option types, the migration registry, system Type definitions, write invariants, app installs, type grants, attachment cleanup, scope authority and the scoped change feed each live in a file of their own — and fold logic the two classes repeated into shared helpers. The public API and behaviour are unchanged.@haverstack/record-adapter-do-sqlite@0.27.0
Minor Changes
@haverstack/core.Patch Changes
7d30040,98401c0,fdca4ca,90d800a,7d30040,da5148b,f616aaa,9b4adef,89e0a07]:@haverstack/record-adapter-sqlite@0.34.0
Minor Changes
@haverstack/core.Patch Changes
90d800aThanks @cuibonobo! -StackRecordAdapter.subscribeChanges()takesSubscribeOptions, the same options a subscriber passes tosubscribe().SubscribeChangesOptionsis gone from@haverstack/core/adapter; it had the same fields, andStackalready forwarded every one of them, the subscriber's ownonErrorincluded. A newMutateOptionstype in@haverstack/core/adapternames the options every version-bumping adapter mutation takes.GrantContentandInstallRequestare now derived fromTypeGrant.7d30040,98401c0,fdca4ca,90d800a,7d30040,da5148b,f616aaa,9b4adef,89e0a07]:@haverstack/wire-types@0.41.0
Minor Changes
#413
9b4adefThanks @cuibonobo! -StackValidationError's message header names what was validated: record content keeps "Content validation failed", a type schema reads "Schema validation failed", and argument checks read "Invalid arguments".associate()/dissociate()andgrantAccess()/revokeAccess()report list errors underassociations/permissions, the parameter the caller passed, rather thanchanges.deserializeError()keeps the header a server sent.#442
59f34ceThanks @cuibonobo! -@haverstack/wire-typesno longer restates shapes@haverstack/corealready defines, and its auth handshake types share one prefix:AuthChallengeRequestandAuthTokenRequestare removed. UseWireAuthChallengeRequestandWireAuthTokenRequest, re-exported from@haverstack/core/wire, where the parsers that return them live.AuthChallengeResponseandAuthTokenResponseare renamedWireAuthChallengeResponseandWireAuthTokenResponseto match. Their shape is unchanged.WireActorandWireChangeActorare now aliases of core'sActorandChangeActor. Their shape is unchanged.WireAssociationEditsRequestis removed; nothing referenced it.Patch Changes
7d30040,98401c0,fdca4ca,90d800a,7d30040,da5148b,f616aaa,9b4adef,89e0a07]: