Over a hundred globals were folded into one per-session and one per-process container.
What's wrong with this entry?
Over a hundred separate module-level globals were rewired into one per-session object and one per-process object, so nearly all session state is now reachable, resettable and forkable in one place. No behaviour changes on its own, but it is why dozens of internal accessors changed shape in this release.
- The session container roughly doubled, from 13 named stores to around 27: cost totals, the journal of the last API request, session flags and scratch state, model selection, prompt assembly, MCP wiring, surface capabilities, user presence, conversation latches, identity, invoked skills, scheduled session tasks, turn budget, hook registry and transcript-writer health. A stale worktree-resume refusal store was dropped.
- Each store is either shared with or forked from the parent session through the existing fork mechanism.
- The process container went from one member to eleven, covering launch options, telemetry handles, credential slots, settings source, extensions config, MCP process wiring, request latches, account credit latches, diagnostics and a model-strings cache.
- Telemetry provider shutdown moved off module globals onto fields of the passed-in state object.
conversationLatches, costLedger: e.kind === "fork" ? e.root.costLedger : new qss(),, accountCreditLatches
Strings lifted out of the shipped bundle, so the claim above can be checked against them.
Related
Other releases about the same thing. Found by shared names or similar wording; neither means one caused the other.
-
v2.1.235
Process-wide caches are now scoped per host
Both mention state
-
v2.1.235
Per-session state replaces process-wide globals, and the render root takes explicit dependencies
Both mention state
-
v2.1.235
More file-scope variables replaced by accessor-backed containers
Both mention state