Skip to content

Release v1.4.0#352

Merged
JunchenMeteor merged 53 commits into
releasefrom
main
Jul 11, 2026
Merged

Release v1.4.0#352
JunchenMeteor merged 53 commits into
releasefrom
main

Conversation

@JunchenMeteor

Copy link
Copy Markdown
Owner

Summary

Promote main to the protected production release branch.

Test Plan

  • Automated CI, build, CodeQL, and deployment checks.
  • Release Manager verification.

Closes #351

…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
…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
JunchenMeteor and others added 23 commits June 21, 2026 13:42
[Docs] CODE_STYLE_GUIDE — move to docs/, update from PR #318
…dge-stability

[Fix] Restore mobile handler bridge stability
…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
@vercel

vercel Bot commented Jul 11, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
meteorvoice Ready Ready Preview, Comment Jul 11, 2026 6:30am

@JunchenMeteor
JunchenMeteor merged commit 50bddf9 into release Jul 11, 2026
13 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant