Skip to content

[codex] Add macOS Podman runtime setup - #8

Open
TerminallyLazy wants to merge 27 commits into
agent0ai:mainfrom
TerminallyLazy:macOS-launcher-final
Open

[codex] Add macOS Podman runtime setup#8
TerminallyLazy wants to merge 27 commits into
agent0ai:mainfrom
TerminallyLazy:macOS-launcher-final

Conversation

@TerminallyLazy

Copy link
Copy Markdown
Contributor

Summary

  • Adds a shell-owned macOS runtime setup flow that installs Homebrew when needed, installs Docker CLI/Compose/credential helper/Podman, initializes a launcher-owned Podman machine, installs Podman's macOS Docker socket helper through the native admin prompt, and verifies the runtime before persisting metadata.
  • Adds sanitized runtime setup IPC, renderer onboarding/progress/error surfaces, and inventory sanitization so Docker/Podman internals do not leak to the renderer.
  • Hardens macOS edge cases observed during live testing: Homebrew link/shadow failures after successful formula installation, stale Docker Desktop CLI contexts, verified Podman API socket fallback, cancellation, and app icon branding for local Electron runs.
  • Keeps latest upstream agent0ai/a0-launcher:main included; this branch was rebased onto upstream/main at 4c27589 before push.

Validation

  • node --test shell/docker_manager/runtime_setup.test.js
  • node --test shell/instance_tabs.test.js
  • node --check shell/main.js
  • node --check shell/preload.js
  • node --check shell/docker_manager/index.js
  • node --check shell/docker_manager/runtime_setup.js
  • node --check app/docker_manager.js
  • node --check app/components/docker-manager/onboarding/onboarding.js
  • node --check app/components/docker-manager/status-header/status-header.js
  • node --check app/components/docker-manager/retained-instances/retained-instances.js
  • node -e "import('./shell/docker_adapter/DockerInterface.mjs')"
  • git diff --check
  • docker version --format '{{.Client.Context}} {{.Server.Version}} {{.Server.Os}}/{{.Server.Arch}}'

Notes

  • The branch still leaves unrelated local untracked files unstaged in the working tree; they are not part of this PR.
  • Fetching tags reported a moved local v0.1 tag conflict, so branch fetching used --no-tags; upstream/main was updated and integrated successfully.

TerminallyLazy and others added 27 commits June 6, 2026 10:13
Adds a bottom-dock Logs panel beside the CLI panel, with a container
selector that resolves the "which container's logs?" question by
defaulting to the running, launcher-active instance first.

Replaces the previous separate-window approach for opening Agent Zero
instances with an in-window tab strip: each A0 instance is now a
WebContentsView embedded inside the launcher window, surfaced as a
tab alongside a fixed Home tab in the top-left. The strip only
appears once at least one A0 instance is open, so users can always
"turn back" to the launcher without hunting for its window.

- shell/docker_manager: expose readContainerLogs (snapshot, capped).
- shell/main: A0 tab manager owning WebContentsViews + bounds, resize
  reflow, and a0tabs IPC (list/activate/close/changed). openUi,
  openContainerUi, and openRemoteInstance route through openA0Tab
  instead of spawning new BrowserWindows.
- shell/preload: a0TabsAPI + readContainerLogs bridges.
- app/instance-tabs.js: renders the tab strip (Home + per-instance
  tabs with close buttons), shown only when tabs exist.
- app/docker_manager.js: bottom dock gains a Logs tab with container
  selector, refresh, and stderr-styled log lines.
- app/index.html + docker_manager.css: tab strip mount, body
  padding-top when active, and polished tab/log styling.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- Tab strip now scrolls horizontally when many A0 instances are open;
  tabs no longer flex-shrink (keep min width) and the strip's
  scrollbar is visually hidden via scrollbar-width: none and the
  webkit-scrollbar selector.
- Logs panel auto-scroll no longer hijacks the user's reading
  position. The pre-render scroll state is captured before the dock
  rebuild; we only snap to the bottom when the container changed
  (fresh load) or the user was already near the bottom. Otherwise
  the previous scrollTop is restored across rebuilds.
- Bumped the log snapshot from 500 to 1000 lines so users get more
  context (backend cap is 2000).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- Replace deprecated `word-break: break-word` on .dm-terminal-logs
  with the modern equivalent (overflow-wrap: anywhere + word-break:
  normal).
- Guard loadContainerLogs with a request sequence so stale responses
  from a previous container selection cannot overwrite the Logs
  panel after the user has switched selection.
- readContainerLogs now requires the requested container to be
  managed by this launcher (i.e. present in
  docker.listContainers(imageRepo)). Without this, the IPC boundary
  would expose logs of any container whose id happened to be
  guessable. Returns INSTANCE_NOT_FOUND otherwise.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@TerminallyLazy
TerminallyLazy marked this pull request as ready for review June 6, 2026 14:16
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.

1 participant