feat(keyboard): add clipboard AI skills, hint keywords, and voice session fixes

Idle chips show entities with category icons; a fresh copy surfaces Reply/Summarize/Translate; abort/cancel/empty-tap no longer leave the mic stuck.
This commit is contained in:
Rocky
2026-08-13 15:47:32 +08:00
parent 9f308fadd2
commit 631617ee53
48 changed files with 1627 additions and 345 deletions
+9 -11
View File
@@ -12,19 +12,21 @@ final class AIHintPoolTests: XCTestCase {
XCTAssertEqual(AIHintLocaleResolver.packLocale(preferredLanguages: ["en-US"]), "en")
}
func testClipboardWindowForcesOnlyClipboardCards() {
func testClipboardWindowNeverPutsClipboardCardsInCarousel() {
let pack = AIHintPack(
locale: "zh",
cards: AIHintLocalCatalog.cards(locale: "zh")
)
let recent = ClipboardHistoryEntry(text: "hello", createdAt: Date())
let cards = AIHintPool.activeCards(
pack: pack,
clipboardHistoryEnabled: true,
newestClipboard: recent
XCTAssertTrue(
AIHintPool.isClipboardSkillWindowActive(
clipboardHistoryEnabled: true,
newestClipboard: recent
)
)
let cards = AIHintPool.activeCards(pack: pack)
XCTAssertFalse(cards.isEmpty)
XCTAssertTrue(cards.allSatisfy(\.requiresClipboard30s))
XCTAssertTrue(cards.allSatisfy { !$0.requiresClipboard30s })
}
func testClipboardDisabledDropsClipboardCards() {
@@ -32,11 +34,7 @@ final class AIHintPoolTests: XCTestCase {
locale: "zh",
cards: AIHintLocalCatalog.cards(locale: "zh")
)
let cards = AIHintPool.activeCards(
pack: pack,
clipboardHistoryEnabled: false,
newestClipboard: ClipboardHistoryEntry(text: "hello")
)
let cards = AIHintPool.activeCards(pack: pack)
XCTAssertFalse(cards.isEmpty)
XCTAssertTrue(cards.allSatisfy { !$0.requiresClipboard30s })
}