Repository navigation
Fix refresh and subprocess bugs; rebuild the interface with native macOS components - #36
Merged
Merged
Conversation
BoundedSubprocess and GroupedSubprocess used posix_spawn without POSIX_SPAWN_CLOEXEC_DEFAULT, and their pipes are not close-on-exec. A helper spawned concurrently with another session (ps, lsof, sqlite3, or a Codex app-server) inherited that session's pipe ends, which can hold a pipe open past its child's exit, and exposed unrelated AgentDock descriptors to provider tooling. Spawn with POSIX_SPAWN_CLOEXEC_DEFAULT and give bounded helpers an explicit /dev/null stdin so only the configured stdio survives exec. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Deleting a running Claude profile told the user to quit every Codex window. Name only the profile. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Opening a profile requested a stats and usage refresh for that profile, which cancelled any full refresh still in flight. Every other managed profile and both official sources kept stale or empty data, and their loading state was cleared, until the next automatic interval. A partial refresh now defers to a running full refresh, and successive partial refreshes coalesce instead of dropping earlier profiles. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The window used a hand-drawn sidebar (custom selection fills, iOS-style chevrons, uppercase labels), an in-content toolbar, card-styled detail pages, and a second Settings surface embedded in the main window. - Sidebar: a source-list List with sections, a reset-count badge, search, drag reordering, double-click to open, and context menus. - Toolbar: window title and subtitle, the Overview/Advanced picker, Refresh, and Add Profile. - Menus: File › New/Restore Profile, View › Home, Available Resets, Refresh, and a Profile menu. This removes the conflicting duplicate Command-N, Command-Comma, and Command-Shift-F bindings. - Home, Overview, Advanced, Settings, sheets, and notification options use grouped Forms, semantic text styles, and system materials. Settings is a standard tabbed window. - Activity logs and archived sessions use Table. Log rows are identified by position, so identical lines no longer share an identity. - The appearance preference applies app-wide through NSApp.appearance, so Settings and sheets follow it and System restores correctly. - Profile and app icons are decoded once and cached by file identity instead of on every render; app versions are cached per Info.plist. - The editor accepts any monogram letter, offers named colors plus a custom color, and uses a file importer. - The edit sheet is item-driven, so it never presents empty. - Usage window titles share one formatter; a zero-length window is no longer labelled "0-day". Fix singular/plural counts. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Describe the menu commands, context menus, Settings tabs, and reminder controls. Replace the generated Home mock-up with a description of the native layout. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Sidebar rows applied their running state as the value of every child text, so VoiceOver read the status twice and lost the row structure. Combine each row into one element. - Disable automatic window tabbing; the View and Window menus offered tab bar commands for a single-window utility. - Binding setters for the sidebar selection, toolbar section picker, Settings controls, reminder policy, and sheet and alert dismissal now write only real changes. Re-applied values no longer republish model state, re-save preferences, reschedule reminders, or record duplicate navigation analytics. - The Codex provider picker shows Built-in as Default when no named default exists. Re-applying that displayed value no longer rewrites the stored selection, which could restart a running account. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Replace the per-account rows with a summary strip (running accounts, banked resets and next expiration, closest to a usage limit, next usage reset) and a native Table grouped by provider. Each row shows the account and running state, session and weekly usage as inline meters with reset countdowns, banked Codex resets with expiration urgency, and Open or Focus. Columns sort within each provider; double-click opens a source's details and the context menu offers Open and Show Details. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The fixtures live under the home folder to keep socket paths short. Spotlight indexing them could briefly hold a file open, which the migration's open-file check correctly reports as in use, so different migration tests failed intermittently in full-suite runs. Name the fixture with a `.noindex` suffix at the same length. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
euforic
added a commit
that referenced
this pull request
Oct 30, 2026
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
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.
Summary
Fixes from a full review of the app, plus a native macOS rebuild of the interface.
Bugs
BoundedSubprocessandGroupedSubprocesscalledposix_spawnwithoutPOSIX_SPAWN_CLOEXEC_DEFAULT, and their pipes aren't close-on-exec. A helper spawned at the same time as another session (ps,lsof,sqlite3, or a Codex app-server) inherited that session's pipe ends. This can hold a pipe open after its child exits, and it exposed unrelated AgentDock descriptors to provider tooling. Regression tests fail without the fix.⌘N,⌘,, and⌘F/⌘⇧Fwere each bound twice.Added after live testing (a review build launched beside the installed app with a separate bundle ID and driven through the Accessibility API; nothing was created, deleted, or launched)
.noindexname. Spotlight briefly opening fixture files made thelsofin-use check fail different migration tests at random in full-suite runs.Open item: in about the first minute after launch, while the initial refresh lands, showing a managed profile's detail logs SwiftUI "Publishing changes from within view updates" runtime warnings. Nothing renders or behaves incorrectly. I couldn't trace the source, and none appear once the initial refresh finishes.
Interface
Listwith sections, a reset-count badge, search, drag reordering, double-click to open, and context menus.Forms and semantic text styles, with no custom cards, palette, or uppercase labels.Toggle("").Table.NSApp.appearance.Net: about −1,450 lines in the app target.
Validation
swift testafter merging main (Remove unreachable chat-browser scanner APIs from core #37): 296 core tests plus 65 app tests, 0 failures; two consecutive full runs also passed before the merge. Earlier: 389 tests (app and core targets). One failure,LegacyBrandMigrationTests/testExternalOpenFileBlocksMigrationUntilClosed, is a pre-existing intermittent failure of thelsof +Didle check. On an unmodifiedmain, the same check failed three other migration tests on this machine. All 24 migration tests pass when run on their own, and an instrumented rerun didn't reproduce it.swift build -c release --product AgentDockPrivacy and Security
Screenshots
None committed. Renders used synthetic fixtures only.
🤖 Generated with Claude Code