Commit Graph
149 Commits
Author SHA1 Message Date
Kaede Akino ff42e2603d Animate the Welcome prompt 2026-08-28 22:19:30 +08:00
Kaede Akino b4d52e08fb Float the status bar, and let a merge be undone
A Workspace is built by folding two together, but there was no single
move that took one back apart — you dragged each pane out to the
Navigator one at a time, and the last one could not be dragged out at
all, because a pane alone in its Workspace has nothing to detach from.
Separate Panes on a merged Workspace's row is the inverse of merge: one
Workspace per pane, in layout order, sessions untouched.

The status bar was a docked strip with a hairline above it, reading as
window chrome bolted under the content. It is a glass capsule now,
floating in the trailing corner of the pane it describes. It hugs its
text rather than spanning the width — a full-width bar over a terminal
covers whole lines of output, and the prompt is on the left — and stops
growing at `maxWidth` so a deep working directory truncates instead.

Floating means it no longer takes layout space, so switching to a
Workspace stops resizing the content area. It also means it sits over the
pane, so the command generator and the upload notices now clear it by
`StatusBar.overlayClearance` — a constant rather than a measurement, and
applied whether or not the capsule happens to be showing, because a
notice that moves depending on whether a transfer is running is worse
than one that is always in the same place.

844 tests pass.
2026-08-28 21:59:50 +08:00
Kaede Akino 376a9384be Name the window, and stop the toolbar resizing it
Three fixes and a feature, all in the titlebar's blast radius.

A toolbar with nothing in it is shorter than one holding a search field,
and AppKit takes the window's content up with the titlebar when it
shrinks. Connecting to a host from the sidebar changes the destination
from Vault to a Workspace, which swapped a Find field for nothing — so
the connection journey appeared and immediately jumped upward. The find
item now reserves its height at zero width on destinations with nothing
to search, so the toolbar is one size everywhere.

The search field lost the keyboard after one letter because being
searched is not a passive act: Ghostty focuses its terminal surface when
a `search:` binding runs, and the SFTP list is held focused
declaratively and takes it back when filtering rebuilds the rows. The
field now checks, immediately after a text change, that it still has the
keyboard — and only then, so clicking away deliberately still works.

Folding Pinned or Chats crashed. The expansion flag lived in the list
item, so folding changed that item's value, and ListViewKit answered by
reconfiguring the header's hosting view — replacing the root view of the
Button still dispatching the click. The row reads and writes the flag
itself now; the item carries only the count, so a fold adds and removes
conversation rows and never touches the header.

The titlebar names what is in front: the page, the Workspace, or — in
the Assistant — the conversation, because "Assistant" is where you are
but the chat is what you want to read from across the desk. Welcome is
named after the app. Resolved through a catalog of providers rather than
a switch in WindowModel, so the window does not have to know that a
Workspace is named after its host; the same shape ContextPanelDetailCatalog
already uses.

842 tests pass.
2026-08-28 21:46:13 +08:00
Kaede Akino dc5ed75c0e Move find and creation into the window toolbar
The window had no toolbar at all and four competing Find fields: a strip
on each Vault page, a bar inside the SSH pane, a field in the SFTP path
bar, and the sidebar footers. Which one Command-F meant depended on where
the caret happened to be, and two could be on screen at once.

There is now one native NSSearchField in the titlebar, pointed at whatever
content is in front — see WindowModel.findKind, which resolves a split
Workspace to its focused pane rather than to "any session in it". Creation
verbs sit opposite it in a Notes-style square.and.pencil control, chosen
from the main content and never from the sidebar mode. The dashed New
tiles and the page toolbars are gone; the card canvas answers a right-click
with the same verbs, scoped to the section under the pointer.

Return and Command-G used to disagree about which way a terminal search
walks. Both now mean Ghostty's .previous, which is the direction that finds
matches when a search starts at the bottom of the buffer.

The sidebar's own bottom search stays, because it narrows the sidebar's
list rather than the content in front. Its three history modes are one card
with four fillings on one list technology, so their edges line up and
opening a host no longer makes Recents jump under the pointer. Every row
draws its right-click menu natively and outlines itself on the filled
shape; SwiftUI's contextMenu highlighted the row plus its margin.

Fixes found along the way:

- The terminal re-claimed first responder on every SwiftUI update, so
  typing in any field outside the pane lost the caret after each keystroke.
- Folding Pinned/Chats reconfigured the header's hosting view from inside
  the click that asked for it.
- The Assistant's drop container cached the dragged id from a render pass
  AppKit's modal drag loop can start before, hiding the insertion line.
- The host chooser inferred sheet-vs-column from the front destination, so
  the sheet raised from the Snippets shelf over Vault never dismissed, and
  it had no height to show a host in.

Steering, the composer and the two composer popovers now share one glass
surface. Tags are derived from hosts, so deleteTag goes with the popover
that called it.

838 tests pass. The visual claims are unverified: screencapture returns
black frames in this environment.
2026-08-28 21:22:46 +08:00
Kaede Akino e263edca68 Animate Vault detail editors 2026-08-28 18:16:36 +08:00
Kaede Akino 914911ca9a Animate assistant sidebar navigation 2026-08-28 18:09:02 +08:00
Kaede Akino 998154053a Refine assistant sidebar transitions 2026-08-28 17:53:27 +08:00
Kaede Akino da849b2e1f Remove workspace header add button 2026-08-28 17:43:34 +08:00
Kaede Akino a3745f4812 Improve workspace and assistant drag sorting 2026-08-28 17:37:19 +08:00
Kaede Akino 86951641e4 Refine shared sidebar modes and history 2026-08-28 16:19:34 +08:00
Kaede Akino dbcb2cc60c Smooth agent streaming output 2026-08-28 16:19:34 +08:00
Kaede Akino 4cf7cceb48 refactor: restore native sidebar controls 2026-08-28 16:19:33 +08:00
Kaede Akino aae0923e37 fix: keep pane drag alive into workspace sidebar 2026-08-28 16:19:33 +08:00
Kaede Akino 8d323ab649 refactor: move workspaces into sidebar 2026-08-28 16:19:33 +08:00
Kaede Akino 7623612709 Refine sidebar layout and window chrome 2026-08-28 16:19:32 +08:00
Kaede Akino eee35f764f Refine transcript elasticity scope 2026-08-28 16:19:32 +08:00
Kaede Akino e26f79fd65 Polish assistant sidebar interactions 2026-08-28 16:19:32 +08:00
Kaede Akino acbc488d51 Refine assistant transcript behavior 2026-08-28 16:19:31 +08:00
Kaede Akino e0f8ad80e7 Refine native sidebar visuals 2026-08-28 16:19:31 +08:00
Kaede Akino d5a89a8590 Replace local web search backend 2026-08-28 16:19:30 +08:00
Kaede Akino 5ae04bff59 Add elastic ListViewKit lists 2026-08-28 16:18:44 +08:00
Kaede Akino 75a23ebe7f Adopt ListViewKit for assistant transcript 2026-08-28 16:18:44 +08:00
Kaede Akino d8ac6442d0 Rewrite Markdown rendering with MarkdownView 2026-08-28 16:18:43 +08:00
Kaede Akino 9f3b0efeed Fix blank Assistant transcript during runs 2026-08-28 16:18:43 +08:00
Kaede Akino 1f0a1945d4 update command generator picture 2026-08-28 02:18:56 +08:00
Kaede Akino bb0acd11e1 feat: redesign SFTP browser 2026-08-28 02:08:12 +08:00
Kaede Akino 3b959e1dc2 Collapse live Assistant work in sidebar 2026-08-27 23:37:03 +08:00
Kaede Akino 2f8b3426b7 Fix stale SSH secret handles 2026-08-27 22:49:09 +08:00
Kaede Akino e36f470917 Preserve Assistant navigation state 2026-08-27 22:35:15 +08:00
Kaede Akino 5641a28841 Fix CloudKit environment migration 2026-08-27 21:36:44 +08:00
Kaede Akino 3dfaac3ebd Add key names to authorized key exports 2026-08-27 21:01:10 +08:00
Kaede Akino ec7be10c6a Fix App Store sandbox entitlements 2026-08-27 19:55:16 +08:00
Kaede Akino 114ae49f40 Declare exempt encryption usage 2026-08-27 19:38:32 +08:00
Kaede Akino b24e2672f8 Add app privacy manifest 2026-08-27 18:47:02 +08:00
Kaede Akino 15240a413c Replace help link with product support 2026-08-27 18:03:57 +08:00
Kaede Akino a79cd2844b Refresh Termind application icon 2026-08-27 18:03:38 +08:00
Kaede Akino 2073ea8283 Add deterministic website screenshot demos 2026-08-27 18:03:29 +08:00
Kaede Akino 12f07de3ed Expand repository ignore rules 2026-08-27 18:03:20 +08:00
Kaede Akino 57ac06217d Add Termind application icon 2026-08-27 16:23:38 +08:00
Kaede Akino 0191db5447 feat: support attachment-only messages and context opening 2026-08-27 15:57:03 +08:00
Kaede Akino 4caf472558 Persist client MCP configuration 2026-08-27 15:27:26 +08:00
Kaede Akino 8c2dae2a94 Refine MCP tool access controls 2026-08-27 15:13:11 +08:00
Kaede Akino a2e64cd6fb refactor agent tool detail presentation 2026-08-27 14:47:10 +08:00
Kaede Akino 39d1285cf8 Add SSH host key confirmation for agents and MCP 2026-08-27 14:31:05 +08:00
Kaede Akino c8229ff645 Improve Simplified Chinese tool presentation and localization 2026-08-27 14:13:54 +08:00
Kaede Akino af0dd561e2 Refine settings localization 2026-08-27 13:17:53 +08:00
Kaede Akino 5f863443ba Reset persistence to fresh schema baseline 2026-08-27 12:41:14 +08:00
Kaede Akino 2cfa92adb4 Improve Compact Rows Chinese translation 2026-08-27 12:29:10 +08:00
Kaede Akino 1367471528 Rename Command Composer to Command Generator 2026-08-27 12:15:35 +08:00
Kaede Akino 8b44c98d3c Improve Chinese localization and plural handling 2026-08-27 12:11:29 +08:00