Repository navigation
refactor(provider-cursor): follow the Effect service conventions - #17545
Conversation
The shell spawn guard and the sandbox-support warm-up lived in module state. The guard is now owned by a CursorSdk service whose layer adds the unhandledRejection listener and removes it on release; the runner and text generation reach the SDK through it. The warm-up memo is a Ref/Deferred pair owned by the runner. CursorSdkCatalogShape and CursorAgentSdkRunnerShape are inlined into their services, effect/http imports use subpaths, and the unused default adapter layer is removed. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
ApprovabilityVerdict: Not approved Macroscope's review found this PR not approvable — This refactor moves Cursor process state and its unhandled-rejection guard into a scoped Effect service, changing production layer wiring and listener lifetime. It also adds a file-level You can add or adjust custom eligibility rules. Learn more. |
Thread transfer impact✅ Thread transfer remains within every enforced ceiling.
Baseline: Scenario and decoded snapshot size10 historical turns, 5 command tools per turn, 878.9 KiB retained MCP result per historical turn, and a 1.05 MiB retained result in the measured turn.
Updated in place by a trusted workflow. PR artifacts are strictly validated and never executed. |
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
## What's Changed * fix(web): Local environment switch stays reachable after turning it off by @ScottN-PV in pingdotgg/t3code#17359 * fix(web): keep chat banners inside the lane beside the docked details card by @macodev00 in pingdotgg/t3code#17094 * fix(web): settled and snoozed lines line up with the messages above them by @RakshithBhat03 in pingdotgg/t3code#17191 * fix(web): distinguish project filter from new project by @voltcrash in pingdotgg/t3code#12113 * feat(web): assign a thread details panel shortcut by @maria-rcks in pingdotgg/t3code#16694 * fix(web): chat content keeps pace with sidebar resizing by @flamboh in pingdotgg/t3code#17383 * refactor(provider-core): expose model metadata through a ModelCatalog port by @juliusmarminge in pingdotgg/t3code#17417 * refactor(provider-core): follow the Effect service conventions throughout by @juliusmarminge in pingdotgg/t3code#17427 * refactor(provider-core): latest-version lookups go through a ProviderLatestVersions service by @juliusmarminge in pingdotgg/t3code#17434 * refactor(provider-core): MCP provider sessions live in a McpProviderSessions service by @juliusmarminge in pingdotgg/t3code#17446 * refactor(provider): bring opencode, muse, pi, core and testing in line with Effect conventions by @juliusmarminge in pingdotgg/t3code#17542 * refactor(provider-acp): ACP, ACP Registry and Grok follow the Effect service conventions by @juliusmarminge in pingdotgg/t3code#17544 * refactor(provider-cursor): follow the Effect service conventions by @juliusmarminge in pingdotgg/t3code#17545 * fix(marketing): use app wordmark in header by @voltcrash in pingdotgg/t3code#13240 * fix(web): pr merge actions stay visible while the stack refreshes by @maria-rcks in pingdotgg/t3code#17559 ## New Contributors * @voltcrash made their first contribution in pingdotgg/t3code#12113 **Full Changelog**: pingdotgg/t3code@v0.0.46-nightly.20261009.2873...v0.0.46-nightly.20261009.2886 Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.46-nightly.20261009.2886
## What's Changed * fix(web): Local environment switch stays reachable after turning it off by @ScottN-PV in pingdotgg/t3code#17359 * fix(web): keep chat banners inside the lane beside the docked details card by @macodev00 in pingdotgg/t3code#17094 * fix(web): settled and snoozed lines line up with the messages above them by @RakshithBhat03 in pingdotgg/t3code#17191 * fix(web): distinguish project filter from new project by @voltcrash in pingdotgg/t3code#12113 * feat(web): assign a thread details panel shortcut by @maria-rcks in pingdotgg/t3code#16694 * fix(web): chat content keeps pace with sidebar resizing by @flamboh in pingdotgg/t3code#17383 * refactor(provider-core): expose model metadata through a ModelCatalog port by @juliusmarminge in pingdotgg/t3code#17417 * refactor(provider-core): follow the Effect service conventions throughout by @juliusmarminge in pingdotgg/t3code#17427 * refactor(provider-core): latest-version lookups go through a ProviderLatestVersions service by @juliusmarminge in pingdotgg/t3code#17434 * refactor(provider-core): MCP provider sessions live in a McpProviderSessions service by @juliusmarminge in pingdotgg/t3code#17446 * refactor(provider): bring opencode, muse, pi, core and testing in line with Effect conventions by @juliusmarminge in pingdotgg/t3code#17542 * refactor(provider-acp): ACP, ACP Registry and Grok follow the Effect service conventions by @juliusmarminge in pingdotgg/t3code#17544 * refactor(provider-cursor): follow the Effect service conventions by @juliusmarminge in pingdotgg/t3code#17545 * fix(marketing): use app wordmark in header by @voltcrash in pingdotgg/t3code#13240 * fix(web): pr merge actions stay visible while the stack refreshes by @maria-rcks in pingdotgg/t3code#17559 ## New Contributors * @voltcrash made their first contribution in pingdotgg/t3code#12113 **Full Changelog**: pingdotgg/t3code@v0.0.46-nightly.20261009.2873...v0.0.46-nightly.20261009.2886 Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.46-nightly.20261009.2886
Part of the provider-package audit. Every module in provider-cursor should now follow
docs/internals/effect-services.md.Module state becomes service-owned
unhandledRejectionguard used to be installed globally behind a module-level flag the first timesdk.tswas imported.CursorSdkservice. Its layer adds the listener withEffect.acquireReleaseand removes it on release.AgentandcreateAgentPlatformthrough this service, so the guard is armed whenever they are in use.CursorSdk.layeronce, next to the runner layer inProviderOrchestrationAdapterInfrastructure. The guard is now armed when that layer builds instead of on first import, and there is still exactly one guard while the server runs.RefandDeferredowned by the runner. It still warms at most once, later callers wait for that attempt, and failures are ignored.Conventions
CursorSdkCatalogShapeandCursorAgentSdkRunnerShapeare inlined into their services.effect/httpmodules are imported as subpath namespaces.makeCursorAgentSdkRunneris anEffect.fnthat yieldsCursorSdk.detailno longer copiescause.message.layeris removed.Left for a follow-up:
keychainToken.tsstill memoizes the macOS keychain read in module state, and its timeout error extendsError. Its main consumer, the Promise-based Cursor usage reader inapps/server, moves into the package with the usage-reader work, so it'll be converted there.Tests: provider-cursor 102 passed. Server
ProviderInstanceRegistry8 passed. Typecheck is clean for provider-cursor and apps/server.Model: Claude Opus 5.5 via Claude Code in T3 Code.
🤖 Generated with Claude Code