feat(studio): recover matching Nitro sources and persist import phases
CI / check (push) Successful in 2m5s
CI / deploy (push) Successful in 1m8s
CI / publish-container (push) Successful in 1m4s

This commit is contained in:
Simo committed 2026-09-11 10:22:06 +02:00
1 parent 00e33623f7
commit 13bd3695cb
45 files changed
+903 -28

No files matched your search

+14
View File
@@ -541,6 +541,20 @@
"failures": "{count} failures",
"streaming": "Streaming response: timing stops at response creation, not at the end of the operation.",
"operation": "Operation ID"
},
"importProgress": {
"validating": "Checking local data",
"downloading": "Downloading files",
"converting": "Converting to Nitro",
"checking_sources": "Searching configured sources",
"writing_db": "Saving SQL and catalog",
"writing_furnidata": "Updating furnidata",
"translating": "Updating translations",
"current": "Current phase: {phase}",
"last": "Last phase: {phase}",
"elapsed": "{seconds}s in this phase",
"recovered": "Bundle recovered from {source} · revision {revision}. Classname, type and revision matched; bundle identity validated.",
"recoveryHint": "You can continue. If the original files fail, the importer will search enabled sources for a matching classname, type and revision, then validate the Nitro bundle. Unavailable files can still be attached manually."
}
},
"myDashboard": {
+14
View File
@@ -3495,6 +3495,20 @@
"failures": "{count} failures",
"streaming": "Streaming response: timing stops at response creation, not at the end of the operation.",
"operation": "Operation ID"
},
"importProgress": {
"validating": "Checking local data",
"downloading": "Downloading files",
"converting": "Converting to Nitro",
"checking_sources": "Searching configured sources",
"writing_db": "Saving SQL and catalog",
"writing_furnidata": "Updating furnidata",
"translating": "Updating translations",
"current": "Current phase: {phase}",
"last": "Last phase: {phase}",
"elapsed": "{seconds}s in this phase",
"recovered": "Bundle recovered from {source} · revision {revision}. Classname, type and revision matched; bundle identity validated.",
"recoveryHint": "You can continue. If the original files fail, the importer will search enabled sources for a matching classname, type and revision, then validate the Nitro bundle. Unavailable files can still be attached manually."
}
},
"error": {
+14
View File
@@ -3495,6 +3495,20 @@
"failures": "{count} failures",
"streaming": "Streaming response: timing stops at response creation, not at the end of the operation.",
"operation": "Operation ID"
},
"importProgress": {
"validating": "Checking local data",
"downloading": "Downloading files",
"converting": "Converting to Nitro",
"checking_sources": "Searching configured sources",
"writing_db": "Saving SQL and catalog",
"writing_furnidata": "Updating furnidata",
"translating": "Updating translations",
"current": "Current phase: {phase}",
"last": "Last phase: {phase}",
"elapsed": "{seconds}s in this phase",
"recovered": "Bundle recovered from {source} · revision {revision}. Classname, type and revision matched; bundle identity validated.",
"recoveryHint": "You can continue. If the original files fail, the importer will search enabled sources for a matching classname, type and revision, then validate the Nitro bundle. Unavailable files can still be attached manually."
}
},
"error": {
+14
View File
@@ -3495,6 +3495,20 @@
"failures": "{count} failures",
"streaming": "Streaming response: timing stops at response creation, not at the end of the operation.",
"operation": "Operation ID"
},
"importProgress": {
"validating": "Checking local data",
"downloading": "Downloading files",
"converting": "Converting to Nitro",
"checking_sources": "Searching configured sources",
"writing_db": "Saving SQL and catalog",
"writing_furnidata": "Updating furnidata",
"translating": "Updating translations",
"current": "Current phase: {phase}",
"last": "Last phase: {phase}",
"elapsed": "{seconds}s in this phase",
"recovered": "Bundle recovered from {source} · revision {revision}. Classname, type and revision matched; bundle identity validated.",
"recoveryHint": "You can continue. If the original files fail, the importer will search enabled sources for a matching classname, type and revision, then validate the Nitro bundle. Unavailable files can still be attached manually."
}
},
"error": {
+14
View File
@@ -3466,6 +3466,20 @@
"failures": "{count} failures",
"streaming": "Streaming response: timing stops at response creation, not at the end of the operation.",
"operation": "Operation ID"
},
"importProgress": {
"validating": "Checking local data",
"downloading": "Downloading files",
"converting": "Converting to Nitro",
"checking_sources": "Searching configured sources",
"writing_db": "Saving SQL and catalog",
"writing_furnidata": "Updating furnidata",
"translating": "Updating translations",
"current": "Current phase: {phase}",
"last": "Last phase: {phase}",
"elapsed": "{seconds}s in this phase",
"recovered": "Bundle recovered from {source} · revision {revision}. Classname, type and revision matched; bundle identity validated.",
"recoveryHint": "You can continue. If the original files fail, the importer will search enabled sources for a matching classname, type and revision, then validate the Nitro bundle. Unavailable files can still be attached manually."
}
},
"radioRequests": {
+14
View File
@@ -3495,6 +3495,20 @@
"failures": "{count} failures",
"streaming": "Streaming response: timing stops at response creation, not at the end of the operation.",
"operation": "Operation ID"
},
"importProgress": {
"validating": "Checking local data",
"downloading": "Downloading files",
"converting": "Converting to Nitro",
"checking_sources": "Searching configured sources",
"writing_db": "Saving SQL and catalog",
"writing_furnidata": "Updating furnidata",
"translating": "Updating translations",
"current": "Current phase: {phase}",
"last": "Last phase: {phase}",
"elapsed": "{seconds}s in this phase",
"recovered": "Bundle recovered from {source} · revision {revision}. Classname, type and revision matched; bundle identity validated.",
"recoveryHint": "You can continue. If the original files fail, the importer will search enabled sources for a matching classname, type and revision, then validate the Nitro bundle. Unavailable files can still be attached manually."
}
},
"error": {
+14
View File
@@ -4380,6 +4380,20 @@
"failures": "{count} failures",
"streaming": "Streaming response: timing stops at response creation, not at the end of the operation.",
"operation": "Operation ID"
},
"importProgress": {
"validating": "Checking local data",
"downloading": "Downloading files",
"converting": "Converting to Nitro",
"checking_sources": "Searching configured sources",
"writing_db": "Saving SQL and catalog",
"writing_furnidata": "Updating furnidata",
"translating": "Updating translations",
"current": "Current phase: {phase}",
"last": "Last phase: {phase}",
"elapsed": "{seconds}s in this phase",
"recovered": "Bundle recovered from {source} · revision {revision}. Classname, type and revision matched; bundle identity validated.",
"recoveryHint": "You can continue. If the original files fail, the importer will search enabled sources for a matching classname, type and revision, then validate the Nitro bundle. Unavailable files can still be attached manually."
}
},
"mod": {
+14
View File
@@ -3466,6 +3466,20 @@
"failures": "{count} failures",
"streaming": "Streaming response: timing stops at response creation, not at the end of the operation.",
"operation": "Operation ID"
},
"importProgress": {
"validating": "Checking local data",
"downloading": "Downloading files",
"converting": "Converting to Nitro",
"checking_sources": "Searching configured sources",
"writing_db": "Saving SQL and catalog",
"writing_furnidata": "Updating furnidata",
"translating": "Updating translations",
"current": "Current phase: {phase}",
"last": "Last phase: {phase}",
"elapsed": "{seconds}s in this phase",
"recovered": "Bundle recovered from {source} · revision {revision}. Classname, type and revision matched; bundle identity validated.",
"recoveryHint": "You can continue. If the original files fail, the importer will search enabled sources for a matching classname, type and revision, then validate the Nitro bundle. Unavailable files can still be attached manually."
}
},
"radioRequests": {
+14
View File
@@ -541,6 +541,20 @@
"failures": "{count} failures",
"streaming": "Streaming response: timing stops at response creation, not at the end of the operation.",
"operation": "Operation ID"
},
"importProgress": {
"validating": "Checking local data",
"downloading": "Downloading files",
"converting": "Converting to Nitro",
"checking_sources": "Searching configured sources",
"writing_db": "Saving SQL and catalog",
"writing_furnidata": "Updating furnidata",
"translating": "Updating translations",
"current": "Current phase: {phase}",
"last": "Last phase: {phase}",
"elapsed": "{seconds}s in this phase",
"recovered": "Bundle recovered from {source} · revision {revision}. Classname, type and revision matched; bundle identity validated.",
"recoveryHint": "You can continue. If the original files fail, the importer will search enabled sources for a matching classname, type and revision, then validate the Nitro bundle. Unavailable files can still be attached manually."
}
},
"myDashboard": {
+14
View File
@@ -3466,6 +3466,20 @@
"failures": "{count} failures",
"streaming": "Streaming response: timing stops at response creation, not at the end of the operation.",
"operation": "Operation ID"
},
"importProgress": {
"validating": "Checking local data",
"downloading": "Downloading files",
"converting": "Converting to Nitro",
"checking_sources": "Searching configured sources",
"writing_db": "Saving SQL and catalog",
"writing_furnidata": "Updating furnidata",
"translating": "Updating translations",
"current": "Current phase: {phase}",
"last": "Last phase: {phase}",
"elapsed": "{seconds}s in this phase",
"recovered": "Bundle recovered from {source} · revision {revision}. Classname, type and revision matched; bundle identity validated.",
"recoveryHint": "You can continue. If the original files fail, the importer will search enabled sources for a matching classname, type and revision, then validate the Nitro bundle. Unavailable files can still be attached manually."
}
},
"radioRequests": {
+14
View File
@@ -3495,6 +3495,20 @@
"failures": "{count} failures",
"streaming": "Streaming response: timing stops at response creation, not at the end of the operation.",
"operation": "Operation ID"
},
"importProgress": {
"validating": "Checking local data",
"downloading": "Downloading files",
"converting": "Converting to Nitro",
"checking_sources": "Searching configured sources",
"writing_db": "Saving SQL and catalog",
"writing_furnidata": "Updating furnidata",
"translating": "Updating translations",
"current": "Current phase: {phase}",
"last": "Last phase: {phase}",
"elapsed": "{seconds}s in this phase",
"recovered": "Bundle recovered from {source} · revision {revision}. Classname, type and revision matched; bundle identity validated.",
"recoveryHint": "You can continue. If the original files fail, the importer will search enabled sources for a matching classname, type and revision, then validate the Nitro bundle. Unavailable files can still be attached manually."
}
},
"error": {
+14
View File
@@ -3495,6 +3495,20 @@
"failures": "{count} failures",
"streaming": "Streaming response: timing stops at response creation, not at the end of the operation.",
"operation": "Operation ID"
},
"importProgress": {
"validating": "Checking local data",
"downloading": "Downloading files",
"converting": "Converting to Nitro",
"checking_sources": "Searching configured sources",
"writing_db": "Saving SQL and catalog",
"writing_furnidata": "Updating furnidata",
"translating": "Updating translations",
"current": "Current phase: {phase}",
"last": "Last phase: {phase}",
"elapsed": "{seconds}s in this phase",
"recovered": "Bundle recovered from {source} · revision {revision}. Classname, type and revision matched; bundle identity validated.",
"recoveryHint": "You can continue. If the original files fail, the importer will search enabled sources for a matching classname, type and revision, then validate the Nitro bundle. Unavailable files can still be attached manually."
}
},
"error": {
+14
View File
@@ -4355,6 +4355,20 @@
"failures": "{count} errori",
"streaming": "Risposta in streaming: la misura termina alla creazione della risposta, non alla fine dell’operazione.",
"operation": "ID operazione"
},
"importProgress": {
"validating": "Verifica dati locali",
"downloading": "Download dei file",
"converting": "Conversione in Nitro",
"checking_sources": "Ricerca nelle sorgenti configurate",
"writing_db": "Salvataggio SQL e catalogo",
"writing_furnidata": "Aggiornamento furnidata",
"translating": "Aggiornamento traduzioni",
"current": "Fase attuale: {phase}",
"last": "Ultima fase: {phase}",
"elapsed": "{seconds}s in questa fase",
"recovered": "Bundle recuperato da {source} · revisione {revision}. Classname, tipo e revisione corrispondenti; identità del bundle verificata.",
"recoveryHint": "Puoi continuare. Se i file originali non sono disponibili, l’importatore cercherà nelle sorgenti attive lo stesso classname, tipo e revisione, verificando poi il bundle Nitro. Puoi comunque allegare manualmente i file mancanti."
}
},
"radioRequests": {
+14
View File
@@ -541,6 +541,20 @@
"failures": "{count} failures",
"streaming": "Streaming response: timing stops at response creation, not at the end of the operation.",
"operation": "Operation ID"
},
"importProgress": {
"validating": "Checking local data",
"downloading": "Downloading files",
"converting": "Converting to Nitro",
"checking_sources": "Searching configured sources",
"writing_db": "Saving SQL and catalog",
"writing_furnidata": "Updating furnidata",
"translating": "Updating translations",
"current": "Current phase: {phase}",
"last": "Last phase: {phase}",
"elapsed": "{seconds}s in this phase",
"recovered": "Bundle recovered from {source} · revision {revision}. Classname, type and revision matched; bundle identity validated.",
"recoveryHint": "You can continue. If the original files fail, the importer will search enabled sources for a matching classname, type and revision, then validate the Nitro bundle. Unavailable files can still be attached manually."
}
},
"myDashboard": {
+14
View File
@@ -3971,6 +3971,20 @@
"failures": "{count} fouten",
"streaming": "Streamingantwoord: de meting stopt bij het aanmaken van het antwoord, niet aan het einde van de operatie.",
"operation": "Operatie-ID"
},
"importProgress": {
"validating": "Lokale gegevens controleren",
"downloading": "Bestanden downloaden",
"converting": "Omzetten naar Nitro",
"checking_sources": "In ingestelde bronnen zoeken",
"writing_db": "SQL en catalogus opslaan",
"writing_furnidata": "Furnidata bijwerken",
"translating": "Vertalingen bijwerken",
"current": "Huidige fase: {phase}",
"last": "Laatste fase: {phase}",
"elapsed": "{seconds}s in deze fase",
"recovered": "Bundel hersteld via {source} · revisie {revision}. Classname, type en revisie komen overeen; identiteit van de bundel gecontroleerd.",
"recoveryHint": "Je kunt doorgaan. Als de oorspronkelijke bestanden ontbreken, zoekt de importeur in actieve bronnen naar dezelfde classname, hetzelfde type en dezelfde revisie en controleert daarna de Nitro-bundel. Ontbrekende bestanden kun je ook handmatig toevoegen."
}
},
"mod": {
+14
View File
@@ -3495,6 +3495,20 @@
"failures": "{count} failures",
"streaming": "Streaming response: timing stops at response creation, not at the end of the operation.",
"operation": "Operation ID"
},
"importProgress": {
"validating": "Checking local data",
"downloading": "Downloading files",
"converting": "Converting to Nitro",
"checking_sources": "Searching configured sources",
"writing_db": "Saving SQL and catalog",
"writing_furnidata": "Updating furnidata",
"translating": "Updating translations",
"current": "Current phase: {phase}",
"last": "Last phase: {phase}",
"elapsed": "{seconds}s in this phase",
"recovered": "Bundle recovered from {source} · revision {revision}. Classname, type and revision matched; bundle identity validated.",
"recoveryHint": "You can continue. If the original files fail, the importer will search enabled sources for a matching classname, type and revision, then validate the Nitro bundle. Unavailable files can still be attached manually."
}
},
"error": {
+14
View File
@@ -3496,6 +3496,20 @@
"failures": "{count} failures",
"streaming": "Streaming response: timing stops at response creation, not at the end of the operation.",
"operation": "Operation ID"
},
"importProgress": {
"validating": "Checking local data",
"downloading": "Downloading files",
"converting": "Converting to Nitro",
"checking_sources": "Searching configured sources",
"writing_db": "Saving SQL and catalog",
"writing_furnidata": "Updating furnidata",
"translating": "Updating translations",
"current": "Current phase: {phase}",
"last": "Last phase: {phase}",
"elapsed": "{seconds}s in this phase",
"recovered": "Bundle recovered from {source} · revision {revision}. Classname, type and revision matched; bundle identity validated.",
"recoveryHint": "You can continue. If the original files fail, the importer will search enabled sources for a matching classname, type and revision, then validate the Nitro bundle. Unavailable files can still be attached manually."
}
},
"error": {
+14
View File
@@ -3496,6 +3496,20 @@
"failures": "{count} failures",
"streaming": "Streaming response: timing stops at response creation, not at the end of the operation.",
"operation": "Operation ID"
},
"importProgress": {
"validating": "Checking local data",
"downloading": "Downloading files",
"converting": "Converting to Nitro",
"checking_sources": "Searching configured sources",
"writing_db": "Saving SQL and catalog",
"writing_furnidata": "Updating furnidata",
"translating": "Updating translations",
"current": "Current phase: {phase}",
"last": "Last phase: {phase}",
"elapsed": "{seconds}s in this phase",
"recovered": "Bundle recovered from {source} · revision {revision}. Classname, type and revision matched; bundle identity validated.",
"recoveryHint": "You can continue. If the original files fail, the importer will search enabled sources for a matching classname, type and revision, then validate the Nitro bundle. Unavailable files can still be attached manually."
}
},
"error": {
+14
View File
@@ -3495,6 +3495,20 @@
"failures": "{count} failures",
"streaming": "Streaming response: timing stops at response creation, not at the end of the operation.",
"operation": "Operation ID"
},
"importProgress": {
"validating": "Checking local data",
"downloading": "Downloading files",
"converting": "Converting to Nitro",
"checking_sources": "Searching configured sources",
"writing_db": "Saving SQL and catalog",
"writing_furnidata": "Updating furnidata",
"translating": "Updating translations",
"current": "Current phase: {phase}",
"last": "Last phase: {phase}",
"elapsed": "{seconds}s in this phase",
"recovered": "Bundle recovered from {source} · revision {revision}. Classname, type and revision matched; bundle identity validated.",
"recoveryHint": "You can continue. If the original files fail, the importer will search enabled sources for a matching classname, type and revision, then validate the Nitro bundle. Unavailable files can still be attached manually."
}
},
"error": {
+14
View File
@@ -3494,6 +3494,20 @@
"failures": "{count} failures",
"streaming": "Streaming response: timing stops at response creation, not at the end of the operation.",
"operation": "Operation ID"
},
"importProgress": {
"validating": "Checking local data",
"downloading": "Downloading files",
"converting": "Converting to Nitro",
"checking_sources": "Searching configured sources",
"writing_db": "Saving SQL and catalog",
"writing_furnidata": "Updating furnidata",
"translating": "Updating translations",
"current": "Current phase: {phase}",
"last": "Last phase: {phase}",
"elapsed": "{seconds}s in this phase",
"recovered": "Bundle recovered from {source} · revision {revision}. Classname, type and revision matched; bundle identity validated.",
"recoveryHint": "You can continue. If the original files fail, the importer will search enabled sources for a matching classname, type and revision, then validate the Nitro bundle. Unavailable files can still be attached manually."
}
},
"error": {
+14
View File
@@ -3495,6 +3495,20 @@
"failures": "{count} failures",
"streaming": "Streaming response: timing stops at response creation, not at the end of the operation.",
"operation": "Operation ID"
},
"importProgress": {
"validating": "Checking local data",
"downloading": "Downloading files",
"converting": "Converting to Nitro",
"checking_sources": "Searching configured sources",
"writing_db": "Saving SQL and catalog",
"writing_furnidata": "Updating furnidata",
"translating": "Updating translations",
"current": "Current phase: {phase}",
"last": "Last phase: {phase}",
"elapsed": "{seconds}s in this phase",
"recovered": "Bundle recovered from {source} · revision {revision}. Classname, type and revision matched; bundle identity validated.",
"recoveryHint": "You can continue. If the original files fail, the importer will search enabled sources for a matching classname, type and revision, then validate the Nitro bundle. Unavailable files can still be attached manually."
}
},
"error": {
+14
View File
@@ -3495,6 +3495,20 @@
"failures": "{count} failures",
"streaming": "Streaming response: timing stops at response creation, not at the end of the operation.",
"operation": "Operation ID"
},
"importProgress": {
"validating": "Checking local data",
"downloading": "Downloading files",
"converting": "Converting to Nitro",
"checking_sources": "Searching configured sources",
"writing_db": "Saving SQL and catalog",
"writing_furnidata": "Updating furnidata",
"translating": "Updating translations",
"current": "Current phase: {phase}",
"last": "Last phase: {phase}",
"elapsed": "{seconds}s in this phase",
"recovered": "Bundle recovered from {source} · revision {revision}. Classname, type and revision matched; bundle identity validated.",
"recoveryHint": "You can continue. If the original files fail, the importer will search enabled sources for a matching classname, type and revision, then validate the Nitro bundle. Unavailable files can still be attached manually."
}
},
"error": {
+14
View File
@@ -3495,6 +3495,20 @@
"failures": "{count} failures",
"streaming": "Streaming response: timing stops at response creation, not at the end of the operation.",
"operation": "Operation ID"
},
"importProgress": {
"validating": "Checking local data",
"downloading": "Downloading files",
"converting": "Converting to Nitro",
"checking_sources": "Searching configured sources",
"writing_db": "Saving SQL and catalog",
"writing_furnidata": "Updating furnidata",
"translating": "Updating translations",
"current": "Current phase: {phase}",
"last": "Last phase: {phase}",
"elapsed": "{seconds}s in this phase",
"recovered": "Bundle recovered from {source} · revision {revision}. Classname, type and revision matched; bundle identity validated.",
"recoveryHint": "You can continue. If the original files fail, the importer will search enabled sources for a matching classname, type and revision, then validate the Nitro bundle. Unavailable files can still be attached manually."
}
},
"error": {
+14
View File
@@ -3496,6 +3496,20 @@
"failures": "{count} failures",
"streaming": "Streaming response: timing stops at response creation, not at the end of the operation.",
"operation": "Operation ID"
},
"importProgress": {
"validating": "Checking local data",
"downloading": "Downloading files",
"converting": "Converting to Nitro",
"checking_sources": "Searching configured sources",
"writing_db": "Saving SQL and catalog",
"writing_furnidata": "Updating furnidata",
"translating": "Updating translations",
"current": "Current phase: {phase}",
"last": "Last phase: {phase}",
"elapsed": "{seconds}s in this phase",
"recovered": "Bundle recovered from {source} · revision {revision}. Classname, type and revision matched; bundle identity validated.",
"recoveryHint": "You can continue. If the original files fail, the importer will search enabled sources for a matching classname, type and revision, then validate the Nitro bundle. Unavailable files can still be attached manually."
}
},
"error": {
+14
View File
@@ -3495,6 +3495,20 @@
"failures": "{count} failures",
"streaming": "Streaming response: timing stops at response creation, not at the end of the operation.",
"operation": "Operation ID"
},
"importProgress": {
"validating": "Checking local data",
"downloading": "Downloading files",
"converting": "Converting to Nitro",
"checking_sources": "Searching configured sources",
"writing_db": "Saving SQL and catalog",
"writing_furnidata": "Updating furnidata",
"translating": "Updating translations",
"current": "Current phase: {phase}",
"last": "Last phase: {phase}",
"elapsed": "{seconds}s in this phase",
"recovered": "Bundle recovered from {source} · revision {revision}. Classname, type and revision matched; bundle identity validated.",
"recoveryHint": "You can continue. If the original files fail, the importer will search enabled sources for a matching classname, type and revision, then validate the Nitro bundle. Unavailable files can still be attached manually."
}
},
"error": {