feat: add codex support#5
Merged
Merged
Conversation
There was a problem hiding this comment.
Pull request overview
This PR adds multi-runtime agent support to RxCode, introducing Codex sessions alongside existing Claude Code sessions, plus related UI/UX updates (model picking, rate limits, onboarding, and summarization).
Changes:
- Add Codex app-server integration (spawn/stream JSON-RPC over stdio) and persist session metadata for provider/origin.
- Update UI to support per-session agent provider + provider-scoped models, runtime installation status, and provider-specific rate limits.
- Add optional OpenAI-compatible summarization service and new tests for Codex file-change extraction + tool-result retention.
Reviewed changes
Copilot reviewed 35 out of 35 changed files in this pull request and generated 3 comments.
Show a summary per file
| File | Description |
|---|---|
| RxCode/Views/Sidebar/ProjectTreeView.swift | Limits visible threads per project with a “show more” toggle and reworks chat row creation. |
| RxCode/Views/Sidebar/ProjectChatRow.swift | Adds streaming progress indicator + compact time formatting and todo progress display while streaming. |
| RxCode/Views/Sidebar/HistoryListView.swift | Switches to compact elapsed-time formatting for history timestamps. |
| RxCode/Views/SettingsView.swift | Adds onboarding re-launch, agent runtime status section, provider-scoped model picker, and summarization settings. |
| RxCode/Views/Permission/PermissionQueueBanner.swift | Improves banner labeling for mixed permission requests vs questions. |
| RxCode/Views/Onboarding/OnboardingView.swift | Expands onboarding CLI check to cover Claude Code + Codex and wires completion callback. |
| RxCode/Views/MainView.swift | Adjusts toolbar title handling and updates model picker to support provider + model pairs. |
| RxCode/Services/RateLimitService.swift | Deduplicates concurrent rate-limit fetches with an in-flight task cache. |
| RxCode/Services/PersistenceService.swift | Persists agent provider in session metadata and supports Codex-origin sessions in legacy paths. |
| RxCode/Services/PermissionServer.swift | Adds a generic decision request API for non-Claude transports (e.g., Codex JSON-RPC). |
| RxCode/Services/OpenAISummarizationService.swift | New service for OpenAI-compatible model listing + title generation. |
| RxCode/Services/CodexAppServer.swift | New Codex app-server runtime implementation (model discovery, streaming turns, permissions bridging, rate limits). |
| RxCode/Services/ClaudeService.swift | Renames actor to ClaudeCodeServer, adds model parameter for title generation, and keeps a compatibility typealias. |
| RxCode/App/RxCodeApp.swift | Updates menu bar UI to be provider-aware and show provider-specific usage/status. |
| RxCode/App/AppState.swift | Adds agent-provider plumbing throughout session lifecycle, provider-scoped rate limits, Codex installation/model discovery, and summarization routing. |
| README.md | Updates product description and requirements to include Codex support. |
| Packages/Tests/RxCodeCoreTests/ToolCallFileChangeTests.swift | Adds tests for Codex fileChange diff extraction and hunk synthesis. |
| Packages/Tests/RxCodeCoreTests/ChatMessageToolResultTests.swift | Adds tests ensuring empty tool results are retained/cleaned up correctly. |
| Packages/Tests/RxCodeCoreTests/AgentModelTests.swift | Adds tests for AgentModel coding and ChatSession provider defaulting/round-tripping. |
| Packages/Sources/RxCodeCore/WindowState.swift | Adds per-session agent provider override in window state. |
| Packages/Sources/RxCodeCore/Models/SessionOrigin.swift | Introduces codexAppServer origin. |
| Packages/Sources/RxCodeCore/Models/RateLimitUsage.swift | Extends rate limit model to include optional 24h usage/reset fields. |
| Packages/Sources/RxCodeCore/Models/ChatThread.swift | Persists provider/origin in thread summaries and round-trips into ChatSession.Summary. |
| Packages/Sources/RxCodeCore/Models/ChatSession.swift | Adds agentProvider to sessions + summaries with backwards-compatible decoding default. |
| Packages/Sources/RxCodeCore/Models/ChatMessage.swift | Refines tool-call retention rules and adds Codex fileChange diff extraction helpers. |
| Packages/Sources/RxCodeCore/Models/AgentModel.swift | New AgentProvider/AgentModel types to unify provider+model identity. |
| Packages/Sources/RxCodeCore/CLISession/SessionMetaStore.swift | Adds agent provider into persisted session meta sidecar. |
| Packages/Sources/RxCodeCore/CLISession/CLISessionStore.swift | Loads agent provider from meta into session summaries. |
| Packages/Sources/RxCodeChatKit/ToolResultView.swift | Renders Codex fileChange unified diffs and uses generalized edited file path accessor. |
| Packages/Sources/RxCodeChatKit/StatusLineView.swift | Adds provider picker and provider-specific usage segments (5h/7d vs 5h/24h). |
| Packages/Sources/RxCodeChatKit/MessageListView.swift | Adjusts streaming indicator to be provider-aware (“thinking” vs “reasoning”). |
| Packages/Sources/RxCodeChatKit/MessageBubble.swift | Reworks assistant block rendering to group transient tools inline and updates cursor rendering path. |
| Packages/Sources/RxCodeChatKit/MarkdownView.swift | Switches attributed markdown rendering to an AppKit text view for inline code background + trailing cursor. |
| Packages/Sources/RxCodeChatKit/ChatBridge.swift | Plumbs agent provider into bridge state and makes rate-limit fetching provider-aware. |
| Packages/Sources/RxCodeChatKit/BubbleStyle.swift | Tweaks user-bubble padding. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| agentText: agentText, | ||
| fiveHourText: fiveHour.map { "\(formatPercent($0))%" } ?? "—%", | ||
| jobsText: inProgress > 0 ? "\(inProgress) Job\(inProgress == 1 ? "" : "s")" : nil | ||
| statusText: inProgress > 0 ? "\(inProgress)job\(inProgress == 1 ? "" : "s")" : "IDLE" |
Comment on lines
41
to
+52
| Image(systemName: "terminal") | ||
| .font(.system(size: ClaudeTheme.size(48))) | ||
| .foregroundStyle(ClaudeTheme.accent) | ||
|
|
||
| Text("Claude CLI Installation Check") | ||
| .font(.title2) | ||
| .fontWeight(.semibold) | ||
| .foregroundStyle(ClaudeTheme.textPrimary) | ||
|
|
||
| if isCheckingCLI { | ||
| ProgressView("Checking...") | ||
| } else if cliInstalled { | ||
| Label("Installed — \(cliVersion ?? "")", systemImage: "checkmark.circle.fill") | ||
| .foregroundStyle(ClaudeTheme.statusSuccess) | ||
| .font(.body) | ||
| } else { | ||
| VStack(spacing: 12) { | ||
| Label("Claude CLI not found", systemImage: "xmark.circle.fill") | ||
| .foregroundStyle(ClaudeTheme.statusError) | ||
| .font(.body) | ||
|
|
||
| if let error = cliError { | ||
| Text(error) | ||
| .font(.caption) | ||
| .foregroundStyle(ClaudeTheme.textSecondary) | ||
| } | ||
| } |
Comment on lines
+441
to
+445
| .contentShape(Rectangle()) | ||
| } | ||
| .buttonStyle(.plain) | ||
| .help(showsAllThreads ? "Show only the first five threads" : "Show all threads in this project") | ||
| } |
Contributor
Author
|
🎉 This PR is included in version 1.1.0 🎉 The release is available on GitHub release Your semantic-release bot 📦🚀 |
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.
No description provided.