From 18421a1af0d0d24ef239c77ddbf4552e7b55a8b4 Mon Sep 17 00:00:00 2001 From: Alexander Zielonka Date: Wed, 9 Sep 2026 18:13:00 +0200 Subject: [PATCH] Starter brachte den Daemon bei seiner ersten Logzeile um Die Aufgabe scheiterte mit Code 1, abdulive.log gab es gar nicht. Ursache: & $node $main ingest 2>&1 | ForEach-Object { ... } Windows PowerShell 5.1 verpackt jede stderr-Zeile eines nativen Programms in einen ErrorRecord. Zusammen mit $ErrorActionPreference = Stop beendet das sofort das ganze Skript - und der Daemon schreibt im Normalbetrieb Warnungen auf stderr ("Kein Broadcaster-Token ..."). Er starb also an seiner eigenen ersten Meldung, bevor irgendetwas ins Protokoll kam. - launcher.ps1 startet jetzt ueber Start-Process mit getrennten Umleitungen fuer stdout und stderr, je Lauf rotiert - install.ps1 ruft native Programme ueber eine Hilfsfunktion auf, die ErrorActionPreference kurz zurueckstellt - NODE_OPTIONS=--disable-warning=ExperimentalWarning fehlte im Paket; im Container stand es in der Dockerfile Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_01AhVSfMFdWnXKCv5JfLnArZ --- scripts/build-package.ts | 11 ++++++++++- scripts/install.ps1 | 25 +++++++++++++++++++++---- scripts/launcher.ps1 | 31 ++++++++++++++++++++++++++----- 3 files changed, 57 insertions(+), 10 deletions(-) diff --git a/scripts/build-package.ts b/scripts/build-package.ts index e1550d5..df01e45 100644 --- a/scripts/build-package.ts +++ b/scripts/build-package.ts @@ -184,9 +184,18 @@ async function main(): Promise { name: 'version.json', data: Buffer.from(JSON.stringify(manifestInPackage, null, 2) + '\n'), }); + // NODE_OPTIONS setzen: node:sqlite meldet sich sonst bei jedem Aufruf mit + // einer ExperimentalWarning auf stderr. Im Container stand das in der + // Dockerfile - beim Umzug ging es verloren, und unter PowerShell wird aus + // stderr schnell ein Abbruch (siehe launcher.ps1). files.push({ name: 'abdulive.cmd', - data: Buffer.from('@echo off\r\n"%~dp0node.exe" "%~dp0app\\apps\\cli\\main.ts" %*\r\n'), + data: Buffer.from([ + '@echo off', + 'set "NODE_OPTIONS=--disable-warning=ExperimentalWarning"', + '"%~dp0node.exe" "%~dp0app\\apps\\cli\\main.ts" %*', + '', + ].join('\r\n')), }); // --- packen diff --git a/scripts/install.ps1 b/scripts/install.ps1 index 1d52b79..2edcbf2 100644 --- a/scripts/install.ps1 +++ b/scripts/install.ps1 @@ -30,6 +30,24 @@ param( $ErrorActionPreference = 'Stop' $daten = Join-Path $env:LOCALAPPDATA 'abdulive' +# Experimentelle Warnungen abschalten - node:sqlite meldet sich sonst bei +# jedem Aufruf auf stderr. +$env:NODE_OPTIONS = '--disable-warning=ExperimentalWarning' + +function Ruf { + <# + Ein natives Programm aufrufen, ohne dass seine stderr-Ausgabe das + Skript beendet. Windows PowerShell 5.1 verpackt jede stderr-Zeile in + einen ErrorRecord; zusammen mit ErrorActionPreference = 'Stop' bricht + dann alles ab, sobald das Programm auch nur eine Warnung schreibt. + #> + param([string]$Datei, [string[]]$Argumente) + $alt = $ErrorActionPreference + $ErrorActionPreference = 'Continue' + try { & $Datei @Argumente; return $LASTEXITCODE } + finally { $ErrorActionPreference = $alt } +} + function Schritt($text) { Write-Host "==> $text" -ForegroundColor Cyan } function Hinweis($text) { Write-Host " $text" -ForegroundColor DarkGray } @@ -170,15 +188,14 @@ if (-not $OhneModell) { Schritt 'Sprachmodell laden (einmalig, ca. 465 MB)' # Nicht abbrechen, wenn das schiefgeht: das Toolkit laeuft auch ohne # Modell, es entstehen dann nur Clips ohne Untertitel. - & $cmd fetch-model - if ($LASTEXITCODE -ne 0) { + $code = Ruf $cmd @('fetch-model') + if ($code -ne 0) { Hinweis 'Fehlgeschlagen. Spaeter nachholen mit: abdulive fetch-model' } } Schritt 'Selbsttest' -& $cmd check-env -$selbsttest = $LASTEXITCODE +$selbsttest = Ruf $cmd @('check-env') if (-not $KeinAutostart) { Schritt 'Starten' diff --git a/scripts/launcher.ps1 b/scripts/launcher.ps1 index dc05ed0..cd0086b 100644 --- a/scripts/launcher.ps1 +++ b/scripts/launcher.ps1 @@ -59,9 +59,30 @@ $node = Join-Path $root 'node.exe' $main = Join-Path $root 'app\apps\cli\main.ts' if (-not (Test-Path $node)) { Write-Log "node.exe fehlt in $root"; exit 1 } -Write-Log 'Starte den Daemon.' -& $node $main ingest 2>&1 | ForEach-Object { - Add-Content -Path (Join-Path $log 'abdulive.log') -Value $_ -Encoding utf8 +# Experimentelle Warnungen abschalten. node:sqlite meldet sich sonst bei +# jedem Start auf stderr - im Container stand das in der Dockerfile. +$env:NODE_OPTIONS = '--disable-warning=ExperimentalWarning' + +$aus = Join-Path $log 'abdulive.log' +$fehler = Join-Path $log 'abdulive-fehler.log' + +# Vorherigen Lauf beiseitelegen statt anzuhaengen: Start-Process kann nicht +# anhaengen, und ein Protokoll pro Lauf ist beim Suchen ohnehin angenehmer. +foreach ($f in @($aus, $fehler)) { + if (Test-Path $f) { Move-Item $f "$f.1" -Force } } -Write-Log "Daemon beendet (Code $LASTEXITCODE)." -exit $LASTEXITCODE + +Write-Log 'Starte den Daemon.' + +# NICHT `& $node ... 2>&1 | ...` verwenden. Windows PowerShell 5.1 verpackt +# jede stderr-Zeile eines nativen Programms in einen ErrorRecord, und mit +# $ErrorActionPreference = 'Stop' beendet das sofort das ganze Skript. Der +# Daemon schreibt aber im Normalbetrieb Warnungen auf stderr ("Kein +# Broadcaster-Token ..."), und genau daran ist er beim ersten Versuch +# gestorben - noch bevor eine einzige Zeile im Protokoll stand. +$p = Start-Process -FilePath $node -ArgumentList @($main, 'ingest') ` + -NoNewWindow -PassThru -Wait ` + -RedirectStandardOutput $aus -RedirectStandardError $fehler + +Write-Log "Daemon beendet (Code $($p.ExitCode))." +exit $p.ExitCode