- Wire up lists and todos to C# backend with full CRUD persistence - Add models, DTOs, repositories, and services for lists and todo lists/items - Preserve SQLite DB across vault rebuild/load cycles - Add session store for vault password persistence across navigation - Add inline name input for creating lists and todo lists in SidePanel - Clear editor panel on section change with empty state placeholder - Default markdown editor to preview mode on item selection - Decompose EditorPanel into sub-components: - editor/FragmentEditor, editor/TodoEditor, editor/MarkdownEditor - Shared markdown utilities in utils/markdown.ts - Strip verbose console/eprintln logging from frontend and Tauri backend - Add graceful shutdown with vault persistence on window close Co-Authored-By: Oz <oz-agent@warp.dev>
72 lines
3.0 KiB
C#
72 lines
3.0 KiB
C#
using Microsoft.Extensions.DependencyInjection;
|
|
using Journal.Core.Repositories;
|
|
using Journal.Core.Services.Ai;
|
|
using Journal.Core.Services.Config;
|
|
using Journal.Core.Services.Database;
|
|
using Journal.Core.Services.Entries;
|
|
using Journal.Core.Services.Fragments;
|
|
using Journal.Core.Services.Lists;
|
|
using Journal.Core.Services.Logging;
|
|
using Journal.Core.Services.Sidecar;
|
|
using Journal.Core.Services.Speech;
|
|
using Journal.Core.Services.Todos;
|
|
using Journal.Core.Services.Vault;
|
|
|
|
namespace Journal.Core;
|
|
|
|
public static class ServiceCollectionExtensions
|
|
{
|
|
public static IServiceCollection AddFragmentServices(this IServiceCollection services)
|
|
{
|
|
services.AddSingleton<IDatabaseSessionService, DatabaseSessionService>();
|
|
services.AddSingleton<IFragmentRepository, SqliteFragmentRepository>();
|
|
services.AddSingleton<IJournalConfigService, JournalConfigService>();
|
|
services.AddSingleton<IFragmentService, FragmentService>();
|
|
services.AddTransient<IEntrySearchService, EntrySearchService>();
|
|
services.AddSingleton<IVaultCryptoService, VaultCryptoService>();
|
|
services.AddSingleton<IVaultStorageService, VaultStorageService>();
|
|
services.AddSingleton<IJournalDatabaseService, JournalDatabaseService>();
|
|
services.AddSingleton<IAiService>(provider =>
|
|
{
|
|
var config = provider.GetRequiredService<IJournalConfigService>().Current;
|
|
if (!string.Equals(config.AiProvider, "python-sidecar", StringComparison.OrdinalIgnoreCase))
|
|
return new DisabledAiService(config.AiProvider);
|
|
|
|
try
|
|
{
|
|
return new PythonSidecarAiService(config);
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
return new DisabledAiService(
|
|
provider: "python-sidecar",
|
|
message: $"Python AI sidecar unavailable: {ex.Message}",
|
|
healthy: false);
|
|
}
|
|
});
|
|
services.AddSingleton<ISpeechBridgeService>(provider =>
|
|
{
|
|
var config = provider.GetRequiredService<IJournalConfigService>().Current;
|
|
try
|
|
{
|
|
return new PythonSidecarSpeechService(config);
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
return new DisabledSpeechBridgeService(
|
|
provider: "python-sidecar",
|
|
message: $"Python speech sidecar unavailable: {ex.Message}");
|
|
}
|
|
});
|
|
services.AddSingleton<IEntryFileRepository, DiskEntryFileRepository>();
|
|
services.AddSingleton<IEntryFileService, EntryFileService>();
|
|
services.AddSingleton<IListRepository, SqliteListRepository>();
|
|
services.AddSingleton<IListService, ListService>();
|
|
services.AddSingleton<ITodoRepository, SqliteTodoRepository>();
|
|
services.AddSingleton<ITodoService, TodoService>();
|
|
services.AddSingleton<CommandLogger>();
|
|
services.AddSingleton<SidecarCli>();
|
|
return services;
|
|
}
|
|
}
|