feat!: save the environment terminal as the member image - #74
Merged
Conversation
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.
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.
Tools a member installs in the environment terminal now reach every agent run and workspace shell of that member.
What changed
aether env save) commits the running environment terminal container toaether/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.aether env reset) stops the terminal, forgets the image, and removes the member's saved tags.terminal.statusreportssaved_image; new control methodsenv.saveandenv.reset.docs/environments.md, plusenvironment-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 oldenv.*methods,neutral_image/standard_imageinserver.info, the--neutral-imageserver flag,aether env show|rebuild|rollback,aether image init,workspace init --standard/--image, andworkspace settings --imageare gone. The bootstrap image is no longer published.workspaces.image,env,setup_scriptand theenvironment_definitionstable (variables and setup script are backfilled into the environment JSON). Existing custom-image workspaces run on the standard image after upgrade. Migration v20 addsmembers.image.Verification
make fmt-check vet lint test test-scripts public-auditandmake test-integration(real Docker) pass.TestIntegrationMemberEnvironmentImagedrives the full flow over the wired server: install outside$HOMEin the terminal, run does not see it,env.save, run sees it, another member does not, reopened terminal starts from the saved image,env.resetremoves the tag and runs are back on the standard image.web/:bun run typecheckandbun run test(54 files, 516 tests) pass.