Files
INFRAESTRUCTURA/opencode/monitor-estado-bootstrap.ts
2026-10-03 17:13:39 +02:00

68 lines
2.1 KiB
TypeScript

/**
* Monitor Estado Bootstrap — plugin GLOBAL de OpenCode
*
* Objetivo: que al arrancar OpenCode (en CUALQUIER repositorio) se asegure de que el
* Monitor de estado esta corriendo, lanzando su vigilante en modo `-Once` (idempotente:
* el propio monitor tiene un lock, asi que nunca habra dos instancias).
*
* No depende de ningun repositorio: vive en la config global de OpenCode
* (~/.config/opencode/plugins/) y el vigilante canonico esta en el repo INFRAESTRUCTURA.
*
* Instalacion: `scripts/instalar_global.ps1`.
*
* Nota: el vigilante ya corre como tarea programada al iniciar sesion; este plugin es
* la red de seguridad para cuando OpenCode arranca sin que el monitor este vivo.
*/
import type { Plugin } from "@opencode-ai/plugin"
import { spawn } from "node:child_process"
import { existsSync } from "node:fs"
// --- Configuracion ---------------------------------------------------------
// Vigilante canonico (repo INFRAESTRUCTURA). Se puede sobreescribir con MONITOR_ESTADO_WATCHDOG.
const WATCHDOG =
process.env.MONITOR_ESTADO_WATCHDOG ??
"C:\\Users\\juanm\\Documents\\Github\\INFRAESTRUCTURA\\scripts\\monitor_estado_watchdog.ps1"
const POWERSHELL =
process.env.SystemRoot
? `${process.env.SystemRoot}\\System32\\WindowsPowerShell\\v1.0\\powershell.exe`
: "C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe"
// Evita lanzar el vigilante mas de una vez por proceso de OpenCode.
let launched = false
function ensureMonitor(): void {
if (launched) return
launched = true
try {
if (!existsSync(WATCHDOG)) return
const child = spawn(
POWERSHELL,
[
"-NoProfile",
"-NonInteractive",
"-ExecutionPolicy",
"Bypass",
"-WindowStyle",
"Hidden",
"-File",
WATCHDOG,
"-Once",
],
{ detached: true, stdio: "ignore", windowsHide: true },
)
child.unref()
} catch {
// Silencioso: el arranque de OpenCode no debe romperse por el monitor.
}
}
// --- Plugin ----------------------------------------------------------------
export const MonitorEstadoBootstrap: Plugin = async () => {
ensureMonitor()
return {}
}