Repository navigation
chore(fork): integrate upstream v0.1.7-nightly.20261104.4151 - #74
Conversation
…squash-merged (pingdotgg#29919) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…ointed parent run (pingdotgg#25662) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…ngdotgg#29721) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
pingdotgg#29580) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: maria-rcks <maria@kuuro.net>
… the project folder (pingdotgg#29908) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: Maria <maria-rcks@users.noreply.github.com>
…ngdotgg#29962) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…dotgg#29911) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…oading it (pingdotgg#29893) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…ingdotgg#29902) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…oved or steered (pingdotgg#29904) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
… it inherited (pingdotgg#29794) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…r hosts' tokens (pingdotgg#29554) Signed-off-by: Yordis Prieto <yordis.prieto@gmail.com>
… release (pingdotgg#30319) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…9916) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…pen (pingdotgg#29263) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…ed thread (pingdotgg#29643) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
… source (pingdotgg#29013) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…ingdotgg#28494) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…#28135) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…h to Privacy Mode (pingdotgg#28097) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…son from hub rows (pingdotgg#28065) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…ned-in hosts (pingdotgg#27840) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…9806) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…managed Codex (pingdotgg#30004) Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…ingdotgg#29862) Co-authored-by: Matthew Feroz <136640686+MatthewFeroz@users.noreply.github.com> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
PR discovery used the full shell snapshot, which derived activity and counted historical items across active threads. Read only PR metadata and its event sequence in one transaction, then decode after releasing the reader. Preserve settled backfill, targeted refreshes, legacy PR normalization, and guarded updates. Validation: check:changed passed with 80 tests after merging main; CI passed on 988187f. Native Electron measurements and a concurrent-write control confirmed metadata parity and coherent sequences. Synthetic measurements cover PR reads and service initialization, not full desktop startup. Model: GPT 6.1 Sol. Harness: Codex in T3 Code.
…go (pingdotgg#30071) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: maria-rcks <maria@kuuro.net>
…he runtime starts (pingdotgg#30079) Co-authored-by: wenshen <wlum0002@student.monash.edu> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…30080) Co-authored-by: Dominik <git@domko.sbs>
…otgg#30174) Co-authored-by: maria-rcks <maria@kuuro.net>
…ingdotgg#30142) Co-authored-by: SAPHID <saphid@users.noreply.github.com> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…ttle (pingdotgg#29847) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…ngs (pingdotgg#29853) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…t hooks (pingdotgg#29907) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…backports (pingdotgg#30161) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…ol (pingdotgg#30481) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…ient list (pingdotgg#30498) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
# Conflicts: # apps/desktop/src/backend/DesktopBackendManager.test.ts # apps/mobile/app.config.ts # apps/mobile/src/App.tsx # apps/mobile/src/features/settings/SettingsMicrophoneRouteScreen.tsx # apps/mobile/src/lib/appLinking.ts # apps/server/src/cli/server.ts # apps/server/src/git/GitManager.ts # apps/server/src/mcp/OrchestratorMcpService.ts # apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.ts # apps/server/src/orchestration-v2/FoundationPersistence.test.ts # apps/server/src/orchestration-v2/ProjectionMaintenance.ts # apps/server/src/orchestration-v2/ThreadLaunchService.ts # apps/server/src/persistence/DatabaseMaintenance.ts # apps/server/src/preview/ServerBrowser.ts # apps/server/src/project/ManagedProjectFolders.test.ts # apps/server/src/provider/Drivers/ClaudeSkills.ts # apps/server/src/server.ts # apps/server/src/serverSettings.test.ts # apps/server/src/storageCleanup.ts # apps/server/src/usage/cliproxyApi.ts # apps/server/src/vcs/GitVcsDriver.ts # apps/server/src/ws.ts # apps/web/src/components/settings/ConnectionsSettings.tsx # apps/web/src/routeTree.gen.ts # evals/mcp-tool-use/README.md # packages/shared/src/managedPolicyFile.test.ts # packages/shared/src/managedPolicyFile.ts # packages/shared/src/usageLimits.ts
… (Checking that every fork seam survived) Failing check: Checking that every fork seam survived The seam check now passes (`check_seams` exits 0). Both failures came from upstream rewriting the code around a seam until the seam had nothing left to do. **`apps/server/src/preview/ServerBrowser.ts` (`browser-timeout-recovery`, 31 of 34 lines).** Upstream pingdotgg#29865 and pingdotgg#29885 split `createTab` in two. A new wrapper calls `setUpTab(snapshot, opened)`, and if setup fails it closes everything recorded in `opened`, including `desktop.close`. The fork had its own try/catch here that called `desktop?.close()` when setup failed, so the native endpoint was released. The three missing marker lines belonged to that try/catch: its opening comment, the catch-block comment, and the "`return tab` moved inside the try block" note. Upstream now does the same thing, so I dropped those three lines. The other 31 recovery lines (retained context reuse, `recoveryPages` handling, restoring the recovered URL, `recordingTimeout`) all came through intact. **`apps/server/src/persistence/DatabaseMaintenance.ts` (`brand`, 2 of 3 lines).** Upstream pingdotgg#29806 deleted `DatabaseProjectionsInvalidError`, along with its "Start T3 Code once so it rebuilds them…" message. Compaction now just calls `pruneEventStore()` with no verify step. Since the text is gone, its rebranded seam goes with it. The other two `fork: brand` lines are still there. The only file I changed is `docs/fork/seams.tsv`: the `ServerBrowser.ts` row went from 34 to 31 and the `DatabaseMaintenance.ts` row from 3 to 2. No source files changed, and no other doc mentions these lines.
… (Checking for new T3 Code product text) Failing check: Checking for new T3 Code product text I fixed the failing check, "Checking for new T3 Code product text". The brand check and seam check now pass, and lint and the format check are clean on the edited files. The tests for `managedPolicyFile`, `policyTemplates` and `DesktopStartupRecovery` pass: 16 passed, 1 skipped. The skipped test is the Windows-only one. **What failed and why:** Upstream added new admin- and user-facing "T3 Code" text in five files: - the managed-policy startup message in `DesktopStartupRecovery.ts` (pingdotgg#30319); - the "Windows is already using every port" error in the new `cli/automaticPort.ts` (pingdotgg#22962); - the Group Policy and macOS profile display text in the new `policy/policyTemplates.ts` (pingdotgg#29862); - the registry-reader errors in `packages/shared/src/managedPolicyFile.ts` (pingdotgg#29862); - the "It opens in T3 Code" description in `HostedPromptLinkLanding.tsx` (pingdotgg#26290). None of these are identifiers, so they were reworded rather than allowlisted. **What I changed:** - Each of those lines now says Loom and carries a `fork: brand` marker. - The two lines inside the ADML XML template take `<!-- fork: brand -->`, the same way `DesktopStartupRecovery.ts` marks its HTML template. That comment is now part of the generated ADML file. - One reworded help text told admins to run `"t3 policy check"`. Since I was already editing that line, I changed it to `loom policy check`, Loom's primary command. - Identifiers stay as they were: the ADMX ids `T3Code`/`SUPPORTED_T3Code`, the `t3code` namespace, `com.t3tools.t3code` payload types and the registry key. The template line that mentions T3 Connect is left for the Loom-owned Connections work. - `managedPolicyFile.test.ts` checks four of the error strings by substring, so I updated those four to the Loom wording and marked them `fork: brand`. The assertions are unchanged otherwise. - In `docs/fork/seams.tsv`, I raised the brand counts for `DesktopStartupRecovery.ts` (8→9), `HostedPromptLinkLanding.tsx` (1→2), `managedPolicyFile.ts` (2→6) and `managedPolicyFile.test.ts` (1→5). I added rows for `apps/server/src/cli/automaticPort.ts` (1) and `apps/server/src/policy/policyTemplates.ts` (12).
… (Checking code formatting) Failing check: Checking code formatting The formatting check failed on a single file, `apps/server/src/storageCleanup.ts`, in `threadIdle`. The problem was in the fork's `project-lifecycle` seam, not in upstream's code. Upstream's `threadIdle` spells out its idle conditions inline, ending with `!heldForLimitRecovery(...)`. The fork's seam replaces those conditions with the shared `threadWorkspaceIdle(thread, now)` call. In Loom before the merge, the same expression also started with `thread.worktreePath !== null &&`, so it was long enough to wrap across three lines. Upstream's change in pingdotgg#30026 moved that worktree-path check out into the caller. With it gone, the merged seam expression was left wrapped over two lines even though it fits on one, and the formatter flagged it. I joined the seam line onto one line (`threadWorkspaceIdle(thread, now) && !heldForLimitRecovery(thread, now, settings)`). The `fork: project-lifecycle` marker comment stays where it was, so the seam's marker count in `docs/fork/seams.tsv` hasn't changed. Nothing else was touched. Rerunning `vp fmt --check` on the file now passes, and `check_seams` exits 0.
… (Linting upstream files the fork edits) Failing check: Linting upstream files the fork edits The failing check was "Linting upstream files the fork edits". oxlint reported `Identifier 'ThreadId' has already been declared` at `apps/server/src/storageCleanup.ts:20`. The cause is a doubled import. Before the merge, Loom added `ThreadId` to the `@t3tools/contracts` type import with the line `ThreadId, // fork: project-lifecycle`. Upstream's v0.1.7-nightly.20261104.4151 now adds `ThreadId` to that same import itself, so after the merge the name was imported twice. Upstream now does what that seam line did, so I dropped the fork's `ThreadId, // fork: project-lifecycle` line and kept upstream's. I left the `project-lifecycle` row for `storageCleanup.ts` in `docs/fork/seams.tsv` alone. It sets a minimum of 102 marked lines, and the file still has exactly 102 after the removal. `pnpm exec vp lint apps/server/src/storageCleanup.ts` and `check_seams` both pass now.
… (Typechecking apps/server) Failing check: Typechecking apps/server I fixed the failing "Typechecking apps/server" check by updating three fork-owned tests to upstream's new APIs. The server typecheck now exits 0, the three test files pass (6, 23 and 4 tests), and lint, format and `check_seams` pass on the changed files. **What failed and why.** Three upstream changes broke the fork's tests. A fourth error, the doubled `ThreadId` import in `storageCleanup.ts`, was already fixed by an earlier repair commit. - **Projection maintenance (pingdotgg#29806).** Upstream replaced `compactEventStore` with `pruneEventStore`. That method only prunes events the projections already cover, and only after they are a day old. Upstream also moved `verify`/`rebuild` out of `ProjectionMaintenanceV2` into a test-only helper, `orchestration-v2/testkit/ProjectionReplay.ts`, which keeps the same signatures. The merge had already carried the `server-weight` seam (untraced pages, scan counts, span attributes) onto `pruneEventStore`. Only the tests still called the old methods. - **MCP thread links (pingdotgg#26290).** Upstream renamed `McpClientCaller.webOrigin` to `hostedAppUrl`, and thread links for outside MCP clients now use the hosted `/threads/<env>/<thread>` format from `hostedThreadLink`. **What I changed.** I touched only seam lines and fork files: - **`apps/server/src/persistence/DatabaseStorage.test.ts`**: I rewrote the `fork: server-weight` test against `pruneEventStore`. It seeds 120 events and marks them as covered by the projections. A first pass records the prune mark, the clock moves forward a day, and the second pass is traced. The test still asserts one span with the same counts (120 scanned, 119 deleted) and no traced per-page queries. I updated the per-page query pattern from `DESC` to upstream's `ASC` order, and the layer now needs only SQLite. The four markers stay, so the seams.tsv row is unchanged. - **`apps/server/src/fork/deleted-history/DeletedThreadHistory.test.ts`**: it now gets `verify`/`rebuild` from upstream's `ProjectionReplay`. All assertions are unchanged. - **`apps/server/src/fork/bots/mcp.test.ts`**: it passes `hostedAppUrl`. The expected link is now built with `hostedThreadLink`, and the test still checks that the link names the machine the bot ran on (`remote-worker`). No seams were dropped and no seams.tsv rows changed. Nothing else is left for this check.
… (Running the fork's tests in apps/mobile) Failing check: Running the fork's tests in apps/mobile The failing check was "Running the fork's tests in apps/mobile". Four cases in `apps/mobile/app.config.test.ts` failed, all named "keeps the iOS and Android identifiers…". The test errored at line 42 because the app config's iOS `associatedDomains` was `undefined`. **Why:** Upstream pingdotgg#29815 (b183048) makes copied thread links open the mobile app. It adds `applinks:app.t3.codes` to the iOS associated domains and serves an apple-app-site-association file on app.t3.codes. That file lists only upstream's Apple team and bundle IDs (`ARK85ZXQ4Z.com.t3tools.t3code*`). Loom's `mobile-identity` seam replaces the iOS identity: it uses Loom's own bundle IDs and team, and only claims associated domains for Loom's own auth domain when Connect is set up. So the upstream line adding `applinks:app.t3.codes` was rightly not carried into the fork's `associatedDomains`. Loom's iOS app can never appear in app.t3.codes's file, so the claim would do nothing. Upstream's new test assertions assume upstream's iOS identity. Android keeps upstream's package name under the seam, so upstream's Android intent-filter and assetlinks assertions still hold, and they pass unchanged. **What I changed:** In `apps/mobile/app.config.test.ts`, I carried the `mobile-identity` seam onto upstream's two iOS assertions, marked `fork: mobile-identity`: - Loom's iOS config does not claim `applinks:app.t3.codes`. - The hosted apple-app-site-association file still lists upstream's team plus each variant's upstream identifier, so that part of upstream's consistency check is kept. I raised that file's row in `docs/fork/seams.tsv` from 1 to 3 marked lines. The test file now passes (6/6), and lint, format and `check_seams` are clean. I changed no upstream code. One thing for another session: upstream's new `expo-image-picker` microphone permission string in `apps/mobile/app.config.ts` still says "Allow T3 Code…". It belongs to the brand-copy check, not this one, so I left it alone.
… (Running the fork's tests in apps/server) Failing check: Running the fork's tests in apps/server I'm rerunning all 251 server test files from the failing log, plus the seam check, to confirm the fix. I'll report once they finish. The full `apps/server` fork-test run is going in the background. I'll write the final summary when it finishes. The "Running the fork's tests in apps/server" check passes now. The full rerun exited 0: every batch passed, with a few files skipped. The seam check, an `apps/server` typecheck and lint on the changed files also pass. **What failed and why.** Most of the failures came from a duplicate `ThreadId` import in `storageCleanup.ts`, which an earlier session had already fixed. That parse error had been hiding four other problems: - **`cli/up.test.ts`:** upstream's new test expects the pairing hint `t3 pair --base-dir …`, but the fork's CLI prints `loom pair`. I changed the expected text and marked it `fork: brand`. - **`storageCleanup.test.ts`:** upstream's "pinned-child" case expects the reason "Not settled". The fork's `project-lifecycle` seam keeps any pinned worktree before upstream's settlement logic runs, so the real reason is "Thread is pinned". I added a seam branch for that case; the fork's behaviour itself is unchanged. - **`ProviderTurnStartService.test.ts`:** three tests failed because the harness's `ProjectLifecycleService` mock had no `shellEnvironment`, which the setup runner calls. I added a one-line stub (`fork: project-lifecycle`). - **`ProviderInstanceRegistry.test.ts`:** 13 tests failed because of an import cycle. `ClaudeAdapterV2` imported the fork's `ClaudeWorktreeService.ts`, which goes through git, project setup, lifecycle, settlement, storage cleanup and the terminal manager back to the adapter infrastructure. That left `ClaudeAdapterV2.layerQueryRunner` undefined when the infrastructure layer was built. The last two also fail on `origin/main`, so the merge didn't cause them. They come from the fork's Nov 3 `fix(worktrees)` commits, but they still fail this check, so I fixed them. **What I changed for the cycle.** I moved the `ClaudeWorktreeService` tag, its error, the owner type and the receipt schema into a new fork-owned file, `provider/ClaudeWorktreeServiceTag.ts`. `ClaudeWorktreeService.ts` keeps the implementation and `layer`, so `server.ts` is untouched. `ClaudeAdapterV2`'s import now points at the tag file and is marked `fork: project-lifecycle`. The other fork importers point there too: `ForkRuntime`, `claudeWorktreeHooks` and the service's test. An Effect lint rule required the tag's key to follow the new file name, so it is now `t3/provider/ClaudeWorktreeServiceTag/ClaudeWorktreeService`. **Seam bookkeeping.** In `docs/fork/seams.tsv` I added rows for `up.test.ts` (`brand` 1) and for `ClaudeAdapterV2.ts` (`project-lifecycle` 1). I also raised the `project-lifecycle` counts for `storageCleanup.test.ts` to 34 and `ProviderTurnStartService.test.ts` to 33. FORK.md's packet-seam table has a matching `ClaudeAdapterV2` row.
|
Review of the unattended resolution: pass. Merging upstream v0.1.7-nightly.20261104.4151 conflicted in 28 files; one Claude session took each.
No findings survived checking, so this merge can go into main without a person. I read all of Conflict resolutions
Repair commits
One harmless side effect: the Windows policy template output ( VERDICT: pass |
Merges upstream T3 Code v0.1.7-nightly.20261104.4151 into Loom. The seams in
docs/fork/seams.tsvsurvived, the fork's tests and upstream's tests beside the files it changes pass, every package typechecks, and the built web client boots.Land it from Terminal on your Mac (not inside Loom, which the install quits) with
scripts/fork/loom.sh land: it merges with a merge commit, tagsloom-v0.1.7-nightly.20261104.4151, publishes the next Loom release and installs it. Never squash or rebase this pull request; the fork needs upstream's history for the next merge.