chore(sync): 13 GREEN + 5 maintainer-requested upstream commits into main-fluke#45
Merged
Merged
Conversation
…ntWrapper#2394) * docs(release): rewrite desktop-release.md as a full stable-release runbook Written from the v0.10.2 cut. Documents the tag-only stamp commit, the desktop-v* trigger tag, the release environment approval gate (with the current approver list and how to query it), release-notes generation, and post-release verification. Replaces the stale pre-signing checklist: secrets are configured and the workflow now covers all platforms. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * docs(release): clarify that the approval gate, not the tag push, controls who can cut a release Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * ci(nightly): format frontend-nightly.yml so the check-only Prettier gate passes on every PR The important-flag input (AgentWrapper#2378) merged with single-quoted YAML that Prettier rewrites, and since the Prettier workflow is check-only and PR-triggered (AgentWrapper#2356), every open PR inherits the failure. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * ci(prettier): run on pull_request and check only changed files The push-only trigger skipped fork PRs entirely (e.g. AgentWrapper#2378, which merged the unformatted nightly workflow with no format check run), and the whole-repo check made every open PR go red for files it never touched once one bad file landed on main. Trigger on pull_request so every PR is checked regardless of origin, and diff against the merge base so a PR is only ever red for its own files. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> --------- Co-authored-by: Claude Fable 5 <noreply@anthropic.com> (cherry picked from commit b924273)
…command arguments (AgentWrapper#2480) (cherry picked from commit bc74028)
* ci: guard latest desktop release * fix(ci): self-heal a hijacked releases/latest pointer (AgentWrapper#2462) The guard previously only detected a hijacked latest pointer and failed the run, still requiring a maintainer with delete rights to remove the junk release by hand. Add a remediation step that, on scheduled/manual runs, deletes a release carrying the unambiguous hijack signature -- published, non-prerelease, a non-semver tag, and zero electron-updater feed assets (latest.yml / latest-mac.yml / latest-linux.yml) -- along with its tag, so GitHub re-points latest to the newest real stable release. A real stable release always has a semver tag and the feed assets, so this can never match one; an in-progress real release keeps its semver tag, so it is excluded too, and the step never runs on `release` events to avoid racing an asset upload. This lets merging the PR resolve AgentWrapper#2462 via the Actions token with no manual admin action, while the verify step stays as the tripwire for anything outside the auto-remediable signature. Bumps the job permission from contents:read to contents:write for the delete. * Revert "fix(ci): self-heal a hijacked releases/latest pointer (AgentWrapper#2462)" This reverts commit 185bc56. (cherry picked from commit 6d53e11)
…iew (AgentWrapper#2457) (cherry picked from commit afa5476)
…Wrapper#2414) (AgentWrapper#2467) electron-builder derives the Windows exe name -- and thus the Start menu shortcut's TargetPath and IconLocation -- from win.executableName, falling back to productName when it is unset. The NSIS maker only forwarded productName ("Agent Orchestrator"), so electron-builder generated a shortcut targeting "Agent Orchestrator.exe" while Forge's packager actually produced "agent-orchestrator.exe". The shortcut pointed at a file that does not exist: clicking it silently did nothing, and its icon fell back to a generic glyph. Forward win.executableName ("agent-orchestrator") so the shortcut targets the real binary, and hoist the name into a single EXECUTABLE_NAME constant shared by the packager and the NSIS/deb makers so they cannot drift apart again. Verified on Windows 11 by building the installer and silent-installing it: the Start menu shortcut now targets %LOCALAPPDATA%\Programs\agent-orchestrator\agent-orchestrator.exe with IconLocation set to the same exe, and the app launches. (cherry picked from commit 60ed661)
* feat(mobile): port supervisor app to current main * chore(mobile): format mobile package (cherry picked from commit 8d405c4)
…AgentWrapper#2465) * fix(dev): isolate dev daemon from installed app on port and state dir When running npm run dev while an installed AO app is already running, both shared port 3001 and ~/.ao/running.json. The dev Electron would attach to the installed daemon and tear it down on quit via the supervisor link. Fix: in dev mode (app.isPackaged === false), default to: - AO_PORT=3002 (separate port, no collision) - AO_RUN_FILE=~/.ao/dev/running.json (isolates supervise.sock too, since the backend derives it as dir(RunFilePath)/supervise.sock) - AO_DATA_DIR=~/.ao/dev/data (separate SQLite DB) Explicit env var overrides still win, so contributors can further customise via their shell environment. resolvedDaemonPort() encapsulates the port lookup so all three probe call-sites stay consistent. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix(dev): isolate Windows supervisor pipe per run-file instance On Windows the supervisor previously used a fixed global named pipe (\\.\pipe\ao-supervise) on both the Go backend and Electron frontend, so dev and installed-app daemons could still collide despite the separate port and state dir. Both sides now derive the pipe name from the run-file's parent directory, mirroring the Unix supervise.sock placement: ~/.ao/dev/running.json → \\.\pipe\ao-supervise-dev. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> (cherry picked from commit f2da70d)
* fix: replace orchestrators through canonical handoff * fix(tests): correct logic in TestRetireForReplacementCapturesAndReleasesWorkspace * fix: enhance tests and add project config handling in service and workspace components * fix: update project summary to include orchestrator agent and adjust related tests * fix: block orchestrator replacement on runtime teardown failure * fix: enhance orchestrator handling in ProjectSettingsForm and SessionsBoard components * fix: rename parameter for clarity in projectConfigPtr function * fix: stream vibe worker output * fix: preallocate vibe launch command * fix: update vibe session commands to use interactive mode * fix: update GetLaunchCommand to handle promptless launches and improve test cases (cherry picked from commit 5823744)
* fix: replace orchestrators through canonical handoff * fix(tests): correct logic in TestRetireForReplacementCapturesAndReleasesWorkspace * fix: enhance tests and add project config handling in service and workspace components * fix: update project summary to include orchestrator agent and adjust related tests * fix: block orchestrator replacement on runtime teardown failure * fix: enhance orchestrator handling in ProjectSettingsForm and SessionsBoard components * fix: rename parameter for clarity in projectConfigPtr function * fix: launch grok prompts interactively * fix(grok): update launch command to properly handle prompts with leading dashes (cherry picked from commit 2b8ba2c)
…#2512) Fixes AgentWrapper#2511 (cherry picked from commit a2c3885)
…gentWrapper#2499) * fix(desktop): wheel-scroll codex transcripts via terminal scrollback * route kilocode wheel scroll to page keys like opencode * cover kilocode/opencode keyboard-scroll provider wiring (cherry picked from commit 31a2698)
…entWrapper#2455) * feat(preview): render Markdown and let agents drive the browser panel via ao preview * fix go linting errors * fix linting errors * refactor(preview): fix the auto open bug (cherry picked from commit cc7754e)
* Navigate back to orchestrator after kill * Remove accidental packageManager change * Refactor TopbarKillButton to use parent-owned navigation * Update ShellTopbar kill-button tests for callback navigation (cherry picked from commit e311878)
stragglers.go called syscall.Kill(pid, SIGTERM) directly, which is Unix-only, so the whole session_manager package (and everything importing it, e.g. internal/cli) failed to compile on windows-latest — surfacing as `internal/cli [build failed]` in the cli-e2e matrix. Split the kill seam into build-tagged killStray helpers: SIGTERM on unix, os.Process.Kill (TerminateProcess) on windows. The reaper is a no-op on Windows anyway (lsof is absent → empty pid list), so this only restores cross-platform compilation without changing Unix behavior. Pre-existing on main-fluke; unrelated to the upstream-sync content in this PR, fixed here to get CI green. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
… host-independent Pre-existing main-fluke debt surfaced by this PR's first full-matrix CI run (unrelated to the upstream-sync content). All behavior-preserving: lint (golangci-lint v2.12.2, whole backend now 0 issues): - nilerr (service/project/service.go, service/session/diff_context.go): these error paths INTENTIONALLY degrade to an empty list / Available:false (see the existing doc comments) rather than propagating — annotated //nolint:nilerr with the rationale instead of changing behavior. - unparam (service/session/status.go): deriveStatus keeps minApprovals to mirror deriveStatusDetail's signature for callers/tests — //nolint:unparam. - errcheck (branchname.go): explicitly ignore os.RemoveAll in the defer. - gocritic (branchname.go regexpSimplify, diffhunk.go emptyStringTest): trivial equivalent rewrites. - revive (domain/status.go, prompts/prompts.go): add block doc comments on two exported const groups. build-test: - gitRepo test fixture now sets a local user.name/user.email so `git commit` works on CI runners with no global git identity (TestProjectsAPI_Branches). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Cherry-picked from upstream 3423dde, conflict-resolved for main-fluke. Ported AgentWrapper#2458's control-flow fix (queue all applicable PR nudges instead of returning after the first) WHILE preserving main-fluke's divergent behavior: - keeps message-template rendering (renderNudge + messagetemplates.Name*) rather than upstream's hardcoded English strings, and - keeps the auto-nudge opt-in gate on the review-comment nudge (default off; per-session AutoNudgeComments overrides). Upstream fires the review nudge unconditionally; main-fluke does not, by design. Net behavior change (the point of AgentWrapper#2458): a CI failure no longer suppresses the review / merge-conflict nudges for the same PR. The review nudge still fires only when auto-nudge is enabled. AgentWrapper#2458's new test was adapted to enable auto-nudge so it exercises the fix under main-fluke's gating (no product-behavior change). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Cherry-picked from upstream 35012bd, ported into main-fluke's message-template architecture (upstream enriched hardcoded nudge strings; main-fluke renders user-editable templates). - ports.PRObservation gains Title/SourceBranch/TargetBranch (upstream); wired through scmToPRObservation from the SCM observation the observer already populates. - prIdentity(o) builds `PR #N "title" (src → tgt)` (falls back to "your PR"). - The 3 PR nudge templates (ci-failing, review-comment-dispatch, merge-conflict) gain PRIdentity/PRURL render fields; their DEFAULT text now names the PR and appends a `PR: <url>` line. Zero-value/no-number renders identically to the old default ("your PR"), so existing custom overrides are unaffected. Behavior change (intended, per AgentWrapper#2492): the default worker nudges now identify which PR they refer to and include its URL. Tests updated: renderer defaults compare against the executed template; the message-templates API test reflects merge-conflict's new placeholders while still asserting placeholders never serialize as null. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* Track AO version in PostHog telemetry * chore: format with prettier [skip ci] --------- Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com> (cherry picked from commit a54003e)
…gentWrapper#2440) Cherry-picked from upstream 9cda5d4, conflict-resolved for main-fluke. Adopts AgentWrapper#2440's full-window maximize: when the browser is popped out it now renders as a fixed .browser-popout-overlay portaled to <body> (covering the sidebar + topbar), instead of main-fluke's previous in-column BrowserPanelView inside the 72% terminal ResizablePanel. This escapes the [data-panel] column so the native WebContentsView is no longer clamped and fills the whole window. main-fluke's own SessionView additions are preserved: the fileView (FileDiffView) branch and CenterPane's `directory` prop are kept; only the in-column pop-out branch is dropped in favor of the portal overlay. Behavior change (intended, per AgentWrapper#2440 + user confirmation): popping the browser out now covers the entire app window rather than just the terminal column. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Cherry-picked from upstream 39dbca0, scoped to the frontend for main-fluke. Frontend (taken): the topbar pill now shows the raw agent activity state (active/idle/waiting_input/exited/unknown → Working/Idle/Input Needed/Exited/ Unknown) instead of the SCM-derived worker status; SCM/context stays in the inspector's Activity row. This is AgentWrapper#2541's actual fix and applied cleanly. Backend (rejected as redundant): AgentWrapper#2541 also mapped Claude Code idle_prompt → Idle in activity.go. main-fluke already does exactly that — and more (it additionally treats pre/post-tool-use as active and documents the recap/open-PR interaction), so its DeriveActivityState/notificationState is a strict superset. Keeping main-fluke's version; the activity.go/activity_test.go/hooks_test.go conflicts were resolved to ours. Upstream's PR-evidence screenshots were dropped. Behavior change (intended, per AgentWrapper#2541 + user confirmation): the topbar pill tracks live agent activity rather than the SCM pipeline status. Co-Authored-By: Claude Opus 4.8 (1M context) <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.
Selective upstream sync into
main-fluke. Triaged all 32 commits inmain-fluke..upstream/main(frontier2083bc20→ upstream HEAD4f87346f). This PR brings in the 13 safe GREEN commits plus 5 previously-YELLOW commits the maintainer explicitly asked for (conflict-resolved / ported into main-fluke's architecture), plus 2 pre-existing-debt CI fixes.Base:
main-fluke· 20 commits · Verification: backendbuild/vet/test ./...green,golangci-lint0 issues, Windows cross-compile OK, frontendtypecheck+ 656 vitest green, no lockfile/routeTree churn.Structured so the orchestrator can paste decisions straight into its ledger.
(a) GREEN — clean cherry-picks (13,
-x)6038cad6b9242736311e56cebc7402845fb446af6d53e1158a4d8fcdafa547630037c48760ed6610e84972278d405c42f22cc68af2da70d387006ab05823744d59c967ca2b8ba2cc6a12945da2c38854d325d60e31a2698eedb21806cc7754e1385dfefbe311878f(b) Ported from YELLOW at maintainer request (5) — conflict-resolved, behavior-preserving unless noted
67de28ff3423dde5renderNudge) + auto-nudge opt-in gate on review nudges (upstream fires unconditionally — main-fluke does not). Test adapted to enable auto-nudge.090fc61a35012bd9PRIdentity/PRURLto 3 template data structs + defaults; wiredprIdentity/PRObservation fields. Zero-value renders identically to before (custom overrides unaffected).PR #N "title" (src → tgt)) and append aPR: <url>line.ad46ea35a54003e7app_version/ao_version/platform/build_modecontext.ebe4336f9cda5d4b.browser-popout-overlay(portaled to<body>, escapes the panel so the native WebContentsView isn't clamped). Preserved main-fluke'sfileView(FileDiffView) + CenterPanedirectory.486f5b3639dbca01activity.gochange: main-fluke'sDeriveActivityState/notificationStateis a strict superset (already mapsidle_prompt→Idle, plus pre/post-tool-use handling). Dropped upstream's PR screenshots.(c) CI hardening — pre-existing main-fluke debt (2, not sync content)
77f5c616native (windows)/testkillStray(SIGTERM on unix,os.Process.Killon windows) sosession_managercompiles on Windows.676f14ablint/build-testYELLOW — NOT taken (needs decision / deferred)
7a87caaemanager.go, entangled with AI branch-naming/convention/reviewer-reap) + Sidebar (+464). Needs focused integration + behavioral testing, not a fold-in.992e3d01subjectRepoForPR(observer.go:513/560) already hydrates tracked-PROwner/Name; AgentWrapper#2510 patchesrepoForTrackedPR, a AgentWrapper#2460 construct that doesn't exist here.09768f29ErrSwitchInProgress).073419ce0.0.0.0LAN listener + bearer auth — against the loopback-only hard rule; conflicts across generated API artifacts.863853e3RED — don't take (4)
AgentWrapper#2461 (own README), AgentWrapper#2260 (marketing landing rework), AgentWrapper#2495 (own README + install path), AgentWrapper#2546 (landing docs).
SKIP — reverted pair
AgentWrapper#2412 + its revert AgentWrapper#2502 (net-zero).
Notes for the ledger
🤖 Generated with Claude Code