Releases: tunaformac/TunaKit
Release list
TunaKit 1.22.0
- Added catalog item interaction callbacks for provider analytics when results appear, are
activated, disappear, or are successfully pasted. - Added
CatalogAsyncPreviewProviding.cachesAsyncPreviewso providers can opt out of Tuna's
in-memory preview cache when their content contract prohibits caching. - Added
CatalogInitialGlobalScopeandCatalogDeclaration.initialGlobalScopeso extensions can
keep newly discovered sources out of global search by default. - Added
CatalogItemPreview.init(animatedImageData:). Selected grid items and detail previews now
play supported animated image formats while other results remain on their first frame. - Documented
PasteboardDataProvidingandPasteboardDataRepresentationas supported public API
for copying non-text pasteboard flavors.
TunaKit 1.21.0
- Breaking:
CatalogDeclarationrequirespresentation:—.source,
.browseRoot(contents:),.liveSearch,.snapshot, or.hidden. The<id>.searchnaming convention no
longer pairs catalogs; declare a browse root explicitly. A root's contents must be a.sourceor
.snapshotcatalog of the same extension and may be claimed by one root only.
CatalogDefinitiongains a matchingpresentation(default.source). - Added optional
CatalogDeclaration.description/CatalogDefinition.description, shown under the
catalog's name in Settings → Sources. BrowseCatalogItem.catalogIcon(also on the deferred and scoped-search variants) and
CatalogIconColor.nsColorare public, so hosts can reuse a root's symbol and tint.- Added
ActionResult.cancelledfor user-cancelled actions that should finish quietly without
entering command history.
TunaKit 1.20.0
- Added independent
CatalogItem.searchKeysmatching and match-evidence metadata for result rows. - Added the
dynamicSearchCatalogEntrytype so provider-backed roots default to Search while
retaining Browse. - Expanded theme preview controls and result presentation support.
TunaKit 1.19.0
- Add on-demand catalog Quick Look
- Prepare Tuna 0.91 release
- Replace dictation label with timer
- Remove dictation recording limit
TunaKit 1.18.0
- Breaking: replaced the ambiguous
explicitTextValue()andtextValueFallback()helpers
with purpose-specific primary-content, text-input, automation, copy, and display representations.
TextValueProvidingcontent is preserved exactly instead of being trimmed during extraction. - Breaking:
SolverResultItem.textValuenow returns the unformatted result. Use
displayTextValue()orcopyTextRepresentation()when locale-aware formatting is wanted. - Added shared catalog-scan feedback and navigation-affordance symbols for themes.
SearchObjectRolenow conforms toHashablefor stable role-based SwiftUI identity.- Corrected
playTransitionvisibility to match its non-overridable extension implementation.
TunaKit 1.17.0
- Breaking:
Runnable.run(),RunnableWithInput.run(with:), and catalog action callbacks are
now async. Action callbacks are main-actor isolated. - Breaking:
RunnableWithInputnow requiresacceptsInput; the separate
ShortcutAcceptsInputmarker protocol was removed. - Breaking:
RunnableandCommandItemnow declareexecutionPolicyand
headlessEligibility, separating post-command presentation from whether a command may safely run
without the launcher interface. - Breaking: removed the parallel
AsyncRunnable,AsyncCommandItem, and
AsyncActionProvidingAPIs, along with runnable presentation hints and result-shape flags. Use
the unified async APIs and return the actualActionResultinstead. - Breaking: removed action initializers that accepted
Voidcallbacks, the title-derived
CommandIteminitializer,DefaultActionIdentifier,ThemePreviewViewModel, and the
ScoreResult.catalogIdentifiercompatibility spelling. Actions must return an honest result;
command IDs and result provenance are explicit. - Breaking:
CatalogActionandPredicateAwareActioninitializers no longer accept
type: .action; action instances always use.action. The raw
supportedSubjectTypeIdentifiersandallowedTargetTypeIdentifiersproperties were removed;
use their typedTypeIDcounterparts. AppLognow exposes stable entry identities and change notifications for live diagnostic views;
release builds retain a bounded in-memory history of warnings and errors.
TunaKit 1.16.1
- Fixed deferred browse entries without an explicit child presentation inheriting their catalog's
presentation instead of forcing a list.
TunaKit 1.15.0
- Added reusable direct OAuth PKCE configuration, callback parsing, and authorization-code token
exchange APIs. Extension connection declarations can opt in while existing brokered OAuth
declarations continue to use the Tuna web broker unchanged. - Added per-hierarchy grid presentation configuration and preview-first grid items, including
custom column counts, cell sizing, and spacing. - Added
CatalogLoadingItemfor host-rendered indeterminate loading states. - Added action target search scopes with optional on-demand loading or per-selection catalog
refresh, allowing extensions to keep dynamic target collections lazy and current. - Fixed
TextSnippetItemidentity collisions between snippets sharing the same display title.
TunaKit 1.14.0
- Extension declaration validation now rejects default and preferred action references whose
action IDs are absent from their declared action catalogs.
TunaKit 1.13.0
-
Breaking: catalogs are now two sibling kinds.
Catalogvendsobjectsand
is a source: it feeds subject and target search, carries a search priority,
and is listed in Sources. The newActionCatalogvends
actions: [CatalogAction]and is none of those things. It is not a refinement
ofCatalog, so a catalog that mixes items and actions can no longer be
written. See ADR 0006. -
Breaking:
ExtensionDeclarationgainsactionCatalogs: [ActionCatalogDeclaration].
Action catalogs must be declared there, never incatalogs.catalogsnow
defaults to[], so an extension may contribute only actions. Both kinds share
one identifier namespace. -
Breaking:
appActionEnrichmentsanddefaultActionRankingsmust reference
action catalogs. Naming a source catalog is a declaration error. -
Breaking: app action enrichment is purely additive. Naming an action
catalog for an app no longer removes it from anywhere else — it only orders it
for that app. Where an action applies is decided solely by
supportedSubjectTypesandsubjectPredicate. Extensions that mirrored their
actions through a search catalog to work around the old behavior should delete
the mirroring. -
Action catalogs have no scan lifecycle: no
scan(), noreportScanFinished(),
no retained-state release. They are built from anActionCatalogDefinition,
which carries only an identifier and a name — no enablement, advanced flag, or
settings. A setting that configures a verb belongs in the extension's own
settings. -
Added
ActionAvailabilityProviding, for an action that cannot run under
current conditions — its app is not installed, a permission was refused, it has
nothing to operate on. Unavailable actions are filtered wherever actions are
matched to a subject. This replaces the scan-to-empty signal that action
catalogs no longer have. It is read during search, so keep it cheap. -
Added
MainWindow.playTransition(_:duration:animations:finalState:completion:)
andMainWindow.AnimationDirection. Themes that need their own show/hide
animations can now add them to the content layer while TunaKit keeps owning
the transition lifecycle: superseding an in-flight transition, the
animationsEnabledbypass, and ordering the window out after a hide.
playShowAnimationsandplayHideAnimationsare wrappers over it and keep
their signatures;playHideAnimationsnow orders the window out itself when
the hide completes, so themes no longer have to.