Commit Graph
2745 Commits
Author SHA1 Message Date
Gregory SchierandClaude Opus 5 a73cb245ea fix(import): close three holes found in review
Checking an ignored folder selected every deletion beneath it, including
the one the folder caused: a resource the source had moved into it was
offered for deletion precisely because the folder was not imported, so
checking the folder deleted the resource instead of keeping it for the
move. A checkbox that means "keep these" can never mean "delete that".

Binding a re-import to a linked source took a single shared key as proof,
and two API documents naming one operation the same way is not proof —
that let an unrelated import remap onto somebody else's resources. A
document keeps its keys, so it now has to account for most of both sides,
and only against a source from the same importer.

A key the user turned down was forgotten as soon as the source stopped
listing it, so the question came back the next time the source did. The
row outlives the absence.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-10 10:05:16 -07:00
Gregory SchierandClaude Opus 5 b6818b4f52 fix(import): trim the already-imported warning
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-10 09:36:55 -07:00
Gregory SchierandClaude Opus 5 3084882829 fix(import): say where a document was already imported, and to what
"Already imported" left the reader to guess what had been compared —
names, paths, contents — when the answer is the source keys, the same
overlap that decides whether a re-import merges. The title now names the
workspace holding it and the detail says what importing here would do.

The destination row also stopped wedging the kind and the name into one
value: the row's label carries the kind, so the value is just the name.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-10 09:31:50 -07:00
Gregory SchierandClaude Opus 5 0f939a5a03 fix(import): raise the preview's notes above the tree, as banners
They sat under a long scrolling tree, below the fold on any real import,
which is a poor place for "you are about to make a second copy of this".
Each note is a Banner now, tinted by its level, and the "Import details"
heading goes away with them — a banner needs no introduction.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-10 09:17:55 -07:00
Gregory Schier 3e5754338b Merge branch 'main' into import-remember-selection 2026-09-10 09:14:51 -07:00
gschier 89ce84cefe Deploying to main from @ mountain-loop/yaak@d5d2a64c32 🚀 2026-09-10 15:37:06 +00:00
Gregory SchierandClaude Opus 5 b22a5bbcad fix(import): make the preview's tooltips agree with each other
They had drifted into three voices: statements of fact, an instruction,
and one that named "the file" for an import that may well have come from
a URL. Each now says what happened and, where a checkbox does something
irreversible or surprising, what checking it does — with "here" for the
workspace and "the source" for whatever was imported.

"Added since the last import" was also untrue on a first import, where
there was no last import to speak of.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-10 08:28:38 -07:00
Gregory Schier d5d2a64c32 fix(cli): focus the agent skill description on when to use it (#625) 2026-09-09 08:50:26 -07:00
Gregory SchierandClaude Opus 5 213458b60c feat(import): warn that a document already has a workspace
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>
2026-09-08 08:56:44 -07:00
Gregory SchierandClaude Opus 5 cdc034b25a fix(import): parenthesize the number on a taken workspace name
"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>
2026-09-08 08:51:42 -07:00
Gregory SchierandClaude Opus 5 83f2606624 fix(import): name the new workspace in the preview's destination row
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>
2026-09-08 08:50:28 -07:00
Gregory SchierandClaude Opus 5 fd5cb448bb feat(import): number a new workspace whose name is taken
Importing a document into a new workspace twice left two workspaces with
the same name and nothing in the sidebar to tell them apart. The second
one becomes "Name 2", and the preview's details say so rather than
renaming behind the user's back.

The " Copy N" convention duplication uses would claim something was
copied, which is not what happened.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-08 08:45:40 -07:00
Gregory SchierandClaude Opus 5 33378741af feat(import): group the workspace's environments under one heading
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>
2026-09-08 08:39:04 -07:00
Gregory SchierandClaude Opus 5 0dbefd4283 refactor(import): give the preview one rule for what a checkbox carries
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>
2026-09-08 08:32:06 -07:00
Gregory SchierandClaude Opus 5 82ee025cd3 refactor(import): call a turned-down resource ignored
"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>
2026-09-08 08:27:17 -07:00
Gregory SchierandClaude Opus 5 a3e6afcdc9 fix(import): list environments above folders in the preview
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>
2026-09-08 08:23:14 -07:00
Gregory SchierandClaude Opus 5 64b9479deb fix(import): treat a pair's row ID as identity, not content
Headers, URL parameters, and environment variables each carry an `id`
that identifies the row to the pair editor. Importers leave it empty and
the editor stamps one in the first time it touches a resource, so merely
opening an imported request made the next import report it as locally
edited. `comparable` now drops `id` at every level rather than only the
top, since a row ID says no more about content than the model's own ID.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-02 11:31:12 -07:00
Gregory SchierandClaude Opus 5 6796569466 feat(import): say which fields differ, and stop offering to apply nothing
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>
2026-09-02 11:24:25 -07:00
Gregory SchierandClaude Opus 5 72d3bda769 fix(import): shrink the conflict control and fold its help inside it
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>
2026-09-02 11:13:19 -07:00
Gregory SchierandClaude Opus 5 bd932ce85f feat(import): remember the user's import selection
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>
2026-09-02 10:56:34 -07:00
Gregory Schier d2d4b80a09 feat(import): merge re-imports from a linked source instead of duplicating (#618) v2026.8.0-beta.1 yaak-api-0.9.0 2026-09-01 11:12:07 -07:00
Gregory Schier d461c982ec Don't block window creation on plugin runtime boot (#616) 2026-09-01 09:14:50 -07:00
Gregory SchierandClaude Fable 5 8eebee460e fix(pair-editor): remount the editor when its stateKey changes (#617)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-09-01 08:58:55 -07:00
Gregory SchierandClaude Opus 5 81a2a5d955 feat(import): add stable per-resource source keys to the importer contract (#614)
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
2026-09-01 08:11:54 -07:00
Gregory SchierandClaude Opus 5 e63a87718c fix(tooling): keep the formatter off generated files in every entry point (#615)
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
2026-09-01 07:40:42 -07:00
Gregory Schier 222ea9cb83 fix(editor): opt editors out of macOS Writing Tools suggestions
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.
2026-08-31 10:55:05 -07:00
Gregory Schier 360c098b09 fix(grpc): remove the dead Refresh item from the method picker
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.
2026-08-31 10:54:40 -07:00
Gregory Schier fce1039bac feat(grpc): generate an example message from the method schema (#613) 2026-08-31 10:44:31 -07:00
Gregory Schier f18f93d613 Stage imports before committing (#571) 2026-08-31 10:20:44 -07:00
Gregory SchierandClaude Opus 5 661a384bed Faster codemirror search match counting (#612)
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
2026-08-31 10:09:50 -07:00
Gregory SchierandClaude Fable 5 50cccf1d25 fix(auth-oauth1): sign with the token secret when no access token is set (#611)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
v2026.7.0-beta.9 v2026.7.0
2026-08-27 15:27:40 -07:00
Gregory SchierandClaude Fable 5 0aae516f3a feat(importer-openapi): fill the OAuth redirect URI from an environment variable (#610)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-08-27 15:27:36 -07:00
Gregory SchierandClaude Fable 5 b7b8ae5f94 feat(settings): add HTTP version as an inherited request setting (#609)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-08-27 15:01:02 -07:00
Gregory SchierandClaude Fable 5 6777003b70 fix(updater): check for updates on Linux deb/rpm installs and prompt manual download (#604)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
v2026.7.0-beta.8
2026-08-25 19:43:54 -07:00
Gregory SchierandClaude Fable 5 426c6d5eb6 fix(plugins): render template function config values before plugins see them (#608)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-08-25 19:19:15 -07:00
Ngo Quoc Viet 068afe325e fix(importer-curl): keep an = inside --url-query and form values (#606) 2026-08-24 21:14:37 -07:00
Ngo Quoc Viet cef1129d4b fix(template-function-json): escape control characters in json.escape (#607) 2026-08-24 21:14:14 -07:00
Ngo Quoc Viet 9a7bcf73bb fix(auth-oauth1): use the signing key as the PLAINTEXT signature (#605) 2026-08-24 21:13:57 -07:00
Gregory SchierandClaude Opus 5 aa76d501f0 fix(appearance): detect the macOS system appearance via NSApp.effectiveAppearance (#603)
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
2026-08-21 00:04:26 -07:00
Gregory Schier ce8cb5e7bc fix(environments): avoid opening dropdown with editor v2026.7.0-beta.7 2026-08-20 11:14:36 -07:00
Gregory Schier 66c13d7e13 Port OpenAPI improvements from the integration branch (#602) v2026.7.0-beta.6 2026-08-20 08:42:42 -07:00
Ngo Quoc Viet 388dd8815f fix(copy-as): emit shell-safe arguments in the curl and gRPCurl exporters (#593) 2026-08-20 08:41:47 -07:00
Ngo Quoc Viet cb295b7102 fix(importer-curl): keep --data-urlencode whole and survive a stray percent (#597) 2026-08-20 08:41:03 -07:00
Gregory Schier 4e835cf7e8 Add OpenAPI import round-trip harness (#600) 2026-08-20 07:44:15 -07:00
Gregory Schier 2350689d7a Import OpenAPI security the way Yaak inherits it (#601) 2026-08-20 07:39:18 -07:00
Gregory Schier 4eebd606ef Fix OpenAPI importer issues found by spec review (#599) 2026-08-20 07:16:44 -07:00
Gregory Schier c4f96f3f11 Create environments for OpenAPI server URLs (#590) 2026-08-19 12:45:32 -07:00
Gregory Schier 71c217d3f0 Populate OAuth credential variables during OpenAPI import (#587) 2026-08-19 08:43:17 -07:00
Gregory Schier d89831a84d Preserve OpenAPI security requirement semantics (#586) 2026-08-19 08:35:12 -07:00
Gregory Schier 3332ae263f Align OpenAPI 3.2 URL expectations with base URL variables (#594) 2026-08-19 07:42:54 -07:00