feat: consolidate database management work

Add catalog-owned logical relationships and runtime snapshots, extend the database-management UI and validation coverage, and document the updated operational workflow.

Keep active sensitive-generation status in a tooltip and indicator, and update the layout E2E to follow the history action in its new database-scoped location.
This commit is contained in:
Codex
2026-09-01 14:46:55 +02:00
parent f586152636
commit 076c9742c5
73 changed files with 6966 additions and 610 deletions
+12
View File
@@ -35,6 +35,9 @@ const safeErrorCodes = new Set([
"sensitive_data_suggestion_run_not_found",
"schema_sync_conflict", "schema_introspection_failed", "schema_request_invalid",
"schema_operation_failed", "sync_run_not_found", "table_stale", "column_stale",
"relationship_not_found", "relationship_duplicate", "relationship_target_not_unique",
"relationship_type_incompatible", "relationship_read_only", "relationship_request_invalid",
"relationship_operation_failed", "relationship_schema_stale", "column_not_found",
]);
type SafeErrorPayload = {
@@ -104,6 +107,15 @@ const localCodeMessages: Record<string, string> = {
sync_run_not_found: "The synchronization run was not found.",
table_stale: "Table metadata changed. Reload and try again.",
column_stale: "Column metadata changed. Reload and try again.",
relationship_not_found: "The relationship no longer exists. Refresh and try again.",
relationship_duplicate: "This relationship already exists.",
relationship_target_not_unique: "The target column must be the only primary-key column of its table.",
relationship_type_incompatible: "Source and target column types are not compatible.",
relationship_read_only: "Physical relationships are read-only.",
relationship_request_invalid: "The relationship request is invalid.",
relationship_operation_failed: "The relationship operation failed.",
relationship_schema_stale: "Synchronize the current database schema before managing logical relationships.",
column_not_found: "The selected catalog column was not found. Refresh and try again.",
};
const localStatusMessages: Record<number, string> = {