fireflies-api 0.5.1 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. package/dist/cli/index.cjs +1435 -217
  2. package/dist/cli/index.cjs.map +1 -1
  3. package/dist/cli/index.js +1436 -222
  4. package/dist/cli/index.js.map +1 -1
  5. package/dist/index.cjs +1372 -392
  6. package/dist/index.cjs.map +1 -1
  7. package/dist/index.d.cts +462 -3
  8. package/dist/index.d.ts +462 -3
  9. package/dist/index.js +1357 -393
  10. package/dist/index.js.map +1 -1
  11. package/dist/middleware/express.cjs +459 -16
  12. package/dist/middleware/express.cjs.map +1 -1
  13. package/dist/middleware/express.d.cts +2 -2
  14. package/dist/middleware/express.d.ts +2 -2
  15. package/dist/middleware/express.js +459 -16
  16. package/dist/middleware/express.js.map +1 -1
  17. package/dist/middleware/fastify.cjs +459 -16
  18. package/dist/middleware/fastify.cjs.map +1 -1
  19. package/dist/middleware/fastify.d.cts +2 -2
  20. package/dist/middleware/fastify.d.ts +2 -2
  21. package/dist/middleware/fastify.js +459 -16
  22. package/dist/middleware/fastify.js.map +1 -1
  23. package/dist/middleware/hono.cjs +459 -16
  24. package/dist/middleware/hono.cjs.map +1 -1
  25. package/dist/middleware/hono.d.cts +2 -2
  26. package/dist/middleware/hono.d.ts +2 -2
  27. package/dist/middleware/hono.js +459 -16
  28. package/dist/middleware/hono.js.map +1 -1
  29. package/dist/templates/digest/compact.md +8 -0
  30. package/dist/templates/digest/default.md +44 -0
  31. package/dist/templates/digest/executive.md +22 -0
  32. package/dist/{types-CaHcwnKw.d.ts → types-BMzVSd6w.d.ts} +1 -1
  33. package/dist/{types-BX-3JcRI.d.cts → types-BeXRmVD7.d.cts} +1 -1
  34. package/dist/{types-DIPZmUl3.d.ts → types-D2XsCR5R.d.ts} +120 -1
  35. package/dist/{types-C_XxdRd1.d.cts → types-zVGqyFzP.d.cts} +120 -1
  36. package/package.json +6 -1
@@ -1 +1 @@
1
- {"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/domain-utils.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/markdown.ts","../../src/cli/commands/export.ts","../../src/cli/utils/date.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":["sleep","groupBy","DEFAULT_TIMEOUT","io","program","DEFAULT_OPTIONS","formatDuration","writeFile","collect","normalizeTranscript","parseTime","calculateDuration","dirname","fileURLToPath","join","readFileSync","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 * 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","/**\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 { 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 { extractDomain, hasExternalParticipants } from '../../helpers/domain-utils.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 { 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 * 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/**\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 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 ${TRANSCRIPT_LIST_FIELDS}\n }\n }\n `;\n\n const variables = buildListVariables(params);\n const data = await client.execute<{ transcripts: TranscriptResponse[] }>(query, variables);\n\n return data.transcripts.map(normalizeTranscript);\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 // Phase 1: Find matching transcripts via server-side search\n const transcripts: Transcript[] = [];\n for await (const t of this.listAll({\n keyword: query,\n scope,\n ...listParams,\n })) {\n transcripts.push(t);\n if (limit && transcripts.length >= limit) break;\n }\n\n // Phase 2: Fetch full transcripts and search locally\n const allMatches: SearchResults['matches'] = [];\n let transcriptsWithMatches = 0;\n\n for (const t of transcripts) {\n const full = await this.get(t.id, { includeSentences: true });\n const matches = searchTranscript(full, {\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 (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 })) {\n // Skip if filtering for external and no external participants\n if (internalDomain && !hasExternalParticipants(t.participants, internalDomain)) {\n continue;\n }\n\n // Fetch full transcript with sentences\n const full = await this.get(t.id, { includeSentences: true, includeSummary: false });\n transcripts.push(full);\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 (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 })) {\n // Fetch summary for action items\n const full = await this.get(t.id, { includeSentences: false, includeSummary: true });\n transcripts.push(full);\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}\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","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}\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","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 { 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 { 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","/**\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 type { Command } from 'commander';\nimport type {\n DayOfWeekStats,\n MeetingInsights,\n ParticipantStats,\n SpeakerInsightStats,\n} from '../../types/meeting-insights.js';\nimport { getClient, getOutputFormat } 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';\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 { fromDate, toDate } = resolveDateRange(opts);\n\n const insights = await client.transcripts.insights(\n 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 { getClient, getOutputFormat, type OutputFormat } from '../utils/client.js';\nimport { resolveDateRange } from '../utils/date.js';\nimport { withErrorHandling } from '../utils/error.js';\nimport { output, writeLine } from '../utils/output.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 { fromDate, toDate } = resolveDateRange(opts);\n\n const results = await 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 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 } 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';\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('--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 { 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 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 });\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 // 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 { fromDate, toDate } = resolveDateRange(opts);\n const filterOptions = buildActionItemFilterOptions(opts);\n\n const result = await 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 // 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 { registerExportCommand } from './commands/export.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\n// Register all commands\nregisterTranscriptsCommand(program);\nregisterSearchCommand(program);\nregisterInsightsCommand(program);\nregisterMeetingsCommand(program);\nregisterUsersCommand(program);\nregisterBitesCommand(program);\nregisterAiAppsCommand(program);\nregisterAudioCommand(program);\nregisterRealtimeCommand(program);\nregisterExportCommand(program);\n\nprogram.parse();\n"]}
1
+ {"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"]}