Repository navigation
Conversation
Adds an optional pool of up to four fixed ChatGPT pages in one private Chrome profile (one action per conversation; maintenance drains every page; shared 429 back-off and Send spacing), with optional health fields describing capacity. The companion still defaults to one page. Also recovers orphaned Windows Chrome, normalizes renderer priority, waits for editor hydration instead of treating a missing editor as sign-out, journals owned unsent drafts, bounds read-only DOM observations and passive health polls, persists Retry-After across restarts, and adds optional Simplified and Bones presentation levels. Upstream's admission, pairing-window reservation, chat-mode, conversation-limit and transcript rate-limit handling are kept. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
devnoname120
left a comment
There was a problem hiding this comment.
Reviewed the final commit 20be346 separately from its #22/#23 prerequisites, focusing on worker ownership/revision checks, durable controls, recovery leases, continuation fencing, native activity tracking, settings and the external agent client. Requesting changes; this stack is not ready to merge.
The Windows worktree path comparison is a functional blocker for the new agent client. The new native code also fails the non-Windows lint gate, and the split still omits a helper imported by its tests. Inline comments describe each issue.
Validation at this head:
- Clean library run: 934 passed, 3 failed, 1 ignored. Both recovery-lease failures reproduce the macOS CI descriptor-directory permission error. The third failure is owner_api_lists_sends_and_reads_the_same_persisted_chat: its new agentTeam assertion expects metadata although the fixture leaves agentFolders disabled. Align the fixture/contract before treating the suite as passing.
- Selected agent_connection, agent_automation_parallel, agent_automation_supervisor and turn_renewal integration suites: 182 passed, 1 ignored.
- cargo fmt --all --check passed. cargo clippy --all-targets -- -D warnings failed with the new non-Windows loop/mutability diagnostics and the inherited unused PendingBuffer helper.
- node --test scripts/test-agent-client.mjs fails before running tests because its imported helper is missing; the separate monitor tests passed all 9 cases.
- Current CI fails browser packaging/native account-maintenance tests inherited from #22, the macOS owner-chat tests above, and the retry-settings UI assertion in both Chromium and WebKit (9 controls versus the expected 8). The Windows service job passes. These are not all Windows-environment failures.
The positive evidence is useful: the selected scheduling/continuation integration suites pass and the code contains explicit ownership checks, compare-and-set guards and tests for uncertain sends. However, the final commit adds roughly 16,000 lines across agent teams, recovery, settings and UI, beyond the prerequisite browser/execution changes. I would land the corrected prerequisites first, then rebase this PR and rerun its full native/browser/UI validation. The new client and recovery features need the inline defects and failing contracts resolved before approval.
| .bindings | ||
| .selected_project_root(&self.config, &task)? | ||
| .ok_or("Coding-app team workspace is missing; retry setup")?; | ||
| if root != std::path::Path::new(&record.project_path) { |
There was a problem hiding this comment.
[P2] Normalize the saved workspace before comparing it with the binding
With createWorktree=true on Windows, a new managed worktree is returned under the plain drive path produced by prepare_worktrees_root/strip_verbatim_prefix. Setup saves that spelling into record.project_path at line 395. client_task immediately reloads the binding through selected_project_root, whose canonical_binding_dir uses fs::canonicalize and returns the extended-length spelling. Path equality treats C:... and \?\C:... as different, so setup saves initialized=true and then fails with "Team workspace changed" even though the workspace has not moved; retries/status/control keep failing on the saved record. Store and compare canonical paths consistently, and cover setup plus reconnect with createWorktree=true on Windows. This follows from the two path-producing code paths; I did not execute the Windows runtime locally.
| let mut temporary = prepare_runtime(parent, &info)?; | ||
| #[cfg(windows)] | ||
| let mut retry_delay_ms = 10; | ||
| loop { |
There was a problem hiding this comment.
[P2] Keep Windows-only retry loops out of non-Windows builds
The only continue in this loop is behind cfg(windows), so on macOS/Linux the loop always breaks or returns on its first iteration. cargo clippy --all-targets -- -D warnings fails with clippy::never_loop here and unused_mut for temporary above it. The new retry loop in agent_automation/store.rs:4212 has the same non-Windows problem. I reproduced both at this head on macOS. Use a platform-specific retry implementation or conditional loop/mutability so the ordinary non-Windows persist path remains warning-free. The inherited PendingBuffer::is_empty warning from #23 is separate.
| import {pathToFileURL} from 'node:url'; | ||
| import test from 'node:test'; | ||
| import {setTimeout as delay} from 'node:timers/promises'; | ||
| import {monitorTeams} from './windows-autowork-team-status.mjs'; |
There was a problem hiding this comment.
[P2] Include the helper required by the new agent-client tests
This imports windows-autowork-team-status.mjs, but that file is only added by #21. The declared #22/#23 stack in this branch does not contain it. Running node --test scripts/test-agent-client.mjs fails at module load with ERR_MODULE_NOT_FOUND, so none of the new JavaScript client tests execute. Put the shared helper with its consumers, remove the cross-PR test dependency, or explicitly include #21 in the stack/merge requirements and validate the resulting tree.
| .unwrap(); | ||
| config.memory.dir = Some(root.path().join("metadata").display().to_string()); | ||
| config.markdown_chat.automation.descriptor_path = | ||
| root.path().join("descriptor.json").display().to_string(); |
There was a problem hiding this comment.
[P2] Make the recovery fixture satisfy the real Unix descriptor boundary
The fixture writes the descriptor directly under the temporary root and later sets only the file to 0600. Its parent is not established as a private directory before the real BrowserCompanionClient is used. Both recovery_lease_prepares_before_passive_health_and_waits_for_real_account_proof and recovery_lease_skips_its_task_while_unrelated_scans_continue fail with 409 "Browser companion descriptor directory must be private to the current user" in macOS CI and in my local run. Create/chmod a private fixture descriptor directory on Unix rather than weakening the production validator, so these tests actually reach and verify recovery commit/lease behavior.
- After clicking the connector row, place the composer caret after the retained chip. A pointer click left it at the typed query, so the prompt was inserted before the chip. - A window operation queued behind a predecessor no longer expires while that predecessor is still within its own budget (connector refresh can legitimately outlast a plan or reveal request). It still expires once the predecessor overruns. - Package staging accepts either spelling of a linked scratch directory (macOS /var -> /private/var) and still rejects an escaped real parent. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
20be346 to
f917a61
Compare
|
Thanks for the review. I rebuilt the stack on the fixed #22 (810adf7) and #23 (a6f2ad7, 6ddc019), and every finding is addressed in the new top commit: Windows workspace comparison (
Non-Windows lint
Recovery fixtures
Retry settings UI
The activity registry moved here from #23, because its only consumers ( I agree #22 and #23 should land first. After they merge, I'll rebase so this PR shows only its own commit. |
The browser companion's unconfigured spacing between conversation loads goes back to the upstream 180 seconds. Lane tests now configure the one-second interval they exercise explicitly, a new test pins the default, and the timing tests run on a frozen clock so they are not load-dependent. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
exec_command keeps a session addressable until its final output and exit code are polled, retains final results until read, and lets an owner message end only the output wait. Git checkpoints skip repeated legacy-namespace probes and drain stderr under the command deadline. Paths drop the \?\ verbatim prefix before reaching Git, the native server runs at Normal priority, and the supervisor holds an OS lock for its lifetime. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Move the conversation command-activity registry to the agent-teams change that consumes it, and compile PendingBuffer::is_empty only for tests now that the reaper no longer treats an empty buffer as an acknowledgement. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Admission counted every retained session against maxSessions, so a client that never drained final results could hold all slots for the idle timeout. Only running processes now block admission: when the map is full, the least recently used finished-but-unread results are evicted (and logged) to admit the new command. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent teams (off by default): parent and worker chats with per-worker goals, revision-checked agent_control, agent_message, agent_status and reports, plus one agent connection over MCP, HTTP and a dependency-free JavaScript helper. Owner chat: an Agents panel and folders, a working-tree changes counter, a faster chat listing, and opt-in recovery that replaces an inaccessible conversation. Goals: infinite goals stop only when the same concrete blocker persists across three turns and 60 seconds; native offline detection counts running native calls and commands; turn handoffs reset per-owner clocks. Browser runtime: up to four parallel action pages (browserActionLanes), Browser simplicity and recovery settings, Fast setup in Settings and `codexify config fast-setup`, and a one-second healthy conversation-load interval (HTTP 429 and Retry-After back-off still apply). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…xtures - Save the canonical workspace spelling at setup and compare canonical paths, so a createWorktree=true worktree (plain C:\ path) matches its binding's extended-length path. - Route both Windows-only retry loops through persist::persist_replacing, so non-Windows builds have no never_loop/unused_mut. - Keep the command-activity registry with its consumers here (moved out of the standalone execution change). - Include windows-autowork-team-status.mjs, used by test-agent-client.mjs. - Recovery fixtures use a private descriptor directory; the owner API fixture writes its team record privately on Unix. - The retry settings UI test expects the new infiniteRetries switch. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…reaker Defaults for configurations that omit them go back to the upstream values: one browser action lane, 180-second conversation-load spacing, and delegation off unless enabled globally or per team. Fast setup and quickstart no longer turn on Bones/Simplified, infinite retries, turn renewal or a faster load interval; each stays a separate opt-in. agentChat.features.maxActiveWorkers (default 4, 1-32) is a hard per-project cap on active workers; spawn requests that would exceed it are refused, while replays of accepted requests stay idempotent. Agent status reports the limit. The supervisor now counts dispatched loads, accepted sends, recoveries, renewals and worker turns (owner /api/health automationActivity). When automatic work exceeds its 10-minute limit the breaker opens for 15 minutes and holds recoveries, renewals and worker turns in the queue; owner messages and setup are never held. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
f917a61 to
9a7851b
Compare
|
Follow-up review addressed in 9a7851b. The branch is rebased onto the updated #22 and #23, so review the last commit. Defaults restored for configurations that omit them:
Fast setup / quickstart no longer enable Bones/Simplified, Hard active-worker cap: new Counters and circuit breaker:
The loads counter counts dispatched actions, which is an upper bound on real document loads (same-page reuse makes none). Actual load spacing is still enforced by the companion. Validation:
|
Summary
Split out of #20, as requested. This PR has the native runtime work: agent teams, owner-chat recovery, goal continuation and the browser settings that use #22.
Stacked on #22 and #23. This branch contains their commits first, so GitHub shows a cumulative diff. Please review only the last two commits: "Add agent teams, owner chat recovery and goal continuation improvements" and "Address review: Windows workspace paths, non-Windows lint and test fixtures". After #22 and #23 merge I'll rebase, and this PR will show only its own changes. The pieces share
supervisor.rs,store.rs,server.rsandowner_chat.rstoo heavily to make an independent branch that compiles on its own.New features are off by default unless noted.
Changes
Agent teams and AI agent control (
agentChat.features.agentTeams,externalAgentControl)agent_spawn,agent_status,agent_report,agent_controlandagent_message.expectedRevision). A chat can only control its own recorded children, and workers can't control siblings or their parent.get_agent_briefincludes a coordination agreement (docs/AGENT_COORDINATION.md).~/.codexify/agents/(connection.json,client.mjs). Seedocs/CODING_APP_AGENTS.md.Owner chat
agentFolders).owner_chat/listing.rs), with reads bounded in parallel.conversationRecovery) replaces an inaccessible conversation without losing the task. It takes a recovery lease, then prepares the new chat and checks the real account before proceeding.Goals and continuation
goal_blocking.rs).retryTimings.infiniteRetries).Browser runtime settings (uses #22)
agentChat.automation.browserActionLanes(1–4) enables parallel action pages, with one action per conversation enforced natively.codexify config fast-setup. Quickstart fills it in only for missing fields.Retry-Afterback-off still apply, and an explicitly saved interval is kept.Tooling and docs
scripts/monitor-agent-performance.mjs, owner-chat UI smoke scripts, README anddocs/REFERENCE.mdupdates.Testing (Windows 11, full merged tree)
cargo test: 1658 passed. The failures that remain also fail on unmodifiedmainon Windows, so they come from the environment:doctor_cli(a Codexify service is installed on this machine)existing_worktreesandworkspace_resume(\\?\path spelling)chat_attachmentsexec_commandoutput-budget testagent_automation_supervisor,agent_automation_parallelandconfigall pass.cargo fmt --checkpasses.cargo clippy --all-targets -D warnings: no findings in the new code. The remaining warnings are Windows-only (unused variables in upstream's code behindcfg(unix)).bun test309 pass / 0 fail, andtsc --noEmitpasses.🤖 Generated with Claude Code