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>