feat: M2.1 客户端骨架、BLE 修复、仓库整理与现状板

- BLE: 修复 BlueZ LocalName 与 Includes 冲突,串行注册与退避
- HTTP: 语音对话补 Live2D talking 标志与 session;Web 补 X-Session-Id
- Flutter: 角色/对话/模型页 + API,Gradle/依赖升级,麦克风权限
- 文档: 新增 docs/STATUS.md,校准 CLAUDE/PROGRESS/README
- 清理: 移除根目录截图与临时模型,运维脚本迁入 scripts/device
This commit is contained in:
2026-07-09 12:41:34 +08:00
parent 7cb8cee70d
commit 6f7e24db63
51 changed files with 2674 additions and 351 deletions

View File

@@ -2,15 +2,21 @@ import 'package:flutter/material.dart';
import 'package:go_router/go_router.dart';
import 'package:provider/provider.dart';
import 'providers/character_provider.dart';
import 'providers/chat_provider.dart';
import 'providers/device_provider.dart';
import 'providers/debug_provider.dart';
import 'providers/ble_provider.dart';
import 'providers/model_provider.dart';
import 'providers/player_provider.dart';
import 'providers/wifi_provider.dart';
import 'screens/app_shell.dart';
import 'screens/ble_provision_screen.dart';
import 'screens/characters_screen.dart';
import 'screens/chat_screen.dart';
import 'screens/debug_screen.dart';
import 'screens/home_screen.dart';
import 'screens/models_screen.dart';
import 'screens/network_screen.dart';
import 'screens/playback_screen.dart';
import 'screens/settings_screen.dart';
@@ -36,6 +42,7 @@ Future<void> main() async {
runApp(
MultiProvider(
providers: [
Provider<HttpApiService>.value(value: httpApiService),
Provider<WebSocketService>.value(value: webSocketService),
ChangeNotifierProvider<DebugProvider>(
create: (_) => DebugProvider(webSocketService: webSocketService),
@@ -70,6 +77,24 @@ Future<void> main() async {
debugProvider: context.read<DebugProvider>(),
)..bootstrap(),
),
ChangeNotifierProvider<CharacterProvider>(
create: (context) => CharacterProvider(
httpApiService: httpApiService,
debugProvider: context.read<DebugProvider>(),
),
),
ChangeNotifierProvider<ChatProvider>(
create: (context) => ChatProvider(
httpApiService: httpApiService,
debugProvider: context.read<DebugProvider>(),
),
),
ChangeNotifierProvider<ModelProvider>(
create: (context) => ModelProvider(
httpApiService: httpApiService,
debugProvider: context.read<DebugProvider>(),
),
),
],
child: const ShowenApp(),
),
@@ -95,18 +120,27 @@ final GoRouter _router = GoRouter(
StatefulShellBranch(
routes: [
GoRoute(
path: '/playback',
name: 'playback',
builder: (context, state) => const PlaybackScreen(),
path: '/characters',
name: 'characters',
builder: (context, state) => const CharactersScreen(),
),
],
),
StatefulShellBranch(
routes: [
GoRoute(
path: '/trigger',
name: 'trigger',
builder: (context, state) => const TriggerScreen(),
path: '/chat',
name: 'chat',
builder: (context, state) => const ChatScreen(),
),
],
),
StatefulShellBranch(
routes: [
GoRoute(
path: '/playback',
name: 'playback',
builder: (context, state) => const PlaybackScreen(),
),
],
),
@@ -132,15 +166,23 @@ final GoRouter _router = GoRouter(
path: '/settings',
name: 'settings',
builder: (context, state) => const SettingsScreen(),
),
],
),
StatefulShellBranch(
routes: [
GoRoute(
path: '/debug',
name: 'debug',
builder: (context, state) => const DebugScreen(),
routes: [
GoRoute(
path: 'models',
name: 'models',
builder: (context, state) => const ModelsScreen(),
),
GoRoute(
path: 'trigger',
name: 'trigger',
builder: (context, state) => const TriggerScreen(),
),
GoRoute(
path: 'debug',
name: 'debug',
builder: (context, state) => const DebugScreen(),
),
],
),
],
),