feat(FN-3107): merge fusion/fn-3107

This merge lands the managed Docker nodes feature (FN-3107) end-to-end: core schema migration for nodes with types, CRUD operations in CentralCore, and dashboard UI (AddNodeModal, NodeDetailModal) with accessibility fixes and tokenized CSS. Also included are manual PR linking (FN-3202), plugin schem

Fusion-Task-Id: FN-3107
This commit is contained in:
Fusion
2026-05-02 11:17:18 -07:00
committed by gsxdsm
parent ffb71b7912
commit d9835970e1
15 changed files with 1411 additions and 357 deletions

View File

@@ -23,7 +23,7 @@ export { toJson, toJsonNullable, fromJson };
// ── Schema Definition ───────────────────────────────────────────────────
const CENTRAL_SCHEMA_VERSION = 5;
const CENTRAL_SCHEMA_VERSION = 6;
const CENTRAL_SCHEMA_SQL = `
-- Projects table (project registry)
@@ -137,6 +137,31 @@ CREATE TABLE IF NOT EXISTS settingsSyncState (
);
CREATE INDEX IF NOT EXISTS idxSettingsSyncNode ON settingsSyncState(nodeId);
-- Managed Docker nodes table (Docker-provisioned mesh nodes)
CREATE TABLE IF NOT EXISTS managedDockerNodes (
id TEXT PRIMARY KEY,
nodeId TEXT,
name TEXT NOT NULL UNIQUE,
imageName TEXT NOT NULL,
imageTag TEXT NOT NULL,
containerId TEXT,
status TEXT NOT NULL DEFAULT 'creating',
hostConfig TEXT NOT NULL DEFAULT '{}',
envVars TEXT NOT NULL DEFAULT '{}',
volumeMounts TEXT NOT NULL DEFAULT '[]',
resourceSizing TEXT NOT NULL DEFAULT '{}',
extraClis TEXT NOT NULL DEFAULT '[]',
persistentStorage INTEGER NOT NULL DEFAULT 1,
reachableUrl TEXT,
apiKey TEXT,
errorMessage TEXT,
createdAt TEXT NOT NULL,
updatedAt TEXT NOT NULL,
FOREIGN KEY (nodeId) REFERENCES nodes(id) ON DELETE SET NULL
);
CREATE INDEX IF NOT EXISTS idxManagedDockerNodesStatus ON managedDockerNodes(status);
CREATE INDEX IF NOT EXISTS idxManagedDockerNodesNodeId ON managedDockerNodes(nodeId);
-- Schema version tracking
CREATE TABLE IF NOT EXISTS __meta (
key TEXT PRIMARY KEY,
@@ -202,6 +227,32 @@ CREATE TABLE IF NOT EXISTS settingsSyncState (
CREATE INDEX IF NOT EXISTS idxSettingsSyncNode ON settingsSyncState(nodeId);
`;
const CENTRAL_SCHEMA_V6_MIGRATION_SQL = `
CREATE TABLE IF NOT EXISTS managedDockerNodes (
id TEXT PRIMARY KEY,
nodeId TEXT,
name TEXT NOT NULL UNIQUE,
imageName TEXT NOT NULL,
imageTag TEXT NOT NULL,
containerId TEXT,
status TEXT NOT NULL DEFAULT 'creating',
hostConfig TEXT NOT NULL DEFAULT '{}',
envVars TEXT NOT NULL DEFAULT '{}',
volumeMounts TEXT NOT NULL DEFAULT '[]',
resourceSizing TEXT NOT NULL DEFAULT '{}',
extraClis TEXT NOT NULL DEFAULT '[]',
persistentStorage INTEGER NOT NULL DEFAULT 1,
reachableUrl TEXT,
apiKey TEXT,
errorMessage TEXT,
createdAt TEXT NOT NULL,
updatedAt TEXT NOT NULL,
FOREIGN KEY (nodeId) REFERENCES nodes(id) ON DELETE SET NULL
);
CREATE INDEX IF NOT EXISTS idxManagedDockerNodesStatus ON managedDockerNodes(status);
CREATE INDEX IF NOT EXISTS idxManagedDockerNodesNodeId ON managedDockerNodes(nodeId);
`;
// ── Central Database Class ────────────────────────────────────────────────
export class CentralDatabase {
@@ -279,6 +330,11 @@ export class CentralDatabase {
migrated = true;
}
if (currentVersion < 6) {
this.db.exec(CENTRAL_SCHEMA_V6_MIGRATION_SQL);
migrated = true;
}
if (migrated) {
this.db
.prepare("INSERT INTO __meta (key, value) VALUES ('schemaVersion', ?) ON CONFLICT(key) DO UPDATE SET value = excluded.value")