{"version":3,"sources":["/home/mkabumattar/work/withrawi/rawi/dist/chunk-IBIBJOYA.cjs","../src/core/session/session-manager.ts"],"names":["SessionManager","#databaseManager","databaseManager","DatabaseManager","profile","options","title","generateTitle","type","finalTitle","#generateSessionTitle","error","DatabaseConnectionError"],"mappings":"AAAA;AACA,wDAA4C,wDAAyC,ICqBxEA,CAAAA,CAAN,KAAqB,CAC1BC,CAAAA,CAAAA,CAEA,WAAA,CAAYC,CAAAA,CAAmC,CAC7C,IAAA,CAAKD,CAAAA,CAAAA,CAAmBC,CAAAA,EAAmB,IAAIC,mBACjD,CAEA,MAAM,aAAA,CACJC,CAAAA,CACAC,CAAAA,CAAkC,CAAC,CAAA,CAClB,CACjB,GAAI,CACF,GAAM,CAAC,KAAA,CAAAC,CAAAA,CAAO,aAAA,CAAAC,CAAAA,CAAe,IAAA,CAAAC,CAAAA,CAAO,KAAK,CAAA,CAAIH,CAAAA,CAEzCI,CAAAA,CAAaH,CAAAA,CACjB,OAAIC,CAAAA,EAAiB,CAACD,CAAAA,EAAAA,CACpBG,CAAAA,CAAa,MAAM,IAAA,CAAKC,CAAAA,CAAAA,CAAsBN,CAAO,CAAA,CAAA,CAGrC,MAAM,IAAA,CAAKH,CAAAA,CAAAA,CAAiB,aAAA,CAC5CG,CAAAA,CACAK,CAAAA,CACAD,CACF,CAGF,CAAA,KAAA,CAASG,CAAAA,CAAO,CACd,MAAM,IAAIC,wBAAAA,CACR,CAAA,0BAAA,EAA6BD,EAAAA,WAAiB,KAAA,CAAQA,CAAAA,CAAM,OAAA,CAAU,eAAe,CAAA,CAAA;ADhD6R","file":"/home/mkabumattar/work/withrawi/rawi/dist/chunk-IBIBJOYA.cjs","sourcesContent":[null,"import type {\n  DeleteSessionOptions,\n  ExportSessionsOptions,\n  ListSessionsOptions,\n  SessionDisplayInfo,\n  SessionSelectionResult,\n  SessionStats,\n} from '../../cli/commands/chat/types.js';\nimport {\n  DatabaseConnectionError,\n  ProfileMismatchError,\n  SessionNotFoundError,\n} from '../../cli/commands/chat/types.js';\nimport {DatabaseManager} from '../database/manager.js';\nimport type {ChatMessage, ChatSession, HistoryStats} from '../shared/types.js';\n\nexport interface SessionCreationOptions {\n  title?: string;\n  generateTitle?: boolean;\n  type?: 'ask' | 'chat';\n}\n\nexport class SessionManager {\n  #databaseManager: DatabaseManager;\n\n  constructor(databaseManager?: DatabaseManager) {\n    this.#databaseManager = databaseManager || new DatabaseManager();\n  }\n\n  async createSession(\n    profile: string,\n    options: SessionCreationOptions = {},\n  ): Promise<string> {\n    try {\n      const {title, generateTitle, type = 'ask'} = options;\n\n      let finalTitle = title;\n      if (generateTitle && !title) {\n        finalTitle = await this.#generateSessionTitle(profile);\n      }\n\n      const sessionId = await this.#databaseManager.createSession(\n        profile,\n        finalTitle,\n        type,\n      );\n\n      return sessionId;\n    } catch (error) {\n      throw new DatabaseConnectionError(\n        `Failed to create session: ${error instanceof Error ? error.message : 'Unknown error'}`,\n        error instanceof Error ? error : undefined,\n      );\n    }\n  }\n\n  async getSession(sessionId: string, profile?: string): Promise<ChatSession> {\n    try {\n      const session = await this.#databaseManager.getSession(sessionId);\n\n      if (!session) {\n        throw new SessionNotFoundError(sessionId, profile || 'unknown');\n      }\n\n      if (profile && session.profile !== profile) {\n        throw new ProfileMismatchError(sessionId, profile, session.profile);\n      }\n\n      return session;\n    } catch (error) {\n      if (\n        error instanceof SessionNotFoundError ||\n        error instanceof ProfileMismatchError\n      ) {\n        throw error;\n      }\n      throw new DatabaseConnectionError(\n        `Failed to retrieve session: ${error instanceof Error ? error.message : 'Unknown error'}`,\n        error instanceof Error ? error : undefined,\n      );\n    }\n  }\n\n  async listSessions(\n    options: ListSessionsOptions = {},\n  ): Promise<SessionDisplayInfo[]> {\n    try {\n      const {profile, limit = 10, fromDate, toDate, type} = options;\n\n      const sessions = await this.#databaseManager.getSessions({\n        profile,\n        limit,\n        fromDate,\n        toDate,\n        type,\n      });\n\n      return sessions.map((session) => this.#toDisplayInfo(session));\n    } catch (error) {\n      throw new DatabaseConnectionError(\n        `Failed to list sessions: ${error instanceof Error ? error.message : 'Unknown error'}`,\n        error instanceof Error ? error : undefined,\n      );\n    }\n  }\n\n  async deleteSession(\n    sessionId: string,\n    options: DeleteSessionOptions = {},\n  ): Promise<boolean> {\n    try {\n      const {force = false} = options;\n\n      if (!force) {\n        await this.getSession(sessionId);\n      }\n\n      const deleted = await this.#databaseManager.deleteSession(sessionId);\n\n      if (!deleted && !force) {\n        throw new SessionNotFoundError(sessionId, 'unknown');\n      }\n\n      return deleted;\n    } catch (error) {\n      if (\n        error instanceof SessionNotFoundError ||\n        error instanceof ProfileMismatchError\n      ) {\n        throw error;\n      }\n      throw new DatabaseConnectionError(\n        `Failed to delete session: ${error instanceof Error ? error.message : 'Unknown error'}`,\n        error instanceof Error ? error : undefined,\n      );\n    }\n  }\n\n  async updateSessionTitle(\n    sessionId: string,\n    title: string,\n    profile?: string,\n  ): Promise<boolean> {\n    try {\n      await this.getSession(sessionId, profile);\n\n      const updated = await this.#databaseManager.updateSessionTitle(\n        sessionId,\n        title,\n      );\n\n      if (!updated) {\n        throw new SessionNotFoundError(sessionId, profile || 'unknown');\n      }\n\n      return updated;\n    } catch (error) {\n      if (\n        error instanceof SessionNotFoundError ||\n        error instanceof ProfileMismatchError\n      ) {\n        throw error;\n      }\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 exportSessions(\n    _format: 'json' | 'markdown',\n    options: Omit<ExportSessionsOptions, 'format'> = {},\n  ): Promise<{\n    sessions: ChatSession[];\n    messages: Record<string, ChatMessage[]>;\n    stats: HistoryStats;\n  }> {\n    try {\n      const {profile, sessions: sessionIds} = options;\n\n      let sessions: ChatSession[];\n      let messages: Record<string, ChatMessage[]> = {};\n\n      if (sessionIds && sessionIds.length > 0) {\n        sessions = [];\n        for (const sessionId of sessionIds) {\n          try {\n            const session = await this.getSession(sessionId, profile);\n            sessions.push(session);\n            messages[sessionId] =\n              await this.#databaseManager.getMessages(sessionId);\n          } catch (error) {\n            if (\n              !(\n                error instanceof SessionNotFoundError ||\n                error instanceof ProfileMismatchError\n              )\n            ) {\n              throw error;\n            }\n          }\n        }\n      } else {\n        const exportData = await this.#databaseManager.exportChatHistory({\n          profile,\n        });\n        sessions = exportData.sessions;\n        messages = exportData.messages;\n      }\n\n      const stats = await this.#databaseManager.getStats(profile);\n\n      return {sessions, messages, stats};\n    } catch (error) {\n      throw new DatabaseConnectionError(\n        `Failed to export sessions: ${error instanceof Error ? error.message : 'Unknown error'}`,\n        error instanceof Error ? error : undefined,\n      );\n    }\n  }\n\n  async getSessionStats(profile?: string): Promise<SessionStats> {\n    try {\n      const stats = await this.#databaseManager.getStats(profile);\n      const sessions = await this.#databaseManager.getSessions({\n        profile,\n        limit: 1000,\n      });\n\n      return {\n        messageCount: stats.totalMessages,\n        createdAt:\n          sessions.length > 0 ? sessions[sessions.length - 1].createdAt : '',\n        updatedAt: sessions.length > 0 ? sessions[0].updatedAt : '',\n        duration: this.#calculateDuration(sessions),\n        providers: this.#extractProviders(),\n        models: this.#extractModels(),\n      };\n    } catch (error) {\n      throw new DatabaseConnectionError(\n        `Failed to get session statistics: ${error instanceof Error ? error.message : 'Unknown error'}`,\n        error instanceof Error ? error : undefined,\n      );\n    }\n  }\n\n  async selectSession(): Promise<SessionSelectionResult> {\n    throw new Error('Session selection must be implemented in CLI layer');\n  }\n\n  #toDisplayInfo(session: ChatSession): SessionDisplayInfo {\n    const now = new Date();\n    const updatedAt = new Date(session.updatedAt);\n    const timeDiff = now.getTime() - updatedAt.getTime();\n\n    return {\n      id: session.id,\n      title: session.title || 'Untitled Chat',\n      profile: session.profile,\n      createdAt: session.createdAt,\n      updatedAt: session.updatedAt,\n      messageCount: session.messageCount,\n      lastActivity: session.updatedAt,\n      age: this.#formatTimeDiff(timeDiff),\n    };\n  }\n\n  #formatTimeDiff(milliseconds: number): string {\n    const seconds = Math.floor(milliseconds / 1000);\n    const minutes = Math.floor(seconds / 60);\n    const hours = Math.floor(minutes / 60);\n    const days = Math.floor(hours / 24);\n\n    if (days > 0) return `${days}d ago`;\n    if (hours > 0) return `${hours}h ago`;\n    if (minutes > 0) return `${minutes}m ago`;\n    return `${seconds}s ago`;\n  }\n\n  #calculateDuration(sessions: ChatSession[]): string {\n    if (sessions.length === 0) return '0';\n\n    const oldest = new Date(sessions[sessions.length - 1].createdAt);\n    const newest = new Date(sessions[0].createdAt);\n    const diffDays = Math.floor(\n      (newest.getTime() - oldest.getTime()) / (1000 * 60 * 60 * 24),\n    );\n\n    return `${diffDays} days`;\n  }\n\n  #extractProviders(): string[] {\n    return [];\n  }\n\n  #extractModels(): string[] {\n    return [];\n  }\n\n  async #generateSessionTitle(profile: string): Promise<string> {\n    const sessions = await this.#databaseManager.getSessions({\n      profile,\n      limit: 1000,\n    });\n    const nextNumber = sessions.length + 1;\n    return `Chat Session ${nextNumber}`;\n  }\n}\n"]}