Skip to content

Desktop shell: remote workspace — chat and read-only terminal #806

Closed

Description

@alexeyzimarev

Problem

With visibility (#708 → #799) and control (#805) in place, a remote session still has no workspace in the desktop app: its transcript and terminal are only reachable in the web UI. This issue is delivery slice 3 (§9.3) of the spec at docs/superpowers/specs/2026-09-06-ai2371-desktop-remote-daemons-design.md (also posted on AI-2371). Blocked by #805, which ships the card host, the session authorization lifecycle, and the chat-pane decoupling this slice builds on.

Scope

  • Chat read path: seed from GET /api/sessions/{id}/detail, live-tail via hub SubscribeToStream (the Eventuous SignalR protocol — reference Eventuous.SignalR.Client rather than re-deriving it), rebuild turns client-side through an adapter feeding the existing chat item view models, resolve attribution via hub ResolveAttribution. The adapter is the natural first consumer of the canonical-transcript converters (Make Core the single home of transcript normalization #679) — build it as its own unit so those slot in. Queued input from SubscribeToChat + PendingInputChanged. Optional polish: SubscribeToAcpEphemeral live deltas (no client consumes them yet).
  • Chat write path: the composer sends hub SendUserInput(agentId, text, attachmentIds?) instead of PTY stdin.
  • Read-only terminal: SubscribeToTerminal (server replays its ring buffer), dimensions locked to the source, viewport reported via RequestResizeTerminal and released on close (never send the (0,0) sentinel), scrollback cleared before a re-subscribe replay, input limited to the fixed special-key set plus the composer.
  • Authorization signals for the transcript/terminal surfaces: the throwing surfaces are the oracle; the silently-denying terminal subscribe is attempted only after session access is established, so empty renders as "no output yet", distinct from loading and denied; watches and subscriptions re-establish per reconnect.
  • Origin-transition rebinding: an open workspace binds to the logical row, tears down and rebuilds origin-bound adapters on a Local↔Remote transition, never falsely ends a live session, and routes in-flight actions visibly.

🤖 Generated with Claude Code

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions