feat: single-image transform, NAS/FTP in delivery, backup-all any target, metadata sidecar, prompt view, preset manager, API token + MCP server

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XNQ8ghPfzAfsyVYd6HgFb6
This commit is contained in:
2026-07-23 21:29:43 +00:00
parent 5cfafb456c
commit 295f0ce91e
19 changed files with 479 additions and 69 deletions
+6 -8
View File
@@ -91,7 +91,7 @@ export async function processItem(itemId: string): Promise<ProcessResult> {
// Prompt + ob das Modell überhaupt gebraucht wird, je Modus.
let prompt: string;
let needsModel: boolean;
if (mode === 'compose') { prompt = buildComposePrompt(description, cropMode === 'extend'); needsModel = true; }
if (mode === 'compose') { prompt = buildComposePrompt(description, cropMode === 'extend', sourceKeys.length); needsModel = true; }
else if (mode === 'generate') { prompt = buildGeneratePrompt(description); needsModel = true; }
else {
prompt = buildPrompt({ tasks, cropMode, customInstruction: r.custom_instruction });
@@ -161,13 +161,11 @@ export async function processItem(itemId: string): Promise<ProcessResult> {
for (const k of sourceKeys) await deleteObject(k).catch(() => {});
}
// Zweite Sicherung auf NAS (best effort, blockiert den Erfolg nicht).
if (cfg?.nas_enabled) {
try {
const { mirrorItemToNas } = await import('./nas');
await mirrorItemToNas(itemId);
} catch (e) { console.error('[process] NAS-Spiegelung fehlgeschlagen', e); }
}
// Zweite Sicherung auf alle Backup-Ziele (NAS + is_backup-Ziele), best effort.
try {
const { backupItem } = await import('./backup');
await backupItem(itemId);
} catch (e) { console.error('[process] Backup fehlgeschlagen', e); }
return { ok: true, cost };
} catch (e: any) {