merge: bring local uncommitted work onto the cloud-agent branch

Merges the wip/local-snapshot-20260901 safety commit (94 uncommitted files:
in-flight Account/Mac/Tip work, clipboard-semantics improvements, and the
feature-preview recording tooling) into the newer cloud-agent line.

Conflict resolutions:
- docs/*: honour the branch's deliberate removal in eac44da; drop the now
  dangling docs/archive/README.md that only pointed at the deleted files.
- CHANGELOG: both sides describe separate [Unreleased] features; keep both.
- ClipboardSkillSemanticRanker: take the branch's reply routing, which retires
  ranking playfulReply/acceptInvitation/... as separate skills in favour of
  ordinary/formal/playful variants inside one reply action. Keep the local
  link/phone/CJK-density work, which is orthogonal and still referenced.
- OfficialSkillCatalogTests: keep the local "installed exactly once" assertion;
  it matches the test's own comment and does not hardcode the default set.
- ClipboardSkillSemanticRankerTests: keep both sides' disjoint test functions;
  retarget the two link/phone cases at the branch's row, which no longer
  surfaces the retired specialised reply skills.

Verified: xcodebuild build succeeds and the 77 ranker/catalog/analyzer tests
pass.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-01 12:34:23 -07:00
co-authored by Claude Opus 5
79 changed files with 3459 additions and 1178 deletions
+59 -17
View File
@@ -143,7 +143,6 @@
"ai.responseLength.medium" = "Medium";
"ai.responseLength.detailed" = "Detailed";
/* v0.3.0: Detected app context labels */
"appContext.code" = "Code";
"appContext.email" = "Email";
@@ -353,6 +352,7 @@
"mac.hint.hold.leftOption" = "Hold left Option (⌥) to dictate";
"mac.hint.hold.eitherOption" = "Hold either Option (⌥) to dictate";
"mac.hint.holdOption" = "Hold Option to dictate";
"mac.hint.holdOption.compact" = "Hold Option";
"mac.settings.qwen3Model" = "Qwen3 model folder";
"mac.settings.qwen3ModelDesc" = "Folder with config.json, model.safetensors, vocab.json, and merges.txt.";
"mac.settings.qwen3Browse" = "Choose folder…";
@@ -392,9 +392,12 @@
"mac.onboarding.engine.subtitle" = "Start locally for privacy, or use your own cloud API for provider-based recognition and polish.";
"mac.onboarding.engine.localDesc" = "Private on-device recognition with Sherpa models. Falls back to Apple Speech until a model is installed.";
"mac.onboarding.engine.cloudDesc" = "Use your API key for cloud speech recognition and AI polishing.";
"mac.onboarding.cloud.title" = "Configure API access";
"mac.onboarding.cloud.subtitle" = "Pick a provider and add your key. This step is optional, so you can finish now and fill it later in Settings.";
"mac.onboarding.cloud.title" = "Configure speech recognition";
"mac.onboarding.cloud.subtitle" = "Pick a cloud speech provider and add your key. This step is optional, so you can finish now and fill it later in Settings.";
"mac.onboarding.cloud.skipHint" = "You can leave these blank and finish setup; cloud mode will ask for a key before use.";
"mac.onboarding.polish.title" = "Configure polishing";
"mac.onboarding.polish.subtitle" = "Pick the model provider used for polishing, translation and AI answers. Optional — you can fill it in later in Settings.";
"mac.onboarding.polish.skipHint" = "You can leave these blank and finish setup; polishing will ask for a key before use.";
"mac.onboarding.model.title" = "Prepare local recognition";
"mac.onboarding.model.subtitle" = "Download the basic Sherpa runtime and default model now, or skip and continue with Apple Speech fallback.";
"mac.onboarding.model.download" = "Download Default Model";
@@ -467,17 +470,56 @@
"settings.appLanguage.english" = "English";
"settings.appLanguage.chinese" = "Chinese";
/* Voluntary support tip (Consumable IAP — no feature unlock) */
"tip.title" = "Support the Developer";
"tip.body" = "OSGKeyboard is completely free with every feature unlocked. If you find it useful, you can leave an optional tip — it does not unlock anything extra.";
"tip.button" = "Tip %@";
"tip.buttonFallback" = "Send a Tip";
"tip.consumableNotice" = "Consumable in-app purchase. Tips cannot be restored (Apple policy).";
"tip.thankYou.title" = "Thank you!";
"tip.thankYou.message" = "Your support helps keep OSGKeyboard free and open for everyone.";
"tip.thankYou.past" = "You've supported us %lld time(s). Thank you!";
"tip.error.title" = "Purchase Failed";
"tip.error.productUnavailable" = "The tip product is unavailable right now. Try again later.";
"tip.error.pending" = "Your purchase is pending approval.";
"tip.error.unknown" = "The purchase could not be completed.";
"tip.alert.dismiss" = "OK";
/* Account — Mac account page (Sign in with Apple, credits, invitation link).
The account.* / account.referral.* keys below mirror the iOS app bundle so
the shared AccountSessionCoordinator error keys resolve on macOS too. */
"mac.section.account" = "Account";
"mac.account.restoring" = "Restoring your session…";
"mac.account.signedOut.title" = "Not signed in";
"mac.account.signedOut.body" = "Sign in with Apple to use your credit balance on this Mac and to get your invitation link.";
"mac.account.signedOut.footnote" = "Credits are bought on iPhone or on the web and shared across all your devices.";
"mac.account.signIn.loading" = "Signing in…";
"mac.account.profile.unnamed" = "Apple Account";
"mac.account.profile.accountID" = "Account %@";
"mac.account.signOut" = "Sign Out";
"mac.account.credits.title" = "Credits";
"mac.account.credits.balance" = "Balance";
"mac.account.credits.used" = "Used";
"mac.account.credits.loading" = "Loading balance…";
"mac.account.credits.refresh" = "Refresh";
"mac.account.credits.purchaseNote" = "Purchases are not available on macOS. Buy credits on iPhone or on the web — the balance is shared.";
"mac.account.invite.title" = "Invitation";
"mac.account.invite.link" = "Your invitation link";
"mac.account.invite.copy" = "Copy";
"mac.account.invite.copied" = "Copied";
"mac.account.invite.loading" = "Loading your invitation link…";
"mac.account.invite.retry" = "Retry";
"mac.account.invite.rewarded" = "Rewarded invites";
"mac.account.invite.pending" = "Pending invites";
"mac.account.invite.footnote" = "Both of you get credits once an invited friend qualifies.";
"mac.account.delete.title" = "Delete Account";
"mac.account.delete.body" = "Deleting removes your account and any remaining credits. This cannot be undone.";
"mac.account.delete.action" = "Delete Account…";
"mac.account.delete.confirmBody" = "Confirm with Apple to permanently delete your account and remaining credits.";
"mac.account.delete.cancel" = "Cancel";
"mac.account.error.title" = "Account";
"mac.account.error.dismiss" = "OK";
"account.error.appleAuthorization" = "Apple authorization could not be completed.";
"account.error.appleReauthenticationRequired" = "Sign in with Apple again to keep your account protected.";
"account.error.delete" = "Could not delete the account.";
"account.error.load" = "Could not load account details.";
"account.error.managedGateway" = "Could not prepare the managed service.";
"account.error.redeemReferral" = "The invitation is saved, but could not be redeemed yet.";
"account.error.restore" = "Could not restore your account session.";
"account.error.sessionExpired" = "Your session expired. Sign in again to continue.";
"account.error.signIn" = "Could not sign in. Please try again.";
"account.error.signOut" = "Could not sign out. Please try again.";
"account.error.unavailable" = "Account services are not connected in this build.";
"account.error.updateProfile" = "Could not update your profile.";
"account.referral.error.conflict" = "Your invitation link is temporarily unavailable.";
"account.referral.error.load" = "Couldn’t load your invitation link.";
"account.referral.error.network" = "Check your connection and try again.";
"account.referral.error.notFound" = "Your invitation link isn’t available yet.";
"account.referral.error.session" = "Sign in again to load your invitation link.";
"account.referral.error.unavailable" = "The invitation service is temporarily unavailable.";