Release v1.4.0#352
Merged
Merged
Conversation
[Feature] Add release manager workflow
…me-state-machine [Refactor] Introduce session runtime state machine
…n-runtime-modules [Refactor] Complete mobile session runtime modules
- Fix domain parameter: slm -> iat (caused empty transcription results) - Reduce signed URL cache TTL: 4min -> 2min, add cache hit/miss logging - Add exponential backoff to STT restart (250ms -> 8s cap) - Add circuit breaker: after 5 consecutive failures, fallback to native STT - Add bootstrap timeout: 10s no-ready -> fallback native - Add diagnostic telemetry: stt_bootstrap_response, stt_xunfei_result_raw - i18n: update preparing status text for clarity - PCM: defensive cleanup of stale engine + audio session deactivation - Add Playwright e2e tests (5 tests) - Add test artifacts to .gitignore
…entFailure Fix Xunfei STT silent empty-transcript failures within same session
…lities, and add API client retry
…selectors, refine retryable status codes
…and-improvements [Fix] Unify API route auth guards, add database indexes, extract shared utilities, and add API client retry
…ession-persistence, and session-status modules (#300)
* Extract listening engine into useListeningEngine hook * Fix react-hooks immutability lint in useListeningEngine
…focused hooks Extract 7 custom hooks from App.tsx, following the same pattern used for the Web VoiceSessionProvider split (PRs #300/#302/#304/#306/#308): - useVoiceMetrics (279 lines) — logging, status, busy, teardown - useXunfeiStt (537 lines) — Xunfei ASR WebSocket/PCM lifecycle - usePlaybackQueue (151 lines) — playback advancement, resume scheduling - useSessionWorkflow (762 lines) — session lifecycle, turn submission, endpoint - useSttProvider (201 lines) — STT provider switching, prewarm, API URL - usePreferences (352 lines) — preferences loading/saving/applying - useHistory (106 lines) — history loading, selection, deletion App.tsx reduced from 2693 to 780 lines (-71%). TypeScript type check passes with zero errors. Closes #309
- Restore native STT fallback in handleListeningEndedWithoutTranscript circuit breaker - Sync xunfeiSessionSttRef from useXunfeiStt to App.tsx for metric logging - Pass ensureSessionSttProviderForStart result to startSession (not hardcoded 'native') - Pass nativeSpeechStartListeningRef to useSessionWorkflow - Fix unused imports, no-explicit-any, immutability lint errors - Remove unused refs: prefSyncTimerRef, settingsAutoLoadRef from hook deps TypeScript: zero errors. ESLint: zero errors.
…d audio cleanup - Wire native speech callbacks via ref bridge to sessionWorkflow handlers (was: empty stubs — all speech recognition silently discarded) - Restore Xunfei STT prewarming (was: only logged metric, never called startXunfeiSessionListening) - Fix selectScenario snapshot type — createInitialSnapshot not createPlaybackQueueSnapshot - Fix preferences startup — single invocation, not double ()() that cancelled load - Restore audio cleanup in saveProvider/selectVoiceProfile (setAudioUrl+playbackEndedAtMsRef) - Move prewarm effect back to App.tsx where startXunfeiSessionListening is available - Fix imports: createInitialSnapshot, getPlaybackTailPrewarmDecision
…learVoiceMetrics Critical: Xunfei ASR was completely broken — useXunfeiStt received empty useCallback stubs that never updated. All Xunfei ASR results (final transcripts, listening-ended events) were silently discarded. Fixes: - Add ref bridges for Xunfei handler callbacks (same pattern as native speech) - Wire xunfeiFinalTranscriptHandlerRef + xunfeiEndedWithoutTranscriptHandlerRef to sessionWorkflow handlers after both hooks are created - Wire nativeMetricHandlerRef to vm.logVoiceMetric (was no-op stub) - Export clearVoiceMetrics from useVoiceMetrics hook - Restore onClearVoiceMetrics diagnostics button functionality
…rop drilling (#313) Aligns mobile architecture with the Web VoiceSessionProvider pattern (Context + engine hooks + inline orchestration). Key changes: - SessionContext: session state + operations exposed to screens via useSession() - LogProvider: global logging system with enrichment injection - AppInner 820→~830 lines: orchestration functions inline (closure capture, zero parameter explosion). Only engine hooks remain as imports. - Deleted useSessionWorkflow (766 lines, 55+ params), usePreferences, useHistory, useSttProvider, usePlaybackQueue, useVoiceMetrics - Xunfei STT engine extracted to useXunfeiStt.ts (~340 lines, ~22 deps) - SessionScreen: 20+ props → 8 display props, uses useSession() Context - HomeScreen: 8 props → 5, uses useSession() Context - HistoryScreen: owns history state internally (api/getAuthHeaders injected) - SettingsScreen: owns preferences/auth state internally, direct appFeedback HUD - Conditional render replaces renderScreen() switch - Ref bridge pattern for native + Xunfei handler forwarding - All original product behavior preserved: scenario confirmation dialog, audio cleanup on provider switch, API URL persistence, ASR diagnostics, voice profile accent override, STT persistence, log enrichment, HUD overlays Closes #312
…315) Replace manual tab switching (activeTab state + renderScreen switch) with expo-router file-based routing. - Install expo-router dependency - app/_layout.tsx: Root Stack navigator wrapping ThemeProvider + LogProvider (back stack, deep links, platform-native slide transitions) - app/(tabs)/_layout.tsx: Tab navigator with MaterialCommunityIcons - Tab pages (session/home/history/settings): consume from SessionContext - SessionContext: added locale, tr, api, setLocale, removed display labels (consumers compute scenarioName/accentName from keys via useMemo) - index.ts: expo-router/entry - App.tsx: accepts optional children prop (manual tab fallback intact) Closes #314
- Remove Xunfei STT/PCM imports from App.tsx (moved to useXunfeiStt.ts in PR #315) - Remove unused setThemeLocal, settingsLoading, authSubmitting - Remove unused context params from home.tsx (selectScenario etc. consumed internally by HomeScreen) - Remove unused api param from settings.tsx (created internally by SettingsScreen) - Add block-level eslint-disable for react-hooks/exhaustive-deps in AppInner Closes #314
… JSDoc, section dividers - Import: import type separate, 5 groups, alphabetized, 0 mixed - JSDoc: bilingual multi-line on ALL 85+ exported modules, 70+ functions - Section dividers: // ─── English / 中文 ─── unified across all files - useXunfeiStt: 22 flat deps → 6 nested groups - createHandlerBridge() utility - 0 single-line JSDoc, 0 mixed imports, 0 exports without headers Part of #311
…tyle-3.1 [Style] Full-project code style unification — imports, JSDoc, grouped Deps, ref bridge
…_STYLE_GUIDE §2 - Moved CODE_STYLE_GUIDE.md to docs/, updated §2 with verified rules - 3 source groups: React/RN → @meteorvoice → internal (blank lines between) - Within each group: import type first, then import value - Single-line before multi-line within each cluster (A→Z by path) - 2+ names always wrapped to multi-line with trailing comma - Names within braces alphabetically sorted (case-insensitive) - Fixed CI lint warnings (useXunfeiStt unused vars + VoiceSessionProvider hooks deps) 101 files, 0 mixed imports, 0 rule violations. Closes #320
[Docs] CODE_STYLE_GUIDE — move to docs/, update from PR #318
…dge-stability [Fix] Restore mobile handler bridge stability
[Fix] Add session smoke E2E coverage
…labels [Fix] Improve web accessibility labels
…e-url [TTS] Add local cached audio delivery
…e-limit [Feature] Add persistent API rate limiting
…-tts [Fix] Stabilize mobile runtime, API validation, and Xunfei TTS
[Feature] Prepare v1.4.0 release
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Promote main to the protected production release branch.
Test Plan
Closes #351