From cbfc1223ffe479b0416baff904aec409a10489aa Mon Sep 17 00:00:00 2001 From: Kazuki Nakashima <65545348+lynnswap@users.noreply.github.com> Date: Tue, 7 Jul 2026 15:47:21 +0900 Subject: [PATCH 1/3] fix(review-ui): adopt CodexKit Foundation fetch API --- Package.swift | 2 +- .../ReviewMonitorSidebarViewController.swift | 4 +++- ...ewMonitorCodexSelectionTitleResolverTests.swift | 14 ++++++++++++-- .../ReviewMonitorCodexSidebarResultsTests.swift | 2 ++ 4 files changed, 18 insertions(+), 4 deletions(-) diff --git a/Package.swift b/Package.swift index 7b8d72c1..eecb848a 100644 --- a/Package.swift +++ b/Package.swift @@ -8,7 +8,7 @@ let packageDirectory = URL(fileURLWithPath: #filePath) let localCodexKitPath = packageDirectory .appendingPathComponent("dependencies/CodexKit", isDirectory: true) .path -let codexKitFallbackRevision = "58c2dab605c3dad806e0ac90c6d3d1f67c5fd36d" +let codexKitFallbackRevision = "3f6216c01c91bf14737e6fe40c30efef7a5bbd04" let codexKitDependency: Package.Dependency = FileManager.default.fileExists(atPath: "\(localCodexKitPath)/Package.swift") ? .package(path: localCodexKitPath) diff --git a/Sources/ReviewUI/Sidebar/CodexChats/ReviewMonitorSidebarViewController.swift b/Sources/ReviewUI/Sidebar/CodexChats/ReviewMonitorSidebarViewController.swift index 68b2c1e3..7eed4e40 100644 --- a/Sources/ReviewUI/Sidebar/CodexChats/ReviewMonitorSidebarViewController.swift +++ b/Sources/ReviewUI/Sidebar/CodexChats/ReviewMonitorSidebarViewController.swift @@ -1,5 +1,6 @@ import AppKit import CodexKit +import Foundation import ObservationBridge import CodexReviewKit import SwiftUI @@ -276,7 +277,8 @@ final class ReviewMonitorSidebarViewController: NSViewController, NSOutlineViewD static var defaultCodexSidebarDescriptor: CodexFetchDescriptor { CodexFetchDescriptor( - sortBy: [CodexSortDescriptor(\.recencyAt, order: .reverse)] + predicate: #Predicate { $0.isArchived == false }, + sortBy: [SortDescriptor(\.recencyAt, order: .reverse)] ) } diff --git a/Tests/ReviewUITests/ReviewMonitorCodexSelectionTitleResolverTests.swift b/Tests/ReviewUITests/ReviewMonitorCodexSelectionTitleResolverTests.swift index a8dcc416..456aeae4 100644 --- a/Tests/ReviewUITests/ReviewMonitorCodexSelectionTitleResolverTests.swift +++ b/Tests/ReviewUITests/ReviewMonitorCodexSelectionTitleResolverTests.swift @@ -22,12 +22,14 @@ struct ReviewMonitorCodexSelectionTitleResolverTests { id: appThreadID, workspace: app, name: "App review", + sourceKind: .subAgentReview, updatedAt: Date(timeIntervalSince1970: 3_000) ), .init( id: "thread-tools", workspace: tools, name: "Tools review", + sourceKind: .subAgentReview, updatedAt: Date(timeIntervalSince1970: 2_000) ), ] @@ -66,6 +68,7 @@ struct ReviewMonitorCodexSelectionTitleResolverTests { id: "thread-repo", workspace: repo, name: "Repo review", + sourceKind: .subAgentReview, updatedAt: Date(timeIntervalSince1970: 1_000) ) ] @@ -98,6 +101,7 @@ struct ReviewMonitorCodexSelectionTitleResolverTests { id: floatingThreadID, name: "Floating review", preview: "Uncategorized preview", + sourceKind: .subAgentReview, updatedAt: Date(timeIntervalSince1970: 1_000) ) ] @@ -137,14 +141,20 @@ struct ReviewMonitorCodexSelectionTitleResolverTests { private func loadReviewChats(in context: CodexModelContext) async throws { let results = context.fetchedResults( for: CodexFetchDescriptor( - predicate: .init(sourceKinds: [.subAgentReview]), - sortBy: [CodexSortDescriptor(\.updatedAt, order: .reverse)] + predicate: sourceKindChatPredicate([.subAgentReview]), + sortBy: [SortDescriptor(\.updatedAt, order: .reverse)] ), sectionedBy: .workspaceGroup ) try await results.performFetch() } +private func sourceKindChatPredicate(_ sourceKinds: [CodexThreadSourceKind]) -> Predicate { + #Predicate { chat in + chat.sourceKind != nil && sourceKinds.contains(chat.sourceKind!) + } +} + private func workspaceID(for url: URL) -> CodexWorkspaceID { CodexWorkspaceID(rawValue: url.standardizedFileURL.resolvingSymlinksInPath().path) } diff --git a/Tests/ReviewUITests/ReviewMonitorCodexSidebarResultsTests.swift b/Tests/ReviewUITests/ReviewMonitorCodexSidebarResultsTests.swift index c227e5df..4c1ec232 100644 --- a/Tests/ReviewUITests/ReviewMonitorCodexSidebarResultsTests.swift +++ b/Tests/ReviewUITests/ReviewMonitorCodexSidebarResultsTests.swift @@ -164,6 +164,7 @@ struct ReviewMonitorCodexSidebarResultsTests { let request = try #require(await runtime.transport.recordedRequests(method: "thread/list").first) let params = try request.decodeParams(ThreadListParams.self) + #expect(params.archived == false) #expect(params.sourceKinds == nil) } @@ -1110,6 +1111,7 @@ struct ReviewMonitorCodexSidebarResultsTests { } private struct ThreadListParams: Decodable { + var archived: Bool? var sourceKinds: [String]? } From 1599154019a1b0ecfadcea5a3a90043272b38964 Mon Sep 17 00:00:00 2001 From: Kazuki Nakashima <65545348+lynnswap@users.noreply.github.com> Date: Tue, 7 Jul 2026 16:06:15 +0900 Subject: [PATCH 2/3] fix(review-monitor): pin CodexKit workspace lock --- .../project.xcworkspace/xcshareddata/swiftpm/Package.resolved | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tools/ReviewMonitor/CodexReviewMonitor.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/Tools/ReviewMonitor/CodexReviewMonitor.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved index fdf4de33..de72f79e 100644 --- a/Tools/ReviewMonitor/CodexReviewMonitor.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/Tools/ReviewMonitor/CodexReviewMonitor.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -6,7 +6,7 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/lynnswap/CodexKit.git", "state" : { - "revision" : "58c2dab605c3dad806e0ac90c6d3d1f67c5fd36d" + "revision" : "3f6216c01c91bf14737e6fe40c30efef7a5bbd04" } }, { From a435fd1f0c5929f223236305db2d84e83638ec01 Mon Sep 17 00:00:00 2001 From: Kazuki Nakashima <65545348+lynnswap@users.noreply.github.com> Date: Tue, 7 Jul 2026 16:31:23 +0900 Subject: [PATCH 3/3] fix(review-ui): update hosted context menus in tests --- .../Sidebar/Accounts/ReviewMonitorAccountsViewController.swift | 1 + .../Sidebar/CodexChats/ReviewMonitorSidebarViewController.swift | 1 + 2 files changed, 2 insertions(+) diff --git a/Sources/ReviewUI/Sidebar/Accounts/ReviewMonitorAccountsViewController.swift b/Sources/ReviewUI/Sidebar/Accounts/ReviewMonitorAccountsViewController.swift index 33cb4045..72a62590 100644 --- a/Sources/ReviewUI/Sidebar/Accounts/ReviewMonitorAccountsViewController.swift +++ b/Sources/ReviewUI/Sidebar/Accounts/ReviewMonitorAccountsViewController.swift @@ -956,6 +956,7 @@ private final class ReviewMonitorAccountsOutlineView: NSOutlineView { return } beginContextMenuPresentation(with: contextMenu) + contextMenu.update() presenter(contextMenu) if isPresentingContextMenu { endContextMenuPresentation() diff --git a/Sources/ReviewUI/Sidebar/CodexChats/ReviewMonitorSidebarViewController.swift b/Sources/ReviewUI/Sidebar/CodexChats/ReviewMonitorSidebarViewController.swift index 7eed4e40..0e848106 100644 --- a/Sources/ReviewUI/Sidebar/CodexChats/ReviewMonitorSidebarViewController.swift +++ b/Sources/ReviewUI/Sidebar/CodexChats/ReviewMonitorSidebarViewController.swift @@ -2172,6 +2172,7 @@ private final class ReviewMonitorSidebarOutlineView: NSOutlineView { return } beginContextMenuPresentation(with: contextMenu) + contextMenu.update() presenter(contextMenu) if isPresentingContextMenu { endContextMenuPresentation()