Repository navigation
merge: integrate upstream main c07575f57 into expbkmain - #173
Merged
Merged
Conversation
Co-authored-by: Cursor Agent <cursoragent@cursor.com>
…ut of credits" (pingdotgg#10473) Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
…tgg#10620) Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Dara Adedeji <daraadedeji07@gmail.com> Co-authored-by: Dara Adedeji <76637177+SunkenInTime@users.noreply.github.com> Co-authored-by: Wout Stiens <71498452+StiensWout@users.noreply.github.com> Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com> Co-authored-by: Julius Marminge <julius0216@outlook.com> Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
…gg#10619) Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
pingdotgg#10526) Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
…onse streams (pingdotgg#11062) Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
Merges 441 upstream commits (be7796d..c07575f, pinned to nightly tag v0.0.41-nightly.20260914.1687). 168 files conflicted across 489 hunks; resolved by subsystem with the merge-upstream skill. Motivation: the fork was stranded between an upstream regression and its fix. Upstream pingdotgg#9840 (Sep 4) disabled menu accelerators on browser tabs, which killed copy/paste in the desktop integrated browser; the fork merged 7 hours later. Upstream fixed it in pingdotgg#10621 and pingdotgg#10670 (Sep 7), two days after our merge point. Both fixes land here, conflict-free. Notable resolutions: - effect 4.0.0-beta.103 -> rc.112. Ported the fork's WebSocket ping/pong resilience (missedPongs, suspend/throttle probe) onto upstream's rc.112 patch. Renamed Schema.TaggedErrorClass -> Schema.TaggedError in 22 files; rc.112 removed the old name and none of those files conflicted. - Upstream migrations 48-51 registered in the fork's 1000+ lane as 1031-1034; frozen block 33-42 verified unmoved. Test id assertions remapped. - Relocation traps repaired by hand, where git produced a clean merge that silently dropped upstream work: the outbox model (queued-message context and the retry classifier), Normalizer's attachment loop, ChatView's envLocked and onInterrupt, and rpc/client.ts's retry hooks. - Restored fork-consumed symbols upstream deleted as unused: listServerPairingLinks, useEnvironmentConnectionState. - routeTree.gen.ts regenerated with the TanStack generator; output is byte-identical to the hand-merge. - apps/mobile use-project-actions.ts deleted (upstream 5b68b2c); both fork fields survive on the replacement outbox path. Fork-marker audit: 3525 -> 3597 markers. Every per-file drop is a BEGIN/END pair collapsing to an inline marker or an upstream supersession; the only deleted file is the one above. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Thread transfer impact✅ Thread transfer remains within every enforced ceiling.
Baseline: unavailable · PR result: 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. |
actions/checkout runs `git submodule foreach` to strip credentials and died with "No url found for submodule path '.repos/alchemy-effect/.vendor/astro'", failing every job before it started. The upstream merge brought 11 new gitlinks under the vendored alchemy-effect checkout and only one was declared. URLs are copied from .repos/alchemy-effect/.gitmodules; `update = none` keeps CI from ever fetching them. Fork markers: - settings.projects.tsx used a JSDoc block, which the checker does not accept; converted to the // BEGIN/END form. - Normalizer.ts had an END whose BEGIN the merge consumed, plus a newly unmarked helper call. Both regions marked. - The effect patch's baseline entry followed its beta.103 -> rc.112 rename. Same debt, new path, entry count unchanged. - --write-baseline then dropped 7 files that are now fully marked: 166 -> 159. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…take upstream mobile version Three keep-both resolutions produced duplicate import bindings, which oxlint reports as errors: - ThreadTerminalRouteScreen.tsx imported `AppText as Text` twice - ProjectionPipeline.ts imported `effect/Schema` twice - ChatView.tsx imported `randomUUID` from ~/lib/utils on two lines SwiftLint (--strict, fork-owned .swiftlint.yml — upstream ships none) failed on `updateAccessibilityElementsIfNeeded` at complexity 16. That function does not exist upstream: it is part of the fork's ~208-line accessibility addition inside an upstream-owned file. Split its geometry-only fast path into `repositionAccessibilityElements`, which is behaviour-preserving and moves with the code if that block is later extracted to a fork-owned Swift file. Mobile version takes upstream's 1.1.1. The value lives in the fork-owned apps/mobile/app-version.ts, which app.config.ts imports in one line, so taking upstream's number costs no merge surface. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
… pass Three more symbols upstream un-exported that fork code imports — the same class of silent merge loss as listServerPairingLinks, and none of these files conflicted: - makeDayFormatter (usageAggregation.ts) -> fork per-thread usage aggregation - buildTimeClerkPublishableKey (cloud/publicConfig.ts) -> ClerkIdentityVerifier - isThreadDetailEvent: ws.ts only imports it, so the fork test now imports from orchestration/threadDetailEvent.ts, its real owner, keeping the test off a merge hot-spot rather than re-exporting from ws.ts. Also removes a duplicate threadId key in GitRunStackedActionInput (both sides added it; upstream's documented copy kept) which failed tsc with TS1117. knip: upstream widened knip:check's --exports pass from 2 workspaces to 10, newly reporting ~180 unused exports across the fork's own feature surface. The files are untouched by this merge and the fork tip simply was not checked, so this is pre-existing debt rather than merge damage. Scoped off for fork sources with a marked, greppable block and a note to remove it as the exports are tidied; files and dependencies checks are unaffected. Verified locally: both knip passes exit 0; threadUsage and decider.pullRequests suites 24/24 green. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…elds packages/client-runtime typecheck: 14 errors -> 0. - session.ts: upstream made executeAuthenticatedEnvironmentHttpRequest group-scoped. The fork's fetchOrchestrationUsers now passes group: "orchestration" and calls client.users(...) rather than client.orchestration.users(...). One change cleared all four errors there. - threadCommands.ts: upstream's attachment id is optional, so `"id" in attachment` no longer proves it is a string and the queued attachment id became string | undefined. Uses an explicit undefined check with the existing fallback id. - Test fixtures gained fields that are required but were absent: upstream's pullRequests on three thread fixtures, the fork's notifySessionSuspect on the supervisor mocks, and the fork's sentByUserId / sourceControlProfileId / ownerUserId / memberUserIds / rollingSummary / turnSummaries on upstream's new remotePerformance bench fixture. knip.jsonc: the apps/web seam is back to a single line. Reformatting upstream's one-line ignoreIssues into a multi-line object made git attribute two unrelated upstream lines to the fork, which failed the marker check; keeping the line shape identical keeps this a one-line conflict next merge. contracts, shared and client-runtime all typecheck clean; marker check passes. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
apps/mobile typecheck: 16 errors -> 0. Real drift: - movePinnedThread was generalised upstream into moveThread, which infers the pinned section from the thread; the phase sidebar's reorder now calls it. - ThreadSwipeable gained a required threadKey; the phase sidebar row passes the same environment:thread form the other thread lists use. - ThreadFeed lost the ReviewInlineComment type when upstream extracted the file-review card into its own module; re-imported from its real owner. - SegmentedControl's fork accessibility code reads props.role, which was never declared on the props type. - ReviewSheet's selectedSection is nullable on this path. codexFeedbackMessage: upstream pingdotgg#10398 replaced Codex feedback pseudo-messages with composer banners and deleted the helper. The ordering test's subject is buildThreadFeed's localMessages ordering, which still exists, so the two messages the helper built are inlined rather than dropping the coverage. Fixtures gained fields that are required but absent: durationMs on turn fixtures (upstream's server-computed duration, null while running), sentByUserId on message fixtures, and sourceControlProfileId / ownerUserId / memberUserIds on the pending-thread shell, which now carries the queued creation's chosen source-control profile. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…ture fields apps/server typecheck: 526 errors -> 34. Root cause of 483 of them: bin.ts imports server.ts for the serve command, which reaches SourceControlRepositoryService -> SourceControlProviderRegistry -> ForgejoSourceControlProvider, so the whole CLI effect requires ForgejoCli. Upstream's CLI never reaches that service, which is why its CliRuntimeLayer carries none of this and bin.ts is otherwise byte-identical to upstream. Rather than grow bin.ts with three dependency imports, the wiring lives in a new fork-owned module, sourceControl/forgejoCliRuntime.expbkt3.ts, exporting ForgejoCliSelfContainedLive. Upstream entrypoints take one import and one layer entry each. NodeServices sits in its own provide step there because merged layers build in parallel, so VcsProcess would not see its ChildProcessSpawner. Also restores isSessionCredentialInternalError, which the fork tip exported and the merge dropped when it took upstream's version of that region — the seventh symbol lost this way. Remaining fixture work: pullRequests, sentByUserId and the McpInvocationScope identity fields (principal, actorUserId) added where required. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
apps/server typecheck: 34 -> 18. Adds the fork-required fields upstream's and the fork's fixtures both lack: ownerUserId / memberUserIds on project shells, and sourceControlProfileId / ownerUserId / memberUserIds on thread shells, plus rollingSummary / turnSummaries on the read-model thread shape. Note the two shapes differ: the server's OrchestrationThreadShell has no rolling summary or turn summaries, while the decider read-model thread does. Adding them to the former is a TS2353 'unknown property' error, which is why they are applied per shape rather than uniformly. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
apps/server typecheck: 18 -> 12; both remaining source-code errors cleared. - CodexSessionRuntime: upstream added a paginated thread/turns/list path that does not set the fork's `state` on CodexThreadTurnSnapshot. Mapped the same way the non-paginated path already does. - OpenCodeAdapter: the forked-session turn mapping had no `state` either. Its messages carry no completion evidence of their own, so they are "unknown" — which is exactly the distinction that field exists to record. The readThread derivation cannot be reused there; the forked message type has no time or error fields. - Adapter tests and the web-UI registration fixture gained upstream's capabilities / clientCapabilities / clientInfo, and a projection upsert call gained the fork's sentByUserId. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The merge showed defaultThreadModelSelection as gpt-6-astra while the fork test expected gpt-5.6-sol. The fork tip carried no T3-CUSTOM marker on DEFAULT_MODEL, so that value was upstream's at the fork point rather than a deliberate pin — upstream's bump wins. The test now reads the DEFAULT_MODEL constant instead of a literal so the next bump does not fail it again. Also marks the fork-owned ForgejoCli import in bin.ts, which the marker check flagged. contracts settings suite: 140/140 green; marker check passes. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Two Test Server 1 failures, 117/117 green after. OpenCodeAdapter: upstream's new fork test crashed readThread with 'Cannot read properties of undefined (reading completed)'. Entries OpenCode returns from a forked session carry no `time`, and the fork's state derivation assumed it. Guarding it to "in-progress" would have been wrong and the test says so: a forked session's retained entries are history with no terminal proof, which is exactly "unknown". Conflating that with a turn still running is what this field exists to prevent, so the local snapshot type now carries "unknown" the same way ProviderThreadTurnSnapshot does. McpDeviceToolkit: an earlier automated pass added principal/actorUserId to an assertion's objectContaining rather than to the invocation fixture, so the test demanded those keys on tool output. Removed. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
apps/server typecheck: 12 -> 0. contracts, shared, client-runtime, mobile and
server all typecheck clean.
Two are worth noting beyond fixture fields:
- Conditional spreads (`...(cond ? { uploadFeedback } : {})` and the three-way
compaction spread) make an object literal a UNION of shapes, which
exactOptionalPropertyTypes will not assign to ProviderAdapterShape. Naming each
key once with an explicit undefined keeps it a single type; the two adapter
fields now admit `| undefined` so that is expressible.
- GitManager's fork-added merge/review/check fields did the same thing on a
spread of a mapped record, and are widened the same way.
The rest are fork-required fields absent from fixtures: sourceControlProfileId on
thread.create dispatches, ownerUserId/memberUserIds on project shells,
sentByUserId on an expected message, the fork's projection-query methods on a
stub, and the fork's activeTurnInput/durableResume on an adapter capability set.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
apps/web typecheck: 51 -> 29. Imports the merge dropped, each restored from its real owner: DEFAULT_RUNTIME_MODE, RotateCcwIcon, EnvironmentMachineIcon, resolveEnvironmentMachineKind, withoutPlanAgentSelection. Renames followed: - PendingUserInput.responseMode is upstream's derived `dismissible` flag. - ProjectFavicon now takes the project record whole rather than environmentId / cwd / projectName / projectIcon separately, so the saved title, favicon and icon override travel together. Five fork call sites updated. Two locals lost their binding in the merge: the plan-review button's bottom offset is the published overlay height held in composerTimelineInset, and the archive-reclaim section's ids come off scope, as its sibling call already does. Plus fork-required fixture fields (sentByUserId, durationMs, pullRequests and the ownership set). Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
apps/web had 29 typecheck errors left after the upstream merge: fork-required fields (sentByUserId, ownerUserId/memberUserIds, durationMs, pullRequests) missing from upstream test fixtures and new upstream code paths, plus the planModeAvailable rename in composerProviderState tests. Three test failures traced to fork behaviour that the merge had silently dropped or that upstream's tests contradict: - Rangeless plan-review comments: upstream moved <review_comment> parsing to packages/shared/composerContextLegacy.ts, which rejects a block without startIndex/endIndex. Re-port the fork's nullable range and author byline there, widen ReviewCommentContextRecord additively, and label plan chips by plan title. Covered by composerContextLegacy.expbkt3.test.ts. - sidebarAutoSettleOnMerge/AfterDays: upstream retired these client keys in favour of the server preference; the fork's PhaseGroupedSidebar and SessionManagerPage now read primaryServerSettingsAtom. - Turn settlement: the fork settles turns from execution transitions, not message completion, so the timeline row-reuse test expects the copy button to stay in streaming state until the turn event lands. Claude Fable 5.1 via Claude Code Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…mobile, server - client-runtime: the fork's retry-budget reset used Stream.tap, which re-chunks the RPC stream to single items and defeated upstream's batched shell/thread state writes; switch to Stream.mapArrayEffect so batches reach consumers intact. - server: the fork's per-project thread shell query lacked upstream's new branch_pull_request_json column and failed to decode; migration test reads the fork's remapped id (1034); snapshot fixtures drop the legacy linkedPullRequest that upstream omits without link rows; web UI MCP catalog counts follow the current RPC surface (171 tools, 24 streams); thread snapshot wire budget allows for fork shell fields. - desktop/mobile: fixtures follow the fork's frame-src, sentByUserId, and the retired client auto-settle keys. Claude Fable 5.1 via Claude Code Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Upstream's third-party license plugin now fails the web build for packages without a distributable license or notice file. Declare the fork's plan editor and webhook dependencies (@platejs/diff, khroma, slate*, jotai-x, zustand-x, standardwebhooks) in third-party-licenses.config.json. Mobile tests read MOBILE_APP_VERSION instead of a stale literal, and the spawn-card expectation drops a durationMs field the row never carried. Claude Fable 5.1 via Claude Code Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…sage bodies, persist device dismissals ProviderCommandReactor: the merge re-applied upstream's "skip stop when the projection says stopped" guard, dropping the fork's rule that a stop request always reaches the provider. Restored. Upstream's new invariant that turn start never decodes stored message bodies conflicted with the fork's title cadence (which counted user messages via the detail read) and its first-prompt naming (which re-read the conversation). The cadence now uses a fork-only countThreadUserMessages query on ProjectionSnapshotQuery, and first-prompt naming hands its prompt to the regeneration worker directly. Upstream test mocks gain the one-line stub. Right panel: the fork's persistence filter dropped thread entries with no surfaces, discarding upstream's dismissedDeviceSurfaceIds after "close all". Entries that only carry dismissals now persist. Fork-marker check exempts third-party-licenses.config.json: JSON cannot hold a marker comment, and the fork's package notices live beside upstream's. Claude Fable 5.1 via Claude Code Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
tusharbhardwaj-bk
marked this pull request as ready for review
September 15, 2026 09:31
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.
Why
The fork was stranded between an upstream regression and its fix.
Upstream #9840 (Sep 4) called
setIgnoreMenuShortcuts(true)on every integrated-browser tab. On macOS the Edit menu's roles are the only thing that makes Cmd+C/V work inside Chromium content, so that killed copy, paste, cut and select-all in the desktop browser, and right-click too. Our last upstream merge point (be7796d86) is seven hours after that regression landed. Upstream fixed it in #10621 and #10670 on Sep 7 — two days after our merge point.Both fixes land here, conflict-free. The fork was also 441 commits / 9 days behind, so this is the overdue weekly merge as well.
What
Merges
origin/mainatc07575f57, pinned to nightly tagv0.0.41-nightly.20260914.1687.168 files conflicted across 489 hunks — roughly 3x the one-week calibration in the
merge-upstreamskill. Resolved by subsystem.Things a clean merge would have silently dropped
These produced no conflict and would not have failed review by inspection:
Schema.TaggedErrorClass->Schema.TaggedError. effect rc.112 removed the old name with no alias. 52 occurrences across 22 files, none of which conflicted. Verified against.repos/effect-smol(pinned at rc.112) and itsrename-schema-error-constructorschangeset. The same changeset renames three more symbols; all three have zero uses here, and everySchema.Errorhit belongs to the unrelatedAcpSchemanamespace — a blind rename there would have corruptedpackages/effect-acp.client-runtimeand left a re-export shim. Upstream then changed the original file, so git merged the shim happily and upstream's work had nowhere to land. Ported by hand: the queued-messagecontextfield (mobile already writes it, so it was being dropped on encode) and the rewritten retry classifier.Normalizer's attachment loop,ChatView'senvLockedandonInterrupt,rpc/client.ts's retry hooks.listServerPairingLinks(+ itsDateTimeimport),useEnvironmentConnectionState.Other notable resolutions
missedPongs >= 3, the suspend/throttleresumedFromSuspendprobe) onto upstream's rc.112 patch. All 23 hunk headers machine-verified for arithmetic consistency.routeTree.gen.tswas hand-merged across 11 hunks, then regenerated with the TanStack generator — output is byte-identical.settings.projects.tsxwas an added/added conflict (both sides created the route). Combined so the experimental flag selects between the fork's panel and upstream's new page; the fork's redirect was dropped because it would have hidden upstream's page from every default build.apps/mobile/.../use-project-actions.tsdeleted (upstream5b68b2c8e). Verified zero dangling references and that both fork fields survive on the replacement outbox path.planModeAvailablepreserved over upstream's retiredplanModeEnabled, per the standing fork rule.Audit
BEGIN/ENDpair collapsing to one inline marker or a documented upstream supersession; one file deleted, as above.Deliberate behaviour changes, flagged for review
pull-requests.server.test.ts— 4-6 upstream tests dropped. They assert the inlinedispatchBootstrapTurnStartpath inws.tsthat the fork deliberately removed (dispatch lives inorchestration/dispatchCommand.ts). Keeping them would be guaranteed-red CI, not preserved coverage. Route/handler symbol diff confirms no fork route or WS handler was lost — additions only.ProviderCommandReactornow honours upstream's "start a turn without loading old message bodies" invariant. The fork's title cadence counts user messages through a fork-onlycountThreadUserMessagesquery instead of the detail read, and first-prompt naming hands its prompt straight to the regeneration worker. The first-prompt title model therefore receives the bare prompt (as upstream) rather than aUSER:-labelled context. The fork's rule that a stop request always reaches the provider, which the merge had dropped, is restored.startThreadTurnbranch only. The fork's legacyrequestThreadBootstrapbranch sendsinitialTurnwithout context records.Post-merge CI repair
CI surfaced what the merge could not: 526 server and 51 web typecheck errors (one cause, a
ForgejoClilayer leak, accounted for 483), a.gitmodulesgap that killedactions/checkout, and a set of test failures that each traced to a fork behaviour the merge had silently dropped or that upstream's new tests contradicted:<review_comment>parsing intopackages/shared/composerContextLegacy.ts, which rejected a block without a line range and rendered raw XML. The fork's nullable range and author byline are re-ported there;ReviewCommentContextRecordwidened additively; plan chips are labelled by plan title. Covered bycomposerContextLegacy.expbkt3.test.ts.sidebarAutoSettleOnMerge/AfterDaysfrom client settings in favour of the server preference; the fork'sPhaseGroupedSidebarand session manager now readprimaryServerSettingsAtom.Stream.tap, which re-chunks the RPC stream to single items;Stream.mapArrayEffectkeeps upstream's batches intact.branch_pull_request_jsoncolumn and failed to decode.MOBILE_APP_VERSIONtakes upstream's1.1.1.Verification
Local verification is limited by design: the dev box must not run repo-wide suites.
packages/shared/src/orchestrationTiming.test.tswas rewritten against the fork's execution-snapshot signature and runs green (30/30). Everything else is CI's job; the PR leaves draft only once CI is green.The copy/paste fix cannot be verified by an expbkt3 deploy. It lives in
apps/desktop(Electron main process); expbkt3 ships the server. It needs a desktop build.Model: Claude Opus 5 (1M context). Harness: Claude Code in T3 Code.
🤖 Generated with Claude Code
Need help on this PR? Tag
@codesmith-botwith what you need. Autofix is disabled.