diff --git a/.gitmodules b/.gitmodules
index 1701ce09..c4c4230f 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -1,6 +1,3 @@
-[submodule "MotelyJAML"]
- path = src/MotelyJAML
- url = https://github.com/OptimusPi/MotelyJAML.git
[submodule "src/MotelyJAML"]
path = src/MotelyJAML
url = https://github.com/OptimusPi/MotelyJAML.git
diff --git a/BalatroSeedOracle.sln b/BalatroSeedOracle.sln
index 777d020d..c23ba12f 100644
--- a/BalatroSeedOracle.sln
+++ b/BalatroSeedOracle.sln
@@ -4,8 +4,6 @@ VisualStudioVersion = 17.5.2.0
MinimumVisualStudioVersion = 10.0.40219.1
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{827E0CD3-B72D-47B6-A68D-7590B98EB39B}"
EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "external", "external", "{A288BEE0-695A-BEEA-455C-649571D89326}"
-EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BalatroSeedOracle", "src\BalatroSeedOracle\BalatroSeedOracle.csproj", "{8A9CDFC3-0A84-2161-EF0D-78B2610389F8}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BalatroSeedOracle.Android", "src\BalatroSeedOracle.Android\BalatroSeedOracle.Android.csproj", "{C7E811EE-10D0-2CD9-143B-0B5BB78B26CA}"
@@ -20,12 +18,6 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "MotelyJAML", "MotelyJAML",
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Motely", "src\MotelyJAML\Motely\Motely.csproj", "{EDC7B3DB-A702-4B21-1617-CF0073CD45B3}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Motely.DB", "src\MotelyJAML\Motely.DB\Motely.DB.csproj", "{B2C3D4E5-F6A7-8901-BCDE-F12345678901}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Motely.Orchestration", "src\MotelyJAML\Motely.Orchestration\Motely.Orchestration.csproj", "{C3D4E5F6-A7B8-9012-CDEF-123456789012}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Motely.API", "src\MotelyJAML\Motely.API\Motely.API.csproj", "{E8AFF8C0-8A08-EF5F-1857-CC83539C61E1}"
-EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Motely.Tests", "src\MotelyJAML\Motely.Tests\Motely.Tests.csproj", "{49688DA2-4307-246E-963D-4C09A7C3DAB7}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Motely.TUI", "src\MotelyJAML\Motely.TUI\Motely.TUI.csproj", "{287004BE-1C2A-7335-791E-EC405C0D9760}"
@@ -60,18 +52,6 @@ Global
{EDC7B3DB-A702-4B21-1617-CF0073CD45B3}.Debug|Any CPU.Build.0 = Debug|Any CPU
{EDC7B3DB-A702-4B21-1617-CF0073CD45B3}.Release|Any CPU.ActiveCfg = Release|Any CPU
{EDC7B3DB-A702-4B21-1617-CF0073CD45B3}.Release|Any CPU.Build.0 = Release|Any CPU
- {B2C3D4E5-F6A7-8901-BCDE-F12345678901}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {B2C3D4E5-F6A7-8901-BCDE-F12345678901}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {B2C3D4E5-F6A7-8901-BCDE-F12345678901}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {B2C3D4E5-F6A7-8901-BCDE-F12345678901}.Release|Any CPU.Build.0 = Release|Any CPU
- {C3D4E5F6-A7B8-9012-CDEF-123456789012}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {C3D4E5F6-A7B8-9012-CDEF-123456789012}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {C3D4E5F6-A7B8-9012-CDEF-123456789012}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {C3D4E5F6-A7B8-9012-CDEF-123456789012}.Release|Any CPU.Build.0 = Release|Any CPU
- {E8AFF8C0-8A08-EF5F-1857-CC83539C61E1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {E8AFF8C0-8A08-EF5F-1857-CC83539C61E1}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {E8AFF8C0-8A08-EF5F-1857-CC83539C61E1}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {E8AFF8C0-8A08-EF5F-1857-CC83539C61E1}.Release|Any CPU.Build.0 = Release|Any CPU
{49688DA2-4307-246E-963D-4C09A7C3DAB7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{49688DA2-4307-246E-963D-4C09A7C3DAB7}.Debug|Any CPU.Build.0 = Debug|Any CPU
{49688DA2-4307-246E-963D-4C09A7C3DAB7}.Release|Any CPU.ActiveCfg = Release|Any CPU
@@ -90,11 +70,7 @@ Global
{63DC9E55-7F48-0184-AA81-683B823F1301} = {827E0CD3-B72D-47B6-A68D-7590B98EB39B}
{8C89F91A-2F03-FBDE-11B5-95045AD46440} = {827E0CD3-B72D-47B6-A68D-7590B98EB39B}
{F59D3181-6EFA-D9CA-90D5-1085C46EEAAF} = {827E0CD3-B72D-47B6-A68D-7590B98EB39B}
- {2C7DF5F9-C613-49D4-3348-9C271BBB65CD} = {A288BEE0-695A-BEEA-455C-649571D89326}
{EDC7B3DB-A702-4B21-1617-CF0073CD45B3} = {2C7DF5F9-C613-49D4-3348-9C271BBB65CD}
- {B2C3D4E5-F6A7-8901-BCDE-F12345678901} = {2C7DF5F9-C613-49D4-3348-9C271BBB65CD}
- {C3D4E5F6-A7B8-9012-CDEF-123456789012} = {2C7DF5F9-C613-49D4-3348-9C271BBB65CD}
- {E8AFF8C0-8A08-EF5F-1857-CC83539C61E1} = {2C7DF5F9-C613-49D4-3348-9C271BBB65CD}
{49688DA2-4307-246E-963D-4C09A7C3DAB7} = {2C7DF5F9-C613-49D4-3348-9C271BBB65CD}
{287004BE-1C2A-7335-791E-EC405C0D9760} = {2C7DF5F9-C613-49D4-3348-9C271BBB65CD}
EndGlobalSection
diff --git a/src/BalatroSeedOracle.Desktop/BalatroSeedOracle.Desktop.csproj b/src/BalatroSeedOracle.Desktop/BalatroSeedOracle.Desktop.csproj
index ee169cad..73247495 100644
--- a/src/BalatroSeedOracle.Desktop/BalatroSeedOracle.Desktop.csproj
+++ b/src/BalatroSeedOracle.Desktop/BalatroSeedOracle.Desktop.csproj
@@ -55,6 +55,5 @@
-
diff --git a/src/BalatroSeedOracle.Desktop/Components/Widgets/ApiHostWidget.axaml b/src/BalatroSeedOracle.Desktop/Components/Widgets/ApiHostWidget.axaml
deleted file mode 100644
index 625899cf..00000000
--- a/src/BalatroSeedOracle.Desktop/Components/Widgets/ApiHostWidget.axaml
+++ /dev/null
@@ -1,266 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/BalatroSeedOracle.Desktop/Components/Widgets/ApiHostWidget.axaml.cs b/src/BalatroSeedOracle.Desktop/Components/Widgets/ApiHostWidget.axaml.cs
deleted file mode 100644
index b54a1ef3..00000000
--- a/src/BalatroSeedOracle.Desktop/Components/Widgets/ApiHostWidget.axaml.cs
+++ /dev/null
@@ -1,32 +0,0 @@
-using Avalonia.Markup.Xaml;
-using BalatroSeedOracle.Components;
-using BalatroSeedOracle.ViewModels;
-
-namespace BalatroSeedOracle.Desktop.Components.Widgets;
-
-///
-/// ApiHostWidget - Hosts the Motely API server within BSO
-/// DataContext is bound via XAML from parent ViewModel (the Avalonia way)
-///
-public partial class ApiHostWidget : BaseWidgetControl
-{
- public ApiHostWidget()
- {
- InitializeComponent();
- }
-
- private void InitializeComponent()
- {
- AvaloniaXamlLoader.Load(this);
- }
-
- // Cleanup when widget is unloaded
- protected override void OnUnloaded(Avalonia.Interactivity.RoutedEventArgs e)
- {
- base.OnUnloaded(e);
- if (DataContext is ApiHostWidgetViewModel vm)
- {
- _ = vm.CleanupAsync();
- }
- }
-}
diff --git a/src/BalatroSeedOracle.Desktop/DesktopAppExtensions.cs b/src/BalatroSeedOracle.Desktop/DesktopAppExtensions.cs
index 1f5e4d95..f787fc5f 100644
--- a/src/BalatroSeedOracle.Desktop/DesktopAppExtensions.cs
+++ b/src/BalatroSeedOracle.Desktop/DesktopAppExtensions.cs
@@ -4,7 +4,6 @@
using BalatroSeedOracle.Desktop.Views;
using BalatroSeedOracle.Helpers;
using BalatroSeedOracle.Services;
-using Motely.DB;
using Motely.Executors;
namespace BalatroSeedOracle.Desktop;
@@ -69,8 +68,6 @@ private static async Task InitializeSearchLibraryAsync()
{
try
{
- MotelySearchOrchestrator.SetRepository(new MotelyRepository());
-
// Set thread budget for MultiSearchManager
MultiSearchManager.Instance.SetTotalThreads(Environment.ProcessorCount);
DebugLogger.Log("App", $"Thread budget set to: {Environment.ProcessorCount}");
diff --git a/src/BalatroSeedOracle.Desktop/Program.cs b/src/BalatroSeedOracle.Desktop/Program.cs
index 49b01145..ce1ac7a5 100644
--- a/src/BalatroSeedOracle.Desktop/Program.cs
+++ b/src/BalatroSeedOracle.Desktop/Program.cs
@@ -42,17 +42,9 @@ public static void Main(string[] args)
// Desktop-only services
services.AddSingleton();
services.AddSingleton();
- services.AddSingleton<
- ISequentialLibraryInitializer,
- SequentialLibraryInitializerService
- >();
- services.AddSingleton<
- IRestoreActiveSearchesProvider,
- RestoreActiveSearchesProviderService
- >();
-
- // API host
- services.AddSingleton();
+ // Sequential library, restore-active-searches, and in-app API host all
+ // lived behind Motely.DB / Motely.API which are gone. Re-register when
+ // their replacements arrive on top of JamlSearchBuilder.
};
// Start Avalonia
diff --git a/src/BalatroSeedOracle.Desktop/Services/DesktopApiHostService.cs b/src/BalatroSeedOracle.Desktop/Services/DesktopApiHostService.cs
deleted file mode 100644
index 9239fe85..00000000
--- a/src/BalatroSeedOracle.Desktop/Services/DesktopApiHostService.cs
+++ /dev/null
@@ -1,136 +0,0 @@
-using System;
-using System.Threading;
-using System.Threading.Tasks;
-using BalatroSeedOracle.Services;
-using Microsoft.AspNetCore.Builder;
-using Microsoft.Extensions.Hosting;
-using Motely.API;
-using Motely.Executors;
-
-namespace BalatroSeedOracle.Desktop.Services;
-
-///
-/// Desktop implementation of IApiHostService using Motely.API
-///
-public class DesktopApiHostService : IApiHostService
-{
- private WebApplication? _server;
- private CancellationTokenSource? _cts;
-
- public bool IsSupported => true;
- public bool IsRunning { get; private set; }
- public string ServerUrl { get; private set; } = "http://localhost:3141/";
-
- public event Action? LogMessage;
- public event Action? StatusChanged;
-
- public async Task StartAsync(int port)
- {
- if (IsRunning)
- return;
-
- try
- {
- ServerUrl = $"http://localhost:{port}/";
- var args = new[] { "--urls", ServerUrl };
-
- Log($"Starting Motely API on {ServerUrl}");
-
- _cts = new CancellationTokenSource();
- _server = MotelyApiHost.CreateHost(args);
-
- // Set thread budget for MultiSearchManager
- var threadCount = Environment.ProcessorCount;
- MultiSearchManager.Instance.SetTotalThreads(threadCount);
- Log($"Thread budget: {threadCount}");
-
- IsRunning = true;
- StatusChanged?.Invoke(true);
-
- Log("Server started successfully");
- Log($"Web UI: {ServerUrl}");
- Log($"Health: {ServerUrl}health");
- Log($"SignalR Hub: {ServerUrl}searchHub");
-
- // Run server in background
- _ = Task.Run(async () =>
- {
- try
- {
- await _server.RunAsync(_cts.Token);
- }
- catch (OperationCanceledException)
- {
- // Expected during stop
- }
- catch (Exception ex)
- {
- Log($"Server error: {ex.Message}");
- await StopInternalAsync();
- }
- });
- }
- catch (Exception ex)
- {
- Log($"Failed to start: {ex.Message}");
- IsRunning = false;
- StatusChanged?.Invoke(false);
- throw;
- }
- }
-
- public async Task StopAsync()
- {
- if (!IsRunning)
- return;
-
- Log("Stopping server...");
-
- // Stop all searches first
- try
- {
- MultiSearchManager.Instance.StopAll();
- Log("Stopped all active searches");
- }
- catch (Exception ex)
- {
- Log($"Warning stopping searches: {ex.Message}");
- }
-
- await StopInternalAsync();
- Log("Server stopped");
- }
-
- private async Task StopInternalAsync()
- {
- _cts?.Cancel();
-
- if (_server is not null)
- {
- try
- {
- using var stopCts = new CancellationTokenSource(TimeSpan.FromSeconds(5));
- await _server.StopAsync(stopCts.Token);
- }
- catch { }
-
- try
- {
- await _server.DisposeAsync();
- }
- catch { }
- }
-
- _server = null;
- _cts?.Dispose();
- _cts = null;
-
- IsRunning = false;
- StatusChanged?.Invoke(false);
- }
-
- private void Log(string message)
- {
- LogMessage?.Invoke(message);
- }
-}
diff --git a/src/BalatroSeedOracle.Desktop/Services/RestoreActiveSearchesProviderService.cs b/src/BalatroSeedOracle.Desktop/Services/RestoreActiveSearchesProviderService.cs
deleted file mode 100644
index ddb7ef8f..00000000
--- a/src/BalatroSeedOracle.Desktop/Services/RestoreActiveSearchesProviderService.cs
+++ /dev/null
@@ -1,80 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.IO;
-using System.Threading.Tasks;
-using BalatroSeedOracle.Services;
-using Motely;
-using Motely.DB;
-using Motely.Filters;
-
-namespace BalatroSeedOracle.Desktop.Services;
-
-///
-/// Desktop implementation: uses Motely.DB.SequentialLibrary for metadata, loads JAML in BSO.
-///
-public sealed class RestoreActiveSearchesProviderService : IRestoreActiveSearchesProvider
-{
- ///
- public Task> RestoreAsync(string jamlFiltersDir)
- {
- var restored = new List();
-
- try
- {
- var activeIds = SequentialLibrary.Instance.GetAllActiveSearchIds();
-
- foreach (var searchId in activeIds)
- {
- try
- {
- var meta = SequentialLibrary.Instance.GetSearchMeta(searchId);
- if (meta is null)
- continue;
-
- var jamlPath = Path.Combine(jamlFiltersDir, $"{meta.JamlFilter}.jaml");
- if (!File.Exists(jamlPath))
- {
- SequentialLibrary.Instance.SetSearchActive(searchId, false);
- continue;
- }
-
- if (
- !JamlConfigLoader.TryLoadFromJaml(jamlPath, out var config, out _)
- || config is null
- )
- {
- SequentialLibrary.Instance.SetSearchActive(searchId, false);
- continue;
- }
-
- config.Deck = meta.Deck;
- config.Stake = meta.Stake;
-
- restored.Add(
- new RestoredSearchInfo
- {
- SearchId = searchId,
- FilterName = meta.JamlFilter ?? "Unknown",
- Deck = meta.Deck ?? "Red",
- Stake = meta.Stake ?? "White",
- LastSeed = meta.LastSeed,
- TotalSeedsProcessed = meta.TotalSeedsProcessed,
- TotalMatches = meta.TotalMatches,
- Config = config,
- }
- );
- }
- catch
- {
- // Skip broken entries
- }
- }
- }
- catch
- {
- // Return whatever we have
- }
-
- return Task.FromResult(restored);
- }
-}
diff --git a/src/BalatroSeedOracle.Desktop/Services/ResultsDatabaseExporter.cs b/src/BalatroSeedOracle.Desktop/Services/ResultsDatabaseExporter.cs
deleted file mode 100644
index 73c8325d..00000000
--- a/src/BalatroSeedOracle.Desktop/Services/ResultsDatabaseExporter.cs
+++ /dev/null
@@ -1,35 +0,0 @@
-using System.Collections.Generic;
-using System.Linq;
-using System.Threading.Tasks;
-using BalatroSeedOracle.Models;
-using BalatroSeedOracle.Services.Export;
-using Motely.DB;
-
-namespace BalatroSeedOracle.Desktop.Services;
-
-///
-/// Desktop implementation of IResultsDatabaseExporter using Motely.DB.
-/// BSO does not reference DuckDB directly; all database export goes through Motely.
-///
-public sealed class ResultsDatabaseExporter : IResultsDatabaseExporter
-{
- public bool IsAvailable => true;
-
- public Task ExportToAsync(
- string path,
- IReadOnlyList results,
- IReadOnlyList columnNames
- )
- {
- var rows = new List<(string seed, int score, IReadOnlyList