Skip to content

feat: prepare 0.2.0 with local terminals and latest DSH support - #8

Merged
HeftyKoo merged 13 commits into
mainfrom
support-cli
Sep 29, 2026
Merged

HeftyKoo merged 13 commits into
mainfrom
support-cli

Conversation

@HeftyKoo

@HeftyKoo HeftyKoo commented Sep 21, 2026 •

Copy link
Copy Markdown
Owner

Summary

AgentOnWeb 0.2.0 adds a real local shell alongside DSH, so users can run installed CLIs on their current website and switch workspaces without stopping their processes. Terminal views share input, follow the shell directory, support shared tab renaming, and reconnect to running shells.

  • Add Codex session status and completion/approval page notifications; approvals remain in the native terminal.
  • Add macOS + Chrome service/native-pairing/Codex setup, repair and uninstall flows.
  • Integrate the default branch's DSH stale-cookie authentication fix with multi-runtime delegation.
  • Align all packages at 0.2.0 and Safari at 0.2.0 / build 6; refresh English/Chinese READMEs, package guides, setup, architecture, privacy/support copy and changelog.
  • Publish the exact audited npm archives, with a terminal-host release workflow and version-pinned installer.
  • Install DSH via @latest; verify 0.1.7-rc.2 and add a CI job that installs npm latest and tests the actual packed plugin, native settings UI and iframe/API/WebSocket authentication. The old alpha.3 pin no longer installs reliably with current upstream transitive dependencies.

Validation

  • Complete local release audit: 41 files / 201 tests passed with the latest DSH HTTP bridge enabled, TypeScript/privacy/architecture, all browser builds, Safari WebKit manifest parsing, reproducible archives, isolated terminal install and real shell I/O.
  • Safari resources/demo/ZIP preparation passed.
  • Latest DSH: clean-profile installation of the actual 0.2.0 plugin, management/view APIs and Settings → AgentOnWeb rendered without page errors.
  • Chromium 147 + latest DSH: iframe 200, authenticated API/WebSocket, stale native cookie preserved, revocation clears delegation.
  • Terminal npm publish dry run, YAML parsing, Markdown relative links and diff checks passed.
  • CI must pass both verify and dsh-latest on this revision before merge.

Release boundary

This merges the release candidate; it does not publish npm packages, create release tags, deploy the public docs site or submit store builds. Final installer/setup/upgrade/uninstall and live Codex notification acceptance remain in the release checklist. Live terminal support is scoped to macOS/Chrome; other platforms are not implied by successful builds.

See docs/releasing.md and docs/verification/release-0.2.0.md for commands and remaining publication gates.

- Add packages/terminal-core: PTY lifetime, canonical terminal state,
  output snapshots, backpressure, single active input controller
- Add packages/terminal-host: shell launch, HTTP/WebSocket terminal
  server, pairing management, macOS service lifecycle
- Add apps/terminal-surface: xterm-based browser terminal with input,
  resize and selection
- Extend connector contract/host with terminal runtime descriptor and
  option tap
- Update extension connection coordinator, background and overlay for
  the terminal runtime path
- Add build/verify scripts, architecture doc and verification records
An iframe load event can describe the inherited about:blank document or
a CSP-blocked error document, so it cannot prove that the extension
wrapper document is actually running with the expected origin. Replace
the load-event readiness heuristic with a surface.wrapper-ready
announcement posted by the wrapper after it installs its presentation
buffer, validated by origin, source window, and nonce.

Also keep the placeholder iframe detached until a workspace is actually
requested, so mounting never injects a CSP-inheriting blank document
into the host page, and never reinsert a retained iframe whose browsing
context would be destroyed.
Replace the flat runtime-switch button row with a collapsible picker: a
stable trigger showing the active workspace icon and name, and an option
list that opens on click and closes on selection, blur, or Escape.
Activation is only claimed once the background confirms the new runtime,
metadata updates reuse existing option nodes so focus and the open state
survive unread markers and renames, and a fixed-geometry decode effect
plays on switches without resizing the dock.
…ons menu

Turn the terminal sessions select into clickable tabs that stay in the
header, and move status, control, paste-image, reconnect, and close into
an overflow actions menu that closes on outside pointer, Escape, or
button activation. Connection state now renders in a separate
non-live notice that hides once connected, so automatic retries neither
flash an intermediate status nor re-announce the same failure to
assistive technology. Session lists that no longer contain the current
id fall back to the first available session.
Replace the vertical icon strip with a fixed 48px launcher that expands
into a full controls panel: three mode cards with a sliding highlight,
an opacity slider that now disables outside chill mode, and a workspaces
view that swaps in when the runtime picker opens. Focus is managed with
inert instead of hidden, Escape layers from options to dock to shell and
restores focus to the launcher, and collapsing returns focus when it
lives inside the dock. The picker drops its focusout close now that
options are a view with an explicit back button, and unread output dots
render on both the launcher and the workspace trigger.
Allow every connected view to write to the same shell while limiting resize updates to the focused view. Remove manual takeover and image-paste buttons, handle clipboard image paste directly, and show each shell current directory on tab hover.
…bSocket

Session names now default to the shell's current directory (basename)
instead of a counter, and follow cd through a directory refresh that is
debounced to once per second of shell output and skipped entirely for
idle shells or manually named sessions. POST /api/terminals gains a
rename action (1-80 chars, no control characters, trimmed) and every
name change is broadcast to connected viewers as a session-names
message, closing the gap where background tabs kept stale titles.
… bar

Tabs can be renamed through a context menu (right-click, Shift+F10 or
Menu key), by double-clicking the name, or with F2. The dialog validates
input client-side and applies names without reconnecting. Tab titles
arrive via the session-names WebSocket message, so surfaces never poll
the terminal list while idle. The native title tooltip is replaced by a
positioned folder tooltip that stays out of the context menu's way, and
refreshSessions now reconciles tabs incrementally, preserving hovered
elements and scroll position across updates. Slimmer tab chrome keeps
wider directory names visible without layout shifts.
- Run every shutdown step through a shared cleanup() helper that
  aggregates failures instead of aborting on the first error, and
  report shutdown failures on stop signals with a nonzero exit code.
- Compare the launch token with timingSafeEqual like the admin cookie.
- Reject non-JSON or non-object POST bodies with a 400 error.
- Cover invalid launch tokens, malformed request bodies, and lock
  release failures during shutdown in the integration tests.
@HeftyKoo
HeftyKoo marked this pull request as ready for review September 29, 2026 02:28
@HeftyKoo HeftyKoo changed the title feat: add local terminal runtime with PTY-backed shells and web terminal feat: prepare 0.2.0 with local terminals and latest DSH support Sep 29, 2026
@HeftyKoo
HeftyKoo merged commit 96ec890 into main Sep 29, 2026
2 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