9a9416c99c
* feat: support profile-aware group chat bridge flows * feat: route cron jobs through hermes cli * Fix group chat routing and isolate bridge tests * Add Grok image-to-video media skill * Default Grok videos to media directory * Fix bridge profile fallback and cron repeat clearing * Refine bridge chat and gateway platform handling * Filter bridge tool-call text deltas * Preserve structured bridge chat history * Prepare beta release build artifacts * Fix Windows run profile resolution * Fix Windows path compatibility checks * Fix profile-scoped model page display * Hide Windows subprocess windows for jobs and updates * Hide Windows file backend subprocess windows * Avoid Windows gateway restart lock conflicts * Treat Windows gateway lock as running on startup * Force release Windows gateway lock on restart * Tighten Windows gateway lock cleanup * Update chat e2e source expectation * Bump package version to 0.5.30 --------- Co-authored-by: Codex <codex@openai.com>
63 lines
1.8 KiB
TypeScript
63 lines
1.8 KiB
TypeScript
import { logger } from './logger'
|
|
import { closeDb } from '../db'
|
|
|
|
export function bindShutdown(server: any, groupChatServer?: any, chatRunServer?: any, agentBridgeManager?: any): void {
|
|
let isShuttingDown = false
|
|
|
|
const shutdown = async (signal: string) => {
|
|
if (isShuttingDown) return
|
|
isShuttingDown = true
|
|
|
|
// Force exit after 3s no matter what
|
|
setTimeout(() => process.exit(0), 3000)
|
|
|
|
logger.info('Shutting down (%s)...', signal)
|
|
console.log(`[shutdown] Received signal: ${signal}`)
|
|
|
|
try {
|
|
if (agentBridgeManager) {
|
|
try {
|
|
await agentBridgeManager.stop()
|
|
logger.info('Agent bridge stopped')
|
|
} catch (err) {
|
|
logger.warn(err, 'Failed to stop agent bridge (non-fatal)')
|
|
}
|
|
}
|
|
|
|
// Close ChatRunSocket first to abort all active runs and close EventSource connections
|
|
if (chatRunServer) {
|
|
chatRunServer.close()
|
|
logger.info('ChatRunSocket closed')
|
|
}
|
|
|
|
// Disconnect Socket.IO before HTTP server to prevent hanging
|
|
if (groupChatServer) {
|
|
groupChatServer.agentClients.disconnectAll()
|
|
groupChatServer.getIO().close()
|
|
logger.info('Socket.IO closed')
|
|
}
|
|
|
|
const servers = Array.isArray(server) ? server : [server].filter(Boolean)
|
|
if (servers.length) {
|
|
await Promise.all(servers.map((httpServer) => (
|
|
new Promise<void>((resolve) => {
|
|
httpServer.close(() => {
|
|
logger.info('HTTP server closed')
|
|
resolve()
|
|
})
|
|
})
|
|
)))
|
|
}
|
|
} catch (err) {
|
|
logger.error(err, 'Shutdown error')
|
|
}
|
|
|
|
closeDb()
|
|
process.exit(0)
|
|
}
|
|
|
|
process.once('SIGUSR2', shutdown)
|
|
process.on('SIGINT', shutdown)
|
|
process.on('SIGTERM', shutdown)
|
|
}
|