{"version":3,"sources":["/home/mkabumattar/work/withrawi/rawi/dist/chunk-2PFOYQDJ.cjs","../src/core/session/session-state-manager.ts"],"names":["SessionStateManager","#databaseManager","#activeSessions","#persistenceOptions","databaseManager","options","DatabaseManager","sessionId","cachedState","#updateLastAccessed","session","SessionNotFoundError","includeMessages","messageLimit","messages","sessionState","#loadSessionMetadata","#addHistoryEntry","error","DatabaseConnectionError"],"mappings":"AAAA;AACA,wDAA+C,wDAAyC,ICa3EA,CAAAA,CAAN,KAA0B,CAC/BC,CAAAA,CAAAA,CACAC,CAAAA,CAAAA,CAA6C,IAAI,GAAA,CACjDC,CAAAA,CAAAA,CAEA,WAAA,CACEC,CAAAA,CACAC,CAAAA,CAAqC,CAAC,CAAA,CACtC,CACA,IAAA,CAAKJ,CAAAA,CAAAA,CAAmBG,CAAAA,EAAmB,IAAIE,mBAAAA,CAC/C,IAAA,CAAKH,CAAAA,CAAAA,CAAsB,CACzB,QAAA,CAAU,CAAA,CAAA,CACV,YAAA,CAAc,GAAA,CACd,iBAAA,CAAmB,GAAA,CACnB,GAAGE,CACL,CACF,CAEA,MAAM,mBAAA,CACJE,CAAAA,CACAF,CAAAA,CAAiC,CAAC,CAAA,CACX,CACvB,GAAI,CACF,IAAMG,CAAAA,CAAc,IAAA,CAAKN,CAAAA,CAAAA,CAAgB,GAAA,CAAIK,CAAS,CAAA,CACtD,EAAA,CAAIC,CAAAA,CACF,OAAA,MAAM,IAAA,CAAKC,CAAAA,CAAAA,CAAoBF,CAAS,CAAA,CACjCC,CAAAA,CAGT,IAAME,CAAAA,CAAU,MAAM,IAAA,CAAKT,CAAAA,CAAAA,CAAiB,UAAA,CAAWM,CAAS,CAAA,CAChE,EAAA,CAAI,CAACG,CAAAA,CACH,MAAM,IAAIC,wBAAAA,CAAqBJ,CAAAA,CAAW,SAAS,CAAA,CAGrD,GAAM,CAAC,eAAA,CAAAK,CAAAA,CAAkB,CAAA,CAAA,CAAM,YAAA,CAAAC,CAAAA,CAAe,GAAG,CAAA,CAAIR,CAAAA,CAEjDS,CAAAA,CAA0B,CAAC,CAAA,CAC3BF,CAAAA,EAAAA,CACFE,CAAAA,CAAW,MAAM,IAAA,CAAKb,CAAAA,CAAAA,CAAiB,WAAA,CAAYM,CAAS,CAAA,CAExDM,CAAAA,EAAgBC,CAAAA,CAAS,MAAA,CAASD,CAAAA,EAAAA,CACpCC,CAAAA,CAAWA,CAAAA,CAAS,KAAA,CAAM,CAACD,CAAY,CAAA,CAAA,CAAA,CAI3C,IAAME,CAAAA,CAA6B,CACjC,OAAA,CAAAL,CAAAA,CACA,QAAA,CAAAI,CAAAA,CACA,QAAA,CAAU,CAAA,CAAA,CACV,cAAA,CAAgB,IAAI,IAAA,CAAK,CAAA,CAAE,WAAA,CAAY,CAAA,CACvC,YAAA,CAAcJ,CAAAA,CAAQ,YAAA,CACtB,QAAA,CAAU,MAAM,IAAA,CAAKM,CAAAA,CAAAA,CAAqBT,CAAS,CACrD,CAAA,CAEA,OAAA,IAAA,CAAKL,CAAAA,CAAAA,CAAgB,GAAA,CAAIK,CAAAA,CAAWQ,CAAY,CAAA,CAEhD,MAAM,IAAA,CAAKE,CAAAA,CAAAA,CAAiBV,CAAAA,CAAW,UAAA,CAAY,kBAAkB,CAAA,CAE9DQ,CACT,CAAA,KAAA,CAASG,CAAAA,CAAO,CACd,MAAIA,EAAAA,WAAiBP,mBAAAA,CACbO,CAAAA,CAEF,IAAIC,wBAAAA,CACR,CAAA,iCAAA,EAAoCD,EAAAA,WAAiB,KAAA,CAAQA,CAAAA,CAAM,OAAA,CAAU,eAAe,CAAA,CAAA;AD5EktB","file":"/home/mkabumattar/work/withrawi/rawi/dist/chunk-2PFOYQDJ.cjs","sourcesContent":[null,"import {\n  DatabaseConnectionError,\n  SessionNotFoundError,\n} from '../../cli/commands/chat/types.js';\nimport {DatabaseManager} from '../database/manager.js';\nimport type {ChatMessage} from '../shared/types.js';\nimport type {\n  SessionHistoryEntry,\n  SessionMetadata,\n  SessionPersistenceOptions,\n  SessionRestoreOptions,\n  SessionState,\n} from './session-state.js';\n\nexport class SessionStateManager {\n  #databaseManager: DatabaseManager;\n  #activeSessions: Map<string, SessionState> = new Map();\n  #persistenceOptions: SessionPersistenceOptions;\n\n  constructor(\n    databaseManager?: DatabaseManager,\n    options: SessionPersistenceOptions = {},\n  ) {\n    this.#databaseManager = databaseManager || new DatabaseManager();\n    this.#persistenceOptions = {\n      autoSave: true,\n      saveInterval: 30000,\n      maxHistoryEntries: 100,\n      ...options,\n    };\n  }\n\n  async restoreSessionState(\n    sessionId: string,\n    options: SessionRestoreOptions = {},\n  ): Promise<SessionState> {\n    try {\n      const cachedState = this.#activeSessions.get(sessionId);\n      if (cachedState) {\n        await this.#updateLastAccessed(sessionId);\n        return cachedState;\n      }\n\n      const session = await this.#databaseManager.getSession(sessionId);\n      if (!session) {\n        throw new SessionNotFoundError(sessionId, 'unknown');\n      }\n\n      const {includeMessages = true, messageLimit = 100} = options;\n\n      let messages: ChatMessage[] = [];\n      if (includeMessages) {\n        messages = await this.#databaseManager.getMessages(sessionId);\n\n        if (messageLimit && messages.length > messageLimit) {\n          messages = messages.slice(-messageLimit);\n        }\n      }\n\n      const sessionState: SessionState = {\n        session,\n        messages,\n        isActive: true,\n        lastAccessedAt: new Date().toISOString(),\n        messageCount: session.messageCount,\n        metadata: await this.#loadSessionMetadata(sessionId),\n      };\n\n      this.#activeSessions.set(sessionId, sessionState);\n\n      await this.#addHistoryEntry(sessionId, 'accessed', 'Session restored');\n\n      return sessionState;\n    } catch (error) {\n      if (error instanceof SessionNotFoundError) {\n        throw error;\n      }\n      throw new DatabaseConnectionError(\n        `Failed to restore session state: ${error instanceof Error ? error.message : 'Unknown error'}`,\n        error instanceof Error ? error : undefined,\n      );\n    }\n  }\n\n  async persistSessionState(sessionId: string): Promise<void> {\n    try {\n      const sessionState = this.#activeSessions.get(sessionId);\n      if (!sessionState) {\n        throw new SessionNotFoundError(sessionId, 'unknown');\n      }\n\n      await this.#saveSessionMetadata(sessionId, sessionState.metadata);\n\n      sessionState.lastAccessedAt = new Date().toISOString();\n\n      await this.#addHistoryEntry(\n        sessionId,\n        'updated',\n        'Session state persisted',\n      );\n    } catch (error) {\n      throw new DatabaseConnectionError(\n        `Failed to persist session state: ${error instanceof Error ? error.message : 'Unknown error'}`,\n        error instanceof Error ? error : undefined,\n      );\n    }\n  }\n\n  async addMessageToSession(\n    sessionId: string,\n    message: ChatMessage,\n  ): Promise<void> {\n    try {\n      const sessionState = this.#activeSessions.get(sessionId);\n      if (!sessionState) {\n        await this.restoreSessionState(sessionId);\n        return this.addMessageToSession(sessionId, message);\n      }\n\n      sessionState.messages.push(message);\n      sessionState.messageCount = sessionState.messages.length;\n      sessionState.lastAccessedAt = new Date().toISOString();\n\n      if (\n        message.provider &&\n        !sessionState.metadata.providers.includes(message.provider)\n      ) {\n        sessionState.metadata.providers.push(message.provider);\n        sessionState.metadata.lastProvider = message.provider;\n      }\n      if (\n        message.model &&\n        !sessionState.metadata.models.includes(message.model)\n      ) {\n        sessionState.metadata.models.push(message.model);\n        sessionState.metadata.lastModel = message.model;\n      }\n\n      if (this.#persistenceOptions.autoSave) {\n        await this.persistSessionState(sessionId);\n      }\n\n      await this.#addHistoryEntry(\n        sessionId,\n        'message_added',\n        `${message.role} message added`,\n      );\n    } catch (error) {\n      throw new DatabaseConnectionError(\n        `Failed to add message to session: ${error instanceof Error ? error.message : 'Unknown error'}`,\n        error instanceof Error ? error : undefined,\n      );\n    }\n  }\n\n  async updateSessionTitle(sessionId: string, title: string): Promise<void> {\n    try {\n      const sessionState = this.#activeSessions.get(sessionId);\n      if (sessionState) {\n        sessionState.session.title = title;\n        sessionState.lastAccessedAt = new Date().toISOString();\n      }\n\n      await this.#databaseManager.updateSessionTitle(sessionId, title);\n\n      if (this.#persistenceOptions.autoSave) {\n        await this.persistSessionState(sessionId);\n      }\n\n      await this.#addHistoryEntry(\n        sessionId,\n        'title_changed',\n        `Title changed to: ${title}`,\n      );\n    } catch (error) {\n      throw new DatabaseConnectionError(\n        `Failed to update session title: ${error instanceof Error ? error.message : 'Unknown error'}`,\n        error instanceof Error ? error : undefined,\n      );\n    }\n  }\n\n  async getSessionHistory(_sessionId: string): Promise<SessionHistoryEntry[]> {\n    try {\n      return [];\n    } catch {\n      throw new DatabaseConnectionError(\n        'Failed to get session history',\n        undefined,\n      );\n    }\n  }\n\n  async deactivateSession(sessionId: string): Promise<void> {\n    try {\n      const sessionState = this.#activeSessions.get(sessionId);\n      if (sessionState) {\n        await this.persistSessionState(sessionId);\n\n        sessionState.isActive = false;\n\n        this.#activeSessions.delete(sessionId);\n      }\n    } catch (error) {\n      throw new DatabaseConnectionError(\n        `Failed to deactivate session: ${error instanceof Error ? error.message : 'Unknown error'}`,\n        error instanceof Error ? error : undefined,\n      );\n    }\n  }\n\n  getActiveSessionIds(): string[] {\n    return Array.from(this.#activeSessions.keys());\n  }\n\n  getActiveSessionState(sessionId: string): SessionState | undefined {\n    return this.#activeSessions.get(sessionId);\n  }\n\n  async cleanupInactiveSessions(maxAge = 3600000): Promise<void> {\n    const now = Date.now();\n    const sessionsToRemove: string[] = [];\n\n    for (const [sessionId, state] of this.#activeSessions.entries()) {\n      const lastAccessed = new Date(state.lastAccessedAt).getTime();\n      if (now - lastAccessed > maxAge) {\n        sessionsToRemove.push(sessionId);\n      }\n    }\n\n    for (const sessionId of sessionsToRemove) {\n      await this.deactivateSession(sessionId);\n    }\n  }\n\n  async #updateLastAccessed(sessionId: string): Promise<void> {\n    const sessionState = this.#activeSessions.get(sessionId);\n    if (sessionState) {\n      sessionState.lastAccessedAt = new Date().toISOString();\n    }\n  }\n\n  async #loadSessionMetadata(sessionId: string): Promise<SessionMetadata> {\n    try {\n      const messages = await this.#databaseManager.getMessages(sessionId);\n\n      const providers = [\n        ...new Set(messages.map((m) => m.provider).filter(Boolean)),\n      ];\n      const models = [...new Set(messages.map((m) => m.model).filter(Boolean))];\n\n      return {\n        providers,\n        models,\n        lastProvider: providers[providers.length - 1],\n        lastModel: models[models.length - 1],\n        tags: [],\n        customData: {},\n      };\n    } catch (_error) {\n      return {\n        providers: [],\n        models: [],\n        tags: [],\n        customData: {},\n      };\n    }\n  }\n\n  async #saveSessionMetadata(\n    _sessionId: string,\n    _metadata: SessionMetadata,\n  ): Promise<void> {\n    // TODO: This would typically save to a metadata table\n    // TODO:For now, just store in memory as it's already cached\n  }\n\n  async #addHistoryEntry(\n    sessionId: string,\n    action: SessionHistoryEntry['action'],\n    details: string,\n    _metadata?: Record<string, any>,\n  ): Promise<void> {\n    console.debug(`Session ${sessionId}: ${action} - ${details}`);\n  }\n}\n"]}