{"version":3,"sources":["../src/event-emitter.ts","../src/storage.ts","../src/token-manager.ts","../src/http-config.ts","../src/modules/auth.ts","../src/modules/permissions.ts","../src/modules/user.ts","../src/modules/oauth.ts","../src/modules/sessions.ts","../src/client.ts"],"names":["EventEmitter","event","handler","h","args","error","STORAGE_KEYS","resolveGlobalRuntime","getMiniProgramStorageGlobal","name","detectEnvironment","wxRuntime","ttRuntime","createStorageAdapter","createMiniProgramStorage","createBrowserStorage","createNoOpStorage","storage","key","value","platform","platformName","store","parseJwt","token","parts","base64","jsonPayload","TokenManager","callback","delayMs","accessToken","thresholdSeconds","payload","expiresAtMs","nowMs","refreshDelayMs","transformAmasterResponse","responseData","defaultHttpClientOptions","inferLoginType","params","inferCodeLoginType","resolveMiniProgramPlatform","detectMiniProgramPlatform","normalizeMiniProgramParams","input","getMiniProgramAuthEndpoint","action","requestMiniProgramLoginCode","resolvedPlatform","login","getMiniProgramLogin","callLogin","resolve","reject","settled","resolveCode","result","rejectWithError","resolveMiniGetPhonePayload","eventDetail","eventCode","getOAuthCallbackAccessToken","hash","getOAuthCallbackUser","getSafeRedirectTarget","redirect","resolvedUrl","browserNavigation","url","withRedirectHandling","data","redirectHandling","maybeRedirectAfterLogin","autoRedirectAfterLogin","redirectTarget","createAuthModule","deps","http","onLoginSuccess","onLogout","clearAuth","onRefreshFailure","loginType","requestData","provider","redirectUrl","userJson","user","meResult","urlWithoutHash","code","createPermissionsModule","getCurrentUser","roleCode","resource","permissionName","permissions","createUserModule","onUserUpdate","onAuthFailure","createOAuthModule","createSessionsModule","sessionId","createAuthClient","options","baseURL","headers","onTokenExpired","onUnauthorized","autoHandleOAuthCallback","runtime","setMiniProgramRuntime","httpClient","createHttpClient","refreshThreshold","eventEmitter","tokenManager","currentUser","authInvalidated","authClient","invalidateAuth","reason","handleLoginSuccess","handleUserUpdate","handleLogout","authModule","permissionsModule","userModule","oauthModule","sessionsModule"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Simple event emitter for auth events\n */\n\nimport type { AuthEvent, EventHandler } from \"./types\";\n\ntype EventMap = Record<string, EventHandler[]>;\n\nexport class EventEmitter {\n  private events: EventMap = {};\n\n  /**\n   * Subscribe to an event\n   */\n  on(event: AuthEvent, handler: EventHandler): void {\n    if (!this.events[event]) {\n      this.events[event] = [];\n    }\n    this.events[event].push(handler);\n  }\n\n  /**\n   * Unsubscribe from an event\n   */\n  off(event: AuthEvent, handler: EventHandler): void {\n    if (!this.events[event]) {\n      return;\n    }\n    this.events[event] = this.events[event].filter((h) => h !== handler);\n  }\n\n  /**\n   * Emit an event with arguments\n   */\n  emit(event: AuthEvent, ...args: any[]): void {\n    if (!this.events[event]) {\n      return;\n    }\n    this.events[event].forEach((handler) => {\n      try {\n        handler(...args);\n      } catch (error) {\n        console.error(`[AuthClient] Error in event handler for \"${event}\":`, error);\n      }\n    });\n  }\n\n  /**\n   * Remove all event listeners\n   */\n  removeAllListeners(): void {\n    this.events = {};\n  }\n}\n","/**\n * Storage adapter for token and user data persistence\n * Auto-detects environment and uses appropriate storage:\n * - Browser: localStorage\n * - WeChat Mini Program: wx.setStorageSync/wx.getStorageSync\n * - Douyin Mini Program: `tt.setStorageSync` / `tt.getStorageSync`\n * - SSR/Node.js: No-op (no persistence)\n */\n\nexport interface StorageAdapter {\n  getItem(key: string): string | null;\n  setItem(key: string, value: string): void;\n  removeItem(key: string): void;\n  clear(): void;\n}\n\n/**\n * Storage keys for auth data\n */\nexport const STORAGE_KEYS = {\n  ACCESS_TOKEN: \"amaster_access_token\",\n  REFRESH_TOKEN: \"amaster_refresh_token\",\n  USER: \"amaster_user\",\n} as const;\n\ntype MiniProgramStorageGlobal = {\n  getStorageSync?(key: string): string;\n  setStorageSync?(key: string, value: string): void;\n  removeStorageSync?(key: string): void;\n};\n\nfunction resolveGlobalRuntime():\n  | (typeof globalThis & {\n      wx?: MiniProgramStorageGlobal;\n      tt?: MiniProgramStorageGlobal;\n    })\n  | undefined {\n  if (typeof globalThis !== \"undefined\") {\n    return globalThis as typeof globalThis & {\n      wx?: MiniProgramStorageGlobal;\n      tt?: MiniProgramStorageGlobal;\n    };\n  }\n\n  if (typeof self !== \"undefined\") {\n    return self as typeof globalThis & {\n      wx?: MiniProgramStorageGlobal;\n      tt?: MiniProgramStorageGlobal;\n    };\n  }\n\n  if (typeof window !== \"undefined\") {\n    return window as typeof globalThis & {\n      wx?: MiniProgramStorageGlobal;\n      tt?: MiniProgramStorageGlobal;\n    };\n  }\n\n  try {\n    return Function(\"return this\")() as typeof globalThis & {\n      wx?: MiniProgramStorageGlobal;\n      tt?: MiniProgramStorageGlobal;\n    };\n  } catch {\n    return undefined;\n  }\n}\n\nfunction getMiniProgramStorageGlobal(name: \"wx\" | \"tt\"): MiniProgramStorageGlobal | undefined {\n  const runtime = resolveGlobalRuntime();\n\n  return runtime?.[name];\n}\n\n/**\n * Detect current runtime environment\n */\nfunction detectEnvironment(): \"browser\" | \"wechat-miniprogram\" | \"douyin-miniprogram\" | \"node\" {\n  const wxRuntime = getMiniProgramStorageGlobal(\"wx\");\n  const ttRuntime = getMiniProgramStorageGlobal(\"tt\");\n\n  // WeChat Mini Program\n  if (wxRuntime?.getStorageSync && wxRuntime?.setStorageSync && wxRuntime?.removeStorageSync) {\n    return \"wechat-miniprogram\";\n  }\n\n  // Douyin Mini Program\n  if (ttRuntime?.getStorageSync && ttRuntime?.setStorageSync && ttRuntime?.removeStorageSync) {\n    return \"douyin-miniprogram\";\n  }\n  \n  // Browser\n  if (typeof window !== \"undefined\" && typeof window.localStorage !== \"undefined\") {\n    return \"browser\";\n  }\n  \n  // Node.js/SSR\n  return \"node\";\n}\n\n/**\n * Create a storage adapter that auto-detects environment\n * \n * @returns Storage adapter optimized for current environment\n * \n * @example\n * ```typescript\n * const storage = createStorageAdapter();\n * \n * // Browser → uses localStorage\n * // WeChat Mini Program → uses wx.setStorageSync\n * // Douyin Mini Program -> uses tt.setStorageSync\n * // SSR/Node.js → uses no-op (no persistence)\n * ```\n */\nexport function createStorageAdapter(): StorageAdapter {\n  const env = detectEnvironment();\n  \n  switch (env) {\n    case \"wechat-miniprogram\":\n      return createMiniProgramStorage(\n        getMiniProgramStorageGlobal(\"wx\") as Required<MiniProgramStorageGlobal>,\n        \"WeChat\"\n      );\n    case \"douyin-miniprogram\":\n      return createMiniProgramStorage(\n        getMiniProgramStorageGlobal(\"tt\") as Required<MiniProgramStorageGlobal>,\n        \"Douyin\"\n      );\n    case \"browser\":\n      return createBrowserStorage();\n    case \"node\":\n      return createNoOpStorage();\n  }\n}\n\n/**\n * Create browser storage adapter (localStorage)\n */\nfunction createBrowserStorage(): StorageAdapter {\n  const storage = window.localStorage;\n\n  return {\n    getItem(key: string): string | null {\n      try {\n        return storage.getItem(key);\n      } catch (error) {\n        console.error(\"[AuthClient] Failed to get item from localStorage:\", error);\n        return null;\n      }\n    },\n\n    setItem(key: string, value: string): void {\n      try {\n        storage.setItem(key, value);\n      } catch (error) {\n        console.error(\"[AuthClient] Failed to set item in localStorage:\", error);\n      }\n    },\n\n    removeItem(key: string): void {\n      try {\n        storage.removeItem(key);\n      } catch (error) {\n        console.error(\"[AuthClient] Failed to remove item from localStorage:\", error);\n      }\n    },\n\n    clear(): void {\n      try {\n        // Only clear auth-related keys, not all storage\n        storage.removeItem(STORAGE_KEYS.ACCESS_TOKEN);\n        storage.removeItem(STORAGE_KEYS.REFRESH_TOKEN);\n        storage.removeItem(STORAGE_KEYS.USER);\n      } catch (error) {\n        console.error(\"[AuthClient] Failed to clear localStorage:\", error);\n      }\n    },\n  };\n}\n\n/**\n * Create Mini Program storage adapter\n * Uses platform.getStorageSync and platform.setStorageSync\n */\nfunction createMiniProgramStorage(\n  platform: {\n    getStorageSync(key: string): string;\n    setStorageSync(key: string, value: string): void;\n    removeStorageSync(key: string): void;\n  },\n  platformName: \"WeChat\" | \"Douyin\"\n): StorageAdapter {\n  return {\n    getItem(key: string): string | null {\n      try {\n        const value = platform.getStorageSync(key);\n        return value || null;\n      } catch (error) {\n        console.error(`[AuthClient] Failed to get item from ${platformName} storage:`, error);\n        return null;\n      }\n    },\n\n    setItem(key: string, value: string): void {\n      try {\n        platform.setStorageSync(key, value);\n      } catch (error) {\n        console.error(`[AuthClient] Failed to set item in ${platformName} storage:`, error);\n      }\n    },\n\n    removeItem(key: string): void {\n      try {\n        platform.removeStorageSync(key);\n      } catch (error) {\n        console.error(`[AuthClient] Failed to remove item from ${platformName} storage:`, error);\n      }\n    },\n\n    clear(): void {\n      try {\n        // Only clear auth-related keys, not all storage\n        platform.removeStorageSync(STORAGE_KEYS.ACCESS_TOKEN);\n        platform.removeStorageSync(STORAGE_KEYS.REFRESH_TOKEN);\n        platform.removeStorageSync(STORAGE_KEYS.USER);\n      } catch (error) {\n        console.error(`[AuthClient] Failed to clear ${platformName} storage:`, error);\n      }\n    },\n  };\n}\n\n/**\n * In-memory storage adapter for SSR/Node.js/test environments\n * Data is stored in memory but not persisted across process restarts\n */\nfunction createNoOpStorage(): StorageAdapter {\n  const store = new Map<string, string>();\n  \n  return {\n    getItem(key: string): string | null {\n      return store.get(key) ?? null;\n    },\n    setItem(key: string, value: string): void {\n      store.set(key, value);\n    },\n    removeItem(key: string): void {\n      store.delete(key);\n    },\n    clear(): void {\n      store.clear();\n    },\n  };\n}\n","/**\n * Token manager for automatic token refresh\n */\n\n/**\n * JWT token payload interface\n */\ninterface JwtPayload {\n  exp: number; // Expiration timestamp (seconds)\n  [key: string]: any;\n}\n\n/**\n * Parse JWT token to extract payload\n * Note: This does NOT verify the token signature, only decodes the payload\n */\nexport function parseJwt(token: string): JwtPayload | null {\n  try {\n    const parts = token.split(\".\");\n    if (parts.length !== 3) {\n      return null;\n    }\n\n    const base64Url = parts[1] || \"\";\n    const base64 = base64Url.replace(/-/g, \"+\").replace(/_/g, \"/\");\n\n    // Decode base64 in browser environment\n    if (typeof atob !== \"undefined\") {\n      const jsonPayload = decodeURIComponent(\n        atob(base64)\n          .split(\"\")\n          .map((c) => \"%\" + (\"00\" + c.charCodeAt(0).toString(16)).slice(-2))\n          .join(\"\")\n      );\n      return JSON.parse(jsonPayload);\n    }\n\n    // Fallback for Node.js environment\n    if (typeof Buffer !== \"undefined\") {\n      const jsonPayload = Buffer.from(base64, \"base64\").toString(\"utf-8\");\n      return JSON.parse(jsonPayload);\n    }\n\n    return null;\n  } catch (error) {\n    console.error(\"[AuthClient] Failed to parse JWT token:\", error);\n    return null;\n  }\n}\n\n/**\n * Token manager class for handling automatic token refresh\n */\nexport class TokenManager {\n  private refreshTimer: ReturnType<typeof setTimeout> | null = null;\n  private isRefreshing = false;\n  private refreshCallback: (() => Promise<void>) | null = null;\n\n  /**\n   * Set the refresh callback function\n   */\n  setRefreshCallback(callback: () => Promise<void>): void {\n    this.refreshCallback = callback;\n  }\n\n  /**\n   * Schedule a token refresh after a delay\n   * @param delayMs Delay in milliseconds before refreshing\n   */\n  scheduleRefresh(delayMs: number): void {\n    // Clear existing timer\n    this.clearSchedule();\n\n    // Don't schedule if delay is negative or zero\n    if (delayMs <= 0) {\n      return;\n    }\n\n    this.refreshTimer = setTimeout(() => {\n      this.refresh();\n    }, delayMs);\n  }\n\n  /**\n   * Schedule token refresh based on token expiration and threshold\n   * @param accessToken JWT access token\n   * @param thresholdSeconds Refresh threshold in seconds (default: 300)\n   */\n  scheduleRefreshFromToken(accessToken: string, thresholdSeconds: number = 300): void {\n    const payload = parseJwt(accessToken);\n    if (!payload || !payload.exp) {\n      console.warn(\"[AuthClient] Cannot schedule refresh: invalid token or missing exp claim\");\n      return;\n    }\n\n    const expiresAtMs = payload.exp * 1000; // Convert to milliseconds\n    const nowMs = Date.now();\n    const expiresInMs = expiresAtMs - nowMs;\n\n    // Calculate when to refresh (before expiration by thresholdSeconds)\n    const refreshDelayMs = expiresInMs - thresholdSeconds * 1000;\n\n    if (refreshDelayMs <= 0) {\n      // Token already expired or will expire very soon\n      console.warn(\"[AuthClient] Token already expired or expiring soon, refreshing immediately\");\n      this.refresh();\n    } else {\n      this.scheduleRefresh(refreshDelayMs);\n    }\n  }\n\n  /**\n   * Manually trigger token refresh\n   */\n  async refresh(): Promise<void> {\n    if (this.isRefreshing) {\n      return;\n    }\n\n    if (!this.refreshCallback) {\n      console.error(\"[AuthClient] No refresh callback set\");\n      return;\n    }\n\n    this.isRefreshing = true;\n\n    try {\n      await this.refreshCallback();\n    } catch (error) {\n      console.error(\"[AuthClient] Token refresh failed:\", error);\n    } finally {\n      this.isRefreshing = false;\n    }\n  }\n\n  /**\n   * Clear the scheduled refresh timer\n   */\n  clearSchedule(): void {\n    if (this.refreshTimer) {\n      clearTimeout(this.refreshTimer);\n      this.refreshTimer = null;\n    }\n  }\n\n  /**\n   * Check if currently refreshing\n   */\n  isCurrentlyRefreshing(): boolean {\n    return this.isRefreshing;\n  }\n\n  /**\n   * Clean up resources\n   */\n  destroy(): void {\n    this.clearSchedule();\n    this.refreshCallback = null;\n    this.isRefreshing = false;\n  }\n}\n","/**\n * HTTP Client Configuration Utilities\n * \n * Provides shared HTTP client configuration for Amaster backend integration\n */\n\nimport { type HttpClientOptions } from \"@amaster.ai/http-client\";\n\n/**\n * Transform Amaster backend response format\n * Backend returns: { statusCode: 200, data: {...}, message: \"...\" }\n * We extract the inner 'data' field for cleaner client usage\n * \n * @param responseData - Raw response data from backend\n * @returns Extracted data or original response if not in Amaster format\n * \n * @example\n * ```typescript\n * const response = { statusCode: 200, data: { userId: \"123\" }, message: \"Success\" };\n * const result = transformAmasterResponse(response);\n * // result = { userId: \"123\" }\n * ```\n */\nexport function transformAmasterResponse<T>(responseData: unknown): T {\n  if (\n    responseData &&\n    typeof responseData === \"object\" &&\n    (\"statusCode\" in responseData || \"status\" in responseData)\n  ) {\n    // If response has 'data' field, extract it\n    if (\"data\" in responseData) {\n      return (responseData as { data: T }).data;\n    }\n    // Otherwise return the whole response (e.g., for SuccessResponse without data)\n    return responseData as T;\n  }\n  return responseData as T;\n}\n\n/**\n * Default HTTP client options for Amaster backend\n * Includes response transformation and error logging\n */\nexport const defaultHttpClientOptions: HttpClientOptions = {\n  transformResponse: transformAmasterResponse,\n  // Enable error logging by default (helps with debugging and AI assistance)\n  logErrors: true,\n};\n","/**\n * Authentication Module\n *\n * @module auth\n * @category Authentication\n *\n * Handles user authentication including:\n * - Registration\n * - Login (email/username/phone + password)\n * - Verification code login\n * - OAuth social login\n * - Logout and token refresh\n */\n\nimport {\n  detectMiniProgramPlatform,\n  getMiniProgramLogin,\n} from \"@amaster.ai/http-client\";\nimport type { HttpClient, ClientResult } from \"@amaster.ai/http-client\";\nimport type {\n  RegisterParams,\n  LoginParams,\n  LoginResponse,\n  LoginType,\n  CodeLoginParams,\n  CodeLoginType,\n  SendCodeParams,\n  SuccessResponse,\n  CaptchaResponse,\n  OAuthProvider,\n  RefreshTokenResponse,\n  User,\n  MiniGetPhoneParams,\n  MiniLoginParams,\n  MiniProgramLoginParams,\n  MiniProgramPhoneParams,\n  MiniProgramPlatform,\n  MiniProgramPhoneResponse,\n} from \"../types\";\nimport { STORAGE_KEYS } from \"../storage\";\n\n/**\n * Auto-detect login type based on provided parameters\n */\nfunction inferLoginType(params: LoginParams): LoginType | undefined {\n  if (params.email) return \"email\";\n  if (params.username) return \"username\";\n  if (params.phone) return \"phone\";\n  return undefined;\n}\n\n/**\n * Auto-detect code login type based on provided parameters\n */\nfunction inferCodeLoginType(params: CodeLoginParams): CodeLoginType | undefined {\n  if (params.email) return \"email\";\n  if (params.phone) return \"phone\";\n  return undefined;\n}\n\nfunction resolveMiniProgramPlatform(platform?: MiniProgramPlatform): MiniProgramPlatform {\n  if (platform) {\n    return platform;\n  }\n\n  return detectMiniProgramPlatform() ?? \"wechat\";\n}\n\nfunction normalizeMiniProgramParams(\n  input: string | MiniProgramLoginParams | MiniProgramPhoneParams\n): { code: string; platform: MiniProgramPlatform } {\n  if (typeof input === \"string\") {\n    return {\n      code: input,\n      platform: resolveMiniProgramPlatform(),\n    };\n  }\n\n  return {\n    code: input.code,\n    platform: resolveMiniProgramPlatform(input.platform),\n  };\n}\n\nfunction getMiniProgramAuthEndpoint(\n  action: \"login\" | \"phone\",\n  platform: MiniProgramPlatform\n): string {\n  if (platform === \"douyin\") {\n    return `/api/auth/miniprogram/douyin/${action}`;\n  }\n\n  return `/api/auth/miniprogram/${action}`;\n}\n\nasync function requestMiniProgramLoginCode(\n  platform?: MiniProgramPlatform\n): Promise<{ code: string; platform: MiniProgramPlatform }> {\n  const resolvedPlatform = resolveMiniProgramPlatform(platform);\n  const login = getMiniProgramLogin(resolvedPlatform);\n\n  const callLogin = async (\n    login: (options?: {\n      success?: (result: { code?: string }) => void;\n      fail?: (error: unknown) => void;\n    }) => Promise<{ code?: string }> | { code?: string } | void\n  ): Promise<string> =>\n    await new Promise((resolve, reject) => {\n      let settled = false;\n\n      const resolveCode = (result: { code?: string } | undefined) => {\n        if (settled) {\n          return;\n        }\n        settled = true;\n\n        if (typeof result?.code === \"string\" && result.code) {\n          resolve(result.code);\n          return;\n        }\n\n        reject(new Error(\"Mini Program login failed: missing code\"));\n      };\n\n      const rejectWithError = (error: unknown) => {\n        if (settled) {\n          return;\n        }\n        settled = true;\n\n        reject(\n          new Error(\n            `Mini Program login failed: ${error instanceof Error ? error.message : String(error)}`\n          )\n        );\n      };\n\n      try {\n        const result = login({\n          success: resolveCode,\n          fail: rejectWithError,\n        });\n\n        if (result && typeof (result as PromiseLike<{ code?: string }>).then === \"function\") {\n          void (result as Promise<{ code?: string }>).then(resolveCode, rejectWithError);\n          return;\n        }\n\n        if (result && typeof result === \"object\" && \"code\" in result) {\n          resolveCode(result as { code?: string });\n        }\n      } catch (error) {\n        rejectWithError(error);\n      }\n    });\n\n  if (typeof login !== \"function\") {\n    throw new Error(`Mini Program login API is not available for platform '${resolvedPlatform}'`);\n  }\n\n  return {\n    code: await callLogin(login),\n    platform: resolvedPlatform,\n  };\n}\n\nfunction resolveMiniGetPhonePayload(\n  input: MiniGetPhoneParams\n): { code: string; platform: MiniProgramPlatform } | null {\n  if (typeof input === \"string\") {\n    return normalizeMiniProgramParams(input);\n  }\n\n  const eventDetail =\n    \"detail\" in input && input.detail && typeof input.detail === \"object\"\n      ? input.detail\n      : null;\n  const eventCode =\n    typeof eventDetail?.code === \"string\" && eventDetail.code\n      ? eventDetail.code\n      : typeof input.code === \"string\" && input.code\n        ? input.code\n        : undefined;\n\n  if (!eventCode) {\n    return null;\n  }\n\n  return {\n    code: eventCode,\n    platform: resolveMiniProgramPlatform(input.platform),\n  };\n}\n\nfunction getOAuthCallbackAccessToken(hash: string): string | null {\n  const params = new URLSearchParams(hash);\n  return params.get(\"access_token\") || params.get(\"accessToken\");\n}\n\nfunction getOAuthCallbackUser(hash: string): string | null {\n  const params = new URLSearchParams(hash);\n  return params.get(\"user\");\n}\n\nfunction getSafeRedirectTarget(): string | null {\n  if (typeof window === \"undefined\") {\n    return null;\n  }\n\n  try {\n    const redirect = new URLSearchParams(window.location.search).get(\"redirect\");\n    if (!redirect) {\n      return null;\n    }\n\n    const resolvedUrl = new URL(redirect, window.location.origin);\n    if (resolvedUrl.origin !== window.location.origin) {\n      console.warn(\"[AuthClient] Ignored cross-origin redirect target:\", redirect);\n      return null;\n    }\n\n    return `${resolvedUrl.pathname}${resolvedUrl.search}${resolvedUrl.hash}`;\n  } catch (error) {\n    console.warn(\"[AuthClient] Failed to resolve redirect target:\", error);\n    return null;\n  }\n}\n\nexport const browserNavigation = {\n  replace(url: string): void {\n    window.location.replace(url);\n  },\n};\n\ninterface RedirectHandlingResult {\n  handled: boolean;\n  target?: string;\n}\n\nfunction withRedirectHandling(\n  data: LoginResponse,\n  redirectHandling: RedirectHandlingResult\n): LoginResponse {\n  if (!redirectHandling.handled) {\n    return data;\n  }\n\n  return {\n    ...data,\n    redirectHandled: true,\n    redirectTarget: redirectHandling.target,\n  };\n}\n\nfunction maybeRedirectAfterLogin(autoRedirectAfterLogin: boolean): RedirectHandlingResult {\n  if (!autoRedirectAfterLogin || typeof window === \"undefined\" || window.opener) {\n    return { handled: false };\n  }\n\n  const redirectTarget = getSafeRedirectTarget();\n  if (redirectTarget) {\n    browserNavigation.replace(redirectTarget);\n    return { handled: true, target: redirectTarget };\n  }\n\n  return { handled: false };\n}\n\nexport interface AuthModuleDeps {\n  http: HttpClient;\n  onLoginSuccess: (user: User, accessToken: string) => void;\n  onLogout: () => void;\n  autoRedirectAfterLogin: boolean;\n  storage: { \n    getItem: (key: string) => string | null;\n    setItem: (key: string, value: string) => void;\n  };\n  clearAuth: () => void;\n  onRefreshFailure?: (result: ClientResult<RefreshTokenResponse>) => void;\n}\n\nexport function createAuthModule(deps: AuthModuleDeps) {\n  const {\n    http,\n    onLoginSuccess,\n    onLogout,\n    autoRedirectAfterLogin,\n    storage,\n    clearAuth,\n    onRefreshFailure,\n  } = deps;\n\n  return {\n    /**\n     * Register a new user account\n     *\n     * @category Authentication\n     * @example\n     * ```typescript\n     * const result = await auth.register({\n     *   email: \"user@example.com\",\n     *   password: \"Password@123\",\n     *   displayName: \"John Doe\",\n     * });\n     * ```\n     */\n    async register(params: RegisterParams): Promise<ClientResult<LoginResponse>> {\n      const result = await http.request<LoginResponse>({\n        url: \"/api/auth/register\",\n        method: \"post\",\n        headers: { \"Content-Type\": \"application/json\" },\n        data: params,\n      });\n\n      if (result.data?.user && result.data?.accessToken) {\n        onLoginSuccess(result.data.user, result.data.accessToken);\n        const redirectHandling = maybeRedirectAfterLogin(autoRedirectAfterLogin);\n        result.data = withRedirectHandling(result.data, redirectHandling);\n      }\n\n      return result;\n    },\n\n    /**\n     * Login with username/email/phone and password\n     *\n     * @category Authentication\n     * @example\n     * ```typescript\n     * // Auto-detect loginType from username\n     * await auth.login({\n     *   username: \"john_doe\",\n     *   password: \"Password@123\",\n     * });\n     *\n     * // Auto-detect loginType from email\n     * await auth.login({\n     *   email: \"user@example.com\",\n     *   password: \"Password@123\",\n     * });\n     * ```\n     */\n    async login(params: LoginParams): Promise<ClientResult<LoginResponse>> {\n      // Auto-detect loginType if not provided\n      const loginType = params.loginType || inferLoginType(params);\n\n      if (!loginType) {\n        return {\n          data: null,\n          error: {\n            message: \"Unable to determine login type. Please provide email, username, or phone.\",\n            status: 400,\n          },\n          status: 400,\n        };\n      }\n\n      // Prepare request data with explicit loginType\n      const requestData = {\n        ...params,\n        loginType,\n      };\n\n      const result = await http.request<LoginResponse>({\n        url: \"/api/auth/login\",\n        method: \"post\",\n        headers: { \"Content-Type\": \"application/json\" },\n        data: requestData,\n      });\n\n      if (result.data?.user && result.data?.accessToken) {\n        onLoginSuccess(result.data.user, result.data.accessToken);\n        const redirectHandling = maybeRedirectAfterLogin(autoRedirectAfterLogin);\n        result.data = withRedirectHandling(result.data, redirectHandling);\n      }\n\n      return result;\n    },\n\n    /**\n     * Login with verification code\n     *\n     * @category Authentication\n     * @example\n     * ```typescript\n     * // Auto-detect loginType from email\n     * await auth.loginWithCode({\n     *   email: \"user@example.com\",\n     *   code: \"123456\",\n     * });\n     *\n     * // Auto-detect loginType from phone\n     * await auth.loginWithCode({\n     *   phone: \"13800138000\",\n     *   code: \"123456\",\n     * });\n     * ```\n     */\n    async loginWithCode(params: CodeLoginParams): Promise<ClientResult<LoginResponse>> {\n      // Auto-detect loginType if not provided\n      const loginType = params.loginType || inferCodeLoginType(params);\n\n      if (!loginType) {\n        return {\n          data: null,\n          error: {\n            message: \"Unable to determine login type. Please provide email or phone.\",\n            status: 400,\n          },\n          status: 400,\n        };\n      }\n\n      // Prepare request data with explicit loginType\n      const requestData = {\n        ...params,\n        loginType,\n      };\n\n      const result = await http.request<LoginResponse>({\n        url: \"/api/auth/login-with-code\",\n        method: \"post\",\n        headers: { \"Content-Type\": \"application/json\" },\n        data: requestData,\n      });\n\n      if (result.data?.user && result.data?.accessToken) {\n        onLoginSuccess(result.data.user, result.data.accessToken);\n        const redirectHandling = maybeRedirectAfterLogin(autoRedirectAfterLogin);\n        result.data = withRedirectHandling(result.data, redirectHandling);\n      }\n\n      return result;\n    },\n\n    /**\n     * Send verification code to email or phone\n     *\n     * @category Authentication\n     * @example\n     * ```typescript\n     * await auth.sendCode({\n     *   type: \"email\",\n     *   email: \"user@example.com\",\n     * });\n     * ```\n     */\n    async sendCode(params: SendCodeParams): Promise<ClientResult<SuccessResponse>> {\n      return http.request<SuccessResponse>({\n        url: \"/api/auth/send-code\",\n        method: \"post\",\n        headers: { \"Content-Type\": \"application/json\" },\n        data: params,\n      });\n    },\n\n    /**\n     * Get captcha image\n     *\n     * @category Authentication\n     */\n    async getCaptcha(): Promise<ClientResult<CaptchaResponse>> {\n      return http.request<CaptchaResponse>({\n        url: \"/api/auth/captcha\",\n        method: \"get\",\n      });\n    },\n\n    /**\n     * Redirect to OAuth provider for authentication\n     *\n     * @category Authentication\n     * @example\n     * ```typescript\n     * auth.loginWithOAuth(\"google\");\n     * ```\n     */\n    loginWithOAuth(provider: OAuthProvider, redirectUrl?: string): void {\n      if (typeof window === \"undefined\") {\n        console.error(\"[AuthClient] OAuth login is only available in browser environment\");\n        return;\n      }\n\n      const url = redirectUrl\n        ? `/api/auth/oauth/${provider}?redirect_url=${encodeURIComponent(redirectUrl)}`\n        : `/api/auth/oauth/${provider}`;\n\n      window.location.href = url;\n    },\n\n    /**\n     * Handle OAuth callback\n     *\n     * @category Authentication\n     */\n    async handleOAuthCallback(): Promise<ClientResult<LoginResponse>> {\n      if (typeof window === \"undefined\") {\n        return {\n          data: null,\n          error: {\n            message: \"OAuth callback is only available in browser environment\",\n            status: 400,\n          },\n          status: 400,\n        };\n      }\n\n      try {\n        const hash = window.location.hash.substring(1);\n        const accessToken = getOAuthCallbackAccessToken(hash);\n        const userJson = getOAuthCallbackUser(hash);\n\n        if (!accessToken) {\n          return {\n            data: null,\n            error: { message: \"OAuth callback failed: missing access token\", status: 400 },\n            status: 400,\n          };\n        }\n\n        let user: User;\n\n        // Smart adaptation: if user data is in hash, use it; otherwise fetch from API\n        if (userJson) {\n          // User data provided in hash (legacy behavior)\n          user = JSON.parse(decodeURIComponent(userJson)) as User;\n        } else {\n          // User data not in hash, fetch from API\n          // First save the token so the request can use it\n          storage.setItem(STORAGE_KEYS.ACCESS_TOKEN, accessToken);\n          \n          const meResult = await http.request<User>({\n            url: \"/api/auth/me\",\n            method: \"get\",\n            headers: { Authorization: `Bearer ${accessToken}` },\n          });\n          \n          if (!meResult.data) {\n            return {\n              data: null,\n              error: {\n                message: \"OAuth callback failed: unable to fetch user info\",\n                status: meResult.status || 500,\n              },\n              status: meResult.status || 500,\n            };\n          }\n          user = meResult.data;\n        }\n\n        onLoginSuccess(user, accessToken);\n\n        // Clear the hash from URL to avoid security issues and re-processing\n        // Use replaceState to avoid adding to browser history\n        if (window.history && window.history.replaceState) {\n          const urlWithoutHash = window.location.pathname + window.location.search;\n          window.history.replaceState(null, '', urlWithoutHash);\n        } else {\n          // Fallback for older browsers\n          window.location.hash = '';\n        }\n\n        const redirectHandling = maybeRedirectAfterLogin(autoRedirectAfterLogin);\n\n        return {\n          data: withRedirectHandling({ user, accessToken }, redirectHandling),\n          error: null,\n          status: 200,\n        };\n      } catch (error) {\n        return {\n          data: null,\n          error: {\n            message: `OAuth callback failed: ${error instanceof Error ? error.message : String(error)}`,\n            status: 400,\n          },\n          status: 400,\n        };\n      }\n    },\n\n    /**\n     * Login with Mini Program code\n     *\n     * Lower-level API for submitting an already acquired mini-program login code.\n     * For most app code, prefer `miniLogin()`.\n     *\n     * @deprecated Prefer `miniLogin()` unless you already have a resolved mini-program login code.\n     *\n     * @category Authentication\n     */\n    async loginWithMiniProgram(\n      input: string | MiniProgramLoginParams\n    ): Promise<ClientResult<LoginResponse>> {\n      const { code, platform } = normalizeMiniProgramParams(input);\n      const result = await http.request<LoginResponse>({\n        url: getMiniProgramAuthEndpoint(\"login\", platform),\n        method: \"post\",\n        headers: { \"Content-Type\": \"application/json\" },\n        data: { code },\n      });\n\n      if (result.data?.user && result.data?.accessToken) {\n        onLoginSuccess(result.data.user, result.data.accessToken);\n        const redirectHandling = maybeRedirectAfterLogin(autoRedirectAfterLogin);\n        result.data = withRedirectHandling(result.data, redirectHandling);\n      }\n\n      return result;\n    },\n\n    /**\n     * Unified Mini Program login entry.\n     *\n     * Automatically calls Taro / WeChat `wx` / Douyin `tt` login APIs to fetch the temporary login code,\n     * then submits it to the backend using the correct platform endpoint.\n     *\n     * @category Authentication\n     * @example\n     * ```typescript\n     * const result = await auth.miniLogin();\n     *\n     * const douyinResult = await auth.miniLogin({\n     *   platform: \"douyin\",\n     * });\n     * ```\n     */\n    async miniLogin(params: MiniLoginParams = {}): Promise<ClientResult<LoginResponse>> {\n      try {\n        const payload = await requestMiniProgramLoginCode(params.platform);\n        return await this.loginWithMiniProgram(payload);\n      } catch (error) {\n        return {\n          data: null,\n          error: {\n            message: error instanceof Error ? error.message : String(error),\n            status: 400,\n          },\n          status: 400,\n        };\n      }\n    },\n\n    /**\n     * Get Mini Program user phone number\n     * Requires user authorization via getPhoneNumber button\n     *\n     * Lower-level API for submitting an already acquired phone code.\n     * For most app code, prefer `miniGetPhone(...)`.\n     *\n     * @deprecated Prefer `miniGetPhone(...)` unless you already have a resolved phone authorization code.\n     *\n     * @category Authentication\n     */\n    async getMiniProgramPhoneNumber(\n      input: string | MiniProgramPhoneParams\n    ): Promise<ClientResult<MiniProgramPhoneResponse>> {\n      const { code, platform } = normalizeMiniProgramParams(input);\n      const token = storage.getItem(STORAGE_KEYS.ACCESS_TOKEN);\n      if (!token) {\n        return {\n          data: null,\n          error: { message: \"Not authenticated\", status: 401 },\n          status: 401,\n        };\n      }\n\n      return http.request<MiniProgramPhoneResponse>({\n        url: getMiniProgramAuthEndpoint(\"phone\", platform),\n        method: \"post\",\n        headers: {\n          \"Content-Type\": \"application/json\",\n          Authorization: `Bearer ${token}`,\n        },\n        data: { code },\n      });\n    },\n\n    /**\n     * Unified Mini Program phone binding entry.\n     *\n     * Accepts a raw code, a `{ code, platform }` object, or a Mini Program event object\n     * such as the payload received from WeChat `wx`, Douyin `tt`, or Taro `getPhoneNumber`.\n     *\n     * @category Authentication\n     * @example\n     * ```typescript\n     * const result = await auth.miniGetPhone(e);\n     *\n     * const douyinResult = await auth.miniGetPhone({\n     *   code,\n     *   platform: \"douyin\",\n     * });\n     * ```\n     */\n    async miniGetPhone(input: MiniGetPhoneParams): Promise<ClientResult<MiniProgramPhoneResponse>> {\n      const payload = resolveMiniGetPhonePayload(input);\n\n      if (!payload) {\n        return {\n          data: null,\n          error: {\n            message: \"Unable to resolve mini-program phone code from input\",\n            status: 400,\n          },\n          status: 400,\n        };\n      }\n\n      return this.getMiniProgramPhoneNumber(payload);\n    },\n\n    /**\n     * Logout current user\n     *\n     * @category Authentication\n     * @example\n     * ```typescript\n     * await auth.logout();\n     * ```\n     */\n    async logout(): Promise<ClientResult<SuccessResponse>> {\n      const token = storage.getItem(\"amaster_access_token\");\n\n      const result = await http.request<SuccessResponse>({\n        url: \"/api/auth/logout\",\n        method: \"post\",\n        headers: token ? { Authorization: `Bearer ${token}` } : undefined,\n      });\n\n      clearAuth();\n      onLogout();\n      return result;\n    },\n\n    /**\n     * Refresh access token\n     *\n     * @category Authentication\n     */\n    async refreshToken(): Promise<ClientResult<RefreshTokenResponse>> {\n      const result = await http.request<RefreshTokenResponse>({\n        url: \"/api/auth/refresh\",\n        method: \"post\",\n      });\n\n      // Save new token to storage if refresh succeeded\n      if (result.data?.accessToken) {\n        storage.setItem(\"amaster_access_token\", result.data.accessToken);\n      } else if (result.status === 401 || result.status === 403) {\n        onRefreshFailure?.(result);\n      }\n\n      return result;\n    },\n  };\n}\n\nexport type AuthModule = ReturnType<typeof createAuthModule>;\n","/**\n * Permissions Module\n *\n * @module permissions\n * @category Permissions\n *\n * Handles permission and role checks:\n * - Role-based access control (RBAC)\n * - Permission checks (fast, local)\n * - Data scope queries (async, server-side)\n */\n\nimport type { HttpClient } from \"@amaster.ai/http-client\";\nimport type { User } from \"../types\";\n\nexport interface PermissionsModuleDeps {\n  http: HttpClient;\n  getCurrentUser: () => User | null;\n  storage: { getItem: (key: string) => string | null };\n}\n\nexport function createPermissionsModule(deps: PermissionsModuleDeps) {\n  const { getCurrentUser } = deps;\n\n  return {\n    /**\n     * Check if user has a specific role (fast, local check)\n     *\n     * @category Permissions\n     * @performance O(1) - Fast\n     * @example\n     * ```typescript\n     * if (permissions.hasRole(\"admin\")) {\n     *   showAdminPanel();\n     * }\n     * ```\n     */\n    hasRole(roleCode: string): boolean {\n      const user = getCurrentUser();\n      if (!user || !user.roles) return false;\n      return user.roles.includes(roleCode);\n    },\n\n    /**\n     * Check if user has a specific permission (fast, local check)\n     *\n     * @category Permissions\n     * @performance O(1) - Fast\n     * @example\n     * ```typescript\n     * if (permissions.hasPermission(\"user\", \"delete\")) {\n     *   showDeleteButton();\n     * }\n     * ```\n     */\n    hasPermission(resource: string, action: string): boolean {\n      const user = getCurrentUser();\n      if (!user || !user.permissions) return false;\n      const permissionName = `${resource}.${action}`;\n      return user.permissions.includes(permissionName);\n    },\n\n    /**\n     * Check if user has ANY of the specified permissions\n     *\n     * @category Permissions\n     * @performance O(n) - Fast\n     * @example\n     * ```typescript\n     * if (permissions.hasAnyPermission([{ resource: \"user\", action: \"read\" }, { resource: \"user\", action: \"write\" }])) {\n     *   showUserSection();\n     * }\n     * ```\n     */\n    hasAnyPermission(permissions: Array<{ resource: string; action: string }>): boolean {\n      return permissions.some(({ resource, action }) => this.hasPermission(resource, action));\n    },\n\n    /**\n     * Check if user has ALL of the specified permissions\n     *\n     * @category Permissions\n     * @performance O(n) - Fast\n     * @example\n     * ```typescript\n     * if (permissions.hasAllPermissions([{ resource: \"user\", action: \"read\" }, { resource: \"user\", action: \"write\" }])) {\n     *   showFullEditor();\n     * }\n     * ```\n     */\n    hasAllPermissions(permissions: Array<{ resource: string; action: string }>): boolean {\n      return permissions.every(({ resource, action }) => this.hasPermission(resource, action));\n    },\n  };\n}\n\nexport type PermissionsModule = ReturnType<typeof createPermissionsModule>;\n","/**\n * User Management Module\n *\n * @module user\n * @category User\n *\n * Handles user profile and account management:\n * - Get current user info\n * - Update profile\n * - Change password\n */\n\nimport type { HttpClient, ClientResult } from \"@amaster.ai/http-client\";\nimport type { User, UpdateMeParams, ChangePasswordParams, SuccessResponse } from \"../types\";\n\nexport interface UserModuleDeps {\n  http: HttpClient;\n  storage: {\n    getItem: (key: string) => string | null;\n    setItem: (key: string, value: string) => void;\n  };\n  onUserUpdate: (user: User) => void;\n  onAuthFailure?: (result: ClientResult<User>) => void;\n}\n\nexport function createUserModule(deps: UserModuleDeps) {\n  const { http, storage, onUserUpdate, onAuthFailure } = deps;\n\n  return {\n    /**\n     * Get current logged-in user information\n     *\n     * @category User\n     * @example\n     * ```typescript\n     * const result = await user.getMe();\n     * if (result.data) {\n     *   console.log(\"User:\", result.data.displayName);\n     * }\n     * ```\n     */\n    async getMe(): Promise<ClientResult<User>> {\n      const token = storage.getItem(\"amaster_access_token\");\n      if (!token) {\n        return {\n          data: null,\n          error: { message: \"Not authenticated\", status: 401 },\n          status: 401,\n        };\n      }\n\n      const result = await http.request<User>({\n        url: \"/api/auth/me\",\n        method: \"get\",\n        headers: { Authorization: `Bearer ${token}` },\n      });\n\n      if (result.data) {\n        onUserUpdate(result.data);\n      } else if (result.status === 401 || result.status === 403) {\n        onAuthFailure?.(result);\n      }\n\n      return result;\n    },\n\n    /**\n     * Update current user's profile\n     *\n     * @category User\n     * @example\n     * ```typescript\n     * await user.updateMe({\n     *   displayName: \"New Name\",\n     *   avatarUrl: \"https://example.com/avatar.jpg\",\n     * });\n     * ```\n     */\n    async updateMe(params: UpdateMeParams): Promise<ClientResult<User>> {\n      const token = storage.getItem(\"amaster_access_token\");\n      if (!token) {\n        return {\n          data: null,\n          error: { message: \"Not authenticated\", status: 401 },\n          status: 401,\n        };\n      }\n\n      const result = await http.request<User>({\n        url: \"/api/auth/me\",\n        method: \"put\",\n        headers: {\n          Authorization: `Bearer ${token}`,\n          \"Content-Type\": \"application/json\",\n        },\n        data: params,\n      });\n\n      if (result.data) {\n        onUserUpdate(result.data);\n      }\n\n      return result;\n    },\n\n    /**\n     * Change current user's password\n     *\n     * @category User\n     * @example\n     * ```typescript\n     * await user.changePassword({\n     *   oldPassword: \"OldPass@123\",\n     *   newPassword: \"NewPass@456\",\n     * });\n     * ```\n     */\n    async changePassword(params: ChangePasswordParams): Promise<ClientResult<SuccessResponse>> {\n      const token = storage.getItem(\"amaster_access_token\");\n      if (!token) {\n        return {\n          data: null,\n          error: { message: \"Not authenticated\", status: 401 },\n          status: 401,\n        };\n      }\n\n      return http.request<SuccessResponse>({\n        url: \"/api/auth/change-password\",\n        method: \"post\",\n        headers: {\n          Authorization: `Bearer ${token}`,\n          \"Content-Type\": \"application/json\",\n        },\n        data: params,\n      });\n    },\n  };\n}\n\nexport type UserModule = ReturnType<typeof createUserModule>;\n","/**\n * OAuth Module\n *\n * @module oauth\n * @category OAuth\n *\n * Handles OAuth account binding management:\n * - List connected OAuth accounts\n * - Bind new OAuth account\n * - Unbind OAuth account\n */\n\nimport type { HttpClient, ClientResult } from \"@amaster.ai/http-client\";\nimport type { OAuthBinding, OAuthProvider, SuccessResponse } from \"../types\";\n\nexport interface OAuthModuleDeps {\n  http: HttpClient;\n  storage: { getItem: (key: string) => string | null };\n}\n\nexport function createOAuthModule(deps: OAuthModuleDeps) {\n  const { http, storage } = deps;\n\n  return {\n    /**\n     * Get list of OAuth accounts bound to current user\n     *\n     * @category OAuth\n     * @example\n     * ```typescript\n     * const result = await oauth.getOAuthBindings();\n     * if (result.data) {\n     *   result.data.forEach(binding => {\n     *     console.log(`${binding.provider}: ${binding.email}`);\n     *   });\n     * }\n     * ```\n     */\n    async getOAuthBindings(): Promise<ClientResult<OAuthBinding[]>> {\n      const token = storage.getItem(\"amaster_access_token\");\n      if (!token) {\n        return {\n          data: null,\n          error: { message: \"Not authenticated\", status: 401 },\n          status: 401,\n        };\n      }\n\n      return http.request<OAuthBinding[]>({\n        url: \"/api/auth/oauth-bindings\",\n        method: \"get\",\n        headers: { Authorization: `Bearer ${token}` },\n      });\n    },\n\n    /**\n     * Bind an OAuth account to current user\n     *\n     * @category OAuth\n     * @example\n     * ```typescript\n     * oauth.bindOAuth(\"google\"); // Redirects to Google OAuth\n     * ```\n     */\n    bindOAuth(provider: OAuthProvider): void {\n      if (typeof window === \"undefined\") {\n        console.error(\"[AuthClient] OAuth binding is only available in browser environment\");\n        return;\n      }\n\n      window.location.href = `/api/auth/oauth/${provider}/bind`;\n    },\n\n    /**\n     * Unbind an OAuth account from current user\n     *\n     * @category OAuth\n     * @example\n     * ```typescript\n     * await oauth.unbindOAuth(\"google\");\n     * ```\n     */\n    async unbindOAuth(provider: OAuthProvider): Promise<ClientResult<SuccessResponse>> {\n      const token = storage.getItem(\"amaster_access_token\");\n      if (!token) {\n        return {\n          data: null,\n          error: { message: \"Not authenticated\", status: 401 },\n          status: 401,\n        };\n      }\n\n      return http.request<SuccessResponse>({\n        url: `/api/auth/oauth/${provider}/unbind`,\n        method: \"delete\",\n        headers: { Authorization: `Bearer ${token}` },\n      });\n    },\n  };\n}\n\nexport type OAuthModule = ReturnType<typeof createOAuthModule>;\n","/**\n * Sessions Module\n *\n * @module sessions\n * @category Sessions\n *\n * Handles multi-device session management:\n * - View all active sessions\n * - Revoke specific session\n * - Revoke all other sessions\n */\n\nimport type { HttpClient, ClientResult } from \"@amaster.ai/http-client\";\nimport type { Session, SuccessResponse, RevokeAllSessionsResponse } from \"../types\";\n\nexport interface SessionsModuleDeps {\n  http: HttpClient;\n  storage: { getItem: (key: string) => string | null };\n}\n\nexport function createSessionsModule(deps: SessionsModuleDeps) {\n  const { http, storage } = deps;\n\n  return {\n    /**\n     * Get current session information\n     *\n     * @category Sessions\n     * @example\n     * ```typescript\n     * const result = await sessions.getSession();\n     * if (result.data) {\n     *   console.log(\"Session ID:\", result.data.id);\n     *   console.log(\"Device:\", result.data.sessionName);\n     *   console.log(\"IP address:\", result.data.ipAddress);\n     *   console.log(\"Location:\", result.data.location);\n     * }\n     * ```\n     */\n    async getSession(): Promise<ClientResult<Session>> {\n      const token = storage.getItem(\"amaster_access_token\");\n      if (!token) {\n        return {\n          data: null,\n          error: { message: \"Not authenticated\", status: 401 },\n          status: 401,\n        };\n      }\n\n      return http.request<Session>({\n        url: \"/api/auth/sessions/current\",\n        method: \"get\",\n        headers: { Authorization: `Bearer ${token}` },\n      });\n    },\n\n    /**\n     * Get all active sessions for current user\n     *\n     * @category Sessions\n     * @example\n     * ```typescript\n     * const result = await sessions.getSessions();\n     * if (result.data) {\n     *   result.data.forEach(session => {\n     *     const status = session.isCurrent ? \"Current\" : \"Other\";\n     *     console.log(`${session.sessionName} - ${session.ipAddress} - ${status}`);\n     *   });\n     * }\n     * ```\n     */\n    async getSessions(): Promise<ClientResult<Session[]>> {\n      const token = storage.getItem(\"amaster_access_token\");\n      if (!token) {\n        return {\n          data: null,\n          error: { message: \"Not authenticated\", status: 401 },\n          status: 401,\n        };\n      }\n\n      return http.request<Session[]>({\n        url: \"/api/auth/sessions\",\n        method: \"get\",\n        headers: { Authorization: `Bearer ${token}` },\n      });\n    },\n\n    /**\n     * Revoke a specific session\n     *\n     * @category Sessions\n     * @example\n     * ```typescript\n     * await sessions.revokeSession(\"session-id-123\");\n     * ```\n     */\n    async revokeSession(sessionId: string): Promise<ClientResult<SuccessResponse>> {\n      const token = storage.getItem(\"amaster_access_token\");\n      if (!token) {\n        return {\n          data: null,\n          error: { message: \"Not authenticated\", status: 401 },\n          status: 401,\n        };\n      }\n\n      if (!sessionId) {\n        return {\n          data: null,\n          error: { message: \"Session ID is required\", status: 400 },\n          status: 400,\n        };\n      }\n\n      return http.request<SuccessResponse>({\n        url: `/api/auth/sessions/${sessionId}`,\n        method: \"delete\",\n        headers: { Authorization: `Bearer ${token}` },\n      });\n    },\n\n    /**\n     * Revoke all sessions except current one\n     *\n     * @category Sessions\n     * @example\n     * ```typescript\n     * const result = await sessions.revokeAllSessions();\n     * if (result.data) {\n     *   console.log(`Revoked ${result.data.revokedCount} sessions`);\n     * }\n     * ```\n     */\n    async revokeAllSessions(): Promise<ClientResult<RevokeAllSessionsResponse>> {\n      const token = storage.getItem(\"amaster_access_token\");\n      if (!token) {\n        return {\n          data: null,\n          error: { message: \"Not authenticated\", status: 401 },\n          status: 401,\n        };\n      }\n\n      return http.request<RevokeAllSessionsResponse>({\n        url: \"/api/auth/sessions\",\n        method: \"delete\",\n        headers: { Authorization: `Bearer ${token}` },\n      });\n    },\n  };\n}\n\nexport type SessionsModule = ReturnType<typeof createSessionsModule>;\n","/**\n * Main Authentication Client\n *\n * Combines all modules into a unified client interface\n */\n\nimport {\n  createHttpClient,\n  setMiniProgramRuntime,\n  type ClientResult,\n  type HttpClient,\n} from \"@amaster.ai/http-client\";\nimport { EventEmitter } from \"./event-emitter\";\nimport { createStorageAdapter, STORAGE_KEYS, type StorageAdapter } from \"./storage\";\nimport { TokenManager } from \"./token-manager\";\nimport { defaultHttpClientOptions } from \"./http-config\";\nimport { createAuthModule } from \"./modules/auth\";\nimport { createPermissionsModule } from \"./modules/permissions\";\nimport { createUserModule } from \"./modules/user\";\nimport { createOAuthModule } from \"./modules/oauth\";\nimport { createSessionsModule } from \"./modules/sessions\";\nimport type { AuthClientOptions, AuthEvent, EventHandler, User } from \"./types\";\n\ntype AuthInvalidationReason = \"unauthorized\" | \"tokenExpired\";\n\nexport type AuthClient = ReturnType<typeof createAuthModule> &\n  ReturnType<typeof createPermissionsModule> &\n  ReturnType<typeof createUserModule> &\n  ReturnType<typeof createOAuthModule> &\n  ReturnType<typeof createSessionsModule> & {\n    // Events\n    on(event: AuthEvent, handler: EventHandler): void;\n    off(event: AuthEvent, handler: EventHandler): void;\n\n    // Utilities\n    isAuthenticated(): boolean;\n    getAccessToken(): string | null;\n    setAccessToken(token: string): void;\n    clearAuth(): void;\n  };\n\nexport function createAuthClient(\n  options: AuthClientOptions = {},\n  http?: HttpClient\n): AuthClient {\n  const {\n    baseURL,\n    headers,\n    onTokenExpired,\n    onUnauthorized,\n    autoHandleOAuthCallback = true,\n    autoRedirectAfterLogin = true,\n    runtime,\n  } = options;\n\n  if (runtime) {\n    setMiniProgramRuntime(runtime);\n  }\n  \n  // Create HTTP client with user options if not provided\n  const httpClient = http || createHttpClient({\n    ...defaultHttpClientOptions,\n    baseURL,\n    headers,\n    runtime,\n  });\n\n  const autoRefresh = true;\n  const refreshThreshold = 300;\n\n  // Auto-detect environment and use appropriate storage\n  const storage: StorageAdapter = createStorageAdapter();\n  const eventEmitter = new EventEmitter();\n  const tokenManager = new TokenManager();\n\n  let currentUser: User | null = null;\n  let authInvalidated = false;\n\n  // Load user from storage\n  try {\n    const userJson = storage.getItem(STORAGE_KEYS.USER);\n    if (userJson) {\n      currentUser = JSON.parse(userJson);\n    }\n  } catch (error) {\n    console.error(\"[AuthClient] Failed to load user from storage:\", error);\n  }\n\n  // Forward declare for circular dependency\n  let authClient: AuthClient;\n\n  function invalidateAuth(\n    reason: AuthInvalidationReason,\n    result?: ClientResult<unknown>\n  ): void {\n    if (authInvalidated) {\n      return;\n    }\n\n    authInvalidated = true;\n    clearAuth();\n\n    if (reason === \"tokenExpired\") {\n      eventEmitter.emit(\"tokenExpired\", result?.error);\n      onTokenExpired?.();\n    }\n\n    eventEmitter.emit(\"unauthorized\", result?.error);\n    eventEmitter.emit(\"logout\");\n  }\n\n  // Setup token refresh callback\n  tokenManager.setRefreshCallback(async () => {\n    const result = await authClient.refreshToken();\n    if (result.data) {\n      const meResult = await authClient.getMe();\n      if (meResult.error) {\n        return;\n      }\n      eventEmitter.emit(\"tokenRefreshed\", result.data.accessToken);\n    } else {\n      invalidateAuth(\"tokenExpired\", result);\n    }\n  });\n\n  function handleLoginSuccess(user: User, accessToken: string): void {\n    authInvalidated = false;\n    storage.setItem(STORAGE_KEYS.ACCESS_TOKEN, accessToken);\n    storage.setItem(STORAGE_KEYS.USER, JSON.stringify(user));\n    currentUser = user;\n\n    if (autoRefresh) {\n      tokenManager.scheduleRefreshFromToken(accessToken, refreshThreshold);\n    }\n\n    eventEmitter.emit(\"login\", user);\n  }\n\n  function handleUserUpdate(user: User): void {\n    currentUser = user;\n    storage.setItem(STORAGE_KEYS.USER, JSON.stringify(user));\n  }\n\n  function handleLogout(): void {\n    eventEmitter.emit(\"logout\");\n  }\n\n  function clearAuth(): void {\n    storage.clear();\n    currentUser = null;\n    tokenManager.clearSchedule();\n  }\n\n  function getCurrentUser(): User | null {\n    return currentUser;\n  }\n\n  // Create modules\n  const authModule = createAuthModule({\n    http: httpClient,\n    onLoginSuccess: handleLoginSuccess,\n    onLogout: handleLogout,\n    autoRedirectAfterLogin,\n    storage,\n    clearAuth,\n    onRefreshFailure: (result) => invalidateAuth(\"tokenExpired\", result),\n  });\n\n  const permissionsModule = createPermissionsModule({\n    http: httpClient,\n    getCurrentUser,\n    storage,\n  });\n\n  const userModule = createUserModule({\n    http: httpClient,\n    storage,\n    onUserUpdate: handleUserUpdate,\n    onAuthFailure: (result) => invalidateAuth(\"unauthorized\", result),\n  });\n\n  const oauthModule = createOAuthModule({\n    http: httpClient,\n    storage,\n  });\n\n  const sessionsModule = createSessionsModule({\n    http: httpClient,\n    storage,\n  });\n\n  // Combine all modules\n  authClient = {\n    ...authModule,\n    ...permissionsModule,\n    ...userModule,\n    ...oauthModule,\n    ...sessionsModule,\n\n    // Events\n    on(event: AuthEvent, handler: EventHandler): void {\n      eventEmitter.on(event, handler);\n    },\n\n    off(event: AuthEvent, handler: EventHandler): void {\n      eventEmitter.off(event, handler);\n    },\n\n    // Utilities\n    isAuthenticated(): boolean {\n      const token = storage.getItem(STORAGE_KEYS.ACCESS_TOKEN);\n      return !!token;\n    },\n\n    getAccessToken(): string | null {\n      return storage.getItem(STORAGE_KEYS.ACCESS_TOKEN);\n    },\n\n    setAccessToken(token: string): void {\n      authInvalidated = false;\n      storage.setItem(STORAGE_KEYS.ACCESS_TOKEN, token);\n      if (autoRefresh) {\n        tokenManager.scheduleRefreshFromToken(token, refreshThreshold);\n      }\n    },\n\n    clearAuth,\n  };\n\n  // Setup unauthorized handler\n  authClient.on(\"unauthorized\", () => {\n    onUnauthorized?.();\n  });\n\n  // Auto sync user info on initialization\n  if (authClient.isAuthenticated()) {\n    authClient\n      .getMe()\n      .then((result) => {\n        if (result.error) {\n          console.warn(\"[AuthClient] Failed to sync user info on init:\", result.error);\n        }\n      })\n      .catch((error) => {\n        console.warn(\"[AuthClient] Failed to sync user info on init:\", error);\n      });\n  }\n\n  // Auto-handle OAuth callback if enabled (default: true)\n  if (autoHandleOAuthCallback && typeof window !== \"undefined\") {\n    const hash = window.location.hash;\n    if (hash && (hash.includes(\"access_token\") || hash.includes(\"accessToken\"))) {\n      // Automatically process OAuth callback\n      authClient.handleOAuthCallback().then((result) => {\n        if (result.error) {\n          console.error(\"[AuthClient] Auto OAuth callback failed:\", result.error);\n        }\n      }).catch((error) => {\n        console.error(\"[AuthClient] Auto OAuth callback error:\", error);\n      });\n    }\n  }\n\n  return authClient;\n}\n"]}