Load QuickJS lazily and cap concurrent session builds - #1840
Merged
Conversation
Deploying with
|
| Status | Name | Latest Commit | Preview URL | Updated (UTC) |
|---|---|---|---|---|
| ✅ Deployment successful! View logs |
executor-marketing | 8a08453 | Commit Preview URL Branch Preview URL |
Aug 29 2026, 07:15 AM |
Contributor
Cloudflare previewTorn down — the PR is closed. |
Deploying with
|
| Status | Name | Latest Commit | Updated (UTC) |
|---|---|---|---|
| ✅ Deployment successful! View logs |
executor-cloud | 8a08453 | Aug 29 2026, 07:15 AM |
@executor-js/cli
@executor-js/config
@executor-js/execution
@executor-js/sdk
@executor-js/codemode-core
@executor-js/runtime-quickjs
executor
@executor-js/plugin-file-secrets
@executor-js/plugin-graphql
@executor-js/plugin-keychain
@executor-js/plugin-mcp
@executor-js/plugin-onepassword
@executor-js/plugin-openapi
commit: |
A queued waiter interrupted mid-wait (client disconnect during a burst) used to leave its slot permanently unowned: the underlying promise couldn't be cancelled, so a later release would still hand it the slot with no fiber left to free it. acquireBuildSlot now returns a handle with an idempotent cancel() that dequeues an unstarted waiter or hands back an already-granted slot, wired through Effect.promise's abort signal plus an ensuring finalizer that both call the same cancel(). Also add a 10s max queue wait: a waiter that isn't granted a slot in time proceeds without one and is flagged on the span, so a stalled build degrades queued admission back to old unbounded-concurrent behavior instead of stalling everything behind it forever.
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.
Cold MCP session starts on Cloudflare currently pay the full QuickJS-WASM instantiation cost (~1.4s CPU) during init, even though QuickJS is only used for artifact smoke-rendering. This PR moves that load to the first artifact create/edit call instead, memoized per isolate, so a plain MCP session never pays for it.
It also adds a small per-isolate semaphore capping concurrent cold
buildMcpServerbuilds to 4, with FIFO queuing, so a burst of new sessions landing on one isolate no longer runs every build at once. Queued wait time is recorded on the init span when nonzero.Admission control is interruption-safe and bounded:
mcp.init.build_queue_timeout).Verified with
bun run typecheck,bun run lint, andbun run format:check(all clean on the changed files), thesession-build-semaphore.test.tsunit tests (cap, FIFO order, release-on-failure, cancel-while-queued, cancel-after-grant, queue timeout), and theartifacts.test.tsandmcp-execute.test.tse2e scenarios against thecloudtarget, which cover artifact create/edit through the smoke-render path and a basic session build.