Version Packages (rc)#750
Open
github-actions[bot] wants to merge 1 commit into
Open
Conversation
github-actions
Bot
force-pushed
the
changeset-release/main
branch
5 times, most recently
from
July 23, 2026 05:22
d01cc69 to
06fa85e
Compare
github-actions
Bot
force-pushed
the
changeset-release/main
branch
from
July 23, 2026 10:59
06fa85e to
8757a9a
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.
mainis currently in pre mode so this branch has prereleases rather than normal releases. If you want to exit prereleases, runchangeset pre exitonmain.Releases
stash@1.0.0-rc.5
Minor Changes
239f79b: New bundled agent skill:
stash-indexing— how to index EQL v3 encryptedcolumns. Integrations that were otherwise correct shipped with no index on any
encrypted predicate because nothing in the installed skills said encrypted
columns can be indexed (Add a
stash-indexingskill: how to index EQL v3 encrypted columns #753). The skill covers the functional-index recipesover the term extractors (
eql_v3.eq_term/ord_term/ord_term_ore/match_term/to_ste_vec_query) mapped to thetypes.*domains, what workswithout superuser on Supabase and managed Postgres versus the ORE opclass
restriction, which domains are storage-only by design, the query shapes that
engage an index (
ORDER BYsort-key andGROUP BYtraps), building indexes onlarge tables, an
EXPLAINverification checklist, and when to create indexesduring an encryption rollout (after backfill, before switching reads).
stash init/stash implhandoffs — and the@cipherstash/wizardskillsprompt — now install it for every integration (Drizzle, Supabase, Prisma
Next, plain PostgreSQL) — the gap is cross-cutting.
The existing per-integration skills gained pointers to it (including the
missing
stash-prisma-nextone-line purpose in the setup prompt, whichpreviously rendered "(no description)").
Patch Changes
d26950d:
encryptedDynamoDBnow accepts EQL v3 tables.Pass a table built with
encryptedTable+ thetypes.*domains from@cipherstash/stack/v3(or@cipherstash/stack/eql/v3) to any ofencryptModel,bulkEncryptModels,decryptModel,bulkDecryptModels. Boththe typed client from
EncryptionV3and the nominal client fromEncryption({ config: { eqlVersion: 3 } })are accepted.EQL v2 tables continue to work unchanged — this is additive, and no existing
caller needs to change. The table decides which wire format is used, so a
DynamoDB table populated under one version must keep being read with that
version.
This fixes a latent bug that made v3 unusable: the write path detected an
encrypted value by its
k: 'ct'tag, but EQL v3 scalars carry nokdiscriminator at all. Every v3 scalar fell through to the nested-object branch
and was written as a raw map instead of being split into
<attr>__sourceand<attr>__hmac.Notes on capability:
<attr>__hmacis written for domainsthat mint an
hmterm — the*Eqfamily, plusTextOrd/TextOrdOre/TextSearch. Ordering and bloom-filter terms have no DynamoDB query surfaceand are not stored, so those columns remain decryptable but not queryable.
form (that is a compile error), so declare the column flat with a dotted
path —
{ 'profile.ssn': types.TextEq('profile.ssn') }. The model ismatched by dotted path, so
{ profile: { ssn } }resolves, and the nestedattribute keeps its
__hmacfor key conditions.decryptModel/bulkDecryptModelsrequires the nominalclient; the
EncryptionV3client has no audit surface on decrypt.The DynamoDB adapter also gains its first test coverage — across the v2 and v3
paths, where it previously had none.
Robustness, from review:
different schema set, so it is not in v3 mode for that table) now throws a
clear, actionable error naming the table, instead of failing opaquely deep in
the FFI.
failure rather than resolving as a silent
undefinedsuccess.<attr>__sourceattribute that matches no declared column nowlogs a debug diagnostic instead of silently returning the raw ciphertext.
reference — the "encryption never mutates a caller's object" guarantee holds
on that path too.
path the read path rebuilds from. A pre-encrypted payload placed under an
undeclared nested name is stored whole (and round-trips) instead of being
split into a
<attr>__sourcethe read path could never reassemble.ciphertext rather than falling through and being written as a raw map, which
had leaked its
v/ienvelope metadata into storage.into them, so a payload inside a list is stored whole (still decryptable, but
not queryable and not part of the
__source/__hmaclayout).The v3 overloads are strongly typed.
encryptModel/bulkEncryptModelscheckthe input model against the table's column domains, and return the DynamoDB
attribute map that is actually written — the new exported
EncryptedAttributestype, where a declared column
emailbecomesemail__source(plusemail__hmacfor the equality domains that mint one) rather than surviving asemail.decryptModel/bulkDecryptModelsinvert it viaDecryptedAttributes.AnyEncryptedTable,DynamoDBEncryptionClientandAuditConfigare nowexported from
@cipherstash/stack/dynamodbso these signatures can be named.The EQL v2 overloads are unchanged.
d6bc9e9:
stash plannow reports the outcome that actually occurred instead of unconditionally printingPlan drafted at .cipherstash/plan.mdand exiting 0 (stash plan reports "Plan drafted at .cipherstash/plan.md" and exits 0 without writing the file (rc.3 M2) #738). The plan file is written by the handed-off agent, so the command verifies it on disk after the handoff: "Plan drafted" appears only when the file exists; if a launched agent (Claude Code, Codex, or the wizard) exits without writing it,planerrors and exits non-zero so automation never proceeds against a plan that was never created; deferred handoffs (--target agents-md, or a CLI target that isn't installed) end with an honest "No plan drafted yet" hint; and a pre-existing plan the run didn't modify is reported as left unchanged rather than drafted. An unexpected filesystem error while reading the plan path (a locked or malformed.cipherstash/) now exits non-zero with a clear message rather than an opaque crash.b7fa61f: Upgrade the Prisma Next integration to Prisma Next 0.16.
All
@prisma-next/*dependencies move from0.14.0to0.16.0, in lockstep. TheCipherStash encryption surface is unchanged — column types, envelopes, the
eql*operators,
cipherstashFromStack, and every subpath export behave exactly as before.Action required in your
prisma-next.config.ts: Prisma Next 0.15 stoppedmaterialising a placeholder namespace, so authoring a SQL contract now requires the
target's namespace factory. Add
createNamespaceto yourprismaContract(...)call:Without it,
prisma-next contract emitfails at runtime withcreateNamespace is not a function. The bundledstash-prisma-nextskill documents this too.The bundled EQL v3 baseline migration is re-emitted so its label and hash reflect
the pinned
@cipherstash/eql3.0.2 (the committed artifact still said 3.0.0).Re-run
prisma-next contract emitafter upgrading. The regeneratedcontract.{json,d.ts}picks up the 0.15/0.16 shape changes — the namespacediscriminator becomes the target-specific
'postgres-schema'(was'sql-namespace'), emit adds theStorageColumnTypes/StorageColumnInputTypesmaps and the
scalarListcapability marker, and foreign keys and their backingindexes become discrete contract entities. Your contract's
storageHashisunaffected by the upgrade itself.
b7fa61f: Fix the wrong
prisma-next migration applycommand name in the Prisma Nextguidance. Prisma Next has no
migration applysubcommand — the apply verb is thetop-level
prisma-next migrate(migrationonly hasplan/new/show/status/log/list/graph/check). The stale name appeared in thestash-prisma-nextandstash-cliskills, the@cipherstash/prisma-nextREADME, and — user-visibly — in
stash init --prisma-next's printed next-steps,the
stash initflag help, and thestash eql installPrisma-Next refusalmessage, all of which now say
prisma-next migrate. Surfaced by the rc.4skilltester run (found independently at Prisma Next 0.14.0, confirmed at 0.16.0).
f78fd7a:
stash schema buildnow picks a concrete EQL v3 domain per column(
TextSearch,IntegerOrd,TextEq, …) instead of the legacy v2"searchable capabilities" toggle. Boolean columns are assigned the
storage-only
types.Booleandomain automatically, while JSON columns areassigned the queryable
types.Jsondomain, with encrypted containment andselector queries. Other columns default to the widest searchable domain,
matching the previous behaviour. The internal
SearchOpcapability tupleand the
v3DomainFactorytranslation shim are removed, unblocking EQL v2removal (Remove EQL v2 repo-wide (umbrella) #707, stash schema build: port the v2 capability column picker to EQL v3 domains #751).
d25d100:
@cipherstash/stack/wasm-inlinenow has the model helpers:encryptModel/decryptModelandbulkEncryptModels/bulkDecryptModels(wasm-inline has no model helpers: encryptModel/decryptModel (and their bulk forms) are Node-only #742). They run the same schema traversal as the native entry (shared code, so the two entries cannot drift on which fields get encrypted): declared columns are encrypted — matched by JS property name, nested fields via the column's dotted path — everything else passes through, andnull/undefinedfields are preserved without reaching ZeroKMS. A call that encrypts (or decrypts) at least one field is one ZeroKMS round trip regardless of how many fields or models it covers; anull/empty batch, or one whose models carry no schema fields, returns without contacting ZeroKMS at all.types.Date/types.Timestampcolumns round-tripDate→Date(ISO strings on the wire), and failures follow this entry's{ data } | { failure }Result contract, with decrypt failures naming every failing field by its model path. Edge code no longer needs the hand-writtenbulkEncryptfield mapping whose failure mode was a schema column silently persisted in plaintext.The shared model traversal is also hardened: it no longer mutates the caller's model (previously a nested-column decrypt wrote decrypted plaintext back into the caller's input, and encrypt overwrote it with ciphertext); a literal flat dotted key, a
__proto__-shaped key, or a non-object model element is handled safely instead of crashing, leaking plaintext, or reachingObject.prototype; an already-encrypted field is passed through rather than re-encrypted; and an invalidDateis rejected per field. On the WASM entry, model ops now validate the table against the client's schemas,Datevalues are normalized at every encrypt/query crossing (not just the model path), and anull/empty model batch returns{ data: [] }. The skills update ships in thestashtarball, hence thestashpatch.f628463: Fix invalid DDL when a Drizzle column changes to an EQL v3 domain.
drizzle-kit generateemits an in-placeALTER TABLE … ALTER COLUMN … SET DATA TYPEwhen a plaintext column is changed to an encrypted one, which Postgres rejects — there
is no cast from
text/numericto an EQL type, and on drizzle-kit 0.31.0+ the emittedtype name is additionally mangled to
"undefined"."eql_v3_<name>". The migrationrewriter only recognised the EQL v2 type, so a v3 user was left with an un-runnable
migration and nothing to repair it.
The rewriter now matches the whole
eql_v3_*domain family alongsideeql_v2_encrypted,across every mangled form observed from drizzle-kit 0.24 through 0.31, and emits the
matched domain in the replacement instead of a hardcoded v2 type.
stash eql migration --drizzle— the EQL v3 migration-first path — now runs the same sweep thateql install --drizzlehas always run, so the repair actually reaches v3 projects.The rewrite's guidance comment now also warns that it drops the plaintext column in the
same migration, and points at the staged
stash encryptpath (add → backfill → cutover →drop) for populated production tables.
@cipherstash/prisma-next@1.0.0-rc.5
Minor Changes
b7fa61f: Bake the EQL v3 install SQL into the migration artefacts at emit time,
digest-verified against the
@cipherstash/eqlrelease manifest — replacingruntime injection, whose environment-dependent migration hashes broke consumer
repos on every EQL version bump.
Why. Prisma Next's migration framework treats migration packages as
immutable, content-addressed artefacts: the CLI seed phase copies an
extension's packages into the app's
migrations/cipherstash/only whenmissing, and
db init/db updateapply from those on-disk files withoutloading the extension descriptor. The previous design injected the installed
@cipherstash/eql's SQL at descriptor build and recomputed the migration hashfrom it, so the migration's identity changed with the installed EQL version —
every bump orphaned the vendored copies (
PN-MIG-5002), and the hash couldnever detect SQL tampering because it was recomputed from whatever content was
present.
Now. Each migration's self-emit embeds the SQL read from the pinned
@cipherstash/eql, refusing to emit bytes whose sha256 does not match therelease manifest's
installSqlSha256. One content-addressed identity flowsfrom this repo's git history through the npm tarball into the consumer's
vendored copy and the database ledger;
verifyMigrationHashre-checks thebytes on every read, so editing the vendored SQL fails loudly before anything
executes. A repo test pins the committed artefact's SQL digest to the installed
manifest, so an EQL bump without a matching new upgrade migration fails CI.
EQL upgrades ship as new append-only migration directories carrying fresh
invariants (the existing
upgrade_eql_v3_3_0_2pattern); published directoriesare never rewritten.
One-time exception. This PR itself re-emits the baseline migration's bytes
and hash (
35fc9000…→2c873907…) as it moves off the runtime-injectionscheme. That is a deliberate, one-time transition — the "never rewrite a
published directory" invariant it introduces holds strictly for every release
after this one, enforced by the frozen-hash CI pins.
Action required (rc consumers only). If your project's
migrations/cipherstash/was generated by an earlier rc, delete that directoryand re-run
prisma-next migration plan(ormigrate) — the seed phaseregenerates it byte-identical to the shipped artefacts. Databases keep their
markers; already-applied invariants are not re-run.
b7fa61f: Upgrade the Prisma Next integration to Prisma Next 0.16.
All
@prisma-next/*dependencies move from0.14.0to0.16.0, in lockstep. TheCipherStash encryption surface is unchanged — column types, envelopes, the
eql*operators,
cipherstashFromStack, and every subpath export behave exactly as before.Action required in your
prisma-next.config.ts: Prisma Next 0.15 stoppedmaterialising a placeholder namespace, so authoring a SQL contract now requires the
target's namespace factory. Add
createNamespaceto yourprismaContract(...)call:Without it,
prisma-next contract emitfails at runtime withcreateNamespace is not a function. The bundledstash-prisma-nextskill documents this too.The bundled EQL v3 baseline migration is re-emitted so its label and hash reflect
the pinned
@cipherstash/eql3.0.2 (the committed artifact still said 3.0.0).Re-run
prisma-next contract emitafter upgrading. The regeneratedcontract.{json,d.ts}picks up the 0.15/0.16 shape changes — the namespacediscriminator becomes the target-specific
'postgres-schema'(was'sql-namespace'), emit adds theStorageColumnTypes/StorageColumnInputTypesmaps and the
scalarListcapability marker, and foreign keys and their backingindexes become discrete contract entities. Your contract's
storageHashisunaffected by the upgrade itself.
b7fa61f: Route v3 decoding from the EQL payload's own identifier, so encrypted columns
decode on paths that carry no column context.
Every EQL v3 payload carries a required
iidentifier ({"t": "<table>", "c": "<column>"}), and ZeroKMS commits the cell's key to it — a payload relocated toa different column cannot decrypt. That makes the identifier the authoritative
routing source, and it travels with the value rather than with the query.
The v3 cell codec previously took its
(table, column)routing key only from theSQL runtime's projected-column context, which meant two paths failed even though
the value knew exactly where it came from:
include()— the ORM decodes cells nested in ajson_agg/json_build_objectdocument throughdecodeJson, whose framework signaturepasses only the JSON value, with no column ref. This previously threw
decodeJson is not supported; envelopes do not round-trip through JSON.Included encrypted columns now decode into ordinary envelopes that
decryptAllbatches alongside top-level ones.and deliberately passes
column: undefined, sodecodethrew. It now routesfrom the payload.
decodereads the payload identifier first and falls back to the projected-columncontext for a value carrying no usable identifier (a non-v3 or malformed
document), so existing well-routed reads are unaffected.
encodeJsonisunchanged: it still renders the opaque
$encrypted*marker, and is deliberatelynot the inverse of
decodeJson— the two serve different planes.Patch Changes
prisma-next migration applycommand name in the Prisma Nextguidance. Prisma Next has no
migration applysubcommand — the apply verb is thetop-level
prisma-next migrate(migrationonly hasplan/new/show/status/log/list/graph/check). The stale name appeared in thestash-prisma-nextandstash-cliskills, the@cipherstash/prisma-nextREADME, and — user-visibly — in
stash init --prisma-next's printed next-steps,the
stash initflag help, and thestash eql installPrisma-Next refusalmessage, all of which now say
prisma-next migrate. Surfaced by the rc.4skilltester run (found independently at Prisma Next 0.14.0, confirmed at 0.16.0).
@cipherstash/stack@1.0.0-rc.5
Minor Changes
d26950d:
encryptedDynamoDBnow accepts EQL v3 tables.Pass a table built with
encryptedTable+ thetypes.*domains from@cipherstash/stack/v3(or@cipherstash/stack/eql/v3) to any ofencryptModel,bulkEncryptModels,decryptModel,bulkDecryptModels. Boththe typed client from
EncryptionV3and the nominal client fromEncryption({ config: { eqlVersion: 3 } })are accepted.EQL v2 tables continue to work unchanged — this is additive, and no existing
caller needs to change. The table decides which wire format is used, so a
DynamoDB table populated under one version must keep being read with that
version.
This fixes a latent bug that made v3 unusable: the write path detected an
encrypted value by its
k: 'ct'tag, but EQL v3 scalars carry nokdiscriminator at all. Every v3 scalar fell through to the nested-object branch
and was written as a raw map instead of being split into
<attr>__sourceand<attr>__hmac.Notes on capability:
<attr>__hmacis written for domainsthat mint an
hmterm — the*Eqfamily, plusTextOrd/TextOrdOre/TextSearch. Ordering and bloom-filter terms have no DynamoDB query surfaceand are not stored, so those columns remain decryptable but not queryable.
form (that is a compile error), so declare the column flat with a dotted
path —
{ 'profile.ssn': types.TextEq('profile.ssn') }. The model ismatched by dotted path, so
{ profile: { ssn } }resolves, and the nestedattribute keeps its
__hmacfor key conditions.decryptModel/bulkDecryptModelsrequires the nominalclient; the
EncryptionV3client has no audit surface on decrypt.The DynamoDB adapter also gains its first test coverage — across the v2 and v3
paths, where it previously had none.
Robustness, from review:
different schema set, so it is not in v3 mode for that table) now throws a
clear, actionable error naming the table, instead of failing opaquely deep in
the FFI.
failure rather than resolving as a silent
undefinedsuccess.<attr>__sourceattribute that matches no declared column nowlogs a debug diagnostic instead of silently returning the raw ciphertext.
reference — the "encryption never mutates a caller's object" guarantee holds
on that path too.
path the read path rebuilds from. A pre-encrypted payload placed under an
undeclared nested name is stored whole (and round-trips) instead of being
split into a
<attr>__sourcethe read path could never reassemble.ciphertext rather than falling through and being written as a raw map, which
had leaked its
v/ienvelope metadata into storage.into them, so a payload inside a list is stored whole (still decryptable, but
not queryable and not part of the
__source/__hmaclayout).The v3 overloads are strongly typed.
encryptModel/bulkEncryptModelscheckthe input model against the table's column domains, and return the DynamoDB
attribute map that is actually written — the new exported
EncryptedAttributestype, where a declared column
emailbecomesemail__source(plusemail__hmacfor the equality domains that mint one) rather than surviving asemail.decryptModel/bulkDecryptModelsinvert it viaDecryptedAttributes.AnyEncryptedTable,DynamoDBEncryptionClientandAuditConfigare nowexported from
@cipherstash/stack/dynamodbso these signatures can be named.The EQL v2 overloads are unchanged.
d25d100:
@cipherstash/stack/wasm-inlinenow has the model helpers:encryptModel/decryptModelandbulkEncryptModels/bulkDecryptModels(wasm-inline has no model helpers: encryptModel/decryptModel (and their bulk forms) are Node-only #742). They run the same schema traversal as the native entry (shared code, so the two entries cannot drift on which fields get encrypted): declared columns are encrypted — matched by JS property name, nested fields via the column's dotted path — everything else passes through, andnull/undefinedfields are preserved without reaching ZeroKMS. A call that encrypts (or decrypts) at least one field is one ZeroKMS round trip regardless of how many fields or models it covers; anull/empty batch, or one whose models carry no schema fields, returns without contacting ZeroKMS at all.types.Date/types.Timestampcolumns round-tripDate→Date(ISO strings on the wire), and failures follow this entry's{ data } | { failure }Result contract, with decrypt failures naming every failing field by its model path. Edge code no longer needs the hand-writtenbulkEncryptfield mapping whose failure mode was a schema column silently persisted in plaintext.The shared model traversal is also hardened: it no longer mutates the caller's model (previously a nested-column decrypt wrote decrypted plaintext back into the caller's input, and encrypt overwrote it with ciphertext); a literal flat dotted key, a
__proto__-shaped key, or a non-object model element is handled safely instead of crashing, leaking plaintext, or reachingObject.prototype; an already-encrypted field is passed through rather than re-encrypted; and an invalidDateis rejected per field. On the WASM entry, model ops now validate the table against the client's schemas,Datevalues are normalized at every encrypt/query crossing (not just the model path), and anull/empty model batch returns{ data: [] }. The skills update ships in thestashtarball, hence thestashpatch.@cipherstash/stack-drizzle@1.0.0-rc.5
Minor Changes
239f79b: New
encryptedIndexeshelper on the/v3entry: spread...encryptedIndexes(t)inpgTable's third-argument callback and it derivesthe recommended functional indexes for every encrypted column in the table —
named
<table>_<column>_<capability>, tracked bydrizzle-kit generatelikeany other index. The mapping comes from the same per-domain capability record
the operator layer gates on, so the emitted indexes and the operators that
engage them cannot drift: equality → btree on
eql_v3.eq_term, ordering →btree on
eql_v3.ord_term(on the numeric/date/timestamp_orddomains oneindex serves
=and range — their injective ordering term answers equalityand no
eq_termoverload exists; the non-injectivetext_ord/text_ord_orealso carry
hmand get aneq_termindex alongside), ORE ordering →eql_v3.ord_term_ore, free-text →GIN on
eql_v3.match_term, encrypted JSON → GIN on(eql_v3.to_ste_vec_query(col)::jsonb) jsonb_path_ops. Storage-only andnon-encrypted columns emit nothing. Closes the Add a
stash-indexingskill: how to index EQL v3 encrypted columns #753 gap where integrationsemitted query operators but no index DDL, so encrypted predicates
sequential-scanned by default.
Also fixed:
isEqlV3Column/getEqlV3Columnno longer blow the stack whenhanded a column from
pgTable's extras callback — drizzle-orm ≤0.45'sExtraConfigColumn.getSQLType()recurses into itself, so the domain is nowrecovered from the column's custom-type params instead of calling it.
Patch Changes
@cipherstash/wizard@1.0.0-rc.5
Minor Changes
239f79b: New bundled agent skill:
stash-indexing— how to index EQL v3 encryptedcolumns. Integrations that were otherwise correct shipped with no index on any
encrypted predicate because nothing in the installed skills said encrypted
columns can be indexed (Add a
stash-indexingskill: how to index EQL v3 encrypted columns #753). The skill covers the functional-index recipesover the term extractors (
eql_v3.eq_term/ord_term/ord_term_ore/match_term/to_ste_vec_query) mapped to thetypes.*domains, what workswithout superuser on Supabase and managed Postgres versus the ORE opclass
restriction, which domains are storage-only by design, the query shapes that
engage an index (
ORDER BYsort-key andGROUP BYtraps), building indexes onlarge tables, an
EXPLAINverification checklist, and when to create indexesduring an encryption rollout (after backfill, before switching reads).
stash init/stash implhandoffs — and the@cipherstash/wizardskillsprompt — now install it for every integration (Drizzle, Supabase, Prisma
Next, plain PostgreSQL) — the gap is cross-cutting.
The existing per-integration skills gained pointers to it (including the
missing
stash-prisma-nextone-line purpose in the setup prompt, whichpreviously rendered "(no description)").
@cipherstash/stack-supabase@1.0.0-rc.5
Patch Changes
@cipherstash/e2e@0.0.3-rc.5
Patch Changes
@cipherstash/basic-example@1.2.14-rc.5
Patch Changes
@cipherstash/prisma-next-example@0.1.0-rc.5
Patch Changes
@cipherstash/bench@0.0.5-rc.5
Patch Changes
@cipherstash/test-kit@0.0.1-rc.5
Patch Changes