feat(polish): allow mood emoji on custom styles and ship Flow/ASR fixes

Custom polish styles can opt in to emotion-matched emoji (default off), with
prompt-level opt-in detection so paste-only styles keep model-added emoji.
Also include Volcengine API-Key ASR auth, voice-processing capture, PiP flash
fix, and related keyboard Shift/haptics reliability work.
This commit is contained in:
Rocky
2026-08-06 15:11:12 +08:00
parent 2ed16e1fbf
commit a8d58d8f0c
47 changed files with 1467 additions and 258 deletions
+54 -37
View File
@@ -188,34 +188,52 @@ struct MacSettingsView: View {
@ViewBuilder
private var volcengineAsrRows: some View {
MacCredentialField(
title: MacL10n.string("mac.settings.volcengineAppId", language: lang),
placeholder: "APP ID",
text: Binding(
get: { macVolcengineFields.appID },
set: { updateMacVolcengine(appID: $0) }
),
isSecret: true
MacProviderThinkingRow(
title: MacL10n.string("mac.settings.volcengineApiKeyMode", language: lang),
subtitle: MacL10n.string("mac.settings.volcengineApiKeyModeSubtitle", language: lang),
isOn: Binding(
get: { macVolcengineFields.usesAPIKeyAuth },
set: { updateMacVolcengine(authMode: $0 ? .apiKey : .appToken) }
)
)
MacCredentialField(
title: MacL10n.string("mac.settings.volcengineAccessToken", language: lang),
placeholder: "Access Token",
text: Binding(
get: { macVolcengineFields.accessToken },
set: { updateMacVolcengine(accessToken: $0) }
),
isSecret: true
if macVolcengineFields.usesAPIKeyAuth {
MacCredentialField(
title: MacL10n.string("mac.settings.volcengineApiKey", language: lang),
placeholder: "API Key",
text: Binding(
get: { macVolcengineFields.apiKeyCredential },
set: { updateMacVolcengine(apiKeyCredential: $0) }
),
isSecret: true
)
} else {
MacCredentialField(
title: MacL10n.string("mac.settings.volcengineAppId", language: lang),
placeholder: "APP ID",
text: Binding(
get: { macVolcengineFields.appID },
set: { updateMacVolcengine(appID: $0) }
),
isSecret: true
)
MacCredentialField(
title: MacL10n.string("mac.settings.volcengineAccessToken", language: lang),
placeholder: "Access Token",
text: Binding(
get: { macVolcengineFields.accessToken },
set: { updateMacVolcengine(accessToken: $0) }
),
isSecret: true
)
}
MacProviderNoteRow(
text: MacL10n.string(
macVolcengineFields.usesAPIKeyAuth
? "mac.settings.volcengineNoteApiKey"
: "mac.settings.volcengineNoteAppToken",
language: lang
)
)
MacCredentialField(
title: MacL10n.string("mac.settings.volcengineResourceId", language: lang),
placeholder: CloudASRModelCatalog.defaultModel(for: "volcengine"),
text: Binding(
get: { macVolcengineFields.resourceID },
set: { updateMacVolcengine(resourceID: $0) }
),
defaultValue: CloudASRModelCatalog.defaultModel(for: "volcengine")
)
MacProviderNoteRow(text: MacL10n.string("mac.settings.volcengineNote", language: lang))
}
@ViewBuilder
@@ -407,22 +425,21 @@ struct MacSettingsView: View {
}
private var macVolcengineFields: VolcengineASRFields {
VolcengineASRFields.parse(
apiKey: viewModel.config.asrApiKey,
resourceFallback: viewModel.config.asrModel.isEmpty
? CloudASRModelCatalog.defaultModel(for: "volcengine")
: viewModel.config.asrModel
)
VolcengineASRFields.parse(apiKey: viewModel.config.asrApiKey)
}
private func updateMacVolcengine(appID: String? = nil, accessToken: String? = nil, resourceID: String? = nil) {
private func updateMacVolcengine(
authMode: VolcengineASRAuthMode? = nil,
appID: String? = nil,
accessToken: String? = nil,
apiKeyCredential: String? = nil
) {
var fields = macVolcengineFields
if let authMode { fields.authMode = authMode }
if let appID { fields.appID = appID }
if let accessToken { fields.accessToken = accessToken }
if let resourceID {
fields.resourceID = resourceID
viewModel.config.asrModel = resourceID
}
if let apiKeyCredential { fields.apiKeyCredential = apiKeyCredential }
viewModel.config.asrModel = VolcengineASRFields.fixedResourceID
viewModel.config.asrApiKey = fields.encodedAPIKey
}