feat(codex): sync persisted threads into T3 - #5741
Conversation
|
Important Review skippedAuto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the ⚙️ Run configurationConfiguration used: Repository UI Review profile: CHILL Plan: Pro Plus Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
One error-modeling note on the new listThreads wrapper in CodexAdapter.ts. Everything else (namespace subpath imports, env-based dependency acquisition in makeCodexAppServerConnection and ProviderThreadDiscoveryLive, no ManagedRuntime/runPromise/fake Layer.succeed seams, layer wiring in server.ts) matches the conventions.
Posted via Macroscope — Effect Service Conventions
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 18e0e5a32c
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
ApprovabilityVerdict: Needs human review This PR introduces a significant new feature (automatic Codex thread discovery and import) with background processing, external process spawning, and orchestration integration. New features with this scope warrant human review. You can customize Macroscope's approvability policy. Learn more. |
18e0e5a to
c72b57d
Compare
|
Corrected all mentioned things above. Its really useful feature, as some of users are working with T3 Code and sometimes with Codex, the threads aren't shared. Now it makes it fully synced with codex threads, and update in background live new threads so it becomes fully synced all time. A lot of people still use both, and this improves the UX of T3 Code. |
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes using high effort and found 2 potential issues.
❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.
Reviewed by Cursor Bugbot for commit 9bf0a9f. Configure here.
| metadata: nextMetadata, | ||
| }), | ||
| }; | ||
| yield* input.upsertBinding(nextBinding); |
There was a problem hiding this comment.
Refresh clobbers worktree cwd
High Severity
Metadata refresh always upserts runtimePayload with cwd from the Codex catalog. After an imported thread's New worktree follow-up, ProviderService persists the worktree path, but the next discovery pass (Codex updatedAt advances) shallow-merges catalog cwd back over it. Later recoverSession / persisted-cwd resume can restart outside the worktree even though thread.worktreePath is set.
Additional Locations (1)
Reviewed by Cursor Bugbot for commit 9bf0a9f. Configure here.
| // The synchronizer keeps the first binding for a provider thread. | ||
| // Prefer the live adapter view so a persisted stopped binding cannot | ||
| // mask a follow-up that became active while discovery was running. | ||
| bindings: [...activeBindings, ...persistedBindings], |
There was a problem hiding this comment.
Live bindings hide import metadata
Medium Severity
Active adapter bindings are preferred but omit runtimePayload, so readImportMetadata returns nothing and the synchronizer treats a running imported thread as a T3-native link and skips refresh. Title and recency sync are stalled for the whole live session even though a persisted import binding with metadata is available right behind it.
Additional Locations (1)
Reviewed by Cursor Bugbot for commit 9bf0a9f. Configure here.
|
Note 🤖 GPT-5.6 Sol responding on behalf of Theo Closing this PR after an automated pass over open pull requests. Adds a broad thread-import or state-transfer system that overlaps trusted work in #5499. |


Problem
T3 projects only threads created inside T3, so persisted conversations created by Codex do not appear in the T3 thread list even though Codex can enumerate and resume them.
Solution
thread/listAPI.CODEX_HOMEhandling cannot drift.Only lightweight catalog metadata and continuation bindings are imported. Existing Codex messages are not copied or modified.
Relates to #207.
Reliability
ServerActivation, so standby/trial servers cannot mutate the shared T3 home.Relationship to #5146
#5146 provides an explicit project-scoped snapshot import using
thread/listandthread/read. This PR provides automatic ongoing catalog synchronization across configured Codex homes, with direct continuation of the native thread and no history snapshot.Validation
Rebased onto current
mainat0d38866dc.pnpm exec vp check— 2,515 files formatted; 2,390 files linted with no warnings or errors.pnpm exec vp run typecheck— all 15 targets passed.decider.titleRegeneration.test.tsCodexAppServerConnection.test.tsProviderThreadDiscovery.test.tsCodexSessionRuntime.test.tsCodexAdapter.test.tsserverActivation.test.tsChatView.logic.test.tsImplemented with Codex (GPT-5) through T3 Code.
Note
Medium Risk
Background discovery periodically spawns Codex processes and dispatches orchestration commands, but serialization, idempotent IDs, expectedTitle guards, and binding precedence reduce duplicate or destructive updates.
Overview
Adds automatic discovery and import of persisted Codex conversations into T3’s thread list, with ongoing reconciliation in the background.
Server / Codex: Optional
listThreadson provider adapters; Codex lists non-ephemeral threads via app-serverthread/list(paginated, de-duplicated). SharedmakeCodexAppServerConnectionreplaces duplicated spawn/setup in session runtime. NewProviderThreadDiscoverylayer runs on boot, every ~30s, and on provider instance changes—creating projects/threads and resume bindings for unlinked threads, refreshing metadata when CodexupdatedAtmoves, and skipping T3-native mappings, local deletes, and duplicate catalogs perCODEX_HOME.Orchestration:
thread.meta.updategainsexpectedTitleso provider-driven title refreshes do not overwrite titles the user changed after discovery sampled state (same pattern asexpectedBranch).Web: Send flow treats threads with a stopped imported session (no local messages) as already started—follow-ups resume instead of re-bootstrap/title seed. Worktree creation uses
shouldPrepareWorktreeForSend(worktree mode + no path yet), not “first message only.”Docs note that message history is not copied into T3.
Reviewed by Cursor Bugbot for commit 9bf0a9f. Bugbot is set up for automated code reviews on this repo. Configure here.
Note
Sync persisted Codex threads into T3 as importable projects
ProviderThreadDiscoveryLivein ProviderThreadDiscovery.ts that runs every 30s and on instance changes, importing non-ephemeral Codex threads as T3 projects with durable resume bindings.listThreadsto the Codex adapter, backed by a paginatedlistAllCodexThreadsutility that de-duplicates across pages and stops safely on cursor repetition.thread.meta.updatewith anexpectedTitlefield for optimistic concurrency — title updates are skipped if the current title has diverged.ChatViewsend logic to treat imported threads as already-started, skipping re-bootstrap and only gating worktree preparation when needed.Macroscope summarized 9bf0a9f.