import { withLocks } from '../keyedLock.js' import { triggerRebuild } from '../previewRebuild.js' import { isDevPreview } from '../analyse.js' import { aufSperrliste } from './einbau.js' /** Austauschbar fuer Tests: Neubau (Tests ersetzen das Feld, nie destrukturieren). */ export const zeitenDeps = { rebuild: triggerRebuild } /** * Neubau fuer den Einbau des Zeiten-Skripts anstossen (Spec 4.6), wenn die Funktion in einen ausgebenden Zustand * (setup/active) wechselt. Hoechstens ein angestossener Neubau gleichzeitig (Portal-weite Sperre 'zeiten-neubau'; * nicht wiederbetretbar, nie innerhalb dieser Sperre aufrufen). * 'angestossen': der Runner hat den Auftrag angenommen (result.queued === true). * 'manuell': kein Repo, Preview aus, Dev-Modus, Sperrliste, Runner ausgelastet (503) oder Fehler; das Team baut ein. * Wirft nie. */ export async function stosseNeubauAn(project) { try { if (!project?.repoFullName || project.previewMode === 'off' || isDevPreview(project) || aufSperrliste(project)) return 'manuell' const result = await withLocks(['zeiten-neubau'], () => zeitenDeps.rebuild(project)) return result?.queued === true ? 'angestossen' : 'manuell' } catch (err) { // Zustand bleibt gespeichert, das Team setzt die Zeile von Hand ein console.warn(`[zeiten] Neubau für Projekt ${project?.$id} nicht angestoßen: ${err?.message}`) return 'manuell' } }