diff --git a/scripts/run-gamecult-orchestrator.ps1 b/scripts/run-gamecult-orchestrator.ps1 index 8acea56..2490e03 100644 --- a/scripts/run-gamecult-orchestrator.ps1 +++ b/scripts/run-gamecult-orchestrator.ps1 @@ -355,6 +355,25 @@ try { if ($onlySet.Count -gt 0 -and -not $onlySet.ContainsKey($organ.Id.ToLowerInvariant())) { continue } + $enabledConfigName = switch ($organ.Id) { + "repo-face-memory-maintenance" { "REPO_FACE_MEMORY_MAINTENANCE_ENABLED"; break } + "void-moderation-rumination" { "VOIDBOT_MODERATION_RUMINATION_ENABLED"; break } + "voidbot-operations-watchdog" { "VOIDBOT_OPERATIONS_WATCHDOG_ENABLED"; break } + default { $null } + } + if ($null -ne $enabledConfigName -and -not (Get-ConfigBool -Config $config -Name $enabledConfigName -Default $true)) { + Set-OrganState -State $state -Id $organ.Id -Value ([pscustomobject]@{ + label = $organ.Label + intervalMinutes = $organ.IntervalMinutes + lastStartedAt = $now.ToString("o") + lastFinishedAt = $now.ToString("o") + lastExitCode = 0 + lastStatus = "skipped_disabled" + lastLogPath = $null + }) + Write-JsonFile -Path $statePath -Data $state + continue + } if ($organ.Id -eq "bifrost-dispatch" -and -not (Get-ConfigBool -Config $config -Name "BIFROST_DISPATCH_ENABLED" -Default $false)) { Set-OrganState -State $state -Id $organ.Id -Value ([pscustomobject]@{ label = $organ.Label diff --git a/scripts/run-void-memory-maintenance.ps1 b/scripts/run-void-memory-maintenance.ps1 index 08046f2..a94623b 100644 --- a/scripts/run-void-memory-maintenance.ps1 +++ b/scripts/run-void-memory-maintenance.ps1 @@ -77,6 +77,40 @@ function Read-JsonFile { return $raw | ConvertFrom-Json } +function ConvertFrom-PossibleFencedJson { + param([Parameter(Mandatory = $true)][string] $Text) + + $trimmed = $Text.Trim() + if ($trimmed.StartsWith('```')) { + $match = [regex]::Match($trimmed, '(?s)^```(?:json)?\s*(?.*?)\s*```') + if ($match.Success) { + $trimmed = $match.Groups['json'].Value.Trim() + } + } + return $trimmed | ConvertFrom-Json +} + +function Restore-OperationOutputFromLastMessage { + if ((Test-Path $operationOutputPath) -or -not (Test-Path $lastMessagePath)) { + return $false + } + + $lastMessage = Get-Content -Path $lastMessagePath -Raw -Encoding UTF8 + if ([string]::IsNullOrWhiteSpace($lastMessage)) { + return $false + } + + try { + $parsed = ConvertFrom-PossibleFencedJson -Text $lastMessage + $operations = Convert-ToOperationArray -Value $parsed + Write-JsonFile -Path $operationOutputPath -Data $operations + Append-RunLog "restored operation output from final Codex message." + return $true + } catch { + return $false + } +} + function Read-TextFile { param([Parameter(Mandatory = $true)][string] $Path) return Get-Content -Path $Path -Raw -Encoding UTF8 @@ -614,6 +648,10 @@ if ($exitCode -ne 0) { throw $(if ([string]::IsNullOrWhiteSpace($combinedText)) { "Codex memory maintenance failed with exit code $exitCode." } else { $combinedText }) } +if (-not (Test-Path $operationOutputPath)) { + [void](Restore-OperationOutputFromLastMessage) +} + if (-not (Test-Path $operationOutputPath)) { throw "Memory maintenance completed without writing operation output at $operationOutputPath." }