diff --git a/packages/server/src/index.ts b/packages/server/src/index.ts index 8f983994..72c98425 100644 --- a/packages/server/src/index.ts +++ b/packages/server/src/index.ts @@ -25,6 +25,9 @@ import { resolveNetworkAddresses, resolveRemoteAddresses } from "./server/networ import { startDevReleaseMonitor } from "./releases/dev-release-monitor" import { SpeechService } from "./speech/service" import { SideCarManager } from "./sidecars/manager" +import { ClientConnectionManager } from "./clients/connection-manager" +import { PluginChannelManager } from "./plugins/channel" +import { VoiceModeManager } from "./plugins/voice-mode" const require = createRequire(import.meta.url) @@ -378,6 +381,14 @@ async function main() { const remoteAccessEnabled = options.host === "0.0.0.0" || !isLoopbackHost(options.host) + const clientConnectionManager = new ClientConnectionManager(logger.child({ component: "client-connections" })) + const pluginChannel = new PluginChannelManager(logger.child({ component: "plugin-channel" })) + const voiceModeManager = new VoiceModeManager({ + connections: clientConnectionManager, + channel: pluginChannel, + logger: logger.child({ component: "voice-mode" }), + }) + const httpsPortExplicit = programHasArg(process.argv.slice(2), "--https-port") || Boolean(process.env.CLI_HTTPS_PORT) const httpPortExplicit = programHasArg(process.argv.slice(2), "--http-port") || Boolean(process.env.CLI_HTTP_PORT) @@ -408,6 +419,9 @@ async function main() { speechService, sidecarManager, authManager, + clientConnectionManager, + pluginChannel, + voiceModeManager, uiStaticDir: uiResolution.uiStaticDir ?? DEFAULT_UI_STATIC_DIR, uiDevServerUrl: uiResolution.uiDevServerUrl, logger, @@ -430,6 +444,9 @@ async function main() { speechService, sidecarManager, authManager, + clientConnectionManager, + pluginChannel, + voiceModeManager, uiStaticDir: uiResolution.uiStaticDir ?? DEFAULT_UI_STATIC_DIR, uiDevServerUrl: undefined, logger, @@ -534,6 +551,12 @@ async function main() { logger.error({ err: error }, "SideCar manager shutdown failed") } + try { + clientConnectionManager.shutdown() + } catch (error) { + logger.warn({ err: error }, "Client connection manager shutdown failed") + } + try { await workspaceManager.shutdown() logger.info("Workspace manager shutdown complete") diff --git a/packages/server/src/plugins/voice-mode.ts b/packages/server/src/plugins/voice-mode.ts index 66aff903..a44ae4e6 100644 --- a/packages/server/src/plugins/voice-mode.ts +++ b/packages/server/src/plugins/voice-mode.ts @@ -77,7 +77,10 @@ export class VoiceModeManager { this.aggregateByInstance.delete(instanceId) } - this.options.logger.debug({ instanceId, enabled }, "Broadcasting aggregate voice mode") + this.options.logger.debug( + { instanceId, enabled }, + "Broadcasting aggregate voice mode", + ) this.options.channel.send(instanceId, buildVoiceModeEvent(enabled)) } } diff --git a/packages/server/src/server/http-server.ts b/packages/server/src/server/http-server.ts index 114ecf1c..ee5355c5 100644 --- a/packages/server/src/server/http-server.ts +++ b/packages/server/src/server/http-server.ts @@ -54,6 +54,9 @@ interface HttpServerDeps { speechService: SpeechService sidecarManager: SideCarManager authManager: AuthManager + clientConnectionManager: ClientConnectionManager + pluginChannel: PluginChannelManager + voiceModeManager: VoiceModeManager uiStaticDir: string uiDevServerUrl?: string logger: Logger @@ -182,13 +185,6 @@ export function createHttpServer(deps: HttpServerDeps) { eventBus: deps.eventBus, logger: deps.logger.child({ component: "background-processes" }), }) - const clientConnectionManager = new ClientConnectionManager(deps.logger.child({ component: "client-connections" })) - const pluginChannel = new PluginChannelManager(deps.logger.child({ component: "plugin-channel" })) - const voiceModeManager = new VoiceModeManager({ - connections: clientConnectionManager, - channel: pluginChannel, - logger: deps.logger.child({ component: "voice-mode" }), - }) registerAuthRoutes(app, { authManager: deps.authManager }) @@ -268,7 +264,7 @@ export function createHttpServer(deps: HttpServerDeps) { eventBus: deps.eventBus, registerClient: registerSseClient, logger: sseLogger, - connectionManager: clientConnectionManager, + connectionManager: deps.clientConnectionManager, }) registerWorktreeRoutes(app, { workspaceManager: deps.workspaceManager }) registerStorageRoutes(app, { @@ -289,8 +285,8 @@ export function createHttpServer(deps: HttpServerDeps) { workspaceManager: deps.workspaceManager, eventBus: deps.eventBus, logger: proxyLogger, - channel: pluginChannel, - voiceModeManager, + channel: deps.pluginChannel, + voiceModeManager: deps.voiceModeManager, }) registerBackgroundProcessRoutes(app, { backgroundProcessManager }) registerInstanceProxyRoutes(app, { workspaceManager: deps.workspaceManager, logger: proxyLogger }) @@ -356,7 +352,6 @@ export function createHttpServer(deps: HttpServerDeps) { }, stop: () => { closeSseClients() - clientConnectionManager.shutdown() return app.close() }, }