Commit Graph
200 Commits
Author SHA1 Message Date
Kaede Akino e744ab8a67 Rename SSH connection journey 2026-08-29 22:30:51 +08:00
Kaede Akino f5e240ea1b Appkit Transcript 2026-08-29 21:35:13 +08:00
Kaede Akino e2007627ba Refine Pro feature access and debug controls 2026-08-29 17:22:26 +08:00
Kaede Akino d9992427a8 Show focus rings only for keyboard input 2026-08-29 17:21:45 +08:00
Kaede Akino b43a9c75c3 Add Termind Pro purchase and secure trial 2026-08-29 17:04:40 +08:00
Kaede Akino 5f9dcfc9f1 Bump to 0.3.1 2026-08-29 15:55:21 +08:00
Kaede Akino 2a591d69bf change default baud rate to 9600 2026-08-29 15:53:38 +08:00
Kaede Akino 29702bae0e Show Settings focus ring for keyboard navigation 2026-08-29 15:53:05 +08:00
Kaede Akino cc22956a78 Submit single-choice user input immediately 2026-08-29 15:23:59 +08:00
Kaede Akino 099150cf0f Bump to 0.3.0 2026-08-29 15:23:59 +08:00
Kaede Akino 78494b64b6 Fix application shortcuts in terminals 2026-08-29 15:23:52 +08:00
Kaede Akino 3af56496a1 Use isolated system toolbar search 2026-08-29 13:40:40 +08:00
Kaede Akino 9e4175485f feat: add serial terminal sessions 2026-08-29 13:09:28 +08:00
Kaede Akino 74292a9135 Refresh terminal after view reparenting 2026-08-29 13:03:19 +08:00
Kaede Akino a6c4996006 Use system toolbar search presentation 2026-08-29 12:41:23 +08:00
Kaede Akino 858f4a4d73 Fix swift optmize bug 2026-08-29 11:48:03 +08:00
Kaede Akino 69d966e969 Bump to 0.2.0 2026-08-29 11:32:28 +08:00
Kaede Akino b2b87696a9 Show remote terminal title in menu bar 2026-08-29 11:15:29 +08:00
Kaede Akino 82ea7c35d0 Fix workspace number shortcuts in terminal 2026-08-29 11:06:45 +08:00
Kaede Akino 77391d73d9 Fix duplicate New Chat empty state 2026-08-29 10:52:22 +08:00
Kaede Akino 4c718a2c81 Redesign Quick Open command palette 2026-08-29 10:50:45 +08:00
Kaede Akino 2c8e02a137 Fix model picker hit area 2026-08-29 10:39:43 +08:00
Kaede Akino a8565579e2 Open status bar paths in current workspace 2026-08-29 10:36:20 +08:00
Kaede Akino 22acaa90ca Polish macOS theme integration 2026-08-29 10:31:43 +08:00
Kaede Akino 5e16b0688f Soften vault detail separators 2026-08-29 09:59:29 +08:00
Kaede Akino d8b92a681a Apply Liquid Glass to sidebar 2026-08-29 09:39:16 +08:00
Kaede Akino b5a527b28d Align clear history confirmation UI 2026-08-29 09:34:42 +08:00
Kaede Akino 52090b64a4 Display remote home paths with tilde 2026-08-29 09:30:28 +08:00
Kaede Akino 65f9c86666 Refactor agent tool definitions and registration 2026-08-29 09:03:27 +08:00
Kaede Akino b73c3d3bc0 Focus Welcome search with Command-F 2026-08-29 09:03:27 +08:00
Kaede Akino 0b5e6d463f Remove stale localization entries 2026-08-29 09:03:26 +08:00
Kaede Akino 9d02147995 Add persistent connection history 2026-08-29 09:03:26 +08:00
Kaede Akino 4c5f564b03 Fix web search test query 2026-08-29 09:03:26 +08:00
Kaede Akino 1a226daae4 Refactor workspace and sidebar architecture 2026-08-29 09:03:25 +08:00
Kaede Akino d669c2efac chore: remove unused code 2026-08-29 09:03:24 +08:00
Kaede Akino 6380c7c00a Match pane headers to connection journey 2026-08-29 03:35:51 +08:00
Kaede Akino d748ae2688 Add snippet package selection 2026-08-29 03:29:22 +08:00
Kaede Akino b1a4d9cc69 Fix assistant transcript row sizing 2026-08-29 03:24:17 +08:00
Kaede Akino 49a0dc37ca Add marquee selection to card managers 2026-08-29 03:22:24 +08:00
Kaede Akino 0c6d7619c1 Fix external authentication prompts and window chrome 2026-08-29 03:11:03 +08:00
Kaede Akino eb38db943b Remove managed card footnotes 2026-08-29 02:45:13 +08:00
Kaede Akino 13bcb198e5 Polish split pane chrome 2026-08-29 02:33:41 +08:00
Kaede Akino 7bc4a4e92e Keep toolbar search field stable 2026-08-29 02:17:36 +08:00
Kaede Akino ad73c5db5b Fix SSH and SFTP search focus 2026-08-29 02:09:17 +08:00
Kaede Akino 711c8b2fce Add scratch content search tool 2026-08-29 01:38:00 +08:00
Kaede Akino eb3a576a6d Refine settings sidebar selection 2026-08-29 00:49:16 +08:00
Kaede Akino a40d6da2ba Add collapsible snippet sidebar sections 2026-08-29 00:24:35 +08:00
Kaede AkinoandClaude Opus 5 865d92596d Fix the Pinned/Chats fold crash and the Journey's jump at connect
Two reports, both against 376a938, whose message claimed to fix them. Both
of its explanations were wrong. These two are measured.

Folding Pinned or Chats crashed with "No Observable object of type
WindowModel found". Not the mid-dispatch teardown the last two commits
described — deferring the write and freezing the item value were both
tried and both missed. Every list here hosts its rows in a bare
NSHostingView and injects only locale and colour scheme, so WindowModel
reaches a row purely by inheritance from an ancestor; ListViewKit parks
recycled rows in a reuse pool with no superview, and a fold detaches them
inside the very transaction the click started. A standalone harness
reproduces the trap verbatim in two shapes — a row configured before it is
attached, and a detached row re-rendering — and shows injection fixing
both. So each row's root now carries the window, the row empties itself
when it leaves the hierarchy, and the renderer takes the window as an
argument instead of reading @Environment from an AppKit callback.

The connection journey jumped upward the instant a connection succeeded,
and only with History open in the sidebar. That "only" was the clue, and
Kaede kept pointing at it: History is the one sidebar mode with a child
that demands height, and it appears exactly when status.isLive flips. Its
shell-integration banner used fixedSize(horizontal:vertical:), which
reports whatever height the sentence needs at whatever width it is asked
about — and SwiftUI asks about very narrow ones while sizing the column.
Ninety characters at a probe width wrap into a paragraph, the split view
adopts that as the height it must offer, and both columns are proposed it:
the detail column was handed 912x1125 instead of 912x688, which threw the
journey to y = -244.5 for one layout pass. A line limit bounds it.
Measured A/B/A on that one modifier: banner off, no inflated proposals;
banner on with fixedSize, 740 and 1125; banner on with lineLimit, none.

A second overflow of the same class, found while measuring and fixed here
too: the journey was a ZStack sibling of the terminal surface, so the pane
was as tall as its tallest child and a short pane reported 512 for a 440
proposal. frame(maxHeight: .infinity) passes that up rather than clamping
it. The journey is an overlay now — proposed the base's size, never
reporting one — so the terminal alone answers for the pane.

Not verified: the test suite was not run, and neither fix has been
confirmed by hand in the running app.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-28 23:51:04 +08:00
Kaede Akino 9b737c9e6d Let the status capsule collapse to its dot
Floating the status bar fixed it reading as chrome bolted under the
content, and created the problem floating always has: it sits over the
pane. On a terminal it covers the last couple of lines in that corner,
and the only way out was closing the session.

It collapses to its status dot now, and expands again on click. The
preference is app-wide and persisted, beside the sidebar's section flags:
how much of the pane you are willing to have covered is a standing
choice, not a property of one session.

Collapsed is the same capsule, not a second container. A capsule as wide
as it is tall is a circle, so the shape morphs instead of cross-fading
between two shapes, and both states run through one chain from
`capsule(_:)` down so radius, height and corner placement cannot drift
apart. The height is identical either way, which is what lets the command
generator and the upload notices keep reserving one constant clearance.

`StatusBarPresentation.collapsedGlyph` answers two questions at once —
whether the capsule appears at all, and what it shrinks to. Asking them
separately is how you end up with a capsule on screen with nothing to
collapse into. The connection wins over a running transfer: a transfer is
something happening, the connection is the thing you are looking at.

`transferGlyph` moves out of the private transfer button into its own
view for the one case where the collapsed circle is not a connection dot
— a transfer running with no session in front of it.
2026-08-28 23:09:37 +08:00
Kaede AkinoandClaude Opus 5 ccd539fb33 Let a webpage land in the scratch workspace
fetch returns a page through the conversation, bounded at 256 KB. So a
page larger than that could not be read at all — the tail was truncated
and there was no second call that would reach it — and a page you meant
to refer back to was paid for twice, once to read and again to quote
into a file.

scratch_pull already solved this for hosts: it lands a remote file in
the workspace and returns a size and a digest, which is what lifts
sftp_read's inline ceiling. The network had no equivalent. scratch_fetch
is that, and its bound is the workspace's own 8 MB per-file limit rather
than what fits in a reply — so a large page arrives whole and is read a
window at a time with scratch_read.

A separate tool rather than a scratch_path on fetch, on the same grounds
scratch_pull and scratch_push were split out of sftp_read and
sftp_write. The flag would decide the tool's Safety — locallyReadOnly
without it, locallyContained with it — and one descriptor meaning two
things is harder for a model to choose correctly and harder to audit.
fetch is unchanged, byte for byte, so nothing already in a conversation's
history changes meaning.

locallyContained is the sum of its halves: reading a page, public or
private-network, is what fetch already does un-gated and never escalates
for, and the landing site is storage the app owns. It therefore needs no
approval and stays available while planning, which is right — staging
the documentation you are planning against is planning. The result
carries the title, size and digest and no page text; the title is enough
to confirm the right page arrived.

Both paths are proven in preflight, so a bad URL or a destination that
escapes the scope costs nothing rather than a page fetched and dropped.
An empty extraction fails instead of staging a zero-byte file the model
would then try to read.

851 tests pass.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-28 22:56:19 +08:00