{"version":3,"file":"services/ShareService.mjs","sources":["webpack://@agent-tars/server/./src/services/ShareService.ts"],"sourcesContent":["/*\n * Copyright (c) 2025 Bytedance, Inc. and its affiliates.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { AgentEventStream } from '@agent-tars/core';\nimport { SessionMetadata, StorageProvider } from '../storage';\nimport { ShareUtils } from '../utils/share';\nimport { SlugGenerator } from '../utils/slug-generator';\nimport type { AgentTARSAppConfig } from '../types';\nimport type { IAgent } from '@agent-tars/interface';\n\n/**\n * ShareService - Centralized service for handling session sharing\n *\n * Responsible for:\n * - Generating shareable HTML content\n * - Uploading shared content to providers\n * - Managing share metadata and slugs\n */\nexport class ShareService {\n  constructor(\n    private appConfig: Required<AgentTARSAppConfig>,\n    private storageProvider: StorageProvider | null,\n  ) {}\n\n  /**\n   * Share a session\n   * @param sessionId Session ID to share\n   * @param upload Whether to upload to share provider\n   * @param agent Optional agent instance for slug generation\n   * @returns Share result with URL or HTML content\n   */\n  async shareSession(\n    sessionId: string,\n    upload = false,\n    agent?: IAgent,\n  ): Promise<{\n    success: boolean;\n    url?: string;\n    html?: string;\n    sessionId: string;\n    error?: string;\n  }> {\n    try {\n      // Verify storage is available\n      if (!this.storageProvider) {\n        throw new Error('Storage not configured, cannot share session');\n      }\n\n      // Get session metadata\n      const metadata = await this.storageProvider.getSessionMetadata(sessionId);\n      if (!metadata) {\n        throw new Error('Session not found');\n      }\n\n      // Get session events\n      const events = await this.storageProvider.getSessionEvents(sessionId);\n\n      // Filter key frame events, exclude streaming messages\n      const keyFrameEvents = events.filter(\n        (event) =>\n          event.type !== 'assistant_streaming_message' &&\n          event.type !== 'assistant_streaming_thinking_message' &&\n          event.type !== 'final_answer_streaming',\n      );\n\n      // Generate HTML content\n      const shareHtml = this.generateShareHtml(keyFrameEvents, metadata);\n\n      // Upload if requested and provider is configured\n      if (upload && this.appConfig.share.provider) {\n        const shareUrl = await this.uploadShareHtml(shareHtml, sessionId, metadata, agent);\n        return {\n          success: true,\n          url: shareUrl,\n          sessionId,\n        };\n      }\n\n      // Return HTML content if not uploading\n      return {\n        success: true,\n        html: shareHtml,\n        sessionId,\n      };\n    } catch (error) {\n      return {\n        success: false,\n        sessionId,\n        error: error instanceof Error ? error.message : String(error),\n      };\n    }\n  }\n\n  /**\n   * Generate shareable HTML content\n   */\n  private generateShareHtml(events: AgentEventStream.Event[], metadata: SessionMetadata): string {\n    if (!this.appConfig.ui.staticPath) {\n      throw new Error('Cannot found static path.');\n    }\n\n    const modelInfo = {\n      provider: process.env.MODEL_PROVIDER || this.appConfig?.model?.provider || 'Default Provider',\n      model: process.env.MODEL_NAME || this.appConfig?.model?.id || 'Default Model',\n    };\n\n    return ShareUtils.generateShareHtml(events, metadata, this.appConfig.ui.staticPath, modelInfo);\n  }\n\n  /**\n   * Upload share HTML to provider\n   */\n  private async uploadShareHtml(\n    html: string,\n    sessionId: string,\n    metadata: SessionMetadata,\n    agent?: IAgent,\n  ): Promise<string> {\n    if (!this.appConfig.share.provider) {\n      throw new Error('Share provider not configured');\n    }\n\n    // Generate normalized slug if agent is available\n    let normalizedSlug = '';\n    let originalQuery = '';\n\n    if (this.storageProvider && agent) {\n      try {\n        const events = await this.storageProvider.getSessionEvents(sessionId);\n        const firstUserMessage = events.find((e) => e.type === 'user_message');\n\n        if (firstUserMessage && firstUserMessage.content) {\n          originalQuery =\n            typeof firstUserMessage.content === 'string'\n              ? firstUserMessage.content\n              : firstUserMessage.content.find((c) => c.type === 'text')?.text || '';\n\n          if (originalQuery) {\n            const slugGenerator = new SlugGenerator(agent);\n            normalizedSlug = await slugGenerator.generateSlug(originalQuery);\n\n            // Additional safety check to ensure slug is URL-safe\n            normalizedSlug = normalizedSlug.replace(/[^\\x00-\\x7F]+/g, '').replace(/[^\\w-]/g, '');\n          }\n        }\n      } catch (error) {\n        console.warn('Failed to extract query for normalized slug:', error);\n      }\n    }\n\n    if (normalizedSlug) {\n      // add session id to avoid avoid conflict\n      normalizedSlug = `${normalizedSlug}-${sessionId}`;\n    } else {\n      // fallback to sessionId\n      normalizedSlug = sessionId;\n    }\n\n    return ShareUtils.uploadShareHtml(html, sessionId, this.appConfig.share.provider, {\n      metadata,\n      slug: normalizedSlug,\n      query: originalQuery,\n    });\n  }\n\n  /**\n   * Get share configuration\n   */\n  getShareConfig(): {\n    hasShareProvider: boolean;\n    shareProvider: string | null;\n  } {\n    return {\n      hasShareProvider: !!this.appConfig.share?.provider,\n      shareProvider: this.appConfig.share?.provider || null,\n    };\n  }\n}\n"],"names":["ShareService","sessionId","upload","agent","Error","metadata","events","keyFrameEvents","event","shareHtml","shareUrl","error","String","_this_appConfig_model","_this_appConfig_model1","modelInfo","process","ShareUtils","html","normalizedSlug","originalQuery","firstUserMessage","e","_firstUserMessage_content_find","c","slugGenerator","SlugGenerator","console","_this_appConfig_share","_this_appConfig_share1","appConfig","storageProvider"],"mappings":"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"}