Skip to content

chore(release): version packages - #172

Merged
Madraka merged 1 commit into
mainfrom
changeset-release/main
Nov 8, 2026
Merged

Madraka merged 1 commit into
mainfrom
changeset-release/main

Conversation

@github-actions

@github-actions github-actions Bot commented Nov 8, 2026 •

Copy link
Copy Markdown
Contributor

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 carries missing, the required scopes that neither the caller's scopes nor an own variant satisfy. The new stepUpScopes(policy, principal, tool, args) turns that into the scopes a token should ask for, using the same rules as the handler: a propose call's proposeScopes, the own variant the member's role holds (content:write:own for an Author, content:draft:own for a Contributor, site:publish:own for 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 for content:draft:own there). 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 /mcp step-up 403 asks for exactly that set and now leaves an audit row, like other denials. createApi throws when mcp.oauth.resource is 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.

    • Unauthenticated password-reset request. 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 with 413 payload_too_large, whether or not it declares a content-length.
    • core-ts. Redirect path normalising and matching (on every site request): normalisePath, joinTarget, and ancestorPaths, which no longer lists ancestors that no redirect can match: those longer than a from may be (1024 code points) or holding //. Directive lines in search text keep their braces on one line, so a directive whose {…} spans a lone \r is 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 on url( followed by spaces) and width/height lengths (new css-scan.ts).
    • schedules. The feed check's CDATA, element and <enclosure>/<media:content> url scans, and urlPath.
    • agent-runtime. SKILL.md frontmatter lines (a line of spaces was quadratic).
    • Studio (in @cloudhal/cli): the markdown body editor's trailing-newline trims.
  • Updated dependencies [b0ebd95]

    • @cloudhal/storage@0.6.5
    • @cloudhal/core-contracts@0.6.5

@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 covers slugify, foldName and slugifyFilename in core-ts (the new trimChar is 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' datasetName on a long run of _ inside a deployment name; json-render component keys in fromJsonRender (./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 new trimEndChar is exported from @cloudhal/core-ts/names too.

    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/storage@0.6.5
    • @cloudhal/core-contracts@0.6.5

@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 carries missing, the required scopes that neither the caller's scopes nor an own variant satisfy. The new stepUpScopes(policy, principal, tool, args) turns that into the scopes a token should ask for, using the same rules as the handler: a propose call's proposeScopes, the own variant the member's role holds (content:write:own for an Author, content:draft:own for a Contributor, site:publish:own for 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 for content:draft:own there). 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 /mcp step-up 403 asks for exactly that set and now leaves an audit row, like other denials. createApi throws when mcp.oauth.resource is 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 rateLimit table into rate_limits (migration 0030_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 prunes rateLimit by 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 with RETURNING). Because the keys come from client addresses and submitted email addresses, about one hit in 32 also deletes up to 500 expired counters through an expires_at index. The migration deletes the old cloudhal: rows from rateLimit, 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.

    • Unauthenticated password-reset request. 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 with 413 payload_too_large, whether or not it declares a content-length.
    • core-ts. Redirect path normalising and matching (on every site request): normalisePath, joinTarget, and ancestorPaths, which no longer lists ancestors that no redirect can match: those longer than a from may be (1024 code points) or holding //. Directive lines in search text keep their braces on one line, so a directive whose {…} spans a lone \r is 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 on url( followed by spaces) and width/height lengths (new css-scan.ts).
    • schedules. The feed check's CDATA, element and <enclosure>/<media:content> url scans, and urlPath.
    • agent-runtime. SKILL.md frontmatter lines (a line of spaces was quadratic).
    • Studio (in @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/core-ts@0.6.5
    • @cloudhal/analytics@0.6.5
    • @cloudhal/astro-renderer@0.6.5
    • @cloudhal/comments@0.6.5
    • @cloudhal/agent-runtime@0.6.5
    • @cloudhal/storage@0.6.5
    • @cloudhal/schedules@0.6.5
    • @cloudhal/mcp-server@0.6.5
    • @cloudhal/core-contracts@0.6.5

@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 covers slugify, foldName and slugifyFilename in core-ts (the new trimChar is 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' datasetName on a long run of _ inside a deployment name; json-render component keys in fromJsonRender (./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 new trimEndChar is exported from @cloudhal/core-ts/names too.

    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 error page: the starter's own not-published 503 for a request that reaches Astro (a POST, 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 the error page. A theme page that throws now gets that page with a reference and a cloudhal: request failed log 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 503 unavailable with Retry-After: 300, as /__cloudhal/health reports it, instead of a 500; so does a multi-site Worker whose hostname map cannot be read (health 503 { ok: false }, pages the English unavailable page). The error page 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.txt or JSON path answers 410 instead of the published content, and no response says why a token failed any more (x-cloudhal-preview-error is now always invalid).

  • Updated dependencies [b0ebd95]

  • Updated dependencies [b0ebd95]

  • Updated dependencies [c15218e]

    • @cloudhal/core-ts@0.6.5
    • @cloudhal/analytics@0.6.5
    • @cloudhal/comments@0.6.5
    • @cloudhal/storage@0.6.5
    • @cloudhal/core-contracts@0.6.5

@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 covers slugify, foldName and slugifyFilename in core-ts (the new trimChar is 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' datasetName on a long run of _ inside a deployment name; json-render component keys in fromJsonRender (./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 new trimEndChar is exported from @cloudhal/core-ts/names too.

    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.

    • Unauthenticated password-reset request. 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 with 413 payload_too_large, whether or not it declares a content-length.
    • core-ts. Redirect path normalising and matching (on every site request): normalisePath, joinTarget, and ancestorPaths, which no longer lists ancestors that no redirect can match: those longer than a from may be (1024 code points) or holding //. Directive lines in search text keep their braces on one line, so a directive whose {…} spans a lone \r is 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 on url( followed by spaces) and width/height lengths (new css-scan.ts).
    • schedules. The feed check's CDATA, element and <enclosure>/<media:content> url scans, and urlPath.
    • agent-runtime. SKILL.md frontmatter lines (a line of spaces was quadratic).
    • Studio (in @cloudhal/cli): the markdown body editor's trailing-newline trims.
  • Updated dependencies [b0ebd95]

  • Updated dependencies [b0ebd95]

  • Updated dependencies [b0ebd95]

  • Updated dependencies [c15218e]

    • @cloudhal/core-ts@0.6.5
    • @cloudhal/analytics@0.6.5
    • @cloudhal/comments@0.6.5
    • @cloudhal/agent-runtime@0.6.5
    • @cloudhal/api@0.6.5
    • @cloudhal/storage@0.6.5
    • @cloudhal/schedules@0.6.5
    • @cloudhal/cloudflare@0.6.5
    • @cloudhal/mcp-server@0.6.5
    • @cloudhal/core-contracts@0.6.5

@cloudhal/cloudflare@0.6.5

Patch Changes

  • Updated dependencies [b0ebd95]
  • Updated dependencies [b0ebd95]
  • Updated dependencies [b0ebd95]
  • Updated dependencies [c15218e]
    • @cloudhal/core-ts@0.6.5
    • @cloudhal/analytics@0.6.5
    • @cloudhal/comments@0.6.5
    • @cloudhal/agent-runtime@0.6.5
    • @cloudhal/api@0.6.5
    • @cloudhal/storage@0.6.5
    • @cloudhal/schedules@0.6.5
    • @cloudhal/mcp-server@0.6.5

@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 covers slugify, foldName and slugifyFilename in core-ts (the new trimChar is 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' datasetName on a long run of _ inside a deployment name; json-render component keys in fromJsonRender (./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 new trimEndChar is exported from @cloudhal/core-ts/names too.

    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
    • @cloudhal/storage@0.6.5
    • @cloudhal/core-contracts@0.6.5

@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 covers slugify, foldName and slugifyFilename in core-ts (the new trimChar is 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' datasetName on a long run of _ inside a deployment name; json-render component keys in fromJsonRender (./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 new trimEndChar is exported from @cloudhal/core-ts/names too.

    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.

    • Unauthenticated password-reset request. 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 with 413 payload_too_large, whether or not it declares a content-length.
    • core-ts. Redirect path normalising and matching (on every site request): normalisePath, joinTarget, and ancestorPaths, which no longer lists ancestors that no redirect can match: those longer than a from may be (1024 code points) or holding //. Directive lines in search text keep their braces on one line, so a directive whose {…} spans a lone \r is 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 on url( followed by spaces) and width/height lengths (new css-scan.ts).
    • schedules. The feed check's CDATA, element and <enclosure>/<media:content> url scans, and urlPath.
    • agent-runtime. SKILL.md frontmatter lines (a line of spaces was quadratic).
    • Studio (in @cloudhal/cli): the markdown body editor's trailing-newline trims.
  • Updated dependencies [b0ebd95]

  • Updated dependencies [c15218e]

    • @cloudhal/storage@0.6.5
    • @cloudhal/schedules@0.6.5
    • @cloudhal/core-contracts@0.6.5

create-cloudhal@0.6.5

Patch Changes

  • Updated dependencies [b0ebd95]
  • Updated dependencies [c15218e]
    • @cloudhal/cli@0.6.5

@cloudhal/mcp-server@0.6.5

Patch Changes

  • Updated dependencies [b0ebd95]
  • Updated dependencies [b0ebd95]
  • Updated dependencies [b0ebd95]
  • Updated dependencies [c15218e]
  • Updated dependencies [f4a1ee3]
    • @cloudhal/core-ts@0.6.5
    • @cloudhal/analytics@0.6.5
    • @cloudhal/astro-renderer@0.6.5
    • @cloudhal/comments@0.6.5
    • @cloudhal/agent-runtime@0.6.5
    • @cloudhal/storage@0.6.5
    • @cloudhal/schedules@0.6.5
    • @cloudhal/core-contracts@0.6.5

@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.

    • Unauthenticated password-reset request. 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 with 413 payload_too_large, whether or not it declares a content-length.
    • core-ts. Redirect path normalising and matching (on every site request): normalisePath, joinTarget, and ancestorPaths, which no longer lists ancestors that no redirect can match: those longer than a from may be (1024 code points) or holding //. Directive lines in search text keep their braces on one line, so a directive whose {…} spans a lone \r is 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 on url( followed by spaces) and width/height lengths (new css-scan.ts).
    • schedules. The feed check's CDATA, element and <enclosure>/<media:content> url scans, and urlPath.
    • agent-runtime. SKILL.md frontmatter lines (a line of spaces was quadratic).
    • Studio (in @cloudhal/cli): the markdown body editor's trailing-newline trims.
  • Updated dependencies [b0ebd95]

    • @cloudhal/storage@0.6.5
    • @cloudhal/core-contracts@0.6.5

@cloudhal/storage@0.6.5

Patch Changes

  • b0ebd95: Cloudhal's own rate-limit counters move out of Better Auth's rateLimit table into rate_limits (migration 0030_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 prunes rateLimit by 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 with RETURNING). Because the keys come from client addresses and submitted email addresses, about one hit in 32 also deletes up to 500 expired counters through an expires_at index. The migration deletes the old cloudhal: rows from rateLimit, so each counter starts over once at upgrade.
  • @cloudhal/core-contracts@0.6.5

@cloudhal/core-contracts@0.6.5

No changes in this release.

@github-actions
github-actions Bot force-pushed the changeset-release/main branch from 32db8d3 to 6cb8b95 Compare November 8, 2026 18:01
@github-actions
github-actions Bot force-pushed the changeset-release/main branch from 6cb8b95 to e30788c Compare November 8, 2026 22:01
@Madraka
Madraka merged commit 0863454 into main Nov 8, 2026
9 checks passed
@Madraka
Madraka deleted the changeset-release/main branch November 8, 2026 22:18
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant