Replace Send/Queue/Steer/Stop text buttons with compact icons, move Attach into the message box, and show the thinking level as a fill gauge. Keeps mobile layouts uncrowded while preserving accessible labels and the readable model selector.
Add per-role left accent stripes and color-coded header labels across
all themes. Lighten the dark theme user-message background, decouple it
from the generic hover color, and brighten the user border so user and
assistant turns are clearly distinguishable.
Add a dedicated "sending" activity indicator kind (warning color) so a
session uploading attachments is visually distinct from server activity.
Server activity propagates up to workspace/machine rows; client-side
sending does not, and the different color signals that to users.
Also extract sessionRowActivityKind as a pure, exported helper so the
"sending takes precedence, archived/cached-new never show" logic is unit
tested without rendering.
Replace the composer-local "Sending…" indicator with a single, consistent
state surfaced by the existing chat activity dock. The session controller
now owns the full attachment send lifecycle (including the folder-mode
upload + reference rewrite) and toggles an isSendingPrompt flag around it,
which the chat dock renders as "Sending your message…" until the real
server activity supersedes it.
This covers the pre-receipt dead zone (upload, server-side image resize,
first-session open) with one indicator instead of two, and keeps plain
text sends fire-and-forget.
Messages with image attachments could take a moment to appear (large
base64 upload, server-side resize, first-session open) while the composer
cleared instantly, making it look like nothing happened.
Await the send for attachment messages and surface a "Sending…" button
label plus a "Sending your files…" / "Saving your files…" hint, disabling
the composer until the message lands. Plain text messages stay
fire-and-forget so the input frees up instantly.
Support pasting (Ctrl/Cmd+V), drag-and-drop, and an Attach button to add
PNG/JPEG/GIF/WebP images to a message, with thumbnail previews and
multi-image support.
Attachments are delivered to the session using pi's native ImageContent
format and are run through pi's own resizeImage so they match pi's inline
image limits exactly. Image content now renders inline in the transcript.
A per-message delivery toggle also lets users save attachments into the
workspace `.pi-web/paste` folder and reference them so the agent reads
them with its own tools.
The accepted HTTP upload size is configurable via PI_WEB_MAX_UPLOAD_BYTES
or the maxUploadBytes config value (default 64 MB).
Closes#13
The workspace panel is already hidden at ≤1180px by responsive CSS,
so the expand/collapse toggle icon is meaningless there. Hide the
expand-panel-strip inside both media queries.
The desktop .shell.workspace-panel-collapsed selector had higher
specificity than the media-query .shell rules, causing horizontal
overflow at ≤1180px and ≤760px widths. Add matching collapsed grid
overrides inside each breakpoint.
- Change title/aria-label on both collapse and expand buttons to 'Toggle Panel'
- Right-align the expand-panel-strip so the toggle icon sits on the right
edge of the main column when the workspace panel is collapsed
Adds a chevron-right collapse button after the last tab (Files, Git,
Terminal, Info) in the workspace panel header. Clicking it hides the
workspace panel and lets the main chat column fill the full width.
When collapsed, an expand strip with a chevron-left button appears
below the context bar to re-open the workspace panel.
Changes:
- Add workspacePanelCollapsed boolean to AppState
- Add collapse button to WorkspacePanel header tabs
- Add expand strip with toggle button in main column when collapsed
- Adjust grid layout to hide panel and stretch main when collapsed
- Handle collapsed state at ≤1180px responsive breakpoint