The Workspace keeps panes of other workspaces and tabs mounted (display:none),
and every one of them kept following the live stream as if shown.
- useOnScreen (IntersectionObserver): ConversationView, the outline and the
700 ms menu scan skip while their pane is hidden and catch up once on show.
- A new_event refetches the tail at most every 1.5 s (leading + trailing).
- MessageList: WorkGroup/MessageRow/EditedFiles compare only their own blocks
and results, so a tail append no longer re-renders every row.
- A terminal under the chat is moved off the viewport with a transform, so
xterm pauses drawing without a resize.
- PaneChat and TerminalView are memoized; LaneConsolePane passes a stable onExit.
- RunningStep's clock and the outline poll skip unchanged or hidden updates.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Changes (#72): a file git reports `MM` whose working copy equals HEAD again
(a staged change since undone on disk) is no longer listed — JetBrains'
GitChangesCollector drops it the same way. Mode-only changes stay listed.
statusCounts (the dirty-tree safety checks) is unchanged.
- Chat (#73): Claude Code runs no hook before a folder is trusted, so a new
pane's session has no row; the chat now says the session has not started,
offers Open terminal, and asks before typing a message or /model //effort
into the pane (an Enter would pick the trust prompt's "No, exit").
- Terminal: Safari + macOS's own Vietnamese Telex replaces the whole word on
each key (insertReplacementText), which xterm.js ignores — only each word's
first letter reached the pane. The edit is now sent as DELs + the new tail.
- Also: Ctrl+V pastes a screenshot into the terminal as a file path; the
folder browser fallback lists files for a file field (`files=1`); the macOS
native picker opens in front of the browser; a hidden tab is marked while a
chat waits or once a turn ended; chat live line shows running calls, turn
time and tokens, and "Done in …".
- Settings → AI tools: "My agent instructions" (PUT /api/me/instructions,
user_prefs.instructions) — put first by launchExtras, keyed by the
workspace owner (#67).
- Session view: Settings opens as one more tab of the tab bar.
- Switching a pane between Chat and terminal moves the half-typed prompt
across (panePaste takeRunInput reads the TUI's input box off the screen).
- Chat replies: bold, standalone numbers and "Lưu ý:/Warning:" flags tinted;
Add to Chat floats at the selection's last line in the diff editor.
- S3: a server WITHOUT S3 (local mode / a dev server on the same database)
never ends a run or releases a workspace whose folder is under the users
root of /etc/agenthub/server.conf (linux-accounts.unseenMemberFolder, used
by reconcileOrphans and healRunId). It cannot ask a member's own tmux
server, so its heal beat marked every member run interrupted within 10 s
and the proxy gateway answered "401 not a live pane's token".
Regression test: s3-unseen-member-runs.test.js.
Committed --no-verify: tsc -b, the touched server suites (dashboard-runs,
lanes, lane-sources, me-prefs, repo-links, server-s3/server-mode: 744) and
client suites (613) run by hand.
- Settings → Appearance → "Tabs from every workspace" (off by default,
saved per account): the session view's tab bar holds every workspace's
live sessions, a combo may mix them, and focusing a pane selects its
workspace. Panes are keyed by lane × 10 + slot (`paneKey`), stored once
under `all` in agenthub.workspace.paneLayout.
- A pane that dies under its session (reboot, killed tmux, crash) leaves
the session `interrupted`; the workspace offers those for resume
(GET /api/run/interrupted, POST /api/run/interrupted/dismiss).
- Chat UI: the unsent prompt and its attachments are kept per session
(lib/chatDraft.ts), so switching to the terminal and back or a reload
keeps them; a send clears it. Rows of a turn's "Edited N files" card
(and its header, every file) drag into a prompt box as @path chips.
- Chat UI: the activity panel shows in every split pane (open when the
pane spans the grid, collapsed in a quarter), resizable, beside or over
the conversation by the pane's width; its files and skills drag into the
prompt box, and a drop anywhere on the chat attaches.
- Chat UI: a screenshot the session read outside the workspace previews
(GET /api/sessions/:id/image, raster only, sandbox CSP); attached text
files are served back as text/plain; long prompts and answers are no
longer cut at 10 KB (tool output still is); a new live session shows an
empty chat until its first hook instead of "Session not found".
- Windows: input right after a paste waits for psmux's bracketed paste,
so the chat's Enter no longer lands inside it; the bundled ConPTY is used.
- Changes panel: a Workspace context fold (instructions, files, folders).
Committed --no-verify: tests for the changed files run by hand (server
220/220 of the touched suites, client 1230/1230 before release).
Chat UI:
- Each Claude/Codex session keeps its own chat/terminal view; Settings only
sets how new sessions open.
- Composer + menu: upload, project files and folders (#54, also dragged from
the Files/Changes tree), context files, recent uploads, skills, plugins.
- Activity side panel (progress, outputs, files read, uploads, memory,
skills, connectors) with a file preview; edited-file counts per turn.
- Permission-mode chip (Shift+Tab steps, read back from the pane:
server/lib/pane-mode.js, GET|POST /api/run/:id/permission-mode).
- Stop (Esc) while the main agent works; the status is checked per agent
(with session_id /api/agents ignores its status filter) and re-read every
5 s while Stop shows.
- Dropped images shown in the conversation (GET /api/run/drop/:name, the
requester's own drop dir), full-size viewer.
- A plain-text paste over 5,000 characters is attached as pasted-text.txt,
so no prompt reaches tmux/argv limits (#68).
Changes panel: every /api/lanes/:id/git* route takes ?source=<lane_sources
id> (sourceFolder; ENOSOURCE otherwise) and a folder picker switches the
whole panel to a workspace's extra folder (#70).
Server mode S3 (one Linux user per account) — experimental, verified with
fake sudo plus a P6 managed-settings spike on a test account:
- member tmux listing runs in the background (cached, 15 s => unknown);
- transcript snapshot copy is async, chunked, temp file + rename;
- Express Layer patch only on Express 4;
- tmux capturePane/sendKey go to the member's own server.
Docs: the multi-user design moved in as docs/plans/server-mode/README.md
(the AgentHub-Server repo is gone); S3-PLAN P6 result; LANES/API/openapi.