Skip to content

chore(sync): 13 GREEN + 5 maintainer-requested upstream commits into main-fluke#45

Merged
f1uke merged 20 commits into
main-flukefrom
chore/sync-upstream-into-main-fluke
Jul 10, 2026
Merged

chore(sync): 13 GREEN + 5 maintainer-requested upstream commits into main-fluke#45
f1uke merged 20 commits into
main-flukefrom
chore/sync-upstream-into-main-fluke

Conversation

@f1uke

@f1uke f1uke commented Jul 10, 2026

Copy link
Copy Markdown
Owner

Selective upstream sync into main-fluke. Triaged all 32 commits in main-fluke..upstream/main (frontier 2083bc20 → upstream HEAD 4f87346f). 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: backend build/vet/test ./... green, golangci-lint 0 issues, Windows cross-compile OK, frontend typecheck + 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)

new SHA ⇐ upstream PR subject how
6038cad6 b9242736 AgentWrapper#2394 desktop-release runbook + Prettier CI clean
311e56ce bc740284 AgentWrapper#2480 Pi agent interactive clean
5fb446af 6d53e115 AgentWrapper#2463 guard latest desktop release clean
8a4d8fcd afa54763 AgentWrapper#2457 fix CLI exit code (review/preview) clean
0037c487 60ed6610 AgentWrapper#2467 Windows NSIS shortcut clean
e8497227 8d405c42 AgentWrapper#2522 port mobile supervisor app clean (⚠️ inert without AgentWrapper#2533)
f22cc68a f2da70d3 AgentWrapper#2465 isolate dev daemon port/state clean
87006ab0 5823744d AgentWrapper#2521 stream Vibe worker output clean
59c967ca 2b8ba2cc AgentWrapper#2518 launch grok interactively clean
6a12945d a2c38854 AgentWrapper#2512 startup state for pending terminals clean
d325d60e 31a2698e AgentWrapper#2499 wheel-scroll codex transcripts clean
edb21806 cc7754e1 AgentWrapper#2455 agent browser previews + Markdown resolved go.mod (kept newer deps + goldmark)
385dfefb e311878f AgentWrapper#2530 navigation back to orchestrator promoted from YELLOW; verified

(b) Ported from YELLOW at maintainer request (5) — conflict-resolved, behavior-preserving unless noted

new SHA ⇐ upstream PR how it was ported behavior change
67de28ff 3423dde5 AgentWrapper#2458 Kept AgentWrapper#2458's queue-all-nudges control-flow fix; preserved main-fluke's message-templates (renderNudge) + auto-nudge opt-in gate on review nudges (upstream fires unconditionally — main-fluke does not). Test adapted to enable auto-nudge. A CI failure no longer suppresses the review/merge nudges for the same PR. Review nudge still gated by auto-nudge (unchanged).
090fc61a 35012bd9 AgentWrapper#2492 Ported the "enrich PR context" idea into main-fluke's editable message-template system: added PRIdentity/PRURL to 3 template data structs + defaults; wired prIdentity/PRObservation fields. Zero-value renders identically to before (custom overrides unaffected). Default worker nudges now name the PR (PR #N "title" (src → tgt)) and append a PR: <url> line.
ad46ea35 a54003e7 AgentWrapper#2482 Clean cherry-pick. Telemetry events now carry app_version/ao_version/platform/build_mode context.
ebe4336f 9cda5d4b AgentWrapper#2440 Adopted AgentWrapper#2440's full-window .browser-popout-overlay (portaled to <body>, escapes the panel so the native WebContentsView isn't clamped). Preserved main-fluke's fileView (FileDiffView) + CenterPane directory. Popping the browser out now covers the whole app window (sidebar + topbar), not just the terminal column.
486f5b36 39dbca01 AgentWrapper#2541 Took only the frontend pill change (applied clean). Rejected the backend activity.go change: main-fluke's DeriveActivityState/notificationState is a strict superset (already maps idle_prompt→Idle, plus pre/post-tool-use handling). Dropped upstream's PR screenshots. Topbar pill now shows raw agent activity (Working/Idle/Input Needed/Exited/Unknown) instead of the SCM-derived status; SCM/context moves to the inspector Activity row.

(c) CI hardening — pre-existing main-fluke debt (2, not sync content)

new SHA check fix
77f5c616 native (windows) / test Build-tagged killStray (SIGTERM on unix, os.Process.Kill on windows) so session_manager compiles on Windows.
676f14ab lint / build-test Cleared 12 pre-existing golangci-lint findings (nolint for intentional nilerr/unparam; trivial rewrites); test git-identity fix.

YELLOW — NOT taken (needs decision / deferred)

PR upstream why not taken now recommendation
AgentWrapper#2460 7a87caae Deferred to a dedicated session (maintainer decision). ~3,500-line multi-repo "workspace projects" feature; rewrites main-fluke's Spawn/Kill/restore path (+737 in manager.go, entangled with AI branch-naming/convention/reviewer-reap) + Sidebar (+464). Needs focused integration + behavioral testing, not a fold-in. Own PR/session. Blocks AgentWrapper#2497 & AgentWrapper#2510.
AgentWrapper#2510 992e3d01 Skipped as redundant. main-fluke's subjectRepoForPR (observer.go:513/560) already hydrates tracked-PR Owner/Name; AgentWrapper#2510 patches repoForTrackedPR, a AgentWrapper#2460 construct that doesn't exist here. No action — already fixed in main-fluke.
AgentWrapper#2497 09768f29 Depends on AgentWrapper#2460 (drags in its spawn helpers + reverted-AgentWrapper#2412 ErrSwitchInProgress). Take with AgentWrapper#2460, or port only the adapter prompt-delivery bits.
AgentWrapper#2533 073419ce Non-loopback 0.0.0.0 LAN listener + bearer auth — against the loopback-only hard rule; conflicts across generated API artifacts. Security sign-off; decide with AgentWrapper#2522 (mobile app).
AgentWrapper#2432 / AgentWrapper#2314 / AgentWrapper#2536 Board-redesign collisions (SessionsBoard/NotificationCenter); AgentWrapper#2536 depends on AgentWrapper#2432. Reconcile against the 4-hue board redesign.
AgentWrapper#2466 863853e3 Applies clean; deletes 11 pre-frontier planning docs. Docs-curation call.

RED — 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

  • The 5 ported YELLOW commits each carry a resolution note in their commit message. Their behavior changes are listed in (b) above and were confirmed with the maintainer.
  • feat: combine workspace project stack AgentWrapper/agent-orchestrator#2460 was surveyed (files/hunks/conflict points captured) before deferral — hand it to a dedicated session.
  • The 2 CI-hardening commits touch main-fluke's own code beyond sync scope; keep them under a separate "CI hardening" note if you want the sync ledger pure.

🤖 Generated with Claude Code

harshitsinghbhandari and others added 20 commits July 10, 2026 10:27
…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)
* 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)
…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)
…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>
@f1uke f1uke changed the title chore(sync): integrate 13 safe (GREEN) upstream commits into main-fluke chore(sync): 13 GREEN + 5 maintainer-requested upstream commits into main-fluke Jul 10, 2026
@f1uke f1uke merged commit d8c2dfc into main-fluke Jul 10, 2026
10 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.