Repository navigation
Keep Alchemy libraries in the published deploy package - #195
Merged
Merged
Conversation
The release archive runs after nub prune --prod. The API stack imports @alchemy.run/cloudflare and alchemy while deploying, so those packages belong in dependencies and stay in the alchemy.new package. Co-authored-by: Jonathan Beckman <jonathantbeckman@gmail.com>
jonbeckman
marked this pull request as ready for review
November 13, 2026 17:35
jonbeckman
enabled auto-merge (squash)
November 13, 2026 17:36
Contributor
TegamiThis repository uses Tegami to manage releases. When your changes affect published packages, add a changelog file under Create a changelog → · Changelog format Release preview
Changelogs in this PR
Run Managed by Tegami. |
Contributor
🟢 e2e solzero-core: 25 passed, 7 left out by filters4 agent steps · 4 replayed from cache Change 3 files changed since 7 tests left out by filters
All 25 tests in 11 files
Tested by e2e 0.23.0 · 2m 29s · local-cloudflare · run artifacts |
cursor Bot
pushed a commit
that referenced
this pull request
Nov 13, 2026
#195 moved @alchemy.run/cloudflare and alchemy to production dependencies so a pruned publish can still deploy. Keep those packages there, at 2.0.0-beta.85. Effect stays 4.1.2. Co-authored-by: Jonathan Beckman <jonathantbeckman@gmail.com>
6 tasks done
jonbeckman
added a commit
that referenced
this pull request
Nov 13, 2026
<!-- CURSOR_AGENT_PR_BODY_BEGIN --> ## Summary Moves the workspace onto Alchemy `2.0.0-beta.85` and Effect `4.1.2`, and merges current `master` (through #195). The root `workerd` override is removed. It held workerd behind the release Alchemy beta.85's Vite forwarder needs. That forwarder waits for `HTTP/1.1 100 Continue` before it sends a POST body, and `workerd` `1.20261006.1` never sends that response. No published Miniflare release depends on `workerd` `1.20261026.1`, the exact version `@alchemy.run/cloudflare-runtime@2.0.0-beta.85` depends on. Miniflare is now `5.20261101.0-beta`, the next published release, and it depends on `workerd` `1.20261101.1`. Wrangler `4.149.0` also depended on `workerd` `1.20261006.1` and Miniflare `5.20261006.1-alpha`, so Wrangler is now `4.156.1`, which uses that same Miniflare and `workerd` `1.20261101.1`. `nub why workerd` shows two versions: - `1.20261026.1`, supplied by `@alchemy.run/cloudflare-runtime` (the binary `alchemy dev` uses) - `1.20261101.1`, supplied by `miniflare` and `wrangler` Both binaries include `100 Continue`. `1.20261006.1` is gone. `allowScripts` still allows the `workerd` install script. `VERSION` is untouched. The `release:none` label stays. Master's versions are kept for everything this pull request does not bump, including oxlint `1.93.0`, oxfmt `0.78.0`, tsrs `0.23.0-ts7.1.0-beta`, the AI SDK pins from #192, and the AI Search config shape from #186. The config JSON schema was regenerated for Effect 4.1 against that shape. #195 moved `@alchemy.run/cloudflare` and `alchemy` to production dependencies of `@solzero/background-api` so a pruned publish can still deploy. Those packages stay production dependencies, at `2.0.0-beta.85`. Effect stays a devDependency at `4.1.2`. ## Root cause File: `@alchemy.run/cloudflare-runtime@2.0.0-beta.85` `src/vite/worker-request.ts`, in `forwardWorkerRequest`. - Lines 70–79: a request with `content-length` or `transfer-encoding` is forwarded with `expect: 100-continue`. - Lines 169–174: the body is not piped until the upstream emits `continue`. That landed in commit `3bb45b0f08` (`feat(cloudflare-runtime): update workerd and sync workers-sdk`, #2673), which is in `2.0.0-beta.85` and not in `2.0.0-beta.84`. Beta.84 piped the body immediately. A packet capture of `POST /api/auth/sign-in/email` to port 3000 showed the Vite process sending headers, including `expect: 100-continue` and `content-length: 40`, and then no body. workerd acknowledged the headers and never replied `100 Continue`. The Worker then failed `request.arrayBuffer()` with `Network connection lost` once the client gave up. The same POST to port 3100 does not go through this Vite forwarder, so it returned 200. `workerd` `1.20261006.1` has no `100 Continue` string in the binary. `1.20261026.1` and `1.20261101.1` do. ## Conflicts - `.npmrc`: kept master's release-age exclusions, including oxfmt `0.78.0`, oxlint `1.93.0`, and `ai@7.0.166`, and removed the `workerd` `1.20261006.1` exclusions. - `package.json`: Miniflare `5.20261101.0-beta` and Wrangler `4.156.1` from this branch; oxfmt `0.78.0` and oxlint `1.93.0` from master. The `workerd` override stays removed. - `apps/api/package.json`: Alchemy `2.0.0-beta.85` and Effect `4.1.2` from this branch; tsrs `0.23.0-ts7.1.0-beta` from master. After #195, `@alchemy.run/cloudflare` and `alchemy` are production dependencies. - `config/s0.config.schema.json`: master's removal of `aiSearch.serviceTokenId`, then regenerated with Effect 4.1. - `nub.lock`: regenerated with nub. Not hand-edited. ## Validation - `nub run format`, `nub run lint`, and `nub run typecheck`: passed, including the pre-push hook on both pushes. - `nub run config:check`: passed. - `nub run test:config`: 31 passed (5 files), including the Miniflare service-binding and storage fixtures. One workerd stderr line reported a hung request during the service-binding case; the test still passed. Re-run after the #195 merge. - `nub run test`: 30 passed, 2 failed. Sign-in, Isolate, settings, workflows, and the other core flows passed. OpenCode and Codex timed out because `cloudflare/proxy-everything` exited before the container could start (`iptables` `PREROUTING` append failed: missing kernel module). That is this VM, not an application change. CI runs that suite on a host that can run the proxy. The #195 follow-up only moves the same Alchemy packages into production dependencies, so that browser suite was not repeated. ## Checklist - [x] I added or updated tests for behavior changes, or explained why tests are not needed. The existing config suite covers the Miniflare fixtures. - [x] I updated documentation and config examples when behavior or configuration changed. The config JSON schema was regenerated for Effect 4.1. Stale `workerd` `1.20261006.1` entries were removed from `.npmrc` `minimumReleaseAgeExclude`. The new Miniflare and workerd versions did not need an age exclusion. - [x] I added a `.tegami/` release entry. `VERSION` is untouched. This pull request keeps `release:none`. - [x] I ran `nub run config:check`, `nub run format`, `nub run lint`, `nub run typecheck`, `nub run test:config`, and `nub run test`. - [x] I did not include credentials, private data, internal URLs, or organization-specific defaults. - [x] I updated `THIRD_PARTY_NOTICES.md` for new third-party code or separately licensed assets. No new third-party source was added. <!-- CURSOR_AGENT_PR_BODY_END --> <div><a href="https://cursor.com/agents/bc-85cb0616-7478-5004-89c8-7a62aca4d1cb?cursor_ref=pr_footer&cursor_cta=open_in_web"><picture><source media="(prefers-color-scheme: dark)" srcset="https://cursor.com/assets/images/open-in-web-dark.png"><source media="(prefers-color-scheme: light)" srcset="https://cursor.com/assets/images/open-in-web-light.png"><img alt="Open in Web" width="114" height="28" src="https://cursor.com/assets/images/open-in-web-dark.png"></picture></a> <a href="https://cursor.com/background-agent?bcId=bc-85cb0616-7478-5004-89c8-7a62aca4d1cb&cursor_ref=pr_footer&cursor_cta=open_in_cursor"><picture><source media="(prefers-color-scheme: dark)" srcset="https://cursor.com/assets/images/open-in-cursor-dark.png"><source media="(prefers-color-scheme: light)" srcset="https://cursor.com/assets/images/open-in-cursor-light.png"><img alt="Open in Cursor" width="131" height="28" src="https://cursor.com/assets/images/open-in-cursor-dark.png"></picture></a> </div> --------- Co-authored-by: Cursor Agent <cursoragent@cursor.com>
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.
Summary
The release workflow builds the registry archive, then runs
nub prune --prodbefore alchemy.new packs it. alchemy.new installs nothing and runs that archive. The API stack imports@alchemy.run/cloudflareandalchemywhile deploying, and both were devDependencies of@solzero/background-api, so the prune removed them. A deploy ofsolzero/platform@3.0.0then failed withCannot find package '@alchemy.run/cloudflare'fromapps/api/infra/index.ts.@alchemy.run/cloudflare2.0.0-beta.84andalchemy2.0.0-beta.84are now production dependencies ofapps/api. The pins are unchanged.nub.lockonly moves those two importer entries fromdevDependenciestodependencies.Deploy-time imports in the Alchemy stack entries, the infra modules they load, the API Worker entry, the agent-container bundle, and
apps/web/vite.config.tswere checked against the importing package. The Vite, Tailwind, and TanStack plugins, and the Worker and container packages, were already production dependencies.effectstays a devDependency of the API app because@solzero/apiand@solzero/sharedalready depend on it, and the pruned tree still resolves it.This is a patch.
.tegami/2026-11-13-deploy-published-package.mdrecords it.VERSIONand the Version Packages pull request are unchanged.Validation
nub run format— passednub run lint— passednub run typecheck— passed (also re-run by the pre-push hook)nub run config:check— passednub run test— not run. End-to-end tests need Docker, and Docker is not available in this environment.CLOUDFLARE_API_TOKENunset:CI=true nub install --frozen-lockfile— installed 814 packagesnub run build— 6 tasks successfulnub prune --prod— pruned 147 entriespackages/infra/alchemy.run.ts,alchemy.api.run.ts,alchemy.web.run.ts,apps/api/infra/index.ts, andapps/web/vite.config.tsfrom the pruned tree. The Vite config returned its three plugins.nubx vite buildinapps/webafter the prune — built successfully@alchemy.run/cloudflare,alchemy, andeffect/Effectfromapps/api/infra/index.tsafter the pruneChecklist
.tegami/release entry, or explained why this pull request usesrelease:none.nub run config:check,nub run typecheck,nub run lint,nub run format, andnub run test.THIRD_PARTY_NOTICES.mdfor new third-party code or separately licensed assets.No new third-party source was added.
nub run testdid not run because Docker is missing; the other checks in that item passed. No config example changed.