export const createBootstrapRuntime = (dependencies) => { const { createUiAuth, registerServerStatusRoutes, registerCommonRequestMiddleware, registerAuthAndAccessRoutes, registerTtsRoutes, registerNotificationRoutes, registerOpenChamberRoutes, registerAgentToolRoutes = () => {}, express, } = dependencies; const setupBaseRoutes = (app, options) => { const { process, openchamberVersion, runtimeName, serverStartedAt, gracefulShutdown, getHealthSnapshot, getServerPort, getTunnelUrl, verboseRequestLogs, uiPassword, tunnelAuthController, remoteClientAuthRuntime, clientPairingRuntime, getRelayPairingCandidate, reconcileRelay, getPairingTransports, getDirectCandidateUrls, getServerId, getServerLabel, readSettingsFromDiskMigrated, normalizeTunnelSessionTtlMs, sayTTSCapability, ensurePushInitialized, ensureGlobalWatcherStarted, getOrCreateVapidKeys, getUiSessionTokenFromRequest, writeSettingsToDisk, addOrUpdatePushSubscription, removePushSubscription, addOrUpdateApnsToken, removeApnsToken, updateUiVisibility, clearPendingPushBadge, isUiVisible, getUiNotificationClients, writeSseEvent, sessionRuntime, setPushInitialized, fs, os, path, server, __dirname, openchamberDataDir, modelsDevApiUrl, modelsMetadataCacheTtl, fetchFreeZenModels, getCachedZenModels, setAutoAcceptSession, agentToolRuntime, } = options; const uiAuthController = createUiAuth({ password: uiPassword, readSettingsFromDiskMigrated, clientAuthController: remoteClientAuthRuntime, }); if (uiAuthController.enabled) { console.log('UI password protection enabled for browser sessions'); } registerServerStatusRoutes(app, { express, process, openchamberVersion, runtimeName, serverStartedAt, gracefulShutdown, getHealthSnapshot, getServerId, getServerPort, getTunnelUrl, tunnelAuthController, uiAuthController, }); registerCommonRequestMiddleware(app, { express, verboseRequestLogs }); registerAgentToolRoutes(app, { express, agentToolRuntime }); registerAuthAndAccessRoutes(app, { express, tunnelAuthController, uiAuthController, remoteClientAuthRuntime, clientPairingRuntime, getRelayPairingCandidate, reconcileRelay, getPairingTransports, getDirectCandidateUrls, getServerId, getServerLabel, readSettingsFromDiskMigrated, normalizeTunnelSessionTtlMs, }); registerTtsRoutes(app, { sayTTSCapability }); registerNotificationRoutes(app, { uiAuthController, ensurePushInitialized, ensureGlobalWatcherStarted, getOrCreateVapidKeys, getUiSessionTokenFromRequest, readSettingsFromDiskMigrated, writeSettingsToDisk, addOrUpdatePushSubscription, removePushSubscription, addOrUpdateApnsToken, removeApnsToken, updateUiVisibility, clearPendingPushBadge, isUiVisible, getUiNotificationClients, writeSseEvent, getSessionActivitySnapshot: sessionRuntime.getSessionActivitySnapshot, getSessionStateSnapshot: sessionRuntime.getSessionStateSnapshot, getSessionAttentionSnapshot: sessionRuntime.getSessionAttentionSnapshot, getSessionState: sessionRuntime.getSessionState, getSessionAttentionState: sessionRuntime.getSessionAttentionState, markSessionViewed: sessionRuntime.markSessionViewed, markSessionUnviewed: sessionRuntime.markSessionUnviewed, markUserMessageSent: sessionRuntime.markUserMessageSent, setPushInitialized, setAutoAcceptSession, }); registerOpenChamberRoutes(app, { fs, os, path, process, server, __dirname, openchamberDataDir, modelsDevApiUrl, modelsMetadataCacheTtl, readSettingsFromDiskMigrated, fetchFreeZenModels, getCachedZenModels, }); return { uiAuthController, }; }; return { setupBaseRoutes, }; };