Repository navigation
chore(release): version packages - #172
Merged
Merged
Conversation
github-actions
Bot
force-pushed
the
changeset-release/main
branch
from
November 8, 2026 18:01
32db8d3 to
6cb8b95
Compare
github-actions
Bot
force-pushed
the
changeset-release/main
branch
from
November 8, 2026 22:01
6cb8b95 to
e30788c
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 publish to npm yourself or setup this action to publish 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
@cloudhal/agent-runtime@0.6.5
Patch Changes
b0ebd95: MCP OAuth step-up follow-ups (RFC-0044 phase 1, Review follow-ups: MCP OAuth step-up scope set (phase 2) and CI/docs housekeeping #168). These stay latent until phase 2 gives connections a
grantId. A policy denial for missing scopes now carriesmissing, the required scopes that neither the caller's scopes nor an own variant satisfy. The newstepUpScopes(policy, principal, tool, args)turns that into the scopes a token should ask for, using the same rules as the handler: a propose call'sproposeScopes, the own variant the member's role holds (content:write:ownfor an Author,content:draft:ownfor a Contributor,site:publish:ownfor an Author's publish) and the member's role on the call's site (RFC-0034 A2), capped by their installation role as consent caps a token (an installation Contributor who is an Editor on one site is asked forcontent:draft:ownthere). A call that would still be denied with those scopes, such as a write in plan mode or a tool outside the declared skill, is not challenged. The/mcpstep-up 403 asks for exactly that set and now leaves an audit row, like other denials.createApithrows whenmcp.oauth.resourceis not the public URL of/mcp. A playground refuses both OAuth protected-resource documents (403 {error: "playground", block: "mcp"}), as its route table already said.c15218e: Second ReDoS sweep (Security: second ReDoS sweep (unauthenticated email check first; request path, docs Worker, lazy scans) #174). Input that made a regex backtrack is now handled in linear time; results are unchanged.
POST /api/password-reset/request(and invite creation) checks the address length before anything else, and the address check no longer backtracks:a@followed by many dots used to cost seconds of CPU per request. Public token endpoints (/api/password-reset/*, invite acceptance) refuse a JSON body over 64 KiB with413 payload_too_large, whether or not it declares acontent-length.normalisePath,joinTarget, andancestorPaths, which no longer lists ancestors that no redirect can match: those longer than afrommay be (1024 code points) or holding//. Directive lines in search text keep their braces on one line, so a directive whose{…}spans a lone\ris no longer read as one. Search text built at publish time: fenced code, links, images and tags. SVG upload checks: CSS comments,url(…)references (about cubic onurl(followed by spaces) and width/height lengths (newcss-scan.ts).<enclosure>/<media:content>url scans, andurlPath.@cloudhal/cli): the markdown body editor's trailing-newline trims.Updated dependencies [b0ebd95]
@cloudhal/analytics@0.6.5
Patch Changes
b0ebd95: Slug and name trims run in one linear pass instead of
/^-+|-+$/g(CodeQL js/polynomial-redos, Review follow-ups: MCP OAuth step-up scope set (phase 2) and CI/docs housekeeping #168). This coversslugify,foldNameandslugifyFilenamein core-ts (the newtrimCharis exported from@cloudhal/core-ts/names), heading ids in astro-renderer, and Studio's option, media and entry slugs. Results are unchanged. These trims were already linear in practice, because a run of other characters was collapsed to one-first. These inputs were quadratic and are linear now: analytics'datasetNameon a long run of_inside a deployment name; json-render component keys infromJsonRender(./interop); trailing whitespace in directive blocks and on comment lines; trailing/in request paths (the playground guard and route matching in api, analytics paths, the renderer's link localizing and redirect splats, the docs Worker). The newtrimEndCharis exported from@cloudhal/core-ts/namestoo.Also in 0.6.3, with no changeset at the time (test: quiet the known log noise #161): Studio's "Not published" badges and its "unknown" scheduler state show their status dot again. They used a Badge variant without a dot colour and rendered no dot.
Updated dependencies [b0ebd95]
@cloudhal/api@0.6.5
Patch Changes
b0ebd95: MCP OAuth step-up follow-ups (RFC-0044 phase 1, Review follow-ups: MCP OAuth step-up scope set (phase 2) and CI/docs housekeeping #168). These stay latent until phase 2 gives connections a
grantId. A policy denial for missing scopes now carriesmissing, the required scopes that neither the caller's scopes nor an own variant satisfy. The newstepUpScopes(policy, principal, tool, args)turns that into the scopes a token should ask for, using the same rules as the handler: a propose call'sproposeScopes, the own variant the member's role holds (content:write:ownfor an Author,content:draft:ownfor a Contributor,site:publish:ownfor an Author's publish) and the member's role on the call's site (RFC-0034 A2), capped by their installation role as consent caps a token (an installation Contributor who is an Editor on one site is asked forcontent:draft:ownthere). A call that would still be denied with those scopes, such as a write in plan mode or a tool outside the declared skill, is not challenged. The/mcpstep-up 403 asks for exactly that set and now leaves an audit row, like other denials.createApithrows whenmcp.oauth.resourceis not the public URL of/mcp. A playground refuses both OAuth protected-resource documents (403 {error: "playground", block: "mcp"}), as its route table already said.b0ebd95: Cloudhal's own rate-limit counters move out of Better Auth's
rateLimittable intorate_limits(migration0030_rate_limits, Review follow-ups: MCP OAuth step-up scope set (phase 2) and CI/docs housekeeping #168). This covers the hourly cap of 3 reset mails per address, the per-minute buckets of the public token endpoints and each agent key's window. Better Auth prunesrateLimitby its own 60 s window, so the hourly reset-mail cap used to restart about a minute after any sign-in from the same address. Each hit counts in one statement (an upsert withRETURNING). Because the keys come from client addresses and submitted email addresses, about one hit in 32 also deletes up to 500 expired counters through anexpires_atindex. The migration deletes the oldcloudhal:rows fromrateLimit, so each counter starts over once at upgrade.c15218e: Second ReDoS sweep (Security: second ReDoS sweep (unauthenticated email check first; request path, docs Worker, lazy scans) #174). Input that made a regex backtrack is now handled in linear time; results are unchanged.
POST /api/password-reset/request(and invite creation) checks the address length before anything else, and the address check no longer backtracks:a@followed by many dots used to cost seconds of CPU per request. Public token endpoints (/api/password-reset/*, invite acceptance) refuse a JSON body over 64 KiB with413 payload_too_large, whether or not it declares acontent-length.normalisePath,joinTarget, andancestorPaths, which no longer lists ancestors that no redirect can match: those longer than afrommay be (1024 code points) or holding//. Directive lines in search text keep their braces on one line, so a directive whose{…}spans a lone\ris no longer read as one. Search text built at publish time: fenced code, links, images and tags. SVG upload checks: CSS comments,url(…)references (about cubic onurl(followed by spaces) and width/height lengths (newcss-scan.ts).<enclosure>/<media:content>url scans, andurlPath.@cloudhal/cli): the markdown body editor's trailing-newline trims.Updated dependencies [b0ebd95]
Updated dependencies [b0ebd95]
Updated dependencies [b0ebd95]
Updated dependencies [c15218e]
Updated dependencies [f4a1ee3]
@cloudhal/astro-renderer@0.6.5
Patch Changes
b0ebd95: Slug and name trims run in one linear pass instead of
/^-+|-+$/g(CodeQL js/polynomial-redos, Review follow-ups: MCP OAuth step-up scope set (phase 2) and CI/docs housekeeping #168). This coversslugify,foldNameandslugifyFilenamein core-ts (the newtrimCharis exported from@cloudhal/core-ts/names), heading ids in astro-renderer, and Studio's option, media and entry slugs. Results are unchanged. These trims were already linear in practice, because a run of other characters was collapsed to one-first. These inputs were quadratic and are linear now: analytics'datasetNameon a long run of_inside a deployment name; json-render component keys infromJsonRender(./interop); trailing whitespace in directive blocks and on comment lines; trailing/in request paths (the playground guard and route matching in api, analytics paths, the renderer's link localizing and redirect splats, the docs Worker). The newtrimEndCharis exported from@cloudhal/core-ts/namestoo.Also in 0.6.3, with no changeset at the time (test: quiet the known log noise #161): Studio's "Not published" badges and its "unknown" scheduler state show their status dot again. They used a Badge variant without a dot colour and rendered no dot.
f4a1ee3: Status page fixes after RFC-0043 PR 1 (Status pages: withErrorPage 503→500 regression and RFC-0043 deviations (follow-up to #162) #167). The Site Worker no longer turns a 5xx the renderer or the theme answers on purpose into the
errorpage: the starter's ownnot-published503 for a request that reaches Astro (aPOST, say) passes unchanged and logs nothing; only Astro's own 500 page (HTML, or its empty fallback when no 500 page renders) and thrown errors become theerrorpage. A theme page that throws now gets that page with a reference and acloudhal: request failedlog line: the blog starter's catch-all route rethrows when Astro renders it as the error route, instead of answering its own 404 for the page's path (theme copies made from an earlier starter can add the same two lines at the top of[...path].astro). A store that cannot be read before rendering answers 503unavailablewithRetry-After: 300, as/__cloudhal/healthreports it, instead of a 500; so does a multi-site Worker whose hostname map cannot be read (health503 { ok: false }, pages the Englishunavailablepage). Theerrorpage uses the site's language and name when the request has already read the site, taken from the published snapshot (an unpublished rename never shows). An invalid preview token on a feed, sitemap,llms.txtor JSON path answers 410 instead of the published content, and no response says why a token failed any more (x-cloudhal-preview-erroris now alwaysinvalid).Updated dependencies [b0ebd95]
Updated dependencies [b0ebd95]
Updated dependencies [c15218e]
@cloudhal/cli@0.6.5
Patch Changes
b0ebd95: Slug and name trims run in one linear pass instead of
/^-+|-+$/g(CodeQL js/polynomial-redos, Review follow-ups: MCP OAuth step-up scope set (phase 2) and CI/docs housekeeping #168). This coversslugify,foldNameandslugifyFilenamein core-ts (the newtrimCharis exported from@cloudhal/core-ts/names), heading ids in astro-renderer, and Studio's option, media and entry slugs. Results are unchanged. These trims were already linear in practice, because a run of other characters was collapsed to one-first. These inputs were quadratic and are linear now: analytics'datasetNameon a long run of_inside a deployment name; json-render component keys infromJsonRender(./interop); trailing whitespace in directive blocks and on comment lines; trailing/in request paths (the playground guard and route matching in api, analytics paths, the renderer's link localizing and redirect splats, the docs Worker). The newtrimEndCharis exported from@cloudhal/core-ts/namestoo.Also in 0.6.3, with no changeset at the time (test: quiet the known log noise #161): Studio's "Not published" badges and its "unknown" scheduler state show their status dot again. They used a Badge variant without a dot colour and rendered no dot.
c15218e: Second ReDoS sweep (Security: second ReDoS sweep (unauthenticated email check first; request path, docs Worker, lazy scans) #174). Input that made a regex backtrack is now handled in linear time; results are unchanged.
POST /api/password-reset/request(and invite creation) checks the address length before anything else, and the address check no longer backtracks:a@followed by many dots used to cost seconds of CPU per request. Public token endpoints (/api/password-reset/*, invite acceptance) refuse a JSON body over 64 KiB with413 payload_too_large, whether or not it declares acontent-length.normalisePath,joinTarget, andancestorPaths, which no longer lists ancestors that no redirect can match: those longer than afrommay be (1024 code points) or holding//. Directive lines in search text keep their braces on one line, so a directive whose{…}spans a lone\ris no longer read as one. Search text built at publish time: fenced code, links, images and tags. SVG upload checks: CSS comments,url(…)references (about cubic onurl(followed by spaces) and width/height lengths (newcss-scan.ts).<enclosure>/<media:content>url scans, andurlPath.@cloudhal/cli): the markdown body editor's trailing-newline trims.Updated dependencies [b0ebd95]
Updated dependencies [b0ebd95]
Updated dependencies [b0ebd95]
Updated dependencies [c15218e]
@cloudhal/cloudflare@0.6.5
Patch Changes
@cloudhal/comments@0.6.5
Patch Changes
b0ebd95: Slug and name trims run in one linear pass instead of
/^-+|-+$/g(CodeQL js/polynomial-redos, Review follow-ups: MCP OAuth step-up scope set (phase 2) and CI/docs housekeeping #168). This coversslugify,foldNameandslugifyFilenamein core-ts (the newtrimCharis exported from@cloudhal/core-ts/names), heading ids in astro-renderer, and Studio's option, media and entry slugs. Results are unchanged. These trims were already linear in practice, because a run of other characters was collapsed to one-first. These inputs were quadratic and are linear now: analytics'datasetNameon a long run of_inside a deployment name; json-render component keys infromJsonRender(./interop); trailing whitespace in directive blocks and on comment lines; trailing/in request paths (the playground guard and route matching in api, analytics paths, the renderer's link localizing and redirect splats, the docs Worker). The newtrimEndCharis exported from@cloudhal/core-ts/namestoo.Also in 0.6.3, with no changeset at the time (test: quiet the known log noise #161): Studio's "Not published" badges and its "unknown" scheduler state show their status dot again. They used a Badge variant without a dot colour and rendered no dot.
Updated dependencies [b0ebd95]
Updated dependencies [b0ebd95]
Updated dependencies [c15218e]
@cloudhal/core-ts@0.6.5
Patch Changes
b0ebd95: Slug and name trims run in one linear pass instead of
/^-+|-+$/g(CodeQL js/polynomial-redos, Review follow-ups: MCP OAuth step-up scope set (phase 2) and CI/docs housekeeping #168). This coversslugify,foldNameandslugifyFilenamein core-ts (the newtrimCharis exported from@cloudhal/core-ts/names), heading ids in astro-renderer, and Studio's option, media and entry slugs. Results are unchanged. These trims were already linear in practice, because a run of other characters was collapsed to one-first. These inputs were quadratic and are linear now: analytics'datasetNameon a long run of_inside a deployment name; json-render component keys infromJsonRender(./interop); trailing whitespace in directive blocks and on comment lines; trailing/in request paths (the playground guard and route matching in api, analytics paths, the renderer's link localizing and redirect splats, the docs Worker). The newtrimEndCharis exported from@cloudhal/core-ts/namestoo.Also in 0.6.3, with no changeset at the time (test: quiet the known log noise #161): Studio's "Not published" badges and its "unknown" scheduler state show their status dot again. They used a Badge variant without a dot colour and rendered no dot.
c15218e: Second ReDoS sweep (Security: second ReDoS sweep (unauthenticated email check first; request path, docs Worker, lazy scans) #174). Input that made a regex backtrack is now handled in linear time; results are unchanged.
POST /api/password-reset/request(and invite creation) checks the address length before anything else, and the address check no longer backtracks:a@followed by many dots used to cost seconds of CPU per request. Public token endpoints (/api/password-reset/*, invite acceptance) refuse a JSON body over 64 KiB with413 payload_too_large, whether or not it declares acontent-length.normalisePath,joinTarget, andancestorPaths, which no longer lists ancestors that no redirect can match: those longer than afrommay be (1024 code points) or holding//. Directive lines in search text keep their braces on one line, so a directive whose{…}spans a lone\ris no longer read as one. Search text built at publish time: fenced code, links, images and tags. SVG upload checks: CSS comments,url(…)references (about cubic onurl(followed by spaces) and width/height lengths (newcss-scan.ts).<enclosure>/<media:content>url scans, andurlPath.@cloudhal/cli): the markdown body editor's trailing-newline trims.Updated dependencies [b0ebd95]
Updated dependencies [c15218e]
create-cloudhal@0.6.5
Patch Changes
@cloudhal/mcp-server@0.6.5
Patch Changes
@cloudhal/schedules@0.6.5
Patch Changes
c15218e: Second ReDoS sweep (Security: second ReDoS sweep (unauthenticated email check first; request path, docs Worker, lazy scans) #174). Input that made a regex backtrack is now handled in linear time; results are unchanged.
POST /api/password-reset/request(and invite creation) checks the address length before anything else, and the address check no longer backtracks:a@followed by many dots used to cost seconds of CPU per request. Public token endpoints (/api/password-reset/*, invite acceptance) refuse a JSON body over 64 KiB with413 payload_too_large, whether or not it declares acontent-length.normalisePath,joinTarget, andancestorPaths, which no longer lists ancestors that no redirect can match: those longer than afrommay be (1024 code points) or holding//. Directive lines in search text keep their braces on one line, so a directive whose{…}spans a lone\ris no longer read as one. Search text built at publish time: fenced code, links, images and tags. SVG upload checks: CSS comments,url(…)references (about cubic onurl(followed by spaces) and width/height lengths (newcss-scan.ts).<enclosure>/<media:content>url scans, andurlPath.@cloudhal/cli): the markdown body editor's trailing-newline trims.Updated dependencies [b0ebd95]
@cloudhal/storage@0.6.5
Patch Changes
rateLimittable intorate_limits(migration0030_rate_limits, Review follow-ups: MCP OAuth step-up scope set (phase 2) and CI/docs housekeeping #168). This covers the hourly cap of 3 reset mails per address, the per-minute buckets of the public token endpoints and each agent key's window. Better Auth prunesrateLimitby its own 60 s window, so the hourly reset-mail cap used to restart about a minute after any sign-in from the same address. Each hit counts in one statement (an upsert withRETURNING). Because the keys come from client addresses and submitted email addresses, about one hit in 32 also deletes up to 500 expired counters through anexpires_atindex. The migration deletes the oldcloudhal:rows fromrateLimit, so each counter starts over once at upgrade.@cloudhal/core-contracts@0.6.5
No changes in this release.