feat: initial release v0.1.0

- Custom Keyboard Extension with push-to-talk UI
- iOS 26 SpeechAnalyzer + DictationTranscriber (iOS 18 SF fallback)
- OpenAI-compatible LLM client (4 built-in providers + custom)
- 3-page onboarding flow + provider config UI
- App Group shared storage for cross-process config
- 8s LLM timeout with raw-transcript fallback
- App Store privacy manifests for both targets
- SwiftLint + XcodeGen + GitHub Actions CI
- Unit tests (4/4 passing)
This commit is contained in:
2026-06-17 23:08:58 +08:00
commit 07067ca6c5
45 changed files with 3072 additions and 0 deletions
@@ -0,0 +1,36 @@
// ProviderPickerSection.swift
// OSGKeyboard · Main App
//
// A picker that swaps in the right BaseURL/Model defaults for a chosen
// provider, while letting the user override each field.
import SwiftUI
import OSGKeyboardShared
struct ProviderPickerSection: View {
@ObservedObject var config: ProviderConfig
var body: some View {
VStack(alignment: .leading, spacing: 12) {
HStack {
Text("Provider")
.font(.subheadline.weight(.semibold))
.foregroundStyle(Theme.textSecondary)
Spacer()
}
Picker("Provider", selection: $config.providerId) {
ForEach(LLMProvider.presets) { p in
Text(p.name).tag(p.id)
}
}
.pickerStyle(.menu)
.tint(Theme.accent)
.onChange(of: config.providerId) { _, newId in
let preset = LLMProvider.provider(id: newId)
config.apply(preset: preset)
}
}
.cardStyle()
}
}