{"version":3,"sources":["../../src/errors.ts","../../src/utils/rate-limit-tracker.ts","../../src/utils/retry.ts","../../src/graphql/client.ts","../../src/graphql/mutations/audio.ts","../../src/graphql/mutations/transcripts.ts","../../src/graphql/mutations/users.ts","../../src/helpers/pagination.ts","../../src/graphql/queries/ai-apps.ts","../../src/graphql/queries/bites.ts","../../src/graphql/queries/meetings.ts","../../src/helpers/action-items.ts","../../src/helpers/action-items-format.ts","../../src/helpers/batch.ts","../../src/helpers/domain-utils.ts","../../src/helpers/markdown.ts","../../src/helpers/export-formats.ts","../../src/helpers/meeting-insights.ts","../../src/helpers/search.ts","../../src/graphql/queries/transcripts.ts","../../src/graphql/queries/users.ts","../../src/realtime/client.ts","../../src/realtime/stream.ts","../../src/realtime/api.ts","../../src/client.ts","../../src/cli/utils/client.ts","../../src/cli/utils/error.ts","../../src/cli/utils/output.ts","../../src/cli/commands/ai-apps.ts","../../src/cli/utils/parse.ts","../../src/cli/commands/audio.ts","../../src/cli/commands/bites.ts","../../src/helpers/digest.ts","../../src/helpers/digest-templates.ts","../../src/cli/utils/date.ts","../../src/cli/utils/progress.ts","../../src/cli/commands/digest.ts","../../src/cli/commands/export.ts","../../src/cli/commands/export-bulk.ts","../../src/cli/commands/insights.ts","../../src/cli/commands/meetings.ts","../../src/cli/commands/realtime.ts","../../src/cli/commands/search.ts","../../src/helpers/normalize.ts","../../src/helpers/speaker-analytics.ts","../../src/cli/commands/transcripts.ts","../../src/cli/commands/users.ts","../../src/cli/index.ts"],"names":["delay","sleep","groupBy","DEFAULT_OPTIONS","writeFile","formatDate","getParticipantNames","groupSentencesBySpeaker","formatTimestamp","DEFAULT_TIMEOUT","io","program","formatDuration","sumDurations","parseDate","aggregateParticipants","formatDateOnly","dirname","fileURLToPath","join","readFileSync","ora","writeFileSync","mkdir","collect","normalizeTranscript","parseTime","calculateDuration","Command"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Base error class for all Fireflies API errors.\n * All errors include a code for programmatic handling.\n */\nexport class FirefliesError extends Error {\n  readonly code: string = 'FIREFLIES_ERROR';\n  readonly status?: number;\n\n  constructor(message: string, options?: { status?: number; cause?: unknown }) {\n    super(message, { cause: options?.cause });\n    this.name = 'FirefliesError';\n    this.status = options?.status;\n  }\n}\n\n/**\n * Thrown when the API key is invalid or missing.\n */\nexport class AuthenticationError extends FirefliesError {\n  override readonly code = 'AUTHENTICATION_ERROR';\n\n  constructor(message = 'Invalid or missing API key') {\n    super(message, { status: 401 });\n    this.name = 'AuthenticationError';\n  }\n}\n\n/**\n * Thrown when rate limits are exceeded.\n * Check retryAfter for suggested wait time in milliseconds.\n */\nexport class RateLimitError extends FirefliesError {\n  override readonly code = 'RATE_LIMIT_ERROR';\n  /** Suggested wait time in milliseconds before retrying. */\n  readonly retryAfter?: number;\n\n  constructor(message = 'Rate limit exceeded', retryAfter?: number) {\n    super(message, { status: 429 });\n    this.name = 'RateLimitError';\n    this.retryAfter = retryAfter;\n  }\n}\n\n/**\n * Thrown when a requested resource is not found.\n */\nexport class NotFoundError extends FirefliesError {\n  override readonly code = 'NOT_FOUND';\n\n  constructor(message = 'Resource not found') {\n    super(message, { status: 404 });\n    this.name = 'NotFoundError';\n  }\n}\n\n/**\n * Thrown when request validation fails.\n */\nexport class ValidationError extends FirefliesError {\n  override readonly code = 'VALIDATION_ERROR';\n\n  constructor(message: string) {\n    super(message, { status: 400 });\n    this.name = 'ValidationError';\n  }\n}\n\n/**\n * Thrown when the GraphQL API returns errors.\n */\nexport class GraphQLError extends FirefliesError {\n  override readonly code = 'GRAPHQL_ERROR';\n  readonly errors: GraphQLErrorDetail[];\n\n  constructor(message: string, errors: GraphQLErrorDetail[]) {\n    super(message);\n    this.name = 'GraphQLError';\n    this.errors = errors;\n  }\n}\n\n/**\n * Detail from a GraphQL error response.\n */\nexport interface GraphQLErrorDetail {\n  message: string;\n  path?: string[];\n  extensions?: Record<string, unknown>;\n}\n\n/**\n * Thrown when a request times out.\n */\nexport class TimeoutError extends FirefliesError {\n  override readonly code = 'TIMEOUT_ERROR';\n\n  constructor(message = 'Request timed out') {\n    super(message, { status: 408 });\n    this.name = 'TimeoutError';\n  }\n}\n\n/**\n * Thrown when a network error occurs.\n */\nexport class NetworkError extends FirefliesError {\n  override readonly code = 'NETWORK_ERROR';\n\n  constructor(message: string, cause?: unknown) {\n    super(message, { cause });\n    this.name = 'NetworkError';\n  }\n}\n\n/**\n * Base error for realtime operations.\n */\nexport class RealtimeError extends FirefliesError {\n  override readonly code: string = 'REALTIME_ERROR';\n\n  constructor(message: string, options?: { cause?: unknown }) {\n    super(message, options);\n    this.name = 'RealtimeError';\n  }\n}\n\n/**\n * Thrown when realtime connection fails.\n */\nexport class ConnectionError extends RealtimeError {\n  override readonly code = 'CONNECTION_ERROR';\n\n  constructor(message = 'Failed to establish realtime connection', options?: { cause?: unknown }) {\n    super(message, options);\n    this.name = 'ConnectionError';\n  }\n}\n\n/**\n * Thrown when stream is accessed after close.\n */\nexport class StreamClosedError extends RealtimeError {\n  override readonly code = 'STREAM_CLOSED';\n\n  constructor(message = 'Stream has been closed') {\n    super(message);\n    this.name = 'StreamClosedError';\n  }\n}\n\n/**\n * Thrown when webhook signature verification fails.\n */\nexport class WebhookVerificationError extends FirefliesError {\n  override readonly code = 'WEBHOOK_VERIFICATION_FAILED';\n\n  constructor(message: string) {\n    super(message, { status: 401 });\n    this.name = 'WebhookVerificationError';\n  }\n}\n\n/**\n * Thrown when webhook payload parsing fails.\n */\nexport class WebhookParseError extends FirefliesError {\n  override readonly code = 'WEBHOOK_PARSE_FAILED';\n\n  constructor(message: string) {\n    super(message, { status: 400 });\n    this.name = 'WebhookParseError';\n  }\n}\n\n/**\n * Thrown when no chunks received for configured timeout.\n * Consumer should check if meeting is still active and decide whether to reconnect.\n */\nexport class ChunkTimeoutError extends RealtimeError {\n  override readonly code = 'CHUNK_TIMEOUT';\n  readonly timeoutMs: number;\n\n  constructor(timeoutMs: number) {\n    super(`No chunks received for ${timeoutMs}ms`);\n    this.name = 'ChunkTimeoutError';\n    this.timeoutMs = timeoutMs;\n  }\n}\n\n/**\n * Parse error response and return appropriate error class.\n */\nexport function parseErrorResponse(\n  status: number,\n  body: unknown,\n  defaultMessage: string\n): FirefliesError {\n  const message = extractErrorMessage(body) ?? defaultMessage;\n\n  switch (status) {\n    case 401:\n      return new AuthenticationError(message);\n    case 404:\n      return new NotFoundError(message);\n    case 429: {\n      const retryAfter = extractRetryAfter(body);\n      return new RateLimitError(message, retryAfter);\n    }\n    case 400:\n      return new ValidationError(message);\n    default:\n      return new FirefliesError(message, { status });\n  }\n}\n\ninterface ErrorBody {\n  message?: string;\n  error?: string;\n}\n\ninterface RetryBody {\n  retryAfter?: number;\n}\n\nfunction extractErrorMessage(body: unknown): string | undefined {\n  if (typeof body === 'object' && body !== null) {\n    const obj = body as ErrorBody;\n    if (typeof obj.message === 'string') {\n      return obj.message;\n    }\n    if (typeof obj.error === 'string') {\n      return obj.error;\n    }\n  }\n  return undefined;\n}\n\nfunction extractRetryAfter(body: unknown): number | undefined {\n  if (typeof body === 'object' && body !== null) {\n    const obj = body as RetryBody;\n    if (typeof obj.retryAfter === 'number') {\n      return obj.retryAfter;\n    }\n  }\n  return undefined;\n}\n","import type { RateLimitState, ThrottleConfig } from '../types/config.js';\n\nconst RATE_LIMIT_REMAINING_HEADER = 'x-ratelimit-remaining-api';\nconst RATE_LIMIT_LIMIT_HEADER = 'x-ratelimit-limit-api';\nconst RATE_LIMIT_RESET_HEADER = 'x-ratelimit-reset-api';\n\n/**\n * Tracks rate limit state from API response headers.\n * Provides state management and throttle delay calculation.\n */\nexport class RateLimitTracker {\n  private _remaining: number | undefined;\n  private _limit: number | undefined;\n  private _resetInSeconds: number | undefined;\n  private _updatedAt: number;\n  private readonly warningThreshold: number;\n\n  /**\n   * Create a new RateLimitTracker.\n   * @param warningThreshold - Threshold below which isLow returns true\n   */\n  constructor(warningThreshold = 10) {\n    this._remaining = undefined;\n    this._limit = undefined;\n    this._resetInSeconds = undefined;\n    this._updatedAt = 0;\n    this.warningThreshold = warningThreshold;\n  }\n\n  /**\n   * Get the current rate limit state.\n   */\n  get state(): RateLimitState {\n    return {\n      remaining: this._remaining,\n      limit: this._limit,\n      resetInSeconds: this._resetInSeconds,\n      updatedAt: this._updatedAt,\n    };\n  }\n\n  /**\n   * Check if remaining requests are below the warning threshold.\n   * Returns false if remaining is undefined (header not received).\n   */\n  get isLow(): boolean {\n    return this._remaining !== undefined && this._remaining < this.warningThreshold;\n  }\n\n  /**\n   * Update state from response headers.\n   * Extracts x-ratelimit-remaining-api, x-ratelimit-limit-api, and x-ratelimit-reset-api headers.\n   *\n   * @param headers - Response headers (Headers object or plain object)\n   */\n  update(headers: Headers | Record<string, string>): void {\n    const remaining = this.getHeader(headers, RATE_LIMIT_REMAINING_HEADER);\n    if (remaining !== null) {\n      const parsed = Number.parseInt(remaining, 10);\n      if (!Number.isNaN(parsed) && parsed >= 0) {\n        this._remaining = parsed;\n      }\n    }\n\n    const limit = this.getHeader(headers, RATE_LIMIT_LIMIT_HEADER);\n    if (limit !== null) {\n      const parsed = Number.parseInt(limit, 10);\n      if (!Number.isNaN(parsed) && parsed >= 0) {\n        this._limit = parsed;\n      }\n    }\n\n    const reset = this.getHeader(headers, RATE_LIMIT_RESET_HEADER);\n    if (reset !== null) {\n      const parsed = Number.parseInt(reset, 10);\n      if (!Number.isNaN(parsed) && parsed >= 0) {\n        this._resetInSeconds = parsed;\n      }\n    }\n\n    this._updatedAt = Date.now();\n  }\n\n  /**\n   * Reset the tracker to initial state.\n   */\n  reset(): void {\n    this._remaining = undefined;\n    this._limit = undefined;\n    this._resetInSeconds = undefined;\n    this._updatedAt = 0;\n  }\n\n  /**\n   * Calculate the delay to apply before the next request.\n   * Returns 0 if throttling is disabled or not needed.\n   *\n   * Uses linear interpolation: more delay as remaining approaches 0.\n   * - remaining >= startThreshold: no delay\n   * - remaining = 0: maxDelay\n   * - remaining in between: proportional delay\n   *\n   * @param config - Throttle configuration\n   * @returns Delay in milliseconds\n   */\n  getThrottleDelay(config?: ThrottleConfig): number {\n    if (!config?.enabled) {\n      return 0;\n    }\n\n    if (this._remaining === undefined) {\n      return 0;\n    }\n\n    // Ensure startThreshold is at least 1 to avoid division issues and silent disabling\n    const startThreshold = Math.max(1, config.startThreshold ?? 20);\n    let minDelay = config.minDelay ?? 100;\n    let maxDelay = config.maxDelay ?? 2000;\n\n    // Handle misconfiguration: swap if minDelay > maxDelay\n    if (minDelay > maxDelay) {\n      [minDelay, maxDelay] = [maxDelay, minDelay];\n    }\n\n    if (this._remaining >= startThreshold) {\n      return 0;\n    }\n\n    if (this._remaining <= 0) {\n      return maxDelay;\n    }\n\n    // Linear interpolation: ratio goes from 0 (at threshold) to 1 (at 0)\n    const ratio = 1 - this._remaining / startThreshold;\n    return Math.round(minDelay + ratio * (maxDelay - minDelay));\n  }\n\n  /**\n   * Extract a header value from Headers object or plain object.\n   * For plain objects, performs case-insensitive key lookup.\n   */\n  private getHeader(headers: Headers | Record<string, string>, name: string): string | null {\n    if (headers instanceof Headers) {\n      return headers.get(name);\n    }\n    // Plain object - case-insensitive key lookup\n    const lowerName = name.toLowerCase();\n    for (const key of Object.keys(headers)) {\n      if (key.toLowerCase() === lowerName) {\n        return headers[key] ?? null;\n      }\n    }\n    return null;\n  }\n}\n","import { NetworkError, RateLimitError, TimeoutError } from '../errors.js';\n\n/**\n * Options for retry behavior.\n */\nexport interface RetryOptions {\n  /**\n   * Maximum number of retry attempts.\n   * @default 3\n   */\n  maxRetries?: number;\n\n  /**\n   * Base delay between retries in milliseconds.\n   * @default 1000\n   */\n  baseDelay?: number;\n\n  /**\n   * Maximum delay between retries in milliseconds.\n   * @default 30000\n   */\n  maxDelay?: number;\n\n  /**\n   * Custom predicate to determine if error is retryable.\n   * By default, retries network errors, timeouts, and rate limits.\n   */\n  shouldRetry?: (error: unknown, attempt: number) => boolean;\n}\n\nconst DEFAULT_OPTIONS: Required<Omit<RetryOptions, 'shouldRetry'>> = {\n  maxRetries: 3,\n  baseDelay: 1000,\n  maxDelay: 30000,\n};\n\n/**\n * Execute a function with exponential backoff retry logic.\n *\n * @param fn - The async function to execute\n * @param options - Retry configuration\n * @returns The result of the function\n * @throws The last error if all retries are exhausted\n */\nexport async function retry<T>(fn: () => Promise<T>, options?: RetryOptions): Promise<T> {\n  const maxRetries = options?.maxRetries ?? DEFAULT_OPTIONS.maxRetries;\n  const baseDelay = options?.baseDelay ?? DEFAULT_OPTIONS.baseDelay;\n  const maxDelay = options?.maxDelay ?? DEFAULT_OPTIONS.maxDelay;\n  const shouldRetry = options?.shouldRetry ?? isRetryableError;\n\n  let lastError: unknown;\n\n  for (let attempt = 0; attempt <= maxRetries; attempt++) {\n    try {\n      return await fn();\n    } catch (error) {\n      lastError = error;\n\n      if (attempt >= maxRetries || !shouldRetry(error, attempt)) {\n        throw error;\n      }\n\n      const delay = calculateDelay(error, attempt, baseDelay, maxDelay);\n      await sleep(delay);\n    }\n  }\n\n  // This should never be reached due to the throw in the loop\n  throw lastError;\n}\n\n/**\n * Default predicate for determining if an error is retryable.\n */\nexport function isRetryableError(error: unknown): boolean {\n  if (error instanceof RateLimitError) {\n    return true;\n  }\n  if (error instanceof TimeoutError) {\n    return true;\n  }\n  if (error instanceof NetworkError) {\n    return true;\n  }\n  // Retry on server errors (5xx)\n  if (error instanceof Error && 'status' in error && typeof error.status === 'number') {\n    return error.status >= 500 && error.status < 600;\n  }\n  return false;\n}\n\n/**\n * Calculate delay for the next retry attempt using exponential backoff.\n * Respects rate limit retryAfter if present.\n */\nexport function calculateDelay(\n  error: unknown,\n  attempt: number,\n  baseDelay: number,\n  maxDelay: number\n): number {\n  // Use rate limit's retryAfter if available (already in milliseconds)\n  if (error instanceof RateLimitError && error.retryAfter !== undefined) {\n    return Math.min(error.retryAfter, maxDelay);\n  }\n\n  // Exponential backoff with jitter\n  const exponentialDelay = baseDelay * 2 ** attempt;\n  const jitter = Math.random() * 0.1 * exponentialDelay;\n  return Math.min(exponentialDelay + jitter, maxDelay);\n}\n\nfunction sleep(ms: number): Promise<void> {\n  return new Promise((resolve) => setTimeout(resolve, ms));\n}\n","import {\n  FirefliesError,\n  GraphQLError,\n  type GraphQLErrorDetail,\n  NetworkError,\n  parseErrorResponse,\n  TimeoutError,\n} from '../errors.js';\nimport type {\n  FirefliesConfig,\n  RateLimitConfig,\n  RateLimitState,\n  RetryConfig,\n} from '../types/config.js';\nimport { RateLimitTracker } from '../utils/rate-limit-tracker.js';\nimport { type RetryOptions, retry } from '../utils/retry.js';\n\nconst DEFAULT_BASE_URL = 'https://api.fireflies.ai/graphql';\nconst DEFAULT_TIMEOUT = 30000;\n\n/**\n * Response structure from GraphQL API.\n */\ninterface GraphQLResponse<T> {\n  data?: T;\n  errors?: GraphQLErrorDetail[];\n}\n\n/**\n * Low-level GraphQL client for Fireflies API.\n * Handles authentication, retries, and error parsing.\n */\nexport class GraphQLClient {\n  private readonly apiKey: string;\n  private readonly baseUrl: string;\n  private readonly timeout: number;\n  private readonly retryOptions: RetryOptions;\n  private readonly rateLimitTracker: RateLimitTracker | null;\n  private readonly rateLimitConfig: RateLimitConfig | null;\n  private lastWarningRemaining: number | undefined;\n\n  constructor(config: FirefliesConfig) {\n    if (!config.apiKey) {\n      throw new FirefliesError('API key is required');\n    }\n\n    this.apiKey = config.apiKey;\n    this.baseUrl = config.baseUrl ?? DEFAULT_BASE_URL;\n    this.timeout = config.timeout ?? DEFAULT_TIMEOUT;\n    this.retryOptions = buildRetryOptions(config.retry);\n\n    // Initialize rate limit tracking if configured\n    if (config.rateLimit) {\n      const warningThreshold = config.rateLimit.warningThreshold ?? 10;\n      this.rateLimitTracker = new RateLimitTracker(warningThreshold);\n      this.rateLimitConfig = config.rateLimit;\n    } else {\n      this.rateLimitTracker = null;\n      this.rateLimitConfig = null;\n    }\n  }\n\n  /**\n   * Get the current rate limit state.\n   * Returns undefined if rate limit tracking is not configured.\n   */\n  get rateLimitState(): RateLimitState | undefined {\n    return this.rateLimitTracker?.state;\n  }\n\n  /**\n   * Execute a GraphQL query or mutation.\n   *\n   * @param query - GraphQL query string\n   * @param variables - Optional query variables\n   * @returns The data from the GraphQL response\n   * @throws GraphQLError if the response contains errors\n   * @throws AuthenticationError if the API key is invalid\n   * @throws RateLimitError if rate limits are exceeded\n   */\n  async execute<T>(query: string, variables?: Record<string, unknown>): Promise<T> {\n    return retry(() => this.executeOnce<T>(query, variables), this.retryOptions);\n  }\n\n  private async executeOnce<T>(query: string, variables?: Record<string, unknown>): Promise<T> {\n    // Apply throttle delay if enabled\n    await this.applyThrottleDelay();\n\n    const controller = new AbortController();\n    const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n    try {\n      const response = await fetch(this.baseUrl, {\n        method: 'POST',\n        headers: {\n          'Content-Type': 'application/json',\n          Authorization: `Bearer ${this.apiKey}`,\n        },\n        body: JSON.stringify({ query, variables }),\n        signal: controller.signal,\n      });\n\n      clearTimeout(timeoutId);\n\n      // Update rate limit tracker from response headers\n      this.updateRateLimitState(response.headers);\n\n      if (!response.ok) {\n        const body = await this.safeParseJson(response);\n\n        // Handle rate limit error specially\n        if (response.status === 429) {\n          const retryAfter = this.parseRetryAfter(response.headers);\n          this.invokeRateLimitedCallback(retryAfter);\n          throw parseErrorResponse(\n            response.status,\n            body,\n            `GraphQL request failed with status ${response.status}`\n          );\n        }\n\n        throw parseErrorResponse(\n          response.status,\n          body,\n          `GraphQL request failed with status ${response.status}`\n        );\n      }\n\n      const json = (await response.json()) as GraphQLResponse<T>;\n\n      if (json.errors && json.errors.length > 0) {\n        throw this.parseGraphQLErrors(json.errors);\n      }\n\n      if (json.data === undefined) {\n        throw new FirefliesError('GraphQL response missing data field');\n      }\n\n      return json.data;\n    } catch (error) {\n      clearTimeout(timeoutId);\n\n      if (error instanceof FirefliesError) {\n        throw error;\n      }\n\n      if (error instanceof Error) {\n        if (error.name === 'AbortError') {\n          throw new TimeoutError(`Request timed out after ${this.timeout}ms`);\n        }\n        throw new NetworkError(`Network request failed: ${error.message}`, error);\n      }\n\n      throw new NetworkError('Unknown network error occurred', error);\n    }\n  }\n\n  private async safeParseJson(response: Response): Promise<unknown> {\n    try {\n      return await response.json();\n    } catch {\n      return null;\n    }\n  }\n\n  /**\n   * Apply throttle delay before request if configured.\n   */\n  private async applyThrottleDelay(): Promise<void> {\n    if (!this.rateLimitTracker || !this.rateLimitConfig?.throttle) {\n      return;\n    }\n\n    const delay = this.rateLimitTracker.getThrottleDelay(this.rateLimitConfig.throttle);\n    if (delay > 0) {\n      await sleep(delay);\n    }\n  }\n\n  /**\n   * Update rate limit state from response headers and invoke callbacks.\n   */\n  private updateRateLimitState(headers: Headers): void {\n    if (!this.rateLimitTracker || !this.rateLimitConfig) {\n      return;\n    }\n\n    const wasLow = this.rateLimitTracker.isLow;\n\n    this.rateLimitTracker.update(headers);\n\n    const state = this.rateLimitTracker.state;\n\n    // Always invoke onUpdate callback\n    this.safeCallback(() => this.rateLimitConfig?.onUpdate?.(state));\n\n    // Invoke onWarning when crossing the threshold (going from above to below)\n    // Also invoke if we haven't warned yet at this level\n    if (this.rateLimitTracker.isLow) {\n      const shouldWarn =\n        !wasLow || // Just crossed threshold\n        (state.remaining !== undefined &&\n          this.lastWarningRemaining !== undefined &&\n          state.remaining < this.lastWarningRemaining); // Dropped further\n\n      if (shouldWarn) {\n        this.lastWarningRemaining = state.remaining;\n        this.safeCallback(() => this.rateLimitConfig?.onWarning?.(state));\n      }\n    }\n  }\n\n  /**\n   * Parse Retry-After header value.\n   */\n  private parseRetryAfter(headers: Headers): number | undefined {\n    const value = headers.get('retry-after');\n    if (!value) return undefined;\n\n    const parsed = Number.parseInt(value, 10);\n    return Number.isNaN(parsed) ? undefined : parsed;\n  }\n\n  /**\n   * Invoke the onRateLimited callback.\n   */\n  private invokeRateLimitedCallback(retryAfter?: number): void {\n    if (!this.rateLimitTracker || !this.rateLimitConfig?.onRateLimited) {\n      return;\n    }\n    const state = this.rateLimitTracker.state;\n    this.safeCallback(() => this.rateLimitConfig?.onRateLimited?.(state, retryAfter));\n  }\n\n  /**\n   * Safely invoke a callback, catching any errors to prevent user code from breaking the SDK.\n   */\n  private safeCallback(fn: () => void): void {\n    try {\n      fn();\n    } catch {\n      // Ignore callback errors\n    }\n  }\n\n  private parseGraphQLErrors(errors: GraphQLErrorDetail[]): FirefliesError {\n    const firstError = errors[0];\n    if (!firstError) {\n      return new GraphQLError('Unknown GraphQL error', errors);\n    }\n\n    const message = firstError.message;\n\n    // Check for specific error types based on message content\n    if (\n      message.toLowerCase().includes('unauthorized') ||\n      message.toLowerCase().includes('authentication')\n    ) {\n      return parseErrorResponse(401, { message }, message);\n    }\n\n    if (message.toLowerCase().includes('not found')) {\n      return parseErrorResponse(404, { message }, message);\n    }\n\n    return new GraphQLError(message, errors);\n  }\n}\n\nfunction buildRetryOptions(config?: RetryConfig): RetryOptions {\n  if (!config) {\n    return {};\n  }\n  return {\n    maxRetries: config.maxRetries,\n    baseDelay: config.baseDelay,\n    maxDelay: config.maxDelay,\n  };\n}\n\nfunction sleep(ms: number): Promise<void> {\n  return new Promise((resolve) => setTimeout(resolve, ms));\n}\n","import type { UploadAudioParams } from '../../types/params.js';\nimport type { GraphQLClient } from '../client.js';\n\n/**\n * Result from audio upload.\n */\nexport interface UploadAudioResult {\n  success: boolean;\n  title: string;\n  message: string;\n}\n\n/**\n * API for audio operations.\n */\nexport interface AudioAPI {\n  /**\n   * Upload audio/video file for transcription.\n   *\n   * @param params - Upload parameters\n   * @returns Upload result\n   */\n  upload(params: UploadAudioParams): Promise<UploadAudioResult>;\n}\n\n/**\n * Create the audio API bound to a GraphQL client.\n */\nexport function createAudioAPI(client: GraphQLClient): AudioAPI {\n  return {\n    async upload(params: UploadAudioParams): Promise<UploadAudioResult> {\n      const mutation = `\n        mutation UploadAudio($input: AudioUploadInput!) {\n          uploadAudio(input: $input) {\n            success\n            title\n            message\n          }\n        }\n      `;\n      const data = await client.execute<{ uploadAudio: UploadAudioResult }>(mutation, {\n        input: params,\n      });\n      return data.uploadAudio;\n    },\n  };\n}\n","import type { Transcript } from '../../types/transcript.js';\nimport type { GraphQLClient } from '../client.js';\n\n/**\n * API for transcript mutations.\n */\nexport interface TranscriptsMutationsAPI {\n  /**\n   * Delete a transcript.\n   *\n   * Rate limit: 10/min\n   *\n   * @param id - Transcript ID to delete\n   * @returns Deleted transcript (partial fields)\n   */\n  delete(id: string): Promise<Transcript>;\n}\n\n/**\n * Create the transcripts mutations API bound to a GraphQL client.\n */\nexport function createTranscriptsMutationsAPI(client: GraphQLClient): TranscriptsMutationsAPI {\n  return {\n    async delete(id: string): Promise<Transcript> {\n      const mutation = `\n        mutation deleteTranscript($id: String!) {\n          deleteTranscript(id: $id) {\n            id\n            title\n            organizer_email\n            date\n            duration\n          }\n        }\n      `;\n      const data = await client.execute<{ deleteTranscript: Transcript }>(mutation, { id });\n      return data.deleteTranscript;\n    },\n  };\n}\n","import type { UserProfile, UserRole } from '../../types/user.js';\nimport type { GraphQLClient } from '../client.js';\n\n/**\n * API for user mutations.\n */\nexport interface UsersMutationsAPI {\n  /**\n   * Set user role (admin or user).\n   *\n   * @param userId - User ID to update\n   * @param role - New role\n   * @returns Updated user (partial fields)\n   */\n  setRole(userId: string, role: UserRole): Promise<UserProfile>;\n}\n\n/**\n * Create the users mutations API bound to a GraphQL client.\n */\nexport function createUsersMutationsAPI(client: GraphQLClient): UsersMutationsAPI {\n  return {\n    async setRole(userId: string, role: UserRole): Promise<UserProfile> {\n      const mutation = `\n        mutation setUserRole($userId: String!, $role: Role!) {\n          setUserRole(user_id: $userId, role: $role) {\n            id\n            name\n            email\n            role\n          }\n        }\n      `;\n      const data = await client.execute<{ setUserRole: UserProfile }>(mutation, {\n        userId,\n        role,\n      });\n      return data.setUserRole;\n    },\n  };\n}\n","/**\n * Options for parallel pagination.\n */\nexport interface ParallelPaginationOptions {\n  /** Pages to fetch concurrently. @default 3 */\n  concurrency?: number;\n  /** Items per page. @default 50 */\n  pageSize?: number;\n  /** Delay between fetch starts (ms). @default 100 */\n  delayMs?: number;\n}\n\n/**\n * Create an async iterable that paginates through results with concurrent page fetching.\n *\n * Fetches multiple pages in parallel while maintaining item order.\n * Stops when a partial page (< pageSize items) is received.\n *\n * @param fetcher - Function that fetches a page of results\n * @param options - Pagination options\n * @returns Async iterable yielding items one at a time\n *\n * @example\n * ```typescript\n * const items = paginateParallel(\n *   (skip, limit) => client.transcripts.list({ skip, limit }),\n *   { concurrency: 3, pageSize: 50 }\n * );\n *\n * for await (const item of items) {\n *   console.log(item.title);\n * }\n * ```\n */\nexport async function* paginateParallel<T>(\n  fetcher: (skip: number, limit: number) => Promise<T[]>,\n  options: ParallelPaginationOptions = {}\n): AsyncIterable<T> {\n  const { concurrency = 3, pageSize = 50, delayMs = 100 } = options;\n\n  // Track pending page fetches: Map<pageIndex, Promise<T[]>>\n  const pending = new Map<number, Promise<T[]>>();\n  let nextPageToFetch = 0;\n  let nextPageToYield = 0;\n  let foundEnd = false;\n\n  // Helper to delay between fetch starts\n  const delay = (ms: number) =>\n    ms > 0 ? new Promise<void>((resolve) => setTimeout(resolve, ms)) : Promise.resolve();\n\n  // Start fetching a page\n  const startFetch = (pageIndex: number): Promise<T[]> => {\n    const skip = pageIndex * pageSize;\n    return fetcher(skip, pageSize);\n  };\n\n  // Schedule additional page fetches up to concurrency limit\n  // Only schedules if we haven't found the end yet\n  const scheduleFetches = async () => {\n    while (!foundEnd && pending.size < concurrency) {\n      const pageIndex = nextPageToFetch++;\n      // Add delay between starting fetches (except first)\n      if (pageIndex > 0 && delayMs > 0) {\n        await delay(delayMs);\n      }\n      // Don't schedule if we found end during delay\n      if (foundEnd) break;\n      pending.set(pageIndex, startFetch(pageIndex));\n    }\n  };\n\n  // Fetch first page synchronously to determine if there's data\n  pending.set(0, startFetch(0));\n  nextPageToFetch = 1;\n\n  // Yield pages in order\n  while (pending.has(nextPageToYield)) {\n    const pagePromise = pending.get(nextPageToYield);\n    if (!pagePromise) break;\n\n    const page = await pagePromise;\n    pending.delete(nextPageToYield);\n\n    // Check if this was the last page (partial or empty)\n    if (page.length < pageSize) {\n      foundEnd = true;\n      // Yield items from this final page\n      for (const item of page) {\n        yield item;\n      }\n      break;\n    }\n\n    // Page was full, schedule more fetches before yielding\n    // This allows concurrent fetching while we yield items\n    await scheduleFetches();\n\n    // Yield items from this page\n    for (const item of page) {\n      yield item;\n    }\n\n    nextPageToYield++;\n  }\n}\n\n/**\n * Create an async iterable that automatically paginates through results.\n *\n * @param fetcher - Function that fetches a page of results\n * @param pageSize - Number of items per page\n * @returns Async iterable yielding items one at a time\n *\n * @example\n * ```typescript\n * const items = paginate(\n *   (skip, limit) => client.transcripts.list({ skip, limit }),\n *   50\n * );\n *\n * for await (const item of items) {\n *   console.log(item.title);\n * }\n * ```\n */\nexport async function* paginate<T>(\n  fetcher: (skip: number, limit: number) => Promise<T[]>,\n  pageSize = 50\n): AsyncIterable<T> {\n  let skip = 0;\n  let hasMore = true;\n\n  while (hasMore) {\n    const page = await fetcher(skip, pageSize);\n\n    for (const item of page) {\n      yield item;\n    }\n\n    // If we got fewer items than requested, we've reached the end\n    if (page.length < pageSize) {\n      hasMore = false;\n    } else {\n      skip += pageSize;\n    }\n  }\n}\n\n/**\n * Collect all items from an async iterable into an array.\n *\n * @param iterable - Async iterable to collect\n * @returns Array of all items\n */\nexport async function collectAll<T>(iterable: AsyncIterable<T>): Promise<T[]> {\n  const items: T[] = [];\n  for await (const item of iterable) {\n    items.push(item);\n  }\n  return items;\n}\n","import { paginate } from '../../helpers/pagination.js';\nimport type { AIApp } from '../../types/ai-app.js';\nimport type { AIAppsListParams } from '../../types/params.js';\nimport type { GraphQLClient } from '../client.js';\n\nconst AI_APP_OUTPUT_FIELDS = `\n  transcript_id\n  user_id\n  app_id\n  created_at\n  title\n  prompt\n  response\n`;\n\n/**\n * API for AI Apps operations.\n */\nexport interface AIAppsAPI {\n  /**\n   * List AI App outputs.\n   *\n   * @param params - Optional filter and pagination parameters\n   * @returns Array of AI App outputs\n   */\n  list(params?: AIAppsListParams): Promise<AIApp[]>;\n\n  /**\n   * Iterate through all AI App outputs matching the filter.\n   * Automatically handles pagination.\n   *\n   * @param params - Filter options (skip and limit are ignored)\n   * @returns Async iterable of AI App outputs\n   */\n  listAll(params?: Omit<AIAppsListParams, 'skip' | 'limit'>): AsyncIterable<AIApp>;\n}\n\n/**\n * Create the AI Apps API bound to a GraphQL client.\n */\nexport function createAIAppsAPI(client: GraphQLClient): AIAppsAPI {\n  return {\n    async list(params?: AIAppsListParams): Promise<AIApp[]> {\n      const query = `\n        query GetAIAppsOutputs(\n          $appId: String\n          $transcriptId: String\n          $skip: Float\n          $limit: Float\n        ) {\n          apps(\n            app_id: $appId\n            transcript_id: $transcriptId\n            skip: $skip\n            limit: $limit\n          ) {\n            outputs { ${AI_APP_OUTPUT_FIELDS} }\n          }\n        }\n      `;\n      const data = await client.execute<{ apps: { outputs: AIApp[] } }>(query, {\n        appId: params?.app_id,\n        transcriptId: params?.transcript_id,\n        skip: params?.skip,\n        limit: params?.limit ?? 10,\n      });\n      return data.apps.outputs;\n    },\n\n    listAll(params?: Omit<AIAppsListParams, 'skip' | 'limit'>): AsyncIterable<AIApp> {\n      return paginate((skip, limit) => this.list({ ...params, skip, limit }), 10);\n    },\n  };\n}\n","import { paginate } from '../../helpers/pagination.js';\nimport type { Bite } from '../../types/bite.js';\nimport type { BitesListParams, CreateBiteParams } from '../../types/params.js';\nimport type { GraphQLClient } from '../client.js';\n\nconst BITE_FIELDS = `\n  id\n  transcript_id\n  user_id\n  name\n  status\n  summary\n  summary_status\n  media_type\n  start_time\n  end_time\n  created_at\n  thumbnail\n  preview\n  captions {\n    index\n    text\n    start_time\n    end_time\n    speaker_id\n    speaker_name\n  }\n  sources {\n    src\n    type\n  }\n  user {\n    id\n    name\n    first_name\n    last_name\n    picture\n  }\n  created_from {\n    id\n    name\n    type\n    description\n    duration\n  }\n  privacies\n`;\n\n/**\n * API for bite (soundbite/clip) operations.\n */\nexport interface BitesAPI {\n  /**\n   * Get a single bite by ID.\n   *\n   * @param id - Bite ID\n   * @returns Bite details\n   */\n  get(id: string): Promise<Bite>;\n\n  /**\n   * List bites with filtering.\n   *\n   * @param params - Filter and pagination options\n   * @returns Array of bites (max 50 per call)\n   */\n  list(params: BitesListParams): Promise<Bite[]>;\n\n  /**\n   * Iterate through all bites matching the filter.\n   * Automatically handles pagination.\n   *\n   * @param params - Filter options (skip and limit are ignored)\n   * @returns Async iterable of bites\n   */\n  listAll(params: Omit<BitesListParams, 'skip' | 'limit'>): AsyncIterable<Bite>;\n\n  /**\n   * Create a new bite from a transcript.\n   *\n   * @param params - Bite creation parameters\n   * @returns Created bite (partial fields)\n   */\n  create(params: CreateBiteParams): Promise<Bite>;\n}\n\n/**\n * Create the bites API bound to a GraphQL client.\n */\nexport function createBitesAPI(client: GraphQLClient): BitesAPI {\n  return {\n    async get(id: string): Promise<Bite> {\n      const query = `\n        query Bite($biteId: ID!) {\n          bite(id: $biteId) { ${BITE_FIELDS} }\n        }\n      `;\n      const data = await client.execute<{ bite: Bite }>(query, { biteId: id });\n      return data.bite;\n    },\n\n    async list(params: BitesListParams): Promise<Bite[]> {\n      const query = `\n        query Bites(\n          $transcriptId: ID\n          $mine: Boolean\n          $myTeam: Boolean\n          $limit: Int\n          $skip: Int\n        ) {\n          bites(\n            transcript_id: $transcriptId\n            mine: $mine\n            my_team: $myTeam\n            limit: $limit\n            skip: $skip\n          ) { ${BITE_FIELDS} }\n        }\n      `;\n      const data = await client.execute<{ bites: Bite[] }>(query, {\n        transcriptId: params.transcript_id,\n        mine: params.mine,\n        myTeam: params.my_team,\n        limit: params.limit ?? 50,\n        skip: params.skip,\n      });\n      return data.bites;\n    },\n\n    listAll(params: Omit<BitesListParams, 'skip' | 'limit'>): AsyncIterable<Bite> {\n      return paginate((skip, limit) => this.list({ ...params, skip, limit }), 50);\n    },\n\n    async create(params: CreateBiteParams): Promise<Bite> {\n      const mutation = `\n        mutation CreateBite(\n          $transcriptId: ID!\n          $startTime: Float!\n          $endTime: Float!\n          $name: String\n          $mediaType: String\n          $summary: String\n          $privacies: [BitePrivacy!]\n        ) {\n          createBite(\n            transcript_Id: $transcriptId\n            start_time: $startTime\n            end_time: $endTime\n            name: $name\n            media_type: $mediaType\n            summary: $summary\n            privacies: $privacies\n          ) {\n            id\n            name\n            status\n            summary\n          }\n        }\n      `;\n      const data = await client.execute<{ createBite: Bite }>(mutation, {\n        transcriptId: params.transcript_id,\n        startTime: params.start_time,\n        endTime: params.end_time,\n        name: params.name,\n        mediaType: params.media_type,\n        summary: params.summary,\n        privacies: params.privacies,\n      });\n      return data.createBite;\n    },\n  };\n}\n","import type { ActiveMeeting } from '../../types/meeting.js';\nimport type { ActiveMeetingsParams, AddBotParams } from '../../types/params.js';\nimport type { GraphQLClient } from '../client.js';\n\nconst ACTIVE_MEETING_FIELDS = `\n  id\n  title\n  organizer_email\n  meeting_link\n  start_time\n  end_time\n  privacy\n  state\n`;\n\n/**\n * API for meeting operations.\n */\nexport interface MeetingsAPI {\n  /**\n   * List active meetings in progress.\n   *\n   * @param params - Optional filter parameters\n   * @returns Array of active meetings\n   */\n  active(params?: ActiveMeetingsParams): Promise<ActiveMeeting[]>;\n\n  /**\n   * Add Fireflies bot to a live meeting.\n   *\n   * @param params - Meeting parameters\n   * @returns Success result\n   */\n  addBot(params: AddBotParams): Promise<{ success: boolean }>;\n}\n\n/**\n * Create the meetings API bound to a GraphQL client.\n */\nexport function createMeetingsAPI(client: GraphQLClient): MeetingsAPI {\n  return {\n    async active(params?: ActiveMeetingsParams): Promise<ActiveMeeting[]> {\n      const query = `\n        query ActiveMeetings($email: String, $states: [MeetingState!]) {\n          active_meetings(input: { email: $email, states: $states }) {\n            ${ACTIVE_MEETING_FIELDS}\n          }\n        }\n      `;\n      const data = await client.execute<{ active_meetings: ActiveMeeting[] }>(query, {\n        email: params?.email,\n        states: params?.states,\n      });\n      return data.active_meetings;\n    },\n\n    async addBot(params: AddBotParams): Promise<{ success: boolean }> {\n      const mutation = `\n        mutation AddToLiveMeeting(\n          $meetingLink: String!\n          $title: String\n          $meetingPassword: String\n          $duration: Int\n          $language: String\n        ) {\n          addToLiveMeeting(\n            meeting_link: $meetingLink\n            title: $title\n            meeting_password: $meetingPassword\n            duration: $duration\n            language: $language\n          ) {\n            success\n          }\n        }\n      `;\n      const data = await client.execute<{ addToLiveMeeting: { success: boolean } }>(mutation, {\n        meetingLink: params.meeting_link,\n        title: params.title,\n        meetingPassword: params.password,\n        duration: params.duration,\n        language: params.language,\n      });\n      return data.addToLiveMeeting;\n    },\n  };\n}\n","import type { Transcript } from '../types/transcript.js';\n\n/**\n * A single action item extracted from the transcript.\n */\nexport interface ActionItem {\n  /** The action item text */\n  text: string;\n  /** Detected assignee name (if found in text) */\n  assignee?: string;\n  /** Detected due date (if found in text) */\n  dueDate?: string;\n  /** Original line number in action_items string (1-indexed) */\n  lineNumber: number;\n  /** Related sentence from transcript (if AIFilter.task matched) */\n  sourceSentence?: {\n    speakerName: string;\n    text: string;\n    startTime: number;\n  };\n}\n\n/**\n * Result of action item extraction.\n */\nexport interface ActionItemsResult {\n  /** Extracted action items */\n  items: ActionItem[];\n  /** Total count of action items */\n  totalItems: number;\n  /** Items with detected assignees */\n  assignedItems: number;\n  /** Items with detected due dates */\n  datedItems: number;\n  /** Unique assignees found */\n  assignees: string[];\n}\n\n/**\n * Options for action item extraction.\n */\nexport interface ActionItemOptions {\n  /**\n   * Attempt to detect assignees from text patterns (default: true).\n   * Looks for patterns like \"@Alice\", \"Alice:\", \"assigned to Alice\".\n   */\n  detectAssignees?: boolean;\n  /**\n   * Attempt to detect due dates from text patterns (default: true).\n   * Looks for patterns like \"by Friday\", \"due 2024-01-15\", \"EOD\".\n   */\n  detectDueDates?: boolean;\n  /**\n   * Match action items with AIFilter.task in sentences (default: false).\n   * When enabled, correlates summary items with source sentences.\n   */\n  includeSourceSentences?: boolean;\n  /**\n   * Known participant names for better assignee matching (default: []).\n   * Improves accuracy by limiting to actual meeting participants.\n   */\n  participantNames?: string[];\n}\n\n// Assignee detection patterns in priority order (highest first)\nconst ASSIGNEE_PATTERNS: Array<{ pattern: RegExp; group: number }> = [\n  { pattern: /@(\\w+)/i, group: 1 }, // @Alice\n  { pattern: /^(\\w+):/i, group: 1 }, // Alice: at start\n  { pattern: /assigned to (\\w+)/i, group: 1 }, // assigned to Alice\n  { pattern: /(\\w+) will\\b/i, group: 1 }, // Alice will\n  { pattern: /(\\w+) to\\b/i, group: 1 }, // Alice to (do something)\n  { pattern: /\\s-\\s*(\\w+)$/i, group: 1 }, // ... - Alice\n];\n\n// Due date detection patterns\nconst DUE_DATE_PATTERNS: Array<{ pattern: RegExp; group: number }> = [\n  { pattern: /by (monday|tuesday|wednesday|thursday|friday|saturday|sunday)/i, group: 1 },\n  { pattern: /by (tomorrow|today)/i, group: 1 },\n  { pattern: /by (EOD|end of day)/i, group: 1 },\n  { pattern: /by (EOW|end of week)/i, group: 1 },\n  { pattern: /due (\\d{4}-\\d{2}-\\d{2})/i, group: 1 },\n  { pattern: /due (jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\\s+\\d+/i, group: 0 },\n  { pattern: /by (\\d{1,2}\\/\\d{1,2})/i, group: 1 },\n];\n\n// List item prefixes to strip\nconst LIST_PREFIX_PATTERN = /^(?:[-•*]|\\d+\\.)\\s*/;\n\n// Section header pattern: **Name** or **Multiple Words**\n// Used by Fireflies to group action items by assignee\nconst SECTION_HEADER_PATTERN = /^\\*\\*(.+)\\*\\*$/;\n\n/**\n * Extract structured action items from a transcript.\n *\n * Parses the action_items field from the transcript summary into\n * structured data with optional assignee and due date detection.\n *\n * **Note:** These action items are generated by Fireflies' AI processing\n * during transcription. For custom action item extraction or different\n * interpretation logic, consider running your own LLM calls on the\n * transcript sentences directly.\n *\n * @param transcript - The transcript to extract action items from\n * @param options - Extraction options\n * @returns Structured action items with metadata\n *\n * @example\n * ```typescript\n * const result = extractActionItems(transcript);\n * for (const item of result.items) {\n *   console.log(`${item.text} -> ${item.assignee ?? 'unassigned'}`);\n * }\n * ```\n */\nexport function extractActionItems(\n  transcript: Transcript,\n  options: ActionItemOptions = {}\n): ActionItemsResult {\n  const actionItemsText = transcript.summary?.action_items;\n  if (!actionItemsText || actionItemsText.trim().length === 0) {\n    return emptyResult();\n  }\n\n  const config: ParseConfig = {\n    detectAssignees: options.detectAssignees ?? true,\n    detectDueDates: options.detectDueDates ?? true,\n    includeSourceSentences: options.includeSourceSentences ?? false,\n    participantNames: options.participantNames ?? [],\n  };\n\n  const taskSentences = config.includeSourceSentences ? buildTaskSentenceLookup(transcript) : [];\n  const lines = actionItemsText.split(/\\n/);\n\n  return parseAllLines(lines, config, taskSentences);\n}\n\nfunction parseAllLines(\n  lines: string[],\n  config: ParseConfig,\n  taskSentences: TaskSentence[]\n): ActionItemsResult {\n  const items: ActionItem[] = [];\n  const assigneeSet = new Set<string>();\n  let currentSectionAssignee: string | undefined;\n\n  for (let i = 0; i < lines.length; i++) {\n    const result = processLine(lines[i], i + 1, config, taskSentences, currentSectionAssignee);\n    if (result.type === 'header') {\n      currentSectionAssignee = result.assignee;\n    } else if (result.type === 'item' && result.item) {\n      items.push(result.item);\n      if (result.item.assignee) {\n        assigneeSet.add(result.item.assignee);\n      }\n    }\n  }\n\n  return buildResult(items, assigneeSet);\n}\n\ntype LineResult =\n  | { type: 'skip' }\n  | { type: 'header'; assignee: string | undefined }\n  | { type: 'item'; item: ActionItem };\n\nfunction processLine(\n  line: string | undefined,\n  lineNumber: number,\n  config: ParseConfig,\n  taskSentences: TaskSentence[],\n  sectionAssignee: string | undefined\n): LineResult {\n  if (!line) return { type: 'skip' };\n\n  const trimmed = line.trim();\n  if (trimmed.length === 0) return { type: 'skip' };\n\n  // Check for section header (**Name**)\n  const headerMatch = trimmed.match(SECTION_HEADER_PATTERN);\n  if (headerMatch?.[1]) {\n    const headerName = headerMatch[1];\n    const assignee = headerName.toLowerCase() === 'unassigned' ? undefined : headerName;\n    return { type: 'header', assignee };\n  }\n\n  const item = parseLine(line, lineNumber, config, taskSentences, sectionAssignee);\n  if (item) {\n    return { type: 'item', item };\n  }\n\n  return { type: 'skip' };\n}\n\ninterface ParseConfig {\n  detectAssignees: boolean;\n  detectDueDates: boolean;\n  includeSourceSentences: boolean;\n  participantNames: string[];\n}\n\nfunction parseLine(\n  line: string | undefined,\n  lineNumber: number,\n  config: ParseConfig,\n  taskSentences: TaskSentence[],\n  sectionAssignee?: string\n): ActionItem | null {\n  if (!line) return null;\n\n  const trimmed = line.trim();\n  if (trimmed.length === 0) return null;\n\n  const text = trimmed.replace(LIST_PREFIX_PATTERN, '');\n  if (text.length === 0) return null;\n\n  // Inline assignee detection takes priority over section assignee\n  const inlineAssignee = config.detectAssignees\n    ? detectAssignee(text, config.participantNames)\n    : undefined;\n  const assignee = inlineAssignee ?? sectionAssignee;\n\n  const dueDate = config.detectDueDates ? detectDueDate(text) : undefined;\n  const sourceSentence = config.includeSourceSentences\n    ? findSourceSentence(text, taskSentences)\n    : undefined;\n\n  return { text, assignee, dueDate, lineNumber, sourceSentence };\n}\n\nfunction buildResult(items: ActionItem[], assigneeSet: Set<string>): ActionItemsResult {\n  return {\n    items,\n    totalItems: items.length,\n    assignedItems: items.filter((i) => i.assignee !== undefined).length,\n    datedItems: items.filter((i) => i.dueDate !== undefined).length,\n    assignees: Array.from(assigneeSet),\n  };\n}\n\nfunction emptyResult(): ActionItemsResult {\n  return {\n    items: [],\n    totalItems: 0,\n    assignedItems: 0,\n    datedItems: 0,\n    assignees: [],\n  };\n}\n\nfunction detectAssignee(text: string, participantNames: string[]): string | undefined {\n  const participantSet = new Set(participantNames.map((n) => n.toLowerCase()));\n  const filterByParticipants = participantSet.size > 0;\n\n  for (const { pattern, group } of ASSIGNEE_PATTERNS) {\n    const match = text.match(pattern);\n    if (match?.[group]) {\n      const name = match[group];\n      // If participantNames provided, only match against those names\n      if (filterByParticipants) {\n        if (participantSet.has(name.toLowerCase())) {\n          return name;\n        }\n        // Continue checking other patterns\n        continue;\n      }\n      return name;\n    }\n  }\n\n  return undefined;\n}\n\nfunction detectDueDate(text: string): string | undefined {\n  for (const { pattern, group } of DUE_DATE_PATTERNS) {\n    const match = text.match(pattern);\n    if (match) {\n      // For \"due Jan 15\" pattern (group 0), extract the full date part\n      if (group === 0 && match[0]) {\n        const fullMatch = match[0];\n        // Extract just the date portion (e.g., \"Jan 15\" from \"due Jan 15\")\n        const dateMatch = fullMatch.match(\n          /(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\\s+\\d+/i\n        );\n        if (dateMatch?.[0]) {\n          return dateMatch[0];\n        }\n      }\n      if (match[group]) {\n        return match[group];\n      }\n    }\n  }\n\n  return undefined;\n}\n\ninterface TaskSentence {\n  text: string;\n  task: string;\n  speakerName: string;\n  startTime: number;\n}\n\nfunction buildTaskSentenceLookup(transcript: Transcript): TaskSentence[] {\n  const sentences = transcript.sentences ?? [];\n  const result: TaskSentence[] = [];\n\n  for (const sentence of sentences) {\n    const task = sentence.ai_filters?.task;\n    if (task) {\n      result.push({\n        text: sentence.text,\n        task: task.toLowerCase(),\n        speakerName: sentence.speaker_name,\n        startTime: Number.parseFloat(sentence.start_time),\n      });\n    }\n  }\n\n  return result;\n}\n\nfunction findSourceSentence(\n  actionItemText: string,\n  taskSentences: TaskSentence[]\n): ActionItem['sourceSentence'] | undefined {\n  const normalizedItem = actionItemText.toLowerCase();\n\n  // Look for task sentences that have significant word overlap\n  for (const sentence of taskSentences) {\n    // Check if the task text is contained in the action item or vice versa\n    if (normalizedItem.includes(sentence.task) || sentence.task.includes(normalizedItem)) {\n      return {\n        speakerName: sentence.speakerName,\n        text: sentence.text,\n        startTime: sentence.startTime,\n      };\n    }\n\n    // Also check for significant word overlap\n    const itemWords = new Set(normalizedItem.split(/\\s+/).filter((w) => w.length > 3));\n    const taskWords = sentence.task.split(/\\s+/).filter((w) => w.length > 3);\n    const matchingWords = taskWords.filter((w) => itemWords.has(w));\n\n    if (taskWords.length > 0 && matchingWords.length / taskWords.length >= 0.5) {\n      return {\n        speakerName: sentence.speakerName,\n        text: sentence.text,\n        startTime: sentence.startTime,\n      };\n    }\n  }\n\n  return undefined;\n}\n","import type {\n  ActionItemsFilterOptions,\n  ActionItemsMarkdownOptions,\n  AggregatedActionItem,\n  AggregatedActionItemsResult,\n} from '../types/action-items.js';\nimport type { Transcript } from '../types/transcript.js';\nimport {\n  type ActionItem,\n  type ActionItemOptions,\n  type ActionItemsResult,\n  extractActionItems,\n} from './action-items.js';\n\n/**\n * Filter action items by criteria.\n *\n * Filters can be combined with AND logic - items must match all specified criteria.\n *\n * @param items - Action items to filter\n * @param options - Filter criteria\n * @returns Filtered items preserving original type and order\n *\n * @example\n * ```typescript\n * // Filter to Alice's items with due dates\n * const filtered = filterActionItems(items, {\n *   assignees: ['Alice'],\n *   datedOnly: true,\n * });\n * ```\n */\nexport function filterActionItems<T extends ActionItem>(\n  items: T[],\n  options: ActionItemsFilterOptions\n): T[] {\n  const { assignees, assignedOnly, datedOnly } = options;\n\n  // Normalize assignees to lowercase for case-insensitive matching\n  const normalizedAssignees = assignees?.map((a) => a.toLowerCase());\n\n  return items.filter((item) => {\n    // Assignee filter (case-insensitive)\n    if (normalizedAssignees && normalizedAssignees.length > 0) {\n      if (!item.assignee) return false;\n      if (!normalizedAssignees.includes(item.assignee.toLowerCase())) return false;\n    }\n\n    // Assigned-only filter\n    if (assignedOnly && !item.assignee) {\n      return false;\n    }\n\n    // Dated-only filter\n    if (datedOnly && !item.dueDate) {\n      return false;\n    }\n\n    return true;\n  });\n}\n\n/**\n * Aggregate action items from multiple transcripts.\n *\n * Extracts action items from each transcript and attaches source metadata\n * (transcript ID, title, date) to each item.\n *\n * @param transcripts - Transcripts to extract action items from\n * @param extractionOptions - Options for action item extraction\n * @param filterOptions - Options to filter extracted items\n * @returns Aggregated result with items and statistics\n *\n * @example\n * ```typescript\n * const result = aggregateActionItems(transcripts);\n * console.log(`${result.totalItems} items from ${result.transcriptsProcessed} meetings`);\n * ```\n */\nexport function aggregateActionItems(\n  transcripts: Transcript[],\n  extractionOptions?: ActionItemOptions,\n  filterOptions?: ActionItemsFilterOptions\n): AggregatedActionItemsResult {\n  if (transcripts.length === 0) {\n    return emptyAggregatedResult();\n  }\n\n  const allItems: AggregatedActionItem[] = [];\n  let transcriptsWithItems = 0;\n\n  for (const transcript of transcripts) {\n    const extracted = extractActionItems(transcript, extractionOptions);\n\n    if (extracted.items.length > 0) {\n      transcriptsWithItems++;\n\n      for (const item of extracted.items) {\n        allItems.push({\n          ...item,\n          transcriptId: transcript.id,\n          transcriptTitle: transcript.title,\n          transcriptDate: transcript.dateString,\n        });\n      }\n    }\n  }\n\n  // Apply filter if provided\n  const filteredItems = filterOptions ? filterActionItems(allItems, filterOptions) : allItems;\n\n  return buildAggregatedResult(filteredItems, transcripts.length, transcriptsWithItems);\n}\n\nfunction emptyAggregatedResult(): AggregatedActionItemsResult {\n  return {\n    items: [],\n    totalItems: 0,\n    transcriptsProcessed: 0,\n    transcriptsWithItems: 0,\n    assignedItems: 0,\n    datedItems: 0,\n    assignees: [],\n    dateRange: { earliest: '', latest: '' },\n  };\n}\n\nfunction buildAggregatedResult(\n  items: AggregatedActionItem[],\n  transcriptsProcessed: number,\n  transcriptsWithItems: number\n): AggregatedActionItemsResult {\n  const assigneeSet = new Set<string>();\n  let assignedItems = 0;\n  let datedItems = 0;\n\n  for (const item of items) {\n    if (item.assignee) {\n      assigneeSet.add(item.assignee);\n      assignedItems++;\n    }\n    if (item.dueDate) {\n      datedItems++;\n    }\n  }\n\n  const dates = items\n    .map((i) => i.transcriptDate)\n    .filter(Boolean)\n    .sort();\n\n  return {\n    items,\n    totalItems: items.length,\n    transcriptsProcessed,\n    transcriptsWithItems,\n    assignedItems,\n    datedItems,\n    assignees: Array.from(assigneeSet),\n    dateRange: {\n      earliest: dates[0] ?? '',\n      latest: dates[dates.length - 1] ?? '',\n    },\n  };\n}\n\n/** Check if result is an aggregated result (has transcript metadata) */\nfunction isAggregatedResult(\n  result: ActionItemsResult | AggregatedActionItemsResult\n): result is AggregatedActionItemsResult {\n  return 'transcriptsProcessed' in result;\n}\n\n/** Check if item is an aggregated item (has transcript metadata) */\nfunction isAggregatedItem(item: ActionItem): item is AggregatedActionItem {\n  return 'transcriptId' in item;\n}\n\n/** Escape markdown special characters in text */\nfunction escapeMarkdown(text: string): string {\n  return text\n    .replace(/\\\\/g, '\\\\\\\\')\n    .replace(/\\*/g, '\\\\*')\n    .replace(/#/g, '\\\\#')\n    .replace(/\\[/g, '\\\\[')\n    .replace(/\\]/g, '\\\\]')\n    .replace(/_/g, '\\\\_')\n    .replace(/`/g, '\\\\`');\n}\n\n/** Get preset options */\nfunction getPresetOptions(\n  preset: ActionItemsMarkdownOptions['preset']\n): Partial<ActionItemsMarkdownOptions> {\n  switch (preset) {\n    case 'notion':\n      return {\n        style: 'checkbox',\n        includeAssignee: true,\n        includeDueDate: true,\n      };\n    case 'obsidian':\n      return {\n        style: 'checkbox',\n        includeAssignee: false,\n        includeDueDate: true,\n      };\n    case 'github':\n      return {\n        style: 'checkbox',\n        includeAssignee: true,\n        includeDueDate: true,\n      };\n    default:\n      return {};\n  }\n}\n\n/** Format a single item as markdown */\nfunction formatItem(\n  item: ActionItem | AggregatedActionItem,\n  index: number,\n  options: Required<\n    Pick<\n      ActionItemsMarkdownOptions,\n      'style' | 'includeAssignee' | 'includeDueDate' | 'includeMeetingTitle'\n    >\n  >\n): string {\n  const { style, includeAssignee, includeDueDate, includeMeetingTitle } = options;\n\n  // Build prefix based on style\n  let prefix: string;\n  switch (style) {\n    case 'bullet':\n      prefix = '-';\n      break;\n    case 'numbered':\n      prefix = `${index + 1}.`;\n      break;\n    default:\n      prefix = '- [ ]';\n      break;\n  }\n\n  // Build the item text\n  let text = escapeMarkdown(item.text);\n\n  // Add inline metadata\n  const metadata: string[] = [];\n  if (includeAssignee && item.assignee) {\n    metadata.push(`@${item.assignee}`);\n  }\n  if (includeDueDate && item.dueDate) {\n    metadata.push(`due: ${item.dueDate}`);\n  }\n  if (includeMeetingTitle && isAggregatedItem(item)) {\n    metadata.push(`*${item.transcriptTitle}*`);\n  }\n\n  if (metadata.length > 0) {\n    text += ` (${metadata.join(', ')})`;\n  }\n\n  return `${prefix} ${text}`;\n}\n\n/** Group items by a key function */\nfunction groupBy<T>(items: T[], keyFn: (item: T) => string): Map<string, T[]> {\n  const groups = new Map<string, T[]>();\n  for (const item of items) {\n    const key = keyFn(item);\n    const group = groups.get(key);\n    if (group) {\n      group.push(item);\n    } else {\n      groups.set(key, [item]);\n    }\n  }\n  return groups;\n}\n\n/** Format summary line for aggregated result */\nfunction formatSummaryLine(result: AggregatedActionItemsResult): string {\n  return `**Summary:** ${result.totalItems} items from ${result.transcriptsProcessed} meetings (${result.assignedItems} assigned, ${result.datedItems} with due dates)`;\n}\n\n/** Sort group keys with Unassigned last */\nfunction sortGroupKeys(keys: string[]): string[] {\n  return keys.sort((a, b) => {\n    if (a === 'Unassigned') return 1;\n    if (b === 'Unassigned') return -1;\n    return a.localeCompare(b);\n  });\n}\n\ntype ItemOptions = Required<\n  Pick<\n    ActionItemsMarkdownOptions,\n    'style' | 'includeAssignee' | 'includeDueDate' | 'includeMeetingTitle'\n  >\n>;\n\n/** Format items as grouped markdown sections */\nfunction formatGroupedItems(\n  result: AggregatedActionItemsResult,\n  groupByOption: 'assignee' | 'transcript' | 'date',\n  itemOptions: ItemOptions\n): string[] {\n  const lines: string[] = [];\n  const keyFn = getGroupKeyFn(groupByOption);\n  const groups = groupBy(result.items, keyFn);\n  const sortedKeys = sortGroupKeys(Array.from(groups.keys()));\n\n  for (const key of sortedKeys) {\n    const groupItems = groups.get(key);\n    if (!groupItems) continue;\n\n    lines.push(`### ${key}`);\n    lines.push('');\n    groupItems.forEach((item, index) => {\n      lines.push(formatItem(item, index, itemOptions));\n    });\n    lines.push('');\n  }\n\n  return lines;\n}\n\n/** Format items as flat list */\nfunction formatFlatItems(items: ActionItem[], itemOptions: ItemOptions): string[] {\n  return items.map((item, index) => formatItem(item, index, itemOptions));\n}\n\n/**\n * Format action items as Markdown.\n *\n * Supports multiple styles (checkbox, bullet, numbered), grouping options,\n * inline metadata, and presets for popular tools.\n *\n * @param result - Action items result (single or aggregated)\n * @param options - Formatting options\n * @returns Formatted markdown string\n *\n * @example\n * ```typescript\n * const markdown = formatActionItemsMarkdown(result, {\n *   style: 'checkbox',\n *   groupBy: 'assignee',\n *   includeSummary: true,\n *   preset: 'notion',\n * });\n * ```\n */\nexport function formatActionItemsMarkdown(\n  result: ActionItemsResult | AggregatedActionItemsResult,\n  options: ActionItemsMarkdownOptions = {}\n): string {\n  if (result.items.length === 0) {\n    return '';\n  }\n\n  const presetOptions = getPresetOptions(options.preset);\n  const mergedOptions = { ...presetOptions, ...options };\n\n  const {\n    style = 'checkbox',\n    groupBy: groupByOption = 'none',\n    includeAssignee = false,\n    includeDueDate = false,\n    includeMeetingTitle = false,\n    includeSummary = false,\n  } = mergedOptions;\n\n  const lines: string[] = [];\n\n  if (includeSummary && isAggregatedResult(result)) {\n    lines.push(formatSummaryLine(result));\n    lines.push('');\n  }\n\n  const itemOptions = { style, includeAssignee, includeDueDate, includeMeetingTitle };\n\n  const shouldGroup = groupByOption !== 'none' && isAggregatedResult(result);\n  if (shouldGroup) {\n    lines.push(...formatGroupedItems(result, groupByOption, itemOptions));\n  } else {\n    lines.push(...formatFlatItems(result.items, itemOptions));\n  }\n\n  return lines.join('\\n').trim();\n}\n\n/** Get the grouping key function */\nfunction getGroupKeyFn(\n  groupBy: 'assignee' | 'transcript' | 'date'\n): (item: AggregatedActionItem) => string {\n  switch (groupBy) {\n    case 'assignee':\n      return (item) => item.assignee ?? 'Unassigned';\n    case 'transcript':\n      return (item) => item.transcriptTitle;\n    case 'date':\n      return (item) => item.transcriptDate;\n  }\n}\n","import { RateLimitError } from '../errors.js';\n\n/**\n * Options for batch processing.\n */\nexport interface BatchOptions {\n  /**\n   * Number of concurrent operations.\n   * Currently only sequential (1) is supported.\n   * @default 1\n   */\n  concurrency?: number;\n  /**\n   * Delay in milliseconds between operations.\n   * @default 100\n   */\n  delayMs?: number;\n  /**\n   * Whether to automatically handle rate limit errors.\n   * When true, waits for retryAfter and retries.\n   * @default true\n   */\n  handleRateLimit?: boolean;\n  /**\n   * Maximum number of rate limit retries per item.\n   * @default 3\n   */\n  maxRateLimitRetries?: number;\n}\n\n/**\n * Result of a batch operation on a single item.\n */\nexport type BatchResult<T, R> =\n  | { item: T; result: R; error?: never }\n  | { item: T; result?: never; error: Error };\n\n/**\n * Process items in batch with rate limiting and error handling.\n *\n * Yields results as they complete, allowing streaming processing.\n * On rate limit errors, automatically waits and retries if handleRateLimit is true.\n *\n * @param items - Items to process (sync or async iterable)\n * @param processor - Function to process each item\n * @param options - Batch processing options\n * @returns AsyncIterable yielding results (success or error) for each item\n *\n * @example\n * ```typescript\n * import { batch, FirefliesClient } from 'fireflies-api';\n *\n * const client = new FirefliesClient({ apiKey: 'your-api-key' });\n * const ids = ['id1', 'id2', 'id3'];\n *\n * for await (const result of batch(ids, id => client.transcripts.get(id))) {\n *   if (result.error) {\n *     console.error(`Failed to fetch ${result.item}: ${result.error.message}`);\n *   } else {\n *     console.log(`Got ${result.result.title}`);\n *   }\n * }\n * ```\n */\nexport async function* batch<T, R>(\n  items: Iterable<T> | AsyncIterable<T>,\n  processor: (item: T) => Promise<R>,\n  options: BatchOptions = {}\n): AsyncIterable<BatchResult<T, R>> {\n  const { delayMs = 100, handleRateLimit = true, maxRateLimitRetries = 3 } = options;\n\n  let isFirst = true;\n\n  for await (const item of items) {\n    // Add delay between items (not before first)\n    if (!isFirst && delayMs > 0) {\n      await delay(delayMs);\n    }\n    isFirst = false;\n\n    yield await processWithRetry(item, processor, {\n      handleRateLimit,\n      maxRateLimitRetries,\n    });\n  }\n}\n\n/**\n * Process all items in batch and collect results.\n *\n * Unlike the streaming `batch()`, this waits for all items to complete\n * and returns results as an array.\n *\n * @param items - Array of items to process\n * @param processor - Function to process each item\n * @param options - Batch processing options plus continueOnError\n * @returns Array of successful results. When continueOnError is false, results\n *   match input order. When true, failed items are omitted (array may be shorter).\n * @throws First error encountered if continueOnError is false (default)\n *\n * @example\n * ```typescript\n * import { batchAll, FirefliesClient } from 'fireflies-api';\n *\n * const client = new FirefliesClient({ apiKey: 'your-api-key' });\n * const ids = ['id1', 'id2', 'id3'];\n *\n * // Throws on first error\n * const transcripts = await batchAll(ids, id => client.transcripts.get(id));\n *\n * // Continues on error, collects successful results\n * const results = await batchAll(\n *   ids,\n *   id => client.transcripts.get(id),\n *   { continueOnError: true }\n * );\n * ```\n */\nexport async function batchAll<T, R>(\n  items: T[],\n  processor: (item: T) => Promise<R>,\n  options: BatchOptions & { continueOnError?: boolean } = {}\n): Promise<R[]> {\n  const { continueOnError = false, ...batchOptions } = options;\n  const results: R[] = [];\n  const errors: Error[] = [];\n\n  for await (const batchResult of batch(items, processor, batchOptions)) {\n    if (batchResult.error) {\n      if (!continueOnError) {\n        throw batchResult.error;\n      }\n      errors.push(batchResult.error);\n    } else {\n      results.push(batchResult.result);\n    }\n  }\n\n  return results;\n}\n\n/**\n * Process a single item with rate limit retry logic.\n */\nasync function processWithRetry<T, R>(\n  item: T,\n  processor: (item: T) => Promise<R>,\n  options: { handleRateLimit: boolean; maxRateLimitRetries: number }\n): Promise<BatchResult<T, R>> {\n  const { handleRateLimit, maxRateLimitRetries } = options;\n  let retries = 0;\n\n  while (true) {\n    try {\n      const result = await processor(item);\n      return { item, result };\n    } catch (err) {\n      // Handle rate limit with retry\n      if (handleRateLimit && err instanceof RateLimitError && retries < maxRateLimitRetries) {\n        const waitTime = err.retryAfter ?? 1000;\n        await delay(waitTime);\n        retries++;\n        continue;\n      }\n\n      // Return error for this item\n      return {\n        item,\n        error: err instanceof Error ? err : new Error(String(err)),\n      };\n    }\n  }\n}\n\n/**\n * Delay execution for a specified time.\n */\nfunction delay(ms: number): Promise<void> {\n  return new Promise((resolve) => setTimeout(resolve, ms));\n}\n","/**\n * Extract domain from email address.\n *\n * @param email - Email address\n * @returns Lowercase domain, or empty string if invalid\n *\n * @example\n * ```typescript\n * extractDomain('user@company.com'); // 'company.com'\n * extractDomain('User@EXAMPLE.ORG'); // 'example.org'\n * extractDomain('invalid'); // ''\n * ```\n */\nexport function extractDomain(email: string): string {\n  const atIndex = email.indexOf('@');\n  if (atIndex < 0) return '';\n  const domain = email.slice(atIndex + 1).toLowerCase();\n  return domain || '';\n}\n\n/**\n * Check if any participant has an email outside the given domain.\n *\n * @param participants - List of participant email addresses\n * @param internalDomain - The internal/company domain to check against\n * @returns True if at least one participant has a different domain\n *\n * @example\n * ```typescript\n * hasExternalParticipants(['a@company.com', 'b@external.com'], 'company.com'); // true\n * hasExternalParticipants(['a@company.com', 'b@company.com'], 'company.com'); // false\n * ```\n */\nexport function hasExternalParticipants(participants: string[], internalDomain: string): boolean {\n  const normalizedInternal = internalDomain.toLowerCase();\n  return participants.some((email) => {\n    const domain = extractDomain(email);\n    return domain !== '' && domain !== normalizedInternal;\n  });\n}\n","import type { TranscriptionChunk } from '../realtime/types.js';\nimport type { Sentence, Summary, Transcript } from '../types/transcript.js';\n\n/**\n * Options for transcriptToMarkdown().\n */\nexport interface MarkdownExportOptions {\n  /** Include meeting metadata header (title, date, participants, duration). Default: true */\n  includeMetadata?: boolean;\n  /** Include AI-generated summary sections. Default: true */\n  includeSummary?: boolean;\n  /** Include action items section. Default: true */\n  includeActionItems?: boolean;\n  /** Format for action items: checkbox or plain list. Default: 'checkbox' */\n  actionItemFormat?: 'checkbox' | 'list';\n  /** Include timestamps for each sentence. Default: false */\n  includeTimestamps?: boolean;\n  /** How to format speaker names. Default: 'bold' */\n  speakerFormat?: 'bold' | 'plain';\n  /** Group consecutive sentences by same speaker. Default: true */\n  groupBySpeaker?: boolean;\n  /** Write output to file path (Node.js only). If set, also returns the string. */\n  outputPath?: string;\n}\n\n/**\n * Options for chunksToMarkdown().\n */\nexport interface ChunksExportOptions {\n  /** Meeting title (chunks don't include metadata). Default: 'Live Transcript' */\n  title?: string;\n  /** Include timestamps for each chunk. Default: false */\n  includeTimestamps?: boolean;\n  /** How to format speaker names. Default: 'bold' */\n  speakerFormat?: 'bold' | 'plain';\n  /** Group consecutive chunks by same speaker. Default: true */\n  groupBySpeaker?: boolean;\n  /** Write output to file path (Node.js only). If set, also returns the string. */\n  outputPath?: string;\n}\n\nconst DEFAULT_OPTIONS: Required<Omit<MarkdownExportOptions, 'outputPath'>> = {\n  includeMetadata: true,\n  includeSummary: true,\n  includeActionItems: true,\n  actionItemFormat: 'checkbox',\n  includeTimestamps: false,\n  speakerFormat: 'bold',\n  groupBySpeaker: true,\n};\n\nconst DEFAULT_CHUNKS_OPTIONS: Required<Omit<ChunksExportOptions, 'outputPath'>> = {\n  title: 'Live Transcript',\n  includeTimestamps: false,\n  speakerFormat: 'bold',\n  groupBySpeaker: true,\n};\n\n/**\n * Convert a completed Fireflies transcript to well-formatted Markdown.\n *\n * @param transcript - The transcript to convert\n * @param options - Formatting options\n * @returns Markdown string representation of the transcript\n *\n * @example\n * ```typescript\n * import { FirefliesClient, transcriptToMarkdown } from 'fireflies-api';\n *\n * const client = new FirefliesClient({ apiKey: 'your-api-key' });\n * const transcript = await client.transcripts.get('transcript-id');\n *\n * // Basic usage\n * const markdown = await transcriptToMarkdown(transcript);\n *\n * // With options\n * const markdown = await transcriptToMarkdown(transcript, {\n *   includeTimestamps: true,\n *   actionItemFormat: 'list',\n * });\n *\n * // Write to file\n * const markdown = await transcriptToMarkdown(transcript, {\n *   outputPath: './meeting-notes.md',\n * });\n * ```\n */\nexport async function transcriptToMarkdown(\n  transcript: Transcript,\n  options: MarkdownExportOptions = {}\n): Promise<string> {\n  const opts = { ...DEFAULT_OPTIONS, ...options };\n  const sections: string[] = [];\n\n  if (opts.includeMetadata) {\n    sections.push(formatMetadata(transcript));\n  }\n\n  if (opts.includeSummary && transcript.summary) {\n    sections.push(formatSummary(transcript.summary, opts));\n  }\n\n  if (transcript.sentences && transcript.sentences.length > 0) {\n    sections.push(formatTranscript(transcript.sentences, opts));\n  }\n\n  const content = sections.join('\\n\\n---\\n\\n');\n  await writeIfOutputPath(content, options.outputPath);\n  return content;\n}\n\n/**\n * Convert realtime transcription chunks to well-formatted Markdown.\n *\n * @param chunks - Array of transcription chunks from realtime stream\n * @param options - Formatting options\n * @returns Markdown string representation of the chunks\n *\n * @example\n * ```typescript\n * import { FirefliesClient, chunksToMarkdown } from 'fireflies-api';\n *\n * const client = new FirefliesClient({ apiKey: 'your-api-key' });\n *\n * // Accumulate chunks from realtime stream\n * const chunks: TranscriptionChunk[] = [];\n * for await (const chunk of client.realtime.stream(meetingId)) {\n *   chunks.push(chunk);\n * }\n *\n * // Convert to markdown\n * const markdown = await chunksToMarkdown(chunks);\n *\n * // With options\n * const markdown = await chunksToMarkdown(chunks, {\n *   title: 'Team Standup',\n *   includeTimestamps: true,\n * });\n * ```\n */\nexport async function chunksToMarkdown(\n  chunks: TranscriptionChunk[],\n  options: ChunksExportOptions = {}\n): Promise<string> {\n  const opts = { ...DEFAULT_CHUNKS_OPTIONS, ...options };\n\n  const lines: string[] = [`# ${opts.title}`];\n\n  if (chunks.length === 0) {\n    lines.push('', '## Transcript', '', '*No transcription data*');\n  } else {\n    lines.push('', '## Transcript');\n\n    if (opts.groupBySpeaker) {\n      const groups = groupChunksBySpeaker(chunks);\n      for (const group of groups) {\n        lines.push('', formatChunkGroup(group, opts));\n      }\n    } else {\n      for (const chunk of chunks) {\n        lines.push('', formatChunk(chunk, opts));\n      }\n    }\n  }\n\n  const content = lines.join('\\n');\n  await writeIfOutputPath(content, options.outputPath);\n  return content;\n}\n\n// --- Internal helpers ---\n\nfunction formatMetadata(transcript: Transcript): string {\n  const lines = [`# ${transcript.title || 'Untitled Meeting'}`];\n\n  if (transcript.dateString) {\n    lines.push(`\\n**Date:** ${formatDate(transcript.dateString)}`);\n  }\n\n  // Calculate duration from last sentence end_time (more accurate than duration field)\n  const duration = calculateDuration(transcript);\n  if (duration > 0) {\n    lines.push(`**Duration:** ${formatDuration(duration)}`);\n  }\n\n  const participants = getParticipantNames(transcript);\n  if (participants.length > 0) {\n    lines.push(`**Participants:** ${participants.join(', ')}`);\n  }\n\n  return lines.join('\\n');\n}\n\n/**\n * Calculate actual meeting duration from sentence timestamps.\n * The API's duration field is often inaccurate, so we use the last sentence's end_time.\n */\nfunction calculateDuration(transcript: Transcript): number {\n  if (transcript.sentences && transcript.sentences.length > 0) {\n    const lastSentence = transcript.sentences[transcript.sentences.length - 1];\n    if (lastSentence) {\n      return parseFloat(lastSentence.end_time);\n    }\n  }\n  return transcript.duration || 0;\n}\n\nfunction formatSummary(\n  summary: Summary,\n  opts: Required<Omit<MarkdownExportOptions, 'outputPath'>>\n): string {\n  const sections: string[] = ['## Summary'];\n\n  if (summary.gist) {\n    sections.push('', summary.gist);\n  }\n\n  if (summary.bullet_gist) {\n    const bullets = parseMultilineField(summary.bullet_gist);\n    if (bullets.length > 0) {\n      sections.push('', '### Key Points');\n      sections.push(bullets.map((p) => `- ${p}`).join('\\n'));\n    }\n  }\n\n  if (opts.includeActionItems && summary.action_items) {\n    const items = parseMultilineField(summary.action_items);\n    if (items.length > 0) {\n      sections.push('', '### Action Items');\n      const prefix = opts.actionItemFormat === 'checkbox' ? '- [ ] ' : '- ';\n      sections.push(items.map((a) => `${prefix}${a}`).join('\\n'));\n    }\n  }\n\n  return sections.join('\\n');\n}\n\nfunction formatTranscript(\n  sentences: Sentence[],\n  opts: Required<Omit<MarkdownExportOptions, 'outputPath'>>\n): string {\n  const lines: string[] = ['## Transcript'];\n\n  if (opts.groupBySpeaker) {\n    const groups = groupSentencesBySpeaker(sentences);\n    for (const group of groups) {\n      lines.push('', formatSpeakerGroup(group, opts));\n    }\n  } else {\n    for (const sentence of sentences) {\n      lines.push('', formatSentence(sentence, opts));\n    }\n  }\n\n  return lines.join('\\n');\n}\n\ninterface SpeakerGroup {\n  speakerName: string;\n  sentences: Sentence[];\n}\n\nfunction groupSentencesBySpeaker(sentences: Sentence[]): SpeakerGroup[] {\n  const groups: SpeakerGroup[] = [];\n  let current: SpeakerGroup | null = null;\n\n  for (const sentence of sentences) {\n    if (!current || current.speakerName !== sentence.speaker_name) {\n      current = { speakerName: sentence.speaker_name, sentences: [] };\n      groups.push(current);\n    }\n    current.sentences.push(sentence);\n  }\n\n  return groups;\n}\n\nfunction formatSpeakerGroup(\n  group: SpeakerGroup,\n  opts: Required<Omit<MarkdownExportOptions, 'outputPath'>>\n): string {\n  const speaker = formatSpeakerName(group.speakerName, opts.speakerFormat);\n  const text = group.sentences.map((s) => s.text).join(' ');\n\n  const firstSentence = group.sentences[0];\n  if (opts.includeTimestamps && firstSentence) {\n    const timestamp = formatTimestamp(firstSentence.start_time);\n    return `${timestamp} ${speaker} ${text}`;\n  }\n  return `${speaker} ${text}`;\n}\n\nfunction formatSentence(\n  sentence: Sentence,\n  opts: Required<Omit<MarkdownExportOptions, 'outputPath'>>\n): string {\n  const speaker = formatSpeakerName(sentence.speaker_name, opts.speakerFormat);\n\n  if (opts.includeTimestamps) {\n    const timestamp = formatTimestamp(sentence.start_time);\n    return `${timestamp} ${speaker} ${sentence.text}`;\n  }\n  return `${speaker} ${sentence.text}`;\n}\n\ninterface ChunkGroup {\n  speakerName: string;\n  chunks: TranscriptionChunk[];\n}\n\nfunction groupChunksBySpeaker(chunks: TranscriptionChunk[]): ChunkGroup[] {\n  const groups: ChunkGroup[] = [];\n  let current: ChunkGroup | null = null;\n\n  for (const chunk of chunks) {\n    if (!current || current.speakerName !== chunk.speaker_name) {\n      current = { speakerName: chunk.speaker_name, chunks: [] };\n      groups.push(current);\n    }\n    current.chunks.push(chunk);\n  }\n\n  return groups;\n}\n\nfunction formatChunkGroup(\n  group: ChunkGroup,\n  opts: Required<Omit<ChunksExportOptions, 'outputPath'>>\n): string {\n  const speaker = formatSpeakerName(group.speakerName, opts.speakerFormat);\n  const text = group.chunks.map((c) => c.text).join(' ');\n\n  const firstChunk = group.chunks[0];\n  if (opts.includeTimestamps && firstChunk) {\n    const timestamp = formatTimestamp(firstChunk.start_time.toString());\n    return `${timestamp} ${speaker} ${text}`;\n  }\n  return `${speaker} ${text}`;\n}\n\nfunction formatChunk(\n  chunk: TranscriptionChunk,\n  opts: Required<Omit<ChunksExportOptions, 'outputPath'>>\n): string {\n  const speaker = formatSpeakerName(chunk.speaker_name, opts.speakerFormat);\n\n  if (opts.includeTimestamps) {\n    const timestamp = formatTimestamp(chunk.start_time.toString());\n    return `${timestamp} ${speaker} ${chunk.text}`;\n  }\n  return `${speaker} ${chunk.text}`;\n}\n\nfunction formatSpeakerName(name: string, format: 'bold' | 'plain'): string {\n  switch (format) {\n    case 'bold':\n      return `**${name}:**`;\n    case 'plain':\n      return `${name}:`;\n  }\n}\n\nfunction formatTimestamp(startTime: string): string {\n  const seconds = parseFloat(startTime);\n  const mins = Math.floor(seconds / 60);\n  const secs = Math.floor(seconds % 60);\n  return `[${mins}:${secs.toString().padStart(2, '0')}]`;\n}\n\nfunction formatDuration(seconds: number): string {\n  const hours = Math.floor(seconds / 3600);\n  const mins = Math.floor((seconds % 3600) / 60);\n  if (hours > 0) {\n    return `${hours}h ${mins}m`;\n  }\n  return `${mins} minutes`;\n}\n\nfunction formatDate(isoString: string): string {\n  return new Date(isoString).toLocaleDateString('en-US', {\n    weekday: 'long',\n    year: 'numeric',\n    month: 'long',\n    day: 'numeric',\n  });\n}\n\nfunction getParticipantNames(transcript: Transcript): string[] {\n  if (transcript.meeting_attendees?.length) {\n    return transcript.meeting_attendees\n      .map((a) => a.displayName || a.name || a.email)\n      .filter(Boolean) as string[];\n  }\n  return transcript.speakers?.map((s) => s.name) || [];\n}\n\n/**\n * Parse newline-separated summary fields into an array.\n * Handles both \\n and actual newlines, filters empty lines.\n */\nfunction parseMultilineField(value: string): string[] {\n  return value\n    .split(/\\n/)\n    .map((line) => line.trim())\n    .filter((line) => line.length > 0);\n}\n\nasync function writeIfOutputPath(content: string, outputPath?: string): Promise<void> {\n  if (outputPath) {\n    const { writeFile } = await import('node:fs/promises');\n    await writeFile(outputPath, content, 'utf-8');\n  }\n}\n","import type { Sentence, Transcript } from '../types/transcript.js';\nimport { transcriptToMarkdown } from './markdown.js';\n\n/**\n * Export format types supported by bulk export.\n */\nexport type ExportFormat = 'markdown' | 'json' | 'txt' | 'csv';\n\n/**\n * Options for transcriptToText().\n */\nexport interface TextExportOptions {\n  /** Include timestamps for each speaker turn. Default: false */\n  includeTimestamps?: boolean;\n  /** Include meeting metadata header (title, date, participants). Default: true */\n  includeMetadata?: boolean;\n}\n\n/**\n * Options for transcriptToCsv().\n */\nexport interface CsvExportOptions {\n  /** Include CSV header row. Default: true */\n  includeHeader?: boolean;\n  /** Field delimiter. Default: ',' */\n  delimiter?: string;\n}\n\n/**\n * A file ready for export.\n */\nexport interface ExportFile {\n  /** Filename with extension */\n  filename: string;\n  /** File content as string */\n  content: string;\n}\n\nconst DEFAULT_TEXT_OPTIONS: Required<TextExportOptions> = {\n  includeTimestamps: false,\n  includeMetadata: true,\n};\n\nconst DEFAULT_CSV_OPTIONS: Required<CsvExportOptions> = {\n  includeHeader: true,\n  delimiter: ',',\n};\n\n/**\n * Convert a transcript to plain text format.\n *\n * @param transcript - The transcript to convert\n * @param options - Formatting options\n * @returns Plain text string with speaker labels\n *\n * @example\n * ```typescript\n * import { transcriptToText } from 'fireflies-api';\n *\n * const text = transcriptToText(transcript);\n * await writeFile('meeting.txt', text);\n * ```\n */\nexport function transcriptToText(transcript: Transcript, options: TextExportOptions = {}): string {\n  const opts = { ...DEFAULT_TEXT_OPTIONS, ...options };\n  const sections: string[] = [];\n\n  if (opts.includeMetadata) {\n    sections.push(formatTextMetadata(transcript));\n  }\n\n  if (transcript.sentences && transcript.sentences.length > 0) {\n    sections.push(formatTextTranscript(transcript.sentences, opts));\n  }\n\n  return sections.join('\\n\\n');\n}\n\n/**\n * Convert a transcript to CSV format with one row per sentence.\n *\n * @param transcript - The transcript to convert\n * @param options - CSV formatting options\n * @returns CSV string with headers and properly escaped values\n *\n * @example\n * ```typescript\n * import { transcriptToCsv } from 'fireflies-api';\n *\n * const csv = transcriptToCsv(transcript);\n * await writeFile('meeting.csv', csv);\n * ```\n */\nexport function transcriptToCsv(transcript: Transcript, options: CsvExportOptions = {}): string {\n  const opts = { ...DEFAULT_CSV_OPTIONS, ...options };\n  const d = opts.delimiter;\n  const lines: string[] = [];\n\n  if (opts.includeHeader) {\n    lines.push(`timestamp${d}speaker${d}text${d}is_question${d}is_task`);\n  }\n\n  for (const sentence of transcript.sentences) {\n    const isQuestion = Boolean(sentence.ai_filters?.question);\n    const isTask = Boolean(sentence.ai_filters?.task);\n    const row = [\n      sentence.start_time,\n      escapeCsvField(sentence.speaker_name, d),\n      escapeCsvField(sentence.text, d),\n      String(isQuestion),\n      String(isTask),\n    ];\n    lines.push(row.join(d));\n  }\n\n  return lines.join('\\n');\n}\n\n/**\n * Sanitize a string for use as a filename.\n *\n * @param title - The title to sanitize\n * @returns A filesystem-safe filename\n *\n * @example\n * ```typescript\n * sanitizeFilename('Weekly Team Standup!') // 'weekly-team-standup'\n * ```\n */\nexport function sanitizeFilename(title: string): string {\n  if (!title.trim()) {\n    return 'untitled';\n  }\n  return title\n    .toLowerCase()\n    .replace(/[^a-z0-9]+/g, '-')\n    .replace(/-+/g, '-')\n    .replace(/^-|-$/g, '')\n    .slice(0, 100);\n}\n\n/**\n * Generate an export filename from a transcript.\n *\n * @param transcript - The transcript to generate a filename for\n * @param extension - File extension (without dot)\n * @returns Filename in format: YYYY-MM-DD-title.ext\n *\n * @example\n * ```typescript\n * generateExportFilename(transcript, 'md')\n * // '2024-01-15-weekly-standup.md'\n * ```\n */\nexport function generateExportFilename(transcript: Transcript, extension: string): string {\n  const sanitizedTitle = sanitizeFilename(transcript.title);\n  let datePrefix = '';\n\n  if (transcript.dateString) {\n    try {\n      const date = new Date(transcript.dateString);\n      if (!Number.isNaN(date.getTime())) {\n        datePrefix = `${date.toISOString().slice(0, 10)}-`;\n      }\n    } catch {\n      // Invalid date - skip prefix\n    }\n  }\n\n  return `${datePrefix}${sanitizedTitle}.${extension}`;\n}\n\n/**\n * Export a transcript to the specified format.\n *\n * @param transcript - The transcript to export\n * @param format - Target format (markdown, json, txt, csv)\n * @returns Formatted string content\n *\n * @example\n * ```typescript\n * const content = await exportTranscript(transcript, 'markdown');\n * await writeFile('meeting.md', content);\n * ```\n */\nexport async function exportTranscript(\n  transcript: Transcript,\n  format: ExportFormat\n): Promise<string> {\n  switch (format) {\n    case 'markdown':\n      return transcriptToMarkdown(transcript);\n    case 'json':\n      return JSON.stringify(transcript, null, 2);\n    case 'txt':\n      return transcriptToText(transcript);\n    case 'csv':\n      return transcriptToCsv(transcript);\n  }\n}\n\n/**\n * Create a zip archive from exported files.\n * Pure function - returns Buffer, no I/O.\n *\n * @param files - Array of files to add to the archive\n * @returns Promise resolving to zip Buffer\n *\n * @example\n * ```typescript\n * const files = [\n *   { filename: 'meeting1.md', content: '# Meeting 1' },\n *   { filename: 'meeting2.md', content: '# Meeting 2' },\n * ];\n * const zipBuffer = await createZipArchive(files);\n * await writeFile('exports.zip', zipBuffer);\n * ```\n */\nexport async function createZipArchive(files: ExportFile[]): Promise<Buffer> {\n  // Use archiver for zip creation\n  const archiver = await import('archiver');\n  const { Writable } = await import('node:stream');\n\n  return new Promise((resolve, reject) => {\n    const chunks: Buffer[] = [];\n    const archive = archiver.default('zip', { zlib: { level: 9 } });\n\n    // Collect output chunks\n    const writable = new Writable({\n      write(chunk: Buffer, _encoding, callback) {\n        chunks.push(chunk);\n        callback();\n      },\n    });\n\n    writable.on('finish', () => {\n      resolve(Buffer.concat(chunks));\n    });\n\n    archive.on('error', reject);\n    archive.pipe(writable);\n\n    // Add files to archive\n    for (const file of files) {\n      archive.append(file.content, { name: file.filename });\n    }\n\n    archive.finalize();\n  });\n}\n\n// --- Internal helpers ---\n\nfunction formatTextMetadata(transcript: Transcript): string {\n  const lines: string[] = [];\n\n  lines.push(transcript.title || 'Untitled Meeting');\n\n  if (transcript.dateString) {\n    lines.push(`Date: ${formatDate(transcript.dateString)}`);\n  }\n\n  const participants = getParticipantNames(transcript);\n  if (participants.length > 0) {\n    lines.push(`Participants: ${participants.join(', ')}`);\n  }\n\n  return lines.join('\\n');\n}\n\nfunction formatTextTranscript(sentences: Sentence[], opts: Required<TextExportOptions>): string {\n  const groups = groupSentencesBySpeaker(sentences);\n  const lines: string[] = [];\n\n  for (const group of groups) {\n    const text = group.sentences.map((s) => s.text).join(' ');\n    const speaker = group.speakerName || 'Unknown';\n\n    const firstSentence = group.sentences[0];\n    if (opts.includeTimestamps && firstSentence) {\n      const timestamp = formatTimestamp(firstSentence.start_time);\n      lines.push(`${timestamp} ${speaker}: ${text}`);\n    } else {\n      lines.push(`${speaker}: ${text}`);\n    }\n  }\n\n  return lines.join('\\n');\n}\n\ninterface SpeakerGroup {\n  speakerName: string;\n  sentences: Sentence[];\n}\n\nfunction groupSentencesBySpeaker(sentences: Sentence[]): SpeakerGroup[] {\n  const groups: SpeakerGroup[] = [];\n  let current: SpeakerGroup | null = null;\n\n  for (const sentence of sentences) {\n    if (!current || current.speakerName !== sentence.speaker_name) {\n      current = { speakerName: sentence.speaker_name, sentences: [] };\n      groups.push(current);\n    }\n    current.sentences.push(sentence);\n  }\n\n  return groups;\n}\n\nfunction formatTimestamp(startTime: string): string {\n  const seconds = parseFloat(startTime);\n  const mins = Math.floor(seconds / 60);\n  const secs = Math.floor(seconds % 60);\n  return `[${mins}:${secs.toString().padStart(2, '0')}]`;\n}\n\nfunction formatDate(isoString: string): string {\n  return new Date(isoString).toLocaleDateString('en-US', {\n    weekday: 'long',\n    year: 'numeric',\n    month: 'long',\n    day: 'numeric',\n  });\n}\n\nfunction getParticipantNames(transcript: Transcript): string[] {\n  if (transcript.meeting_attendees?.length) {\n    return transcript.meeting_attendees\n      .map((a) => a.displayName || a.name || a.email)\n      .filter(Boolean) as string[];\n  }\n  return transcript.speakers?.map((s) => s.name) || [];\n}\n\n/**\n * Escape a field for CSV output.\n * If the field contains the delimiter, quotes, or newlines, wrap in quotes.\n * Double any existing quotes.\n */\nfunction escapeCsvField(field: string, delimiter: string): string {\n  if (field.includes('\"') || field.includes(delimiter) || field.includes('\\n')) {\n    return `\"${field.replace(/\"/g, '\"\"')}\"`;\n  }\n  return field;\n}\n","import type { Sentence, Transcript } from '../types/transcript.js';\n\n// Re-export types for convenience\nexport type {\n  DayOfWeekStats,\n  DayStats,\n  MeetingInsights,\n  MeetingInsightsOptions,\n  ParticipantStats,\n  SpeakerInsightStats,\n  TimeGroupStats,\n} from '../types/meeting-insights.js';\n\nimport type {\n  DayOfWeekStats,\n  DayStats,\n  MeetingInsights,\n  MeetingInsightsOptions,\n  ParticipantStats,\n  SpeakerInsightStats,\n  TimeGroupStats,\n} from '../types/meeting-insights.js';\n\n/**\n * Analyze multiple transcripts to compute aggregate meeting statistics.\n *\n * Pure function - no API calls, fully testable. Computes duration totals,\n * day of week distribution, participant counts, speaker talk times, and\n * time-based groupings.\n *\n * @param transcripts - Array of transcripts to analyze\n * @param options - Analysis options for filtering and grouping\n * @returns Aggregate meeting insights\n *\n * @example\n * ```typescript\n * import { FirefliesClient, analyzeMeetings } from 'fireflies-api';\n *\n * const client = new FirefliesClient({ apiKey: 'your-api-key' });\n *\n * // Fetch transcripts\n * const transcripts: Transcript[] = [];\n * for await (const t of client.transcripts.listAll({ mine: true })) {\n *   transcripts.push(t);\n * }\n *\n * // Analyze\n * const insights = analyzeMeetings(transcripts, {\n *   groupBy: 'week',\n *   topSpeakersCount: 5,\n * });\n *\n * console.log(`${insights.totalMeetings} meetings, ${insights.totalDurationMinutes} minutes total`);\n * console.log(`Average: ${insights.averageDurationMinutes} minutes`);\n * ```\n */\nexport function analyzeMeetings(\n  transcripts: Transcript[],\n  options: MeetingInsightsOptions = {}\n): MeetingInsights {\n  const { speakers, groupBy, topSpeakersCount = 10, topParticipantsCount = 10 } = options;\n\n  if (transcripts.length === 0) {\n    return emptyInsights();\n  }\n\n  // Calculate summary stats\n  const totalDurationMinutes = sumDurations(transcripts);\n  const averageDurationMinutes = totalDurationMinutes / transcripts.length;\n\n  // Calculate day of week distribution\n  const byDayOfWeek = calculateDayOfWeekStats(transcripts);\n\n  // Calculate time group stats if requested\n  const byTimeGroup = groupBy ? calculateTimeGroupStats(transcripts, groupBy) : undefined;\n\n  // Calculate participant stats\n  const participantData = aggregateParticipants(transcripts);\n  const totalUniqueParticipants = participantData.uniqueEmails.size;\n  const averageParticipantsPerMeeting = calculateAverageParticipants(transcripts);\n  const topParticipants = buildTopParticipants(participantData.stats, topParticipantsCount);\n\n  // Calculate speaker stats\n  const speakerData = aggregateSpeakers(transcripts, speakers);\n  const totalUniqueSpeakers = speakerData.uniqueNames.size;\n  const topSpeakers = buildTopSpeakers(speakerData.stats, topSpeakersCount);\n\n  // Calculate date range\n  const { earliestMeeting, latestMeeting } = findDateRange(transcripts);\n\n  return {\n    totalMeetings: transcripts.length,\n    totalDurationMinutes,\n    averageDurationMinutes,\n    byDayOfWeek,\n    byTimeGroup,\n    totalUniqueParticipants,\n    averageParticipantsPerMeeting,\n    topParticipants,\n    totalUniqueSpeakers,\n    topSpeakers,\n    earliestMeeting,\n    latestMeeting,\n  };\n}\n\nfunction emptyInsights(): MeetingInsights {\n  return {\n    totalMeetings: 0,\n    totalDurationMinutes: 0,\n    averageDurationMinutes: 0,\n    byDayOfWeek: emptyDayOfWeekStats(),\n    byTimeGroup: undefined,\n    totalUniqueParticipants: 0,\n    averageParticipantsPerMeeting: 0,\n    topParticipants: [],\n    totalUniqueSpeakers: 0,\n    topSpeakers: [],\n    earliestMeeting: '',\n    latestMeeting: '',\n  };\n}\n\nfunction emptyDayOfWeekStats(): DayOfWeekStats {\n  const emptyDay = (): DayStats => ({ count: 0, totalMinutes: 0 });\n  return {\n    monday: emptyDay(),\n    tuesday: emptyDay(),\n    wednesday: emptyDay(),\n    thursday: emptyDay(),\n    friday: emptyDay(),\n    saturday: emptyDay(),\n    sunday: emptyDay(),\n  };\n}\n\nfunction sumDurations(transcripts: Transcript[]): number {\n  return transcripts.reduce((sum, t) => sum + (t.duration ?? 0), 0);\n}\n\nfunction calculateDayOfWeekStats(transcripts: Transcript[]): DayOfWeekStats {\n  const stats = emptyDayOfWeekStats();\n  const dayNames: (keyof DayOfWeekStats)[] = [\n    'sunday',\n    'monday',\n    'tuesday',\n    'wednesday',\n    'thursday',\n    'friday',\n    'saturday',\n  ];\n\n  for (const t of transcripts) {\n    const date = parseDate(t.dateString);\n    if (!date) continue;\n\n    const dayIndex = date.getUTCDay();\n    const dayName = dayNames[dayIndex];\n    if (dayName) {\n      stats[dayName].count++;\n      stats[dayName].totalMinutes += t.duration ?? 0;\n    }\n  }\n\n  return stats;\n}\n\nfunction calculateTimeGroupStats(\n  transcripts: Transcript[],\n  groupBy: 'day' | 'week' | 'month'\n): TimeGroupStats[] {\n  const groups = new Map<string, { count: number; totalMinutes: number }>();\n\n  for (const t of transcripts) {\n    const date = parseDate(t.dateString);\n    if (!date) continue;\n\n    const period = formatPeriod(date, groupBy);\n    const existing = groups.get(period) ?? { count: 0, totalMinutes: 0 };\n    existing.count++;\n    existing.totalMinutes += t.duration ?? 0;\n    groups.set(period, existing);\n  }\n\n  // Convert to array and sort chronologically\n  const result: TimeGroupStats[] = [];\n  for (const [period, data] of groups) {\n    result.push({\n      period,\n      count: data.count,\n      totalMinutes: data.totalMinutes,\n      averageMinutes: data.totalMinutes / data.count,\n    });\n  }\n\n  result.sort((a, b) => a.period.localeCompare(b.period));\n  return result;\n}\n\nfunction formatPeriod(date: Date, groupBy: 'day' | 'week' | 'month'): string {\n  const year = date.getUTCFullYear();\n  const month = String(date.getUTCMonth() + 1).padStart(2, '0');\n  const day = String(date.getUTCDate()).padStart(2, '0');\n\n  switch (groupBy) {\n    case 'day':\n      return `${year}-${month}-${day}`;\n    case 'week':\n      return getISOWeek(date);\n    case 'month':\n      return `${year}-${month}`;\n  }\n}\n\nfunction getISOWeek(date: Date): string {\n  // ISO week calculation\n  const d = new Date(Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate()));\n  // Set to nearest Thursday: current date + 4 - current day number (Sunday = 0, Thursday = 4)\n  d.setUTCDate(d.getUTCDate() + 4 - (d.getUTCDay() || 7));\n  // Get first day of year\n  const yearStart = new Date(Date.UTC(d.getUTCFullYear(), 0, 1));\n  // Calculate full weeks to nearest Thursday\n  const weekNumber = Math.ceil(((d.getTime() - yearStart.getTime()) / 86400000 + 1) / 7);\n  return `${d.getUTCFullYear()}-W${String(weekNumber).padStart(2, '0')}`;\n}\n\ninterface ParticipantData {\n  uniqueEmails: Set<string>;\n  stats: Map<string, { meetingCount: number; totalMinutes: number }>;\n}\n\nfunction aggregateParticipants(transcripts: Transcript[]): ParticipantData {\n  const uniqueEmails = new Set<string>();\n  const stats = new Map<string, { meetingCount: number; totalMinutes: number }>();\n\n  for (const t of transcripts) {\n    const participants = t.participants ?? [];\n    const seenInMeeting = new Set<string>();\n\n    for (const email of participants) {\n      const normalizedEmail = email.toLowerCase();\n\n      // Track unique participants\n      uniqueEmails.add(normalizedEmail);\n\n      // Avoid counting same participant twice in one meeting\n      if (seenInMeeting.has(normalizedEmail)) continue;\n      seenInMeeting.add(normalizedEmail);\n\n      // Update stats\n      const existing = stats.get(normalizedEmail) ?? { meetingCount: 0, totalMinutes: 0 };\n      existing.meetingCount++;\n      existing.totalMinutes += t.duration ?? 0;\n      stats.set(normalizedEmail, existing);\n    }\n  }\n\n  return { uniqueEmails, stats };\n}\n\nfunction calculateAverageParticipants(transcripts: Transcript[]): number {\n  if (transcripts.length === 0) return 0;\n\n  let totalParticipants = 0;\n  for (const t of transcripts) {\n    // Deduplicate within each meeting\n    const unique = new Set((t.participants ?? []).map((p) => p.toLowerCase()));\n    totalParticipants += unique.size;\n  }\n\n  return totalParticipants / transcripts.length;\n}\n\nfunction buildTopParticipants(\n  stats: Map<string, { meetingCount: number; totalMinutes: number }>,\n  limit: number\n): ParticipantStats[] {\n  const result: ParticipantStats[] = [];\n\n  for (const [email, data] of stats) {\n    result.push({\n      email,\n      meetingCount: data.meetingCount,\n      totalMinutes: data.totalMinutes,\n    });\n  }\n\n  // Sort by meeting count descending\n  result.sort((a, b) => b.meetingCount - a.meetingCount);\n\n  return result.slice(0, limit);\n}\n\ninterface SpeakerData {\n  uniqueNames: Set<string>;\n  stats: Map<string, { meetingCount: number; totalTalkTimeSeconds: number; meetings: Set<string> }>;\n}\n\nfunction aggregateSpeakers(transcripts: Transcript[], filterSpeakers?: string[]): SpeakerData {\n  const uniqueNames = new Set<string>();\n  const stats = new Map<\n    string,\n    { meetingCount: number; totalTalkTimeSeconds: number; meetings: Set<string> }\n  >();\n\n  const filterSet = filterSpeakers ? new Set(filterSpeakers) : null;\n\n  for (const t of transcripts) {\n    const sentences = t.sentences ?? [];\n\n    for (const sentence of sentences) {\n      const speakerName = sentence.speaker_name;\n\n      // Skip if filtering and speaker not in filter list\n      if (filterSet && !filterSet.has(speakerName)) continue;\n\n      uniqueNames.add(speakerName);\n\n      const existing = stats.get(speakerName) ?? {\n        meetingCount: 0,\n        totalTalkTimeSeconds: 0,\n        meetings: new Set<string>(),\n      };\n\n      // Add talk time\n      const duration = parseSentenceDuration(sentence);\n      existing.totalTalkTimeSeconds += duration;\n\n      // Track unique meetings\n      if (!existing.meetings.has(t.id)) {\n        existing.meetings.add(t.id);\n        existing.meetingCount++;\n      }\n\n      stats.set(speakerName, existing);\n    }\n  }\n\n  return { uniqueNames, stats };\n}\n\nfunction parseSentenceDuration(sentence: Sentence): number {\n  const start = Number.parseFloat(sentence.start_time);\n  const end = Number.parseFloat(sentence.end_time);\n  return Math.max(0, end - start);\n}\n\nfunction buildTopSpeakers(\n  stats: Map<string, { meetingCount: number; totalTalkTimeSeconds: number; meetings: Set<string> }>,\n  limit: number\n): SpeakerInsightStats[] {\n  const result: SpeakerInsightStats[] = [];\n\n  for (const [name, data] of stats) {\n    result.push({\n      name,\n      meetingCount: data.meetingCount,\n      totalTalkTimeSeconds: data.totalTalkTimeSeconds,\n      averageTalkTimeSeconds:\n        data.meetingCount > 0 ? data.totalTalkTimeSeconds / data.meetingCount : 0,\n    });\n  }\n\n  // Sort by total talk time descending\n  result.sort((a, b) => b.totalTalkTimeSeconds - a.totalTalkTimeSeconds);\n\n  return result.slice(0, limit);\n}\n\nfunction findDateRange(transcripts: Transcript[]): {\n  earliestMeeting: string;\n  latestMeeting: string;\n} {\n  let earliest: Date | null = null;\n  let latest: Date | null = null;\n\n  for (const t of transcripts) {\n    const date = parseDate(t.dateString);\n    if (!date) continue;\n\n    if (!earliest || date < earliest) {\n      earliest = date;\n    }\n    if (!latest || date > latest) {\n      latest = date;\n    }\n  }\n\n  return {\n    earliestMeeting: earliest ? formatDateOnly(earliest) : '',\n    latestMeeting: latest ? formatDateOnly(latest) : '',\n  };\n}\n\nfunction parseDate(dateString: string | undefined): Date | null {\n  if (!dateString) return null;\n  const date = new Date(dateString);\n  return Number.isNaN(date.getTime()) ? null : date;\n}\n\nfunction formatDateOnly(date: Date): string {\n  const year = date.getUTCFullYear();\n  const month = String(date.getUTCMonth() + 1).padStart(2, '0');\n  const day = String(date.getUTCDate()).padStart(2, '0');\n  return `${year}-${month}-${day}`;\n}\n","/**\n * Search helper functions for searching transcript content.\n */\n\nimport type { SearchMatch, SearchTranscriptOptions } from '../types/search.js';\nimport type { Sentence, Transcript } from '../types/transcript.js';\n\n/**\n * Escape special regex characters in a string for literal matching.\n */\nfunction escapeRegex(str: string): string {\n  return str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\n/**\n * Check if a sentence passes the speaker filter.\n */\nfunction matchesSpeaker(sentence: Sentence, speakerSet: Set<string> | null): boolean {\n  if (!speakerSet) return true;\n  return speakerSet.has(sentence.speaker_name.toLowerCase());\n}\n\n/**\n * Check if a sentence passes the AI filter requirements.\n */\nfunction matchesAIFilters(\n  sentence: Sentence,\n  filterQuestions: boolean,\n  filterTasks: boolean\n): boolean {\n  if (!filterQuestions && !filterTasks) return true;\n\n  const hasQuestion = Boolean(sentence.ai_filters?.question);\n  const hasTask = Boolean(sentence.ai_filters?.task);\n\n  // If both filters are set, match either (OR logic)\n  if (filterQuestions && filterTasks) {\n    return hasQuestion || hasTask;\n  }\n\n  if (filterQuestions) return hasQuestion;\n  if (filterTasks) return hasTask;\n\n  return true;\n}\n\n/**\n * Extract context sentences before and after a given index.\n */\nfunction extractContext(\n  sentences: Sentence[],\n  index: number,\n  contextLines: number\n): SearchMatch['context'] {\n  const beforeStart = Math.max(0, index - contextLines);\n  const afterEnd = Math.min(sentences.length, index + contextLines + 1);\n\n  return {\n    before: sentences.slice(beforeStart, index).map((s) => ({\n      speakerName: s.speaker_name,\n      text: s.text,\n    })),\n    after: sentences.slice(index + 1, afterEnd).map((s) => ({\n      speakerName: s.speaker_name,\n      text: s.text,\n    })),\n  };\n}\n\n/**\n * Convert a Sentence to the match result format.\n */\nfunction sentenceToMatch(\n  sentence: Sentence,\n  transcript: Transcript,\n  context: SearchMatch['context']\n): SearchMatch {\n  return {\n    transcriptId: transcript.id,\n    transcriptTitle: transcript.title,\n    transcriptDate: transcript.dateString,\n    transcriptUrl: transcript.transcript_url,\n    sentence: {\n      index: sentence.index,\n      text: sentence.text,\n      speakerName: sentence.speaker_name,\n      startTime: Number.parseFloat(sentence.start_time),\n      endTime: Number.parseFloat(sentence.end_time),\n      isQuestion: Boolean(sentence.ai_filters?.question),\n      isTask: Boolean(sentence.ai_filters?.task),\n    },\n    context,\n  };\n}\n\n/**\n * Search a single transcript for matching sentences.\n *\n * This is a pure function with no API calls, making it fully testable.\n * It searches the transcript's sentences for text matching the query,\n * optionally filtering by speaker, questions, or tasks.\n *\n * @param transcript - The transcript to search\n * @param options - Search options including query, filters, and context settings\n * @returns Array of matches with context\n *\n * @example\n * ```typescript\n * import { searchTranscript } from 'fireflies-api';\n *\n * const matches = searchTranscript(transcript, {\n *   query: 'budget',\n *   speakers: ['Alice'],\n *   filterQuestions: true,\n *   contextLines: 2,\n * });\n *\n * for (const match of matches) {\n *   console.log(`${match.sentence.speakerName}: ${match.sentence.text}`);\n * }\n * ```\n */\nexport function searchTranscript(\n  transcript: Transcript,\n  options: SearchTranscriptOptions\n): SearchMatch[] {\n  const {\n    query,\n    caseSensitive = false,\n    speakers,\n    filterQuestions = false,\n    filterTasks = false,\n    contextLines = 1,\n  } = options;\n\n  // Empty query matches nothing\n  if (!query || query.trim() === '') {\n    return [];\n  }\n\n  const sentences = transcript.sentences ?? [];\n  if (sentences.length === 0) {\n    return [];\n  }\n\n  // Build regex for query matching\n  const escapedQuery = escapeRegex(query);\n  const regex = new RegExp(escapedQuery, caseSensitive ? '' : 'i');\n\n  // Normalize speakers list for case-insensitive comparison\n  const speakerSet = speakers ? new Set(speakers.map((s) => s.toLowerCase())) : null;\n\n  const matches: SearchMatch[] = [];\n\n  for (let i = 0; i < sentences.length; i++) {\n    const sentence = sentences[i];\n    if (!sentence) continue;\n\n    // Check text match\n    if (!regex.test(sentence.text)) continue;\n\n    // Check speaker filter\n    if (!matchesSpeaker(sentence, speakerSet)) continue;\n\n    // Check AI filter requirements\n    if (!matchesAIFilters(sentence, filterQuestions, filterTasks)) continue;\n\n    // Build match result\n    const context = extractContext(sentences, i, contextLines);\n    matches.push(sentenceToMatch(sentence, transcript, context));\n  }\n\n  return matches;\n}\n","import { aggregateActionItems } from '../../helpers/action-items-format.js';\nimport { batch } from '../../helpers/batch.js';\nimport { extractDomain, hasExternalParticipants } from '../../helpers/domain-utils.js';\nimport {\n  createZipArchive,\n  type ExportFormat,\n  exportTranscript,\n  generateExportFilename,\n} from '../../helpers/export-formats.js';\nimport { analyzeMeetings } from '../../helpers/meeting-insights.js';\nimport { paginate } from '../../helpers/pagination.js';\nimport { searchTranscript } from '../../helpers/search.js';\nimport type {\n  AggregatedActionItemsResult,\n  ExportActionItemsParams,\n} from '../../types/action-items.js';\nimport type { BulkExportParams, BulkExportResult, ExportedFile } from '../../types/bulk-export.js';\nimport type { MeetingInsights } from '../../types/meeting-insights.js';\nimport type {\n  TranscriptGetParams,\n  TranscriptsInsightsParams,\n  TranscriptsListParams,\n} from '../../types/params.js';\nimport type { SearchParams, SearchResults } from '../../types/search.js';\nimport type {\n  AppsPreview,\n  Channel,\n  MeetingAnalytics,\n  MeetingAttendance,\n  MeetingAttendee,\n  MeetingInfo,\n  Sentence,\n  Speaker,\n  Summary,\n  Transcript,\n  User,\n} from '../../types/transcript.js';\nimport type { GraphQLClient } from '../client.js';\n\n/**\n * GraphQL fragment for base transcript fields (excludes sentences and summary).\n */\nconst TRANSCRIPT_BASE_FIELDS = `\n  id\n  title\n  organizer_email\n  host_email\n  user {\n    user_id\n    email\n    name\n  }\n  speakers {\n    id\n    name\n  }\n  transcript_url\n  participants\n  meeting_attendees {\n    displayName\n    email\n    phoneNumber\n    name\n    location\n  }\n  meeting_attendance {\n    name\n    join_time\n    leave_time\n  }\n  fireflies_users\n  workspace_users\n  duration\n  dateString\n  date\n  audio_url\n  video_url\n  calendar_id\n  meeting_info {\n    fred_joined\n    silent_meeting\n    summary_status\n  }\n  cal_id\n  calendar_type\n  apps_preview {\n    outputs {\n      transcript_id\n      user_id\n      app_id\n      created_at\n      title\n      prompt\n      response\n    }\n  }\n  meeting_link\n  analytics {\n    sentiments {\n      negative_pct\n      neutral_pct\n      positive_pct\n    }\n  }\n  channels {\n    id\n    title\n    is_private\n    created_at\n    updated_at\n    created_by\n    members {\n      user_id\n      email\n      name\n    }\n  }\n`;\n\n/**\n * GraphQL fragment for sentences field.\n */\nconst SENTENCES_FIELDS = `\n  sentences {\n    index\n    text\n    raw_text\n    start_time\n    end_time\n    speaker_id\n    speaker_name\n    ai_filters {\n      task\n      pricing\n      metric\n      question\n      date_and_time\n      text_cleanup\n      sentiment\n    }\n  }\n`;\n\n/**\n * GraphQL fragment for summary field.\n */\nconst SUMMARY_FIELDS = `\n  summary {\n    action_items\n    keywords\n    outline\n    overview\n    shorthand_bullet\n    notes\n    gist\n    bullet_gist\n    short_summary\n    short_overview\n    meeting_type\n    topics_discussed\n    transcript_chapters\n    extended_sections {\n      title\n      content\n    }\n  }\n`;\n\n/**\n * Build transcript fields based on options.\n */\nfunction buildTranscriptFields(params?: TranscriptGetParams): string {\n  const includeSentences = params?.includeSentences !== false;\n  const includeSummary = params?.includeSummary !== false;\n\n  let fields = TRANSCRIPT_BASE_FIELDS;\n  if (includeSentences) {\n    fields += SENTENCES_FIELDS;\n  }\n  if (includeSummary) {\n    fields += SUMMARY_FIELDS;\n  }\n  return fields;\n}\n\n/**\n * GraphQL fragment for transcript list fields (lighter weight).\n */\nconst TRANSCRIPT_LIST_FIELDS = `\n  id\n  title\n  organizer_email\n  transcript_url\n  participants\n  duration\n  dateString\n  date\n  video_url\n  meeting_info {\n    fred_joined\n    silent_meeting\n    summary_status\n  }\n`;\n\n/**\n * Build list fields based on options.\n * By default returns lightweight fields.\n * When includeSentences or includeSummary is true, uses full base fields + requested content.\n */\nfunction buildListFields(params?: TranscriptsListParams): string {\n  const includeSentences = params?.includeSentences === true;\n  const includeSummary = params?.includeSummary === true;\n\n  // If neither content option is requested, use lightweight fields\n  if (!includeSentences && !includeSummary) {\n    return TRANSCRIPT_LIST_FIELDS;\n  }\n\n  // Use full base fields when requesting content\n  let fields = TRANSCRIPT_BASE_FIELDS;\n\n  if (includeSentences) {\n    fields += SENTENCES_FIELDS;\n  }\n  if (includeSummary) {\n    fields += SUMMARY_FIELDS;\n  }\n\n  return fields;\n}\n\n/**\n * API for transcript operations.\n */\nexport interface TranscriptsAPI {\n  /**\n   * Get a single transcript by ID.\n   *\n   * @param id - Transcript ID\n   * @param params - Optional parameters to exclude heavy fields\n   * @returns Transcript (fields depend on params)\n   * @throws NotFoundError if transcript doesn't exist\n   *\n   * @example\n   * ```typescript\n   * // Full transcript with all fields\n   * const full = await client.transcripts.get('id');\n   *\n   * // Metadata only (faster, smaller response)\n   * const meta = await client.transcripts.get('id', {\n   *   includeSentences: false,\n   *   includeSummary: false,\n   * });\n   * ```\n   */\n  get(id: string, params?: TranscriptGetParams): Promise<Transcript>;\n\n  /**\n   * List transcripts with optional filtering.\n   *\n   * @param params - Filter and pagination options\n   * @returns Array of transcripts (max 50 per call)\n   */\n  list(params?: TranscriptsListParams): Promise<Transcript[]>;\n\n  /**\n   * Get just the summary for a transcript.\n   * Lighter weight than fetching the full transcript.\n   *\n   * @param id - Transcript ID\n   * @returns Summary object\n   */\n  getSummary(id: string): Promise<Summary | null>;\n\n  /**\n   * Iterate through all transcripts matching the filter.\n   * Automatically handles pagination.\n   *\n   * @param params - Filter options (skip and limit are ignored)\n   * @returns Async iterable of transcripts\n   *\n   * @example\n   * ```typescript\n   * for await (const transcript of client.transcripts.listAll({ mine: true })) {\n   *   console.log(transcript.title);\n   * }\n   * ```\n   */\n  listAll(params?: Omit<TranscriptsListParams, 'skip' | 'limit'>): AsyncIterable<Transcript>;\n\n  /**\n   * Search across transcripts for matching sentences.\n   *\n   * This method first queries for transcripts matching the keyword,\n   * then fetches each transcript with sentences and searches locally\n   * for detailed matches with speaker filtering, question/task filtering,\n   * and context extraction.\n   *\n   * @param query - The search query string\n   * @param params - Search options including filters and context settings\n   * @returns Search results with matches grouped by transcript\n   *\n   * @example\n   * ```typescript\n   * const results = await client.transcripts.search('budget', {\n   *   speakers: ['Alice'],\n   *   filterQuestions: true,\n   *   fromDate: '2024-01-01',\n   *   contextLines: 2,\n   * });\n   *\n   * console.log(`Found ${results.totalMatches} matches`);\n   * for (const match of results.matches) {\n   *   console.log(`${match.sentence.speakerName}: ${match.sentence.text}`);\n   * }\n   * ```\n   */\n  search(query: string, params?: SearchParams): Promise<SearchResults>;\n\n  /**\n   * Compute aggregate meeting insights across transcripts.\n   *\n   * Fetches transcripts matching the filter criteria and computes\n   * aggregate statistics including duration totals, day of week\n   * distribution, participant counts, and speaker talk times.\n   *\n   * @param params - Filtering and analysis options\n   * @returns Aggregate meeting insights\n   *\n   * @example\n   * ```typescript\n   * const insights = await client.transcripts.insights({\n   *   fromDate: '2024-01-01',\n   *   toDate: '2024-01-31',\n   *   mine: true,\n   *   groupBy: 'week',\n   * });\n   *\n   * console.log(`${insights.totalMeetings} meetings`);\n   * console.log(`${insights.totalDurationMinutes} total minutes`);\n   * console.log(`Busiest day: ${getBusiestDay(insights.byDayOfWeek)}`);\n   * ```\n   */\n  insights(params?: TranscriptsInsightsParams): Promise<MeetingInsights>;\n\n  /**\n   * Export action items from multiple transcripts.\n   *\n   * Fetches transcripts matching the filter criteria, extracts action\n   * items from each, and aggregates them with source metadata.\n   *\n   * @param params - Filtering options for transcripts and action items\n   * @returns Aggregated action items with statistics\n   *\n   * @example\n   * ```typescript\n   * const result = await client.transcripts.exportActionItems({\n   *   fromDate: '2024-01-01',\n   *   mine: true,\n   *   filterOptions: { assignedOnly: true },\n   * });\n   *\n   * console.log(`${result.totalItems} action items from ${result.transcriptsProcessed} meetings`);\n   * for (const item of result.items) {\n   *   console.log(`${item.text} (${item.transcriptTitle})`);\n   * }\n   * ```\n   */\n  exportActionItems(params?: ExportActionItemsParams): Promise<AggregatedActionItemsResult>;\n\n  /**\n   * Export multiple transcripts to various formats.\n   *\n   * Fetches transcripts matching the filter criteria, converts each to the\n   * specified format, and optionally packages them as a zip archive.\n   *\n   * @param params - Export options including format, filters, and output settings\n   * @returns Export result with files and optional zip buffer\n   *\n   * @example\n   * ```typescript\n   * // Export last week's meetings as markdown\n   * const result = await client.transcripts.bulkExport({\n   *   fromDate: '2024-01-08',\n   *   toDate: '2024-01-15',\n   *   format: 'markdown',\n   *   onProgress: (done, total) => console.log(`${done}/${total}`),\n   * });\n   *\n   * // Write files to disk\n   * for (const file of result.files) {\n   *   await writeFile(`./exports/${file.filename}`, file.content);\n   * }\n   *\n   * // Or get as zip\n   * const zipResult = await client.transcripts.bulkExport({\n   *   fromDate: '2024-01-08',\n   *   format: 'csv',\n   *   asZip: true,\n   * });\n   * await writeFile('exports.zip', zipResult.zip);\n   * ```\n   */\n  bulkExport(params?: BulkExportParams): Promise<BulkExportResult>;\n}\n\n/**\n * Create the transcripts API bound to a GraphQL client.\n */\nexport function createTranscriptsAPI(client: GraphQLClient): TranscriptsAPI {\n  return {\n    async get(id: string, params?: TranscriptGetParams): Promise<Transcript> {\n      const fields = buildTranscriptFields(params);\n      const query = `\n        query GetTranscript($id: String!) {\n          transcript(id: $id) {\n            ${fields}\n          }\n        }\n      `;\n\n      const data = await client.execute<{ transcript: TranscriptResponse }>(query, { id });\n\n      return normalizeTranscript(data.transcript);\n    },\n\n    async list(params?: TranscriptsListParams): Promise<Transcript[]> {\n      const fields = buildListFields(params);\n      const query = `\n        query ListTranscripts(\n          $keyword: String\n          $scope: String\n          $organizers: [String!]\n          $participants: [String!]\n          $user_id: String\n          $mine: Boolean\n          $channel_id: String\n          $fromDate: DateTime\n          $toDate: DateTime\n          $limit: Int\n          $skip: Int\n          $title: String\n          $host_email: String\n          $organizer_email: String\n          $participant_email: String\n          $date: Float\n        ) {\n          transcripts(\n            keyword: $keyword\n            scope: $scope\n            organizers: $organizers\n            participants: $participants\n            user_id: $user_id\n            mine: $mine\n            channel_id: $channel_id\n            fromDate: $fromDate\n            toDate: $toDate\n            limit: $limit\n            skip: $skip\n            title: $title\n            host_email: $host_email\n            organizer_email: $organizer_email\n            participant_email: $participant_email\n            date: $date\n          ) {\n            ${fields}\n          }\n        }\n      `;\n\n      // Get internal domain if filtering for external meetings\n      let internalDomain: string | undefined;\n      if (params?.external) {\n        const userQuery = 'query { user { email } }';\n        const userData = await client.execute<{ user: { email: string } }>(userQuery);\n        internalDomain = extractDomain(userData.user.email);\n      }\n\n      const variables = buildListVariables(params);\n      const data = await client.execute<{ transcripts: TranscriptResponse[] }>(query, variables);\n\n      let results = data.transcripts.map(normalizeTranscript);\n\n      // Client-side filter for external participants\n      if (internalDomain) {\n        results = results.filter((t) => hasExternalParticipants(t.participants, internalDomain));\n      }\n\n      return results;\n    },\n\n    async getSummary(id: string): Promise<Summary | null> {\n      const query = `\n        query GetTranscriptSummary($id: String!) {\n          transcript(id: $id) {\n            summary {\n              action_items\n              keywords\n              outline\n              overview\n              shorthand_bullet\n              notes\n              gist\n              bullet_gist\n              short_summary\n              short_overview\n              meeting_type\n              topics_discussed\n              transcript_chapters\n              extended_sections {\n                title\n                content\n              }\n            }\n          }\n        }\n      `;\n\n      const data = await client.execute<{\n        transcript: { summary: Summary | null };\n      }>(query, { id });\n\n      return data.transcript.summary;\n    },\n\n    listAll(params?: Omit<TranscriptsListParams, 'skip' | 'limit'>): AsyncIterable<Transcript> {\n      return paginate((skip, limit) => this.list({ ...params, skip, limit }), 50);\n    },\n\n    async search(query: string, params: SearchParams = {}): Promise<SearchResults> {\n      const {\n        caseSensitive = false,\n        scope = 'sentences',\n        speakers,\n        filterQuestions,\n        filterTasks,\n        contextLines = 1,\n        limit,\n        ...listParams\n      } = params;\n\n      // Fetch transcripts with sentences in bulk (avoids N+1 queries)\n      const transcripts: Transcript[] = [];\n      for await (const t of this.listAll({\n        ...listParams,\n        keyword: query,\n        scope,\n        includeSentences: true,\n      })) {\n        transcripts.push(t);\n        if (limit && transcripts.length >= limit) break;\n      }\n\n      // Search locally within fetched transcripts\n      const allMatches: SearchResults['matches'] = [];\n      let transcriptsWithMatches = 0;\n\n      for (const t of transcripts) {\n        const matches = searchTranscript(t, {\n          query,\n          caseSensitive,\n          speakers,\n          filterQuestions,\n          filterTasks,\n          contextLines,\n        });\n\n        if (matches.length > 0) {\n          transcriptsWithMatches++;\n          allMatches.push(...matches);\n        }\n      }\n\n      return {\n        query,\n        options: params,\n        totalMatches: allMatches.length,\n        transcriptsSearched: transcripts.length,\n        transcriptsWithMatches,\n        matches: allMatches,\n      };\n    },\n\n    async insights(params: TranscriptsInsightsParams = {}): Promise<MeetingInsights> {\n      const {\n        fromDate,\n        toDate,\n        mine,\n        organizers,\n        participants,\n        user_id,\n        channel_id,\n        limit,\n        external,\n        speakers,\n        groupBy,\n        topSpeakersCount,\n        topParticipantsCount,\n      } = params;\n\n      // Get internal domain if filtering for external meetings\n      let internalDomain: string | undefined;\n      if (external) {\n        const userQuery = 'query { user { email } }';\n        const userData = await client.execute<{ user: { email: string } }>(userQuery);\n        internalDomain = extractDomain(userData.user.email);\n      }\n\n      // Fetch transcripts with sentences in bulk (needed for speaker analysis)\n      const transcripts: Transcript[] = [];\n      for await (const t of this.listAll({\n        fromDate,\n        toDate,\n        mine,\n        organizers,\n        participants,\n        user_id,\n        channel_id,\n        includeSentences: true,\n      })) {\n        // Skip if filtering for external and no external participants\n        if (internalDomain && !hasExternalParticipants(t.participants, internalDomain)) {\n          continue;\n        }\n\n        transcripts.push(t);\n\n        if (limit && transcripts.length >= limit) break;\n      }\n\n      // Analyze with the helper\n      return analyzeMeetings(transcripts, {\n        speakers,\n        groupBy,\n        topSpeakersCount,\n        topParticipantsCount,\n      });\n    },\n\n    async exportActionItems(\n      params: ExportActionItemsParams = {}\n    ): Promise<AggregatedActionItemsResult> {\n      const { fromDate, toDate, mine, organizers, participants, limit, filterOptions } = params;\n\n      // Fetch transcripts with summary in bulk (needed for action items)\n      const transcripts: Transcript[] = [];\n      for await (const t of this.listAll({\n        fromDate,\n        toDate,\n        mine,\n        organizers,\n        participants,\n        includeSummary: true,\n      })) {\n        transcripts.push(t);\n\n        if (limit && transcripts.length >= limit) break;\n      }\n\n      // Aggregate action items using the helper\n      return aggregateActionItems(transcripts, {}, filterOptions);\n    },\n\n    async bulkExport(params: BulkExportParams = {}): Promise<BulkExportResult> {\n      const { format = 'markdown', asZip = false, onProgress } = params;\n\n      // 1. Collect transcript IDs to export\n      const transcriptIds = await collectTranscriptIds(client, this, params);\n\n      // 2. Fetch and convert each transcript\n      const files = await convertTranscripts(this, transcriptIds, format, onProgress);\n\n      // 3. Package as zip if requested\n      const zip = asZip ? await createZipArchive(files) : undefined;\n\n      return { files, zip, format, totalExported: files.length };\n    },\n  };\n}\n\n/**\n * Raw transcript response from GraphQL (may have nulls).\n */\ntype TranscriptResponse = {\n  id: string;\n  title: string | null;\n  organizer_email: string | null;\n  host_email?: string | null;\n  user?: User | null;\n  speakers?: Speaker[] | null;\n  transcript_url: string | null;\n  participants?: string[] | null;\n  meeting_attendees?: MeetingAttendee[] | null;\n  meeting_attendance?: MeetingAttendance[] | null;\n  fireflies_users?: string[] | null;\n  workspace_users?: string[] | null;\n  duration: number | null;\n  dateString: string | null;\n  date: number | null;\n  audio_url?: string | null;\n  video_url?: string | null;\n  sentences?: Sentence[] | null;\n  calendar_id?: string | null;\n  summary?: Summary | null;\n  meeting_info?: MeetingInfo | null;\n  cal_id?: string | null;\n  calendar_type?: string | null;\n  apps_preview?: AppsPreview | null;\n  meeting_link?: string | null;\n  analytics?: MeetingAnalytics | null;\n  channels?: Channel[] | null;\n};\n\n/** Convert null to undefined for optional fields */\nfunction orUndefined<T>(value: T | null | undefined): T | undefined {\n  return value ?? undefined;\n}\n\n/** Convert null to empty array for required array fields */\nfunction orEmptyArray<T>(value: T[] | null | undefined): T[] {\n  return value ?? [];\n}\n\n/** Normalize required string/number fields */\nfunction normalizeRequiredFields(raw: TranscriptResponse) {\n  return {\n    id: raw.id,\n    title: raw.title ?? '',\n    organizer_email: raw.organizer_email ?? '',\n    transcript_url: raw.transcript_url ?? '',\n    duration: raw.duration ?? 0,\n    dateString: raw.dateString ?? '',\n    date: raw.date ?? 0,\n  };\n}\n\n/** Normalize array fields */\nfunction normalizeArrayFields(raw: TranscriptResponse) {\n  return {\n    speakers: orEmptyArray(raw.speakers),\n    participants: orEmptyArray(raw.participants),\n    meeting_attendees: orEmptyArray(raw.meeting_attendees),\n    meeting_attendance: orEmptyArray(raw.meeting_attendance),\n    fireflies_users: orEmptyArray(raw.fireflies_users),\n    workspace_users: orEmptyArray(raw.workspace_users),\n    sentences: orEmptyArray(raw.sentences),\n    channels: orEmptyArray(raw.channels),\n  };\n}\n\n/** Normalize optional fields */\nfunction normalizeOptionalFields(raw: TranscriptResponse) {\n  return {\n    host_email: orUndefined(raw.host_email),\n    user: orUndefined(raw.user),\n    audio_url: orUndefined(raw.audio_url),\n    video_url: orUndefined(raw.video_url),\n    calendar_id: orUndefined(raw.calendar_id),\n    summary: orUndefined(raw.summary),\n    meeting_info: orUndefined(raw.meeting_info),\n    cal_id: orUndefined(raw.cal_id),\n    calendar_type: orUndefined(raw.calendar_type),\n    apps_preview: orUndefined(raw.apps_preview),\n    meeting_link: orUndefined(raw.meeting_link),\n    analytics: orUndefined(raw.analytics),\n  };\n}\n\n/**\n * Normalize a transcript response to ensure consistent types.\n */\nfunction normalizeTranscript(raw: TranscriptResponse): Transcript {\n  return {\n    ...normalizeRequiredFields(raw),\n    ...normalizeArrayFields(raw),\n    ...normalizeOptionalFields(raw),\n  };\n}\n\n/**\n * Build GraphQL variables from list params.\n */\nfunction buildListVariables(params?: TranscriptsListParams): Record<string, unknown> {\n  if (!params) {\n    return { limit: 50 };\n  }\n\n  return {\n    keyword: params.keyword,\n    scope: params.scope,\n    organizers: params.organizers,\n    participants: params.participants,\n    user_id: params.user_id,\n    mine: params.mine,\n    channel_id: params.channel_id,\n    fromDate: params.fromDate,\n    toDate: params.toDate,\n    limit: params.limit ?? 50,\n    skip: params.skip,\n    title: params.title,\n    host_email: params.host_email,\n    organizer_email: params.organizer_email,\n    participant_email: params.participant_email,\n    date: params.date,\n  };\n}\n\n// --- Bulk export helpers ---\n\n/**\n * Collect transcript IDs based on export params.\n * Either uses provided IDs or queries for matching transcripts.\n */\nasync function collectTranscriptIds(\n  client: GraphQLClient,\n  api: TranscriptsAPI,\n  params: BulkExportParams\n): Promise<string[]> {\n  const { ids, fromDate, toDate, mine, organizers, participants, external, limit } = params;\n\n  // If explicit IDs provided, use them directly\n  if (ids?.length) {\n    return ids;\n  }\n\n  // Get internal domain for external filtering\n  let internalDomain: string | undefined;\n  if (external) {\n    const userQuery = 'query { user { email } }';\n    const userData = await client.execute<{ user: { email: string } }>(userQuery);\n    internalDomain = extractDomain(userData.user.email);\n  }\n\n  // Collect matching transcript IDs\n  const result: string[] = [];\n  for await (const t of api.listAll({ fromDate, toDate, mine, organizers, participants })) {\n    // Skip if filtering for external and no external participants\n    if (internalDomain && !hasExternalParticipants(t.participants, internalDomain)) {\n      continue;\n    }\n    result.push(t.id);\n    if (limit && result.length >= limit) break;\n  }\n\n  return result;\n}\n\n/**\n * Fetch and convert transcripts to the specified format.\n */\nasync function convertTranscripts(\n  api: TranscriptsAPI,\n  transcriptIds: string[],\n  format: ExportFormat,\n  onProgress?: (completed: number, total: number) => void\n): Promise<ExportedFile[]> {\n  const files: ExportedFile[] = [];\n  const extension = format === 'markdown' ? 'md' : format;\n  let completed = 0;\n  const total = transcriptIds.length;\n\n  for await (const result of batch(\n    transcriptIds,\n    async (id) => {\n      const transcript = await api.get(id);\n      const content = await exportTranscript(transcript, format);\n      const filename = generateExportFilename(transcript, extension);\n      return { id, title: transcript.title, filename, content };\n    },\n    { delayMs: 100 }\n  )) {\n    if (!result.error) {\n      files.push(result.result);\n    }\n    completed++;\n    onProgress?.(completed, total);\n  }\n\n  return files;\n}\n","import type { UserProfile } from '../../types/user.js';\nimport type { GraphQLClient } from '../client.js';\n\nconst USER_FIELDS = `\n  user_id\n  email\n  name\n  num_transcripts\n  recent_meeting\n  recent_transcript\n  minutes_consumed\n  is_admin\n  integrations\n  user_groups {\n    id\n    name\n    handle\n    members {\n      user_id\n      email\n    }\n  }\n`;\n\n/**\n * API for user operations.\n */\nexport interface UsersAPI {\n  /**\n   * Get current user (API key owner).\n   *\n   * @returns Current user profile\n   */\n  me(): Promise<UserProfile>;\n\n  /**\n   * Get user by ID.\n   *\n   * @param id - User ID\n   * @returns User profile\n   */\n  get(id: string): Promise<UserProfile>;\n\n  /**\n   * List all team users.\n   *\n   * @returns Array of user profiles\n   */\n  list(): Promise<UserProfile[]>;\n}\n\n/**\n * Create the users API bound to a GraphQL client.\n */\nexport function createUsersAPI(client: GraphQLClient): UsersAPI {\n  return {\n    async me(): Promise<UserProfile> {\n      const query = `query { user { ${USER_FIELDS} } }`;\n      const data = await client.execute<{ user: UserProfile }>(query);\n      return data.user;\n    },\n\n    async get(id: string): Promise<UserProfile> {\n      const query = `\n        query User($userId: String!) {\n          user(id: $userId) { ${USER_FIELDS} }\n        }\n      `;\n      const data = await client.execute<{ user: UserProfile }>(query, { userId: id });\n      return data.user;\n    },\n\n    async list(): Promise<UserProfile[]> {\n      const query = `query Users { users { ${USER_FIELDS} } }`;\n      const data = await client.execute<{ users: UserProfile[] }>(query);\n      return data.users;\n    },\n  };\n}\n","import { io, type Socket } from 'socket.io-client';\nimport { AuthenticationError, ConnectionError, TimeoutError } from '../errors.js';\nimport type {\n  RawChunkPayload,\n  RealtimeConfig,\n  ServerToClientEvents,\n  TranscriptionChunk,\n} from './types.js';\n\ntype RealtimeSocket = Socket<ServerToClientEvents, Record<string, never>>;\n\n// Defaults from working fireflies-whiteboard implementation\nconst DEFAULT_WS_URL = 'wss://api.fireflies.ai';\nconst DEFAULT_WS_PATH = '/ws/realtime';\nconst DEFAULT_TIMEOUT = 20000;\nconst DEFAULT_CHUNK_TIMEOUT = 20000;\nconst DEFAULT_RECONNECT_DELAY = 5000; // Start at 5s (proven value)\nconst DEFAULT_MAX_RECONNECT_DELAY = 60000; // Max 60s (proven value)\nconst DEFAULT_MAX_RECONNECT_ATTEMPTS = 10;\n\n/**\n * Internal config with all defaults filled in.\n */\ntype ResolvedConfig = Required<RealtimeConfig>;\n\n/**\n * Low-level realtime connection client.\n * Handles Socket.IO connection lifecycle.\n */\nexport class RealtimeConnection {\n  private socket: RealtimeSocket | null = null;\n  private readonly config: ResolvedConfig;\n\n  constructor(config: RealtimeConfig) {\n    this.config = {\n      wsUrl: DEFAULT_WS_URL,\n      wsPath: DEFAULT_WS_PATH,\n      timeout: DEFAULT_TIMEOUT,\n      chunkTimeout: DEFAULT_CHUNK_TIMEOUT,\n      reconnect: true,\n      maxReconnectAttempts: DEFAULT_MAX_RECONNECT_ATTEMPTS,\n      reconnectDelay: DEFAULT_RECONNECT_DELAY,\n      maxReconnectDelay: DEFAULT_MAX_RECONNECT_DELAY,\n      ...config,\n    };\n  }\n\n  /**\n   * Establish connection and wait for auth success.\n   */\n  async connect(): Promise<void> {\n    if (this.socket?.connected) {\n      return;\n    }\n\n    const socket = io(this.config.wsUrl, {\n      path: this.config.wsPath,\n      auth: {\n        token: `Bearer ${this.config.apiKey}`,\n        transcriptId: this.config.transcriptId,\n      },\n      // Force WebSocket transport (proven more reliable than polling)\n      transports: ['websocket'],\n      reconnection: this.config.reconnect,\n      reconnectionDelay: this.config.reconnectDelay,\n      reconnectionDelayMax: this.config.maxReconnectDelay,\n      reconnectionAttempts: this.config.maxReconnectAttempts,\n      // Exponential backoff factor (default 2x matches our fireflies-whiteboard pattern)\n      randomizationFactor: 0.5,\n      timeout: this.config.timeout,\n      autoConnect: false,\n    });\n\n    this.socket = socket;\n\n    return new Promise((resolve, reject) => {\n      const timeoutId = setTimeout(() => {\n        socket.disconnect();\n        reject(new TimeoutError(`Realtime connection timed out after ${this.config.timeout}ms`));\n      }, this.config.timeout);\n\n      const cleanup = () => clearTimeout(timeoutId);\n\n      socket.once('auth.success', () => {\n        cleanup();\n        resolve();\n      });\n\n      // Handle explicit auth failure event\n      socket.once('auth.failed', (data) => {\n        cleanup();\n        socket.disconnect();\n        reject(new AuthenticationError(`Realtime auth failed: ${formatData(data)}`));\n      });\n\n      // Handle connection errors\n      socket.once('connection.error', (data) => {\n        cleanup();\n        socket.disconnect();\n        reject(new ConnectionError(`Realtime connection error: ${formatData(data)}`));\n      });\n\n      socket.once('connect_error', (error) => {\n        cleanup();\n        socket.disconnect();\n\n        // Parse auth errors from generic connect_error\n        const message = error.message || 'Connection failed';\n        if (\n          message.includes('auth') ||\n          message.includes('401') ||\n          message.includes('unauthorized')\n        ) {\n          reject(new AuthenticationError(`Realtime auth failed: ${message}`));\n        } else {\n          reject(\n            new ConnectionError(`Realtime connection failed: ${message}`, {\n              cause: error,\n            })\n          );\n        }\n      });\n\n      socket.connect();\n    });\n  }\n\n  /**\n   * Register a chunk handler.\n   * Handles both { payload: {...} } and direct payload shapes.\n   */\n  onChunk(handler: (chunk: TranscriptionChunk) => void): void {\n    this.socket?.on('transcription.broadcast', (data: RawChunkPayload | TranscriptionChunk) => {\n      // Handle both payload shapes (learned from fireflies-whiteboard)\n      const chunk = 'payload' in data ? data.payload : data;\n      handler(chunk);\n    });\n  }\n\n  /**\n   * Register a disconnect handler.\n   */\n  onDisconnect(handler: (reason: string) => void): void {\n    this.socket?.on('disconnect', handler);\n  }\n\n  /**\n   * Register a reconnect handler.\n   */\n  onReconnect(handler: () => void): void {\n    this.socket?.io.on('reconnect', handler);\n  }\n\n  /**\n   * Register a reconnect attempt handler.\n   */\n  onReconnectAttempt(handler: (attempt: number) => void): void {\n    this.socket?.io.on('reconnect_attempt', handler);\n  }\n\n  /**\n   * Register an error handler.\n   */\n  onError(handler: (error: Error) => void): void {\n    this.socket?.on('connect_error', handler);\n  }\n\n  /**\n   * Disconnect and cleanup.\n   */\n  disconnect(): void {\n    if (this.socket) {\n      this.socket.disconnect();\n      this.socket = null;\n    }\n  }\n\n  get connected(): boolean {\n    return this.socket?.connected ?? false;\n  }\n}\n\n/**\n * Format unknown data for error messages.\n */\nfunction formatData(data: unknown): string {\n  if (data === undefined || data === null) {\n    return String(data);\n  }\n  try {\n    return JSON.stringify(data);\n  } catch {\n    return String(data);\n  }\n}\n","import { StreamClosedError } from '../errors.js';\nimport { RealtimeConnection } from './client.js';\nimport type { RealtimeConfig, RealtimeEvents, TranscriptionChunk } from './types.js';\n\ntype EventHandler<K extends keyof RealtimeEvents> = RealtimeEvents[K];\n\n// Generic event handler type\ntype AnyEventHandler = (...args: never[]) => void;\n\n/**\n * Realtime transcription stream.\n *\n * Chunks are emitted progressively as speech is transcribed. The same chunk_id\n * will be emitted multiple times with updated text. Use `chunk.isFinal` to\n * determine if a chunk is complete (the next chunk_id has appeared).\n *\n * @example Event-based (all updates)\n * ```typescript\n * stream.on('chunk', (chunk) => {\n *   // Updates display in real-time\n *   updateDisplay(chunk.chunk_id, chunk.text);\n * });\n * ```\n *\n * @example Event-based (final chunks only)\n * ```typescript\n * stream.on('chunk', (chunk) => {\n *   if (chunk.isFinal) {\n *     console.log(`[${chunk.speaker_name}]: ${chunk.text}`);\n *   }\n * });\n * ```\n *\n * @example Async iterator\n * ```typescript\n * for await (const chunk of stream) {\n *   console.log(`[${chunk.speaker_name}]: ${chunk.text}`);\n * }\n * ```\n */\nexport class RealtimeStream implements AsyncIterable<TranscriptionChunk> {\n  private connection: RealtimeConnection;\n  private listeners = new Map<keyof RealtimeEvents, Set<AnyEventHandler>>();\n  private buffer: TranscriptionChunk[] = [];\n  private waiters: Array<(chunk: TranscriptionChunk | null) => void> = [];\n  private closed = false;\n  private lastChunkId: string | null = null;\n  private lastChunk: TranscriptionChunk | null = null;\n\n  constructor(config: RealtimeConfig) {\n    this.connection = new RealtimeConnection(config);\n  }\n\n  /**\n   * Connect to the realtime stream.\n   * @throws AuthenticationError if authentication fails\n   * @throws ConnectionError if connection fails\n   * @throws TimeoutError if connection times out\n   */\n  async connect(): Promise<void> {\n    await this.connection.connect();\n    this.setupHandlers();\n    this.emit('connected');\n  }\n\n  private setupHandlers(): void {\n    this.connection.onChunk((rawChunk) => {\n      // Check if this is a new chunk or an update to the current one\n      const isNewChunk = this.lastChunkId !== null && rawChunk.chunk_id !== this.lastChunkId;\n\n      // If we have a previous chunk and this is a new one, mark previous as final\n      if (isNewChunk && this.lastChunk) {\n        const finalChunk: TranscriptionChunk = { ...this.lastChunk, isFinal: true };\n        this.emitChunk(finalChunk);\n      }\n\n      // Create chunk with isFinal = false (it may get more updates)\n      const chunk: TranscriptionChunk = { ...rawChunk, isFinal: false };\n\n      // Track current chunk\n      this.lastChunkId = chunk.chunk_id;\n      this.lastChunk = chunk;\n\n      // Emit the update\n      this.emit('chunk', chunk);\n    });\n\n    this.connection.onDisconnect((reason) => {\n      // Emit last chunk as final before disconnecting\n      if (this.lastChunk) {\n        const finalChunk: TranscriptionChunk = { ...this.lastChunk, isFinal: true };\n        this.emitChunk(finalChunk);\n        this.lastChunk = null;\n      }\n\n      this.emit('disconnected', reason);\n\n      // Signal end to async iterator\n      if (!this.connection.connected) {\n        this.closed = true;\n        for (const waiter of this.waiters) {\n          waiter(null);\n        }\n        this.waiters = [];\n      }\n    });\n\n    this.connection.onReconnectAttempt((attempt) => {\n      this.emit('reconnecting', attempt);\n    });\n\n    this.connection.onReconnect(() => {\n      this.emit('connected');\n    });\n\n    this.connection.onError((error) => {\n      this.emit('error', error);\n    });\n  }\n\n  /**\n   * Register an event listener.\n   * @param event - Event name\n   * @param handler - Event handler\n   */\n  on<K extends keyof RealtimeEvents>(event: K, handler: EventHandler<K>): this {\n    let handlers = this.listeners.get(event);\n    if (!handlers) {\n      handlers = new Set();\n      this.listeners.set(event, handlers);\n    }\n    handlers.add(handler as AnyEventHandler);\n    return this;\n  }\n\n  /**\n   * Remove an event listener.\n   * @param event - Event name\n   * @param handler - Event handler to remove\n   */\n  off<K extends keyof RealtimeEvents>(event: K, handler: EventHandler<K>): this {\n    this.listeners.get(event)?.delete(handler as AnyEventHandler);\n    return this;\n  }\n\n  /**\n   * Emit a chunk to both event listeners and async iterator buffer.\n   * Used for final chunks that should be yielded by the iterator.\n   */\n  private emitChunk(chunk: TranscriptionChunk): void {\n    this.emit('chunk', chunk);\n\n    // Feed async iterator (only final chunks go to the buffer)\n    if (chunk.isFinal) {\n      if (this.waiters.length > 0) {\n        const waiter = this.waiters.shift();\n        waiter?.(chunk);\n      } else {\n        this.buffer.push(chunk);\n      }\n    }\n  }\n\n  private emit<K extends keyof RealtimeEvents>(\n    event: K,\n    ...args: Parameters<RealtimeEvents[K]>\n  ): void {\n    const handlers = this.listeners.get(event);\n    handlers?.forEach((handler) => {\n      try {\n        (handler as (...args: Parameters<RealtimeEvents[K]>) => void)(...args);\n      } catch {\n        // Ignore listener errors\n      }\n    });\n  }\n\n  /**\n   * AsyncIterable implementation for `for await` loops.\n   */\n  async *[Symbol.asyncIterator](): AsyncIterator<TranscriptionChunk> {\n    if (this.closed) {\n      throw new StreamClosedError();\n    }\n\n    while (!this.closed) {\n      // Return buffered chunks first\n      const buffered = this.buffer.shift();\n      if (buffered) {\n        yield buffered;\n        continue;\n      }\n\n      // Wait for next chunk\n      const chunk = await new Promise<TranscriptionChunk | null>((resolve) => {\n        if (this.closed) {\n          resolve(null);\n          return;\n        }\n        this.waiters.push(resolve);\n      });\n\n      if (chunk === null) {\n        break;\n      }\n\n      yield chunk;\n    }\n  }\n\n  /**\n   * Close the stream and disconnect.\n   */\n  close(): void {\n    // Emit last chunk as final\n    if (this.lastChunk) {\n      const finalChunk: TranscriptionChunk = { ...this.lastChunk, isFinal: true };\n      this.emitChunk(finalChunk);\n      this.lastChunk = null;\n    }\n\n    this.closed = true;\n    this.connection.disconnect();\n    this.buffer = [];\n    this.lastChunkId = null;\n    for (const waiter of this.waiters) {\n      waiter(null);\n    }\n    this.waiters = [];\n  }\n\n  /**\n   * Whether the stream is currently connected.\n   */\n  get connected(): boolean {\n    return this.connection.connected;\n  }\n}\n","import { RealtimeStream } from './stream.js';\nimport type { RealtimeConfig, TranscriptionChunk } from './types.js';\n\n/**\n * API for realtime transcription streaming.\n */\nexport interface RealtimeAPI {\n  /**\n   * Connect to a live transcription stream.\n   *\n   * @param transcriptId - The meeting/transcript ID to stream\n   * @returns Connected RealtimeStream\n   *\n   * @example Event-based\n   * ```typescript\n   * const stream = await client.realtime.connect('meeting-123');\n   * stream.on('chunk', (chunk) => {\n   *   console.log(`[${chunk.speaker_name}]: ${chunk.text}`);\n   * });\n   * ```\n   */\n  connect(transcriptId: string): Promise<RealtimeStream>;\n\n  /**\n   * Stream transcription chunks as an async iterable.\n   * Handles connection automatically.\n   *\n   * @param transcriptId - The meeting/transcript ID to stream\n   * @returns AsyncIterable of transcription chunks\n   *\n   * @example\n   * ```typescript\n   * for await (const chunk of client.realtime.stream('meeting-123')) {\n   *   console.log(`[${chunk.speaker_name}]: ${chunk.text}`);\n   * }\n   * ```\n   */\n  stream(transcriptId: string): AsyncIterable<TranscriptionChunk>;\n}\n\n/**\n * Create the realtime API bound to config.\n * @param apiKey - API key for authentication\n * @param baseConfig - Optional base configuration for all streams\n */\nexport function createRealtimeAPI(\n  apiKey: string,\n  baseConfig?: Partial<Omit<RealtimeConfig, 'apiKey' | 'transcriptId'>>\n): RealtimeAPI {\n  return {\n    async connect(transcriptId: string): Promise<RealtimeStream> {\n      const stream = new RealtimeStream({\n        apiKey,\n        transcriptId,\n        ...baseConfig,\n      });\n      await stream.connect();\n      return stream;\n    },\n\n    async *stream(transcriptId: string): AsyncIterable<TranscriptionChunk> {\n      const stream = new RealtimeStream({\n        apiKey,\n        transcriptId,\n        ...baseConfig,\n      });\n\n      try {\n        await stream.connect();\n        yield* stream;\n      } finally {\n        stream.close();\n      }\n    },\n  };\n}\n","import { GraphQLClient } from './graphql/client.js';\nimport { type AudioAPI, createAudioAPI } from './graphql/mutations/audio.js';\nimport {\n  createTranscriptsMutationsAPI,\n  type TranscriptsMutationsAPI,\n} from './graphql/mutations/transcripts.js';\nimport { createUsersMutationsAPI, type UsersMutationsAPI } from './graphql/mutations/users.js';\nimport { type AIAppsAPI, createAIAppsAPI } from './graphql/queries/ai-apps.js';\nimport { type BitesAPI, createBitesAPI } from './graphql/queries/bites.js';\nimport { createMeetingsAPI, type MeetingsAPI } from './graphql/queries/meetings.js';\nimport { createTranscriptsAPI, type TranscriptsAPI } from './graphql/queries/transcripts.js';\nimport { createUsersAPI, type UsersAPI } from './graphql/queries/users.js';\nimport { createRealtimeAPI, type RealtimeAPI } from './realtime/api.js';\nimport type { FirefliesConfig, RateLimitState } from './types/config.js';\n\n/**\n * Main client for the Fireflies API.\n *\n * @example\n * ```typescript\n * import { FirefliesClient } from 'fireflies-api';\n *\n * const client = new FirefliesClient({\n *   apiKey: process.env.FIREFLIES_API_KEY!,\n * });\n *\n * // List recent transcripts\n * const transcripts = await client.transcripts.list({ limit: 10 });\n *\n * // Get a specific transcript\n * const transcript = await client.transcripts.get('transcript-id');\n *\n * // Get current user\n * const me = await client.users.me();\n *\n * // List team members\n * const team = await client.users.list();\n *\n * // List bites\n * const bites = await client.bites.list({ mine: true });\n *\n * // Check active meetings\n * const meetings = await client.meetings.active();\n *\n * // List AI App outputs\n * const apps = await client.aiApps.list({ transcript_id: 'abc123' });\n * ```\n */\nexport class FirefliesClient {\n  private readonly graphql: GraphQLClient;\n\n  /**\n   * Transcript operations: list, get, search, delete.\n   */\n  readonly transcripts: TranscriptsAPI & TranscriptsMutationsAPI;\n\n  /**\n   * User operations: me, get, list, setRole.\n   */\n  readonly users: UsersAPI & UsersMutationsAPI;\n\n  /**\n   * Bite operations: get, list, create.\n   */\n  readonly bites: BitesAPI;\n\n  /**\n   * Meeting operations: active meetings, add bot.\n   */\n  readonly meetings: MeetingsAPI;\n\n  /**\n   * Audio operations: upload audio for transcription.\n   */\n  readonly audio: AudioAPI;\n\n  /**\n   * AI Apps operations: list outputs.\n   */\n  readonly aiApps: AIAppsAPI;\n\n  /**\n   * Realtime transcription streaming.\n   */\n  readonly realtime: RealtimeAPI;\n\n  /**\n   * Create a new Fireflies client.\n   *\n   * @param config - Client configuration\n   * @throws FirefliesError if API key is missing\n   */\n  constructor(config: FirefliesConfig) {\n    this.graphql = new GraphQLClient(config);\n\n    // Combine queries and mutations for each resource\n    const transcriptsQueries = createTranscriptsAPI(this.graphql);\n    const transcriptsMutations = createTranscriptsMutationsAPI(this.graphql);\n    this.transcripts = { ...transcriptsQueries, ...transcriptsMutations };\n\n    const usersQueries = createUsersAPI(this.graphql);\n    const usersMutations = createUsersMutationsAPI(this.graphql);\n    this.users = { ...usersQueries, ...usersMutations };\n\n    this.bites = createBitesAPI(this.graphql);\n    this.meetings = createMeetingsAPI(this.graphql);\n    this.audio = createAudioAPI(this.graphql);\n    this.aiApps = createAIAppsAPI(this.graphql);\n    this.realtime = createRealtimeAPI(config.apiKey);\n  }\n\n  /**\n   * Get the current rate limit state.\n   * Returns undefined if rate limit tracking is not configured.\n   *\n   * @example\n   * ```typescript\n   * const client = new FirefliesClient({\n   *   apiKey: '...',\n   *   rateLimit: { warningThreshold: 10 }\n   * });\n   *\n   * await client.users.me();\n   * console.log(client.rateLimits);\n   * // { remaining: 59, limit: 60, resetInSeconds: 60, updatedAt: 1706299500000 }\n   * ```\n   */\n  get rateLimits(): RateLimitState | undefined {\n    return this.graphql.rateLimitState;\n  }\n}\n","import type { Command } from 'commander';\nimport { FirefliesClient } from '../../client.js';\n\nexport type OutputFormat = 'json' | 'jsonl' | 'table' | 'tsv' | 'plain';\n\ninterface GlobalOptions {\n  apiKey?: string;\n  output?: OutputFormat;\n  progress?: boolean;\n}\n\n/**\n * Create a FirefliesClient from CLI options or environment.\n */\nexport function getClient(cmd: Command): FirefliesClient {\n  const opts = cmd.optsWithGlobals() as GlobalOptions;\n  // biome-ignore lint/complexity/useLiteralKeys: TypeScript requires bracket notation for process.env\n  const apiKey = opts.apiKey ?? process.env['FIREFLIES_API_KEY'];\n\n  if (!apiKey) {\n    console.error('Error: API key required. Set FIREFLIES_API_KEY or use --api-key');\n    process.exit(1);\n  }\n\n  return new FirefliesClient({ apiKey });\n}\n\n/**\n * Get the output format from CLI options.\n */\nexport function getOutputFormat(cmd: Command): OutputFormat {\n  const opts = cmd.optsWithGlobals() as GlobalOptions;\n  return opts.output ?? 'json';\n}\n\n/**\n * Check if progress indicators are enabled.\n */\nexport function isProgressEnabled(cmd: Command): boolean {\n  const opts = cmd.optsWithGlobals() as GlobalOptions;\n  return opts.progress ?? false;\n}\n","import {\n  AuthenticationError,\n  FirefliesError,\n  NotFoundError,\n  RateLimitError,\n  ValidationError,\n} from '../../errors.js';\n\n/**\n * Handle an error and exit with appropriate code.\n */\nexport function handleError(error: unknown): never {\n  if (error instanceof AuthenticationError) {\n    console.error('Authentication failed: Check your API key');\n    process.exit(1);\n  }\n\n  if (error instanceof NotFoundError) {\n    console.error(`Not found: ${error.message}`);\n    process.exit(1);\n  }\n\n  if (error instanceof RateLimitError) {\n    console.error(`Rate limited: ${error.message}`);\n    process.exit(1);\n  }\n\n  if (error instanceof ValidationError) {\n    console.error(`Validation error: ${error.message}`);\n    process.exit(1);\n  }\n\n  if (error instanceof FirefliesError) {\n    console.error(`Error: ${error.message}`);\n    process.exit(1);\n  }\n\n  if (error instanceof Error) {\n    console.error(`Error: ${error.message}`);\n    process.exit(1);\n  }\n\n  console.error('An unexpected error occurred');\n  process.exit(1);\n}\n\n/**\n * Wrap an async action with error handling.\n */\nexport function withErrorHandling<T extends unknown[]>(\n  fn: (...args: T) => Promise<void>\n): (...args: T) => Promise<void> {\n  return async (...args: T) => {\n    try {\n      await fn(...args);\n    } catch (error) {\n      handleError(error);\n    }\n  };\n}\n","import type { ActionItemsResult } from '../../helpers/action-items.js';\nimport type { SpeakerAnalytics } from '../../helpers/speaker-analytics.js';\nimport type { OutputFormat } from './client.js';\n\n/**\n * Write a line to stdout with newline for pipe-friendly output.\n */\nexport function writeLine(line: string): void {\n  process.stdout.write(`${line}\\n`);\n}\n\n/**\n * Output a single item as a JSON line (for streaming/NDJSON).\n */\nexport function outputLine(data: unknown): void {\n  writeLine(JSON.stringify(data));\n}\n\n/**\n * Output data in the specified format.\n */\nexport function output(data: unknown, format: OutputFormat): void {\n  switch (format) {\n    case 'json':\n      console.log(JSON.stringify(data, null, 2));\n      break;\n    case 'jsonl':\n      if (Array.isArray(data)) {\n        for (const item of data) {\n          writeLine(JSON.stringify(item));\n        }\n      } else {\n        writeLine(JSON.stringify(data));\n      }\n      break;\n    case 'tsv':\n      printTsv(data);\n      break;\n    case 'table':\n      if (Array.isArray(data)) {\n        printTable(data as Record<string, unknown>[]);\n      } else if (data && typeof data === 'object') {\n        printKeyValue(data as Record<string, unknown>);\n      } else {\n        console.log(data);\n      }\n      break;\n    case 'plain':\n      if (typeof data === 'string') {\n        console.log(data);\n      } else {\n        console.log(JSON.stringify(data));\n      }\n      break;\n  }\n}\n\n/**\n * Print an array of objects as a table.\n */\nfunction printTable(rows: Record<string, unknown>[]): void {\n  if (rows.length === 0) {\n    console.log('(no data)');\n    return;\n  }\n\n  const firstRow = rows[0];\n  if (!firstRow) return;\n\n  const keys = Object.keys(firstRow);\n  const widths: Record<string, number> = {};\n\n  // Calculate column widths\n  for (const key of keys) {\n    widths[key] = key.length;\n    for (const row of rows) {\n      const value = formatValue(row[key]);\n      widths[key] = Math.max(widths[key] ?? 0, value.length);\n    }\n  }\n\n  // Print header\n  const header = keys.map((k) => k.padEnd(widths[k] ?? 0)).join('  ');\n  console.log(header);\n  console.log(keys.map((k) => '-'.repeat(widths[k] ?? 0)).join('  '));\n\n  // Print rows\n  for (const row of rows) {\n    const line = keys.map((k) => formatValue(row[k]).padEnd(widths[k] ?? 0)).join('  ');\n    console.log(line);\n  }\n}\n\n/**\n * Print an object as key-value pairs.\n */\nfunction printKeyValue(obj: Record<string, unknown>): void {\n  const maxKeyLen = Math.max(...Object.keys(obj).map((k) => k.length));\n\n  for (const [key, value] of Object.entries(obj)) {\n    console.log(`${key.padEnd(maxKeyLen)}  ${formatValue(value)}`);\n  }\n}\n\n/**\n * Format a value for table output.\n */\nfunction formatValue(value: unknown): string {\n  if (value === null || value === undefined) {\n    return '';\n  }\n  if (typeof value === 'object') {\n    if (Array.isArray(value)) {\n      return `[${value.length} items]`;\n    }\n    return '[object]';\n  }\n  return String(value);\n}\n\n/**\n * Print data as TSV (tab-separated values).\n */\nfunction printTsv(data: unknown): void {\n  if (!Array.isArray(data) || data.length === 0) {\n    return;\n  }\n  const firstRow = data[0] as Record<string, unknown>;\n  const keys = Object.keys(firstRow);\n\n  // Header\n  writeLine(keys.join('\\t'));\n\n  // Rows\n  for (const row of data as Record<string, unknown>[]) {\n    writeLine(keys.map((k) => formatTsvValue(row[k])).join('\\t'));\n  }\n}\n\n/**\n * Format a value for TSV output, escaping tabs and newlines.\n */\nfunction formatTsvValue(value: unknown): string {\n  if (value === null || value === undefined) {\n    return '';\n  }\n  if (typeof value === 'object') {\n    return JSON.stringify(value);\n  }\n  return String(value).replace(/\\t/g, ' ').replace(/\\n/g, ' ');\n}\n\n/**\n * Output speaker analytics in the specified format.\n *\n * - plain: Human-readable summary with meeting overview and speaker details\n * - table/tsv: Flat speaker rows suitable for tabular display\n * - json/jsonl: Full analytics object\n */\nexport function outputSpeakerAnalytics(analytics: SpeakerAnalytics, format: OutputFormat): void {\n  if (format === 'plain') {\n    const mins = Math.round(analytics.totalDuration / 60);\n    writeLine(\n      `Meeting: ${mins} min, ${analytics.speakers.length} speakers, balance: ${analytics.balance}`\n    );\n    writeLine(`Dominant: ${analytics.dominantSpeaker} (${analytics.dominantSpeakerPercentage}%)`);\n    writeLine('');\n    for (const s of analytics.speakers) {\n      writeLine(\n        `${s.name}: ${Math.round(s.talkTime)}s (${s.talkTimePercentage}%) | ${s.wordCount} words | ${s.wordsPerMinute} wpm | ${s.turnCount} turns`\n      );\n    }\n    return;\n  }\n\n  if (format === 'table' || format === 'tsv') {\n    const rows = analytics.speakers.map((s) => ({\n      name: s.name,\n      talkTime: Math.round(s.talkTime),\n      'talkTime%': s.talkTimePercentage,\n      words: s.wordCount,\n      wpm: s.wordsPerMinute,\n      sentences: s.sentenceCount,\n      turns: s.turnCount,\n    }));\n    output(rows, format);\n    return;\n  }\n\n  // json, jsonl: full analytics object\n  output(analytics, format);\n}\n\n/**\n * Output action items in the specified format.\n *\n * - plain: Human-readable list with assignee and due date\n * - table/tsv: Flat rows with columns: #, text, assignee, dueDate\n * - json/jsonl: Full ActionItemsResult object\n */\nexport function outputActionItems(result: ActionItemsResult, format: OutputFormat): void {\n  if (format === 'plain') {\n    const assignedCount = result.assignedItems;\n    writeLine(`Action Items (${result.totalItems} total, ${assignedCount} assigned):`);\n    writeLine('');\n    for (const item of result.items) {\n      writeLine(`${item.lineNumber}. ${item.text}`);\n      const parts: string[] = [];\n      if (item.assignee) {\n        parts.push(`Assignee: ${item.assignee}`);\n      }\n      if (item.dueDate) {\n        parts.push(`Due: ${item.dueDate}`);\n      }\n      if (parts.length > 0) {\n        writeLine(`   ${parts.join(' | ')}`);\n      }\n      writeLine('');\n    }\n    return;\n  }\n\n  if (format === 'table' || format === 'tsv') {\n    const rows = result.items.map((item) => ({\n      '#': item.lineNumber,\n      text: item.text,\n      assignee: item.assignee ?? '-',\n      dueDate: item.dueDate ?? '-',\n    }));\n    output(rows, format);\n    return;\n  }\n\n  // json, jsonl: full result object\n  output(result, format);\n}\n","import type { Command } from 'commander';\nimport { getClient, getOutputFormat } from '../utils/client.js';\nimport { withErrorHandling } from '../utils/error.js';\nimport { output } from '../utils/output.js';\n\nexport function registerAiAppsCommand(program: Command): void {\n  const cmd = program.command('ai-apps').description('AI Apps output');\n\n  cmd\n    .command('list')\n    .description('List AI App outputs')\n    .requiredOption('--transcript <id>', 'Transcript ID (required)')\n    .option('--app <id>', 'Filter by app ID')\n    .option('--limit <n>', 'Max results (default: 10)', '10')\n    .action(\n      withErrorHandling(async (opts) => {\n        const client = getClient(program);\n        const format = getOutputFormat(program);\n\n        const apps = await client.aiApps.list({\n          transcript_id: opts.transcript,\n          app_id: opts.app,\n          limit: Number.parseInt(opts.limit, 10),\n        });\n\n        const formatted = apps.map((a) => ({\n          app_id: a.app_id,\n          title: a.title,\n          transcript_id: a.transcript_id,\n          created_at: a.created_at,\n          response:\n            a.response?.substring(0, 100) + (a.response && a.response.length > 100 ? '...' : ''),\n        }));\n\n        output(formatted, format);\n      })\n    );\n}\n","import type { UploadAudioAttendee } from '../../types/params.js';\n\n/**\n * Format duration in seconds to human-readable string.\n * @param seconds - Duration in seconds (can be fractional)\n * @returns Human-readable string like \"1h 30m\", \"5m 20s\", \"45s\"\n */\nexport function formatDuration(seconds: number): string {\n  if (!Number.isFinite(seconds) || seconds < 0) {\n    return '0s';\n  }\n\n  const totalSeconds = Math.round(seconds);\n  const hours = Math.floor(totalSeconds / 3600);\n  const minutes = Math.floor((totalSeconds % 3600) / 60);\n  const secs = totalSeconds % 60;\n\n  if (hours > 0) {\n    if (minutes > 0) {\n      return `${hours}h ${minutes}m`;\n    }\n    return `${hours}h`;\n  }\n\n  if (minutes > 0) {\n    if (secs > 0) {\n      return `${minutes}m ${secs}s`;\n    }\n    return `${minutes}m`;\n  }\n\n  return `${secs}s`;\n}\n\n/**\n * Parse time string (supports seconds or MM:SS or HH:MM:SS format).\n * @returns Time in seconds\n */\nexport function parseTime(value: string): number {\n  if (value.includes(':')) {\n    const parts = value.split(':');\n    if (parts.length === 2) {\n      const [mins, secs] = parts;\n      return Number.parseInt(mins ?? '0', 10) * 60 + Number.parseFloat(secs ?? '0');\n    }\n    if (parts.length === 3) {\n      const [hours, mins, secs] = parts;\n      return (\n        Number.parseInt(hours ?? '0', 10) * 3600 +\n        Number.parseInt(mins ?? '0', 10) * 60 +\n        Number.parseFloat(secs ?? '0')\n      );\n    }\n  }\n  return Number.parseFloat(value);\n}\n\n/**\n * Parse attendee string in format \"name:email\" or just \"email\".\n */\nexport function parseAttendee(value: string): UploadAudioAttendee {\n  if (value.includes(':')) {\n    const colonIndex = value.indexOf(':');\n    const displayName = value.slice(0, colonIndex);\n    const email = value.slice(colonIndex + 1);\n    return { displayName, email };\n  }\n  return { email: value };\n}\n\nexport type BitePrivacy = 'public' | 'team' | 'participants';\n\nconst VALID_PRIVACIES: BitePrivacy[] = ['public', 'team', 'participants'];\n\n/**\n * Validate a privacy value.\n * @returns The validated privacy or null if invalid\n */\nexport function validatePrivacy(value: string): BitePrivacy | null {\n  if (VALID_PRIVACIES.includes(value as BitePrivacy)) {\n    return value as BitePrivacy;\n  }\n  return null;\n}\n\nexport type UserRole = 'admin' | 'user';\n\nconst VALID_ROLES: UserRole[] = ['admin', 'user'];\n\n/**\n * Validate a user role value.\n * @returns The validated role or null if invalid\n */\nexport function validateRole(value: string): UserRole | null {\n  if (VALID_ROLES.includes(value as UserRole)) {\n    return value as UserRole;\n  }\n  return null;\n}\n","import type { Command } from 'commander';\nimport type { UploadAudioAttendee } from '../../types/params.js';\nimport { getClient, getOutputFormat } from '../utils/client.js';\nimport { withErrorHandling } from '../utils/error.js';\nimport { output } from '../utils/output.js';\nimport { parseAttendee } from '../utils/parse.js';\n\n/**\n * Collect repeatable option values into an array.\n */\nfunction collectAttendees(value: string, previous: UploadAudioAttendee[]): UploadAudioAttendee[] {\n  return previous.concat([parseAttendee(value)]);\n}\n\nexport function registerAudioCommand(program: Command): void {\n  const cmd = program.command('audio').description('Audio/video upload for transcription');\n\n  cmd\n    .command('upload <url>')\n    .description('Upload audio/video file for transcription')\n    .option('--title <title>', 'Title for the transcript (max 256 chars)')\n    .option('--webhook <url>', 'Webhook URL for completion notification')\n    .option('--language <code>', 'Language code (e.g., en, de, fr)')\n    .option('--save-video', 'Save video if applicable')\n    .option(\n      '--attendee <name:email>',\n      'Meeting attendee (repeatable, format: \"Name:email@example.com\" or just \"email@example.com\")',\n      collectAttendees,\n      []\n    )\n    .option('--reference-id <id>', 'Custom reference ID for tracking (max 128 chars)')\n    .option('--bypass-size-check', 'Allow files smaller than 50kb')\n    .action(\n      withErrorHandling(async (url: string, opts) => {\n        const client = getClient(program);\n        const format = getOutputFormat(program);\n\n        const result = await client.audio.upload({\n          url,\n          title: opts.title,\n          webhook: opts.webhook,\n          custom_language: opts.language,\n          save_video: opts.saveVideo,\n          attendees: opts.attendee.length > 0 ? opts.attendee : undefined,\n          client_reference_id: opts.referenceId,\n          bypass_size_check: opts.bypassSizeCheck,\n        });\n\n        output(result, format);\n      })\n    );\n}\n","import type { Command } from 'commander';\nimport { getClient, getOutputFormat } from '../utils/client.js';\nimport { withErrorHandling } from '../utils/error.js';\nimport { output } from '../utils/output.js';\nimport { type BitePrivacy, parseTime, validatePrivacy } from '../utils/parse.js';\n\n/**\n * Collect repeatable privacy values.\n */\nfunction collectPrivacies(value: string, previous: BitePrivacy[]): BitePrivacy[] {\n  const validated = validatePrivacy(value);\n  if (!validated) {\n    console.error(`Invalid privacy value: ${value}. Must be one of: public, team, participants`);\n    process.exit(1);\n  }\n  return previous.concat([validated]);\n}\n\nexport function registerBitesCommand(program: Command): void {\n  const cmd = program.command('bites').description('Soundbites/clips');\n\n  cmd\n    .command('list')\n    .description('List bites')\n    .option('--transcript <id>', 'Filter by transcript ID')\n    .option('--limit <n>', 'Max results (default: 20)', '20')\n    .option('--mine', 'Only my bites')\n    .option('--team', 'All team bites')\n    .action(\n      withErrorHandling(async (opts) => {\n        const client = getClient(program);\n        const format = getOutputFormat(program);\n\n        const bites = await client.bites.list({\n          transcript_id: opts.transcript,\n          limit: Number.parseInt(opts.limit, 10),\n          mine: opts.mine,\n          my_team: opts.team,\n        });\n\n        const formatted = bites.map((b) => ({\n          id: b.id,\n          name: b.name,\n          transcript_id: b.transcript_id,\n          status: b.status,\n          start_time: b.start_time,\n          end_time: b.end_time,\n          created_at: b.created_at,\n        }));\n\n        output(formatted, format);\n      })\n    );\n\n  cmd\n    .command('get <id>')\n    .description('Get bite details')\n    .action(\n      withErrorHandling(async (id: string) => {\n        const client = getClient(program);\n        const format = getOutputFormat(program);\n\n        const bite = await client.bites.get(id);\n        output(bite, format);\n      })\n    );\n\n  cmd\n    .command('create')\n    .description('Create a bite/soundbite from a transcript')\n    .requiredOption('--transcript <id>', 'Transcript ID (required)')\n    .requiredOption('--start <time>', 'Start time in seconds or MM:SS format (required)')\n    .requiredOption('--end <time>', 'End time in seconds or MM:SS format (required)')\n    .option('--name <name>', 'Bite name (max 256 chars)')\n    .option('--media-type <type>', 'Media type: video or audio')\n    .option('--summary <text>', 'Summary (max 500 chars)')\n    .option(\n      '--privacy <level>',\n      'Privacy: public, team, or participants (repeatable)',\n      collectPrivacies,\n      []\n    )\n    .action(\n      withErrorHandling(async (opts) => {\n        const client = getClient(program);\n        const format = getOutputFormat(program);\n\n        const startTime = parseTime(opts.start);\n        const endTime = parseTime(opts.end);\n\n        if (endTime <= startTime) {\n          console.error('Error: End time must be greater than start time');\n          process.exit(1);\n        }\n\n        const result = await client.bites.create({\n          transcript_id: opts.transcript,\n          start_time: startTime,\n          end_time: endTime,\n          name: opts.name,\n          media_type: opts.mediaType,\n          summary: opts.summary,\n          privacies: opts.privacy.length > 0 ? opts.privacy : undefined,\n        });\n\n        output(result, format);\n      })\n    );\n}\n","import type {\n  DigestActionItem,\n  DigestActionItems,\n  DigestBuildOptions,\n  DigestHighlight,\n  DigestMeeting,\n  DigestMeetingWithActionItems,\n  DigestParticipant,\n  DigestParticipantInfo,\n  DigestStats,\n  WeeklyDigest,\n} from '../types/digest.js';\nimport type { MeetingAttendee, Transcript } from '../types/transcript.js';\nimport { extractActionItems } from './action-items.js';\n\n// Re-export types for convenience\nexport type {\n  DigestActionItem,\n  DigestActionItems,\n  DigestBuildOptions,\n  DigestHighlight,\n  DigestMeeting,\n  DigestMeetingWithActionItems,\n  DigestParticipant,\n  DigestParticipantInfo,\n  DigestStats,\n  WeeklyDigest,\n} from '../types/digest.js';\n\n/**\n * Day names for mapping Date.getUTCDay() indices.\n */\nconst DAY_NAMES = ['sunday', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday'];\n\n/**\n * Calculate meeting statistics from transcripts. Pure function.\n *\n * @param transcripts - Array of transcripts to analyze\n * @returns Statistics including totals, averages, and by-day breakdown\n *\n * @example\n * ```typescript\n * const stats = calculateStats(transcripts);\n * console.log(`Busiest day: ${stats.busiestDay}`);\n * ```\n */\nexport function calculateStats(transcripts: Transcript[]): DigestStats {\n  if (transcripts.length === 0) {\n    return emptyStats();\n  }\n\n  const totalMinutes = sumDurations(transcripts);\n  const meetingsByDay = calculateMeetingsByDay(transcripts);\n  const busiestDay = findBusiestDay(meetingsByDay);\n\n  return {\n    totalMeetings: transcripts.length,\n    totalMinutes,\n    averageDuration: totalMinutes / transcripts.length,\n    busiestDay,\n    meetingsByDay,\n  };\n}\n\nfunction emptyStats(): DigestStats {\n  return {\n    totalMeetings: 0,\n    totalMinutes: 0,\n    averageDuration: 0,\n    busiestDay: '',\n    meetingsByDay: {},\n  };\n}\n\nfunction sumDurations(transcripts: Transcript[]): number {\n  return transcripts.reduce((sum, t) => sum + (t.duration ?? 0), 0);\n}\n\nfunction calculateMeetingsByDay(transcripts: Transcript[]): Record<string, number> {\n  const counts: Record<string, number> = {};\n\n  for (const t of transcripts) {\n    const date = parseDate(t.dateString);\n    if (!date) continue;\n\n    const dayName = DAY_NAMES[date.getUTCDay()];\n    if (dayName) {\n      counts[dayName] = (counts[dayName] ?? 0) + 1;\n    }\n  }\n\n  return counts;\n}\n\nfunction findBusiestDay(meetingsByDay: Record<string, number>): string {\n  let busiestDay = '';\n  let maxCount = 0;\n\n  for (const [day, count] of Object.entries(meetingsByDay)) {\n    if (count > maxCount) {\n      maxCount = count;\n      busiestDay = day;\n    }\n  }\n\n  return busiestDay;\n}\n\nfunction parseDate(dateString: string | undefined): Date | null {\n  if (!dateString) return null;\n  const date = new Date(dateString);\n  return Number.isNaN(date.getTime()) ? null : date;\n}\n\n/**\n * Maximum number of key points to extract per meeting.\n */\nconst MAX_KEY_POINTS_PER_MEETING = 5;\n\n/**\n * Extract highlights from transcripts. Pure function.\n *\n * Parses summary.overview to extract key points and decisions from each meeting.\n *\n * @param transcripts - Array of transcripts to extract highlights from\n * @returns Array of highlights with key points and decisions\n *\n * @example\n * ```typescript\n * const highlights = extractHighlights(transcripts);\n * for (const h of highlights) {\n *   console.log(`${h.meetingTitle}: ${h.keyPoints.length} key points`);\n * }\n * ```\n */\nexport function extractHighlights(transcripts: Transcript[]): DigestHighlight[] {\n  const highlights: DigestHighlight[] = [];\n\n  for (const t of transcripts) {\n    const overview = t.summary?.overview;\n    if (!overview || overview.trim().length === 0) continue;\n\n    const keyPoints = extractKeyPoints(overview);\n    if (keyPoints.length === 0) continue;\n\n    highlights.push({\n      meetingId: t.id,\n      meetingTitle: t.title,\n      meetingDate: t.dateString,\n      keyPoints,\n      decisions: extractDecisions(t),\n    });\n  }\n\n  return highlights;\n}\n\n/**\n * Split overview into sentences and limit to max key points.\n */\nfunction extractKeyPoints(overview: string): string[] {\n  // Split by sentence-ending punctuation\n  const sentences = overview\n    .split(/(?<=[.!?])\\s+/)\n    .map((s) => s.trim().replace(/[.!?]$/, ''))\n    // Strip leading \"- \" from bullet points (Fireflies often adds these)\n    .map((s) => s.replace(/^-\\s*/, ''))\n    .filter((s) => s.length > 0);\n\n  return sentences.slice(0, MAX_KEY_POINTS_PER_MEETING);\n}\n\n/**\n * Extract decisions from transcript summary.\n * Looks for decision-related keywords in overview and keywords.\n */\nfunction extractDecisions(transcript: Transcript): string[] {\n  const decisions: string[] = [];\n  const overview = transcript.summary?.overview ?? '';\n\n  // Look for sentences with \"decided\" or \"decision\" keywords\n  const decisionPattern = /(?:^|[.!?]\\s*)([^.!?]*(?:decided?|decision|agreed|approved)[^.!?]*)/gi;\n\n  for (;;) {\n    const match = decisionPattern.exec(overview);\n    if (!match) break;\n    if (match[1]) {\n      decisions.push(match[1].trim());\n    }\n  }\n\n  return decisions;\n}\n\n/**\n * Build a lookup map of participant names from meeting_attendees across all transcripts.\n */\nfunction buildNameLookup(transcripts: Transcript[]): Map<string, string> {\n  const namesByEmail = new Map<string, string>();\n\n  for (const t of transcripts) {\n    for (const attendee of t.meeting_attendees ?? []) {\n      if (!attendee.email) continue;\n\n      const normalizedEmail = attendee.email.toLowerCase();\n      const name = attendee.displayName || attendee.name;\n\n      if (name && !namesByEmail.has(normalizedEmail)) {\n        namesByEmail.set(normalizedEmail, name);\n      }\n    }\n  }\n\n  return namesByEmail;\n}\n\n/**\n * Count meeting participation for each email across transcripts.\n */\nfunction countParticipation(\n  transcripts: Transcript[],\n  namesByEmail: Map<string, string>\n): Map<string, { name: string; meetingCount: number; totalMinutes: number }> {\n  const stats = new Map<string, { name: string; meetingCount: number; totalMinutes: number }>();\n\n  for (const t of transcripts) {\n    const seenInMeeting = new Set<string>();\n\n    for (const email of t.participants ?? []) {\n      const normalizedEmail = email.toLowerCase();\n      if (seenInMeeting.has(normalizedEmail)) continue;\n      seenInMeeting.add(normalizedEmail);\n\n      const existing = stats.get(normalizedEmail) ?? {\n        name: namesByEmail.get(normalizedEmail) || extractNameFromEmail(email),\n        meetingCount: 0,\n        totalMinutes: 0,\n      };\n\n      existing.meetingCount++;\n      existing.totalMinutes += t.duration ?? 0;\n      stats.set(normalizedEmail, existing);\n    }\n  }\n\n  return stats;\n}\n\n/**\n * Aggregate participants from transcripts. Pure function.\n *\n * Deduplicates by normalized email, counts meetings and total time per participant.\n * Looks up participant names from meeting_attendees data.\n *\n * @param transcripts - Array of transcripts to aggregate\n * @returns Array of participant stats sorted by meeting count descending\n *\n * @example\n * ```typescript\n * const participants = aggregateParticipants(transcripts);\n * console.log(`Top participant: ${participants[0]?.email}`);\n * ```\n */\nexport function aggregateParticipants(transcripts: Transcript[]): DigestParticipant[] {\n  const namesByEmail = buildNameLookup(transcripts);\n  const stats = countParticipation(transcripts, namesByEmail);\n\n  // Convert to array sorted by meeting count descending\n  return Array.from(stats, ([email, data]) => ({\n    email,\n    name: data.name,\n    meetingCount: data.meetingCount,\n    totalMinutes: data.totalMinutes,\n  })).sort((a, b) => b.meetingCount - a.meetingCount);\n}\n\n/**\n * Extract display name from email address.\n */\nfunction extractNameFromEmail(email: string): string {\n  const localPart = email.split('@')[0] ?? email;\n  return localPart;\n}\n\n/**\n * Build participant info list by looking up names from meeting_attendees.\n * Falls back to extracting name from email local part if not found.\n */\nfunction buildParticipantInfoList(\n  emails: string[],\n  attendees: MeetingAttendee[]\n): DigestParticipantInfo[] {\n  // Build a lookup map (case-insensitive)\n  const attendeeMap = new Map<string, MeetingAttendee>();\n  for (const attendee of attendees) {\n    if (attendee.email) {\n      attendeeMap.set(attendee.email.toLowerCase(), attendee);\n    }\n  }\n\n  return emails.map((email) => {\n    const normalizedEmail = email.toLowerCase();\n    const attendee = attendeeMap.get(normalizedEmail);\n\n    return {\n      email: normalizedEmail,\n      name: attendee?.displayName || attendee?.name || extractNameFromEmail(normalizedEmail),\n    };\n  });\n}\n\n/**\n * Aggregate action items from transcripts for digest display. Pure function.\n *\n * Reuses existing extractActionItems() and groups by assignee, with\n * separate collections for unassigned and items with due dates.\n *\n * @param transcripts - Array of transcripts to aggregate\n * @returns Aggregated action items organized for digest\n *\n * @example\n * ```typescript\n * const actionItems = aggregateActionItemsForDigest(transcripts);\n * console.log(`${actionItems.total} total items`);\n * console.log(`Unassigned: ${actionItems.unassigned.length}`);\n * ```\n */\nexport function aggregateActionItemsForDigest(transcripts: Transcript[]): DigestActionItems {\n  if (transcripts.length === 0) {\n    return emptyActionItems();\n  }\n\n  const byAssignee: Record<string, DigestActionItem[]> = {};\n  const byMeeting: DigestMeetingWithActionItems[] = [];\n  const unassigned: DigestActionItem[] = [];\n  const withDueDates: DigestActionItem[] = [];\n  let total = 0;\n\n  for (const t of transcripts) {\n    const result = extractActionItems(t);\n    const meetingItems: DigestActionItem[] = [];\n\n    for (const item of result.items) {\n      const digestItem: DigestActionItem = {\n        ...item,\n        transcriptId: t.id,\n        transcriptTitle: t.title,\n        transcriptDate: t.dateString,\n      };\n\n      total++;\n      meetingItems.push(digestItem);\n\n      // Group by assignee\n      if (item.assignee) {\n        const existing = byAssignee[item.assignee] ?? [];\n        existing.push(digestItem);\n        byAssignee[item.assignee] = existing;\n      } else {\n        unassigned.push(digestItem);\n      }\n\n      // Track items with due dates\n      if (item.dueDate) {\n        withDueDates.push(digestItem);\n      }\n    }\n\n    // Add meeting with its action items (even if empty, for completeness)\n    if (meetingItems.length > 0) {\n      byMeeting.push({\n        id: t.id,\n        title: t.title,\n        date: t.dateString,\n        duration: t.duration ?? 0,\n        participants: buildParticipantInfoList(t.participants ?? [], t.meeting_attendees ?? []),\n        items: meetingItems,\n      });\n    }\n  }\n\n  return { total, byAssignee, byMeeting, unassigned, withDueDates };\n}\n\nfunction emptyActionItems(): DigestActionItems {\n  return {\n    total: 0,\n    byAssignee: {},\n    byMeeting: [],\n    unassigned: [],\n    withDueDates: [],\n  };\n}\n\n/**\n * Build a digest from transcripts. Pure function - no API calls.\n *\n * Combines all aggregation helpers to produce a complete weekly digest.\n *\n * @param transcripts - Array of transcripts to aggregate\n * @param options - Build options for filtering sections\n * @returns Weekly digest with stats, action items, highlights, and participants\n *\n * @example\n * ```typescript\n * const transcripts = await client.transcripts.list({ period: 'last-week' });\n * const digest = buildDigest(transcripts, {\n *   includeActionItems: true,\n *   includeHighlights: true,\n * });\n * console.log(`${digest.totalMeetings} meetings`);\n * ```\n */\nexport function buildDigest(\n  transcripts: Transcript[],\n  options: DigestBuildOptions = {}\n): WeeklyDigest {\n  const { includeActionItems = true, includeHighlights = true, includeStats = true } = options;\n\n  if (transcripts.length === 0) {\n    return emptyDigest();\n  }\n\n  const stats = includeStats ? calculateStats(transcripts) : emptyStats();\n  const actionItems = includeActionItems\n    ? aggregateActionItemsForDigest(transcripts)\n    : emptyActionItems();\n  const highlights = includeHighlights ? extractHighlights(transcripts) : [];\n  const participants = aggregateParticipants(transcripts);\n  const meetings = transcripts.map(toMeetingSummary);\n  const period = calculatePeriod(transcripts);\n\n  const totalDuration = sumDurations(transcripts);\n\n  return {\n    period,\n    totalMeetings: transcripts.length,\n    totalDuration,\n    stats,\n    actionItems,\n    highlights,\n    participants,\n    meetings,\n  };\n}\n\nfunction emptyDigest(): WeeklyDigest {\n  return {\n    period: { from: '', to: '' },\n    totalMeetings: 0,\n    totalDuration: 0,\n    stats: emptyStats(),\n    actionItems: emptyActionItems(),\n    highlights: [],\n    participants: [],\n    meetings: [],\n  };\n}\n\nfunction toMeetingSummary(transcript: Transcript): DigestMeeting {\n  return {\n    id: transcript.id,\n    title: transcript.title,\n    date: transcript.dateString,\n    duration: transcript.duration ?? 0,\n    participants: (transcript.participants ?? []).length,\n  };\n}\n\nfunction calculatePeriod(transcripts: Transcript[]): { from: string; to: string } {\n  let earliest: Date | null = null;\n  let latest: Date | null = null;\n\n  for (const t of transcripts) {\n    const date = parseDate(t.dateString);\n    if (!date) continue;\n\n    if (!earliest || date < earliest) {\n      earliest = date;\n    }\n    if (!latest || date > latest) {\n      latest = date;\n    }\n  }\n\n  return {\n    from: earliest ? formatDateOnly(earliest) : '',\n    to: latest ? formatDateOnly(latest) : '',\n  };\n}\n\nfunction formatDateOnly(date: Date): string {\n  const year = date.getUTCFullYear();\n  const month = String(date.getUTCMonth() + 1).padStart(2, '0');\n  const day = String(date.getUTCDate()).padStart(2, '0');\n  return `${year}-${month}-${day}`;\n}\n","import { readFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport type { RenderOptions, WeeklyDigest } from '../types/digest.js';\n\n// Re-export types\nexport type { RenderOptions, WeeklyDigest } from '../types/digest.js';\n\n/**\n * Built-in template names.\n */\nconst BUILT_IN_TEMPLATES = ['default', 'compact', 'executive'] as const;\ntype BuiltInTemplate = (typeof BUILT_IN_TEMPLATES)[number];\n\n/**\n * Get the templates directory path.\n */\nfunction getTemplatesDir(): string {\n  const currentDir = dirname(fileURLToPath(import.meta.url));\n  // In dist: dist/helpers/ -> dist/templates/\n  // In src: src/helpers/ -> src/templates/\n  return join(currentDir, '..', 'templates', 'digest');\n}\n\n/**\n * Check if a template name is a built-in template.\n */\nfunction isBuiltInTemplate(name: string): name is BuiltInTemplate {\n  return BUILT_IN_TEMPLATES.includes(name as BuiltInTemplate);\n}\n\n/**\n * Load template content by name or path.\n */\nfunction loadTemplate(templateOption: string | undefined): string {\n  const templateName = templateOption ?? 'default';\n\n  // If it's a built-in template, load from templates directory\n  if (isBuiltInTemplate(templateName)) {\n    const templatePath = join(getTemplatesDir(), `${templateName}.md`);\n    try {\n      return readFileSync(templatePath, 'utf-8');\n    } catch {\n      // Fall back to inline default if template file not found\n      return getInlineTemplate(templateName);\n    }\n  }\n\n  // If it starts with common template markers, treat as inline template\n  if (templateOption && (templateOption.startsWith('#') || templateOption.includes('{{'))) {\n    return templateOption;\n  }\n\n  // Otherwise try to load as file path\n  try {\n    return readFileSync(templateName, 'utf-8');\n  } catch {\n    // If file not found and looks like a path, throw\n    if (templateName.includes('/') || templateName.includes('\\\\') || templateName.endsWith('.md')) {\n      throw new Error(`Template file not found: ${templateName}`);\n    }\n    // Otherwise treat as inline template\n    return templateName;\n  }\n}\n\n/**\n * Get inline fallback template.\n */\nfunction getInlineTemplate(name: BuiltInTemplate): string {\n  switch (name) {\n    case 'compact':\n      return COMPACT_TEMPLATE;\n    case 'executive':\n      return EXECUTIVE_TEMPLATE;\n    default:\n      return DEFAULT_TEMPLATE;\n  }\n}\n\n/**\n * Render a digest using a template. Pure function.\n *\n * @param digest - Digest to render\n * @param options - Template options (built-in name, file path, or inline template)\n * @returns Rendered string (markdown)\n *\n * @example\n * ```typescript\n * const output = renderDigest(digest);                          // Default\n * const output = renderDigest(digest, { template: 'compact' }); // Built-in\n * const output = renderDigest(digest, { template: './es.md' }); // Custom file\n * const output = renderDigest(digest, { template: '# Custom\\n{{totalMeetings}} meetings' }); // Inline\n * ```\n */\nexport function renderDigest(digest: WeeklyDigest, options?: RenderOptions): string {\n  const template = loadTemplate(options?.template);\n  return renderTemplate(template, digest as unknown as Record<string, unknown>);\n}\n\n// HTML rendering helpers\nfunction formatDurationHtml(minutes: number): string {\n  const hours = Math.floor(minutes / 60);\n  const mins = minutes % 60;\n  return `${hours}h ${mins}m`;\n}\n\nfunction escapeHtml(str: string): string {\n  return str\n    .replace(/&/g, '&amp;')\n    .replace(/</g, '&lt;')\n    .replace(/>/g, '&gt;')\n    .replace(/\"/g, '&quot;');\n}\n\nfunction renderActionItemsHtml(digest: WeeklyDigest): string {\n  const allActionItems = digest.actionItems.byMeeting.flatMap((m) => m.items);\n  return allActionItems\n    .map(\n      (item) => `\n      <li class=\"action-item\">\n        <input type=\"checkbox\" disabled />\n        <span class=\"action-text\">${escapeHtml(item.text)}</span>\n        ${item.assignee ? `<span class=\"assignee\">(${escapeHtml(item.assignee)})</span>` : ''}\n        ${item.dueDate ? `<span class=\"due-date\">due ${escapeHtml(item.dueDate)}</span>` : ''}\n      </li>`\n    )\n    .join('\\n');\n}\n\nfunction renderMeetingsHtml(digest: WeeklyDigest): string {\n  return digest.meetings\n    .map(\n      (m) => `\n      <tr>\n        <td>${escapeHtml(m.title)}</td>\n        <td>${escapeHtml(m.date)}</td>\n        <td>${formatDurationHtml(m.duration)}</td>\n        <td>${m.participants}</td>\n      </tr>`\n    )\n    .join('\\n');\n}\n\nfunction renderHighlightsHtml(digest: WeeklyDigest): string {\n  return digest.highlights\n    .map(\n      (h) => `\n      <div class=\"highlight\">\n        <h4>${escapeHtml(h.meetingTitle)} (${escapeHtml(h.meetingDate)})</h4>\n        <ul>\n          ${h.keyPoints.map((p) => `<li>${escapeHtml(p)}</li>`).join('\\n')}\n        </ul>\n      </div>`\n    )\n    .join('\\n');\n}\n\nfunction renderParticipantsHtml(digest: WeeklyDigest): string {\n  return digest.participants\n    .map(\n      (p) => `\n      <tr>\n        <td>${escapeHtml(p.name || p.email)}</td>\n        <td>${escapeHtml(p.email)}</td>\n        <td>${p.meetingCount}</td>\n        <td>${formatDurationHtml(p.totalMinutes)}</td>\n      </tr>`\n    )\n    .join('\\n');\n}\n\n/**\n * Render a digest as HTML. Pure function.\n *\n * @param digest - Digest to render\n * @returns HTML string\n *\n * @example\n * ```typescript\n * const html = renderDigestHtml(digest);\n * ```\n */\nexport function renderDigestHtml(digest: WeeklyDigest): string {\n  const actionItemsHtml = renderActionItemsHtml(digest);\n  const meetingsHtml = renderMeetingsHtml(digest);\n  const highlightsHtml = renderHighlightsHtml(digest);\n  const participantsHtml = renderParticipantsHtml(digest);\n\n  return `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n  <meta charset=\"UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n  <title>Weekly Meeting Digest</title>\n  <style>\n    body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; max-width: 900px; margin: 0 auto; padding: 20px; line-height: 1.6; }\n    h1 { color: #333; border-bottom: 2px solid #4a90d9; padding-bottom: 10px; }\n    h2 { color: #4a90d9; margin-top: 30px; }\n    h3 { color: #666; }\n    .overview { display: grid; grid-template-columns: repeat(3, 1fr); gap: 20px; margin: 20px 0; }\n    .stat-card { background: #f5f5f5; padding: 20px; border-radius: 8px; text-align: center; }\n    .stat-value { font-size: 2em; font-weight: bold; color: #4a90d9; }\n    .stat-label { color: #666; }\n    table { width: 100%; border-collapse: collapse; margin: 15px 0; }\n    th, td { padding: 10px; text-align: left; border-bottom: 1px solid #ddd; }\n    th { background: #f5f5f5; font-weight: 600; }\n    .action-item { list-style: none; padding: 8px 0; border-bottom: 1px solid #eee; }\n    .action-item input { margin-right: 10px; }\n    .assignee { color: #4a90d9; margin-left: 10px; }\n    .due-date { color: #e74c3c; margin-left: 10px; font-size: 0.9em; }\n    .highlight { background: #f9f9f9; padding: 15px; border-radius: 8px; margin: 10px 0; }\n    .highlight h4 { margin: 0 0 10px 0; color: #333; }\n    .highlight ul { margin: 0; padding-left: 20px; }\n    footer { margin-top: 40px; padding-top: 20px; border-top: 1px solid #ddd; color: #999; font-size: 0.9em; }\n  </style>\n</head>\n<body>\n  <h1>Weekly Meeting Digest</h1>\n  <p><strong>${escapeHtml(digest.period.from)}</strong> to <strong>${escapeHtml(digest.period.to)}</strong></p>\n\n  <div class=\"overview\">\n    <div class=\"stat-card\">\n      <div class=\"stat-value\">${digest.totalMeetings}</div>\n      <div class=\"stat-label\">Meetings</div>\n    </div>\n    <div class=\"stat-card\">\n      <div class=\"stat-value\">${formatDurationHtml(digest.totalDuration)}</div>\n      <div class=\"stat-label\">Total Time</div>\n    </div>\n    <div class=\"stat-card\">\n      <div class=\"stat-value\">${digest.actionItems.total}</div>\n      <div class=\"stat-label\">Action Items</div>\n    </div>\n  </div>\n\n  <h2>Meeting Stats</h2>\n  <p>Busiest day: <strong>${escapeHtml(digest.stats.busiestDay)}</strong></p>\n  <p>Average duration: <strong>${formatDurationHtml(digest.stats.averageDuration)}</strong></p>\n\n  <h2>Meetings</h2>\n  <table>\n    <thead>\n      <tr><th>Title</th><th>Date</th><th>Duration</th><th>Participants</th></tr>\n    </thead>\n    <tbody>\n      ${meetingsHtml}\n    </tbody>\n  </table>\n\n  ${\n    digest.actionItems.total > 0\n      ? `\n  <h2>Action Items (${digest.actionItems.total})</h2>\n  <ul style=\"padding-left: 0;\">\n    ${actionItemsHtml}\n  </ul>`\n      : ''\n  }\n\n  ${\n    digest.highlights.length > 0\n      ? `\n  <h2>Highlights</h2>\n  ${highlightsHtml}`\n      : ''\n  }\n\n  <h2>Participants</h2>\n  <table>\n    <thead>\n      <tr><th>Name</th><th>Email</th><th>Meetings</th><th>Time</th></tr>\n    </thead>\n    <tbody>\n      ${participantsHtml}\n    </tbody>\n  </table>\n\n  <footer>\n    Generated with fireflies-api\n  </footer>\n</body>\n</html>`;\n}\n\n/**\n * Available filters for template rendering.\n */\nconst FILTERS: Record<string, (value: unknown) => string> = {\n  duration: (value: unknown): string => {\n    const minutes = Math.round(Number(value) || 0);\n    const hours = Math.floor(minutes / 60);\n    const mins = minutes % 60;\n    return `${hours}h ${mins}m`;\n  },\n  date: (value: unknown): string => {\n    const str = String(value || '');\n    if (!str) return '';\n    const date = new Date(str);\n    if (Number.isNaN(date.getTime())) return str;\n    return date.toLocaleDateString('en-US', {\n      month: 'short',\n      day: 'numeric',\n      year: 'numeric',\n    });\n  },\n  join: (value: unknown): string => {\n    if (Array.isArray(value)) {\n      return value.join(', ');\n    }\n    return String(value || '');\n  },\n  lowercase: (value: unknown): string => String(value || '').toLowerCase(),\n  uppercase: (value: unknown): string => String(value || '').toUpperCase(),\n};\n\n/**\n * Render a template with mustache-like syntax. Pure function.\n *\n * Supports:\n * - Variable substitution: `{{var}}`, `{{a.b.c}}`\n * - Loops: `{{#items}}...{{/items}}`\n * - Conditionals: `{{#truthy}}...{{/truthy}}`\n * - Filters: `{{value | duration}}`\n *\n * @param template - Template string with placeholders\n * @param data - Data object for substitution\n * @returns Rendered string\n *\n * @example\n * ```typescript\n * const result = renderTemplate('Hello {{name}}!', { name: 'World' });\n * // => 'Hello World!'\n * ```\n */\nexport function renderTemplate(template: string, data: Record<string, unknown>): string {\n  if (!template) return '';\n\n  let result = template;\n\n  // Process sections (loops and conditionals) first\n  result = processSections(result, data);\n\n  // Then process simple variable substitutions\n  result = processVariables(result, data);\n\n  return result;\n}\n\n/**\n * Process {{#section}}...{{/section}} blocks.\n */\nfunction processSections(template: string, data: Record<string, unknown>): string {\n  const sectionPattern = /\\{\\{#(\\w+(?:\\.\\w+)*)\\}\\}([\\s\\S]*?)\\{\\{\\/\\1\\}\\}/g;\n\n  let result = template;\n  let iterations = 0;\n  const maxIterations = 100;\n\n  // Keep processing until no more sections (handles nested sections)\n  for (;;) {\n    const match = sectionPattern.exec(result);\n    if (!match || iterations >= maxIterations) break;\n    iterations++;\n\n    const [fullMatch, path, content] = match;\n    if (!path || content === undefined) continue;\n\n    const value = getNestedValue(data, path);\n    const replacement = renderSectionValue(value, content, data);\n\n    result =\n      result.slice(0, match.index) + replacement + result.slice(match.index + fullMatch.length);\n    sectionPattern.lastIndex = 0; // Reset for re-scan\n  }\n\n  return result;\n}\n\n/**\n * Render the replacement content for a section based on the value type.\n */\nfunction renderSectionValue(\n  value: unknown,\n  content: string,\n  data: Record<string, unknown>\n): string {\n  if (Array.isArray(value)) {\n    return renderArraySection(value, content, data);\n  }\n  if (isIterableObject(value)) {\n    return renderObjectSection(value as Record<string, unknown>, content, data);\n  }\n  if (isTruthy(value)) {\n    const processed = processSections(content, data);\n    return processVariables(processed, data);\n  }\n  return '';\n}\n\n/**\n * Render array items in a section loop.\n */\nfunction renderArraySection(\n  items: unknown[],\n  content: string,\n  data: Record<string, unknown>\n): string {\n  let result = '';\n  for (const item of items) {\n    if (typeof item === 'object' && item !== null) {\n      const itemData = { ...data, ...(item as Record<string, unknown>) };\n      const processed = processSections(content, itemData);\n      result += processVariables(processed, itemData);\n    } else {\n      const itemContent = content.replace(/\\{\\{\\.\\}\\}/g, String(item));\n      result += processVariables(itemContent, data);\n    }\n  }\n  return result;\n}\n\n/**\n * Render object entries in a section loop.\n */\nfunction renderObjectSection(\n  obj: Record<string, unknown>,\n  content: string,\n  data: Record<string, unknown>\n): string {\n  let result = '';\n  for (const [key, itemValue] of Object.entries(obj)) {\n    const itemData = buildObjectItemData(data, key, itemValue);\n    const itemContent = content.replace(/\\{\\{\\.\\}\\}/g, key);\n    const processed = processSections(itemContent, itemData);\n    result += processVariables(processed, itemData);\n  }\n  return result;\n}\n\n/**\n * Build data context for an object entry iteration.\n */\nfunction buildObjectItemData(\n  data: Record<string, unknown>,\n  key: string,\n  itemValue: unknown\n): Record<string, unknown> {\n  const baseData = { ...data, _key: key, _value: itemValue };\n  if (typeof itemValue === 'object' && itemValue !== null && !Array.isArray(itemValue)) {\n    return { ...baseData, ...(itemValue as Record<string, unknown>) };\n  }\n  return baseData;\n}\n\n/**\n * Check if a value is an iterable object (not array, not null).\n */\nfunction isIterableObject(value: unknown): boolean {\n  return (\n    typeof value === 'object' &&\n    value !== null &&\n    !Array.isArray(value) &&\n    Object.keys(value).length > 0\n  );\n}\n\n/**\n * Check if a value is truthy for template purposes.\n * Numbers (including 0) are considered truthy for display.\n */\nfunction isTruthy(value: unknown): boolean {\n  if (value === null || value === undefined) return false;\n  if (typeof value === 'boolean') return value;\n  if (typeof value === 'string') return value.length > 0;\n  if (typeof value === 'number') return true; // 0 is truthy for display\n  if (Array.isArray(value)) return value.length > 0;\n  return true;\n}\n\n/**\n * Process {{variable}} and {{variable | filter}} placeholders.\n */\nfunction processVariables(template: string, data: Record<string, unknown>): string {\n  // Match {{path}} or {{path | filter}}\n  return template.replace(\n    /\\{\\{([\\w.]+)(?:\\s*\\|\\s*(\\w+))?\\}\\}/g,\n    (_match, path: string, filterName?: string) => {\n      const value = getNestedValue(data, path);\n\n      if (value === undefined || value === null) {\n        return '';\n      }\n\n      // Apply filter if specified\n      if (filterName && FILTERS[filterName]) {\n        return FILTERS[filterName](value);\n      }\n\n      return String(value);\n    }\n  );\n}\n\n/**\n * Get a nested value from an object using dot notation.\n */\nfunction getNestedValue(obj: Record<string, unknown>, path: string): unknown {\n  const parts = path.split('.');\n  let current: unknown = obj;\n\n  for (const part of parts) {\n    if (current === null || current === undefined) {\n      return undefined;\n    }\n    if (typeof current !== 'object') {\n      return undefined;\n    }\n    current = (current as Record<string, unknown>)[part];\n  }\n\n  return current;\n}\n\n/**\n * Default template (inline fallback).\n */\nconst DEFAULT_TEMPLATE = `# Weekly Meeting Digest\n**{{period.from}} to {{period.to}}**\n\n## Overview\n- **{{totalMeetings}}** meetings\n- **{{totalDuration | duration}}** total time\n- **{{actionItems.total}}** action items\n\n## Meeting Stats\n{{#stats.meetingsByDay}}\n- {{.}}\n{{/stats.meetingsByDay}}\n\nBusiest day: {{stats.busiestDay}}\nAverage duration: {{stats.averageDuration}} minutes\n\n## Action Items\n{{#actionItems.byAssignee}}\n### {{.}}\n{{/actionItems.byAssignee}}\n\n{{#actionItems.unassigned}}\n### Unassigned\n- [ ] {{text}}\n{{/actionItems.unassigned}}\n\n## Highlights\n{{#highlights}}\n### {{meetingTitle}} ({{meetingDate | date}})\n{{#keyPoints}}\n- {{.}}\n{{/keyPoints}}\n{{/highlights}}\n\n## Participants\n{{#participants}}\n- {{email}} ({{meetingCount}} meetings, {{totalMinutes | duration}})\n{{/participants}}\n\n---\n*Generated with fireflies-api*\n`;\n\n/**\n * Compact template (inline fallback).\n */\nconst COMPACT_TEMPLATE = `# Weekly Digest: {{period.from}} - {{period.to}}\n\n**{{totalMeetings}}** meetings | **{{totalDuration | duration}}** | **{{actionItems.total}}** action items\n\n{{#actionItems.unassigned}}\n## Action Items\n- [ ] {{text}}\n{{/actionItems.unassigned}}\n`;\n\n/**\n * Executive template (inline fallback).\n */\nconst EXECUTIVE_TEMPLATE = `# Executive Summary\n**Weekly Meeting Report: {{period.from}} to {{period.to}}**\n\n## Key Metrics\n| Metric | Value |\n|--------|-------|\n| Total Meetings | {{totalMeetings}} |\n| Total Time | {{totalDuration | duration}} |\n| Action Items | {{actionItems.total}} |\n| Participants | {{participants.length}} |\n\n## Top Highlights\n{{#highlights}}\n- **{{meetingTitle}}**: {{#keyPoints}}{{.}} {{/keyPoints}}\n{{/highlights}}\n\n## Outstanding Action Items\n{{#actionItems.unassigned}}\n- {{text}}\n{{/actionItems.unassigned}}\n\n---\n*Executive Summary generated with fireflies-api*\n`;\n","/**\n * Calculate a date relative to today.\n */\nexport function daysAgo(days: number): string {\n  const date = new Date();\n  date.setDate(date.getDate() - days);\n  date.setHours(0, 0, 0, 0);\n  return date.toISOString();\n}\n\n/**\n * Get start of today.\n */\nexport function startOfToday(): string {\n  const date = new Date();\n  date.setHours(0, 0, 0, 0);\n  return date.toISOString();\n}\n\nexport interface DateRange {\n  fromDate?: string;\n  toDate?: string;\n}\n\nexport interface DateRangeOptions {\n  from?: string;\n  to?: string;\n  today?: boolean;\n  yesterday?: boolean;\n  lastWeek?: boolean;\n  lastMonth?: boolean;\n  days?: string;\n}\n\n/**\n * Resolve date range from options, preferring relative dates over explicit ones.\n */\nexport function resolveDateRange(opts: DateRangeOptions): DateRange {\n  // Relative date shortcuts take precedence\n  if (opts.today) {\n    return { fromDate: startOfToday() };\n  }\n  if (opts.yesterday) {\n    return { fromDate: daysAgo(1), toDate: startOfToday() };\n  }\n  if (opts.lastWeek) {\n    return { fromDate: daysAgo(7) };\n  }\n  if (opts.lastMonth) {\n    return { fromDate: daysAgo(30) };\n  }\n  if (opts.days) {\n    const numDays = Number.parseInt(opts.days, 10);\n    if (!Number.isNaN(numDays) && numDays > 0) {\n      return { fromDate: daysAgo(numDays) };\n    }\n  }\n\n  // Fall back to explicit dates\n  return { fromDate: opts.from, toDate: opts.to };\n}\n","import ora, { type Ora } from 'ora';\n\n/**\n * Options for creating a progress indicator.\n */\nexport interface ProgressOptions {\n  /** Whether progress is enabled. */\n  enabled: boolean;\n  /** Initial text to display. */\n  text?: string;\n}\n\n/**\n * Create a progress spinner.\n *\n * Returns null if progress is disabled or stdout is not a TTY.\n * The spinner writes to stderr to avoid interfering with piped output.\n *\n * @param opts - Progress options\n * @returns Ora spinner instance or null\n */\nexport function createProgress(opts: ProgressOptions): Ora | null {\n  if (!opts.enabled || !process.stderr.isTTY) {\n    return null;\n  }\n  return ora({ text: opts.text, stream: process.stderr });\n}\n\n/**\n * Execute a task with progress indication.\n *\n * Shows a spinner while the task runs, updating text via the callback.\n * Spinner shows success/failure state when complete.\n *\n * @param opts - Progress options\n * @param task - Async function to execute, receives an update callback\n * @returns Result of the task\n *\n * @example\n * ```typescript\n * const result = await withProgress(\n *   { enabled: true, text: 'Loading...' },\n *   async (update) => {\n *     for await (const item of items) {\n *       count++;\n *       update(`Loading... ${count}`);\n *     }\n *     return items;\n *   }\n * );\n * ```\n */\nexport async function withProgress<T>(\n  opts: ProgressOptions,\n  task: (update: (text: string) => void) => Promise<T>\n): Promise<T> {\n  const spinner = createProgress(opts);\n  spinner?.start();\n\n  const update = (text: string): void => {\n    if (spinner) {\n      spinner.text = text;\n    }\n  };\n\n  try {\n    const result = await task(update);\n    spinner?.succeed();\n    return result;\n  } catch (err) {\n    spinner?.fail();\n    throw err;\n  }\n}\n","import { writeFileSync } from 'node:fs';\nimport type { Command } from 'commander';\nimport { buildDigest } from '../../helpers/digest.js';\nimport { renderDigest, renderDigestHtml } from '../../helpers/digest-templates.js';\nimport type { WeeklyDigest } from '../../types/digest.js';\nimport type { Transcript } from '../../types/transcript.js';\nimport { getClient, getOutputFormat, isProgressEnabled } from '../utils/client.js';\nimport { resolveDateRange } from '../utils/date.js';\nimport { withErrorHandling } from '../utils/error.js';\nimport { output, writeLine } from '../utils/output.js';\nimport { withProgress } from '../utils/progress.js';\n\ninterface DigestResult {\n  digest: WeeklyDigest | null;\n  rendered: string | null;\n  transcriptCount: number;\n}\n\ninterface DigestOptions {\n  actionItems: boolean;\n  highlights: boolean;\n  statsOnly: boolean;\n  template: string;\n  format?: string;\n}\n\nfunction buildDigestFromTranscripts(transcripts: Transcript[], opts: DigestOptions): WeeklyDigest {\n  return buildDigest(transcripts, {\n    includeActionItems: opts.actionItems !== false && !opts.statsOnly,\n    includeHighlights: opts.highlights !== false && !opts.statsOnly,\n    includeStats: true,\n  });\n}\n\nfunction renderDigestOutput(digest: WeeklyDigest, outputFormat: string, template: string): string {\n  if (outputFormat === 'json') {\n    return JSON.stringify(digest, null, 2);\n  }\n  if (outputFormat === 'html') {\n    return renderDigestHtml(digest);\n  }\n  return renderDigest(digest, { template });\n}\n\nexport function registerDigestCommand(program: Command): void {\n  program\n    .command('digest')\n    .description('Generate a weekly meeting digest')\n    // Date filtering\n    .option('--from <date>', 'From date (YYYY-MM-DD or ISO 8601)')\n    .option('--to <date>', 'To date (YYYY-MM-DD or ISO 8601)')\n    .option('--today', 'Meetings from today')\n    .option('--yesterday', 'Meetings from yesterday')\n    .option('--last-week', 'Meetings from last 7 days')\n    .option('--last-month', 'Meetings from last 30 days')\n    .option('--days <n>', 'Meetings from last N days')\n    // Transcript filtering\n    .option('--mine', 'Only my transcripts')\n    .option('--external', 'Only meetings with external (non-company) participants')\n    .option('--limit <n>', 'Max transcripts to include')\n    // Template options\n    .option(\n      '--template <name>',\n      'Template: default, compact, executive, or path to .md file',\n      'default'\n    )\n    // Output options\n    .option('-o, --output-file <path>', 'Write digest to file')\n    .option('--format <format>', 'Output format: markdown, html, json (default: markdown)')\n    // Content options\n    .option('--no-action-items', 'Exclude action items section')\n    .option('--no-highlights', 'Exclude highlights section')\n    .option('--stats-only', 'Only show meeting statistics')\n    .action(\n      withErrorHandling(async (opts) => {\n        const client = getClient(program);\n        const format = getOutputFormat(program);\n        const showProgress = isProgressEnabled(program);\n        const { fromDate, toDate } = resolveDateRange(opts);\n\n        // Require at least one date constraint\n        if (!fromDate && !toDate) {\n          writeLine('Error: Please specify a date range (--from, --to, --last-week, etc.)');\n          process.exitCode = 1;\n          return;\n        }\n\n        const digestOutput = await withProgress(\n          { enabled: showProgress, text: 'Generating digest...' },\n          async (update): Promise<DigestResult> => {\n            update('Fetching transcripts...');\n            const transcripts = await client.transcripts.list({\n              fromDate,\n              toDate,\n              mine: opts.mine,\n              external: opts.external,\n              limit: opts.limit ? Number.parseInt(opts.limit, 10) : undefined,\n              includeSummary: true,\n            });\n\n            if (transcripts.length === 0) {\n              return { digest: null, rendered: null, transcriptCount: 0 };\n            }\n\n            update(`Building digest from ${transcripts.length} transcripts...`);\n            const digest = buildDigestFromTranscripts(transcripts, opts);\n\n            update('Rendering output...');\n            const outputFormat = opts.format || (format === 'json' ? 'json' : 'markdown');\n            const rendered = renderDigestOutput(digest, outputFormat, opts.template);\n\n            return { digest, rendered, transcriptCount: transcripts.length };\n          }\n        );\n\n        // Handle empty result\n        if (!digestOutput.digest || !digestOutput.rendered) {\n          writeLine('No transcripts found for the specified date range.');\n          return;\n        }\n\n        // Output result\n        if (opts.outputFile) {\n          writeFileSync(opts.outputFile, digestOutput.rendered);\n          writeLine(\n            `✓ Digest written to ${opts.outputFile} (${digestOutput.digest.actionItems.total} action items, ${digestOutput.transcriptCount} meetings)`\n          );\n        } else if (format === 'json') {\n          output(digestOutput.digest, 'json');\n        } else {\n          writeLine(digestOutput.rendered);\n        }\n      })\n    );\n}\n","import { writeFile } from 'node:fs/promises';\nimport type { Command } from 'commander';\nimport { transcriptToMarkdown } from '../../helpers/markdown.js';\nimport { getClient, getOutputFormat } from '../utils/client.js';\nimport { withErrorHandling } from '../utils/error.js';\nimport { output } from '../utils/output.js';\n\nexport function registerExportCommand(program: Command): void {\n  program\n    .command('export <transcript-id> [output-file]')\n    .description('Export transcript to markdown')\n    .option('--no-summary', 'Exclude summary section')\n    .option('--no-timestamps', 'Exclude timestamps')\n    .option('--format <format>', 'Output format: markdown, json', 'markdown')\n    .action(\n      withErrorHandling(async (transcriptId: string, outputFile: string | undefined, opts) => {\n        const client = getClient(program);\n        const cliFormat = getOutputFormat(program);\n\n        const transcript = await client.transcripts.get(transcriptId);\n\n        if (opts.format === 'json') {\n          if (outputFile) {\n            await writeFile(outputFile, JSON.stringify(transcript, null, 2), 'utf-8');\n            console.log(`Exported to ${outputFile}`);\n          } else {\n            output(transcript, cliFormat);\n          }\n          return;\n        }\n\n        // Default: markdown format\n        const markdown = await transcriptToMarkdown(transcript, {\n          includeSummary: opts.summary,\n          includeTimestamps: opts.timestamps,\n        });\n\n        if (outputFile) {\n          await writeFile(outputFile, markdown, 'utf-8');\n          console.log(`Exported to ${outputFile}`);\n        } else {\n          console.log(markdown);\n        }\n      })\n    );\n}\n","import { mkdir, writeFile } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport type { Command } from 'commander';\nimport type { FirefliesClient } from '../../client.js';\nimport type { BulkExportResult, ExportFormat } from '../../types/bulk-export.js';\nimport { getClient, isProgressEnabled } from '../utils/client.js';\nimport { resolveDateRange } from '../utils/date.js';\nimport { withErrorHandling } from '../utils/error.js';\nimport { writeLine } from '../utils/output.js';\nimport { withProgress } from '../utils/progress.js';\n\ninterface ExportOptions {\n  fromDate?: string;\n  toDate?: string;\n  ids?: string[];\n  mine?: boolean;\n  external?: boolean;\n  limit?: number;\n  format: ExportFormat;\n  asZip: boolean;\n  outputPath: string;\n}\n\n/**\n * Register the export-bulk command.\n */\nexport function registerExportBulkCommand(program: Command): void {\n  program\n    .command('export-bulk')\n    .description('Export multiple transcripts to files')\n    // Date filtering\n    .option('--from <date>', 'From date (YYYY-MM-DD or ISO 8601)')\n    .option('--to <date>', 'To date (YYYY-MM-DD or ISO 8601)')\n    .option('--today', 'Meetings from today')\n    .option('--yesterday', 'Meetings from yesterday')\n    .option('--last-week', 'Meetings from last 7 days')\n    .option('--last-month', 'Meetings from last 30 days')\n    .option('--days <n>', 'Meetings from last N days')\n    // Transcript filtering\n    .option('--ids <ids>', 'Comma-separated transcript IDs')\n    .option('--mine', 'Only my transcripts')\n    .option('--external', 'Only meetings with external (non-company) participants')\n    .option('--limit <n>', 'Max transcripts to export')\n    // Output options\n    .requiredOption('-d, --dest <path>', 'Output directory or .zip file')\n    .option(\n      '--format <format>',\n      'Export format: markdown, json, txt, csv (default: markdown)',\n      'markdown'\n    )\n    .option('--zip', 'Package as zip archive')\n    .option('--dry-run', 'Show what would be exported without writing files')\n    .action(\n      withErrorHandling(async (opts: CliOptions) => {\n        const client = getClient(program);\n        const showProgress = isProgressEnabled(program);\n\n        const exportOpts = parseExportOptions(opts);\n        if (!exportOpts) return;\n\n        if (opts.dryRun) {\n          await runDryMode(client, exportOpts);\n          return;\n        }\n\n        await runExport(client, exportOpts, showProgress);\n      })\n    );\n}\n\ninterface CliOptions {\n  from?: string;\n  to?: string;\n  today?: boolean;\n  yesterday?: boolean;\n  lastWeek?: boolean;\n  lastMonth?: boolean;\n  days?: string;\n  ids?: string;\n  mine?: boolean;\n  external?: boolean;\n  limit?: string;\n  dest: string;\n  format: string;\n  zip?: boolean;\n  dryRun?: boolean;\n}\n\n/**\n * Parse and validate CLI options.\n */\nfunction parseExportOptions(opts: CliOptions): ExportOptions | null {\n  const { fromDate, toDate } = resolveDateRange(opts);\n  const format = validateFormat(opts.format);\n  const outputPath = opts.dest;\n  const asZip = Boolean(opts.zip) || outputPath.endsWith('.zip');\n  const ids = opts.ids ? opts.ids.split(',').map((id) => id.trim()) : undefined;\n\n  if (!fromDate && !toDate && !ids) {\n    writeLine('Error: Please specify a date range (--from, --to, --last-week, etc.) or --ids');\n    process.exitCode = 1;\n    return null;\n  }\n\n  return {\n    fromDate,\n    toDate,\n    ids,\n    mine: opts.mine,\n    external: opts.external,\n    limit: opts.limit ? Number.parseInt(opts.limit, 10) : undefined,\n    format,\n    asZip,\n    outputPath,\n  };\n}\n\n/**\n * Execute the bulk export.\n */\nasync function runExport(\n  client: FirefliesClient,\n  opts: ExportOptions,\n  showProgress: boolean\n): Promise<void> {\n  const result = await withProgress(\n    { enabled: showProgress, text: 'Exporting transcripts...' },\n    async (update) => {\n      return client.transcripts.bulkExport({\n        fromDate: opts.fromDate,\n        toDate: opts.toDate,\n        ids: opts.ids,\n        mine: opts.mine,\n        external: opts.external,\n        limit: opts.limit,\n        format: opts.format,\n        asZip: opts.asZip,\n        onProgress: (completed, total) => {\n          update(`Exporting transcripts... ${completed}/${total}`);\n        },\n      });\n    }\n  );\n\n  await writeExportResult(result, opts);\n}\n\n/**\n * Write export result to disk.\n */\nasync function writeExportResult(result: BulkExportResult, opts: ExportOptions): Promise<void> {\n  if (result.totalExported === 0) {\n    writeLine('No transcripts found matching the criteria.');\n    return;\n  }\n\n  if (opts.asZip && result.zip) {\n    await writeFile(opts.outputPath, result.zip);\n    writeLine(`✓ Exported ${result.totalExported} transcripts to ${opts.outputPath}`);\n  } else {\n    await mkdir(opts.outputPath, { recursive: true });\n    for (const file of result.files) {\n      await writeFile(join(opts.outputPath, file.filename), file.content);\n    }\n    writeLine(`✓ Exported ${result.totalExported} transcripts to ${opts.outputPath}/`);\n  }\n}\n\n/**\n * Validate and return the export format.\n */\nfunction validateFormat(format: string): ExportFormat {\n  const validFormats: ExportFormat[] = ['markdown', 'json', 'txt', 'csv'];\n  if (!validFormats.includes(format as ExportFormat)) {\n    throw new Error(`Invalid format \"${format}\". Valid formats: ${validFormats.join(', ')}`);\n  }\n  return format as ExportFormat;\n}\n\n/**\n * Run in dry-run mode - show what would be exported without writing files.\n */\nasync function runDryMode(client: FirefliesClient, params: ExportOptions): Promise<void> {\n  writeLine('Dry run - no files will be written\\n');\n\n  const transcripts = await collectDryRunTranscripts(client, params);\n  printDryRunResults(transcripts, params);\n}\n\n/**\n * Collect transcripts for dry-run preview.\n */\nasync function collectDryRunTranscripts(\n  client: FirefliesClient,\n  params: ExportOptions\n): Promise<Array<{ id: string; title: string; date: string }>> {\n  const transcripts: Array<{ id: string; title: string; date: string }> = [];\n\n  if (params.ids?.length) {\n    for (const id of params.ids) {\n      try {\n        const t = await client.transcripts.get(id, {\n          includeSentences: false,\n          includeSummary: false,\n        });\n        transcripts.push({ id: t.id, title: t.title, date: t.dateString || 'Unknown' });\n      } catch {\n        writeLine(`  ⚠ Transcript ${id} not found`);\n      }\n    }\n  } else {\n    for await (const t of client.transcripts.listAll({\n      fromDate: params.fromDate,\n      toDate: params.toDate,\n      mine: params.mine,\n    })) {\n      transcripts.push({ id: t.id, title: t.title, date: t.dateString || 'Unknown' });\n      if (params.limit && transcripts.length >= params.limit) break;\n    }\n  }\n\n  return transcripts;\n}\n\n/**\n * Print dry-run results.\n */\nfunction printDryRunResults(\n  transcripts: Array<{ id: string; title: string; date: string }>,\n  params: ExportOptions\n): void {\n  if (transcripts.length === 0) {\n    writeLine('No transcripts found matching the criteria.');\n    return;\n  }\n\n  writeLine(`Would export ${transcripts.length} transcripts:\\n`);\n  for (const t of transcripts) {\n    const dateStr = t.date !== 'Unknown' ? new Date(t.date).toLocaleDateString() : 'Unknown';\n    writeLine(`  ${dateStr} - ${t.title}`);\n  }\n\n  writeLine('');\n  writeLine(`Format: ${params.format}`);\n  writeLine(`Output: ${params.outputPath}${params.asZip ? '' : '/'}`);\n}\n","import type { Command } from 'commander';\nimport type {\n  DayOfWeekStats,\n  MeetingInsights,\n  ParticipantStats,\n  SpeakerInsightStats,\n} from '../../types/meeting-insights.js';\nimport { getClient, getOutputFormat, isProgressEnabled } from '../utils/client.js';\nimport { resolveDateRange } from '../utils/date.js';\nimport { withErrorHandling } from '../utils/error.js';\nimport { output, writeLine } from '../utils/output.js';\nimport { formatDuration } from '../utils/parse.js';\nimport { withProgress } from '../utils/progress.js';\n\n/**\n * Collect repeatable option values into an array.\n */\nfunction collect(value: string, previous: string[]): string[] {\n  return previous.concat([value]);\n}\n\nexport function registerInsightsCommand(program: Command): void {\n  program\n    .command('insights')\n    .description('Get aggregate meeting insights')\n    // Date filtering\n    .option('--from <date>', 'From date (YYYY-MM-DD or ISO 8601)')\n    .option('--to <date>', 'To date (YYYY-MM-DD or ISO 8601)')\n    .option('--today', 'Meetings from today')\n    .option('--yesterday', 'Meetings from yesterday')\n    .option('--last-week', 'Meetings from last 7 days')\n    .option('--last-month', 'Meetings from last 30 days')\n    .option('--days <n>', 'Meetings from last N days')\n    // Transcript filtering\n    .option('--mine', 'Only my transcripts')\n    .option('--organizer <email>', 'Filter by organizer email (repeatable)', collect, [])\n    .option('--participant <email>', 'Filter by participant email (repeatable)', collect, [])\n    .option('--user-id <id>', 'Filter by user ID')\n    .option('--channel <id>', 'Filter by channel ID')\n    .option('--limit <n>', 'Max transcripts to analyze')\n    .option('--external', 'Only meetings with external (non-company) participants')\n    // Analysis options\n    .option('--speaker <name>', 'Only stats for specific speaker(s) (repeatable)', collect, [])\n    .option('--group-by <period>', 'Group by: day, week, month')\n    .option('--top <n>', 'Top N speakers/participants (default: 10)')\n    .action(\n      withErrorHandling(async (opts) => {\n        const client = getClient(program);\n        const format = getOutputFormat(program);\n        const showProgress = isProgressEnabled(program);\n        const { fromDate, toDate } = resolveDateRange(opts);\n\n        const insights = await withProgress(\n          { enabled: showProgress, text: 'Analyzing meetings...' },\n          async () => client.transcripts.insights(buildInsightsParams(opts, fromDate, toDate))\n        );\n\n        outputInsights(insights, format);\n      })\n    );\n}\n\ninterface CommandOptions {\n  mine?: boolean;\n  organizer: string[];\n  participant: string[];\n  userId?: string;\n  channel?: string;\n  limit?: string;\n  external?: boolean;\n  speaker: string[];\n  groupBy?: string;\n  top?: string;\n}\n\nfunction buildInsightsParams(opts: CommandOptions, fromDate?: string, toDate?: string) {\n  const topCount = opts.top ? Number.parseInt(opts.top, 10) : undefined;\n  return {\n    fromDate,\n    toDate,\n    mine: opts.mine,\n    organizers: opts.organizer.length > 0 ? opts.organizer : undefined,\n    participants: opts.participant.length > 0 ? opts.participant : undefined,\n    user_id: opts.userId,\n    channel_id: opts.channel,\n    limit: opts.limit ? Number.parseInt(opts.limit, 10) : undefined,\n    external: opts.external,\n    speakers: opts.speaker.length > 0 ? opts.speaker : undefined,\n    groupBy: opts.groupBy as 'day' | 'week' | 'month' | undefined,\n    topSpeakersCount: topCount,\n    topParticipantsCount: topCount,\n  };\n}\n\nfunction outputInsights(insights: MeetingInsights, format: string): void {\n  if (format === 'plain') {\n    outputInsightsPlain(insights);\n    return;\n  }\n\n  if (format === 'table') {\n    outputInsightsTable(insights);\n    return;\n  }\n\n  // json, jsonl, tsv: full object\n  output(insights, format as 'json' | 'jsonl' | 'tsv');\n}\n\nfunction outputInsightsPlain(insights: MeetingInsights): void {\n  outputHeader(insights);\n  outputSummaryStats(insights);\n  outputDayOfWeekStats(insights.byDayOfWeek);\n  outputTimeGroupStats(insights.byTimeGroup);\n  outputParticipantStats(insights);\n  outputSpeakerStats(insights);\n}\n\nfunction outputHeader(insights: MeetingInsights): void {\n  const dateRange = formatDateRangeHeader(insights.earliestMeeting, insights.latestMeeting);\n  writeLine(`Meeting Insights (${dateRange})`);\n  writeLine('='.repeat(50));\n  writeLine('');\n}\n\nfunction outputSummaryStats(insights: MeetingInsights): void {\n  writeLine(`Total meetings: ${insights.totalMeetings}`);\n  writeLine(`Total duration: ${formatDuration(insights.totalDurationMinutes * 60)}`);\n  writeLine(`Average duration: ${Math.round(insights.averageDurationMinutes)} min`);\n  writeLine('');\n}\n\nfunction outputDayOfWeekStats(byDayOfWeek: DayOfWeekStats): void {\n  writeLine('Meetings by Day:');\n  const sortedDays = getSortedDays(byDayOfWeek);\n  for (const { day, stats } of sortedDays) {\n    if (stats.count > 0) {\n      const duration = formatDuration(stats.totalMinutes * 60);\n      writeLine(`  ${capitalize(day)}: ${stats.count} meetings (${duration})`);\n    }\n  }\n  writeLine('');\n}\n\nfunction outputTimeGroupStats(byTimeGroup?: MeetingInsights['byTimeGroup']): void {\n  if (!byTimeGroup || byTimeGroup.length === 0) return;\n\n  writeLine('By Period:');\n  for (const group of byTimeGroup) {\n    const duration = formatDuration(group.totalMinutes * 60);\n    const avg = Math.round(group.averageMinutes);\n    writeLine(`  ${group.period}: ${group.count} meetings (${duration}, avg ${avg} min)`);\n  }\n  writeLine('');\n}\n\nfunction outputParticipantStats(insights: MeetingInsights): void {\n  const avgPart = insights.averageParticipantsPerMeeting.toFixed(1);\n  writeLine(\n    `Participants: ${insights.totalUniqueParticipants} unique (avg ${avgPart} per meeting)`\n  );\n\n  if (insights.topParticipants.length > 0) {\n    writeLine('Top Participants:');\n    outputTopParticipants(insights.topParticipants.slice(0, 5));\n  }\n  writeLine('');\n}\n\nfunction outputTopParticipants(participants: ParticipantStats[]): void {\n  for (let i = 0; i < participants.length; i++) {\n    const p = participants[i];\n    if (p) {\n      writeLine(`  ${i + 1}. ${p.email} (${p.meetingCount} meetings)`);\n    }\n  }\n}\n\nfunction outputSpeakerStats(insights: MeetingInsights): void {\n  writeLine(`Speakers: ${insights.totalUniqueSpeakers} unique`);\n  if (insights.topSpeakers.length > 0) {\n    writeLine('Top Speakers:');\n    outputTopSpeakers(insights.topSpeakers.slice(0, 5));\n  }\n}\n\nfunction outputTopSpeakers(speakers: SpeakerInsightStats[]): void {\n  for (let i = 0; i < speakers.length; i++) {\n    const s = speakers[i];\n    if (s) {\n      const talkTime = formatDuration(s.totalTalkTimeSeconds);\n      writeLine(`  ${i + 1}. ${s.name} (${s.meetingCount} meetings, ${talkTime} talk time)`);\n    }\n  }\n}\n\nfunction outputInsightsTable(insights: MeetingInsights): void {\n  const summary = {\n    totalMeetings: insights.totalMeetings,\n    totalDuration: formatDuration(insights.totalDurationMinutes * 60),\n    avgDuration: `${Math.round(insights.averageDurationMinutes)} min`,\n    dateRange: `${insights.earliestMeeting} to ${insights.latestMeeting}`,\n    uniqueParticipants: insights.totalUniqueParticipants,\n    avgParticipants: insights.averageParticipantsPerMeeting.toFixed(1),\n    uniqueSpeakers: insights.totalUniqueSpeakers,\n  };\n\n  output(summary, 'table');\n}\n\nfunction formatDateRangeHeader(earliest: string, latest: string): string {\n  if (!earliest && !latest) return 'All time';\n  if (earliest === latest) return formatReadableDate(earliest);\n  return `${formatReadableDate(earliest)} - ${formatReadableDate(latest)}`;\n}\n\nfunction formatReadableDate(dateStr: string): string {\n  if (!dateStr) return 'Unknown';\n  const date = new Date(dateStr);\n  return date.toLocaleDateString('en-US', { month: 'short', day: 'numeric', year: 'numeric' });\n}\n\ntype DayName = keyof DayOfWeekStats;\n\nfunction getSortedDays(\n  byDayOfWeek: DayOfWeekStats\n): Array<{ day: DayName; stats: DayOfWeekStats[DayName] }> {\n  const dayOrder: DayName[] = [\n    'monday',\n    'tuesday',\n    'wednesday',\n    'thursday',\n    'friday',\n    'saturday',\n    'sunday',\n  ];\n\n  return dayOrder\n    .map((day) => ({ day, stats: byDayOfWeek[day] }))\n    .sort((a, b) => b.stats.count - a.stats.count);\n}\n\nfunction capitalize(str: string): string {\n  return str.charAt(0).toUpperCase() + str.slice(1);\n}\n","import type { Command } from 'commander';\nimport type { MeetingState } from '../../types/meeting.js';\nimport { getClient, getOutputFormat } from '../utils/client.js';\nimport { withErrorHandling } from '../utils/error.js';\nimport { output } from '../utils/output.js';\n\nexport function registerMeetingsCommand(program: Command): void {\n  const cmd = program.command('meetings').description('Active meetings and bot control');\n\n  cmd\n    .command('list')\n    .description('List active meetings')\n    .option('--state <state>', 'Filter by state: active, paused')\n    .option('--email <email>', 'Filter by user email (admin only)')\n    .action(\n      withErrorHandling(async (opts) => {\n        const client = getClient(program);\n        const format = getOutputFormat(program);\n\n        const states = opts.state ? ([opts.state] as MeetingState[]) : undefined;\n        const meetings = await client.meetings.active({\n          states,\n          email: opts.email,\n        });\n\n        const formatted = meetings.map((m) => ({\n          id: m.id,\n          title: m.title,\n          organizer: m.organizer_email,\n          state: m.state,\n          start_time: m.start_time,\n        }));\n\n        output(formatted, format);\n      })\n    );\n\n  cmd\n    .command('add-bot <url>')\n    .description('Add Fireflies bot to a meeting')\n    .option('--title <title>', 'Meeting title')\n    .option('--duration <min>', 'Max duration in minutes (15-120)', '60')\n    .option('--password <password>', 'Meeting password')\n    .option('--language <lang>', 'Language code')\n    .action(\n      withErrorHandling(async (url: string, opts) => {\n        const client = getClient(program);\n        const format = getOutputFormat(program);\n\n        const result = await client.meetings.addBot({\n          meeting_link: url,\n          title: opts.title,\n          duration: Number.parseInt(opts.duration, 10),\n          password: opts.password,\n          language: opts.language,\n        });\n\n        output(result, format);\n      })\n    );\n}\n","import type { Command } from 'commander';\nimport { getClient, getOutputFormat } from '../utils/client.js';\nimport { withErrorHandling } from '../utils/error.js';\nimport { outputLine, writeLine } from '../utils/output.js';\n\nexport function registerRealtimeCommand(program: Command): void {\n  program\n    .command('realtime <meeting-id>')\n    .description('Stream live transcription to stdout')\n    .action(\n      withErrorHandling(async (meetingId: string) => {\n        const client = getClient(program);\n        const format = getOutputFormat(program);\n\n        // Set up graceful shutdown\n        let closing = false;\n        const shutdown = () => {\n          if (!closing) {\n            closing = true;\n            process.exit(0);\n          }\n        };\n        process.on('SIGINT', shutdown);\n        process.on('SIGTERM', shutdown);\n\n        // Stream transcription chunks\n        for await (const chunk of client.realtime.stream(meetingId)) {\n          if (closing) break;\n\n          if (format === 'plain' || format === 'table') {\n            // Human-readable text format\n            writeLine(`[${chunk.speaker_name}]: ${chunk.text}`);\n          } else {\n            // json, jsonl, tsv all output line-delimited JSON for streaming\n            outputLine(chunk);\n          }\n        }\n      })\n    );\n}\n","import type { Command } from 'commander';\nimport type { SearchMatch, SearchResults } from '../../types/search.js';\nimport {\n  getClient,\n  getOutputFormat,\n  isProgressEnabled,\n  type OutputFormat,\n} from '../utils/client.js';\nimport { resolveDateRange } from '../utils/date.js';\nimport { withErrorHandling } from '../utils/error.js';\nimport { output, writeLine } from '../utils/output.js';\nimport { withProgress } from '../utils/progress.js';\n\n/**\n * Collect repeatable option values into an array.\n */\nfunction collect(value: string, previous: string[]): string[] {\n  return previous.concat([value]);\n}\n\n/**\n * Format time in seconds to MM:SS format.\n */\nfunction formatTime(seconds: number): string {\n  const mins = Math.floor(seconds / 60);\n  const secs = Math.floor(seconds % 60);\n  return `${mins}:${secs.toString().padStart(2, '0')}`;\n}\n\n/**\n * Build flags string for a match (Q for question, T for task).\n */\nfunction buildFlags(match: SearchMatch): string {\n  const flags: string[] = [];\n  if (match.sentence.isQuestion) flags.push('Q');\n  if (match.sentence.isTask) flags.push('T');\n  return flags.length > 0 ? ` [${flags.join(',')}]` : '';\n}\n\n/**\n * Output a single match in plain format.\n */\nfunction outputMatchPlain(match: SearchMatch): void {\n  // Print context before\n  for (const ctx of match.context.before) {\n    writeLine(`  [${ctx.speakerName}] ${ctx.text}`);\n  }\n\n  // Print matched sentence (highlighted)\n  const time = formatTime(match.sentence.startTime);\n  const flagStr = buildFlags(match);\n  writeLine(`> [${time}] [${match.sentence.speakerName}]${flagStr} ${match.sentence.text}`);\n\n  // Print context after\n  for (const ctx of match.context.after) {\n    writeLine(`  [${ctx.speakerName}] ${ctx.text}`);\n  }\n  writeLine('');\n}\n\n/**\n * Output results in plain text format.\n */\nfunction outputPlain(results: SearchResults): void {\n  writeLine(\n    `Found ${results.totalMatches} matches in ${results.transcriptsWithMatches}/${results.transcriptsSearched} transcripts`\n  );\n  writeLine('');\n\n  let currentTranscript = '';\n  for (const match of results.matches) {\n    // Print transcript header when it changes\n    if (match.transcriptId !== currentTranscript) {\n      currentTranscript = match.transcriptId;\n      writeLine(`--- ${match.transcriptTitle} (${match.transcriptDate.split('T')[0]}) ---`);\n      writeLine(`    ${match.transcriptUrl}`);\n      writeLine('');\n    }\n    outputMatchPlain(match);\n  }\n}\n\n/**\n * Output results in table/TSV format.\n */\nfunction outputTabular(results: SearchResults, format: OutputFormat): void {\n  const rows = results.matches.map((match) => ({\n    transcript: match.transcriptTitle.slice(0, 40),\n    date: match.transcriptDate.split('T')[0],\n    time: formatTime(match.sentence.startTime),\n    speaker: match.sentence.speakerName,\n    text: match.sentence.text.slice(0, 80),\n    isQuestion: match.sentence.isQuestion ? 'Y' : '',\n    isTask: match.sentence.isTask ? 'Y' : '',\n  }));\n  output(rows, format);\n}\n\n/**\n * Output search results in the specified format.\n *\n * - plain: Human-readable matches with context\n * - table/tsv: Flat rows with transcript info, speaker, text\n * - json/jsonl: Full SearchResults object\n */\nexport function outputSearchResults(results: SearchResults, format: OutputFormat): void {\n  if (format === 'plain') {\n    outputPlain(results);\n    return;\n  }\n\n  if (format === 'table' || format === 'tsv') {\n    outputTabular(results, format);\n    return;\n  }\n\n  // json, jsonl: full results object\n  output(results, format);\n}\n\nexport function registerSearchCommand(program: Command): void {\n  program\n    .command('search <query>')\n    .description('Search across transcripts for matching sentences')\n    .option('--speaker <name>', 'Filter results by speaker name (repeatable)', collect, [])\n    .option('--questions', 'Only show sentences marked as questions')\n    .option('--tasks', 'Only show sentences marked as tasks/action items')\n    .option('--context <n>', 'Number of context sentences (default: 1)', '1')\n    .option('--case-sensitive', 'Match case when searching')\n    .option(\n      '--scope <scope>',\n      'Search scope: title, sentences, all (default: sentences)',\n      'sentences'\n    )\n    .option('--from <date>', 'From date (YYYY-MM-DD or ISO 8601)')\n    .option('--to <date>', 'To date (YYYY-MM-DD or ISO 8601)')\n    .option('--today', 'Search transcripts from today')\n    .option('--yesterday', 'Search transcripts from yesterday')\n    .option('--last-week', 'Search transcripts from last 7 days')\n    .option('--last-month', 'Search transcripts from last 30 days')\n    .option('--days <n>', 'Search transcripts from last N days')\n    .option('--mine', 'Only my transcripts')\n    .option('--organizer <email>', 'Filter by organizer email (repeatable)', collect, [])\n    .option('--participant <email>', 'Filter by participant email (repeatable)', collect, [])\n    .option('--limit <n>', 'Max transcripts to search')\n    .action(\n      withErrorHandling(async (query: string, opts) => {\n        const client = getClient(program);\n        const format = getOutputFormat(program);\n        const showProgress = isProgressEnabled(program);\n        const { fromDate, toDate } = resolveDateRange(opts);\n\n        const results = await withProgress(\n          { enabled: showProgress, text: `Searching for \"${query}\"...` },\n          async () =>\n            client.transcripts.search(query, {\n              caseSensitive: opts.caseSensitive,\n              scope: opts.scope,\n              speakers: opts.speaker.length > 0 ? opts.speaker : undefined,\n              filterQuestions: opts.questions,\n              filterTasks: opts.tasks,\n              contextLines: Number.parseInt(opts.context, 10),\n              fromDate,\n              toDate,\n              mine: opts.mine,\n              organizers: opts.organizer.length > 0 ? opts.organizer : undefined,\n              participants: opts.participant.length > 0 ? opts.participant : undefined,\n              limit: opts.limit ? Number.parseInt(opts.limit, 10) : undefined,\n            })\n        );\n\n        outputSearchResults(results, format);\n      })\n    );\n}\n","import type {\n  NormalizationOptions,\n  NormalizedAnalytics,\n  NormalizedAttendee,\n  NormalizedChannel,\n  NormalizedMeeting,\n  NormalizedParticipant,\n  NormalizedSentence,\n  NormalizedSpeaker,\n  NormalizedSummary,\n} from '../types/normalized.js';\nimport type { Sentence, Speaker, Summary, Transcript } from '../types/transcript.js';\nimport type { BatchResult } from './batch.js';\n\n/**\n * Options for batch normalization, extending NormalizationOptions.\n */\nexport interface BatchNormalizationOptions extends NormalizationOptions {\n  /**\n   * Delay between items in ms.\n   * Since normalization is a pure function, this is typically 0.\n   * @default 0\n   */\n  delayMs?: number;\n}\n\n/**\n * Default options for normalization.\n */\nconst DEFAULT_OPTIONS: Required<NormalizationOptions> = {\n  timeUnit: 'seconds',\n  includeRawData: false,\n  includeAIFilters: true,\n  includeSummary: true,\n  resolveSpeakerName: (speaker: Speaker) => speaker.name,\n  enrichParticipant: () => ({}),\n};\n\n/**\n * Normalize a Fireflies transcript to a provider-agnostic format.\n *\n * This function converts Fireflies-specific transcript data to a normalized schema\n * that can be used across multiple meeting intelligence providers.\n *\n * @param transcript - The Fireflies transcript to normalize\n * @param options - Normalization options\n * @returns A normalized meeting object\n *\n * @example\n * ```typescript\n * import { FirefliesClient, normalizeTranscript } from 'fireflies-api';\n *\n * const client = new FirefliesClient({ apiKey: 'your-api-key' });\n * const transcript = await client.transcripts.get({ id: 'transcript-id' });\n *\n * const normalized = normalizeTranscript(transcript, {\n *   timeUnit: 'milliseconds',\n *   includeRawData: true,\n * });\n *\n * console.log(normalized.id); // \"fireflies:transcript-id\"\n * console.log(normalized.duration); // in seconds\n * ```\n */\nexport function normalizeTranscript(\n  transcript: Transcript,\n  options?: NormalizationOptions\n): NormalizedMeeting {\n  const opts = { ...DEFAULT_OPTIONS, ...options };\n\n  const speakers = normalizeSpeakers(transcript.speakers ?? [], transcript, opts);\n  const sentences = normalizeSentences(transcript.sentences ?? [], opts);\n  const participants = normalizeParticipants(transcript, opts);\n  const summary = opts.includeSummary ? normalizeSummary(transcript.summary) : undefined;\n  const attendees = normalizeAttendees(transcript.meeting_attendance ?? []);\n  const channels = normalizeChannels(transcript.channels ?? []);\n  const analytics = normalizeAnalytics(transcript.analytics);\n\n  return {\n    id: `fireflies:${transcript.id}`,\n    title: transcript.title,\n    date: new Date(transcript.date),\n    duration: transcript.duration * 60, // minutes → seconds\n    url: transcript.transcript_url,\n\n    speakers,\n    sentences,\n    participants,\n\n    summary,\n    attendees,\n    channels,\n    analytics,\n\n    source: {\n      provider: 'fireflies',\n      originalId: transcript.id,\n      rawData: opts.includeRawData ? transcript : undefined,\n    },\n  };\n}\n\n/**\n * Create a pre-configured normalizer function.\n *\n * Useful when normalizing multiple transcripts with the same options.\n *\n * @param options - Normalization options to apply to all transcripts\n * @returns A function that normalizes transcripts with the configured options\n *\n * @example\n * ```typescript\n * import { createNormalizer } from 'fireflies-api';\n *\n * const normalizer = createNormalizer({\n *   timeUnit: 'milliseconds',\n *   includeRawData: false,\n * });\n *\n * // Reuse with same config\n * const norm1 = normalizer(transcript1);\n * const norm2 = normalizer(transcript2);\n * ```\n */\nexport function createNormalizer(\n  options?: NormalizationOptions\n): (transcript: Transcript) => NormalizedMeeting {\n  return (transcript: Transcript) => normalizeTranscript(transcript, options);\n}\n\n/**\n * Normalize speakers from the transcript.\n */\nfunction normalizeSpeakers(\n  speakers: Speaker[],\n  transcript: Transcript,\n  opts: Required<NormalizationOptions>\n): NormalizedSpeaker[] {\n  return speakers.map((speaker) => ({\n    id: speaker.id,\n    name: opts.resolveSpeakerName(speaker, transcript),\n  }));\n}\n\n/**\n * Normalize sentences from the transcript.\n */\nfunction normalizeSentences(\n  sentences: Sentence[],\n  opts: Required<NormalizationOptions>\n): NormalizedSentence[] {\n  const timeMultiplier = opts.timeUnit === 'milliseconds' ? 1000 : 1;\n\n  return sentences.map((sentence) => {\n    const normalized: NormalizedSentence = {\n      index: sentence.index,\n      speakerId: sentence.speaker_id,\n      speakerName: sentence.speaker_name,\n      text: sentence.text,\n      rawText: sentence.raw_text,\n      startTime: parseTime(sentence.start_time) * timeMultiplier,\n      endTime: parseTime(sentence.end_time) * timeMultiplier,\n    };\n\n    if (opts.includeAIFilters && sentence.ai_filters) {\n      const sentiment = mapSentiment(sentence.ai_filters.sentiment);\n      if (sentiment) {\n        normalized.sentiment = sentiment;\n      }\n      if (sentence.ai_filters.question) {\n        normalized.isQuestion = true;\n      }\n      if (sentence.ai_filters.task) {\n        normalized.isActionItem = true;\n      }\n    }\n\n    return normalized;\n  });\n}\n\n/**\n * Parse time string to number, handling invalid values.\n */\nfunction parseTime(timeStr: string): number {\n  const parsed = Number.parseFloat(timeStr);\n  return Number.isNaN(parsed) ? 0 : parsed;\n}\n\n/**\n * Map Fireflies sentiment string to normalized sentiment.\n */\nfunction mapSentiment(\n  sentiment: string | undefined\n): 'positive' | 'negative' | 'neutral' | undefined {\n  if (!sentiment) return undefined;\n  const lower = sentiment.toLowerCase();\n  if (lower === 'positive') return 'positive';\n  if (lower === 'negative') return 'negative';\n  if (lower === 'neutral') return 'neutral';\n  return undefined;\n}\n\n/**\n * Normalize participants from the transcript.\n */\nfunction normalizeParticipants(\n  transcript: Transcript,\n  opts: Required<NormalizationOptions>\n): NormalizedParticipant[] {\n  const participants = transcript.participants ?? [];\n  const attendeeMap = new Map<string, string>();\n\n  // Build email → name mapping from meeting_attendees\n  for (const attendee of transcript.meeting_attendees ?? []) {\n    if (attendee.email && attendee.name) {\n      attendeeMap.set(attendee.email.toLowerCase(), attendee.name);\n    }\n  }\n\n  return participants.map((email) => {\n    const isOrganizer = email.toLowerCase() === transcript.organizer_email.toLowerCase();\n    const attendeeName = attendeeMap.get(email.toLowerCase());\n    const enrichment = opts.enrichParticipant(email, transcript);\n\n    return {\n      name: enrichment.name ?? attendeeName ?? '',\n      email,\n      role: enrichment.role ?? (isOrganizer ? 'organizer' : 'attendee'),\n    };\n  });\n}\n\n/**\n * Normalize summary from the transcript.\n */\nfunction normalizeSummary(summary: Summary | undefined): NormalizedSummary | undefined {\n  if (!summary) return undefined;\n\n  const keyPoints = parseKeyPoints(summary.shorthand_bullet);\n\n  return {\n    overview: summary.overview,\n    keyPoints: keyPoints.length > 0 ? keyPoints : undefined,\n    actionItems: summary.action_items,\n    outline: summary.outline,\n    topics: summary.topics_discussed,\n  };\n}\n\n/**\n * Parse shorthand bullet points into array.\n */\nfunction parseKeyPoints(shorthandBullet: string | undefined): string[] {\n  if (!shorthandBullet) return [];\n\n  return shorthandBullet\n    .split('\\n')\n    .map((line) => line.replace(/^[-*•]\\s*/, '').trim())\n    .filter((line) => line.length > 0);\n}\n\n/**\n * Normalize meeting attendance to attendees.\n */\nfunction normalizeAttendees(attendance: Transcript['meeting_attendance']): NormalizedAttendee[] {\n  return attendance.map((a) => ({\n    name: a.name,\n    joinTime: a.join_time ? new Date(a.join_time) : undefined,\n    leaveTime: a.leave_time ? new Date(a.leave_time) : undefined,\n  }));\n}\n\n/**\n * Normalize channels.\n */\nfunction normalizeChannels(channels: Transcript['channels']): NormalizedChannel[] {\n  return channels.map((ch) => ({\n    id: ch.id,\n    title: ch.title,\n    isPrivate: ch.is_private ?? false,\n  }));\n}\n\n/**\n * Normalize analytics.\n */\nfunction normalizeAnalytics(analytics: Transcript['analytics']): NormalizedAnalytics | undefined {\n  if (!analytics?.sentiments) return undefined;\n\n  return {\n    sentiments: {\n      positive: analytics.sentiments.positive_pct ?? 0,\n      neutral: analytics.sentiments.neutral_pct ?? 0,\n      negative: analytics.sentiments.negative_pct ?? 0,\n    },\n  };\n}\n\n/**\n * Delay execution for a specified time.\n */\nfunction delay(ms: number): Promise<void> {\n  return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * Normalize multiple transcripts with streaming and error handling.\n *\n * Yields a BatchResult for each transcript, capturing any errors\n * without stopping iteration.\n *\n * @param transcripts - Array or async iterable of transcripts to normalize\n * @param options - Batch normalization options\n * @returns AsyncIterable yielding BatchResult for each transcript\n *\n * @example\n * ```typescript\n * import { normalizeTranscripts } from 'fireflies-api';\n *\n * for await (const result of normalizeTranscripts(transcripts)) {\n *   if (result.error) {\n *     console.error(`Failed: ${result.item.id}`, result.error);\n *   } else {\n *     console.log(result.result.id); // \"fireflies:...\"\n *   }\n * }\n * ```\n */\nexport async function* normalizeTranscripts(\n  transcripts: Transcript[] | AsyncIterable<Transcript>,\n  options?: BatchNormalizationOptions\n): AsyncIterable<BatchResult<Transcript, NormalizedMeeting>> {\n  const { delayMs = 0, ...normalizationOptions } = options ?? {};\n  let isFirst = true;\n\n  for await (const transcript of transcripts) {\n    // Add delay between items (not before first)\n    if (!isFirst && delayMs > 0) {\n      await delay(delayMs);\n    }\n    isFirst = false;\n\n    try {\n      const result = normalizeTranscript(transcript, normalizationOptions);\n      yield { item: transcript, result };\n    } catch (err) {\n      yield {\n        item: transcript,\n        error: err instanceof Error ? err : new Error(String(err)),\n      };\n    }\n  }\n}\n\n/**\n * Normalize multiple transcripts and collect all results.\n *\n * Unlike the streaming `normalizeTranscripts()`, this waits for all items\n * to complete and returns results as an array.\n *\n * @param transcripts - Array or async iterable of transcripts to normalize\n * @param options - Batch normalization options\n * @returns Array of BatchResult for each transcript\n *\n * @example\n * ```typescript\n * import { normalizeTranscriptsAll } from 'fireflies-api';\n *\n * const results = await normalizeTranscriptsAll(transcripts, {\n *   timeUnit: 'milliseconds',\n *   includeRawData: false,\n * });\n *\n * const successful = results.filter(r => !r.error).map(r => r.result);\n * const failed = results.filter(r => r.error);\n * ```\n */\nexport async function normalizeTranscriptsAll(\n  transcripts: Transcript[] | AsyncIterable<Transcript>,\n  options?: BatchNormalizationOptions\n): Promise<BatchResult<Transcript, NormalizedMeeting>[]> {\n  const results: BatchResult<Transcript, NormalizedMeeting>[] = [];\n\n  for await (const result of normalizeTranscripts(transcripts, options)) {\n    results.push(result);\n  }\n\n  return results;\n}\n","import type { Sentence, Transcript } from '../types/transcript.js';\n\n/**\n * Statistics for a single speaker in the meeting.\n */\nexport interface SpeakerStats {\n  /** Speaker name from transcript */\n  name: string;\n  /** Speaker ID from transcript */\n  id: string;\n  /** Total talk time in seconds */\n  talkTime: number;\n  /** Percentage of total meeting talk time (0-100) */\n  talkTimePercentage: number;\n  /** Number of sentences spoken */\n  sentenceCount: number;\n  /** Total words spoken */\n  wordCount: number;\n  /** Words per minute (based on talk time) */\n  wordsPerMinute: number;\n  /** Average words per sentence */\n  averageSentenceLength: number;\n  /** Number of speaking turns (consecutive sentence groups) */\n  turnCount: number;\n}\n\n/**\n * Overall meeting speaker analytics.\n */\nexport interface SpeakerAnalytics {\n  /** Per-speaker statistics, sorted by talk time descending */\n  speakers: SpeakerStats[];\n  /** Total meeting duration from sentences (seconds) */\n  totalDuration: number;\n  /** Total talk time across all speakers (seconds) */\n  totalTalkTime: number;\n  /** Total sentences in transcript */\n  totalSentences: number;\n  /** Total words spoken */\n  totalWords: number;\n  /** Name of speaker with most talk time */\n  dominantSpeaker: string;\n  /** Talk time percentage of dominant speaker */\n  dominantSpeakerPercentage: number;\n  /** Balance indicator: balanced, unbalanced, or dominated */\n  balance: 'balanced' | 'unbalanced' | 'dominated';\n}\n\n/**\n * Options for speaker analysis.\n */\nexport interface SpeakerAnalyticsOptions {\n  /**\n   * Merge speakers with identical names into a single entry (default: true).\n   *\n   * Fireflies' speaker diarization can incorrectly assign multiple speaker IDs\n   * to the same person, especially with:\n   * - Multiple audio channels/microphones\n   * - Short utterances being misattributed\n   * - Audio quality issues causing speaker model confusion\n   *\n   * This commonly manifests as rapid alternation between two IDs for the same\n   * speaker name, resulting in inflated turn counts and split statistics.\n   *\n   * When enabled (default), speakers are grouped by name rather than ID,\n   * combining their talk time, word counts, and other metrics. Turn counting\n   * uses speaker names, so consecutive sentences from the same person count\n   * as one turn regardless of ID changes.\n   *\n   * Set to `false` to preserve the raw speaker IDs from Fireflies, which may\n   * be useful for debugging diarization issues or when you have confirmed that\n   * multiple people share the same display name.\n   */\n  mergeSpeakersByName?: boolean;\n  /** Round percentages to integers (default: true) */\n  roundPercentages?: boolean;\n  /** Threshold for 'unbalanced' classification (default: 40) */\n  unbalancedThreshold?: number;\n  /** Threshold for 'dominated' classification (default: 60) */\n  dominatedThreshold?: number;\n}\n\ninterface SpeakerData {\n  id: string;\n  name: string;\n  sentences: Sentence[];\n  talkTime: number;\n  wordCount: number;\n  turnCount: number;\n}\n\n/**\n * Analyze speaker participation in a transcript.\n *\n * Computes talk time percentages, word counts, and participation metrics\n * for each speaker in the meeting.\n *\n * @param transcript - The transcript to analyze\n * @param options - Analysis options\n * @returns Speaker analytics with per-speaker stats and totals\n *\n * @example\n * ```typescript\n * import { FirefliesClient, analyzeSpeakers } from 'fireflies-api';\n *\n * const client = new FirefliesClient({ apiKey: 'your-api-key' });\n * const transcript = await client.transcripts.get({ id: 'transcript-id' });\n *\n * const analytics = analyzeSpeakers(transcript);\n *\n * console.log(`${analytics.speakers.length} speakers`);\n * console.log(`Dominant: ${analytics.dominantSpeaker} (${analytics.dominantSpeakerPercentage}%)`);\n *\n * for (const speaker of analytics.speakers) {\n *   console.log(`${speaker.name}: ${speaker.talkTimePercentage}% talk time, ${speaker.wordCount} words`);\n * }\n * ```\n */\nexport function analyzeSpeakers(\n  transcript: Transcript,\n  options: SpeakerAnalyticsOptions = {}\n): SpeakerAnalytics {\n  const {\n    mergeSpeakersByName = true,\n    roundPercentages = true,\n    unbalancedThreshold = 40,\n    dominatedThreshold = 60,\n  } = options;\n\n  const sentences = transcript.sentences ?? [];\n  if (sentences.length === 0) {\n    return emptyAnalytics();\n  }\n\n  // Group sentences by speaker (by name when merging, by ID otherwise)\n  const speakerMap = new Map<string, SpeakerData>();\n  let prevSpeakerKey: string | null = null;\n\n  for (const sentence of sentences) {\n    const groupKey = mergeSpeakersByName ? sentence.speaker_name : sentence.speaker_id;\n    const data = getOrCreateSpeakerData(speakerMap, groupKey, sentence);\n    data.sentences.push(sentence);\n    data.talkTime += parseDuration(sentence);\n    data.wordCount += countWords(sentence.text);\n\n    // Count turns (speaker changes based on grouping key)\n    if (groupKey !== prevSpeakerKey) {\n      data.turnCount++;\n      prevSpeakerKey = groupKey;\n    }\n  }\n\n  // Calculate totals\n  const totalTalkTime = sumTalkTime(speakerMap);\n  const totalDuration = calculateDuration(sentences);\n  const totalWords = sumWords(speakerMap);\n\n  // Build speaker stats\n  const speakers = buildSpeakerStats(speakerMap, totalTalkTime, roundPercentages);\n\n  // Sort by talk time descending\n  speakers.sort((a, b) => b.talkTime - a.talkTime);\n\n  const dominant = speakers[0];\n\n  return {\n    speakers,\n    totalDuration,\n    totalTalkTime,\n    totalSentences: sentences.length,\n    totalWords,\n    dominantSpeaker: dominant?.name ?? '',\n    dominantSpeakerPercentage: dominant?.talkTimePercentage ?? 0,\n    balance: classifyBalance(speakers, unbalancedThreshold, dominatedThreshold),\n  };\n}\n\nfunction emptyAnalytics(): SpeakerAnalytics {\n  return {\n    speakers: [],\n    totalDuration: 0,\n    totalTalkTime: 0,\n    totalSentences: 0,\n    totalWords: 0,\n    dominantSpeaker: '',\n    dominantSpeakerPercentage: 0,\n    balance: 'balanced',\n  };\n}\n\nfunction getOrCreateSpeakerData(\n  speakerMap: Map<string, SpeakerData>,\n  groupKey: string,\n  sentence: Sentence\n): SpeakerData {\n  let data = speakerMap.get(groupKey);\n  if (!data) {\n    data = {\n      id: sentence.speaker_id, // Use first encountered ID\n      name: sentence.speaker_name,\n      sentences: [],\n      talkTime: 0,\n      wordCount: 0,\n      turnCount: 0,\n    };\n    speakerMap.set(groupKey, data);\n  }\n  return data;\n}\n\nfunction parseDuration(sentence: Sentence): number {\n  const start = Number.parseFloat(sentence.start_time);\n  const end = Number.parseFloat(sentence.end_time);\n  return Math.max(0, end - start);\n}\n\nfunction countWords(text: string): number {\n  if (!text || text.length === 0) return 0;\n  return text\n    .trim()\n    .split(/\\s+/)\n    .filter((w) => w.length > 0).length;\n}\n\nfunction sumTalkTime(speakerMap: Map<string, SpeakerData>): number {\n  let total = 0;\n  for (const data of speakerMap.values()) {\n    total += data.talkTime;\n  }\n  return total;\n}\n\nfunction sumWords(speakerMap: Map<string, SpeakerData>): number {\n  let total = 0;\n  for (const data of speakerMap.values()) {\n    total += data.wordCount;\n  }\n  return total;\n}\n\nfunction calculateDuration(sentences: Sentence[]): number {\n  if (sentences.length === 0) return 0;\n  const lastSentence = sentences[sentences.length - 1];\n  return Number.parseFloat(lastSentence?.end_time ?? '0');\n}\n\nfunction buildSpeakerStats(\n  speakerMap: Map<string, SpeakerData>,\n  totalTalkTime: number,\n  roundPercentages: boolean\n): SpeakerStats[] {\n  const speakers: SpeakerStats[] = [];\n\n  for (const data of speakerMap.values()) {\n    const percentage = totalTalkTime > 0 ? (data.talkTime / totalTalkTime) * 100 : 0;\n    const sentenceCount = data.sentences.length;\n    const talkTimeMinutes = data.talkTime / 60;\n    const wordsPerMinute = talkTimeMinutes > 0 ? data.wordCount / talkTimeMinutes : 0;\n    const averageSentenceLength = sentenceCount > 0 ? data.wordCount / sentenceCount : 0;\n\n    speakers.push({\n      name: data.name,\n      id: data.id,\n      talkTime: data.talkTime,\n      talkTimePercentage: roundPercentages ? Math.round(percentage) : percentage,\n      sentenceCount,\n      wordCount: data.wordCount,\n      wordsPerMinute: roundPercentages ? Math.round(wordsPerMinute) : wordsPerMinute,\n      averageSentenceLength,\n      turnCount: data.turnCount,\n    });\n  }\n\n  return speakers;\n}\n\nfunction classifyBalance(\n  speakers: SpeakerStats[],\n  unbalancedThreshold: number,\n  dominatedThreshold: number\n): 'balanced' | 'unbalanced' | 'dominated' {\n  if (speakers.length <= 2) return 'balanced';\n  const top = speakers[0]?.talkTimePercentage ?? 0;\n  if (top > dominatedThreshold) return 'dominated';\n  if (top > unbalancedThreshold) return 'unbalanced';\n  return 'balanced';\n}\n","import type { Command } from 'commander';\nimport { extractActionItems } from '../../helpers/action-items.js';\nimport { formatActionItemsMarkdown } from '../../helpers/action-items-format.js';\nimport { normalizeTranscript } from '../../helpers/normalize.js';\nimport { analyzeSpeakers } from '../../helpers/speaker-analytics.js';\nimport type {\n  ActionItemsFilterOptions,\n  ActionItemsMarkdownOptions,\n} from '../../types/action-items.js';\nimport { getClient, getOutputFormat, isProgressEnabled } from '../utils/client.js';\nimport { resolveDateRange } from '../utils/date.js';\nimport { withErrorHandling } from '../utils/error.js';\nimport { output, outputActionItems, outputSpeakerAnalytics, writeLine } from '../utils/output.js';\nimport { formatDuration } from '../utils/parse.js';\nimport { withProgress } from '../utils/progress.js';\n\n/**\n * Collect repeatable option values into an array.\n */\nfunction collect(value: string, previous: string[]): string[] {\n  return previous.concat([value]);\n}\n\n/** Build filter options from CLI opts */\nfunction buildActionItemFilterOptions(opts: {\n  assignee?: string[];\n  assignedOnly?: boolean;\n  datedOnly?: boolean;\n}): ActionItemsFilterOptions | undefined {\n  const filterOptions: ActionItemsFilterOptions = {};\n  if (opts.assignee?.length) {\n    filterOptions.assignees = opts.assignee;\n  }\n  if (opts.assignedOnly) {\n    filterOptions.assignedOnly = true;\n  }\n  if (opts.datedOnly) {\n    filterOptions.datedOnly = true;\n  }\n  return Object.keys(filterOptions).length > 0 ? filterOptions : undefined;\n}\n\n/** Build markdown options from CLI opts */\nfunction buildMarkdownOptions(opts: {\n  style?: string;\n  groupBy?: string;\n  preset?: string;\n  includeAssignee?: boolean;\n  includeDueDate?: boolean;\n  includeMeeting?: boolean;\n  includeSummary?: boolean;\n}): ActionItemsMarkdownOptions {\n  return {\n    style: opts.style as ActionItemsMarkdownOptions['style'],\n    groupBy: opts.groupBy as ActionItemsMarkdownOptions['groupBy'],\n    preset: opts.preset as ActionItemsMarkdownOptions['preset'],\n    includeAssignee: opts.includeAssignee,\n    includeDueDate: opts.includeDueDate,\n    includeMeetingTitle: opts.includeMeeting,\n    includeSummary: opts.includeSummary,\n  };\n}\n\n/** Write content to file and log result */\nasync function writeToFile(path: string, content: string, itemCount: number): Promise<void> {\n  const fs = await import('node:fs/promises');\n  await fs.writeFile(path, content);\n  console.log(`Wrote ${itemCount} action items to ${path}`);\n}\n\n/** Get array param or undefined if empty */\nfunction arrayOrUndefined<T>(arr: T[] | undefined): T[] | undefined {\n  return arr?.length ? arr : undefined;\n}\n\nexport function registerTranscriptsCommand(program: Command): void {\n  const cmd = program.command('transcripts').description('Manage transcripts');\n\n  cmd\n    .command('list')\n    .description('List transcripts')\n    .option('--limit <n>', 'Max results (default: 20)', '20')\n    .option('--from <date>', 'From date (YYYY-MM-DD or ISO 8601)')\n    .option('--to <date>', 'To date (YYYY-MM-DD or ISO 8601)')\n    .option('--today', 'Transcripts from today')\n    .option('--yesterday', 'Transcripts from yesterday')\n    .option('--last-week', 'Transcripts from last 7 days')\n    .option('--last-month', 'Transcripts from last 30 days')\n    .option('--days <n>', 'Transcripts from last N days')\n    .option('--mine', 'Only my transcripts')\n    .option('--keyword <text>', 'Search keyword')\n    .option('--scope <scope>', 'Search scope: title, sentences, all (default: all)')\n    .option('--organizer <email>', 'Filter by organizer email (repeatable)', collect, [])\n    .option('--participant <email>', 'Filter by participant email (repeatable)', collect, [])\n    .option('--participant-me', 'Only meetings where I am a participant')\n    .option('--user-id <id>', 'Filter by user ID')\n    .option('--channel <id>', 'Filter by channel ID')\n    .option('--external', 'Only meetings with external (non-company) participants')\n    .option('--include-sentences', 'Include full transcript sentences (large response)')\n    .option('--include-summary', 'Include summary with action items, keywords, etc.')\n    .option('--normalize', 'Output in normalized provider-agnostic format')\n    .action(\n      withErrorHandling(async (opts) => {\n        const client = getClient(program);\n        const format = getOutputFormat(program);\n        const showProgress = isProgressEnabled(program);\n        const { fromDate, toDate } = resolveDateRange(opts);\n\n        // If --participant-me, fetch current user's email and add to participants filter\n        const participants: string[] = [...opts.participant];\n        if (opts.participantMe) {\n          const me = await client.users.me();\n          participants.push(me.email);\n        }\n\n        const transcripts = await withProgress(\n          { enabled: showProgress, text: 'Fetching transcripts...' },\n          async () =>\n            client.transcripts.list({\n              limit: Number.parseInt(opts.limit, 10),\n              fromDate,\n              toDate,\n              mine: opts.mine,\n              keyword: opts.keyword,\n              scope: opts.scope,\n              organizers: opts.organizer.length > 0 ? opts.organizer : undefined,\n              participants: participants.length > 0 ? participants : undefined,\n              user_id: opts.userId,\n              channel_id: opts.channel,\n              external: opts.external,\n              includeSentences: opts.includeSentences,\n              includeSummary: opts.includeSummary,\n            })\n        );\n\n        // Normalize requires full transcript data (list returns partial data)\n        if (opts.normalize) {\n          const fullTranscripts = await Promise.all(\n            transcripts.map((t) => client.transcripts.get(t.id))\n          );\n          const normalized = fullTranscripts.map((t) => normalizeTranscript(t));\n          output(normalized, format);\n          return;\n        }\n\n        // If requesting full content, output complete transcripts\n        if (opts.includeSentences || opts.includeSummary) {\n          output(transcripts, format);\n          return;\n        }\n\n        // Use human-readable duration for table/plain, rounded minutes for data formats\n        // API returns duration in minutes, convert to seconds for formatDuration\n        const useHumanDuration = format === 'table' || format === 'plain';\n        const formatted = transcripts.map((t) => ({\n          id: t.id,\n          title: t.title,\n          date: t.dateString,\n          duration: useHumanDuration ? formatDuration(t.duration * 60) : Math.round(t.duration),\n          organizer: t.organizer_email,\n        }));\n\n        output(formatted, format);\n      })\n    );\n\n  cmd\n    .command('get <id>')\n    .description('Get transcript details')\n    .option('--sentences', 'Include sentences', true)\n    .option('--no-sentences', 'Exclude sentences')\n    .option('--summary', 'Include summary', true)\n    .option('--no-summary', 'Exclude summary')\n    .option('--speakers', 'Include speaker analytics')\n    .option('--no-merge', 'Disable speaker merging (with --speakers)')\n    .option('--action-items', 'Include extracted action items')\n    .action(\n      withErrorHandling(async (id: string, opts) => {\n        const client = getClient(program);\n        const format = getOutputFormat(program);\n\n        const transcript = await client.transcripts.get(id, {\n          includeSentences: opts.sentences,\n          includeSummary: opts.summary || opts.actionItems,\n        });\n\n        let result: Record<string, unknown> = { ...transcript };\n\n        if (opts.speakers) {\n          const analytics = analyzeSpeakers(transcript, {\n            mergeSpeakersByName: opts.merge !== false,\n          });\n          result = { ...result, speakerAnalytics: analytics };\n        }\n\n        if (opts.actionItems) {\n          const actionItems = extractActionItems(transcript);\n          result = { ...result, actionItems };\n        }\n\n        output(result, format);\n      })\n    );\n\n  cmd\n    .command('speakers <id>')\n    .description('Analyze speaker participation in a transcript')\n    .option('--no-merge', 'Show separate entries for speakers with same name')\n    .option('--raw-percentages', 'Show decimal percentages')\n    .action(\n      withErrorHandling(async (id: string, opts) => {\n        const client = getClient(program);\n        const format = getOutputFormat(program);\n\n        const transcript = await client.transcripts.get(id);\n        const analytics = analyzeSpeakers(transcript, {\n          mergeSpeakersByName: opts.merge !== false,\n          roundPercentages: !opts.rawPercentages,\n        });\n\n        outputSpeakerAnalytics(analytics, format);\n      })\n    );\n\n  // action-items parent command with subcommands\n  const actionItemsCmd = cmd\n    .command('action-items')\n    .description('Extract and export action items from transcripts');\n\n  // Single transcript action items (get subcommand)\n  actionItemsCmd\n    .command('get <id>')\n    .description('Extract action items from a single transcript')\n    .option('--no-assignees', 'Skip assignee detection')\n    .option('--no-due-dates', 'Skip due date detection')\n    .option('--include-source', 'Include source sentences from transcript')\n    .action(\n      withErrorHandling(async (id: string, opts) => {\n        const client = getClient(program);\n        const format = getOutputFormat(program);\n\n        const transcript = await client.transcripts.get(id, {\n          includeSummary: true,\n          includeSentences: opts.includeSource,\n        });\n\n        const result = extractActionItems(transcript, {\n          detectAssignees: opts.assignees !== false,\n          detectDueDates: opts.dueDates !== false,\n          includeSourceSentences: opts.includeSource,\n        });\n\n        outputActionItems(result, format);\n      })\n    );\n\n  // Multi-transcript action items export\n  actionItemsCmd\n    .command('export')\n    .description('Export action items from multiple transcripts')\n    // Date filters\n    .option('--from <date>', 'From date (YYYY-MM-DD or ISO 8601)')\n    .option('--to <date>', 'To date (YYYY-MM-DD or ISO 8601)')\n    .option('--today', 'Transcripts from today')\n    .option('--yesterday', 'Transcripts from yesterday')\n    .option('--last-week', 'Transcripts from last 7 days')\n    .option('--last-month', 'Transcripts from last 30 days')\n    .option('--days <n>', 'Transcripts from last N days')\n    .option('--mine', 'Only my transcripts')\n    .option('--limit <n>', 'Max transcripts to process')\n    .option('--organizer <email>', 'Filter by organizer email (repeatable)', collect, [])\n    .option('--participant <email>', 'Filter by participant email (repeatable)', collect, [])\n    // Action item filters\n    .option('--assignee <name>', 'Filter by assignee (repeatable)', collect, [])\n    .option('--assigned-only', 'Only items with assignees')\n    .option('--dated-only', 'Only items with due dates')\n    // Markdown formatting\n    .option('--style <style>', 'List style: checkbox (default), bullet, numbered')\n    .option('--group-by <by>', 'Group by: none (default), assignee, transcript, date')\n    .option('--preset <preset>', 'Format preset: default, notion, obsidian, github')\n    .option('--include-assignee', 'Show assignee inline')\n    .option('--include-due-date', 'Show due date inline')\n    .option('--include-meeting', 'Show meeting title inline')\n    .option('--include-summary', 'Include stats summary')\n    // Output\n    .option('-o, --output <file>', 'Write to file')\n    .action(\n      withErrorHandling(async (opts) => {\n        const client = getClient(program);\n        const format = getOutputFormat(program);\n        const showProgress = isProgressEnabled(program);\n        const { fromDate, toDate } = resolveDateRange(opts);\n        const filterOptions = buildActionItemFilterOptions(opts);\n\n        const result = await withProgress(\n          { enabled: showProgress, text: 'Exporting action items...' },\n          async () =>\n            client.transcripts.exportActionItems({\n              fromDate,\n              toDate,\n              mine: opts.mine,\n              organizers: arrayOrUndefined(opts.organizer),\n              participants: arrayOrUndefined(opts.participant),\n              limit: opts.limit ? Number.parseInt(opts.limit, 10) : undefined,\n              filterOptions,\n            })\n        );\n\n        // Plain format outputs markdown\n        if (format === 'plain') {\n          const markdown = formatActionItemsMarkdown(result, buildMarkdownOptions(opts));\n          return opts.output\n            ? writeToFile(opts.output, markdown, result.totalItems)\n            : writeLine(markdown);\n        }\n\n        // Structured formats\n        const content =\n          format === 'jsonl'\n            ? result.items.map((i) => JSON.stringify(i)).join('\\n')\n            : JSON.stringify(result, null, 2);\n        return opts.output\n          ? writeToFile(opts.output, content, result.totalItems)\n          : output(result, format);\n      })\n    );\n\n  cmd\n    .command('delete <id>')\n    .description('Delete a transcript')\n    .option('--confirm', 'Skip confirmation (required for non-interactive)')\n    .action(\n      withErrorHandling(async (id: string, opts) => {\n        if (!opts.confirm) {\n          console.error('Error: --confirm flag required for delete operations');\n          process.exit(1);\n        }\n\n        const client = getClient(program);\n        const format = getOutputFormat(program);\n\n        const result = await client.transcripts.delete(id);\n        output({ success: result, id }, format);\n      })\n    );\n}\n","import type { Command } from 'commander';\nimport { getClient, getOutputFormat } from '../utils/client.js';\nimport { withErrorHandling } from '../utils/error.js';\nimport { output } from '../utils/output.js';\n\nexport function registerUsersCommand(program: Command): void {\n  const cmd = program.command('users').description('User management');\n\n  cmd\n    .command('me')\n    .description('Show current user info')\n    .action(\n      withErrorHandling(async () => {\n        const client = getClient(program);\n        const format = getOutputFormat(program);\n\n        const user = await client.users.me();\n        output(user, format);\n      })\n    );\n\n  cmd\n    .command('list')\n    .description('List team users')\n    .action(\n      withErrorHandling(async () => {\n        const client = getClient(program);\n        const format = getOutputFormat(program);\n\n        const users = await client.users.list();\n\n        const formatted = users.map((u) => ({\n          id: u.user_id,\n          name: u.name,\n          email: u.email,\n          role: u.role,\n        }));\n\n        output(formatted, format);\n      })\n    );\n\n  cmd\n    .command('get <id>')\n    .description('Get user details')\n    .action(\n      withErrorHandling(async (id: string) => {\n        const client = getClient(program);\n        const format = getOutputFormat(program);\n\n        const user = await client.users.get(id);\n        output(user, format);\n      })\n    );\n\n  cmd\n    .command('set-role <user-id>')\n    .description('Set user role (admin only)')\n    .requiredOption('--role <role>', 'Role: admin or user (required)')\n    .action(\n      withErrorHandling(async (userId: string, opts) => {\n        const role = opts.role;\n        if (role !== 'admin' && role !== 'user') {\n          console.error('Error: Role must be \"admin\" or \"user\"');\n          process.exit(1);\n        }\n\n        const client = getClient(program);\n        const format = getOutputFormat(program);\n\n        const result = await client.users.setRole(userId, role);\n        output(result, format);\n      })\n    );\n}\n","import { readFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { Command } from 'commander';\nimport { registerAiAppsCommand } from './commands/ai-apps.js';\nimport { registerAudioCommand } from './commands/audio.js';\nimport { registerBitesCommand } from './commands/bites.js';\nimport { registerDigestCommand } from './commands/digest.js';\nimport { registerExportCommand } from './commands/export.js';\nimport { registerExportBulkCommand } from './commands/export-bulk.js';\nimport { registerInsightsCommand } from './commands/insights.js';\nimport { registerMeetingsCommand } from './commands/meetings.js';\nimport { registerRealtimeCommand } from './commands/realtime.js';\nimport { registerSearchCommand } from './commands/search.js';\nimport { registerTranscriptsCommand } from './commands/transcripts.js';\nimport { registerUsersCommand } from './commands/users.js';\n\n// Get version from package.json\nfunction getVersion(): string {\n  try {\n    const __dirname = dirname(fileURLToPath(import.meta.url));\n    // In dist, package.json is at ../../package.json\n    // In src, package.json is at ../../package.json\n    const packagePath = join(__dirname, '..', '..', 'package.json');\n    const pkg = JSON.parse(readFileSync(packagePath, 'utf-8')) as { version: string };\n    return pkg.version;\n  } catch {\n    return '0.0.0';\n  }\n}\n\nconst program = new Command();\n\nprogram\n  .name('fireflies')\n  .description('CLI for Fireflies.ai API')\n  .version(getVersion())\n  .option('-k, --api-key <key>', 'API key (or FIREFLIES_API_KEY env)')\n  .option('-o, --output <format>', 'Output format: json, jsonl, table, tsv, plain', 'json')\n  .option('--progress', 'Show progress indicators during long operations');\n\n// Register all commands\nregisterTranscriptsCommand(program);\nregisterSearchCommand(program);\nregisterInsightsCommand(program);\nregisterDigestCommand(program);\nregisterMeetingsCommand(program);\nregisterUsersCommand(program);\nregisterBitesCommand(program);\nregisterAiAppsCommand(program);\nregisterAudioCommand(program);\nregisterRealtimeCommand(program);\nregisterExportCommand(program);\nregisterExportBulkCommand(program);\n\nprogram.parse();\n"]}