{"version":3,"sources":["../src/admin/MarketAdmin.ts","../src/core/BaseSDK.ts","../src/admin/services/AnalysisService.ts","../src/admin/services/PluginService.ts","../src/admin/services/SystemDependencyService.ts","../src/admin/services/SettingsService.ts","../src/admin/services/ReviewService.ts","../src/admin/services/PluginEnvService.ts","../src/market/market-sdk.ts","../src/market/services/DiscoveryService.ts","../src/market/services/PluginsService.ts","../src/types/admin.ts","../src/index.ts"],"sourcesContent":["import debug from 'debug';\n\nimport { BaseSDK } from '@/core/BaseSDK';\nimport { MarketSDKOptions } from '@/types';\n\nimport {\n  AnalysisService,\n  PluginEnvService,\n  PluginService,\n  ReviewService,\n  SettingsService,\n  SystemDependencyService,\n} from './services';\n\n// Create debug instance for logging\nconst log = debug('lobe-market-sdk:admin');\n\n/**\n * LobeHub Market Admin SDK Client\n *\n * Client for accessing administrative functionality of the LobeHub Marketplace.\n * This SDK provides privileged operations for managing plugins, reviews,\n * system settings, and dependencies. It requires admin-level authentication.\n */\nexport class MarketAdmin extends BaseSDK {\n  /**\n   * Market analysis service\n   * Provides methods for accessing market analytics and statistics\n   */\n  readonly analysis: AnalysisService;\n\n  /**\n   * Plugin management service\n   * Provides methods for creating, updating, and managing plugins\n   */\n  readonly plugins: PluginService;\n\n  readonly env: PluginEnvService;\n\n  /**\n   * Review management service\n   * Provides methods for moderating and managing user reviews\n   */\n  readonly reviews: ReviewService;\n\n  /**\n   * System settings management service\n   * Provides methods for configuring marketplace settings\n   */\n  readonly settings: SettingsService;\n\n  /**\n   * System dependency management service\n   * Provides methods for managing system dependencies required by plugins\n   */\n  readonly dependencies: SystemDependencyService;\n\n  /**\n   * Creates a new MarketAdmin instance\n   *\n   * @param options - Configuration options for the SDK\n   */\n  constructor(options: MarketSDKOptions = {}) {\n    // Use admin-specific API key if available\n    const apiKey = options.apiKey || process.env.MARKET_ADMIN_API_KEY;\n\n    // Create shared token state object for all services\n    const sharedTokenState = {\n      accessToken: undefined,\n      tokenExpiry: undefined,\n    };\n\n    super({ ...options, apiKey }, undefined, sharedTokenState);\n    log('MarketAdmin instance created');\n\n    // Initialize admin services with shared headers and token state for efficient reuse\n    this.analysis = new AnalysisService(options, this.headers, sharedTokenState);\n    this.plugins = new PluginService(options, this.headers, sharedTokenState);\n    this.reviews = new ReviewService(options, this.headers, sharedTokenState);\n    this.settings = new SettingsService(options, this.headers, sharedTokenState);\n    this.dependencies = new SystemDependencyService(options, this.headers, sharedTokenState);\n    this.env = new PluginEnvService(options, this.headers, sharedTokenState);\n  }\n}\n","import debug from 'debug';\nimport { SignJWT } from 'jose';\nimport urlJoin from 'url-join';\n\nimport type { MarketSDKOptions, SharedTokenState } from '../types';\n\n// Create debug instance for logging\nconst log = debug('lobe-market-sdk:core');\n\n/**\n * Base SDK class\n *\n * Provides shared request handling and authentication functionality that is used\n * by both the Market SDK and Admin SDK. This class handles the common concerns:\n * - API endpoint configuration\n * - Authentication header management\n * - HTTP request handling\n * - Error handling\n * - Query string building\n */\nexport class BaseSDK {\n  /** Base API URL */\n  protected apiBaseUrl: string;\n  /** Base URL */\n  protected baseUrl: string;\n  /** OAuth URL */\n  protected oauthBaseUrl: string;\n\n  /** Default locale for requests that require localization */\n  protected defaultLocale: string;\n\n  /** HTTP headers to include with all requests */\n  protected headers: Record<string, string>;\n\n  private clientId?: string;\n  private clientSecret?: string;\n  private readonly initialAccessToken?: string;\n  private accessToken?: string;\n  private tokenExpiry?: number;\n\n  // Shared token state for all instances\n  private sharedTokenState?: SharedTokenState;\n\n  /**\n   * Creates a new BaseSDK instance\n   *\n   * @param options - Configuration options for the SDK\n   * @param sharedHeaders - Optional shared headers object for reuse across services\n   * @param sharedTokenState - Optional shared token state object for reuse across services\n   */\n  constructor(\n    options: MarketSDKOptions = {},\n    sharedHeaders?: Record<string, string>,\n    sharedTokenState?: SharedTokenState,\n  ) {\n    // Set base URL from options, environment variable, or default to production URL\n    this.baseUrl = options.baseURL || process.env.MARKET_BASE_URL || 'https://market.lobehub.com';\n    this.apiBaseUrl = urlJoin(this.baseUrl, 'api');\n    this.oauthBaseUrl = urlJoin(this.baseUrl, 'oauth');\n\n    // Set default locale from options or use English as default\n    this.defaultLocale = options.defaultLocale || 'en-US';\n\n    this.initialAccessToken = options.accessToken;\n    this.clientId = options.clientId;\n    this.clientSecret = options.clientSecret;\n\n    // Share token state across instances if provided\n    this.sharedTokenState = sharedTokenState;\n\n    // Get API key from options or environment variable\n    const apiKey = options.apiKey || process.env.MARKET_API_KEY;\n\n    // Either use shared headers or create new headers object\n    if (sharedHeaders) {\n      this.headers = sharedHeaders;\n      log('Using shared headers object');\n    } else {\n      this.headers = {\n        'Content-Type': 'application/json',\n      };\n      log('Created new headers object');\n    }\n\n    // If an apiKey is provided, use it for authorization.\n    // This will be overridden by M2M auth if credentials are also provided.\n    if (apiKey) {\n      this.headers.Authorization = `Bearer ${apiKey}`;\n    }\n\n    // If an accessToken is provided on init, it takes precedence.\n    if (this.initialAccessToken) {\n      this.headers.Authorization = `Bearer ${this.initialAccessToken}`;\n    }\n\n    log('BaseSDK instance created: %O', {\n      baseUrl: this.baseUrl,\n      defaultLocale: this.defaultLocale,\n      hasApiKey: !!apiKey,\n      hasInitialAccessToken: !!this.initialAccessToken,\n      hasM2MCredentials: !!this.clientId,\n      hasSharedTokenState: !!this.sharedTokenState,\n    });\n  }\n\n  /**\n   * Sends an HTTP request to the API and handles the response\n   *\n   * @param url - Request URL path (will be appended to baseUrl)\n   * @param options - Fetch API request options\n   * @returns Promise resolving to the parsed JSON response\n   * @throws Error if the request fails\n   */\n  // eslint-disable-next-line no-undef\n  protected async request<T>(url: string, options: RequestInit = {}): Promise<T> {\n    const requestUrl = urlJoin(this.apiBaseUrl, url);\n    log('Sending request: %s', requestUrl);\n\n    // If no access token was provided on init, and we have M2M creds, run the auth flow.\n    if (!this.initialAccessToken && this.clientId && this.clientSecret) {\n      await this.setM2MAuthToken();\n    }\n\n    const response = await fetch(requestUrl, {\n      ...options,\n      headers: {\n        ...this.headers,\n        ...options.headers,\n      },\n    });\n\n    if (!response.ok) {\n      const errorMsg = `Request failed: ${response.status} ${response.statusText}`;\n      try {\n        const errorBody = await response.json();\n\n        console.error('Request error: %s', JSON.stringify(errorBody));\n\n        throw new Error(`${errorMsg} - ${JSON.stringify(errorBody)}`);\n      } catch {\n        throw new Error(errorMsg);\n      }\n    }\n\n    log('Request successful: %s', url);\n    return response.json() as Promise<T>;\n  }\n\n  /**\n   * Builds a URL query string from a parameters object\n   *\n   * @param params - Object containing query parameters\n   * @returns Formatted query string (including leading ? if params exist)\n   */\n  protected buildQueryString(params: Record<string, any>): string {\n    const query = Object.entries(params)\n      // eslint-disable-next-line @typescript-eslint/no-unused-vars\n      .filter(([_, value]) => value !== undefined && value !== null)\n      .map(([key, value]) => `${encodeURIComponent(key)}=${encodeURIComponent(String(value))}`)\n      .join('&');\n\n    return query ? `?${query}` : '';\n  }\n\n  /**\n   * Sets an authentication token for API requests\n   *\n   * @param token - API authentication token\n   */\n  setAuthToken(token: string): void {\n    log('Setting authentication token');\n    this.accessToken = undefined;\n    this.tokenExpiry = undefined;\n\n    // Clear shared token state if it exists\n    if (this.sharedTokenState) {\n      this.sharedTokenState.accessToken = undefined;\n      this.sharedTokenState.tokenExpiry = undefined;\n    }\n\n    this.headers.Authorization = `Bearer ${token}`;\n  }\n\n  /**\n   * Clears the authentication token\n   */\n  clearAuthToken(): void {\n    log('Clearing authentication token');\n    this.accessToken = undefined;\n    this.tokenExpiry = undefined;\n\n    // Clear shared token state if it exists\n    if (this.sharedTokenState) {\n      this.sharedTokenState.accessToken = undefined;\n      this.sharedTokenState.tokenExpiry = undefined;\n    }\n\n    delete this.headers.Authorization;\n  }\n\n  /**\n   * Fetches an M2M access token.\n   * This method is designed for server-side use cases where you need to manage the token lifecycle\n   * (e.g., storing it in a cookie).\n   *\n   * @returns A promise that resolves to an object containing the access token and its expiry time.\n   */\n  public async fetchM2MToken(): Promise<{ accessToken: string; expiresIn: number }> {\n    if (!this.clientId || !this.clientSecret) {\n      throw new Error('clientId and clientSecret are required to fetch an M2M token.');\n    }\n\n    log('Fetching M2M token for server-side use');\n\n    const assertion = await this.createClientAssertion();\n    const tokenData = await this.exchangeTokenForServer(assertion);\n\n    log('M2M token fetched successfully');\n\n    return {\n      accessToken: tokenData.access_token,\n      expiresIn: tokenData.expires_in || 3600,\n    };\n  }\n\n  private async createClientAssertion(): Promise<string> {\n    if (!this.clientId || !this.clientSecret) {\n      throw new Error('Missing clientId or clientSecret for M2M authentication.');\n    }\n\n    const secret = new TextEncoder().encode(this.clientSecret);\n\n    const tokenEndpoint = `${this.oauthBaseUrl}/token`;\n\n    return await new SignJWT({})\n      .setProtectedHeader({ alg: 'HS256' })\n      .setIssuer(this.clientId)\n      .setSubject(this.clientId)\n      .setAudience(tokenEndpoint)\n      .setJti(crypto.randomUUID())\n      .setIssuedAt()\n      .setExpirationTime('5m')\n      .sign(secret);\n  }\n\n  private async exchangeToken(clientAssertion: string): Promise<string> {\n    const tokenData = await this.exchangeTokenForServer(clientAssertion);\n\n    // Calculate token expiry time (current time + expires_in seconds - 60 seconds buffer)\n    const expiresInSeconds = tokenData.expires_in || 3600; // Default to 1 hour if not provided\n    this.tokenExpiry = Date.now() + (expiresInSeconds - 60) * 1000; // 60 seconds buffer\n\n    return tokenData.access_token;\n  }\n\n  private async exchangeTokenForServer(clientAssertion: string): Promise<any> {\n    const tokenEndpoint = urlJoin(this.oauthBaseUrl, 'token');\n    log('Exchanging token at endpoint: %s', tokenEndpoint);\n\n    const params = new URLSearchParams();\n    params.append('grant_type', 'client_credentials');\n    params.append(\n      'client_assertion_type',\n      'urn:ietf:params:oauth:client-assertion-type:jwt-bearer',\n    );\n    params.append('client_assertion', clientAssertion);\n\n    const response = await fetch(tokenEndpoint, {\n      body: params,\n      headers: { 'Content-Type': 'application/x-www-form-urlencoded' },\n      method: 'POST',\n    });\n\n    const tokenData = await response.json();\n\n    if (!response.ok) {\n      throw new Error(`Token exchange failed: ${JSON.stringify(tokenData)}`);\n    }\n\n    return tokenData;\n  }\n\n  private async setM2MAuthToken(): Promise<void> {\n    // Use shared token state if available\n    const currentAccessToken = this.sharedTokenState?.accessToken || this.accessToken;\n    const currentTokenExpiry = this.sharedTokenState?.tokenExpiry || this.tokenExpiry;\n\n    log(\n      'Token check: hasSharedState=%s, hasCurrentToken=%s, tokenExpiry=%d, currentTime=%d',\n      !!this.sharedTokenState,\n      !!currentAccessToken,\n      currentTokenExpiry || 0,\n      Date.now(),\n    );\n\n    // Check if we have a valid token that hasn't expired\n    if (currentAccessToken && currentTokenExpiry && Date.now() < currentTokenExpiry) {\n      log(\n        'Using existing M2M access token (expires in %d seconds)',\n        Math.floor((currentTokenExpiry - Date.now()) / 1000),\n      );\n      this.headers.Authorization = `Bearer ${currentAccessToken}`;\n      return;\n    }\n\n    // Check if there's already a token request in progress (for shared state)\n    if (this.sharedTokenState?.tokenPromise) {\n      log('Token request already in progress, waiting for completion...');\n      const token = await this.sharedTokenState.tokenPromise;\n      this.headers.Authorization = `Bearer ${token}`;\n      log('Using token from concurrent request');\n      return;\n    }\n\n    log('Fetching new M2M access token...');\n\n    // Create token request promise and store it in shared state\n    const tokenPromise = this.fetchNewToken();\n    if (this.sharedTokenState) {\n      this.sharedTokenState.tokenPromise = tokenPromise;\n    }\n\n    try {\n      const newAccessToken = await tokenPromise;\n\n      // Update both local and shared token state\n      this.accessToken = newAccessToken;\n      this.headers.Authorization = `Bearer ${newAccessToken}`;\n\n      if (this.sharedTokenState) {\n        this.sharedTokenState.accessToken = newAccessToken;\n        this.sharedTokenState.tokenExpiry = this.tokenExpiry;\n        // Clear the promise since we're done\n        this.sharedTokenState.tokenPromise = undefined;\n        log(\n          'Updated shared token state (expires in %d seconds)',\n          Math.floor(((this.tokenExpiry || 0) - Date.now()) / 1000),\n        );\n      }\n\n      log('Successfully set new M2M access token');\n    } catch (error) {\n      // Clear the promise on error\n      if (this.sharedTokenState) {\n        this.sharedTokenState.tokenPromise = undefined;\n      }\n      throw error;\n    }\n  }\n\n  private async fetchNewToken(): Promise<string> {\n    const assertion = await this.createClientAssertion();\n    return await this.exchangeToken(assertion);\n  }\n}\n","import {\n  InstallFailureAnalysis,\n  InstallFailureAnalysisQuery,\n  RangeQuery,\n  RangeStats,\n  TopPlugin,\n  TopPluginsQuery,\n} from '@lobehub/market-types';\nimport debug from 'debug';\n\nimport { BaseSDK } from '@/core/BaseSDK';\n\n// Create debug instance for logging\nconst log = debug('lobe-market-sdk:admin:analysis');\n\n/**\n * Market Overview Statistics Interface\n * Defines the structure for market overview data\n */\nexport interface MarketOverviewStats {\n  devices: {\n    count: number;\n    prevCount: number;\n  };\n  installs: {\n    count: number;\n    prevCount: number;\n  };\n  period: string;\n  pluginCalls: {\n    count: number;\n    prevCount: number;\n  };\n  plugins: {\n    count: number;\n    prevCount: number;\n  };\n}\n\n/**\n * Period type for analysis queries\n */\nexport type AnalysisPeriod = '1d' | '7d' | '30d' | '1mo' | '3mo' | '1y';\n\n/**\n * Market overview query parameters\n */\nexport interface MarketOverviewQuery {\n  /** Analysis period: 1d, 7d, 30d (rolling periods) or 1mo, 3mo, 1y (natural periods) */\n  period?: AnalysisPeriod;\n}\n\n/**\n * Standard API response wrapper\n */\ninterface ApiResponse<T> {\n  data: T;\n  success: boolean;\n}\n\n/**\n * Analysis Management Service\n *\n * Provides administrative functionality for accessing market analysis and statistics.\n * This service handles retrieving various analytics reports including market overview,\n * plugin trends, and installation analytics for administrative dashboards.\n */\nexport class AnalysisService extends BaseSDK {\n  /**\n   * Retrieves market overview statistics\n   *\n   * Returns comprehensive market statistics including plugin counts,\n   * installation metrics, new plugin trends, and rating averages\n   * with comparison to previous periods.\n   *\n   * @param params - Query parameters for the analysis\n   * @returns Promise resolving to market overview statistics\n   */\n  async getMarketOverview(params: MarketOverviewQuery = {}): Promise<MarketOverviewStats> {\n    const { period = '30d' } = params;\n\n    log('Getting market overview statistics for period: %s', period);\n\n    const searchParams = new URLSearchParams();\n    if (period) {\n      searchParams.append('period', period);\n    }\n\n    const url = `/admin/analysis/plugin/overview${searchParams.toString() ? `?${searchParams.toString()}` : ''}`;\n\n    const result = await this.request<ApiResponse<MarketOverviewStats>>(url);\n\n    log('Market overview statistics retrieved successfully: %s', result.data);\n\n    return result.data;\n  }\n\n  /**\n   * Retrieves market overview statistics for 1 day period\n   *\n   * Convenience method for getting daily market statistics.\n   *\n   * @returns Promise resolving to market overview statistics for 1 day\n   */\n  async getDailyOverview(): Promise<MarketOverviewStats> {\n    log('Getting daily market overview');\n    return this.getMarketOverview({ period: '1d' });\n  }\n\n  /**\n   * Retrieves market overview statistics for 7 days period\n   *\n   * Convenience method for getting weekly market statistics.\n   *\n   * @returns Promise resolving to market overview statistics for 7 days\n   */\n  async getWeeklyOverview(): Promise<MarketOverviewStats> {\n    log('Getting weekly market overview');\n    return this.getMarketOverview({ period: '7d' });\n  }\n\n  /**\n   * Retrieves market overview statistics for 30 days period\n   *\n   * Convenience method for getting monthly market statistics.\n   *\n   * @returns Promise resolving to market overview statistics for 30 days\n   */\n  async getMonthlyOverview(): Promise<MarketOverviewStats> {\n    log('Getting monthly market overview');\n    return this.getMarketOverview({ period: '30d' });\n  }\n\n  /**\n   * Retrieves market overview statistics for current natural month\n   *\n   * Convenience method for getting current month vs previous month statistics.\n   *\n   * @returns Promise resolving to market overview statistics for current month\n   */\n  async getThisMonthOverview(): Promise<MarketOverviewStats> {\n    log('Getting this month market overview');\n    return this.getMarketOverview({ period: '1mo' });\n  }\n\n  /**\n   * Retrieves market overview statistics for current quarter\n   *\n   * Convenience method for getting current quarter vs previous quarter statistics.\n   *\n   * @returns Promise resolving to market overview statistics for current quarter\n   */\n  async getQuarterlyOverview(): Promise<MarketOverviewStats> {\n    log('Getting quarterly market overview');\n    return this.getMarketOverview({ period: '3mo' });\n  }\n\n  /**\n   * Retrieves market overview statistics for current year\n   *\n   * Convenience method for getting current year vs previous year statistics.\n   *\n   * @returns Promise resolving to market overview statistics for current year\n   */\n  async getYearlyOverview(): Promise<MarketOverviewStats> {\n    log('Getting yearly market overview');\n    return this.getMarketOverview({ period: '1y' });\n  }\n\n  /**\n   * Retrieves install failure analysis for plugins within a date range\n   *\n   * Returns detailed analysis of plugin installation failures including failure counts,\n   * failure rates, and most common error messages for each plugin with failures.\n   *\n   * @param params - Query parameters for the failure analysis\n   * @returns Promise resolving to install failure analysis data\n   */\n  async getInstallFailureAnalysis(\n    params: InstallFailureAnalysisQuery,\n  ): Promise<InstallFailureAnalysis[]> {\n    const { range, limit = 15 } = params;\n\n    log('Getting install failure analysis for range: %o, limit: %d', range, limit);\n\n    const searchParams = new URLSearchParams();\n    searchParams.append('range', JSON.stringify(range));\n    if (limit !== 15) {\n      searchParams.append('limit', limit.toString());\n    }\n\n    const url = `/admin/analysis/plugin/install-failure?${searchParams.toString()}`;\n\n    const result = await this.request<ApiResponse<InstallFailureAnalysis[]>>(url);\n\n    log('Install failure analysis retrieved successfully for %d plugins', result.data.length);\n\n    return result.data;\n  }\n\n  /**\n   * Calculates growth rate between current and previous values\n   *\n   * Utility method for calculating percentage growth rates from the statistics.\n   *\n   * @param current - Current period value\n   * @param previous - Previous period value\n   * @returns Growth rate as percentage (e.g., 15.5 for 15.5% growth)\n   */\n  static calculateGrowthRate(current: number, previous: number): number {\n    if (previous === 0) return current > 0 ? 100 : 0;\n    return Math.round(((current - previous) / previous) * 100 * 10) / 10;\n  }\n\n  /**\n   * Formats market overview statistics with calculated growth rates\n   *\n   * Utility method that enhances the raw statistics with calculated growth rates\n   * for easier consumption in dashboards and reports.\n   *\n   * @param stats - Raw market overview statistics\n   * @returns Enhanced statistics with growth rate calculations\n   */\n  static formatMarketOverview(stats: MarketOverviewStats) {\n    return {\n      ...stats,\n      growth: {\n        devices: this.calculateGrowthRate(stats.devices.count, stats.devices.prevCount),\n        installs: this.calculateGrowthRate(stats.installs.count, stats.installs.prevCount),\n        pluginCalls: this.calculateGrowthRate(stats.pluginCalls.count, stats.pluginCalls.prevCount),\n        plugins: this.calculateGrowthRate(stats.plugins.count, stats.plugins.prevCount),\n      },\n    };\n  }\n\n  /**\n   * Retrieves installation trend statistics for a specified date range\n   *\n   * Returns daily installation counts and trends for the specified period\n   * with optional comparison to a previous period.\n   *\n   * @param params - Query parameters including date range and display config\n   * @returns Promise resolving to installation trend statistics\n   */\n  async getRangeInstalls(params: RangeQuery): Promise<RangeStats> {\n    const { display, range, prevRange } = params;\n\n    log('Getting installation trend statistics for range: %s to %s', range[0], range[1]);\n\n    const searchParams = new URLSearchParams();\n    searchParams.append('display', display);\n    searchParams.append('range', range.join(','));\n    if (prevRange) {\n      searchParams.append('prevRange', prevRange.join(','));\n    }\n\n    const url = `/admin/analysis/plugin/range-installs?${searchParams.toString()}`;\n\n    const result = await this.request<ApiResponse<RangeStats>>(url);\n\n    log(\n      'Installation trend statistics retrieved successfully: %d data points',\n      result.data.data.length,\n    );\n\n    return result.data;\n  }\n\n  /**\n   * Retrieves plugin growth trend statistics for a specified date range\n   *\n   * Returns daily plugin creation counts and trends for the specified period\n   * with optional comparison to a previous period.\n   *\n   * @param params - Query parameters including date range and display config\n   * @returns Promise resolving to plugin growth trend statistics\n   */\n  async getRangePlugins(params: RangeQuery): Promise<RangeStats> {\n    const { display, range, prevRange } = params;\n\n    log('Getting plugin growth trend statistics for range: %s to %s', range[0], range[1]);\n\n    const searchParams = new URLSearchParams();\n    searchParams.append('display', display);\n    searchParams.append('range', range.join(','));\n    if (prevRange) {\n      searchParams.append('prevRange', prevRange.join(','));\n    }\n\n    const url = `/admin/analysis/plugin/range-plugins?${searchParams.toString()}`;\n\n    const result = await this.request<ApiResponse<RangeStats>>(url);\n\n    log(\n      'Plugin growth trend statistics retrieved successfully: %d data points',\n      result.data.data.length,\n    );\n\n    return result.data;\n  }\n\n  /**\n   * Retrieves device growth trend statistics for a specified date range\n   *\n   * Note: This is a system-level statistic that tracks device registrations,\n   * not plugin-specific metrics. It provides daily device registration counts\n   * and trends for the specified period with optional comparison to a previous period.\n   *\n   * @param params - Query parameters including date range and display config\n   * @returns Promise resolving to device growth trend statistics\n   */\n  async getRangeDevices(params: RangeQuery): Promise<RangeStats> {\n    const { display, range, prevRange } = params;\n\n    log('Getting device growth trend statistics for range: %s to %s', range[0], range[1]);\n\n    const searchParams = new URLSearchParams();\n    searchParams.append('display', display);\n    searchParams.append('range', range.join(','));\n    if (prevRange) {\n      searchParams.append('prevRange', prevRange.join(','));\n    }\n\n    const url = `/admin/analysis/system/range-devices?${searchParams.toString()}`;\n\n    const result = await this.request<ApiResponse<RangeStats>>(url);\n\n    log(\n      'Device growth trend statistics retrieved successfully: %d data points',\n      result.data.data.length,\n    );\n\n    return result.data;\n  }\n\n  /**\n   * Retrieves plugin call trend statistics for a specified date range\n   *\n   * Returns daily plugin call counts and trends for the specified period\n   * with optional comparison to a previous period.\n   *\n   * @param params - Query parameters including date range and display config\n   * @returns Promise resolving to plugin call trend statistics\n   */\n  async getRangeCalls(params: RangeQuery): Promise<RangeStats> {\n    const { display, range, prevRange } = params;\n\n    log('Getting plugin call trend statistics for range: %s to %s', range[0], range[1]);\n\n    const searchParams = new URLSearchParams();\n    searchParams.append('display', display);\n    searchParams.append('range', range.join(','));\n    if (prevRange) {\n      searchParams.append('prevRange', prevRange.join(','));\n    }\n\n    const url = `/admin/analysis/plugin/range-calls?${searchParams.toString()}`;\n\n    const result = await this.request<ApiResponse<RangeStats>>(url);\n\n    log(\n      'Plugin call trend statistics retrieved successfully: %d data points',\n      result.data.data.length,\n    );\n\n    return result.data;\n  }\n\n  /**\n   * Calculates trend growth rate between current and previous period totals\n   *\n   * Utility method for calculating percentage growth rates from range statistics.\n   *\n   * @param stats - Range statistics with sum and prevSum\n   * @returns Growth rate as percentage (e.g., 15.5 for 15.5% growth)\n   */\n  static calculateTrendGrowthRate(stats: RangeStats): number {\n    return this.calculateGrowthRate(stats.sum, stats.prevSum);\n  }\n\n  /**\n   * Retrieves top plugins sorted by specified criteria within a date range\n   *\n   * Returns list of plugins sorted by the specified criteria (installs or calls)\n   * in descending order for the specified date range.\n   *\n   * @param params - Query parameters including date range, sort criteria, and limit\n   * @returns Promise resolving to list of top plugins\n   */\n  async getTopPlugins(params: TopPluginsQuery): Promise<TopPlugin[]> {\n    const { range, sortBy = 'installs', limit = 10 } = params;\n\n    const searchParams = new URLSearchParams();\n    searchParams.append('range', range.join(','));\n    searchParams.append('sortBy', sortBy);\n    searchParams.append('limit', limit.toString());\n\n    const url = `/admin/analysis/plugin/top-plugins?${searchParams.toString()}`;\n\n    const result = await this.request<ApiResponse<TopPlugin[]>>(url);\n\n    return result.data;\n  }\n}\n","import type {\n  AdminDeploymentOption,\n  AdminPluginItem,\n  AdminPluginItemDetail,\n  IncompleteI18nPlugin,\n  InstallationDetails,\n  PluginManifest,\n  PluginVersion,\n  PluginVersionLocalization,\n  SystemDependency,\n} from '@lobehub/market-types';\nimport debug from 'debug';\n\nimport { BaseSDK } from '@/core/BaseSDK';\nimport {\n  AdminListQueryParams,\n  AdminListResponse,\n  PluginI18nImportParams,\n  PluginI18nImportResponse,\n  PluginUpdateParams,\n  PluginVersionCreateParams,\n  PluginVersionUpdateParams,\n  UnclaimedPluginItem,\n} from '@/types';\n\n// Create debug instance for logging\nconst log = debug('lobe-market-sdk:admin:plugins');\n\n/**\n * Plugin Management Service\n *\n * Provides administrative functionality for managing plugins in the marketplace.\n * This service handles CRUD operations for plugins, plugin versions, and deployment options.\n */\nexport class PluginService extends BaseSDK {\n  /**\n   * Batch imports plugin manifests using the dedicated import endpoint\n   *\n   * This method is intended for use with scripts and bulk import operations.\n   *\n   * @param manifests - Array of plugin manifests to import\n   * @param ownerId - Optional owner ID to associate with the imported plugins\n   * @returns Promise resolving to the import results with counts of success, skipped, failed, and a list of failed IDs\n   */\n  async importPlugins(\n    manifests: PluginManifest[],\n    ownerId?: number,\n  ): Promise<{ failed: number; failedIds: string[]; skipped: number; success: number }> {\n    log(`Starting batch plugin import of ${manifests.length} manifests`);\n    if (ownerId) {\n      log(`Using specified owner ID for import: ${ownerId}`);\n    }\n\n    const response = await this.request<{\n      data: { failed: number; failedIds: string[]; skipped: number; success: number };\n    }>('/admin/plugins/import', {\n      body: JSON.stringify({\n        manifests,\n        ownerId,\n      }),\n      method: 'POST',\n    });\n\n    log(\n      `Plugin import completed: ${response.data.success} succeeded, ${response.data.skipped} skipped, ${response.data.failed} failed`,\n    );\n    return response.data;\n  }\n\n  /**\n   * Imports plugin internationalization (i18n) data\n   *\n   * Allows importing localized content for a specific plugin version.\n   * This method creates or updates localizations for the specified plugin.\n   *\n   * @param params - Plugin i18n import parameters containing identifier, version, and localizations\n   * @returns Promise resolving to the import results with counts of success and failure\n   */\n  async importPluginI18n(params: PluginI18nImportParams): Promise<PluginI18nImportResponse> {\n    log(\n      `Starting i18n import for plugin ${params.identifier} v${params.version} with ${params.localizations.length} localizations`,\n    );\n\n    const response = await this.request<{\n      data: PluginI18nImportResponse;\n      message: string;\n    }>('/admin/plugins/import/i18n', {\n      body: JSON.stringify(params),\n      method: 'POST',\n    });\n\n    log(\n      `Plugin i18n import completed: ${response.data.success} succeeded, ${response.data.failed} failed, ${response.data.totalLocalizations} total`,\n    );\n    return response.data;\n  }\n\n  /**\n   * Retrieves a list of plugins with admin details\n   *\n   * Supports filtering, pagination, and sorting of results.\n   *\n   * @param params - Query parameters for filtering and pagination\n   * @returns Promise resolving to the plugin list response with admin details\n   */\n  async getPlugins(params: AdminListQueryParams = {}): Promise<AdminListResponse<AdminPluginItem>> {\n    log('Getting plugins with params: %O', params);\n\n    const queryString = this.buildQueryString(params);\n    const url = `/admin/plugins${queryString}`;\n\n    const result = await this.request<AdminListResponse<AdminPluginItem>>(url);\n\n    log('Retrieved %d plugins', result.data.length);\n    return result;\n  }\n\n  /**\n   * Retrieves all published plugin identifiers\n   *\n   * Returns a lightweight list of all published plugin identifiers without\n   * full plugin metadata. This is useful for admin operations that need to know\n   * which plugins are currently published and available to users.\n   *\n   * @returns Promise resolving to an array containing identifiers array and last modified time\n   */\n  async getPublishedIdentifiers(): Promise<{ identifier: string; lastModified: string }[]> {\n    log('Getting published plugin identifiers (admin)');\n\n    const result =\n      await this.request<{ identifier: string; lastModified: string }[]>('/v1/plugins/identifiers');\n    log('Retrieved %d published plugin identifiers (admin)', result.length);\n    return result;\n  }\n\n  /**\n   * Retrieves a single plugin with full admin details\n   *\n   * @param id - Plugin ID or identifier\n   * @returns Promise resolving to the detailed plugin information with version history\n   */\n  async getPlugin(id: number | string): Promise<AdminPluginItemDetail> {\n    log('Getting plugin details (admin): %d', id);\n\n    const result = await this.request<AdminPluginItemDetail>(`/admin/plugins/${id}`);\n    log('Retrieved plugin with %d versions', result.versions.length);\n    return result;\n  }\n\n  /**\n   * Retrieves a plugin by its GitHub repository URL\n   *\n   * @param githubUrl - The GitHub repository URL to search for\n   * @returns Promise resolving to the detailed plugin information with version history\n   */\n  async getPluginByGithubUrl(githubUrl: string): Promise<AdminPluginItemDetail> {\n    log('Getting plugin by GitHub URL: %s', githubUrl);\n\n    const queryString = this.buildQueryString({ url: githubUrl });\n    const result = await this.request<AdminPluginItemDetail>(\n      `/admin/plugins/by-github-url${queryString}`,\n    );\n    log('Retrieved plugin with %d versions', result.versions.length);\n    return result;\n  }\n\n  /**\n   * Updates plugin information\n   *\n   * @param id - Plugin ID\n   * @param data - Plugin update data containing fields to update\n   * @returns Promise resolving to the updated plugin\n   */\n  async updatePlugin(id: number, data: PluginUpdateParams): Promise<AdminPluginItem> {\n    log('Updating plugin: %d, data: %O', id, data);\n\n    const result = await this.request<AdminPluginItem>(`/admin/plugins/${id}`, {\n      body: JSON.stringify(data),\n      method: 'PUT',\n    });\n    log('Plugin updated successfully');\n    return result;\n  }\n\n  /**\n   * Updates plugin publication status\n   *\n   * @param id - Plugin ID\n   * @param status - New status to set\n   * @returns Promise resolving to success response\n   */\n  async updatePluginStatus(\n    id: number,\n    status: 'published' | 'draft' | 'review' | 'rejected',\n  ): Promise<{ message: string; success: boolean }> {\n    log('Updating plugin status: %d to %s', id, status);\n\n    const result = await this.request<{ message: string; success: boolean }>(\n      `/admin/plugins/${id}/status`,\n      {\n        body: JSON.stringify({ status }),\n        method: 'PATCH',\n      },\n    );\n    log('Plugin status updated successfully');\n    return result;\n  }\n\n  /**\n   * Deletes a plugin\n   *\n   * @param id - Plugin ID\n   * @returns Promise resolving to success response\n   */\n  async deletePlugin(id: number): Promise<{ message: string; success: boolean }> {\n    log('Deleting plugin: %d', id);\n\n    const result = await this.request<{ message: string; success: boolean }>(\n      `/admin/plugins/${id}`,\n      { method: 'DELETE' },\n    );\n    log('Plugin deleted successfully');\n    return result;\n  }\n\n  /**\n   * Retrieves the version history for a plugin\n   *\n   * @param pluginId - Plugin ID\n   * @returns Promise resolving to an array of plugin versions\n   */\n  async getPluginVersions(pluginId: number): Promise<PluginVersion[]> {\n    log('Getting plugin versions: pluginId=%d', pluginId);\n\n    const result = await this.request<PluginVersion[]>(`/admin/plugins/${pluginId}/versions`);\n\n    log('Retrieved %d versions', result.length);\n    return result;\n  }\n\n  /**\n   * Retrieves a specific plugin version\n   *\n   * @param pluginId - Plugin ID\n   * @param versionId - Version ID\n   * @returns Promise resolving to the plugin version details\n   */\n  async getPluginVersion(pluginId: number, versionId: number): Promise<PluginVersion> {\n    log('Getting version details: pluginId=%d, versionId=%d', pluginId, versionId);\n\n    const result = await this.request<PluginVersion>(\n      `/admin/plugins/${pluginId}/versions/${versionId}`,\n    );\n    log('Version details retrieved');\n    return result;\n  }\n\n  /**\n   * Retrieves all localizations for a specific plugin version\n   *\n   * @param pluginId - Plugin ID or identifier\n   * @param versionId - Version ID\n   * @returns Promise resolving to an array of plugin version localizations\n   */\n  async getPluginLocalizations(\n    pluginId: number | string,\n    versionId: number,\n  ): Promise<PluginVersionLocalization[]> {\n    log('Getting localizations: pluginId=%s, versionId=%d', pluginId, versionId);\n\n    const result = await this.request<PluginVersionLocalization[]>(\n      `/admin/plugins/${pluginId}/versions/${versionId}/localizations`,\n    );\n    log('Retrieved %d localizations for plugin %s, version %d', result.length, pluginId, versionId);\n    return result;\n  }\n\n  /**\n   * Creates a new plugin version with all version-specific data\n   *\n   * @param pluginId - Plugin ID\n   * @param data - Version creation data including all version-specific fields\n   * @returns Promise resolving to the created plugin version\n   */\n  async createPluginVersion(\n    pluginId: number,\n    data: PluginVersionCreateParams,\n  ): Promise<PluginVersion> {\n    log('Creating new plugin version: pluginId=%d, data: %O', pluginId, data);\n\n    const result = await this.request<PluginVersion>(`/admin/plugins/${pluginId}/versions`, {\n      body: JSON.stringify(data),\n      method: 'POST',\n    });\n    log('Plugin version created successfully: version=%s', data.version);\n    return result;\n  }\n\n  /**\n   * Creates a new plugin version from a manifest\n   * Extracts version data from the manifest for easier creation\n   *\n   * @param pluginId - Plugin ID\n   * @param manifest - Plugin manifest containing all version data\n   * @param options - Additional options for version creation\n   * @returns Promise resolving to the created plugin version\n   */\n  async createPluginVersionFromManifest(\n    pluginId: number,\n    manifest: PluginManifest,\n    options: {\n      isLatest?: boolean;\n      isValidated?: boolean;\n    } = {},\n  ): Promise<PluginVersion> {\n    log(\n      'Creating plugin version from manifest: pluginId=%d, version=%s',\n      pluginId,\n      manifest.version,\n    );\n\n    const versionData: PluginVersionCreateParams = {\n      author: manifest.author?.name,\n      authorUrl: manifest.author?.url,\n      capabilitiesPrompts: manifest.capabilities?.prompts,\n      capabilitiesResources: manifest.capabilities?.resources,\n      capabilitiesTools: manifest.capabilities?.tools,\n      category: manifest.category,\n      description: manifest.description,\n      icon: manifest.icon,\n      isLatest: options.isLatest,\n      isValidated: options.isValidated,\n      name: manifest.name,\n      prompts: manifest.prompts,\n      readme: manifest.overview?.readme,\n      resources: manifest.resources,\n      summary: manifest.overview?.summary,\n      tags: manifest.tags,\n      tools: manifest.tools,\n      version: manifest.version,\n    };\n\n    return this.createPluginVersion(pluginId, versionData);\n  }\n\n  /**\n   * Updates a plugin version with comprehensive version-specific data\n   *\n   * @param idOrIdentifier - Plugin ID\n   * @param versionId - Version ID\n   * @param data - Version update data including all version-specific fields\n   * @returns Promise resolving to the updated plugin version\n   */\n  async updatePluginVersion(\n    idOrIdentifier: number | string,\n    versionId: number,\n    data: PluginVersionUpdateParams,\n  ): Promise<PluginVersion> {\n    log(\n      'Updating plugin version: pluginId=%d, versionId=%d, data: %O',\n      idOrIdentifier,\n      versionId,\n      data,\n    );\n\n    const result = await this.request<PluginVersion>(\n      `/admin/plugins/${idOrIdentifier}/versions/${versionId}`,\n      {\n        body: JSON.stringify(data),\n        method: 'PUT',\n      },\n    );\n\n    log('Plugin version updated successfully');\n    return result;\n  }\n\n  /**\n   * Deletes a plugin version\n   *\n   * @param pluginId - Plugin ID\n   * @param versionId - Version ID\n   * @returns Promise resolving to success response\n   */\n  async deletePluginVersion(\n    pluginId: number,\n    versionId: number,\n  ): Promise<{ message: string; success: boolean }> {\n    log('Deleting version: pluginId=%d, versionId=%d', pluginId, versionId);\n\n    const result = await this.request<{ message: string; success: boolean }>(\n      `/admin/plugins/${pluginId}/versions/${versionId}`,\n      { method: 'DELETE' },\n    );\n    log('Plugin version deleted successfully');\n    return result;\n  }\n\n  /**\n   * Sets a specific version as the latest version of a plugin\n   *\n   * @param pluginId - Plugin ID\n   * @param versionId - Version ID to set as latest\n   * @returns Promise resolving to success response\n   */\n  async setPluginVersionAsLatest(\n    pluginId: number,\n    versionId: number,\n  ): Promise<{ message: string; success: boolean }> {\n    log('Setting version as latest: pluginId=%d, versionId=%d', pluginId, versionId);\n\n    const result = await this.request<{ message: string; success: boolean }>(\n      `/admin/plugins/${pluginId}/versions/${versionId}/latest`,\n      { method: 'POST' },\n    );\n    log('Version set as latest successfully');\n    return result;\n  }\n\n  /**\n   * Updates plugin visibility\n   *\n   * @param id - Plugin ID\n   * @param visibility - New visibility setting\n   * @returns Promise resolving to success response\n   */\n  async updatePluginVisibility(\n    id: number,\n    visibility: 'public' | 'private' | 'unlisted',\n  ): Promise<{ message: string; success: boolean }> {\n    log('Updating plugin visibility: %d to %s', id, visibility);\n\n    const result = await this.request<{ message: string; success: boolean }>(\n      `/admin/plugins/${id}/visibility`,\n      {\n        body: JSON.stringify({ visibility }),\n        method: 'PATCH',\n      },\n    );\n    log('Plugin visibility updated successfully');\n    return result;\n  }\n\n  /**\n   * Updates status for multiple plugins in a single operation\n   *\n   * @param ids - Array of plugin IDs to update\n   * @param status - New status to set for all specified plugins\n   * @returns Promise resolving to success response\n   */\n  async batchUpdatePluginStatus(\n    ids: number[],\n    status: 'published' | 'draft' | 'review' | 'rejected',\n  ): Promise<{ message: string; success: boolean }> {\n    log('Batch updating plugin status: %O to %s', ids, status);\n\n    const result = await this.request<{ message: string; success: boolean }>(\n      '/admin/plugins/batch/status',\n      {\n        body: JSON.stringify({ ids, status }),\n        method: 'PATCH',\n      },\n    );\n    log('Batch plugin status update completed');\n    return result;\n  }\n\n  /**\n   * Deletes multiple plugins in a single operation\n   *\n   * @param ids - Array of plugin IDs to delete\n   * @returns Promise resolving to success response\n   */\n  async batchDeletePlugins(ids: number[]): Promise<{ message: string; success: boolean }> {\n    log('Batch deleting plugins: %O', ids);\n\n    const result = await this.request<{ message: string; success: boolean }>(\n      '/admin/plugins/batch/delete',\n      {\n        body: JSON.stringify({ ids }),\n        method: 'DELETE',\n      },\n    );\n    log('Batch plugin deletion completed');\n    return result;\n  }\n\n  /**\n   * Retrieves detailed information about a plugin version including deployment options\n   *\n   * @param pluginId - Plugin ID\n   * @param versionId - Version ID\n   * @returns Promise resolving to version details with deployment options\n   */\n  async getPluginVersionDetails(\n    pluginId: number,\n    versionId: number,\n  ): Promise<PluginVersion & { deploymentOptions: any }> {\n    log(\n      'Getting version details with deployment options: pluginId=%d, versionId=%d',\n      pluginId,\n      versionId,\n    );\n\n    const result = await this.request<PluginVersion & { deploymentOptions: any }>(\n      `/admin/plugins/${pluginId}/versions/${versionId}`,\n    );\n    log('Version details with deployment options retrieved');\n    return result;\n  }\n\n  /**\n   * Retrieves deployment options for a specific plugin version\n   *\n   * @param pluginId - Plugin ID\n   * @param versionId - Version ID\n   * @returns Promise resolving to an array of deployment options\n   */\n  async getDeploymentOptions(\n    pluginId: number,\n    versionId: number,\n  ): Promise<AdminDeploymentOption[]> {\n    log('Getting deployment options: pluginId=%d, versionId=%d', pluginId, versionId);\n\n    const result = await this.request<AdminDeploymentOption[]>(\n      `/admin/plugins/${pluginId}/versions/${versionId}/deployment-options`,\n    );\n    log('Retrieved %d deployment options', result.length);\n    return result;\n  }\n\n  /**\n   * Creates a new deployment option for a plugin version\n   *\n   * @param pluginId - Plugin ID\n   * @param versionId - Version ID\n   * @param data - Deployment option configuration data\n   * @returns Promise resolving to the created deployment option\n   */\n  async createDeploymentOption(\n    pluginId: number,\n    versionId: number,\n    data: {\n      connectionArgs?: string[];\n      connectionCommand?: string;\n      connectionType: string;\n      description?: string;\n      installationDetails?: InstallationDetails;\n      installationMethod: string;\n      isRecommended?: boolean;\n    },\n  ): Promise<AdminDeploymentOption> {\n    log('Creating deployment option: pluginId=%d, versionId=%d', pluginId, versionId);\n\n    const result = await this.request<AdminDeploymentOption>(\n      `/admin/plugins/${pluginId}/versions/${versionId}/deployment-options`,\n      {\n        body: JSON.stringify(data),\n        method: 'POST',\n      },\n    );\n    log('Deployment option created successfully');\n    return result;\n  }\n\n  /**\n   * Updates an existing deployment option\n   *\n   * @param pluginId - Plugin ID\n   * @param versionId - Version ID\n   * @param optionId - Deployment option ID\n   * @param data - Updated deployment option configuration\n   * @returns Promise resolving to the updated deployment option\n   */\n  async updateDeploymentOption(\n    pluginId: number,\n    versionId: number,\n    optionId: number,\n    data: {\n      connectionArgs?: string[];\n      connectionCommand?: string;\n      connectionType?: string;\n      description?: string;\n      installationDetails?: Record<string, any>;\n      installationMethod?: string;\n      isRecommended?: boolean;\n    },\n  ): Promise<AdminDeploymentOption> {\n    log(\n      'Updating deployment option: pluginId=%d, versionId=%d, optionId=%d',\n      pluginId,\n      versionId,\n      optionId,\n    );\n\n    const result = await this.request<AdminDeploymentOption>(\n      `/admin/plugins/${pluginId}/versions/${versionId}/deployment-options/${optionId}`,\n      {\n        body: JSON.stringify(data),\n        method: 'PUT',\n      },\n    );\n    log('Deployment option updated successfully');\n    return result;\n  }\n\n  /**\n   * Deletes a deployment option\n   *\n   * @param pluginId - Plugin ID\n   * @param versionId - Version ID\n   * @param optionId - Deployment option ID\n   * @returns Promise resolving to success response\n   */\n  async deleteDeploymentOption(\n    pluginId: number,\n    versionId: number,\n    optionId: number,\n  ): Promise<{ message: string; success: boolean }> {\n    log(\n      'Deleting deployment option: pluginId=%d, versionId=%d, optionId=%d',\n      pluginId,\n      versionId,\n      optionId,\n    );\n\n    const result = await this.request<{ message: string; success: boolean }>(\n      `/admin/plugins/${pluginId}/versions/${versionId}/deployment-options/${optionId}`,\n      { method: 'DELETE' },\n    );\n    log('Deployment option deleted successfully');\n    return result;\n  }\n\n  /**\n   * Retrieves system dependencies for a deployment option\n   *\n   * @param pluginId - Plugin ID\n   * @param versionId - Version ID\n   * @param optionId - Deployment option ID\n   * @returns Promise resolving to an array of system dependencies\n   */\n  async getDeploymentOptionSystemDependencies(\n    pluginId: number,\n    versionId: number,\n    optionId: number,\n  ): Promise<SystemDependency[]> {\n    log(\n      'Getting system dependencies: pluginId=%d, versionId=%d, optionId=%d',\n      pluginId,\n      versionId,\n      optionId,\n    );\n\n    const result = await this.request<SystemDependency[]>(\n      `/admin/plugins/${pluginId}/versions/${versionId}/deployment-options/${optionId}/system-dependencies`,\n    );\n    log('Retrieved %d system dependencies', result.length);\n    return result;\n  }\n\n  /**\n   * Retrieves verified plugins without summary information\n   *\n   * Returns plugins that are validated but missing summary data.\n   *\n   * @returns Promise resolving to array of plugins with incomplete summary data\n   */\n  async getVerifiedPluginsWithoutSummary(): Promise<\n    { identifier: string; manifest: PluginManifest; versionId: number }[]\n  > {\n    log('Getting verified plugins without summary');\n\n    const result = await this.request<\n      { identifier: string; manifest: PluginManifest; versionId: number }[]\n    >('/admin/plugins/verified-without-summary');\n\n    log('Retrieved %d verified plugins without summary', result.length);\n    return result;\n  }\n\n  /**\n   * Retrieves plugins with incomplete internationalization\n   *\n   * Returns plugins where pluginVersionLocalizations has only 1 entry.\n   *\n   * @returns Promise resolving to an array of plugins with incomplete i18n\n   */\n  async getIncompleteI18nPlugins(): Promise<IncompleteI18nPlugin[]> {\n    log('Getting plugins with incomplete i18n');\n\n    const result = await this.request<IncompleteI18nPlugin[]>('/admin/plugins/incomplete-i18n');\n    log('Retrieved %d plugins with incomplete i18n', result.length);\n    return result;\n  }\n\n  /**\n   * Retrieves unclaimed plugins\n   *\n   * Returns plugins where isClaimed is false, containing only ID and identifier.\n   *\n   * @returns Promise resolving to an array of unclaimed plugins with basic info\n   */\n  async getUnclaimedPlugins(): Promise<UnclaimedPluginItem[]> {\n    log('Getting unclaimed plugins');\n\n    const result = await this.request<UnclaimedPluginItem[]>('/admin/plugins/unclaimed');\n    log('Retrieved %d unclaimed plugins', result.length);\n    return result;\n  }\n}\n","import type { SystemDependency } from '@lobehub/market-types';\nimport debug from 'debug';\n\nimport { BaseSDK } from '@/core/BaseSDK';\n\n// Create debug instance for logging\nconst log = debug('lobe-market-sdk:admin:dependency');\n\n/**\n * System Dependency Management Service\n *\n * Provides administrative functionality for managing system dependencies\n * required by plugins. This service handles creating, updating, deleting,\n * and listing system dependencies that plugins may require.\n */\nexport class SystemDependencyService extends BaseSDK {\n  /**\n   * Retrieves all system dependencies\n   *\n   * Gets a list of all defined system dependencies that plugins may require.\n   *\n   * @returns Promise resolving to an array of system dependencies\n   */\n  async getSystemDependencies(): Promise<SystemDependency[]> {\n    log('Getting all system dependencies');\n\n    const result = await this.request<SystemDependency[]>(`/admin/plugins/dependencies`);\n    log('Retrieved %d system dependencies', result.length);\n    return result;\n  }\n\n  /**\n   * Retrieves a specific system dependency by ID\n   *\n   * @param id - System dependency ID\n   * @returns Promise resolving to the system dependency details\n   */\n  async getSystemDependency(id: number): Promise<SystemDependency> {\n    log('Getting system dependency details: %d', id);\n\n    const result = await this.request<SystemDependency>(`/admin/plugins/dependencies/${id}`);\n    log('System dependency details retrieved');\n    return result;\n  }\n\n  /**\n   * Creates a new system dependency\n   *\n   * @param data - System dependency creation data\n   * @returns Promise resolving to the created system dependency\n   */\n  async createSystemDependency(data: Omit<SystemDependency, 'id'>): Promise<SystemDependency> {\n    log('Creating system dependency: %O', data);\n\n    const result = await this.request<SystemDependency>(`/admin/plugins/dependencies`, {\n      body: JSON.stringify(data),\n      method: 'POST',\n    });\n    log('System dependency created successfully');\n    return result;\n  }\n\n  /**\n   * Updates an existing system dependency\n   *\n   * @param id - System dependency ID\n   * @param data - System dependency update data\n   * @returns Promise resolving to the updated system dependency\n   */\n  async updateSystemDependency(\n    id: number,\n    data: Partial<SystemDependency>,\n  ): Promise<SystemDependency> {\n    log('Updating system dependency: %d, data: %O', id, data);\n\n    const result = await this.request<SystemDependency>(`/admin/plugins/dependencies/${id}`, {\n      body: JSON.stringify(data),\n      method: 'PUT',\n    });\n    log('System dependency updated successfully');\n    return result;\n  }\n\n  /**\n   * Deletes a system dependency\n   *\n   * @param id - System dependency ID\n   * @returns Promise resolving to success response\n   */\n  async deleteSystemDependency(id: number): Promise<{ message: string; success: boolean }> {\n    log('Deleting system dependency: %d', id);\n\n    const result = await this.request<{ message: string; success: boolean }>(\n      `/admin/plugins/dependencies/${id}`,\n      { method: 'DELETE' },\n    );\n    log('System dependency deleted successfully');\n    return result;\n  }\n}\n","import debug from 'debug';\n\nimport { BaseSDK } from '@/core/BaseSDK';\n\n// Create debug instance for logging\nconst log = debug('lobe-market-sdk:admin:settings');\n\n/**\n * Settings entity representing a system setting\n */\nexport interface Settings {\n  /** Creation timestamp (ISO 8601 format) */\n  createdAt: string;\n  /** Optional description of the setting's purpose */\n  description?: string;\n  /** Unique identifier for the setting */\n  id: number;\n  /** Setting key name used for retrieving the setting */\n  key: string;\n  /** Last update timestamp (ISO 8601 format) */\n  updatedAt: string;\n  /** Setting value (stored as string) */\n  value: string;\n}\n\n/**\n * Configuration for enabled resource types\n */\nexport interface EnabledResources {\n  /** Whether agent resources are enabled */\n  agents: boolean;\n  /** Whether plugin resources are enabled */\n  plugins: boolean;\n}\n\n/**\n * Authentication configuration\n */\nexport interface AuthenticationConfig {\n  /** Whether authentication is required */\n  enabled: boolean;\n  /** Supported authentication schemes */\n  schemes: string[];\n}\n\n/**\n * Documentation URL configuration\n */\nexport interface DocumentationConfig {\n  /** URL to API documentation */\n  apiUrl?: string;\n  /** URL to privacy policy */\n  policyUrl?: string;\n  /** URL to terms of service */\n  termsOfServiceUrl?: string;\n}\n\n/**\n * Map of all system settings with typed properties\n */\nexport interface SettingsMap {\n  /** Additional settings (dynamically added) */\n  [key: string]: any;\n  /** Authentication configuration */\n  authentication: AuthenticationConfig;\n  /** Base URL for the marketplace */\n  baseURL: string;\n  /** Documentation URL configuration */\n  documentation: DocumentationConfig;\n  /** Configuration for enabled resource types */\n  enabledResources: EnabledResources;\n  /** Supported locales */\n  locales: string[];\n}\n\n/**\n * Parameters for creating a new setting\n */\nexport interface CreateSettingsParams {\n  /** Optional description of the setting's purpose */\n  description?: string;\n  /** Setting key name */\n  key: string;\n  /** Setting value (will be stored as string) */\n  value: string;\n}\n\n/**\n * Parameters for updating an existing setting\n */\nexport interface UpdateSettingsParams {\n  /** Optional new description */\n  description?: string;\n  /** New setting value */\n  value: string;\n}\n\n/**\n * Settings Management Service\n *\n * Provides administrative functionality for managing system settings.\n * This service handles getting, creating, updating, and deleting\n * configuration settings for the marketplace.\n */\nexport class SettingsService extends BaseSDK {\n  /**\n   * Retrieves all system settings\n   *\n   * Returns a consolidated map of all settings with typed values\n   * for known setting keys.\n   *\n   * @returns Promise resolving to the settings map\n   */\n  async getSettings(): Promise<SettingsMap> {\n    return await this.request<SettingsMap>('/admin/settings');\n  }\n\n  /**\n   * Retrieves a specific setting by key\n   *\n   * @param key - Setting key name\n   * @returns Promise resolving to the setting details\n   */\n  async getSettingByKey(key: string): Promise<{ data: Settings }> {\n    log('Getting setting: %s', key);\n\n    const result = await this.request<{ data: Settings }>(`/admin/settings/${key}`);\n    log('Setting retrieved');\n    return result;\n  }\n\n  /**\n   * Creates a new system setting\n   *\n   * @param data - Setting creation parameters\n   * @returns Promise resolving to the created setting\n   */\n  async createSetting(data: CreateSettingsParams): Promise<{ data: Settings }> {\n    log('Creating setting: %O', data);\n\n    const result = await this.request<{ data: Settings }>('/admin/settings', {\n      body: JSON.stringify(data),\n      method: 'POST',\n    });\n    log('Setting created successfully');\n    return result;\n  }\n\n  /**\n   * Updates an existing setting\n   *\n   * @param key - Setting key name\n   * @param data - Setting update parameters\n   * @returns Promise resolving to the updated setting\n   */\n  async updateSetting(key: string, data: UpdateSettingsParams): Promise<{ data: Settings }> {\n    log('Updating setting: %s, data: %O', key, data);\n\n    const result = await this.request<{ data: Settings }>(`/admin/settings/${key}`, {\n      body: JSON.stringify(data),\n      method: 'PUT',\n    });\n    log('Setting updated successfully');\n    return result;\n  }\n\n  /**\n   * Deletes a setting\n   *\n   * @param key - Setting key name\n   * @returns Promise resolving to success message\n   */\n  async deleteSetting(key: string): Promise<{ message: string }> {\n    log('Deleting setting: %s', key);\n\n    const result = await this.request<{ message: string }>(`/admin/settings/${key}`, {\n      method: 'DELETE',\n    });\n    log('Setting deleted successfully');\n    return result;\n  }\n}\n","import debug from 'debug';\n\nimport { BaseSDK } from '@/core/BaseSDK';\nimport type { AdminListQueryParams, AdminListResponse, ReviewStatus } from '@/types';\n\n// Create debug instance for logging\nconst log = debug('lobe-market-sdk:admin:review');\n\n/**\n * Review entity representing a plugin review\n */\nexport interface Review {\n  /** Optional comment providing feedback */\n  comment?: string;\n  /** Creation timestamp (ISO 8601 format) */\n  createdAt: string;\n  /** Unique identifier for the review */\n  id: number;\n  /** ID of the plugin being reviewed */\n  pluginId: number;\n  /** ID of the reviewer (if available) */\n  reviewerId?: number;\n  /** Current status of the review */\n  status: ReviewStatus;\n  /** Last update timestamp (ISO 8601 format) */\n  updatedAt: string;\n}\n\n/**\n * Extended review information with related entities\n */\nexport interface PluginReviewWithRelations extends Review {\n  /** Related plugin information */\n  plugin?: any;\n  /** Related version information */\n  version?: any;\n}\n\n/**\n * Parameters for updating a review\n */\nexport interface UpdateReviewParams {\n  /** Optional comment or feedback */\n  comment?: string;\n  /** New status to set for the review */\n  status: ReviewStatus;\n}\n\n/**\n * Review Management Service\n *\n * Provides administrative functionality for managing plugin reviews.\n * This service handles listing, fetching, and updating review statuses\n * for plugins in the marketplace.\n */\nexport class ReviewService extends BaseSDK {\n  /**\n   * Retrieves a list of reviews with filtering options\n   *\n   * @param params - Query parameters for filtering and pagination\n   * @returns Promise resolving to the review list response\n   */\n  async getReviews(\n    params: AdminListQueryParams = {},\n  ): Promise<AdminListResponse<PluginReviewWithRelations>> {\n    log('Getting reviews with params: %O', params);\n\n    const queryString = this.buildQueryString(params);\n    const url = `/admin/reviews${queryString ? `?${queryString}` : ''}`;\n\n    const result = await this.request<AdminListResponse<PluginReviewWithRelations>>(url);\n\n    log('Retrieved %d reviews', result.data.length);\n    return result;\n  }\n\n  /**\n   * Retrieves a specific review by ID\n   *\n   * @param id - Review ID\n   * @returns Promise resolving to the review details\n   */\n  async getReviewById(id: number): Promise<Review> {\n    log('Getting review details: %d', id);\n\n    const result = await this.request<Review>(`/admin/reviews/${id}`);\n    log('Review details retrieved');\n    return result;\n  }\n\n  /**\n   * Updates a review's status and comment\n   *\n   * @param id - Review ID\n   * @param data - Update parameters containing new status and optional comment\n   * @returns Promise resolving to the updated review\n   */\n  async updateReview(id: number, data: UpdateReviewParams): Promise<Review> {\n    log('Updating review: %d, data: %O', id, data);\n\n    const result = await this.request<Review>(`/admin/reviews/${id}`, {\n      body: JSON.stringify(data),\n      method: 'PUT',\n    });\n    log('Review updated successfully');\n    return result;\n  }\n\n  /**\n   * Retrieves the review history for a specific plugin\n   *\n   * @param pluginId - Plugin ID\n   * @returns Promise resolving to an array of reviews for the plugin\n   */\n  async getPluginReviews(pluginId: number): Promise<{ data: Review[] }> {\n    log('Getting plugin reviews: pluginId=%d', pluginId);\n\n    const result = await this.request<{ data: Review[] }>(`/admin/reviews/plugin/${pluginId}`);\n    log('Retrieved %d reviews for plugin', result.data.length);\n    return result;\n  }\n}\n","import debug from 'debug';\n\nimport { BaseSDK } from '@/core/BaseSDK';\nimport type { AdminListResponse } from '@/types/admin';\n\ntype AdminPluginEnvListQuery = any;\ntype PluginEnv = any;\n\nconst log = debug('lobe-market-sdk:admin:plugin-env');\n\nexport interface AdminPluginEnvCreateParams {\n  description?: string;\n  identifier: string;\n  key: string;\n  value: string;\n}\n\nexport interface AdminPluginEnvUpdateParams {\n  description?: string;\n  value?: string;\n}\n\n/**\n * Plugin Environment Variable Management Service\n *\n * Provides administrative functionality for managing plugin environment variables.\n */\nexport class PluginEnvService extends BaseSDK {\n  /**\n   * Retrieves a paginated list of plugin environment variables\n   *\n   * @param params - Query parameters for filtering and pagination\n   * @returns Promise resolving to the env list response\n   */\n  async getPluginEnvs(params: AdminPluginEnvListQuery = {}): Promise<AdminListResponse<PluginEnv>> {\n    log('Getting plugin envs with params: %O', params);\n    const queryString = this.buildQueryString(params);\n    const url = `/admin/plugins/env${queryString}`;\n    const result = await this.request<AdminListResponse<PluginEnv>>(url);\n    log('Retrieved %d plugin envs', result.data.length);\n    return result;\n  }\n\n  /**\n   * Retrieves a single plugin environment variable by ID\n   *\n   * @param id - Env ID\n   * @returns Promise resolving to the env item\n   */\n  async getPluginEnv(id: number): Promise<PluginEnv> {\n    log('Getting plugin env: %d', id);\n    const result = await this.request<PluginEnv>(`/admin/plugins/env/${id}`);\n    log('Retrieved plugin env: %d', id);\n    return result;\n  }\n\n  /**\n   * Creates a new plugin environment variable\n   *\n   * @param data - Env creation data\n   * @returns Promise resolving to the created env item\n   */\n  async createPluginEnv(data: AdminPluginEnvCreateParams): Promise<PluginEnv> {\n    log('Creating plugin env: %O', data);\n    const result = await this.request<PluginEnv>(`/admin/plugins/env`, {\n      body: JSON.stringify(data),\n      method: 'POST',\n    });\n    log('Plugin env created successfully');\n    return result;\n  }\n\n  /**\n   * Updates a plugin environment variable\n   *\n   * @param id - Env ID\n   * @param data - Env update data\n   * @returns Promise resolving to the updated env item\n   */\n  async updatePluginEnv(id: number, data: AdminPluginEnvUpdateParams): Promise<PluginEnv> {\n    log('Updating plugin env: %d, data: %O', id, data);\n    const result = await this.request<PluginEnv>(`/admin/plugins/env/${id}`, {\n      body: JSON.stringify(data),\n      method: 'PUT',\n    });\n    log('Plugin env updated successfully');\n    return result;\n  }\n\n  /**\n   * Deletes a plugin environment variable\n   *\n   * @param id - Env ID\n   * @returns Promise resolving to success response\n   */\n  async deletePluginEnv(id: number): Promise<{ success: boolean }> {\n    log('Deleting plugin env: %d', id);\n    const result = await this.request<{ success: boolean }>(`/admin/plugins/env/${id}`, {\n      method: 'DELETE',\n    });\n    log('Plugin env deleted successfully');\n    return result;\n  }\n\n  /**\n   * Batch import plugin environment variables\n   *\n   * @param data - Batch import data, format: { [plugin: string]: { [envKey: string]: string } }\n   * @returns Promise resolving to import result\n   */\n  async importPluginEnvs(\n    data: Record<string, Record<string, string>>,\n  ): Promise<{ success: number }> {\n    log('Batch importing plugin envs: %O', data);\n    const result = await this.request<{ success: number }>(`/admin/plugins/env/import`, {\n      body: JSON.stringify(data),\n      method: 'POST',\n    });\n    log('Batch import completed: %d envs imported', result.success);\n    return result;\n  }\n}\n","import debug from 'debug';\n\nimport { BaseSDK } from '../core/BaseSDK';\nimport type {\n  ClientRegistrationRequest,\n  ClientRegistrationResponse,\n  DiscoveryDocument,\n  MarketSDKOptions,\n} from '../types';\nimport { DiscoveryService, PluginsService } from './services';\n\n// Create debug instance for logging\nconst log = debug('lobe-market-sdk');\n\n/**\n * LobeHub Market SDK Client\n *\n * Main client for accessing the LobeHub Marketplace API.\n * This class provides access to marketplace resources like plugins, agents,\n * and service discovery information. It follows a composition pattern\n * by combining specialized domain services.\n */\nexport class MarketSDK extends BaseSDK {\n  /**\n   * Plugins service for accessing plugin-related functionality\n   * Provides methods to list, search, retrieve plugin information, and report installation attempts\n   */\n  readonly plugins: PluginsService;\n\n  /**\n   * Discovery service for retrieving API service information\n   * Used to get information about available endpoints and services\n   */\n  private readonly discovery: DiscoveryService;\n\n  /**\n   * Creates a new MarketSDK instance\n   *\n   * @param options - Configuration options for the SDK\n   */\n  constructor(options: MarketSDKOptions = {}) {\n    // Create shared token state object for all services\n    const sharedTokenState = {\n      accessToken: undefined,\n      tokenExpiry: undefined,\n    };\n\n    super(options, undefined, sharedTokenState);\n    log('MarketSDK instance created');\n\n    // Initialize domain services with shared headers and token state for efficient reuse\n    this.plugins = new PluginsService(options, this.headers, sharedTokenState);\n    this.discovery = new DiscoveryService(options, this.headers, sharedTokenState);\n  }\n\n  /**\n   * Retrieves the service discovery document\n   *\n   * The discovery document provides information about available API endpoints,\n   * versions, and capabilities of the Market API.\n   *\n   * @returns Promise resolving to the service discovery document\n   */\n  async getDiscoveryDocument(): Promise<DiscoveryDocument> {\n    return this.discovery.getDiscoveryDocument();\n  }\n\n  /**\n   * Registers a new client for M2M authentication\n   *\n   * This method registers a client application with the Market API and returns\n   * unique credentials (client_id and client_secret) that can be used for M2M authentication.\n   * These credentials should be stored securely and used to initialize the SDK.\n   *\n   * @param request - Client registration request data\n   * @returns Promise resolving to the client registration response with credentials\n   * @throws Error if registration fails\n   */\n  async registerClient(request: ClientRegistrationRequest): Promise<ClientRegistrationResponse> {\n    log('Registering client: %s (%s)', request.clientName, request.clientType);\n\n    try {\n      const response = await this.request<ClientRegistrationResponse>('v1/clients/register', {\n        body: JSON.stringify(request),\n        method: 'POST',\n      });\n\n      log('Client registered successfully: %s', response.client_id);\n      return response;\n    } catch (error) {\n      console.error('Client registration failed: %o', error);\n      throw error;\n    }\n  }\n}\n","import debug from 'debug';\nimport urlJoin from 'url-join';\n\nimport { BaseSDK } from '../../core/BaseSDK';\nimport type { DiscoveryDocument } from '../../types';\n\n// Create debug instance for logging\nconst log = debug('lobe-market-sdk:discovery');\n\n/**\n * Discovery Service\n *\n * Provides functionality for retrieving service discovery information\n * from the LobeHub Marketplace API. The discovery document contains\n * metadata about available endpoints, authentication methods, and\n * other capabilities of the API.\n */\nexport class DiscoveryService extends BaseSDK {\n  /** Cached discovery document to avoid repeated requests */\n  private discoveryDoc?: DiscoveryDocument;\n\n  /**\n   * Retrieves the service discovery document\n   *\n   * This document contains information about available API endpoints,\n   * authentication methods, and other capabilities of the Market API.\n   * The result is cached after the first request to improve performance.\n   *\n   * @returns Promise resolving to the service discovery document\n   */\n  async getDiscoveryDocument(): Promise<DiscoveryDocument> {\n    log('Fetching discovery document');\n    if (this.discoveryDoc) {\n      log('Returning cached discovery document');\n      return this.discoveryDoc;\n    }\n\n    const res = await fetch(urlJoin(this.baseUrl, '/.well-known/discovery'));\n    if (!res.ok) {\n      throw new Error(await res.text());\n    }\n\n    this.discoveryDoc = (await res.json()) as DiscoveryDocument;\n    log('Discovery document successfully fetched');\n    return this.discoveryDoc;\n  }\n}\n","import type {\n  CallReportRequest,\n  CallReportResponse,\n  InstallReportRequest,\n  InstallReportResponse,\n  PluginItemDetail,\n  PluginManifest,\n} from '@lobehub/market-types';\nimport debug from 'debug';\n\nimport { BaseSDK } from '../../core/BaseSDK';\nimport type {\n  CategoryItem,\n  CategoryListQuery,\n  PluginListResponse,\n  PluginQueryParams,\n} from '../../types';\n\n// Create debug instance for logging\nconst log = debug('lobe-market-sdk:plugins');\n\n/**\n * Plugins Service\n *\n * Provides access to plugin-related functionality in the LobeHub Marketplace.\n * This service handles listing, searching, and retrieving detailed information\n * about plugins available in the marketplace.\n */\nexport class PluginsService extends BaseSDK {\n  /**\n   * Retrieves a list of plugins from the marketplace\n   *\n   * Supports filtering, pagination, and localization of results.\n   *\n   * @param params - Query parameters for filtering and pagination\n   * @param options\n   * @returns Promise resolving to the plugin list response containing items and pagination info\n   */\n  async getPluginList(\n    params: PluginQueryParams = {},\n    options?: globalThis.RequestInit,\n  ): Promise<PluginListResponse> {\n    const locale = params.locale || this.defaultLocale;\n    const queryParams = { ...params, locale };\n    const queryString = this.buildQueryString(queryParams);\n\n    log('Getting plugin list: %O', queryParams);\n\n    const result = await this.request<PluginListResponse>(`/v1/plugins${queryString}`, options);\n    log('Retrieved %d plugins', result.items.length);\n    return result;\n  }\n\n  /**\n   * Retrieves all plugin categories and their counts\n   *\n   * Returns a list of categories along with the number of plugins in each category.\n   * Useful for building category filters in a UI. Supports optional search filtering\n   * via 'q' parameter and locale specification.\n   *\n   * @param params - Query parameters for filtering categories\n   * @param options - Optional request options\n   * @returns Promise resolving to an array of category items with counts\n   */\n  async getCategories(\n    params: CategoryListQuery = {},\n    options?: globalThis.RequestInit,\n  ): Promise<CategoryItem[]> {\n    const locale = params.locale || this.defaultLocale;\n    const queryParams = { ...params, locale };\n    const queryString = this.buildQueryString(queryParams);\n\n    log('Getting plugin categories: %O', queryParams);\n\n    const result = await this.request<CategoryItem[]>(\n      `/v1/plugins/categories${queryString}`,\n      options,\n    );\n    log('Retrieved %d categories', result.length);\n    return result;\n  }\n\n  /**\n   * Retrieves all published plugin identifiers\n   *\n   * Returns a lightweight list of all published plugin identifiers without\n   * full plugin metadata. This is useful for clients that need to know which\n   * plugins are available without fetching complete plugin information.\n   *\n   * @returns Promise resolving to an array containing identifiers array and last modified time\n   */\n  async getPublishedIdentifiers(\n    options?: globalThis.RequestInit,\n  ): Promise<{ identifier: string; lastModified: string }[]> {\n    log('Getting published plugin identifiers');\n\n    const result = await this.request<{ identifier: string; lastModified: string }[]>(\n      '/v1/plugins/identifiers',\n      options,\n    );\n    log('Retrieved %d published plugin identifiers', result.length);\n    return result;\n  }\n\n  /**\n   * Retrieves the manifest for a specific plugin\n   *\n   * The manifest contains detailed information about a plugin, including\n   * its capabilities, tools, prompts, and resources.\n   *\n   * @param identifier - Unique identifier of the plugin\n   * @param locale - Optional locale for localized content (defaults to SDK default locale)\n   * @param version - Optional specific version to retrieve (defaults to latest)\n   * @param options\n   * @returns Promise resolving to the plugin manifest\n   */\n  async getPluginManifest(\n    {\n      locale,\n      version,\n      identifier,\n    }: {\n      identifier: string;\n      locale?: string;\n      version?: string;\n    },\n    options?: globalThis.RequestInit,\n  ): Promise<PluginManifest> {\n    log('Getting plugin manifest: %O', { identifier, locale, version });\n    const localeParam = locale || this.defaultLocale;\n    const params: Record<string, string> = { locale: localeParam };\n    if (version) {\n      params.version = version;\n    }\n    const queryString = this.buildQueryString(params);\n\n    const manifest = await this.request<PluginManifest>(\n      `/v1/plugins/${identifier}/manifest${queryString}`,\n      options,\n    );\n\n    log('Plugin manifest successfully retrieved: %s', identifier);\n    return manifest;\n  }\n\n  /**\n   * Retrieves the plugin detailed information about a plugin, including\n   * its capabilities, tools, prompts, and resources.\n   *\n   * @param identifier - Unique identifier of the plugin\n   * @param locale - Optional locale for localized content (defaults to SDK default locale)\n   * @param version - Optional specific version to retrieve (defaults to latest)\n   * @returns Promise resolving to the plugin manifest\n   */\n  async getPluginDetail(\n    {\n      locale,\n      version,\n      identifier,\n    }: {\n      identifier: string;\n      locale?: string;\n      version?: string;\n    },\n    options?: globalThis.RequestInit,\n  ): Promise<PluginItemDetail> {\n    log('Getting plugin detail: %O', { identifier, locale, version });\n    const localeParam = locale || this.defaultLocale;\n    const params: Record<string, string> = { locale: localeParam };\n    if (version) {\n      params.version = version;\n    }\n    const queryString = this.buildQueryString(params);\n\n    const manifest = await this.request<PluginItemDetail>(\n      `/v1/plugins/${identifier}${queryString}`,\n      options,\n    );\n\n    log('Plugin manifest successfully retrieved: %s', identifier);\n    return manifest;\n  }\n\n  /**\n   * Report a plugin installation attempt\n   *\n   * Reports the outcome of a plugin installation attempt, including timing,\n   * success status, manifest information, and error details if applicable.\n   * This helps improve plugin validation and provides analytics about installation success rates.\n   *\n   * @param reportData - The installation report data\n   * @returns Promise resolving to the report submission response\n   *\n   */\n  async reportInstallation(reportData: InstallReportRequest): Promise<InstallReportResponse> {\n    log('Reporting installation for %s@%s', reportData.identifier, reportData.version);\n\n    const result = await this.request<InstallReportResponse>('/v1/plugins/report/installation', {\n      body: JSON.stringify(reportData),\n      headers: {\n        'Content-Type': 'application/json',\n      },\n      method: 'POST',\n    });\n\n    log('Installation report submitted successfully: %O', result);\n    return result;\n  }\n\n  /**\n   * Report a plugin method call attempt\n   *\n   * Reports the outcome of a plugin method call, including timing,\n   * success status, method information, and error details if applicable.\n   * This helps improve plugin performance monitoring and provides usage analytics.\n   *\n   * @param reportData - The call report data\n   * @returns Promise resolving to the report submission response\n   */\n  async reportCall(reportData: CallReportRequest): Promise<CallReportResponse> {\n    log(\n      'Reporting call for %s@%s - %s:%s',\n      reportData.identifier,\n      reportData.version,\n      reportData.methodType,\n      reportData.methodName,\n    );\n\n    const result = await this.request<CallReportResponse>('/v1/plugins/report/call', {\n      body: JSON.stringify(reportData),\n      headers: {\n        'Content-Type': 'application/json',\n      },\n      method: 'POST',\n    });\n\n    log('Call report submitted successfully: %O', result);\n    return result;\n  }\n}\n","import { z } from 'zod';\n\n/**\n * Visibility levels for plugins in the marketplace\n * - public: Visible to all users\n * - private: Visible only to the owner and authorized users\n * - internal: Visible only within the organization\n */\nexport const VisibilityEnumSchema = z.enum(['public', 'private', 'internal']);\n\n/**\n * Publication status options for plugins\n * - published: Publicly available in the marketplace\n * - unpublished: Not publicly visible\n * - archived: Marked as no longer maintained\n * - deprecated: Marked as deprecated, but still available\n */\nexport const StatusEnumSchema = z.enum(['published', 'unpublished', 'archived', 'deprecated']);\n\n/**\n * Common query parameters for admin list endpoints\n * These parameters are used for pagination, filtering, and sorting.\n */\nexport interface AdminListQueryParams {\n  /** Current page number (1-based) */\n  current?: number;\n  /** Search keyword for filtering results */\n  keyword?: string;\n  /** Number of items per page */\n  pageSize?: number;\n  /** Field to sort results by */\n  sortField?: string;\n  /** Sort direction */\n  sortOrder?: 'ascend' | 'descend';\n}\n\n/**\n * Common response format for paginated admin list endpoints\n * This structure provides both the data and pagination information.\n */\nexport interface AdminListResponse<T> {\n  /** Current page number (1-based) */\n  current: number;\n  /** Array of items for the current page */\n  data: T[];\n  /** Number of items per page */\n  pageSize: number;\n  /** Total number of items across all pages */\n  total: number;\n  /** Total number of pages */\n  totalPages: number;\n}\n\n/**\n * Review status options\n * - pending: Awaiting review\n * - approved: Review approved\n * - rejected: Review rejected\n */\nexport type ReviewStatus = 'pending' | 'approved' | 'rejected';\n\n/**\n * Review status schema for validation\n */\nexport const ReviewStatusEnumSchema = z.enum(['published', 'draft', 'review', 'rejected']);\n\n/**\n * Parameters for admin plugin listing\n * Extends the common query parameters with plugin-specific filters.\n */\nexport interface AdminPluginParams {\n  /** Filter for featured plugins */\n  featured?: boolean;\n  /** Maximum number of items to return */\n  limit?: number;\n  /** Number of items to skip */\n  offset?: number;\n  /** Sort direction */\n  order?: 'asc' | 'desc';\n  /** Field to sort by */\n  orderBy?: 'createdAt' | 'updatedAt' | 'installCount' | 'ratingAverage';\n  /** Filter by owner ID */\n  ownerId?: number;\n  /** Search query string */\n  query?: string;\n  /** Filter by plugin status */\n  status?: 'published' | 'draft' | 'review' | 'rejected';\n  /** Filter by visibility level */\n  visibility?: 'public' | 'private' | 'unlisted';\n}\n\n/**\n * Parameters for creating a new plugin version\n */\nexport interface PluginVersionCreateParams {\n  /** Author or organization name for this version */\n  author?: string;\n  /** URL to the author's website or profile */\n  authorUrl?: string;\n  /** Capability flag: whether this plugin provides prompts */\n  capabilitiesPrompts?: boolean;\n  /** Capability flag: whether this plugin manages resources (MCP) */\n  capabilitiesResources?: boolean;\n  /** Capability flag: whether this plugin provides tools */\n  capabilitiesTools?: boolean;\n  /** Category key for the plugin */\n  category?: string;\n  /** Description of the plugin version */\n  description?: string;\n  /** Icon URL or emoji for the plugin */\n  icon?: string;\n  /** Whether this is the latest version */\n  isLatest?: boolean;\n  /** Whether this version has been validated */\n  isValidated?: boolean;\n  /** Name of the plugin version */\n  name?: string;\n  /** Array of prompt definitions */\n  prompts?: any[];\n  /** README content */\n  readme?: string;\n  /** Array of resource definitions */\n  resources?: any[];\n  /** Summary of the plugin version */\n  summary?: string;\n  /** Array of tags for categorization */\n  tags?: string[];\n  /** Array of tool definitions */\n  tools?: any[];\n  /** Semantic version string (e.g., \"1.0.0\") */\n  version: string;\n}\n\n/**\n * Parameters for updating an existing plugin version\n */\nexport interface PluginVersionUpdateParams {\n  /** Author or organization name for this version */\n  author?: string;\n  /** URL to the author's website or profile */\n  authorUrl?: string;\n  /** Capability flag: whether this plugin provides prompts */\n  capabilitiesPrompts?: boolean;\n  /** Capability flag: whether this plugin manages resources (MCP) */\n  capabilitiesResources?: boolean;\n  /** Capability flag: whether this plugin provides tools */\n  capabilitiesTools?: boolean;\n  /** Category key for the plugin */\n  category?: string;\n  /** Description of the plugin version */\n  description?: string;\n  /** Icon URL or emoji for the plugin */\n  icon?: string;\n  /** Whether this version has been validated */\n  isValidated?: boolean;\n  /** Name of the plugin version */\n  name?: string;\n  /** Array of prompt definitions */\n  prompts?: any[];\n  /** README content */\n  readme?: string;\n  /** Array of resource definitions */\n  resources?: any[];\n  /** Summary of the plugin version */\n  summary?: string;\n  /** Array of tags for categorization */\n  tags?: string[];\n  /** Array of tool definitions */\n  tools?: any[];\n}\n\n/**\n * Parameters for updating plugin basic metadata (non-version specific)\n */\nexport interface PluginUpdateParams {\n  /** Unique identifier for the plugin */\n  identifier?: string;\n  /** Whether this plugin has been claimed by its original author */\n  isClaimed?: boolean;\n  /** Whether this plugin is featured */\n  isFeatured?: boolean;\n  /** Whether this plugin is officially maintained by LobeHub */\n  isOfficial?: boolean;\n  /** Publication status */\n  status?: 'published' | 'draft' | 'review' | 'rejected';\n  /** Visibility level */\n  visibility?: 'public' | 'private' | 'unlisted';\n}\n\n/**\n * Plugin localization data\n */\nexport interface PluginLocalization {\n  /** Plugin description in specific locale */\n  description: string;\n  /** Locale identifier (e.g., 'en-US', 'zh-CN') */\n  locale: string;\n  /** Plugin name in specific locale */\n  name: string;\n  /** Summary in specific locale */\n  summary?: string;\n  /** Plugin tags in specific locale */\n  tags?: string[];\n}\n\n/**\n * Parameters for importing plugin i18n data\n */\nexport interface PluginI18nImportParams {\n  /** Plugin identifier */\n  identifier: string;\n  /** Array of localizations for this plugin version */\n  localizations: PluginLocalization[];\n  /** Plugin version */\n  version: string;\n}\n\n/**\n * Response from plugin i18n import operation\n */\nexport interface PluginI18nImportResponse {\n  /** Number of failed localizations */\n  failed: number;\n  /** Number of successful localizations */\n  success: number;\n  /** Total number of processed localizations */\n  totalLocalizations: number;\n}\n\n/**\n * Unclaimed plugin item data structure\n * Represents a plugin that has not been claimed by its author\n */\nexport interface UnclaimedPluginItem {\n  /** Plugin ID */\n  id: number;\n  /** Plugin identifier */\n  identifier: string;\n}\n","/**\n * LobeHub Market JavaScript SDK\n *\n * This is the main entry point for the LobeHub Market SDK.\n * It exports the primary client classes and all type definitions.\n */\n\n// Export admin-related functionality\nexport { MarketAdmin } from './admin';\n\n// Export market-related functionality\nexport { MarketSDK } from './market';\n\n// Export SDK-specific types\nexport * from './types';\n\n// Re-export all type definitions from the types package\nexport * from '@lobehub/market-types';\n"],"mappings":"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","names":["debug","debug","log","debug","debug","log","debug","debug","log","debug","debug","log","debug","debug","log","debug","debug","log","debug","log","debug","debug","debug","urlJoin","log","debug","urlJoin","debug","log","debug","log","debug"]}