A desktop app that parses Claude Code .jsonl session logs and provides a rich UI for exploring conversations, tool usage, subagents, and token consumption. Features include project browser with auto-discovery of ~/.claude/projects, conversation timeline with inline subagent expansion, agents overview, toolbelt chart, and token usage dashboard. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
63 lines
1.6 KiB
Dart
63 lines
1.6 KiB
Dart
import 'package:flutter/material.dart';
|
|
import 'package:provider/provider.dart';
|
|
import '../../providers/session_provider.dart';
|
|
import '../../screens/agents/agents_screen.dart';
|
|
import '../../screens/home/home_screen.dart';
|
|
import '../../screens/timeline/timeline_screen.dart';
|
|
import '../../screens/tokens/tokens_screen.dart';
|
|
import '../../screens/toolbelt/toolbelt_screen.dart';
|
|
import 'sidebar.dart';
|
|
|
|
class AppShell extends StatefulWidget {
|
|
const AppShell({super.key});
|
|
|
|
@override
|
|
State<AppShell> createState() => _AppShellState();
|
|
}
|
|
|
|
class _AppShellState extends State<AppShell> {
|
|
SidebarScreen _screen = SidebarScreen.home;
|
|
|
|
void _onScreenSelected(SidebarScreen screen) {
|
|
setState(() => _screen = screen);
|
|
}
|
|
|
|
void _onSessionLoaded() {
|
|
setState(() => _screen = SidebarScreen.timeline);
|
|
}
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
final provider = context.watch<SessionProvider>();
|
|
final hasSession = provider.session != null;
|
|
|
|
return Row(
|
|
children: [
|
|
Sidebar(
|
|
selected: _screen,
|
|
onSelect: _onScreenSelected,
|
|
hasSession: hasSession,
|
|
),
|
|
Expanded(
|
|
child: _buildScreen(),
|
|
),
|
|
],
|
|
);
|
|
}
|
|
|
|
Widget _buildScreen() {
|
|
switch (_screen) {
|
|
case SidebarScreen.home:
|
|
return HomeScreen(onSessionLoaded: _onSessionLoaded);
|
|
case SidebarScreen.timeline:
|
|
return const TimelineScreen();
|
|
case SidebarScreen.agents:
|
|
return const AgentsScreen();
|
|
case SidebarScreen.toolbelt:
|
|
return const ToolbeltScreen();
|
|
case SidebarScreen.tokens:
|
|
return const TokensScreen();
|
|
}
|
|
}
|
|
}
|