granola-cli 0.1.1 → 0.2.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.
- package/README.md +57 -5
- package/dist/main.js +348 -87
- package/dist/main.js.map +1 -1
- package/package.json +1 -1
package/dist/main.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/main.ts","../src/commands/alias.ts","../src/lib/config.ts","../src/lib/alias.ts","../src/lib/debug.ts","../src/lib/output.ts","../src/commands/auth/index.ts","../src/commands/auth/login.ts","../src/lib/auth.ts","../src/lib/lock.ts","../src/commands/auth/logout.ts","../src/commands/auth/status.ts","../src/commands/config.ts","../src/commands/folder/index.ts","../src/commands/folder/list.ts","../src/services/client.ts","../src/lib/api.ts","../src/lib/http.ts","../src/services/folders.ts","../src/commands/folder/view.ts","../src/commands/meeting/index.ts","../src/commands/meeting/enhanced.ts","../src/lib/pager.ts","../src/lib/prosemirror.ts","../src/services/meetings.ts","../src/commands/meeting/export.ts","../src/lib/toon.ts","../src/commands/meeting/list.ts","../src/commands/meeting/notes.ts","../src/commands/meeting/transcript.ts","../src/lib/transcript.ts","../src/commands/meeting/view.ts","../src/commands/workspace/index.ts","../src/commands/workspace/list.ts","../src/services/workspaces.ts","../src/commands/workspace/view.ts"],"sourcesContent":["import { readFileSync } from 'node:fs';\nimport { Command } from 'commander';\nimport { aliasCommand } from './commands/alias.js';\nimport { authCommand } from './commands/auth/index.js';\nimport { configCommand } from './commands/config.js';\nimport { folderCommand } from './commands/folder/index.js';\nimport { meetingCommand } from './commands/meeting/index.js';\nimport { workspaceCommand } from './commands/workspace/index.js';\nimport { parseAliasArguments } from './lib/alias.js';\nimport { getAlias } from './lib/config.js';\nimport { createGranolaDebug } from './lib/debug.js';\n\nconst debug = createGranolaDebug('cli');\nconst debugAlias = createGranolaDebug('cli:alias');\n\nconst packageJson = JSON.parse(readFileSync(new URL('../package.json', import.meta.url), 'utf-8'));\n\ndebug('granola-cli v%s starting', packageJson.version);\ndebug('arguments: %O', process.argv.slice(2));\n\nconst program = new Command();\n\nprogram\n .name('granola')\n .description('CLI for Granola meeting notes')\n .version(packageJson.version)\n .option('--no-pager', 'Disable pager');\n\n// Add built-in commands\nprogram.addCommand(authCommand);\nprogram.addCommand(meetingCommand);\nprogram.addCommand(workspaceCommand);\nprogram.addCommand(folderCommand);\nprogram.addCommand(configCommand);\nprogram.addCommand(aliasCommand);\n\n// Handle alias expansion\nfunction expandAlias(args: string[]): string[] {\n if (args.length < 3) return args;\n\n const command = args[2];\n debugAlias('checking alias for command: %s', command);\n const alias = getAlias(command);\n\n if (alias) {\n debugAlias('alias found: %s -> %s', command, alias);\n try {\n const aliasArgs = parseAliasArguments(alias);\n const expanded = [...args.slice(0, 2), ...aliasArgs, ...args.slice(3)];\n debugAlias('expanded args: %O', expanded.slice(2));\n return expanded;\n } catch (err) {\n debugAlias('failed to expand alias %s: %O', command, err);\n return args;\n }\n }\n\n return args;\n}\n\n// Parse with alias expansion\nconst expandedArgs = expandAlias(process.argv);\ndebug('parsing with args: %O', expandedArgs.slice(2));\nprogram.parseAsync(expandedArgs);\n","import chalk from 'chalk';\nimport { Command } from 'commander';\nimport { deleteAlias, getAlias, listAliases, setAlias } from '../lib/config.js';\nimport { createGranolaDebug } from '../lib/debug.js';\nimport { formatOutput, type OutputFormat } from '../lib/output.js';\n\nconst debug = createGranolaDebug('cmd:alias');\n\n/**\n * Creates the 'alias' command for managing command shortcuts.\n *\n * Provides subcommands for listing, creating, and deleting aliases.\n * Aliases expand to full commands at runtime.\n *\n * @returns Commander command instance\n */\nexport function createAliasCommand() {\n const cmd = new Command('alias').description('Create command shortcuts');\n\n cmd\n .command('list')\n .description('List aliases')\n .option('-o, --output <format>', 'Output format (json, yaml, toon)')\n .action((opts) => {\n debug('alias list command invoked');\n const aliases = listAliases();\n\n const format = opts.output || null;\n if (format) {\n if (!['json', 'yaml', 'toon'].includes(format)) {\n console.error(chalk.red(`Invalid format: ${format}. Use 'json', 'yaml', or 'toon'.`));\n process.exit(1);\n }\n console.log(formatOutput(aliases, format as OutputFormat));\n return;\n }\n\n if (Object.keys(aliases).length === 0) {\n console.log(chalk.dim('No aliases defined.'));\n return;\n }\n\n for (const [name, command] of Object.entries(aliases)) {\n console.log(`${chalk.bold(name)}: ${command}`);\n }\n });\n\n cmd\n .command('set <name> <command>')\n .description('Create alias')\n .action((name: string, command: string) => {\n debug('alias set command invoked: %s -> %s', name, command);\n setAlias(name, command);\n console.log(chalk.green(`Created alias: ${name} -> ${command}`));\n });\n\n cmd\n .command('delete <name>')\n .description('Delete alias')\n .action((name: string) => {\n debug('alias delete command invoked: %s', name);\n const existing = getAlias(name);\n if (!existing) {\n console.log(chalk.yellow(`Alias '${name}' not found`));\n return;\n }\n deleteAlias(name);\n console.log(chalk.green(`Deleted alias: ${name}`));\n });\n\n return cmd;\n}\n\nexport const aliasCommand = createAliasCommand();\n","import Conf from 'conf';\nimport type { Config } from '../types.js';\nimport { isAliasCommandSafe } from './alias.js';\nimport { createGranolaDebug } from './debug.js';\n\nconst debug = createGranolaDebug('lib:config');\n\nconst config = new Conf<Config>({\n projectName: 'granola',\n defaults: {},\n});\n\ndebug('config store initialized at: %s', config.path);\n\nexport function getConfig(): Config {\n debug('getConfig: returning store');\n return config.store;\n}\n\nexport function setConfig(newConfig: Config): void {\n debug('setConfig: clearing and setting %d keys', Object.keys(newConfig).length);\n config.clear();\n for (const [key, value] of Object.entries(newConfig)) {\n config.set(key, value);\n }\n}\n\nexport function getConfigValue<K extends keyof Config>(key: K): Config[K] {\n const value = config.get(key);\n debug('getConfigValue: %s = %O', key, value);\n return value;\n}\n\nexport function setConfigValue<K extends keyof Config>(key: K, value: Config[K]): void {\n debug('setConfigValue: %s = %O', key, value);\n config.set(key, value);\n}\n\nexport function resetConfig(): void {\n debug('resetConfig: clearing all configuration');\n config.clear();\n}\n\nexport function getAlias(name: string): string | undefined {\n const aliases = config.get('aliases') || {};\n const alias = aliases[name];\n debug('getAlias: %s -> %s', name, alias || '(not found)');\n return alias;\n}\n\nexport function validateAliasCommand(command: string): boolean {\n return isAliasCommandSafe(command);\n}\n\nexport function setAlias(name: string, command: string): void {\n debug('setAlias: %s -> %s', name, command);\n if (!validateAliasCommand(command)) {\n debug('setAlias: invalid command characters');\n throw new Error(\n 'Alias command contains invalid characters or shell syntax. Only literal arguments are allowed.',\n );\n }\n const aliases = config.get('aliases') || {};\n aliases[name] = command;\n config.set('aliases', aliases);\n}\n\nexport function deleteAlias(name: string): void {\n debug('deleteAlias: removing %s', name);\n const aliases = config.get('aliases') || {};\n delete aliases[name];\n config.set('aliases', aliases);\n}\n\nexport function listAliases(): Record<string, string> {\n const aliases = config.get('aliases') || {};\n debug('listAliases: returning %d aliases', Object.keys(aliases).length);\n return aliases;\n}\n","import { parse as parseShellQuote } from 'shell-quote';\n\nconst UNSAFE_ALIAS_PATTERN = /[`$]/;\n\n/**\n * Parses an alias command using shell-quote while ensuring only literal arguments are present.\n *\n * @param command Alias command string defined by the user.\n * @returns Array of arguments ready to be passed to Commander.\n * @throws If the alias contains shell operators, command separators, or is empty.\n */\nexport function parseAliasArguments(command: string): string[] {\n const parsed = parseShellQuote(command);\n if (parsed.length === 0) {\n throw new Error('Alias command cannot be empty.');\n }\n\n const hasUnsafeToken = parsed.some((token) => typeof token !== 'string');\n if (hasUnsafeToken) {\n throw new Error('Alias command contains unsupported shell syntax.');\n }\n\n const args = parsed as string[];\n const hasSubstitution = args.some((token) => UNSAFE_ALIAS_PATTERN.test(token));\n if (hasSubstitution) {\n throw new Error('Alias command contains unsupported substitution syntax.');\n }\n\n return args;\n}\n\n/**\n * Validates that an alias command only contains literal arguments.\n *\n * @param command Alias command string defined by the user.\n * @returns True when the alias contains no shell operators or expansions.\n */\nexport function isAliasCommandSafe(command: string): boolean {\n try {\n parseAliasArguments(command);\n return true;\n } catch {\n return false;\n }\n}\n","import createDebug from 'debug';\n\n/**\n * Creates a namespaced debug logger for granola-cli.\n *\n * @param namespace - The namespace suffix (e.g., 'lib:auth', 'service:client')\n * @returns A debug logger function\n *\n * @example\n * const debug = createGranolaDebug('lib:auth');\n * debug('loading credentials'); // [granola:lib:auth] loading credentials\n */\nexport function createGranolaDebug(namespace: string) {\n return createDebug(`granola:${namespace}`);\n}\n\n/**\n * Safely formats sensitive data for debug output.\n * Masks tokens and credentials while keeping them identifiable.\n *\n * @param token - The token to mask\n * @returns Masked token showing only first/last 4 characters\n *\n * @example\n * maskToken('abc123xyz789longtoken') // 'abc1...oken'\n */\nexport function maskToken(token: string): string {\n if (!token || token.length < 12) return '[REDACTED]';\n return `${token.slice(0, 4)}...${token.slice(-4)}`;\n}\n","import { encode as toonEncode } from '@toon-format/toon';\nimport chalk from 'chalk';\nimport Table from 'cli-table3';\nimport { stringify as yamlStringify } from 'yaml';\nimport { createGranolaDebug } from './debug.js';\n\nconst debug = createGranolaDebug('lib:output');\n\nexport type OutputFormat = 'json' | 'yaml' | 'toon';\n\n/**\n * Formats data in the specified output format.\n *\n * @param data - The data to format\n * @param format - Output format: 'json', 'yaml', or 'toon'\n * @returns Formatted string\n */\nexport function formatOutput(data: unknown, format: OutputFormat): string {\n debug('formatOutput: format=%s, dataType=%s', format, typeof data);\n switch (format) {\n case 'yaml':\n return yamlStringify(data);\n case 'toon':\n return toonEncode(data);\n default:\n return JSON.stringify(data, null, 2);\n }\n}\n\ninterface Column<T> {\n key: keyof T;\n header: string;\n width?: number;\n format?: (value: unknown) => string;\n}\n\nexport function table<T extends object>(data: T[], columns: Column<T>[]): string {\n debug('table: rendering %d rows, %d columns', data.length, columns.length);\n const colWidths = columns.map((c) => c.width ?? null);\n const t = new Table({\n head: columns.map((c) => chalk.bold(c.header)),\n colWidths,\n style: { head: [], border: [] },\n chars: {\n top: '',\n 'top-mid': '',\n 'top-left': '',\n 'top-right': '',\n bottom: '',\n 'bottom-mid': '',\n 'bottom-left': '',\n 'bottom-right': '',\n left: '',\n 'left-mid': '',\n mid: '',\n 'mid-mid': '',\n right: '',\n 'right-mid': '',\n middle: ' ',\n },\n });\n\n for (const row of data) {\n t.push(\n columns.map((c) => {\n const val = row[c.key];\n return c.format ? c.format(val) : String(val ?? '');\n }),\n );\n }\n\n return t.toString();\n}\n\nexport function formatDate(iso: string): string {\n const d = new Date(iso);\n return d.toLocaleDateString('en-US', {\n month: 'short',\n day: 'numeric',\n year: 'numeric',\n });\n}\n\nexport function formatDuration(start: string, end: string): string {\n const startMs = new Date(start).getTime();\n const endMs = new Date(end).getTime();\n if (!Number.isFinite(startMs) || !Number.isFinite(endMs)) {\n return '--';\n }\n const ms = endMs - startMs;\n if (!Number.isFinite(ms) || ms < 0) {\n return '--';\n }\n const mins = Math.round(ms / 60000);\n return `${mins} min`;\n}\n\nexport function truncate(s: string, len: number): string {\n if (s.length <= len) return s;\n return `${s.slice(0, len - 1)}…`;\n}\n","import { Command } from 'commander';\nimport { loginCommand } from './login.js';\nimport { logoutCommand } from './logout.js';\nimport { statusCommand } from './status.js';\n\nexport const authCommand = new Command('auth')\n .description('Manage authentication')\n .addCommand(loginCommand)\n .addCommand(logoutCommand)\n .addCommand(statusCommand);\n","import chalk from 'chalk';\nimport { Command } from 'commander';\nimport {\n getDefaultSupabasePath,\n loadCredentialsFromFile,\n saveCredentials,\n} from '../../lib/auth.js';\nimport { createGranolaDebug } from '../../lib/debug.js';\n\nconst debug = createGranolaDebug('cmd:auth:login');\n\n/**\n * Creates the 'login' command for authenticating with Granola.\n * Imports credentials from the Granola desktop app.\n *\n * @example\n * granola auth login\n *\n * @returns Commander command instance\n */\nexport function createLoginCommand() {\n return new Command('login')\n .description('Import credentials from Granola desktop app')\n .action(async () => {\n debug('login command invoked');\n const creds = await loadCredentialsFromFile();\n if (!creds) {\n const path = getDefaultSupabasePath();\n debug('login failed: could not load credentials from %s', path);\n console.error(chalk.red('Error:'), 'Could not load credentials.');\n console.error(`Expected file at: ${chalk.dim(path)}`);\n console.error('\\nMake sure the Granola desktop app is installed and you are logged in.');\n process.exit(1);\n }\n\n debug('credentials loaded, saving to keychain');\n await saveCredentials(creds);\n debug('login successful');\n console.log(chalk.green('Credentials imported successfully'));\n });\n}\n\nexport const loginCommand = createLoginCommand();\n","import { readFile } from 'node:fs/promises';\nimport { homedir, platform } from 'node:os';\nimport { join } from 'node:path';\nimport { deletePassword, getPassword, setPassword } from 'cross-keychain';\nimport type { Credentials } from '../types.js';\nimport { createGranolaDebug } from './debug.js';\nimport { withLock } from './lock.js';\n\nconst debug = createGranolaDebug('lib:auth');\n\nconst SERVICE_NAME = 'com.granola.cli';\nconst ACCOUNT_NAME = 'credentials';\nconst DEFAULT_CLIENT_ID = 'client_GranolaMac';\n\nexport async function getCredentials(): Promise<Credentials | null> {\n debug('loading credentials from keychain');\n try {\n const stored = await getPassword(SERVICE_NAME, ACCOUNT_NAME);\n if (!stored) {\n debug('no credentials found in keychain');\n return null;\n }\n\n const parsed = JSON.parse(stored);\n debug('credentials loaded, hasAccessToken: %s', Boolean(parsed.accessToken));\n return {\n refreshToken: parsed.refreshToken,\n accessToken: parsed.accessToken || '',\n clientId: parsed.clientId,\n };\n } catch (error) {\n debug('failed to get credentials: %O', error);\n return null;\n }\n}\n\nexport async function saveCredentials(creds: Credentials): Promise<void> {\n debug('saving credentials to keychain');\n await setPassword(SERVICE_NAME, ACCOUNT_NAME, JSON.stringify(creds));\n debug('credentials saved');\n}\n\nexport async function deleteCredentials(): Promise<void> {\n debug('deleting credentials from keychain');\n await deletePassword(SERVICE_NAME, ACCOUNT_NAME);\n debug('credentials deleted');\n}\n\nconst WORKOS_AUTH_URL = 'https://api.workos.com/user_management/authenticate';\n\n/**\n * Refreshes the access token using the stored refresh token.\n * WorkOS refresh tokens are single-use - each refresh returns a new refresh token\n * that must be saved immediately.\n *\n * Uses a file-based lock to prevent race conditions when multiple CLI processes\n * attempt to refresh the token simultaneously.\n *\n * @returns New credentials if refresh succeeds, null otherwise\n */\nexport async function refreshAccessToken(): Promise<Credentials | null> {\n debug('attempting token refresh');\n\n try {\n return await withLock(async () => {\n // Re-read credentials inside the lock - another process may have updated them\n const creds = await getCredentials();\n if (!creds?.refreshToken || !creds?.clientId) {\n debug('cannot refresh: missing refreshToken or clientId');\n return null;\n }\n\n const response = await fetch(WORKOS_AUTH_URL, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n client_id: creds.clientId,\n grant_type: 'refresh_token',\n refresh_token: creds.refreshToken,\n }),\n });\n\n if (!response.ok) {\n debug('token refresh failed: %d %s', response.status, response.statusText);\n return null;\n }\n\n const data = (await response.json()) as { refresh_token: string; access_token: string };\n const newCreds: Credentials = {\n refreshToken: data.refresh_token,\n accessToken: data.access_token,\n clientId: creds.clientId,\n };\n\n await saveCredentials(newCreds);\n debug('token refresh successful, new credentials saved');\n return newCreds;\n });\n } catch (error) {\n debug('token refresh error: %O', error);\n return null;\n }\n}\n\nexport function parseSupabaseJson(json: string): Credentials | null {\n debug('parsing supabase.json');\n try {\n const parsed = JSON.parse(json);\n\n // Try WorkOS tokens first (newer auth system)\n if (parsed.workos_tokens && typeof parsed.workos_tokens === 'string') {\n const workosTokens = JSON.parse(parsed.workos_tokens);\n if (workosTokens.access_token) {\n debug('found WorkOS tokens');\n return {\n refreshToken: workosTokens.refresh_token || '',\n accessToken: workosTokens.access_token,\n clientId: workosTokens.client_id || DEFAULT_CLIENT_ID,\n };\n }\n }\n\n // Fall back to Cognito tokens\n if (parsed.cognito_tokens && typeof parsed.cognito_tokens === 'string') {\n const cognitoTokens = JSON.parse(parsed.cognito_tokens);\n if (!cognitoTokens.refresh_token) return null;\n\n debug('found Cognito tokens');\n return {\n refreshToken: cognitoTokens.refresh_token,\n accessToken: cognitoTokens.access_token || '',\n clientId: cognitoTokens.client_id || DEFAULT_CLIENT_ID,\n };\n }\n\n // Legacy format: refresh_token at root level\n if (!parsed.refresh_token) return null;\n\n debug('found legacy token format');\n return {\n refreshToken: parsed.refresh_token,\n accessToken: parsed.access_token || '',\n clientId: parsed.client_id || DEFAULT_CLIENT_ID,\n };\n } catch (error) {\n debug('failed to parse supabase.json: %O', error);\n return null;\n }\n}\n\n/**\n * Gets the default path to the Granola supabase.json file based on the OS.\n *\n * @returns The platform-specific path to supabase.json\n */\nexport function getDefaultSupabasePath(): string {\n const home = homedir();\n const os = platform();\n\n let path: string;\n switch (os) {\n case 'darwin':\n path = join(home, 'Library', 'Application Support', 'Granola', 'supabase.json');\n break;\n case 'win32':\n path = join(\n process.env.APPDATA || join(home, 'AppData', 'Roaming'),\n 'Granola',\n 'supabase.json',\n );\n break;\n default:\n // Linux and other Unix-like systems\n path = join(home, '.config', 'granola', 'supabase.json');\n }\n debug('platform: %s, supabase path: %s', os, path);\n return path;\n}\n\n/**\n * Loads credentials from the default Granola supabase.json file.\n *\n * @returns Credentials if found and valid, null otherwise\n */\nexport async function loadCredentialsFromFile(): Promise<Credentials | null> {\n const path = getDefaultSupabasePath();\n debug('loading credentials from file: %s', path);\n try {\n const content = await readFile(path, 'utf-8');\n debug('file read successful, parsing content');\n return parseSupabaseJson(content);\n } catch (error) {\n debug('failed to load credentials from file: %O', error);\n return null;\n }\n}\n","import type { FileHandle } from 'node:fs/promises';\nimport { mkdir, open, stat, unlink } from 'node:fs/promises';\nimport { homedir, tmpdir } from 'node:os';\nimport { dirname, join } from 'node:path';\nimport { createGranolaDebug } from './debug.js';\n\nconst debug = createGranolaDebug('lib:lock');\n\nconst LOCK_FILE_NAME = 'granola-token-refresh.lock';\nconst LOCK_TIMEOUT_MS = 30000;\nconst LOCK_RETRY_INTERVAL_MS = 100;\nconst LOCK_STALE_MS = 60000;\n\ninterface LockHandle {\n handle: FileHandle;\n}\n\nfunction getLockFilePath(): string {\n const tempDir =\n process.platform === 'darwin' ? join(homedir(), 'Library', 'Caches', 'granola') : tmpdir();\n return join(tempDir, LOCK_FILE_NAME);\n}\n\nasync function ensureLockDirectory(): Promise<void> {\n const lockPath = getLockFilePath();\n const dir = dirname(lockPath);\n await mkdir(dir, { recursive: true });\n}\n\nasync function isLockStale(lockPath: string): Promise<boolean> {\n try {\n const stats = await stat(lockPath);\n const age = Date.now() - stats.mtimeMs;\n return age > LOCK_STALE_MS;\n } catch {\n return true;\n }\n}\n\n/**\n * Acquires an exclusive file lock for token refresh operations.\n * Uses O_CREAT | O_EXCL for atomic creation.\n *\n * @returns LockHandle if lock acquired, null if timeout\n */\nexport async function acquireLock(): Promise<LockHandle | null> {\n const lockPath = getLockFilePath();\n const startTime = Date.now();\n\n await ensureLockDirectory();\n debug('attempting to acquire lock at %s', lockPath);\n\n while (Date.now() - startTime < LOCK_TIMEOUT_MS) {\n try {\n const handle = await open(lockPath, 'wx');\n debug('lock acquired');\n return { handle };\n } catch (error: unknown) {\n const err = error as NodeJS.ErrnoException;\n if (err.code === 'EEXIST') {\n if (await isLockStale(lockPath)) {\n debug('removing stale lock');\n try {\n await unlink(lockPath);\n } catch {\n // Another process may have removed it\n }\n continue;\n }\n\n debug('lock held by another process, waiting...');\n await new Promise((r) => setTimeout(r, LOCK_RETRY_INTERVAL_MS));\n } else {\n debug('lock acquisition failed: %O', error);\n throw error;\n }\n }\n }\n\n debug('lock acquisition timed out');\n return null;\n}\n\n/**\n * Releases a file lock.\n *\n * @param lockHandle - The lock handle from acquireLock\n */\nexport async function releaseLock(lockHandle: LockHandle): Promise<void> {\n const lockPath = getLockFilePath();\n debug('releasing lock');\n try {\n await lockHandle.handle.close();\n await unlink(lockPath);\n debug('lock released');\n } catch (error) {\n debug('error releasing lock: %O', error);\n }\n}\n\n/**\n * Executes an operation within a file lock.\n * Ensures the lock is released even if the operation throws.\n *\n * @param operation - The async operation to execute\n * @returns The result of the operation\n * @throws Error if lock cannot be acquired or operation fails\n */\nexport async function withLock<T>(operation: () => Promise<T>): Promise<T> {\n const handle = await acquireLock();\n if (handle === null) {\n throw new Error('Failed to acquire token refresh lock');\n }\n\n try {\n return await operation();\n } finally {\n await releaseLock(handle);\n }\n}\n\n// Export for testing\nexport const _testing = {\n getLockFilePath,\n LOCK_TIMEOUT_MS,\n LOCK_RETRY_INTERVAL_MS,\n LOCK_STALE_MS,\n};\n","import chalk from 'chalk';\nimport { Command } from 'commander';\nimport { deleteCredentials } from '../../lib/auth.js';\nimport { createGranolaDebug } from '../../lib/debug.js';\n\nconst debug = createGranolaDebug('cmd:auth:logout');\n\n/**\n * Creates the 'logout' command for removing stored credentials.\n *\n * Deletes authentication credentials from the system keychain.\n *\n * @returns Commander command instance\n */\nexport function createLogoutCommand() {\n return new Command('logout').description('Logout from Granola').action(async () => {\n debug('logout command invoked');\n try {\n await deleteCredentials();\n debug('logout successful');\n console.log(chalk.green('Logged out successfully'));\n } catch (error) {\n debug('logout failed: %O', error);\n console.error(chalk.red('Error:'), 'Failed to logout.');\n if (error instanceof Error) {\n console.error(chalk.dim(error.message));\n }\n process.exit(1);\n }\n });\n}\n\nexport const logoutCommand = createLogoutCommand();\n","import chalk from 'chalk';\nimport { Command } from 'commander';\nimport { getCredentials } from '../../lib/auth.js';\nimport { createGranolaDebug } from '../../lib/debug.js';\nimport { formatOutput, type OutputFormat } from '../../lib/output.js';\n\nconst debug = createGranolaDebug('cmd:auth:status');\n\n/**\n * Creates the 'status' command for checking authentication state.\n *\n * Reports whether the user is currently authenticated.\n * Supports -o/--output for structured output.\n *\n * @returns Commander command instance\n */\nexport function createStatusCommand() {\n return new Command('status')\n .description('Check authentication status')\n .option('-o, --output <format>', 'Output format (json, yaml, toon)')\n .action(async (opts) => {\n debug('status command invoked');\n const creds = await getCredentials();\n debug('authenticated: %s', !!creds);\n\n const format = opts.output || null;\n if (format) {\n if (!['json', 'yaml', 'toon'].includes(format)) {\n console.error(chalk.red(`Invalid format: ${format}. Use 'json', 'yaml', or 'toon'.`));\n process.exit(1);\n }\n console.log(formatOutput({ authenticated: !!creds }, format as OutputFormat));\n return;\n }\n\n if (creds) {\n console.log(chalk.green('Authenticated'));\n } else {\n console.log(chalk.yellow('Not authenticated'));\n console.log(chalk.dim('Run: granola auth login'));\n }\n });\n}\n\nexport const statusCommand = createStatusCommand();\n","import chalk from 'chalk';\nimport { Command } from 'commander';\nimport { getConfig, getConfigValue, resetConfig, setConfigValue } from '../lib/config.js';\nimport { createGranolaDebug } from '../lib/debug.js';\nimport { formatOutput, type OutputFormat } from '../lib/output.js';\nimport type { Config } from '../types.js';\n\nconst debug = createGranolaDebug('cmd:config');\n\ntype ConfigKey = keyof Config;\nconst CONFIG_VALUE_PARSERS: Record<ConfigKey, (value: string) => Config[ConfigKey]> = {\n default_workspace: (value: string) => value,\n pager: (value: string) => value,\n aliases: (value: string) => {\n try {\n const parsed = JSON.parse(value);\n if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {\n throw new Error('Aliases must be a JSON object of { \"name\": \"command\" } pairs.');\n }\n for (const [alias, command] of Object.entries(parsed)) {\n if (typeof command !== 'string') {\n throw new Error(`Alias \"${alias}\" must map to a string command.`);\n }\n }\n return parsed as Record<string, string>;\n } catch (error) {\n if (error instanceof SyntaxError) {\n throw new Error('Aliases must be valid JSON (example: {\"meetings\":\"meeting list\"}).');\n }\n throw error;\n }\n },\n};\n\nconst CONFIG_KEYS = Object.keys(CONFIG_VALUE_PARSERS) as ConfigKey[];\n\nfunction isConfigKey(key: string): key is ConfigKey {\n return CONFIG_KEYS.includes(key as ConfigKey);\n}\n\n/**\n * Creates the 'config' command for managing CLI configuration.\n *\n * Provides subcommands for listing, getting, setting, and resetting\n * configuration values (e.g., default workspace, pager settings).\n *\n * @returns Commander command instance\n */\nexport function createConfigCommand() {\n const cmd = new Command('config').description('Manage CLI configuration');\n\n cmd\n .command('list')\n .description('View current config')\n .option('-o, --output <format>', 'Output format (json, yaml, toon)')\n .action((opts) => {\n debug('config list command invoked');\n const config = getConfig();\n\n const format = opts.output || null;\n if (format) {\n if (!['json', 'yaml', 'toon'].includes(format)) {\n console.error(chalk.red(`Invalid format: ${format}. Use 'json', 'yaml', or 'toon'.`));\n process.exit(1);\n }\n console.log(formatOutput(config, format as OutputFormat));\n return;\n }\n\n if (Object.keys(config).length === 0) {\n console.log(chalk.dim('No configuration set.'));\n return;\n }\n\n for (const [key, value] of Object.entries(config)) {\n if (typeof value === 'object') {\n console.log(`${chalk.bold(key)}:`);\n for (const [k, v] of Object.entries(value as Record<string, unknown>)) {\n console.log(` ${k}: ${v}`);\n }\n } else {\n console.log(`${chalk.bold(key)}: ${value}`);\n }\n }\n });\n\n cmd\n .command('get <key>')\n .description('Get a config value')\n .option('-o, --output <format>', 'Output format (json, yaml, toon)')\n .action((key: string, opts) => {\n debug('config get command invoked with key: %s', key);\n const value = getConfigValue(key as keyof ReturnType<typeof getConfig>);\n\n const format = opts.output || null;\n if (format) {\n if (!['json', 'yaml', 'toon'].includes(format)) {\n console.error(chalk.red(`Invalid format: ${format}. Use 'json', 'yaml', or 'toon'.`));\n process.exit(1);\n }\n console.log(formatOutput({ [key]: value }, format as OutputFormat));\n return;\n }\n\n if (value === undefined) {\n console.log(chalk.dim('(not set)'));\n } else {\n console.log(value);\n }\n });\n\n cmd\n .command('set <key> <value>')\n .description('Set a config value')\n .action((key: string, value: string) => {\n debug('config set command invoked: %s = %s', key, value);\n if (!isConfigKey(key)) {\n console.error(\n chalk.red(\n `Invalid config key: ${key}. Allowed keys: ${CONFIG_KEYS.map((k) => `'${k}'`).join(', ')}.`,\n ),\n );\n process.exit(1);\n }\n\n const parser = CONFIG_VALUE_PARSERS[key];\n let parsedValue: Config[typeof key];\n try {\n parsedValue = parser(value) as Config[typeof key];\n } catch (error) {\n console.error(chalk.red('Invalid value for config key:'), key);\n if (error instanceof Error) {\n console.error(chalk.dim(error.message));\n }\n process.exit(1);\n }\n\n setConfigValue(key, parsedValue);\n console.log(chalk.green(`Set ${key} = ${value}`));\n });\n\n cmd\n .command('reset')\n .description('Reset to defaults')\n .action(() => {\n debug('config reset command invoked');\n resetConfig();\n console.log(chalk.green('Configuration reset'));\n });\n\n return cmd;\n}\n\nexport const configCommand = createConfigCommand();\n","import { Command } from 'commander';\nimport { listCommand } from './list.js';\nimport { viewCommand } from './view.js';\n\nexport const folderCommand = new Command('folder')\n .description('Work with folders')\n .addCommand(listCommand)\n .addCommand(viewCommand);\n","import chalk from 'chalk';\nimport { Command } from 'commander';\nimport { createGranolaDebug } from '../../lib/debug.js';\nimport { formatOutput, type OutputFormat, table } from '../../lib/output.js';\nimport { list as listFolders } from '../../services/folders.js';\nimport type { Folder } from '../../types.js';\n\nconst debug = createGranolaDebug('cmd:folder:list');\n\n/**\n * Creates the 'list' command for displaying folders.\n *\n * Lists folders with optional filtering by workspace.\n * Supports -o/--output for structured output.\n *\n * @returns Commander command instance\n */\nexport function createListCommand() {\n return new Command('list')\n .description('List folders')\n .option('-w, --workspace <id>', 'Filter by workspace')\n .option('-o, --output <format>', 'Output format (json, yaml, toon)')\n .action(async (opts) => {\n debug('folder list command invoked with opts: %O', opts);\n\n let data: Folder[];\n try {\n data = await listFolders({\n workspace: opts.workspace,\n });\n debug('fetched %d folders', data.length);\n } catch (error) {\n console.error(chalk.red('Error:'), 'Failed to list folders.');\n if (error instanceof Error) {\n console.error(chalk.dim(error.message));\n }\n process.exit(1);\n }\n\n // Handle structured output formats\n const format = opts.output || null;\n if (format) {\n if (!['json', 'yaml', 'toon'].includes(format)) {\n console.error(chalk.red(`Invalid format: ${format}. Use 'json', 'yaml', or 'toon'.`));\n process.exit(1);\n }\n console.log(formatOutput(data, format as OutputFormat));\n return;\n }\n\n if (data.length === 0) {\n console.log(chalk.dim('No folders found.'));\n return;\n }\n\n const rows = data.map((folder) => ({\n ...folder,\n display_name: folder.name || folder.title || 'Unnamed',\n }));\n\n const output = table(rows, [\n { key: 'id', header: 'ID', width: 12, format: (v) => String(v).slice(0, 8) },\n { key: 'display_name', header: 'NAME', width: 20, format: (v) => String(v || '') },\n {\n key: 'workspace_id',\n header: 'WORKSPACE',\n width: 12,\n format: (v) => String(v).slice(0, 8),\n },\n ]);\n\n console.log(output);\n });\n}\n\nexport const listCommand = createListCommand();\n","import chalk from 'chalk';\nimport { createApiClient, type GranolaApi } from '../lib/api.js';\nimport { getCredentials, refreshAccessToken } from '../lib/auth.js';\nimport { createGranolaDebug, maskToken } from '../lib/debug.js';\nimport { createHttpClient } from '../lib/http.js';\n\nconst debug = createGranolaDebug('service:client');\n\nlet client: GranolaApi | null = null;\n\nexport async function getClient(): Promise<GranolaApi> {\n debug('getClient called, cached: %s', client ? 'yes' : 'no');\n if (client) return client;\n\n debug('fetching credentials');\n const creds = await getCredentials();\n if (!creds) {\n debug('no credentials found, exiting');\n console.error(chalk.red('Error:'), 'Not authenticated.');\n console.error(`Run ${chalk.cyan('granola auth login')} to authenticate.`);\n process.exit(2);\n }\n\n debug('creating API client, token: %s', maskToken(creds.accessToken));\n const httpClient = createHttpClient(creds.accessToken);\n client = createApiClient(httpClient);\n\n return client;\n}\n\nexport function resetClient(): void {\n debug('client reset');\n client = null;\n}\n\nfunction isUnauthorizedError(error: unknown): boolean {\n if (error && typeof error === 'object') {\n const e = error as { status?: number };\n return e.status === 401;\n }\n return false;\n}\n\n/**\n * Wraps an async operation with automatic token refresh on 401 errors.\n * If the operation fails with a 401, attempts to refresh the token and retry once.\n */\nexport async function withTokenRefresh<T>(operation: () => Promise<T>): Promise<T> {\n try {\n return await operation();\n } catch (error: unknown) {\n if (isUnauthorizedError(error)) {\n debug('401 detected, attempting token refresh');\n\n const newCreds = await refreshAccessToken();\n if (!newCreds) {\n debug('token refresh failed, re-throwing original error');\n throw error;\n }\n\n resetClient();\n debug('retrying operation with refreshed token');\n return operation();\n }\n throw error;\n }\n}\n","import type { Meeting, Person, ProseMirrorDoc } from '../types.js';\nimport type { HttpClient } from './http.js';\n\nexport interface GetDocumentsOptions {\n workspace_id?: string;\n limit?: number;\n offset?: number;\n cursor?: string;\n include_last_viewed_panel?: boolean;\n}\n\nexport interface DocumentsResponse {\n docs: Meeting[];\n next_cursor?: string;\n}\n\nexport interface GetDocumentsBatchOptions {\n document_ids: string[];\n include_last_viewed_panel?: boolean;\n}\n\nexport interface DocumentsBatchResponse {\n documents?: Meeting[];\n docs?: Meeting[];\n}\n\nexport interface DocumentMetadata {\n creator?: {\n name: string;\n email: string;\n details?: object;\n };\n attendees?: Person[];\n notes?: ProseMirrorDoc;\n last_viewed_panel?: {\n content: ProseMirrorDoc;\n };\n}\n\nexport interface TranscriptSegment {\n document_id?: string;\n id: string;\n text: string;\n source: 'microphone' | 'system';\n start_timestamp: string;\n end_timestamp: string;\n is_final?: boolean;\n}\n\nexport interface DocumentListDocument {\n id: string;\n}\n\nexport interface DocumentList {\n id: string;\n title?: string;\n name?: string;\n workspace_id: string;\n owner_id: string;\n created_at: string;\n is_favourite: boolean;\n documents?: DocumentListDocument[];\n document_ids?: string[];\n}\n\nexport interface WorkspaceEntry {\n workspace: {\n workspace_id: string;\n slug: string;\n display_name: string;\n is_locked: boolean;\n created_at: string;\n updated_at: string;\n privacy_mode_enabled: boolean;\n sharing_link_visibility: string | null;\n };\n role: string;\n plan_type: string;\n}\n\nexport interface WorkspacesResponse {\n workspaces: WorkspaceEntry[];\n}\n\nexport interface GranolaApi {\n getDocuments(options?: GetDocumentsOptions): Promise<DocumentsResponse>;\n getDocumentsBatch(options: GetDocumentsBatchOptions): Promise<DocumentsBatchResponse>;\n getDocumentMetadata(documentId: string): Promise<DocumentMetadata>;\n getDocumentTranscript(documentId: string): Promise<TranscriptSegment[]>;\n getDocumentLists(): Promise<DocumentList[]>;\n getDocumentList(folderId: string): Promise<DocumentList | null>;\n getWorkspaces(): Promise<WorkspacesResponse>;\n setToken(token: string): void;\n}\n\nexport function createApiClient(httpClient: HttpClient): GranolaApi {\n async function getDocuments(options: GetDocumentsOptions = {}): Promise<DocumentsResponse> {\n const body: Record<string, unknown> = {\n include_last_viewed_panel: options.include_last_viewed_panel ?? false,\n };\n\n if (options.workspace_id) body.workspace_id = options.workspace_id;\n if (options.limit !== undefined) body.limit = options.limit;\n if (options.offset !== undefined) body.offset = options.offset;\n if (options.cursor) body.cursor = options.cursor;\n\n return httpClient.post<DocumentsResponse>('/v2/get-documents', body);\n }\n\n async function getDocumentsBatch(\n options: GetDocumentsBatchOptions,\n ): Promise<DocumentsBatchResponse> {\n return httpClient.post<DocumentsBatchResponse>('/v1/get-documents-batch', {\n document_ids: options.document_ids,\n include_last_viewed_panel: options.include_last_viewed_panel ?? false,\n });\n }\n\n async function getDocumentMetadata(documentId: string): Promise<DocumentMetadata> {\n return httpClient.post<DocumentMetadata>('/v1/get-document-metadata', {\n document_id: documentId,\n });\n }\n\n async function getDocumentTranscript(documentId: string): Promise<TranscriptSegment[]> {\n return httpClient.post<TranscriptSegment[]>('/v1/get-document-transcript', {\n document_id: documentId,\n });\n }\n\n async function getDocumentLists(): Promise<DocumentList[]> {\n return httpClient.post<DocumentList[]>('/v2/get-document-lists', {});\n }\n\n async function getDocumentList(folderId: string): Promise<DocumentList | null> {\n const folders = await getDocumentLists();\n return folders.find((f) => f.id === folderId) || null;\n }\n\n async function getWorkspaces(): Promise<WorkspacesResponse> {\n return httpClient.post<WorkspacesResponse>('/v1/get-workspaces', {});\n }\n\n function setToken(token: string): void {\n httpClient.setToken(token);\n }\n\n return {\n getDocuments,\n getDocumentsBatch,\n getDocumentMetadata,\n getDocumentTranscript,\n getDocumentLists,\n getDocumentList,\n getWorkspaces,\n setToken,\n };\n}\n","import { readFileSync } from 'node:fs';\nimport os from 'node:os';\nimport process from 'node:process';\n\nfunction getPackageVersion(): string {\n // Try path from bundled output (dist/main.js -> ../package.json)\n // Falls back to path from source (src/lib/http.ts -> ../../package.json)\n for (const path of ['../package.json', '../../package.json']) {\n try {\n const pkg = JSON.parse(readFileSync(new URL(path, import.meta.url), 'utf-8'));\n return pkg.version;\n } catch {}\n }\n return '0.0.0';\n}\n\nconst version = getPackageVersion();\n\nconst BASE_URL = 'https://api.granola.ai';\nconst APP_VERSION = '7.0.0';\n\nfunction buildUserAgent(): string {\n const platform = process.platform === 'darwin' ? 'macOS' : process.platform;\n const osRelease = os.release();\n return `Granola/${APP_VERSION} granola-cli/${version} (${platform} ${osRelease})`;\n}\n\nfunction getClientHeaders(): Record<string, string> {\n return {\n 'X-App-Version': APP_VERSION,\n 'X-Client-Version': APP_VERSION,\n 'X-Client-Type': 'cli',\n 'X-Client-Platform': process.platform,\n 'X-Client-Architecture': process.arch,\n 'X-Client-Id': `granola-cli-${version}`,\n 'User-Agent': buildUserAgent(),\n };\n}\n\nconst RETRY_CONFIG = {\n maxRetries: 3,\n baseDelay: 250,\n retryableStatuses: [429, 500, 502, 503, 504],\n};\n\nexport class ApiError extends Error {\n constructor(\n message: string,\n public readonly status: number,\n public readonly body?: unknown,\n ) {\n super(message);\n this.name = 'ApiError';\n }\n}\n\nexport interface HttpClient {\n post<T>(endpoint: string, body?: object): Promise<T>;\n setToken(token: string): void;\n}\n\nfunction isRetryable(status: number): boolean {\n return RETRY_CONFIG.retryableStatuses.includes(status);\n}\n\nasync function sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport function createHttpClient(token: string): HttpClient {\n let currentToken = token;\n\n async function post<T>(endpoint: string, body: object = {}): Promise<T> {\n let lastError: Error | null = null;\n const maxAttempts = RETRY_CONFIG.maxRetries + 1;\n\n for (let attempt = 0; attempt < maxAttempts; attempt++) {\n try {\n const response = await fetch(`${BASE_URL}${endpoint}`, {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${currentToken}`,\n 'Content-Type': 'application/json',\n ...getClientHeaders(),\n },\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n const responseBody = await response.json().catch(() => ({}));\n\n if (isRetryable(response.status) && attempt < maxAttempts - 1) {\n const delay = RETRY_CONFIG.baseDelay * 2 ** attempt;\n await sleep(delay);\n continue;\n }\n\n throw new ApiError(\n `HTTP ${response.status}: ${response.statusText}`,\n response.status,\n responseBody,\n );\n }\n\n return (await response.json()) as T;\n } catch (error) {\n if (error instanceof ApiError) {\n throw error;\n }\n\n lastError = error as Error;\n\n if (attempt < maxAttempts - 1) {\n const delay = RETRY_CONFIG.baseDelay * 2 ** attempt;\n await sleep(delay);\n }\n }\n }\n\n throw lastError;\n }\n\n function setToken(newToken: string): void {\n currentToken = newToken;\n }\n\n return { post, setToken };\n}\n","import type { DocumentList } from '../lib/api.js';\nimport { createGranolaDebug } from '../lib/debug.js';\nimport type { Folder } from '../types.js';\nimport { getClient, withTokenRefresh } from './client.js';\n\nconst debug = createGranolaDebug('service:folders');\n\nexport interface ListOptions {\n workspace?: string;\n}\n\nfunction normalizeFolder(folder: DocumentList): Folder {\n const documentIdsFromDocs = Array.isArray(folder.documents)\n ? folder.documents\n .map((doc: { id?: string }) => doc?.id)\n .filter((id: string | undefined): id is string => Boolean(id))\n : undefined;\n\n const documentIds =\n Array.isArray(folder.document_ids) && folder.document_ids.length > 0\n ? folder.document_ids\n : documentIdsFromDocs;\n\n return {\n id: folder.id,\n name: folder.name ?? folder.title,\n title: folder.title ?? folder.name ?? 'Untitled',\n created_at: folder.created_at,\n workspace_id: folder.workspace_id,\n owner_id: folder.owner_id,\n document_ids: documentIds ?? [],\n is_favourite: folder.is_favourite,\n };\n}\n\nexport async function list(opts: ListOptions = {}): Promise<Folder[]> {\n return withTokenRefresh(async () => {\n const client = await getClient();\n const documentLists = await client.getDocumentLists();\n const folders = documentLists.map(normalizeFolder);\n debug('list fetched %d folders', folders.length);\n\n if (opts.workspace) {\n const filtered = folders.filter((folder) => folder.workspace_id === opts.workspace);\n debug('filtered to %d folders for workspace %s', filtered.length, opts.workspace);\n return filtered;\n }\n\n return folders;\n });\n}\n\nexport async function get(id: string): Promise<Folder | null> {\n return withTokenRefresh(async () => {\n debug('get called for folder: %s', id);\n const client = await getClient();\n const documentLists = await client.getDocumentLists();\n const folder = documentLists.find((f) => f.id === id);\n if (!folder) {\n debug('folder %s not found', id);\n return null;\n }\n debug('folder %s found', id);\n return normalizeFolder(folder);\n });\n}\n","import chalk from 'chalk';\nimport { Command } from 'commander';\nimport { createGranolaDebug } from '../../lib/debug.js';\nimport { formatOutput, type OutputFormat } from '../../lib/output.js';\nimport { get as getFolder } from '../../services/folders.js';\nimport type { Folder } from '../../types.js';\n\nconst debug = createGranolaDebug('cmd:folder:view');\n\n/**\n * Creates the 'view' command for displaying folder details.\n *\n * Shows folder metadata including name, meeting count, and workspace.\n * Supports -o/--output for structured output.\n *\n * @returns Commander command instance\n */\nexport function createViewCommand() {\n return new Command('view')\n .description('View folder details')\n .argument('<id>', 'Folder ID')\n .option('-o, --output <format>', 'Output format (json, yaml, toon)')\n .action(async (id: string, opts) => {\n debug('folder view command invoked with id: %s', id);\n\n let folder: Folder | null;\n try {\n folder = await getFolder(id);\n } catch (error) {\n console.error(chalk.red('Error:'), 'Failed to load folder.');\n if (error instanceof Error) {\n console.error(chalk.dim(error.message));\n }\n process.exit(1);\n }\n\n if (!folder) {\n console.error(chalk.red(`Folder ${id} not found`));\n process.exit(4);\n }\n\n // Handle structured output formats\n const format = opts.output || null;\n if (format) {\n if (!['json', 'yaml', 'toon'].includes(format)) {\n console.error(chalk.red(`Invalid format: ${format}. Use 'json', 'yaml', or 'toon'.`));\n process.exit(1);\n }\n console.log(formatOutput(folder, format as OutputFormat));\n return;\n }\n\n const name = folder.name || folder.title || 'Unnamed';\n const docCount = folder.document_ids?.length || 0;\n\n console.log(chalk.bold(name));\n console.log(chalk.dim(`${docCount} meetings · Workspace ${folder.workspace_id}`));\n console.log();\n console.log(chalk.dim('Tip: Use \"granola meeting list\" to browse recent meetings.'));\n });\n}\n\nexport const viewCommand = createViewCommand();\n","import { Command } from 'commander';\nimport { enhancedCommand } from './enhanced.js';\nimport { exportCommand } from './export.js';\nimport { listCommand } from './list.js';\nimport { notesCommand } from './notes.js';\nimport { transcriptCommand } from './transcript.js';\nimport { viewCommand } from './view.js';\n\nexport const meetingCommand = new Command('meeting')\n .description('Work with meetings')\n .addCommand(listCommand)\n .addCommand(viewCommand)\n .addCommand(notesCommand)\n .addCommand(enhancedCommand)\n .addCommand(transcriptCommand)\n .addCommand(exportCommand);\n","import chalk from 'chalk';\nimport { Command } from 'commander';\nimport { createGranolaDebug } from '../../lib/debug.js';\nimport { formatOutput, type OutputFormat } from '../../lib/output.js';\nimport { pipeToPager } from '../../lib/pager.js';\nimport { toMarkdown } from '../../lib/prosemirror.js';\nimport * as meetings from '../../services/meetings.js';\nimport type { ProseMirrorDoc } from '../../types.js';\n\nconst debug = createGranolaDebug('cmd:meeting:enhanced');\n\n/**\n * Creates the 'enhanced' command for displaying AI-enhanced meeting notes.\n *\n * Retrieves and renders AI-generated meeting summaries as Markdown.\n * Uses a pager for long output in interactive terminals.\n * Supports -o/--output for raw ProseMirror JSON output.\n *\n * @returns Commander command instance\n */\nexport function createEnhancedCommand() {\n return new Command('enhanced')\n .description('View AI-enhanced meeting notes')\n .argument('<id>', 'Meeting ID')\n .option('-o, --output <format>', 'Output format (markdown, json, yaml, toon)', 'markdown')\n .action(async (id: string, opts, cmd) => {\n debug('enhanced command invoked with id: %s', id);\n const global = cmd.optsWithGlobals();\n\n let fullId: string;\n try {\n const resolved = await meetings.resolveId(id);\n if (!resolved) {\n console.error(chalk.red(`Meeting ${id} not found`));\n process.exit(4);\n }\n fullId = resolved;\n } catch (err) {\n console.error(chalk.red((err as Error).message));\n process.exit(1);\n }\n\n let notes: ProseMirrorDoc | null;\n try {\n notes = await meetings.getEnhancedNotes(fullId);\n } catch (error) {\n debug('failed to load enhanced notes: %O', error);\n console.error(chalk.red('Error:'), 'Failed to fetch enhanced notes.');\n if (error instanceof Error) {\n console.error(chalk.dim(error.message));\n }\n process.exit(1);\n }\n\n if (!notes) {\n console.error(chalk.red(`No enhanced notes found for meeting ${id}`));\n process.exit(4);\n }\n\n const format = opts.output || 'markdown';\n const structuredFormats: OutputFormat[] = ['json', 'yaml', 'toon'];\n if (format !== 'markdown' && !structuredFormats.includes(format as OutputFormat)) {\n console.error(\n chalk.red(`Invalid format: ${format}. Use 'markdown', 'json', 'yaml', or 'toon'.`),\n );\n process.exit(1);\n }\n\n if (structuredFormats.includes(format as OutputFormat)) {\n console.log(formatOutput(notes, format as OutputFormat));\n return;\n }\n\n const md = toMarkdown(notes);\n\n if (global.noPager || !process.stdout.isTTY) {\n console.log(md);\n } else {\n await pipeToPager(md);\n }\n });\n}\n\nexport const enhancedCommand = createEnhancedCommand();\n","import { spawn } from 'node:child_process';\nimport { getConfigValue } from './config.js';\nimport { createGranolaDebug } from './debug.js';\n\nconst debug = createGranolaDebug('lib:pager');\n\nconst ALLOWED_PAGERS = ['less', 'more', 'cat', 'head', 'tail', 'bat', 'most'];\nconst SHELL_METACHARACTERS = /[;&|`$(){}[\\]<>\\\\!#*?]/;\n\nexport function validatePagerCommand(cmd: string): boolean {\n debug('validating pager command: %s', cmd);\n if (SHELL_METACHARACTERS.test(cmd)) {\n debug('pager validation failed: contains shell metacharacters');\n return false;\n }\n const [binary] = cmd.split(' ');\n const binaryName = binary.split('/').pop() || '';\n const valid = ALLOWED_PAGERS.includes(binaryName);\n debug('pager validation: %s (binary: %s)', valid ? 'passed' : 'failed', binaryName);\n return valid;\n}\n\nexport function getPagerCommand(): string {\n if (process.env.GRANOLA_PAGER) {\n debug('pager command: %s (source: GRANOLA_PAGER)', process.env.GRANOLA_PAGER);\n return process.env.GRANOLA_PAGER;\n }\n if (process.env.PAGER) {\n debug('pager command: %s (source: PAGER)', process.env.PAGER);\n return process.env.PAGER;\n }\n const configuredPager = getConfigValue('pager');\n if (configuredPager) {\n debug('pager command: %s (source: config)', configuredPager);\n return configuredPager;\n }\n debug('pager command: less -R (source: default)');\n return 'less -R';\n}\n\nexport async function pipeToPager(content: string): Promise<void> {\n debug('pipeToPager: isTTY=%s, contentLength=%d', process.stdout.isTTY, content.length);\n if (!process.stdout.isTTY) {\n debug('not a TTY, writing directly to stdout');\n process.stdout.write(`${content}\\n`);\n return;\n }\n\n const pagerCmd = getPagerCommand();\n\n if (!validatePagerCommand(pagerCmd)) {\n console.error(`Warning: Invalid pager command \"${pagerCmd}\". Falling back to direct output.`);\n process.stdout.write(`${content}\\n`);\n return;\n }\n\n const [cmd, ...args] = pagerCmd.split(' ');\n debug('spawning pager: %s with args: %O', cmd, args);\n\n return new Promise((resolve) => {\n let settled = false;\n const finish = () => {\n if (!settled) {\n settled = true;\n resolve();\n }\n };\n\n const fallbackToStdout = (reason: string) => {\n if (settled) return;\n settled = true;\n debug('falling back to stdout: %s', reason);\n console.error(\n `Warning: Unable to launch pager \"${pagerCmd}\" (${reason}). Falling back to direct output.`,\n );\n process.stdout.write(`${content}\\n`);\n resolve();\n };\n\n try {\n const pager = spawn(cmd, args, {\n stdio: ['pipe', 'inherit', 'inherit'],\n });\n\n pager.stdin.write(content);\n pager.stdin.end();\n\n pager.on('close', () => {\n debug('pager closed');\n finish();\n });\n\n pager.on('error', (err) => {\n debug('pager error: %O', err);\n fallbackToStdout((err as Error).message);\n });\n } catch (err) {\n debug('failed to spawn pager: %O', err);\n fallbackToStdout((err as Error).message);\n }\n });\n}\n","import type { ProseMirrorDoc, ProseMirrorNode } from '../types.js';\nimport { createGranolaDebug } from './debug.js';\n\nconst debug = createGranolaDebug('lib:prosemirror');\n\nexport function toMarkdown(doc: ProseMirrorDoc | null): string {\n debug('toMarkdown called with doc: %O', doc);\n if (!doc?.content) {\n debug('No content in doc, returning empty string');\n return '';\n }\n const result = doc.content.map((n) => nodeToMd(n)).join('\\n\\n');\n debug('toMarkdown result: %s', result);\n return result;\n}\n\nfunction nodeToMd(node: ProseMirrorNode): string {\n debug('nodeToMd processing node type: %s, node: %O', node.type, node);\n let result: string;\n switch (node.type) {\n case 'heading': {\n const lvl = (node.attrs?.level as number) || 1;\n result = `${'#'.repeat(lvl)} ${inlineToMd(node.content)}`;\n break;\n }\n case 'paragraph':\n result = inlineToMd(node.content);\n break;\n case 'bulletList':\n result = (node.content || []).map((li) => nodeToMd(li)).join('\\n');\n break;\n case 'orderedList':\n result = (node.content || [])\n .map((li, i) => nodeToMd(li).replace(/^- /, `${i + 1}. `))\n .join('\\n');\n break;\n case 'listItem':\n result = `- ${(node.content || []).map((c) => nodeToMd(c)).join('\\n ')}`;\n break;\n case 'blockquote':\n result = (node.content || []).map((c) => `> ${nodeToMd(c)}`).join('\\n');\n break;\n case 'codeBlock': {\n const lang = (node.attrs?.language as string) || '';\n result = `\\`\\`\\`${lang}\\n${inlineToMd(node.content)}\\n\\`\\`\\``;\n break;\n }\n case 'horizontalRule':\n result = '---';\n break;\n case 'text':\n result = applyMarks(node.text || '', node.marks);\n break;\n default:\n debug('Unknown node type: %s', node.type);\n result = node.content ? node.content.map((c) => nodeToMd(c)).join('') : '';\n }\n debug('nodeToMd result for %s: %s', node.type, result);\n return result;\n}\n\nfunction inlineToMd(content?: ProseMirrorNode[]): string {\n return content ? content.map((n) => nodeToMd(n)).join('') : '';\n}\n\nfunction applyMarks(text: string, marks?: Array<{ type: string }>): string {\n if (!marks) return text;\n for (const m of marks) {\n if (m.type === 'bold' || m.type === 'strong') text = `**${text}**`;\n if (m.type === 'italic' || m.type === 'em') text = `*${text}*`;\n if (m.type === 'code') text = `\\`${text}\\``;\n if (m.type === 'strike') text = `~~${text}~~`;\n }\n return text;\n}\n","import type { GranolaApi } from '../lib/api.js';\nimport { createGranolaDebug } from '../lib/debug.js';\nimport type { Meeting, ProseMirrorDoc, Utterance } from '../types.js';\nimport { getClient, withTokenRefresh } from './client.js';\n\nconst debug = createGranolaDebug('service:meetings');\n\nexport interface ListOptions {\n limit?: number;\n offset?: number;\n workspace?: string;\n folder?: string;\n}\n\nasync function getFolderDocumentIds(client: GranolaApi, folderId: string): Promise<string[]> {\n debug('fetching folder %s via getDocumentList', folderId);\n const folder = await client.getDocumentList(folderId);\n if (!folder) {\n debug('folder %s not found', folderId);\n return [];\n }\n const ids = folder.document_ids || folder.documents?.map((doc: { id: string }) => doc.id) || [];\n debug('folder %s returned %d document ids', folderId, ids.length);\n return ids;\n}\n\nconst DOCUMENT_BATCH_SIZE = 100;\nconst NOTES_PAGE_SIZE = 50;\nconst MAX_NOTES_PAGES = 100;\n\nasync function fetchMeetingsByIds(client: GranolaApi, documentIds: string[]): Promise<Meeting[]> {\n if (documentIds.length === 0) return [];\n\n const meetings: Meeting[] = [];\n for (let i = 0; i < documentIds.length; i += DOCUMENT_BATCH_SIZE) {\n const chunk = documentIds.slice(i, i + DOCUMENT_BATCH_SIZE);\n const res = await client.getDocumentsBatch({\n document_ids: chunk,\n include_last_viewed_panel: false,\n });\n const docs = (res?.documents || res?.docs || []) as Meeting[];\n meetings.push(...docs);\n }\n debug('fetched %d meetings via getDocumentsBatch', meetings.length);\n return meetings;\n}\n\nasync function loadMeetingMetadata(\n client: GranolaApi,\n id: string,\n): Promise<{ notes?: any; last_viewed_panel?: { content: any } } | null> {\n try {\n const metadata = await client.getDocumentMetadata(id);\n if (!metadata) {\n debug('getDocumentMetadata returned null for %s', id);\n return null;\n }\n return metadata;\n } catch (err) {\n debug('getDocumentMetadata failed for %s: %O', id, err);\n return null;\n }\n}\n\nasync function fetchFolderMeetings(client: GranolaApi, folderId: string): Promise<Meeting[]> {\n const ids = await getFolderDocumentIds(client, folderId);\n if (ids.length === 0) {\n debug('folder %s has no documents', folderId);\n return [];\n }\n return fetchMeetingsByIds(client, ids);\n}\n\nexport async function list(opts: ListOptions = {}): Promise<Meeting[]> {\n return withTokenRefresh(async () => {\n debug('list called with opts: %O', opts);\n const client = await getClient();\n const { limit = 20, offset = 0, workspace, folder } = opts;\n\n if (folder) {\n debug('listing meetings for folder: %s', folder);\n const folderMeetings = await fetchFolderMeetings(client, folder);\n debug('fetched %d meetings for folder %s', folderMeetings.length, folder);\n\n let filtered = folderMeetings;\n if (workspace) {\n filtered = folderMeetings.filter((m) => m.workspace_id === workspace);\n debug(\n 'workspace filter applied for folder %s: %d meetings remain',\n folder,\n filtered.length,\n );\n }\n\n const paginated = filtered.slice(offset, offset + limit);\n debug('returning %d meetings from folder %s after pagination', paginated.length, folder);\n return paginated;\n }\n\n const res = await client.getDocuments({\n limit,\n offset,\n include_last_viewed_panel: false,\n });\n\n let meetings = (res?.docs || []) as Meeting[];\n debug('fetched %d meetings', meetings.length);\n if (workspace) {\n meetings = meetings.filter((m) => m.workspace_id === workspace);\n debug('filtered to %d meetings for workspace: %s', meetings.length, workspace);\n }\n\n return meetings;\n });\n}\n\nconst RESOLVE_PAGE_SIZE = 100;\nconst MAX_RESOLVE_PAGES = 100;\nconst FULL_UUID_LENGTH = 36;\nconst CACHE_TTL_MS = 60000;\n\ninterface MeetingsCache {\n meetings: Meeting[];\n timestamp: number;\n}\n\nlet meetingsCache: MeetingsCache | null = null;\n\n/**\n * Clears the meetings cache. Useful for testing or forcing a refresh.\n */\nexport function clearMeetingsCache(): void {\n meetingsCache = null;\n debug('meetings cache cleared');\n}\n\n/**\n * Fetches meetings with caching to reduce API calls.\n * Cache expires after 60 seconds.\n */\nasync function getCachedMeetings(client: GranolaApi): Promise<Meeting[]> {\n if (meetingsCache && Date.now() - meetingsCache.timestamp < CACHE_TTL_MS) {\n debug('using cached meetings (%d items)', meetingsCache.meetings.length);\n return meetingsCache.meetings;\n }\n\n debug('cache miss or expired, fetching meetings');\n const meetings: Meeting[] = [];\n let offset = 0;\n\n for (let page = 0; page < MAX_RESOLVE_PAGES; page += 1) {\n const res = await client.getDocuments({\n limit: RESOLVE_PAGE_SIZE,\n offset,\n include_last_viewed_panel: false,\n });\n const docs = (res?.docs || []) as Meeting[];\n meetings.push(...docs);\n\n if (docs.length < RESOLVE_PAGE_SIZE) {\n break;\n }\n offset += RESOLVE_PAGE_SIZE;\n }\n\n meetingsCache = { meetings, timestamp: Date.now() };\n debug('cached %d meetings', meetings.length);\n return meetings;\n}\n\nexport async function resolveId(partialId: string): Promise<string | null> {\n return withTokenRefresh(async () => {\n debug('resolving meeting id: %s (length: %d)', partialId, partialId.length);\n const client = await getClient();\n\n // Optimization: If partialId looks like a full UUID, try direct lookup first\n if (partialId.length >= FULL_UUID_LENGTH) {\n debug('attempting direct lookup for full UUID');\n try {\n const metadata = await client.getDocumentMetadata(partialId);\n if (metadata) {\n debug('direct lookup successful for: %s', partialId);\n return partialId;\n }\n } catch {\n debug('direct lookup failed, falling back to search');\n }\n }\n\n // Use cached meetings for prefix search\n const meetings = await getCachedMeetings(client);\n const matches = new Set<string>();\n\n for (const meeting of meetings) {\n if (meeting.id?.startsWith(partialId)) {\n matches.add(meeting.id);\n if (matches.size > 1) {\n debug('ambiguous id: %s matches >1 meetings', partialId);\n throw new Error(`Ambiguous ID: ${partialId} matches ${matches.size} meetings`);\n }\n }\n }\n\n if (matches.size === 0) {\n debug('no meeting found for id: %s', partialId);\n return null;\n }\n\n const match = matches.values().next().value as string;\n debug('resolved meeting: %s -> %s', partialId, match);\n return match;\n });\n}\n\nexport async function get(id: string): Promise<Meeting | null> {\n return withTokenRefresh(async () => {\n debug('getting meeting: %s', id);\n const client = await getClient();\n const metadata = await loadMeetingMetadata(client, id);\n if (!metadata) {\n debug('meeting %s: not found', id);\n return null;\n }\n debug('meeting %s: found', id);\n return { id, ...metadata } as Meeting;\n });\n}\n\ninterface MeetingSearchOptions {\n includeLastViewedPanel: boolean;\n}\n\nasync function findMeetingViaDocuments(\n client: GranolaApi,\n id: string,\n { includeLastViewedPanel }: MeetingSearchOptions,\n): Promise<Meeting | null> {\n let offset = 0;\n\n for (let page = 0; page < MAX_NOTES_PAGES; page += 1) {\n try {\n debug('findMeetingViaDocuments fetching page %d (offset: %d)', page, offset);\n const res = await client.getDocuments({\n limit: NOTES_PAGE_SIZE,\n offset,\n include_last_viewed_panel: includeLastViewedPanel,\n });\n const meetings = (res?.docs || []) as Meeting[];\n debug('findMeetingViaDocuments got %d meetings on page %d', meetings.length, page);\n if (meetings.length === 0) break;\n\n const meeting = meetings.find((m) => m.id === id);\n if (meeting) {\n debug('findMeetingViaDocuments located meeting %s on page %d', id, page);\n return meeting;\n }\n\n offset += NOTES_PAGE_SIZE;\n } catch (err) {\n debug('findMeetingViaDocuments error: %O', err);\n return null;\n }\n }\n\n debug('findMeetingViaDocuments did not locate meeting %s', id);\n return null;\n}\n\nexport async function getNotes(id: string): Promise<ProseMirrorDoc | null> {\n return withTokenRefresh(async () => {\n debug('getNotes called with id: %s', id);\n const client = await getClient();\n const metadata = await loadMeetingMetadata(client, id);\n if (metadata && 'notes' in metadata) {\n debug('getNotes resolved via metadata response');\n return (metadata.notes || null) as ProseMirrorDoc | null;\n }\n\n const meeting = await findMeetingViaDocuments(client, id, {\n includeLastViewedPanel: false,\n });\n if (meeting) {\n return (meeting.notes || null) as ProseMirrorDoc | null;\n }\n\n return null;\n });\n}\n\nexport async function getEnhancedNotes(id: string): Promise<ProseMirrorDoc | null> {\n return withTokenRefresh(async () => {\n debug('getEnhancedNotes called with id: %s', id);\n const client = await getClient();\n const metadata = await loadMeetingMetadata(client, id);\n if (metadata && 'last_viewed_panel' in metadata) {\n debug('getEnhancedNotes resolved via metadata response');\n return (metadata.last_viewed_panel?.content || null) as ProseMirrorDoc | null;\n }\n\n const meeting = await findMeetingViaDocuments(client, id, {\n includeLastViewedPanel: true,\n });\n if (meeting) {\n return (meeting.last_viewed_panel?.content || null) as ProseMirrorDoc | null;\n }\n\n return null;\n });\n}\n\nexport async function getTranscript(id: string): Promise<Utterance[]> {\n return withTokenRefresh(async () => {\n debug('getTranscript called with id: %s', id);\n const client = await getClient();\n try {\n const transcript = (await client.getDocumentTranscript(id)) as Utterance[];\n debug('getTranscript got %d utterances', transcript.length);\n return transcript;\n } catch (err) {\n debug('getTranscript error: %O', err);\n return [];\n }\n });\n}\n","import chalk from 'chalk';\nimport { Command } from 'commander';\nimport { createGranolaDebug } from '../../lib/debug.js';\nimport { toMarkdown } from '../../lib/prosemirror.js';\nimport { toToon } from '../../lib/toon.js';\nimport * as meetings from '../../services/meetings.js';\n\nconst debug = createGranolaDebug('cmd:meeting:export');\n\ntype ExportFormat = 'json' | 'toon';\n\n/**\n * Creates the 'export' command for exporting complete meeting data.\n *\n * Exports meeting metadata, notes (as Markdown and raw), and transcript.\n * Supports JSON and TOON (token-optimized) output formats.\n *\n * @returns Commander command instance\n */\nexport function createExportCommand() {\n return new Command('export')\n .description('Export meeting data')\n .argument('<id>', 'Meeting ID')\n .option('-f, --format <format>', 'Output format (json, toon)', 'json')\n .action(async (id: string, options: { format: string }) => {\n debug('export command invoked with id: %s, format: %s', id, options.format);\n const format = options.format as ExportFormat;\n if (format !== 'json' && format !== 'toon') {\n console.error(chalk.red(`Invalid format: ${options.format}. Use 'json' or 'toon'.`));\n process.exit(1);\n }\n\n let fullId: string;\n try {\n const resolved = await meetings.resolveId(id);\n if (!resolved) {\n console.error(chalk.red(`Meeting ${id} not found`));\n process.exit(4);\n }\n fullId = resolved;\n } catch (err) {\n console.error(chalk.red((err as Error).message));\n process.exit(1);\n }\n\n const [meeting, notes, transcript] = await Promise.all([\n meetings.get(fullId),\n meetings.getNotes(fullId),\n meetings.getTranscript(fullId),\n ]);\n\n if (!meeting) {\n console.error(chalk.red(`Meeting ${id} not found`));\n process.exit(4);\n }\n\n const output = {\n id: meeting.id,\n title: meeting.title,\n created_at: meeting.created_at,\n updated_at: meeting.updated_at,\n workspace_id: meeting.workspace_id,\n people: meeting.people,\n notes_markdown: notes ? toMarkdown(notes) : null,\n notes_raw: notes,\n transcript,\n };\n\n if (format === 'toon') {\n console.log(toToon(output));\n } else {\n console.log(JSON.stringify(output, null, 2));\n }\n });\n}\n\nexport const exportCommand = createExportCommand();\n","import { encode } from '@toon-format/toon';\nimport type { ProseMirrorDoc, Utterance } from '../types.js';\n\nexport interface MeetingExport {\n id: string;\n title: string;\n created_at: string;\n updated_at: string;\n workspace_id?: string;\n notes_markdown: string | null;\n notes_raw: ProseMirrorDoc | null;\n transcript: Utterance[];\n}\n\nexport function toToon(data: MeetingExport): string {\n return encode(data);\n}\n","import chalk from 'chalk';\nimport { Command } from 'commander';\nimport { getConfigValue } from '../../lib/config.js';\nimport { createGranolaDebug } from '../../lib/debug.js';\nimport { formatDate, formatOutput, type OutputFormat, table, truncate } from '../../lib/output.js';\nimport * as meetings from '../../services/meetings.js';\n\nconst debug = createGranolaDebug('cmd:meeting:list');\n\n/**\n * Creates the 'list' command for displaying meetings.\n *\n * Lists meetings with optional filtering by workspace or folder.\n * Supports pagination via --limit and -o/--output for structured formats.\n *\n * @returns Commander command instance\n */\nexport function createListCommand() {\n return new Command('list')\n .description('List meetings')\n .option('-l, --limit <n>', 'Number of meetings', '20')\n .option('-w, --workspace <id>', 'Filter by workspace')\n .option('-f, --folder <id>', 'Filter by folder')\n .option('-o, --output <format>', 'Output format (json, yaml, toon)')\n .action(async (opts) => {\n debug('list command invoked with opts: %O', opts);\n\n const limit = Number.parseInt(opts.limit, 10);\n if (!Number.isFinite(limit) || limit < 1) {\n console.error(chalk.red('Invalid --limit value. Please provide a positive number.'));\n process.exit(1);\n }\n\n const configuredWorkspace = getConfigValue('default_workspace');\n const workspace = opts.workspace ?? configuredWorkspace;\n\n const data = await meetings.list({\n limit,\n workspace,\n folder: opts.folder,\n });\n debug('fetched %d meetings', data.length);\n\n // Handle structured output formats\n const format = opts.output || null;\n debug('output format: %s', format || 'table');\n if (format) {\n if (!['json', 'yaml', 'toon'].includes(format)) {\n console.error(chalk.red(`Invalid format: ${format}. Use 'json', 'yaml', or 'toon'.`));\n process.exit(1);\n }\n console.log(formatOutput(data, format as OutputFormat));\n return;\n }\n\n if (data.length === 0) {\n console.log(chalk.dim('No meetings found.'));\n return;\n }\n\n console.log(chalk.dim(`Showing ${data.length} meetings\\n`));\n\n const output = table(data, [\n { key: 'id', header: 'ID', width: 12, format: (v) => String(v).slice(0, 8) },\n { key: 'title', header: 'TITLE', width: 36, format: (v) => truncate(String(v), 35) },\n { key: 'created_at', header: 'DATE', width: 14, format: (v) => formatDate(String(v)) },\n ]);\n\n console.log(output);\n });\n}\n\nexport const listCommand = createListCommand();\n","import chalk from 'chalk';\nimport { Command } from 'commander';\nimport { createGranolaDebug } from '../../lib/debug.js';\nimport { formatOutput, type OutputFormat } from '../../lib/output.js';\nimport { pipeToPager } from '../../lib/pager.js';\nimport { toMarkdown } from '../../lib/prosemirror.js';\nimport * as meetings from '../../services/meetings.js';\nimport type { ProseMirrorDoc } from '../../types.js';\n\nconst debug = createGranolaDebug('cmd:meeting:notes');\n\n/**\n * Creates the 'notes' command for displaying meeting notes.\n *\n * Retrieves and renders meeting notes as Markdown.\n * Uses a pager for long output in interactive terminals.\n * Supports -o/--output for raw ProseMirror JSON output.\n *\n * @returns Commander command instance\n */\nexport function createNotesCommand() {\n return new Command('notes')\n .description('View meeting notes')\n .argument('<id>', 'Meeting ID')\n .option('-o, --output <format>', 'Output format (markdown, json, yaml, toon)', 'markdown')\n .action(async (id: string, opts, cmd) => {\n debug('notes command invoked with id: %s', id);\n const global = cmd.optsWithGlobals();\n\n let fullId: string;\n try {\n const resolved = await meetings.resolveId(id);\n if (!resolved) {\n console.error(chalk.red(`Meeting ${id} not found`));\n process.exit(4);\n }\n fullId = resolved;\n } catch (err) {\n console.error(chalk.red((err as Error).message));\n process.exit(1);\n }\n\n let notes: ProseMirrorDoc | null;\n try {\n notes = await meetings.getNotes(fullId);\n } catch (error) {\n debug('failed to load notes: %O', error);\n console.error(chalk.red('Error:'), 'Failed to fetch notes.');\n if (error instanceof Error) {\n console.error(chalk.dim(error.message));\n }\n process.exit(1);\n }\n\n if (!notes) {\n console.error(chalk.red(`No notes found for meeting ${id}`));\n process.exit(4);\n }\n\n const format = opts.output || 'markdown';\n const structuredFormats: OutputFormat[] = ['json', 'yaml', 'toon'];\n if (format !== 'markdown' && !structuredFormats.includes(format as OutputFormat)) {\n console.error(\n chalk.red(`Invalid format: ${format}. Use 'markdown', 'json', 'yaml', or 'toon'.`),\n );\n process.exit(1);\n }\n\n if (structuredFormats.includes(format as OutputFormat)) {\n console.log(formatOutput(notes, format as OutputFormat));\n return;\n }\n\n const md = toMarkdown(notes);\n\n if (global.noPager || !process.stdout.isTTY) {\n console.log(md);\n } else {\n await pipeToPager(md);\n }\n });\n}\n\nexport const notesCommand = createNotesCommand();\n","import chalk from 'chalk';\nimport { Command } from 'commander';\nimport { createGranolaDebug } from '../../lib/debug.js';\nimport { formatOutput, type OutputFormat } from '../../lib/output.js';\nimport { pipeToPager } from '../../lib/pager.js';\nimport { formatTranscript } from '../../lib/transcript.js';\nimport * as meetings from '../../services/meetings.js';\n\nconst debug = createGranolaDebug('cmd:meeting:transcript');\nconst SOURCE_OPTIONS = new Set(['microphone', 'system', 'all']);\n\n/**\n * Creates the 'transcript' command for displaying meeting transcripts.\n *\n * Retrieves and formats meeting transcripts with optional timestamps.\n * Supports filtering by audio source (microphone, system, or all).\n * Uses a pager for long output in interactive terminals.\n *\n * @returns Commander command instance\n */\nexport function createTranscriptCommand() {\n return new Command('transcript')\n .description('View meeting transcript')\n .argument('<id>', 'Meeting ID')\n .option('-t, --timestamps', 'Include timestamps')\n .option('-s, --source <type>', 'Filter: microphone, system, all', 'all')\n .option('-o, --output <format>', 'Output format (text, json, yaml, toon)', 'text')\n .action(async (id: string, opts, cmd) => {\n debug('transcript command invoked with id: %s, opts: %O', id, opts);\n const global = cmd.optsWithGlobals();\n\n let fullId: string;\n try {\n const resolved = await meetings.resolveId(id);\n if (!resolved) {\n console.error(chalk.red(`Meeting ${id} not found`));\n process.exit(4);\n }\n fullId = resolved;\n } catch (err) {\n console.error(chalk.red((err as Error).message));\n process.exit(1);\n }\n\n const transcript = await meetings.getTranscript(fullId);\n\n if (transcript.length === 0) {\n console.error(chalk.red(`No transcript found for meeting ${id}`));\n process.exit(4);\n }\n\n const requestedSource = opts.source || 'all';\n if (!SOURCE_OPTIONS.has(requestedSource)) {\n console.error(\n chalk.red(`Invalid source: ${requestedSource}. Use 'microphone', 'system', or 'all'.`),\n );\n process.exit(1);\n }\n\n const format = opts.output || 'text';\n const structuredFormats: OutputFormat[] = ['json', 'yaml', 'toon'];\n if (format !== 'text' && !structuredFormats.includes(format as OutputFormat)) {\n console.error(\n chalk.red(`Invalid format: ${format}. Use 'text', 'json', 'yaml', or 'toon'.`),\n );\n process.exit(1);\n }\n\n if (structuredFormats.includes(format as OutputFormat)) {\n console.log(formatOutput(transcript, format as OutputFormat));\n return;\n }\n\n const output = formatTranscript(transcript, {\n timestamps: opts.timestamps,\n source: requestedSource as 'microphone' | 'system' | 'all',\n });\n\n if (global.noPager || !process.stdout.isTTY) {\n console.log(output);\n } else {\n await pipeToPager(output);\n }\n });\n}\n\nexport const transcriptCommand = createTranscriptCommand();\n","import type { Utterance } from '../types.js';\nimport { createGranolaDebug } from './debug.js';\n\nconst debug = createGranolaDebug('lib:transcript');\n\ninterface FormatOptions {\n timestamps?: boolean;\n source?: 'microphone' | 'system' | 'all';\n}\n\nexport function formatTranscript(utterances: Utterance[], opts: FormatOptions = {}): string {\n debug('formatTranscript: %d utterances, opts=%O', utterances.length, opts);\n const { timestamps = false, source = 'all' } = opts;\n\n let filtered = utterances;\n if (source !== 'all') {\n filtered = utterances.filter((u) => u.source === source);\n debug('filtered to %d utterances (source=%s)', filtered.length, source);\n }\n\n if (filtered.length === 0) {\n debug('no transcript available');\n return 'No transcript available.';\n }\n\n const lines: string[] = [];\n\n for (const u of filtered) {\n const speaker = u.source === 'microphone' ? 'You' : 'Participant';\n\n if (timestamps) {\n const time = formatTimestamp(u.start_timestamp);\n lines.push(`[${time}] ${speaker}`);\n lines.push(u.text);\n lines.push('');\n } else {\n lines.push(`${speaker}: ${u.text}`);\n lines.push('');\n }\n }\n\n return lines.join('\\n').trim();\n}\n\nfunction formatTimestamp(iso: string): string {\n const d = new Date(iso);\n const h = d.getUTCHours().toString().padStart(2, '0');\n const m = d.getUTCMinutes().toString().padStart(2, '0');\n const s = d.getUTCSeconds().toString().padStart(2, '0');\n return `${h}:${m}:${s}`;\n}\n","import chalk from 'chalk';\nimport { Command } from 'commander';\nimport open from 'open';\nimport { createGranolaDebug } from '../../lib/debug.js';\nimport { formatDate, formatOutput, type OutputFormat } from '../../lib/output.js';\nimport * as meetings from '../../services/meetings.js';\n\nconst debug = createGranolaDebug('cmd:meeting:view');\n\n/**\n * Creates the 'view' command for displaying meeting details.\n *\n * Shows meeting metadata including title, date, and workspace.\n * Supports --web to open in browser and --format for structured output.\n *\n * @returns Commander command instance\n */\nexport function createViewCommand() {\n return new Command('view')\n .description('View meeting details')\n .argument('<id>', 'Meeting ID')\n .option('--web', 'Open in browser')\n .option('-o, --output <format>', 'Output format (json, yaml, toon)')\n .action(async (id: string, opts) => {\n debug('view command invoked with id: %s, opts: %O', id, opts);\n\n let fullId: string;\n try {\n const resolved = await meetings.resolveId(id);\n if (!resolved) {\n console.error(chalk.red(`Meeting ${id} not found`));\n process.exit(4);\n }\n fullId = resolved;\n } catch (err) {\n console.error(chalk.red((err as Error).message));\n process.exit(1);\n }\n\n if (opts.web) {\n await open(`https://app.granola.ai/meeting/${fullId}`);\n return;\n }\n\n const meeting = await meetings.get(fullId);\n\n if (!meeting) {\n console.error(chalk.red(`Meeting ${id} not found`));\n process.exit(4);\n }\n\n // Handle structured output formats\n const format = opts.output || null;\n if (format) {\n if (!['json', 'yaml', 'toon'].includes(format)) {\n console.error(chalk.red(`Invalid format: ${format}. Use 'json', 'yaml', or 'toon'.`));\n process.exit(1);\n }\n console.log(formatOutput(meeting, format as OutputFormat));\n return;\n }\n\n // Human-readable output\n console.log(chalk.bold(meeting.title));\n console.log(chalk.dim(`Recorded ${formatDate(meeting.created_at)}`));\n console.log();\n console.log(`Workspace: ${meeting.workspace_id || 'Personal'}`);\n\n // Display participants\n if (meeting.creator?.name) {\n console.log(`Organizer: ${meeting.creator.name}`);\n }\n\n if (meeting.attendees?.length) {\n console.log(`Attendees: ${meeting.attendees.length} participant(s)`);\n for (const attendee of meeting.attendees) {\n const name = attendee.name || attendee.details?.person?.name?.fullName || 'Unknown';\n const title = attendee.details?.employment?.title;\n const info = title ? `${name} (${title})` : name;\n console.log(chalk.dim(` - ${info}`));\n }\n }\n\n console.log();\n console.log(`${chalk.dim('View notes: ')}granola meeting notes ${id}`);\n console.log(`${chalk.dim('View transcript: ')}granola meeting transcript ${id}`);\n });\n}\n\nexport const viewCommand = createViewCommand();\n","import { Command } from 'commander';\nimport { listCommand } from './list.js';\nimport { viewCommand } from './view.js';\n\nexport const workspaceCommand = new Command('workspace')\n .description('Work with workspaces')\n .addCommand(listCommand)\n .addCommand(viewCommand);\n","import chalk from 'chalk';\nimport { Command } from 'commander';\nimport { createGranolaDebug } from '../../lib/debug.js';\nimport { formatDate, formatOutput, type OutputFormat, table } from '../../lib/output.js';\nimport * as workspaces from '../../services/workspaces.js';\n\nconst debug = createGranolaDebug('cmd:workspace:list');\n\n/**\n * Creates the 'list' command for displaying workspaces.\n *\n * Lists all workspaces the user has access to.\n * Supports -o/--output for structured output.\n *\n * @returns Commander command instance\n */\nexport function createListCommand() {\n return new Command('list')\n .description('List workspaces')\n .option('-o, --output <format>', 'Output format (json, yaml, toon)')\n .action(async (opts) => {\n debug('workspace list command invoked');\n\n const data = await workspaces.list();\n debug('fetched %d workspaces', data.length);\n\n // Handle structured output formats\n const format = opts.output || null;\n if (format) {\n if (!['json', 'yaml', 'toon'].includes(format)) {\n console.error(chalk.red(`Invalid format: ${format}. Use 'json', 'yaml', or 'toon'.`));\n process.exit(1);\n }\n console.log(formatOutput(data, format as OutputFormat));\n return;\n }\n\n if (data.length === 0) {\n console.log(chalk.dim('No workspaces found.'));\n return;\n }\n\n const output = table(data, [\n { key: 'id', header: 'ID', width: 12, format: (v) => String(v).slice(0, 8) },\n { key: 'name', header: 'NAME', width: 20 },\n { key: 'created_at', header: 'CREATED', width: 14, format: (v) => formatDate(String(v)) },\n ]);\n\n console.log(output);\n });\n}\n\nexport const listCommand = createListCommand();\n","import { createGranolaDebug } from '../lib/debug.js';\nimport type { Workspace } from '../types.js';\nimport { getClient, withTokenRefresh } from './client.js';\n\nconst debug = createGranolaDebug('service:workspaces');\n\nexport async function list(): Promise<Workspace[]> {\n return withTokenRefresh(async () => {\n debug('fetching workspaces');\n const client = await getClient();\n const res = await client.getWorkspaces();\n\n const workspacesArray = res?.workspaces || [];\n debug('found %d workspaces', workspacesArray.length);\n return workspacesArray.map((item) => {\n const ws = item.workspace;\n return {\n id: ws.workspace_id,\n name: ws.display_name,\n created_at: ws.created_at,\n owner_id: '',\n } as Workspace;\n });\n });\n}\n\nexport async function resolveId(partialId: string): Promise<string | null> {\n debug('resolving workspace id: %s', partialId);\n const workspaces = await list();\n const matches = workspaces.filter((w) => w.id.startsWith(partialId));\n\n if (matches.length === 0) {\n debug('no workspace found for id: %s', partialId);\n return null;\n }\n if (matches.length > 1) {\n debug('ambiguous id: %s matches %d workspaces', partialId, matches.length);\n throw new Error(`Ambiguous ID: ${partialId} matches ${matches.length} workspaces`);\n }\n debug('resolved workspace: %s -> %s', partialId, matches[0].id);\n return matches[0].id;\n}\n\nexport async function get(id: string): Promise<Workspace | null> {\n debug('getting workspace: %s', id);\n const workspaces = await list();\n const workspace = workspaces.find((w) => w.id === id) || null;\n debug('workspace %s: %s', id, workspace ? 'found' : 'not found');\n return workspace;\n}\n","import chalk from 'chalk';\nimport { Command } from 'commander';\nimport { createGranolaDebug } from '../../lib/debug.js';\nimport { formatDate, formatOutput, type OutputFormat } from '../../lib/output.js';\nimport * as workspaces from '../../services/workspaces.js';\n\nconst debug = createGranolaDebug('cmd:workspace:view');\n\n/**\n * Creates the 'view' command for displaying workspace details.\n *\n * Shows workspace metadata including name and creation date.\n * Supports -o/--output for structured output.\n *\n * @returns Commander command instance\n */\nexport function createViewCommand() {\n return new Command('view')\n .description('View workspace details')\n .argument('<id>', 'Workspace ID')\n .option('-o, --output <format>', 'Output format (json, yaml, toon)')\n .action(async (id: string, opts) => {\n debug('workspace view command invoked with id: %s', id);\n\n let fullId: string;\n try {\n const resolved = await workspaces.resolveId(id);\n if (!resolved) {\n console.error(chalk.red(`Workspace ${id} not found`));\n process.exit(4);\n }\n fullId = resolved;\n } catch (err) {\n console.error(chalk.red((err as Error).message));\n process.exit(1);\n }\n\n const workspace = await workspaces.get(fullId);\n\n if (!workspace) {\n console.error(chalk.red(`Workspace ${id} not found`));\n process.exit(4);\n }\n\n // Handle structured output formats\n const format = opts.output || null;\n if (format) {\n if (!['json', 'yaml', 'toon'].includes(format)) {\n console.error(chalk.red(`Invalid format: ${format}. Use 'json', 'yaml', or 'toon'.`));\n process.exit(1);\n }\n console.log(formatOutput(workspace, format as OutputFormat));\n return;\n }\n\n console.log(chalk.bold(workspace.name));\n console.log(chalk.dim(`Created ${formatDate(workspace.created_at)}`));\n console.log();\n console.log(`View all meetings: granola meeting list --workspace ${id}`);\n });\n}\n\nexport const viewCommand = createViewCommand();\n"],"mappings":"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","names":["readFileSync","Command","chalk","debug","debug","chalk","Command","chalk","Command","homedir","join","debug","debug","homedir","os","join","debug","Command","chalk","chalk","Command","debug","Command","chalk","chalk","Command","debug","Command","chalk","Command","chalk","Command","debug","Command","config","chalk","Command","chalk","Command","chalk","process","platform","debug","chalk","debug","client","debug","Command","chalk","chalk","Command","debug","Command","chalk","Command","Command","chalk","Command","debug","debug","debug","client","list","client","debug","get","debug","Command","chalk","chalk","Command","debug","Command","chalk","get","chalk","Command","debug","createListCommand","Command","chalk","list","listCommand","chalk","Command","debug","Command","chalk","chalk","Command","debug","debug","Command","chalk","chalk","Command","open","debug","createViewCommand","Command","chalk","open","get","viewCommand","Command","listCommand","viewCommand","Command","chalk","Command","debug","list","client","resolveId","get","debug","createListCommand","Command","list","chalk","listCommand","chalk","Command","debug","createViewCommand","Command","resolveId","chalk","get","viewCommand","Command","listCommand","viewCommand","debug","readFileSync","Command"]}
|
|
1
|
+
{"version":3,"sources":["../src/main.ts","../src/commands/alias.ts","../src/lib/config.ts","../src/lib/alias.ts","../src/lib/debug.ts","../src/lib/output.ts","../src/commands/auth/index.ts","../src/commands/auth/login.ts","../src/lib/auth.ts","../src/lib/lock.ts","../src/commands/auth/logout.ts","../src/commands/auth/status.ts","../src/commands/config.ts","../src/commands/folder/index.ts","../src/commands/folder/list.ts","../src/services/client.ts","../src/lib/api.ts","../src/lib/http.ts","../src/services/folders.ts","../src/commands/folder/view.ts","../src/commands/meeting/index.ts","../src/commands/meeting/enhanced.ts","../src/lib/pager.ts","../src/lib/prosemirror.ts","../src/lib/filters.ts","../src/services/meetings.ts","../src/commands/meeting/export.ts","../src/lib/toon.ts","../src/commands/meeting/list.ts","../src/lib/date-parser.ts","../src/commands/meeting/notes.ts","../src/commands/meeting/transcript.ts","../src/lib/transcript.ts","../src/commands/meeting/view.ts","../src/commands/workspace/index.ts","../src/commands/workspace/list.ts","../src/services/workspaces.ts","../src/commands/workspace/view.ts","../src/lib/errors.ts"],"sourcesContent":["import { readFileSync } from 'node:fs';\nimport { Command } from 'commander';\nimport { aliasCommand } from './commands/alias.js';\nimport { authCommand } from './commands/auth/index.js';\nimport { configCommand } from './commands/config.js';\nimport { folderCommand } from './commands/folder/index.js';\nimport { meetingCommand } from './commands/meeting/index.js';\nimport { workspaceCommand } from './commands/workspace/index.js';\nimport { parseAliasArguments } from './lib/alias.js';\nimport { getAlias } from './lib/config.js';\nimport { createGranolaDebug } from './lib/debug.js';\nimport { handleGlobalError } from './lib/errors.js';\n\nconst debug = createGranolaDebug('cli');\nconst debugAlias = createGranolaDebug('cli:alias');\n\nconst packageJson = JSON.parse(readFileSync(new URL('../package.json', import.meta.url), 'utf-8'));\n\ndebug('granola-cli v%s starting', packageJson.version);\ndebug('arguments: %O', process.argv.slice(2));\n\nconst program = new Command();\n\nprogram\n .name('granola')\n .description('CLI for Granola meeting notes')\n .version(packageJson.version)\n .option('--no-pager', 'Disable pager');\n\n// Add built-in commands\nprogram.addCommand(authCommand);\nprogram.addCommand(meetingCommand);\nprogram.addCommand(workspaceCommand);\nprogram.addCommand(folderCommand);\nprogram.addCommand(configCommand);\nprogram.addCommand(aliasCommand);\n\n// Handle alias expansion\nfunction expandAlias(args: string[]): string[] {\n if (args.length < 3) return args;\n\n const command = args[2];\n debugAlias('checking alias for command: %s', command);\n const alias = getAlias(command);\n\n if (alias) {\n debugAlias('alias found: %s -> %s', command, alias);\n try {\n const aliasArgs = parseAliasArguments(alias);\n const expanded = [...args.slice(0, 2), ...aliasArgs, ...args.slice(3)];\n debugAlias('expanded args: %O', expanded.slice(2));\n return expanded;\n } catch (err) {\n debugAlias('failed to expand alias %s: %O', command, err);\n return args;\n }\n }\n\n return args;\n}\n\n// Parse with alias expansion\nconst expandedArgs = expandAlias(process.argv);\ndebug('parsing with args: %O', expandedArgs.slice(2));\nprogram.parseAsync(expandedArgs).catch((error: unknown) => {\n const exitCode = handleGlobalError(error);\n process.exit(exitCode);\n});\n","import chalk from 'chalk';\nimport { Command } from 'commander';\nimport { deleteAlias, getAlias, listAliases, setAlias } from '../lib/config.js';\nimport { createGranolaDebug } from '../lib/debug.js';\nimport { formatOutput, type OutputFormat } from '../lib/output.js';\n\nconst debug = createGranolaDebug('cmd:alias');\n\n/**\n * Creates the 'alias' command for managing command shortcuts.\n *\n * Provides subcommands for listing, creating, and deleting aliases.\n * Aliases expand to full commands at runtime.\n *\n * @returns Commander command instance\n */\nexport function createAliasCommand() {\n const cmd = new Command('alias').description('Create command shortcuts');\n\n cmd\n .command('list')\n .description('List aliases')\n .option('-o, --output <format>', 'Output format (json, yaml, toon)')\n .action((opts) => {\n debug('alias list command invoked');\n const aliases = listAliases();\n\n const format = opts.output || null;\n if (format) {\n if (!['json', 'yaml', 'toon'].includes(format)) {\n console.error(chalk.red(`Invalid format: ${format}. Use 'json', 'yaml', or 'toon'.`));\n process.exit(1);\n }\n console.log(formatOutput(aliases, format as OutputFormat));\n return;\n }\n\n if (Object.keys(aliases).length === 0) {\n console.log(chalk.dim('No aliases defined.'));\n return;\n }\n\n for (const [name, command] of Object.entries(aliases)) {\n console.log(`${chalk.bold(name)}: ${command}`);\n }\n });\n\n cmd\n .command('set <name> <command>')\n .description('Create alias')\n .action((name: string, command: string) => {\n debug('alias set command invoked: %s -> %s', name, command);\n setAlias(name, command);\n console.log(chalk.green(`Created alias: ${name} -> ${command}`));\n });\n\n cmd\n .command('delete <name>')\n .description('Delete alias')\n .action((name: string) => {\n debug('alias delete command invoked: %s', name);\n const existing = getAlias(name);\n if (!existing) {\n console.log(chalk.yellow(`Alias '${name}' not found`));\n return;\n }\n deleteAlias(name);\n console.log(chalk.green(`Deleted alias: ${name}`));\n });\n\n return cmd;\n}\n\nexport const aliasCommand = createAliasCommand();\n","import Conf from 'conf';\nimport type { Config } from '../types.js';\nimport { isAliasCommandSafe } from './alias.js';\nimport { createGranolaDebug } from './debug.js';\n\nconst debug = createGranolaDebug('lib:config');\n\nconst config = new Conf<Config>({\n projectName: 'granola',\n defaults: {},\n});\n\ndebug('config store initialized at: %s', config.path);\n\nexport function getConfig(): Config {\n debug('getConfig: returning store');\n return config.store;\n}\n\nexport function setConfig(newConfig: Config): void {\n debug('setConfig: clearing and setting %d keys', Object.keys(newConfig).length);\n config.clear();\n for (const [key, value] of Object.entries(newConfig)) {\n config.set(key, value);\n }\n}\n\nexport function getConfigValue<K extends keyof Config>(key: K): Config[K] {\n const value = config.get(key);\n debug('getConfigValue: %s = %O', key, value);\n return value;\n}\n\nexport function setConfigValue<K extends keyof Config>(key: K, value: Config[K]): void {\n debug('setConfigValue: %s = %O', key, value);\n config.set(key, value);\n}\n\nexport function resetConfig(): void {\n debug('resetConfig: clearing all configuration');\n config.clear();\n}\n\nexport function getAlias(name: string): string | undefined {\n const aliases = config.get('aliases') || {};\n const alias = aliases[name];\n debug('getAlias: %s -> %s', name, alias || '(not found)');\n return alias;\n}\n\nexport function validateAliasCommand(command: string): boolean {\n return isAliasCommandSafe(command);\n}\n\nexport function setAlias(name: string, command: string): void {\n debug('setAlias: %s -> %s', name, command);\n if (!validateAliasCommand(command)) {\n debug('setAlias: invalid command characters');\n throw new Error(\n 'Alias command contains invalid characters or shell syntax. Only literal arguments are allowed.',\n );\n }\n const aliases = config.get('aliases') || {};\n aliases[name] = command;\n config.set('aliases', aliases);\n}\n\nexport function deleteAlias(name: string): void {\n debug('deleteAlias: removing %s', name);\n const aliases = config.get('aliases') || {};\n delete aliases[name];\n config.set('aliases', aliases);\n}\n\nexport function listAliases(): Record<string, string> {\n const aliases = config.get('aliases') || {};\n debug('listAliases: returning %d aliases', Object.keys(aliases).length);\n return aliases;\n}\n","import { parse as parseShellQuote } from 'shell-quote';\n\nconst UNSAFE_ALIAS_PATTERN = /[`$]/;\n\n/**\n * Parses an alias command using shell-quote while ensuring only literal arguments are present.\n *\n * @param command Alias command string defined by the user.\n * @returns Array of arguments ready to be passed to Commander.\n * @throws If the alias contains shell operators, command separators, or is empty.\n */\nexport function parseAliasArguments(command: string): string[] {\n const parsed = parseShellQuote(command);\n if (parsed.length === 0) {\n throw new Error('Alias command cannot be empty.');\n }\n\n const hasUnsafeToken = parsed.some((token) => typeof token !== 'string');\n if (hasUnsafeToken) {\n throw new Error('Alias command contains unsupported shell syntax.');\n }\n\n const args = parsed as string[];\n const hasSubstitution = args.some((token) => UNSAFE_ALIAS_PATTERN.test(token));\n if (hasSubstitution) {\n throw new Error('Alias command contains unsupported substitution syntax.');\n }\n\n return args;\n}\n\n/**\n * Validates that an alias command only contains literal arguments.\n *\n * @param command Alias command string defined by the user.\n * @returns True when the alias contains no shell operators or expansions.\n */\nexport function isAliasCommandSafe(command: string): boolean {\n try {\n parseAliasArguments(command);\n return true;\n } catch {\n return false;\n }\n}\n","import createDebug from 'debug';\n\n/**\n * Creates a namespaced debug logger for granola-cli.\n *\n * @param namespace - The namespace suffix (e.g., 'lib:auth', 'service:client')\n * @returns A debug logger function\n *\n * @example\n * const debug = createGranolaDebug('lib:auth');\n * debug('loading credentials'); // [granola:lib:auth] loading credentials\n */\nexport function createGranolaDebug(namespace: string) {\n return createDebug(`granola:${namespace}`);\n}\n\n/**\n * Safely formats sensitive data for debug output.\n * Masks tokens and credentials while keeping them identifiable.\n *\n * @param token - The token to mask\n * @returns Masked token showing only first/last 4 characters\n *\n * @example\n * maskToken('abc123xyz789longtoken') // 'abc1...oken'\n */\nexport function maskToken(token: string): string {\n if (!token || token.length < 12) return '[REDACTED]';\n return `${token.slice(0, 4)}...${token.slice(-4)}`;\n}\n","import { encode as toonEncode } from '@toon-format/toon';\nimport chalk from 'chalk';\nimport Table from 'cli-table3';\nimport { stringify as yamlStringify } from 'yaml';\nimport { createGranolaDebug } from './debug.js';\n\nconst debug = createGranolaDebug('lib:output');\n\nexport type OutputFormat = 'json' | 'yaml' | 'toon';\n\n/**\n * Formats data in the specified output format.\n *\n * @param data - The data to format\n * @param format - Output format: 'json', 'yaml', or 'toon'\n * @returns Formatted string\n */\nexport function formatOutput(data: unknown, format: OutputFormat): string {\n debug('formatOutput: format=%s, dataType=%s', format, typeof data);\n switch (format) {\n case 'yaml':\n return yamlStringify(data);\n case 'toon':\n return toonEncode(data);\n default:\n return JSON.stringify(data, null, 2);\n }\n}\n\ninterface Column<T> {\n key: keyof T;\n header: string;\n width?: number;\n format?: (value: unknown) => string;\n}\n\nexport function table<T extends object>(data: T[], columns: Column<T>[]): string {\n debug('table: rendering %d rows, %d columns', data.length, columns.length);\n const colWidths = columns.map((c) => c.width ?? null);\n const t = new Table({\n head: columns.map((c) => chalk.bold(c.header)),\n colWidths,\n style: { head: [], border: [] },\n chars: {\n top: '',\n 'top-mid': '',\n 'top-left': '',\n 'top-right': '',\n bottom: '',\n 'bottom-mid': '',\n 'bottom-left': '',\n 'bottom-right': '',\n left: '',\n 'left-mid': '',\n mid: '',\n 'mid-mid': '',\n right: '',\n 'right-mid': '',\n middle: ' ',\n },\n });\n\n for (const row of data) {\n t.push(\n columns.map((c) => {\n const val = row[c.key];\n return c.format ? c.format(val) : String(val ?? '');\n }),\n );\n }\n\n return t.toString();\n}\n\nexport function formatDate(iso: string): string {\n const d = new Date(iso);\n return d.toLocaleDateString('en-US', {\n month: 'short',\n day: 'numeric',\n year: 'numeric',\n });\n}\n\nexport function formatDuration(start: string, end: string): string {\n const startMs = new Date(start).getTime();\n const endMs = new Date(end).getTime();\n if (!Number.isFinite(startMs) || !Number.isFinite(endMs)) {\n return '--';\n }\n const ms = endMs - startMs;\n if (!Number.isFinite(ms) || ms < 0) {\n return '--';\n }\n const mins = Math.round(ms / 60000);\n return `${mins} min`;\n}\n\nexport function truncate(s: string, len: number): string {\n if (s.length <= len) return s;\n return `${s.slice(0, len - 1)}…`;\n}\n","import { Command } from 'commander';\nimport { loginCommand } from './login.js';\nimport { logoutCommand } from './logout.js';\nimport { statusCommand } from './status.js';\n\nexport const authCommand = new Command('auth')\n .description('Manage authentication')\n .addCommand(loginCommand)\n .addCommand(logoutCommand)\n .addCommand(statusCommand);\n","import chalk from 'chalk';\nimport { Command } from 'commander';\nimport {\n getDefaultSupabasePath,\n loadCredentialsFromFile,\n saveCredentials,\n} from '../../lib/auth.js';\nimport { createGranolaDebug } from '../../lib/debug.js';\n\nconst debug = createGranolaDebug('cmd:auth:login');\n\n/**\n * Creates the 'login' command for authenticating with Granola.\n * Imports credentials from the Granola desktop app.\n *\n * @example\n * granola auth login\n *\n * @returns Commander command instance\n */\nexport function createLoginCommand() {\n return new Command('login')\n .description('Import credentials from Granola desktop app')\n .action(async () => {\n debug('login command invoked');\n const creds = await loadCredentialsFromFile();\n if (!creds) {\n const path = getDefaultSupabasePath();\n debug('login failed: could not load credentials from %s', path);\n console.error(chalk.red('Error:'), 'Could not load credentials.');\n console.error(`Expected file at: ${chalk.dim(path)}`);\n console.error('\\nMake sure the Granola desktop app is installed and you are logged in.');\n process.exit(1);\n }\n\n debug('credentials loaded, saving to keychain');\n await saveCredentials(creds);\n debug('login successful');\n console.log(chalk.green('Credentials imported successfully'));\n });\n}\n\nexport const loginCommand = createLoginCommand();\n","import { readFile } from 'node:fs/promises';\nimport { homedir, platform } from 'node:os';\nimport { join } from 'node:path';\nimport { deletePassword, getPassword, setPassword } from 'cross-keychain';\nimport type { Credentials } from '../types.js';\nimport { createGranolaDebug } from './debug.js';\nimport { withLock } from './lock.js';\n\nconst debug = createGranolaDebug('lib:auth');\n\nconst SERVICE_NAME = 'com.granola.cli';\nconst ACCOUNT_NAME = 'credentials';\nconst DEFAULT_CLIENT_ID = 'client_GranolaMac';\n\nexport async function getCredentials(): Promise<Credentials | null> {\n debug('loading credentials from keychain');\n try {\n const stored = await getPassword(SERVICE_NAME, ACCOUNT_NAME);\n if (!stored) {\n debug('no credentials found in keychain');\n return null;\n }\n\n const parsed = JSON.parse(stored);\n debug('credentials loaded, hasAccessToken: %s', Boolean(parsed.accessToken));\n return {\n refreshToken: parsed.refreshToken,\n accessToken: parsed.accessToken || '',\n clientId: parsed.clientId,\n };\n } catch (error) {\n debug('failed to get credentials: %O', error);\n return null;\n }\n}\n\nexport async function saveCredentials(creds: Credentials): Promise<void> {\n debug('saving credentials to keychain');\n await setPassword(SERVICE_NAME, ACCOUNT_NAME, JSON.stringify(creds));\n debug('credentials saved');\n}\n\nexport async function deleteCredentials(): Promise<void> {\n debug('deleting credentials from keychain');\n await deletePassword(SERVICE_NAME, ACCOUNT_NAME);\n debug('credentials deleted');\n}\n\nconst WORKOS_AUTH_URL = 'https://api.workos.com/user_management/authenticate';\n\n/**\n * Refreshes the access token using the stored refresh token.\n * WorkOS refresh tokens are single-use - each refresh returns a new refresh token\n * that must be saved immediately.\n *\n * Uses a file-based lock to prevent race conditions when multiple CLI processes\n * attempt to refresh the token simultaneously.\n *\n * @returns New credentials if refresh succeeds, null otherwise\n */\nexport async function refreshAccessToken(): Promise<Credentials | null> {\n debug('attempting token refresh');\n\n try {\n return await withLock(async () => {\n // Re-read credentials inside the lock - another process may have updated them\n const creds = await getCredentials();\n if (!creds?.refreshToken || !creds?.clientId) {\n debug('cannot refresh: missing refreshToken or clientId');\n return null;\n }\n\n const response = await fetch(WORKOS_AUTH_URL, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n client_id: creds.clientId,\n grant_type: 'refresh_token',\n refresh_token: creds.refreshToken,\n }),\n });\n\n if (!response.ok) {\n debug('token refresh failed: %d %s', response.status, response.statusText);\n return null;\n }\n\n const data = (await response.json()) as { refresh_token: string; access_token: string };\n const newCreds: Credentials = {\n refreshToken: data.refresh_token,\n accessToken: data.access_token,\n clientId: creds.clientId,\n };\n\n await saveCredentials(newCreds);\n debug('token refresh successful, new credentials saved');\n return newCreds;\n });\n } catch (error) {\n debug('token refresh error: %O', error);\n return null;\n }\n}\n\nexport function parseSupabaseJson(json: string): Credentials | null {\n debug('parsing supabase.json');\n try {\n const parsed = JSON.parse(json);\n\n // Try WorkOS tokens first (newer auth system)\n if (parsed.workos_tokens && typeof parsed.workos_tokens === 'string') {\n const workosTokens = JSON.parse(parsed.workos_tokens);\n if (workosTokens.access_token) {\n debug('found WorkOS tokens');\n return {\n refreshToken: workosTokens.refresh_token || '',\n accessToken: workosTokens.access_token,\n clientId: workosTokens.client_id || DEFAULT_CLIENT_ID,\n };\n }\n }\n\n // Fall back to Cognito tokens\n if (parsed.cognito_tokens && typeof parsed.cognito_tokens === 'string') {\n const cognitoTokens = JSON.parse(parsed.cognito_tokens);\n if (!cognitoTokens.refresh_token) return null;\n\n debug('found Cognito tokens');\n return {\n refreshToken: cognitoTokens.refresh_token,\n accessToken: cognitoTokens.access_token || '',\n clientId: cognitoTokens.client_id || DEFAULT_CLIENT_ID,\n };\n }\n\n // Legacy format: refresh_token at root level\n if (!parsed.refresh_token) return null;\n\n debug('found legacy token format');\n return {\n refreshToken: parsed.refresh_token,\n accessToken: parsed.access_token || '',\n clientId: parsed.client_id || DEFAULT_CLIENT_ID,\n };\n } catch (error) {\n debug('failed to parse supabase.json: %O', error);\n return null;\n }\n}\n\n/**\n * Gets the default path to the Granola supabase.json file based on the OS.\n *\n * @returns The platform-specific path to supabase.json\n */\nexport function getDefaultSupabasePath(): string {\n const home = homedir();\n const os = platform();\n\n let path: string;\n switch (os) {\n case 'darwin':\n path = join(home, 'Library', 'Application Support', 'Granola', 'supabase.json');\n break;\n case 'win32':\n path = join(\n process.env.APPDATA || join(home, 'AppData', 'Roaming'),\n 'Granola',\n 'supabase.json',\n );\n break;\n default:\n // Linux and other Unix-like systems\n path = join(home, '.config', 'granola', 'supabase.json');\n }\n debug('platform: %s, supabase path: %s', os, path);\n return path;\n}\n\n/**\n * Loads credentials from the default Granola supabase.json file.\n *\n * @returns Credentials if found and valid, null otherwise\n */\nexport async function loadCredentialsFromFile(): Promise<Credentials | null> {\n const path = getDefaultSupabasePath();\n debug('loading credentials from file: %s', path);\n try {\n const content = await readFile(path, 'utf-8');\n debug('file read successful, parsing content');\n return parseSupabaseJson(content);\n } catch (error) {\n debug('failed to load credentials from file: %O', error);\n return null;\n }\n}\n","import type { FileHandle } from 'node:fs/promises';\nimport { mkdir, open, stat, unlink } from 'node:fs/promises';\nimport { homedir, tmpdir } from 'node:os';\nimport { dirname, join } from 'node:path';\nimport { createGranolaDebug } from './debug.js';\n\nconst debug = createGranolaDebug('lib:lock');\n\nconst LOCK_FILE_NAME = 'granola-token-refresh.lock';\nconst LOCK_TIMEOUT_MS = 30000;\nconst LOCK_RETRY_INTERVAL_MS = 100;\nconst LOCK_STALE_MS = 60000;\n\ninterface LockHandle {\n handle: FileHandle;\n}\n\nfunction getLockFilePath(): string {\n const tempDir =\n process.platform === 'darwin' ? join(homedir(), 'Library', 'Caches', 'granola') : tmpdir();\n return join(tempDir, LOCK_FILE_NAME);\n}\n\nasync function ensureLockDirectory(): Promise<void> {\n const lockPath = getLockFilePath();\n const dir = dirname(lockPath);\n await mkdir(dir, { recursive: true });\n}\n\nasync function isLockStale(lockPath: string): Promise<boolean> {\n try {\n const stats = await stat(lockPath);\n const age = Date.now() - stats.mtimeMs;\n return age > LOCK_STALE_MS;\n } catch {\n return true;\n }\n}\n\n/**\n * Acquires an exclusive file lock for token refresh operations.\n * Uses O_CREAT | O_EXCL for atomic creation.\n *\n * @param timeoutMs - Maximum time to wait for lock acquisition (default: 30s)\n * @returns LockHandle if lock acquired, null if timeout\n */\nexport async function acquireLock(timeoutMs: number = LOCK_TIMEOUT_MS): Promise<LockHandle | null> {\n const lockPath = getLockFilePath();\n const startTime = Date.now();\n\n await ensureLockDirectory();\n debug('attempting to acquire lock at %s', lockPath);\n\n while (Date.now() - startTime < timeoutMs) {\n try {\n const handle = await open(lockPath, 'wx');\n debug('lock acquired');\n return { handle };\n } catch (error: unknown) {\n const err = error as NodeJS.ErrnoException;\n if (err.code === 'EEXIST') {\n if (await isLockStale(lockPath)) {\n debug('removing stale lock');\n try {\n await unlink(lockPath);\n } catch {\n // Another process may have removed it\n }\n continue;\n }\n\n debug('lock held by another process, waiting...');\n await new Promise((r) => setTimeout(r, LOCK_RETRY_INTERVAL_MS));\n } else {\n debug('lock acquisition failed: %O', error);\n throw error;\n }\n }\n }\n\n debug('lock acquisition timed out');\n return null;\n}\n\n/**\n * Releases a file lock.\n *\n * @param lockHandle - The lock handle from acquireLock\n */\nexport async function releaseLock(lockHandle: LockHandle): Promise<void> {\n const lockPath = getLockFilePath();\n debug('releasing lock');\n try {\n await lockHandle.handle.close();\n await unlink(lockPath);\n debug('lock released');\n } catch (error) {\n debug('error releasing lock: %O', error);\n }\n}\n\n/**\n * Executes an operation within a file lock.\n * Ensures the lock is released even if the operation throws.\n *\n * @param operation - The async operation to execute\n * @param timeoutMs - Maximum time to wait for lock acquisition (default: 30s)\n * @returns The result of the operation\n * @throws Error if lock cannot be acquired or operation fails\n */\nexport async function withLock<T>(\n operation: () => Promise<T>,\n timeoutMs: number = LOCK_TIMEOUT_MS,\n): Promise<T> {\n const handle = await acquireLock(timeoutMs);\n if (handle === null) {\n throw new Error('Failed to acquire token refresh lock');\n }\n\n try {\n return await operation();\n } finally {\n await releaseLock(handle);\n }\n}\n\n// Export for testing\nexport const _testing = {\n getLockFilePath,\n LOCK_TIMEOUT_MS,\n LOCK_RETRY_INTERVAL_MS,\n LOCK_STALE_MS,\n};\n","import chalk from 'chalk';\nimport { Command } from 'commander';\nimport { deleteCredentials } from '../../lib/auth.js';\nimport { createGranolaDebug } from '../../lib/debug.js';\n\nconst debug = createGranolaDebug('cmd:auth:logout');\n\n/**\n * Creates the 'logout' command for removing stored credentials.\n *\n * Deletes authentication credentials from the system keychain.\n *\n * @returns Commander command instance\n */\nexport function createLogoutCommand() {\n return new Command('logout').description('Logout from Granola').action(async () => {\n debug('logout command invoked');\n try {\n await deleteCredentials();\n debug('logout successful');\n console.log(chalk.green('Logged out successfully'));\n } catch (error) {\n debug('logout failed: %O', error);\n console.error(chalk.red('Error:'), 'Failed to logout.');\n if (error instanceof Error) {\n console.error(chalk.dim(error.message));\n }\n process.exit(1);\n }\n });\n}\n\nexport const logoutCommand = createLogoutCommand();\n","import chalk from 'chalk';\nimport { Command } from 'commander';\nimport { getCredentials } from '../../lib/auth.js';\nimport { createGranolaDebug } from '../../lib/debug.js';\nimport { formatOutput, type OutputFormat } from '../../lib/output.js';\n\nconst debug = createGranolaDebug('cmd:auth:status');\n\n/**\n * Creates the 'status' command for checking authentication state.\n *\n * Reports whether the user is currently authenticated.\n * Supports -o/--output for structured output.\n *\n * @returns Commander command instance\n */\nexport function createStatusCommand() {\n return new Command('status')\n .description('Check authentication status')\n .option('-o, --output <format>', 'Output format (json, yaml, toon)')\n .action(async (opts) => {\n debug('status command invoked');\n const creds = await getCredentials();\n debug('authenticated: %s', !!creds);\n\n const format = opts.output || null;\n if (format) {\n if (!['json', 'yaml', 'toon'].includes(format)) {\n console.error(chalk.red(`Invalid format: ${format}. Use 'json', 'yaml', or 'toon'.`));\n process.exit(1);\n }\n console.log(formatOutput({ authenticated: !!creds }, format as OutputFormat));\n return;\n }\n\n if (creds) {\n console.log(chalk.green('Authenticated'));\n } else {\n console.log(chalk.yellow('Not authenticated'));\n console.log(chalk.dim('Run: granola auth login'));\n }\n });\n}\n\nexport const statusCommand = createStatusCommand();\n","import chalk from 'chalk';\nimport { Command } from 'commander';\nimport { getConfig, getConfigValue, resetConfig, setConfigValue } from '../lib/config.js';\nimport { createGranolaDebug } from '../lib/debug.js';\nimport { formatOutput, type OutputFormat } from '../lib/output.js';\nimport type { Config } from '../types.js';\n\nconst debug = createGranolaDebug('cmd:config');\n\ntype ConfigKey = keyof Config;\nconst CONFIG_VALUE_PARSERS: Record<ConfigKey, (value: string) => Config[ConfigKey]> = {\n default_workspace: (value: string) => value,\n pager: (value: string) => value,\n aliases: (value: string) => {\n try {\n const parsed = JSON.parse(value);\n if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {\n throw new Error('Aliases must be a JSON object of { \"name\": \"command\" } pairs.');\n }\n for (const [alias, command] of Object.entries(parsed)) {\n if (typeof command !== 'string') {\n throw new Error(`Alias \"${alias}\" must map to a string command.`);\n }\n }\n return parsed as Record<string, string>;\n } catch (error) {\n if (error instanceof SyntaxError) {\n throw new Error('Aliases must be valid JSON (example: {\"meetings\":\"meeting list\"}).');\n }\n throw error;\n }\n },\n};\n\nconst CONFIG_KEYS = Object.keys(CONFIG_VALUE_PARSERS) as ConfigKey[];\n\nfunction isConfigKey(key: string): key is ConfigKey {\n return CONFIG_KEYS.includes(key as ConfigKey);\n}\n\n/**\n * Creates the 'config' command for managing CLI configuration.\n *\n * Provides subcommands for listing, getting, setting, and resetting\n * configuration values (e.g., default workspace, pager settings).\n *\n * @returns Commander command instance\n */\nexport function createConfigCommand() {\n const cmd = new Command('config').description('Manage CLI configuration');\n\n cmd\n .command('list')\n .description('View current config')\n .option('-o, --output <format>', 'Output format (json, yaml, toon)')\n .action((opts) => {\n debug('config list command invoked');\n const config = getConfig();\n\n const format = opts.output || null;\n if (format) {\n if (!['json', 'yaml', 'toon'].includes(format)) {\n console.error(chalk.red(`Invalid format: ${format}. Use 'json', 'yaml', or 'toon'.`));\n process.exit(1);\n }\n console.log(formatOutput(config, format as OutputFormat));\n return;\n }\n\n if (Object.keys(config).length === 0) {\n console.log(chalk.dim('No configuration set.'));\n return;\n }\n\n for (const [key, value] of Object.entries(config)) {\n if (typeof value === 'object') {\n console.log(`${chalk.bold(key)}:`);\n for (const [k, v] of Object.entries(value as Record<string, unknown>)) {\n console.log(` ${k}: ${v}`);\n }\n } else {\n console.log(`${chalk.bold(key)}: ${value}`);\n }\n }\n });\n\n cmd\n .command('get <key>')\n .description('Get a config value')\n .option('-o, --output <format>', 'Output format (json, yaml, toon)')\n .action((key: string, opts) => {\n debug('config get command invoked with key: %s', key);\n const value = getConfigValue(key as keyof ReturnType<typeof getConfig>);\n\n const format = opts.output || null;\n if (format) {\n if (!['json', 'yaml', 'toon'].includes(format)) {\n console.error(chalk.red(`Invalid format: ${format}. Use 'json', 'yaml', or 'toon'.`));\n process.exit(1);\n }\n console.log(formatOutput({ [key]: value }, format as OutputFormat));\n return;\n }\n\n if (value === undefined) {\n console.log(chalk.dim('(not set)'));\n } else {\n console.log(value);\n }\n });\n\n cmd\n .command('set <key> <value>')\n .description('Set a config value')\n .action((key: string, value: string) => {\n debug('config set command invoked: %s = %s', key, value);\n if (!isConfigKey(key)) {\n console.error(\n chalk.red(\n `Invalid config key: ${key}. Allowed keys: ${CONFIG_KEYS.map((k) => `'${k}'`).join(', ')}.`,\n ),\n );\n process.exit(1);\n }\n\n const parser = CONFIG_VALUE_PARSERS[key];\n let parsedValue: Config[typeof key];\n try {\n parsedValue = parser(value) as Config[typeof key];\n } catch (error) {\n console.error(chalk.red('Invalid value for config key:'), key);\n if (error instanceof Error) {\n console.error(chalk.dim(error.message));\n }\n process.exit(1);\n }\n\n setConfigValue(key, parsedValue);\n console.log(chalk.green(`Set ${key} = ${value}`));\n });\n\n cmd\n .command('reset')\n .description('Reset to defaults')\n .action(() => {\n debug('config reset command invoked');\n resetConfig();\n console.log(chalk.green('Configuration reset'));\n });\n\n return cmd;\n}\n\nexport const configCommand = createConfigCommand();\n","import { Command } from 'commander';\nimport { listCommand } from './list.js';\nimport { viewCommand } from './view.js';\n\nexport const folderCommand = new Command('folder')\n .description('Work with folders')\n .addCommand(listCommand)\n .addCommand(viewCommand);\n","import chalk from 'chalk';\nimport { Command } from 'commander';\nimport { createGranolaDebug } from '../../lib/debug.js';\nimport { formatOutput, type OutputFormat, table } from '../../lib/output.js';\nimport { list as listFolders } from '../../services/folders.js';\nimport type { Folder } from '../../types.js';\n\nconst debug = createGranolaDebug('cmd:folder:list');\n\n/**\n * Creates the 'list' command for displaying folders.\n *\n * Lists folders with optional filtering by workspace.\n * Supports -o/--output for structured output.\n *\n * @returns Commander command instance\n */\nexport function createListCommand() {\n return new Command('list')\n .description('List folders')\n .option('-w, --workspace <id>', 'Filter by workspace')\n .option('-o, --output <format>', 'Output format (json, yaml, toon)')\n .action(async (opts) => {\n debug('folder list command invoked with opts: %O', opts);\n\n let data: Folder[];\n try {\n data = await listFolders({\n workspace: opts.workspace,\n });\n debug('fetched %d folders', data.length);\n } catch (error) {\n console.error(chalk.red('Error:'), 'Failed to list folders.');\n if (error instanceof Error) {\n console.error(chalk.dim(error.message));\n }\n process.exit(1);\n }\n\n // Handle structured output formats\n const format = opts.output || null;\n if (format) {\n if (!['json', 'yaml', 'toon'].includes(format)) {\n console.error(chalk.red(`Invalid format: ${format}. Use 'json', 'yaml', or 'toon'.`));\n process.exit(1);\n }\n console.log(formatOutput(data, format as OutputFormat));\n return;\n }\n\n if (data.length === 0) {\n console.log(chalk.dim('No folders found.'));\n return;\n }\n\n const rows = data.map((folder) => ({\n ...folder,\n display_name: folder.name || folder.title || 'Unnamed',\n }));\n\n const output = table(rows, [\n { key: 'id', header: 'ID', width: 12, format: (v) => String(v).slice(0, 8) },\n { key: 'display_name', header: 'NAME', width: 20, format: (v) => String(v || '') },\n {\n key: 'workspace_id',\n header: 'WORKSPACE',\n width: 12,\n format: (v) => String(v).slice(0, 8),\n },\n ]);\n\n console.log(output);\n });\n}\n\nexport const listCommand = createListCommand();\n","import chalk from 'chalk';\nimport { createApiClient, type GranolaApi } from '../lib/api.js';\nimport { getCredentials, refreshAccessToken } from '../lib/auth.js';\nimport { createGranolaDebug, maskToken } from '../lib/debug.js';\nimport { createHttpClient } from '../lib/http.js';\n\nconst debug = createGranolaDebug('service:client');\n\nlet client: GranolaApi | null = null;\n\nexport async function getClient(): Promise<GranolaApi> {\n debug('getClient called, cached: %s', client ? 'yes' : 'no');\n if (client) return client;\n\n debug('fetching credentials');\n const creds = await getCredentials();\n if (!creds) {\n debug('no credentials found, exiting');\n console.error(chalk.red('Error:'), 'Not authenticated.');\n console.error(`Run ${chalk.cyan('granola auth login')} to authenticate.`);\n process.exit(2);\n }\n\n debug('creating API client, token: %s', maskToken(creds.accessToken));\n const httpClient = createHttpClient(creds.accessToken);\n client = createApiClient(httpClient);\n\n return client;\n}\n\nexport function resetClient(): void {\n debug('client reset');\n client = null;\n}\n\nfunction isUnauthorizedError(error: unknown): boolean {\n if (error && typeof error === 'object') {\n const e = error as { status?: number };\n return e.status === 401;\n }\n return false;\n}\n\n/**\n * Wraps an async operation with automatic token refresh on 401 errors.\n * If the operation fails with a 401, attempts to refresh the token and retry once.\n */\nexport async function withTokenRefresh<T>(operation: () => Promise<T>): Promise<T> {\n try {\n return await operation();\n } catch (error: unknown) {\n if (isUnauthorizedError(error)) {\n debug('401 detected, attempting token refresh');\n\n const newCreds = await refreshAccessToken();\n if (!newCreds) {\n debug('token refresh failed, re-throwing original error');\n throw error;\n }\n\n resetClient();\n debug('retrying operation with refreshed token');\n return operation();\n }\n throw error;\n }\n}\n","import type { Meeting, Person, ProseMirrorDoc } from '../types.js';\nimport type { HttpClient } from './http.js';\n\nexport interface GetDocumentsOptions {\n workspace_id?: string;\n limit?: number;\n offset?: number;\n cursor?: string;\n include_last_viewed_panel?: boolean;\n}\n\nexport interface DocumentsResponse {\n docs: Meeting[];\n next_cursor?: string;\n}\n\nexport interface GetDocumentsBatchOptions {\n document_ids: string[];\n include_last_viewed_panel?: boolean;\n}\n\nexport interface DocumentsBatchResponse {\n documents?: Meeting[];\n docs?: Meeting[];\n}\n\nexport interface DocumentMetadata {\n creator?: {\n name: string;\n email: string;\n details?: object;\n };\n attendees?: Person[];\n notes?: ProseMirrorDoc;\n last_viewed_panel?: {\n content: ProseMirrorDoc;\n };\n}\n\nexport interface TranscriptSegment {\n document_id?: string;\n id: string;\n text: string;\n source: 'microphone' | 'system';\n start_timestamp: string;\n end_timestamp: string;\n is_final?: boolean;\n}\n\nexport interface DocumentListDocument {\n id: string;\n}\n\nexport interface DocumentList {\n id: string;\n title?: string;\n name?: string;\n workspace_id: string;\n owner_id: string;\n created_at: string;\n is_favourite: boolean;\n documents?: DocumentListDocument[];\n document_ids?: string[];\n}\n\nexport interface WorkspaceEntry {\n workspace: {\n workspace_id: string;\n slug: string;\n display_name: string;\n is_locked: boolean;\n created_at: string;\n updated_at: string;\n privacy_mode_enabled: boolean;\n sharing_link_visibility: string | null;\n };\n role: string;\n plan_type: string;\n}\n\nexport interface WorkspacesResponse {\n workspaces: WorkspaceEntry[];\n}\n\nexport interface GranolaApi {\n getDocuments(options?: GetDocumentsOptions): Promise<DocumentsResponse>;\n getDocumentsBatch(options: GetDocumentsBatchOptions): Promise<DocumentsBatchResponse>;\n getDocumentMetadata(documentId: string): Promise<DocumentMetadata>;\n getDocumentTranscript(documentId: string): Promise<TranscriptSegment[]>;\n getDocumentLists(): Promise<DocumentList[]>;\n getDocumentList(folderId: string): Promise<DocumentList | null>;\n getWorkspaces(): Promise<WorkspacesResponse>;\n setToken(token: string): void;\n}\n\nexport function createApiClient(httpClient: HttpClient): GranolaApi {\n async function getDocuments(options: GetDocumentsOptions = {}): Promise<DocumentsResponse> {\n const body: Record<string, unknown> = {\n include_last_viewed_panel: options.include_last_viewed_panel ?? false,\n };\n\n if (options.workspace_id) body.workspace_id = options.workspace_id;\n if (options.limit !== undefined) body.limit = options.limit;\n if (options.offset !== undefined) body.offset = options.offset;\n if (options.cursor) body.cursor = options.cursor;\n\n return httpClient.post<DocumentsResponse>('/v2/get-documents', body);\n }\n\n async function getDocumentsBatch(\n options: GetDocumentsBatchOptions,\n ): Promise<DocumentsBatchResponse> {\n return httpClient.post<DocumentsBatchResponse>('/v1/get-documents-batch', {\n document_ids: options.document_ids,\n include_last_viewed_panel: options.include_last_viewed_panel ?? false,\n });\n }\n\n async function getDocumentMetadata(documentId: string): Promise<DocumentMetadata> {\n return httpClient.post<DocumentMetadata>('/v1/get-document-metadata', {\n document_id: documentId,\n });\n }\n\n async function getDocumentTranscript(documentId: string): Promise<TranscriptSegment[]> {\n return httpClient.post<TranscriptSegment[]>('/v1/get-document-transcript', {\n document_id: documentId,\n });\n }\n\n async function getDocumentLists(): Promise<DocumentList[]> {\n return httpClient.post<DocumentList[]>('/v2/get-document-lists', {});\n }\n\n async function getDocumentList(folderId: string): Promise<DocumentList | null> {\n const folders = await getDocumentLists();\n return folders.find((f) => f.id === folderId) || null;\n }\n\n async function getWorkspaces(): Promise<WorkspacesResponse> {\n return httpClient.post<WorkspacesResponse>('/v1/get-workspaces', {});\n }\n\n function setToken(token: string): void {\n httpClient.setToken(token);\n }\n\n return {\n getDocuments,\n getDocumentsBatch,\n getDocumentMetadata,\n getDocumentTranscript,\n getDocumentLists,\n getDocumentList,\n getWorkspaces,\n setToken,\n };\n}\n","import { readFileSync } from 'node:fs';\nimport os from 'node:os';\nimport process from 'node:process';\n\nfunction getPackageVersion(): string {\n // Try path from bundled output (dist/main.js -> ../package.json)\n // Falls back to path from source (src/lib/http.ts -> ../../package.json)\n for (const path of ['../package.json', '../../package.json']) {\n try {\n const pkg = JSON.parse(readFileSync(new URL(path, import.meta.url), 'utf-8'));\n return pkg.version;\n } catch {}\n }\n return '0.0.0';\n}\n\nconst version = getPackageVersion();\n\nconst BASE_URL = 'https://api.granola.ai';\nconst APP_VERSION = '7.0.0';\n\nfunction buildUserAgent(): string {\n const platform = process.platform === 'darwin' ? 'macOS' : process.platform;\n const osRelease = os.release();\n return `Granola/${APP_VERSION} granola-cli/${version} (${platform} ${osRelease})`;\n}\n\nfunction getClientHeaders(): Record<string, string> {\n return {\n 'X-App-Version': APP_VERSION,\n 'X-Client-Version': APP_VERSION,\n 'X-Client-Type': 'cli',\n 'X-Client-Platform': process.platform,\n 'X-Client-Architecture': process.arch,\n 'X-Client-Id': `granola-cli-${version}`,\n 'User-Agent': buildUserAgent(),\n };\n}\n\nconst RETRY_CONFIG = {\n maxRetries: 3,\n baseDelay: 250,\n retryableStatuses: [429, 500, 502, 503, 504],\n};\n\nexport class ApiError extends Error {\n constructor(\n message: string,\n public readonly status: number,\n public readonly body?: unknown,\n ) {\n super(message);\n this.name = 'ApiError';\n }\n}\n\nexport interface HttpClient {\n post<T>(endpoint: string, body?: object): Promise<T>;\n setToken(token: string): void;\n}\n\nfunction isRetryable(status: number): boolean {\n return RETRY_CONFIG.retryableStatuses.includes(status);\n}\n\nasync function sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport function createHttpClient(token: string): HttpClient {\n let currentToken = token;\n\n async function post<T>(endpoint: string, body: object = {}): Promise<T> {\n let lastError: Error | null = null;\n const maxAttempts = RETRY_CONFIG.maxRetries + 1;\n\n for (let attempt = 0; attempt < maxAttempts; attempt++) {\n try {\n const response = await fetch(`${BASE_URL}${endpoint}`, {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${currentToken}`,\n 'Content-Type': 'application/json',\n ...getClientHeaders(),\n },\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n const responseBody = await response.json().catch(() => ({}));\n\n if (isRetryable(response.status) && attempt < maxAttempts - 1) {\n const delay = RETRY_CONFIG.baseDelay * 2 ** attempt;\n await sleep(delay);\n continue;\n }\n\n throw new ApiError(\n `HTTP ${response.status}: ${response.statusText}`,\n response.status,\n responseBody,\n );\n }\n\n return (await response.json()) as T;\n } catch (error) {\n if (error instanceof ApiError) {\n throw error;\n }\n\n lastError = error as Error;\n\n if (attempt < maxAttempts - 1) {\n const delay = RETRY_CONFIG.baseDelay * 2 ** attempt;\n await sleep(delay);\n }\n }\n }\n\n throw lastError;\n }\n\n function setToken(newToken: string): void {\n currentToken = newToken;\n }\n\n return { post, setToken };\n}\n","import type { DocumentList } from '../lib/api.js';\nimport { createGranolaDebug } from '../lib/debug.js';\nimport type { Folder } from '../types.js';\nimport { getClient, withTokenRefresh } from './client.js';\n\nconst debug = createGranolaDebug('service:folders');\n\nexport interface ListOptions {\n workspace?: string;\n}\n\nfunction normalizeFolder(folder: DocumentList): Folder {\n const documentIdsFromDocs = Array.isArray(folder.documents)\n ? folder.documents\n .map((doc: { id?: string }) => doc?.id)\n .filter((id: string | undefined): id is string => Boolean(id))\n : undefined;\n\n const documentIds =\n Array.isArray(folder.document_ids) && folder.document_ids.length > 0\n ? folder.document_ids\n : documentIdsFromDocs;\n\n return {\n id: folder.id,\n name: folder.name ?? folder.title,\n title: folder.title ?? folder.name ?? 'Untitled',\n created_at: folder.created_at,\n workspace_id: folder.workspace_id,\n owner_id: folder.owner_id,\n document_ids: documentIds ?? [],\n is_favourite: folder.is_favourite,\n };\n}\n\nexport async function list(opts: ListOptions = {}): Promise<Folder[]> {\n return withTokenRefresh(async () => {\n const client = await getClient();\n const documentLists = await client.getDocumentLists();\n const folders = documentLists.map(normalizeFolder);\n debug('list fetched %d folders', folders.length);\n\n if (opts.workspace) {\n const filtered = folders.filter((folder) => folder.workspace_id === opts.workspace);\n debug('filtered to %d folders for workspace %s', filtered.length, opts.workspace);\n return filtered;\n }\n\n return folders;\n });\n}\n\nexport async function get(id: string): Promise<Folder | null> {\n return withTokenRefresh(async () => {\n debug('get called for folder: %s', id);\n const client = await getClient();\n const documentLists = await client.getDocumentLists();\n const folder = documentLists.find((f) => f.id === id);\n if (!folder) {\n debug('folder %s not found', id);\n return null;\n }\n debug('folder %s found', id);\n return normalizeFolder(folder);\n });\n}\n","import chalk from 'chalk';\nimport { Command } from 'commander';\nimport { createGranolaDebug } from '../../lib/debug.js';\nimport { formatOutput, type OutputFormat } from '../../lib/output.js';\nimport { get as getFolder } from '../../services/folders.js';\nimport type { Folder } from '../../types.js';\n\nconst debug = createGranolaDebug('cmd:folder:view');\n\n/**\n * Creates the 'view' command for displaying folder details.\n *\n * Shows folder metadata including name, meeting count, and workspace.\n * Supports -o/--output for structured output.\n *\n * @returns Commander command instance\n */\nexport function createViewCommand() {\n return new Command('view')\n .description('View folder details')\n .argument('<id>', 'Folder ID')\n .option('-o, --output <format>', 'Output format (json, yaml, toon)')\n .action(async (id: string, opts) => {\n debug('folder view command invoked with id: %s', id);\n\n let folder: Folder | null;\n try {\n folder = await getFolder(id);\n } catch (error) {\n console.error(chalk.red('Error:'), 'Failed to load folder.');\n if (error instanceof Error) {\n console.error(chalk.dim(error.message));\n }\n process.exit(1);\n }\n\n if (!folder) {\n console.error(chalk.red(`Folder ${id} not found`));\n process.exit(4);\n }\n\n // Handle structured output formats\n const format = opts.output || null;\n if (format) {\n if (!['json', 'yaml', 'toon'].includes(format)) {\n console.error(chalk.red(`Invalid format: ${format}. Use 'json', 'yaml', or 'toon'.`));\n process.exit(1);\n }\n console.log(formatOutput(folder, format as OutputFormat));\n return;\n }\n\n const name = folder.name || folder.title || 'Unnamed';\n const docCount = folder.document_ids?.length || 0;\n\n console.log(chalk.bold(name));\n console.log(chalk.dim(`${docCount} meetings · Workspace ${folder.workspace_id}`));\n console.log();\n console.log(chalk.dim('Tip: Use \"granola meeting list\" to browse recent meetings.'));\n });\n}\n\nexport const viewCommand = createViewCommand();\n","import { Command } from 'commander';\nimport { enhancedCommand } from './enhanced.js';\nimport { exportCommand } from './export.js';\nimport { listCommand } from './list.js';\nimport { notesCommand } from './notes.js';\nimport { transcriptCommand } from './transcript.js';\nimport { viewCommand } from './view.js';\n\nexport const meetingCommand = new Command('meeting')\n .description('Work with meetings')\n .addCommand(listCommand)\n .addCommand(viewCommand)\n .addCommand(notesCommand)\n .addCommand(enhancedCommand)\n .addCommand(transcriptCommand)\n .addCommand(exportCommand);\n","import chalk from 'chalk';\nimport { Command } from 'commander';\nimport { createGranolaDebug } from '../../lib/debug.js';\nimport { formatOutput, type OutputFormat } from '../../lib/output.js';\nimport { pipeToPager } from '../../lib/pager.js';\nimport { toMarkdown } from '../../lib/prosemirror.js';\nimport * as meetings from '../../services/meetings.js';\nimport type { ProseMirrorDoc } from '../../types.js';\n\nconst debug = createGranolaDebug('cmd:meeting:enhanced');\n\n/**\n * Creates the 'enhanced' command for displaying AI-enhanced meeting notes.\n *\n * Retrieves and renders AI-generated meeting summaries as Markdown.\n * Uses a pager for long output in interactive terminals.\n * Supports -o/--output for raw ProseMirror JSON output.\n *\n * @returns Commander command instance\n */\nexport function createEnhancedCommand() {\n return new Command('enhanced')\n .description('View AI-enhanced meeting notes')\n .argument('<id>', 'Meeting ID')\n .option('-o, --output <format>', 'Output format (markdown, json, yaml, toon)', 'markdown')\n .action(async (id: string, opts, cmd) => {\n debug('enhanced command invoked with id: %s', id);\n const global = cmd.optsWithGlobals();\n\n let fullId: string;\n try {\n const resolved = await meetings.resolveId(id);\n if (!resolved) {\n console.error(chalk.red(`Meeting ${id} not found`));\n process.exit(4);\n }\n fullId = resolved;\n } catch (err) {\n console.error(chalk.red((err as Error).message));\n process.exit(1);\n }\n\n let notes: ProseMirrorDoc | null;\n try {\n notes = await meetings.getEnhancedNotes(fullId);\n } catch (error) {\n debug('failed to load enhanced notes: %O', error);\n console.error(chalk.red('Error:'), 'Failed to fetch enhanced notes.');\n if (error instanceof Error) {\n console.error(chalk.dim(error.message));\n }\n process.exit(1);\n }\n\n if (!notes) {\n console.error(chalk.red(`No enhanced notes found for meeting ${id}`));\n process.exit(4);\n }\n\n const format = opts.output || 'markdown';\n const structuredFormats: OutputFormat[] = ['json', 'yaml', 'toon'];\n if (format !== 'markdown' && !structuredFormats.includes(format as OutputFormat)) {\n console.error(\n chalk.red(`Invalid format: ${format}. Use 'markdown', 'json', 'yaml', or 'toon'.`),\n );\n process.exit(1);\n }\n\n if (structuredFormats.includes(format as OutputFormat)) {\n console.log(formatOutput(notes, format as OutputFormat));\n return;\n }\n\n const md = toMarkdown(notes);\n\n if (global.noPager || !process.stdout.isTTY) {\n console.log(md);\n } else {\n await pipeToPager(md);\n }\n });\n}\n\nexport const enhancedCommand = createEnhancedCommand();\n","import { spawn } from 'node:child_process';\nimport { getConfigValue } from './config.js';\nimport { createGranolaDebug } from './debug.js';\n\nconst debug = createGranolaDebug('lib:pager');\n\nconst ALLOWED_PAGERS = ['less', 'more', 'cat', 'head', 'tail', 'bat', 'most'];\nconst SHELL_METACHARACTERS = /[;&|`$(){}[\\]<>\\\\!#*?]/;\n\nexport function validatePagerCommand(cmd: string): boolean {\n debug('validating pager command: %s', cmd);\n if (SHELL_METACHARACTERS.test(cmd)) {\n debug('pager validation failed: contains shell metacharacters');\n return false;\n }\n const [binary] = cmd.split(' ');\n const binaryName = binary.split('/').pop() || '';\n const valid = ALLOWED_PAGERS.includes(binaryName);\n debug('pager validation: %s (binary: %s)', valid ? 'passed' : 'failed', binaryName);\n return valid;\n}\n\nexport function getPagerCommand(): string {\n if (process.env.GRANOLA_PAGER) {\n debug('pager command: %s (source: GRANOLA_PAGER)', process.env.GRANOLA_PAGER);\n return process.env.GRANOLA_PAGER;\n }\n if (process.env.PAGER) {\n debug('pager command: %s (source: PAGER)', process.env.PAGER);\n return process.env.PAGER;\n }\n const configuredPager = getConfigValue('pager');\n if (configuredPager) {\n debug('pager command: %s (source: config)', configuredPager);\n return configuredPager;\n }\n debug('pager command: less -R (source: default)');\n return 'less -R';\n}\n\nexport async function pipeToPager(content: string): Promise<void> {\n debug('pipeToPager: isTTY=%s, contentLength=%d', process.stdout.isTTY, content.length);\n if (!process.stdout.isTTY) {\n debug('not a TTY, writing directly to stdout');\n process.stdout.write(`${content}\\n`);\n return;\n }\n\n const pagerCmd = getPagerCommand();\n\n if (!validatePagerCommand(pagerCmd)) {\n console.error(`Warning: Invalid pager command \"${pagerCmd}\". Falling back to direct output.`);\n process.stdout.write(`${content}\\n`);\n return;\n }\n\n const [cmd, ...args] = pagerCmd.split(' ');\n debug('spawning pager: %s with args: %O', cmd, args);\n\n return new Promise((resolve) => {\n let settled = false;\n const finish = () => {\n if (!settled) {\n settled = true;\n resolve();\n }\n };\n\n const fallbackToStdout = (reason: string) => {\n if (settled) return;\n settled = true;\n debug('falling back to stdout: %s', reason);\n console.error(\n `Warning: Unable to launch pager \"${pagerCmd}\" (${reason}). Falling back to direct output.`,\n );\n process.stdout.write(`${content}\\n`);\n resolve();\n };\n\n try {\n const pager = spawn(cmd, args, {\n stdio: ['pipe', 'inherit', 'inherit'],\n });\n\n pager.stdin.write(content);\n pager.stdin.end();\n\n pager.on('close', () => {\n debug('pager closed');\n finish();\n });\n\n pager.on('error', (err) => {\n debug('pager error: %O', err);\n fallbackToStdout((err as Error).message);\n });\n } catch (err) {\n debug('failed to spawn pager: %O', err);\n fallbackToStdout((err as Error).message);\n }\n });\n}\n","import type { ProseMirrorDoc, ProseMirrorNode } from '../types.js';\nimport { createGranolaDebug } from './debug.js';\n\nconst debug = createGranolaDebug('lib:prosemirror');\n\nexport function toMarkdown(doc: ProseMirrorDoc | null): string {\n debug('toMarkdown called with doc: %O', doc);\n if (!doc?.content) {\n debug('No content in doc, returning empty string');\n return '';\n }\n const result = doc.content.map((n) => nodeToMd(n)).join('\\n\\n');\n debug('toMarkdown result: %s', result);\n return result;\n}\n\nfunction nodeToMd(node: ProseMirrorNode): string {\n debug('nodeToMd processing node type: %s, node: %O', node.type, node);\n let result: string;\n switch (node.type) {\n case 'heading': {\n const lvl = (node.attrs?.level as number) || 1;\n result = `${'#'.repeat(lvl)} ${inlineToMd(node.content)}`;\n break;\n }\n case 'paragraph':\n result = inlineToMd(node.content);\n break;\n case 'bulletList':\n result = (node.content || []).map((li) => nodeToMd(li)).join('\\n');\n break;\n case 'orderedList':\n result = (node.content || [])\n .map((li, i) => nodeToMd(li).replace(/^- /, `${i + 1}. `))\n .join('\\n');\n break;\n case 'listItem':\n result = `- ${(node.content || []).map((c) => nodeToMd(c)).join('\\n ')}`;\n break;\n case 'blockquote':\n result = (node.content || []).map((c) => `> ${nodeToMd(c)}`).join('\\n');\n break;\n case 'codeBlock': {\n const lang = (node.attrs?.language as string) || '';\n result = `\\`\\`\\`${lang}\\n${inlineToMd(node.content)}\\n\\`\\`\\``;\n break;\n }\n case 'horizontalRule':\n result = '---';\n break;\n case 'text':\n result = applyMarks(node.text || '', node.marks);\n break;\n default:\n debug('Unknown node type: %s', node.type);\n result = node.content ? node.content.map((c) => nodeToMd(c)).join('') : '';\n }\n debug('nodeToMd result for %s: %s', node.type, result);\n return result;\n}\n\nfunction inlineToMd(content?: ProseMirrorNode[]): string {\n return content ? content.map((n) => nodeToMd(n)).join('') : '';\n}\n\nfunction applyMarks(text: string, marks?: Array<{ type: string }>): string {\n if (!marks) return text;\n for (const m of marks) {\n if (m.type === 'bold' || m.type === 'strong') text = `**${text}**`;\n if (m.type === 'italic' || m.type === 'em') text = `*${text}*`;\n if (m.type === 'code') text = `\\`${text}\\``;\n if (m.type === 'strike') text = `~~${text}~~`;\n }\n return text;\n}\n","import type { Meeting } from '../types.js';\nimport { createGranolaDebug } from './debug.js';\n\nconst debug = createGranolaDebug('lib:filters');\n\nexport interface FilterOptions {\n search?: string;\n attendee?: string;\n date?: Date;\n since?: Date;\n until?: Date;\n}\n\nfunction isSameDay(d1: Date, d2: Date): boolean {\n return (\n d1.getFullYear() === d2.getFullYear() &&\n d1.getMonth() === d2.getMonth() &&\n d1.getDate() === d2.getDate()\n );\n}\n\nfunction startOfDay(date: Date): Date {\n const result = new Date(date);\n result.setHours(0, 0, 0, 0);\n return result;\n}\n\nfunction endOfDay(date: Date): Date {\n const result = new Date(date);\n result.setHours(23, 59, 59, 999);\n return result;\n}\n\n/**\n * Case-insensitive partial match on meeting title.\n */\nexport function matchesSearch(meeting: Meeting, query: string): boolean {\n const normalizedQuery = query.toLowerCase();\n const normalizedTitle = meeting.title.toLowerCase();\n return normalizedTitle.includes(normalizedQuery);\n}\n\n/**\n * Partial match on attendee name or email (case-insensitive).\n * Checks both `people.attendees` and top-level `attendees`.\n */\nexport function matchesAttendee(meeting: Meeting, query: string): boolean {\n const normalizedQuery = query.toLowerCase();\n\n // Check people.attendees\n const peopleAttendees = meeting.people?.attendees ?? [];\n // Check top-level attendees\n const topLevelAttendees = meeting.attendees ?? [];\n\n const allAttendees = [...peopleAttendees, ...topLevelAttendees];\n\n return allAttendees.some((attendee) => {\n const name = attendee.name?.toLowerCase() ?? '';\n const email = attendee.email?.toLowerCase() ?? '';\n return name.includes(normalizedQuery) || email.includes(normalizedQuery);\n });\n}\n\n/**\n * Check if meeting falls on a specific date (ignoring time).\n */\nexport function matchesDate(meeting: Meeting, date: Date): boolean {\n const meetingDate = new Date(meeting.created_at);\n return isSameDay(meetingDate, date);\n}\n\n/**\n * Check if meeting is within date range (inclusive).\n */\nexport function matchesDateRange(meeting: Meeting, since?: Date, until?: Date): boolean {\n const meetingDate = new Date(meeting.created_at);\n\n if (since && meetingDate < startOfDay(since)) {\n return false;\n }\n if (until && meetingDate > endOfDay(until)) {\n return false;\n }\n\n return true;\n}\n\n/**\n * Check if any filters are active.\n */\nexport function hasActiveFilters(options: FilterOptions): boolean {\n return !!(options.search || options.attendee || options.date || options.since || options.until);\n}\n\n/**\n * Apply all filters to a meeting list.\n * All filters are combined with AND logic.\n */\nexport function applyFilters(meetings: Meeting[], options: FilterOptions): Meeting[] {\n if (!hasActiveFilters(options)) {\n return meetings;\n }\n\n debug('applying filters: %O', options);\n const startCount = meetings.length;\n\n const filtered = meetings.filter((meeting) => {\n if (options.search && !matchesSearch(meeting, options.search)) {\n return false;\n }\n if (options.attendee && !matchesAttendee(meeting, options.attendee)) {\n return false;\n }\n if (options.date && !matchesDate(meeting, options.date)) {\n return false;\n }\n if (!matchesDateRange(meeting, options.since, options.until)) {\n return false;\n }\n return true;\n });\n\n debug('filtered %d -> %d meetings', startCount, filtered.length);\n return filtered;\n}\n","import type { GranolaApi } from '../lib/api.js';\nimport { createGranolaDebug } from '../lib/debug.js';\nimport { applyFilters, type FilterOptions, hasActiveFilters } from '../lib/filters.js';\nimport type { Meeting, ProseMirrorDoc, Utterance } from '../types.js';\nimport { getClient, withTokenRefresh } from './client.js';\n\nconst debug = createGranolaDebug('service:meetings');\n\nexport interface ListOptions extends FilterOptions {\n limit?: number;\n offset?: number;\n workspace?: string;\n folder?: string;\n}\n\nasync function getFolderDocumentIds(client: GranolaApi, folderId: string): Promise<string[]> {\n debug('fetching folder %s via getDocumentList', folderId);\n const folder = await client.getDocumentList(folderId);\n if (!folder) {\n debug('folder %s not found', folderId);\n return [];\n }\n const ids = folder.document_ids || folder.documents?.map((doc: { id: string }) => doc.id) || [];\n debug('folder %s returned %d document ids', folderId, ids.length);\n return ids;\n}\n\nconst DOCUMENT_BATCH_SIZE = 100;\nconst NOTES_PAGE_SIZE = 50;\nconst MAX_NOTES_PAGES = 100;\n\nasync function fetchMeetingsByIds(client: GranolaApi, documentIds: string[]): Promise<Meeting[]> {\n if (documentIds.length === 0) return [];\n\n const meetings: Meeting[] = [];\n for (let i = 0; i < documentIds.length; i += DOCUMENT_BATCH_SIZE) {\n const chunk = documentIds.slice(i, i + DOCUMENT_BATCH_SIZE);\n const res = await client.getDocumentsBatch({\n document_ids: chunk,\n include_last_viewed_panel: false,\n });\n const docs = (res?.documents || res?.docs || []) as Meeting[];\n meetings.push(...docs);\n }\n debug('fetched %d meetings via getDocumentsBatch', meetings.length);\n return meetings;\n}\n\nasync function loadMeetingMetadata(\n client: GranolaApi,\n id: string,\n): Promise<{ notes?: any; last_viewed_panel?: { content: any } } | null> {\n try {\n const metadata = await client.getDocumentMetadata(id);\n if (!metadata) {\n debug('getDocumentMetadata returned null for %s', id);\n return null;\n }\n return metadata;\n } catch (err) {\n debug('getDocumentMetadata failed for %s: %O', id, err);\n return null;\n }\n}\n\nasync function fetchFolderMeetings(client: GranolaApi, folderId: string): Promise<Meeting[]> {\n const ids = await getFolderDocumentIds(client, folderId);\n if (ids.length === 0) {\n debug('folder %s has no documents', folderId);\n return [];\n }\n return fetchMeetingsByIds(client, ids);\n}\n\nexport async function list(opts: ListOptions = {}): Promise<Meeting[]> {\n return withTokenRefresh(async () => {\n debug('list called with opts: %O', opts);\n const client = await getClient();\n const { limit = 20, offset = 0, workspace, folder, ...filterOpts } = opts;\n\n if (folder) {\n debug('listing meetings for folder: %s', folder);\n const folderMeetings = await fetchFolderMeetings(client, folder);\n debug('fetched %d meetings for folder %s', folderMeetings.length, folder);\n\n let filtered = folderMeetings;\n if (workspace) {\n filtered = folderMeetings.filter((m) => m.workspace_id === workspace);\n debug(\n 'workspace filter applied for folder %s: %d meetings remain',\n folder,\n filtered.length,\n );\n }\n\n // Apply additional filters if any\n filtered = applyFilters(filtered, filterOpts);\n\n const paginated = filtered.slice(offset, offset + limit);\n debug('returning %d meetings from folder %s after pagination', paginated.length, folder);\n return paginated;\n }\n\n // When filters are active, fetch more meetings to filter from\n if (hasActiveFilters(filterOpts)) {\n debug('filters active, using cached meetings for filtering');\n let meetings = await getCachedMeetings(client);\n\n if (workspace) {\n meetings = meetings.filter((m) => m.workspace_id === workspace);\n debug('filtered to %d meetings for workspace: %s', meetings.length, workspace);\n }\n\n // Apply search/attendee/date filters\n meetings = applyFilters(meetings, filterOpts);\n\n // Apply pagination to filtered results\n const paginated = meetings.slice(offset, offset + limit);\n debug('returning %d meetings after filtering and pagination', paginated.length);\n return paginated;\n }\n\n // No filters active - use standard pagination from API\n const res = await client.getDocuments({\n limit,\n offset,\n include_last_viewed_panel: false,\n });\n\n let meetings = (res?.docs || []) as Meeting[];\n debug('fetched %d meetings', meetings.length);\n if (workspace) {\n meetings = meetings.filter((m) => m.workspace_id === workspace);\n debug('filtered to %d meetings for workspace: %s', meetings.length, workspace);\n }\n\n return meetings;\n });\n}\n\nconst RESOLVE_PAGE_SIZE = 100;\nconst MAX_RESOLVE_PAGES = 100;\nconst FULL_UUID_LENGTH = 36;\nconst CACHE_TTL_MS = 60000;\n\ninterface MeetingsCache {\n meetings: Meeting[];\n timestamp: number;\n}\n\nlet meetingsCache: MeetingsCache | null = null;\n\n/**\n * Clears the meetings cache. Useful for testing or forcing a refresh.\n */\nexport function clearMeetingsCache(): void {\n meetingsCache = null;\n debug('meetings cache cleared');\n}\n\n/**\n * Fetches meetings with caching to reduce API calls.\n * Cache expires after 60 seconds.\n */\nasync function getCachedMeetings(client: GranolaApi): Promise<Meeting[]> {\n if (meetingsCache && Date.now() - meetingsCache.timestamp < CACHE_TTL_MS) {\n debug('using cached meetings (%d items)', meetingsCache.meetings.length);\n return meetingsCache.meetings;\n }\n\n debug('cache miss or expired, fetching meetings');\n const meetings: Meeting[] = [];\n let offset = 0;\n\n for (let page = 0; page < MAX_RESOLVE_PAGES; page += 1) {\n const res = await client.getDocuments({\n limit: RESOLVE_PAGE_SIZE,\n offset,\n include_last_viewed_panel: false,\n });\n const docs = (res?.docs || []) as Meeting[];\n meetings.push(...docs);\n\n if (docs.length < RESOLVE_PAGE_SIZE) {\n break;\n }\n offset += RESOLVE_PAGE_SIZE;\n }\n\n meetingsCache = { meetings, timestamp: Date.now() };\n debug('cached %d meetings', meetings.length);\n return meetings;\n}\n\nexport async function resolveId(partialId: string): Promise<string | null> {\n return withTokenRefresh(async () => {\n debug('resolving meeting id: %s (length: %d)', partialId, partialId.length);\n const client = await getClient();\n\n // Optimization: If partialId looks like a full UUID, try direct lookup first\n if (partialId.length >= FULL_UUID_LENGTH) {\n debug('attempting direct lookup for full UUID');\n try {\n const metadata = await client.getDocumentMetadata(partialId);\n if (metadata) {\n debug('direct lookup successful for: %s', partialId);\n return partialId;\n }\n } catch {\n debug('direct lookup failed, falling back to search');\n }\n }\n\n // Use cached meetings for prefix search\n const meetings = await getCachedMeetings(client);\n const matches = new Set<string>();\n\n for (const meeting of meetings) {\n if (meeting.id?.startsWith(partialId)) {\n matches.add(meeting.id);\n if (matches.size > 1) {\n debug('ambiguous id: %s matches >1 meetings', partialId);\n throw new Error(`Ambiguous ID: ${partialId} matches ${matches.size} meetings`);\n }\n }\n }\n\n if (matches.size === 0) {\n debug('no meeting found for id: %s', partialId);\n return null;\n }\n\n const match = matches.values().next().value as string;\n debug('resolved meeting: %s -> %s', partialId, match);\n return match;\n });\n}\n\nexport async function get(id: string): Promise<Meeting | null> {\n return withTokenRefresh(async () => {\n debug('getting meeting: %s', id);\n const client = await getClient();\n const metadata = await loadMeetingMetadata(client, id);\n if (!metadata) {\n debug('meeting %s: not found', id);\n return null;\n }\n debug('meeting %s: found', id);\n return { id, ...metadata } as Meeting;\n });\n}\n\ninterface MeetingSearchOptions {\n includeLastViewedPanel: boolean;\n}\n\nasync function findMeetingViaDocuments(\n client: GranolaApi,\n id: string,\n { includeLastViewedPanel }: MeetingSearchOptions,\n): Promise<Meeting | null> {\n let offset = 0;\n\n for (let page = 0; page < MAX_NOTES_PAGES; page += 1) {\n try {\n debug('findMeetingViaDocuments fetching page %d (offset: %d)', page, offset);\n const res = await client.getDocuments({\n limit: NOTES_PAGE_SIZE,\n offset,\n include_last_viewed_panel: includeLastViewedPanel,\n });\n const meetings = (res?.docs || []) as Meeting[];\n debug('findMeetingViaDocuments got %d meetings on page %d', meetings.length, page);\n if (meetings.length === 0) break;\n\n const meeting = meetings.find((m) => m.id === id);\n if (meeting) {\n debug('findMeetingViaDocuments located meeting %s on page %d', id, page);\n return meeting;\n }\n\n offset += NOTES_PAGE_SIZE;\n } catch (err) {\n debug('findMeetingViaDocuments error: %O', err);\n return null;\n }\n }\n\n debug('findMeetingViaDocuments did not locate meeting %s', id);\n return null;\n}\n\nexport async function getNotes(id: string): Promise<ProseMirrorDoc | null> {\n return withTokenRefresh(async () => {\n debug('getNotes called with id: %s', id);\n const client = await getClient();\n const metadata = await loadMeetingMetadata(client, id);\n if (metadata && 'notes' in metadata) {\n debug('getNotes resolved via metadata response');\n return (metadata.notes || null) as ProseMirrorDoc | null;\n }\n\n const meeting = await findMeetingViaDocuments(client, id, {\n includeLastViewedPanel: false,\n });\n if (meeting) {\n return (meeting.notes || null) as ProseMirrorDoc | null;\n }\n\n return null;\n });\n}\n\nexport async function getEnhancedNotes(id: string): Promise<ProseMirrorDoc | null> {\n return withTokenRefresh(async () => {\n debug('getEnhancedNotes called with id: %s', id);\n const client = await getClient();\n const metadata = await loadMeetingMetadata(client, id);\n if (metadata && 'last_viewed_panel' in metadata) {\n debug('getEnhancedNotes resolved via metadata response');\n return (metadata.last_viewed_panel?.content || null) as ProseMirrorDoc | null;\n }\n\n const meeting = await findMeetingViaDocuments(client, id, {\n includeLastViewedPanel: true,\n });\n if (meeting) {\n return (meeting.last_viewed_panel?.content || null) as ProseMirrorDoc | null;\n }\n\n return null;\n });\n}\n\nexport async function getTranscript(id: string): Promise<Utterance[]> {\n return withTokenRefresh(async () => {\n debug('getTranscript called with id: %s', id);\n const client = await getClient();\n try {\n const transcript = (await client.getDocumentTranscript(id)) as Utterance[];\n debug('getTranscript got %d utterances', transcript.length);\n return transcript;\n } catch (err) {\n debug('getTranscript error: %O', err);\n return [];\n }\n });\n}\n","import chalk from 'chalk';\nimport { Command } from 'commander';\nimport { createGranolaDebug } from '../../lib/debug.js';\nimport { toMarkdown } from '../../lib/prosemirror.js';\nimport { toToon } from '../../lib/toon.js';\nimport * as meetings from '../../services/meetings.js';\n\nconst debug = createGranolaDebug('cmd:meeting:export');\n\ntype ExportFormat = 'json' | 'toon';\n\n/**\n * Creates the 'export' command for exporting complete meeting data.\n *\n * Exports meeting metadata, notes (as Markdown and raw), and transcript.\n * Supports JSON and TOON (token-optimized) output formats.\n *\n * @returns Commander command instance\n */\nexport function createExportCommand() {\n return new Command('export')\n .description('Export meeting data')\n .argument('<id>', 'Meeting ID')\n .option('-f, --format <format>', 'Output format (json, toon)', 'json')\n .action(async (id: string, options: { format: string }) => {\n debug('export command invoked with id: %s, format: %s', id, options.format);\n const format = options.format as ExportFormat;\n if (format !== 'json' && format !== 'toon') {\n console.error(chalk.red(`Invalid format: ${options.format}. Use 'json' or 'toon'.`));\n process.exit(1);\n }\n\n let fullId: string;\n try {\n const resolved = await meetings.resolveId(id);\n if (!resolved) {\n console.error(chalk.red(`Meeting ${id} not found`));\n process.exit(4);\n }\n fullId = resolved;\n } catch (err) {\n console.error(chalk.red((err as Error).message));\n process.exit(1);\n }\n\n const [meeting, notes, transcript] = await Promise.all([\n meetings.get(fullId),\n meetings.getNotes(fullId),\n meetings.getTranscript(fullId),\n ]);\n\n if (!meeting) {\n console.error(chalk.red(`Meeting ${id} not found`));\n process.exit(4);\n }\n\n const output = {\n id: meeting.id,\n title: meeting.title,\n created_at: meeting.created_at,\n updated_at: meeting.updated_at,\n workspace_id: meeting.workspace_id,\n people: meeting.people,\n notes_markdown: notes ? toMarkdown(notes) : null,\n notes_raw: notes,\n transcript,\n };\n\n if (format === 'toon') {\n console.log(toToon(output));\n } else {\n console.log(JSON.stringify(output, null, 2));\n }\n });\n}\n\nexport const exportCommand = createExportCommand();\n","import { encode } from '@toon-format/toon';\nimport type { ProseMirrorDoc, Utterance } from '../types.js';\n\nexport interface MeetingExport {\n id: string;\n title: string;\n created_at: string;\n updated_at: string;\n workspace_id?: string;\n notes_markdown: string | null;\n notes_raw: ProseMirrorDoc | null;\n transcript: Utterance[];\n}\n\nexport function toToon(data: MeetingExport): string {\n return encode(data);\n}\n","import chalk from 'chalk';\nimport { Command } from 'commander';\nimport { getConfigValue } from '../../lib/config.js';\nimport { validateDateOption } from '../../lib/date-parser.js';\nimport { createGranolaDebug } from '../../lib/debug.js';\nimport { formatDate, formatOutput, type OutputFormat, table, truncate } from '../../lib/output.js';\nimport * as meetings from '../../services/meetings.js';\n\nconst debug = createGranolaDebug('cmd:meeting:list');\n\n/**\n * Creates the 'list' command for displaying meetings.\n *\n * Lists meetings with optional filtering by workspace, folder, title search,\n * attendee, and date range. Supports pagination via --limit and -o/--output\n * for structured formats.\n *\n * @returns Commander command instance\n */\nexport function createListCommand() {\n return new Command('list')\n .description('List meetings')\n .option('-l, --limit <n>', 'Number of meetings', '20')\n .option('-w, --workspace <id>', 'Filter by workspace')\n .option('-f, --folder <id>', 'Filter by folder')\n .option('-s, --search <query>', 'Search in meeting titles')\n .option('-a, --attendee <name>', 'Filter by attendee name or email')\n .option('-d, --date <date>', 'Filter meetings on a specific date')\n .option('--since <date>', 'Filter meetings from date (inclusive)')\n .option('--until <date>', 'Filter meetings up to date (inclusive)')\n .option('-o, --output <format>', 'Output format (json, yaml, toon)')\n .action(async (opts) => {\n debug('list command invoked with opts: %O', opts);\n\n const limit = Number.parseInt(opts.limit, 10);\n if (!Number.isFinite(limit) || limit < 1) {\n console.error(chalk.red('Invalid --limit value. Please provide a positive number.'));\n process.exit(1);\n }\n\n const configuredWorkspace = getConfigValue('default_workspace');\n const workspace = opts.workspace ?? configuredWorkspace;\n\n // Parse date options\n let date: Date | undefined;\n let since: Date | undefined;\n let until: Date | undefined;\n\n try {\n if (opts.date) {\n date = validateDateOption(opts.date, '--date');\n }\n if (opts.since) {\n since = validateDateOption(opts.since, '--since');\n }\n if (opts.until) {\n until = validateDateOption(opts.until, '--until');\n }\n } catch (err) {\n console.error(chalk.red((err as Error).message));\n process.exit(1);\n }\n\n // Validate date range\n if (since && until && since > until) {\n console.error(chalk.red('--since date must be before --until date'));\n process.exit(1);\n }\n\n const data = await meetings.list({\n limit,\n workspace,\n folder: opts.folder,\n search: opts.search,\n attendee: opts.attendee,\n date,\n since,\n until,\n });\n debug('fetched %d meetings', data.length);\n\n // Handle structured output formats\n const format = opts.output || null;\n debug('output format: %s', format || 'table');\n if (format) {\n if (!['json', 'yaml', 'toon'].includes(format)) {\n console.error(chalk.red(`Invalid format: ${format}. Use 'json', 'yaml', or 'toon'.`));\n process.exit(1);\n }\n console.log(formatOutput(data, format as OutputFormat));\n return;\n }\n\n if (data.length === 0) {\n console.log(chalk.dim('No meetings found.'));\n return;\n }\n\n console.log(chalk.dim(`Showing ${data.length} meetings\\n`));\n\n const output = table(data, [\n { key: 'id', header: 'ID', width: 12, format: (v) => String(v).slice(0, 8) },\n { key: 'title', header: 'TITLE', width: 36, format: (v) => truncate(String(v), 35) },\n { key: 'created_at', header: 'DATE', width: 14, format: (v) => formatDate(String(v)) },\n ]);\n\n console.log(output);\n });\n}\n\nexport const listCommand = createListCommand();\n","import { createGranolaDebug } from './debug.js';\n\nconst debug = createGranolaDebug('lib:date-parser');\n\nconst MONTH_NAMES: Record<string, number> = {\n jan: 0,\n january: 0,\n feb: 1,\n february: 1,\n mar: 2,\n march: 2,\n apr: 3,\n april: 3,\n may: 4,\n jun: 5,\n june: 5,\n jul: 6,\n july: 6,\n aug: 7,\n august: 7,\n sep: 8,\n september: 8,\n oct: 9,\n october: 9,\n nov: 10,\n november: 10,\n dec: 11,\n december: 11,\n};\n\nfunction addDays(date: Date, days: number): Date {\n const result = new Date(date);\n result.setDate(result.getDate() + days);\n return result;\n}\n\nfunction addMonths(date: Date, months: number): Date {\n const result = new Date(date);\n result.setMonth(result.getMonth() + months);\n return result;\n}\n\nfunction startOfDay(date: Date): Date {\n const result = new Date(date);\n result.setHours(0, 0, 0, 0);\n return result;\n}\n\n/**\n * Parse a natural language date string into a Date object.\n *\n * Supports:\n * - Keywords: today, yesterday, tomorrow\n * - Relative: N days ago, N weeks ago, last week, last month\n * - ISO: YYYY-MM-DD, YYYY/MM/DD\n * - Simple: Dec 20, Dec 20 2024, 20 Dec 2024\n *\n * @param input - Natural language date string\n * @returns Parsed Date or null if unparseable\n */\nexport function parseDate(input: string): Date | null {\n const normalized = input.trim().toLowerCase();\n debug('parsing date: %s', normalized);\n\n // 1. Keywords\n if (normalized === 'today') {\n return startOfDay(new Date());\n }\n if (normalized === 'yesterday') {\n return startOfDay(addDays(new Date(), -1));\n }\n if (normalized === 'tomorrow') {\n return startOfDay(addDays(new Date(), 1));\n }\n\n // 2. \"last week\" / \"last month\"\n if (normalized === 'last week') {\n return startOfDay(addDays(new Date(), -7));\n }\n if (normalized === 'last month') {\n return startOfDay(addMonths(new Date(), -1));\n }\n\n // 3. \"N days ago\" / \"N weeks ago\" / \"N months ago\"\n const daysAgoMatch = normalized.match(/^(\\d+)\\s+days?\\s+ago$/);\n if (daysAgoMatch) {\n return startOfDay(addDays(new Date(), -Number.parseInt(daysAgoMatch[1], 10)));\n }\n\n const weeksAgoMatch = normalized.match(/^(\\d+)\\s+weeks?\\s+ago$/);\n if (weeksAgoMatch) {\n return startOfDay(addDays(new Date(), -Number.parseInt(weeksAgoMatch[1], 10) * 7));\n }\n\n const monthsAgoMatch = normalized.match(/^(\\d+)\\s+months?\\s+ago$/);\n if (monthsAgoMatch) {\n return startOfDay(addMonths(new Date(), -Number.parseInt(monthsAgoMatch[1], 10)));\n }\n\n // 4. ISO format: YYYY-MM-DD or YYYY/MM/DD\n const isoMatch = input.match(/^(\\d{4})[-/](\\d{1,2})[-/](\\d{1,2})$/);\n if (isoMatch) {\n const year = Number.parseInt(isoMatch[1], 10);\n const month = Number.parseInt(isoMatch[2], 10) - 1;\n const day = Number.parseInt(isoMatch[3], 10);\n const date = new Date(year, month, day);\n if (!Number.isNaN(date.getTime())) {\n return startOfDay(date);\n }\n }\n\n // 5. \"Dec 20\" or \"Dec 20 2024\" format\n const monthDayMatch = normalized.match(/^([a-z]+)\\s+(\\d{1,2})(?:\\s+(\\d{4}))?$/);\n if (monthDayMatch) {\n const monthNum = MONTH_NAMES[monthDayMatch[1]];\n if (monthNum !== undefined) {\n const day = Number.parseInt(monthDayMatch[2], 10);\n const year = monthDayMatch[3]\n ? Number.parseInt(monthDayMatch[3], 10)\n : new Date().getFullYear();\n const date = new Date(year, monthNum, day);\n if (!Number.isNaN(date.getTime())) {\n return startOfDay(date);\n }\n }\n }\n\n // 6. \"20 Dec\" or \"20 Dec 2024\" format\n const dayMonthMatch = normalized.match(/^(\\d{1,2})\\s+([a-z]+)(?:\\s+(\\d{4}))?$/);\n if (dayMonthMatch) {\n const monthNum = MONTH_NAMES[dayMonthMatch[2]];\n if (monthNum !== undefined) {\n const day = Number.parseInt(dayMonthMatch[1], 10);\n const year = dayMonthMatch[3]\n ? Number.parseInt(dayMonthMatch[3], 10)\n : new Date().getFullYear();\n const date = new Date(year, monthNum, day);\n if (!Number.isNaN(date.getTime())) {\n return startOfDay(date);\n }\n }\n }\n\n debug('failed to parse date: %s', input);\n return null;\n}\n\n/**\n * Validate that a date string can be parsed.\n * Returns the parsed Date or throws a descriptive error.\n *\n * @param value - Date string to parse\n * @param optionName - Name of the CLI option (for error messages)\n * @returns Parsed Date\n * @throws Error if the date cannot be parsed\n */\nexport function validateDateOption(value: string, optionName: string): Date {\n const parsed = parseDate(value);\n\n if (!parsed) {\n throw new Error(\n `Invalid date for ${optionName}: \"${value}\". ` +\n 'Try formats like: today, yesterday, last week, 2024-01-15, \"Dec 20\"',\n );\n }\n\n debug('validated %s: %s -> %s', optionName, value, parsed.toISOString());\n return parsed;\n}\n","import chalk from 'chalk';\nimport { Command } from 'commander';\nimport { createGranolaDebug } from '../../lib/debug.js';\nimport { formatOutput, type OutputFormat } from '../../lib/output.js';\nimport { pipeToPager } from '../../lib/pager.js';\nimport { toMarkdown } from '../../lib/prosemirror.js';\nimport * as meetings from '../../services/meetings.js';\nimport type { ProseMirrorDoc } from '../../types.js';\n\nconst debug = createGranolaDebug('cmd:meeting:notes');\n\n/**\n * Creates the 'notes' command for displaying meeting notes.\n *\n * Retrieves and renders meeting notes as Markdown.\n * Uses a pager for long output in interactive terminals.\n * Supports -o/--output for raw ProseMirror JSON output.\n *\n * @returns Commander command instance\n */\nexport function createNotesCommand() {\n return new Command('notes')\n .description('View meeting notes')\n .argument('<id>', 'Meeting ID')\n .option('-o, --output <format>', 'Output format (markdown, json, yaml, toon)', 'markdown')\n .action(async (id: string, opts, cmd) => {\n debug('notes command invoked with id: %s', id);\n const global = cmd.optsWithGlobals();\n\n let fullId: string;\n try {\n const resolved = await meetings.resolveId(id);\n if (!resolved) {\n console.error(chalk.red(`Meeting ${id} not found`));\n process.exit(4);\n }\n fullId = resolved;\n } catch (err) {\n console.error(chalk.red((err as Error).message));\n process.exit(1);\n }\n\n let notes: ProseMirrorDoc | null;\n try {\n notes = await meetings.getNotes(fullId);\n } catch (error) {\n debug('failed to load notes: %O', error);\n console.error(chalk.red('Error:'), 'Failed to fetch notes.');\n if (error instanceof Error) {\n console.error(chalk.dim(error.message));\n }\n process.exit(1);\n }\n\n if (!notes) {\n console.error(chalk.red(`No notes found for meeting ${id}`));\n process.exit(4);\n }\n\n const format = opts.output || 'markdown';\n const structuredFormats: OutputFormat[] = ['json', 'yaml', 'toon'];\n if (format !== 'markdown' && !structuredFormats.includes(format as OutputFormat)) {\n console.error(\n chalk.red(`Invalid format: ${format}. Use 'markdown', 'json', 'yaml', or 'toon'.`),\n );\n process.exit(1);\n }\n\n if (structuredFormats.includes(format as OutputFormat)) {\n console.log(formatOutput(notes, format as OutputFormat));\n return;\n }\n\n const md = toMarkdown(notes);\n\n if (global.noPager || !process.stdout.isTTY) {\n console.log(md);\n } else {\n await pipeToPager(md);\n }\n });\n}\n\nexport const notesCommand = createNotesCommand();\n","import chalk from 'chalk';\nimport { Command } from 'commander';\nimport { createGranolaDebug } from '../../lib/debug.js';\nimport { formatOutput, type OutputFormat } from '../../lib/output.js';\nimport { pipeToPager } from '../../lib/pager.js';\nimport { formatTranscript } from '../../lib/transcript.js';\nimport * as meetings from '../../services/meetings.js';\n\nconst debug = createGranolaDebug('cmd:meeting:transcript');\nconst SOURCE_OPTIONS = new Set(['microphone', 'system', 'all']);\n\n/**\n * Creates the 'transcript' command for displaying meeting transcripts.\n *\n * Retrieves and formats meeting transcripts with optional timestamps.\n * Supports filtering by audio source (microphone, system, or all).\n * Uses a pager for long output in interactive terminals.\n *\n * @returns Commander command instance\n */\nexport function createTranscriptCommand() {\n return new Command('transcript')\n .description('View meeting transcript')\n .argument('<id>', 'Meeting ID')\n .option('-t, --timestamps', 'Include timestamps')\n .option('-s, --source <type>', 'Filter: microphone, system, all', 'all')\n .option('-o, --output <format>', 'Output format (text, json, yaml, toon)', 'text')\n .action(async (id: string, opts, cmd) => {\n debug('transcript command invoked with id: %s, opts: %O', id, opts);\n const global = cmd.optsWithGlobals();\n\n let fullId: string;\n try {\n const resolved = await meetings.resolveId(id);\n if (!resolved) {\n console.error(chalk.red(`Meeting ${id} not found`));\n process.exit(4);\n }\n fullId = resolved;\n } catch (err) {\n console.error(chalk.red((err as Error).message));\n process.exit(1);\n }\n\n const transcript = await meetings.getTranscript(fullId);\n\n if (transcript.length === 0) {\n console.error(chalk.red(`No transcript found for meeting ${id}`));\n process.exit(4);\n }\n\n const requestedSource = opts.source || 'all';\n if (!SOURCE_OPTIONS.has(requestedSource)) {\n console.error(\n chalk.red(`Invalid source: ${requestedSource}. Use 'microphone', 'system', or 'all'.`),\n );\n process.exit(1);\n }\n\n const format = opts.output || 'text';\n const structuredFormats: OutputFormat[] = ['json', 'yaml', 'toon'];\n if (format !== 'text' && !structuredFormats.includes(format as OutputFormat)) {\n console.error(\n chalk.red(`Invalid format: ${format}. Use 'text', 'json', 'yaml', or 'toon'.`),\n );\n process.exit(1);\n }\n\n if (structuredFormats.includes(format as OutputFormat)) {\n console.log(formatOutput(transcript, format as OutputFormat));\n return;\n }\n\n const output = formatTranscript(transcript, {\n timestamps: opts.timestamps,\n source: requestedSource as 'microphone' | 'system' | 'all',\n });\n\n if (global.noPager || !process.stdout.isTTY) {\n console.log(output);\n } else {\n await pipeToPager(output);\n }\n });\n}\n\nexport const transcriptCommand = createTranscriptCommand();\n","import type { Utterance } from '../types.js';\nimport { createGranolaDebug } from './debug.js';\n\nconst debug = createGranolaDebug('lib:transcript');\n\ninterface FormatOptions {\n timestamps?: boolean;\n source?: 'microphone' | 'system' | 'all';\n}\n\nexport function formatTranscript(utterances: Utterance[], opts: FormatOptions = {}): string {\n debug('formatTranscript: %d utterances, opts=%O', utterances.length, opts);\n const { timestamps = false, source = 'all' } = opts;\n\n let filtered = utterances;\n if (source !== 'all') {\n filtered = utterances.filter((u) => u.source === source);\n debug('filtered to %d utterances (source=%s)', filtered.length, source);\n }\n\n if (filtered.length === 0) {\n debug('no transcript available');\n return 'No transcript available.';\n }\n\n const lines: string[] = [];\n\n for (const u of filtered) {\n const speaker = u.source === 'microphone' ? 'You' : 'Participant';\n\n if (timestamps) {\n const time = formatTimestamp(u.start_timestamp);\n lines.push(`[${time}] ${speaker}`);\n lines.push(u.text);\n lines.push('');\n } else {\n lines.push(`${speaker}: ${u.text}`);\n lines.push('');\n }\n }\n\n return lines.join('\\n').trim();\n}\n\nfunction formatTimestamp(iso: string): string {\n const d = new Date(iso);\n const h = d.getUTCHours().toString().padStart(2, '0');\n const m = d.getUTCMinutes().toString().padStart(2, '0');\n const s = d.getUTCSeconds().toString().padStart(2, '0');\n return `${h}:${m}:${s}`;\n}\n","import chalk from 'chalk';\nimport { Command } from 'commander';\nimport open from 'open';\nimport { createGranolaDebug } from '../../lib/debug.js';\nimport { formatDate, formatOutput, type OutputFormat } from '../../lib/output.js';\nimport * as meetings from '../../services/meetings.js';\n\nconst debug = createGranolaDebug('cmd:meeting:view');\n\n/**\n * Creates the 'view' command for displaying meeting details.\n *\n * Shows meeting metadata including title, date, and workspace.\n * Supports --web to open in browser and --format for structured output.\n *\n * @returns Commander command instance\n */\nexport function createViewCommand() {\n return new Command('view')\n .description('View meeting details')\n .argument('<id>', 'Meeting ID')\n .option('--web', 'Open in browser')\n .option('-o, --output <format>', 'Output format (json, yaml, toon)')\n .action(async (id: string, opts) => {\n debug('view command invoked with id: %s, opts: %O', id, opts);\n\n let fullId: string;\n try {\n const resolved = await meetings.resolveId(id);\n if (!resolved) {\n console.error(chalk.red(`Meeting ${id} not found`));\n process.exit(4);\n }\n fullId = resolved;\n } catch (err) {\n console.error(chalk.red((err as Error).message));\n process.exit(1);\n }\n\n if (opts.web) {\n await open(`https://notes.granola.ai/d/${fullId}`);\n return;\n }\n\n const meeting = await meetings.get(fullId);\n\n if (!meeting) {\n console.error(chalk.red(`Meeting ${id} not found`));\n process.exit(4);\n }\n\n // Handle structured output formats\n const format = opts.output || null;\n if (format) {\n if (!['json', 'yaml', 'toon'].includes(format)) {\n console.error(chalk.red(`Invalid format: ${format}. Use 'json', 'yaml', or 'toon'.`));\n process.exit(1);\n }\n console.log(formatOutput(meeting, format as OutputFormat));\n return;\n }\n\n // Human-readable output\n console.log(chalk.bold(meeting.title));\n console.log(chalk.dim(`Recorded ${formatDate(meeting.created_at)}`));\n console.log();\n console.log(`Workspace: ${meeting.workspace_id || 'Personal'}`);\n\n // Display participants\n if (meeting.creator?.name) {\n console.log(`Organizer: ${meeting.creator.name}`);\n }\n\n if (meeting.attendees?.length) {\n console.log(`Attendees: ${meeting.attendees.length} participant(s)`);\n for (const attendee of meeting.attendees) {\n const name = attendee.name || attendee.details?.person?.name?.fullName || 'Unknown';\n const title = attendee.details?.employment?.title;\n const info = title ? `${name} (${title})` : name;\n console.log(chalk.dim(` - ${info}`));\n }\n }\n\n console.log();\n console.log(`${chalk.dim('View notes: ')}granola meeting notes ${id}`);\n console.log(`${chalk.dim('View transcript: ')}granola meeting transcript ${id}`);\n });\n}\n\nexport const viewCommand = createViewCommand();\n","import { Command } from 'commander';\nimport { listCommand } from './list.js';\nimport { viewCommand } from './view.js';\n\nexport const workspaceCommand = new Command('workspace')\n .description('Work with workspaces')\n .addCommand(listCommand)\n .addCommand(viewCommand);\n","import chalk from 'chalk';\nimport { Command } from 'commander';\nimport { createGranolaDebug } from '../../lib/debug.js';\nimport { formatDate, formatOutput, type OutputFormat, table } from '../../lib/output.js';\nimport * as workspaces from '../../services/workspaces.js';\n\nconst debug = createGranolaDebug('cmd:workspace:list');\n\n/**\n * Creates the 'list' command for displaying workspaces.\n *\n * Lists all workspaces the user has access to.\n * Supports -o/--output for structured output.\n *\n * @returns Commander command instance\n */\nexport function createListCommand() {\n return new Command('list')\n .description('List workspaces')\n .option('-o, --output <format>', 'Output format (json, yaml, toon)')\n .action(async (opts) => {\n debug('workspace list command invoked');\n\n const data = await workspaces.list();\n debug('fetched %d workspaces', data.length);\n\n // Handle structured output formats\n const format = opts.output || null;\n if (format) {\n if (!['json', 'yaml', 'toon'].includes(format)) {\n console.error(chalk.red(`Invalid format: ${format}. Use 'json', 'yaml', or 'toon'.`));\n process.exit(1);\n }\n console.log(formatOutput(data, format as OutputFormat));\n return;\n }\n\n if (data.length === 0) {\n console.log(chalk.dim('No workspaces found.'));\n return;\n }\n\n const output = table(data, [\n { key: 'id', header: 'ID', width: 12, format: (v) => String(v).slice(0, 8) },\n { key: 'name', header: 'NAME', width: 20 },\n { key: 'created_at', header: 'CREATED', width: 14, format: (v) => formatDate(String(v)) },\n ]);\n\n console.log(output);\n });\n}\n\nexport const listCommand = createListCommand();\n","import { createGranolaDebug } from '../lib/debug.js';\nimport type { Workspace } from '../types.js';\nimport { getClient, withTokenRefresh } from './client.js';\n\nconst debug = createGranolaDebug('service:workspaces');\n\nexport async function list(): Promise<Workspace[]> {\n return withTokenRefresh(async () => {\n debug('fetching workspaces');\n const client = await getClient();\n const res = await client.getWorkspaces();\n\n const workspacesArray = res?.workspaces || [];\n debug('found %d workspaces', workspacesArray.length);\n return workspacesArray.map((item) => {\n const ws = item.workspace;\n return {\n id: ws.workspace_id,\n name: ws.display_name,\n created_at: ws.created_at,\n owner_id: '',\n } as Workspace;\n });\n });\n}\n\nexport async function resolveId(partialId: string): Promise<string | null> {\n debug('resolving workspace id: %s', partialId);\n const workspaces = await list();\n const matches = workspaces.filter((w) => w.id.startsWith(partialId));\n\n if (matches.length === 0) {\n debug('no workspace found for id: %s', partialId);\n return null;\n }\n if (matches.length > 1) {\n debug('ambiguous id: %s matches %d workspaces', partialId, matches.length);\n throw new Error(`Ambiguous ID: ${partialId} matches ${matches.length} workspaces`);\n }\n debug('resolved workspace: %s -> %s', partialId, matches[0].id);\n return matches[0].id;\n}\n\nexport async function get(id: string): Promise<Workspace | null> {\n debug('getting workspace: %s', id);\n const workspaces = await list();\n const workspace = workspaces.find((w) => w.id === id) || null;\n debug('workspace %s: %s', id, workspace ? 'found' : 'not found');\n return workspace;\n}\n","import chalk from 'chalk';\nimport { Command } from 'commander';\nimport { createGranolaDebug } from '../../lib/debug.js';\nimport { formatDate, formatOutput, type OutputFormat } from '../../lib/output.js';\nimport * as workspaces from '../../services/workspaces.js';\n\nconst debug = createGranolaDebug('cmd:workspace:view');\n\n/**\n * Creates the 'view' command for displaying workspace details.\n *\n * Shows workspace metadata including name and creation date.\n * Supports -o/--output for structured output.\n *\n * @returns Commander command instance\n */\nexport function createViewCommand() {\n return new Command('view')\n .description('View workspace details')\n .argument('<id>', 'Workspace ID')\n .option('-o, --output <format>', 'Output format (json, yaml, toon)')\n .action(async (id: string, opts) => {\n debug('workspace view command invoked with id: %s', id);\n\n let fullId: string;\n try {\n const resolved = await workspaces.resolveId(id);\n if (!resolved) {\n console.error(chalk.red(`Workspace ${id} not found`));\n process.exit(4);\n }\n fullId = resolved;\n } catch (err) {\n console.error(chalk.red((err as Error).message));\n process.exit(1);\n }\n\n const workspace = await workspaces.get(fullId);\n\n if (!workspace) {\n console.error(chalk.red(`Workspace ${id} not found`));\n process.exit(4);\n }\n\n // Handle structured output formats\n const format = opts.output || null;\n if (format) {\n if (!['json', 'yaml', 'toon'].includes(format)) {\n console.error(chalk.red(`Invalid format: ${format}. Use 'json', 'yaml', or 'toon'.`));\n process.exit(1);\n }\n console.log(formatOutput(workspace, format as OutputFormat));\n return;\n }\n\n console.log(chalk.bold(workspace.name));\n console.log(chalk.dim(`Created ${formatDate(workspace.created_at)}`));\n console.log();\n console.log(`View all meetings: granola meeting list --workspace ${id}`);\n });\n}\n\nexport const viewCommand = createViewCommand();\n","import chalk from 'chalk';\nimport { ApiError } from './http.js';\n\n/**\n * Handles global errors from CLI execution.\n * Returns the appropriate exit code.\n */\nexport function handleGlobalError(error: unknown): number {\n if (error instanceof ApiError) {\n if (error.status === 401) {\n console.error(chalk.red('Error:'), 'Authentication required.');\n console.error(`Run ${chalk.cyan('granola auth login')} to authenticate.`);\n return 2;\n }\n console.error(chalk.red('Error:'), error.message);\n return 1;\n }\n\n if (error instanceof Error && error.message.includes('fetch failed')) {\n console.error(chalk.red('Error:'), 'Network error. Check your connection.');\n return 1;\n }\n\n if (error instanceof Error) {\n console.error(chalk.red('Error:'), error.message || 'An unexpected error occurred.');\n } else {\n console.error(chalk.red('Error:'), 'An unexpected error occurred.');\n }\n return 1;\n}\n"],"mappings":"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","names":["readFileSync","Command","chalk","debug","debug","chalk","Command","chalk","Command","homedir","join","debug","debug","homedir","os","join","debug","Command","chalk","chalk","Command","debug","Command","chalk","chalk","Command","debug","Command","chalk","Command","chalk","Command","debug","Command","config","chalk","Command","chalk","Command","chalk","process","platform","debug","chalk","debug","client","debug","Command","chalk","chalk","Command","debug","Command","chalk","Command","Command","chalk","Command","debug","debug","debug","debug","client","list","meetings","client","debug","get","debug","Command","chalk","chalk","Command","debug","Command","chalk","get","chalk","Command","debug","startOfDay","debug","createListCommand","Command","chalk","list","listCommand","chalk","Command","debug","Command","chalk","chalk","Command","debug","debug","Command","chalk","chalk","Command","open","debug","createViewCommand","Command","chalk","open","get","viewCommand","Command","listCommand","viewCommand","Command","chalk","Command","debug","list","client","resolveId","get","debug","createListCommand","Command","list","chalk","listCommand","chalk","Command","debug","createViewCommand","Command","resolveId","chalk","get","viewCommand","Command","listCommand","viewCommand","chalk","chalk","debug","readFileSync","Command"]}
|