Initial commit: Fabled Android app

Flutter Android client for FabledAssistant with:
- Session-cookie auth via persistent cookie jar (Dio + cookie_jar)
- OAuth/SSO login via in-app WebView (flutter_inappwebview)
- Notes: list, detail (markdown render), create/edit
- Tasks: list with status tabs, create/edit with priority
- Chat: SSE streaming bubbles, conversation management
- Quick Capture FAB for rapid note/task creation
- Settings screen (change server URL, logout)
- Android home screen widget → opens chat
- Riverpod state management, go_router navigation

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-02-28 21:28:53 -05:00
commit 4da36aa31d
64 changed files with 4053 additions and 0 deletions
@@ -0,0 +1,15 @@
import '../api/auth_api.dart';
class AuthRepository {
final AuthApi _api;
const AuthRepository(this._api);
Future<void> login(String username, String password) =>
_api.login(username, password);
Future<void> logout() => _api.logout();
Future<bool> verify() => _api.verify();
Future<Map<String, dynamic>> getStatus() => _api.getStatus();
}
@@ -0,0 +1,19 @@
import '../api/chat_api.dart';
import '../models/conversation.dart';
import '../models/message.dart';
class ChatRepository {
final ChatApi _api;
const ChatRepository(this._api);
Future<List<Conversation>> getConversations() => _api.getConversations();
Future<Conversation> createConversation(String title) =>
_api.createConversation(title);
Future<void> deleteConversation(int id) => _api.deleteConversation(id);
Future<List<Message>> getMessages(int conversationId) =>
_api.getMessages(conversationId);
Future<void> sendMessage(int conversationId, String content) =>
_api.sendMessage(conversationId, content);
Stream<String> streamGeneration(int conversationId) =>
_api.streamGeneration(conversationId);
}
@@ -0,0 +1,15 @@
import '../api/notes_api.dart';
import '../models/note.dart';
class NotesRepository {
final NotesApi _api;
const NotesRepository(this._api);
Future<List<Note>> getAll() => _api.getAll();
Future<Note> getOne(int id) => _api.getOne(id);
Future<Note> create(String title, String body) =>
_api.create(title, body);
Future<Note> update(int id, String title, String body) =>
_api.update(id, title, body);
Future<void> delete(int id) => _api.delete(id);
}
@@ -0,0 +1,30 @@
import '../api/tasks_api.dart';
import '../models/task.dart';
class TasksRepository {
final TasksApi _api;
const TasksRepository(this._api);
Future<List<Task>> getAll() => _api.getAll();
Future<Task> getOne(int id) => _api.getOne(id);
Future<Task> create({
required String title,
String? description,
required TaskStatus status,
required TaskPriority priority,
DateTime? dueDate,
}) =>
_api.create(
title: title,
description: description,
status: status,
priority: priority,
dueDate: dueDate,
);
Future<Task> update(int id, Map<String, dynamic> fields) =>
_api.update(id, fields);
Future<void> delete(int id) => _api.delete(id);
}