feat(intents): add App Intents + Siri integration
All checks were successful
CI / build-and-deploy (push) Successful in 24s

Expose Marks to Siri, Spotlight, and Shortcuts via App Intents:

- BookmarkEntity (AppEntity + IndexedEntity, keyed on the Linkding
  server id) with a server-backed EntityStringQuery for live lookup
- Intents: Add, Open (OpenIntent), Search, ShowUnread, and an AI
  Summarize intent backed by ClaudeService; AppShortcutsProvider with
  spoken phrases; Siri snippet views and dialog
- SearchMarksIntent conforms to the system.search App Schema
  (@AppIntent(schema:), ShowInAppSearchResultsIntent) so it is
  executable by conversational Siri / Apple Intelligence
- IntentRouter bridges intents (run in the app process) to the SwiftUI
  scene for open/search navigation; widgets refreshed after adds
- Link AppIntents.framework so the metadata processor extracts shortcut
  phrases and validates the assistant schema

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Krishna Kumar
2026-06-16 16:10:17 -05:00
parent 8a27b692b8
commit 389d615c8b
9 changed files with 494 additions and 17 deletions

View File

@@ -57,6 +57,15 @@ struct SearchView: View {
}
.searchable(text: $searchText, prompt: "Titles, URLs, tags…")
.onChange(of: searchText) { _, _ in scheduleSearch() }
.onAppear { consumeIntentSearch() }
.onChange(of: IntentRouter.shared.searchRequest) { _, _ in consumeIntentSearch() }
}
/// Pulls a query handed over by `SearchMarksIntent` into the search field.
private func consumeIntentSearch() {
guard let query = IntentRouter.shared.searchRequest else { return }
searchText = query
IntentRouter.shared.searchRequest = nil
}
private var results: [Bookmark] {