Skip to content

feat!: save the environment terminal as the member image - #74

Merged
ilovecrayons merged 9 commits into
mainfrom
feat/member-environment-image
Sep 5, 2026
Merged

feat!: save the environment terminal as the member image#74
ilovecrayons merged 9 commits into
mainfrom
feat/member-environment-image

Conversation

@ilovecrayons

Copy link
Copy Markdown
Contributor

Tools a member installs in the environment terminal now reach every agent run and workspace shell of that member.

What changed

  • Save environment (terminal dock button, aether env save) commits the running environment terminal container to aether/member-<id>:<unix-seconds> and records it on the member. Runs, workspace shells, and the terminal itself launch from that image; the standard image is the fallback.
  • Reset to standard (stop dialog, aether env reset) stops the terminal, forgets the image, and removes the member's saved tags.
  • terminal.status reports saved_image; new control methods env.save and env.reset.
  • Per-workspace Dockerfile environments and their build/verify/edit/rollback pipeline are removed, along with the neutral image, mirror/repo scans, the workspace Environment panel, and the onboarding Environment step. Workspace variables and setup script stay.
  • Docs rewritten: docs/environments.md, plus environment-home.md, terminal.md, quickstart.md, install.md, local-gateway.md, dashboard-frontend.md, harnesses.md, teams.md. Plan: docs/plans/2026-09-04-member-environment-image.md.

BREAKING CHANGE

  • workspace.image, the old env.* methods, neutral_image/standard_image in server.info, the --neutral-image server flag, aether env show|rebuild|rollback, aether image init, workspace init --standard/--image, and workspace settings --image are gone. The bootstrap image is no longer published.
  • Migration v19 drops workspaces.image, env, setup_script and the environment_definitions table (variables and setup script are backfilled into the environment JSON). Existing custom-image workspaces run on the standard image after upgrade. Migration v20 adds members.image.

Verification

  • make fmt-check vet lint test test-scripts public-audit and make test-integration (real Docker) pass.
  • New TestIntegrationMemberEnvironmentImage drives the full flow over the wired server: install outside $HOME in the terminal, run does not see it, env.save, run sees it, another member does not, reopened terminal starts from the saved image, env.reset removes the tag and runs are back on the standard image.
  • web/: bun run typecheck and bun run test (54 files, 516 tests) pass.
  • Adversarial review findings fixed in the last commit (stale tag sweep, Save button visibility after first Open, stop/reset overlap, dead scaffold code).

Workspaces no longer carry a custom or neutral image, and the server no
longer stores, builds, verifies, edits, or rolls back Dockerfile
environment definitions. Every container starts from the configured
standard image; a per-member saved image follows in a later commit.
Workspace variables and the setup script are unchanged.

BREAKING CHANGE: workspace.image and the env.* control methods are gone,
server.info no longer reports neutral_image or standard_image, the
--neutral-image server flag is removed, and the bootstrap image is no
longer published. Migration v19 drops the workspaces.image, env, and
setup_script columns and the environment_definitions table; existing
custom-image workspaces run on the standard image after upgrade.
Remove aether env show|rebuild|rollback, aether image init, the
--standard and --image flags on workspace init, and workspace settings
--image. The dashboard loses the workspace Environment panel, the
onboarding Environment step, the create-workspace image choice, the
"still building" run banner, and the mirror/repo/refine scan surface of
the local gateway. The profile scan and the environment terminal stay.

BREAKING CHANGE: the env and image CLI subcommands and the image flags
on workspace init and workspace settings no longer exist.
Each member now has an optional saved environment image. When set, agent
runs, workspace shells, and the environment terminal all start from it;
otherwise they use the standard image. A saved tag that has been pruned
from the runtime fails the launch with an error naming the tag and
aether env reset instead of silently falling back.

Migration v20 adds members.image. The runtime interface gains Commit and
ImageExists for the save flow that follows.
Add env.save and env.reset to the control channel and aether env
save|reset to the CLI. Save commits the running environment terminal
container to aether/member-<id>:<unix-seconds>, records it on the
member, and removes the previous saved tag, so everything a member
installs in the terminal reaches their runs. Reset stops the terminal,
forgets the image, and returns the member to the standard image.
terminal.status reports the saved image.
The terminal dock gets a primary Save environment button, a hint that
installs only reach agents after saving, and a Reset to standard option
in the stop dialog. The onboarding Agents step points at Save after the
agent install.
Rewrite the environments guide around the environment terminal and Save
environment, drop the per-workspace image, neutral image, scan, and
rollback documentation, and add the upgrade note for the removed
workspace image columns.
Drive save and reset over the wired server against real Docker: a file
installed outside the home is invisible to runs until env.save, visible
to the member's runs and reopened terminal afterwards, never visible to
another member, and gone again after env.reset. The coordination fixture
now pins its agent image as the standard image instead of a workspace
image.
Saving removed the previous member tag right away, which could fail a
run that had already resolved that tag but not yet created its
container, and a tag still held by a live container was never retried,
so tags accumulated. Save and reset now sweep every stale member tag and
leave tags the daemon refuses for the next sweep. Stopping a terminal
whose container was removed out of band no longer blocks reset. The
dashboard shows Save environment right after the first Open, reads
current status after the save round trip, and the stop dialog cannot
fire stop and reset at once. Dead image scaffold code is removed.
@ilovecrayons
ilovecrayons merged commit 3585244 into main Sep 5, 2026
6 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.

1 participant