Renaming the second workspace was the mechanism, not the news: what
matters is that this document already produced a workspace, so importing
it here copies it instead of updating it. The plan says that outright,
names the workspace, and does it on key overlap rather than on the name —
so it holds after either side has been renamed, and stays quiet when the
import is merging into that very workspace.
Plan notes carry a level so the ones worth a second thought read as
cautions, and the destination row gets its "new" chip back.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
"Name 2" reads as part of the name; "Name (2)" reads as the second one.
The destination row leads with "New workspace ·" rather than trailing a
second parenthetical after it.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The row read "New workspace" no matter what the import was about to
create, which matters more now that the name can come back numbered.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
An imported OpenAPI document brings a base environment plus one per
server, and they landed as loose rows at the top of the tree with no way
to take them as a set. They can't nest under anything real — a
sub-environment is a sibling of the base one, not its child — so a
heading groups them and its checkbox turns the set on and off.
The tree's rows are now either a plan item or a heading, which is what
the destination workspace has always been: it no longer has to pose as a
plan item with an invented action and selection.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
A parent's checkbox covered creates and updates but skipped deletions and
local-edit reverts, so a folder holding only those got no checkbox at all
and the ones it did get moved a subset of what sat under them. The labels
already mark destructive rows, so a parent now carries everything beneath
it that has a checkbox of its own.
Checking a row also brings in the folders it needs, which is the same rule
read upwards and leaves nothing to disable: a resource can no longer be
checked inside a folder that will not exist.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
"Not imported" was two words in a column of one-word states, and it read
as a description of this run rather than the standing decision it is.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Sorting put folders first and swept environments in with the requests, so
the two environments an OpenAPI import creates landed underneath every
folder in the document.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
A row marked "edited" or "conflict" gave no way to tell what actually
differs, so a resource that drifted from the file — however it drifted —
reads as an unexplained accusation. The plan now carries the field names
the source and the local copy disagree on, and the row's tooltip lists
them.
The preview's primary button also read "Apply" when the current selection
would change nothing. It now reads "Done", since committing an empty
selection only records the decisions made in the preview.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The conflict row's segmented control ran at the default size with the help
icon floating outside the group. Drop it to the smallest button size and
hand the help to the control, which shows it in its last option whenever
the label is hidden — the only case where the label has nowhere to put it.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Yaak now remembers, per item of a linked import source, whether the user
wants it. A mapping row that still points at a model means wanted, so
re-imports merge into it; a row with no model behind it means not wanted,
so re-imports leave it alone. Wanted-ness is structural rather than a flag:
deleting the model locally, or turning the item down in the preview, is
what makes it not wanted.
- import_source_resources drops `snapshot` for a nullable `content_hash`
and lets `model_id` be NULL. The migration keeps every beta row's
key to model mapping and starts hashes empty; until a hash is recorded,
a difference can't be attributed to either side, so the item is offered
once as a conflict that keeps local changes.
- comparable() ignores sortPriority. Importers number it from source
order, so inserting one operation used to plan a fake update for
everything after it. The trade is that pure reorders don't propagate.
- Keys the user turned down come back as unchecked "not imported" rows
instead of being re-offered as new resources or resurrected. Checking
one imports it under the same source key and pulls in the folders it
needs.
- An imported resource the source moves into a folder that isn't imported
is offered as a deletion, with a tooltip pointing at the folder.
- Plan-time source resolution binds by source-key overlap instead of by
path, so a renamed or moved file merges into what it created and heals
the stored origin. Several sources sharing keys never guess-merge: the
plan says so and imports everything as new.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
A "Write with Siri" pill appears over empty editors on the macOS 27 beta,
because Codemirror's contentDOM is a contenteditable like any other. The
`writingsuggestions` attribute opts an editable element out, and setting
it here covers every editor at once.
If the pill turns out to be separate from writing suggestions, the
remaining lever is WKWebView's writingToolsBehavior, which would disable
Writing Tools for the whole window.
It has never had an onSelect. Introduced inert in #193 and carried
through the codebase split, so clicking it only ever closed the dropdown.
Reload Schema in the message editor's schema dropdown does the job it
looked like it was for.
The web build bound Cmd/Ctrl +, - and 0 and then did nothing with them, so zoom appeared broken. Those keys are the browser's own page zoom, which scales the whole page and remembers it per site.
Adds an interfaceZoom capability: true on desktop, where the host zooms the webview, false in a browser. When false the app binds nothing and the hotkeys screen drops the three rows it can't configure.
Adds a chevron on pair editor name and value inputs that opens the same options as inline autocomplete, so suggestions can be found by clicking instead of only by typing. Long values like User-Agent show a short label but insert the full string.
Row action menus move to a vertical ellipsis so the chevron only ever means "pick a value into this field".
Also restores the per-worktree Tauri config handling in run-dev.mjs, which a merge on the branch had reverted.