donebear 0.4.0 → 0.4.2

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/dist/cli.mjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.mjs","names":["yamlStringify","getOptionalSupabaseConfig","exports","RRule","fsConstants","UUID_REGEX"],"sources":["../src/output.ts","../src/commands/interactive.ts","../src/env.ts","../src/jwt.ts","../src/oauth-token.ts","../src/storage.ts","../src/supabase.ts","../src/auth-session.ts","../src/api/http.ts","../src/date-codecs.ts","../src/manage-api.ts","../src/command-context.ts","../src/options.ts","../src/runtime.ts","../src/commands/api-key.ts","../src/browser.ts","../src/command-parsers.ts","../src/oauth-callback.ts","../src/pkce.ts","../src/commands/auth.ts","../src/task-defaults.ts","../src/command-helpers.ts","../src/workspace-context.ts","../src/commands/context.ts","../src/manifest.ts","../src/commands/doctor.ts","../src/commands/history.ts","../src/import/things-output.ts","../src/import/things-labels.ts","../src/import/model-id.ts","../../../node_modules/rrule/dist/es5/rrule.js","../src/import/things-values.ts","../src/import/time-zone.ts","../src/import/things-recurrence.ts","../src/import/things-mapper.ts","../src/import/things-sqlite.ts","../src/import/things-runner.ts","../src/commands/import.ts","../src/commands/label.ts","../src/confirm.ts","../src/commands/project.ts","../src/commands/task.ts","../src/commands/search.ts","../src/commands/spec.ts","../src/commands/team.ts","../src/commands/today.ts","../src/commands/whoami.ts","../src/commands/workspace.ts","../src/program.ts","../src/cli.ts"],"sourcesContent":["import { execSync } from \"node:child_process\";\nimport { styleText } from \"node:util\";\n\nimport jmespath from \"jmespath\";\nimport { stringify as yamlStringify } from \"yaml\";\n\nimport { CliError, EXIT_CODES } from \"./errors\";\nimport type { CliContext } from \"./types\";\n\nconst writeLine = (stream: NodeJS.WriteStream, message: string): void => {\n stream.write(`${message}\\n`);\n};\n\nconst colorize = (\n context: CliContext,\n format: Parameters<typeof styleText>[0],\n message: string\n): string => {\n if (!context.color) {\n return message;\n }\n\n return styleText(format, message);\n};\n\n// ---------------------------------------------------------------------------\n// Primitive writers\n// ---------------------------------------------------------------------------\n\nexport const writeJson = (value: unknown): void => {\n writeLine(process.stdout, JSON.stringify(value, null, 2));\n};\n\nconst writeYaml = (value: unknown): void => {\n process.stdout.write(yamlStringify(value));\n};\n\nexport const writeInfo = (context: CliContext, message: string): void => {\n writeLine(process.stdout, colorize(context, \"cyan\", message));\n};\n\nexport const writeSuccess = (context: CliContext, message: string): void => {\n writeLine(process.stdout, colorize(context, \"green\", message));\n};\n\nexport const writeWarning = (context: CliContext, message: string): void => {\n writeLine(process.stderr, colorize(context, \"yellow\", message));\n};\n\nexport const writeError = (context: CliContext, message: string): void => {\n writeLine(process.stderr, colorize(context, \"red\", message));\n};\n\nexport const writeDebug = (context: CliContext, message: string): void => {\n if (!context.debug) {\n return;\n }\n\n writeLine(process.stderr, colorize(context, \"gray\", `[debug] ${message}`));\n};\n\nexport const writeTotal = (context: CliContext, count: number): void => {\n writeLine(process.stdout, colorize(context, \"cyan\", String(count)));\n};\n\n// ---------------------------------------------------------------------------\n// CSV / TSV\n// ---------------------------------------------------------------------------\n\nconst escapeCsvField = (value: string): string => {\n if (value.includes(\",\") || value.includes('\"') || value.includes(\"\\n\")) {\n return `\"${value.replaceAll('\"', '\"\"')}\"`;\n }\n return value;\n};\n\nexport const writeCsv = (headers: string[], rows: string[][]): void => {\n writeLine(process.stdout, headers.map(escapeCsvField).join(\",\"));\n for (const row of rows) {\n writeLine(process.stdout, row.map(escapeCsvField).join(\",\"));\n }\n};\n\nexport const writeTsv = (headers: string[], rows: string[][]): void => {\n writeLine(process.stdout, headers.join(\"\\t\"));\n for (const row of rows) {\n writeLine(process.stdout, row.join(\"\\t\"));\n }\n};\n\n// ---------------------------------------------------------------------------\n// Universal structured output (applies --jq, --limit, then format)\n// ---------------------------------------------------------------------------\n\n/**\n * Write structured data to stdout, applying --jq filter and --limit if set.\n * Use this for all JSON/YAML/structured output from commands.\n */\nexport const writeOutput = (context: CliContext, data: unknown): void => {\n let result = data;\n\n // Apply JMESPath filtering\n if (context.jq) {\n try {\n result = jmespath.search(result, context.jq);\n } catch (error) {\n throw new CliError(\n `Invalid --jq expression: ${error instanceof Error ? error.message : String(error)}`,\n EXIT_CODES.VALIDATION\n );\n }\n }\n\n // Apply limit\n if (context.limit !== null && Array.isArray(result)) {\n result = result.slice(0, context.limit);\n }\n\n // Format output\n switch (context.format) {\n case \"yaml\": {\n writeYaml(result);\n break;\n }\n case \"json\": {\n writeJson(result);\n break;\n }\n default: {\n // --jq implies structured output; fall through to JSON\n writeJson(result);\n break;\n }\n }\n\n if (context.copy) {\n copyToClipboard(JSON.stringify(result, null, 2));\n }\n};\n\n// ---------------------------------------------------------------------------\n// Tabular output (--total, --format csv/tsv/yaml, --copy)\n// ---------------------------------------------------------------------------\n\n/**\n * Handles --total, --format csv, --format tsv, --format yaml output.\n * Returns true if the format was handled; caller renders text mode if false.\n */\nexport const writeFormattedRows = (\n context: CliContext,\n totalCount: number,\n headers: string[],\n rows: string[][]\n): boolean => {\n if (context.total) {\n writeTotal(context, totalCount);\n return true;\n }\n\n if (context.format === \"yaml\") {\n const objects = rows.map((row) =>\n Object.fromEntries(headers.map((h, i) => [h, row[i]]))\n );\n writeYaml(objects);\n if (context.copy) {\n copyToClipboard(yamlStringify(objects));\n }\n return true;\n }\n\n if (context.format === \"csv\") {\n writeCsv(headers, rows);\n if (context.copy) {\n copyToClipboard(\n [headers.join(\",\"), ...rows.map((r) => r.join(\",\"))].join(\"\\n\")\n );\n }\n return true;\n }\n\n if (context.format === \"tsv\") {\n writeTsv(headers, rows);\n if (context.copy) {\n copyToClipboard(\n [headers.join(\"\\t\"), ...rows.map((r) => r.join(\"\\t\"))].join(\"\\n\")\n );\n }\n return true;\n }\n\n return false;\n};\n\n// ---------------------------------------------------------------------------\n// Clipboard\n// ---------------------------------------------------------------------------\n\nexport const copyToClipboard = (text: string): boolean => {\n try {\n if (process.platform === \"darwin\") {\n execSync(\"pbcopy\", { input: text });\n } else if (process.platform === \"win32\") {\n execSync(\"clip\", { input: text });\n } else {\n try {\n execSync(\"xclip -selection clipboard\", { input: text });\n } catch {\n execSync(\"xsel --clipboard --input\", { input: text });\n }\n }\n return true;\n } catch {\n return false;\n }\n};\n","import { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { createInterface } from \"node:readline\";\n\nimport type { Command } from \"commander\";\n\nimport { CONFIG_DIR } from \"../constants\";\nimport { writeInfo, writeSuccess } from \"../output\";\nimport type { CliContext } from \"../types\";\n\nconst HISTORY_FILE = join(CONFIG_DIR, \"history.json\");\nconst MAX_HISTORY = 200;\n\ninterface HistoryFile {\n version: 1;\n entries: string[];\n}\n\nconst isHistoryFile = (value: unknown): value is HistoryFile => {\n if (typeof value !== \"object\" || value === null) {\n return false;\n }\n\n const record = value as Record<string, unknown>;\n\n return (\n record.version === 1 &&\n Array.isArray(record.entries) &&\n record.entries.every((e) => typeof e === \"string\")\n );\n};\n\nconst loadHistory = async (historyFile: string): Promise<string[]> => {\n try {\n const raw = await readFile(historyFile, \"utf-8\");\n const parsed: unknown = JSON.parse(raw);\n\n if (isHistoryFile(parsed)) {\n return parsed.entries;\n }\n\n return [];\n } catch {\n return [];\n }\n};\n\nconst tokenize = (input: string): string[] => {\n const tokens: string[] = [];\n let current = \"\";\n let inQuote = false;\n let quoteChar = \"\";\n\n for (const char of input) {\n if (inQuote) {\n if (char === quoteChar) {\n inQuote = false;\n } else {\n current += char;\n }\n } else if (char === '\"' || char === \"'\") {\n inQuote = true;\n quoteChar = char;\n } else if (char === \" \") {\n if (current.length > 0) {\n tokens.push(current);\n current = \"\";\n }\n } else {\n current += char;\n }\n }\n\n if (current.length > 0) {\n tokens.push(current);\n }\n\n return tokens;\n};\n\nconst buildCompleter =\n (program: Command) =>\n (line: string): [string[], string] => {\n const allCommands = program.commands.flatMap((cmd) => [\n cmd.name(),\n ...cmd.aliases(),\n ]);\n const hits = allCommands.filter((c) => c.startsWith(line));\n return [hits.length > 0 ? hits : allCommands, line];\n };\n\nexport const runInteractiveMode = async (\n context: CliContext,\n program: Command\n): Promise<void> => {\n const history = await loadHistory(HISTORY_FILE);\n\n const rl = createInterface({\n completer: buildCompleter(program),\n historySize: MAX_HISTORY,\n input: process.stdin,\n output: process.stdout,\n prompt: \"donebear> \",\n });\n\n // Pre-populate readline history (reversed — readline stores newest first)\n for (const entry of [...history].toReversed()) {\n // The history property exists on readline.Interface internals\n (rl as unknown as { history: string[] }).history.push(entry);\n }\n\n writeSuccess(\n context,\n 'Done Bear interactive mode. Type \"exit\" or Ctrl+D to quit.'\n );\n writeInfo(\n context,\n \"Commands: task, workspace, project, label, team, today, search, auth, whoami\"\n );\n\n rl.prompt();\n\n const sessionEntries: string[] = [];\n\n for await (const line of rl) {\n const trimmed = line.trim();\n\n if (!trimmed) {\n rl.prompt();\n continue;\n }\n\n if (trimmed === \"exit\" || trimmed === \"quit\" || trimmed === \":q\") {\n break;\n }\n\n const tokens = tokenize(trimmed);\n\n try {\n await program.parseAsync([\"node\", \"donebear\", ...tokens]);\n } catch {\n // Errors are already handled by runWithErrorHandling inside each command\n }\n\n sessionEntries.push(trimmed);\n rl.prompt();\n }\n\n rl.close();\n\n // Persist session history on exit\n if (sessionEntries.length > 0) {\n try {\n const existing = await loadHistory(HISTORY_FILE);\n const updated = [...existing, ...sessionEntries].slice(-MAX_HISTORY);\n const payload: HistoryFile = { entries: updated, version: 1 };\n await mkdir(CONFIG_DIR, { mode: 0o700, recursive: true });\n await writeFile(HISTORY_FILE, `${JSON.stringify(payload, null, 2)}\\n`, {\n encoding: \"utf-8\",\n mode: 0o600,\n });\n } catch {\n // Ignore history write errors — not critical\n }\n }\n};\n","import { existsSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\n\nimport { config as loadDotEnvFile } from \"dotenv\";\n\nconst DEFAULT_ENV_FILES = [\n \".env.local\",\n \".env\",\n \"apps/manage-frontend/.env.local\",\n \"apps/manage-api/.env\",\n] as const;\n\nlet loaded = false;\n\nexport const loadCliEnvironmentFiles = (): void => {\n if (loaded) {\n return;\n }\n\n for (const relativePath of DEFAULT_ENV_FILES) {\n const absolutePath = resolve(process.cwd(), relativePath);\n\n if (!existsSync(absolutePath)) {\n continue;\n }\n\n loadDotEnvFile({\n override: false,\n path: absolutePath,\n quiet: true,\n });\n }\n\n loaded = true;\n};\n\nexport const readEnvValue = (key: string): string | undefined => {\n const value = process.env[key];\n\n if (typeof value !== \"string\") {\n return undefined;\n }\n\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n};\n","export interface JwtClaims {\n exp?: number;\n email?: string;\n sub?: string;\n}\n\nconst parseJwtBase64Url = (input: string): string => {\n const normalized = input.replaceAll(\"-\", \"+\").replaceAll(\"_\", \"/\");\n const padded = normalized.padEnd(Math.ceil(normalized.length / 4) * 4, \"=\");\n return Buffer.from(padded, \"base64\").toString(\"utf-8\");\n};\n\nexport const parseJwtClaims = (token: string): JwtClaims | null => {\n const parts = token.split(\".\");\n const payloadPart = parts.at(1);\n\n if (!payloadPart) {\n return null;\n }\n\n try {\n const payload = parseJwtBase64Url(payloadPart);\n const parsed = JSON.parse(payload) as unknown;\n\n if (typeof parsed !== \"object\" || parsed === null) {\n return null;\n }\n\n const claims = parsed as Record<string, unknown>;\n\n return {\n email: typeof claims.email === \"string\" ? claims.email : undefined,\n exp: typeof claims.exp === \"number\" ? claims.exp : undefined,\n sub: typeof claims.sub === \"string\" ? claims.sub : undefined,\n };\n } catch {\n return null;\n }\n};\n","import { CliError, EXIT_CODES } from \"./errors\";\n\nexport interface OAuthTokenConfig {\n tokenUrl: string;\n clientId: string;\n}\n\nexport interface OAuthTokenResponse {\n access_token: string;\n refresh_token?: string;\n token_type: string;\n expires_in: number;\n}\n\nconst postTokenRequest = async (\n url: string,\n body: URLSearchParams\n): Promise<OAuthTokenResponse> => {\n const response = await fetch(url, {\n body: body.toString(),\n headers: { \"content-type\": \"application/x-www-form-urlencoded\" },\n method: \"POST\",\n });\n\n if (!response.ok) {\n const text = await response.text().catch(() => \"\");\n throw new CliError(\n `OAuth token request failed (${response.status}): ${text}`,\n EXIT_CODES.AUTH_REQUIRED\n );\n }\n\n return (await response.json()) as OAuthTokenResponse;\n};\n\nexport const exchangeAuthorizationCode = (\n config: OAuthTokenConfig,\n code: string,\n codeVerifier: string,\n redirectUri: string\n): Promise<OAuthTokenResponse> => {\n const body = new URLSearchParams({\n client_id: config.clientId,\n code,\n code_verifier: codeVerifier,\n grant_type: \"authorization_code\",\n redirect_uri: redirectUri,\n });\n\n return postTokenRequest(config.tokenUrl, body);\n};\n\nexport const refreshAccessToken = (\n config: OAuthTokenConfig,\n refreshToken: string\n): Promise<OAuthTokenResponse> => {\n const body = new URLSearchParams({\n client_id: config.clientId,\n grant_type: \"refresh_token\",\n refresh_token: refreshToken,\n });\n\n return postTokenRequest(config.tokenUrl, body);\n};\n","import { mkdir, readFile, rm, writeFile } from \"node:fs/promises\";\n\nimport { AUTH_FILE_PATH, CONFIG_DIR } from \"./constants\";\nimport { CliError, EXIT_CODES } from \"./errors\";\nimport type { AuthFileData, OAuthProvider, StoredAuthSession } from \"./types\";\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null;\n\nconst isOAuthProvider = (value: unknown): value is OAuthProvider =>\n value === \"google\" || value === \"github\" || value === \"oauth2\";\n\nconst parseStoredAuthSession = (value: unknown): StoredAuthSession | null => {\n if (!isRecord(value)) {\n return null;\n }\n\n if (typeof value.accessToken !== \"string\") {\n return null;\n }\n\n if (value.refreshToken !== null && typeof value.refreshToken !== \"string\") {\n return null;\n }\n\n if (value.tokenType !== null && typeof value.tokenType !== \"string\") {\n return null;\n }\n\n if (value.expiresAt !== null && typeof value.expiresAt !== \"string\") {\n return null;\n }\n\n if (!isOAuthProvider(value.provider)) {\n return null;\n }\n\n const { user } = value;\n if (\n user !== null &&\n (!isRecord(user) ||\n typeof user.id !== \"string\" ||\n (user.email !== null && typeof user.email !== \"string\"))\n ) {\n return null;\n }\n\n if (typeof value.createdAt !== \"string\") {\n return null;\n }\n\n const parsedUser =\n user === null\n ? null\n : {\n email: (user.email as string | null) ?? null,\n id: user.id as string,\n };\n\n return {\n accessToken: value.accessToken,\n createdAt: value.createdAt,\n expiresAt: value.expiresAt,\n provider: value.provider,\n refreshToken: value.refreshToken,\n tokenType: value.tokenType,\n user: parsedUser,\n };\n};\n\nconst parseAuthFile = (payload: string): AuthFileData => {\n const parsed = JSON.parse(payload) as unknown;\n\n if (!isRecord(parsed) || parsed.version !== 1) {\n throw new CliError(\n `Invalid auth cache format in ${AUTH_FILE_PATH}`,\n EXIT_CODES.ERROR\n );\n }\n\n const session = parseStoredAuthSession(parsed.session);\n\n if (!session) {\n throw new CliError(\n `Invalid auth session in ${AUTH_FILE_PATH}`,\n EXIT_CODES.ERROR\n );\n }\n\n return {\n session,\n version: 1,\n };\n};\n\nexport const readStoredAuthSession =\n async (): Promise<StoredAuthSession | null> => {\n try {\n const raw = await readFile(AUTH_FILE_PATH, \"utf-8\");\n const parsed = parseAuthFile(raw);\n return parsed.session;\n } catch (error) {\n if (isRecord(error) && error.code === \"ENOENT\") {\n return null;\n }\n\n if (error instanceof CliError) {\n throw error;\n }\n\n throw new CliError(\n `Failed to read credentials from ${AUTH_FILE_PATH}`,\n EXIT_CODES.ERROR\n );\n }\n };\n\nexport const writeStoredAuthSession = async (\n session: StoredAuthSession\n): Promise<void> => {\n const payload: AuthFileData = {\n session,\n version: 1,\n };\n\n await mkdir(CONFIG_DIR, {\n mode: 0o700,\n recursive: true,\n });\n\n await writeFile(AUTH_FILE_PATH, `${JSON.stringify(payload, null, 2)}\\n`, {\n encoding: \"utf-8\",\n mode: 0o600,\n });\n};\n\nexport const clearStoredAuthSession = async (): Promise<void> => {\n await rm(AUTH_FILE_PATH, {\n force: true,\n });\n};\n","import {\n CLI_OAUTH_CLIENT_ID,\n DEFAULT_SUPABASE_PUBLISHABLE_KEY,\n DEFAULT_SUPABASE_URL,\n DONEBEAR_OAUTH_CLIENT_ID_ENV,\n DONEBEAR_SUPABASE_KEY_ENV,\n DONEBEAR_SUPABASE_URL_ENV,\n} from \"./constants\";\nimport { readEnvValue } from \"./env\";\nimport { CliError, EXIT_CODES } from \"./errors\";\nimport { parseJwtClaims } from \"./jwt\";\nimport type { OAuthTokenResponse } from \"./oauth-token\";\nimport type { StoredAuthSession, SupabaseConfig } from \"./types\";\n\nexport const resolveSupabaseConfig = (): SupabaseConfig => {\n const url = readEnvValue(DONEBEAR_SUPABASE_URL_ENV) ?? DEFAULT_SUPABASE_URL;\n\n const publishableKey =\n readEnvValue(DONEBEAR_SUPABASE_KEY_ENV) ?? DEFAULT_SUPABASE_PUBLISHABLE_KEY;\n\n return {\n publishableKey,\n url,\n };\n};\n\nexport const buildOAuthUrls = (\n config: SupabaseConfig\n): {\n authorizeUrl: string;\n tokenUrl: string;\n} => ({\n authorizeUrl: `${config.url}/auth/v1/oauth/authorize`,\n tokenUrl: `${config.url}/auth/v1/oauth/token`,\n});\n\nexport const resolveOAuthClientId = (): string =>\n readEnvValue(DONEBEAR_OAUTH_CLIENT_ID_ENV) ?? CLI_OAUTH_CLIENT_ID;\n\nexport const tokenResponseToStoredSession = (\n response: OAuthTokenResponse\n): StoredAuthSession => {\n const claims = parseJwtClaims(response.access_token);\n\n let expiresAt: string | null = null;\n if (typeof claims?.exp === \"number\") {\n expiresAt = new Date(claims.exp * 1000).toISOString();\n } else if (response.expires_in > 0) {\n expiresAt = new Date(Date.now() + response.expires_in * 1000).toISOString();\n }\n\n return {\n accessToken: response.access_token,\n createdAt: new Date().toISOString(),\n expiresAt,\n provider: \"oauth2\",\n refreshToken: response.refresh_token ?? null,\n tokenType: response.token_type ?? null,\n user:\n claims?.sub || claims?.email\n ? {\n email: claims.email ?? null,\n id: claims.sub ?? \"unknown\",\n }\n : null,\n };\n};\n\ninterface SupabaseUser {\n id: string;\n email: string | null;\n}\n\nexport const getSupabaseUser = async (\n supabaseUrl: string,\n publishableKey: string,\n accessToken: string\n): Promise<SupabaseUser> => {\n const response = await fetch(`${supabaseUrl}/auth/v1/user`, {\n headers: {\n apikey: publishableKey,\n authorization: `Bearer ${accessToken}`,\n },\n });\n\n if (!response.ok) {\n throw new CliError(\n `Failed to load user (${response.status})`,\n EXIT_CODES.ERROR\n );\n }\n\n const data = (await response.json()) as Record<string, unknown>;\n\n if (typeof data.id !== \"string\") {\n throw new CliError(\"No user returned for current token\", EXIT_CODES.ERROR);\n }\n\n return {\n email: typeof data.email === \"string\" ? data.email : null,\n id: data.id,\n };\n};\n","import { DONEBEAR_TOKEN_ENV } from \"./constants\";\nimport { parseJwtClaims } from \"./jwt\";\nimport type { JwtClaims } from \"./jwt\";\nimport { refreshAccessToken } from \"./oauth-token\";\nimport {\n clearStoredAuthSession,\n readStoredAuthSession,\n writeStoredAuthSession,\n} from \"./storage\";\nimport {\n buildOAuthUrls,\n resolveOAuthClientId,\n tokenResponseToStoredSession,\n} from \"./supabase\";\nimport type {\n CliContext,\n ResolvedAuthToken,\n StoredAuthSession,\n SupabaseConfig,\n} from \"./types\";\n\nconst expiryFromClaims = (claims: JwtClaims | null): string | null => {\n if (!claims || typeof claims.exp !== \"number\") {\n return null;\n }\n\n return new Date(claims.exp * 1000).toISOString();\n};\n\nconst userFromClaims = (\n claims: JwtClaims | null\n): ResolvedAuthToken[\"user\"] => {\n if (!(claims?.sub || claims?.email)) {\n return null;\n }\n\n return {\n email: claims.email ?? null,\n id: claims.sub ?? \"unknown\",\n };\n};\n\nconst nowUnixSeconds = (): number => Math.floor(Date.now() / 1000);\n\nconst isExpired = (session: StoredAuthSession): boolean => {\n if (!session.expiresAt) {\n return false;\n }\n\n const expiresAtMs = Date.parse(session.expiresAt);\n\n if (Number.isNaN(expiresAtMs)) {\n return false;\n }\n\n return expiresAtMs <= Date.now();\n};\n\nconst shouldRefresh = (session: StoredAuthSession): boolean => {\n if (!session.expiresAt) {\n return false;\n }\n\n const expiresAtMs = Date.parse(session.expiresAt);\n\n if (Number.isNaN(expiresAtMs)) {\n return false;\n }\n\n return expiresAtMs - Date.now() <= 60_000;\n};\n\nconst tokenFromRaw = (\n token: string,\n source: ResolvedAuthToken[\"source\"]\n): ResolvedAuthToken => {\n const claims = parseJwtClaims(token);\n\n return {\n expiresAt: expiryFromClaims(claims),\n source,\n token,\n user: userFromClaims(claims),\n };\n};\n\nexport const resolveAuthToken = async (\n context: CliContext,\n config: SupabaseConfig | null\n): Promise<ResolvedAuthToken | null> => {\n if (context.tokenOverride) {\n return tokenFromRaw(context.tokenOverride, \"flag\");\n }\n\n const envToken = process.env[DONEBEAR_TOKEN_ENV]?.trim();\n\n if (envToken) {\n return tokenFromRaw(envToken, \"environment\");\n }\n\n const session = await readStoredAuthSession();\n\n if (!session) {\n return null;\n }\n\n if (!(shouldRefresh(session) || isExpired(session))) {\n return {\n expiresAt: session.expiresAt,\n source: \"stored\",\n token: session.accessToken,\n user: session.user,\n };\n }\n\n if (!(session.refreshToken && config)) {\n if (isExpired(session)) {\n await clearStoredAuthSession();\n return null;\n }\n\n return {\n expiresAt: session.expiresAt,\n source: \"stored\",\n token: session.accessToken,\n user: session.user,\n };\n }\n\n const { tokenUrl } = buildOAuthUrls(config);\n const clientId = resolveOAuthClientId();\n const tokenResponse = await refreshAccessToken(\n { clientId, tokenUrl },\n session.refreshToken\n );\n const updatedSession = tokenResponseToStoredSession(tokenResponse);\n await writeStoredAuthSession(updatedSession);\n\n return {\n expiresAt: updatedSession.expiresAt,\n source: \"stored\",\n token: updatedSession.accessToken,\n user: updatedSession.user,\n };\n};\n\nexport const resolveTokenStatus = (\n token: ResolvedAuthToken\n): {\n expiresInSeconds: number | null;\n expired: boolean;\n} => {\n const claims = parseJwtClaims(token.token);\n\n if (!claims?.exp) {\n return {\n expired: false,\n expiresInSeconds: null,\n };\n }\n\n const expiresInSeconds = claims.exp - nowUnixSeconds();\n\n return {\n expired: expiresInSeconds <= 0,\n expiresInSeconds,\n };\n};\n","import { CliError, EXIT_CODES } from \"../errors\";\nimport type { CliContext } from \"../types\";\n\nconst extractErrorMessage = (value: unknown): string => {\n if (typeof value === \"string\") {\n return value;\n }\n if (typeof value !== \"object\" || value === null) {\n return \"Request failed\";\n }\n const record = value as Record<string, unknown>;\n if (typeof record.message === \"string\") {\n return record.message;\n }\n if (typeof record.error === \"string\") {\n return record.error;\n }\n return \"Request failed\";\n};\n\nconst apiRequest = async (\n _context: CliContext,\n endpoint: string,\n options: {\n method?: \"GET\" | \"POST\" | \"DELETE\";\n token: string;\n body?: unknown;\n }\n): Promise<Response> => {\n const headers = new Headers({\n Accept: \"application/json\",\n Authorization: `Bearer ${options.token}`,\n });\n\n if (options.body !== undefined) {\n headers.set(\"Content-Type\", \"application/json\");\n }\n\n const response = await fetch(endpoint, {\n body: options.body === undefined ? undefined : JSON.stringify(options.body),\n headers,\n method: options.method ?? \"GET\",\n });\n\n if (response.ok) {\n return response;\n }\n\n const raw = await response.text();\n let parsed: unknown = null;\n\n try {\n parsed = raw.length > 0 ? (JSON.parse(raw) as unknown) : null;\n } catch {\n parsed = null;\n }\n\n let message = `HTTP ${response.status}`;\n\n if (parsed !== null) {\n message = extractErrorMessage(parsed);\n } else if (raw.length > 0) {\n message = raw;\n }\n\n const exitCode =\n response.status === 401 || response.status === 403\n ? EXIT_CODES.AUTH_REQUIRED\n : EXIT_CODES.ERROR;\n\n throw new CliError(message, exitCode);\n};\n\nexport const requestJson = async <T>(\n context: CliContext,\n endpoint: string,\n options: {\n method?: \"GET\" | \"POST\" | \"DELETE\";\n token: string;\n body?: unknown;\n }\n): Promise<T> => {\n const response = await apiRequest(context, endpoint, options);\n return (await response.json()) as T;\n};\n\nexport const requestNdjson = async (\n context: CliContext,\n endpoint: string,\n options: {\n method?: \"GET\" | \"POST\";\n token: string;\n body?: unknown;\n }\n): Promise<unknown[]> => {\n const response = await apiRequest(context, endpoint, {\n body: options.body,\n method: options.method ?? (options.body === undefined ? \"GET\" : \"POST\"),\n token: options.token,\n });\n\n const raw = await response.text();\n const lines = raw\n .split(\"\\n\")\n .map((line) => line.trim())\n .filter((line) => line.length > 0);\n\n const parsed: unknown[] = [];\n\n for (const line of lines) {\n parsed.push(JSON.parse(line) as unknown);\n }\n\n return parsed;\n};\n","export interface DateOnlyParts {\n year: number;\n month: number;\n day: number;\n}\n\nconst ISO_DATE_ONLY_REGEX = /^(\\d{4})-(\\d{2})-(\\d{2})$/u;\nconst ISO_INSTANT_REGEX =\n /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d{1,9})?(?:Z|[+-]\\d{2}:\\d{2})$/u;\n\nconst pad = (value: number, length = 2): string =>\n String(value).padStart(length, \"0\");\n\nconst isFiniteEpoch = (value: number | null): value is number =>\n typeof value === \"number\" && Number.isFinite(value);\n\nexport const isValidDateOnlyParts = (parts: DateOnlyParts): boolean => {\n if (\n !(\n Number.isInteger(parts.year) &&\n Number.isInteger(parts.month) &&\n Number.isInteger(parts.day)\n )\n ) {\n return false;\n }\n\n if (\n parts.year < 1 ||\n parts.month < 1 ||\n parts.month > 12 ||\n parts.day < 1 ||\n parts.day > 31\n ) {\n return false;\n }\n\n const candidate = new Date(Date.UTC(parts.year, parts.month - 1, parts.day));\n\n return (\n candidate.getUTCFullYear() === parts.year &&\n candidate.getUTCMonth() === parts.month - 1 &&\n candidate.getUTCDate() === parts.day\n );\n};\n\nexport const dateOnlyPartsToEpoch = (parts: DateOnlyParts): number | null => {\n if (!isValidDateOnlyParts(parts)) {\n return null;\n }\n\n return Date.UTC(parts.year, parts.month - 1, parts.day);\n};\n\nexport const epochToDateOnlyParts = (\n epochMs: number | null\n): DateOnlyParts | null => {\n if (!isFiniteEpoch(epochMs)) {\n return null;\n }\n\n const date = new Date(epochMs);\n\n if (Number.isNaN(date.getTime())) {\n return null;\n }\n\n return {\n day: date.getUTCDate(),\n month: date.getUTCMonth() + 1,\n year: date.getUTCFullYear(),\n };\n};\n\nexport const formatDateOnlyParts = (parts: DateOnlyParts): string | null => {\n if (!isValidDateOnlyParts(parts)) {\n return null;\n }\n\n return `${pad(parts.year, 4)}-${pad(parts.month)}-${pad(parts.day)}`;\n};\n\nexport const formatDateOnlyEpoch = (epochMs: number | null): string | null => {\n const parts = epochToDateOnlyParts(epochMs);\n return parts ? formatDateOnlyParts(parts) : null;\n};\n\nexport const formatInstantEpoch = (epochMs: number | null): string | null => {\n if (!isFiniteEpoch(epochMs)) {\n return null;\n }\n\n const date = new Date(epochMs);\n\n if (Number.isNaN(date.getTime())) {\n return null;\n }\n\n return date.toISOString();\n};\n\nconst parseDateOnlyString = (value: string | null): DateOnlyParts | null => {\n if (typeof value !== \"string\") {\n return null;\n }\n\n const trimmed = value.trim();\n const match = ISO_DATE_ONLY_REGEX.exec(trimmed);\n\n if (!match) {\n return null;\n }\n\n const year = Number.parseInt(match[1] ?? \"\", 10);\n const month = Number.parseInt(match[2] ?? \"\", 10);\n const day = Number.parseInt(match[3] ?? \"\", 10);\n const parts = { day, month, year };\n\n return isValidDateOnlyParts(parts) ? parts : null;\n};\n\nexport const parseApiDateOnlyToEpoch = (\n value: string | null\n): number | null => {\n const parts = parseDateOnlyString(value);\n return parts ? dateOnlyPartsToEpoch(parts) : null;\n};\n\nexport const parseApiInstantToEpoch = (value: string | null): number | null => {\n if (typeof value !== \"string\") {\n return null;\n }\n\n const trimmed = value.trim();\n\n if (trimmed.length === 0 || !ISO_INSTANT_REGEX.test(trimmed)) {\n return null;\n }\n\n const parsed = Date.parse(trimmed);\n return Number.isNaN(parsed) ? null : parsed;\n};\n\nexport const parseCliDateOnlyToEpoch = (\n value: string | undefined,\n fieldLabel: string\n): number | null => {\n if (!value) {\n return null;\n }\n\n const parts = parseDateOnlyString(value);\n\n if (!parts) {\n throw new Error(`Invalid ${fieldLabel}: ${value}. Expected YYYY-MM-DD.`);\n }\n\n return dateOnlyPartsToEpoch(parts);\n};\n\nexport const dateOnlyEpochFromLocalDate = (now = new Date()): number =>\n Date.UTC(now.getFullYear(), now.getMonth(), now.getDate());\n","import { requestJson, requestNdjson } from \"./api/http\";\nimport { DEFAULT_API_URL, DONEBEAR_API_URL_ENV } from \"./constants\";\nimport { parseApiDateOnlyToEpoch, parseApiInstantToEpoch } from \"./date-codecs\";\nimport { readEnvValue } from \"./env\";\nimport { CliError, EXIT_CODES } from \"./errors\";\nimport { writeOutput, writeWarning } from \"./output\";\nimport type {\n ChecklistItemRecord,\n CliContext,\n LabelRecord,\n ProjectRecord,\n TaskRecord,\n TeamRecord,\n WorkspaceInvitationRecord,\n WorkspaceJoinResult,\n WorkspaceMemberRecord,\n WorkspaceRecord,\n WorkspaceSummary,\n} from \"./types\";\n\ninterface CreateWorkspaceRequest {\n name: string;\n urlKey: string;\n logoUrl?: string;\n}\n\ninterface SyncBatchRequest {\n requests: {\n modelName: string;\n indexedKey: string;\n keyValue: string;\n }[];\n}\n\ninterface SyncMutateResponse {\n success: boolean;\n lastSyncId: string;\n results: {\n clientTxId: string;\n success: boolean;\n syncId?: string;\n error?: string;\n }[];\n}\n\ninterface GraphqlRequestBody {\n query: string;\n variables: Record<string, unknown>;\n}\n\ninterface GraphqlError {\n message?: string;\n}\n\ninterface GraphqlResponse<TData> {\n data?: TData;\n errors?: GraphqlError[];\n}\n\ninterface TaskGraphqlNode {\n id: string;\n title: string;\n description: string | null;\n createdAt: string;\n updatedAt: string;\n completedAt: string | null;\n archivedAt: string | null;\n start: string;\n startDate: string | null;\n startBucket: string;\n todayIndexReferenceDate: string | null;\n deadlineAt: string | null;\n creatorId: string;\n workspaceId: string;\n projectId: string | null;\n teamId: string | null;\n assigneeId: string | null;\n headingId: string | null;\n repeatRule: string | null;\n repeatTemplateId: string | null;\n}\n\ninterface ProjectGraphqlNode {\n id: string;\n key: string;\n name: string;\n description: string | null;\n status: string;\n sortOrder: number;\n targetDate: string | null;\n completedAt: string | null;\n archivedAt: string | null;\n createdAt: string;\n updatedAt: string;\n workspaceId: string;\n creatorId: string;\n}\n\ninterface LabelGraphqlNode {\n id: string;\n title: string;\n workspaceId: string;\n createdAt: string;\n updatedAt: string;\n}\n\ninterface TeamGraphqlNode {\n id: string;\n key: string;\n name: string;\n description: string | null;\n workspaceId: string;\n createdAt: string;\n updatedAt: string;\n archivedAt: string | null;\n}\n\ninterface PaginatedConnection<TNode> {\n nodes: TNode[];\n pageInfo: {\n hasNextPage: boolean;\n endCursor: string | null;\n };\n}\n\nconst TASK_FIELDS = `\n id\n title\n description\n createdAt\n updatedAt\n completedAt\n archivedAt\n start\n startDate\n startBucket\n todayIndexReferenceDate\n deadlineAt\n creatorId\n workspaceId\n projectId\n teamId\n assigneeId\n headingId\n repeatRule\n repeatTemplateId\n`;\n\nconst TASKS_QUERY = `\n query DonebearTasks($first: Int!, $after: String, $workspaceId: ID!) {\n tasks(first: $first, after: $after, filter: { workspaceId: { eq: $workspaceId } }) {\n nodes { ${TASK_FIELDS} }\n pageInfo { hasNextPage endCursor }\n }\n }\n`;\n\nconst TASKS_ALL_QUERY = `\n query DonebearTasksAll($first: Int!, $after: String, $workspaceIds: [ID!]!) {\n tasks(first: $first, after: $after, filter: { workspaceId: { in: $workspaceIds } }) {\n nodes { ${TASK_FIELDS} }\n pageInfo { hasNextPage endCursor }\n }\n }\n`;\n\nconst PROJECT_FIELDS = `\n id key name description status sortOrder targetDate\n completedAt archivedAt createdAt updatedAt workspaceId creatorId\n`;\n\nconst PROJECTS_QUERY = `\n query DonebearProjects($first: Int!, $after: String, $workspaceId: ID!) {\n projects(first: $first, after: $after, filter: { workspaceId: { eq: $workspaceId } }) {\n nodes { ${PROJECT_FIELDS} }\n pageInfo { hasNextPage endCursor }\n }\n }\n`;\n\nconst PROJECTS_ALL_QUERY = `\n query DonebearProjectsAll($first: Int!, $after: String, $workspaceIds: [ID!]!) {\n projects(first: $first, after: $after, filter: { workspaceId: { in: $workspaceIds } }) {\n nodes { ${PROJECT_FIELDS} }\n pageInfo { hasNextPage endCursor }\n }\n }\n`;\n\nconst LABEL_FIELDS = \"id title workspaceId createdAt updatedAt\";\n\nconst LABELS_QUERY = `\n query DonebearLabels($first: Int!, $after: String, $workspaceId: ID!) {\n labels(first: $first, after: $after, filter: { workspaceId: { eq: $workspaceId } }) {\n nodes { ${LABEL_FIELDS} }\n pageInfo { hasNextPage endCursor }\n }\n }\n`;\n\nconst LABELS_ALL_QUERY = `\n query DonebearLabelsAll($first: Int!, $after: String, $workspaceIds: [ID!]!) {\n labels(first: $first, after: $after, filter: { workspaceId: { in: $workspaceIds } }) {\n nodes { ${LABEL_FIELDS} }\n pageInfo { hasNextPage endCursor }\n }\n }\n`;\n\nconst TEAM_FIELDS =\n \"id key name description workspaceId createdAt updatedAt archivedAt\";\n\nconst TEAMS_QUERY = `\n query DonebearTeams($first: Int!, $after: String, $workspaceId: ID!) {\n teams(first: $first, after: $after, filter: { workspaceId: { eq: $workspaceId } }) {\n nodes { ${TEAM_FIELDS} }\n pageInfo { hasNextPage endCursor }\n }\n }\n`;\n\nconst TEAMS_ALL_QUERY = `\n query DonebearTeamsAll($first: Int!, $after: String, $workspaceIds: [ID!]!) {\n teams(first: $first, after: $after, filter: { workspaceId: { in: $workspaceIds } }) {\n nodes { ${TEAM_FIELDS} }\n pageInfo { hasNextPage endCursor }\n }\n }\n`;\n\nconst MY_WORKSPACES_QUERY = `\n query MyWorkspaces {\n myWorkspaces {\n id name urlKey logoUrl role createdAt updatedAt\n }\n }\n`;\n\nconst WORKSPACE_CREATE_MUTATION = `\n mutation WorkspaceCreate($input: WorkspaceCreateInput!) {\n workspaceCreate(input: $input) {\n success lastSyncId\n workspace { id name urlKey logoUrl createdAt updatedAt archivedAt }\n }\n }\n`;\n\nconst WORKSPACE_JOIN_MUTATION = `\n mutation WorkspaceJoin($code: String!) {\n workspaceJoin(code: $code) {\n success lastSyncId\n workspace { id name urlKey logoUrl createdAt updatedAt archivedAt }\n role\n }\n }\n`;\n\nconst WORKSPACE_MEMBERS_QUERY = `\n query WorkspaceMembers($first: Int!, $after: String, $workspaceId: ID!) {\n workspaceMemberships(first: $first, after: $after, filter: { workspaceId: { eq: $workspaceId } }) {\n nodes {\n id userId workspaceId role createdAt\n user { id email name }\n }\n pageInfo { hasNextPage endCursor }\n }\n }\n`;\n\nconst WORKSPACE_INVITATIONS_QUERY = `\n query WorkspaceInvitations($first: Int!, $after: String, $workspaceId: ID!) {\n workspaceInvitations(first: $first, after: $after, filter: { workspaceId: { eq: $workspaceId } }) {\n nodes { id email code role expiresAt createdAt usedAt usedByUserId workspaceId }\n pageInfo { hasNextPage endCursor }\n }\n }\n`;\n\nconst WORKSPACE_INVITATION_CREATE_MUTATION = `\n mutation WorkspaceInvitationCreate($input: WorkspaceInvitationCreateInput!) {\n workspaceInvitationCreate(input: $input) {\n success lastSyncId\n invitation { id email code role expiresAt createdAt usedAt usedByUserId workspaceId }\n }\n }\n`;\n\nconst WORKSPACE_HISTORY_QUERY = `\n query WorkspaceHistory($workspaceId: ID!, $limit: Int, $model: String) {\n workspaceHistory(workspaceId: $workspaceId, limit: $limit, model: $model) {\n id action modelName modelId payload createdAt userId\n }\n }\n`;\n\nconst API_KEY_CREATE_MUTATION = `\n mutation ApiKeyCreate($label: String!, $scopes: [String!], $workspaceIds: [ID!], $expiresAt: DateTime) {\n apiKeyCreate(label: $label, scopes: $scopes, workspaceIds: $workspaceIds, expiresAt: $expiresAt) {\n success lastSyncId\n apiKey { id label keyPrefix scopes workspaceIds expiresAt createdAt }\n token\n }\n }\n`;\n\nconst API_KEYS_QUERY = `\n query ApiKeys {\n apiKeys { id label keyPrefix scopes workspaceIds expiresAt lastUsedAt revokedAt createdAt }\n }\n`;\n\nconst API_KEY_REVOKE_MUTATION = `\n mutation ApiKeyRevoke($id: ID!) {\n apiKeyRevoke(id: $id) { success lastSyncId }\n }\n`;\n\ninterface WorkspaceSummaryGraphqlNode {\n id: string;\n name: string;\n urlKey: string | null;\n logoUrl: string | null;\n role: string;\n createdAt: string;\n updatedAt: string;\n}\n\ninterface WorkspaceGraphqlNode {\n id: string;\n name: string;\n urlKey: string | null;\n logoUrl: string | null;\n createdAt: string;\n updatedAt: string;\n archivedAt: string | null;\n}\n\ninterface WorkspaceMembershipGraphqlNode {\n id: string;\n userId: string;\n workspaceId: string;\n role: string;\n createdAt: string;\n user: {\n id: string;\n email: string | null;\n name: string | null;\n };\n}\n\ninterface WorkspaceInvitationGraphqlNode {\n id: string;\n email: string | null;\n code: string;\n role: string;\n expiresAt: string;\n createdAt: string;\n usedAt: string | null;\n usedByUserId: string | null;\n workspaceId: string;\n}\n\ninterface WorkspaceHistoryGraphqlNode {\n id: string;\n action: string;\n modelName: string;\n modelId: string;\n payload: Record<string, unknown> | null;\n createdAt: string;\n userId: string | null;\n}\n\ninterface ApiKeyGraphqlNode {\n id: string;\n label: string;\n keyPrefix: string;\n scopes: string[];\n workspaceIds: string[] | null;\n expiresAt: string | null;\n lastUsedAt: string | null;\n revokedAt: string | null;\n createdAt: string;\n}\n\nconst normalizeApiUrl = (url: string): string =>\n url.endsWith(\"/\") ? url.slice(0, -1) : url;\n\nconst requestGraphql = async <TData>(\n context: CliContext,\n endpoint: string,\n options: {\n token: string;\n query: string;\n variables: Record<string, unknown>;\n }\n): Promise<TData> => {\n const response = await requestJson<GraphqlResponse<TData>>(\n context,\n endpoint,\n {\n body: {\n query: options.query,\n variables: options.variables,\n } satisfies GraphqlRequestBody,\n method: \"POST\",\n token: options.token,\n }\n );\n\n if (Array.isArray(response.errors) && response.errors.length > 0) {\n const [first] = response.errors;\n throw new CliError(\n typeof first?.message === \"string\"\n ? first.message\n : \"GraphQL request failed\",\n EXIT_CODES.ERROR\n );\n }\n\n if (!response.data) {\n throw new CliError(\"GraphQL request returned no data\", EXIT_CODES.ERROR);\n }\n\n return response.data;\n};\n\nconst paginateGraphql = async <TNode, TRecord>(\n context: CliContext,\n options: {\n baseUrl: string;\n token: string;\n query: string;\n variables: Record<string, unknown>;\n nodeKey: string;\n transform: (node: TNode) => TRecord;\n }\n): Promise<TRecord[]> => {\n const endpoint = `${options.baseUrl}/graphql`;\n const results: TRecord[] = [];\n let after: string | null = null;\n let pageCount = 0;\n\n while (true) {\n pageCount += 1;\n\n if (pageCount > 1000) {\n throw new CliError(\n \"GraphQL pagination exceeded safe page limit\",\n EXIT_CODES.ERROR\n );\n }\n\n const data: Record<\n string,\n PaginatedConnection<TNode>\n > = await requestGraphql(context, endpoint, {\n query: options.query,\n token: options.token,\n variables: {\n after,\n first: 100,\n ...options.variables,\n },\n });\n\n const connection = data[options.nodeKey] as PaginatedConnection<TNode>;\n\n for (const node of connection.nodes) {\n results.push(options.transform(node));\n }\n\n const nextCursor = connection.pageInfo.hasNextPage\n ? connection.pageInfo.endCursor\n : null;\n\n if (!nextCursor) {\n break;\n }\n\n after = nextCursor;\n }\n\n return results;\n};\n\nconst toTaskRecord = (value: unknown): TaskRecord | null => {\n if (typeof value !== \"object\" || value === null) {\n return null;\n }\n\n const row = value as Record<string, unknown>;\n\n if (row.__class !== \"Task\") {\n return null;\n }\n\n if (typeof row.id !== \"string\" || typeof row.title !== \"string\") {\n return null;\n }\n\n if (\n typeof row.creatorId !== \"string\" ||\n typeof row.workspaceId !== \"string\" ||\n typeof row.start !== \"string\" ||\n typeof row.startBucket !== \"string\"\n ) {\n return null;\n }\n\n return {\n archivedAt: toNullableNumber(row.archivedAt),\n assigneeId: typeof row.assigneeId === \"string\" ? row.assigneeId : null,\n completedAt: toNullableNumber(row.completedAt),\n createdAt: toNullableNumber(row.createdAt),\n creatorId: row.creatorId,\n deadlineAt: toNullableNumber(row.deadlineAt),\n description: typeof row.description === \"string\" ? row.description : null,\n headingId: typeof row.headingId === \"string\" ? row.headingId : null,\n id: row.id,\n projectId: typeof row.projectId === \"string\" ? row.projectId : null,\n repeatRule: typeof row.repeatRule === \"string\" ? row.repeatRule : null,\n repeatTemplateId:\n typeof row.repeatTemplateId === \"string\" ? row.repeatTemplateId : null,\n start: row.start,\n startBucket: row.startBucket,\n startDate: toNullableNumber(row.startDate),\n teamId: typeof row.teamId === \"string\" ? row.teamId : null,\n title: row.title,\n todayIndexReferenceDate: toNullableNumber(row.todayIndexReferenceDate),\n updatedAt: toNullableNumber(row.updatedAt),\n workspaceId: row.workspaceId,\n };\n};\n\nconst toNullableNumber = (input: unknown): number | null => {\n if (input === null || input === undefined) {\n return null;\n }\n\n return typeof input === \"number\" ? input : null;\n};\n\nconst toTaskRecordFromGraphqlNode = (node: TaskGraphqlNode): TaskRecord => ({\n archivedAt: parseApiInstantToEpoch(node.archivedAt),\n assigneeId: node.assigneeId,\n completedAt: parseApiInstantToEpoch(node.completedAt),\n createdAt: parseApiInstantToEpoch(node.createdAt),\n creatorId: node.creatorId,\n deadlineAt: parseApiDateOnlyToEpoch(node.deadlineAt),\n description: node.description,\n headingId: node.headingId,\n id: node.id,\n projectId: node.projectId,\n repeatRule: node.repeatRule,\n repeatTemplateId: node.repeatTemplateId,\n start: node.start,\n startBucket: node.startBucket,\n startDate: parseApiDateOnlyToEpoch(node.startDate),\n teamId: node.teamId,\n title: node.title,\n todayIndexReferenceDate: parseApiDateOnlyToEpoch(\n node.todayIndexReferenceDate\n ),\n updatedAt: parseApiInstantToEpoch(node.updatedAt),\n workspaceId: node.workspaceId,\n});\n\nconst toProjectRecordFromGraphqlNode = (\n node: ProjectGraphqlNode\n): ProjectRecord => ({\n archivedAt: parseApiInstantToEpoch(node.archivedAt),\n completedAt: parseApiInstantToEpoch(node.completedAt),\n createdAt: parseApiInstantToEpoch(node.createdAt),\n creatorId: node.creatorId,\n description: node.description,\n id: node.id,\n key: node.key,\n name: node.name,\n sortOrder: node.sortOrder,\n status: node.status,\n targetDate: parseApiDateOnlyToEpoch(node.targetDate),\n updatedAt: parseApiInstantToEpoch(node.updatedAt),\n workspaceId: node.workspaceId,\n});\n\nconst toLabelRecordFromGraphqlNode = (node: LabelGraphqlNode): LabelRecord => ({\n createdAt: parseApiInstantToEpoch(node.createdAt),\n id: node.id,\n title: node.title,\n updatedAt: parseApiInstantToEpoch(node.updatedAt),\n workspaceId: node.workspaceId,\n});\n\nconst toTeamRecordFromGraphqlNode = (node: TeamGraphqlNode): TeamRecord => ({\n archivedAt: parseApiInstantToEpoch(node.archivedAt),\n createdAt: parseApiInstantToEpoch(node.createdAt),\n description: node.description,\n id: node.id,\n key: node.key,\n name: node.name,\n updatedAt: parseApiInstantToEpoch(node.updatedAt),\n workspaceId: node.workspaceId,\n});\n\nconst toWorkspaceSummaryFromGraphqlNode = (\n node: WorkspaceSummaryGraphqlNode\n): WorkspaceSummary => ({\n createdAt: node.createdAt,\n id: node.id,\n logoUrl: node.logoUrl,\n name: node.name,\n role: node.role,\n updatedAt: node.updatedAt,\n urlKey: node.urlKey,\n});\n\nconst toWorkspaceRecordFromGraphqlNode = (\n node: WorkspaceGraphqlNode\n): WorkspaceRecord => ({\n archivedAt: node.archivedAt,\n createdAt: node.createdAt,\n id: node.id,\n logoUrl: node.logoUrl,\n name: node.name,\n updatedAt: node.updatedAt,\n urlKey: node.urlKey,\n});\n\nconst toWorkspaceMemberRecordFromGraphqlNode = (\n node: WorkspaceMembershipGraphqlNode\n): WorkspaceMemberRecord => ({\n createdAt: node.createdAt,\n role: node.role,\n user: {\n avatarUrl: null,\n email: node.user.email,\n id: node.user.id,\n name: node.user.name,\n },\n userId: node.userId,\n});\n\nconst toWorkspaceInvitationRecordFromGraphqlNode = (\n node: WorkspaceInvitationGraphqlNode\n): WorkspaceInvitationRecord => ({\n code: node.code,\n email: node.email,\n expiresAt: node.expiresAt,\n id: node.id,\n role: node.role,\n usedAt: node.usedAt,\n});\n\nconst toWorkspaceHistoryEntryFromGraphqlNode = (\n node: WorkspaceHistoryGraphqlNode\n): WorkspaceHistoryEntry => ({\n action: node.action,\n createdAt: node.createdAt,\n id: node.id,\n modelId: node.modelId,\n modelName: node.modelName,\n payload: node.payload,\n userId: node.userId,\n});\n\nconst toApiKeyRecordFromGraphqlNode = (\n node: ApiKeyGraphqlNode\n): ApiKeyRecord => ({\n createdAt: node.createdAt,\n expiresAt: node.expiresAt,\n id: node.id,\n keyPrefix: node.keyPrefix,\n label: node.label,\n lastUsedAt: node.lastUsedAt,\n revokedAt: node.revokedAt,\n scopes: node.scopes,\n workspaceIds: node.workspaceIds,\n});\n\nconst toChecklistItemRecord = (value: unknown): ChecklistItemRecord | null => {\n if (typeof value !== \"object\" || value === null) {\n return null;\n }\n\n const row = value as Record<string, unknown>;\n\n if (row.__class !== \"TaskChecklistItem\") {\n return null;\n }\n\n if (typeof row.id !== \"string\" || typeof row.title !== \"string\") {\n return null;\n }\n\n if (typeof row.taskId !== \"string\" || typeof row.workspaceId !== \"string\") {\n return null;\n }\n\n return {\n completedAt: toNullableNumber(row.completedAt),\n createdAt: toNullableNumber(row.createdAt),\n id: row.id,\n sortOrder: typeof row.sortOrder === \"number\" ? row.sortOrder : 0,\n taskId: row.taskId,\n title: row.title,\n updatedAt: toNullableNumber(row.updatedAt),\n workspaceId: row.workspaceId,\n };\n};\n\nexport const resolveApiBaseUrl = (context: CliContext): string => {\n const fromContext = context.apiUrlOverride?.trim();\n\n if (fromContext) {\n return normalizeApiUrl(fromContext);\n }\n\n const fromEnv = readEnvValue(DONEBEAR_API_URL_ENV);\n\n return normalizeApiUrl(fromEnv ?? DEFAULT_API_URL);\n};\n\nconst VIEWER_QUERY = `\n query Viewer {\n viewer {\n id\n email\n }\n }\n`;\n\ninterface ViewerGraphqlNode {\n id: string;\n email: string | null;\n}\n\nexport interface ViewerInfo {\n id: string;\n email: string | null;\n}\n\nexport const loadViewer = async (\n context: CliContext,\n options: { baseUrl: string; token: string }\n): Promise<ViewerInfo> => {\n const endpoint = `${options.baseUrl}/graphql`;\n const data = await requestGraphql<{\n viewer: ViewerGraphqlNode | null;\n }>(context, endpoint, {\n query: VIEWER_QUERY,\n token: options.token,\n variables: {},\n });\n\n if (!data.viewer) {\n throw new CliError(\n \"Could not resolve current user. The token may be invalid or revoked.\",\n EXIT_CODES.AUTH_REQUIRED\n );\n }\n\n return {\n email: data.viewer.email ?? null,\n id: data.viewer.id,\n };\n};\n\nexport const listWorkspaces = async (\n context: CliContext,\n options: { baseUrl: string; token: string }\n): Promise<WorkspaceSummary[]> => {\n const endpoint = `${options.baseUrl}/graphql`;\n const data = await requestGraphql<{\n myWorkspaces: WorkspaceSummaryGraphqlNode[];\n }>(context, endpoint, {\n query: MY_WORKSPACES_QUERY,\n token: options.token,\n variables: {},\n });\n\n return data.myWorkspaces.map(toWorkspaceSummaryFromGraphqlNode);\n};\n\nexport const createWorkspace = async (\n context: CliContext,\n options: {\n baseUrl: string;\n token: string;\n body: CreateWorkspaceRequest;\n }\n): Promise<WorkspaceRecord> => {\n const endpoint = `${options.baseUrl}/graphql`;\n const data = await requestGraphql<{\n workspaceCreate: {\n success: boolean;\n lastSyncId: string;\n workspace: WorkspaceGraphqlNode;\n };\n }>(context, endpoint, {\n query: WORKSPACE_CREATE_MUTATION,\n token: options.token,\n variables: { input: options.body },\n });\n\n return toWorkspaceRecordFromGraphqlNode(data.workspaceCreate.workspace);\n};\n\nexport const joinWorkspace = async (\n context: CliContext,\n options: {\n baseUrl: string;\n token: string;\n code: string;\n }\n): Promise<WorkspaceJoinResult> => {\n const endpoint = `${options.baseUrl}/graphql`;\n const data = await requestGraphql<{\n workspaceJoin: {\n success: boolean;\n lastSyncId: string;\n workspace: WorkspaceGraphqlNode;\n role: string;\n };\n }>(context, endpoint, {\n query: WORKSPACE_JOIN_MUTATION,\n token: options.token,\n variables: { code: options.code },\n });\n\n return {\n role: data.workspaceJoin.role,\n workspace: toWorkspaceRecordFromGraphqlNode(data.workspaceJoin.workspace),\n };\n};\n\nexport const loadTasksByWorkspace = (\n context: CliContext,\n options: {\n baseUrl: string;\n token: string;\n workspaceId: string;\n }\n): Promise<TaskRecord[]> =>\n paginateGraphql<TaskGraphqlNode, TaskRecord>(context, {\n baseUrl: options.baseUrl,\n nodeKey: \"tasks\",\n query: TASKS_QUERY,\n token: options.token,\n transform: toTaskRecordFromGraphqlNode,\n variables: { workspaceId: options.workspaceId },\n });\n\nexport const loadTasksByWorkspaceIds = (\n context: CliContext,\n options: {\n baseUrl: string;\n token: string;\n workspaceIds: string[];\n }\n): Promise<TaskRecord[]> =>\n paginateGraphql<TaskGraphqlNode, TaskRecord>(context, {\n baseUrl: options.baseUrl,\n nodeKey: \"tasks\",\n query: TASKS_ALL_QUERY,\n token: options.token,\n transform: toTaskRecordFromGraphqlNode,\n variables: { workspaceIds: options.workspaceIds },\n });\n\nexport const loadTaskById = async (\n context: CliContext,\n options: {\n baseUrl: string;\n token: string;\n taskId: string;\n }\n): Promise<TaskRecord | null> => {\n const url = `${options.baseUrl}/sync/batch`;\n const body: SyncBatchRequest = {\n requests: [\n {\n indexedKey: \"id\",\n keyValue: options.taskId,\n modelName: \"Task\",\n },\n ],\n };\n\n const rows = await requestNdjson(context, url, {\n body,\n token: options.token,\n });\n\n for (const row of rows) {\n const task = toTaskRecord(row);\n\n if (task) {\n return task;\n }\n }\n\n return null;\n};\n\nexport const loadProjectsByWorkspace = (\n context: CliContext,\n options: {\n baseUrl: string;\n token: string;\n workspaceId: string;\n }\n): Promise<ProjectRecord[]> =>\n paginateGraphql<ProjectGraphqlNode, ProjectRecord>(context, {\n baseUrl: options.baseUrl,\n nodeKey: \"projects\",\n query: PROJECTS_QUERY,\n token: options.token,\n transform: toProjectRecordFromGraphqlNode,\n variables: { workspaceId: options.workspaceId },\n });\n\nexport const loadProjectsByWorkspaceIds = (\n context: CliContext,\n options: {\n baseUrl: string;\n token: string;\n workspaceIds: string[];\n }\n): Promise<ProjectRecord[]> =>\n paginateGraphql<ProjectGraphqlNode, ProjectRecord>(context, {\n baseUrl: options.baseUrl,\n nodeKey: \"projects\",\n query: PROJECTS_ALL_QUERY,\n token: options.token,\n transform: toProjectRecordFromGraphqlNode,\n variables: { workspaceIds: options.workspaceIds },\n });\n\nexport const loadLabelsByWorkspace = (\n context: CliContext,\n options: {\n baseUrl: string;\n token: string;\n workspaceId: string;\n }\n): Promise<LabelRecord[]> =>\n paginateGraphql<LabelGraphqlNode, LabelRecord>(context, {\n baseUrl: options.baseUrl,\n nodeKey: \"labels\",\n query: LABELS_QUERY,\n token: options.token,\n transform: toLabelRecordFromGraphqlNode,\n variables: { workspaceId: options.workspaceId },\n });\n\nexport const loadLabelsByWorkspaceIds = (\n context: CliContext,\n options: {\n baseUrl: string;\n token: string;\n workspaceIds: string[];\n }\n): Promise<LabelRecord[]> =>\n paginateGraphql<LabelGraphqlNode, LabelRecord>(context, {\n baseUrl: options.baseUrl,\n nodeKey: \"labels\",\n query: LABELS_ALL_QUERY,\n token: options.token,\n transform: toLabelRecordFromGraphqlNode,\n variables: { workspaceIds: options.workspaceIds },\n });\n\nexport const loadTeamsByWorkspace = (\n context: CliContext,\n options: {\n baseUrl: string;\n token: string;\n workspaceId: string;\n }\n): Promise<TeamRecord[]> =>\n paginateGraphql<TeamGraphqlNode, TeamRecord>(context, {\n baseUrl: options.baseUrl,\n nodeKey: \"teams\",\n query: TEAMS_QUERY,\n token: options.token,\n transform: toTeamRecordFromGraphqlNode,\n variables: { workspaceId: options.workspaceId },\n });\n\nexport const loadTeamsByWorkspaceIds = (\n context: CliContext,\n options: {\n baseUrl: string;\n token: string;\n workspaceIds: string[];\n }\n): Promise<TeamRecord[]> =>\n paginateGraphql<TeamGraphqlNode, TeamRecord>(context, {\n baseUrl: options.baseUrl,\n nodeKey: \"teams\",\n query: TEAMS_ALL_QUERY,\n token: options.token,\n transform: toTeamRecordFromGraphqlNode,\n variables: { workspaceIds: options.workspaceIds },\n });\n\nexport const loadChecklistItemsByTask = async (\n context: CliContext,\n options: {\n baseUrl: string;\n token: string;\n taskId: string;\n }\n): Promise<ChecklistItemRecord[]> => {\n const url = `${options.baseUrl}/sync/batch`;\n const body: SyncBatchRequest = {\n requests: [\n {\n indexedKey: \"taskId\",\n keyValue: options.taskId,\n modelName: \"TaskChecklistItem\",\n },\n ],\n };\n\n const rows = await requestNdjson(context, url, {\n body,\n token: options.token,\n });\n\n const results: ChecklistItemRecord[] = [];\n\n for (const row of rows) {\n const item = toChecklistItemRecord(row);\n\n if (item) {\n results.push(item);\n }\n }\n\n return results;\n};\n\nexport const mutateModel = async (\n context: CliContext,\n options: {\n baseUrl: string;\n token: string;\n request: {\n batchId: string;\n transactions: {\n clientTxId: string;\n clientId: string;\n modelName: string;\n modelId: string;\n action: \"INSERT\" | \"UPDATE\" | \"ARCHIVE\" | \"UNARCHIVE\" | \"DELETE\";\n payload: Record<string, unknown>;\n }[];\n };\n }\n): Promise<void> => {\n if (context.dryRun) {\n writeWarning(context, \"dry run: mutation skipped\");\n writeOutput(context, {\n dryRun: true,\n transactions: options.request.transactions.map((tx) => ({\n action: tx.action,\n modelId: tx.modelId,\n modelName: tx.modelName,\n payload: tx.payload,\n })),\n });\n return;\n }\n\n const url = `${options.baseUrl}/sync/mutate`;\n const response = await requestJson<SyncMutateResponse>(context, url, {\n body: options.request,\n method: \"POST\",\n token: options.token,\n });\n\n if (!response.success) {\n const error = response.results.find((result) => !result.success);\n\n if (error?.error) {\n throw new CliError(error.error, EXIT_CODES.ERROR);\n }\n\n throw new CliError(\"Sync mutation failed\", EXIT_CODES.ERROR);\n }\n};\n\nexport const listWorkspaceMembers = async (\n context: CliContext,\n options: { baseUrl: string; token: string; workspaceId: string }\n): Promise<WorkspaceMemberRecord[]> =>\n await paginateGraphql<WorkspaceMembershipGraphqlNode, WorkspaceMemberRecord>(\n context,\n {\n baseUrl: options.baseUrl,\n nodeKey: \"workspaceMemberships\",\n query: WORKSPACE_MEMBERS_QUERY,\n token: options.token,\n transform: toWorkspaceMemberRecordFromGraphqlNode,\n variables: { workspaceId: options.workspaceId },\n }\n );\n\nexport const listWorkspaceInvitations = async (\n context: CliContext,\n options: { baseUrl: string; token: string; workspaceId: string }\n): Promise<WorkspaceInvitationRecord[]> =>\n await paginateGraphql<\n WorkspaceInvitationGraphqlNode,\n WorkspaceInvitationRecord\n >(context, {\n baseUrl: options.baseUrl,\n nodeKey: \"workspaceInvitations\",\n query: WORKSPACE_INVITATIONS_QUERY,\n token: options.token,\n transform: toWorkspaceInvitationRecordFromGraphqlNode,\n variables: { workspaceId: options.workspaceId },\n });\n\nexport const createWorkspaceInvitation = async (\n context: CliContext,\n options: {\n baseUrl: string;\n token: string;\n workspaceId: string;\n email?: string;\n role?: string;\n }\n): Promise<WorkspaceInvitationRecord> => {\n const endpoint = `${options.baseUrl}/graphql`;\n const input: Record<string, unknown> = {\n workspaceId: options.workspaceId,\n };\n\n if (options.email !== undefined) {\n input.email = options.email;\n }\n\n if (options.role !== undefined) {\n input.role = options.role;\n }\n\n const data = await requestGraphql<{\n workspaceInvitationCreate: {\n success: boolean;\n lastSyncId: string;\n invitation: WorkspaceInvitationGraphqlNode;\n };\n }>(context, endpoint, {\n query: WORKSPACE_INVITATION_CREATE_MUTATION,\n token: options.token,\n variables: { input },\n });\n\n return toWorkspaceInvitationRecordFromGraphqlNode(\n data.workspaceInvitationCreate.invitation\n );\n};\n\nexport interface WorkspaceHistoryEntry {\n id: string;\n action: string;\n modelName: string;\n modelId: string;\n payload: Record<string, unknown> | null;\n createdAt: string;\n userId: string | null;\n}\n\nexport const listWorkspaceHistory = async (\n context: CliContext,\n options: {\n baseUrl: string;\n token: string;\n workspaceId: string;\n limit: number;\n model?: string;\n }\n): Promise<WorkspaceHistoryEntry[]> => {\n const endpoint = `${options.baseUrl}/graphql`;\n const variables: Record<string, unknown> = {\n limit: options.limit,\n workspaceId: options.workspaceId,\n };\n\n if (options.model) {\n variables.model = options.model;\n }\n\n const data = await requestGraphql<{\n workspaceHistory: WorkspaceHistoryGraphqlNode[];\n }>(context, endpoint, {\n query: WORKSPACE_HISTORY_QUERY,\n token: options.token,\n variables,\n });\n\n return data.workspaceHistory.map(toWorkspaceHistoryEntryFromGraphqlNode);\n};\n\n// --- API Keys ---\n\ninterface ApiKeyRecord {\n id: string;\n label: string;\n keyPrefix: string;\n scopes: string[];\n workspaceIds: string[] | null;\n expiresAt: string | null;\n lastUsedAt: string | null;\n revokedAt: string | null;\n createdAt: string;\n}\n\ninterface CreateApiKeyResponse {\n key: ApiKeyRecord & { token: string };\n}\n\nexport const createApiKey = async (\n context: CliContext,\n options: {\n baseUrl: string;\n token: string;\n label: string;\n scopes?: string[];\n workspaceIds?: string[];\n expiresAt?: string;\n }\n): Promise<CreateApiKeyResponse[\"key\"]> => {\n const endpoint = `${options.baseUrl}/graphql`;\n const variables: Record<string, unknown> = { label: options.label };\n\n if (options.scopes !== undefined) {\n variables.scopes = options.scopes;\n }\n\n if (options.workspaceIds !== undefined) {\n variables.workspaceIds = options.workspaceIds;\n }\n\n if (options.expiresAt !== undefined) {\n variables.expiresAt = options.expiresAt;\n }\n\n const data = await requestGraphql<{\n apiKeyCreate: {\n success: boolean;\n lastSyncId: string;\n apiKey: ApiKeyGraphqlNode;\n token: string;\n };\n }>(context, endpoint, {\n query: API_KEY_CREATE_MUTATION,\n token: options.token,\n variables,\n });\n\n return {\n ...toApiKeyRecordFromGraphqlNode(data.apiKeyCreate.apiKey),\n token: data.apiKeyCreate.token,\n };\n};\n\nexport const listApiKeys = async (\n context: CliContext,\n options: { baseUrl: string; token: string }\n): Promise<ApiKeyRecord[]> => {\n const endpoint = `${options.baseUrl}/graphql`;\n const data = await requestGraphql<{\n apiKeys: ApiKeyGraphqlNode[];\n }>(context, endpoint, {\n query: API_KEYS_QUERY,\n token: options.token,\n variables: {},\n });\n\n return data.apiKeys.map(toApiKeyRecordFromGraphqlNode);\n};\n\nexport const revokeApiKey = async (\n context: CliContext,\n options: { baseUrl: string; token: string; keyId: string }\n): Promise<void> => {\n const endpoint = `${options.baseUrl}/graphql`;\n await requestGraphql<{\n apiKeyRevoke: { success: boolean; lastSyncId: string };\n }>(context, endpoint, {\n query: API_KEY_REVOKE_MUTATION,\n token: options.token,\n variables: { id: options.keyId },\n });\n};\n","import { resolveAuthToken } from \"./auth-session\";\nimport { ensureLocalContext } from \"./context-store\";\nimport { CliError, EXIT_CODES } from \"./errors\";\nimport { loadViewer, resolveApiBaseUrl } from \"./manage-api\";\nimport { resolveSupabaseConfig } from \"./supabase\";\nimport type { CliContext, ResolvedAuthToken } from \"./types\";\n\nconst getOptionalSupabaseConfig = () => {\n try {\n return resolveSupabaseConfig();\n } catch {\n return null;\n }\n};\n\nexport const requireAuthToken = async (\n context: CliContext\n): Promise<{\n token: string;\n resolvedToken: ResolvedAuthToken;\n}> => {\n const resolvedToken = await resolveAuthToken(\n context,\n getOptionalSupabaseConfig()\n );\n\n if (!resolvedToken) {\n throw new CliError(\n \"Not authenticated. Run `donebear auth login`.\",\n EXIT_CODES.AUTH_REQUIRED\n );\n }\n\n return {\n resolvedToken,\n token: resolvedToken.token,\n };\n};\n\nexport const resolveCommandContext = async (\n context: CliContext\n): Promise<{\n token: string;\n apiBaseUrl: string;\n resolvedToken: ResolvedAuthToken;\n localContext: Awaited<ReturnType<typeof ensureLocalContext>>;\n}> => {\n const { token, resolvedToken } = await requireAuthToken(context);\n\n if (!token) {\n throw new CliError(\"Missing access token\", EXIT_CODES.AUTH_REQUIRED);\n }\n\n return {\n apiBaseUrl: resolveApiBaseUrl(context),\n localContext: await ensureLocalContext(),\n resolvedToken,\n token,\n };\n};\n\nexport const requireUserId = async (\n context: CliContext,\n commandContext: {\n apiBaseUrl: string;\n token: string;\n resolvedToken: ResolvedAuthToken;\n }\n): Promise<string> => {\n const claimUserId = commandContext.resolvedToken.user?.id ?? null;\n\n if (typeof claimUserId === \"string\" && claimUserId.length > 0) {\n return claimUserId;\n }\n\n // `db_` API keys aren't JWTs, so the user id has to come from the server.\n const viewer = await loadViewer(context, {\n baseUrl: commandContext.apiBaseUrl,\n token: commandContext.token,\n });\n\n return viewer.id;\n};\n","import { InvalidArgumentError } from \"commander\";\nimport type { Command } from \"commander\";\n\nimport type { OutputFormat } from \"./types\";\n\ninterface GlobalOptions {\n json?: boolean;\n quiet?: boolean;\n color?: boolean;\n debug?: boolean;\n token?: string;\n apiUrl?: string;\n format?: string;\n copy?: boolean;\n total?: boolean;\n jq?: string;\n limit?: number;\n dryRun?: boolean;\n yes?: boolean;\n}\n\nexport const parseOutputFormat = (value: string | undefined): OutputFormat => {\n switch (value?.trim().toLowerCase()) {\n case \"json\": {\n return \"json\";\n }\n case \"csv\": {\n return \"csv\";\n }\n case \"tsv\": {\n return \"tsv\";\n }\n case \"yaml\": {\n return \"yaml\";\n }\n default: {\n return \"text\";\n }\n }\n};\n\nconst parseLimit = (value: string): number => {\n const parsed = Number.parseInt(value, 10);\n\n if (`${parsed}` !== value || !Number.isInteger(parsed) || parsed < 1) {\n throw new InvalidArgumentError(\n `invalid limit \"${value}\" (expected a positive integer)`\n );\n }\n\n return parsed;\n};\n\nexport const addGlobalOptions = (program: Command): void => {\n program\n .option(\"--json\", \"Output machine-readable JSON\")\n .option(\"-q, --quiet\", \"Suppress status output (implies --json)\")\n .option(\n \"--format <format>\",\n \"Output format: text|json|csv|tsv|yaml\",\n \"text\"\n )\n .option(\"--copy\", \"Copy output to clipboard\")\n .option(\"--total\", \"Print count only\")\n .option(\n \"--token <token>\",\n \"Use an explicit token (overrides DONEBEAR_TOKEN)\"\n )\n .option(\n \"--api-url <url>\",\n \"Manage API base URL (overrides DONEBEAR_API_URL)\"\n )\n .option(\"--debug\", \"Enable debug logs\")\n .option(\"--no-color\", \"Disable color output\")\n .option(\"--dry-run\", \"Preview mutations without executing\", false)\n .option(\"--jq <expression>\", \"Filter output with a JMESPath expression\")\n .option(\n \"--limit <n>\",\n \"Limit output to N items (for array results)\",\n parseLimit\n )\n .option(\"-y, --yes\", \"Skip confirmation prompts\", false);\n};\n\nexport const getGlobalOptions = (command: Command): GlobalOptions =>\n command.optsWithGlobals<GlobalOptions>();\n","import type { Command } from \"commander\";\n\nimport { DONEBEAR_DEBUG_ENV } from \"./constants\";\nimport { toCliError } from \"./errors\";\nimport { getGlobalOptions, parseOutputFormat } from \"./options\";\nimport { writeDebug, writeError, writeJson } from \"./output\";\nimport type { CliContext, OutputFormat } from \"./types\";\n\nexport const contextFromCommand = (command: Command): CliContext => {\n const options = getGlobalOptions(command);\n const quiet = options.quiet === true;\n const rawFormat = parseOutputFormat(options.format);\n const explicitFormat = options.json === true || quiet;\n const autoJson =\n !explicitFormat && rawFormat === \"text\" && !process.stdout.isTTY;\n const format = explicitFormat || autoJson ? \"json\" : rawFormat;\n\n return {\n apiUrlOverride: options.apiUrl?.trim() || null,\n color: options.color !== false && process.env.NO_COLOR !== \"1\",\n copy: options.copy === true,\n debug: options.debug === true || process.env[DONEBEAR_DEBUG_ENV] === \"1\",\n dryRun: options.dryRun === true,\n format,\n jq: options.jq?.trim() || null,\n json: format === \"json\",\n limit: options.limit ?? null,\n quiet,\n tokenOverride: options.token?.trim() || null,\n total: options.total === true,\n yes: options.yes === true,\n };\n};\n\nexport const contextFromArgv = (argv: string[]): CliContext => {\n const quiet = argv.includes(\"--quiet\") || argv.includes(\"-q\");\n const hasJsonFlag = argv.includes(\"--json\");\n const hasExplicitFormat = argv.some(\n (a) => a === \"--format\" || a.startsWith(\"--format=\")\n );\n const rawFormat = argv.some(\n (a) =>\n a === \"--format=json\" ||\n (argv[argv.indexOf(\"--format\") + 1] === \"json\" && a === \"--format\")\n )\n ? \"json\"\n : \"text\";\n const explicitJson = hasJsonFlag || quiet;\n const autoJson = !(explicitJson || hasExplicitFormat || process.stdout.isTTY);\n const format: OutputFormat = explicitJson || autoJson ? \"json\" : rawFormat;\n return {\n apiUrlOverride: null,\n color: !argv.includes(\"--no-color\") && process.env.NO_COLOR !== \"1\",\n copy: argv.includes(\"--copy\"),\n debug: argv.includes(\"--debug\") || process.env[DONEBEAR_DEBUG_ENV] === \"1\",\n dryRun: argv.includes(\"--dry-run\"),\n format,\n jq: null,\n json: format === \"json\",\n limit: null,\n quiet,\n tokenOverride: null,\n total: argv.includes(\"--total\"),\n yes: argv.includes(\"--yes\") || argv.includes(\"-y\"),\n };\n};\n\nexport const runWithErrorHandling = async (\n context: CliContext,\n action: () => Promise<void>\n): Promise<void> => {\n try {\n await action();\n } catch (error) {\n const cliError = toCliError(error);\n\n if (context.json) {\n writeJson({\n error: {\n code: cliError.code,\n exitCode: cliError.exitCode,\n message: cliError.message,\n ...(cliError.hint ? { hint: cliError.hint } : {}),\n },\n ok: false,\n });\n } else {\n writeError(context, cliError.message);\n if (cliError.hint) {\n writeError(context, cliError.hint);\n }\n }\n\n if (\n context.debug &&\n error instanceof Error &&\n typeof error.stack === \"string\"\n ) {\n writeDebug(context, error.stack);\n }\n\n process.exitCode = cliError.exitCode;\n }\n};\n","import type { Command } from \"commander\";\n\nimport { requireAuthToken } from \"../command-context\";\nimport { CliError, EXIT_CODES } from \"../errors\";\nimport {\n createApiKey,\n listApiKeys,\n listWorkspaces,\n resolveApiBaseUrl,\n revokeApiKey,\n} from \"../manage-api\";\nimport { writeInfo, writeOutput, writeSuccess, writeWarning } from \"../output\";\nimport { contextFromCommand, runWithErrorHandling } from \"../runtime\";\nimport type { CliContext } from \"../types\";\n\ntype PermissionLevel = \"full-access\" | \"read-only\";\n\nconst PERMISSION_SCOPES: Record<PermissionLevel, string[]> = {\n \"full-access\": [\"read\", \"write\", \"admin\"],\n \"read-only\": [\"read\"],\n};\n\nconst parseDuration = (duration: string): Date => {\n const match = duration.match(/^(\\d+)(d|y)$/u);\n\n if (!match) {\n throw new CliError(\n `Invalid duration \"${duration}\". Use a format like \"30d\", \"90d\", or \"1y\".`,\n EXIT_CODES.VALIDATION\n );\n }\n\n const [, rawAmount, unit] = match;\n const amount = Number(rawAmount);\n const now = new Date();\n\n if (unit === \"d\") {\n now.setDate(now.getDate() + amount);\n } else {\n now.setDate(now.getDate() + amount * 365);\n }\n\n return now;\n};\n\ninterface CreateOptions {\n permissions?: string;\n workspaces?: string;\n expires?: string;\n}\n\nconst runCreate = async (\n context: CliContext,\n label: string,\n options: CreateOptions\n): Promise<void> => {\n const { token } = await requireAuthToken(context);\n const baseUrl = resolveApiBaseUrl(context);\n\n // Resolve permissions to scopes\n let scopes: string[] | undefined;\n\n if (options.permissions !== undefined) {\n const level = options.permissions as PermissionLevel;\n\n if (!PERMISSION_SCOPES[level]) {\n throw new CliError(\n `Invalid permissions \"${options.permissions}\". Use \"full-access\" or \"read-only\".`,\n EXIT_CODES.VALIDATION\n );\n }\n\n scopes = PERMISSION_SCOPES[level];\n }\n\n // Resolve workspace slugs to IDs\n let workspaceIds: string[] | undefined;\n\n if (options.workspaces !== undefined) {\n const slugs = options.workspaces\n .split(\",\")\n .map((s) => s.trim())\n .filter(Boolean);\n\n if (slugs.length === 0) {\n throw new CliError(\n \"No workspace slugs provided for --workspaces.\",\n EXIT_CODES.VALIDATION\n );\n }\n\n const allWorkspaces = await listWorkspaces(context, { baseUrl, token });\n workspaceIds = [];\n\n for (const slug of slugs) {\n const match = allWorkspaces.find(\n (ws) =>\n ws.urlKey === slug ||\n ws.id === slug ||\n ws.name.toLowerCase() === slug.toLowerCase()\n );\n\n if (!match) {\n throw new CliError(\n `Workspace \"${slug}\" not found. Run \\`donebear workspace list\\` to see available workspaces.`,\n EXIT_CODES.VALIDATION\n );\n }\n\n workspaceIds.push(match.id);\n }\n }\n\n // Parse expiration duration\n let expiresAt: string | undefined;\n\n if (options.expires !== undefined) {\n expiresAt = parseDuration(options.expires).toISOString();\n }\n\n const key = await createApiKey(context, {\n baseUrl,\n expiresAt,\n label,\n scopes,\n token,\n workspaceIds,\n });\n\n if (context.json) {\n writeOutput(context, {\n createdAt: key.createdAt,\n expiresAt: key.expiresAt,\n id: key.id,\n keyPrefix: key.keyPrefix,\n label: key.label,\n scopes: key.scopes,\n token: key.token,\n workspaceIds: key.workspaceIds,\n });\n return;\n }\n\n writeSuccess(context, \"API key created.\");\n writeInfo(context, \"\");\n writeInfo(context, ` ${key.token}`);\n writeInfo(context, \"\");\n writeInfo(context, ` Scopes: ${key.scopes.join(\", \")}`);\n\n if (key.workspaceIds && key.workspaceIds.length > 0) {\n writeInfo(\n context,\n ` Restricted to workspaces: ${key.workspaceIds.join(\", \")}`\n );\n }\n\n if (key.expiresAt) {\n writeInfo(\n context,\n ` Expires: ${new Date(key.expiresAt).toLocaleDateString()}`\n );\n }\n\n writeInfo(context, \"\");\n writeWarning(context, \"Save this key now — it will not be shown again.\");\n};\n\nconst runList = async (context: CliContext): Promise<void> => {\n const { token } = await requireAuthToken(context);\n const baseUrl = resolveApiBaseUrl(context);\n\n const keys = await listApiKeys(context, { baseUrl, token });\n\n if (context.json) {\n writeOutput(context, keys);\n return;\n }\n\n if (keys.length === 0) {\n writeInfo(context, \"No API keys found.\");\n return;\n }\n\n for (const key of keys) {\n const status = key.revokedAt ? \" (revoked)\" : \"\";\n const lastUsed = key.lastUsedAt\n ? `Last used: ${new Date(key.lastUsedAt).toLocaleDateString()}`\n : \"Never used\";\n const scopeStr = `[${key.scopes.join(\",\")}]`;\n const wsStr =\n key.workspaceIds && key.workspaceIds.length > 0\n ? ` ws:${key.workspaceIds.length}`\n : \"\";\n const expStr = key.expiresAt\n ? ` exp:${new Date(key.expiresAt).toLocaleDateString()}`\n : \"\";\n writeInfo(\n context,\n `${key.keyPrefix}... ${key.label} ${scopeStr}${wsStr}${expStr} ${lastUsed}${status} [${key.id}]`\n );\n }\n};\n\nconst runRevoke = async (context: CliContext, keyId: string): Promise<void> => {\n const { token } = await requireAuthToken(context);\n const baseUrl = resolveApiBaseUrl(context);\n\n await revokeApiKey(context, { baseUrl, keyId, token });\n\n if (context.json) {\n writeOutput(context, { id: keyId, ok: true });\n return;\n }\n\n writeSuccess(context, `API key ${keyId} revoked.`);\n};\n\nexport const registerApiKeyCommands = (program: Command): void => {\n const apiKey = program\n .command(\"api-key\")\n .alias(\"key\")\n .description(\"Manage personal API keys\")\n .addHelpText(\n \"after\",\n `\nExamples:\n donebear api-key create \"Raycast\"\n donebear api-key create \"CI\" --permissions read-only --expires 90d\n donebear api-key create \"Scoped\" --workspaces my-org,side-project --expires 1y\n donebear api-key list\n donebear api-key revoke <key-id>\n`\n )\n .action(async (_options: unknown, command: Command) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runList(context);\n });\n });\n\n apiKey\n .command(\"create <label>\")\n .description(\"Create a new personal API key\")\n .option(\n \"--permissions <value>\",\n 'Permission level: \"full-access\" or \"read-only\"',\n \"full-access\"\n )\n .option(\n \"--workspaces <slugs>\",\n \"Comma-separated workspace slugs to restrict the key to\"\n )\n .option(\n \"--expires <duration>\",\n 'Expiration duration, e.g. \"30d\", \"90d\", \"1y\"'\n )\n .action(async (label: string, options: CreateOptions, command: Command) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runCreate(context, label, options);\n });\n });\n\n apiKey\n .command(\"list\")\n .description(\"List all personal API keys\")\n .action(async (_options: unknown, command: Command) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runList(context);\n });\n });\n\n apiKey\n .command(\"revoke <key-id>\")\n .description(\"Revoke an API key\")\n .action(async (keyId: string, _options: unknown, command: Command) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runRevoke(context, keyId);\n });\n });\n};\n","import { spawn } from \"node:child_process\";\n\ninterface OpenCommand {\n command: string;\n args: string[];\n}\n\nconst getOpenCommand = (url: string): OpenCommand => {\n if (process.platform === \"darwin\") {\n return {\n args: [url],\n command: \"open\",\n };\n }\n\n if (process.platform === \"win32\") {\n return {\n args: [\"/c\", \"start\", \"\", url],\n command: \"cmd\",\n };\n }\n\n return {\n args: [url],\n command: \"xdg-open\",\n };\n};\n\nexport const openUrl = async (url: string): Promise<boolean> => {\n const openCommand = getOpenCommand(url);\n\n return await new Promise<boolean>((resolve) => {\n try {\n const child = spawn(openCommand.command, openCommand.args, {\n detached: true,\n stdio: \"ignore\",\n });\n\n child.once(\"error\", () => {\n resolve(false);\n });\n\n child.once(\"spawn\", () => {\n child.unref();\n resolve(true);\n });\n } catch {\n resolve(false);\n }\n });\n};\n","export const parsePositiveInteger = (value: string, label: string): number => {\n const parsed = Number.parseInt(value, 10);\n\n if (!Number.isInteger(parsed) || parsed <= 0) {\n throw new Error(`${label} must be a positive integer`);\n }\n\n return parsed;\n};\n","import { createServer } from \"node:http\";\n\nimport { CliError, EXIT_CODES } from \"./errors\";\n\ninterface OAuthCallbackOptions {\n redirectUrl: URL;\n expectedState: string;\n timeoutMs: number;\n}\n\nconst successHtml = (): string =>\n `<!doctype html><html><head><meta charset=\"utf-8\"/><title>Done Bear CLI</title></head><body><h1>Authentication complete</h1><p>You can return to your terminal.</p></body></html>`;\n\nconst escapeHtml = (text: string): string =>\n text\n .replaceAll(\"&\", \"&amp;\")\n .replaceAll(\"<\", \"&lt;\")\n .replaceAll(\">\", \"&gt;\")\n .replaceAll('\"', \"&quot;\");\n\nconst errorHtml = (message: string): string =>\n `<!doctype html><html><head><meta charset=\"utf-8\"/><title>Done Bear CLI</title></head><body><h1>Authentication failed</h1><p>${escapeHtml(message)}</p></body></html>`;\n\nexport const waitForOAuthCode = async (\n options: OAuthCallbackOptions\n): Promise<string> =>\n await new Promise<string>((resolve, reject) => {\n const host = options.redirectUrl.hostname;\n const port = Number(options.redirectUrl.port);\n const { pathname } = options.redirectUrl;\n\n if (!Number.isInteger(port) || port <= 0) {\n reject(\n new CliError(\n \"OAuth redirect URL requires an explicit port\",\n EXIT_CODES.ERROR\n )\n );\n return;\n }\n\n let settled = false;\n\n const finish = (result: { code?: string; error?: CliError }): void => {\n if (settled) {\n return;\n }\n\n settled = true;\n clearTimeout(timeout);\n\n server.close(() => {\n if (result.error) {\n reject(result.error);\n return;\n }\n\n resolve(result.code ?? \"\");\n });\n };\n\n const server = createServer((request, response) => {\n if (!request.url) {\n response.writeHead(400, { \"content-type\": \"text/html; charset=utf-8\" });\n response.end(errorHtml(\"Missing request URL\"));\n finish({\n error: new CliError(\n \"OAuth callback is missing a request URL\",\n EXIT_CODES.ERROR\n ),\n });\n return;\n }\n\n const url = new URL(request.url, options.redirectUrl.origin);\n\n if (url.pathname !== pathname) {\n response.writeHead(404, { \"content-type\": \"text/html; charset=utf-8\" });\n response.end(errorHtml(\"Invalid callback path\"));\n return;\n }\n\n const providerError = url.searchParams.get(\"error\");\n if (providerError) {\n const description =\n url.searchParams.get(\"error_description\") ?? providerError;\n\n response.writeHead(400, { \"content-type\": \"text/html; charset=utf-8\" });\n response.end(errorHtml(description));\n\n finish({\n error: new CliError(\n `OAuth provider returned an error: ${description}`,\n EXIT_CODES.ERROR\n ),\n });\n return;\n }\n\n const state = url.searchParams.get(\"state\");\n if (state !== options.expectedState) {\n response.writeHead(400, { \"content-type\": \"text/html; charset=utf-8\" });\n response.end(errorHtml(\"State verification failed\"));\n\n finish({\n error: new CliError(\n \"OAuth state verification failed\",\n EXIT_CODES.ERROR\n ),\n });\n return;\n }\n\n const code = url.searchParams.get(\"code\");\n if (!code) {\n response.writeHead(400, { \"content-type\": \"text/html; charset=utf-8\" });\n response.end(errorHtml(\"Authorization code was missing\"));\n\n finish({\n error: new CliError(\n \"OAuth callback is missing an authorization code\",\n EXIT_CODES.ERROR\n ),\n });\n return;\n }\n\n response.writeHead(200, { \"content-type\": \"text/html; charset=utf-8\" });\n response.end(successHtml());\n finish({ code });\n });\n\n server.on(\"error\", (error) => {\n finish({\n error: new CliError(\n `Failed to start callback server on ${host}:${port}: ${error.message}`,\n EXIT_CODES.ERROR\n ),\n });\n });\n\n const timeout = setTimeout(() => {\n finish({\n error: new CliError(\n \"Timed out waiting for OAuth callback\",\n EXIT_CODES.CANCELLED\n ),\n });\n }, options.timeoutMs);\n\n server.listen(port, host);\n });\n","import { createHash, randomBytes } from \"node:crypto\";\n\nexport const createOAuthState = (): string => randomBytes(24).toString(\"hex\");\n\nexport const createCodeVerifier = (): string =>\n randomBytes(64).toString(\"base64url\");\n\nexport const createCodeChallenge = (verifier: string): string =>\n createHash(\"sha256\").update(verifier).digest().toString(\"base64url\");\n","import type { Command } from \"commander\";\n\nimport { resolveAuthToken, resolveTokenStatus } from \"../auth-session\";\nimport { openUrl } from \"../browser\";\nimport { parsePositiveInteger } from \"../command-parsers\";\nimport {\n DEFAULT_OAUTH_CALLBACK_PATH,\n DEFAULT_OAUTH_CALLBACK_PORT,\n DEFAULT_OAUTH_TIMEOUT_SECONDS,\n} from \"../constants\";\nimport { EXIT_CODES } from \"../errors\";\nimport { waitForOAuthCode } from \"../oauth-callback\";\nimport { exchangeAuthorizationCode } from \"../oauth-token\";\nimport type { OAuthTokenConfig } from \"../oauth-token\";\nimport { writeInfo, writeJson, writeSuccess, writeWarning } from \"../output\";\nimport {\n createCodeChallenge,\n createCodeVerifier,\n createOAuthState,\n} from \"../pkce\";\nimport { contextFromCommand, runWithErrorHandling } from \"../runtime\";\nimport {\n clearStoredAuthSession,\n readStoredAuthSession,\n writeStoredAuthSession,\n} from \"../storage\";\nimport {\n buildOAuthUrls,\n resolveOAuthClientId,\n resolveSupabaseConfig,\n tokenResponseToStoredSession,\n} from \"../supabase\";\nimport type { CliContext } from \"../types\";\n\ninterface AuthLoginOptions {\n port: number;\n timeout: number;\n open: boolean;\n}\n\nconst runLogin = async (\n context: CliContext,\n options: AuthLoginOptions\n): Promise<void> => {\n const config = resolveSupabaseConfig();\n const { authorizeUrl, tokenUrl } = buildOAuthUrls(config);\n const clientId = resolveOAuthClientId();\n\n const redirectUrl = new URL(\n `http://127.0.0.1:${options.port}${DEFAULT_OAUTH_CALLBACK_PATH}`\n );\n\n const state = createOAuthState();\n const codeVerifier = createCodeVerifier();\n const codeChallenge = createCodeChallenge(codeVerifier);\n\n const authUrl = new URL(authorizeUrl);\n authUrl.searchParams.set(\"client_id\", clientId);\n authUrl.searchParams.set(\"redirect_uri\", redirectUrl.toString());\n authUrl.searchParams.set(\"response_type\", \"code\");\n authUrl.searchParams.set(\"code_challenge\", codeChallenge);\n authUrl.searchParams.set(\"code_challenge_method\", \"S256\");\n authUrl.searchParams.set(\"state\", state);\n authUrl.searchParams.set(\"scope\", \"\");\n\n const callbackPromise = waitForOAuthCode({\n expectedState: state,\n redirectUrl,\n timeoutMs: options.timeout * 1000,\n });\n\n const authUrlString = authUrl.toString();\n\n if (!options.open) {\n writeInfo(context, \"Open this URL to continue authentication:\");\n writeInfo(context, authUrlString);\n } else if (await openUrl(authUrlString)) {\n writeInfo(context, \"Opened browser for authentication.\");\n } else {\n writeWarning(\n context,\n \"Failed to open the browser automatically. Open this URL manually:\"\n );\n writeInfo(context, authUrlString);\n }\n\n const authorizationCode = await callbackPromise;\n\n const tokenConfig: OAuthTokenConfig = { clientId, tokenUrl };\n const tokenResponse = await exchangeAuthorizationCode(\n tokenConfig,\n authorizationCode,\n codeVerifier,\n redirectUrl.toString()\n );\n\n const storedSession = tokenResponseToStoredSession(tokenResponse);\n await writeStoredAuthSession(storedSession);\n\n if (context.json) {\n writeJson({\n expiresAt: storedSession.expiresAt,\n ok: true,\n source: \"stored\",\n user: storedSession.user,\n });\n return;\n }\n\n writeSuccess(context, \"Authentication succeeded.\");\n\n if (storedSession.user?.email) {\n writeInfo(context, `Signed in as ${storedSession.user.email}`);\n }\n};\n\nconst runStatus = async (context: CliContext): Promise<void> => {\n const config = getOptionalSupabaseConfig();\n\n const token = await resolveAuthToken(context, config);\n\n if (!token) {\n if (context.json) {\n writeJson({\n authenticated: false,\n source: null,\n });\n } else {\n writeInfo(context, \"Not authenticated.\");\n writeInfo(context, \"Run `donebear auth login` to authenticate.\");\n }\n\n process.exitCode = EXIT_CODES.AUTH_REQUIRED;\n return;\n }\n\n const tokenStatus = resolveTokenStatus(token);\n\n if (context.json) {\n writeJson({\n authenticated: true,\n expired: tokenStatus.expired,\n expiresAt: token.expiresAt,\n expiresInSeconds: tokenStatus.expiresInSeconds,\n source: token.source,\n user: token.user,\n });\n return;\n }\n\n writeSuccess(context, \"Authenticated.\");\n writeInfo(context, `Source: ${token.source}`);\n\n if (token.user?.email) {\n writeInfo(context, `User: ${token.user.email}`);\n }\n\n if (token.expiresAt) {\n writeInfo(context, `Expires at: ${token.expiresAt}`);\n }\n};\n\nconst runLogout = async (context: CliContext): Promise<void> => {\n const existingSession = await readStoredAuthSession();\n await clearStoredAuthSession();\n\n if (context.json) {\n writeJson({\n ok: true,\n removedStoredCredentials: existingSession !== null,\n });\n return;\n }\n\n if (existingSession) {\n writeSuccess(context, \"Stored credentials removed.\");\n } else {\n writeInfo(context, \"No stored credentials found.\");\n }\n};\n\nconst getOptionalSupabaseConfig = () => {\n try {\n return resolveSupabaseConfig();\n } catch {\n return null;\n }\n};\n\nexport const registerAuthCommands = (program: Command): void => {\n const auth = program\n .command(\"auth\")\n .description(\"Authenticate donebear CLI\")\n .addHelpText(\n \"after\",\n `\nExamples:\n donebear auth login\n donebear auth login --no-open (print URL, don't open browser)\n donebear auth status --json\n donebear auth logout\n\nNon-interactive / CI use:\n export DONEBEAR_TOKEN=<your-token>\n donebear task list --json (no login required)\n`\n )\n .action(async (_options: unknown, command: Command) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runStatus(context);\n });\n });\n\n auth\n .command(\"login\")\n .description(\"Authenticate with OAuth in the browser\")\n .option(\n \"--port <port>\",\n \"Loopback callback port\",\n (value: string): number => parsePositiveInteger(value, \"Port\"),\n DEFAULT_OAUTH_CALLBACK_PORT\n )\n .option(\n \"--timeout <seconds>\",\n \"OAuth timeout in seconds\",\n (value: string): number => parsePositiveInteger(value, \"Timeout\"),\n DEFAULT_OAUTH_TIMEOUT_SECONDS\n )\n .option(\"--no-open\", \"Print URL instead of opening the browser\")\n .addHelpText(\n \"after\",\n `\nExamples:\n donebear auth login\n donebear auth login --no-open (print URL, copy and paste to browser)\n\nNon-interactive / CI use:\n Instead of logging in, set the DONEBEAR_TOKEN environment variable:\n export DONEBEAR_TOKEN=<your-api-token>\n`\n )\n .action(async (options: AuthLoginOptions, command: Command) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runLogin(context, options);\n });\n });\n\n auth\n .command(\"status\")\n .description(\"Check authentication status\")\n .action(async (_options: unknown, command: Command) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runStatus(context);\n });\n });\n\n auth\n .command(\"logout\")\n .alias(\"clear\")\n .description(\"Remove local cached credentials\")\n .action(async (_options: unknown, command: Command) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runLogout(context);\n });\n });\n};\n","import { dateOnlyEpochFromLocalDate, formatInstantEpoch } from \"./date-codecs\";\nimport type { TaskRecord, TaskState, TaskView } from \"./types\";\n\nconst DAY_MS = 24 * 60 * 60 * 1000;\n\nexport const buildTaskStartFields = (\n view: TaskView,\n now = new Date()\n): {\n start: string;\n startBucket: string;\n startDate: number | null;\n todayIndexReferenceDate: number | null;\n} => {\n const today = dateOnlyEpochFromLocalDate(now);\n const tomorrow = today + DAY_MS;\n\n switch (view) {\n case \"inbox\": {\n return {\n start: \"not_started\",\n startBucket: \"today\",\n startDate: null,\n todayIndexReferenceDate: null,\n };\n }\n case \"anytime\": {\n return {\n start: \"started\",\n startBucket: \"today\",\n startDate: null,\n todayIndexReferenceDate: null,\n };\n }\n case \"today\": {\n return {\n start: \"started\",\n startBucket: \"today\",\n startDate: today,\n todayIndexReferenceDate: today,\n };\n }\n case \"upcoming\": {\n return {\n start: \"started\",\n startBucket: \"upcoming\",\n startDate: tomorrow,\n todayIndexReferenceDate: null,\n };\n }\n case \"someday\": {\n return {\n start: \"someday\",\n startBucket: \"today\",\n startDate: null,\n todayIndexReferenceDate: null,\n };\n }\n default: {\n return {\n start: \"not_started\",\n startBucket: \"today\",\n startDate: null,\n todayIndexReferenceDate: null,\n };\n }\n }\n};\n\nexport const getTaskState = (task: TaskRecord): Exclude<TaskState, \"all\"> => {\n if (task.archivedAt !== null) {\n return \"archived\";\n }\n\n if (task.completedAt !== null) {\n return \"done\";\n }\n\n return \"open\";\n};\n\n/**\n * Determine which view a task belongs to.\n * Matches the frontend logic in manage-frontend/lib/tasks/task-status.ts\n */\nexport const resolveTaskView = (task: TaskRecord): TaskView | null => {\n // Repeat templates are hidden from normal views (they generate instances)\n if (task.repeatRule !== null && task.repeatTemplateId === null) {\n return null;\n }\n\n if (task.archivedAt !== null) {\n return \"trash\";\n }\n if (task.completedAt !== null) {\n return \"logbook\";\n }\n\n const { start, startDate, deadlineAt } = task;\n const today = dateOnlyEpochFromLocalDate();\n const tomorrow = today + DAY_MS;\n const hasDeadlineToday =\n deadlineAt !== null && deadlineAt >= today && deadlineAt < tomorrow;\n\n if (start === \"not_started\") {\n return hasDeadlineToday ? \"today\" : \"inbox\";\n }\n if (start === \"someday\") {\n return hasDeadlineToday ? \"today\" : \"someday\";\n }\n if (start !== \"started\") {\n return null;\n }\n if (startDate === null) {\n return hasDeadlineToday ? \"today\" : \"anytime\";\n }\n if (startDate < tomorrow || hasDeadlineToday) {\n return \"today\";\n }\n return \"upcoming\";\n};\n\nexport const formatEpochDate = (epochMs: number | null): string | null =>\n formatInstantEpoch(epochMs);\n","import { formatDateOnlyEpoch } from \"./date-codecs\";\nimport { getTaskState } from \"./task-defaults\";\nimport type { TaskRecord, TaskState } from \"./types\";\n\nconst SHORT_ID_SUFFIX_PATTERN = /-([a-f0-9]{8})$/u;\n\n/**\n * Find a record by reference: exact ID, key, ID prefix, slug shortId, or name.\n * Works for any entity with id, key, and name fields.\n */\nexport const findByRef = <T extends { id: string; key: string; name: string }>(\n ref: string,\n items: T[]\n): T | null => {\n const normalized = ref.trim().toLowerCase();\n const shortIdMatch = normalized.match(SHORT_ID_SUFFIX_PATTERN);\n const shortId = shortIdMatch?.[1] ?? null;\n\n for (const item of items) {\n if (\n item.id === ref ||\n item.key.toLowerCase() === normalized ||\n item.id.startsWith(ref) ||\n (shortId && item.id.replaceAll(\"-\", \"\").slice(0, 8) === shortId) ||\n item.name.toLowerCase() === normalized\n ) {\n return item;\n }\n }\n\n return null;\n};\n\nexport const normalizeWorkspaceRef = (\n value: string | undefined\n): string | null => {\n const normalized = value?.trim() ?? \"\";\n return normalized.length > 0 ? normalized : null;\n};\n\nexport const parseTaskState = (value: string): TaskState => {\n switch (value.trim().toLowerCase()) {\n case \"open\":\n case \"pending\": {\n return \"open\";\n }\n case \"done\":\n case \"complete\":\n case \"completed\": {\n return \"done\";\n }\n case \"archived\":\n case \"archive\": {\n return \"archived\";\n }\n case \"all\": {\n return \"all\";\n }\n default: {\n throw new Error(\n `Invalid state \"${value}\". Expected one of: open, done, archived, all.`\n );\n }\n }\n};\n\nconst toTaskMarker = (task: TaskRecord): string => {\n const state = getTaskState(task);\n\n if (state === \"done\") {\n return \"[x]\";\n }\n\n if (state === \"archived\") {\n return \"[-]\";\n }\n\n return \"[ ]\";\n};\n\nexport const taskListHeaders = (): string[] => [\n \"id\",\n \"title\",\n \"state\",\n \"deadline\",\n];\n\nexport const taskListRows = (tasks: TaskRecord[]): string[][] =>\n tasks.map((task) => [\n task.id,\n task.title,\n getTaskState(task),\n formatDateOnlyEpoch(task.deadlineAt) ?? \"\",\n ]);\n\nexport const taskListLines = (tasks: TaskRecord[]): string[] =>\n tasks.map((task) => {\n const marker = toTaskMarker(task);\n const deadline = formatDateOnlyEpoch(task.deadlineAt);\n const suffix = deadline ? ` due ${deadline}` : \"\";\n return `${marker} ${task.id.slice(0, 8)} ${task.title}${suffix}`;\n });\n","import { setCurrentWorkspace } from \"./context-store\";\nimport { listWorkspaces } from \"./manage-api\";\nimport type { CliContext, WorkspaceScope, WorkspaceSummary } from \"./types\";\n\nconst WORKSPACE_URL_KEY_REGEX = /^[a-z0-9]+(?:-[a-z0-9]+)*$/u;\n\nconst fetchWorkspaces = async (\n context: CliContext,\n options: { token: string; apiBaseUrl: string }\n): Promise<WorkspaceSummary[]> => {\n const workspaces = await listWorkspaces(context, {\n baseUrl: options.apiBaseUrl,\n token: options.token,\n });\n\n if (workspaces.length === 0) {\n throw new Error(\"No workspaces available for this account\");\n }\n\n return workspaces;\n};\n\nexport const resolveWorkspaceScope = async (\n context: CliContext,\n options: {\n token: string;\n apiBaseUrl: string;\n workspaceRef: string | null;\n storedWorkspaceId: string | null;\n }\n): Promise<WorkspaceScope> => {\n const workspaces = await fetchWorkspaces(context, options);\n\n if (options.workspaceRef) {\n const selected = byReference(workspaces, options.workspaceRef);\n\n if (!selected) {\n throw new Error(\n `Workspace \"${options.workspaceRef}\" not found. Run \\`donebear workspace list\\`.`\n );\n }\n\n return { autoSelected: false, mode: \"single\", workspace: selected };\n }\n\n if (options.storedWorkspaceId) {\n const selected = byReference(workspaces, options.storedWorkspaceId);\n\n if (selected) {\n return { autoSelected: false, mode: \"single\", workspace: selected };\n }\n }\n\n if (workspaces.length === 1) {\n const [workspace] = workspaces;\n\n if (!workspace) {\n throw new Error(\"No workspaces available for this account\");\n }\n\n await setCurrentWorkspace(workspace.id);\n\n return { autoSelected: true, mode: \"single\", workspace };\n }\n\n return { mode: \"all\", workspaces };\n};\n\nexport const scopeLabel = (scope: WorkspaceScope): string =>\n scope.mode === \"all\" ? \"All Workspaces\" : scope.workspace.name;\n\nexport const scopeJsonFields = (\n scope: WorkspaceScope\n): Record<string, unknown> =>\n scope.mode === \"all\"\n ? { workspaces: scope.workspaces }\n : { autoSelected: scope.autoSelected, workspace: scope.workspace };\n\nconst normalize = (value: string): string => value.trim().toLowerCase();\n\nconst byReference = (\n workspaces: WorkspaceSummary[],\n reference: string\n): WorkspaceSummary | null => {\n const normalized = normalize(reference);\n\n for (const workspace of workspaces) {\n if (workspace.id === reference) {\n return workspace;\n }\n\n if (workspace.urlKey && normalize(workspace.urlKey) === normalized) {\n return workspace;\n }\n\n if (normalize(workspace.name) === normalized) {\n return workspace;\n }\n }\n\n return null;\n};\n\nexport const toWorkspaceUrlKey = (name: string): string => {\n const slug = name\n .trim()\n .toLowerCase()\n .replaceAll(/[^a-z0-9]+/gu, \"-\")\n .replaceAll(/^-+|-+$/gu, \"\")\n .replaceAll(/-{2,}/gu, \"-\");\n\n return slug.slice(0, 50);\n};\n\nexport const isValidWorkspaceUrlKey = (value: string): boolean =>\n WORKSPACE_URL_KEY_REGEX.test(value) && value.length >= 3;\n\nexport const resolveWorkspace = async (\n context: CliContext,\n options: {\n token: string;\n apiBaseUrl: string;\n workspaceRef: string | null;\n storedWorkspaceId: string | null;\n }\n): Promise<{ workspace: WorkspaceSummary; autoSelected: boolean }> => {\n const scope = await resolveWorkspaceScope(context, options);\n\n if (scope.mode === \"single\") {\n return { autoSelected: scope.autoSelected, workspace: scope.workspace };\n }\n\n throw new Error(\n \"No default workspace selected. Run `donebear workspace use <id-or-slug>`.\"\n );\n};\n","// donebear context [--workspace <ws>] [--tasks-limit <n>] [--markdown]\n// Workspace state snapshot for agent orientation\n\nimport type { Command } from \"commander\";\n\nimport { resolveCommandContext } from \"../command-context\";\nimport { normalizeWorkspaceRef } from \"../command-helpers\";\nimport { parsePositiveInteger } from \"../command-parsers\";\nimport { formatDateOnlyEpoch } from \"../date-codecs\";\nimport { loadProjectsByWorkspace, loadTasksByWorkspace } from \"../manage-api\";\nimport { writeInfo, writeOutput } from \"../output\";\nimport { contextFromCommand, runWithErrorHandling } from \"../runtime\";\nimport { getTaskState, resolveTaskView } from \"../task-defaults\";\nimport type { ProjectRecord, StoredSessionUser, TaskRecord } from \"../types\";\nimport { resolveWorkspace } from \"../workspace-context\";\n\nconst DEFAULT_TASKS_LIMIT = 10;\n\ninterface ContextOptions {\n workspace?: string;\n tasksLimit: number;\n markdown: boolean;\n}\n\ninterface TaskSummary {\n id: string;\n title: string;\n deadline: string | null;\n view: string | null;\n}\n\ninterface ProjectSummary {\n id: string;\n key: string;\n name: string;\n targetDate: string | null;\n}\n\ninterface TaskCounts {\n open: number;\n done: number;\n archived: number;\n total: number;\n}\n\nconst buildTaskCounts = (tasks: TaskRecord[]): TaskCounts => {\n const counts: TaskCounts = {\n archived: 0,\n done: 0,\n open: 0,\n total: tasks.length,\n };\n for (const task of tasks) {\n const state = getTaskState(task);\n if (state === \"open\") {\n counts.open += 1;\n } else if (state === \"done\") {\n counts.done += 1;\n } else if (state === \"archived\") {\n counts.archived += 1;\n }\n }\n return counts;\n};\n\nconst buildRecentTasks = (tasks: TaskRecord[], limit: number): TaskSummary[] =>\n [...tasks]\n .filter((t) => getTaskState(t) === \"open\")\n .toSorted((a, b) => (b.updatedAt ?? 0) - (a.updatedAt ?? 0))\n .slice(0, limit)\n .map((t) => ({\n deadline: formatDateOnlyEpoch(t.deadlineAt),\n id: t.id,\n title: t.title,\n view: resolveTaskView(t),\n }));\n\nconst buildActiveProjects = (projects: ProjectRecord[]): ProjectSummary[] =>\n projects\n .filter((p) => p.archivedAt === null && p.completedAt === null)\n .map((p) => ({\n id: p.id,\n key: p.key,\n name: p.name,\n targetDate: formatDateOnlyEpoch(p.targetDate),\n }));\n\nconst formatMarkdownOutput = (\n context: ReturnType<typeof contextFromCommand>,\n user: StoredSessionUser | null | undefined,\n workspace: { name: string; urlKey?: string | null },\n taskCounts: TaskCounts,\n recentTasks: TaskSummary[],\n activeProjects: ProjectSummary[]\n): void => {\n const lines: string[] = [\n \"# Donebear Context\",\n \"\",\n `## Workspace: ${workspace.name}${workspace.urlKey ? ` (${workspace.urlKey})` : \"\"}`,\n `User: ${user?.email ?? user?.id ?? \"(unknown)\"}`,\n \"\",\n `## Tasks: ${taskCounts.open} open / ${taskCounts.done} done / ${taskCounts.total} total`,\n ];\n\n if (recentTasks.length > 0) {\n lines.push(\"\", \"## Recent Open Tasks\");\n for (const t of recentTasks) {\n const deadline = t.deadline ? `, due ${t.deadline}` : \"\";\n lines.push(`- [${t.id.slice(0, 8)}] ${t.title} — ${t.view}${deadline}`);\n }\n }\n\n if (activeProjects.length > 0) {\n lines.push(\"\", \"## Active Projects\");\n for (const p of activeProjects) {\n const target = p.targetDate ? ` (target: ${p.targetDate})` : \"\";\n lines.push(`- [${p.key}] ${p.name}${target}`);\n }\n }\n\n lines.push(\n \"\",\n \"## Quick Commands\",\n \"donebear spec # full CLI spec, no auth needed\",\n \"donebear spec task add # detailed spec for one command\",\n \"donebear task list --json\",\n 'donebear task add \"Title\" --when today --json',\n 'donebear search \"query\" --json'\n );\n\n writeInfo(context, lines.join(\"\\n\"));\n};\n\nconst writeTextOutput = (\n context: ReturnType<typeof contextFromCommand>,\n workspace: { name: string },\n taskCounts: TaskCounts,\n recentTasks: TaskSummary[],\n activeProjects: ProjectSummary[]\n): void => {\n writeInfo(context, `Workspace: ${workspace.name}`);\n writeInfo(\n context,\n `Tasks: ${taskCounts.open} open / ${taskCounts.done} done / ${taskCounts.total} total`\n );\n if (recentTasks.length > 0) {\n writeInfo(context, `Recent open tasks (${recentTasks.length}):`);\n for (const t of recentTasks) {\n const deadline = t.deadline ? ` (due ${t.deadline})` : \"\";\n writeInfo(context, ` [${t.id.slice(0, 8)}] ${t.title}${deadline}`);\n }\n }\n if (activeProjects.length > 0) {\n writeInfo(context, `Active projects (${activeProjects.length}):`);\n for (const p of activeProjects) {\n writeInfo(context, ` [${p.key}] ${p.name}`);\n }\n }\n};\n\nconst runContext = async (\n context: ReturnType<typeof contextFromCommand>,\n workspaceOverride: string | null,\n options: ContextOptions\n): Promise<void> => {\n const commandContext = await resolveCommandContext(context);\n\n const { workspace } = await resolveWorkspace(context, {\n apiBaseUrl: commandContext.apiBaseUrl,\n storedWorkspaceId: commandContext.localContext.workspaceId,\n token: commandContext.token,\n workspaceRef: workspaceOverride ?? normalizeWorkspaceRef(options.workspace),\n });\n\n const [tasks, projects] = await Promise.all([\n loadTasksByWorkspace(context, {\n baseUrl: commandContext.apiBaseUrl,\n token: commandContext.token,\n workspaceId: workspace.id,\n }),\n loadProjectsByWorkspace(context, {\n baseUrl: commandContext.apiBaseUrl,\n token: commandContext.token,\n workspaceId: workspace.id,\n }),\n ]);\n\n const taskCounts = buildTaskCounts(tasks);\n const recentTasks = buildRecentTasks(tasks, options.tasksLimit);\n const activeProjects = buildActiveProjects(projects);\n const { user } = commandContext.resolvedToken;\n\n if (options.markdown) {\n formatMarkdownOutput(\n context,\n user,\n workspace,\n taskCounts,\n recentTasks,\n activeProjects\n );\n return;\n }\n\n if (context.json) {\n writeOutput(context, {\n activeProjects,\n generatedAt: new Date().toISOString(),\n ok: true,\n recentTasks,\n taskCounts,\n user: {\n email: user?.email ?? null,\n id: user?.id ?? null,\n },\n workspace: {\n id: workspace.id,\n name: workspace.name,\n urlKey: workspace.urlKey,\n },\n });\n return;\n }\n\n writeTextOutput(context, workspace, taskCounts, recentTasks, activeProjects);\n};\n\nexport const registerContextCommand = (\n program: Command,\n workspaceOverride: string | null\n): void => {\n program\n .command(\"context\")\n .description(\"Workspace snapshot for agent orientation\")\n .option(\"-w, --workspace <workspace>\", \"Workspace id, slug, or exact name\")\n .option(\n \"--tasks-limit <count>\",\n \"Max recent open tasks to include\",\n (value: string): number => parsePositiveInteger(value, \"Tasks limit\"),\n DEFAULT_TASKS_LIMIT\n )\n .option(\"--markdown\", \"Output as markdown (for system prompt injection)\")\n .addHelpText(\n \"after\",\n `\nExamples:\n donebear context --json\n donebear context --markdown\n donebear context --tasks-limit 20 --json\n donebear context --markdown > context.md\n`\n )\n .action(async (options: ContextOptions, command: Command) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runContext(context, workspaceOverride, options);\n });\n });\n};\n","import { createRequire } from \"node:module\";\n\ninterface PackageManifest {\n version: string;\n}\n\n// This module must stay one directory below the package root so the relative\n// require resolves both from src/ (vitest) and from the bundled dist/ output.\nconst require = createRequire(import.meta.url);\n\nexport const packageManifest = require(\"../package.json\") as PackageManifest;\n","import { existsSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { styleText } from \"node:util\";\n\nimport type { Command } from \"commander\";\n\nimport { resolveAuthToken } from \"../auth-session\";\nimport { CLI_NAME } from \"../constants\";\nimport { EXIT_CODES } from \"../errors\";\nimport { packageManifest } from \"../manifest\";\nimport { writeJson } from \"../output\";\nimport { contextFromCommand, runWithErrorHandling } from \"../runtime\";\nimport { resolveSupabaseConfig } from \"../supabase\";\nimport type { CliContext } from \"../types\";\n\ntype CheckStatus = \"pass\" | \"warn\" | \"fail\";\n\ninterface CheckResult {\n name: string;\n status: CheckStatus;\n message: string;\n}\n\n// ---------------------------------------------------------------------------\n// Individual checks\n// ---------------------------------------------------------------------------\n\nconst checkCliVersion = async (): Promise<CheckResult> => {\n const current = packageManifest.version;\n\n try {\n const response = await fetch(\"https://registry.npmjs.org/donebear/latest\", {\n signal: AbortSignal.timeout(5000),\n });\n\n if (!response.ok) {\n return {\n message: `v${current} (unable to check for updates)`,\n name: \"CLI Version\",\n status: \"warn\",\n };\n }\n\n const data = (await response.json()) as { version?: string };\n const latest = data.version;\n\n if (!latest) {\n return {\n message: `v${current} (unable to check for updates)`,\n name: \"CLI Version\",\n status: \"warn\",\n };\n }\n\n if (current === latest) {\n return {\n message: `v${current} (latest)`,\n name: \"CLI Version\",\n status: \"pass\",\n };\n }\n\n return {\n message: `v${current} (update available: v${latest})`,\n name: \"CLI Version\",\n status: \"warn\",\n };\n } catch {\n return {\n message: `v${current} (unable to check for updates)`,\n name: \"CLI Version\",\n status: \"warn\",\n };\n }\n};\n\nconst maskToken = (token: string): string => {\n if (token.length <= 8) {\n return \"***\";\n }\n\n return `${token.slice(0, 4)}...${token.slice(-4)}`;\n};\n\nconst checkAuth = async (context: CliContext): Promise<CheckResult> => {\n try {\n const config = (() => {\n try {\n return resolveSupabaseConfig();\n } catch {\n return null;\n }\n })();\n\n const token = await resolveAuthToken(context, config);\n\n if (!token) {\n return {\n message: \"No API key or token found\",\n name: \"Auth\",\n status: \"fail\",\n };\n }\n\n return {\n message: `${maskToken(token.token)} (source: ${token.source})`,\n name: \"Auth\",\n status: \"pass\",\n };\n } catch {\n return {\n message: \"Failed to resolve authentication\",\n name: \"Auth\",\n status: \"fail\",\n };\n }\n};\n\nconst checkWorkspace = async (): Promise<CheckResult> => {\n try {\n const { ensureLocalContext } = await import(\"../context-store\");\n const localContext = await ensureLocalContext();\n\n if (!localContext.workspaceId) {\n return {\n message: \"No workspace selected (run `donebear workspace use`)\",\n name: \"Workspace\",\n status: \"warn\",\n };\n }\n\n return {\n message: `Selected: ${localContext.workspaceId.slice(0, 8)}...`,\n name: \"Workspace\",\n status: \"pass\",\n };\n } catch {\n return {\n message: \"Unable to read workspace state\",\n name: \"Workspace\",\n status: \"warn\",\n };\n }\n};\n\ninterface AgentInfo {\n name: string;\n detected: boolean;\n}\n\nconst detectClaudeDesktop = (home: string): boolean => {\n if (process.platform === \"darwin\") {\n return existsSync(\n join(\n home,\n \"Library\",\n \"Application Support\",\n \"Claude\",\n \"claude_desktop_config.json\"\n )\n );\n }\n\n if (process.platform === \"win32\") {\n const appData = process.env.APPDATA ?? join(home, \"AppData\", \"Roaming\");\n return existsSync(join(appData, \"Claude\", \"claude_desktop_config.json\"));\n }\n\n return existsSync(join(home, \".config\", \"claude\", \"config.json\"));\n};\n\nconst detectAgents = (): AgentInfo[] => {\n const home = homedir();\n\n const agents: AgentInfo[] = [\n {\n detected: existsSync(join(home, \".claude\")),\n name: \"Claude Code\",\n },\n {\n detected: existsSync(join(home, \".cursor\")),\n name: \"Cursor\",\n },\n {\n detected: detectClaudeDesktop(home),\n name: \"Claude Desktop\",\n },\n {\n detected: existsSync(join(process.cwd(), \".vscode\", \"mcp.json\")),\n name: \"VS Code\",\n },\n ];\n\n return agents;\n};\n\nconst checkAgents = (): CheckResult => {\n const agents = detectAgents();\n const detected = agents.filter((a) => a.detected);\n\n if (detected.length === 0) {\n return {\n message: \"None detected\",\n name: \"AI Agents\",\n status: \"pass\",\n };\n }\n\n return {\n message: `Detected: ${detected.map((a) => a.name).join(\", \")}`,\n name: \"AI Agents\",\n status: \"pass\",\n };\n};\n\n// ---------------------------------------------------------------------------\n// Output\n// ---------------------------------------------------------------------------\n\nconst STATUS_ICONS: Record<CheckStatus, string> = {\n fail: \"\\u2718\",\n pass: \"\\u2714\",\n warn: \"\\u26A0\",\n};\n\nconst STATUS_COLORS: Record<CheckStatus, Parameters<typeof styleText>[0]> = {\n fail: \"red\",\n pass: \"green\",\n warn: \"yellow\",\n};\n\nconst writeInteractiveResult = (\n context: CliContext,\n checks: CheckResult[]\n): void => {\n const title = context.color\n ? styleText(\"bold\", ` ${CLI_NAME} doctor`)\n : ` ${CLI_NAME} doctor`;\n\n process.stdout.write(`\\n${title}\\n\\n`);\n\n for (const check of checks) {\n const icon = STATUS_ICONS[check.status];\n const line = ` ${icon} ${check.name}: ${check.message}`;\n const colored = context.color\n ? styleText(STATUS_COLORS[check.status], line)\n : line;\n process.stdout.write(`${colored}\\n`);\n }\n\n process.stdout.write(\"\\n\");\n};\n\n// ---------------------------------------------------------------------------\n// Command\n// ---------------------------------------------------------------------------\n\nconst runDoctor = async (context: CliContext): Promise<void> => {\n const checks = await Promise.all([\n checkCliVersion(),\n checkAuth(context),\n checkWorkspace(),\n ]);\n\n checks.push(checkAgents());\n\n const ok = checks.every((c) => c.status !== \"fail\");\n\n if (context.json) {\n writeJson({ checks, ok });\n } else {\n writeInteractiveResult(context, checks);\n }\n\n if (!ok) {\n process.exitCode = EXIT_CODES.ERROR;\n }\n};\n\nexport const registerDoctorCommand = (program: Command): void => {\n program\n .command(\"doctor\")\n .description(\"Run environment diagnostics\")\n .action(async (_options: unknown, command: Command) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runDoctor(context);\n });\n });\n};\n","// donebear history [--workspace <ws>] [--model Task|Project|Label|Team] [--limit 50] [--format]\n// Shows recent sync actions as an audit log\n\nimport type { Command } from \"commander\";\n\nimport { resolveCommandContext } from \"../command-context\";\nimport { normalizeWorkspaceRef } from \"../command-helpers\";\nimport { parsePositiveInteger } from \"../command-parsers\";\nimport type { WorkspaceHistoryEntry } from \"../manage-api\";\nimport { listWorkspaceHistory } from \"../manage-api\";\nimport {\n writeFormattedRows,\n writeInfo,\n writeOutput,\n writeWarning,\n} from \"../output\";\nimport { contextFromCommand, runWithErrorHandling } from \"../runtime\";\nimport { resolveWorkspace } from \"../workspace-context\";\n\nconst DEFAULT_HISTORY_LIMIT = 50;\n\n// Sync action code mapping: I=create U=update A=archive D=delete V=unarchive\nconst ACTION_LABELS: Record<string, string> = {\n A: \"ARCHIVE\",\n D: \"DELETE\",\n I: \"CREATE\",\n U: \"UPDATE\",\n V: \"UNARCHIVE\",\n};\n\ninterface HistoryOptions {\n workspace?: string;\n model?: string;\n limit: number;\n}\n\nconst formatActionCode = (action: string): string =>\n ACTION_LABELS[action] ?? action;\n\nconst formatHistoryDate = (isoString: string): string => {\n const date = new Date(isoString);\n if (Number.isNaN(date.getTime())) {\n return isoString;\n }\n const yyyy = date.getFullYear();\n const mm = String(date.getMonth() + 1).padStart(2, \"0\");\n const dd = String(date.getDate()).padStart(2, \"0\");\n const hh = String(date.getHours()).padStart(2, \"0\");\n const min = String(date.getMinutes()).padStart(2, \"0\");\n return `${yyyy}-${mm}-${dd} ${hh}:${min}`;\n};\n\nconst extractPayloadTitle = (entry: WorkspaceHistoryEntry): string => {\n if (!entry.payload) {\n return \"\";\n }\n const { title } = entry.payload;\n if (typeof title === \"string\") {\n return ` (title: \"${title}\")`;\n }\n return \"\";\n};\n\nconst runHistory = async (\n context: ReturnType<typeof contextFromCommand>,\n workspaceOverride: string | null,\n options: HistoryOptions\n): Promise<void> => {\n const commandContext = await resolveCommandContext(context);\n\n const { workspace } = await resolveWorkspace(context, {\n apiBaseUrl: commandContext.apiBaseUrl,\n storedWorkspaceId: commandContext.localContext.workspaceId,\n token: commandContext.token,\n workspaceRef: workspaceOverride ?? normalizeWorkspaceRef(options.workspace),\n });\n\n try {\n const history = await listWorkspaceHistory(context, {\n baseUrl: commandContext.apiBaseUrl,\n limit: options.limit,\n model: options.model,\n token: commandContext.token,\n workspaceId: workspace.id,\n });\n\n if (context.json) {\n writeOutput(context, { history, workspace });\n return;\n }\n\n const historyHeaders = [\"date\", \"action\", \"model\", \"modelId\", \"title\"];\n const historyRows = history.map((entry) => [\n formatHistoryDate(entry.createdAt),\n formatActionCode(entry.action),\n entry.modelName,\n entry.modelId.slice(0, 8),\n typeof entry.payload?.title === \"string\" ? entry.payload.title : \"\",\n ]);\n\n if (\n writeFormattedRows(context, history.length, historyHeaders, historyRows)\n ) {\n return;\n }\n\n if (history.length === 0) {\n writeInfo(context, \"No history entries found.\");\n return;\n }\n\n writeInfo(context, `History for ${workspace.name}:`);\n\n for (const entry of history) {\n const date = formatHistoryDate(entry.createdAt);\n const action = formatActionCode(entry.action);\n const modelId = entry.modelId.slice(0, 8);\n const title = extractPayloadTitle(entry);\n writeInfo(\n context,\n `${date} ${action} ${entry.modelName} ${modelId}...${title}`\n );\n }\n } catch {\n writeWarning(context, \"History is not available for this server version.\");\n writeWarning(context, \"Upgrade your manage-api to enable audit logs.\");\n }\n};\n\nexport const registerHistoryCommand = (\n program: Command,\n workspaceOverride: string | null\n): void => {\n program\n .command(\"history\")\n .description(\"Show recent workspace audit log\")\n .option(\"-w, --workspace <workspace>\", \"Workspace id, slug, or exact name\")\n .option(\"--model <model>\", \"Filter by model name: Task|Project|Label|Team\")\n .option(\n \"-n, --limit <count>\",\n \"Maximum number of entries\",\n (value: string): number => parsePositiveInteger(value, \"Limit\"),\n DEFAULT_HISTORY_LIMIT\n )\n .addHelpText(\n \"after\",\n `\nExamples:\n donebear history\n donebear history --model Task --limit 20\n donebear history --format csv\n`\n )\n .action(async (options: HistoryOptions, command: Command) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runHistory(context, workspaceOverride, options);\n });\n });\n};\n","import type { ThingsImportResult } from \"./things-runner\";\n\ninterface ThingsImportTextSummary {\n successMessage: string;\n infoLines: string[];\n}\n\nexport const summarizeThingsImportResult = (\n result: ThingsImportResult\n): ThingsImportTextSummary => {\n const infoLines = [\n `workspace: ${result.workspace.name}`,\n `database: ${result.databasePath}`,\n `source: ${result.counts.source.tasks} tasks, ${result.counts.source.projects} projects, ${result.counts.source.headings} headings, ${result.counts.source.areas} areas, ${result.counts.source.tags} tags, ${result.counts.source.checklistItems} checklist items`,\n `planned: ${result.counts.planned.teams ?? 0} teams, ${result.counts.planned.labels ?? 0} labels, ${result.counts.planned.projects ?? 0} projects, ${result.counts.planned.teamProjects ?? 0} team-project links, ${result.counts.planned.headings ?? 0} headings, ${result.counts.planned.tasks ?? 0} tasks, ${result.counts.planned.taskLabels ?? 0} task-label links, ${result.counts.planned.checklistItems ?? 0} checklist items`,\n ];\n\n if (result.dryRun) {\n infoLines.push(\"dry run: no mutations sent\");\n } else {\n infoLines.push(\n `mutations: ${result.execution.inserted} inserted, ${result.execution.updated} updated, ${result.execution.skipped} skipped across ${result.execution.batches} batch(es)`\n );\n }\n\n return {\n infoLines,\n successMessage: result.dryRun\n ? \"Things 3 import dry run complete\"\n : \"Things 3 import complete\",\n };\n};\n","export const normalizeThingsLabelLookupKey = (value: string): string =>\n value.trim().toLocaleLowerCase();\n","import { createHash } from \"node:crypto\";\n\nconst IMPORT_ID_NAMESPACE = \"b1f9f0ac-9f76-54ed-8eb0-7d6d3a0a0a31\";\nconst SYNC_COMPOSITE_ID_NAMESPACE = \"92a73695-d772-4b43-9fb4-d79f5fbef300\";\nconst IDEMPOTENCY_ID_NAMESPACE = \"4c8af5e2-1d36-5a0b-9c47-2f81b3d6e955\";\n\nconst uuidToBytes = (uuid: string): Uint8Array => {\n const normalized = uuid.replaceAll(\"-\", \"\");\n\n if (normalized.length !== 32) {\n throw new Error(`Invalid UUID namespace: ${uuid}`);\n }\n\n return Uint8Array.from(Buffer.from(normalized, \"hex\"));\n};\n\nconst bytesToUuid = (bytes: Uint8Array): string => {\n const hex = Buffer.from(bytes).toString(\"hex\");\n\n return [\n hex.slice(0, 8),\n hex.slice(8, 12),\n hex.slice(12, 16),\n hex.slice(16, 20),\n hex.slice(20, 32),\n ].join(\"-\");\n};\n\nconst createUuidV5 = (name: string, namespace: string): string => {\n const namespaceBytes = uuidToBytes(namespace);\n const hash = createHash(\"sha1\")\n .update(namespaceBytes)\n .update(Buffer.from(name, \"utf-8\"))\n .digest();\n\n const bytes = Uint8Array.from(hash.subarray(0, 16));\n const versionByte = bytes.at(6);\n const variantByte = bytes.at(8);\n\n if (typeof versionByte !== \"number\" || typeof variantByte !== \"number\") {\n throw new TypeError(\"Failed to generate a deterministic UUID.\");\n }\n\n // biome-ignore lint/suspicious/noBitwiseOperators: UUID v5 spec requires bitwise manipulation\n bytes[6] = (versionByte & 15) | 80;\n // biome-ignore lint/suspicious/noBitwiseOperators: UUID v5 spec requires bitwise manipulation\n bytes[8] = (variantByte & 63) | 128;\n\n return bytesToUuid(bytes);\n};\n\nconst createCompositeSyncId = (\n model: \"TaskLabel\" | \"TeamProject\",\n parts: readonly string[]\n): string =>\n createUuidV5(\n `${model}:${JSON.stringify(parts)}`,\n SYNC_COMPOSITE_ID_NAMESPACE\n );\n\nexport const createDeterministicImportId = (params: {\n workspaceId: string;\n modelName: string;\n sourceId: string;\n}): string =>\n createUuidV5(\n `things:${params.workspaceId}:${params.modelName}:${params.sourceId}`,\n IMPORT_ID_NAMESPACE\n );\n\n// Stable ids for --idempotency-key: retried commands produce the same\n// model id, batch id, and clientTxId, so the sync layer's\n// (client_id, client_tx_id) unique constraint dedupes them server-side.\nexport const createIdempotentMutationId = (params: {\n workspaceId: string;\n modelName: string;\n key: string;\n part: \"model\" | \"tx\" | \"batch\";\n}): string =>\n createUuidV5(\n `idem:${params.workspaceId}:${params.modelName}:${params.part}:${params.key}`,\n IDEMPOTENCY_ID_NAMESPACE\n );\n\nexport const createTaskLabelId = (params: {\n workspaceId: string;\n taskId: string;\n labelId: string;\n}): string =>\n createCompositeSyncId(\"TaskLabel\", [\n params.workspaceId,\n params.taskId,\n params.labelId,\n ]);\n\nexport const createTeamProjectId = (params: {\n workspaceId: string;\n teamId: string;\n projectId: string;\n}): string =>\n createCompositeSyncId(\"TeamProject\", [\n params.workspaceId,\n params.teamId,\n params.projectId,\n ]);\n","(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"rrule\"] = factory();\n\telse\n\t\troot[\"rrule\"] = factory();\n})(typeof self !== 'undefined' ? self : this, () => {\nreturn /******/ (() => { // webpackBootstrap\n/******/ \t\"use strict\";\n/******/ \t// The require scope\n/******/ \tvar __webpack_require__ = {};\n/******/ \t\n/************************************************************************/\n/******/ \t/* webpack/runtime/define property getters */\n/******/ \t(() => {\n/******/ \t\t// define getter functions for harmony exports\n/******/ \t\t__webpack_require__.d = (exports, definition) => {\n/******/ \t\t\tfor(var key in definition) {\n/******/ \t\t\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n/******/ \t\t\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n/******/ \t\t\t\t}\n/******/ \t\t\t}\n/******/ \t\t};\n/******/ \t})();\n/******/ \t\n/******/ \t/* webpack/runtime/hasOwnProperty shorthand */\n/******/ \t(() => {\n/******/ \t\t__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))\n/******/ \t})();\n/******/ \t\n/******/ \t/* webpack/runtime/make namespace object */\n/******/ \t(() => {\n/******/ \t\t// define __esModule on exports\n/******/ \t\t__webpack_require__.r = (exports) => {\n/******/ \t\t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n/******/ \t\t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n/******/ \t\t\t}\n/******/ \t\t\tObject.defineProperty(exports, '__esModule', { value: true });\n/******/ \t\t};\n/******/ \t})();\n/******/ \t\n/************************************************************************/\nvar __webpack_exports__ = {};\n// ESM COMPAT FLAG\n__webpack_require__.r(__webpack_exports__);\n\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n \"ALL_WEEKDAYS\": () => (/* reexport */ ALL_WEEKDAYS),\n \"Frequency\": () => (/* reexport */ Frequency),\n \"RRule\": () => (/* reexport */ RRule),\n \"RRuleSet\": () => (/* reexport */ RRuleSet),\n \"Weekday\": () => (/* reexport */ Weekday),\n \"datetime\": () => (/* reexport */ datetime),\n \"rrulestr\": () => (/* reexport */ rrulestr)\n});\n\n;// CONCATENATED MODULE: ./src/weekday.ts\n// =============================================================================\n// Weekday\n// =============================================================================\nvar ALL_WEEKDAYS = [\n 'MO',\n 'TU',\n 'WE',\n 'TH',\n 'FR',\n 'SA',\n 'SU',\n];\nvar Weekday = /** @class */ (function () {\n function Weekday(weekday, n) {\n if (n === 0)\n throw new Error(\"Can't create weekday with n == 0\");\n this.weekday = weekday;\n this.n = n;\n }\n Weekday.fromStr = function (str) {\n return new Weekday(ALL_WEEKDAYS.indexOf(str));\n };\n // __call__ - Cannot call the object directly, do it through\n // e.g. RRule.TH.nth(-1) instead,\n Weekday.prototype.nth = function (n) {\n return this.n === n ? this : new Weekday(this.weekday, n);\n };\n // __eq__\n Weekday.prototype.equals = function (other) {\n return this.weekday === other.weekday && this.n === other.n;\n };\n // __repr__\n Weekday.prototype.toString = function () {\n var s = ALL_WEEKDAYS[this.weekday];\n if (this.n)\n s = (this.n > 0 ? '+' : '') + String(this.n) + s;\n return s;\n };\n Weekday.prototype.getJsWeekday = function () {\n return this.weekday === 6 ? 0 : this.weekday + 1;\n };\n return Weekday;\n}());\n\n\n;// CONCATENATED MODULE: ./src/helpers.ts\n// =============================================================================\n// Helper functions\n// =============================================================================\n\nvar isPresent = function (value) {\n return value !== null && value !== undefined;\n};\nvar isNumber = function (value) {\n return typeof value === 'number';\n};\nvar isWeekdayStr = function (value) {\n return typeof value === 'string' && ALL_WEEKDAYS.includes(value);\n};\nvar isArray = Array.isArray;\n/**\n * Simplified version of python's range()\n */\nvar range = function (start, end) {\n if (end === void 0) { end = start; }\n if (arguments.length === 1) {\n end = start;\n start = 0;\n }\n var rang = [];\n for (var i = start; i < end; i++)\n rang.push(i);\n return rang;\n};\nvar clone = function (array) {\n return [].concat(array);\n};\nvar repeat = function (value, times) {\n var i = 0;\n var array = [];\n if (isArray(value)) {\n for (; i < times; i++)\n array[i] = [].concat(value);\n }\n else {\n for (; i < times; i++)\n array[i] = value;\n }\n return array;\n};\nvar toArray = function (item) {\n if (isArray(item)) {\n return item;\n }\n return [item];\n};\nfunction padStart(item, targetLength, padString) {\n if (padString === void 0) { padString = ' '; }\n var str = String(item);\n targetLength = targetLength >> 0;\n if (str.length > targetLength) {\n return String(str);\n }\n targetLength = targetLength - str.length;\n if (targetLength > padString.length) {\n padString += repeat(padString, targetLength / padString.length);\n }\n return padString.slice(0, targetLength) + String(str);\n}\n/**\n * Python like split\n */\nvar split = function (str, sep, num) {\n var splits = str.split(sep);\n return num\n ? splits.slice(0, num).concat([splits.slice(num).join(sep)])\n : splits;\n};\n/**\n * closure/goog/math/math.js:modulo\n * Copyright 2006 The Closure Library Authors.\n * The % operator in JavaScript returns the remainder of a / b, but differs from\n * some other languages in that the result will have the same sign as the\n * dividend. For example, -1 % 8 == -1, whereas in some other languages\n * (such as Python) the result would be 7. This function emulates the more\n * correct modulo behavior, which is useful for certain applications such as\n * calculating an offset index in a circular list.\n *\n * @param {number} a The dividend.\n * @param {number} b The divisor.\n * @return {number} a % b where the result is between 0 and b (either 0 <= x < b\n * or b < x <= 0, depending on the sign of b).\n */\nvar pymod = function (a, b) {\n var r = a % b;\n // If r and b differ in sign, add b to wrap the result to the correct sign.\n return r * b < 0 ? r + b : r;\n};\n/**\n * @see: <http://docs.python.org/library/functions.html#divmod>\n */\nvar divmod = function (a, b) {\n return { div: Math.floor(a / b), mod: pymod(a, b) };\n};\nvar empty = function (obj) {\n return !isPresent(obj) || obj.length === 0;\n};\n/**\n * Python-like boolean\n *\n * @return {Boolean} value of an object/primitive, taking into account\n * the fact that in Python an empty list's/tuple's\n * boolean value is False, whereas in JS it's true\n */\nvar notEmpty = function (obj) {\n return !empty(obj);\n};\n/**\n * Return true if a value is in an array\n */\nvar includes = function (arr, val) {\n return notEmpty(arr) && arr.indexOf(val) !== -1;\n};\n\n;// CONCATENATED MODULE: ./src/dateutil.ts\n\nvar datetime = function (y, m, d, h, i, s) {\n if (h === void 0) { h = 0; }\n if (i === void 0) { i = 0; }\n if (s === void 0) { s = 0; }\n return new Date(Date.UTC(y, m - 1, d, h, i, s));\n};\n/**\n * General date-related utilities.\n * Also handles several incompatibilities between JavaScript and Python\n *\n */\nvar MONTH_DAYS = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\n/**\n * Number of milliseconds of one day\n */\nvar ONE_DAY = 1000 * 60 * 60 * 24;\n/**\n * @see: <http://docs.python.org/library/datetime.html#datetime.MAXYEAR>\n */\nvar MAXYEAR = 9999;\n/**\n * Python uses 1-Jan-1 as the base for calculating ordinals but we don't\n * want to confuse the JS engine with milliseconds > Number.MAX_NUMBER,\n * therefore we use 1-Jan-1970 instead\n */\nvar ORDINAL_BASE = datetime(1970, 1, 1);\n/**\n * Python: MO-SU: 0 - 6\n * JS: SU-SAT 0 - 6\n */\nvar PY_WEEKDAYS = [6, 0, 1, 2, 3, 4, 5];\n/**\n * py_date.timetuple()[7]\n */\nvar getYearDay = function (date) {\n var dateNoTime = new Date(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate());\n return (Math.ceil((dateNoTime.valueOf() - new Date(date.getUTCFullYear(), 0, 1).valueOf()) /\n ONE_DAY) + 1);\n};\nvar isLeapYear = function (year) {\n return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;\n};\nvar isDate = function (value) {\n return value instanceof Date;\n};\nvar isValidDate = function (value) {\n return isDate(value) && !isNaN(value.getTime());\n};\n/**\n * @return {Number} the date's timezone offset in ms\n */\nvar tzOffset = function (date) {\n return date.getTimezoneOffset() * 60 * 1000;\n};\n/**\n * @see: <http://www.mcfedries.com/JavaScript/DaysBetween.asp>\n */\nvar daysBetween = function (date1, date2) {\n // The number of milliseconds in one day\n // Convert both dates to milliseconds\n var date1ms = date1.getTime();\n var date2ms = date2.getTime();\n // Calculate the difference in milliseconds\n var differencems = date1ms - date2ms;\n // Convert back to days and return\n return Math.round(differencems / ONE_DAY);\n};\n/**\n * @see: <http://docs.python.org/library/datetime.html#datetime.date.toordinal>\n */\nvar toOrdinal = function (date) {\n return daysBetween(date, ORDINAL_BASE);\n};\n/**\n * @see - <http://docs.python.org/library/datetime.html#datetime.date.fromordinal>\n */\nvar fromOrdinal = function (ordinal) {\n return new Date(ORDINAL_BASE.getTime() + ordinal * ONE_DAY);\n};\nvar getMonthDays = function (date) {\n var month = date.getUTCMonth();\n return month === 1 && isLeapYear(date.getUTCFullYear())\n ? 29\n : MONTH_DAYS[month];\n};\n/**\n * @return {Number} python-like weekday\n */\nvar getWeekday = function (date) {\n return PY_WEEKDAYS[date.getUTCDay()];\n};\n/**\n * @see: <http://docs.python.org/library/calendar.html#calendar.monthrange>\n */\nvar monthRange = function (year, month) {\n var date = datetime(year, month + 1, 1);\n return [getWeekday(date), getMonthDays(date)];\n};\n/**\n * @see: <http://docs.python.org/library/datetime.html#datetime.datetime.combine>\n */\nvar combine = function (date, time) {\n time = time || date;\n return new Date(Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(), time.getHours(), time.getMinutes(), time.getSeconds(), time.getMilliseconds()));\n};\nvar dateutil_clone = function (date) {\n var dolly = new Date(date.getTime());\n return dolly;\n};\nvar cloneDates = function (dates) {\n var clones = [];\n for (var i = 0; i < dates.length; i++) {\n clones.push(dateutil_clone(dates[i]));\n }\n return clones;\n};\n/**\n * Sorts an array of Date or Time objects\n */\nvar sort = function (dates) {\n dates.sort(function (a, b) {\n return a.getTime() - b.getTime();\n });\n};\nvar timeToUntilString = function (time, utc) {\n if (utc === void 0) { utc = true; }\n var date = new Date(time);\n return [\n padStart(date.getUTCFullYear().toString(), 4, '0'),\n padStart(date.getUTCMonth() + 1, 2, '0'),\n padStart(date.getUTCDate(), 2, '0'),\n 'T',\n padStart(date.getUTCHours(), 2, '0'),\n padStart(date.getUTCMinutes(), 2, '0'),\n padStart(date.getUTCSeconds(), 2, '0'),\n utc ? 'Z' : '',\n ].join('');\n};\nvar untilStringToDate = function (until) {\n var re = /^(\\d{4})(\\d{2})(\\d{2})(T(\\d{2})(\\d{2})(\\d{2})Z?)?$/;\n var bits = re.exec(until);\n if (!bits)\n throw new Error(\"Invalid UNTIL value: \".concat(until));\n return new Date(Date.UTC(parseInt(bits[1], 10), parseInt(bits[2], 10) - 1, parseInt(bits[3], 10), parseInt(bits[5], 10) || 0, parseInt(bits[6], 10) || 0, parseInt(bits[7], 10) || 0));\n};\nvar dateTZtoISO8601 = function (date, timeZone) {\n // date format for sv-SE is almost ISO8601\n var dateStr = date.toLocaleString('sv-SE', { timeZone: timeZone });\n // '2023-02-07 10:41:36'\n return dateStr.replace(' ', 'T') + 'Z';\n};\nvar dateInTimeZone = function (date, timeZone) {\n var localTimeZone = Intl.DateTimeFormat().resolvedOptions().timeZone;\n // Date constructor can only reliably parse dates in ISO8601 format\n var dateInLocalTZ = new Date(dateTZtoISO8601(date, localTimeZone));\n var dateInTargetTZ = new Date(dateTZtoISO8601(date, timeZone !== null && timeZone !== void 0 ? timeZone : 'UTC'));\n var tzOffset = dateInTargetTZ.getTime() - dateInLocalTZ.getTime();\n return new Date(date.getTime() - tzOffset);\n};\n\n;// CONCATENATED MODULE: ./src/iterresult.ts\n/**\n * This class helps us to emulate python's generators, sorta.\n */\nvar IterResult = /** @class */ (function () {\n function IterResult(method, args) {\n this.minDate = null;\n this.maxDate = null;\n this._result = [];\n this.total = 0;\n this.method = method;\n this.args = args;\n if (method === 'between') {\n this.maxDate = args.inc\n ? args.before\n : new Date(args.before.getTime() - 1);\n this.minDate = args.inc ? args.after : new Date(args.after.getTime() + 1);\n }\n else if (method === 'before') {\n this.maxDate = args.inc ? args.dt : new Date(args.dt.getTime() - 1);\n }\n else if (method === 'after') {\n this.minDate = args.inc ? args.dt : new Date(args.dt.getTime() + 1);\n }\n }\n /**\n * Possibly adds a date into the result.\n *\n * @param {Date} date - the date isn't necessarly added to the result\n * list (if it is too late/too early)\n * @return {Boolean} true if it makes sense to continue the iteration\n * false if we're done.\n */\n IterResult.prototype.accept = function (date) {\n ++this.total;\n var tooEarly = this.minDate && date < this.minDate;\n var tooLate = this.maxDate && date > this.maxDate;\n if (this.method === 'between') {\n if (tooEarly)\n return true;\n if (tooLate)\n return false;\n }\n else if (this.method === 'before') {\n if (tooLate)\n return false;\n }\n else if (this.method === 'after') {\n if (tooEarly)\n return true;\n this.add(date);\n return false;\n }\n return this.add(date);\n };\n /**\n *\n * @param {Date} date that is part of the result.\n * @return {Boolean} whether we are interested in more values.\n */\n IterResult.prototype.add = function (date) {\n this._result.push(date);\n return true;\n };\n /**\n * 'before' and 'after' return only one date, whereas 'all'\n * and 'between' an array.\n *\n * @return {Date,Array?}\n */\n IterResult.prototype.getValue = function () {\n var res = this._result;\n switch (this.method) {\n case 'all':\n case 'between':\n return res;\n case 'before':\n case 'after':\n default:\n return (res.length ? res[res.length - 1] : null);\n }\n };\n IterResult.prototype.clone = function () {\n return new IterResult(this.method, this.args);\n };\n return IterResult;\n}());\n/* harmony default export */ const iterresult = (IterResult);\n\n;// CONCATENATED MODULE: ./node_modules/tslib/tslib.es6.js\n/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nfunction __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nvar __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nfunction __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nfunction __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nfunction __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nfunction __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nfunction __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nfunction __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nvar __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n var desc = Object.getOwnPropertyDescriptor(m, k);\r\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\r\n desc = { enumerable: true, get: function() { return m[k]; } };\r\n }\r\n Object.defineProperty(o, k2, desc);\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nfunction __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nfunction __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nfunction __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nfunction __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nfunction __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nfunction __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nfunction __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nfunction __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nfunction __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nfunction __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nfunction __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nfunction __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nfunction __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nfunction __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nfunction __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\nfunction __classPrivateFieldIn(state, receiver) {\r\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\r\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\r\n}\r\n\n;// CONCATENATED MODULE: ./src/callbackiterresult.ts\n\n\n/**\n * IterResult subclass that calls a callback function on each add,\n * and stops iterating when the callback returns false.\n */\nvar CallbackIterResult = /** @class */ (function (_super) {\n __extends(CallbackIterResult, _super);\n function CallbackIterResult(method, args, iterator) {\n var _this = _super.call(this, method, args) || this;\n _this.iterator = iterator;\n return _this;\n }\n CallbackIterResult.prototype.add = function (date) {\n if (this.iterator(date, this._result.length)) {\n this._result.push(date);\n return true;\n }\n return false;\n };\n return CallbackIterResult;\n}(iterresult));\n/* harmony default export */ const callbackiterresult = (CallbackIterResult);\n\n;// CONCATENATED MODULE: ./src/nlp/i18n.ts\n// =============================================================================\n// i18n\n// =============================================================================\nvar ENGLISH = {\n dayNames: [\n 'Sunday',\n 'Monday',\n 'Tuesday',\n 'Wednesday',\n 'Thursday',\n 'Friday',\n 'Saturday',\n ],\n monthNames: [\n 'January',\n 'February',\n 'March',\n 'April',\n 'May',\n 'June',\n 'July',\n 'August',\n 'September',\n 'October',\n 'November',\n 'December',\n ],\n tokens: {\n SKIP: /^[ \\r\\n\\t]+|^\\.$/,\n number: /^[1-9][0-9]*/,\n numberAsText: /^(one|two|three)/i,\n every: /^every/i,\n 'day(s)': /^days?/i,\n 'weekday(s)': /^weekdays?/i,\n 'week(s)': /^weeks?/i,\n 'hour(s)': /^hours?/i,\n 'minute(s)': /^minutes?/i,\n 'month(s)': /^months?/i,\n 'year(s)': /^years?/i,\n on: /^(on|in)/i,\n at: /^(at)/i,\n the: /^the/i,\n first: /^first/i,\n second: /^second/i,\n third: /^third/i,\n nth: /^([1-9][0-9]*)(\\.|th|nd|rd|st)/i,\n last: /^last/i,\n for: /^for/i,\n 'time(s)': /^times?/i,\n until: /^(un)?til/i,\n monday: /^mo(n(day)?)?/i,\n tuesday: /^tu(e(s(day)?)?)?/i,\n wednesday: /^we(d(n(esday)?)?)?/i,\n thursday: /^th(u(r(sday)?)?)?/i,\n friday: /^fr(i(day)?)?/i,\n saturday: /^sa(t(urday)?)?/i,\n sunday: /^su(n(day)?)?/i,\n january: /^jan(uary)?/i,\n february: /^feb(ruary)?/i,\n march: /^mar(ch)?/i,\n april: /^apr(il)?/i,\n may: /^may/i,\n june: /^june?/i,\n july: /^july?/i,\n august: /^aug(ust)?/i,\n september: /^sep(t(ember)?)?/i,\n october: /^oct(ober)?/i,\n november: /^nov(ember)?/i,\n december: /^dec(ember)?/i,\n comma: /^(,\\s*|(and|or)\\s*)+/i,\n },\n};\n/* harmony default export */ const i18n = (ENGLISH);\n\n;// CONCATENATED MODULE: ./src/nlp/totext.ts\n\n\n\n// =============================================================================\n// Helper functions\n// =============================================================================\n/**\n * Return true if a value is in an array\n */\nvar contains = function (arr, val) {\n return arr.indexOf(val) !== -1;\n};\nvar defaultGetText = function (id) { return id.toString(); };\nvar defaultDateFormatter = function (year, month, day) { return \"\".concat(month, \" \").concat(day, \", \").concat(year); };\n/**\n *\n * @param {RRule} rrule\n * Optional:\n * @param {Function} gettext function\n * @param {Object} language definition\n * @constructor\n */\nvar ToText = /** @class */ (function () {\n function ToText(rrule, gettext, language, dateFormatter) {\n if (gettext === void 0) { gettext = defaultGetText; }\n if (language === void 0) { language = i18n; }\n if (dateFormatter === void 0) { dateFormatter = defaultDateFormatter; }\n this.text = [];\n this.language = language || i18n;\n this.gettext = gettext;\n this.dateFormatter = dateFormatter;\n this.rrule = rrule;\n this.options = rrule.options;\n this.origOptions = rrule.origOptions;\n if (this.origOptions.bymonthday) {\n var bymonthday = [].concat(this.options.bymonthday);\n var bynmonthday = [].concat(this.options.bynmonthday);\n bymonthday.sort(function (a, b) { return a - b; });\n bynmonthday.sort(function (a, b) { return b - a; });\n // 1, 2, 3, .., -5, -4, -3, ..\n this.bymonthday = bymonthday.concat(bynmonthday);\n if (!this.bymonthday.length)\n this.bymonthday = null;\n }\n if (isPresent(this.origOptions.byweekday)) {\n var byweekday = !isArray(this.origOptions.byweekday)\n ? [this.origOptions.byweekday]\n : this.origOptions.byweekday;\n var days = String(byweekday);\n this.byweekday = {\n allWeeks: byweekday.filter(function (weekday) {\n return !weekday.n;\n }),\n someWeeks: byweekday.filter(function (weekday) {\n return Boolean(weekday.n);\n }),\n isWeekdays: days.indexOf('MO') !== -1 &&\n days.indexOf('TU') !== -1 &&\n days.indexOf('WE') !== -1 &&\n days.indexOf('TH') !== -1 &&\n days.indexOf('FR') !== -1 &&\n days.indexOf('SA') === -1 &&\n days.indexOf('SU') === -1,\n isEveryDay: days.indexOf('MO') !== -1 &&\n days.indexOf('TU') !== -1 &&\n days.indexOf('WE') !== -1 &&\n days.indexOf('TH') !== -1 &&\n days.indexOf('FR') !== -1 &&\n days.indexOf('SA') !== -1 &&\n days.indexOf('SU') !== -1,\n };\n var sortWeekDays = function (a, b) {\n return a.weekday - b.weekday;\n };\n this.byweekday.allWeeks.sort(sortWeekDays);\n this.byweekday.someWeeks.sort(sortWeekDays);\n if (!this.byweekday.allWeeks.length)\n this.byweekday.allWeeks = null;\n if (!this.byweekday.someWeeks.length)\n this.byweekday.someWeeks = null;\n }\n else {\n this.byweekday = null;\n }\n }\n /**\n * Test whether the rrule can be fully converted to text.\n *\n * @param {RRule} rrule\n * @return {Boolean}\n */\n ToText.isFullyConvertible = function (rrule) {\n var canConvert = true;\n if (!(rrule.options.freq in ToText.IMPLEMENTED))\n return false;\n if (rrule.origOptions.until && rrule.origOptions.count)\n return false;\n for (var key in rrule.origOptions) {\n if (contains(['dtstart', 'tzid', 'wkst', 'freq'], key))\n return true;\n if (!contains(ToText.IMPLEMENTED[rrule.options.freq], key))\n return false;\n }\n return canConvert;\n };\n ToText.prototype.isFullyConvertible = function () {\n return ToText.isFullyConvertible(this.rrule);\n };\n /**\n * Perform the conversion. Only some of the frequencies are supported.\n * If some of the rrule's options aren't supported, they'll\n * be omitted from the output an \"(~ approximate)\" will be appended.\n *\n * @return {*}\n */\n ToText.prototype.toString = function () {\n var gettext = this.gettext;\n if (!(this.options.freq in ToText.IMPLEMENTED)) {\n return gettext('RRule error: Unable to fully convert this rrule to text');\n }\n this.text = [gettext('every')];\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n this[RRule.FREQUENCIES[this.options.freq]]();\n if (this.options.until) {\n this.add(gettext('until'));\n var until = this.options.until;\n this.add(this.dateFormatter(until.getUTCFullYear(), this.language.monthNames[until.getUTCMonth()], until.getUTCDate()));\n }\n else if (this.options.count) {\n this.add(gettext('for'))\n .add(this.options.count.toString())\n .add(this.plural(this.options.count) ? gettext('times') : gettext('time'));\n }\n if (!this.isFullyConvertible())\n this.add(gettext('(~ approximate)'));\n return this.text.join('');\n };\n ToText.prototype.HOURLY = function () {\n var gettext = this.gettext;\n if (this.options.interval !== 1)\n this.add(this.options.interval.toString());\n this.add(this.plural(this.options.interval) ? gettext('hours') : gettext('hour'));\n };\n ToText.prototype.MINUTELY = function () {\n var gettext = this.gettext;\n if (this.options.interval !== 1)\n this.add(this.options.interval.toString());\n this.add(this.plural(this.options.interval)\n ? gettext('minutes')\n : gettext('minute'));\n };\n ToText.prototype.DAILY = function () {\n var gettext = this.gettext;\n if (this.options.interval !== 1)\n this.add(this.options.interval.toString());\n if (this.byweekday && this.byweekday.isWeekdays) {\n this.add(this.plural(this.options.interval)\n ? gettext('weekdays')\n : gettext('weekday'));\n }\n else {\n this.add(this.plural(this.options.interval) ? gettext('days') : gettext('day'));\n }\n if (this.origOptions.bymonth) {\n this.add(gettext('in'));\n this._bymonth();\n }\n if (this.bymonthday) {\n this._bymonthday();\n }\n else if (this.byweekday) {\n this._byweekday();\n }\n else if (this.origOptions.byhour) {\n this._byhour();\n }\n };\n ToText.prototype.WEEKLY = function () {\n var gettext = this.gettext;\n if (this.options.interval !== 1) {\n this.add(this.options.interval.toString()).add(this.plural(this.options.interval) ? gettext('weeks') : gettext('week'));\n }\n if (this.byweekday && this.byweekday.isWeekdays) {\n if (this.options.interval === 1) {\n this.add(this.plural(this.options.interval)\n ? gettext('weekdays')\n : gettext('weekday'));\n }\n else {\n this.add(gettext('on')).add(gettext('weekdays'));\n }\n }\n else if (this.byweekday && this.byweekday.isEveryDay) {\n this.add(this.plural(this.options.interval) ? gettext('days') : gettext('day'));\n }\n else {\n if (this.options.interval === 1)\n this.add(gettext('week'));\n if (this.origOptions.bymonth) {\n this.add(gettext('in'));\n this._bymonth();\n }\n if (this.bymonthday) {\n this._bymonthday();\n }\n else if (this.byweekday) {\n this._byweekday();\n }\n if (this.origOptions.byhour) {\n this._byhour();\n }\n }\n };\n ToText.prototype.MONTHLY = function () {\n var gettext = this.gettext;\n if (this.origOptions.bymonth) {\n if (this.options.interval !== 1) {\n this.add(this.options.interval.toString()).add(gettext('months'));\n if (this.plural(this.options.interval))\n this.add(gettext('in'));\n }\n else {\n // this.add(gettext('MONTH'))\n }\n this._bymonth();\n }\n else {\n if (this.options.interval !== 1) {\n this.add(this.options.interval.toString());\n }\n this.add(this.plural(this.options.interval)\n ? gettext('months')\n : gettext('month'));\n }\n if (this.bymonthday) {\n this._bymonthday();\n }\n else if (this.byweekday && this.byweekday.isWeekdays) {\n this.add(gettext('on')).add(gettext('weekdays'));\n }\n else if (this.byweekday) {\n this._byweekday();\n }\n };\n ToText.prototype.YEARLY = function () {\n var gettext = this.gettext;\n if (this.origOptions.bymonth) {\n if (this.options.interval !== 1) {\n this.add(this.options.interval.toString());\n this.add(gettext('years'));\n }\n else {\n // this.add(gettext('YEAR'))\n }\n this._bymonth();\n }\n else {\n if (this.options.interval !== 1) {\n this.add(this.options.interval.toString());\n }\n this.add(this.plural(this.options.interval) ? gettext('years') : gettext('year'));\n }\n if (this.bymonthday) {\n this._bymonthday();\n }\n else if (this.byweekday) {\n this._byweekday();\n }\n if (this.options.byyearday) {\n this.add(gettext('on the'))\n .add(this.list(this.options.byyearday, this.nth, gettext('and')))\n .add(gettext('day'));\n }\n if (this.options.byweekno) {\n this.add(gettext('in'))\n .add(this.plural(this.options.byweekno.length)\n ? gettext('weeks')\n : gettext('week'))\n .add(this.list(this.options.byweekno, undefined, gettext('and')));\n }\n };\n ToText.prototype._bymonthday = function () {\n var gettext = this.gettext;\n if (this.byweekday && this.byweekday.allWeeks) {\n this.add(gettext('on'))\n .add(this.list(this.byweekday.allWeeks, this.weekdaytext, gettext('or')))\n .add(gettext('the'))\n .add(this.list(this.bymonthday, this.nth, gettext('or')));\n }\n else {\n this.add(gettext('on the')).add(this.list(this.bymonthday, this.nth, gettext('and')));\n }\n // this.add(gettext('DAY'))\n };\n ToText.prototype._byweekday = function () {\n var gettext = this.gettext;\n if (this.byweekday.allWeeks && !this.byweekday.isWeekdays) {\n this.add(gettext('on')).add(this.list(this.byweekday.allWeeks, this.weekdaytext));\n }\n if (this.byweekday.someWeeks) {\n if (this.byweekday.allWeeks)\n this.add(gettext('and'));\n this.add(gettext('on the')).add(this.list(this.byweekday.someWeeks, this.weekdaytext, gettext('and')));\n }\n };\n ToText.prototype._byhour = function () {\n var gettext = this.gettext;\n this.add(gettext('at')).add(this.list(this.origOptions.byhour, undefined, gettext('and')));\n };\n ToText.prototype._bymonth = function () {\n this.add(this.list(this.options.bymonth, this.monthtext, this.gettext('and')));\n };\n ToText.prototype.nth = function (n) {\n n = parseInt(n.toString(), 10);\n var nth;\n var gettext = this.gettext;\n if (n === -1)\n return gettext('last');\n var npos = Math.abs(n);\n switch (npos) {\n case 1:\n case 21:\n case 31:\n nth = npos + gettext('st');\n break;\n case 2:\n case 22:\n nth = npos + gettext('nd');\n break;\n case 3:\n case 23:\n nth = npos + gettext('rd');\n break;\n default:\n nth = npos + gettext('th');\n }\n return n < 0 ? nth + ' ' + gettext('last') : nth;\n };\n ToText.prototype.monthtext = function (m) {\n return this.language.monthNames[m - 1];\n };\n ToText.prototype.weekdaytext = function (wday) {\n var weekday = isNumber(wday) ? (wday + 1) % 7 : wday.getJsWeekday();\n return ((wday.n ? this.nth(wday.n) + ' ' : '') +\n this.language.dayNames[weekday]);\n };\n ToText.prototype.plural = function (n) {\n return n % 100 !== 1;\n };\n ToText.prototype.add = function (s) {\n this.text.push(' ');\n this.text.push(s);\n return this;\n };\n ToText.prototype.list = function (arr, callback, finalDelim, delim) {\n var _this = this;\n if (delim === void 0) { delim = ','; }\n if (!isArray(arr)) {\n arr = [arr];\n }\n var delimJoin = function (array, delimiter, finalDelimiter) {\n var list = '';\n for (var i = 0; i < array.length; i++) {\n if (i !== 0) {\n if (i === array.length - 1) {\n list += ' ' + finalDelimiter + ' ';\n }\n else {\n list += delimiter + ' ';\n }\n }\n list += array[i];\n }\n return list;\n };\n callback =\n callback ||\n function (o) {\n return o.toString();\n };\n var realCallback = function (arg) {\n return callback && callback.call(_this, arg);\n };\n if (finalDelim) {\n return delimJoin(arr.map(realCallback), delim, finalDelim);\n }\n else {\n return arr.map(realCallback).join(delim + ' ');\n }\n };\n return ToText;\n}());\n/* harmony default export */ const totext = (ToText);\n\n;// CONCATENATED MODULE: ./src/nlp/parsetext.ts\n\n\n// =============================================================================\n// Parser\n// =============================================================================\nvar Parser = /** @class */ (function () {\n function Parser(rules) {\n this.done = true;\n this.rules = rules;\n }\n Parser.prototype.start = function (text) {\n this.text = text;\n this.done = false;\n return this.nextSymbol();\n };\n Parser.prototype.isDone = function () {\n return this.done && this.symbol === null;\n };\n Parser.prototype.nextSymbol = function () {\n var best;\n var bestSymbol;\n this.symbol = null;\n this.value = null;\n do {\n if (this.done)\n return false;\n var rule = void 0;\n best = null;\n for (var name_1 in this.rules) {\n rule = this.rules[name_1];\n var match = rule.exec(this.text);\n if (match) {\n if (best === null || match[0].length > best[0].length) {\n best = match;\n bestSymbol = name_1;\n }\n }\n }\n if (best != null) {\n this.text = this.text.substr(best[0].length);\n if (this.text === '')\n this.done = true;\n }\n if (best == null) {\n this.done = true;\n this.symbol = null;\n this.value = null;\n return;\n }\n } while (bestSymbol === 'SKIP');\n this.symbol = bestSymbol;\n this.value = best;\n return true;\n };\n Parser.prototype.accept = function (name) {\n if (this.symbol === name) {\n if (this.value) {\n var v = this.value;\n this.nextSymbol();\n return v;\n }\n this.nextSymbol();\n return true;\n }\n return false;\n };\n Parser.prototype.acceptNumber = function () {\n return this.accept('number');\n };\n Parser.prototype.expect = function (name) {\n if (this.accept(name))\n return true;\n throw new Error('expected ' + name + ' but found ' + this.symbol);\n };\n return Parser;\n}());\nfunction parseText(text, language) {\n if (language === void 0) { language = i18n; }\n var options = {};\n var ttr = new Parser(language.tokens);\n if (!ttr.start(text))\n return null;\n S();\n return options;\n function S() {\n // every [n]\n ttr.expect('every');\n var n = ttr.acceptNumber();\n if (n)\n options.interval = parseInt(n[0], 10);\n if (ttr.isDone())\n throw new Error('Unexpected end');\n switch (ttr.symbol) {\n case 'day(s)':\n options.freq = RRule.DAILY;\n if (ttr.nextSymbol()) {\n AT();\n F();\n }\n break;\n // FIXME Note: every 2 weekdays != every two weeks on weekdays.\n // DAILY on weekdays is not a valid rule\n case 'weekday(s)':\n options.freq = RRule.WEEKLY;\n options.byweekday = [RRule.MO, RRule.TU, RRule.WE, RRule.TH, RRule.FR];\n ttr.nextSymbol();\n AT();\n F();\n break;\n case 'week(s)':\n options.freq = RRule.WEEKLY;\n if (ttr.nextSymbol()) {\n ON();\n AT();\n F();\n }\n break;\n case 'hour(s)':\n options.freq = RRule.HOURLY;\n if (ttr.nextSymbol()) {\n ON();\n F();\n }\n break;\n case 'minute(s)':\n options.freq = RRule.MINUTELY;\n if (ttr.nextSymbol()) {\n ON();\n F();\n }\n break;\n case 'month(s)':\n options.freq = RRule.MONTHLY;\n if (ttr.nextSymbol()) {\n ON();\n F();\n }\n break;\n case 'year(s)':\n options.freq = RRule.YEARLY;\n if (ttr.nextSymbol()) {\n ON();\n F();\n }\n break;\n case 'monday':\n case 'tuesday':\n case 'wednesday':\n case 'thursday':\n case 'friday':\n case 'saturday':\n case 'sunday':\n options.freq = RRule.WEEKLY;\n var key = ttr.symbol\n .substr(0, 2)\n .toUpperCase();\n options.byweekday = [RRule[key]];\n if (!ttr.nextSymbol())\n return;\n // TODO check for duplicates\n while (ttr.accept('comma')) {\n if (ttr.isDone())\n throw new Error('Unexpected end');\n var wkd = decodeWKD();\n if (!wkd) {\n throw new Error('Unexpected symbol ' + ttr.symbol + ', expected weekday');\n }\n options.byweekday.push(RRule[wkd]);\n ttr.nextSymbol();\n }\n AT();\n MDAYs();\n F();\n break;\n case 'january':\n case 'february':\n case 'march':\n case 'april':\n case 'may':\n case 'june':\n case 'july':\n case 'august':\n case 'september':\n case 'october':\n case 'november':\n case 'december':\n options.freq = RRule.YEARLY;\n options.bymonth = [decodeM()];\n if (!ttr.nextSymbol())\n return;\n // TODO check for duplicates\n while (ttr.accept('comma')) {\n if (ttr.isDone())\n throw new Error('Unexpected end');\n var m = decodeM();\n if (!m) {\n throw new Error('Unexpected symbol ' + ttr.symbol + ', expected month');\n }\n options.bymonth.push(m);\n ttr.nextSymbol();\n }\n ON();\n F();\n break;\n default:\n throw new Error('Unknown symbol');\n }\n }\n function ON() {\n var on = ttr.accept('on');\n var the = ttr.accept('the');\n if (!(on || the))\n return;\n do {\n var nth = decodeNTH();\n var wkd = decodeWKD();\n var m = decodeM();\n // nth <weekday> | <weekday>\n if (nth) {\n // ttr.nextSymbol()\n if (wkd) {\n ttr.nextSymbol();\n if (!options.byweekday)\n options.byweekday = [];\n options.byweekday.push(RRule[wkd].nth(nth));\n }\n else {\n if (!options.bymonthday)\n options.bymonthday = [];\n options.bymonthday.push(nth);\n ttr.accept('day(s)');\n }\n // <weekday>\n }\n else if (wkd) {\n ttr.nextSymbol();\n if (!options.byweekday)\n options.byweekday = [];\n options.byweekday.push(RRule[wkd]);\n }\n else if (ttr.symbol === 'weekday(s)') {\n ttr.nextSymbol();\n if (!options.byweekday) {\n options.byweekday = [RRule.MO, RRule.TU, RRule.WE, RRule.TH, RRule.FR];\n }\n }\n else if (ttr.symbol === 'week(s)') {\n ttr.nextSymbol();\n var n = ttr.acceptNumber();\n if (!n) {\n throw new Error('Unexpected symbol ' + ttr.symbol + ', expected week number');\n }\n options.byweekno = [parseInt(n[0], 10)];\n while (ttr.accept('comma')) {\n n = ttr.acceptNumber();\n if (!n) {\n throw new Error('Unexpected symbol ' + ttr.symbol + '; expected monthday');\n }\n options.byweekno.push(parseInt(n[0], 10));\n }\n }\n else if (m) {\n ttr.nextSymbol();\n if (!options.bymonth)\n options.bymonth = [];\n options.bymonth.push(m);\n }\n else {\n return;\n }\n } while (ttr.accept('comma') || ttr.accept('the') || ttr.accept('on'));\n }\n function AT() {\n var at = ttr.accept('at');\n if (!at)\n return;\n do {\n var n = ttr.acceptNumber();\n if (!n) {\n throw new Error('Unexpected symbol ' + ttr.symbol + ', expected hour');\n }\n options.byhour = [parseInt(n[0], 10)];\n while (ttr.accept('comma')) {\n n = ttr.acceptNumber();\n if (!n) {\n throw new Error('Unexpected symbol ' + ttr.symbol + '; expected hour');\n }\n options.byhour.push(parseInt(n[0], 10));\n }\n } while (ttr.accept('comma') || ttr.accept('at'));\n }\n function decodeM() {\n switch (ttr.symbol) {\n case 'january':\n return 1;\n case 'february':\n return 2;\n case 'march':\n return 3;\n case 'april':\n return 4;\n case 'may':\n return 5;\n case 'june':\n return 6;\n case 'july':\n return 7;\n case 'august':\n return 8;\n case 'september':\n return 9;\n case 'october':\n return 10;\n case 'november':\n return 11;\n case 'december':\n return 12;\n default:\n return false;\n }\n }\n function decodeWKD() {\n switch (ttr.symbol) {\n case 'monday':\n case 'tuesday':\n case 'wednesday':\n case 'thursday':\n case 'friday':\n case 'saturday':\n case 'sunday':\n return ttr.symbol.substr(0, 2).toUpperCase();\n default:\n return false;\n }\n }\n function decodeNTH() {\n switch (ttr.symbol) {\n case 'last':\n ttr.nextSymbol();\n return -1;\n case 'first':\n ttr.nextSymbol();\n return 1;\n case 'second':\n ttr.nextSymbol();\n return ttr.accept('last') ? -2 : 2;\n case 'third':\n ttr.nextSymbol();\n return ttr.accept('last') ? -3 : 3;\n case 'nth':\n var v = parseInt(ttr.value[1], 10);\n if (v < -366 || v > 366)\n throw new Error('Nth out of range: ' + v);\n ttr.nextSymbol();\n return ttr.accept('last') ? -v : v;\n default:\n return false;\n }\n }\n function MDAYs() {\n ttr.accept('on');\n ttr.accept('the');\n var nth = decodeNTH();\n if (!nth)\n return;\n options.bymonthday = [nth];\n ttr.nextSymbol();\n while (ttr.accept('comma')) {\n nth = decodeNTH();\n if (!nth) {\n throw new Error('Unexpected symbol ' + ttr.symbol + '; expected monthday');\n }\n options.bymonthday.push(nth);\n ttr.nextSymbol();\n }\n }\n function F() {\n if (ttr.symbol === 'until') {\n var date = Date.parse(ttr.text);\n if (!date)\n throw new Error('Cannot parse until date:' + ttr.text);\n options.until = new Date(date);\n }\n else if (ttr.accept('for')) {\n options.count = parseInt(ttr.value[0], 10);\n ttr.expect('number');\n // ttr.expect('times')\n }\n }\n}\n\n;// CONCATENATED MODULE: ./src/types.ts\nvar Frequency;\n(function (Frequency) {\n Frequency[Frequency[\"YEARLY\"] = 0] = \"YEARLY\";\n Frequency[Frequency[\"MONTHLY\"] = 1] = \"MONTHLY\";\n Frequency[Frequency[\"WEEKLY\"] = 2] = \"WEEKLY\";\n Frequency[Frequency[\"DAILY\"] = 3] = \"DAILY\";\n Frequency[Frequency[\"HOURLY\"] = 4] = \"HOURLY\";\n Frequency[Frequency[\"MINUTELY\"] = 5] = \"MINUTELY\";\n Frequency[Frequency[\"SECONDLY\"] = 6] = \"SECONDLY\";\n})(Frequency || (Frequency = {}));\nfunction freqIsDailyOrGreater(freq) {\n return freq < Frequency.HOURLY;\n}\n\n;// CONCATENATED MODULE: ./src/nlp/index.ts\n\n\n\n\n\n/* !\n * rrule.js - Library for working with recurrence rules for calendar dates.\n * https://github.com/jakubroztocil/rrule\n *\n * Copyright 2010, Jakub Roztocil and Lars Schoning\n * Licenced under the BSD licence.\n * https://github.com/jakubroztocil/rrule/blob/master/LICENCE\n *\n */\n/**\n *\n * Implementation of RRule.fromText() and RRule::toText().\n *\n *\n * On the client side, this file needs to be included\n * when those functions are used.\n *\n */\n// =============================================================================\n// fromText\n// =============================================================================\n/**\n * Will be able to convert some of the below described rules from\n * text format to a rule object.\n *\n *\n * RULES\n *\n * Every ([n])\n * day(s)\n * | [weekday], ..., (and) [weekday]\n * | weekday(s)\n * | week(s)\n * | month(s)\n * | [month], ..., (and) [month]\n * | year(s)\n *\n *\n * Plus 0, 1, or multiple of these:\n *\n * on [weekday], ..., (or) [weekday] the [monthday], [monthday], ... (or) [monthday]\n *\n * on [weekday], ..., (and) [weekday]\n *\n * on the [monthday], [monthday], ... (and) [monthday] (day of the month)\n *\n * on the [nth-weekday], ..., (and) [nth-weekday] (of the month/year)\n *\n *\n * Plus 0 or 1 of these:\n *\n * for [n] time(s)\n *\n * until [date]\n *\n * Plus (.)\n *\n *\n * Definitely no supported for parsing:\n *\n * (for year):\n * in week(s) [n], ..., (and) [n]\n *\n * on the [yearday], ..., (and) [n] day of the year\n * on day [yearday], ..., (and) [n]\n *\n *\n * NON-TERMINALS\n *\n * [n]: 1, 2 ..., one, two, three ..\n * [month]: January, February, March, April, May, ... December\n * [weekday]: Monday, ... Sunday\n * [nth-weekday]: first [weekday], 2nd [weekday], ... last [weekday], ...\n * [monthday]: first, 1., 2., 1st, 2nd, second, ... 31st, last day, 2nd last day, ..\n * [date]:\n * - [month] (0-31(,) ([year])),\n * - (the) 0-31.(1-12.([year])),\n * - (the) 0-31/(1-12/([year])),\n * - [weekday]\n *\n * [year]: 0000, 0001, ... 01, 02, ..\n *\n * Definitely not supported for parsing:\n *\n * [yearday]: first, 1., 2., 1st, 2nd, second, ... 366th, last day, 2nd last day, ..\n *\n * @param {String} text\n * @return {Object, Boolean} the rule, or null.\n */\nvar fromText = function (text, language) {\n if (language === void 0) { language = i18n; }\n return new RRule(parseText(text, language) || undefined);\n};\nvar common = [\n 'count',\n 'until',\n 'interval',\n 'byweekday',\n 'bymonthday',\n 'bymonth',\n];\ntotext.IMPLEMENTED = [];\ntotext.IMPLEMENTED[Frequency.HOURLY] = common;\ntotext.IMPLEMENTED[Frequency.MINUTELY] = common;\ntotext.IMPLEMENTED[Frequency.DAILY] = ['byhour'].concat(common);\ntotext.IMPLEMENTED[Frequency.WEEKLY] = common;\ntotext.IMPLEMENTED[Frequency.MONTHLY] = common;\ntotext.IMPLEMENTED[Frequency.YEARLY] = ['byweekno', 'byyearday'].concat(common);\n// =============================================================================\n// Export\n// =============================================================================\nvar toText = function (rrule, gettext, language, dateFormatter) {\n return new totext(rrule, gettext, language, dateFormatter).toString();\n};\nvar isFullyConvertible = totext.isFullyConvertible;\n\n\n;// CONCATENATED MODULE: ./src/datetime.ts\n\n\n\n\nvar Time = /** @class */ (function () {\n function Time(hour, minute, second, millisecond) {\n this.hour = hour;\n this.minute = minute;\n this.second = second;\n this.millisecond = millisecond || 0;\n }\n Time.prototype.getHours = function () {\n return this.hour;\n };\n Time.prototype.getMinutes = function () {\n return this.minute;\n };\n Time.prototype.getSeconds = function () {\n return this.second;\n };\n Time.prototype.getMilliseconds = function () {\n return this.millisecond;\n };\n Time.prototype.getTime = function () {\n return ((this.hour * 60 * 60 + this.minute * 60 + this.second) * 1000 +\n this.millisecond);\n };\n return Time;\n}());\n\nvar DateTime = /** @class */ (function (_super) {\n __extends(DateTime, _super);\n function DateTime(year, month, day, hour, minute, second, millisecond) {\n var _this = _super.call(this, hour, minute, second, millisecond) || this;\n _this.year = year;\n _this.month = month;\n _this.day = day;\n return _this;\n }\n DateTime.fromDate = function (date) {\n return new this(date.getUTCFullYear(), date.getUTCMonth() + 1, date.getUTCDate(), date.getUTCHours(), date.getUTCMinutes(), date.getUTCSeconds(), date.valueOf() % 1000);\n };\n DateTime.prototype.getWeekday = function () {\n return getWeekday(new Date(this.getTime()));\n };\n DateTime.prototype.getTime = function () {\n return new Date(Date.UTC(this.year, this.month - 1, this.day, this.hour, this.minute, this.second, this.millisecond)).getTime();\n };\n DateTime.prototype.getDay = function () {\n return this.day;\n };\n DateTime.prototype.getMonth = function () {\n return this.month;\n };\n DateTime.prototype.getYear = function () {\n return this.year;\n };\n DateTime.prototype.addYears = function (years) {\n this.year += years;\n };\n DateTime.prototype.addMonths = function (months) {\n this.month += months;\n if (this.month > 12) {\n var yearDiv = Math.floor(this.month / 12);\n var monthMod = pymod(this.month, 12);\n this.month = monthMod;\n this.year += yearDiv;\n if (this.month === 0) {\n this.month = 12;\n --this.year;\n }\n }\n };\n DateTime.prototype.addWeekly = function (days, wkst) {\n if (wkst > this.getWeekday()) {\n this.day += -(this.getWeekday() + 1 + (6 - wkst)) + days * 7;\n }\n else {\n this.day += -(this.getWeekday() - wkst) + days * 7;\n }\n this.fixDay();\n };\n DateTime.prototype.addDaily = function (days) {\n this.day += days;\n this.fixDay();\n };\n DateTime.prototype.addHours = function (hours, filtered, byhour) {\n if (filtered) {\n // Jump to one iteration before next day\n this.hour += Math.floor((23 - this.hour) / hours) * hours;\n }\n for (;;) {\n this.hour += hours;\n var _a = divmod(this.hour, 24), dayDiv = _a.div, hourMod = _a.mod;\n if (dayDiv) {\n this.hour = hourMod;\n this.addDaily(dayDiv);\n }\n if (empty(byhour) || includes(byhour, this.hour))\n break;\n }\n };\n DateTime.prototype.addMinutes = function (minutes, filtered, byhour, byminute) {\n if (filtered) {\n // Jump to one iteration before next day\n this.minute +=\n Math.floor((1439 - (this.hour * 60 + this.minute)) / minutes) * minutes;\n }\n for (;;) {\n this.minute += minutes;\n var _a = divmod(this.minute, 60), hourDiv = _a.div, minuteMod = _a.mod;\n if (hourDiv) {\n this.minute = minuteMod;\n this.addHours(hourDiv, false, byhour);\n }\n if ((empty(byhour) || includes(byhour, this.hour)) &&\n (empty(byminute) || includes(byminute, this.minute))) {\n break;\n }\n }\n };\n DateTime.prototype.addSeconds = function (seconds, filtered, byhour, byminute, bysecond) {\n if (filtered) {\n // Jump to one iteration before next day\n this.second +=\n Math.floor((86399 - (this.hour * 3600 + this.minute * 60 + this.second)) /\n seconds) * seconds;\n }\n for (;;) {\n this.second += seconds;\n var _a = divmod(this.second, 60), minuteDiv = _a.div, secondMod = _a.mod;\n if (minuteDiv) {\n this.second = secondMod;\n this.addMinutes(minuteDiv, false, byhour, byminute);\n }\n if ((empty(byhour) || includes(byhour, this.hour)) &&\n (empty(byminute) || includes(byminute, this.minute)) &&\n (empty(bysecond) || includes(bysecond, this.second))) {\n break;\n }\n }\n };\n DateTime.prototype.fixDay = function () {\n if (this.day <= 28) {\n return;\n }\n var daysinmonth = monthRange(this.year, this.month - 1)[1];\n if (this.day <= daysinmonth) {\n return;\n }\n while (this.day > daysinmonth) {\n this.day -= daysinmonth;\n ++this.month;\n if (this.month === 13) {\n this.month = 1;\n ++this.year;\n if (this.year > MAXYEAR) {\n return;\n }\n }\n daysinmonth = monthRange(this.year, this.month - 1)[1];\n }\n };\n DateTime.prototype.add = function (options, filtered) {\n var freq = options.freq, interval = options.interval, wkst = options.wkst, byhour = options.byhour, byminute = options.byminute, bysecond = options.bysecond;\n switch (freq) {\n case Frequency.YEARLY:\n return this.addYears(interval);\n case Frequency.MONTHLY:\n return this.addMonths(interval);\n case Frequency.WEEKLY:\n return this.addWeekly(interval, wkst);\n case Frequency.DAILY:\n return this.addDaily(interval);\n case Frequency.HOURLY:\n return this.addHours(interval, filtered, byhour);\n case Frequency.MINUTELY:\n return this.addMinutes(interval, filtered, byhour, byminute);\n case Frequency.SECONDLY:\n return this.addSeconds(interval, filtered, byhour, byminute, bysecond);\n }\n };\n return DateTime;\n}(Time));\n\n\n;// CONCATENATED MODULE: ./src/parseoptions.ts\n\n\n\n\n\n\n\nfunction initializeOptions(options) {\n var invalid = [];\n var keys = Object.keys(options);\n // Shallow copy for options and origOptions and check for invalid\n for (var _i = 0, keys_1 = keys; _i < keys_1.length; _i++) {\n var key = keys_1[_i];\n if (!includes(defaultKeys, key))\n invalid.push(key);\n if (isDate(options[key]) && !isValidDate(options[key])) {\n invalid.push(key);\n }\n }\n if (invalid.length) {\n throw new Error('Invalid options: ' + invalid.join(', '));\n }\n return __assign({}, options);\n}\nfunction parseOptions(options) {\n var opts = __assign(__assign({}, DEFAULT_OPTIONS), initializeOptions(options));\n if (isPresent(opts.byeaster))\n opts.freq = RRule.YEARLY;\n if (!(isPresent(opts.freq) && RRule.FREQUENCIES[opts.freq])) {\n throw new Error(\"Invalid frequency: \".concat(opts.freq, \" \").concat(options.freq));\n }\n if (!opts.dtstart)\n opts.dtstart = new Date(new Date().setMilliseconds(0));\n if (!isPresent(opts.wkst)) {\n opts.wkst = RRule.MO.weekday;\n }\n else if (isNumber(opts.wkst)) {\n // cool, just keep it like that\n }\n else {\n opts.wkst = opts.wkst.weekday;\n }\n if (isPresent(opts.bysetpos)) {\n if (isNumber(opts.bysetpos))\n opts.bysetpos = [opts.bysetpos];\n for (var i = 0; i < opts.bysetpos.length; i++) {\n var v = opts.bysetpos[i];\n if (v === 0 || !(v >= -366 && v <= 366)) {\n throw new Error('bysetpos must be between 1 and 366,' + ' or between -366 and -1');\n }\n }\n }\n if (!(Boolean(opts.byweekno) ||\n notEmpty(opts.byweekno) ||\n notEmpty(opts.byyearday) ||\n Boolean(opts.bymonthday) ||\n notEmpty(opts.bymonthday) ||\n isPresent(opts.byweekday) ||\n isPresent(opts.byeaster))) {\n switch (opts.freq) {\n case RRule.YEARLY:\n if (!opts.bymonth)\n opts.bymonth = opts.dtstart.getUTCMonth() + 1;\n opts.bymonthday = opts.dtstart.getUTCDate();\n break;\n case RRule.MONTHLY:\n opts.bymonthday = opts.dtstart.getUTCDate();\n break;\n case RRule.WEEKLY:\n opts.byweekday = [getWeekday(opts.dtstart)];\n break;\n }\n }\n // bymonth\n if (isPresent(opts.bymonth) && !isArray(opts.bymonth)) {\n opts.bymonth = [opts.bymonth];\n }\n // byyearday\n if (isPresent(opts.byyearday) &&\n !isArray(opts.byyearday) &&\n isNumber(opts.byyearday)) {\n opts.byyearday = [opts.byyearday];\n }\n // bymonthday\n if (!isPresent(opts.bymonthday)) {\n opts.bymonthday = [];\n opts.bynmonthday = [];\n }\n else if (isArray(opts.bymonthday)) {\n var bymonthday = [];\n var bynmonthday = [];\n for (var i = 0; i < opts.bymonthday.length; i++) {\n var v = opts.bymonthday[i];\n if (v > 0) {\n bymonthday.push(v);\n }\n else if (v < 0) {\n bynmonthday.push(v);\n }\n }\n opts.bymonthday = bymonthday;\n opts.bynmonthday = bynmonthday;\n }\n else if (opts.bymonthday < 0) {\n opts.bynmonthday = [opts.bymonthday];\n opts.bymonthday = [];\n }\n else {\n opts.bynmonthday = [];\n opts.bymonthday = [opts.bymonthday];\n }\n // byweekno\n if (isPresent(opts.byweekno) && !isArray(opts.byweekno)) {\n opts.byweekno = [opts.byweekno];\n }\n // byweekday / bynweekday\n if (!isPresent(opts.byweekday)) {\n opts.bynweekday = null;\n }\n else if (isNumber(opts.byweekday)) {\n opts.byweekday = [opts.byweekday];\n opts.bynweekday = null;\n }\n else if (isWeekdayStr(opts.byweekday)) {\n opts.byweekday = [Weekday.fromStr(opts.byweekday).weekday];\n opts.bynweekday = null;\n }\n else if (opts.byweekday instanceof Weekday) {\n if (!opts.byweekday.n || opts.freq > RRule.MONTHLY) {\n opts.byweekday = [opts.byweekday.weekday];\n opts.bynweekday = null;\n }\n else {\n opts.bynweekday = [[opts.byweekday.weekday, opts.byweekday.n]];\n opts.byweekday = null;\n }\n }\n else {\n var byweekday = [];\n var bynweekday = [];\n for (var i = 0; i < opts.byweekday.length; i++) {\n var wday = opts.byweekday[i];\n if (isNumber(wday)) {\n byweekday.push(wday);\n continue;\n }\n else if (isWeekdayStr(wday)) {\n byweekday.push(Weekday.fromStr(wday).weekday);\n continue;\n }\n if (!wday.n || opts.freq > RRule.MONTHLY) {\n byweekday.push(wday.weekday);\n }\n else {\n bynweekday.push([wday.weekday, wday.n]);\n }\n }\n opts.byweekday = notEmpty(byweekday) ? byweekday : null;\n opts.bynweekday = notEmpty(bynweekday) ? bynweekday : null;\n }\n // byhour\n if (!isPresent(opts.byhour)) {\n opts.byhour = opts.freq < RRule.HOURLY ? [opts.dtstart.getUTCHours()] : null;\n }\n else if (isNumber(opts.byhour)) {\n opts.byhour = [opts.byhour];\n }\n // byminute\n if (!isPresent(opts.byminute)) {\n opts.byminute =\n opts.freq < RRule.MINUTELY ? [opts.dtstart.getUTCMinutes()] : null;\n }\n else if (isNumber(opts.byminute)) {\n opts.byminute = [opts.byminute];\n }\n // bysecond\n if (!isPresent(opts.bysecond)) {\n opts.bysecond =\n opts.freq < RRule.SECONDLY ? [opts.dtstart.getUTCSeconds()] : null;\n }\n else if (isNumber(opts.bysecond)) {\n opts.bysecond = [opts.bysecond];\n }\n return { parsedOptions: opts };\n}\nfunction buildTimeset(opts) {\n var millisecondModulo = opts.dtstart.getTime() % 1000;\n if (!freqIsDailyOrGreater(opts.freq)) {\n return [];\n }\n var timeset = [];\n opts.byhour.forEach(function (hour) {\n opts.byminute.forEach(function (minute) {\n opts.bysecond.forEach(function (second) {\n timeset.push(new Time(hour, minute, second, millisecondModulo));\n });\n });\n });\n return timeset;\n}\n\n;// CONCATENATED MODULE: ./src/parsestring.ts\n\n\n\n\n\nfunction parseString(rfcString) {\n var options = rfcString\n .split('\\n')\n .map(parseLine)\n .filter(function (x) { return x !== null; });\n return __assign(__assign({}, options[0]), options[1]);\n}\nfunction parseDtstart(line) {\n var options = {};\n var dtstartWithZone = /DTSTART(?:;TZID=([^:=]+?))?(?::|=)([^;\\s]+)/i.exec(line);\n if (!dtstartWithZone) {\n return options;\n }\n var tzid = dtstartWithZone[1], dtstart = dtstartWithZone[2];\n if (tzid) {\n options.tzid = tzid;\n }\n options.dtstart = untilStringToDate(dtstart);\n return options;\n}\nfunction parseLine(rfcString) {\n rfcString = rfcString.replace(/^\\s+|\\s+$/, '');\n if (!rfcString.length)\n return null;\n var header = /^([A-Z]+?)[:;]/.exec(rfcString.toUpperCase());\n if (!header) {\n return parseRrule(rfcString);\n }\n var key = header[1];\n switch (key.toUpperCase()) {\n case 'RRULE':\n case 'EXRULE':\n return parseRrule(rfcString);\n case 'DTSTART':\n return parseDtstart(rfcString);\n default:\n throw new Error(\"Unsupported RFC prop \".concat(key, \" in \").concat(rfcString));\n }\n}\nfunction parseRrule(line) {\n var strippedLine = line.replace(/^RRULE:/i, '');\n var options = parseDtstart(strippedLine);\n var attrs = line.replace(/^(?:RRULE|EXRULE):/i, '').split(';');\n attrs.forEach(function (attr) {\n var _a = attr.split('='), key = _a[0], value = _a[1];\n switch (key.toUpperCase()) {\n case 'FREQ':\n options.freq = Frequency[value.toUpperCase()];\n break;\n case 'WKST':\n options.wkst = Days[value.toUpperCase()];\n break;\n case 'COUNT':\n case 'INTERVAL':\n case 'BYSETPOS':\n case 'BYMONTH':\n case 'BYMONTHDAY':\n case 'BYYEARDAY':\n case 'BYWEEKNO':\n case 'BYHOUR':\n case 'BYMINUTE':\n case 'BYSECOND':\n var num = parseNumber(value);\n var optionKey = key.toLowerCase();\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n options[optionKey] = num;\n break;\n case 'BYWEEKDAY':\n case 'BYDAY':\n options.byweekday = parseWeekday(value);\n break;\n case 'DTSTART':\n case 'TZID':\n // for backwards compatibility\n var dtstart = parseDtstart(line);\n options.tzid = dtstart.tzid;\n options.dtstart = dtstart.dtstart;\n break;\n case 'UNTIL':\n options.until = untilStringToDate(value);\n break;\n case 'BYEASTER':\n options.byeaster = Number(value);\n break;\n default:\n throw new Error(\"Unknown RRULE property '\" + key + \"'\");\n }\n });\n return options;\n}\nfunction parseNumber(value) {\n if (value.indexOf(',') !== -1) {\n var values = value.split(',');\n return values.map(parseIndividualNumber);\n }\n return parseIndividualNumber(value);\n}\nfunction parseIndividualNumber(value) {\n if (/^[+-]?\\d+$/.test(value)) {\n return Number(value);\n }\n return value;\n}\nfunction parseWeekday(value) {\n var days = value.split(',');\n return days.map(function (day) {\n if (day.length === 2) {\n // MO, TU, ...\n return Days[day]; // wday instanceof Weekday\n }\n // -1MO, +3FR, 1SO, 13TU ...\n var parts = day.match(/^([+-]?\\d{1,2})([A-Z]{2})$/);\n if (!parts || parts.length < 3) {\n throw new SyntaxError(\"Invalid weekday string: \".concat(day));\n }\n var n = Number(parts[1]);\n var wdaypart = parts[2];\n var wday = Days[wdaypart].weekday;\n return new Weekday(wday, n);\n });\n}\n\n;// CONCATENATED MODULE: ./src/datewithzone.ts\n\nvar DateWithZone = /** @class */ (function () {\n function DateWithZone(date, tzid) {\n if (isNaN(date.getTime())) {\n throw new RangeError('Invalid date passed to DateWithZone');\n }\n this.date = date;\n this.tzid = tzid;\n }\n Object.defineProperty(DateWithZone.prototype, \"isUTC\", {\n get: function () {\n return !this.tzid || this.tzid.toUpperCase() === 'UTC';\n },\n enumerable: false,\n configurable: true\n });\n DateWithZone.prototype.toString = function () {\n var datestr = timeToUntilString(this.date.getTime(), this.isUTC);\n if (!this.isUTC) {\n return \";TZID=\".concat(this.tzid, \":\").concat(datestr);\n }\n return \":\".concat(datestr);\n };\n DateWithZone.prototype.getTime = function () {\n return this.date.getTime();\n };\n DateWithZone.prototype.rezonedDate = function () {\n if (this.isUTC) {\n return this.date;\n }\n return dateInTimeZone(this.date, this.tzid);\n };\n return DateWithZone;\n}());\n\n\n;// CONCATENATED MODULE: ./src/optionstostring.ts\n\n\n\n\n\nfunction optionsToString(options) {\n var rrule = [];\n var dtstart = '';\n var keys = Object.keys(options);\n var defaultKeys = Object.keys(DEFAULT_OPTIONS);\n for (var i = 0; i < keys.length; i++) {\n if (keys[i] === 'tzid')\n continue;\n if (!includes(defaultKeys, keys[i]))\n continue;\n var key = keys[i].toUpperCase();\n var value = options[keys[i]];\n var outValue = '';\n if (!isPresent(value) || (isArray(value) && !value.length))\n continue;\n switch (key) {\n case 'FREQ':\n outValue = RRule.FREQUENCIES[options.freq];\n break;\n case 'WKST':\n if (isNumber(value)) {\n outValue = new Weekday(value).toString();\n }\n else {\n outValue = value.toString();\n }\n break;\n case 'BYWEEKDAY':\n /*\n NOTE: BYWEEKDAY is a special case.\n RRule() deconstructs the rule.options.byweekday array\n into an array of Weekday arguments.\n On the other hand, rule.origOptions is an array of Weekdays.\n We need to handle both cases here.\n It might be worth change RRule to keep the Weekdays.\n \n Also, BYWEEKDAY (used by RRule) vs. BYDAY (RFC)\n \n */\n key = 'BYDAY';\n outValue = toArray(value)\n .map(function (wday) {\n if (wday instanceof Weekday) {\n return wday;\n }\n if (isArray(wday)) {\n return new Weekday(wday[0], wday[1]);\n }\n return new Weekday(wday);\n })\n .toString();\n break;\n case 'DTSTART':\n dtstart = buildDtstart(value, options.tzid);\n break;\n case 'UNTIL':\n outValue = timeToUntilString(value, !options.tzid);\n break;\n default:\n if (isArray(value)) {\n var strValues = [];\n for (var j = 0; j < value.length; j++) {\n strValues[j] = String(value[j]);\n }\n outValue = strValues.toString();\n }\n else {\n outValue = String(value);\n }\n }\n if (outValue) {\n rrule.push([key, outValue]);\n }\n }\n var rules = rrule\n .map(function (_a) {\n var key = _a[0], value = _a[1];\n return \"\".concat(key, \"=\").concat(value.toString());\n })\n .join(';');\n var ruleString = '';\n if (rules !== '') {\n ruleString = \"RRULE:\".concat(rules);\n }\n return [dtstart, ruleString].filter(function (x) { return !!x; }).join('\\n');\n}\nfunction buildDtstart(dtstart, tzid) {\n if (!dtstart) {\n return '';\n }\n return 'DTSTART' + new DateWithZone(new Date(dtstart), tzid).toString();\n}\n\n;// CONCATENATED MODULE: ./src/cache.ts\n\n\n\nfunction argsMatch(left, right) {\n if (Array.isArray(left)) {\n if (!Array.isArray(right))\n return false;\n if (left.length !== right.length)\n return false;\n return left.every(function (date, i) { return date.getTime() === right[i].getTime(); });\n }\n if (left instanceof Date) {\n return right instanceof Date && left.getTime() === right.getTime();\n }\n return left === right;\n}\nvar Cache = /** @class */ (function () {\n function Cache() {\n this.all = false;\n this.before = [];\n this.after = [];\n this.between = [];\n }\n /**\n * @param {String} what - all/before/after/between\n * @param {Array,Date} value - an array of dates, one date, or null\n * @param {Object?} args - _iter arguments\n */\n Cache.prototype._cacheAdd = function (what, value, args) {\n if (value) {\n value = value instanceof Date ? dateutil_clone(value) : cloneDates(value);\n }\n if (what === 'all') {\n this.all = value;\n }\n else {\n args._value = value;\n this[what].push(args);\n }\n };\n /**\n * @return false - not in the cache\n * @return null - cached, but zero occurrences (before/after)\n * @return Date - cached (before/after)\n * @return [] - cached, but zero occurrences (all/between)\n * @return [Date1, DateN] - cached (all/between)\n */\n Cache.prototype._cacheGet = function (what, args) {\n var cached = false;\n var argsKeys = args ? Object.keys(args) : [];\n var findCacheDiff = function (item) {\n for (var i = 0; i < argsKeys.length; i++) {\n var key = argsKeys[i];\n if (!argsMatch(args[key], item[key])) {\n return true;\n }\n }\n return false;\n };\n var cachedObject = this[what];\n if (what === 'all') {\n cached = this.all;\n }\n else if (isArray(cachedObject)) {\n // Let's see whether we've already called the\n // 'what' method with the same 'args'\n for (var i = 0; i < cachedObject.length; i++) {\n var item = cachedObject[i];\n if (argsKeys.length && findCacheDiff(item))\n continue;\n cached = item._value;\n break;\n }\n }\n if (!cached && this.all) {\n // Not in the cache, but we already know all the occurrences,\n // so we can find the correct dates from the cached ones.\n var iterResult = new iterresult(what, args);\n for (var i = 0; i < this.all.length; i++) {\n if (!iterResult.accept(this.all[i]))\n break;\n }\n cached = iterResult.getValue();\n this._cacheAdd(what, cached, args);\n }\n return isArray(cached)\n ? cloneDates(cached)\n : cached instanceof Date\n ? dateutil_clone(cached)\n : cached;\n };\n return Cache;\n}());\n\n\n;// CONCATENATED MODULE: ./src/masks.ts\n\n\n// =============================================================================\n// Date masks\n// =============================================================================\n// Every mask is 7 days longer to handle cross-year weekly periods.\nvar M365MASK = __spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray([], repeat(1, 31), true), repeat(2, 28), true), repeat(3, 31), true), repeat(4, 30), true), repeat(5, 31), true), repeat(6, 30), true), repeat(7, 31), true), repeat(8, 31), true), repeat(9, 30), true), repeat(10, 31), true), repeat(11, 30), true), repeat(12, 31), true), repeat(1, 7), true);\nvar M366MASK = __spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray([], repeat(1, 31), true), repeat(2, 29), true), repeat(3, 31), true), repeat(4, 30), true), repeat(5, 31), true), repeat(6, 30), true), repeat(7, 31), true), repeat(8, 31), true), repeat(9, 30), true), repeat(10, 31), true), repeat(11, 30), true), repeat(12, 31), true), repeat(1, 7), true);\nvar M28 = range(1, 29);\nvar M29 = range(1, 30);\nvar M30 = range(1, 31);\nvar M31 = range(1, 32);\nvar MDAY366MASK = __spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray([], M31, true), M29, true), M31, true), M30, true), M31, true), M30, true), M31, true), M31, true), M30, true), M31, true), M30, true), M31, true), M31.slice(0, 7), true);\nvar MDAY365MASK = __spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray([], M31, true), M28, true), M31, true), M30, true), M31, true), M30, true), M31, true), M31, true), M30, true), M31, true), M30, true), M31, true), M31.slice(0, 7), true);\nvar NM28 = range(-28, 0);\nvar NM29 = range(-29, 0);\nvar NM30 = range(-30, 0);\nvar NM31 = range(-31, 0);\nvar NMDAY366MASK = __spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray([], NM31, true), NM29, true), NM31, true), NM30, true), NM31, true), NM30, true), NM31, true), NM31, true), NM30, true), NM31, true), NM30, true), NM31, true), NM31.slice(0, 7), true);\nvar NMDAY365MASK = __spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray([], NM31, true), NM28, true), NM31, true), NM30, true), NM31, true), NM30, true), NM31, true), NM31, true), NM30, true), NM31, true), NM30, true), NM31, true), NM31.slice(0, 7), true);\nvar M366RANGE = [0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366];\nvar M365RANGE = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365];\nvar WDAYMASK = (function () {\n var wdaymask = [];\n for (var i = 0; i < 55; i++)\n wdaymask = wdaymask.concat(range(7));\n return wdaymask;\n})();\n\n\n;// CONCATENATED MODULE: ./src/iterinfo/yearinfo.ts\n\n\n\n\nfunction rebuildYear(year, options) {\n var firstyday = datetime(year, 1, 1);\n var yearlen = isLeapYear(year) ? 366 : 365;\n var nextyearlen = isLeapYear(year + 1) ? 366 : 365;\n var yearordinal = toOrdinal(firstyday);\n var yearweekday = getWeekday(firstyday);\n var result = __assign(__assign({ yearlen: yearlen, nextyearlen: nextyearlen, yearordinal: yearordinal, yearweekday: yearweekday }, baseYearMasks(year)), { wnomask: null });\n if (empty(options.byweekno)) {\n return result;\n }\n result.wnomask = repeat(0, yearlen + 7);\n var firstwkst;\n var wyearlen;\n var no1wkst = (firstwkst = pymod(7 - yearweekday + options.wkst, 7));\n if (no1wkst >= 4) {\n no1wkst = 0;\n // Number of days in the year, plus the days we got\n // from last year.\n wyearlen = result.yearlen + pymod(yearweekday - options.wkst, 7);\n }\n else {\n // Number of days in the year, minus the days we\n // left in last year.\n wyearlen = yearlen - no1wkst;\n }\n var div = Math.floor(wyearlen / 7);\n var mod = pymod(wyearlen, 7);\n var numweeks = Math.floor(div + mod / 4);\n for (var j = 0; j < options.byweekno.length; j++) {\n var n = options.byweekno[j];\n if (n < 0) {\n n += numweeks + 1;\n }\n if (!(n > 0 && n <= numweeks)) {\n continue;\n }\n var i = void 0;\n if (n > 1) {\n i = no1wkst + (n - 1) * 7;\n if (no1wkst !== firstwkst) {\n i -= 7 - firstwkst;\n }\n }\n else {\n i = no1wkst;\n }\n for (var k = 0; k < 7; k++) {\n result.wnomask[i] = 1;\n i++;\n if (result.wdaymask[i] === options.wkst)\n break;\n }\n }\n if (includes(options.byweekno, 1)) {\n // Check week number 1 of next year as well\n // orig-TODO : Check -numweeks for next year.\n var i = no1wkst + numweeks * 7;\n if (no1wkst !== firstwkst)\n i -= 7 - firstwkst;\n if (i < yearlen) {\n // If week starts in next year, we\n // don't care about it.\n for (var j = 0; j < 7; j++) {\n result.wnomask[i] = 1;\n i += 1;\n if (result.wdaymask[i] === options.wkst)\n break;\n }\n }\n }\n if (no1wkst) {\n // Check last week number of last year as\n // well. If no1wkst is 0, either the year\n // started on week start, or week number 1\n // got days from last year, so there are no\n // days from last year's last week number in\n // this year.\n var lnumweeks = void 0;\n if (!includes(options.byweekno, -1)) {\n var lyearweekday = getWeekday(datetime(year - 1, 1, 1));\n var lno1wkst = pymod(7 - lyearweekday.valueOf() + options.wkst, 7);\n var lyearlen = isLeapYear(year - 1) ? 366 : 365;\n var weekst = void 0;\n if (lno1wkst >= 4) {\n lno1wkst = 0;\n weekst = lyearlen + pymod(lyearweekday - options.wkst, 7);\n }\n else {\n weekst = yearlen - no1wkst;\n }\n lnumweeks = Math.floor(52 + pymod(weekst, 7) / 4);\n }\n else {\n lnumweeks = -1;\n }\n if (includes(options.byweekno, lnumweeks)) {\n for (var i = 0; i < no1wkst; i++)\n result.wnomask[i] = 1;\n }\n }\n return result;\n}\nfunction baseYearMasks(year) {\n var yearlen = isLeapYear(year) ? 366 : 365;\n var firstyday = datetime(year, 1, 1);\n var wday = getWeekday(firstyday);\n if (yearlen === 365) {\n return {\n mmask: M365MASK,\n mdaymask: MDAY365MASK,\n nmdaymask: NMDAY365MASK,\n wdaymask: WDAYMASK.slice(wday),\n mrange: M365RANGE,\n };\n }\n return {\n mmask: M366MASK,\n mdaymask: MDAY366MASK,\n nmdaymask: NMDAY366MASK,\n wdaymask: WDAYMASK.slice(wday),\n mrange: M366RANGE,\n };\n}\n\n;// CONCATENATED MODULE: ./src/iterinfo/monthinfo.ts\n\n\nfunction rebuildMonth(year, month, yearlen, mrange, wdaymask, options) {\n var result = {\n lastyear: year,\n lastmonth: month,\n nwdaymask: [],\n };\n var ranges = [];\n if (options.freq === RRule.YEARLY) {\n if (empty(options.bymonth)) {\n ranges = [[0, yearlen]];\n }\n else {\n for (var j = 0; j < options.bymonth.length; j++) {\n month = options.bymonth[j];\n ranges.push(mrange.slice(month - 1, month + 1));\n }\n }\n }\n else if (options.freq === RRule.MONTHLY) {\n ranges = [mrange.slice(month - 1, month + 1)];\n }\n if (empty(ranges)) {\n return result;\n }\n // Weekly frequency won't get here, so we may not\n // care about cross-year weekly periods.\n result.nwdaymask = repeat(0, yearlen);\n for (var j = 0; j < ranges.length; j++) {\n var rang = ranges[j];\n var first = rang[0];\n var last = rang[1] - 1;\n for (var k = 0; k < options.bynweekday.length; k++) {\n var i = void 0;\n var _a = options.bynweekday[k], wday = _a[0], n = _a[1];\n if (n < 0) {\n i = last + (n + 1) * 7;\n i -= pymod(wdaymask[i] - wday, 7);\n }\n else {\n i = first + (n - 1) * 7;\n i += pymod(7 - wdaymask[i] + wday, 7);\n }\n if (first <= i && i <= last)\n result.nwdaymask[i] = 1;\n }\n }\n return result;\n}\n\n;// CONCATENATED MODULE: ./src/iterinfo/easter.ts\nfunction easter(y, offset) {\n if (offset === void 0) { offset = 0; }\n var a = y % 19;\n var b = Math.floor(y / 100);\n var c = y % 100;\n var d = Math.floor(b / 4);\n var e = b % 4;\n var f = Math.floor((b + 8) / 25);\n var g = Math.floor((b - f + 1) / 3);\n var h = Math.floor(19 * a + b - d - g + 15) % 30;\n var i = Math.floor(c / 4);\n var k = c % 4;\n var l = Math.floor(32 + 2 * e + 2 * i - h - k) % 7;\n var m = Math.floor((a + 11 * h + 22 * l) / 451);\n var month = Math.floor((h + l - 7 * m + 114) / 31);\n var day = ((h + l - 7 * m + 114) % 31) + 1;\n var date = Date.UTC(y, month - 1, day + offset);\n var yearStart = Date.UTC(y, 0, 1);\n return [Math.ceil((date - yearStart) / (1000 * 60 * 60 * 24))];\n}\n\n;// CONCATENATED MODULE: ./src/iterinfo/index.ts\n\n\n\n\n\n\n\n// =============================================================================\n// Iterinfo\n// =============================================================================\nvar Iterinfo = /** @class */ (function () {\n // eslint-disable-next-line no-empty-function\n function Iterinfo(options) {\n this.options = options;\n }\n Iterinfo.prototype.rebuild = function (year, month) {\n var options = this.options;\n if (year !== this.lastyear) {\n this.yearinfo = rebuildYear(year, options);\n }\n if (notEmpty(options.bynweekday) &&\n (month !== this.lastmonth || year !== this.lastyear)) {\n var _a = this.yearinfo, yearlen = _a.yearlen, mrange = _a.mrange, wdaymask = _a.wdaymask;\n this.monthinfo = rebuildMonth(year, month, yearlen, mrange, wdaymask, options);\n }\n if (isPresent(options.byeaster)) {\n this.eastermask = easter(year, options.byeaster);\n }\n };\n Object.defineProperty(Iterinfo.prototype, \"lastyear\", {\n get: function () {\n return this.monthinfo ? this.monthinfo.lastyear : null;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Iterinfo.prototype, \"lastmonth\", {\n get: function () {\n return this.monthinfo ? this.monthinfo.lastmonth : null;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Iterinfo.prototype, \"yearlen\", {\n get: function () {\n return this.yearinfo.yearlen;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Iterinfo.prototype, \"yearordinal\", {\n get: function () {\n return this.yearinfo.yearordinal;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Iterinfo.prototype, \"mrange\", {\n get: function () {\n return this.yearinfo.mrange;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Iterinfo.prototype, \"wdaymask\", {\n get: function () {\n return this.yearinfo.wdaymask;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Iterinfo.prototype, \"mmask\", {\n get: function () {\n return this.yearinfo.mmask;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Iterinfo.prototype, \"wnomask\", {\n get: function () {\n return this.yearinfo.wnomask;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Iterinfo.prototype, \"nwdaymask\", {\n get: function () {\n return this.monthinfo ? this.monthinfo.nwdaymask : [];\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Iterinfo.prototype, \"nextyearlen\", {\n get: function () {\n return this.yearinfo.nextyearlen;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Iterinfo.prototype, \"mdaymask\", {\n get: function () {\n return this.yearinfo.mdaymask;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Iterinfo.prototype, \"nmdaymask\", {\n get: function () {\n return this.yearinfo.nmdaymask;\n },\n enumerable: false,\n configurable: true\n });\n Iterinfo.prototype.ydayset = function () {\n return [range(this.yearlen), 0, this.yearlen];\n };\n Iterinfo.prototype.mdayset = function (_, month) {\n var start = this.mrange[month - 1];\n var end = this.mrange[month];\n var set = repeat(null, this.yearlen);\n for (var i = start; i < end; i++)\n set[i] = i;\n return [set, start, end];\n };\n Iterinfo.prototype.wdayset = function (year, month, day) {\n // We need to handle cross-year weeks here.\n var set = repeat(null, this.yearlen + 7);\n var i = toOrdinal(datetime(year, month, day)) - this.yearordinal;\n var start = i;\n for (var j = 0; j < 7; j++) {\n set[i] = i;\n ++i;\n if (this.wdaymask[i] === this.options.wkst)\n break;\n }\n return [set, start, i];\n };\n Iterinfo.prototype.ddayset = function (year, month, day) {\n var set = repeat(null, this.yearlen);\n var i = toOrdinal(datetime(year, month, day)) - this.yearordinal;\n set[i] = i;\n return [set, i, i + 1];\n };\n Iterinfo.prototype.htimeset = function (hour, _, second, millisecond) {\n var _this = this;\n var set = [];\n this.options.byminute.forEach(function (minute) {\n set = set.concat(_this.mtimeset(hour, minute, second, millisecond));\n });\n sort(set);\n return set;\n };\n Iterinfo.prototype.mtimeset = function (hour, minute, _, millisecond) {\n var set = this.options.bysecond.map(function (second) { return new Time(hour, minute, second, millisecond); });\n sort(set);\n return set;\n };\n Iterinfo.prototype.stimeset = function (hour, minute, second, millisecond) {\n return [new Time(hour, minute, second, millisecond)];\n };\n Iterinfo.prototype.getdayset = function (freq) {\n switch (freq) {\n case Frequency.YEARLY:\n return this.ydayset.bind(this);\n case Frequency.MONTHLY:\n return this.mdayset.bind(this);\n case Frequency.WEEKLY:\n return this.wdayset.bind(this);\n case Frequency.DAILY:\n return this.ddayset.bind(this);\n default:\n return this.ddayset.bind(this);\n }\n };\n Iterinfo.prototype.gettimeset = function (freq) {\n switch (freq) {\n case Frequency.HOURLY:\n return this.htimeset.bind(this);\n case Frequency.MINUTELY:\n return this.mtimeset.bind(this);\n case Frequency.SECONDLY:\n return this.stimeset.bind(this);\n }\n };\n return Iterinfo;\n}());\n/* harmony default export */ const iterinfo = (Iterinfo);\n\n;// CONCATENATED MODULE: ./src/iter/poslist.ts\n\n\nfunction buildPoslist(bysetpos, timeset, start, end, ii, dayset) {\n var poslist = [];\n for (var j = 0; j < bysetpos.length; j++) {\n var daypos = void 0;\n var timepos = void 0;\n var pos = bysetpos[j];\n if (pos < 0) {\n daypos = Math.floor(pos / timeset.length);\n timepos = pymod(pos, timeset.length);\n }\n else {\n daypos = Math.floor((pos - 1) / timeset.length);\n timepos = pymod(pos - 1, timeset.length);\n }\n var tmp = [];\n for (var k = start; k < end; k++) {\n var val = dayset[k];\n if (!isPresent(val))\n continue;\n tmp.push(val);\n }\n var i = void 0;\n if (daypos < 0) {\n i = tmp.slice(daypos)[0];\n }\n else {\n i = tmp[daypos];\n }\n var time = timeset[timepos];\n var date = fromOrdinal(ii.yearordinal + i);\n var res = combine(date, time);\n // XXX: can this ever be in the array?\n // - compare the actual date instead?\n if (!includes(poslist, res))\n poslist.push(res);\n }\n sort(poslist);\n return poslist;\n}\n\n;// CONCATENATED MODULE: ./src/iter/index.ts\n\n\n\n\n\n\n\n\n\nfunction iter(iterResult, options) {\n var dtstart = options.dtstart, freq = options.freq, interval = options.interval, until = options.until, bysetpos = options.bysetpos;\n var count = options.count;\n if (count === 0 || interval === 0) {\n return emitResult(iterResult);\n }\n var counterDate = DateTime.fromDate(dtstart);\n var ii = new iterinfo(options);\n ii.rebuild(counterDate.year, counterDate.month);\n var timeset = makeTimeset(ii, counterDate, options);\n for (;;) {\n var _a = ii.getdayset(freq)(counterDate.year, counterDate.month, counterDate.day), dayset = _a[0], start = _a[1], end = _a[2];\n var filtered = removeFilteredDays(dayset, start, end, ii, options);\n if (notEmpty(bysetpos)) {\n var poslist = buildPoslist(bysetpos, timeset, start, end, ii, dayset);\n for (var j = 0; j < poslist.length; j++) {\n var res = poslist[j];\n if (until && res > until) {\n return emitResult(iterResult);\n }\n if (res >= dtstart) {\n var rezonedDate = rezoneIfNeeded(res, options);\n if (!iterResult.accept(rezonedDate)) {\n return emitResult(iterResult);\n }\n if (count) {\n --count;\n if (!count) {\n return emitResult(iterResult);\n }\n }\n }\n }\n }\n else {\n for (var j = start; j < end; j++) {\n var currentDay = dayset[j];\n if (!isPresent(currentDay)) {\n continue;\n }\n var date = fromOrdinal(ii.yearordinal + currentDay);\n for (var k = 0; k < timeset.length; k++) {\n var time = timeset[k];\n var res = combine(date, time);\n if (until && res > until) {\n return emitResult(iterResult);\n }\n if (res >= dtstart) {\n var rezonedDate = rezoneIfNeeded(res, options);\n if (!iterResult.accept(rezonedDate)) {\n return emitResult(iterResult);\n }\n if (count) {\n --count;\n if (!count) {\n return emitResult(iterResult);\n }\n }\n }\n }\n }\n }\n if (options.interval === 0) {\n return emitResult(iterResult);\n }\n // Handle frequency and interval\n counterDate.add(options, filtered);\n if (counterDate.year > MAXYEAR) {\n return emitResult(iterResult);\n }\n if (!freqIsDailyOrGreater(freq)) {\n timeset = ii.gettimeset(freq)(counterDate.hour, counterDate.minute, counterDate.second, 0);\n }\n ii.rebuild(counterDate.year, counterDate.month);\n }\n}\nfunction isFiltered(ii, currentDay, options) {\n var bymonth = options.bymonth, byweekno = options.byweekno, byweekday = options.byweekday, byeaster = options.byeaster, bymonthday = options.bymonthday, bynmonthday = options.bynmonthday, byyearday = options.byyearday;\n return ((notEmpty(bymonth) && !includes(bymonth, ii.mmask[currentDay])) ||\n (notEmpty(byweekno) && !ii.wnomask[currentDay]) ||\n (notEmpty(byweekday) && !includes(byweekday, ii.wdaymask[currentDay])) ||\n (notEmpty(ii.nwdaymask) && !ii.nwdaymask[currentDay]) ||\n (byeaster !== null && !includes(ii.eastermask, currentDay)) ||\n ((notEmpty(bymonthday) || notEmpty(bynmonthday)) &&\n !includes(bymonthday, ii.mdaymask[currentDay]) &&\n !includes(bynmonthday, ii.nmdaymask[currentDay])) ||\n (notEmpty(byyearday) &&\n ((currentDay < ii.yearlen &&\n !includes(byyearday, currentDay + 1) &&\n !includes(byyearday, -ii.yearlen + currentDay)) ||\n (currentDay >= ii.yearlen &&\n !includes(byyearday, currentDay + 1 - ii.yearlen) &&\n !includes(byyearday, -ii.nextyearlen + currentDay - ii.yearlen)))));\n}\nfunction rezoneIfNeeded(date, options) {\n return new DateWithZone(date, options.tzid).rezonedDate();\n}\nfunction emitResult(iterResult) {\n return iterResult.getValue();\n}\nfunction removeFilteredDays(dayset, start, end, ii, options) {\n var filtered = false;\n for (var dayCounter = start; dayCounter < end; dayCounter++) {\n var currentDay = dayset[dayCounter];\n filtered = isFiltered(ii, currentDay, options);\n if (filtered)\n dayset[currentDay] = null;\n }\n return filtered;\n}\nfunction makeTimeset(ii, counterDate, options) {\n var freq = options.freq, byhour = options.byhour, byminute = options.byminute, bysecond = options.bysecond;\n if (freqIsDailyOrGreater(freq)) {\n return buildTimeset(options);\n }\n if ((freq >= RRule.HOURLY &&\n notEmpty(byhour) &&\n !includes(byhour, counterDate.hour)) ||\n (freq >= RRule.MINUTELY &&\n notEmpty(byminute) &&\n !includes(byminute, counterDate.minute)) ||\n (freq >= RRule.SECONDLY &&\n notEmpty(bysecond) &&\n !includes(bysecond, counterDate.second))) {\n return [];\n }\n return ii.gettimeset(freq)(counterDate.hour, counterDate.minute, counterDate.second, counterDate.millisecond);\n}\n\n;// CONCATENATED MODULE: ./src/rrule.ts\n\n\n\n\n\n\n\n\n\n\n\n// =============================================================================\n// RRule\n// =============================================================================\nvar Days = {\n MO: new Weekday(0),\n TU: new Weekday(1),\n WE: new Weekday(2),\n TH: new Weekday(3),\n FR: new Weekday(4),\n SA: new Weekday(5),\n SU: new Weekday(6),\n};\nvar DEFAULT_OPTIONS = {\n freq: Frequency.YEARLY,\n dtstart: null,\n interval: 1,\n wkst: Days.MO,\n count: null,\n until: null,\n tzid: null,\n bysetpos: null,\n bymonth: null,\n bymonthday: null,\n bynmonthday: null,\n byyearday: null,\n byweekno: null,\n byweekday: null,\n bynweekday: null,\n byhour: null,\n byminute: null,\n bysecond: null,\n byeaster: null,\n};\nvar defaultKeys = Object.keys(DEFAULT_OPTIONS);\n/**\n *\n * @param {Options?} options - see <http://labix.org/python-dateutil/#head-cf004ee9a75592797e076752b2a889c10f445418>\n * - The only required option is `freq`, one of RRule.YEARLY, RRule.MONTHLY, ...\n * @constructor\n */\nvar RRule = /** @class */ (function () {\n function RRule(options, noCache) {\n if (options === void 0) { options = {}; }\n if (noCache === void 0) { noCache = false; }\n // RFC string\n this._cache = noCache ? null : new Cache();\n // used by toString()\n this.origOptions = initializeOptions(options);\n var parsedOptions = parseOptions(options).parsedOptions;\n this.options = parsedOptions;\n }\n RRule.parseText = function (text, language) {\n return parseText(text, language);\n };\n RRule.fromText = function (text, language) {\n return fromText(text, language);\n };\n RRule.fromString = function (str) {\n return new RRule(RRule.parseString(str) || undefined);\n };\n RRule.prototype._iter = function (iterResult) {\n return iter(iterResult, this.options);\n };\n RRule.prototype._cacheGet = function (what, args) {\n if (!this._cache)\n return false;\n return this._cache._cacheGet(what, args);\n };\n RRule.prototype._cacheAdd = function (what, value, args) {\n if (!this._cache)\n return;\n return this._cache._cacheAdd(what, value, args);\n };\n /**\n * @param {Function} iterator - optional function that will be called\n * on each date that is added. It can return false\n * to stop the iteration.\n * @return Array containing all recurrences.\n */\n RRule.prototype.all = function (iterator) {\n if (iterator) {\n return this._iter(new callbackiterresult('all', {}, iterator));\n }\n var result = this._cacheGet('all');\n if (result === false) {\n result = this._iter(new iterresult('all', {}));\n this._cacheAdd('all', result);\n }\n return result;\n };\n /**\n * Returns all the occurrences of the rrule between after and before.\n * The inc keyword defines what happens if after and/or before are\n * themselves occurrences. With inc == True, they will be included in the\n * list, if they are found in the recurrence set.\n *\n * @return Array\n */\n RRule.prototype.between = function (after, before, inc, iterator) {\n if (inc === void 0) { inc = false; }\n if (!isValidDate(after) || !isValidDate(before)) {\n throw new Error('Invalid date passed in to RRule.between');\n }\n var args = {\n before: before,\n after: after,\n inc: inc,\n };\n if (iterator) {\n return this._iter(new callbackiterresult('between', args, iterator));\n }\n var result = this._cacheGet('between', args);\n if (result === false) {\n result = this._iter(new iterresult('between', args));\n this._cacheAdd('between', result, args);\n }\n return result;\n };\n /**\n * Returns the last recurrence before the given datetime instance.\n * The inc keyword defines what happens if dt is an occurrence.\n * With inc == True, if dt itself is an occurrence, it will be returned.\n *\n * @return Date or null\n */\n RRule.prototype.before = function (dt, inc) {\n if (inc === void 0) { inc = false; }\n if (!isValidDate(dt)) {\n throw new Error('Invalid date passed in to RRule.before');\n }\n var args = { dt: dt, inc: inc };\n var result = this._cacheGet('before', args);\n if (result === false) {\n result = this._iter(new iterresult('before', args));\n this._cacheAdd('before', result, args);\n }\n return result;\n };\n /**\n * Returns the first recurrence after the given datetime instance.\n * The inc keyword defines what happens if dt is an occurrence.\n * With inc == True, if dt itself is an occurrence, it will be returned.\n *\n * @return Date or null\n */\n RRule.prototype.after = function (dt, inc) {\n if (inc === void 0) { inc = false; }\n if (!isValidDate(dt)) {\n throw new Error('Invalid date passed in to RRule.after');\n }\n var args = { dt: dt, inc: inc };\n var result = this._cacheGet('after', args);\n if (result === false) {\n result = this._iter(new iterresult('after', args));\n this._cacheAdd('after', result, args);\n }\n return result;\n };\n /**\n * Returns the number of recurrences in this set. It will have go trough\n * the whole recurrence, if this hasn't been done before.\n */\n RRule.prototype.count = function () {\n return this.all().length;\n };\n /**\n * Converts the rrule into its string representation\n *\n * @see <http://www.ietf.org/rfc/rfc2445.txt>\n * @return String\n */\n RRule.prototype.toString = function () {\n return optionsToString(this.origOptions);\n };\n /**\n * Will convert all rules described in nlp:ToText\n * to text.\n */\n RRule.prototype.toText = function (gettext, language, dateFormatter) {\n return toText(this, gettext, language, dateFormatter);\n };\n RRule.prototype.isFullyConvertibleToText = function () {\n return isFullyConvertible(this);\n };\n /**\n * @return a RRule instance with the same freq and options\n * as this one (cache is not cloned)\n */\n RRule.prototype.clone = function () {\n return new RRule(this.origOptions);\n };\n // RRule class 'constants'\n RRule.FREQUENCIES = [\n 'YEARLY',\n 'MONTHLY',\n 'WEEKLY',\n 'DAILY',\n 'HOURLY',\n 'MINUTELY',\n 'SECONDLY',\n ];\n RRule.YEARLY = Frequency.YEARLY;\n RRule.MONTHLY = Frequency.MONTHLY;\n RRule.WEEKLY = Frequency.WEEKLY;\n RRule.DAILY = Frequency.DAILY;\n RRule.HOURLY = Frequency.HOURLY;\n RRule.MINUTELY = Frequency.MINUTELY;\n RRule.SECONDLY = Frequency.SECONDLY;\n RRule.MO = Days.MO;\n RRule.TU = Days.TU;\n RRule.WE = Days.WE;\n RRule.TH = Days.TH;\n RRule.FR = Days.FR;\n RRule.SA = Days.SA;\n RRule.SU = Days.SU;\n RRule.parseString = parseString;\n RRule.optionsToString = optionsToString;\n return RRule;\n}());\n\n\n;// CONCATENATED MODULE: ./src/iterset.ts\n\n\n\nfunction iterSet(iterResult, _rrule, _exrule, _rdate, _exdate, tzid) {\n var _exdateHash = {};\n var _accept = iterResult.accept;\n function evalExdate(after, before) {\n _exrule.forEach(function (rrule) {\n rrule.between(after, before, true).forEach(function (date) {\n _exdateHash[Number(date)] = true;\n });\n });\n }\n _exdate.forEach(function (date) {\n var zonedDate = new DateWithZone(date, tzid).rezonedDate();\n _exdateHash[Number(zonedDate)] = true;\n });\n iterResult.accept = function (date) {\n var dt = Number(date);\n if (isNaN(dt))\n return _accept.call(this, date);\n if (!_exdateHash[dt]) {\n evalExdate(new Date(dt - 1), new Date(dt + 1));\n if (!_exdateHash[dt]) {\n _exdateHash[dt] = true;\n return _accept.call(this, date);\n }\n }\n return true;\n };\n if (iterResult.method === 'between') {\n evalExdate(iterResult.args.after, iterResult.args.before);\n iterResult.accept = function (date) {\n var dt = Number(date);\n if (!_exdateHash[dt]) {\n _exdateHash[dt] = true;\n return _accept.call(this, date);\n }\n return true;\n };\n }\n for (var i = 0; i < _rdate.length; i++) {\n var zonedDate = new DateWithZone(_rdate[i], tzid).rezonedDate();\n if (!iterResult.accept(new Date(zonedDate.getTime())))\n break;\n }\n _rrule.forEach(function (rrule) {\n iter(iterResult, rrule.options);\n });\n var res = iterResult._result;\n sort(res);\n switch (iterResult.method) {\n case 'all':\n case 'between':\n return res;\n case 'before':\n return ((res.length && res[res.length - 1]) || null);\n case 'after':\n default:\n return ((res.length && res[0]) || null);\n }\n}\n\n;// CONCATENATED MODULE: ./src/rrulestr.ts\n\n\n\n\n\n\n/**\n * RRuleStr\n * To parse a set of rrule strings\n */\nvar rrulestr_DEFAULT_OPTIONS = {\n dtstart: null,\n cache: false,\n unfold: false,\n forceset: false,\n compatible: false,\n tzid: null,\n};\nfunction parseInput(s, options) {\n var rrulevals = [];\n var rdatevals = [];\n var exrulevals = [];\n var exdatevals = [];\n var parsedDtstart = parseDtstart(s);\n var dtstart = parsedDtstart.dtstart;\n var tzid = parsedDtstart.tzid;\n var lines = splitIntoLines(s, options.unfold);\n lines.forEach(function (line) {\n var _a;\n if (!line)\n return;\n var _b = breakDownLine(line), name = _b.name, parms = _b.parms, value = _b.value;\n switch (name.toUpperCase()) {\n case 'RRULE':\n if (parms.length) {\n throw new Error(\"unsupported RRULE parm: \".concat(parms.join(',')));\n }\n rrulevals.push(parseString(line));\n break;\n case 'RDATE':\n var _c = (_a = /RDATE(?:;TZID=([^:=]+))?/i.exec(line)) !== null && _a !== void 0 ? _a : [], rdateTzid = _c[1];\n if (rdateTzid && !tzid) {\n tzid = rdateTzid;\n }\n rdatevals = rdatevals.concat(parseRDate(value, parms));\n break;\n case 'EXRULE':\n if (parms.length) {\n throw new Error(\"unsupported EXRULE parm: \".concat(parms.join(',')));\n }\n exrulevals.push(parseString(value));\n break;\n case 'EXDATE':\n exdatevals = exdatevals.concat(parseRDate(value, parms));\n break;\n case 'DTSTART':\n break;\n default:\n throw new Error('unsupported property: ' + name);\n }\n });\n return {\n dtstart: dtstart,\n tzid: tzid,\n rrulevals: rrulevals,\n rdatevals: rdatevals,\n exrulevals: exrulevals,\n exdatevals: exdatevals,\n };\n}\nfunction buildRule(s, options) {\n var _a = parseInput(s, options), rrulevals = _a.rrulevals, rdatevals = _a.rdatevals, exrulevals = _a.exrulevals, exdatevals = _a.exdatevals, dtstart = _a.dtstart, tzid = _a.tzid;\n var noCache = options.cache === false;\n if (options.compatible) {\n options.forceset = true;\n options.unfold = true;\n }\n if (options.forceset ||\n rrulevals.length > 1 ||\n rdatevals.length ||\n exrulevals.length ||\n exdatevals.length) {\n var rset_1 = new RRuleSet(noCache);\n rset_1.dtstart(dtstart);\n rset_1.tzid(tzid || undefined);\n rrulevals.forEach(function (val) {\n rset_1.rrule(new RRule(groomRruleOptions(val, dtstart, tzid), noCache));\n });\n rdatevals.forEach(function (date) {\n rset_1.rdate(date);\n });\n exrulevals.forEach(function (val) {\n rset_1.exrule(new RRule(groomRruleOptions(val, dtstart, tzid), noCache));\n });\n exdatevals.forEach(function (date) {\n rset_1.exdate(date);\n });\n if (options.compatible && options.dtstart)\n rset_1.rdate(dtstart);\n return rset_1;\n }\n var val = rrulevals[0] || {};\n return new RRule(groomRruleOptions(val, val.dtstart || options.dtstart || dtstart, val.tzid || options.tzid || tzid), noCache);\n}\nfunction rrulestr(s, options) {\n if (options === void 0) { options = {}; }\n return buildRule(s, rrulestr_initializeOptions(options));\n}\nfunction groomRruleOptions(val, dtstart, tzid) {\n return __assign(__assign({}, val), { dtstart: dtstart, tzid: tzid });\n}\nfunction rrulestr_initializeOptions(options) {\n var invalid = [];\n var keys = Object.keys(options);\n var defaultKeys = Object.keys(rrulestr_DEFAULT_OPTIONS);\n keys.forEach(function (key) {\n if (!includes(defaultKeys, key))\n invalid.push(key);\n });\n if (invalid.length) {\n throw new Error('Invalid options: ' + invalid.join(', '));\n }\n return __assign(__assign({}, rrulestr_DEFAULT_OPTIONS), options);\n}\nfunction extractName(line) {\n if (line.indexOf(':') === -1) {\n return {\n name: 'RRULE',\n value: line,\n };\n }\n var _a = split(line, ':', 1), name = _a[0], value = _a[1];\n return {\n name: name,\n value: value,\n };\n}\nfunction breakDownLine(line) {\n var _a = extractName(line), name = _a.name, value = _a.value;\n var parms = name.split(';');\n if (!parms)\n throw new Error('empty property name');\n return {\n name: parms[0].toUpperCase(),\n parms: parms.slice(1),\n value: value,\n };\n}\nfunction splitIntoLines(s, unfold) {\n if (unfold === void 0) { unfold = false; }\n s = s && s.trim();\n if (!s)\n throw new Error('Invalid empty string');\n // More info about 'unfold' option\n // Go head to http://www.ietf.org/rfc/rfc2445.txt\n if (!unfold) {\n return s.split(/\\s/);\n }\n var lines = s.split('\\n');\n var i = 0;\n while (i < lines.length) {\n // TODO\n var line = (lines[i] = lines[i].replace(/\\s+$/g, ''));\n if (!line) {\n lines.splice(i, 1);\n }\n else if (i > 0 && line[0] === ' ') {\n lines[i - 1] += line.slice(1);\n lines.splice(i, 1);\n }\n else {\n i += 1;\n }\n }\n return lines;\n}\nfunction validateDateParm(parms) {\n parms.forEach(function (parm) {\n if (!/(VALUE=DATE(-TIME)?)|(TZID=)/.test(parm)) {\n throw new Error('unsupported RDATE/EXDATE parm: ' + parm);\n }\n });\n}\nfunction parseRDate(rdateval, parms) {\n validateDateParm(parms);\n return rdateval.split(',').map(function (datestr) { return untilStringToDate(datestr); });\n}\n\n;// CONCATENATED MODULE: ./src/rruleset.ts\n\n\n\n\n\n\n\nfunction createGetterSetter(fieldName) {\n var _this = this;\n return function (field) {\n if (field !== undefined) {\n _this[\"_\".concat(fieldName)] = field;\n }\n if (_this[\"_\".concat(fieldName)] !== undefined) {\n return _this[\"_\".concat(fieldName)];\n }\n for (var i = 0; i < _this._rrule.length; i++) {\n var field_1 = _this._rrule[i].origOptions[fieldName];\n if (field_1) {\n return field_1;\n }\n }\n };\n}\nvar RRuleSet = /** @class */ (function (_super) {\n __extends(RRuleSet, _super);\n /**\n *\n * @param {Boolean?} noCache\n * The same stratagy as RRule on cache, default to false\n * @constructor\n */\n function RRuleSet(noCache) {\n if (noCache === void 0) { noCache = false; }\n var _this = _super.call(this, {}, noCache) || this;\n _this.dtstart = createGetterSetter.apply(_this, ['dtstart']);\n _this.tzid = createGetterSetter.apply(_this, ['tzid']);\n _this._rrule = [];\n _this._rdate = [];\n _this._exrule = [];\n _this._exdate = [];\n return _this;\n }\n RRuleSet.prototype._iter = function (iterResult) {\n return iterSet(iterResult, this._rrule, this._exrule, this._rdate, this._exdate, this.tzid());\n };\n /**\n * Adds an RRule to the set\n *\n * @param {RRule}\n */\n RRuleSet.prototype.rrule = function (rrule) {\n _addRule(rrule, this._rrule);\n };\n /**\n * Adds an EXRULE to the set\n *\n * @param {RRule}\n */\n RRuleSet.prototype.exrule = function (rrule) {\n _addRule(rrule, this._exrule);\n };\n /**\n * Adds an RDate to the set\n *\n * @param {Date}\n */\n RRuleSet.prototype.rdate = function (date) {\n _addDate(date, this._rdate);\n };\n /**\n * Adds an EXDATE to the set\n *\n * @param {Date}\n */\n RRuleSet.prototype.exdate = function (date) {\n _addDate(date, this._exdate);\n };\n /**\n * Get list of included rrules in this recurrence set.\n *\n * @return List of rrules\n */\n RRuleSet.prototype.rrules = function () {\n return this._rrule.map(function (e) { return rrulestr(e.toString()); });\n };\n /**\n * Get list of excluded rrules in this recurrence set.\n *\n * @return List of exrules\n */\n RRuleSet.prototype.exrules = function () {\n return this._exrule.map(function (e) { return rrulestr(e.toString()); });\n };\n /**\n * Get list of included datetimes in this recurrence set.\n *\n * @return List of rdates\n */\n RRuleSet.prototype.rdates = function () {\n return this._rdate.map(function (e) { return new Date(e.getTime()); });\n };\n /**\n * Get list of included datetimes in this recurrence set.\n *\n * @return List of exdates\n */\n RRuleSet.prototype.exdates = function () {\n return this._exdate.map(function (e) { return new Date(e.getTime()); });\n };\n RRuleSet.prototype.valueOf = function () {\n var result = [];\n if (!this._rrule.length && this._dtstart) {\n result = result.concat(optionsToString({ dtstart: this._dtstart }));\n }\n this._rrule.forEach(function (rrule) {\n result = result.concat(rrule.toString().split('\\n'));\n });\n this._exrule.forEach(function (exrule) {\n result = result.concat(exrule\n .toString()\n .split('\\n')\n .map(function (line) { return line.replace(/^RRULE:/, 'EXRULE:'); })\n .filter(function (line) { return !/^DTSTART/.test(line); }));\n });\n if (this._rdate.length) {\n result.push(rdatesToString('RDATE', this._rdate, this.tzid()));\n }\n if (this._exdate.length) {\n result.push(rdatesToString('EXDATE', this._exdate, this.tzid()));\n }\n return result;\n };\n /**\n * to generate recurrence field such as:\n * DTSTART:19970902T010000Z\n * RRULE:FREQ=YEARLY;COUNT=2;BYDAY=TU\n * RRULE:FREQ=YEARLY;COUNT=1;BYDAY=TH\n */\n RRuleSet.prototype.toString = function () {\n return this.valueOf().join('\\n');\n };\n /**\n * Create a new RRuleSet Object completely base on current instance\n */\n RRuleSet.prototype.clone = function () {\n var rrs = new RRuleSet(!!this._cache);\n this._rrule.forEach(function (rule) { return rrs.rrule(rule.clone()); });\n this._exrule.forEach(function (rule) { return rrs.exrule(rule.clone()); });\n this._rdate.forEach(function (date) { return rrs.rdate(new Date(date.getTime())); });\n this._exdate.forEach(function (date) { return rrs.exdate(new Date(date.getTime())); });\n return rrs;\n };\n return RRuleSet;\n}(RRule));\n\nfunction _addRule(rrule, collection) {\n if (!(rrule instanceof RRule)) {\n throw new TypeError(String(rrule) + ' is not RRule instance');\n }\n if (!includes(collection.map(String), String(rrule))) {\n collection.push(rrule);\n }\n}\nfunction _addDate(date, collection) {\n if (!(date instanceof Date)) {\n throw new TypeError(String(date) + ' is not Date instance');\n }\n if (!includes(collection.map(Number), Number(date))) {\n collection.push(date);\n sort(collection);\n }\n}\nfunction rdatesToString(param, rdates, tzid) {\n var isUTC = !tzid || tzid.toUpperCase() === 'UTC';\n var header = isUTC ? \"\".concat(param, \":\") : \"\".concat(param, \";TZID=\").concat(tzid, \":\");\n var dateString = rdates\n .map(function (rdate) { return timeToUntilString(rdate.valueOf(), isUTC); })\n .join(',');\n return \"\".concat(header).concat(dateString);\n}\n\n;// CONCATENATED MODULE: ./src/index.ts\n/* !\n * rrule.js - Library for working with recurrence rules for calendar dates.\n * https://github.com/jakubroztocil/rrule\n *\n * Copyright 2010, Jakub Roztocil and Lars Schoning\n * Licenced under the BSD licence.\n * https://github.com/jakubroztocil/rrule/blob/master/LICENCE\n *\n * Based on:\n * python-dateutil - Extensions to the standard Python datetime module.\n * Copyright (c) 2003-2011 - Gustavo Niemeyer <gustavo@niemeyer.net>\n * Copyright (c) 2012 - Tomi Pieviläinen <tomi.pievilainen@iki.fi>\n * https://github.com/jakubroztocil/rrule/blob/master/LICENCE\n *\n */\n\n\n\n\n\n\n\n/******/ \treturn __webpack_exports__;\n/******/ })()\n;\n});","import {\n dateOnlyPartsToEpoch,\n epochToDateOnlyParts,\n formatDateOnlyParts,\n isValidDateOnlyParts,\n} from \"../date-codecs\";\nimport type { DateOnlyParts } from \"../date-codecs\";\n\nconst PACKED_DATE_MULTIPLIER = 128;\nconst PACKED_DATE_DAY_MASK = 0b1_1111;\nconst PACKED_DATE_MONTH_MASK = 0b1111;\nconst PACKED_DATE_MONTH_SHIFT = 5;\nconst PACKED_DATE_YEAR_SHIFT = 9;\nconst THINGS_REMINDER_HOUR_SCALE = 67_108_864;\n\ntype ThingsPackedDateParts = DateOnlyParts;\n\nconst isFiniteNumber = (value: number | null): value is number =>\n typeof value === \"number\" && Number.isFinite(value);\n\nconst isValidPackedDate = (parts: ThingsPackedDateParts): boolean =>\n isValidDateOnlyParts(parts);\n\nconst formatFloatingDate = (\n parts: ThingsPackedDateParts | null\n): string | null => {\n const formatted = parts ? formatDateOnlyParts(parts) : null;\n return formatted ? `${formatted.replaceAll(\"-\", \"\")}T000000` : null;\n};\n\nconst dateOnlyEpochToLocalMidnightInstant = (\n epochMs: number | null\n): number | null => {\n const parts = epochToDateOnlyParts(epochMs);\n\n if (!parts) {\n return null;\n }\n\n return new Date(parts.year, parts.month - 1, parts.day).getTime();\n};\n\nexport const decodeThingsPackedDateParts = (\n value: number | null\n): ThingsPackedDateParts | null => {\n if (!isFiniteNumber(value)) {\n return null;\n }\n\n const integer = Math.trunc(value);\n\n if (integer <= 0 || integer % PACKED_DATE_MULTIPLIER !== 0) {\n return null;\n }\n\n const packed = integer / PACKED_DATE_MULTIPLIER;\n const day = packed % (PACKED_DATE_DAY_MASK + 1);\n const month =\n Math.trunc(packed / 2 ** PACKED_DATE_MONTH_SHIFT) %\n (PACKED_DATE_MONTH_MASK + 1);\n const year = Math.trunc(packed / 2 ** PACKED_DATE_YEAR_SHIFT);\n const parts = {\n day,\n month,\n year,\n };\n\n return isValidPackedDate(parts) ? parts : null;\n};\n\nexport const decodeThingsPackedDate = (value: number | null): number | null => {\n const parts = decodeThingsPackedDateParts(value);\n\n if (!parts) {\n return null;\n }\n\n return dateOnlyPartsToEpoch(parts);\n};\n\nexport const decodeThingsPackedCalendarDate = (\n value: number | null,\n _timeZone: string | null\n): number | null => decodeThingsPackedDate(value);\n\nexport const formatThingsPackedDateAsFloatingDate = (\n value: number | null\n): string | null => formatFloatingDate(decodeThingsPackedDateParts(value));\n\nexport const formatThingsUnixDateAsFloatingDate = (\n value: number | null\n): string | null =>\n formatFloatingDate(epochToDateOnlyParts(decodeThingsUnixSeconds(value)));\n\nexport const decodeThingsUnixSeconds = (\n value: number | null\n): number | null => {\n if (!isFiniteNumber(value)) {\n return null;\n }\n\n return Math.round(value * 1000);\n};\n\nexport const decodeThingsUnixCalendarDate = (\n value: number | null,\n _timeZone: string | null\n): number | null => {\n const epochMs = decodeThingsUnixSeconds(value);\n\n if (epochMs === null) {\n return null;\n }\n\n const parts = epochToDateOnlyParts(epochMs);\n return parts ? dateOnlyPartsToEpoch(parts) : null;\n};\n\nexport const decodeThingsReminderOffset = (\n value: number | null\n): number | null => {\n if (!isFiniteNumber(value) || value < 0) {\n return null;\n }\n\n return Math.round((value / THINGS_REMINDER_HOUR_SCALE) * 60 * 60 * 1000);\n};\n\nexport const combineThingsReminderAt = (options: {\n reminderTime: number | null;\n startDate: number | null;\n nextStartDate?: number | null;\n deadlineDate?: number | null;\n}): number | null => {\n const offset = decodeThingsReminderOffset(options.reminderTime);\n const baseDate =\n options.startDate ?? options.nextStartDate ?? options.deadlineDate ?? null;\n\n if (offset === null || baseDate === null) {\n return null;\n }\n\n const baseInstant = dateOnlyEpochToLocalMidnightInstant(baseDate);\n return baseInstant === null ? null : baseInstant + offset;\n};\n","interface CalendarDateParts {\n year: number;\n month: number;\n day: number;\n}\n\ninterface CalendarDateTimeParts extends CalendarDateParts {\n hour: number;\n minute: number;\n second: number;\n}\n\nconst formatterCache = new Map<string, Intl.DateTimeFormat>();\n\nconst getFormatter = (timeZone: string): Intl.DateTimeFormat => {\n const cached = formatterCache.get(timeZone);\n\n if (cached) {\n return cached;\n }\n\n const formatter = new Intl.DateTimeFormat(\"en-CA\", {\n day: \"2-digit\",\n hour: \"2-digit\",\n hourCycle: \"h23\",\n minute: \"2-digit\",\n month: \"2-digit\",\n second: \"2-digit\",\n timeZone,\n year: \"numeric\",\n });\n\n formatterCache.set(timeZone, formatter);\n return formatter;\n};\n\nconst toDateTimeParts = (\n date: Date,\n timeZone: string\n): CalendarDateTimeParts | null => {\n const raw: Record<string, string> = {};\n\n for (const part of getFormatter(timeZone).formatToParts(date)) {\n if (part.type === \"literal\") {\n continue;\n }\n\n raw[part.type] = part.value;\n }\n\n const year = Number(raw.year);\n const month = Number(raw.month);\n const day = Number(raw.day);\n const hour = Number(raw.hour);\n const minute = Number(raw.minute);\n const second = Number(raw.second);\n\n if (\n !(\n Number.isFinite(year) &&\n Number.isFinite(month) &&\n Number.isFinite(day) &&\n Number.isFinite(hour) &&\n Number.isFinite(minute) &&\n Number.isFinite(second)\n )\n ) {\n return null;\n }\n\n return {\n day,\n hour,\n minute,\n month,\n second,\n year,\n };\n};\n\nexport const resolveTimeZoneOrNull = (\n value: string | null | undefined\n): string | null => {\n if (typeof value !== \"string\") {\n return null;\n }\n\n const trimmed = value.trim();\n\n if (trimmed.length === 0) {\n return null;\n }\n\n try {\n getFormatter(trimmed).format(new Date(0));\n return trimmed;\n } catch {\n return null;\n }\n};\n\nexport const resolveLocalTimeZone = (): string | null =>\n resolveTimeZoneOrNull(Intl.DateTimeFormat().resolvedOptions().timeZone);\n\nexport const getUtcCalendarDateParts = (date: Date): CalendarDateParts => ({\n day: date.getUTCDate(),\n month: date.getUTCMonth() + 1,\n year: date.getUTCFullYear(),\n});\n\nexport const getCalendarDatePartsInTimeZone = (\n date: Date,\n timeZone: string\n): CalendarDateParts => {\n const parts = toDateTimeParts(date, timeZone);\n\n if (!parts) {\n return getUtcCalendarDateParts(date);\n }\n\n return {\n day: parts.day,\n month: parts.month,\n year: parts.year,\n };\n};\n\nexport const calendarDateToUtcEpoch = (parts: CalendarDateParts): number =>\n Date.UTC(parts.year, parts.month - 1, parts.day);\n\nexport const getUtcCalendarDayEndEpoch = (date: Date): number => {\n const parts = getUtcCalendarDateParts(date);\n\n return Date.UTC(parts.year, parts.month - 1, parts.day, 23, 59, 59, 999);\n};\n","import { RRule, rrulestr } from \"rrule\";\n\nimport type { ThingsTaskRecord } from \"./things-sqlite\";\nimport {\n decodeThingsPackedCalendarDate,\n decodeThingsUnixCalendarDate,\n decodeThingsUnixSeconds,\n formatThingsPackedDateAsFloatingDate,\n formatThingsUnixDateAsFloatingDate,\n} from \"./things-values\";\nimport {\n calendarDateToUtcEpoch,\n getCalendarDatePartsInTimeZone,\n getUtcCalendarDateParts,\n getUtcCalendarDayEndEpoch,\n resolveTimeZoneOrNull,\n} from \"./time-zone\";\n\nconst THINGS_FREQUENCY_TO_RRULE = new Map<number, string>([\n [4, \"YEARLY\"],\n [8, \"MONTHLY\"],\n [16, \"DAILY\"],\n [256, \"WEEKLY\"],\n]);\n\nconst THINGS_WEEKDAY_TO_RRULE = [\n \"SU\",\n \"MO\",\n \"TU\",\n \"WE\",\n \"TH\",\n \"FR\",\n \"SA\",\n] as const;\n\ninterface ThingsRecurrenceOffset {\n wd?: number;\n dy?: number;\n}\n\ninterface ThingsRecurrenceDefinition {\n ia: number | null;\n sr: number | null;\n ed: number | null;\n rc: number | null;\n fu: number | null;\n fa: number | null;\n tp: number | null;\n ts: number | null;\n offsets: ThingsRecurrenceOffset[];\n}\n\ninterface ThingsRepeatTemplateFields {\n repeatRule: string;\n repeatType: \"fixed\" | \"after_completion\";\n repeatStatus: \"active\" | \"paused\";\n repeatNextAt: number | null;\n currentInstanceDate: number | null;\n recurrence: ThingsRecurrenceDefinition;\n}\n\nconst parseNumericPlistField = (xml: string, key: string): number | null => {\n const match = new RegExp(\n `<key>${key}</key>\\\\s*<(integer|real)>([^<]+)</\\\\1>`,\n \"u\"\n ).exec(xml);\n\n if (!match?.[2]) {\n return null;\n }\n\n const parsed = Number(match[2]);\n return Number.isFinite(parsed) ? parsed : null;\n};\n\nconst PLIST_OFFSETS_ARRAY_PATTERN =\n /<key>of<\\/key>\\s*<array>([\\s\\S]*?)<\\/array>/u;\n\nconst parseOffsets = (xml: string): ThingsRecurrenceOffset[] => {\n const arrayMatch = PLIST_OFFSETS_ARRAY_PATTERN.exec(xml);\n\n if (!arrayMatch?.[1]) {\n return [];\n }\n\n const offsets: ThingsRecurrenceOffset[] = [];\n\n for (const dictMatch of arrayMatch[1].matchAll(\n /<dict>([\\s\\S]*?)<\\/dict>/gu\n )) {\n const [, fragment] = dictMatch;\n\n if (!fragment) {\n continue;\n }\n\n const weekday = parseNumericPlistField(fragment, \"wd\");\n const monthDay = parseNumericPlistField(fragment, \"dy\");\n\n offsets.push({\n dy: monthDay ?? undefined,\n wd: weekday ?? undefined,\n });\n }\n\n return offsets;\n};\n\nconst parseRRule = (rule: string): InstanceType<typeof RRule> | null => {\n try {\n const parsed = rrulestr(rule);\n return parsed instanceof RRule ? parsed : null;\n } catch {\n return null;\n }\n};\n\nconst buildByDayTokens = (definition: ThingsRecurrenceDefinition): string[] => {\n const tokens = definition.offsets\n .map((offset) =>\n typeof offset.wd === \"number\"\n ? (THINGS_WEEKDAY_TO_RRULE[offset.wd] ?? null)\n : null\n )\n .filter(\n (value): value is (typeof THINGS_WEEKDAY_TO_RRULE)[number] =>\n value !== null\n );\n\n if (tokens.length > 0) {\n return tokens;\n }\n\n if (definition.ia === null) {\n return [];\n }\n\n const weekday = new Date(definition.ia * 1000).getUTCDay();\n return [THINGS_WEEKDAY_TO_RRULE[weekday] ?? \"MO\"];\n};\n\nconst buildMonthDays = (definition: ThingsRecurrenceDefinition): number[] => {\n const monthDays = definition.offsets\n .map((offset) =>\n typeof offset.dy === \"number\" ? Math.trunc(offset.dy) + 1 : null\n )\n .filter((value): value is number => value !== null && value >= 1);\n\n if (monthDays.length > 0) {\n return monthDays;\n }\n\n if (definition.ia === null) {\n return [];\n }\n\n return [new Date(definition.ia * 1000).getUTCDate()];\n};\n\nconst buildAnchor = (\n definition: ThingsRecurrenceDefinition,\n task: ThingsTaskRecord,\n timeZone: string | null\n): string | null => {\n const anchor =\n formatThingsUnixDateAsFloatingDate(definition.ia) ??\n formatThingsUnixDateAsFloatingDate(definition.sr) ??\n formatThingsPackedDateAsFloatingDate(task.nextInstanceStartDate) ??\n formatThingsPackedDateAsFloatingDate(task.startDate) ??\n formatThingsPackedDateAsFloatingDate(task.instanceCreationStartDate) ??\n null;\n\n if (!anchor) {\n return null;\n }\n\n if (!timeZone) {\n return `DTSTART:${anchor}`;\n }\n\n return `DTSTART;TZID=${timeZone}:${anchor}`;\n};\n\nconst buildRepeatRule = (\n definition: ThingsRecurrenceDefinition,\n task: ThingsTaskRecord,\n timeZone: string | null\n): string | null => {\n const frequency =\n definition.fu === null\n ? null\n : (THINGS_FREQUENCY_TO_RRULE.get(definition.fu) ?? null);\n\n if (!frequency) {\n return null;\n }\n\n const parts = [`FREQ=${frequency}`];\n const interval =\n definition.fa !== null && definition.fa > 0 ? Math.trunc(definition.fa) : 1;\n\n if (interval > 1) {\n parts.push(`INTERVAL=${interval}`);\n }\n\n if (frequency === \"WEEKLY\") {\n const byDayTokens = buildByDayTokens(definition);\n\n if (byDayTokens.length > 0) {\n parts.push(`BYDAY=${byDayTokens.join(\",\")}`);\n }\n }\n\n if (frequency === \"MONTHLY\") {\n const monthDays = buildMonthDays(definition);\n\n if (monthDays.length > 0) {\n parts.push(`BYMONTHDAY=${monthDays.join(\",\")}`);\n }\n }\n\n if (frequency === \"YEARLY\" && definition.ia !== null) {\n const anchor = new Date(definition.ia * 1000);\n parts.push(`BYMONTH=${anchor.getUTCMonth() + 1}`);\n parts.push(`BYMONTHDAY=${anchor.getUTCDate()}`);\n }\n\n const anchor = buildAnchor(definition, task, timeZone);\n\n if (!anchor) {\n return `RRULE:${parts.join(\";\")}`;\n }\n\n return `${anchor}\\nRRULE:${parts.join(\";\")}`;\n};\n\nconst getRuleTimeZone = (rule: InstanceType<typeof RRule>): string | null =>\n resolveTimeZoneOrNull(\n typeof rule.origOptions.tzid === \"string\" ? rule.origOptions.tzid : null\n );\n\nconst getOccurrenceCalendarParts = (\n occurrence: Date,\n timeZone: string | null\n) =>\n timeZone\n ? getCalendarDatePartsInTimeZone(occurrence, timeZone)\n : getUtcCalendarDateParts(occurrence);\n\nconst normalizeOccurrenceEpoch = (\n occurrence: Date,\n timeZone: string | null\n): number =>\n calendarDateToUtcEpoch(getOccurrenceCalendarParts(occurrence, timeZone));\n\nconst calculateNextOccurrence = (\n repeatRule: string,\n currentInstanceDate: number | null\n): number | null => {\n if (currentInstanceDate === null) {\n return null;\n }\n\n const parsed = parseRRule(repeatRule);\n\n if (!parsed) {\n return null;\n }\n\n const timeZone = getRuleTimeZone(parsed);\n const comparisonDate = new Date(\n getUtcCalendarDayEndEpoch(new Date(currentInstanceDate))\n );\n const next = parsed.after(comparisonDate, false);\n\n return next ? normalizeOccurrenceEpoch(next, timeZone) : null;\n};\n\nconst parseThingsRecurrenceDefinition = (\n xml: string | null\n): ThingsRecurrenceDefinition | null => {\n if (typeof xml !== \"string\" || xml.trim().length === 0) {\n return null;\n }\n\n const definition: ThingsRecurrenceDefinition = {\n ed: parseNumericPlistField(xml, \"ed\"),\n fa: parseNumericPlistField(xml, \"fa\"),\n fu: parseNumericPlistField(xml, \"fu\"),\n ia: parseNumericPlistField(xml, \"ia\"),\n offsets: parseOffsets(xml),\n rc: parseNumericPlistField(xml, \"rc\"),\n sr: parseNumericPlistField(xml, \"sr\"),\n tp: parseNumericPlistField(xml, \"tp\"),\n ts: parseNumericPlistField(xml, \"ts\"),\n };\n\n if (\n definition.ia === null &&\n definition.sr === null &&\n definition.ed === null &&\n definition.rc === null &&\n definition.fu === null &&\n definition.fa === null &&\n definition.tp === null &&\n definition.ts === null &&\n definition.offsets.length === 0\n ) {\n return null;\n }\n\n return definition;\n};\n\nexport const isThingsRepeatTemplateTask = (task: ThingsTaskRecord): boolean =>\n task.recurrenceRuleRaw !== null && task.repeatTemplateSourceId === null;\n\nexport const isThingsRepeatInstanceTask = (task: ThingsTaskRecord): boolean =>\n task.repeatTemplateSourceId !== null;\n\nexport const resolveThingsRepeatTemplateFields = (\n task: ThingsTaskRecord,\n timeZone?: string | null\n): ThingsRepeatTemplateFields | null => {\n if (!isThingsRepeatTemplateTask(task)) {\n return null;\n }\n\n const recurrence = parseThingsRecurrenceDefinition(task.recurrenceRuleRaw);\n\n if (!recurrence) {\n return null;\n }\n\n const repeatTimeZone = resolveTimeZoneOrNull(timeZone);\n const repeatRule = buildRepeatRule(recurrence, task, repeatTimeZone);\n\n if (!repeatRule) {\n return null;\n }\n\n const currentInstanceDate =\n decodeThingsPackedCalendarDate(\n task.nextInstanceStartDate,\n repeatTimeZone\n ) ??\n decodeThingsPackedCalendarDate(task.startDate, repeatTimeZone) ??\n decodeThingsUnixCalendarDate(recurrence.ia, repeatTimeZone) ??\n decodeThingsUnixSeconds(recurrence.ia);\n const repeatType =\n recurrence.tp === 1 ? \"after_completion\" : (\"fixed\" as const);\n\n return {\n currentInstanceDate,\n recurrence,\n repeatNextAt:\n repeatType === \"fixed\"\n ? calculateNextOccurrence(repeatRule, currentInstanceDate)\n : null,\n repeatRule,\n repeatStatus:\n task.instanceCreationPaused || recurrence.ts === 1 ? \"paused\" : \"active\",\n repeatType,\n };\n};\n\nexport const resolveThingsRepeatInstanceDate = (\n task: ThingsTaskRecord,\n timeZone?: string | null\n): number | null => {\n const repeatTimeZone = resolveTimeZoneOrNull(timeZone);\n\n return (\n decodeThingsPackedCalendarDate(task.startDate, repeatTimeZone) ??\n decodeThingsPackedCalendarDate(\n task.nextInstanceStartDate,\n repeatTimeZone\n ) ??\n null\n );\n};\n","import { dateOnlyEpochFromLocalDate } from \"../date-codecs\";\nimport {\n createDeterministicImportId,\n createTaskLabelId,\n createTeamProjectId,\n} from \"./model-id\";\nimport { normalizeThingsLabelLookupKey } from \"./things-labels\";\nimport {\n isThingsRepeatInstanceTask,\n isThingsRepeatTemplateTask,\n resolveThingsRepeatInstanceDate,\n resolveThingsRepeatTemplateFields,\n} from \"./things-recurrence\";\nimport type {\n ThingsAreaRecord,\n ThingsChecklistItemRecord,\n ThingsContactRecord,\n ThingsDatabaseSnapshot,\n ThingsTaskRecord,\n} from \"./things-sqlite\";\nimport {\n combineThingsReminderAt,\n decodeThingsPackedDate,\n decodeThingsUnixSeconds,\n} from \"./things-values\";\n\nexport type ThingsMetadataMode = \"note\" | \"none\";\n\nexport type ImportModelName =\n | \"Team\"\n | \"Label\"\n | \"Project\"\n | \"TeamProject\"\n | \"ProjectHeading\"\n | \"Task\"\n | \"TaskLabel\"\n | \"TaskChecklistItem\";\n\ninterface PlannedModelMutation {\n modelName: ImportModelName;\n modelId: string;\n payload: Record<string, unknown>;\n sourceId: string;\n}\n\ninterface ThingsImportPlan {\n databasePath: string;\n taskColumns: string[];\n counts: {\n source: Record<string, number>;\n planned: Record<string, number>;\n };\n phases: {\n name: string;\n items: PlannedModelMutation[];\n }[];\n}\n\ninterface BuildThingsImportPlanOptions {\n snapshot: ThingsDatabaseSnapshot;\n workspaceId: string;\n creatorId: string;\n metadataMode: ThingsMetadataMode;\n skipTeams?: boolean;\n existingLabelsByTitle?: Map<string, string>;\n timeZone?: string | null;\n}\n\ntype JsonValue =\n | null\n | boolean\n | number\n | string\n | JsonValue[]\n | { [key: string]: JsonValue };\n\nconst MAX_CHECKLIST_TITLE_LENGTH = 500;\n\nconst classifyTaskKind = (\n task: ThingsTaskRecord\n): \"task\" | \"project\" | \"heading\" => {\n if (task.type === 2) {\n return \"heading\";\n }\n\n if (task.type === 1 && task.projectId) {\n return \"heading\";\n }\n\n if (task.type === 1) {\n return \"project\";\n }\n\n return \"task\";\n};\n\nconst compareNullableNumber = (a: number | null, b: number | null): number =>\n (a ?? Number.MAX_SAFE_INTEGER) - (b ?? Number.MAX_SAFE_INTEGER);\n\nconst compareNullableString = (a: string | null, b: string | null): number =>\n (a ?? \"\").localeCompare(b ?? \"\");\n\nconst normalizeTitle = (\n value: string | null | undefined,\n fallback: string\n): string => {\n const trimmed = value?.trim();\n return trimmed && trimmed.length > 0 ? trimmed : fallback;\n};\n\nconst NON_ALPHANUMERIC_PATTERN = /[^A-Z0-9]+/gu;\nconst WHITESPACE_SPLIT_PATTERN = /\\s+/u;\nconst NON_ALPHANUMERIC_STRICT_PATTERN = /[^A-Z0-9]/gu;\nconst READABLE_TEXT_PATTERN = /^[\\t\\n\\r\\u0020-\\u007E\\u00A0-\\uFFFF]*$/u;\nconst EMAIL_SPLIT_PATTERN = /[,\\n;]/u;\n\nconst normalizeKeyBase = (value: string, fallback: string): string => {\n const words = value\n .toUpperCase()\n .replace(NON_ALPHANUMERIC_PATTERN, \" \")\n .trim()\n .split(WHITESPACE_SPLIT_PATTERN)\n .filter((word) => word.length > 0);\n const initials = words.map((word) => word[0] ?? \"\").join(\"\");\n const compact = value\n .toUpperCase()\n .replace(NON_ALPHANUMERIC_STRICT_PATTERN, \"\");\n return initials || compact || fallback;\n};\n\nconst buildUniqueKeys = <T extends { uuid: string; title: string | null }>(\n items: T[],\n options: { fallback: string; maxLength: number }\n): Map<string, string> => {\n const sorted = [...items].toSorted((a, b) => {\n const titleComparison = compareNullableString(a.title, b.title);\n if (titleComparison !== 0) {\n return titleComparison;\n }\n\n return a.uuid.localeCompare(b.uuid);\n });\n\n const keys = new Map<string, string>();\n const used = new Set<string>();\n\n for (const item of sorted) {\n const base = normalizeKeyBase(\n normalizeTitle(item.title, options.fallback),\n options.fallback\n ).slice(0, options.maxLength);\n\n let candidate = base || options.fallback;\n\n if (used.has(candidate)) {\n const suffixBase = item.uuid.replaceAll(/[^a-zA-Z0-9]/gu, \"\").slice(-4);\n const suffix = suffixBase.length > 0 ? suffixBase.toUpperCase() : \"X\";\n const headLength = Math.max(1, options.maxLength - suffix.length - 1);\n candidate = `${candidate.slice(0, headLength)}-${suffix}`;\n }\n\n let counter = 2;\n while (used.has(candidate)) {\n const suffix = String(counter);\n const headLength = Math.max(1, options.maxLength - suffix.length - 1);\n candidate = `${base.slice(0, headLength)}-${suffix}`;\n counter += 1;\n }\n\n used.add(candidate);\n keys.set(item.uuid, candidate);\n }\n\n return keys;\n};\n\nconst buildTaskFields = (\n task: ThingsTaskRecord\n): {\n start: string;\n startBucket: string;\n startDate: number | null;\n todayIndexReferenceDate: number | null;\n} => {\n const startDate =\n decodeThingsPackedDate(task.startDate) ??\n (isThingsRepeatTemplateTask(task)\n ? decodeThingsPackedDate(task.nextInstanceStartDate)\n : null);\n const todayReference = decodeThingsPackedDate(task.todayIndexReferenceDate);\n\n if (task.start === 0) {\n return {\n start: \"not_started\",\n startBucket: \"today\",\n startDate: null,\n todayIndexReferenceDate: null,\n };\n }\n\n if (task.start === 2) {\n if (startDate !== null || task.recurrenceRuleRaw !== null) {\n return {\n start: \"started\",\n startBucket: \"upcoming\",\n startDate,\n todayIndexReferenceDate: null,\n };\n }\n\n return {\n start: \"someday\",\n startBucket: \"today\",\n startDate: null,\n todayIndexReferenceDate: null,\n };\n }\n\n if (startDate !== null) {\n return {\n start: \"started\",\n startBucket: \"today\",\n startDate,\n todayIndexReferenceDate: todayReference ?? startDate,\n };\n }\n\n return {\n start: \"started\",\n startBucket: \"today\",\n startDate: null,\n todayIndexReferenceDate: null,\n };\n};\n\nconst buildReminderAt = (\n task: ThingsTaskRecord,\n startDate: number | null\n): number | null =>\n combineThingsReminderAt({\n deadlineDate: decodeThingsPackedDate(task.deadline),\n nextStartDate: decodeThingsPackedDate(task.nextInstanceStartDate),\n reminderTime: task.reminderTime,\n startDate,\n });\n\nconst pickArchivedAt = (task: ThingsTaskRecord): number | null => {\n const updatedAt = decodeThingsUnixSeconds(task.userModificationDate);\n const completedAt = decodeThingsUnixSeconds(task.stopDate);\n const createdAt = decodeThingsUnixSeconds(task.creationDate);\n\n if (task.trashed || task.status === 2) {\n return updatedAt ?? completedAt ?? createdAt;\n }\n\n return null;\n};\n\nconst pickCompletedAt = (task: ThingsTaskRecord): number | null => {\n if (task.status !== 3) {\n return null;\n }\n\n return (\n decodeThingsUnixSeconds(task.stopDate) ??\n decodeThingsUnixSeconds(task.userModificationDate) ??\n decodeThingsUnixSeconds(task.creationDate)\n );\n};\n\nconst sortValue = (primary: number | null, fallback: number): number =>\n typeof primary === \"number\" ? primary : fallback;\n\nconst sanitizeBuffer = (buffer: Buffer): JsonValue => {\n const asText = buffer.toString(\"utf-8\");\n const isReadable =\n !asText.includes(\"\\uFFFD\") && READABLE_TEXT_PATTERN.test(asText);\n\n if (isReadable) {\n const trimmed = asText.trim();\n if (trimmed.length > 0) {\n return trimmed;\n }\n }\n\n return {\n data: buffer.toString(\"base64\"),\n encoding: \"base64\",\n };\n};\n\nconst sanitizeValue = (value: unknown): JsonValue | undefined => {\n if (value === undefined || value === null) {\n return undefined;\n }\n\n if (\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\"\n ) {\n return value;\n }\n\n if (Buffer.isBuffer(value)) {\n return sanitizeBuffer(value);\n }\n\n if (Array.isArray(value)) {\n const items = value\n .map((entry) => sanitizeValue(entry))\n .filter((entry): entry is JsonValue => entry !== undefined);\n return items.length > 0 ? items : undefined;\n }\n\n if (typeof value === \"object\") {\n const record: Record<string, JsonValue> = {};\n\n for (const [key, entry] of Object.entries(\n value as Record<string, unknown>\n )) {\n const sanitized = sanitizeValue(entry);\n if (sanitized !== undefined) {\n record[key] = sanitized;\n }\n }\n\n return Object.keys(record).length > 0 ? record : undefined;\n }\n\n return String(value);\n};\n\nconst appendMetadataBlock = (\n base: string | null,\n metadataMode: ThingsMetadataMode,\n metadata: Record<string, unknown> | null\n): string | null => {\n const sanitized = sanitizeValue(metadata);\n\n if (metadataMode === \"none\" || sanitized === undefined) {\n const trimmed = base?.trim();\n return trimmed && trimmed.length > 0 ? trimmed : null;\n }\n\n const block = [\n \"Things 3 import metadata\",\n \"```json\",\n JSON.stringify(sanitized, null, 2),\n \"```\",\n ].join(\"\\n\");\n const trimmed = base?.trim();\n\n return trimmed && trimmed.length > 0 ? `${trimmed}\\n\\n---\\n\\n${block}` : null;\n};\n\nconst buildTaskMetadata = (\n task: ThingsTaskRecord,\n contact: ThingsContactRecord | null,\n extraMetadata?: Record<string, unknown> | null\n): Record<string, unknown> | null => {\n const metadata: Record<string, unknown> = {\n sourceUuid: task.uuid,\n };\n\n if (task.status === 2) {\n metadata.status = \"canceled\";\n }\n\n if (contact) {\n metadata.contact = {\n appleAddressBookId: contact.appleAddressBookId,\n displayName: contact.displayName,\n emails: decodeEmails(contact.emails),\n emailsRaw: contact.emails,\n firstName: contact.firstName,\n lastName: contact.lastName,\n uuid: contact.uuid,\n };\n }\n\n if (\n task.recurrenceRuleRaw !== null ||\n task.repeatTemplateSourceId !== null ||\n task.instanceCreationStartDate !== null ||\n task.instanceCreationPaused ||\n task.afterCompletionReferenceDate !== null ||\n task.nextInstanceStartDate !== null ||\n task.repeaterRaw !== null ||\n task.repeaterMigrationDate !== null\n ) {\n metadata.repeating = {\n afterCompletionReferenceDate: decodeThingsPackedDate(\n task.afterCompletionReferenceDate\n ),\n instanceCreationCount: task.instanceCreationCount,\n instanceCreationPaused: task.instanceCreationPaused,\n instanceCreationStartDate: decodeThingsPackedDate(\n task.instanceCreationStartDate\n ),\n nextInstanceStartDate: decodeThingsPackedDate(task.nextInstanceStartDate),\n recurrenceRuleRaw: task.recurrenceRuleRaw,\n repeaterMigrationDate: decodeThingsUnixSeconds(\n task.repeaterMigrationDate\n ),\n repeaterRaw: task.repeaterRaw,\n templateSourceId: task.repeatTemplateSourceId,\n };\n }\n\n if (\n task.deadlineOffset !== null ||\n task.raw.cachedTags !== null ||\n task.raw.experimental !== null\n ) {\n metadata.raw = {\n cachedTags: task.raw.cachedTags,\n deadlineOffset: task.deadlineOffset,\n experimental: task.raw.experimental,\n };\n }\n\n if (extraMetadata) {\n Object.assign(metadata, extraMetadata);\n }\n\n return Object.keys(metadata).length > 1 ? metadata : null;\n};\n\nconst buildProjectMetadata = (\n project: ThingsTaskRecord,\n directTagTitles: string[],\n teamName: string | null\n): Record<string, unknown> | null => {\n const metadata: Record<string, unknown> = {\n sourceUuid: project.uuid,\n };\n\n if (project.status === 2) {\n metadata.status = \"canceled\";\n }\n\n if (project.start !== null && project.start !== 1) {\n metadata.when = {\n start: project.start,\n startDate: decodeThingsPackedDate(project.startDate),\n };\n }\n\n if (teamName) {\n metadata.area = teamName;\n }\n\n if (directTagTitles.length > 0) {\n metadata.directTags = directTagTitles;\n }\n\n return Object.keys(metadata).length > 1 ? metadata : null;\n};\n\nconst buildAreaMetadata = (\n area: ThingsAreaRecord,\n directTagTitles: string[]\n): Record<string, unknown> | null => {\n const metadata: Record<string, unknown> = {\n sourceUuid: area.uuid,\n };\n\n if (area.visible === false) {\n metadata.visible = false;\n }\n\n if (directTagTitles.length > 0) {\n metadata.directTags = directTagTitles;\n }\n\n if (area.raw.cachedTags !== null || area.raw.experimental !== null) {\n metadata.raw = {\n cachedTags: area.raw.cachedTags,\n experimental: area.raw.experimental,\n };\n }\n\n return Object.keys(metadata).length > 1 ? metadata : null;\n};\n\nconst buildGroupMap = <T>(\n rows: T[],\n getKey: (row: T) => string | null\n): Map<string, T[]> => {\n const grouped = new Map<string, T[]>();\n\n for (const row of rows) {\n const key = getKey(row);\n if (!key) {\n continue;\n }\n\n const existing = grouped.get(key);\n if (existing) {\n existing.push(row);\n continue;\n }\n\n grouped.set(key, [row]);\n }\n\n return grouped;\n};\n\nconst decodeEmails = (value: string | null): string[] => {\n if (typeof value !== \"string\") {\n return [];\n }\n\n return value\n .split(EMAIL_SPLIT_PATTERN)\n .map((entry) => entry.trim())\n .filter((entry) => entry.length > 0);\n};\n\nconst buildTagTitleMap = (\n tags: readonly {\n uuid: string;\n title: string | null;\n parentId: string | null;\n }[]\n): Map<string, string> => {\n const tagById = new Map(tags.map((tag) => [tag.uuid, tag]));\n const titleById = new Map<string, string>();\n\n const resolveTitle = (tagId: string, trail: Set<string>): string => {\n const cached = titleById.get(tagId);\n if (cached) {\n return cached;\n }\n\n const tag = tagById.get(tagId);\n if (!tag) {\n return `Tag ${tagId.slice(0, 8)}`;\n }\n\n const title = normalizeTitle(tag.title, `Tag ${tag.uuid.slice(0, 8)}`);\n\n if (!tag.parentId || trail.has(tag.parentId)) {\n titleById.set(tagId, title);\n return title;\n }\n\n const nextTrail = new Set(trail);\n nextTrail.add(tagId);\n const parentTitle = resolveTitle(tag.parentId, nextTrail);\n const fullTitle = `${parentTitle} / ${title}`;\n\n titleById.set(tagId, fullTitle);\n return fullTitle;\n };\n\n for (const tag of tags) {\n resolveTitle(tag.uuid, new Set());\n }\n\n return titleById;\n};\n\nconst buildChecklistMutation = (options: {\n item: ThingsChecklistItemRecord;\n sourceId?: string;\n workspaceId: string;\n taskId: string;\n fallbackCreatedAt: number;\n}): PlannedModelMutation => {\n const sourceId = options.sourceId ?? options.item.uuid;\n const title = normalizeTitle(\n options.item.title,\n `Checklist item ${options.item.uuid.slice(0, 8)}`\n );\n const safeTitle =\n title.length > MAX_CHECKLIST_TITLE_LENGTH\n ? `${title.slice(0, MAX_CHECKLIST_TITLE_LENGTH - 3)}...`\n : title;\n\n return {\n modelId: createDeterministicImportId({\n modelName: \"TaskChecklistItem\",\n sourceId,\n workspaceId: options.workspaceId,\n }),\n modelName: \"TaskChecklistItem\",\n payload: {\n completedAt:\n options.item.status === 3\n ? (decodeThingsUnixSeconds(options.item.stopDate) ??\n decodeThingsUnixSeconds(options.item.userModificationDate) ??\n decodeThingsUnixSeconds(options.item.creationDate))\n : null,\n createdAt:\n decodeThingsUnixSeconds(options.item.creationDate) ??\n options.fallbackCreatedAt,\n sortOrder: sortValue(options.item.sortIndex, options.fallbackCreatedAt),\n taskId: options.taskId,\n title: safeTitle,\n updatedAt:\n decodeThingsUnixSeconds(options.item.userModificationDate) ??\n decodeThingsUnixSeconds(options.item.creationDate) ??\n options.fallbackCreatedAt,\n workspaceId: options.workspaceId,\n },\n sourceId,\n };\n};\n\ninterface ImportPlanContext {\n workspaceId: string;\n creatorId: string;\n metadataMode: ThingsMetadataMode;\n createdAtFallback: number;\n todayDateOnly: number;\n timeZone?: string | null;\n areaById: Map<string, ThingsAreaRecord>;\n contactById: Map<string, ThingsContactRecord>;\n tagTitleById: Map<string, string>;\n existingLabelIdByTitle: Map<string, string>;\n taskTagMap: Map<string, { taskId: string; tagId: string }[]>;\n areaTagMap: Map<string, { areaId: string; tagId: string }[]>;\n checklistByTaskId: Map<string, ThingsChecklistItemRecord[]>;\n teamKeys: Map<string, string>;\n projectKeyCandidates: Map<string, string>;\n areaTeamIdBySourceId: Map<string, string>;\n tagLabelIdBySourceId: Map<string, string>;\n projectIdBySourceId: Map<string, string>;\n headingIdBySourceId: Map<string, string>;\n taskIdBySourceId: Map<string, string>;\n}\n\nconst buildTeamActions = (\n ctx: ImportPlanContext,\n areas: ThingsAreaRecord[]\n): PlannedModelMutation[] => {\n const teams: PlannedModelMutation[] = [];\n\n for (const area of [...areas].toSorted((a, b) => {\n const indexComparison = compareNullableNumber(a.sortIndex, b.sortIndex);\n if (indexComparison !== 0) {\n return indexComparison;\n }\n return a.uuid.localeCompare(b.uuid);\n })) {\n const teamId = createDeterministicImportId({\n modelName: \"Team\",\n sourceId: area.uuid,\n workspaceId: ctx.workspaceId,\n });\n ctx.areaTeamIdBySourceId.set(area.uuid, teamId);\n\n const areaTagTitles = (ctx.areaTagMap.get(area.uuid) ?? [])\n .map((link) => ctx.tagTitleById.get(link.tagId) ?? null)\n .filter((title): title is string => typeof title === \"string\");\n\n teams.push({\n modelId: teamId,\n modelName: \"Team\",\n payload: {\n archivedAt: null,\n createdAt: ctx.createdAtFallback,\n description: appendMetadataBlock(\n null,\n ctx.metadataMode,\n buildAreaMetadata(area, areaTagTitles)\n ),\n icon: null,\n key: ctx.teamKeys.get(area.uuid) ?? \"AREA\",\n name: normalizeTitle(area.title, `Area ${area.uuid.slice(0, 8)}`),\n updatedAt: ctx.createdAtFallback,\n workspaceId: ctx.workspaceId,\n },\n sourceId: area.uuid,\n });\n }\n\n return teams;\n};\n\nconst buildLabelActions = (\n ctx: ImportPlanContext,\n tags: readonly {\n uuid: string;\n title: string | null;\n parentId: string | null;\n usedDate: number | null;\n sortIndex: number | null;\n }[]\n): PlannedModelMutation[] => {\n const labels: PlannedModelMutation[] = [];\n\n for (const tag of [...tags].toSorted((a, b) => {\n const indexComparison = compareNullableNumber(a.sortIndex, b.sortIndex);\n if (indexComparison !== 0) {\n return indexComparison;\n }\n return a.uuid.localeCompare(b.uuid);\n })) {\n const labelTitle =\n ctx.tagTitleById.get(tag.uuid) ??\n normalizeTitle(tag.title, `Tag ${tag.uuid.slice(0, 8)}`);\n const existingLabelId = ctx.existingLabelIdByTitle.get(\n normalizeThingsLabelLookupKey(labelTitle)\n );\n const labelId =\n existingLabelId ??\n createDeterministicImportId({\n modelName: \"Label\",\n sourceId: tag.uuid,\n workspaceId: ctx.workspaceId,\n });\n ctx.tagLabelIdBySourceId.set(tag.uuid, labelId);\n\n if (!existingLabelId) {\n labels.push({\n modelId: labelId,\n modelName: \"Label\",\n payload: {\n createdAt:\n decodeThingsUnixSeconds(tag.usedDate) ?? ctx.createdAtFallback,\n title: labelTitle,\n updatedAt:\n decodeThingsUnixSeconds(tag.usedDate) ?? ctx.createdAtFallback,\n workspaceId: ctx.workspaceId,\n },\n sourceId: tag.uuid,\n });\n }\n }\n\n return labels;\n};\n\nconst buildProjectActions = (\n ctx: ImportPlanContext,\n sourceProjects: ThingsTaskRecord[]\n): {\n projects: PlannedModelMutation[];\n teamProjects: PlannedModelMutation[];\n} => {\n const projects: PlannedModelMutation[] = [];\n const teamProjects: PlannedModelMutation[] = [];\n\n for (const project of [...sourceProjects].toSorted((a, b) => {\n const indexComparison = compareNullableNumber(a.sortIndex, b.sortIndex);\n if (indexComparison !== 0) {\n return indexComparison;\n }\n return a.uuid.localeCompare(b.uuid);\n })) {\n const projectId = createDeterministicImportId({\n modelName: \"Project\",\n sourceId: project.uuid,\n workspaceId: ctx.workspaceId,\n });\n ctx.projectIdBySourceId.set(project.uuid, projectId);\n\n const directTagTitles = (ctx.taskTagMap.get(project.uuid) ?? [])\n .map((link) => ctx.tagTitleById.get(link.tagId) ?? null)\n .filter((title): title is string => typeof title === \"string\");\n const teamName =\n project.areaId === null\n ? null\n : (ctx.areaById.get(project.areaId)?.title ?? null);\n\n projects.push({\n modelId: projectId,\n modelName: \"Project\",\n payload: {\n archivedAt: pickArchivedAt(project),\n color: null,\n completedAt: pickCompletedAt(project),\n createdAt:\n decodeThingsUnixSeconds(project.creationDate) ??\n ctx.createdAtFallback,\n creatorId: ctx.creatorId,\n description: appendMetadataBlock(\n project.notes,\n ctx.metadataMode,\n buildProjectMetadata(project, directTagTitles, teamName)\n ),\n icon: null,\n key: ctx.projectKeyCandidates.get(project.uuid) ?? \"PROJ\",\n name: normalizeTitle(\n project.title,\n `Project ${project.uuid.slice(0, 8)}`\n ),\n sortOrder: sortValue(project.sortIndex, projects.length),\n status: project.status === 3 ? \"completed\" : \"active\",\n targetDate: decodeThingsPackedDate(project.deadline),\n updatedAt:\n decodeThingsUnixSeconds(project.userModificationDate) ??\n decodeThingsUnixSeconds(project.creationDate) ??\n ctx.createdAtFallback,\n workspaceId: ctx.workspaceId,\n },\n sourceId: project.uuid,\n });\n\n if (project.areaId !== null) {\n const teamId = ctx.areaTeamIdBySourceId.get(project.areaId);\n if (teamId) {\n teamProjects.push({\n modelId: createTeamProjectId({\n projectId,\n teamId,\n workspaceId: ctx.workspaceId,\n }),\n modelName: \"TeamProject\",\n payload: {\n createdAt:\n decodeThingsUnixSeconds(project.creationDate) ??\n ctx.createdAtFallback,\n projectId,\n teamId,\n workspaceId: ctx.workspaceId,\n },\n sourceId: `${project.areaId}:${project.uuid}`,\n });\n }\n }\n }\n\n return { projects, teamProjects };\n};\n\nconst buildHeadingActions = (\n ctx: ImportPlanContext,\n sourceHeadings: ThingsTaskRecord[]\n): PlannedModelMutation[] => {\n const headings: PlannedModelMutation[] = [];\n\n for (const heading of [...sourceHeadings].toSorted((a, b) => {\n const projectComparison = compareNullableString(a.projectId, b.projectId);\n if (projectComparison !== 0) {\n return projectComparison;\n }\n const indexComparison = compareNullableNumber(a.sortIndex, b.sortIndex);\n if (indexComparison !== 0) {\n return indexComparison;\n }\n return a.uuid.localeCompare(b.uuid);\n })) {\n const parentProjectId =\n heading.projectId === null\n ? null\n : (ctx.projectIdBySourceId.get(heading.projectId) ?? null);\n if (!parentProjectId) {\n continue;\n }\n\n const headingId = createDeterministicImportId({\n modelName: \"ProjectHeading\",\n sourceId: heading.uuid,\n workspaceId: ctx.workspaceId,\n });\n ctx.headingIdBySourceId.set(heading.uuid, headingId);\n\n headings.push({\n modelId: headingId,\n modelName: \"ProjectHeading\",\n payload: {\n archivedAt: pickArchivedAt(heading),\n createdAt:\n decodeThingsUnixSeconds(heading.creationDate) ??\n ctx.createdAtFallback,\n projectId: parentProjectId,\n sortOrder: sortValue(heading.sortIndex, headings.length),\n title: normalizeTitle(\n heading.title,\n `Heading ${heading.uuid.slice(0, 8)}`\n ),\n updatedAt:\n decodeThingsUnixSeconds(heading.userModificationDate) ??\n decodeThingsUnixSeconds(heading.creationDate) ??\n ctx.createdAtFallback,\n workspaceId: ctx.workspaceId,\n },\n sourceId: heading.uuid,\n });\n }\n\n return headings;\n};\n\nconst collectEffectiveTagIds = (\n task: ThingsTaskRecord,\n taskTagMap: Map<string, { taskId: string; tagId: string }[]>,\n areaTagMap: Map<string, { areaId: string; tagId: string }[]>\n): Set<string> => {\n const effectiveTagIds = new Set<string>();\n\n for (const link of taskTagMap.get(task.uuid) ?? []) {\n effectiveTagIds.add(link.tagId);\n }\n\n if (task.areaId !== null) {\n for (const link of areaTagMap.get(task.areaId) ?? []) {\n effectiveTagIds.add(link.tagId);\n }\n }\n\n if (task.projectId !== null) {\n for (const link of taskTagMap.get(task.projectId) ?? []) {\n effectiveTagIds.add(link.tagId);\n }\n }\n\n if (task.headingId !== null) {\n for (const link of taskTagMap.get(task.headingId) ?? []) {\n effectiveTagIds.add(link.tagId);\n }\n }\n\n return effectiveTagIds;\n};\n\nconst buildChecklistOverflowMetadata = (\n task: ThingsTaskRecord,\n checklistByTaskId: Map<string, ThingsChecklistItemRecord[]>\n): Record<string, unknown> | null => {\n const overflowItems = (checklistByTaskId.get(task.uuid) ?? [])\n .map((item) => ({\n title: normalizeTitle(\n item.title,\n `Checklist item ${item.uuid.slice(0, 8)}`\n ),\n uuid: item.uuid,\n }))\n .filter((item) => item.title.length > MAX_CHECKLIST_TITLE_LENGTH);\n\n return overflowItems.length > 0\n ? {\n checklistOverflow: overflowItems,\n }\n : null;\n};\n\nconst appendTaskRelations = (\n ctx: ImportPlanContext,\n taskLabels: PlannedModelMutation[],\n checklistItems: PlannedModelMutation[],\n relationOptions: {\n task: ThingsTaskRecord;\n taskId: string;\n createdAt: number;\n sourcePrefix?: string;\n }\n): void => {\n const tagIds = collectEffectiveTagIds(\n relationOptions.task,\n ctx.taskTagMap,\n ctx.areaTagMap\n );\n\n for (const sourceTagId of tagIds) {\n const labelId = ctx.tagLabelIdBySourceId.get(sourceTagId);\n if (!labelId) {\n continue;\n }\n\n taskLabels.push({\n modelId: createTaskLabelId({\n labelId,\n taskId: relationOptions.taskId,\n workspaceId: ctx.workspaceId,\n }),\n modelName: \"TaskLabel\",\n payload: {\n createdAt: relationOptions.createdAt,\n labelId,\n taskId: relationOptions.taskId,\n workspaceId: ctx.workspaceId,\n },\n sourceId: relationOptions.sourcePrefix\n ? `${relationOptions.sourcePrefix}:${sourceTagId}`\n : `${relationOptions.task.uuid}:${sourceTagId}`,\n });\n }\n\n for (const item of [\n ...(ctx.checklistByTaskId.get(relationOptions.task.uuid) ?? []),\n ].toSorted((a, b) => {\n const indexComparison = compareNullableNumber(a.sortIndex, b.sortIndex);\n if (indexComparison !== 0) {\n return indexComparison;\n }\n return a.uuid.localeCompare(b.uuid);\n })) {\n checklistItems.push(\n buildChecklistMutation({\n fallbackCreatedAt: relationOptions.createdAt,\n item,\n sourceId: relationOptions.sourcePrefix\n ? `${relationOptions.sourcePrefix}:checklist:${item.uuid}`\n : undefined,\n taskId: relationOptions.taskId,\n workspaceId: ctx.workspaceId,\n })\n );\n }\n};\n\n// oxlint-ignore-next-line complexity -- Things 3 import maps many task fields and relationships\nconst pushTaskMutation = (\n ctx: ImportPlanContext,\n tasks: PlannedModelMutation[],\n taskLabels: PlannedModelMutation[],\n checklistItems: PlannedModelMutation[],\n mutationOptions: {\n task: ThingsTaskRecord;\n taskId: string;\n sourceId: string;\n taskFields?: ReturnType<typeof buildTaskFields>;\n repeat?: {\n repeatRule: string | null;\n repeatType: \"fixed\" | \"after_completion\" | null;\n repeatStatus: \"active\" | \"paused\" | null;\n repeatTemplateId: string | null;\n repeatInstanceDate: number | null;\n repeatNextAt: number | null;\n };\n }\n): number => {\n const contact =\n mutationOptions.task.contactId === null\n ? null\n : (ctx.contactById.get(mutationOptions.task.contactId) ?? null);\n const taskFields =\n mutationOptions.taskFields ?? buildTaskFields(mutationOptions.task);\n const createdAt =\n decodeThingsUnixSeconds(mutationOptions.task.creationDate) ??\n ctx.createdAtFallback;\n const updatedAt =\n decodeThingsUnixSeconds(mutationOptions.task.userModificationDate) ??\n decodeThingsUnixSeconds(mutationOptions.task.creationDate) ??\n ctx.createdAtFallback;\n const sortOrder = sortValue(\n mutationOptions.task.sortIndex,\n tasks.length * 1000\n );\n\n tasks.push({\n modelId: mutationOptions.taskId,\n modelName: \"Task\",\n payload: {\n archivedAt: pickArchivedAt(mutationOptions.task),\n assigneeId: null,\n completedAt: pickCompletedAt(mutationOptions.task),\n createdAt,\n creatorId: ctx.creatorId,\n deadlineAt: decodeThingsPackedDate(mutationOptions.task.deadline),\n deadlineSuppressionAt: decodeThingsPackedDate(\n mutationOptions.task.deadlineSuppressionDate\n ),\n description: appendMetadataBlock(\n mutationOptions.task.notes,\n ctx.metadataMode,\n buildTaskMetadata(\n mutationOptions.task,\n contact,\n buildChecklistOverflowMetadata(\n mutationOptions.task,\n ctx.checklistByTaskId\n )\n )\n ),\n headingId:\n mutationOptions.task.headingId === null\n ? null\n : (ctx.headingIdBySourceId.get(mutationOptions.task.headingId) ??\n null),\n lastReminderInteractionAt: decodeThingsUnixSeconds(\n mutationOptions.task.lastReminderInteractionDate\n ),\n projectId:\n mutationOptions.task.projectId === null\n ? null\n : (ctx.projectIdBySourceId.get(mutationOptions.task.projectId) ??\n null),\n projectSortOrder: sortOrder,\n reminderAt: buildReminderAt(mutationOptions.task, taskFields.startDate),\n repeatInstanceDate: mutationOptions.repeat?.repeatInstanceDate ?? null,\n repeatNextAt: mutationOptions.repeat?.repeatNextAt ?? null,\n repeatRule: mutationOptions.repeat?.repeatRule ?? null,\n repeatStatus: mutationOptions.repeat?.repeatStatus ?? null,\n repeatTemplateId: mutationOptions.repeat?.repeatTemplateId ?? null,\n repeatType: mutationOptions.repeat?.repeatType ?? null,\n sortOrder,\n start: taskFields.start,\n startBucket: taskFields.startBucket,\n startDate: taskFields.startDate,\n teamId:\n mutationOptions.task.areaId === null\n ? null\n : (ctx.areaTeamIdBySourceId.get(mutationOptions.task.areaId) ?? null),\n title: normalizeTitle(\n mutationOptions.task.title,\n `Task ${mutationOptions.task.uuid.slice(0, 8)}`\n ),\n todayIndexReferenceDate: taskFields.todayIndexReferenceDate,\n todaySortOrder: sortValue(mutationOptions.task.todayIndex, sortOrder),\n updatedAt,\n workspaceId: ctx.workspaceId,\n },\n sourceId: mutationOptions.sourceId,\n });\n\n appendTaskRelations(ctx, taskLabels, checklistItems, {\n createdAt,\n sourcePrefix:\n mutationOptions.sourceId === mutationOptions.task.uuid\n ? undefined\n : mutationOptions.sourceId,\n task: mutationOptions.task,\n taskId: mutationOptions.taskId,\n });\n\n return createdAt;\n};\n\nconst planRepeatTemplateTask = (\n ctx: ImportPlanContext,\n task: ThingsTaskRecord,\n taskId: string,\n openRepeatInstanceTemplateIds: Set<string>,\n tasks: PlannedModelMutation[],\n taskLabels: PlannedModelMutation[],\n checklistItems: PlannedModelMutation[]\n): void => {\n const repeatTemplate = resolveThingsRepeatTemplateFields(task, ctx.timeZone);\n\n if (!repeatTemplate) {\n pushTaskMutation(ctx, tasks, taskLabels, checklistItems, {\n sourceId: task.uuid,\n task,\n taskId,\n });\n return;\n }\n\n pushTaskMutation(ctx, tasks, taskLabels, checklistItems, {\n repeat: {\n repeatInstanceDate: null,\n repeatNextAt: repeatTemplate.repeatNextAt,\n repeatRule: repeatTemplate.repeatRule,\n repeatStatus: repeatTemplate.repeatStatus,\n repeatTemplateId: null,\n repeatType: repeatTemplate.repeatType,\n },\n sourceId: task.uuid,\n task,\n taskId,\n });\n\n if (\n pickCompletedAt(task) !== null ||\n pickArchivedAt(task) !== null ||\n openRepeatInstanceTemplateIds.has(task.uuid)\n ) {\n return;\n }\n\n const currentInstanceTaskId = createDeterministicImportId({\n modelName: \"Task\",\n sourceId: `${task.uuid}:current-instance`,\n workspaceId: ctx.workspaceId,\n });\n const { currentInstanceDate } = repeatTemplate;\n const currentTaskFields =\n currentInstanceDate === null\n ? buildTaskFields(task)\n : {\n start: \"started\",\n startBucket:\n currentInstanceDate <= ctx.todayDateOnly ? \"today\" : \"upcoming\",\n startDate: currentInstanceDate,\n todayIndexReferenceDate:\n currentInstanceDate <= ctx.todayDateOnly\n ? currentInstanceDate\n : null,\n };\n\n pushTaskMutation(ctx, tasks, taskLabels, checklistItems, {\n repeat: {\n repeatInstanceDate: currentInstanceDate,\n repeatNextAt: null,\n repeatRule: null,\n repeatStatus: null,\n repeatTemplateId: taskId,\n repeatType: null,\n },\n sourceId: `${task.uuid}:current-instance`,\n task,\n taskFields: currentTaskFields,\n taskId: currentInstanceTaskId,\n });\n};\n\nconst buildTaskActions = (\n ctx: ImportPlanContext,\n sourceTasks: ThingsTaskRecord[]\n): {\n tasks: PlannedModelMutation[];\n taskLabels: PlannedModelMutation[];\n checklistItems: PlannedModelMutation[];\n} => {\n const tasks: PlannedModelMutation[] = [];\n const taskLabels: PlannedModelMutation[] = [];\n const checklistItems: PlannedModelMutation[] = [];\n\n const sortedSourceTasks = [...sourceTasks].toSorted((a, b) => {\n const indexComparison = compareNullableNumber(a.sortIndex, b.sortIndex);\n if (indexComparison !== 0) {\n return indexComparison;\n }\n const todayComparison = compareNullableNumber(a.todayIndex, b.todayIndex);\n if (todayComparison !== 0) {\n return todayComparison;\n }\n return a.uuid.localeCompare(b.uuid);\n });\n\n const openRepeatInstanceTemplateIds = new Set(\n sourceTasks\n .filter(isThingsRepeatInstanceTask)\n .filter(\n (task) =>\n pickCompletedAt(task) === null && pickArchivedAt(task) === null\n )\n .map((task) => task.repeatTemplateSourceId)\n .filter((value): value is string => typeof value === \"string\")\n );\n\n for (const task of sortedSourceTasks) {\n ctx.taskIdBySourceId.set(\n task.uuid,\n createDeterministicImportId({\n modelName: \"Task\",\n sourceId: task.uuid,\n workspaceId: ctx.workspaceId,\n })\n );\n }\n\n const taskPlanningOrder = [\n ...sortedSourceTasks.filter(isThingsRepeatTemplateTask),\n ...sortedSourceTasks.filter((task) => !isThingsRepeatTemplateTask(task)),\n ];\n\n for (const task of taskPlanningOrder) {\n const taskId = ctx.taskIdBySourceId.get(task.uuid);\n\n if (!taskId) {\n continue;\n }\n\n if (isThingsRepeatTemplateTask(task)) {\n planRepeatTemplateTask(\n ctx,\n task,\n taskId,\n openRepeatInstanceTemplateIds,\n tasks,\n taskLabels,\n checklistItems\n );\n continue;\n }\n\n if (isThingsRepeatInstanceTask(task)) {\n const repeatTemplateId =\n task.repeatTemplateSourceId === null\n ? null\n : (ctx.taskIdBySourceId.get(task.repeatTemplateSourceId) ?? null);\n\n pushTaskMutation(ctx, tasks, taskLabels, checklistItems, {\n repeat: {\n repeatInstanceDate: resolveThingsRepeatInstanceDate(\n task,\n ctx.timeZone\n ),\n repeatNextAt: null,\n repeatRule: null,\n repeatStatus: null,\n repeatTemplateId,\n repeatType: null,\n },\n sourceId: task.uuid,\n task,\n taskId,\n });\n\n continue;\n }\n\n pushTaskMutation(ctx, tasks, taskLabels, checklistItems, {\n sourceId: task.uuid,\n task,\n taskId,\n });\n }\n\n return { checklistItems, taskLabels, tasks };\n};\n\nexport const buildThingsImportPlan = (\n options: BuildThingsImportPlanOptions\n): ThingsImportPlan => {\n const { snapshot, workspaceId, existingLabelsByTitle } = options;\n\n const ctx: ImportPlanContext = {\n areaById: new Map(snapshot.areas.map((area) => [area.uuid, area])),\n areaTagMap: buildGroupMap(snapshot.areaTags, (row) => row.areaId),\n areaTeamIdBySourceId: new Map<string, string>(),\n checklistByTaskId: buildGroupMap(\n snapshot.checklistItems,\n (row) => row.taskId\n ),\n contactById: new Map(\n snapshot.contacts.map((contact) => [contact.uuid, contact])\n ),\n createdAtFallback: Date.now(),\n creatorId: options.creatorId,\n existingLabelIdByTitle: existingLabelsByTitle ?? new Map<string, string>(),\n headingIdBySourceId: new Map<string, string>(),\n metadataMode: options.metadataMode,\n projectIdBySourceId: new Map<string, string>(),\n projectKeyCandidates: buildUniqueKeys(\n snapshot.tasks.filter((task) => classifyTaskKind(task) === \"project\"),\n {\n fallback: \"PROJ\",\n maxLength: 12,\n }\n ),\n tagLabelIdBySourceId: new Map<string, string>(),\n tagTitleById: buildTagTitleMap(snapshot.tags),\n taskIdBySourceId: new Map<string, string>(),\n taskTagMap: buildGroupMap(snapshot.taskTags, (row) => row.taskId),\n teamKeys: options.skipTeams\n ? new Map<string, string>()\n : buildUniqueKeys(snapshot.areas, {\n fallback: \"AREA\",\n maxLength: 24,\n }),\n timeZone: options.timeZone,\n todayDateOnly: dateOnlyEpochFromLocalDate(),\n workspaceId,\n };\n\n const teams = options.skipTeams ? [] : buildTeamActions(ctx, snapshot.areas);\n const labels = buildLabelActions(ctx, snapshot.tags);\n\n const sourceProjects = snapshot.tasks.filter(\n (task) => classifyTaskKind(task) === \"project\"\n );\n const sourceHeadings = snapshot.tasks.filter(\n (task) => classifyTaskKind(task) === \"heading\"\n );\n const sourceTasks = snapshot.tasks.filter(\n (task) => classifyTaskKind(task) === \"task\"\n );\n\n const { projects, teamProjects } = buildProjectActions(ctx, sourceProjects);\n const headings = buildHeadingActions(ctx, sourceHeadings);\n const { tasks, taskLabels, checklistItems } = buildTaskActions(\n ctx,\n sourceTasks\n );\n\n const phases = [\n { items: teams, name: \"teams\" },\n { items: labels, name: \"labels\" },\n { items: projects, name: \"projects\" },\n { items: teamProjects, name: \"teamProjects\" },\n { items: headings, name: \"headings\" },\n { items: tasks, name: \"tasks\" },\n { items: taskLabels, name: \"taskLabels\" },\n { items: checklistItems, name: \"checklistItems\" },\n ];\n\n return {\n counts: {\n planned: Object.fromEntries(\n phases.map((phase) => [phase.name, phase.items.length])\n ),\n source: {\n areaTagLinks: snapshot.areaTags.length,\n areas: snapshot.areas.length,\n checklistItems: snapshot.checklistItems.length,\n headings: sourceHeadings.length,\n projects: sourceProjects.length,\n tags: snapshot.tags.length,\n taskTagLinks: snapshot.taskTags.length,\n tasks: sourceTasks.length,\n },\n },\n databasePath: snapshot.databasePath,\n phases,\n taskColumns: snapshot.taskColumns,\n };\n};\n","import {\n accessSync,\n constants as fsConstants,\n readdirSync,\n statSync,\n} from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { basename, join, resolve } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nimport Database from \"better-sqlite3\";\n\nconst THINGS_CONTAINER_PATH = join(\n homedir(),\n \"Library/Group Containers/JLMPQHK86H.com.culturedcode.ThingsMac\"\n);\nconst THINGS_BUNDLE_NAME = \"Things Database.thingsdatabase\";\nconst THINGS_SQLITE_FILE = \"main.sqlite\";\nconst LEGACY_THINGS_SQLITE_FILE = \"Things.sqlite3\";\n\ntype SqlitePrimitive = Buffer | number | string | null;\ntype SqliteRow = Record<string, SqlitePrimitive>;\n\nexport interface ThingsTaskRecord {\n raw: SqliteRow;\n uuid: string;\n title: string | null;\n notes: string | null;\n status: number | null;\n stopDate: number | null;\n trashed: boolean;\n type: number | null;\n start: number | null;\n startDate: number | null;\n startBucket: number | null;\n reminderTime: number | null;\n lastReminderInteractionDate: number | null;\n deadline: number | null;\n deadlineSuppressionDate: number | null;\n deadlineOffset: number | null;\n sortIndex: number | null;\n todayIndex: number | null;\n todayIndexReferenceDate: number | null;\n areaId: string | null;\n projectId: string | null;\n headingId: string | null;\n contactId: string | null;\n creationDate: number | null;\n userModificationDate: number | null;\n repeatTemplateSourceId: string | null;\n recurrenceRuleRaw: string | null;\n instanceCreationStartDate: number | null;\n instanceCreationPaused: boolean;\n instanceCreationCount: number | null;\n afterCompletionReferenceDate: number | null;\n nextInstanceStartDate: number | null;\n repeaterRaw: string | null;\n repeaterMigrationDate: number | null;\n}\n\nexport interface ThingsAreaRecord {\n raw: SqliteRow;\n uuid: string;\n title: string | null;\n visible: boolean | null;\n sortIndex: number | null;\n}\n\nexport interface ThingsTagRecord {\n raw: SqliteRow;\n uuid: string;\n title: string | null;\n shortcut: string | null;\n parentId: string | null;\n usedDate: number | null;\n sortIndex: number | null;\n}\n\nexport interface ThingsChecklistItemRecord {\n raw: SqliteRow;\n uuid: string;\n taskId: string | null;\n title: string | null;\n status: number | null;\n stopDate: number | null;\n creationDate: number | null;\n userModificationDate: number | null;\n sortIndex: number | null;\n}\n\nexport interface ThingsTaskTagRecord {\n taskId: string;\n tagId: string;\n}\n\nexport interface ThingsAreaTagRecord {\n areaId: string;\n tagId: string;\n}\n\nexport interface ThingsContactRecord {\n raw: SqliteRow;\n uuid: string;\n displayName: string | null;\n firstName: string | null;\n lastName: string | null;\n emails: string | null;\n appleAddressBookId: string | null;\n}\n\nexport interface ThingsDatabaseSnapshot {\n databasePath: string;\n taskColumns: string[];\n tasks: ThingsTaskRecord[];\n areas: ThingsAreaRecord[];\n tags: ThingsTagRecord[];\n checklistItems: ThingsChecklistItemRecord[];\n taskTags: ThingsTaskTagRecord[];\n areaTags: ThingsAreaTagRecord[];\n contacts: ThingsContactRecord[];\n}\n\nconst URL_SCHEME_PATTERN = /^[a-z][a-z0-9+.-]*:/iu;\n\nconst isUrlLike = (value: string): boolean => URL_SCHEME_PATTERN.test(value);\n\nconst resolveInputPath = (databaseUrl: string): string => {\n if (!isUrlLike(databaseUrl)) {\n return resolve(databaseUrl);\n }\n\n const parsed = new URL(databaseUrl);\n\n if (parsed.protocol === \"file:\") {\n return fileURLToPath(parsed);\n }\n\n if (parsed.protocol === \"sqlite:\") {\n return resolve(decodeURIComponent(parsed.pathname));\n }\n\n throw new Error(\n `Unsupported Things database URL scheme \"${parsed.protocol}\". Use a file path, file:// URL, or sqlite:// URL.`\n );\n};\n\nconst expandThingsDatabasePath = (inputPath: string): string => {\n const resolvedPath = resolve(inputPath);\n const lastSegment = basename(resolvedPath);\n\n if (\n lastSegment === THINGS_SQLITE_FILE ||\n lastSegment === LEGACY_THINGS_SQLITE_FILE\n ) {\n return resolvedPath;\n }\n\n if (lastSegment === THINGS_BUNDLE_NAME) {\n return join(resolvedPath, THINGS_SQLITE_FILE);\n }\n\n if (lastSegment.startsWith(\"ThingsData-\")) {\n return join(resolvedPath, THINGS_BUNDLE_NAME, THINGS_SQLITE_FILE);\n }\n\n return resolvedPath;\n};\n\nconst isReadableFile = (path: string): boolean => {\n try {\n accessSync(path, fsConstants.R_OK);\n return statSync(path).isFile();\n } catch {\n return false;\n }\n};\n\nconst findLatestThingsDatabasePath = (): string | null => {\n const candidates: { path: string; mtimeMs: number }[] = [];\n\n for (const name of [\n join(THINGS_CONTAINER_PATH, THINGS_BUNDLE_NAME, THINGS_SQLITE_FILE),\n join(THINGS_CONTAINER_PATH, LEGACY_THINGS_SQLITE_FILE),\n ]) {\n if (isReadableFile(name)) {\n candidates.push({ mtimeMs: statSync(name).mtimeMs, path: name });\n }\n }\n\n try {\n const entries = readdirSync(THINGS_CONTAINER_PATH, { withFileTypes: true });\n\n for (const entry of entries) {\n if (!(entry.isDirectory() && entry.name.startsWith(\"ThingsData-\"))) {\n continue;\n }\n\n const candidate = join(\n THINGS_CONTAINER_PATH,\n entry.name,\n THINGS_BUNDLE_NAME,\n THINGS_SQLITE_FILE\n );\n\n if (!isReadableFile(candidate)) {\n continue;\n }\n\n candidates.push({\n mtimeMs: statSync(candidate).mtimeMs,\n path: candidate,\n });\n }\n } catch {\n return null;\n }\n\n if (candidates.length === 0) {\n return null;\n }\n\n candidates.sort((left, right) => right.mtimeMs - left.mtimeMs);\n return candidates[0]?.path ?? null;\n};\n\nconst readRows = (\n database: Database.Database,\n tableName: string\n): SqliteRow[] =>\n database.prepare(`SELECT * FROM ${tableName}`).all() as SqliteRow[];\n\nconst hasTable = (database: Database.Database, tableName: string): boolean => {\n const row = database\n .prepare(\n \"SELECT name FROM sqlite_master WHERE type = 'table' AND name = ? LIMIT 1\"\n )\n .get(tableName) as { name?: string } | undefined;\n\n return row?.name === tableName;\n};\n\nconst getTableColumns = (\n database: Database.Database,\n tableName: string\n): string[] => {\n if (!hasTable(database, tableName)) {\n return [];\n }\n\n const rows = database.prepare(`PRAGMA table_info(${tableName})`).all() as {\n name?: string;\n }[];\n\n return rows\n .map((row) => (typeof row.name === \"string\" ? row.name : null))\n .filter((name): name is string => name !== null);\n};\n\nconst toStringValue = (value: SqlitePrimitive | undefined): string | null => {\n if (typeof value === \"string\") {\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : null;\n }\n\n if (Buffer.isBuffer(value)) {\n const text = value.toString(\"utf-8\").trim();\n return text.length > 0 ? text : null;\n }\n\n return null;\n};\n\nconst toNumberValue = (value: SqlitePrimitive | undefined): number | null =>\n typeof value === \"number\" && Number.isFinite(value) ? value : null;\n\nconst toBooleanValue = (value: SqlitePrimitive | undefined): boolean | null => {\n const numeric = toNumberValue(value);\n return numeric === null ? null : numeric !== 0;\n};\n\nconst normalizeTaskRecord = (row: SqliteRow): ThingsTaskRecord | null => {\n const uuid = toStringValue(row.uuid);\n\n if (!uuid) {\n return null;\n }\n\n return {\n afterCompletionReferenceDate: toNumberValue(\n row.rt1_afterCompletionReferenceDate ?? row.afterCompletionReferenceDate\n ),\n areaId: toStringValue(row.area),\n contactId: toStringValue(row.contact ?? row.delegate),\n creationDate: toNumberValue(row.creationDate),\n deadline: toNumberValue(row.deadline ?? row.dueDate),\n deadlineOffset: toNumberValue(row.t2_deadlineOffset ?? row.dueDateOffset),\n deadlineSuppressionDate: toNumberValue(\n row.deadlineSuppressionDate ?? row.dueDateSuppressionDate\n ),\n headingId: toStringValue(row.heading ?? row.actionGroup),\n instanceCreationCount: toNumberValue(\n row.rt1_instanceCreationCount ?? row.instanceCreationCount\n ),\n instanceCreationPaused:\n toBooleanValue(\n row.rt1_instanceCreationPaused ?? row.instanceCreationPaused\n ) ?? false,\n instanceCreationStartDate: toNumberValue(\n row.rt1_instanceCreationStartDate ?? row.instanceCreationStartDate\n ),\n lastReminderInteractionDate: toNumberValue(\n row.lastReminderInteractionDate ?? row.lastAlarmInteractionDate\n ),\n nextInstanceStartDate: toNumberValue(\n row.rt1_nextInstanceStartDate ?? row.nextInstanceStartDate\n ),\n notes: toStringValue(row.notes),\n projectId: toStringValue(row.project),\n raw: row,\n recurrenceRuleRaw: toStringValue(\n row.rt1_recurrenceRule ?? row.recurrenceRule\n ),\n reminderTime: toNumberValue(row.reminderTime),\n repeatTemplateSourceId: toStringValue(\n row.rt1_repeatingTemplate ?? row.repeatingTemplate\n ),\n repeaterMigrationDate: toNumberValue(row.repeaterMigrationDate),\n repeaterRaw: toStringValue(row.repeater),\n sortIndex: toNumberValue(row.index),\n start: toNumberValue(row.start),\n startBucket: toNumberValue(row.startBucket),\n startDate: toNumberValue(row.startDate),\n status: toNumberValue(row.status),\n stopDate: toNumberValue(row.stopDate),\n title: toStringValue(row.title),\n todayIndex: toNumberValue(row.todayIndex),\n todayIndexReferenceDate: toNumberValue(row.todayIndexReferenceDate),\n trashed: toBooleanValue(row.trashed) ?? false,\n type: toNumberValue(row.type),\n userModificationDate: toNumberValue(row.userModificationDate),\n uuid,\n };\n};\n\nconst normalizeAreaRecord = (row: SqliteRow): ThingsAreaRecord | null => {\n const uuid = toStringValue(row.uuid);\n\n if (!uuid) {\n return null;\n }\n\n return {\n raw: row,\n sortIndex: toNumberValue(row.index),\n title: toStringValue(row.title),\n uuid,\n visible: toBooleanValue(row.visible),\n };\n};\n\nconst normalizeTagRecord = (row: SqliteRow): ThingsTagRecord | null => {\n const uuid = toStringValue(row.uuid);\n\n if (!uuid) {\n return null;\n }\n\n return {\n parentId: toStringValue(row.parent),\n raw: row,\n shortcut: toStringValue(row.shortcut),\n sortIndex: toNumberValue(row.index),\n title: toStringValue(row.title),\n usedDate: toNumberValue(row.usedDate),\n uuid,\n };\n};\n\nconst normalizeChecklistItemRecord = (\n row: SqliteRow\n): ThingsChecklistItemRecord | null => {\n const uuid = toStringValue(row.uuid);\n\n if (!uuid) {\n return null;\n }\n\n return {\n creationDate: toNumberValue(row.creationDate),\n raw: row,\n sortIndex: toNumberValue(row.index),\n status: toNumberValue(row.status),\n stopDate: toNumberValue(row.stopDate),\n taskId: toStringValue(row.task),\n title: toStringValue(row.title),\n userModificationDate: toNumberValue(row.userModificationDate),\n uuid,\n };\n};\n\nconst normalizeTaskTagRecord = (row: SqliteRow): ThingsTaskTagRecord | null => {\n const taskId = toStringValue(row.tasks);\n const tagId = toStringValue(row.tags);\n return taskId && tagId ? { tagId, taskId } : null;\n};\n\nconst normalizeAreaTagRecord = (row: SqliteRow): ThingsAreaTagRecord | null => {\n const areaId = toStringValue(row.areas);\n const tagId = toStringValue(row.tags);\n return areaId && tagId ? { areaId, tagId } : null;\n};\n\nconst normalizeContactRecord = (row: SqliteRow): ThingsContactRecord | null => {\n const uuid = toStringValue(row.uuid);\n\n if (!uuid) {\n return null;\n }\n\n return {\n appleAddressBookId: toStringValue(row.appleAddressBookId),\n displayName: toStringValue(row.displayName),\n emails: toStringValue(row.emails),\n firstName: toStringValue(row.firstName),\n lastName: toStringValue(row.lastName),\n raw: row,\n uuid,\n };\n};\n\nexport const resolveThingsDatabasePath = (databaseUrl: string): string =>\n expandThingsDatabasePath(resolveInputPath(databaseUrl));\n\nexport const resolveDefaultThingsDatabasePath = (): string => {\n const resolved = findLatestThingsDatabasePath();\n\n if (!resolved) {\n throw new Error(\n `Could not find a Things database under ${THINGS_CONTAINER_PATH}. Pass --database-url with a main.sqlite path, a .thingsdatabase bundle, or a ThingsData-* directory.`\n );\n }\n\n return resolved;\n};\n\nexport const loadThingsDatabase = (\n databaseUrl?: string | null\n): ThingsDatabaseSnapshot => {\n const databasePath = databaseUrl\n ? resolveThingsDatabasePath(databaseUrl)\n : resolveDefaultThingsDatabasePath();\n\n if (!isReadableFile(databasePath)) {\n throw new Error(`Things database file not found: ${databasePath}`);\n }\n\n const database = new Database(databasePath, {\n fileMustExist: true,\n readonly: true,\n });\n\n try {\n return {\n areaTags: hasTable(database, \"TMAreaTag\")\n ? readRows(database, \"TMAreaTag\")\n .map(normalizeAreaTagRecord)\n .filter((record): record is ThingsAreaTagRecord => record !== null)\n : [],\n areas: hasTable(database, \"TMArea\")\n ? readRows(database, \"TMArea\")\n .map(normalizeAreaRecord)\n .filter((record): record is ThingsAreaRecord => record !== null)\n : [],\n checklistItems: hasTable(database, \"TMChecklistItem\")\n ? readRows(database, \"TMChecklistItem\")\n .map(normalizeChecklistItemRecord)\n .filter(\n (record): record is ThingsChecklistItemRecord => record !== null\n )\n : [],\n contacts: hasTable(database, \"TMContact\")\n ? readRows(database, \"TMContact\")\n .map(normalizeContactRecord)\n .filter((record): record is ThingsContactRecord => record !== null)\n : [],\n databasePath,\n tags: hasTable(database, \"TMTag\")\n ? readRows(database, \"TMTag\")\n .map(normalizeTagRecord)\n .filter((record): record is ThingsTagRecord => record !== null)\n : [],\n taskColumns: getTableColumns(database, \"TMTask\"),\n taskTags: hasTable(database, \"TMTaskTag\")\n ? readRows(database, \"TMTaskTag\")\n .map(normalizeTaskTagRecord)\n .filter((record): record is ThingsTaskTagRecord => record !== null)\n : [],\n tasks: readRows(database, \"TMTask\")\n .map(normalizeTaskRecord)\n .filter((record): record is ThingsTaskRecord => record !== null),\n };\n } finally {\n database.close();\n }\n};\n","import { randomUUID } from \"node:crypto\";\n\nimport { requestNdjson } from \"../api/http\";\nimport { mutateModel } from \"../manage-api\";\nimport type { CliContext, WorkspaceSummary } from \"../types\";\nimport { normalizeThingsLabelLookupKey } from \"./things-labels\";\nimport { buildThingsImportPlan } from \"./things-mapper\";\nimport type { ImportModelName, ThingsMetadataMode } from \"./things-mapper\";\nimport { loadThingsDatabase } from \"./things-sqlite\";\nimport { resolveLocalTimeZone } from \"./time-zone\";\n\ninterface CommandContextLike {\n apiBaseUrl: string;\n token: string;\n localContext: {\n clientId: string;\n };\n}\n\ninterface RunThingsImportOptions {\n context: CliContext;\n commandContext: CommandContextLike;\n workspace: WorkspaceSummary;\n creatorId: string;\n databaseUrl?: string;\n metadataMode: ThingsMetadataMode;\n batchSize: number;\n dryRun: boolean;\n skipTeams: boolean;\n}\n\ntype SyncAction = \"INSERT\" | \"UPDATE\";\n\ninterface ImportTransaction {\n clientTxId: string;\n clientId: string;\n modelName: ImportModelName;\n modelId: string;\n action: SyncAction;\n payload: Record<string, unknown>;\n}\n\ninterface ImportExecutionSummary {\n inserted: number;\n updated: number;\n skipped: number;\n batches: number;\n}\n\ninterface PreparedTransactions {\n transactions: ImportTransaction[];\n inserted: number;\n updated: number;\n skipped: number;\n}\n\ninterface ExistingImportState {\n rowsByModel: Map<ImportModelName, unknown[]>;\n existingLabelIdsByTitle: Map<string, string>;\n}\n\nexport interface ThingsImportResult {\n workspace: WorkspaceSummary;\n databasePath: string;\n taskColumns: string[];\n counts: {\n source: Record<string, number>;\n planned: Record<string, number>;\n };\n execution: ImportExecutionSummary;\n dryRun: boolean;\n}\n\nconst WORKSPACE_SCOPED_MODELS: ImportModelName[] = [\n \"Team\",\n \"Label\",\n \"Project\",\n \"TeamProject\",\n \"ProjectHeading\",\n \"Task\",\n \"TaskLabel\",\n \"TaskChecklistItem\",\n];\n\nconst INSERT_ONLY_MODELS = new Set<ImportModelName>([\n \"TaskLabel\",\n \"TeamProject\",\n]);\n\nconst chunk = <T>(items: T[], size: number): T[][] => {\n const result: T[][] = [];\n\n for (let index = 0; index < items.length; index += size) {\n result.push(items.slice(index, index + size));\n }\n\n return result;\n};\n\nconst collectRowIds = (\n rows: unknown[],\n modelName: ImportModelName\n): Set<string> => {\n const ids = new Set<string>();\n\n for (const row of rows) {\n if (typeof row !== \"object\" || row === null) {\n continue;\n }\n\n const record = row as Record<string, unknown>;\n if (record.__class !== modelName || typeof record.id !== \"string\") {\n continue;\n }\n\n ids.add(record.id);\n }\n\n return ids;\n};\n\nconst createWorkspaceScopedRowMap = (\n modelNames: readonly ImportModelName[]\n): Map<ImportModelName, unknown[]> =>\n new Map(\n modelNames.map((modelName): [ImportModelName, unknown[]] => [modelName, []])\n );\n\nexport const collectWorkspaceScopedRowsByModel = (\n rows: unknown[],\n options: {\n workspaceId: string;\n modelNames: readonly ImportModelName[];\n }\n): Map<ImportModelName, unknown[]> => {\n const modelNames = new Set<string>(options.modelNames);\n const rowsByModel = createWorkspaceScopedRowMap(options.modelNames);\n\n for (const row of rows) {\n if (typeof row !== \"object\" || row === null) {\n continue;\n }\n\n const record = row as Record<string, unknown>;\n if (record.workspaceId !== options.workspaceId) {\n continue;\n }\n\n const modelName = record.__class;\n if (typeof modelName !== \"string\" || !modelNames.has(modelName)) {\n continue;\n }\n\n rowsByModel.get(modelName as ImportModelName)?.push(row);\n }\n\n return rowsByModel;\n};\n\nconst loadWorkspaceScopedRowsByModel = async (\n context: CliContext,\n options: {\n apiBaseUrl: string;\n token: string;\n workspaceId: string;\n modelNames: readonly ImportModelName[];\n }\n): Promise<Map<ImportModelName, unknown[]>> => {\n const query = new URLSearchParams({\n onlyModels: options.modelNames.join(\",\"),\n schemaHash: \"\",\n syncGroups: options.workspaceId,\n });\n\n const rows = await requestNdjson(\n context,\n `${options.apiBaseUrl}/sync/bootstrap?${query.toString()}`,\n {\n method: \"GET\",\n token: options.token,\n }\n );\n\n return collectWorkspaceScopedRowsByModel(rows, {\n modelNames: options.modelNames,\n workspaceId: options.workspaceId,\n });\n};\n\nconst loadExistingImportState = async (\n options: RunThingsImportOptions\n): Promise<ExistingImportState> => {\n let modelNames: readonly ImportModelName[];\n if (options.dryRun) {\n modelNames = [\"Label\"];\n } else if (options.skipTeams) {\n modelNames = WORKSPACE_SCOPED_MODELS.filter(\n (m) => m !== \"Team\" && m !== \"TeamProject\"\n );\n } else {\n modelNames = WORKSPACE_SCOPED_MODELS;\n }\n const rowsByModel = await loadWorkspaceScopedRowsByModel(options.context, {\n apiBaseUrl: options.commandContext.apiBaseUrl,\n modelNames,\n token: options.commandContext.token,\n workspaceId: options.workspace.id,\n });\n\n return {\n existingLabelIdsByTitle: buildExistingLabelIdsByTitle(rowsByModel),\n rowsByModel,\n };\n};\n\nconst buildExistingLabelIdsByTitle = (\n rowsByModel: Map<ImportModelName, unknown[]>\n): Map<string, string> => {\n const rows = rowsByModel.get(\"Label\") ?? [];\n const labelsByTitle = new Map<string, string>();\n\n for (const row of rows) {\n if (typeof row !== \"object\" || row === null) {\n continue;\n }\n\n const record = row as Record<string, unknown>;\n if (record.__class !== \"Label\") {\n continue;\n }\n\n const id = typeof record.id === \"string\" ? record.id : null;\n const title = typeof record.title === \"string\" ? record.title.trim() : \"\";\n\n if (!id || title.length === 0) {\n continue;\n }\n\n labelsByTitle.set(normalizeThingsLabelLookupKey(title), id);\n }\n\n return labelsByTitle;\n};\n\nconst buildExistingIds = (\n rowsByModel: Map<ImportModelName, unknown[]>\n): Map<ImportModelName, Set<string>> => {\n const entries = WORKSPACE_SCOPED_MODELS.map(\n (modelName): readonly [ImportModelName, Set<string>] => [\n modelName,\n collectRowIds(rowsByModel.get(modelName) ?? [], modelName),\n ]\n );\n\n return new Map(entries);\n};\n\nconst buildTransactions = (\n phaseItems: ReturnType<\n typeof buildThingsImportPlan\n >[\"phases\"][number][\"items\"],\n options: {\n existingIds: Map<ImportModelName, Set<string>>;\n clientId: string;\n }\n): PreparedTransactions => {\n const transactions: ImportTransaction[] = [];\n let inserted = 0;\n let updated = 0;\n let skipped = 0;\n\n for (const item of phaseItems) {\n const existingIds = options.existingIds.get(item.modelName) ?? new Set();\n const exists = existingIds.has(item.modelId);\n\n if (exists && INSERT_ONLY_MODELS.has(item.modelName)) {\n skipped += 1;\n continue;\n }\n\n const action: SyncAction = exists ? \"UPDATE\" : \"INSERT\";\n\n if (action === \"INSERT\") {\n inserted += 1;\n existingIds.add(item.modelId);\n } else {\n updated += 1;\n }\n\n transactions.push({\n action,\n clientId: options.clientId,\n clientTxId: randomUUID(),\n modelId: item.modelId,\n modelName: item.modelName,\n payload: item.payload,\n });\n }\n\n return { inserted, skipped, transactions, updated };\n};\n\nconst executeImportPlan = async (\n options: RunThingsImportOptions,\n plan: ReturnType<typeof buildThingsImportPlan>,\n rowsByModel: Map<ImportModelName, unknown[]>\n): Promise<ImportExecutionSummary> => {\n const execution: ImportExecutionSummary = {\n batches: 0,\n inserted: 0,\n skipped: 0,\n updated: 0,\n };\n const existingIds = buildExistingIds(rowsByModel);\n\n for (const phase of plan.phases) {\n const prepared = buildTransactions(phase.items, {\n clientId: options.commandContext.localContext.clientId,\n existingIds,\n });\n\n execution.inserted += prepared.inserted;\n execution.updated += prepared.updated;\n execution.skipped += prepared.skipped;\n\n const transactionBatches = chunk(prepared.transactions, options.batchSize);\n\n for (const transactionBatch of transactionBatches) {\n if (transactionBatch.length === 0) {\n continue;\n }\n\n await mutateModel(options.context, {\n baseUrl: options.commandContext.apiBaseUrl,\n request: {\n batchId: randomUUID(),\n transactions: transactionBatch,\n },\n token: options.commandContext.token,\n });\n\n execution.batches += 1;\n }\n }\n\n return execution;\n};\n\nexport const runThingsImport = async (\n options: RunThingsImportOptions\n): Promise<ThingsImportResult> => {\n const snapshot = loadThingsDatabase(options.databaseUrl);\n const existingState = await loadExistingImportState(options);\n const plan = buildThingsImportPlan({\n creatorId: options.creatorId,\n existingLabelsByTitle: existingState.existingLabelIdsByTitle,\n metadataMode: options.metadataMode,\n skipTeams: options.skipTeams,\n snapshot,\n timeZone: resolveLocalTimeZone(),\n workspaceId: options.workspace.id,\n });\n\n if (options.dryRun) {\n return {\n counts: plan.counts,\n databasePath: plan.databasePath,\n dryRun: true,\n execution: {\n batches: 0,\n inserted: 0,\n skipped: 0,\n updated: 0,\n },\n taskColumns: plan.taskColumns,\n workspace: options.workspace,\n };\n }\n const execution = await executeImportPlan(\n options,\n plan,\n existingState.rowsByModel\n );\n\n return {\n counts: plan.counts,\n databasePath: plan.databasePath,\n dryRun: false,\n execution,\n taskColumns: plan.taskColumns,\n workspace: options.workspace,\n };\n};\n","import type { Command } from \"commander\";\n\nimport { requireUserId, resolveCommandContext } from \"../command-context\";\nimport { normalizeWorkspaceRef } from \"../command-helpers\";\nimport { parsePositiveInteger } from \"../command-parsers\";\nimport type { ThingsMetadataMode } from \"../import/things-mapper\";\nimport { summarizeThingsImportResult } from \"../import/things-output\";\nimport { runThingsImport } from \"../import/things-runner\";\nimport { writeInfo, writeOutput, writeSuccess } from \"../output\";\nimport { contextFromCommand, runWithErrorHandling } from \"../runtime\";\nimport { resolveWorkspace } from \"../workspace-context\";\n\ninterface ThingsImportOptions {\n databaseUrl?: string;\n workspace?: string;\n skipTeams: boolean;\n metadataMode: string;\n batchSize: number;\n}\n\nconst parseMetadataMode = (value: string): ThingsMetadataMode => {\n const normalized = value.trim().toLowerCase();\n\n if (normalized === \"note\" || normalized === \"none\") {\n return normalized;\n }\n\n throw new Error(\n `Invalid metadata mode \"${value}\". Expected one of: note, none.`\n );\n};\n\nconst runThingsImportCommand = async (\n context: ReturnType<typeof contextFromCommand>,\n options: ThingsImportOptions,\n workspaceOverride: string | null\n): Promise<void> => {\n const commandContext = await resolveCommandContext(context);\n const creatorId = await requireUserId(context, commandContext);\n const metadataMode = parseMetadataMode(options.metadataMode);\n const { workspace, autoSelected } = await resolveWorkspace(context, {\n apiBaseUrl: commandContext.apiBaseUrl,\n storedWorkspaceId: commandContext.localContext.workspaceId,\n token: commandContext.token,\n workspaceRef: workspaceOverride ?? normalizeWorkspaceRef(options.workspace),\n });\n const result = await runThingsImport({\n batchSize: options.batchSize,\n commandContext,\n context,\n creatorId,\n databaseUrl: options.databaseUrl,\n dryRun: context.dryRun,\n metadataMode,\n skipTeams: options.skipTeams,\n workspace,\n });\n\n if (context.json) {\n writeOutput(context, result);\n return;\n }\n\n if (autoSelected) {\n writeInfo(context, `Auto-selected workspace: ${workspace.name}`);\n }\n\n const summary = summarizeThingsImportResult(result);\n writeSuccess(context, summary.successMessage);\n\n for (const line of summary.infoLines) {\n writeInfo(context, line);\n }\n};\n\nexport const registerImportCommands = (\n program: Command,\n workspaceOverride: string | null\n): void => {\n const importCommand = program\n .command(\"import\")\n .description(\"Import external data into Done Bear\");\n\n importCommand\n .command(\"things\")\n .description(\"Import a Things 3 SQLite export\")\n .option(\n \"--database-url <database-url>\",\n \"Path, file:// URL, sqlite:// URL, .thingsdatabase bundle, or ThingsData-* directory\"\n )\n .option(\"-w, --workspace <workspace>\", \"Workspace id, slug, or exact name\")\n .option(\n \"--skip-teams\",\n \"Skip importing Things Areas as Teams and TeamProject links\",\n false\n )\n .option(\n \"--metadata-mode <mode>\",\n \"How to preserve Things-only metadata: note|none\",\n \"none\"\n )\n .option(\n \"--batch-size <count>\",\n \"Maximum sync mutations per batch\",\n (value: string): number => parsePositiveInteger(value, \"Batch size\"),\n 100\n )\n .addHelpText(\n \"after\",\n `\nExamples:\n donebear import things --dry-run --json\n donebear import things --database-url ~/Backups/Things\\\\ Database.thingsdatabase --json\n donebear import things --database-url file:///Users/me/Backups/main.sqlite --workspace personal\n\nNotes:\n --database-url accepts a copied Things 3 export bundle, a direct main.sqlite path, or a ThingsData-* directory.\n --metadata-mode note preserves Things-only fields in task/project/team descriptions using a structured appendix.\n`\n )\n .action(async (options: ThingsImportOptions, command: Command) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runThingsImportCommand(context, options, workspaceOverride);\n });\n });\n};\n","import { randomUUID } from \"node:crypto\";\n\nimport type { Command } from \"commander\";\n\nimport { resolveCommandContext } from \"../command-context\";\nimport { normalizeWorkspaceRef } from \"../command-helpers\";\nimport {\n loadLabelsByWorkspace,\n loadLabelsByWorkspaceIds,\n loadTaskById,\n loadTasksByWorkspace,\n mutateModel,\n} from \"../manage-api\";\nimport {\n copyToClipboard,\n writeFormattedRows,\n writeInfo,\n writeOutput,\n writeSuccess,\n} from \"../output\";\nimport { contextFromCommand, runWithErrorHandling } from \"../runtime\";\nimport { formatEpochDate } from \"../task-defaults\";\nimport type { LabelRecord, TaskRecord } from \"../types\";\nimport {\n resolveWorkspace,\n resolveWorkspaceScope,\n scopeJsonFields,\n scopeLabel,\n} from \"../workspace-context\";\n\ninterface LabelListOptions {\n workspace?: string;\n sort: string;\n}\n\ninterface LabelShowOptions {\n workspace?: string;\n}\n\nconst sortLabels = (labels: LabelRecord[], sort: string): LabelRecord[] => {\n const sorted = [...labels];\n\n if (sort === \"alpha\") {\n sorted.sort((a, b) => a.title.localeCompare(b.title));\n } else {\n // Default: alphabetical (count requires task data not available here)\n sorted.sort((a, b) => a.title.localeCompare(b.title));\n }\n\n return sorted;\n};\n\nconst resolveLabel = async (\n context: ReturnType<typeof contextFromCommand>,\n options: {\n labelRef: string;\n commandContext: Awaited<ReturnType<typeof resolveCommandContext>>;\n workspaceRef: string | null;\n }\n): Promise<LabelRecord> => {\n const { workspace } = await resolveWorkspace(context, {\n apiBaseUrl: options.commandContext.apiBaseUrl,\n storedWorkspaceId: options.commandContext.localContext.workspaceId,\n token: options.commandContext.token,\n workspaceRef: options.workspaceRef,\n });\n\n const labels = await loadLabelsByWorkspace(context, {\n baseUrl: options.commandContext.apiBaseUrl,\n token: options.commandContext.token,\n workspaceId: workspace.id,\n });\n\n const normalized = options.labelRef.trim().toLowerCase();\n const found = labels.find(\n (l) =>\n l.id === options.labelRef ||\n l.title.toLowerCase() === normalized ||\n l.id.startsWith(options.labelRef)\n );\n\n if (!found) {\n throw new Error(`Label \"${options.labelRef}\" not found.`);\n }\n\n return found;\n};\n\nconst runLabelList = async (\n context: ReturnType<typeof contextFromCommand>,\n options: LabelListOptions\n): Promise<void> => {\n const commandContext = await resolveCommandContext(context);\n\n const scope = await resolveWorkspaceScope(context, {\n apiBaseUrl: commandContext.apiBaseUrl,\n storedWorkspaceId: commandContext.localContext.workspaceId,\n token: commandContext.token,\n workspaceRef: normalizeWorkspaceRef(options.workspace),\n });\n\n const allLabels =\n scope.mode === \"all\"\n ? await loadLabelsByWorkspaceIds(context, {\n baseUrl: commandContext.apiBaseUrl,\n token: commandContext.token,\n workspaceIds: scope.workspaces.map((w) => w.id),\n })\n : await loadLabelsByWorkspace(context, {\n baseUrl: commandContext.apiBaseUrl,\n token: commandContext.token,\n workspaceId: scope.workspace.id,\n });\n\n const sorted = sortLabels(allLabels, options.sort);\n\n if (context.json) {\n writeOutput(context, {\n ...scopeJsonFields(scope),\n labels: sorted,\n total: sorted.length,\n });\n return;\n }\n\n const headers = [\"id\", \"title\", \"createdAt\", \"updatedAt\"];\n const rows = sorted.map((l) => [\n l.id,\n l.title,\n formatEpochDate(l.createdAt) ?? \"\",\n formatEpochDate(l.updatedAt) ?? \"\",\n ]);\n\n if (writeFormattedRows(context, sorted.length, headers, rows)) {\n return;\n }\n\n if (scope.mode === \"single\" && scope.autoSelected) {\n writeInfo(context, `Auto-selected workspace: ${scope.workspace.name}`);\n }\n\n if (sorted.length === 0) {\n writeInfo(context, \"No labels found.\");\n return;\n }\n\n writeInfo(context, `${scopeLabel(scope)} (${sorted.length} label(s))`);\n\n for (const labelRecord of sorted) {\n writeInfo(context, `${labelRecord.id.slice(0, 8)} ${labelRecord.title}`);\n }\n\n if (context.copy) {\n const text = sorted\n .map((l) => `${l.id.slice(0, 8)} ${l.title}`)\n .join(\"\\n\");\n copyToClipboard(text);\n }\n};\n\nconst runLabelShow = async (\n context: ReturnType<typeof contextFromCommand>,\n labelRef: string,\n options: LabelShowOptions\n): Promise<void> => {\n const commandContext = await resolveCommandContext(context);\n const label = await resolveLabel(context, {\n commandContext,\n labelRef,\n workspaceRef: normalizeWorkspaceRef(options.workspace),\n });\n\n if (context.json) {\n writeOutput(context, {\n createdAtIso: formatEpochDate(label.createdAt),\n label,\n updatedAtIso: formatEpochDate(label.updatedAt),\n });\n return;\n }\n\n writeSuccess(context, label.title);\n writeInfo(context, `id: ${label.id}`);\n writeInfo(context, `workspaceId: ${label.workspaceId}`);\n writeInfo(\n context,\n `createdAt: ${formatEpochDate(label.createdAt) ?? \"(none)\"}`\n );\n writeInfo(\n context,\n `updatedAt: ${formatEpochDate(label.updatedAt) ?? \"(none)\"}`\n );\n};\n\nconst UUID_REGEX =\n /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/iu;\n\nconst resolveTaskForLabel = async (\n context: ReturnType<typeof contextFromCommand>,\n options: {\n taskRef: string;\n commandContext: Awaited<ReturnType<typeof resolveCommandContext>>;\n workspaceRef: string | null;\n }\n): Promise<TaskRecord> => {\n const taskRef = options.taskRef.trim();\n if (!taskRef) {\n throw new Error(\"Task id is required.\");\n }\n\n const exact = await loadTaskById(context, {\n baseUrl: options.commandContext.apiBaseUrl,\n taskId: taskRef,\n token: options.commandContext.token,\n });\n if (exact) {\n return exact;\n }\n if (UUID_REGEX.test(taskRef)) {\n throw new Error(`Task \"${taskRef}\" not found.`);\n }\n if (taskRef.length < 4) {\n throw new Error(\"Task id prefix must be at least 4 characters.\");\n }\n\n const { workspace } = await resolveWorkspace(context, {\n apiBaseUrl: options.commandContext.apiBaseUrl,\n storedWorkspaceId: options.commandContext.localContext.workspaceId,\n token: options.commandContext.token,\n workspaceRef: options.workspaceRef,\n });\n\n const tasks = await loadTasksByWorkspace(context, {\n baseUrl: options.commandContext.apiBaseUrl,\n token: options.commandContext.token,\n workspaceId: workspace.id,\n });\n const matches = tasks.filter((task) => task.id.startsWith(taskRef));\n if (matches.length === 0) {\n throw new Error(`Task \"${taskRef}\" not found.`);\n }\n if (matches.length === 1) {\n const [match] = matches;\n if (!match) {\n throw new Error(`Task \"${taskRef}\" not found.`);\n }\n return match;\n }\n throw new Error(\n `Task prefix \"${taskRef}\" is ambiguous (${matches.length} matches). Use the full id.`\n );\n};\n\nconst runLabelCreate = async (\n context: ReturnType<typeof contextFromCommand>,\n title: string,\n options: { workspace?: string }\n): Promise<void> => {\n const commandContext = await resolveCommandContext(context);\n const { workspace } = await resolveWorkspace(context, {\n apiBaseUrl: commandContext.apiBaseUrl,\n storedWorkspaceId: commandContext.localContext.workspaceId,\n token: commandContext.token,\n workspaceRef: normalizeWorkspaceRef(options.workspace),\n });\n\n const labelId = randomUUID();\n const now = Date.now();\n await mutateModel(context, {\n baseUrl: commandContext.apiBaseUrl,\n request: {\n batchId: randomUUID(),\n transactions: [\n {\n action: \"INSERT\",\n clientId: commandContext.localContext.clientId,\n clientTxId: randomUUID(),\n modelId: labelId,\n modelName: \"Label\",\n payload: {\n createdAt: now,\n key: labelId.replaceAll(\"-\", \"\").slice(0, 8),\n title: title.trim(),\n updatedAt: now,\n workspaceId: workspace.id,\n },\n },\n ],\n },\n token: commandContext.token,\n });\n\n if (context.json) {\n writeOutput(context, { created: true, id: labelId, title: title.trim() });\n return;\n }\n writeSuccess(context, `Created label: ${title.trim()}`);\n};\n\nconst runLabelAdd = async (\n context: ReturnType<typeof contextFromCommand>,\n taskRef: string,\n labelRef: string,\n options: { workspace?: string }\n): Promise<void> => {\n const commandContext = await resolveCommandContext(context);\n const workspaceRef = normalizeWorkspaceRef(options.workspace);\n\n const task = await resolveTaskForLabel(context, {\n commandContext,\n taskRef,\n workspaceRef,\n });\n const label = await resolveLabel(context, {\n commandContext,\n labelRef,\n workspaceRef,\n });\n\n await mutateModel(context, {\n baseUrl: commandContext.apiBaseUrl,\n request: {\n batchId: randomUUID(),\n transactions: [\n {\n action: \"INSERT\",\n clientId: commandContext.localContext.clientId,\n clientTxId: randomUUID(),\n modelId: `${task.id}:${label.id}`,\n modelName: \"TaskLabel\",\n payload: {\n createdAt: Date.now(),\n labelId: label.id,\n taskId: task.id,\n workspaceId: task.workspaceId,\n },\n },\n ],\n },\n token: commandContext.token,\n });\n\n if (context.json) {\n writeOutput(context, {\n added: true,\n labelId: label.id,\n labelTitle: label.title,\n taskId: task.id,\n });\n return;\n }\n writeSuccess(context, `Added label \"${label.title}\" to task \"${task.title}\"`);\n};\n\nconst runLabelRemove = async (\n context: ReturnType<typeof contextFromCommand>,\n taskRef: string,\n labelRef: string,\n options: { workspace?: string }\n): Promise<void> => {\n const commandContext = await resolveCommandContext(context);\n const workspaceRef = normalizeWorkspaceRef(options.workspace);\n\n const task = await resolveTaskForLabel(context, {\n commandContext,\n taskRef,\n workspaceRef,\n });\n const label = await resolveLabel(context, {\n commandContext,\n labelRef,\n workspaceRef,\n });\n\n await mutateModel(context, {\n baseUrl: commandContext.apiBaseUrl,\n request: {\n batchId: randomUUID(),\n transactions: [\n {\n action: \"DELETE\",\n clientId: commandContext.localContext.clientId,\n clientTxId: randomUUID(),\n modelId: `${task.id}:${label.id}`,\n modelName: \"TaskLabel\",\n payload: {\n labelId: label.id,\n taskId: task.id,\n },\n },\n ],\n },\n token: commandContext.token,\n });\n\n if (context.json) {\n writeOutput(context, {\n labelId: label.id,\n labelTitle: label.title,\n removed: true,\n taskId: task.id,\n });\n return;\n }\n writeSuccess(\n context,\n `Removed label \"${label.title}\" from task \"${task.title}\"`\n );\n};\n\nexport const registerLabelCommands = (\n program: Command,\n workspaceOverride: string | null\n): void => {\n const label = program\n .command(\"label\")\n .alias(\"labels\")\n .description(\"Manage labels\")\n .addHelpText(\n \"after\",\n `\nExamples:\n donebear label\n donebear label list --sort alpha\n donebear label show bug\n donebear label create \"urgent\"\n donebear label add <task-id> <label>\n donebear label remove <task-id> <label>\n`\n )\n .action(async (_options: unknown, command: Command) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runLabelList(context, { sort: \"alpha\" });\n });\n });\n\n label\n .command(\"list\")\n .alias(\"ls\")\n .description(\"List labels\")\n .option(\"-w, --workspace <workspace>\", \"Workspace id, slug, or exact name\")\n .option(\"--sort <order>\", \"Sort order: alpha|count\", \"alpha\")\n .action(async (options: LabelListOptions, command: Command) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runLabelList(context, {\n ...options,\n workspace:\n workspaceOverride ??\n normalizeWorkspaceRef(options.workspace) ??\n undefined,\n });\n });\n });\n\n label\n .command(\"show\")\n .description(\"Show label details\")\n .argument(\"<id-or-title>\", \"Label id, title, or id prefix\")\n .option(\"-w, --workspace <workspace>\", \"Workspace id, slug, or exact name\")\n .action(\n async (labelRef: string, options: LabelShowOptions, command: Command) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runLabelShow(context, labelRef, {\n workspace:\n workspaceOverride ??\n normalizeWorkspaceRef(options.workspace) ??\n undefined,\n });\n });\n }\n );\n\n label\n .command(\"create\")\n .description(\"Create a new label\")\n .argument(\"<title>\", \"Label title\")\n .option(\"-w, --workspace <workspace>\", \"Workspace id, slug, or exact name\")\n .action(\n async (\n title: string,\n options: { workspace?: string },\n command: Command\n ) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runLabelCreate(context, title, {\n workspace:\n workspaceOverride ??\n normalizeWorkspaceRef(options.workspace) ??\n undefined,\n });\n });\n }\n );\n\n label\n .command(\"add\")\n .description(\"Add a label to a task\")\n .argument(\"<task-id>\", \"Task id or prefix\")\n .argument(\"<label>\", \"Label id, title, or id prefix\")\n .option(\"-w, --workspace <workspace>\", \"Workspace id, slug, or exact name\")\n .action(\n async (\n taskRef: string,\n labelRef: string,\n options: { workspace?: string },\n command: Command\n ) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runLabelAdd(context, taskRef, labelRef, {\n workspace:\n workspaceOverride ??\n normalizeWorkspaceRef(options.workspace) ??\n undefined,\n });\n });\n }\n );\n\n label\n .command(\"remove\")\n .alias(\"rm\")\n .description(\"Remove a label from a task\")\n .argument(\"<task-id>\", \"Task id or prefix\")\n .argument(\"<label>\", \"Label id, title, or id prefix\")\n .option(\"-w, --workspace <workspace>\", \"Workspace id, slug, or exact name\")\n .action(\n async (\n taskRef: string,\n labelRef: string,\n options: { workspace?: string },\n command: Command\n ) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runLabelRemove(context, taskRef, labelRef, {\n workspace:\n workspaceOverride ??\n normalizeWorkspaceRef(options.workspace) ??\n undefined,\n });\n });\n }\n );\n};\n","import { createInterface } from \"node:readline\";\n\nimport type { CliContext } from \"./types\";\n\n/**\n * Prompt for confirmation on destructive actions.\n * Auto-skips when: --yes, --json, --dry-run, or non-TTY stdin.\n */\nexport const confirmAction = (\n context: CliContext,\n message: string\n): Promise<boolean> => {\n if (context.yes || context.json || context.dryRun || !process.stdin.isTTY) {\n return Promise.resolve(true);\n }\n\n const rl = createInterface({\n input: process.stdin,\n output: process.stderr,\n });\n\n return new Promise((resolve) => {\n rl.question(`${message} [y/N] `, (answer) => {\n rl.close();\n resolve(answer.trim().toLowerCase() === \"y\");\n });\n });\n};\n","import { randomUUID } from \"node:crypto\";\n\nimport type { Command } from \"commander\";\n\nimport { requireUserId, resolveCommandContext } from \"../command-context\";\nimport { findByRef, normalizeWorkspaceRef } from \"../command-helpers\";\nimport { confirmAction } from \"../confirm\";\nimport {\n formatDateOnlyEpoch,\n formatInstantEpoch,\n parseCliDateOnlyToEpoch,\n} from \"../date-codecs\";\nimport { CliError, EXIT_CODES } from \"../errors\";\nimport { createIdempotentMutationId } from \"../import/model-id\";\nimport {\n loadProjectsByWorkspace,\n loadProjectsByWorkspaceIds,\n mutateModel,\n} from \"../manage-api\";\nimport {\n copyToClipboard,\n writeFormattedRows,\n writeInfo,\n writeOutput,\n writeSuccess,\n} from \"../output\";\nimport { contextFromCommand, runWithErrorHandling } from \"../runtime\";\nimport type { ProjectRecord, WorkspaceSummary } from \"../types\";\nimport {\n resolveWorkspace,\n resolveWorkspaceScope,\n scopeJsonFields,\n scopeLabel,\n} from \"../workspace-context\";\n\ntype ProjectStatus = \"active\" | \"done\" | \"archived\" | \"all\";\n\ninterface ProjectListOptions {\n workspace?: string;\n status: string;\n total?: boolean;\n format?: string;\n}\n\ninterface ProjectShowOptions {\n workspace?: string;\n}\n\ninterface ProjectAddOptions {\n workspace?: string;\n description?: string;\n targetDate?: string;\n idempotencyKey?: string;\n}\n\ninterface ProjectEditOptions {\n workspace?: string;\n name?: string;\n description?: string;\n clearDescription: boolean;\n status?: string;\n targetDate?: string;\n clearTargetDate: boolean;\n}\n\ninterface ProjectTargetOptions {\n workspace?: string;\n}\n\nconst parseProjectStatus = (value: string): ProjectStatus => {\n switch (value.trim().toLowerCase()) {\n case \"active\": {\n return \"active\";\n }\n case \"done\":\n case \"complete\":\n case \"completed\": {\n return \"done\";\n }\n case \"archived\":\n case \"archive\": {\n return \"archived\";\n }\n case \"all\": {\n return \"all\";\n }\n default: {\n throw new Error(\n `Invalid status \"${value}\". Expected one of: active, done, archived, all.`\n );\n }\n }\n};\n\nconst getProjectStatus = (\n project: ProjectRecord\n): Exclude<ProjectStatus, \"all\"> => {\n if (project.archivedAt !== null) {\n return \"archived\";\n }\n\n if (project.completedAt !== null) {\n return \"done\";\n }\n\n return \"active\";\n};\n\nconst parseTargetDate = (value: string | undefined): number | null =>\n parseCliDateOnlyToEpoch(value, \"target date\");\n\nconst generateProjectSlug = (name: string, id: string): string => {\n const slug = name\n .toLowerCase()\n .trim()\n .replaceAll(/[^a-z0-9]+/gu, \"-\")\n .replaceAll(/^-|-$/gu, \"\")\n .slice(0, 39);\n const shortId = id.replaceAll(\"-\", \"\").slice(0, 8);\n return slug ? `${slug}-${shortId}` : shortId;\n};\n\nconst filterProjects = (\n projects: ProjectRecord[],\n status: ProjectStatus\n): ProjectRecord[] => {\n if (status === \"all\") {\n return projects;\n }\n\n return projects.filter((p) => getProjectStatus(p) === status);\n};\n\nconst sortProjectsByUpdatedDesc = (\n projects: ProjectRecord[]\n): ProjectRecord[] =>\n [...projects].toSorted((a, b) => (b.updatedAt ?? 0) - (a.updatedAt ?? 0));\n\nconst resolveProjectReference = async (\n context: ReturnType<typeof contextFromCommand>,\n options: {\n projectRef: string;\n commandContext: Awaited<ReturnType<typeof resolveCommandContext>>;\n workspaceRef: string | null;\n }\n): Promise<{ project: ProjectRecord; workspace: WorkspaceSummary }> => {\n const { workspace } = await resolveWorkspace(context, {\n apiBaseUrl: options.commandContext.apiBaseUrl,\n storedWorkspaceId: options.commandContext.localContext.workspaceId,\n token: options.commandContext.token,\n workspaceRef: options.workspaceRef,\n });\n\n const projects = await loadProjectsByWorkspace(context, {\n baseUrl: options.commandContext.apiBaseUrl,\n token: options.commandContext.token,\n workspaceId: workspace.id,\n });\n\n const found = findByRef(options.projectRef, projects);\n\n if (!found) {\n throw new Error(`Project \"${options.projectRef}\" not found.`);\n }\n\n return { project: found, workspace };\n};\n\nconst runProjectList = async (\n context: ReturnType<typeof contextFromCommand>,\n options: ProjectListOptions\n): Promise<void> => {\n const commandContext = await resolveCommandContext(context);\n const requestedStatus = parseProjectStatus(options.status);\n\n const scope = await resolveWorkspaceScope(context, {\n apiBaseUrl: commandContext.apiBaseUrl,\n storedWorkspaceId: commandContext.localContext.workspaceId,\n token: commandContext.token,\n workspaceRef: normalizeWorkspaceRef(options.workspace),\n });\n\n const allProjects =\n scope.mode === \"all\"\n ? await loadProjectsByWorkspaceIds(context, {\n baseUrl: commandContext.apiBaseUrl,\n token: commandContext.token,\n workspaceIds: scope.workspaces.map((w) => w.id),\n })\n : await loadProjectsByWorkspace(context, {\n baseUrl: commandContext.apiBaseUrl,\n token: commandContext.token,\n workspaceId: scope.workspace.id,\n });\n\n const filtered = filterProjects(\n sortProjectsByUpdatedDesc(allProjects),\n requestedStatus\n );\n\n if (context.json) {\n writeOutput(context, {\n ...scopeJsonFields(scope),\n projects: filtered,\n status: requestedStatus,\n total: filtered.length,\n });\n return;\n }\n\n const headers = [\"id\", \"key\", \"name\", \"status\", \"targetDate\", \"updatedAt\"];\n const rows = filtered.map((p) => [\n p.id,\n p.key,\n p.name,\n getProjectStatus(p),\n formatDateOnlyEpoch(p.targetDate) ?? \"\",\n formatInstantEpoch(p.updatedAt) ?? \"\",\n ]);\n\n if (writeFormattedRows(context, filtered.length, headers, rows)) {\n return;\n }\n\n if (scope.mode === \"single\" && scope.autoSelected) {\n writeInfo(context, `Auto-selected workspace: ${scope.workspace.name}`);\n }\n\n if (filtered.length === 0) {\n writeInfo(context, \"No projects found.\");\n return;\n }\n\n writeInfo(context, `${scopeLabel(scope)} (${filtered.length} project(s))`);\n\n for (const project of filtered) {\n const status = getProjectStatus(project);\n const target = formatDateOnlyEpoch(project.targetDate);\n const suffix = target ? ` due ${target}` : \"\";\n writeInfo(\n context,\n `${project.id.slice(0, 8)} [${project.key}] ${project.name} (${status})${suffix}`\n );\n }\n\n if (context.copy) {\n const text = filtered\n .map(\n (p) =>\n `${p.id.slice(0, 8)} [${p.key}] ${p.name} (${getProjectStatus(p)})`\n )\n .join(\"\\n\");\n copyToClipboard(text);\n }\n};\n\nconst runProjectShow = async (\n context: ReturnType<typeof contextFromCommand>,\n projectRef: string,\n options: ProjectShowOptions\n): Promise<void> => {\n const commandContext = await resolveCommandContext(context);\n const { project, workspace } = await resolveProjectReference(context, {\n commandContext,\n projectRef,\n workspaceRef: normalizeWorkspaceRef(options.workspace),\n });\n\n if (context.json) {\n writeOutput(context, {\n archivedAtIso: formatInstantEpoch(project.archivedAt),\n completedAtIso: formatInstantEpoch(project.completedAt),\n createdAtIso: formatInstantEpoch(project.createdAt),\n project,\n status: getProjectStatus(project),\n targetDateIso: formatDateOnlyEpoch(project.targetDate),\n updatedAtIso: formatInstantEpoch(project.updatedAt),\n workspace,\n });\n return;\n }\n\n writeSuccess(context, project.name);\n writeInfo(context, `id: ${project.id}`);\n writeInfo(context, `key: ${project.key}`);\n writeInfo(context, `status: ${getProjectStatus(project)}`);\n writeInfo(context, `workspaceId: ${project.workspaceId}`);\n writeInfo(\n context,\n `targetDate: ${formatDateOnlyEpoch(project.targetDate) ?? \"(none)\"}`\n );\n writeInfo(\n context,\n `createdAt: ${formatInstantEpoch(project.createdAt) ?? \"(none)\"}`\n );\n writeInfo(\n context,\n `updatedAt: ${formatInstantEpoch(project.updatedAt) ?? \"(none)\"}`\n );\n\n if (project.description) {\n writeInfo(context, `description: ${project.description}`);\n }\n};\n\nconst resolveProjectName = async (\n context: ReturnType<typeof contextFromCommand>,\n rawName: string | undefined\n): Promise<string> => {\n if (rawName) {\n const trimmed = rawName.trim();\n if (trimmed.length > 0) {\n return trimmed;\n }\n }\n\n const { promptForValue } = await import(\"../prompt\");\n const prompted = await promptForValue(context, \"Project name\");\n\n if (prompted) {\n return prompted;\n }\n\n throw new CliError(\n \"Project name is required.\",\n EXIT_CODES.VALIDATION,\n 'Provide a name: donebear project add \"My project\"'\n );\n};\n\nconst runProjectAdd = async (\n context: ReturnType<typeof contextFromCommand>,\n name: string | undefined,\n options: ProjectAddOptions\n): Promise<void> => {\n const commandContext = await resolveCommandContext(context);\n const userId = await requireUserId(context, commandContext);\n const normalizedName = await resolveProjectName(context, name);\n\n const { workspace, autoSelected } = await resolveWorkspace(context, {\n apiBaseUrl: commandContext.apiBaseUrl,\n storedWorkspaceId: commandContext.localContext.workspaceId,\n token: commandContext.token,\n workspaceRef: normalizeWorkspaceRef(options.workspace),\n });\n\n const idempotencyId = (part: \"model\" | \"tx\" | \"batch\"): string | null =>\n options.idempotencyKey\n ? createIdempotentMutationId({\n key: options.idempotencyKey,\n modelName: \"Project\",\n part,\n workspaceId: workspace.id,\n })\n : null;\n\n const projectId = idempotencyId(\"model\") ?? randomUUID();\n const now = Date.now();\n const key = generateProjectSlug(normalizedName, projectId);\n\n await mutateModel(context, {\n baseUrl: commandContext.apiBaseUrl,\n request: {\n batchId: idempotencyId(\"batch\") ?? randomUUID(),\n transactions: [\n {\n action: \"INSERT\",\n clientId: options.idempotencyKey\n ? \"cli-idem\"\n : commandContext.localContext.clientId,\n clientTxId: idempotencyId(\"tx\") ?? randomUUID(),\n modelId: projectId,\n modelName: \"Project\",\n payload: {\n archivedAt: null,\n completedAt: null,\n createdAt: now,\n creatorId: userId,\n description: options.description?.trim() || null,\n key,\n name: normalizedName,\n sortOrder: 0,\n status: \"active\",\n targetDate: parseTargetDate(options.targetDate),\n updatedAt: now,\n workspaceId: workspace.id,\n },\n },\n ],\n },\n token: commandContext.token,\n });\n\n if (context.json) {\n writeOutput(context, {\n autoSelected,\n created: true,\n id: projectId,\n key,\n workspaceId: workspace.id,\n workspaceName: workspace.name,\n });\n return;\n }\n\n if (autoSelected) {\n writeInfo(context, `Auto-selected workspace: ${workspace.name}`);\n }\n\n writeSuccess(context, `Added project: ${normalizedName}`);\n writeInfo(context, `id: ${projectId}`);\n writeInfo(context, `key: ${key}`);\n};\n\nconst buildProjectUpdates = (\n options: ProjectEditOptions\n): Record<string, unknown> => {\n if (options.clearDescription && typeof options.description === \"string\") {\n throw new Error(\n \"Use either --description or --clear-description, not both.\"\n );\n }\n\n if (options.clearTargetDate && typeof options.targetDate === \"string\") {\n throw new Error(\n \"Use either --target-date or --clear-target-date, not both.\"\n );\n }\n\n const updates: Record<string, unknown> = {};\n\n if (typeof options.name === \"string\") {\n const name = options.name.trim();\n if (name.length === 0) {\n throw new Error(\"Project name cannot be empty.\");\n }\n updates.name = name;\n }\n\n if (options.clearDescription) {\n updates.description = null;\n } else if (typeof options.description === \"string\") {\n const desc = options.description.trim();\n updates.description = desc.length > 0 ? desc : null;\n }\n\n if (options.clearTargetDate) {\n updates.targetDate = null;\n } else if (typeof options.targetDate === \"string\") {\n updates.targetDate = parseTargetDate(options.targetDate);\n }\n\n if (typeof options.status === \"string\") {\n applyStatusToUpdates(updates, parseProjectStatus(options.status));\n }\n\n if (Object.keys(updates).length === 0) {\n throw new Error(\n \"No updates provided. Use --name, --description, --clear-description, --status, --target-date, or --clear-target-date.\"\n );\n }\n\n updates.updatedAt = Date.now();\n return updates;\n};\n\nconst applyStatusToUpdates = (\n updates: Record<string, unknown>,\n status: ProjectStatus\n): void => {\n if (status === \"done\") {\n updates.completedAt = Date.now();\n updates.archivedAt = null;\n } else if (status === \"active\") {\n updates.completedAt = null;\n updates.archivedAt = null;\n } else if (status === \"archived\") {\n updates.archivedAt = Date.now();\n }\n};\n\nconst runProjectEdit = async (\n context: ReturnType<typeof contextFromCommand>,\n projectRef: string,\n options: ProjectEditOptions\n): Promise<void> => {\n const updates = buildProjectUpdates(options);\n\n const commandContext = await resolveCommandContext(context);\n const { project } = await resolveProjectReference(context, {\n commandContext,\n projectRef,\n workspaceRef: normalizeWorkspaceRef(options.workspace),\n });\n\n await mutateModel(context, {\n baseUrl: commandContext.apiBaseUrl,\n request: {\n batchId: randomUUID(),\n transactions: [\n {\n action: \"UPDATE\",\n clientId: commandContext.localContext.clientId,\n clientTxId: randomUUID(),\n modelId: project.id,\n modelName: \"Project\",\n payload: updates,\n },\n ],\n },\n token: commandContext.token,\n });\n\n if (context.json) {\n writeOutput(context, { action: \"UPDATE\", id: project.id, ok: true });\n return;\n }\n\n writeSuccess(context, `Updated project: ${project.id}`);\n};\n\nconst runProjectMutation = async (\n context: ReturnType<typeof contextFromCommand>,\n projectRef: string,\n payload: {\n workspaceRef: string | null;\n action: \"UPDATE\" | \"ARCHIVE\" | \"UNARCHIVE\";\n data: Record<string, unknown>;\n successMessage: string;\n }\n): Promise<void> => {\n const commandContext = await resolveCommandContext(context);\n const { project } = await resolveProjectReference(context, {\n commandContext,\n projectRef,\n workspaceRef: payload.workspaceRef,\n });\n\n await mutateModel(context, {\n baseUrl: commandContext.apiBaseUrl,\n request: {\n batchId: randomUUID(),\n transactions: [\n {\n action: payload.action,\n clientId: commandContext.localContext.clientId,\n clientTxId: randomUUID(),\n modelId: project.id,\n modelName: \"Project\",\n payload: payload.data,\n },\n ],\n },\n token: commandContext.token,\n });\n\n if (context.json) {\n writeOutput(context, { action: payload.action, id: project.id, ok: true });\n return;\n }\n\n writeSuccess(context, `${payload.successMessage}: ${project.id}`);\n};\n\nexport const registerProjectCommands = (\n program: Command,\n workspaceOverride: string | null\n): void => {\n const project = program\n .command(\"project\")\n .alias(\"projects\")\n .description(\"Manage projects\")\n .addHelpText(\n \"after\",\n `\nExamples:\n donebear project list --json\n donebear project add \"Q1 Launch\" --json\n donebear project add \"Website Redesign\" --target-date 2026-06-30 --json\n donebear project edit \"Q1 Launch\" --target-date 2026-03-31 --json\n donebear project done \"Q1 Launch\" --json\n\nDate format: YYYY-MM-DD (e.g. 2026-03-31)\nProject id: full UUID, slug, id prefix, or name\nStatus: active | done | archived | all\n\nAgent tip: run \"donebear spec project add\" for full option reference\n`\n )\n .action(async (_options: unknown, command: Command) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runProjectList(context, { status: \"active\" });\n });\n });\n\n project\n .command(\"list\")\n .alias(\"ls\")\n .description(\"List projects\")\n .option(\"-w, --workspace <workspace>\", \"Workspace id, slug, or exact name\")\n .option(\"-s, --status <status>\", \"active|done|archived|all\", \"active\")\n .action(async (options: ProjectListOptions, command: Command) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runProjectList(context, {\n ...options,\n workspace:\n workspaceOverride ??\n normalizeWorkspaceRef(options.workspace) ??\n undefined,\n });\n });\n });\n\n project\n .command(\"show\")\n .description(\"Show project details\")\n .argument(\"<id-or-key>\", \"Project id, key, or id prefix\")\n .option(\"-w, --workspace <workspace>\", \"Workspace id, slug, or exact name\")\n .action(\n async (\n projectRef: string,\n options: ProjectShowOptions,\n command: Command\n ) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runProjectShow(context, projectRef, {\n workspace:\n workspaceOverride ??\n normalizeWorkspaceRef(options.workspace) ??\n undefined,\n });\n });\n }\n );\n\n project\n .command(\"add\")\n .alias(\"create\")\n .description(\"Create a project\")\n .argument(\"[name]\", \"Project name (prompted interactively if omitted)\")\n .option(\"-w, --workspace <workspace>\", \"Workspace id, slug, or exact name\")\n .option(\"-d, --description <text>\", \"Project description\")\n .option(\"--target-date <date>\", \"Target date (YYYY-MM-DD)\")\n .option(\n \"--idempotency-key <key>\",\n \"Stable key making retries safe (repeated calls create only one project)\"\n )\n .action(\n async (\n name: string | undefined,\n options: ProjectAddOptions,\n command: Command\n ) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runProjectAdd(context, name, {\n ...options,\n workspace:\n workspaceOverride ??\n normalizeWorkspaceRef(options.workspace) ??\n undefined,\n });\n });\n }\n );\n\n project\n .command(\"edit\")\n .description(\"Update project fields\")\n .argument(\"<id-or-key>\", \"Project id, key, or id prefix\")\n .option(\"-w, --workspace <workspace>\", \"Workspace id, slug, or exact name\")\n .option(\"--name <name>\", \"Replace project name\")\n .option(\"-d, --description <text>\", \"Replace project description\")\n .option(\"--clear-description\", \"Clear project description\")\n .option(\"--status <status>\", \"Set status (active|done|archived)\")\n .option(\"--target-date <date>\", \"Set target date (YYYY-MM-DD)\")\n .option(\"--clear-target-date\", \"Clear target date\")\n .action(\n async (\n projectRef: string,\n options: ProjectEditOptions,\n command: Command\n ) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runProjectEdit(context, projectRef, {\n ...options,\n workspace:\n workspaceOverride ??\n normalizeWorkspaceRef(options.workspace) ??\n undefined,\n });\n });\n }\n );\n\n project\n .command(\"done\")\n .alias(\"complete\")\n .description(\"Mark a project as completed\")\n .argument(\"<id-or-key>\", \"Project id, key, or id prefix\")\n .option(\"-w, --workspace <workspace>\", \"Workspace id, slug, or exact name\")\n .action(\n async (\n projectRef: string,\n options: ProjectTargetOptions,\n command: Command\n ) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n const now = Date.now();\n await runProjectMutation(context, projectRef, {\n action: \"UPDATE\",\n data: { completedAt: now, updatedAt: now },\n successMessage: \"Marked done\",\n workspaceRef:\n workspaceOverride ?? normalizeWorkspaceRef(options.workspace),\n });\n });\n }\n );\n\n project\n .command(\"archive\")\n .description(\"Archive a project\")\n .argument(\"<id-or-key>\", \"Project id, key, or id prefix\")\n .option(\"-w, --workspace <workspace>\", \"Workspace id, slug, or exact name\")\n .action(\n async (\n projectRef: string,\n options: ProjectTargetOptions,\n command: Command\n ) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n const confirmed = await confirmAction(\n context,\n `Archive project \"${projectRef}\"?`\n );\n if (!confirmed) {\n throw new CliError(\"Cancelled\", EXIT_CODES.CANCELLED);\n }\n await runProjectMutation(context, projectRef, {\n action: \"ARCHIVE\",\n data: { archivedAt: Date.now() },\n successMessage: \"Archived\",\n workspaceRef:\n workspaceOverride ?? normalizeWorkspaceRef(options.workspace),\n });\n });\n }\n );\n\n project\n .command(\"unarchive\")\n .alias(\"restore\")\n .description(\"Unarchive a project\")\n .argument(\"<id-or-key>\", \"Project id, key, or id prefix\")\n .option(\"-w, --workspace <workspace>\", \"Workspace id, slug, or exact name\")\n .action(\n async (\n projectRef: string,\n options: ProjectTargetOptions,\n command: Command\n ) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runProjectMutation(context, projectRef, {\n action: \"UNARCHIVE\",\n data: {},\n successMessage: \"Unarchived\",\n workspaceRef:\n workspaceOverride ?? normalizeWorkspaceRef(options.workspace),\n });\n });\n }\n );\n};\n","import { randomUUID } from \"node:crypto\";\n\nimport type { Command } from \"commander\";\n\nimport { requireUserId, resolveCommandContext } from \"../command-context\";\nimport {\n normalizeWorkspaceRef,\n parseTaskState,\n taskListHeaders,\n taskListLines,\n taskListRows,\n} from \"../command-helpers\";\nimport { parsePositiveInteger } from \"../command-parsers\";\nimport { confirmAction } from \"../confirm\";\nimport {\n formatDateOnlyEpoch,\n formatInstantEpoch,\n parseCliDateOnlyToEpoch,\n} from \"../date-codecs\";\nimport { CliError, EXIT_CODES } from \"../errors\";\nimport { createIdempotentMutationId } from \"../import/model-id\";\nimport {\n loadChecklistItemsByTask,\n loadProjectsByWorkspace,\n loadTaskById,\n loadTasksByWorkspace,\n loadTasksByWorkspaceIds,\n loadTeamsByWorkspace,\n mutateModel,\n} from \"../manage-api\";\nimport {\n writeFormattedRows,\n writeInfo,\n writeOutput,\n writeSuccess,\n writeWarning,\n} from \"../output\";\nimport { promptForValue, readStdin } from \"../prompt\";\nimport { contextFromCommand, runWithErrorHandling } from \"../runtime\";\nimport {\n buildTaskStartFields,\n getTaskState,\n resolveTaskView,\n} from \"../task-defaults\";\nimport type {\n ChecklistItemRecord,\n TaskRecord,\n TaskState,\n TaskView,\n WorkspaceScope,\n} from \"../types\";\nimport {\n resolveWorkspace,\n resolveWorkspaceScope,\n scopeJsonFields,\n scopeLabel,\n} from \"../workspace-context\";\n\nconst UUID_REGEX =\n /^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/iu;\nconst DEFAULT_TASK_LIST_LIMIT = 20;\nconst VALID_TASK_VIEWS = new Set<TaskView>([\n \"inbox\",\n \"anytime\",\n \"today\",\n \"upcoming\",\n \"someday\",\n \"logbook\",\n \"trash\",\n]);\n\ninterface TaskListOptions {\n workspace?: string;\n state: string;\n view?: string;\n limit: number;\n search?: string;\n}\n\ninterface TaskAddOptions {\n workspace?: string;\n description?: string;\n when: string;\n deadline?: string;\n project?: string;\n team?: string;\n idempotencyKey?: string;\n}\n\ninterface TaskTargetOptions {\n workspace?: string;\n}\n\ninterface TaskEditOptions extends TaskTargetOptions {\n title?: string;\n description?: string;\n clearDescription: boolean;\n when?: string;\n deadline?: string;\n clearDeadline: boolean;\n project?: string;\n clearProject: boolean;\n team?: string;\n clearTeam: boolean;\n}\n\ninterface TaskRandomOptions {\n workspace?: string;\n state?: string;\n}\n\nconst parseTaskView = (value: string): TaskView => {\n const normalized = value.trim().toLowerCase();\n\n if (VALID_TASK_VIEWS.has(normalized as TaskView)) {\n return normalized as TaskView;\n }\n\n throw new Error(\n `Invalid view \"${value}\". Expected one of: inbox, anytime, today, upcoming, someday.`\n );\n};\n\nconst parseDeadline = (value: string | undefined): number | null =>\n parseCliDateOnlyToEpoch(value, \"deadline date\");\n\nconst sortTasksByUpdatedDesc = (tasks: TaskRecord[]): TaskRecord[] =>\n [...tasks].toSorted((a, b) => (b.updatedAt ?? 0) - (a.updatedAt ?? 0));\n\nconst resolveTaskReference = async (\n context: ReturnType<typeof contextFromCommand>,\n options: {\n taskRef: string;\n commandContext: Awaited<ReturnType<typeof resolveCommandContext>>;\n workspaceRef: string | null;\n }\n): Promise<TaskRecord> => {\n const taskRef = options.taskRef.trim();\n\n if (!taskRef) {\n throw new Error(\"Task id is required.\");\n }\n\n const exact = await loadTaskById(context, {\n baseUrl: options.commandContext.apiBaseUrl,\n taskId: taskRef,\n token: options.commandContext.token,\n });\n\n if (exact) {\n return exact;\n }\n\n if (UUID_REGEX.test(taskRef)) {\n throw new Error(`Task \"${taskRef}\" not found.`);\n }\n\n if (taskRef.length < 4) {\n throw new Error(\"Task id prefix must be at least 4 characters.\");\n }\n\n const { workspace, autoSelected } = await resolveWorkspace(context, {\n apiBaseUrl: options.commandContext.apiBaseUrl,\n storedWorkspaceId: options.commandContext.localContext.workspaceId,\n token: options.commandContext.token,\n workspaceRef: options.workspaceRef,\n });\n\n const tasks = await loadTasksByWorkspace(context, {\n baseUrl: options.commandContext.apiBaseUrl,\n token: options.commandContext.token,\n workspaceId: workspace.id,\n });\n\n const matches = tasks.filter((task) => task.id.startsWith(taskRef));\n\n if (matches.length === 0) {\n throw new Error(`Task \"${taskRef}\" not found.`);\n }\n\n if (matches.length === 1) {\n const [match] = matches;\n\n if (!match) {\n throw new Error(`Task \"${taskRef}\" not found.`);\n }\n\n if (autoSelected && !context.json) {\n writeInfo(context, `Auto-selected workspace: ${workspace.name}`);\n }\n\n return match;\n }\n\n throw new Error(\n `Task prefix \"${taskRef}\" is ambiguous (${matches.length} matches). Use the full id.`\n );\n};\n\nexport const filterTasks = (\n tasks: TaskRecord[],\n options: {\n state: TaskState;\n search: string | null;\n view: TaskView | null;\n }\n): TaskRecord[] => {\n // When filtering by view, auto-widen state to include the right tasks\n let effectiveState: TaskState = options.state;\n if (options.view === \"logbook\") {\n effectiveState = \"done\";\n } else if (options.view === \"trash\") {\n effectiveState = \"archived\";\n }\n\n const stateFiltered =\n effectiveState === \"all\"\n ? tasks\n : tasks.filter((task) => getTaskState(task) === effectiveState);\n\n const viewFiltered = options.view\n ? stateFiltered.filter((task) => resolveTaskView(task) === options.view)\n : stateFiltered;\n\n if (!options.search) {\n return viewFiltered;\n }\n\n const query = options.search.trim().toLowerCase();\n\n if (query.length === 0) {\n return viewFiltered;\n }\n\n return viewFiltered.filter((task) => {\n const title = task.title.toLowerCase();\n const description = task.description?.toLowerCase() ?? \"\";\n return title.includes(query) || description.includes(query);\n });\n};\n\nconst loadTasksForScope = (\n context: ReturnType<typeof contextFromCommand>,\n scope: WorkspaceScope,\n apiOptions: { baseUrl: string; token: string }\n): Promise<TaskRecord[]> => {\n if (scope.mode === \"all\") {\n return loadTasksByWorkspaceIds(context, {\n ...apiOptions,\n workspaceIds: scope.workspaces.map((w) => w.id),\n });\n }\n\n return loadTasksByWorkspace(context, {\n ...apiOptions,\n workspaceId: scope.workspace.id,\n });\n};\n\nconst runTaskList = async (\n context: ReturnType<typeof contextFromCommand>,\n options: TaskListOptions,\n workspaceOverride: string | null\n): Promise<void> => {\n const commandContext = await resolveCommandContext(context);\n const requestedState = parseTaskState(options.state);\n\n const scope = await resolveWorkspaceScope(context, {\n apiBaseUrl: commandContext.apiBaseUrl,\n storedWorkspaceId: commandContext.localContext.workspaceId,\n token: commandContext.token,\n workspaceRef: workspaceOverride ?? normalizeWorkspaceRef(options.workspace),\n });\n\n const tasks = await loadTasksForScope(context, scope, {\n baseUrl: commandContext.apiBaseUrl,\n token: commandContext.token,\n });\n\n const parsedView = options.view ? parseTaskView(options.view) : null;\n const filtered = filterTasks(sortTasksByUpdatedDesc(tasks), {\n search: options.search?.trim() ?? null,\n state: requestedState,\n view: parsedView,\n });\n const limited = filtered.slice(0, options.limit);\n\n if (context.json) {\n writeOutput(context, {\n ...scopeJsonFields(scope),\n count: limited.length,\n state: requestedState,\n tasks: limited,\n total: filtered.length,\n view: parsedView,\n });\n return;\n }\n\n if (\n writeFormattedRows(\n context,\n filtered.length,\n taskListHeaders(),\n taskListRows(limited)\n )\n ) {\n return;\n }\n\n if (scope.mode === \"single\" && scope.autoSelected) {\n writeInfo(context, `Auto-selected workspace: ${scope.workspace.name}`);\n }\n\n if (limited.length === 0) {\n writeInfo(context, \"No tasks found.\");\n return;\n }\n\n writeInfo(\n context,\n `${scopeLabel(scope)} (${limited.length}/${filtered.length})`\n );\n\n for (const line of taskListLines(limited)) {\n writeInfo(context, line);\n }\n};\n\nconst runTaskShow = async (\n context: ReturnType<typeof contextFromCommand>,\n taskRef: string,\n options: TaskTargetOptions,\n workspaceOverride: string | null\n): Promise<void> => {\n const commandContext = await resolveCommandContext(context);\n const task = await resolveTaskReference(context, {\n commandContext,\n taskRef,\n workspaceRef: workspaceOverride ?? normalizeWorkspaceRef(options.workspace),\n });\n\n if (context.json) {\n writeOutput(context, {\n archivedAtIso: formatInstantEpoch(task.archivedAt),\n completedAtIso: formatInstantEpoch(task.completedAt),\n createdAtIso: formatInstantEpoch(task.createdAt),\n deadlineAtIso: formatDateOnlyEpoch(task.deadlineAt),\n state: getTaskState(task),\n task,\n updatedAtIso: formatInstantEpoch(task.updatedAt),\n });\n return;\n }\n\n writeSuccess(context, task.title);\n writeInfo(context, `id: ${task.id}`);\n writeInfo(context, `state: ${getTaskState(task)}`);\n writeInfo(context, `workspaceId: ${task.workspaceId}`);\n writeInfo(context, `start: ${task.start}`);\n writeInfo(context, `startBucket: ${task.startBucket}`);\n writeInfo(\n context,\n `deadline: ${formatDateOnlyEpoch(task.deadlineAt) ?? \"(none)\"}`\n );\n\n if (task.projectId) {\n writeInfo(context, `projectId: ${task.projectId}`);\n }\n\n if (task.teamId) {\n writeInfo(context, `teamId: ${task.teamId}`);\n }\n\n if (task.assigneeId) {\n writeInfo(context, `assigneeId: ${task.assigneeId}`);\n }\n\n if (task.description) {\n writeInfo(context, `description: ${task.description}`);\n }\n};\n\nconst resolveTitle = async (\n context: ReturnType<typeof contextFromCommand>,\n rawTitle: string | undefined\n): Promise<string> => {\n if (rawTitle) {\n const trimmed = rawTitle.trim();\n if (trimmed.length > 0) {\n return trimmed;\n }\n }\n\n const prompted = await promptForValue(context, \"Title\");\n\n if (prompted) {\n return prompted;\n }\n\n throw new CliError(\n \"Task title is required.\",\n EXIT_CODES.VALIDATION,\n 'Provide a title as an argument: donebear task add \"My task\"'\n );\n};\n\nexport const resolveDescription = async (\n context: ReturnType<typeof contextFromCommand>,\n flagDescription: string | undefined\n): Promise<string | null> => {\n // No --description flag: never implicitly read stdin. In a non-interactive\n // agent/CI context stdin is usually empty (or an open pipe that blocks), so\n // the old implicit fallback silently dropped the description as `null` while\n // the command still reported success. Require an explicit opt-in instead.\n if (typeof flagDescription !== \"string\") {\n return null;\n }\n\n // `--description -` is the explicit opt-in to read from piped stdin.\n if (flagDescription === \"-\") {\n const piped = await readStdin();\n if (!piped) {\n writeWarning(\n context,\n \"No description received on stdin (--description -); task created without a description.\"\n );\n return null;\n }\n return piped;\n }\n\n const trimmed = flagDescription.trim();\n if (trimmed.length === 0) {\n writeWarning(\n context,\n \"Empty --description value; task created without a description.\"\n );\n return null;\n }\n return trimmed;\n};\n\nconst runTaskAdd = async (\n context: ReturnType<typeof contextFromCommand>,\n title: string | undefined,\n options: TaskAddOptions,\n workspaceOverride: string | null\n): Promise<void> => {\n const commandContext = await resolveCommandContext(context);\n const userId = await requireUserId(context, commandContext);\n const normalizedTitle = await resolveTitle(context, title);\n const description = await resolveDescription(context, options.description);\n\n const { workspace, autoSelected } = await resolveWorkspace(context, {\n apiBaseUrl: commandContext.apiBaseUrl,\n storedWorkspaceId: commandContext.localContext.workspaceId,\n token: commandContext.token,\n workspaceRef: workspaceOverride ?? normalizeWorkspaceRef(options.workspace),\n });\n\n const [projectId, teamId] = await Promise.all([\n options.project\n ? loadProjectsByWorkspace(context, {\n baseUrl: commandContext.apiBaseUrl,\n token: commandContext.token,\n workspaceId: workspace.id,\n }).then((projects) =>\n resolveEntityId(projects, options.project as string, \"Project\")\n )\n : Promise.resolve(null),\n options.team\n ? loadTeamsByWorkspace(context, {\n baseUrl: commandContext.apiBaseUrl,\n token: commandContext.token,\n workspaceId: workspace.id,\n }).then((teams) =>\n resolveEntityId(teams, options.team as string, \"Team\")\n )\n : Promise.resolve(null),\n ]);\n\n const idempotencyId = (part: \"model\" | \"tx\" | \"batch\"): string | null =>\n options.idempotencyKey\n ? createIdempotentMutationId({\n key: options.idempotencyKey,\n modelName: \"Task\",\n part,\n workspaceId: workspace.id,\n })\n : null;\n\n const taskId = idempotencyId(\"model\") ?? randomUUID();\n const now = Date.now();\n const view = parseTaskView(options.when);\n const startFields = buildTaskStartFields(view);\n const deadlineEpoch = parseDeadline(options.deadline);\n\n await mutateModel(context, {\n baseUrl: commandContext.apiBaseUrl,\n request: {\n batchId: idempotencyId(\"batch\") ?? randomUUID(),\n transactions: [\n {\n action: \"INSERT\",\n clientId: options.idempotencyKey\n ? \"cli-idem\"\n : commandContext.localContext.clientId,\n clientTxId: idempotencyId(\"tx\") ?? randomUUID(),\n modelId: taskId,\n modelName: \"Task\",\n payload: {\n archivedAt: null,\n completedAt: null,\n createdAt: now,\n creatorId: userId,\n deadlineAt: deadlineEpoch,\n description,\n key: taskId.replaceAll(\"-\", \"\").slice(0, 8),\n projectId,\n sortOrder: 0,\n teamId,\n title: normalizedTitle,\n todaySortOrder: 0,\n updatedAt: now,\n workspaceId: workspace.id,\n ...startFields,\n },\n },\n ],\n },\n token: commandContext.token,\n });\n\n if (context.json) {\n writeOutput(context, {\n autoSelected,\n created: true,\n deadlineAt: deadlineEpoch,\n description,\n id: taskId,\n projectId,\n teamId,\n title: normalizedTitle,\n view,\n workspaceId: workspace.id,\n workspaceName: workspace.name,\n });\n return;\n }\n\n if (autoSelected) {\n writeInfo(context, `Auto-selected workspace: ${workspace.name}`);\n }\n\n writeSuccess(context, `Added task: ${normalizedTitle}`);\n writeInfo(context, `id: ${taskId}`);\n if (description) {\n writeInfo(context, `description: ${description}`);\n }\n};\n\nconst runTaskMutation = async (\n context: ReturnType<typeof contextFromCommand>,\n taskRef: string,\n payload: {\n workspaceRef: string | null;\n action: \"UPDATE\" | \"ARCHIVE\" | \"UNARCHIVE\";\n data: Record<string, unknown>;\n successMessage: string;\n }\n): Promise<void> => {\n const commandContext = await resolveCommandContext(context);\n const task = await resolveTaskReference(context, {\n commandContext,\n taskRef,\n workspaceRef: payload.workspaceRef,\n });\n\n await mutateModel(context, {\n baseUrl: commandContext.apiBaseUrl,\n request: {\n batchId: randomUUID(),\n transactions: [\n {\n action: payload.action,\n clientId: commandContext.localContext.clientId,\n clientTxId: randomUUID(),\n modelId: task.id,\n modelName: \"Task\",\n payload: payload.data,\n },\n ],\n },\n token: commandContext.token,\n });\n\n if (context.json) {\n writeOutput(context, {\n action: payload.action,\n id: task.id,\n ok: true,\n });\n return;\n }\n\n writeSuccess(context, `${payload.successMessage}: ${task.id}`);\n};\n\nconst resolveEntityId = (\n entities: { id: string; key: string }[],\n ref: string,\n label: string\n): string => {\n const trimmed = ref.trim();\n const lower = trimmed.toLowerCase();\n const found = entities.find(\n (e) =>\n e.id === trimmed ||\n e.key.toLowerCase() === lower ||\n e.id.startsWith(trimmed)\n );\n\n if (!found) {\n throw new Error(`${label} \"${ref}\" not found.`);\n }\n\n return found.id;\n};\n\nconst resolveProjectId = async (\n context: ReturnType<typeof contextFromCommand>,\n commandContext: Awaited<ReturnType<typeof resolveCommandContext>>,\n projectRef: string,\n workspaceRef: string | null\n): Promise<string> => {\n const { workspace } = await resolveWorkspace(context, {\n apiBaseUrl: commandContext.apiBaseUrl,\n storedWorkspaceId: commandContext.localContext.workspaceId,\n token: commandContext.token,\n workspaceRef,\n });\n const projects = await loadProjectsByWorkspace(context, {\n baseUrl: commandContext.apiBaseUrl,\n token: commandContext.token,\n workspaceId: workspace.id,\n });\n return resolveEntityId(projects, projectRef, \"Project\");\n};\n\nconst resolveTeamId = async (\n context: ReturnType<typeof contextFromCommand>,\n commandContext: Awaited<ReturnType<typeof resolveCommandContext>>,\n teamRef: string,\n workspaceRef: string | null\n): Promise<string> => {\n const { workspace } = await resolveWorkspace(context, {\n apiBaseUrl: commandContext.apiBaseUrl,\n storedWorkspaceId: commandContext.localContext.workspaceId,\n token: commandContext.token,\n workspaceRef,\n });\n const teams = await loadTeamsByWorkspace(context, {\n baseUrl: commandContext.apiBaseUrl,\n token: commandContext.token,\n workspaceId: workspace.id,\n });\n return resolveEntityId(teams, teamRef, \"Team\");\n};\n\nconst validateTaskEditOptions = (options: TaskEditOptions): void => {\n if (options.clearDescription && typeof options.description === \"string\") {\n throw new Error(\n \"Use either --description or --clear-description, not both.\"\n );\n }\n if (options.clearDeadline && typeof options.deadline === \"string\") {\n throw new Error(\"Use either --deadline or --clear-deadline, not both.\");\n }\n if (options.clearProject && typeof options.project === \"string\") {\n throw new Error(\"Use either --project or --clear-project, not both.\");\n }\n if (options.clearTeam && typeof options.team === \"string\") {\n throw new Error(\"Use either --team or --clear-team, not both.\");\n }\n};\n\nconst applyScalarEdits = (\n updates: Record<string, unknown>,\n options: TaskEditOptions\n): void => {\n if (typeof options.title === \"string\") {\n const title = options.title.trim();\n if (title.length === 0) {\n throw new Error(\"Task title cannot be empty.\");\n }\n updates.title = title;\n }\n if (options.clearDescription) {\n updates.description = null;\n } else if (typeof options.description === \"string\") {\n const description = options.description.trim();\n updates.description = description.length > 0 ? description : null;\n }\n if (typeof options.when === \"string\") {\n Object.assign(updates, buildTaskStartFields(parseTaskView(options.when)));\n }\n if (options.clearDeadline) {\n updates.deadlineAt = null;\n } else if (typeof options.deadline === \"string\") {\n updates.deadlineAt = parseDeadline(options.deadline);\n }\n};\n\nconst runTaskEdit = async (\n context: ReturnType<typeof contextFromCommand>,\n taskRef: string,\n options: TaskEditOptions,\n workspaceOverride: string | null\n): Promise<void> => {\n validateTaskEditOptions(options);\n\n const updates: Record<string, unknown> = {};\n applyScalarEdits(updates, options);\n\n const wsRef = workspaceOverride ?? normalizeWorkspaceRef(options.workspace);\n const commandContext = await resolveCommandContext(context);\n\n if (options.clearProject) {\n updates.projectId = null;\n } else if (typeof options.project === \"string\") {\n updates.projectId = await resolveProjectId(\n context,\n commandContext,\n options.project,\n wsRef\n );\n }\n\n if (options.clearTeam) {\n updates.teamId = null;\n } else if (typeof options.team === \"string\") {\n updates.teamId = await resolveTeamId(\n context,\n commandContext,\n options.team,\n wsRef\n );\n }\n\n if (Object.keys(updates).length === 0) {\n throw new Error(\n \"No updates provided. Use --title, --description, --clear-description, --when, --deadline, --clear-deadline, --project, --clear-project, --team, or --clear-team.\"\n );\n }\n\n updates.updatedAt = Date.now();\n\n await runTaskMutation(context, taskRef, {\n action: \"UPDATE\",\n data: updates,\n successMessage: \"Updated\",\n workspaceRef: wsRef,\n });\n};\n\nconst runTaskRead = async (\n context: ReturnType<typeof contextFromCommand>,\n taskRef: string,\n options: TaskTargetOptions,\n workspaceOverride: string | null\n): Promise<void> => {\n const commandContext = await resolveCommandContext(context);\n const task = await resolveTaskReference(context, {\n commandContext,\n taskRef,\n workspaceRef: workspaceOverride ?? normalizeWorkspaceRef(options.workspace),\n });\n\n if (context.json) {\n writeOutput(context, { description: task.description, id: task.id });\n return;\n }\n\n writeInfo(context, task.description ?? \"(empty)\");\n};\n\nconst runTaskAppend = async (\n context: ReturnType<typeof contextFromCommand>,\n taskRef: string,\n text: string,\n options: TaskTargetOptions,\n workspaceOverride: string | null\n): Promise<void> => {\n const commandContext = await resolveCommandContext(context);\n const task = await resolveTaskReference(context, {\n commandContext,\n taskRef,\n workspaceRef: workspaceOverride ?? normalizeWorkspaceRef(options.workspace),\n });\n\n const newDesc = `${task.description ?? \"\"}\\n${text.trim()}`;\n\n await runTaskMutation(context, task.id, {\n action: \"UPDATE\",\n data: { description: newDesc, updatedAt: Date.now() },\n successMessage: \"Appended\",\n workspaceRef: workspaceOverride ?? normalizeWorkspaceRef(options.workspace),\n });\n};\n\nconst runTaskPrepend = async (\n context: ReturnType<typeof contextFromCommand>,\n taskRef: string,\n text: string,\n options: TaskTargetOptions,\n workspaceOverride: string | null\n): Promise<void> => {\n const commandContext = await resolveCommandContext(context);\n const task = await resolveTaskReference(context, {\n commandContext,\n taskRef,\n workspaceRef: workspaceOverride ?? normalizeWorkspaceRef(options.workspace),\n });\n\n const existing = task.description ?? \"\";\n const newDesc =\n existing.length > 0 ? `${text.trim()}\\n${existing}` : text.trim();\n\n await runTaskMutation(context, task.id, {\n action: \"UPDATE\",\n data: { description: newDesc, updatedAt: Date.now() },\n successMessage: \"Prepended\",\n workspaceRef: workspaceOverride ?? normalizeWorkspaceRef(options.workspace),\n });\n};\n\nconst runTaskRandom = async (\n context: ReturnType<typeof contextFromCommand>,\n options: TaskRandomOptions,\n workspaceOverride: string | null\n): Promise<void> => {\n const commandContext = await resolveCommandContext(context);\n const requestedState = options.state ? parseTaskState(options.state) : \"open\";\n\n const { workspace, autoSelected } = await resolveWorkspace(context, {\n apiBaseUrl: commandContext.apiBaseUrl,\n storedWorkspaceId: commandContext.localContext.workspaceId,\n token: commandContext.token,\n workspaceRef: workspaceOverride ?? normalizeWorkspaceRef(options.workspace),\n });\n\n const tasks = await loadTasksByWorkspace(context, {\n baseUrl: commandContext.apiBaseUrl,\n token: commandContext.token,\n workspaceId: workspace.id,\n });\n\n const filtered = filterTasks(tasks, {\n search: null,\n state: requestedState,\n view: null,\n });\n\n if (filtered.length === 0) {\n if (context.json) {\n writeOutput(context, { task: null });\n return;\n }\n writeInfo(context, \"No tasks found.\");\n return;\n }\n\n const randomIndex = Math.floor(Math.random() * filtered.length);\n const task = filtered[randomIndex];\n\n if (!task) {\n throw new Error(\"Failed to pick a random task.\");\n }\n\n if (context.json) {\n writeOutput(context, {\n archivedAtIso: formatInstantEpoch(task.archivedAt),\n completedAtIso: formatInstantEpoch(task.completedAt),\n createdAtIso: formatInstantEpoch(task.createdAt),\n deadlineAtIso: formatDateOnlyEpoch(task.deadlineAt),\n state: getTaskState(task),\n task,\n updatedAtIso: formatInstantEpoch(task.updatedAt),\n });\n return;\n }\n\n if (autoSelected) {\n writeInfo(context, `Auto-selected workspace: ${workspace.name}`);\n }\n\n writeSuccess(context, task.title);\n writeInfo(context, `id: ${task.id}`);\n writeInfo(context, `state: ${getTaskState(task)}`);\n writeInfo(context, `workspaceId: ${task.workspaceId}`);\n writeInfo(context, `start: ${task.start}`);\n writeInfo(context, `startBucket: ${task.startBucket}`);\n writeInfo(\n context,\n `deadline: ${formatDateOnlyEpoch(task.deadlineAt) ?? \"(none)\"}`\n );\n\n if (task.description) {\n writeInfo(context, `description: ${task.description}`);\n }\n};\n\nconst resolveChecklistItemReference = async (\n context: ReturnType<typeof contextFromCommand>,\n commandContext: Awaited<ReturnType<typeof resolveCommandContext>>,\n taskId: string,\n itemRef: string\n): Promise<ChecklistItemRecord> => {\n const trimmed = itemRef.trim();\n\n if (!trimmed) {\n throw new Error(\"Checklist item id is required.\");\n }\n\n const items = await loadChecklistItemsByTask(context, {\n baseUrl: commandContext.apiBaseUrl,\n taskId,\n token: commandContext.token,\n });\n\n const exact = items.find((item) => item.id === trimmed);\n\n if (exact) {\n return exact;\n }\n\n const matches = items.filter((item) => item.id.startsWith(trimmed));\n\n if (matches.length === 0) {\n throw new Error(`Checklist item \"${trimmed}\" not found.`);\n }\n\n if (matches.length === 1) {\n const [match] = matches;\n\n if (!match) {\n throw new Error(`Checklist item \"${trimmed}\" not found.`);\n }\n\n return match;\n }\n\n throw new Error(\n `Checklist item prefix \"${trimmed}\" is ambiguous (${matches.length} matches). Use the full id.`\n );\n};\n\nconst runChecklistList = async (\n context: ReturnType<typeof contextFromCommand>,\n taskId: string,\n workspaceOption: string | undefined\n): Promise<void> => {\n const commandContext = await resolveCommandContext(context);\n const task = await resolveTaskReference(context, {\n commandContext,\n taskRef: taskId,\n workspaceRef: workspaceOption?.trim() ?? null,\n });\n const items = await loadChecklistItemsByTask(context, {\n baseUrl: commandContext.apiBaseUrl,\n taskId: task.id,\n token: commandContext.token,\n });\n const sorted = [...items].toSorted((a, b) => a.sortOrder - b.sortOrder);\n\n if (context.json) {\n writeOutput(context, { items: sorted, taskId: task.id });\n return;\n }\n\n if (sorted.length === 0) {\n writeInfo(context, \"No checklist items.\");\n return;\n }\n\n writeInfo(context, `Checklist for: ${task.title}`);\n\n for (const item of sorted) {\n const marker = item.completedAt === null ? \"[ ]\" : \"[x]\";\n writeInfo(context, `${marker} ${item.id.slice(0, 8)} ${item.title}`);\n }\n};\n\nexport const registerTaskCommands = (\n program: Command,\n workspaceOverride: string | null\n): void => {\n const task = program\n .command(\"task\")\n .alias(\"tasks\")\n .description(\"Manage tasks\")\n .addHelpText(\n \"after\",\n `\nExamples:\n donebear task list --json\n donebear task add \"Fix login bug\" --when today --json\n donebear task add \"Write tests\" --deadline 2026-03-15 --project PROJ --json\n donebear task edit 8f2c1a --deadline 2026-03-05 --json\n donebear task done 8f2c1a --json\n donebear task list --state done --limit 50 --json\n\nDate format: YYYY-MM-DD (e.g. 2026-03-15)\nTask id: full UUID or prefix of >= 4 chars (e.g. 8f2c)\nView buckets: inbox | anytime | today | upcoming | someday\n\nAgent tip: run \"donebear spec task add\" for full option reference\n`\n )\n .action(async (_options: unknown, command: Command) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runTaskList(\n context,\n { limit: DEFAULT_TASK_LIST_LIMIT, state: \"open\" },\n workspaceOverride\n );\n });\n });\n\n task\n .command(\"list\")\n .alias(\"ls\")\n .description(\"List tasks\")\n .option(\"-w, --workspace <workspace>\", \"Workspace id, slug, or exact name\")\n .option(\"-s, --state <state>\", \"open|done|archived|all\", \"open\")\n .option(\n \"-n, --limit <count>\",\n \"Maximum number of tasks\",\n (value: string): number => parsePositiveInteger(value, \"Limit\"),\n DEFAULT_TASK_LIST_LIMIT\n )\n .option(\"-q, --search <query>\", \"Filter by title or description\")\n .option(\n \"-v, --view <view>\",\n \"Filter by view (inbox|anytime|today|upcoming|someday|logbook|trash)\"\n )\n .addHelpText(\n \"after\",\n `\nExamples:\n donebear task list --json\n donebear task list --state done --json\n donebear task list --view today --json\n donebear task list --search \"login\" --limit 50 --json\n\nStates: open (default) | done | archived | all\nViews: inbox | anytime | today | upcoming | someday | logbook | trash\n`\n )\n .action(async (options: TaskListOptions, command: Command) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runTaskList(context, options, workspaceOverride);\n });\n });\n\n task\n .command(\"show\")\n .description(\"Show task details\")\n .argument(\"<id>\", \"Task id or unique prefix\")\n .option(\"-w, --workspace <workspace>\", \"Workspace id, slug, or exact name\")\n .action(\n async (taskId: string, options: TaskTargetOptions, command: Command) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runTaskShow(context, taskId, options, workspaceOverride);\n });\n }\n );\n\n task\n .command(\"read\")\n .description(\"Print the description of a task\")\n .argument(\"<id>\", \"Task id or unique prefix\")\n .option(\"-w, --workspace <workspace>\", \"Workspace id, slug, or exact name\")\n .action(\n async (taskId: string, options: TaskTargetOptions, command: Command) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runTaskRead(context, taskId, options, workspaceOverride);\n });\n }\n );\n\n task\n .command(\"append\")\n .description(\"Append text to a task's description\")\n .argument(\"<id>\", \"Task id or unique prefix\")\n .argument(\"<text>\", \"Text to append\")\n .option(\"-w, --workspace <workspace>\", \"Workspace id, slug, or exact name\")\n .action(\n async (\n taskId: string,\n text: string,\n options: TaskTargetOptions,\n command: Command\n ) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runTaskAppend(\n context,\n taskId,\n text,\n options,\n workspaceOverride\n );\n });\n }\n );\n\n task\n .command(\"prepend\")\n .description(\"Prepend text to a task's description\")\n .argument(\"<id>\", \"Task id or unique prefix\")\n .argument(\"<text>\", \"Text to prepend\")\n .option(\"-w, --workspace <workspace>\", \"Workspace id, slug, or exact name\")\n .action(\n async (\n taskId: string,\n text: string,\n options: TaskTargetOptions,\n command: Command\n ) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runTaskPrepend(\n context,\n taskId,\n text,\n options,\n workspaceOverride\n );\n });\n }\n );\n\n task\n .command(\"random\")\n .description(\"Show a random task\")\n .option(\"-w, --workspace <workspace>\", \"Workspace id, slug, or exact name\")\n .option(\"-s, --state <state>\", \"open|done|archived|all\", \"open\")\n .action(async (options: TaskRandomOptions, command: Command) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runTaskRandom(context, options, workspaceOverride);\n });\n });\n\n task\n .command(\"add\")\n .alias(\"create\")\n .description(\"Create a task\")\n .argument(\"[title]\", \"Task title (prompted interactively if omitted)\")\n .option(\"-w, --workspace <workspace>\", \"Workspace id, slug, or exact name\")\n .option(\n \"-d, --description <text>\",\n \"Task description (use --description - to read from piped stdin)\"\n )\n .option(\"--when <view>\", \"inbox|anytime|today|upcoming|someday\", \"inbox\")\n .option(\"--deadline <date>\", \"Deadline (YYYY-MM-DD or ISO datetime)\")\n .option(\"--project <key-or-id>\", \"Project key or id\")\n .option(\"--team <key-or-id>\", \"Team key or id\")\n .option(\n \"--idempotency-key <key>\",\n \"Stable key making retries safe (repeated calls create only one task)\"\n )\n .addHelpText(\n \"after\",\n `\nExamples:\n donebear task add \"Fix login bug\" --when today --json\n donebear task add \"Write tests\" --deadline 2030-03-15 --project PROJ --json\n donebear task add \"Review PR\" --when anytime --description \"Check for XSS\" --json\n echo \"Multi-line description\" | donebear task add \"My task\" --description -\n donebear task add # prompts for title interactively\n\nDate format: YYYY-MM-DD (e.g. 2030-03-15)\nView (--when): inbox | anytime | today | upcoming | someday\n`\n )\n .action(\n async (\n title: string | undefined,\n options: TaskAddOptions,\n command: Command\n ) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runTaskAdd(context, title, options, workspaceOverride);\n });\n }\n );\n\n task\n .command(\"edit\")\n .description(\"Update task fields\")\n .argument(\"<id>\", \"Task id or unique prefix\")\n .option(\"-w, --workspace <workspace>\", \"Workspace id, slug, or exact name\")\n .option(\"--title <title>\", \"Replace task title\")\n .option(\n \"--description <text>\",\n \"Replace task description (empty string clears)\"\n )\n .option(\"--clear-description\", \"Clear task description\")\n .option(\n \"--when <view>\",\n \"Set view bucket (inbox|anytime|today|upcoming|someday)\"\n )\n .option(\"--deadline <date>\", \"Set deadline (YYYY-MM-DD or ISO datetime)\")\n .option(\"--clear-deadline\", \"Clear deadline\")\n .option(\"--project <key-or-id>\", \"Set project (key or id)\")\n .option(\"--clear-project\", \"Remove project assignment\")\n .option(\"--team <key-or-id>\", \"Set team (key or id)\")\n .option(\"--clear-team\", \"Remove team assignment\")\n .action(\n async (taskId: string, options: TaskEditOptions, command: Command) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runTaskEdit(context, taskId, options, workspaceOverride);\n });\n }\n );\n\n task\n .command(\"done\")\n .alias(\"complete\")\n .description(\"Mark a task as completed\")\n .argument(\"<id>\", \"Task id or unique prefix\")\n .option(\"-w, --workspace <workspace>\", \"Workspace id, slug, or exact name\")\n .action(\n async (taskId: string, options: TaskTargetOptions, command: Command) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n const now = Date.now();\n await runTaskMutation(context, taskId, {\n action: \"UPDATE\",\n data: { completedAt: now, updatedAt: now },\n successMessage: \"Marked done\",\n workspaceRef:\n workspaceOverride ?? normalizeWorkspaceRef(options.workspace),\n });\n });\n }\n );\n\n task\n .command(\"reopen\")\n .alias(\"undo\")\n .description(\"Reopen a completed task\")\n .argument(\"<id>\", \"Task id or unique prefix\")\n .option(\"-w, --workspace <workspace>\", \"Workspace id, slug, or exact name\")\n .action(\n async (taskId: string, options: TaskTargetOptions, command: Command) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runTaskMutation(context, taskId, {\n action: \"UPDATE\",\n data: { completedAt: null, updatedAt: Date.now() },\n successMessage: \"Reopened\",\n workspaceRef:\n workspaceOverride ?? normalizeWorkspaceRef(options.workspace),\n });\n });\n }\n );\n\n task\n .command(\"archive\")\n .description(\"Archive a task\")\n .argument(\"<id>\", \"Task id or unique prefix\")\n .option(\"-w, --workspace <workspace>\", \"Workspace id, slug, or exact name\")\n .action(\n async (taskId: string, options: TaskTargetOptions, command: Command) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n const confirmed = await confirmAction(\n context,\n `Archive task \"${taskId}\"?`\n );\n if (!confirmed) {\n throw new CliError(\"Cancelled\", EXIT_CODES.CANCELLED);\n }\n await runTaskMutation(context, taskId, {\n action: \"ARCHIVE\",\n data: { archivedAt: Date.now() },\n successMessage: \"Archived\",\n workspaceRef:\n workspaceOverride ?? normalizeWorkspaceRef(options.workspace),\n });\n });\n }\n );\n\n task\n .command(\"unarchive\")\n .alias(\"restore\")\n .description(\"Unarchive a task\")\n .argument(\"<id>\", \"Task id or unique prefix\")\n .option(\"-w, --workspace <workspace>\", \"Workspace id, slug, or exact name\")\n .action(\n async (taskId: string, options: TaskTargetOptions, command: Command) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runTaskMutation(context, taskId, {\n action: \"UNARCHIVE\",\n data: {},\n successMessage: \"Unarchived\",\n workspaceRef:\n workspaceOverride ?? normalizeWorkspaceRef(options.workspace),\n });\n });\n }\n );\n\n const checklist = task\n .command(\"checklist\")\n .alias(\"cl\")\n .description(\"Manage task checklist items\")\n .argument(\"<task-id>\", \"Task id or prefix\")\n .option(\"-w, --workspace <workspace>\", \"Workspace id, slug, or exact name\")\n .action(\n async (\n taskId: string,\n options: { workspace?: string },\n command: Command\n ) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runChecklistList(context, taskId, options.workspace);\n });\n }\n );\n\n checklist\n .command(\"add\")\n .description(\"Add a checklist item\")\n .argument(\"<task-id>\", \"Task id or prefix\")\n .argument(\"<title>\", \"Item title\")\n .option(\"-w, --workspace <workspace>\", \"Workspace id, slug, or exact name\")\n .action(\n async (\n taskId: string,\n title: string,\n options: { workspace?: string },\n command: Command\n ) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n const commandContext = await resolveCommandContext(context);\n const resolvedTask = await resolveTaskReference(context, {\n commandContext,\n taskRef: taskId,\n workspaceRef: options.workspace?.trim() ?? null,\n });\n const itemId = randomUUID();\n const now = Date.now();\n await mutateModel(context, {\n baseUrl: commandContext.apiBaseUrl,\n request: {\n batchId: randomUUID(),\n transactions: [\n {\n action: \"INSERT\",\n clientId: commandContext.localContext.clientId,\n clientTxId: randomUUID(),\n modelId: itemId,\n modelName: \"TaskChecklistItem\",\n payload: {\n completedAt: null,\n createdAt: now,\n sortOrder: now,\n taskId: resolvedTask.id,\n title: title.trim(),\n updatedAt: now,\n workspaceId: resolvedTask.workspaceId,\n },\n },\n ],\n },\n token: commandContext.token,\n });\n if (context.json) {\n writeOutput(context, { created: true, id: itemId });\n return;\n }\n writeSuccess(context, `Added: ${title.trim()}`);\n });\n }\n );\n\n checklist\n .command(\"done\")\n .description(\"Mark a checklist item as complete\")\n .argument(\"<task-id>\", \"Task id or prefix\")\n .argument(\"<item-id>\", \"Checklist item id or prefix\")\n .option(\"-w, --workspace <workspace>\", \"Workspace id, slug, or exact name\")\n .action(\n async (\n taskId: string,\n itemId: string,\n options: { workspace?: string },\n command: Command\n ) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n const commandContext = await resolveCommandContext(context);\n const resolvedTask = await resolveTaskReference(context, {\n commandContext,\n taskRef: taskId,\n workspaceRef: options.workspace?.trim() ?? null,\n });\n const item = await resolveChecklistItemReference(\n context,\n commandContext,\n resolvedTask.id,\n itemId\n );\n const now = Date.now();\n await mutateModel(context, {\n baseUrl: commandContext.apiBaseUrl,\n request: {\n batchId: randomUUID(),\n transactions: [\n {\n action: \"UPDATE\",\n clientId: commandContext.localContext.clientId,\n clientTxId: randomUUID(),\n modelId: item.id,\n modelName: \"TaskChecklistItem\",\n payload: { completedAt: now, updatedAt: now },\n },\n ],\n },\n token: commandContext.token,\n });\n if (context.json) {\n writeOutput(context, { id: item.id, ok: true });\n return;\n }\n writeSuccess(context, `Marked done: ${item.title}`);\n });\n }\n );\n\n checklist\n .command(\"reopen\")\n .description(\"Reopen a completed checklist item\")\n .argument(\"<task-id>\", \"Task id or prefix\")\n .argument(\"<item-id>\", \"Checklist item id or prefix\")\n .option(\"-w, --workspace <workspace>\", \"Workspace id, slug, or exact name\")\n .action(\n async (\n taskId: string,\n itemId: string,\n options: { workspace?: string },\n command: Command\n ) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n const commandContext = await resolveCommandContext(context);\n const resolvedTask = await resolveTaskReference(context, {\n commandContext,\n taskRef: taskId,\n workspaceRef: options.workspace?.trim() ?? null,\n });\n const item = await resolveChecklistItemReference(\n context,\n commandContext,\n resolvedTask.id,\n itemId\n );\n const now = Date.now();\n await mutateModel(context, {\n baseUrl: commandContext.apiBaseUrl,\n request: {\n batchId: randomUUID(),\n transactions: [\n {\n action: \"UPDATE\",\n clientId: commandContext.localContext.clientId,\n clientTxId: randomUUID(),\n modelId: item.id,\n modelName: \"TaskChecklistItem\",\n payload: { completedAt: null, updatedAt: now },\n },\n ],\n },\n token: commandContext.token,\n });\n if (context.json) {\n writeOutput(context, { id: item.id, ok: true });\n return;\n }\n writeSuccess(context, `Reopened: ${item.title}`);\n });\n }\n );\n\n checklist\n .command(\"edit\")\n .description(\"Edit a checklist item title\")\n .argument(\"<task-id>\", \"Task id or prefix\")\n .argument(\"<item-id>\", \"Checklist item id or prefix\")\n .requiredOption(\"--title <title>\", \"New item title\")\n .option(\"-w, --workspace <workspace>\", \"Workspace id, slug, or exact name\")\n .action(\n async (\n taskId: string,\n itemId: string,\n options: { title: string; workspace?: string },\n command: Command\n ) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n const newTitle = options.title.trim();\n\n if (newTitle.length === 0) {\n throw new Error(\"Checklist item title cannot be empty.\");\n }\n\n const commandContext = await resolveCommandContext(context);\n const resolvedTask = await resolveTaskReference(context, {\n commandContext,\n taskRef: taskId,\n workspaceRef: options.workspace?.trim() ?? null,\n });\n const item = await resolveChecklistItemReference(\n context,\n commandContext,\n resolvedTask.id,\n itemId\n );\n const now = Date.now();\n await mutateModel(context, {\n baseUrl: commandContext.apiBaseUrl,\n request: {\n batchId: randomUUID(),\n transactions: [\n {\n action: \"UPDATE\",\n clientId: commandContext.localContext.clientId,\n clientTxId: randomUUID(),\n modelId: item.id,\n modelName: \"TaskChecklistItem\",\n payload: { title: newTitle, updatedAt: now },\n },\n ],\n },\n token: commandContext.token,\n });\n if (context.json) {\n writeOutput(context, { id: item.id, ok: true });\n return;\n }\n writeSuccess(context, `Updated: ${newTitle}`);\n });\n }\n );\n\n checklist\n .command(\"remove\")\n .alias(\"rm\")\n .description(\"Remove a checklist item\")\n .argument(\"<task-id>\", \"Task id or prefix\")\n .argument(\"<item-id>\", \"Checklist item id or prefix\")\n .option(\"-w, --workspace <workspace>\", \"Workspace id, slug, or exact name\")\n .action(\n async (\n taskId: string,\n itemId: string,\n options: { workspace?: string },\n command: Command\n ) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n const commandContext = await resolveCommandContext(context);\n const resolvedTask = await resolveTaskReference(context, {\n commandContext,\n taskRef: taskId,\n workspaceRef: options.workspace?.trim() ?? null,\n });\n const item = await resolveChecklistItemReference(\n context,\n commandContext,\n resolvedTask.id,\n itemId\n );\n await mutateModel(context, {\n baseUrl: commandContext.apiBaseUrl,\n request: {\n batchId: randomUUID(),\n transactions: [\n {\n action: \"ARCHIVE\",\n clientId: commandContext.localContext.clientId,\n clientTxId: randomUUID(),\n modelId: item.id,\n modelName: \"TaskChecklistItem\",\n payload: {},\n },\n ],\n },\n token: commandContext.token,\n });\n if (context.json) {\n writeOutput(context, { id: item.id, removed: true });\n return;\n }\n writeSuccess(context, `Removed: ${item.title}`);\n });\n }\n );\n};\n","import type { Command } from \"commander\";\n\nimport { resolveCommandContext } from \"../command-context\";\nimport {\n normalizeWorkspaceRef,\n parseTaskState,\n taskListHeaders,\n taskListLines,\n taskListRows,\n} from \"../command-helpers\";\nimport { parsePositiveInteger } from \"../command-parsers\";\nimport { CliError, EXIT_CODES } from \"../errors\";\nimport { loadTasksByWorkspace, loadTasksByWorkspaceIds } from \"../manage-api\";\nimport {\n copyToClipboard,\n writeFormattedRows,\n writeInfo,\n writeOutput,\n} from \"../output\";\nimport { promptForValue } from \"../prompt\";\nimport { contextFromCommand, runWithErrorHandling } from \"../runtime\";\nimport {\n resolveWorkspaceScope,\n scopeJsonFields,\n scopeLabel,\n} from \"../workspace-context\";\nimport { filterTasks } from \"./task\";\n\nconst DEFAULT_SEARCH_LIMIT = 20;\n\ninterface SearchOptions {\n workspace?: string;\n state: string;\n limit: number;\n}\n\nconst resolveQuery = async (\n context: ReturnType<typeof contextFromCommand>,\n rawQuery: string | undefined\n): Promise<string> => {\n if (rawQuery) {\n const trimmed = rawQuery.trim();\n if (trimmed.length > 0) {\n return trimmed;\n }\n }\n\n const prompted = await promptForValue(context, \"Search query\");\n\n if (prompted) {\n return prompted;\n }\n\n throw new CliError(\n \"Search query is required.\",\n EXIT_CODES.VALIDATION,\n 'Provide a query: donebear search \"my query\"'\n );\n};\n\nconst runSearch = async (\n context: ReturnType<typeof contextFromCommand>,\n query: string | undefined,\n options: SearchOptions,\n workspaceOverride: string | null\n): Promise<void> => {\n const commandContext = await resolveCommandContext(context);\n const requestedState = parseTaskState(options.state);\n const trimmedQuery = await resolveQuery(context, query);\n\n const scope = await resolveWorkspaceScope(context, {\n apiBaseUrl: commandContext.apiBaseUrl,\n storedWorkspaceId: commandContext.localContext.workspaceId,\n token: commandContext.token,\n workspaceRef: workspaceOverride ?? normalizeWorkspaceRef(options.workspace),\n });\n\n const tasks =\n scope.mode === \"all\"\n ? await loadTasksByWorkspaceIds(context, {\n baseUrl: commandContext.apiBaseUrl,\n token: commandContext.token,\n workspaceIds: scope.workspaces.map((w) => w.id),\n })\n : await loadTasksByWorkspace(context, {\n baseUrl: commandContext.apiBaseUrl,\n token: commandContext.token,\n workspaceId: scope.workspace.id,\n });\n\n const filtered = filterTasks(tasks, {\n search: trimmedQuery,\n state: requestedState,\n view: null,\n });\n\n const limited = filtered.slice(0, options.limit);\n\n if (context.json) {\n writeOutput(context, {\n ...scopeJsonFields(scope),\n count: limited.length,\n query: trimmedQuery,\n state: requestedState,\n tasks: limited,\n total: filtered.length,\n });\n return;\n }\n\n if (\n writeFormattedRows(\n context,\n filtered.length,\n taskListHeaders(),\n taskListRows(limited)\n )\n ) {\n return;\n }\n\n if (scope.mode === \"single\" && scope.autoSelected) {\n writeInfo(context, `Auto-selected workspace: ${scope.workspace.name}`);\n }\n\n if (limited.length === 0) {\n writeInfo(context, `No tasks found matching \"${trimmedQuery}\".`);\n return;\n }\n\n writeInfo(\n context,\n `${scopeLabel(scope)} — \"${trimmedQuery}\" (${limited.length}/${filtered.length})`\n );\n\n for (const line of taskListLines(limited)) {\n writeInfo(context, line);\n }\n\n if (context.copy) {\n copyToClipboard(taskListLines(limited).join(\"\\n\"));\n }\n};\n\nexport const registerSearchCommand = (\n program: Command,\n workspaceOverride: string | null\n): void => {\n program\n .command(\"search\")\n .description(\"Search tasks by title or description\")\n .argument(\"[query]\", \"Search query (prompted interactively if omitted)\")\n .option(\"-w, --workspace <workspace>\", \"Workspace id, slug, or exact name\")\n .option(\"-s, --state <state>\", \"open|done|archived|all\", \"all\")\n .option(\n \"-n, --limit <count>\",\n \"Maximum number of results\",\n (value: string): number => parsePositiveInteger(value, \"Limit\"),\n DEFAULT_SEARCH_LIMIT\n )\n .addHelpText(\n \"after\",\n `\nExamples:\n donebear search \"meeting\"\n donebear search \"launch\" --state open\n donebear search \"Q1\" --format csv --copy\n donebear search \"review\" --total\n donebear search # prompts for query interactively\n`\n )\n .action(\n async (\n query: string | undefined,\n options: SearchOptions,\n command: Command\n ) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runSearch(context, query, options, workspaceOverride);\n });\n }\n );\n};\n","// donebear spec [command] [subcommand]\n// Progressive CLI spec for agent discovery — no auth required\n\nimport type { Command } from \"commander\";\n\nimport { writeJson } from \"../output\";\nimport { contextFromCommand, runWithErrorHandling } from \"../runtime\";\n\nexport const OVERVIEW = {\n authentication: \"Set DONEBEAR_TOKEN env var, or run: donebear auth login\",\n commands: {\n \"api-key\": {\n description: \"Manage personal API keys\",\n quick_example: \"donebear api-key list --json\",\n subcommands: [\"create\", \"list\", \"revoke\"],\n },\n auth: {\n description: \"Authentication\",\n quick_example: \"donebear auth status --json\",\n subcommands: [\"login\", \"status\", \"logout\"],\n },\n context: {\n description:\n \"Current workspace snapshot: user, task counts, recent tasks, active projects\",\n quick_example: \"donebear context --json\",\n },\n doctor: {\n description:\n \"Run environment diagnostics: CLI version, auth, workspace, AI agent detection\",\n quick_example: \"donebear doctor --json\",\n },\n history: {\n description: \"Workspace audit log (recent sync actions)\",\n quick_example: \"donebear history --json\",\n },\n import: {\n description: \"Import external data into Done Bear\",\n quick_example: \"donebear import things --dry-run --json\",\n subcommands: [\"things\"],\n },\n label: {\n description: \"Manage workspace labels and task label assignments\",\n quick_example: \"donebear label list --json\",\n subcommands: [\"list\", \"show\", \"create\", \"add\", \"remove\"],\n },\n project: {\n description: \"Manage projects\",\n quick_example: \"donebear project list --json\",\n subcommands: [\n \"list\",\n \"show\",\n \"add\",\n \"edit\",\n \"done\",\n \"archive\",\n \"unarchive\",\n ],\n },\n search: {\n description: \"Search tasks by title/description across the workspace\",\n quick_example: 'donebear search \"login bug\" --json',\n },\n spec: {\n description: \"Progressive CLI spec for agent discovery (this command)\",\n quick_example: \"donebear spec task add\",\n },\n task: {\n description: \"Create and manage tasks\",\n quick_example: 'donebear task add \"Fix bug\" --when today --json',\n subcommands: [\n \"list\",\n \"show\",\n \"add\",\n \"edit\",\n \"done\",\n \"reopen\",\n \"archive\",\n \"unarchive\",\n \"read\",\n \"append\",\n \"prepend\",\n \"random\",\n \"checklist\",\n ],\n },\n team: {\n description: \"List workspace teams\",\n quick_example: \"donebear team list --json\",\n subcommands: [\"list\", \"show\"],\n },\n today: {\n description: \"List today's tasks (shortcut for task list --view today)\",\n quick_example: \"donebear today --json\",\n },\n whoami: {\n description: \"Show the current authenticated user\",\n quick_example: \"donebear whoami --json\",\n },\n workspace: {\n description: \"Manage workspaces\",\n quick_example: \"donebear workspace list --json\",\n subcommands: [\n \"list\",\n \"current\",\n \"use\",\n \"clear\",\n \"create\",\n \"join\",\n \"members\",\n \"invitations\",\n \"invite\",\n ],\n },\n },\n global_options: {\n \"--copy\": \"Copy output to clipboard\",\n \"--dry-run\": \"Preview mutations without executing\",\n \"--format\": \"text|json|csv|tsv|yaml\",\n \"--jq <expression>\": \"Filter output with a JMESPath expression\",\n \"--json\": \"Machine-readable JSON output (use this for agent scripting)\",\n \"--limit <n>\": \"Limit output to N items (for array results)\",\n \"--total\": \"Print count only\",\n \"-q, --quiet\": \"Suppress status output (implies --json)\",\n \"-y, --yes\": \"Skip confirmation prompts\",\n },\n output_behavior:\n \"Auto-detects TTY vs pipe: JSON output activates automatically when piped to another command.\",\n tip: \"Drill into any command: donebear spec <command> [subcommand] e.g. donebear spec task add\",\n workspace_targeting:\n \"Prefix any command: donebear workspace=<slug> task list\",\n};\n\n// Detailed specs keyed by \"command\" or \"command subcommand\"\nexport const COMMAND_SPECS: Record<string, object> = {\n \"api-key create\": {\n arguments: {\n label: {\n description: \"Human-readable label for the key\",\n required: true,\n type: \"string\",\n },\n },\n command: \"api-key create\",\n examples: [\n 'donebear api-key create \"Raycast\" --json',\n 'donebear api-key create \"CI\" --permissions read-only --expires 90d --json',\n 'donebear api-key create \"Scoped\" --workspaces my-org,side-project --expires 1y --json',\n ],\n json_output: {\n createdAt: \"string\",\n expiresAt: \"string | null\",\n id: \"string\",\n keyPrefix: \"string\",\n label: \"string\",\n scopes: \"string[]\",\n token: \"string\",\n workspaceIds: \"string[] | null\",\n },\n notes:\n \"The full token is only shown once at creation time. Scopes default to full-access (read, write, admin).\",\n options: {\n \"--expires\": {\n description: 'Expiration duration, e.g. \"30d\", \"90d\", \"1y\"',\n type: \"string\",\n },\n \"--permissions\": {\n default: \"full-access\",\n description:\n '\"full-access\" (read, write, admin) or \"read-only\" (read only)',\n enum: [\"full-access\", \"read-only\"],\n type: \"string\",\n },\n \"--workspaces\": {\n description: \"Comma-separated workspace slugs to restrict the key to\",\n type: \"string\",\n },\n },\n usage: \"donebear api-key create <label> [options]\",\n },\n \"api-key list\": {\n command: \"api-key list\",\n examples: [\"donebear api-key list --json\"],\n json_output: {\n keys: \"ApiKeyRecord[]\",\n },\n notes: \"Each key includes scopes, workspaceIds, and expiresAt fields.\",\n options: {},\n usage: \"donebear api-key list\",\n },\n \"api-key revoke\": {\n arguments: {\n \"key-id\": {\n description: \"The UUID of the API key to revoke\",\n required: true,\n type: \"string\",\n },\n },\n command: \"api-key revoke\",\n examples: [\"donebear api-key revoke abc12345 --json\"],\n json_output: { id: \"string\", ok: \"boolean\" },\n options: {},\n usage: \"donebear api-key revoke <key-id>\",\n },\n \"auth login\": {\n command: \"auth login\",\n examples: [\n \"donebear auth login\",\n \"donebear auth login --no-open\",\n \"donebear auth login --no-open\",\n ],\n json_output: { ok: \"boolean\", source: \"string\", user: \"{ id, email }\" },\n non_interactive:\n \"For CI/scripts, set DONEBEAR_TOKEN=<token> instead of using auth login.\",\n options: {\n \"--no-open\": {\n description: \"Print auth URL instead of opening browser\",\n type: \"boolean\",\n },\n \"--port\": {\n default: 8787,\n description: \"Loopback callback port for the OAuth redirect\",\n type: \"number\",\n },\n \"--timeout\": {\n description: \"Seconds to wait for the OAuth callback\",\n type: \"number\",\n },\n },\n usage: \"donebear auth login [options]\",\n },\n \"auth status\": {\n command: \"auth status\",\n examples: [\"donebear auth status --json\"],\n json_output: {\n authenticated: \"boolean\",\n ok: \"boolean\",\n source: \"string | null\",\n user: \"{ id, email } | null\",\n },\n options: {},\n usage: \"donebear auth status\",\n },\n context: {\n command: \"context\",\n description:\n \"Current workspace snapshot: user, task counts, recent tasks, active projects\",\n examples: [\n \"donebear context --json\",\n \"donebear context --markdown\",\n \"donebear context --tasks-limit 20 --json\",\n ],\n json_output: {\n activeProjects: \"Array<{ id, key, name, targetDate }>\",\n generatedAt: \"ISO 8601 timestamp\",\n ok: \"boolean\",\n recentTasks: \"Array<{ id, title, deadline, view }>\",\n taskCounts: \"{ open, done, archived, total }\",\n user: \"{ id, email }\",\n workspace: \"{ id, name, urlKey }\",\n },\n options: {\n \"--markdown\": {\n description: \"Output as markdown (for system prompt injection)\",\n type: \"boolean\",\n },\n \"--tasks-limit\": {\n default: 10,\n description: \"Max recent tasks to return\",\n type: \"number\",\n },\n \"--workspace\": { type: \"string\" },\n },\n usage: \"donebear context [options]\",\n },\n doctor: {\n command: \"doctor\",\n description:\n \"Run environment diagnostics: CLI version, auth status, workspace, AI agent detection\",\n examples: [\"donebear doctor\", \"donebear doctor --json\"],\n json_output: {\n checks:\n \"Array<{ name: string, status: 'pass' | 'warn' | 'fail', message: string }>\",\n ok: \"boolean\",\n },\n notes:\n \"Exits 0 if all checks pass or warn. Exits 1 if any check fails. Detects Claude Code, Cursor, Claude Desktop, and VS Code.\",\n options: {},\n usage: \"donebear doctor\",\n },\n history: {\n command: \"history\",\n examples: [\n \"donebear history --json\",\n \"donebear history --model Task --limit 20 --json\",\n ],\n json_output: {\n history: \"WorkspaceHistoryEntry[]\",\n ok: \"boolean\",\n workspace: \"WorkspaceSummary\",\n },\n options: {\n \"--limit\": { default: 50, type: \"number\" },\n \"--model\": {\n description: \"Filter by model\",\n enum: [\"Task\", \"Project\", \"Label\", \"Team\"],\n type: \"string\",\n },\n \"--workspace\": { type: \"string\" },\n },\n usage: \"donebear history [options]\",\n },\n \"import things\": {\n command: \"import things\",\n description: \"Import a Things 3 SQLite export into the selected workspace\",\n examples: [\n \"donebear import things --dry-run --json\",\n \"donebear import things --database-url ~/Backups/Things\\\\ Database.thingsdatabase --json\",\n \"donebear import things --database-url file:///Users/me/Backups/main.sqlite --workspace personal\",\n ],\n json_output: {\n counts:\n \"{ source: Record<string, number>, planned: Record<string, number> }\",\n databasePath: \"string\",\n dryRun: \"boolean\",\n execution: \"{ inserted, updated, skipped, batches }\",\n taskColumns: \"string[]\",\n workspace: \"WorkspaceSummary\",\n },\n notes:\n \"The importer reads the official Things SQLite export (`main.sqlite`). Pass `--metadata-mode note` to preserve unmapped Things-only fields in descriptions.\",\n options: {\n \"--batch-size\": {\n default: 100,\n description: \"Maximum sync mutations per batch\",\n type: \"number\",\n },\n \"--database-url\": {\n description:\n \"Path, file:// URL, sqlite:// URL, .thingsdatabase bundle, or ThingsData-* directory\",\n type: \"string\",\n },\n \"--dry-run\": {\n description: \"Plan the import without sending sync mutations\",\n type: \"boolean\",\n },\n \"--metadata-mode\": {\n default: \"none\",\n description:\n \"Preserve Things-only metadata in descriptions (`note`) or drop it (`none`)\",\n enum: [\"note\", \"none\"],\n type: \"string\",\n },\n \"--skip-teams\": {\n description:\n \"Skip importing Things Areas as Teams and TeamProject links\",\n type: \"boolean\",\n },\n \"--workspace\": {\n description: \"Workspace id, slug, or name\",\n type: \"string\",\n },\n },\n usage: \"donebear import things [options]\",\n },\n \"label list\": {\n command: \"label list\",\n examples: [\"donebear label list --json\"],\n json_output: {\n labels: \"LabelRecord[]\",\n ok: \"boolean\",\n workspace: \"WorkspaceSummary\",\n },\n options: {\n \"--sort\": {\n default: \"alpha\",\n description: \"Sort order: alpha|count\",\n enum: [\"alpha\", \"count\"],\n type: \"string\",\n },\n \"--workspace\": { type: \"string\" },\n },\n usage: \"donebear label list [options]\",\n },\n \"project add\": {\n arguments: { name: { required: true, type: \"string\" } },\n command: \"project add\",\n examples: [\n 'donebear project add \"Q2 Launch\" --json',\n 'donebear project add \"Website Redesign\" --target-date 2026-06-30 --json',\n ],\n json_output: {\n id: \"string\",\n key: \"string\",\n ok: \"boolean\",\n workspaceId: \"string\",\n },\n notes:\n \"URL slug is auto-generated from name (e.g. 'Q2 Launch' → 'q2-launch-a1b2c3d4').\",\n options: {\n \"--description\": { type: \"string\" },\n \"--idempotency-key\": {\n description:\n \"Stable key making retries safe (repeated calls create only one project)\",\n type: \"string\",\n },\n \"--target-date\": {\n description: \"Target completion date\",\n format: \"YYYY-MM-DD\",\n type: \"string\",\n },\n \"--workspace\": { type: \"string\" },\n },\n usage: \"donebear project add <name> [options]\",\n },\n \"project done\": {\n arguments: {\n id: {\n description: \"Project UUID, key, or name\",\n required: true,\n type: \"string\",\n },\n },\n command: \"project done\",\n examples: [\"donebear project done PROJ --json\"],\n json_output: { id: \"string\", ok: \"boolean\" },\n options: { \"--workspace\": { type: \"string\" } },\n usage: \"donebear project done <id> [options]\",\n },\n \"project edit\": {\n arguments: {\n id: {\n description: \"Project UUID, key, or name\",\n required: true,\n type: \"string\",\n },\n },\n command: \"project edit\",\n examples: ['donebear project edit PROJ --name \"Updated Name\" --json'],\n json_output: { action: \"string\", id: \"string\", ok: \"boolean\" },\n options: {\n \"--clear-description\": {\n description: \"Clear the project description\",\n type: \"boolean\",\n },\n \"--clear-target-date\": {\n description: \"Clear the project target date\",\n type: \"boolean\",\n },\n \"--description\": { type: \"string\" },\n \"--name\": { type: \"string\" },\n \"--status\": {\n description: \"Set status\",\n enum: [\"active\", \"done\", \"archived\"],\n type: \"string\",\n },\n \"--target-date\": { format: \"YYYY-MM-DD\", type: \"string\" },\n \"--workspace\": { type: \"string\" },\n },\n usage: \"donebear project edit <id> [options]\",\n },\n \"project list\": {\n command: \"project list\",\n examples: [\n \"donebear project list --json\",\n \"donebear project list --status all --json\",\n ],\n json_output: {\n count: \"number\",\n ok: \"boolean\",\n projects: \"ProjectRecord[]\",\n status: \"string\",\n workspace: \"WorkspaceSummary\",\n },\n options: {\n \"--status\": {\n default: \"active\",\n enum: [\"active\", \"done\", \"archived\", \"all\"],\n type: \"string\",\n },\n \"--workspace\": { type: \"string\" },\n },\n usage: \"donebear project list [options]\",\n },\n search: {\n arguments: {\n query: {\n description: \"Prompted interactively in TTY if omitted.\",\n required: false,\n type: \"string\",\n },\n },\n command: \"search\",\n examples: [\n 'donebear search \"login bug\" --json',\n 'donebear search \"Q1\" --state open --json',\n ],\n json_output: {\n count: \"number\",\n limited: \"TaskRecord[]\",\n ok: \"boolean\",\n query: \"string\",\n workspace: \"WorkspaceSummary\",\n },\n options: {\n \"--limit\": { default: 20, type: \"number\" },\n \"--state\": {\n default: \"all\",\n enum: [\"open\", \"done\", \"archived\", \"all\"],\n type: \"string\",\n },\n \"--workspace\": { type: \"string\" },\n },\n usage: \"donebear search [query] [options]\",\n },\n \"task add\": {\n arguments: {\n title: {\n description:\n \"Task title. Prompted interactively in TTY if omitted. Required in non-TTY.\",\n required: false,\n type: \"string\",\n },\n },\n command: \"task add\",\n examples: [\n 'donebear task add \"Fix login bug\" --when today --json',\n 'donebear task add \"Write tests\" --deadline 2026-03-15 --project PROJ --json',\n 'donebear task add \"Review PR\" --when anytime --description \"Triage for bugs\" --json',\n 'echo \"Multi-line description\" | donebear task add \"My task\" --description -',\n \"donebear task add # prompts for title interactively in TTY\",\n ],\n json_output: {\n created: \"boolean\",\n deadlineAt: \"number | null\",\n description: \"string | null\",\n id: \"string (UUID)\",\n projectId: \"string | null\",\n teamId: \"string | null\",\n title: \"string\",\n view: \"string\",\n workspaceId: \"string\",\n workspaceName: \"string\",\n },\n notes:\n \"Title is prompted interactively when omitted in TTY. The description is NOT read from stdin unless you pass --description - explicitly; without --description the task is created with no description (and the saved description is echoed back in the output). Task id accepts full UUID or prefix of >= 4 chars in all other task subcommands.\",\n options: {\n \"--deadline\": {\n description: \"Due date\",\n format: \"YYYY-MM-DD\",\n type: \"string\",\n },\n \"--description\": {\n description:\n \"Body / description text. Pass --description - to read from piped stdin.\",\n type: \"string\",\n },\n \"--idempotency-key\": {\n description:\n \"Stable key making retries safe (repeated calls create only one task)\",\n type: \"string\",\n },\n \"--project\": { description: \"Project id, key, or name\", type: \"string\" },\n \"--team\": { description: \"Team id, key, or name\", type: \"string\" },\n \"--when\": {\n default: \"inbox\",\n description: \"View bucket\",\n enum: [\"inbox\", \"anytime\", \"today\", \"upcoming\", \"someday\"],\n type: \"string\",\n },\n \"--workspace\": {\n description: \"Workspace id, slug, or name\",\n type: \"string\",\n },\n },\n usage: \"donebear task add [title] [options]\",\n },\n \"task append\": {\n arguments: {\n id: {\n description: \"Task UUID or prefix\",\n required: true,\n type: \"string\",\n },\n text: { required: true, type: \"string\" },\n },\n command: \"task append\",\n description: \"Append text to a task's description\",\n examples: ['donebear task append abc1 \"Additional context\" --json'],\n json_output: { id: \"string\", ok: \"boolean\" },\n options: { \"--workspace\": { type: \"string\" } },\n usage: \"donebear task append <id> <text> [options]\",\n },\n \"task archive\": {\n arguments: {\n id: {\n description: \"Task UUID or prefix\",\n required: true,\n type: \"string\",\n },\n },\n command: \"task archive\",\n examples: [\"donebear task archive abc1 --json\"],\n json_output: { id: \"string\", ok: \"boolean\" },\n options: { \"--workspace\": { type: \"string\" } },\n usage: \"donebear task archive <id> [options]\",\n },\n \"task done\": {\n arguments: {\n id: {\n description: \"Task UUID or prefix\",\n required: true,\n type: \"string\",\n },\n },\n command: \"task done\",\n examples: [\"donebear task done abc1 --json\"],\n json_output: { id: \"string\", ok: \"boolean\" },\n options: { \"--workspace\": { type: \"string\" } },\n usage: \"donebear task done <id> [options]\",\n },\n \"task edit\": {\n arguments: {\n id: {\n description: \"Task UUID or prefix (>= 4 chars)\",\n required: true,\n type: \"string\",\n },\n },\n command: \"task edit\",\n examples: [\n 'donebear task edit abc1 --title \"Updated title\" --json',\n \"donebear task edit abc1 --when today --deadline 2030-01-15 --json\",\n \"donebear task edit abc1 --clear-deadline --json\",\n ],\n json_output: { action: \"string\", id: \"string\", ok: \"boolean\" },\n options: {\n \"--clear-deadline\": {\n description: \"Clear the due date\",\n type: \"boolean\",\n },\n \"--clear-description\": {\n description: \"Clear the description\",\n type: \"boolean\",\n },\n \"--clear-project\": {\n description: \"Remove the task from its project\",\n type: \"boolean\",\n },\n \"--clear-team\": {\n description: \"Remove the task from its team\",\n type: \"boolean\",\n },\n \"--deadline\": {\n description: \"Set due date\",\n format: \"YYYY-MM-DD\",\n type: \"string\",\n },\n \"--description\": {\n description: \"Replace the task description\",\n type: \"string\",\n },\n \"--project\": { description: \"Project id, key, or name\", type: \"string\" },\n \"--team\": { description: \"Team id, key, or name\", type: \"string\" },\n \"--title\": { type: \"string\" },\n \"--when\": {\n enum: [\"inbox\", \"anytime\", \"today\", \"upcoming\", \"someday\"],\n type: \"string\",\n },\n \"--workspace\": {\n description: \"Workspace id, slug, or name\",\n type: \"string\",\n },\n },\n usage: \"donebear task edit <id> [options]\",\n },\n \"task list\": {\n command: \"task list\",\n examples: [\n \"donebear task list --json\",\n \"donebear task list --state done --json\",\n \"donebear task list --view today --json\",\n 'donebear task list --search \"login\" --json',\n ],\n json_output: {\n autoSelected: \"boolean\",\n count: \"number\",\n limited: \"TaskRecord[]\",\n ok: \"boolean\",\n search: \"string | null\",\n state: \"string\",\n view: \"string | null\",\n workspace: \"WorkspaceSummary\",\n },\n options: {\n \"--limit\": { default: 20, description: \"Max results\", type: \"number\" },\n \"--search\": {\n description: \"Filter by title/description substring\",\n type: \"string\",\n },\n \"--state\": {\n default: \"open\",\n enum: [\"open\", \"done\", \"archived\", \"all\"],\n type: \"string\",\n },\n \"--view\": {\n description: \"Filter by view bucket\",\n enum: [\"inbox\", \"anytime\", \"today\", \"upcoming\", \"someday\"],\n type: \"string\",\n },\n \"--workspace\": {\n description: \"Workspace id, slug, or name\",\n type: \"string\",\n },\n },\n usage: \"donebear task list [options]\",\n },\n \"task prepend\": {\n arguments: {\n id: {\n description: \"Task UUID or prefix\",\n required: true,\n type: \"string\",\n },\n text: { required: true, type: \"string\" },\n },\n command: \"task prepend\",\n description: \"Prepend text to a task's description\",\n examples: ['donebear task prepend abc1 \"URGENT: \" --json'],\n json_output: { id: \"string\", ok: \"boolean\" },\n options: { \"--workspace\": { type: \"string\" } },\n usage: \"donebear task prepend <id> <text> [options]\",\n },\n \"task read\": {\n arguments: {\n id: {\n description: \"Task UUID or prefix\",\n required: true,\n type: \"string\",\n },\n },\n command: \"task read\",\n description: \"Print task description as plain text\",\n examples: [\"donebear task read abc1\"],\n options: { \"--workspace\": { type: \"string\" } },\n usage: \"donebear task read <id> [options]\",\n },\n \"task reopen\": {\n arguments: {\n id: {\n description: \"Task UUID or prefix\",\n required: true,\n type: \"string\",\n },\n },\n command: \"task reopen\",\n examples: [\"donebear task reopen abc1 --json\"],\n json_output: { id: \"string\", ok: \"boolean\" },\n options: { \"--workspace\": { type: \"string\" } },\n usage: \"donebear task reopen <id> [options]\",\n },\n \"task show\": {\n arguments: {\n id: {\n description: \"Task UUID or prefix (>= 4 chars)\",\n required: true,\n type: \"string\",\n },\n },\n command: \"task show\",\n examples: [\n \"donebear task show abc1 --json\",\n \"donebear task show abc12345-0000-0000-0000-000000000000 --json\",\n ],\n json_output: {\n checklistItems: \"ChecklistItemRecord[]\",\n ok: \"boolean\",\n task: \"TaskRecord\",\n },\n options: {\n \"--workspace\": {\n description: \"Workspace id, slug, or name\",\n type: \"string\",\n },\n },\n usage: \"donebear task show <id> [options]\",\n },\n \"task unarchive\": {\n arguments: {\n id: {\n description: \"Task UUID or prefix\",\n required: true,\n type: \"string\",\n },\n },\n command: \"task unarchive\",\n examples: [\"donebear task unarchive abc1 --json\"],\n json_output: { id: \"string\", ok: \"boolean\" },\n options: { \"--workspace\": { type: \"string\" } },\n usage: \"donebear task unarchive <id> [options]\",\n },\n \"team list\": {\n command: \"team list\",\n examples: [\"donebear team list --json\"],\n json_output: {\n ok: \"boolean\",\n teams: \"TeamRecord[]\",\n workspace: \"WorkspaceSummary\",\n },\n options: { \"--workspace\": { type: \"string\" } },\n usage: \"donebear team list [options]\",\n },\n today: {\n command: \"today\",\n description: \"List today's open tasks\",\n examples: [\"donebear today --json\"],\n json_output: {\n count: \"number\",\n limited: \"TaskRecord[]\",\n ok: \"boolean\",\n workspace: \"WorkspaceSummary\",\n },\n options: { \"--workspace\": { type: \"string\" } },\n usage: \"donebear today [options]\",\n },\n whoami: {\n command: \"whoami\",\n examples: [\"donebear whoami --json\"],\n json_output: { ok: \"boolean\", source: \"string\", user: \"{ id, email }\" },\n options: {},\n usage: \"donebear whoami\",\n },\n \"workspace list\": {\n command: \"workspace list\",\n examples: [\"donebear workspace list --json\"],\n json_output: {\n currentWorkspaceId: \"string | null\",\n ok: \"boolean\",\n workspaces: \"WorkspaceSummary[]\",\n },\n options: {},\n usage: \"donebear workspace list [options]\",\n },\n \"workspace use\": {\n arguments: {\n id: {\n description: \"Workspace id, urlKey, or name\",\n required: true,\n type: \"string\",\n },\n },\n command: \"workspace use\",\n examples: [\n \"donebear workspace use my-org --json\",\n \"donebear workspace use abc12345 --json\",\n ],\n json_output: { ok: \"boolean\", workspace: \"WorkspaceSummary\" },\n notes: \"Persists selected workspace to ~/.config/donebear/context.json\",\n options: {},\n usage: \"donebear workspace use <id-or-slug>\",\n },\n};\n\n// Top-level command summaries (for \"donebear spec task\" without subcommand)\nexport const TOP_LEVEL_SPECS: Record<string, object> = {\n \"api-key\": {\n command: \"api-key\",\n description: \"Manage personal API keys\",\n subcommands: {\n create: \"Create a new API key (--permissions, --workspaces, --expires)\",\n list: \"List all API keys with scopes and expiration\",\n revoke: \"Revoke an API key by id\",\n },\n tip: \"donebear spec api-key create — get full spec for api-key create\",\n },\n auth: {\n command: \"auth\",\n description: \"Authentication\",\n non_interactive: \"Set DONEBEAR_TOKEN=<token> to skip interactive login.\",\n subcommands: {\n login: \"OAuth login (Google or GitHub)\",\n logout: \"Sign out and remove stored session\",\n status: \"Show auth status\",\n },\n tip: \"donebear spec auth login — get full spec for auth login\",\n },\n import: {\n command: \"import\",\n description: \"Import external data into Done Bear\",\n subcommands: {\n things: \"Import a Things 3 SQLite export into the selected workspace\",\n },\n tip: \"donebear spec import things — get full spec for the Things importer\",\n },\n label: {\n command: \"label\",\n description: \"Manage workspace labels and task label assignments\",\n subcommands: {\n add: \"Add a label to a task\",\n create: \"Create a new label\",\n list: \"List all labels\",\n remove: \"Remove a label from a task\",\n show: \"Get label details\",\n },\n },\n project: {\n command: \"project\",\n description: \"Manage projects\",\n subcommands: {\n add: \"Create a new project\",\n archive: \"Archive a project\",\n done: \"Mark a project as complete\",\n edit: \"Update project fields\",\n list: \"List projects (--status: active|done|archived|all)\",\n show: \"Get project details by id, key, or name\",\n unarchive: \"Restore an archived project\",\n },\n tip: \"donebear spec project add — get full spec for project add\",\n },\n task: {\n command: \"task\",\n description: \"Create and manage tasks\",\n notes: \"Task id accepts full UUID or a prefix of >= 4 chars.\",\n subcommands: {\n add: \"Create a new task\",\n append: \"Append text to a task's description\",\n archive: \"Archive a task\",\n checklist: \"Manage task checklist items\",\n done: \"Mark a task as complete\",\n edit: \"Update task fields\",\n list: \"List tasks (--state, --view, --search, --limit)\",\n prepend: \"Prepend text to a task's description\",\n random: \"Pick a random task (--state to filter)\",\n read: \"Print task description as plain text\",\n reopen: \"Reopen a completed task\",\n show: \"Get task details by id\",\n unarchive: \"Restore an archived task\",\n },\n tip: \"donebear spec task add — get full spec for task add\",\n },\n team: {\n command: \"team\",\n description: \"List workspace teams\",\n subcommands: { list: \"List all teams\", show: \"Get team details\" },\n },\n workspace: {\n command: \"workspace\",\n description: \"Manage workspaces\",\n subcommands: {\n clear: \"Clear the default workspace\",\n create: \"Create a new workspace\",\n current: \"Show the active workspace\",\n invitations: \"List pending invitations\",\n invite: \"Invite a user by email\",\n join: \"Join a workspace by invite\",\n list: \"List all workspaces\",\n members: \"List workspace members\",\n use: \"Set the default workspace\",\n },\n tip: \"donebear spec workspace use — get full spec for workspace use\",\n },\n};\n\nconst runSpec = (\n _context: ReturnType<typeof contextFromCommand>,\n args: string[]\n): void => {\n // No args: return overview\n if (args.length === 0) {\n writeJson({ ok: true, ...OVERVIEW });\n return;\n }\n\n // Build lookup key: \"task add\" or just \"task\"\n const key = args.join(\" \");\n\n // Check detailed spec first\n const detail = COMMAND_SPECS[key];\n if (detail) {\n writeJson({ ok: true, ...detail });\n return;\n }\n\n // Check top-level command summary\n const topLevel = TOP_LEVEL_SPECS[key];\n if (topLevel) {\n writeJson({ ok: true, ...topLevel });\n return;\n }\n\n writeJson({\n error: {\n message: `No spec found for \"${key}\". Run \\`donebear spec\\` to see all commands.`,\n },\n ok: false,\n });\n};\n\nexport const registerSpecCommand = (program: Command): void => {\n program\n .command(\"spec\")\n .description(\"Progressive CLI spec for agent discovery — no auth required\")\n .argument(\"[command]\", \"Command name (e.g. task, project)\")\n .argument(\"[subcommand]\", \"Subcommand name (e.g. add, list)\")\n .addHelpText(\n \"after\",\n `\nExamples:\n donebear spec Full CLI overview (~500 tokens)\n donebear spec task All task subcommands\n donebear spec task add Detailed spec: options, output shape, examples\n donebear spec project list Detailed spec for project list\n donebear spec import things Detailed spec for the Things importer\n donebear spec search Detailed spec for search\n donebear spec auth login Auth login options and non-interactive notes\n`\n )\n .action(\n async (\n command: string | undefined,\n subcommand: string | undefined,\n _options: unknown,\n cmd: Command\n ) => {\n const context = contextFromCommand(cmd);\n await runWithErrorHandling(context, () => {\n const args: string[] = [];\n if (command) {\n args.push(command.trim().toLowerCase());\n }\n if (subcommand) {\n args.push(subcommand.trim().toLowerCase());\n }\n runSpec(context, args);\n return Promise.resolve();\n });\n }\n );\n};\n","// donebear team [list|show]\n// donebear team list [--workspace <ws>]\n// donebear team show <id-or-key> [--workspace <ws>]\n\nimport type { Command } from \"commander\";\n\nimport { resolveCommandContext } from \"../command-context\";\nimport { findByRef, normalizeWorkspaceRef } from \"../command-helpers\";\nimport { loadTeamsByWorkspace, loadTeamsByWorkspaceIds } from \"../manage-api\";\nimport {\n writeFormattedRows,\n writeInfo,\n writeOutput,\n writeSuccess,\n} from \"../output\";\nimport { contextFromCommand, runWithErrorHandling } from \"../runtime\";\nimport {\n resolveWorkspace,\n resolveWorkspaceScope,\n scopeJsonFields,\n scopeLabel,\n} from \"../workspace-context\";\n\ninterface TeamListOptions {\n workspace?: string;\n}\n\ninterface TeamShowOptions {\n workspace?: string;\n}\n\nconst runTeamList = async (\n context: ReturnType<typeof contextFromCommand>,\n workspaceOverride: string | null,\n options: TeamListOptions\n): Promise<void> => {\n const commandContext = await resolveCommandContext(context);\n\n const scope = await resolveWorkspaceScope(context, {\n apiBaseUrl: commandContext.apiBaseUrl,\n storedWorkspaceId: commandContext.localContext.workspaceId,\n token: commandContext.token,\n workspaceRef: workspaceOverride ?? normalizeWorkspaceRef(options.workspace),\n });\n\n const teams =\n scope.mode === \"all\"\n ? await loadTeamsByWorkspaceIds(context, {\n baseUrl: commandContext.apiBaseUrl,\n token: commandContext.token,\n workspaceIds: scope.workspaces.map((w) => w.id),\n })\n : await loadTeamsByWorkspace(context, {\n baseUrl: commandContext.apiBaseUrl,\n token: commandContext.token,\n workspaceId: scope.workspace.id,\n });\n\n if (context.json) {\n writeOutput(context, {\n ...scopeJsonFields(scope),\n teams,\n });\n return;\n }\n\n const headers = [\"id\", \"key\", \"name\"];\n const rows = teams.map((t) => [t.id, t.key, t.name]);\n\n if (writeFormattedRows(context, teams.length, headers, rows)) {\n return;\n }\n\n if (teams.length === 0) {\n writeInfo(context, \"No teams found.\");\n return;\n }\n\n writeInfo(context, `Teams in ${scopeLabel(scope)}:`);\n\n for (const team of teams) {\n writeInfo(context, `${team.id.slice(0, 8)} [${team.key}] ${team.name}`);\n }\n};\n\nconst runTeamShow = async (\n context: ReturnType<typeof contextFromCommand>,\n teamRef: string,\n workspaceOverride: string | null,\n options: TeamShowOptions\n): Promise<void> => {\n const commandContext = await resolveCommandContext(context);\n\n const { workspace } = await resolveWorkspace(context, {\n apiBaseUrl: commandContext.apiBaseUrl,\n storedWorkspaceId: commandContext.localContext.workspaceId,\n token: commandContext.token,\n workspaceRef: workspaceOverride ?? normalizeWorkspaceRef(options.workspace),\n });\n\n const teams = await loadTeamsByWorkspace(context, {\n baseUrl: commandContext.apiBaseUrl,\n token: commandContext.token,\n workspaceId: workspace.id,\n });\n\n const team = findByRef(teamRef.trim(), teams);\n\n if (!team) {\n throw new Error(`Team \"${teamRef}\" not found. Run \\`donebear team list\\`.`);\n }\n\n if (context.json) {\n writeOutput(context, { team, workspace });\n return;\n }\n\n writeSuccess(context, team.name);\n writeInfo(context, `id: ${team.id}`);\n writeInfo(context, `key: ${team.key}`);\n writeInfo(context, `name: ${team.name}`);\n writeInfo(context, `description: ${team.description ?? \"(none)\"}`);\n writeInfo(context, `workspaceId: ${team.workspaceId ?? \"(none)\"}`);\n};\n\nexport const registerTeamCommands = (\n program: Command,\n workspaceOverride: string | null\n): void => {\n const team = program\n .command(\"team\")\n .alias(\"teams\")\n .description(\"Manage teams\")\n .addHelpText(\n \"after\",\n `\nExamples:\n donebear team\n donebear team list\n donebear team show engineering-a1b2c3d4\n donebear team show Engineering\n donebear team list --format csv\n`\n )\n .action(async (_options: unknown, command: Command) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runTeamList(context, workspaceOverride, {});\n });\n });\n\n team\n .command(\"list\")\n .alias(\"ls\")\n .description(\"List teams in the current or specified workspace\")\n .option(\"-w, --workspace <workspace>\", \"Workspace id, slug, or exact name\")\n .action(async (options: TeamListOptions, command: Command) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runTeamList(context, workspaceOverride, options);\n });\n });\n\n team\n .command(\"show\")\n .description(\"Show team details\")\n .argument(\"<ref>\", \"Team id, key, slug, name, or id prefix\")\n .option(\"-w, --workspace <workspace>\", \"Workspace id, slug, or exact name\")\n .action(\n async (teamRef: string, options: TeamShowOptions, command: Command) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runTeamShow(context, teamRef, workspaceOverride, options);\n });\n }\n );\n};\n","import type { Command } from \"commander\";\n\nimport { resolveCommandContext } from \"../command-context\";\nimport {\n normalizeWorkspaceRef,\n taskListHeaders,\n taskListLines,\n taskListRows,\n} from \"../command-helpers\";\nimport { parsePositiveInteger } from \"../command-parsers\";\nimport { loadTasksByWorkspace, loadTasksByWorkspaceIds } from \"../manage-api\";\nimport {\n copyToClipboard,\n writeFormattedRows,\n writeInfo,\n writeOutput,\n} from \"../output\";\nimport { contextFromCommand, runWithErrorHandling } from \"../runtime\";\nimport { resolveTaskView } from \"../task-defaults\";\nimport type { TaskRecord } from \"../types\";\nimport {\n resolveWorkspaceScope,\n scopeJsonFields,\n scopeLabel,\n} from \"../workspace-context\";\n\nconst DEFAULT_TODAY_LIMIT = 20;\n\ninterface TodayOptions {\n workspace?: string;\n limit: number;\n}\n\nconst filterToday = (tasks: TaskRecord[]): TaskRecord[] =>\n tasks.filter((task) => resolveTaskView(task) === \"today\");\n\nconst runToday = async (\n context: ReturnType<typeof contextFromCommand>,\n options: TodayOptions,\n workspaceOverride: string | null\n): Promise<void> => {\n const commandContext = await resolveCommandContext(context);\n\n const scope = await resolveWorkspaceScope(context, {\n apiBaseUrl: commandContext.apiBaseUrl,\n storedWorkspaceId: commandContext.localContext.workspaceId,\n token: commandContext.token,\n workspaceRef: workspaceOverride ?? normalizeWorkspaceRef(options.workspace),\n });\n\n const tasks =\n scope.mode === \"all\"\n ? await loadTasksByWorkspaceIds(context, {\n baseUrl: commandContext.apiBaseUrl,\n token: commandContext.token,\n workspaceIds: scope.workspaces.map((w) => w.id),\n })\n : await loadTasksByWorkspace(context, {\n baseUrl: commandContext.apiBaseUrl,\n token: commandContext.token,\n workspaceId: scope.workspace.id,\n });\n\n const todayTasks = filterToday(tasks);\n const limited = todayTasks.slice(0, options.limit);\n\n if (context.json) {\n writeOutput(context, {\n ...scopeJsonFields(scope),\n count: limited.length,\n tasks: limited,\n total: todayTasks.length,\n });\n return;\n }\n\n if (\n writeFormattedRows(\n context,\n todayTasks.length,\n taskListHeaders(),\n taskListRows(limited)\n )\n ) {\n return;\n }\n\n if (scope.mode === \"single\" && scope.autoSelected) {\n writeInfo(context, `Auto-selected workspace: ${scope.workspace.name}`);\n }\n\n if (limited.length === 0) {\n writeInfo(context, \"No tasks for today.\");\n return;\n }\n\n writeInfo(\n context,\n `${scopeLabel(scope)} — Today (${limited.length}/${todayTasks.length})`\n );\n\n for (const line of taskListLines(limited)) {\n writeInfo(context, line);\n }\n\n if (context.copy) {\n copyToClipboard(taskListLines(limited).join(\"\\n\"));\n }\n};\n\nexport const registerTodayCommand = (\n program: Command,\n workspaceOverride: string | null\n): void => {\n program\n .command(\"today\")\n .description(\"List today's tasks\")\n .option(\"-w, --workspace <workspace>\", \"Workspace id, slug, or exact name\")\n .option(\n \"-n, --limit <count>\",\n \"Maximum number of tasks\",\n (value: string): number => parsePositiveInteger(value, \"Limit\"),\n DEFAULT_TODAY_LIMIT\n )\n .addHelpText(\n \"after\",\n `\nExamples:\n donebear today\n donebear today --limit 10\n donebear today --format csv\n donebear today --total\n`\n )\n .action(async (options: TodayOptions, command: Command) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runToday(context, options, workspaceOverride);\n });\n });\n};\n","import type { Command } from \"commander\";\n\nimport { resolveAuthToken } from \"../auth-session\";\nimport { EXIT_CODES } from \"../errors\";\nimport { loadViewer, resolveApiBaseUrl } from \"../manage-api\";\nimport { writeInfo, writeOutput, writeSuccess } from \"../output\";\nimport { contextFromCommand, runWithErrorHandling } from \"../runtime\";\nimport { resolveSupabaseConfig } from \"../supabase\";\n\nconst runWhoAmI = async (\n context: ReturnType<typeof contextFromCommand>\n): Promise<void> => {\n let supabaseConfig: ReturnType<typeof resolveSupabaseConfig> | null = null;\n try {\n supabaseConfig = resolveSupabaseConfig();\n } catch {\n supabaseConfig = null;\n }\n\n const resolvedToken = await resolveAuthToken(context, supabaseConfig);\n\n if (!resolvedToken) {\n process.exitCode = EXIT_CODES.AUTH_REQUIRED;\n\n if (context.json) {\n writeOutput(context, {\n error: {\n exitCode: EXIT_CODES.AUTH_REQUIRED,\n message: \"Not authenticated\",\n },\n ok: false,\n });\n return;\n }\n\n writeInfo(context, \"Not authenticated.\");\n writeInfo(context, \"Run `donebear auth login`.\");\n return;\n }\n\n const user = await loadViewer(context, {\n baseUrl: resolveApiBaseUrl(context),\n token: resolvedToken.token,\n });\n\n if (context.json) {\n writeOutput(context, {\n ok: true,\n source: resolvedToken.source,\n user: {\n email: user.email ?? null,\n id: user.id,\n },\n });\n return;\n }\n\n writeSuccess(context, \"Authenticated user:\");\n writeInfo(context, `id: ${user.id}`);\n writeInfo(context, `email: ${user.email ?? \"(none)\"}`);\n writeInfo(context, `source: ${resolvedToken.source}`);\n};\n\nexport const registerWhoAmICommand = (program: Command): void => {\n program\n .command(\"whoami\")\n .alias(\"me\")\n .description(\"Show the current authenticated user\")\n .action(async (_options: unknown, command: Command) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runWhoAmI(context);\n });\n });\n};\n","import type { Command } from \"commander\";\n\nimport { resolveCommandContext } from \"../command-context\";\nimport { setCurrentWorkspace } from \"../context-store\";\nimport {\n createWorkspace,\n createWorkspaceInvitation,\n joinWorkspace,\n listWorkspaceInvitations,\n listWorkspaceMembers,\n listWorkspaces,\n} from \"../manage-api\";\nimport {\n copyToClipboard,\n writeCsv,\n writeInfo,\n writeOutput,\n writeSuccess,\n writeTotal,\n writeTsv,\n} from \"../output\";\nimport { contextFromCommand, runWithErrorHandling } from \"../runtime\";\nimport {\n isValidWorkspaceUrlKey,\n resolveWorkspace,\n toWorkspaceUrlKey,\n} from \"../workspace-context\";\n\ninterface WorkspaceCreateOptions {\n slug?: string;\n logoUrl?: string;\n use: boolean;\n}\n\ninterface WorkspaceJoinOptions {\n use: boolean;\n}\n\ninterface WorkspaceMembersOptions {\n format?: string;\n total?: boolean;\n}\n\ninterface WorkspaceInviteOptions {\n email?: string;\n role?: string;\n}\n\nconst findWorkspace = (\n workspaceRef: string,\n workspaces: Awaited<ReturnType<typeof listWorkspaces>>\n) => {\n const normalizedReference = workspaceRef.trim().toLowerCase();\n\n return workspaces.find((workspace) => {\n if (workspace.id === workspaceRef) {\n return true;\n }\n\n if (workspace.urlKey?.toLowerCase() === normalizedReference) {\n return true;\n }\n\n return workspace.name.toLowerCase() === normalizedReference;\n });\n};\n\nconst writeCurrentWorkspaceNotAvailable = (\n context: ReturnType<typeof contextFromCommand>,\n message: string\n): void => {\n if (context.json) {\n writeOutput(context, {\n workspace: null,\n });\n return;\n }\n\n writeInfo(context, message);\n writeInfo(context, \"Run `donebear workspace use <id-or-slug>`.\");\n};\n\nconst runWorkspaceList = async (\n context: ReturnType<typeof contextFromCommand>\n) => {\n const commandContext = await resolveCommandContext(context);\n\n const workspaces = await listWorkspaces(context, {\n baseUrl: commandContext.apiBaseUrl,\n token: commandContext.token,\n });\n\n if (context.json) {\n writeOutput(context, {\n currentWorkspaceId: commandContext.localContext.workspaceId,\n workspaces,\n });\n return;\n }\n\n if (workspaces.length === 0) {\n writeInfo(context, \"No workspaces found.\");\n return;\n }\n\n writeInfo(context, \"Workspaces:\");\n\n for (const workspace of workspaces) {\n const marker =\n workspace.id === commandContext.localContext.workspaceId ? \"*\" : \" \";\n\n writeInfo(\n context,\n `${marker} ${workspace.id} ${workspace.name}${workspace.urlKey ? ` (${workspace.urlKey})` : \"\"} role=${workspace.role}`\n );\n }\n};\n\nconst runWorkspaceCurrent = async (\n context: ReturnType<typeof contextFromCommand>\n): Promise<void> => {\n const commandContext = await resolveCommandContext(context);\n\n if (!commandContext.localContext.workspaceId) {\n writeCurrentWorkspaceNotAvailable(\n context,\n \"No default workspace selected.\"\n );\n return;\n }\n\n const workspaces = await listWorkspaces(context, {\n baseUrl: commandContext.apiBaseUrl,\n token: commandContext.token,\n });\n\n const workspace = workspaces.find(\n (item) => item.id === commandContext.localContext.workspaceId\n );\n\n if (!workspace) {\n writeCurrentWorkspaceNotAvailable(\n context,\n \"Saved workspace is no longer accessible.\"\n );\n return;\n }\n\n if (context.json) {\n writeOutput(context, {\n workspace,\n });\n return;\n }\n\n writeSuccess(context, `Current workspace: ${workspace.name}`);\n writeInfo(context, `id: ${workspace.id}`);\n writeInfo(context, `slug: ${workspace.urlKey ?? \"(none)\"}`);\n writeInfo(context, `role: ${workspace.role}`);\n};\n\nconst runWorkspaceUse = async (\n context: ReturnType<typeof contextFromCommand>,\n reference: string\n): Promise<void> => {\n const commandContext = await resolveCommandContext(context);\n\n const workspaces = await listWorkspaces(context, {\n baseUrl: commandContext.apiBaseUrl,\n token: commandContext.token,\n });\n\n const selected = findWorkspace(reference, workspaces);\n\n if (!selected) {\n throw new Error(\n `Workspace \"${reference}\" not found. Run \\`donebear workspace list\\`.`\n );\n }\n\n await setCurrentWorkspace(selected.id);\n\n if (context.json) {\n writeOutput(context, {\n selected: true,\n workspace: selected,\n });\n return;\n }\n\n writeSuccess(context, `Selected workspace: ${selected.name}`);\n writeInfo(context, `id: ${selected.id}`);\n};\n\nconst runWorkspaceClear = async (\n context: ReturnType<typeof contextFromCommand>\n): Promise<void> => {\n await setCurrentWorkspace(null);\n\n if (context.json) {\n writeOutput(context, {\n cleared: true,\n workspace: null,\n });\n return;\n }\n\n writeSuccess(context, \"Cleared current workspace.\");\n};\n\nconst runWorkspaceCreate = async (\n context: ReturnType<typeof contextFromCommand>,\n name: string,\n options: WorkspaceCreateOptions\n): Promise<void> => {\n const commandContext = await resolveCommandContext(context);\n\n const slug = (options.slug ?? toWorkspaceUrlKey(name)).trim();\n\n if (!isValidWorkspaceUrlKey(slug)) {\n throw new Error(\n \"Workspace slug must be lowercase alphanumeric with hyphens and at least 3 characters\"\n );\n }\n\n const workspace = await createWorkspace(context, {\n baseUrl: commandContext.apiBaseUrl,\n body: {\n logoUrl: options.logoUrl,\n name,\n urlKey: slug,\n },\n token: commandContext.token,\n });\n\n if (options.use) {\n await setCurrentWorkspace(workspace.id);\n }\n\n if (context.json) {\n writeOutput(context, {\n selected: options.use,\n workspace,\n });\n return;\n }\n\n writeSuccess(context, `Created workspace: ${workspace.name}`);\n writeInfo(context, `id: ${workspace.id}`);\n writeInfo(context, `slug: ${workspace.urlKey ?? slug}`);\n\n if (options.use) {\n writeInfo(context, \"Set as current workspace.\");\n }\n};\n\nconst runWorkspaceJoin = async (\n context: ReturnType<typeof contextFromCommand>,\n code: string,\n options: WorkspaceJoinOptions\n): Promise<void> => {\n const commandContext = await resolveCommandContext(context);\n const trimmedCode = code.trim();\n\n if (!trimmedCode) {\n throw new Error(\"Invitation code is required.\");\n }\n\n const joined = await joinWorkspace(context, {\n baseUrl: commandContext.apiBaseUrl,\n code: trimmedCode,\n token: commandContext.token,\n });\n\n if (options.use) {\n await setCurrentWorkspace(joined.workspace.id);\n }\n\n if (context.json) {\n writeOutput(context, {\n role: joined.role,\n selected: options.use,\n workspace: joined.workspace,\n });\n return;\n }\n\n writeSuccess(context, `Joined workspace: ${joined.workspace.name}`);\n writeInfo(context, `id: ${joined.workspace.id}`);\n writeInfo(context, `role: ${joined.role}`);\n\n if (options.use) {\n writeInfo(context, \"Set as current workspace.\");\n }\n};\n\nconst runWorkspaceMembers = async (\n context: ReturnType<typeof contextFromCommand>,\n workspaceRefArg: string | undefined,\n workspaceOverride: string | null,\n options: WorkspaceMembersOptions\n): Promise<void> => {\n const commandContext = await resolveCommandContext(context);\n\n const { workspace } = await resolveWorkspace(context, {\n apiBaseUrl: commandContext.apiBaseUrl,\n storedWorkspaceId: commandContext.localContext.workspaceId,\n token: commandContext.token,\n workspaceRef: workspaceOverride ?? workspaceRefArg ?? null,\n });\n\n const members = await listWorkspaceMembers(context, {\n baseUrl: commandContext.apiBaseUrl,\n token: commandContext.token,\n workspaceId: workspace.id,\n });\n\n if (context.json) {\n writeOutput(context, { members, workspace });\n return;\n }\n\n if (context.total) {\n writeTotal(context, members.length);\n return;\n }\n\n const format = options.format?.trim().toLowerCase() ?? context.format;\n\n if (format === \"csv\") {\n writeCsv(\n [\"userId\", \"name\", \"email\", \"role\"],\n members.map((m) => [\n m.userId,\n m.user.name ?? \"\",\n m.user.email ?? \"\",\n m.role,\n ])\n );\n return;\n }\n\n if (format === \"tsv\") {\n writeTsv(\n [\"userId\", \"name\", \"email\", \"role\"],\n members.map((m) => [\n m.userId,\n m.user.name ?? \"\",\n m.user.email ?? \"\",\n m.role,\n ])\n );\n return;\n }\n\n if (members.length === 0) {\n writeInfo(context, \"No members found.\");\n return;\n }\n\n writeInfo(context, `Members of ${workspace.name}:`);\n\n for (const member of members) {\n writeInfo(\n context,\n `${member.userId} ${member.user.name ?? \"(no name)\"} ${member.user.email ?? \"(no email)\"} ${member.role}`\n );\n }\n};\n\nconst runWorkspaceInvitations = async (\n context: ReturnType<typeof contextFromCommand>,\n workspaceRefArg: string | undefined,\n workspaceOverride: string | null\n): Promise<void> => {\n const commandContext = await resolveCommandContext(context);\n\n const { workspace } = await resolveWorkspace(context, {\n apiBaseUrl: commandContext.apiBaseUrl,\n storedWorkspaceId: commandContext.localContext.workspaceId,\n token: commandContext.token,\n workspaceRef: workspaceOverride ?? workspaceRefArg ?? null,\n });\n\n const invitations = await listWorkspaceInvitations(context, {\n baseUrl: commandContext.apiBaseUrl,\n token: commandContext.token,\n workspaceId: workspace.id,\n });\n\n if (context.json) {\n writeOutput(context, { invitations, workspace });\n return;\n }\n\n if (invitations.length === 0) {\n writeInfo(context, \"No invitations found.\");\n return;\n }\n\n writeInfo(context, `Invitations for ${workspace.name}:`);\n\n for (const invitation of invitations) {\n const used = invitation.usedAt ? \"yes\" : \"no\";\n writeInfo(\n context,\n `${invitation.id.slice(0, 8)} ${invitation.email ?? \"(open)\"} ${invitation.role} expires=${invitation.expiresAt} used=${used}`\n );\n }\n};\n\nconst runWorkspaceInvite = async (\n context: ReturnType<typeof contextFromCommand>,\n workspaceRefArg: string | undefined,\n workspaceOverride: string | null,\n options: WorkspaceInviteOptions\n): Promise<void> => {\n const commandContext = await resolveCommandContext(context);\n\n const { workspace } = await resolveWorkspace(context, {\n apiBaseUrl: commandContext.apiBaseUrl,\n storedWorkspaceId: commandContext.localContext.workspaceId,\n token: commandContext.token,\n workspaceRef: workspaceOverride ?? workspaceRefArg ?? null,\n });\n\n const invitation = await createWorkspaceInvitation(context, {\n baseUrl: commandContext.apiBaseUrl,\n email: options.email,\n role: options.role ?? \"member\",\n token: commandContext.token,\n workspaceId: workspace.id,\n });\n\n if (context.json) {\n writeOutput(context, { invitation, workspace });\n return;\n }\n\n writeSuccess(context, `Invitation created for ${workspace.name}`);\n writeInfo(context, `code: ${invitation.code}`);\n writeInfo(context, `role: ${invitation.role}`);\n writeInfo(context, `expires: ${invitation.expiresAt}`);\n\n if (invitation.email) {\n writeInfo(context, `email: ${invitation.email}`);\n }\n\n const link = `${commandContext.apiBaseUrl}/invite/${invitation.code}`;\n writeInfo(context, `link: ${link}`);\n\n if (context.copy) {\n const copied = copyToClipboard(link);\n if (copied) {\n writeInfo(context, \"Link copied to clipboard.\");\n }\n }\n};\n\nexport const registerWorkspaceCommands = (\n program: Command,\n workspaceOverride: string | null\n): void => {\n const workspace = program\n .command(\"workspace\")\n .alias(\"ws\")\n .description(\"Manage workspaces\")\n .addHelpText(\n \"after\",\n `\nExamples:\n donebear workspace\n donebear workspace use personal\n donebear workspace create \"Personal\" --slug personal\n donebear workspace join ABCD2345\n donebear workspace members\n donebear workspace invitations\n donebear workspace invite --email user@example.com --role member\n`\n )\n .action(async (_options: unknown, command: Command) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runWorkspaceList(context);\n });\n });\n\n workspace\n .command(\"list\")\n .alias(\"ls\")\n .description(\"List workspaces available to the current user\")\n .action(async (_options: unknown, command: Command) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runWorkspaceList(context);\n });\n });\n\n workspace\n .command(\"current\")\n .description(\"Show the current default workspace\")\n .action(async (_options: unknown, command: Command) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runWorkspaceCurrent(context);\n });\n });\n\n workspace\n .command(\"use\")\n .description(\"Set the default workspace\")\n .argument(\"<workspace>\", \"Workspace id, slug, or exact name\")\n .action(\n async (workspaceRef: string, _options: unknown, command: Command) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runWorkspaceUse(context, workspaceRef);\n });\n }\n );\n\n workspace\n .command(\"clear\")\n .description(\"Clear the default workspace\")\n .action(async (_options: unknown, command: Command) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runWorkspaceClear(context);\n });\n });\n\n workspace\n .command(\"create\")\n .description(\"Create a workspace\")\n .argument(\"<name>\", \"Workspace display name\")\n .option(\"--slug <slug>\", \"Workspace urlKey slug\")\n .option(\"--logo-url <url>\", \"Workspace logo URL\")\n .option(\"--no-use\", \"Do not set as current workspace\")\n .action(\n async (\n name: string,\n options: WorkspaceCreateOptions,\n command: Command\n ) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runWorkspaceCreate(context, name, options);\n });\n }\n );\n\n workspace\n .command(\"join\")\n .description(\"Join a workspace with an invitation code\")\n .argument(\"<code>\", \"Invitation code\")\n .option(\"--no-use\", \"Do not set joined workspace as current\")\n .action(\n async (code: string, options: WorkspaceJoinOptions, command: Command) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runWorkspaceJoin(context, code, options);\n });\n }\n );\n\n workspace\n .command(\"members\")\n .description(\"List members of the current or specified workspace\")\n .argument(\"[workspace]\", \"Workspace id, slug, or exact name\")\n .option(\"--format <format>\", \"Output format: text|json|csv|tsv\")\n .option(\"--total\", \"Print member count only\")\n .action(\n async (\n workspaceRef: string | undefined,\n options: WorkspaceMembersOptions,\n command: Command\n ) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runWorkspaceMembers(\n context,\n workspaceRef,\n workspaceOverride,\n options\n );\n });\n }\n );\n\n workspace\n .command(\"invitations\")\n .alias(\"invites\")\n .description(\n \"List pending invitations for the current or specified workspace\"\n )\n .argument(\"[workspace]\", \"Workspace id, slug, or exact name\")\n .action(\n async (\n workspaceRef: string | undefined,\n _options: unknown,\n command: Command\n ) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runWorkspaceInvitations(\n context,\n workspaceRef,\n workspaceOverride\n );\n });\n }\n );\n\n workspace\n .command(\"invite\")\n .description(\"Create an invitation for the current or specified workspace\")\n .argument(\"[workspace]\", \"Workspace id, slug, or exact name\")\n .option(\"--email <email>\", \"Email address to invite\")\n .option(\"--role <role>\", \"Role for the invitee: member|admin\", \"member\")\n .action(\n async (\n workspaceRef: string | undefined,\n options: WorkspaceInviteOptions,\n command: Command\n ) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runWorkspaceInvite(\n context,\n workspaceRef,\n workspaceOverride,\n options\n );\n });\n }\n );\n};\n","import { Command } from \"commander\";\n\nimport { registerApiKeyCommands } from \"./commands/api-key\";\nimport { registerAuthCommands } from \"./commands/auth\";\nimport { registerContextCommand } from \"./commands/context\";\nimport { registerDoctorCommand } from \"./commands/doctor\";\nimport { registerHistoryCommand } from \"./commands/history\";\nimport { registerImportCommands } from \"./commands/import\";\nimport { registerLabelCommands } from \"./commands/label\";\nimport { registerProjectCommands } from \"./commands/project\";\nimport { registerSearchCommand } from \"./commands/search\";\nimport { registerSpecCommand } from \"./commands/spec\";\nimport { registerTaskCommands } from \"./commands/task\";\nimport { registerTeamCommands } from \"./commands/team\";\nimport { registerTodayCommand } from \"./commands/today\";\nimport { registerWhoAmICommand } from \"./commands/whoami\";\nimport { registerWorkspaceCommands } from \"./commands/workspace\";\nimport { CLI_NAME } from \"./constants\";\nimport { packageManifest } from \"./manifest\";\nimport { addGlobalOptions } from \"./options\";\n\nexport const buildProgram = (\n workspaceOverride: string | null = null\n): Command => {\n const program = new Command();\n\n program\n .name(CLI_NAME)\n .description(\"Done Bear CLI for auth, workspace, and task workflows\")\n .version(packageManifest.version, \"-v, --version\")\n .showHelpAfterError()\n .showSuggestionAfterError();\n\n addGlobalOptions(program);\n\n program.addHelpText(\n \"after\",\n `\nAgent quickstart (no auth needed):\n donebear spec Full CLI spec (~500 tokens)\n donebear spec task add Detailed spec for one command\n\nWith auth:\n donebear context Current workspace state\n donebear context --markdown Markdown snapshot for system prompts\n donebear task list --json List open tasks\n donebear task add \"Fix bug\" --when today --json\n donebear import things --dry-run --json\n\nAuth:\n donebear auth login OAuth browser login\n DONEBEAR_TOKEN=<token> Non-interactive / CI — set this env var\n\nWorkspace targeting:\n donebear workspace=myorg task list\n\nFiltering & output:\n donebear task list --json --jq \"[0].title\" JMESPath filter\n donebear task list --format yaml YAML output\n donebear task list --limit 5 Limit results\n donebear task add \"X\" --dry-run Preview mutation\n`\n );\n\n registerSpecCommand(program);\n registerDoctorCommand(program);\n registerContextCommand(program, workspaceOverride);\n registerAuthCommands(program);\n registerApiKeyCommands(program);\n registerWorkspaceCommands(program, workspaceOverride);\n registerTaskCommands(program, workspaceOverride);\n registerProjectCommands(program, workspaceOverride);\n registerImportCommands(program, workspaceOverride);\n registerLabelCommands(program, workspaceOverride);\n registerTeamCommands(program, workspaceOverride);\n registerTodayCommand(program, workspaceOverride);\n registerSearchCommand(program, workspaceOverride);\n registerHistoryCommand(program, workspaceOverride);\n registerWhoAmICommand(program);\n\n return program;\n};\n","import { runInteractiveMode } from \"./commands/interactive\";\nimport { loadCliEnvironmentFiles } from \"./env\";\nimport { buildProgram } from \"./program\";\nimport { contextFromArgv, runWithErrorHandling } from \"./runtime\";\n\nconst WORKSPACE_PREFIX_REGEX = /^workspace=(.+)$/iu;\n\nconst extractWorkspaceTarget = (\n argv: string[]\n): {\n processedArgv: string[];\n workspaceOverride: string | null;\n} => {\n const processedArgv = [...argv];\n // oxlint-disable-next-line eslint/prefer-destructuring -- index access keeps intent clear\n const firstArg = processedArgv[2];\n\n if (firstArg) {\n const match = WORKSPACE_PREFIX_REGEX.exec(firstArg);\n if (match?.[1]) {\n processedArgv.splice(2, 1);\n return { processedArgv, workspaceOverride: match[1].trim() };\n }\n }\n\n return { processedArgv, workspaceOverride: null };\n};\n\nconst main = async (): Promise<void> => {\n loadCliEnvironmentFiles();\n\n const { processedArgv, workspaceOverride } = extractWorkspaceTarget(\n process.argv\n );\n\n const program = buildProgram(workspaceOverride);\n\n const hasUserArgs = processedArgv.length <= 2;\n const isTTY = process.stdin.isTTY === true;\n\n if (hasUserArgs && isTTY) {\n const ttyContext = contextFromArgv(processedArgv);\n await runInteractiveMode(ttyContext, program);\n return;\n }\n\n await program.parseAsync(processedArgv);\n};\n\nconst fallbackContext = contextFromArgv(process.argv);\n\nawait runWithErrorHandling(fallbackContext, main);\n"],"x_google_ignoreList":[30],"mappings":"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QD,CACA,OACC,OACE,OACA,SACA,YACG;EACH,MAAM,UAAU,mBAAmB,QAAQ;EAC3C,MAAM,qBAAqB,SAAS,YAAY;GAC9C,MAAM,UAAU,SAAS,OAAO,SAAS,kBAAkB;IAC3D;GAEL;;;;AC9KL,MAAa,WAAW;CACtB,gBAAgB;CAChB,UAAU;EACR,WAAW;GACT,aAAa;GACb,eAAe;GACf,aAAa;IAAC;IAAU;IAAQ;IAAS;GAC1C;EACD,MAAM;GACJ,aAAa;GACb,eAAe;GACf,aAAa;IAAC;IAAS;IAAU;IAAS;GAC3C;EACD,SAAS;GACP,aACE;GACF,eAAe;GAChB;EACD,QAAQ;GACN,aACE;GACF,eAAe;GAChB;EACD,SAAS;GACP,aAAa;GACb,eAAe;GAChB;EACD,QAAQ;GACN,aAAa;GACb,eAAe;GACf,aAAa,CAAC,SAAS;GACxB;EACD,OAAO;GACL,aAAa;GACb,eAAe;GACf,aAAa;IAAC;IAAQ;IAAQ;IAAU;IAAO;IAAS;GACzD;EACD,SAAS;GACP,aAAa;GACb,eAAe;GACf,aAAa;IACX;IACA;IACA;IACA;IACA;IACA;IACA;IACD;GACF;EACD,QAAQ;GACN,aAAa;GACb,eAAe;GAChB;EACD,MAAM;GACJ,aAAa;GACb,eAAe;GAChB;EACD,MAAM;GACJ,aAAa;GACb,eAAe;GACf,aAAa;IACX;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACD;GACF;EACD,MAAM;GACJ,aAAa;GACb,eAAe;GACf,aAAa,CAAC,QAAQ,OAAO;GAC9B;EACD,OAAO;GACL,aAAa;GACb,eAAe;GAChB;EACD,QAAQ;GACN,aAAa;GACb,eAAe;GAChB;EACD,WAAW;GACT,aAAa;GACb,eAAe;GACf,aAAa;IACX;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACD;GACF;EACF;CACD,gBAAgB;EACd,UAAU;EACV,aAAa;EACb,YAAY;EACZ,qBAAqB;EACrB,UAAU;EACV,eAAe;EACf,WAAW;EACX,eAAe;EACf,aAAa;EACd;CACD,iBACE;CACF,KAAK;CACL,qBACE;CACH;AAGD,MAAa,gBAAwC;CACnD,kBAAkB;EAChB,WAAW,EACT,OAAO;GACL,aAAa;GACb,UAAU;GACV,MAAM;GACP,EACF;EACD,SAAS;EACT,UAAU;GACR;GACA;GACA;GACD;EACD,aAAa;GACX,WAAW;GACX,WAAW;GACX,IAAI;GACJ,WAAW;GACX,OAAO;GACP,QAAQ;GACR,OAAO;GACP,cAAc;GACf;EACD,OACE;EACF,SAAS;GACP,aAAa;IACX,aAAa;IACb,MAAM;IACP;GACD,iBAAiB;IACf,SAAS;IACT,aACE;IACF,MAAM,CAAC,eAAe,YAAY;IAClC,MAAM;IACP;GACD,gBAAgB;IACd,aAAa;IACb,MAAM;IACP;GACF;EACD,OAAO;EACR;CACD,gBAAgB;EACd,SAAS;EACT,UAAU,CAAC,+BAA+B;EAC1C,aAAa,EACX,MAAM,kBACP;EACD,OAAO;EACP,SAAS,EAAE;EACX,OAAO;EACR;CACD,kBAAkB;EAChB,WAAW,EACT,UAAU;GACR,aAAa;GACb,UAAU;GACV,MAAM;GACP,EACF;EACD,SAAS;EACT,UAAU,CAAC,0CAA0C;EACrD,aAAa;GAAE,IAAI;GAAU,IAAI;GAAW;EAC5C,SAAS,EAAE;EACX,OAAO;EACR;CACD,cAAc;EACZ,SAAS;EACT,UAAU;GACR;GACA;GACA;GACD;EACD,aAAa;GAAE,IAAI;GAAW,QAAQ;GAAU,MAAM;GAAiB;EACvE,iBACE;EACF,SAAS;GACP,aAAa;IACX,aAAa;IACb,MAAM;IACP;GACD,UAAU;IACR,SAAS;IACT,aAAa;IACb,MAAM;IACP;GACD,aAAa;IACX,aAAa;IACb,MAAM;IACP;GACF;EACD,OAAO;EACR;CACD,eAAe;EACb,SAAS;EACT,UAAU,CAAC,8BAA8B;EACzC,aAAa;GACX,eAAe;GACf,IAAI;GACJ,QAAQ;GACR,MAAM;GACP;EACD,SAAS,EAAE;EACX,OAAO;EACR;CACD,SAAS;EACP,SAAS;EACT,aACE;EACF,UAAU;GACR;GACA;GACA;GACD;EACD,aAAa;GACX,gBAAgB;GAChB,aAAa;GACb,IAAI;GACJ,aAAa;GACb,YAA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"}
1
+ {"version":3,"file":"cli.mjs","names":["yamlStringify","isRecord","taskFields","isFiniteEpoch","getTaskState","buildTaskStartFields","buildTaskStartFields","normalizeBaseUrl","defaultErrorMapper","isTimeoutError","TASK_FIELD_SELECTION","toTaskRecord","toTaskRecordFromGraphqlNode","getOptionalSupabaseConfig","buildCanonicalStartFields","getCanonicalTaskState","REGEX","URL","URL","uuidv5","exports","RRule","fsConstants"],"sources":["../src/output.ts","../src/commands/interactive.ts","../src/env.ts","../src/jwt.ts","../src/oauth-token.ts","../src/storage.ts","../src/supabase.ts","../src/auth-session.ts","../../../packages/sync-schema/task-fields.json","../../../packages/sync-schema/src/index.ts","../../../packages/task-logic/src/date-only.ts","../../../packages/task-logic/src/task-status.ts","../../../packages/rank-logic/src/index.ts","../../../packages/manage-client/src/mutations.ts","../../../packages/manage-client/src/sync-mutate.ts","../../../packages/manage-client/src/index.ts","../src/api/http.ts","../src/date-codecs.ts","../src/manage-api.ts","../src/command-context.ts","../src/options.ts","../src/runtime.ts","../src/commands/api-key.ts","../src/browser.ts","../src/command-parsers.ts","../src/oauth-callback.ts","../src/pkce.ts","../src/commands/auth.ts","../src/task-defaults.ts","../src/command-helpers.ts","../src/confirm.ts","../../../packages/sync-ids/node_modules/uuid/dist-node/regex.js","../../../packages/sync-ids/node_modules/uuid/dist-node/validate.js","../../../packages/sync-ids/node_modules/uuid/dist-node/parse.js","../../../packages/sync-ids/node_modules/uuid/dist-node/stringify.js","../../../packages/sync-ids/node_modules/uuid/dist-node/v35.js","../../../packages/sync-ids/node_modules/uuid/dist-node/sha1.js","../../../packages/sync-ids/node_modules/uuid/dist-node/v5.js","../../../packages/sync-ids/src/index.ts","../src/import/model-id.ts","../src/workspace-context.ts","../src/commands/task.ts","../src/commands/comment.ts","../src/commands/context.ts","../src/manifest.ts","../src/commands/doctor.ts","../src/api/bootstrap.ts","../src/export/export-output.ts","../src/export/export-runner.ts","../src/commands/export.ts","../src/commands/guide.ts","../src/commands/history.ts","../src/import/things-output.ts","../../../packages/date-tz/src/index.ts","../../../packages/sync-ids/src/meet-done-bear.ts","../src/import/meet-done-bear.ts","../src/import/things-labels.ts","../../../node_modules/rrule/dist/es5/rrule.js","../src/import/things-values.ts","../src/import/things-recurrence.ts","../src/import/things-mapper.ts","../src/import/things-sqlite.ts","../src/import/things-runner.ts","../src/commands/import.ts","../src/commands/label.ts","../src/commands/project.ts","../src/commands/search.ts","../src/commands/spec.ts","../src/commands/team.ts","../src/commands/today.ts","../src/commands/whoami.ts","../src/commands/workspace.ts","../src/program.ts","../src/cli.ts"],"sourcesContent":["import { execSync } from \"node:child_process\";\nimport { styleText } from \"node:util\";\n\nimport jmespath from \"jmespath\";\nimport { stringify as yamlStringify } from \"yaml\";\n\nimport { CliError, EXIT_CODES } from \"./errors\";\nimport type { CliContext } from \"./types\";\n\nconst writeLine = (stream: NodeJS.WriteStream, message: string): void => {\n stream.write(`${message}\\n`);\n};\n\nconst colorize = (\n context: CliContext,\n format: Parameters<typeof styleText>[0],\n message: string\n): string => {\n if (!context.color) {\n return message;\n }\n\n return styleText(format, message);\n};\n\n// ---------------------------------------------------------------------------\n// Primitive writers\n// ---------------------------------------------------------------------------\n\nexport const writeJson = (value: unknown): void => {\n writeLine(process.stdout, JSON.stringify(value, null, 2));\n};\n\nconst writeYaml = (value: unknown): void => {\n process.stdout.write(yamlStringify(value));\n};\n\nexport const writeInfo = (context: CliContext, message: string): void => {\n writeLine(process.stdout, colorize(context, \"cyan\", message));\n};\n\nexport const writeSuccess = (context: CliContext, message: string): void => {\n writeLine(process.stdout, colorize(context, \"green\", message));\n};\n\nexport const writeWarning = (context: CliContext, message: string): void => {\n writeLine(process.stderr, colorize(context, \"yellow\", message));\n};\n\nexport const writeError = (context: CliContext, message: string): void => {\n writeLine(process.stderr, colorize(context, \"red\", message));\n};\n\nexport const writeDebug = (context: CliContext, message: string): void => {\n if (!context.debug) {\n return;\n }\n\n writeLine(process.stderr, colorize(context, \"gray\", `[debug] ${message}`));\n};\n\nexport const writeTotal = (context: CliContext, count: number): void => {\n writeLine(process.stdout, colorize(context, \"cyan\", String(count)));\n};\n\n// ---------------------------------------------------------------------------\n// CSV / TSV\n// ---------------------------------------------------------------------------\n\nconst escapeCsvField = (value: string): string => {\n if (value.includes(\",\") || value.includes('\"') || value.includes(\"\\n\")) {\n return `\"${value.replaceAll('\"', '\"\"')}\"`;\n }\n return value;\n};\n\nexport const writeCsv = (headers: string[], rows: string[][]): void => {\n writeLine(process.stdout, headers.map(escapeCsvField).join(\",\"));\n for (const row of rows) {\n writeLine(process.stdout, row.map(escapeCsvField).join(\",\"));\n }\n};\n\nexport const writeTsv = (headers: string[], rows: string[][]): void => {\n writeLine(process.stdout, headers.join(\"\\t\"));\n for (const row of rows) {\n writeLine(process.stdout, row.join(\"\\t\"));\n }\n};\n\n// ---------------------------------------------------------------------------\n// Universal structured output (applies --jq, --limit, then format)\n// ---------------------------------------------------------------------------\n\n/**\n * Write structured data to stdout, applying --jq filter and --limit if set.\n * Use this for all JSON/YAML/structured output from commands.\n */\nexport const writeOutput = (context: CliContext, data: unknown): void => {\n let result = data;\n\n // Apply JMESPath filtering\n if (context.jq) {\n try {\n result = jmespath.search(result, context.jq);\n } catch (error) {\n throw new CliError(\n `Invalid --jq expression: ${error instanceof Error ? error.message : String(error)}`,\n EXIT_CODES.VALIDATION\n );\n }\n }\n\n // Apply limit\n if (context.limit !== null && Array.isArray(result)) {\n result = result.slice(0, context.limit);\n }\n\n // Format output\n switch (context.format) {\n case \"yaml\": {\n writeYaml(result);\n break;\n }\n case \"json\": {\n writeJson(result);\n break;\n }\n default: {\n // --jq implies structured output; fall through to JSON\n writeJson(result);\n break;\n }\n }\n\n if (context.copy) {\n copyToClipboard(JSON.stringify(result, null, 2));\n }\n};\n\n// ---------------------------------------------------------------------------\n// Tabular output (--total, --format csv/tsv/yaml, --copy)\n// ---------------------------------------------------------------------------\n\n/**\n * Handles --total, --format csv, --format tsv, --format yaml output.\n * Returns true if the format was handled; caller renders text mode if false.\n */\nexport const writeFormattedRows = (\n context: CliContext,\n totalCount: number,\n headers: string[],\n rows: string[][]\n): boolean => {\n if (context.total) {\n writeTotal(context, totalCount);\n return true;\n }\n\n if (context.format === \"yaml\") {\n const objects = rows.map((row) =>\n Object.fromEntries(headers.map((h, i) => [h, row[i]]))\n );\n writeYaml(objects);\n if (context.copy) {\n copyToClipboard(yamlStringify(objects));\n }\n return true;\n }\n\n if (context.format === \"csv\") {\n writeCsv(headers, rows);\n if (context.copy) {\n copyToClipboard(\n [headers.join(\",\"), ...rows.map((r) => r.join(\",\"))].join(\"\\n\")\n );\n }\n return true;\n }\n\n if (context.format === \"tsv\") {\n writeTsv(headers, rows);\n if (context.copy) {\n copyToClipboard(\n [headers.join(\"\\t\"), ...rows.map((r) => r.join(\"\\t\"))].join(\"\\n\")\n );\n }\n return true;\n }\n\n return false;\n};\n\n// ---------------------------------------------------------------------------\n// Clipboard\n// ---------------------------------------------------------------------------\n\nexport const copyToClipboard = (text: string): boolean => {\n try {\n if (process.platform === \"darwin\") {\n execSync(\"pbcopy\", { input: text });\n } else if (process.platform === \"win32\") {\n execSync(\"clip\", { input: text });\n } else {\n try {\n execSync(\"xclip -selection clipboard\", { input: text });\n } catch {\n execSync(\"xsel --clipboard --input\", { input: text });\n }\n }\n return true;\n } catch {\n return false;\n }\n};\n","import { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { createInterface } from \"node:readline\";\n\nimport type { Command } from \"commander\";\n\nimport { CONFIG_DIR } from \"../constants\";\nimport { writeInfo, writeSuccess } from \"../output\";\nimport type { CliContext } from \"../types\";\n\nconst HISTORY_FILE = join(CONFIG_DIR, \"history.json\");\nconst MAX_HISTORY = 200;\n\ninterface HistoryFile {\n version: 1;\n entries: string[];\n}\n\nconst isHistoryFile = (value: unknown): value is HistoryFile => {\n if (typeof value !== \"object\" || value === null) {\n return false;\n }\n\n const record = value as Record<string, unknown>;\n\n return (\n record.version === 1 &&\n Array.isArray(record.entries) &&\n record.entries.every((e) => typeof e === \"string\")\n );\n};\n\nconst loadHistory = async (historyFile: string): Promise<string[]> => {\n try {\n const raw = await readFile(historyFile, \"utf-8\");\n const parsed: unknown = JSON.parse(raw);\n\n if (isHistoryFile(parsed)) {\n return parsed.entries;\n }\n\n return [];\n } catch {\n return [];\n }\n};\n\nconst tokenize = (input: string): string[] => {\n const tokens: string[] = [];\n let current = \"\";\n let inQuote = false;\n let quoteChar = \"\";\n\n for (const char of input) {\n if (inQuote) {\n if (char === quoteChar) {\n inQuote = false;\n } else {\n current += char;\n }\n } else if (char === '\"' || char === \"'\") {\n inQuote = true;\n quoteChar = char;\n } else if (char === \" \") {\n if (current.length > 0) {\n tokens.push(current);\n current = \"\";\n }\n } else {\n current += char;\n }\n }\n\n if (current.length > 0) {\n tokens.push(current);\n }\n\n return tokens;\n};\n\nconst buildCompleter =\n (program: Command) =>\n (line: string): [string[], string] => {\n const allCommands = program.commands.flatMap((cmd) => [\n cmd.name(),\n ...cmd.aliases(),\n ]);\n const hits = allCommands.filter((c) => c.startsWith(line));\n return [hits.length > 0 ? hits : allCommands, line];\n };\n\nexport const runInteractiveMode = async (\n context: CliContext,\n program: Command\n): Promise<void> => {\n const history = await loadHistory(HISTORY_FILE);\n\n const rl = createInterface({\n completer: buildCompleter(program),\n historySize: MAX_HISTORY,\n input: process.stdin,\n output: process.stdout,\n prompt: \"donebear> \",\n });\n\n // Pre-populate readline history (reversed; readline stores newest first)\n for (const entry of [...history].toReversed()) {\n // The history property exists on readline.Interface internals\n (rl as unknown as { history: string[] }).history.push(entry);\n }\n\n writeSuccess(\n context,\n 'Done Bear interactive mode. Type \"exit\" or Ctrl+D to quit.'\n );\n writeInfo(\n context,\n \"Commands: task, workspace, project, label, team, today, search, auth, whoami\"\n );\n\n rl.prompt();\n\n const sessionEntries: string[] = [];\n\n for await (const line of rl) {\n const trimmed = line.trim();\n\n if (!trimmed) {\n rl.prompt();\n continue;\n }\n\n if (trimmed === \"exit\" || trimmed === \"quit\" || trimmed === \":q\") {\n break;\n }\n\n const tokens = tokenize(trimmed);\n\n try {\n await program.parseAsync([\"node\", \"donebear\", ...tokens]);\n } catch {\n // Errors are already handled by runWithErrorHandling inside each command\n }\n\n sessionEntries.push(trimmed);\n rl.prompt();\n }\n\n rl.close();\n\n // Persist session history on exit\n if (sessionEntries.length > 0) {\n try {\n const existing = await loadHistory(HISTORY_FILE);\n const updated = [...existing, ...sessionEntries].slice(-MAX_HISTORY);\n const payload: HistoryFile = { entries: updated, version: 1 };\n await mkdir(CONFIG_DIR, { mode: 0o700, recursive: true });\n await writeFile(HISTORY_FILE, `${JSON.stringify(payload, null, 2)}\\n`, {\n encoding: \"utf-8\",\n mode: 0o600,\n });\n } catch {\n // Ignore history write errors; not critical\n }\n }\n};\n","import { existsSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\n\nimport { config as loadDotEnvFile } from \"dotenv\";\n\nconst DEFAULT_ENV_FILES = [\n \".env.local\",\n \".env\",\n \"apps/manage-frontend/.env.local\",\n \"apps/manage-api/.env\",\n] as const;\n\nlet loaded = false;\n\nexport const loadCliEnvironmentFiles = (): void => {\n if (loaded) {\n return;\n }\n\n for (const relativePath of DEFAULT_ENV_FILES) {\n const absolutePath = resolve(process.cwd(), relativePath);\n\n if (!existsSync(absolutePath)) {\n continue;\n }\n\n loadDotEnvFile({\n override: false,\n path: absolutePath,\n quiet: true,\n });\n }\n\n loaded = true;\n};\n\nexport const readEnvValue = (key: string): string | undefined => {\n const value = process.env[key];\n\n if (typeof value !== \"string\") {\n return undefined;\n }\n\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n};\n","export interface JwtClaims {\n exp?: number;\n email?: string;\n sub?: string;\n}\n\nconst parseJwtBase64Url = (input: string): string => {\n const normalized = input.replaceAll(\"-\", \"+\").replaceAll(\"_\", \"/\");\n const padded = normalized.padEnd(Math.ceil(normalized.length / 4) * 4, \"=\");\n return Buffer.from(padded, \"base64\").toString(\"utf-8\");\n};\n\nexport const parseJwtClaims = (token: string): JwtClaims | null => {\n const parts = token.split(\".\");\n const payloadPart = parts.at(1);\n\n if (!payloadPart) {\n return null;\n }\n\n try {\n const payload = parseJwtBase64Url(payloadPart);\n const parsed = JSON.parse(payload) as unknown;\n\n if (typeof parsed !== \"object\" || parsed === null) {\n return null;\n }\n\n const claims = parsed as Record<string, unknown>;\n\n return {\n email: typeof claims.email === \"string\" ? claims.email : undefined,\n exp: typeof claims.exp === \"number\" ? claims.exp : undefined,\n sub: typeof claims.sub === \"string\" ? claims.sub : undefined,\n };\n } catch {\n return null;\n }\n};\n","import { CliError, EXIT_CODES } from \"./errors\";\n\nexport interface OAuthTokenConfig {\n tokenUrl: string;\n clientId: string;\n}\n\nexport interface OAuthTokenResponse {\n access_token: string;\n refresh_token?: string;\n token_type: string;\n expires_in: number;\n}\n\nconst postTokenRequest = async (\n url: string,\n body: URLSearchParams\n): Promise<OAuthTokenResponse> => {\n const response = await fetch(url, {\n body: body.toString(),\n headers: { \"content-type\": \"application/x-www-form-urlencoded\" },\n method: \"POST\",\n });\n\n if (!response.ok) {\n const text = await response.text().catch(() => \"\");\n throw new CliError(\n `OAuth token request failed (${response.status}): ${text}`,\n EXIT_CODES.AUTH_REQUIRED\n );\n }\n\n return (await response.json()) as OAuthTokenResponse;\n};\n\nexport const exchangeAuthorizationCode = (\n config: OAuthTokenConfig,\n code: string,\n codeVerifier: string,\n redirectUri: string\n): Promise<OAuthTokenResponse> => {\n const body = new URLSearchParams({\n client_id: config.clientId,\n code,\n code_verifier: codeVerifier,\n grant_type: \"authorization_code\",\n redirect_uri: redirectUri,\n });\n\n return postTokenRequest(config.tokenUrl, body);\n};\n\nexport const refreshAccessToken = (\n config: OAuthTokenConfig,\n refreshToken: string\n): Promise<OAuthTokenResponse> => {\n const body = new URLSearchParams({\n client_id: config.clientId,\n grant_type: \"refresh_token\",\n refresh_token: refreshToken,\n });\n\n return postTokenRequest(config.tokenUrl, body);\n};\n","import { mkdir, readFile, rm, writeFile } from \"node:fs/promises\";\n\nimport { AUTH_FILE_PATH, CONFIG_DIR } from \"./constants\";\nimport { CliError, EXIT_CODES } from \"./errors\";\nimport type { AuthFileData, OAuthProvider, StoredAuthSession } from \"./types\";\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null;\n\nconst isOAuthProvider = (value: unknown): value is OAuthProvider =>\n value === \"google\" || value === \"github\" || value === \"oauth2\";\n\nconst parseStoredAuthSession = (value: unknown): StoredAuthSession | null => {\n if (!isRecord(value)) {\n return null;\n }\n\n if (typeof value.accessToken !== \"string\") {\n return null;\n }\n\n if (value.refreshToken !== null && typeof value.refreshToken !== \"string\") {\n return null;\n }\n\n if (value.tokenType !== null && typeof value.tokenType !== \"string\") {\n return null;\n }\n\n if (value.expiresAt !== null && typeof value.expiresAt !== \"string\") {\n return null;\n }\n\n if (!isOAuthProvider(value.provider)) {\n return null;\n }\n\n const { user } = value;\n if (\n user !== null &&\n (!isRecord(user) ||\n typeof user.id !== \"string\" ||\n (user.email !== null && typeof user.email !== \"string\"))\n ) {\n return null;\n }\n\n if (typeof value.createdAt !== \"string\") {\n return null;\n }\n\n const parsedUser =\n user === null\n ? null\n : {\n email: (user.email as string | null) ?? null,\n id: user.id as string,\n };\n\n return {\n accessToken: value.accessToken,\n createdAt: value.createdAt,\n expiresAt: value.expiresAt,\n provider: value.provider,\n refreshToken: value.refreshToken,\n tokenType: value.tokenType,\n user: parsedUser,\n };\n};\n\nconst parseAuthFile = (payload: string): AuthFileData => {\n const parsed = JSON.parse(payload) as unknown;\n\n if (!isRecord(parsed) || parsed.version !== 1) {\n throw new CliError(\n `Invalid auth cache format in ${AUTH_FILE_PATH}`,\n EXIT_CODES.ERROR\n );\n }\n\n const session = parseStoredAuthSession(parsed.session);\n\n if (!session) {\n throw new CliError(\n `Invalid auth session in ${AUTH_FILE_PATH}`,\n EXIT_CODES.ERROR\n );\n }\n\n return {\n session,\n version: 1,\n };\n};\n\nexport const readStoredAuthSession =\n async (): Promise<StoredAuthSession | null> => {\n try {\n const raw = await readFile(AUTH_FILE_PATH, \"utf-8\");\n const parsed = parseAuthFile(raw);\n return parsed.session;\n } catch (error) {\n if (isRecord(error) && error.code === \"ENOENT\") {\n return null;\n }\n\n if (error instanceof CliError) {\n throw error;\n }\n\n throw new CliError(\n `Failed to read credentials from ${AUTH_FILE_PATH}`,\n EXIT_CODES.ERROR\n );\n }\n };\n\nexport const writeStoredAuthSession = async (\n session: StoredAuthSession\n): Promise<void> => {\n const payload: AuthFileData = {\n session,\n version: 1,\n };\n\n await mkdir(CONFIG_DIR, {\n mode: 0o700,\n recursive: true,\n });\n\n await writeFile(AUTH_FILE_PATH, `${JSON.stringify(payload, null, 2)}\\n`, {\n encoding: \"utf-8\",\n mode: 0o600,\n });\n};\n\nexport const clearStoredAuthSession = async (): Promise<void> => {\n await rm(AUTH_FILE_PATH, {\n force: true,\n });\n};\n","import {\n CLI_OAUTH_CLIENT_ID,\n DEFAULT_SUPABASE_PUBLISHABLE_KEY,\n DEFAULT_SUPABASE_URL,\n DONEBEAR_OAUTH_CLIENT_ID_ENV,\n DONEBEAR_SUPABASE_KEY_ENV,\n DONEBEAR_SUPABASE_URL_ENV,\n} from \"./constants\";\nimport { readEnvValue } from \"./env\";\nimport { parseJwtClaims } from \"./jwt\";\nimport type { OAuthTokenResponse } from \"./oauth-token\";\nimport type { StoredAuthSession, SupabaseConfig } from \"./types\";\n\nexport const resolveSupabaseConfig = (): SupabaseConfig => {\n const url = readEnvValue(DONEBEAR_SUPABASE_URL_ENV) ?? DEFAULT_SUPABASE_URL;\n\n const publishableKey =\n readEnvValue(DONEBEAR_SUPABASE_KEY_ENV) ?? DEFAULT_SUPABASE_PUBLISHABLE_KEY;\n\n return {\n publishableKey,\n url,\n };\n};\n\nexport const buildOAuthUrls = (\n config: SupabaseConfig\n): {\n authorizeUrl: string;\n tokenUrl: string;\n} => ({\n authorizeUrl: `${config.url}/auth/v1/oauth/authorize`,\n tokenUrl: `${config.url}/auth/v1/oauth/token`,\n});\n\nexport const resolveOAuthClientId = (): string =>\n readEnvValue(DONEBEAR_OAUTH_CLIENT_ID_ENV) ?? CLI_OAUTH_CLIENT_ID;\n\nexport const tokenResponseToStoredSession = (\n response: OAuthTokenResponse\n): StoredAuthSession => {\n const claims = parseJwtClaims(response.access_token);\n\n let expiresAt: string | null = null;\n if (typeof claims?.exp === \"number\") {\n expiresAt = new Date(claims.exp * 1000).toISOString();\n } else if (response.expires_in > 0) {\n expiresAt = new Date(Date.now() + response.expires_in * 1000).toISOString();\n }\n\n return {\n accessToken: response.access_token,\n createdAt: new Date().toISOString(),\n expiresAt,\n provider: \"oauth2\",\n refreshToken: response.refresh_token ?? null,\n tokenType: response.token_type ?? null,\n user:\n claims?.sub || claims?.email\n ? {\n email: claims.email ?? null,\n id: claims.sub ?? \"unknown\",\n }\n : null,\n };\n};\n","import { DONEBEAR_TOKEN_ENV } from \"./constants\";\nimport { CliError, EXIT_CODES } from \"./errors\";\nimport { parseJwtClaims } from \"./jwt\";\nimport type { JwtClaims } from \"./jwt\";\nimport { refreshAccessToken } from \"./oauth-token\";\nimport {\n clearStoredAuthSession,\n readStoredAuthSession,\n writeStoredAuthSession,\n} from \"./storage\";\nimport {\n buildOAuthUrls,\n resolveOAuthClientId,\n tokenResponseToStoredSession,\n} from \"./supabase\";\nimport type {\n CliContext,\n ResolvedAuthToken,\n StoredAuthSession,\n SupabaseConfig,\n} from \"./types\";\n\nconst expiryFromClaims = (claims: JwtClaims | null): string | null => {\n if (!claims || typeof claims.exp !== \"number\") {\n return null;\n }\n\n return new Date(claims.exp * 1000).toISOString();\n};\n\nconst userFromClaims = (\n claims: JwtClaims | null\n): ResolvedAuthToken[\"user\"] => {\n if (!(claims?.sub || claims?.email)) {\n return null;\n }\n\n return {\n email: claims.email ?? null,\n id: claims.sub ?? \"unknown\",\n };\n};\n\nconst nowUnixSeconds = (): number => Math.floor(Date.now() / 1000);\n\nconst isExpired = (session: StoredAuthSession): boolean => {\n if (!session.expiresAt) {\n return false;\n }\n\n const expiresAtMs = Date.parse(session.expiresAt);\n\n if (Number.isNaN(expiresAtMs)) {\n return false;\n }\n\n return expiresAtMs <= Date.now();\n};\n\nconst shouldRefresh = (session: StoredAuthSession): boolean => {\n if (!session.expiresAt) {\n return false;\n }\n\n const expiresAtMs = Date.parse(session.expiresAt);\n\n if (Number.isNaN(expiresAtMs)) {\n return false;\n }\n\n return expiresAtMs - Date.now() <= 60_000;\n};\n\nconst tokenFromRaw = (\n token: string,\n source: ResolvedAuthToken[\"source\"]\n): ResolvedAuthToken => {\n const claims = parseJwtClaims(token);\n\n return {\n expiresAt: expiryFromClaims(claims),\n source,\n token,\n user: userFromClaims(claims),\n };\n};\n\nexport const resolveAuthToken = async (\n context: CliContext,\n config: SupabaseConfig | null\n): Promise<ResolvedAuthToken | null> => {\n if (context.tokenOverride) {\n return tokenFromRaw(context.tokenOverride, \"flag\");\n }\n\n const envToken = process.env[DONEBEAR_TOKEN_ENV]?.trim();\n\n if (envToken) {\n return tokenFromRaw(envToken, \"environment\");\n }\n\n const session = await readStoredAuthSession();\n\n if (!session) {\n return null;\n }\n\n if (!(shouldRefresh(session) || isExpired(session))) {\n return {\n expiresAt: session.expiresAt,\n source: \"stored\",\n token: session.accessToken,\n user: session.user,\n };\n }\n\n if (!(session.refreshToken && config)) {\n if (isExpired(session)) {\n await clearStoredAuthSession();\n return null;\n }\n\n return {\n expiresAt: session.expiresAt,\n source: \"stored\",\n token: session.accessToken,\n user: session.user,\n };\n }\n\n const { tokenUrl } = buildOAuthUrls(config);\n const clientId = resolveOAuthClientId();\n let tokenResponse: Awaited<ReturnType<typeof refreshAccessToken>>;\n try {\n tokenResponse = await refreshAccessToken(\n { clientId, tokenUrl },\n session.refreshToken\n );\n } catch (error) {\n // A refresh token that has been rotated away or revoked (another machine\n // consumed it, or the user signed out elsewhere) makes the token endpoint\n // return 400. The stored session is now useless, so clear it and surface a\n // sign-in prompt instead of a raw OAuth HTTP body on every command.\n await clearStoredAuthSession();\n throw new CliError(\n \"Your session has expired. Run `donebear auth login` to sign in again.\",\n EXIT_CODES.AUTH_REQUIRED,\n error instanceof Error ? error.message : undefined\n );\n }\n const updatedSession = tokenResponseToStoredSession(tokenResponse);\n await writeStoredAuthSession(updatedSession);\n\n return {\n expiresAt: updatedSession.expiresAt,\n source: \"stored\",\n token: updatedSession.accessToken,\n user: updatedSession.user,\n };\n};\n\nexport const resolveTokenStatus = (\n token: ResolvedAuthToken\n): {\n expiresInSeconds: number | null;\n expired: boolean;\n} => {\n const claims = parseJwtClaims(token.token);\n\n if (!claims?.exp) {\n return {\n expired: false,\n expiresInSeconds: null,\n };\n }\n\n const expiresInSeconds = claims.exp - nowUnixSeconds();\n\n return {\n expired: expiresInSeconds <= 0,\n expiresInSeconds,\n };\n};\n","","import taskFields from \"../task-fields.json\";\n\nexport interface TaskFieldManifest {\n model: \"Task\";\n bootstrapFields: string[];\n insertFields: string[];\n updateFields: string[];\n readProjection: string[];\n iosKeys: string[];\n}\n\nexport const TASK_FIELD_MANIFEST = taskFields as TaskFieldManifest;\n\n/**\n * Curated GraphQL selection for agent-facing task reads.\n *\n * This intentionally remains smaller than the Task sync bootstrap surface.\n */\nexport const TASK_FIELDS = TASK_FIELD_MANIFEST.readProjection.join(\"\\n\");\n","// Date-only epoch math shared across clients. A \"date-only epoch\" is a\n// UTC-midnight timestamp (a whole multiple of DATE_ONLY_DAY_MS) that encodes a\n// calendar day without a time-of-day or timezone. Lifted verbatim from\n// apps/manage-frontend/src/lib/date/date-only.ts; the date-fns-based display\n// helpers (formatDateOnly / formatDateOnlyInput) stay in the frontend so this\n// package keeps zero runtime dependencies.\n\nexport interface DateOnlyParts {\n year: number;\n month: number;\n day: number;\n}\n\nexport const DATE_ONLY_DAY_MS = 24 * 60 * 60 * 1000;\n\nconst DATE_ONLY_INPUT_PATTERN = /^(\\d{4})-(\\d{2})-(\\d{2})$/u;\n\nconst isFiniteEpoch = (value: unknown): value is number =>\n typeof value === \"number\" && Number.isFinite(value);\n\nconst isCanonicalDateOnlyEpoch = (value: number): boolean =>\n value % DATE_ONLY_DAY_MS === 0;\n\nconst getUtcDateOnlyParts = (date: Date): DateOnlyParts => ({\n day: date.getUTCDate(),\n month: date.getUTCMonth() + 1,\n year: date.getUTCFullYear(),\n});\n\nexport const isValidDateOnlyParts = (parts: DateOnlyParts): boolean => {\n if (\n !(\n Number.isInteger(parts.year) &&\n Number.isInteger(parts.month) &&\n Number.isInteger(parts.day)\n )\n ) {\n return false;\n }\n\n if (\n parts.year < 1 ||\n parts.month < 1 ||\n parts.month > 12 ||\n parts.day < 1 ||\n parts.day > 31\n ) {\n return false;\n }\n\n const candidate = new Date(Date.UTC(parts.year, parts.month - 1, parts.day));\n\n return (\n candidate.getUTCFullYear() === parts.year &&\n candidate.getUTCMonth() + 1 === parts.month &&\n candidate.getUTCDate() === parts.day\n );\n};\n\nconst parseDateOnlyInput = (\n value: string | null | undefined\n): DateOnlyParts | null => {\n if (typeof value !== \"string\") {\n return null;\n }\n\n const match = DATE_ONLY_INPUT_PATTERN.exec(value.trim());\n\n if (!match) {\n return null;\n }\n\n const parts: DateOnlyParts = {\n day: Number(match[3]),\n month: Number(match[2]),\n year: Number(match[1]),\n };\n\n return isValidDateOnlyParts(parts) ? parts : null;\n};\n\nexport const dateOnlyPartsToEpoch = (parts: DateOnlyParts): number | null =>\n isValidDateOnlyParts(parts)\n ? Date.UTC(parts.year, parts.month - 1, parts.day)\n : null;\n\nexport const epochToDateOnlyParts = (\n epoch: number | null | undefined\n): DateOnlyParts | null => {\n if (!isFiniteEpoch(epoch)) {\n return null;\n }\n\n const date = new Date(epoch);\n return Number.isNaN(date.getTime()) ? null : getUtcDateOnlyParts(date);\n};\n\nexport const formatDateOnlyParts = (parts: DateOnlyParts): string | null =>\n isValidDateOnlyParts(parts)\n ? `${String(parts.year).padStart(4, \"0\")}-${String(parts.month).padStart(2, \"0\")}-${String(parts.day).padStart(2, \"0\")}`\n : null;\n\nexport const formatDateOnlyEpoch = (\n epoch: number | null | undefined\n): string | null => {\n const parts = epochToDateOnlyParts(epoch);\n return parts ? formatDateOnlyParts(parts) : null;\n};\n\nexport const normalizeDateOnlyEpoch = (\n value: number | null | undefined\n): number | null => {\n if (!(isFiniteEpoch(value) && isCanonicalDateOnlyEpoch(value))) {\n return null;\n }\n\n return value;\n};\n\nexport const parseDateOnlyInputToEpoch = (\n value: string | null | undefined\n): number | null => {\n const parts = parseDateOnlyInput(value);\n return parts ? dateOnlyPartsToEpoch(parts) : null;\n};\n\nexport const localDateToDateOnlyEpoch = (date: Date): number =>\n Date.UTC(date.getFullYear(), date.getMonth(), date.getDate());\n\nexport const dateOnlyEpochToLocalDate = (\n value: number | null | undefined\n): Date | undefined => {\n const normalized = normalizeDateOnlyEpoch(value);\n\n if (normalized === null) {\n return undefined;\n }\n\n const parts = epochToDateOnlyParts(normalized);\n if (!parts) {\n return undefined;\n }\n\n return new Date(parts.year, parts.month - 1, parts.day);\n};\n\nexport const getTodayDateOnlyEpoch = (now: Date = new Date()): number =>\n localDateToDateOnlyEpoch(now);\n\n/**\n * Date-only epoch for \"today\" in an IANA timezone. Without a timezone this\n * uses the UTC calendar date (server/MCP default), not the process-local\n * calendar — callers that want the device's local day should use\n * {@link getTodayDateOnlyEpoch} instead.\n */\nexport const getDateOnlyEpochForToday = (\n timezone?: string,\n now: Date = new Date()\n): number => {\n if (!timezone) {\n return Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate());\n }\n\n let formatted: string;\n try {\n // en-CA formats as YYYY-MM-DD\n formatted = new Intl.DateTimeFormat(\"en-CA\", {\n day: \"2-digit\",\n month: \"2-digit\",\n timeZone: timezone,\n year: \"numeric\",\n }).format(now);\n } catch {\n throw new Error(\n `Invalid timezone: ${timezone}. Expected an IANA name like \"Australia/Melbourne\".`\n );\n }\n\n const parts = parseDateOnlyInput(formatted);\n if (!parts) {\n throw new Error(`Failed to parse calendar day for timezone: ${timezone}`);\n }\n\n return Date.UTC(parts.year, parts.month - 1, parts.day);\n};\n\nexport const addDaysToDateOnlyEpoch = (value: number, days: number): number => {\n const normalized = normalizeDateOnlyEpoch(value);\n\n if (normalized === null) {\n throw new TypeError(\"Invalid date-only epoch\");\n }\n\n return normalized + days * DATE_ONLY_DAY_MS;\n};\n\nexport const getTomorrowDateOnlyEpoch = (now: Date = new Date()): number =>\n addDaysToDateOnlyEpoch(getTodayDateOnlyEpoch(now), 1);\n","// Single source of truth for cross-client task view/state/start-field\n// derivation. The server consumes this package through thin adapters in\n// apps/manage-api/src/lib/domain/task-status.ts (timezone today, template\n// hiding, todayIndexReferenceDate). The golden vectors in\n// packages/task-logic/test-vectors.json are asserted by this package's Vitest\n// suite AND by the Swift suite in apps/ios, so the same cases verify every port.\n\nimport {\n DATE_ONLY_DAY_MS,\n getTodayDateOnlyEpoch,\n normalizeDateOnlyEpoch,\n} from \"./date-only\";\n\nexport type TaskStart = \"not_started\" | \"started\" | \"someday\";\nexport type TaskStartBucket = \"today\" | \"evening\" | \"upcoming\";\nexport type TaskView =\n | \"inbox\"\n | \"today\"\n | \"upcoming\"\n | \"anytime\"\n | \"someday\"\n | \"logbook\"\n | \"trash\";\nexport const ACTIVE_TASK_VIEWS = [\n \"inbox\",\n \"today\",\n \"upcoming\",\n \"anytime\",\n \"someday\",\n] as const satisfies readonly TaskView[];\nexport type ActiveTaskView = (typeof ACTIVE_TASK_VIEWS)[number];\nexport type TaskState = \"open\" | \"done\" | \"archived\";\n\n// Plain field-bag so every client can call it regardless of its own model\n// class. Date fields are date-only epoch numbers (or null). Clients that store\n// dates as ISO strings must convert at their boundary before calling.\nexport interface TaskLike {\n start?: string | null;\n startBucket?: string | null;\n startDate?: number | null;\n deadlineAt?: number | null;\n completedAt?: number | null;\n archivedAt?: number | null;\n repeatRule?: string | null;\n repeatTemplateId?: string | null;\n}\n\nexport const normalizeStart = (\n value: string | null | undefined\n): TaskStart | null => {\n if (typeof value !== \"string\") {\n return null;\n }\n\n const trimmed = value.trim().toLowerCase();\n if (trimmed === \"not_started\") {\n return \"not_started\";\n }\n if (trimmed === \"started\") {\n return \"started\";\n }\n if (trimmed === \"someday\") {\n return \"someday\";\n }\n\n return null;\n};\n\n// Treat `undefined` like `null` throughout: TaskLike fields are optional, so a\n// caller may omit a field rather than pass an explicit null.\nconst isNullish = (value: unknown): boolean =>\n value === null || value === undefined;\n\n// A repeat template carries a rule but is not itself a generated instance.\nexport const isRepeatTemplate = (task: TaskLike): boolean =>\n !isNullish(task.repeatRule) && isNullish(task.repeatTemplateId);\n\nexport const getTaskState = (task: TaskLike): TaskState => {\n if (!isNullish(task.archivedAt)) {\n return \"archived\";\n }\n if (!isNullish(task.completedAt)) {\n return \"done\";\n }\n return \"open\";\n};\n\n/**\n * Derive the GTD bucket a task belongs to. `todayEpoch` is a canonical\n * UTC-midnight date-only epoch (compute it via getTodayDateOnlyEpoch).\n *\n * Note: this deliberately does NOT hide repeat templates. Template hiding is a\n * list/retention concern that callers apply via isRepeatTemplate.\n */\nexport const getTaskView = (\n task: TaskLike,\n todayEpoch: number\n): TaskView | null => {\n if (!isNullish(task.archivedAt)) {\n return \"trash\";\n }\n\n if (!isNullish(task.completedAt)) {\n return \"logbook\";\n }\n\n const start = normalizeStart(task.start);\n const startDate = normalizeDateOnlyEpoch(task.startDate);\n const deadline = normalizeDateOnlyEpoch(task.deadlineAt);\n // Due today OR overdue. A deadline that has passed is more urgent than one\n // landing today, so it must not fall out of Today: an overdue task that\n // silently returned to its bucket would be the easiest one to miss.\n const isDeadlineDue = deadline !== null && deadline <= todayEpoch;\n const tomorrow = todayEpoch + DATE_ONLY_DAY_MS;\n\n if (start === null) {\n return null;\n }\n\n if (start === \"not_started\") {\n return isDeadlineDue ? \"today\" : \"inbox\";\n }\n\n if (start === \"someday\") {\n return isDeadlineDue ? \"today\" : \"someday\";\n }\n\n // start === \"started\"\n if (startDate === null) {\n return isDeadlineDue ? \"today\" : \"anytime\";\n }\n\n if (startDate < tomorrow || isDeadlineDue) {\n return \"today\";\n }\n\n return \"upcoming\";\n};\n\n/**\n * Date-based convenience wrapper. Clients that already have a `todayEpoch`\n * should call getTaskView directly; this exists for callers holding a Date.\n */\nexport const getTaskViewNow = (\n task: TaskLike,\n now: Date = new Date()\n): TaskView | null => getTaskView(task, getTodayDateOnlyEpoch(now));\n\n/**\n * Canonical 3-field start shape for a target view. (cli/raycast additionally\n * emit a 4th `todayIndexReferenceDate`; that is a client concern and is\n * intentionally NOT produced here.)\n */\nexport const buildTaskStartFields = (\n view: TaskView,\n options: { startDate?: number | null; todayEpoch?: number; now?: Date } = {}\n): {\n start: TaskStart;\n startBucket: TaskStartBucket;\n startDate: number | null;\n} => {\n const today = options.todayEpoch ?? getTodayDateOnlyEpoch(options.now);\n const tomorrow = today + DATE_ONLY_DAY_MS;\n const startDate = normalizeDateOnlyEpoch(options.startDate);\n\n switch (view) {\n case \"inbox\": {\n return { start: \"not_started\", startBucket: \"today\", startDate: null };\n }\n case \"anytime\": {\n return { start: \"started\", startBucket: \"today\", startDate: null };\n }\n case \"someday\": {\n return { start: \"someday\", startBucket: \"today\", startDate: null };\n }\n case \"today\": {\n return {\n start: \"started\",\n startBucket: \"today\",\n startDate: startDate ?? today,\n };\n }\n case \"upcoming\": {\n return {\n start: \"started\",\n startBucket: \"upcoming\",\n startDate: startDate ?? tomorrow,\n };\n }\n default: {\n return { start: \"not_started\", startBucket: \"today\", startDate: null };\n }\n }\n};\n","export const DEFAULT_RANK_GAP = 10_000;\n\ntype Placement =\n | { kind: \"relative\"; targetId: string }\n | { kind: \"start\" }\n | { kind: \"end\" };\n\ninterface MoveIdsInput {\n displayedIds: readonly string[];\n draggedIds: readonly string[];\n placement: Placement;\n}\n\ninterface InterpolateRanksInput {\n orderedIds: readonly string[];\n draggedIds: readonly string[];\n rankById: Readonly<Record<string, number>>;\n gap?: number;\n emptyBase?: number;\n}\n\ninterface PlanRankUpdatesInput {\n orderedIds: readonly string[];\n draggedIds: readonly string[];\n rankById: Readonly<Record<string, number>>;\n gap?: number;\n}\n\nconst orderedDraggedIds = (\n ids: readonly string[],\n draggedIds: readonly string[]\n): string[] => {\n const draggedIdSet = new Set(draggedIds);\n return ids.filter((id) => draggedIdSet.has(id));\n};\n\nexport const moveIds = ({\n displayedIds,\n draggedIds,\n placement,\n}: MoveIdsInput): string[] | null => {\n const block = orderedDraggedIds(displayedIds, draggedIds);\n const [firstDraggedId] = block;\n if (\n firstDraggedId === undefined ||\n block.length !== new Set(draggedIds).size\n ) {\n return null;\n }\n\n const draggedIdSet = new Set(block);\n const remainingIds = displayedIds.filter((id) => !draggedIdSet.has(id));\n\n const resolveInsertIndex = (): number | null => {\n if (placement.kind === \"start\") {\n return 0;\n }\n\n if (placement.kind === \"end\") {\n return remainingIds.length;\n }\n\n if (draggedIdSet.has(placement.targetId)) {\n return null;\n }\n\n const targetIndex = displayedIds.indexOf(placement.targetId);\n const targetIndexInRemaining = remainingIds.indexOf(placement.targetId);\n if (targetIndex === -1 || targetIndexInRemaining === -1) {\n return null;\n }\n\n return displayedIds.indexOf(firstDraggedId) < targetIndex\n ? targetIndexInRemaining + 1\n : targetIndexInRemaining;\n };\n\n const insertIndex = resolveInsertIndex();\n if (insertIndex === null) {\n return null;\n }\n\n const result = [\n ...remainingIds.slice(0, insertIndex),\n ...block,\n ...remainingIds.slice(insertIndex),\n ];\n return result.every((id, index) => id === displayedIds[index])\n ? null\n : result;\n};\n\nexport const interpolateRanks = ({\n orderedIds,\n draggedIds,\n rankById,\n gap = DEFAULT_RANK_GAP,\n emptyBase = 0,\n}: InterpolateRanksInput): Record<string, number> | null => {\n if (!Number.isFinite(gap) || gap <= 0 || !Number.isFinite(emptyBase)) {\n return null;\n }\n\n const block = orderedDraggedIds(orderedIds, draggedIds);\n const [firstDraggedId] = block;\n const lastDraggedId = block.at(-1);\n if (\n firstDraggedId === undefined ||\n lastDraggedId === undefined ||\n block.length !== new Set(draggedIds).size\n ) {\n return null;\n }\n\n const draggedIdSet = new Set(block);\n const firstIndex = orderedIds.indexOf(firstDraggedId);\n const lastIndex = orderedIds.lastIndexOf(lastDraggedId);\n if (firstIndex === -1 || lastIndex === -1) {\n return null;\n }\n\n let previousRank: number | undefined;\n for (let index = firstIndex - 1; index >= 0; index -= 1) {\n const id = orderedIds[index];\n if (id && !draggedIdSet.has(id)) {\n const rank = rankById[id];\n if (typeof rank !== \"number\" || !Number.isFinite(rank)) {\n return null;\n }\n previousRank = rank;\n break;\n }\n }\n\n let nextRank: number | undefined;\n for (let index = lastIndex + 1; index < orderedIds.length; index += 1) {\n const id = orderedIds[index];\n if (id && !draggedIdSet.has(id)) {\n const rank = rankById[id];\n if (typeof rank !== \"number\" || !Number.isFinite(rank)) {\n return null;\n }\n nextRank = rank;\n break;\n }\n }\n\n const span = gap * (block.length + 1);\n let lower: number;\n let upper: number;\n\n if (previousRank === undefined) {\n if (nextRank === undefined) {\n lower = emptyBase;\n upper = emptyBase + span;\n } else {\n lower = nextRank - span;\n upper = nextRank;\n }\n } else if (nextRank === undefined) {\n lower = previousRank;\n upper = previousRank + span;\n } else {\n lower = previousRank;\n upper = nextRank;\n }\n\n // Neighbours that collide (equal ranks) or are already inverted leave no room\n // between them, so the block is laid out BELOW `previousRank` instead. The\n // moved item lands above both neighbours rather than between them; see the\n // \"collides below previousRank when neighbours are equal\" golden vector.\n if (upper <= lower) {\n lower = upper - span;\n }\n\n const step = (upper - lower) / (block.length + 1);\n return Object.fromEntries(\n block.map((id, index) => [id, lower + step * (index + 1)])\n );\n};\n\n/**\n * The ranks to persist so that sorting by rank reproduces `orderedIds`.\n *\n * Normally that is just the dragged block, interpolated between its new\n * neighbours (`interpolateRanks`). But interpolation cannot place an item\n * between neighbours whose ranks are equal or inverted — `sort_order`\n * defaults to 0, so a list nobody has reordered yet is exactly that case,\n * and the drop silently fails to stick. When the interpolated result would\n * not sort into `orderedIds` (or a stationary rank is missing/non-finite),\n * every id is re-laid out on the gap instead: `gap * (index + 1)`. One such\n * rebalance heals the whole list, so later drags take the cheap path again.\n *\n * Callers persist every entry in the returned map, not just the dragged ids.\n * Returns null only for structurally invalid input (empty or unknown block);\n * no-op detection stays with `moveIds`, which callers run first.\n */\nexport const planRankUpdates = ({\n orderedIds,\n draggedIds,\n rankById,\n gap = DEFAULT_RANK_GAP,\n}: PlanRankUpdatesInput): Record<string, number> | null => {\n if (!Number.isFinite(gap) || gap <= 0) {\n return null;\n }\n\n const block = orderedDraggedIds(orderedIds, draggedIds);\n if (block.length === 0 || block.length !== new Set(draggedIds).size) {\n return null;\n }\n\n const draggedIdSet = new Set(block);\n const interpolated = interpolateRanks({\n draggedIds,\n gap,\n orderedIds,\n rankById,\n });\n if (interpolated) {\n let previous = Number.NEGATIVE_INFINITY;\n let strictlyAscending = true;\n for (const id of orderedIds) {\n const rank = draggedIdSet.has(id) ? interpolated[id] : rankById[id];\n if (\n typeof rank !== \"number\" ||\n !Number.isFinite(rank) ||\n rank <= previous\n ) {\n strictlyAscending = false;\n break;\n }\n previous = rank;\n }\n if (strictlyAscending) {\n return interpolated;\n }\n }\n\n return Object.fromEntries(\n orderedIds.map((id, index) => [id, gap * (index + 1)])\n );\n};\n","import { DEFAULT_RANK_GAP } from \"@donebear/rank-logic\";\nimport { buildTaskStartFields } from \"@donebear/task-logic\";\nimport type { ActiveTaskView } from \"@donebear/task-logic\";\n\nexport interface TaskIds {\n taskId: string;\n workspaceId: string;\n creatorId: string;\n}\n\nexport interface TaskInsertInput {\n ids: TaskIds;\n now: number;\n todayEpoch: number;\n title: string;\n view: ActiveTaskView;\n description?: string | null;\n deadlineAt?: number | null;\n projectId?: string | null;\n sortOrder?: number;\n startDate?: number | null;\n teamId?: string | null;\n todaySortOrder?: number;\n}\n\nexport interface TaskUpdateChanges {\n title?: string;\n description?: string | null;\n deadlineAt?: number | null;\n projectId?: string | null;\n sortOrder?: number;\n startDate?: number | null;\n teamId?: string | null;\n todaySortOrder?: number;\n view?: ActiveTaskView;\n}\n\nexport interface TaskUpdateInput {\n now: number;\n todayEpoch?: number;\n changes: TaskUpdateChanges;\n}\n\nexport type MutationAction =\n | \"INSERT\"\n | \"UPDATE\"\n | \"ARCHIVE\"\n | \"UNARCHIVE\"\n | \"DELETE\";\n\nexport interface MutationTransaction {\n action: MutationAction;\n modelId: string;\n modelName: string;\n payload: Record<string, unknown>;\n}\n\nexport interface MutateEnvelopeInput {\n transactions: MutationTransaction[];\n batchId: string;\n clientId: string;\n clientTxIds: string[];\n}\n\nconst startFieldsForView = (\n view: ActiveTaskView,\n todayEpoch: number,\n startDate?: number | null\n) => ({\n ...buildTaskStartFields(view, { startDate, todayEpoch }),\n todayIndexReferenceDate: view === \"today\" ? todayEpoch : null,\n});\n\nexport const buildTaskInsertFields = (\n input: TaskInsertInput\n): Record<string, unknown> => ({\n archivedAt: null,\n completedAt: null,\n createdAt: input.now,\n creatorId: input.ids.creatorId,\n deadlineAt: input.deadlineAt ?? null,\n description: input.description ?? null,\n projectId: input.projectId ?? null,\n sortOrder: input.sortOrder ?? DEFAULT_RANK_GAP,\n teamId: input.teamId ?? null,\n title: input.title,\n todaySortOrder: input.todaySortOrder ?? DEFAULT_RANK_GAP,\n updatedAt: input.now,\n workspaceId: input.ids.workspaceId,\n ...startFieldsForView(input.view, input.todayEpoch, input.startDate),\n});\n\nexport const buildTaskUpdateFields = (\n input: TaskUpdateInput\n): Record<string, unknown> => {\n const { changes } = input;\n const fields: Record<string, unknown> = { updatedAt: input.now };\n\n if (changes.title !== undefined) {\n fields.title = changes.title;\n }\n if (changes.description !== undefined) {\n fields.description = changes.description;\n }\n if (changes.deadlineAt !== undefined) {\n fields.deadlineAt = changes.deadlineAt;\n }\n if (changes.projectId !== undefined) {\n fields.projectId = changes.projectId;\n }\n if (changes.sortOrder !== undefined) {\n fields.sortOrder = changes.sortOrder;\n }\n if (changes.teamId !== undefined) {\n fields.teamId = changes.teamId;\n }\n if (changes.todaySortOrder !== undefined) {\n fields.todaySortOrder = changes.todaySortOrder;\n }\n\n if (changes.view !== undefined) {\n if (input.todayEpoch === undefined) {\n throw new Error(\"todayEpoch is required when changing a task view\");\n }\n Object.assign(\n fields,\n startFieldsForView(changes.view, input.todayEpoch, changes.startDate)\n );\n } else if (changes.startDate !== undefined) {\n fields.startDate = changes.startDate;\n }\n\n return fields;\n};\n\nexport const buildMutateEnvelope = ({\n batchId,\n clientId,\n clientTxIds,\n transactions,\n}: MutateEnvelopeInput): {\n batchId: string;\n transactions: (MutationTransaction & {\n clientId: string;\n clientTxId: string;\n })[];\n} => {\n if (transactions.length !== clientTxIds.length) {\n throw new Error(\n \"A client transaction ID is required for every transaction\"\n );\n }\n\n return {\n batchId,\n transactions: transactions.map((transaction, index) => {\n const clientTxId = clientTxIds[index];\n if (!clientTxId) {\n throw new Error(\"Client transaction IDs cannot be empty\");\n }\n\n return { ...transaction, clientId, clientTxId };\n }),\n };\n};\n","import type { MutationTransaction } from \"./mutations\";\n\nexport interface SyncMutateTransaction extends MutationTransaction {\n clientId: string;\n clientTxId: string;\n}\n\nexport interface SyncMutateRequest {\n batchId: string;\n transactions: SyncMutateTransaction[];\n}\n\nexport interface SyncMutateResult {\n clientTxId: string;\n success: boolean;\n error?: string;\n syncId?: string;\n}\n\nexport interface SyncMutateResponse {\n lastSyncId: string;\n results: SyncMutateResult[];\n success: boolean;\n}\n\nexport type SyncMutateFailure =\n | { body: string; status: number; type: \"http\" }\n | { cause: unknown; type: \"invalid-response\" }\n | { cause: unknown; type: \"network\" }\n | { response: SyncMutateResponse; type: \"mutation\" }\n | { cause: unknown; timeoutMs: number; type: \"timeout\" };\n\nexport interface SyncMutateClientOptions {\n baseUrl: string;\n errorMapper?: (failure: SyncMutateFailure) => Error;\n fetch?: typeof globalThis.fetch;\n getToken: () => string | Promise<string>;\n timeoutMs?: number;\n}\n\nexport interface SyncMutateOptions {\n signal?: AbortSignal;\n}\n\nconst normalizeBaseUrl = (value: string): string =>\n value.endsWith(\"/\") ? value.slice(0, -1) : value;\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null;\n\nconst parseResult = (value: unknown): SyncMutateResult | null => {\n if (!isRecord(value)) {\n return null;\n }\n if (\n typeof value.clientTxId !== \"string\" ||\n typeof value.success !== \"boolean\"\n ) {\n return null;\n }\n if (value.error !== undefined && typeof value.error !== \"string\") {\n return null;\n }\n if (value.syncId !== undefined && typeof value.syncId !== \"string\") {\n return null;\n }\n\n return {\n clientTxId: value.clientTxId,\n success: value.success,\n ...(value.error === undefined ? {} : { error: value.error }),\n ...(value.syncId === undefined ? {} : { syncId: value.syncId }),\n };\n};\n\nconst parseResponse = (value: unknown): SyncMutateResponse | null => {\n if (\n !isRecord(value) ||\n typeof value.success !== \"boolean\" ||\n typeof value.lastSyncId !== \"string\" ||\n !Array.isArray(value.results)\n ) {\n return null;\n }\n\n const results = value.results.map(parseResult);\n if (results.some((result) => result === null)) {\n return null;\n }\n\n return {\n lastSyncId: value.lastSyncId,\n results: results as SyncMutateResult[],\n success: value.success,\n };\n};\n\nconst defaultErrorMapper = (failure: SyncMutateFailure): Error => {\n if (failure.type === \"timeout\") {\n return new Error(`Sync mutation timed out after ${failure.timeoutMs}ms`, {\n cause: failure.cause,\n });\n }\n if (failure.type === \"http\") {\n return new Error(`Sync mutation failed with HTTP ${failure.status}`);\n }\n if (failure.type === \"mutation\") {\n const result = failure.response.results.find((item) => !item.success);\n return new Error(result?.error ?? \"Sync mutation failed\");\n }\n if (failure.type === \"invalid-response\") {\n return new Error(\"Sync mutation returned an invalid response\", {\n cause: failure.cause,\n });\n }\n return failure.cause instanceof Error\n ? failure.cause\n : new Error(\"Sync mutation request failed\", { cause: failure.cause });\n};\n\nconst isTimeoutError = (error: unknown): boolean =>\n error instanceof Error && error.name === \"TimeoutError\";\n\nexport const createSyncMutateClient = ({\n baseUrl,\n errorMapper = defaultErrorMapper,\n fetch: fetchImplementation = globalThis.fetch,\n getToken,\n timeoutMs,\n}: SyncMutateClientOptions) => {\n if (!fetchImplementation) {\n throw new Error(\"A fetch implementation is required\");\n }\n\n const mutate = async (\n request: SyncMutateRequest,\n options: SyncMutateOptions = {}\n ): Promise<SyncMutateResponse> => {\n const timeoutSignal =\n timeoutMs === undefined ? undefined : AbortSignal.timeout(timeoutMs);\n const signal =\n options.signal && timeoutSignal\n ? AbortSignal.any([options.signal, timeoutSignal])\n : (options.signal ?? timeoutSignal);\n\n let response: Response;\n try {\n response = await fetchImplementation(\n `${normalizeBaseUrl(baseUrl)}/sync/mutate`,\n {\n body: JSON.stringify(request),\n headers: {\n Accept: \"application/json\",\n Authorization: `Bearer ${await getToken()}`,\n \"Content-Type\": \"application/json\",\n },\n method: \"POST\",\n signal,\n }\n );\n } catch (error) {\n if (\n timeoutMs !== undefined &&\n (timeoutSignal?.aborted || isTimeoutError(error))\n ) {\n throw errorMapper({ cause: error, timeoutMs, type: \"timeout\" });\n }\n throw errorMapper({ cause: error, type: \"network\" });\n }\n\n if (!response.ok) {\n throw errorMapper({\n body: await response.text(),\n status: response.status,\n type: \"http\",\n });\n }\n\n let raw: unknown;\n try {\n raw = (await response.json()) as unknown;\n } catch (error) {\n throw errorMapper({ cause: error, type: \"invalid-response\" });\n }\n\n const payload = parseResponse(raw);\n if (!payload) {\n throw errorMapper({\n cause: new TypeError(\"Malformed sync mutation response\"),\n type: \"invalid-response\",\n });\n }\n if (!payload.success) {\n throw errorMapper({ response: payload, type: \"mutation\" });\n }\n\n return payload;\n };\n\n return { mutate };\n};\n","import { TASK_FIELDS as TASK_FIELD_SELECTION } from \"@donebear/sync-schema\";\nimport { parseDateOnlyInputToEpoch } from \"@donebear/task-logic\";\n\nexport { TASK_FIELDS } from \"@donebear/sync-schema\";\nexport * from \"./mutations\";\nexport * from \"./sync-mutate\";\n\nexport interface GraphqlError {\n message?: string;\n}\n\nexport interface GraphqlResponse<TData> {\n data?: TData;\n errors?: GraphqlError[];\n}\n\nexport interface PageInfo {\n hasNextPage: boolean;\n endCursor: string | null;\n}\n\nexport interface PaginatedConnection<TNode> {\n nodes: TNode[];\n pageInfo: PageInfo;\n}\n\nexport interface TaskGraphqlNode {\n id: string;\n number: number;\n title: string;\n description: string | null;\n createdAt: string;\n updatedAt: string;\n completedAt: string | null;\n archivedAt: string | null;\n start: string;\n startDate: string | null;\n startBucket: string;\n todayIndexReferenceDate: string | null;\n deadlineAt: string | null;\n creatorId: string;\n workspaceId: string;\n projectId: string | null;\n teamId: string | null;\n assigneeId: string | null;\n headingId: string | null;\n repeatRule: string | null;\n repeatTemplateId: string | null;\n}\n\nexport interface TaskRecord {\n id: string;\n number: number;\n title: string;\n description: string | null;\n createdAt: number | null;\n updatedAt: number | null;\n completedAt: number | null;\n archivedAt: number | null;\n start: string;\n startDate: number | null;\n startBucket: string;\n todayIndexReferenceDate: number | null;\n deadlineAt: number | null;\n creatorId: string;\n workspaceId: string;\n projectId: string | null;\n teamId: string | null;\n assigneeId: string | null;\n headingId: string | null;\n repeatRule: string | null;\n repeatTemplateId: string | null;\n}\n\nexport interface WorkspaceSummary {\n id: string;\n name: string;\n urlKey: string | null;\n logoUrl: string | null;\n createdAt: string;\n updatedAt: string;\n role: string;\n}\n\nexport interface ViewerInfo {\n id: string;\n email: string | null;\n}\n\nexport interface GraphqlClientOptions {\n baseUrl: string;\n errorMapper?: (failure: GraphqlRequestFailure) => Error;\n getToken: () => string | Promise<string>;\n fetch?: typeof globalThis.fetch;\n timeoutMs?: number;\n}\n\nexport interface GraphqlRequestOptions {\n query: string;\n signal?: AbortSignal;\n variables?: Record<string, unknown>;\n}\n\nexport type GraphqlRequestFailure =\n | { type: \"graphql\"; errors: GraphqlError[] }\n | { type: \"http\"; body: string; status: number }\n | { cause: unknown; type: \"network\" }\n | { type: \"missing-data\" }\n | { cause: unknown; timeoutMs: number; type: \"timeout\" };\n\nexport interface PaginateOptions<TNode, TRecord> extends GraphqlRequestOptions {\n nodeKey: string;\n transform: (node: TNode) => TRecord;\n pageSize?: number;\n}\n\nconst TASKS_QUERY = `\n query DonebearTasks($first: Int!, $after: String, $workspaceId: ID!) {\n tasks(first: $first, after: $after, filter: { workspaceId: { eq: $workspaceId } }) {\n nodes { ${TASK_FIELD_SELECTION} }\n pageInfo { hasNextPage endCursor }\n }\n }\n`;\n\nconst TASK_BY_NUMBER_QUERY = `\n query DonebearTaskByNumber($workspaceId: ID!, $number: Int!) {\n taskByNumber(workspaceId: $workspaceId, number: $number) {\n ${TASK_FIELD_SELECTION}\n }\n }\n`;\n\nconst MY_WORKSPACES_QUERY = `\n query MyWorkspaces {\n myWorkspaces {\n id name urlKey logoUrl role createdAt updatedAt\n }\n }\n`;\n\nconst VIEWER_QUERY = `\n query Viewer {\n viewer {\n id\n email\n }\n }\n`;\n\nconst normalizeBaseUrl = (value: string): string =>\n value.endsWith(\"/\") ? value.slice(0, -1) : value;\n\nconst toInstantEpoch = (value: string | null): number | null => {\n if (typeof value !== \"string\") {\n return null;\n }\n\n const epoch = Date.parse(value);\n return Number.isFinite(epoch) ? epoch : null;\n};\n\nexport const toTaskRecord = (node: TaskGraphqlNode): TaskRecord => ({\n archivedAt: toInstantEpoch(node.archivedAt),\n assigneeId: node.assigneeId,\n completedAt: toInstantEpoch(node.completedAt),\n createdAt: toInstantEpoch(node.createdAt),\n creatorId: node.creatorId,\n deadlineAt: parseDateOnlyInputToEpoch(node.deadlineAt),\n description: node.description,\n headingId: node.headingId,\n id: node.id,\n number: node.number,\n projectId: node.projectId,\n repeatRule: node.repeatRule,\n repeatTemplateId: node.repeatTemplateId,\n start: node.start,\n startBucket: node.startBucket,\n startDate: parseDateOnlyInputToEpoch(node.startDate),\n teamId: node.teamId,\n title: node.title,\n todayIndexReferenceDate: parseDateOnlyInputToEpoch(\n node.todayIndexReferenceDate\n ),\n updatedAt: toInstantEpoch(node.updatedAt),\n workspaceId: node.workspaceId,\n});\n\nconst defaultErrorMapper = (failure: GraphqlRequestFailure): Error => {\n if (failure.type === \"timeout\") {\n return new Error(`GraphQL request timed out after ${failure.timeoutMs}ms`, {\n cause: failure.cause,\n });\n }\n\n if (failure.type === \"http\") {\n return new Error(`GraphQL request failed with HTTP ${failure.status}`);\n }\n\n if (failure.type === \"graphql\") {\n return new Error(failure.errors[0]?.message ?? \"GraphQL request failed\");\n }\n\n if (failure.type === \"missing-data\") {\n return new Error(\"GraphQL request returned no data\");\n }\n\n return failure.cause instanceof Error\n ? failure.cause\n : new Error(\"GraphQL request failed\", { cause: failure.cause });\n};\n\nconst isTimeoutError = (error: unknown): boolean =>\n error instanceof Error && error.name === \"TimeoutError\";\n\nexport const createGraphqlClient = ({\n baseUrl,\n errorMapper = defaultErrorMapper,\n fetch: fetchImplementation = globalThis.fetch,\n getToken,\n timeoutMs,\n}: GraphqlClientOptions) => {\n if (!fetchImplementation) {\n throw new Error(\"A fetch implementation is required\");\n }\n\n const graphqlRequest = async <TData>({\n query,\n signal: requestSignal,\n variables = {},\n }: GraphqlRequestOptions): Promise<TData> => {\n const timeoutSignal =\n timeoutMs === undefined ? undefined : AbortSignal.timeout(timeoutMs);\n const signal =\n requestSignal && timeoutSignal\n ? AbortSignal.any([requestSignal, timeoutSignal])\n : (requestSignal ?? timeoutSignal);\n\n let response: Response;\n try {\n response = await fetchImplementation(\n `${normalizeBaseUrl(baseUrl)}/graphql`,\n {\n body: JSON.stringify({ query, variables }),\n headers: {\n Authorization: `Bearer ${await getToken()}`,\n \"Content-Type\": \"application/json\",\n },\n method: \"POST\",\n signal,\n }\n );\n } catch (error) {\n if (\n timeoutMs !== undefined &&\n (timeoutSignal?.aborted || isTimeoutError(error))\n ) {\n throw errorMapper({ cause: error, timeoutMs, type: \"timeout\" });\n }\n throw errorMapper({ cause: error, type: \"network\" });\n }\n\n if (!response.ok) {\n throw errorMapper({\n body: await response.text(),\n status: response.status,\n type: \"http\",\n });\n }\n\n let payload: GraphqlResponse<TData>;\n try {\n payload = (await response.json()) as GraphqlResponse<TData>;\n } catch (error) {\n throw errorMapper({ cause: error, type: \"network\" });\n }\n\n if (payload.errors?.length) {\n throw errorMapper({ errors: payload.errors, type: \"graphql\" });\n }\n\n if (payload.data === undefined) {\n throw errorMapper({ type: \"missing-data\" });\n }\n\n return payload.data;\n };\n\n const paginate = async <TNode, TRecord>({\n nodeKey,\n pageSize = 100,\n query,\n signal,\n transform,\n variables = {},\n }: PaginateOptions<TNode, TRecord>): Promise<TRecord[]> => {\n const records: TRecord[] = [];\n let after: string | null = null;\n\n for (let pageCount = 0; pageCount < 1000; pageCount += 1) {\n const data: Record<\n string,\n PaginatedConnection<TNode>\n > = await graphqlRequest<Record<string, PaginatedConnection<TNode>>>({\n query,\n signal,\n variables: { ...variables, after, first: pageSize },\n });\n const connection: PaginatedConnection<TNode> | undefined = data[nodeKey];\n\n if (!connection) {\n throw new Error(`GraphQL response is missing connection: ${nodeKey}`);\n }\n\n for (const node of connection.nodes) {\n records.push(transform(node));\n }\n\n if (!connection.pageInfo.hasNextPage) {\n return records;\n }\n\n if (!connection.pageInfo.endCursor) {\n throw new Error(\"GraphQL page has no end cursor\");\n }\n\n after = connection.pageInfo.endCursor;\n }\n\n throw new Error(\"GraphQL pagination exceeded safe page limit\");\n };\n\n const listWorkspaces = async (): Promise<WorkspaceSummary[]> => {\n const data = await graphqlRequest<{\n myWorkspaces: WorkspaceSummary[];\n }>({ query: MY_WORKSPACES_QUERY });\n\n return data.myWorkspaces.map((workspace) => ({ ...workspace }));\n };\n\n const loadViewer = async (): Promise<ViewerInfo | null> => {\n const data = await graphqlRequest<{\n viewer: { email: string | null; id: string } | null;\n }>({ query: VIEWER_QUERY });\n\n if (!data.viewer) {\n return null;\n }\n\n return {\n email: data.viewer.email ?? null,\n id: data.viewer.id,\n };\n };\n\n const listTasks = (workspaceId: string): Promise<TaskRecord[]> =>\n paginate<TaskGraphqlNode, TaskRecord>({\n nodeKey: \"tasks\",\n query: TASKS_QUERY,\n transform: toTaskRecord,\n variables: { workspaceId },\n });\n\n const loadTaskByNumber = async (\n workspaceId: string,\n number: number\n ): Promise<TaskRecord | null> => {\n const data = await graphqlRequest<{\n taskByNumber: TaskGraphqlNode | null;\n }>({\n query: TASK_BY_NUMBER_QUERY,\n variables: { number, workspaceId },\n });\n\n return data.taskByNumber ? toTaskRecord(data.taskByNumber) : null;\n };\n\n return {\n graphqlRequest,\n listTasks,\n listWorkspaces,\n loadTaskByNumber,\n loadViewer,\n paginate,\n };\n};\n","import { CliError, EXIT_CODES } from \"../errors\";\nimport type { CliContext } from \"../types\";\n\nexport const extractErrorMessage = (value: unknown): string => {\n if (typeof value === \"string\") {\n return value;\n }\n if (typeof value !== \"object\" || value === null) {\n return \"Request failed\";\n }\n const record = value as Record<string, unknown>;\n if (typeof record.message === \"string\") {\n return record.message;\n }\n if (typeof record.error === \"string\") {\n return record.error;\n }\n return \"Request failed\";\n};\n\nconst apiRequest = async (\n _context: CliContext,\n endpoint: string,\n options: {\n method?: \"GET\" | \"POST\" | \"DELETE\";\n token: string;\n body?: unknown;\n }\n): Promise<Response> => {\n const headers = new Headers({\n Accept: \"application/json\",\n Authorization: `Bearer ${options.token}`,\n });\n\n if (options.body !== undefined) {\n headers.set(\"Content-Type\", \"application/json\");\n }\n\n const response = await fetch(endpoint, {\n body: options.body === undefined ? undefined : JSON.stringify(options.body),\n headers,\n method: options.method ?? \"GET\",\n });\n\n if (response.ok) {\n return response;\n }\n\n const raw = await response.text();\n let parsed: unknown = null;\n\n try {\n parsed = raw.length > 0 ? (JSON.parse(raw) as unknown) : null;\n } catch {\n parsed = null;\n }\n\n let message = `HTTP ${response.status}`;\n\n if (parsed !== null) {\n message = extractErrorMessage(parsed);\n } else if (raw.length > 0) {\n message = raw;\n }\n\n const exitCode =\n response.status === 401 || response.status === 403\n ? EXIT_CODES.AUTH_REQUIRED\n : EXIT_CODES.ERROR;\n\n throw new CliError(message, exitCode);\n};\n\nexport const requestJson = async <T>(\n context: CliContext,\n endpoint: string,\n options: {\n method?: \"GET\" | \"POST\" | \"DELETE\";\n token: string;\n body?: unknown;\n }\n): Promise<T> => {\n const response = await apiRequest(context, endpoint, options);\n return (await response.json()) as T;\n};\n\n/**\n * Streaming NDJSON endpoints report mid-stream failures as a data line on a\n * response that already sent HTTP 200, so a truncated stream is indistinguishable\n * from a complete one at the transport layer. `/sync/bootstrap` yields\n * `{ type: \"error\", message }` for this; every data row it emits carries `__class`,\n * so an untagged error line is unambiguous.\n */\nexport const findNdjsonErrorMessage = (rows: unknown[]): string | null => {\n for (const row of rows) {\n if (typeof row !== \"object\" || row === null) {\n continue;\n }\n\n const record = row as Record<string, unknown>;\n if (record.__class !== undefined || record.type !== \"error\") {\n continue;\n }\n\n return typeof record.message === \"string\"\n ? record.message\n : \"Streaming request failed\";\n }\n\n return null;\n};\n\nexport const requestNdjson = async (\n context: CliContext,\n endpoint: string,\n options: {\n method?: \"GET\" | \"POST\";\n token: string;\n body?: unknown;\n }\n): Promise<unknown[]> => {\n const response = await apiRequest(context, endpoint, {\n body: options.body,\n method: options.method ?? (options.body === undefined ? \"GET\" : \"POST\"),\n token: options.token,\n });\n\n const raw = await response.text();\n const lines = raw\n .split(\"\\n\")\n .map((line) => line.trim())\n .filter((line) => line.length > 0);\n\n const parsed: unknown[] = [];\n\n for (const line of lines) {\n parsed.push(JSON.parse(line) as unknown);\n }\n\n const errorMessage = findNdjsonErrorMessage(parsed);\n if (errorMessage !== null) {\n throw new CliError(\n errorMessage,\n EXIT_CODES.NETWORK,\n \"The server failed partway through streaming. Retry; if it persists the response was incomplete and must not be treated as a full result.\"\n );\n }\n\n return parsed;\n};\n","import {\n localDateToDateOnlyEpoch,\n parseDateOnlyInputToEpoch,\n} from \"@donebear/task-logic\";\n\nexport {\n dateOnlyPartsToEpoch,\n epochToDateOnlyParts,\n formatDateOnlyEpoch,\n formatDateOnlyParts,\n isValidDateOnlyParts,\n} from \"@donebear/task-logic\";\nexport type { DateOnlyParts } from \"@donebear/task-logic\";\n\nconst ISO_INSTANT_REGEX =\n /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d{1,9})?(?:Z|[+-]\\d{2}:\\d{2})$/u;\n\nconst isFiniteEpoch = (value: number | null): value is number =>\n typeof value === \"number\" && Number.isFinite(value);\n\nexport const formatInstantEpoch = (epochMs: number | null): string | null => {\n if (!isFiniteEpoch(epochMs)) {\n return null;\n }\n\n const date = new Date(epochMs);\n\n if (Number.isNaN(date.getTime())) {\n return null;\n }\n\n return date.toISOString();\n};\n\nexport const parseApiDateOnlyToEpoch = (value: string | null): number | null =>\n parseDateOnlyInputToEpoch(value);\n\nexport const parseApiInstantToEpoch = (value: string | null): number | null => {\n if (typeof value !== \"string\") {\n return null;\n }\n\n const trimmed = value.trim();\n\n if (trimmed.length === 0 || !ISO_INSTANT_REGEX.test(trimmed)) {\n return null;\n }\n\n const parsed = Date.parse(trimmed);\n return Number.isNaN(parsed) ? null : parsed;\n};\n\nexport const parseCliDateOnlyToEpoch = (\n value: string | undefined,\n fieldLabel: string\n): number | null => {\n if (!value) {\n return null;\n }\n\n const epoch = parseDateOnlyInputToEpoch(value);\n if (epoch === null) {\n throw new Error(`Invalid ${fieldLabel}: ${value}. Expected YYYY-MM-DD.`);\n }\n\n return epoch;\n};\n\nexport const dateOnlyEpochFromLocalDate = (now = new Date()): number =>\n localDateToDateOnlyEpoch(now);\n","import {\n createGraphqlClient,\n createSyncMutateClient,\n toTaskRecord as toTaskRecordFromGraphqlNode,\n} from \"@donebear/manage-client\";\nimport type {\n GraphqlRequestFailure,\n SyncMutateFailure,\n TaskGraphqlNode,\n ViewerInfo,\n} from \"@donebear/manage-client\";\nimport { TASK_FIELDS } from \"@donebear/sync-schema\";\n\nimport { extractErrorMessage, requestJson, requestNdjson } from \"./api/http\";\nimport { DEFAULT_API_URL, DONEBEAR_API_URL_ENV } from \"./constants\";\nimport { parseApiDateOnlyToEpoch, parseApiInstantToEpoch } from \"./date-codecs\";\nimport { readEnvValue } from \"./env\";\nimport { CliError, EXIT_CODES } from \"./errors\";\nimport { writeOutput, writeWarning } from \"./output\";\nimport type {\n ChecklistItemRecord,\n CliContext,\n CommentRecord,\n LabelRecord,\n ProjectRecord,\n TaskAttachmentRecord,\n TaskRecord,\n TeamRecord,\n WorkspaceInvitationRecord,\n WorkspaceJoinResult,\n WorkspaceMemberRecord,\n WorkspaceRecord,\n WorkspaceSummary,\n} from \"./types\";\n\ninterface CreateWorkspaceRequest {\n name: string;\n urlKey: string;\n logoUrl?: string;\n}\n\ninterface SyncBatchRequest {\n requests: {\n modelName: string;\n indexedKey: string;\n keyValue: string;\n }[];\n}\n\ninterface GraphqlRequestBody {\n query: string;\n variables: Record<string, unknown>;\n}\n\ninterface GraphqlError {\n message?: string;\n}\n\ninterface GraphqlResponse<TData> {\n data?: TData;\n errors?: GraphqlError[];\n}\n\ninterface ProjectGraphqlNode {\n id: string;\n key: string;\n name: string;\n description: string | null;\n status: string;\n sortOrder: number;\n targetDate: string | null;\n completedAt: string | null;\n archivedAt: string | null;\n createdAt: string;\n updatedAt: string;\n workspaceId: string;\n creatorId: string;\n}\n\ninterface LabelGraphqlNode {\n id: string;\n title: string;\n workspaceId: string;\n createdAt: string;\n updatedAt: string;\n}\n\ninterface TeamGraphqlNode {\n id: string;\n key: string;\n name: string;\n description: string | null;\n workspaceId: string;\n createdAt: string;\n updatedAt: string;\n archivedAt: string | null;\n}\n\ninterface PaginatedConnection<TNode> {\n nodes: TNode[];\n pageInfo: {\n hasNextPage: boolean;\n endCursor: string | null;\n };\n}\n\nconst TASKS_ALL_QUERY = `\n query DonebearTasksAll($first: Int!, $after: String, $workspaceIds: [ID!]!) {\n tasks(first: $first, after: $after, filter: { workspaceId: { in: $workspaceIds } }) {\n nodes {\n ${TASK_FIELDS}\n }\n pageInfo { hasNextPage endCursor }\n }\n }\n`;\n\nconst PROJECT_FIELDS = `\n id key name description status sortOrder targetDate\n completedAt archivedAt createdAt updatedAt workspaceId creatorId\n`;\n\nconst PROJECTS_QUERY = `\n query DonebearProjects($first: Int!, $after: String, $workspaceId: ID!) {\n projects(first: $first, after: $after, filter: { workspaceId: { eq: $workspaceId } }) {\n nodes { ${PROJECT_FIELDS} }\n pageInfo { hasNextPage endCursor }\n }\n }\n`;\n\nconst PROJECTS_ALL_QUERY = `\n query DonebearProjectsAll($first: Int!, $after: String, $workspaceIds: [ID!]!) {\n projects(first: $first, after: $after, filter: { workspaceId: { in: $workspaceIds } }) {\n nodes { ${PROJECT_FIELDS} }\n pageInfo { hasNextPage endCursor }\n }\n }\n`;\n\nconst LABEL_FIELDS = \"id title workspaceId createdAt updatedAt\";\n\nconst LABELS_QUERY = `\n query DonebearLabels($first: Int!, $after: String, $workspaceId: ID!) {\n labels(first: $first, after: $after, filter: { workspaceId: { eq: $workspaceId } }) {\n nodes { ${LABEL_FIELDS} }\n pageInfo { hasNextPage endCursor }\n }\n }\n`;\n\nconst LABELS_ALL_QUERY = `\n query DonebearLabelsAll($first: Int!, $after: String, $workspaceIds: [ID!]!) {\n labels(first: $first, after: $after, filter: { workspaceId: { in: $workspaceIds } }) {\n nodes { ${LABEL_FIELDS} }\n pageInfo { hasNextPage endCursor }\n }\n }\n`;\n\nconst TEAM_FIELDS =\n \"id key name description workspaceId createdAt updatedAt archivedAt\";\n\nconst TEAMS_QUERY = `\n query DonebearTeams($first: Int!, $after: String, $workspaceId: ID!) {\n teams(first: $first, after: $after, filter: { workspaceId: { eq: $workspaceId } }) {\n nodes { ${TEAM_FIELDS} }\n pageInfo { hasNextPage endCursor }\n }\n }\n`;\n\nconst TEAMS_ALL_QUERY = `\n query DonebearTeamsAll($first: Int!, $after: String, $workspaceIds: [ID!]!) {\n teams(first: $first, after: $after, filter: { workspaceId: { in: $workspaceIds } }) {\n nodes { ${TEAM_FIELDS} }\n pageInfo { hasNextPage endCursor }\n }\n }\n`;\n\nconst WORKSPACE_CREATE_MUTATION = `\n mutation WorkspaceCreate($input: WorkspaceCreateInput!) {\n workspaceCreate(input: $input) {\n success lastSyncId\n workspace { id name urlKey logoUrl createdAt updatedAt archivedAt }\n }\n }\n`;\n\nconst WORKSPACE_JOIN_MUTATION = `\n mutation WorkspaceJoin($code: String!) {\n workspaceJoin(code: $code) {\n success lastSyncId\n workspace { id name urlKey logoUrl createdAt updatedAt archivedAt }\n role\n }\n }\n`;\n\nconst WORKSPACE_MEMBERS_QUERY = `\n query WorkspaceMembers($first: Int!, $after: String, $workspaceId: ID!) {\n workspaceMemberships(first: $first, after: $after, filter: { workspaceId: { eq: $workspaceId } }) {\n nodes {\n id userId workspaceId role createdAt\n user { id email name }\n }\n pageInfo { hasNextPage endCursor }\n }\n }\n`;\n\nconst WORKSPACE_INVITATIONS_QUERY = `\n query WorkspaceInvitations($first: Int!, $after: String, $workspaceId: ID!) {\n workspaceInvitations(first: $first, after: $after, filter: { workspaceId: { eq: $workspaceId } }) {\n nodes { id email code role expiresAt createdAt usedAt usedByUserId workspaceId }\n pageInfo { hasNextPage endCursor }\n }\n }\n`;\n\nconst WORKSPACE_INVITATION_CREATE_MUTATION = `\n mutation WorkspaceInvitationCreate($input: WorkspaceInvitationCreateInput!) {\n workspaceInvitationCreate(input: $input) {\n success lastSyncId\n invitation { id email code role expiresAt createdAt usedAt usedByUserId workspaceId }\n }\n }\n`;\n\nconst WORKSPACE_HISTORY_QUERY = `\n query WorkspaceHistory($workspaceId: ID!, $limit: Int, $model: String) {\n workspaceHistory(workspaceId: $workspaceId, limit: $limit, model: $model) {\n id action modelName modelId payload createdAt userId\n }\n }\n`;\n\nconst API_KEY_CREATE_MUTATION = `\n mutation ApiKeyCreate($label: String!, $scopes: [String!], $workspaceIds: [ID!], $expiresAt: DateTime) {\n apiKeyCreate(label: $label, scopes: $scopes, workspaceIds: $workspaceIds, expiresAt: $expiresAt) {\n success lastSyncId\n apiKey { id label keyPrefix scopes workspaceIds expiresAt createdAt }\n token\n }\n }\n`;\n\nconst API_KEYS_QUERY = `\n query ApiKeys {\n apiKeys { id label keyPrefix scopes workspaceIds expiresAt lastUsedAt revokedAt createdAt }\n }\n`;\n\nconst API_KEY_REVOKE_MUTATION = `\n mutation ApiKeyRevoke($id: ID!) {\n apiKeyRevoke(id: $id) { success lastSyncId }\n }\n`;\n\ninterface WorkspaceGraphqlNode {\n id: string;\n name: string;\n urlKey: string | null;\n logoUrl: string | null;\n createdAt: string;\n updatedAt: string;\n archivedAt: string | null;\n}\n\ninterface WorkspaceMembershipGraphqlNode {\n id: string;\n userId: string;\n workspaceId: string;\n role: string;\n createdAt: string;\n user: {\n id: string;\n email: string | null;\n name: string | null;\n };\n}\n\ninterface WorkspaceInvitationGraphqlNode {\n id: string;\n email: string | null;\n code: string;\n role: string;\n expiresAt: string;\n createdAt: string;\n usedAt: string | null;\n usedByUserId: string | null;\n workspaceId: string;\n}\n\ninterface WorkspaceHistoryGraphqlNode {\n id: string;\n action: string;\n modelName: string;\n modelId: string;\n payload: Record<string, unknown> | null;\n createdAt: string;\n userId: string | null;\n}\n\ninterface ApiKeyGraphqlNode {\n id: string;\n label: string;\n keyPrefix: string;\n scopes: string[];\n workspaceIds: string[] | null;\n expiresAt: string | null;\n lastUsedAt: string | null;\n revokedAt: string | null;\n createdAt: string;\n}\n\nconst normalizeApiUrl = (url: string): string =>\n url.endsWith(\"/\") ? url.slice(0, -1) : url;\n\nconst omitUndefined = (\n entries: Record<string, unknown>\n): Record<string, unknown> =>\n Object.fromEntries(\n Object.entries(entries).filter(([, value]) => value !== undefined)\n );\n\nconst requestGraphql = async <TData>(\n context: CliContext,\n baseUrl: string,\n options: {\n token: string;\n query: string;\n variables: Record<string, unknown>;\n }\n): Promise<TData> => {\n const response = await requestJson<GraphqlResponse<TData>>(\n context,\n `${baseUrl}/graphql`,\n {\n body: {\n query: options.query,\n variables: options.variables,\n } satisfies GraphqlRequestBody,\n method: \"POST\",\n token: options.token,\n }\n );\n\n if (Array.isArray(response.errors) && response.errors.length > 0) {\n const [first] = response.errors;\n throw new CliError(\n typeof first?.message === \"string\"\n ? first.message\n : \"GraphQL request failed\",\n EXIT_CODES.ERROR\n );\n }\n\n if (!response.data) {\n throw new CliError(\"GraphQL request returned no data\", EXIT_CODES.ERROR);\n }\n\n return response.data;\n};\n\nconst paginateGraphql = async <TNode, TRecord>(\n context: CliContext,\n options: {\n baseUrl: string;\n token: string;\n query: string;\n variables: Record<string, unknown>;\n nodeKey: string;\n transform: (node: TNode) => TRecord;\n }\n): Promise<TRecord[]> => {\n const results: TRecord[] = [];\n let after: string | null = null;\n let pageCount = 0;\n\n while (true) {\n pageCount += 1;\n\n if (pageCount > 1000) {\n throw new CliError(\n \"GraphQL pagination exceeded safe page limit\",\n EXIT_CODES.ERROR\n );\n }\n\n const data: Record<\n string,\n PaginatedConnection<TNode>\n > = await requestGraphql(context, options.baseUrl, {\n query: options.query,\n token: options.token,\n variables: {\n after,\n first: 100,\n ...options.variables,\n },\n });\n\n const connection = data[options.nodeKey] as PaginatedConnection<TNode>;\n\n for (const node of connection.nodes) {\n results.push(options.transform(node));\n }\n\n const nextCursor = connection.pageInfo.hasNextPage\n ? connection.pageInfo.endCursor\n : null;\n\n if (!nextCursor) {\n break;\n }\n\n after = nextCursor;\n }\n\n return results;\n};\n\nconst toTaskRecord = (value: unknown): TaskRecord | null => {\n if (typeof value !== \"object\" || value === null) {\n return null;\n }\n\n const row = value as Record<string, unknown>;\n\n if (row.__class !== \"Task\") {\n return null;\n }\n\n if (\n typeof row.id !== \"string\" ||\n typeof row.number !== \"number\" ||\n typeof row.title !== \"string\"\n ) {\n return null;\n }\n\n if (\n typeof row.creatorId !== \"string\" ||\n typeof row.workspaceId !== \"string\" ||\n typeof row.start !== \"string\" ||\n typeof row.startBucket !== \"string\"\n ) {\n return null;\n }\n\n return {\n archivedAt: toNullableNumber(row.archivedAt),\n assigneeId: typeof row.assigneeId === \"string\" ? row.assigneeId : null,\n completedAt: toNullableNumber(row.completedAt),\n createdAt: toNullableNumber(row.createdAt),\n creatorId: row.creatorId,\n deadlineAt: toNullableNumber(row.deadlineAt),\n description: typeof row.description === \"string\" ? row.description : null,\n headingId: typeof row.headingId === \"string\" ? row.headingId : null,\n id: row.id,\n number: row.number,\n projectId: typeof row.projectId === \"string\" ? row.projectId : null,\n repeatRule: typeof row.repeatRule === \"string\" ? row.repeatRule : null,\n repeatTemplateId:\n typeof row.repeatTemplateId === \"string\" ? row.repeatTemplateId : null,\n start: row.start,\n startBucket: row.startBucket,\n startDate: toNullableNumber(row.startDate),\n teamId: typeof row.teamId === \"string\" ? row.teamId : null,\n title: row.title,\n todayIndexReferenceDate: toNullableNumber(row.todayIndexReferenceDate),\n updatedAt: toNullableNumber(row.updatedAt),\n workspaceId: row.workspaceId,\n };\n};\n\nconst toNullableNumber = (input: unknown): number | null => {\n if (input === null || input === undefined) {\n return null;\n }\n\n return typeof input === \"number\" ? input : null;\n};\n\nconst toProjectRecordFromGraphqlNode = (\n node: ProjectGraphqlNode\n): ProjectRecord => ({\n archivedAt: parseApiInstantToEpoch(node.archivedAt),\n completedAt: parseApiInstantToEpoch(node.completedAt),\n createdAt: parseApiInstantToEpoch(node.createdAt),\n creatorId: node.creatorId,\n description: node.description,\n id: node.id,\n key: node.key,\n name: node.name,\n sortOrder: node.sortOrder,\n status: node.status,\n targetDate: parseApiDateOnlyToEpoch(node.targetDate),\n updatedAt: parseApiInstantToEpoch(node.updatedAt),\n workspaceId: node.workspaceId,\n});\n\nconst toLabelRecordFromGraphqlNode = (node: LabelGraphqlNode): LabelRecord => ({\n createdAt: parseApiInstantToEpoch(node.createdAt),\n id: node.id,\n title: node.title,\n updatedAt: parseApiInstantToEpoch(node.updatedAt),\n workspaceId: node.workspaceId,\n});\n\nconst toTeamRecordFromGraphqlNode = (node: TeamGraphqlNode): TeamRecord => ({\n archivedAt: parseApiInstantToEpoch(node.archivedAt),\n createdAt: parseApiInstantToEpoch(node.createdAt),\n description: node.description,\n id: node.id,\n key: node.key,\n name: node.name,\n updatedAt: parseApiInstantToEpoch(node.updatedAt),\n workspaceId: node.workspaceId,\n});\n\nconst toWorkspaceRecordFromGraphqlNode = (\n node: WorkspaceGraphqlNode\n): WorkspaceRecord => ({\n archivedAt: node.archivedAt,\n createdAt: node.createdAt,\n id: node.id,\n logoUrl: node.logoUrl,\n name: node.name,\n updatedAt: node.updatedAt,\n urlKey: node.urlKey,\n});\n\nconst toWorkspaceMemberRecordFromGraphqlNode = (\n node: WorkspaceMembershipGraphqlNode\n): WorkspaceMemberRecord => ({\n createdAt: node.createdAt,\n role: node.role,\n user: {\n avatarUrl: null,\n email: node.user.email,\n id: node.user.id,\n name: node.user.name,\n },\n userId: node.userId,\n});\n\nconst toWorkspaceInvitationRecordFromGraphqlNode = (\n node: WorkspaceInvitationGraphqlNode\n): WorkspaceInvitationRecord => ({\n code: node.code,\n email: node.email,\n expiresAt: node.expiresAt,\n id: node.id,\n role: node.role,\n usedAt: node.usedAt,\n});\n\nconst toWorkspaceHistoryEntryFromGraphqlNode = (\n node: WorkspaceHistoryGraphqlNode\n): WorkspaceHistoryEntry => ({\n action: node.action,\n createdAt: node.createdAt,\n id: node.id,\n modelId: node.modelId,\n modelName: node.modelName,\n payload: node.payload,\n userId: node.userId,\n});\n\nconst toApiKeyRecordFromGraphqlNode = (\n node: ApiKeyGraphqlNode\n): ApiKeyRecord => ({\n createdAt: node.createdAt,\n expiresAt: node.expiresAt,\n id: node.id,\n keyPrefix: node.keyPrefix,\n label: node.label,\n lastUsedAt: node.lastUsedAt,\n revokedAt: node.revokedAt,\n scopes: node.scopes,\n workspaceIds: node.workspaceIds,\n});\n\nconst toChecklistItemRecord = (value: unknown): ChecklistItemRecord | null => {\n if (typeof value !== \"object\" || value === null) {\n return null;\n }\n\n const row = value as Record<string, unknown>;\n\n if (row.__class !== \"TaskChecklistItem\") {\n return null;\n }\n\n if (typeof row.id !== \"string\" || typeof row.title !== \"string\") {\n return null;\n }\n\n if (typeof row.taskId !== \"string\" || typeof row.workspaceId !== \"string\") {\n return null;\n }\n\n return {\n completedAt: toNullableNumber(row.completedAt),\n createdAt: toNullableNumber(row.createdAt),\n id: row.id,\n sortOrder: typeof row.sortOrder === \"number\" ? row.sortOrder : 0,\n taskId: row.taskId,\n title: row.title,\n updatedAt: toNullableNumber(row.updatedAt),\n workspaceId: row.workspaceId,\n };\n};\n\nconst toCommentRecord = (value: unknown): CommentRecord | null => {\n if (typeof value !== \"object\" || value === null) {\n return null;\n }\n\n const row = value as Record<string, unknown>;\n\n if (row.__class !== \"Comment\") {\n return null;\n }\n\n if (typeof row.id !== \"string\" || typeof row.body !== \"string\") {\n return null;\n }\n\n if (\n typeof row.taskId !== \"string\" ||\n typeof row.userId !== \"string\" ||\n typeof row.workspaceId !== \"string\"\n ) {\n return null;\n }\n\n return {\n body: row.body,\n createdAt: toNullableNumber(row.createdAt),\n id: row.id,\n taskId: row.taskId,\n updatedAt: toNullableNumber(row.updatedAt),\n userId: row.userId,\n workspaceId: row.workspaceId,\n };\n};\n\nconst toTaskAttachmentRecord = (\n value: unknown\n): TaskAttachmentRecord | null => {\n if (typeof value !== \"object\" || value === null) {\n return null;\n }\n\n const row = value as Record<string, unknown>;\n\n if (row.__class !== \"TaskAttachment\") {\n return null;\n }\n\n if (typeof row.id !== \"string\" || typeof row.filename !== \"string\") {\n return null;\n }\n\n if (typeof row.taskId !== \"string\" || typeof row.workspaceId !== \"string\") {\n return null;\n }\n\n return {\n createdAt: toNullableNumber(row.createdAt),\n filename: row.filename,\n id: row.id,\n mediaType: typeof row.mediaType === \"string\" ? row.mediaType : \"\",\n sizeBytes: typeof row.sizeBytes === \"number\" ? row.sizeBytes : 0,\n sortOrder: typeof row.sortOrder === \"number\" ? row.sortOrder : 0,\n status: typeof row.status === \"string\" ? row.status : \"pending\",\n taskId: row.taskId,\n updatedAt: toNullableNumber(row.updatedAt),\n workspaceId: row.workspaceId,\n };\n};\n\n/** A task's comment thread, oldest first. */\nexport const loadCommentsByTask = async (\n context: CliContext,\n options: {\n baseUrl: string;\n token: string;\n taskId: string;\n }\n): Promise<CommentRecord[]> => {\n const url = `${options.baseUrl}/sync/batch`;\n const body: SyncBatchRequest = {\n requests: [\n {\n indexedKey: \"taskId\",\n keyValue: options.taskId,\n modelName: \"Comment\",\n },\n ],\n };\n\n const rows = await requestNdjson(context, url, {\n body,\n token: options.token,\n });\n\n const results: CommentRecord[] = [];\n\n for (const row of rows) {\n const comment = toCommentRecord(row);\n\n if (comment) {\n results.push(comment);\n }\n }\n\n // A null createdAt sorts first rather than shuffling the rest around it.\n return results.toSorted((a, b) => (a.createdAt ?? 0) - (b.createdAt ?? 0));\n};\n\nexport const loadReadyTaskAttachmentsByTask = async (\n context: CliContext,\n options: {\n baseUrl: string;\n token: string;\n taskId: string;\n }\n): Promise<TaskAttachmentRecord[]> => {\n const url = `${options.baseUrl}/sync/batch`;\n const body: SyncBatchRequest = {\n requests: [\n {\n indexedKey: \"taskId\",\n keyValue: options.taskId,\n modelName: \"TaskAttachment\",\n },\n ],\n };\n\n const rows = await requestNdjson(context, url, {\n body,\n token: options.token,\n });\n\n const results: TaskAttachmentRecord[] = [];\n\n for (const row of rows) {\n const attachment = toTaskAttachmentRecord(row);\n\n if (attachment) {\n results.push(attachment);\n }\n }\n\n return results\n .filter((attachment) => attachment.status === \"ready\")\n .toSorted((a, b) => a.sortOrder - b.sortOrder);\n};\n\nexport const resolveApiBaseUrl = (context: CliContext): string => {\n const fromContext = context.apiUrlOverride?.trim();\n\n if (fromContext) {\n return normalizeApiUrl(fromContext);\n }\n\n const fromEnv = readEnvValue(DONEBEAR_API_URL_ENV);\n\n return normalizeApiUrl(fromEnv ?? DEFAULT_API_URL);\n};\n\nexport type { ViewerInfo };\n\nconst mapGraphqlFailure = (failure: GraphqlRequestFailure): Error => {\n if (failure.type === \"http\") {\n let parsed: unknown = null;\n if (failure.body.length > 0) {\n try {\n parsed = JSON.parse(failure.body) as unknown;\n } catch {\n parsed = null;\n }\n }\n\n let message = `HTTP ${failure.status}`;\n if (parsed === null) {\n if (failure.body.length > 0) {\n message = failure.body;\n }\n } else {\n message = extractErrorMessage(parsed);\n }\n\n return new CliError(\n message,\n failure.status === 401 || failure.status === 403\n ? EXIT_CODES.AUTH_REQUIRED\n : EXIT_CODES.ERROR\n );\n }\n\n if (failure.type === \"graphql\") {\n return new CliError(\n failure.errors[0]?.message ?? \"GraphQL request failed\",\n EXIT_CODES.ERROR\n );\n }\n\n if (failure.type === \"missing-data\") {\n return new CliError(\"GraphQL request returned no data\", EXIT_CODES.ERROR);\n }\n\n if (failure.type === \"timeout\") {\n return new CliError(\n `GraphQL request timed out after ${failure.timeoutMs}ms`,\n EXIT_CODES.ERROR\n );\n }\n\n if (failure.cause instanceof Error) {\n return failure.cause;\n }\n\n return new CliError(\"GraphQL request failed\", EXIT_CODES.ERROR);\n};\n\nexport const loadViewer = async (\n _context: CliContext,\n options: { baseUrl: string; token: string }\n): Promise<ViewerInfo> => {\n const viewer = await createGraphqlClient({\n baseUrl: options.baseUrl,\n errorMapper: mapGraphqlFailure,\n getToken: () => options.token,\n }).loadViewer();\n\n if (!viewer) {\n throw new CliError(\n \"Could not resolve current user. The token may be invalid or revoked.\",\n EXIT_CODES.AUTH_REQUIRED\n );\n }\n\n return viewer;\n};\n\nexport const listWorkspaces = async (\n _context: CliContext,\n options: { baseUrl: string; token: string }\n): Promise<WorkspaceSummary[]> =>\n await createGraphqlClient({\n baseUrl: options.baseUrl,\n getToken: () => options.token,\n }).listWorkspaces();\n\nexport const createWorkspace = async (\n context: CliContext,\n options: {\n baseUrl: string;\n token: string;\n body: CreateWorkspaceRequest;\n }\n): Promise<WorkspaceRecord> => {\n const data = await requestGraphql<{\n workspaceCreate: {\n success: boolean;\n lastSyncId: string;\n workspace: WorkspaceGraphqlNode;\n };\n }>(context, options.baseUrl, {\n query: WORKSPACE_CREATE_MUTATION,\n token: options.token,\n variables: { input: options.body },\n });\n\n return toWorkspaceRecordFromGraphqlNode(data.workspaceCreate.workspace);\n};\n\nexport const joinWorkspace = async (\n context: CliContext,\n options: {\n baseUrl: string;\n token: string;\n code: string;\n }\n): Promise<WorkspaceJoinResult> => {\n const data = await requestGraphql<{\n workspaceJoin: {\n success: boolean;\n lastSyncId: string;\n workspace: WorkspaceGraphqlNode;\n role: string;\n };\n }>(context, options.baseUrl, {\n query: WORKSPACE_JOIN_MUTATION,\n token: options.token,\n variables: { code: options.code },\n });\n\n return {\n role: data.workspaceJoin.role,\n workspace: toWorkspaceRecordFromGraphqlNode(data.workspaceJoin.workspace),\n };\n};\n\nexport const loadTasksByWorkspace = (\n _context: CliContext,\n options: {\n baseUrl: string;\n token: string;\n workspaceId: string;\n }\n): Promise<TaskRecord[]> =>\n createGraphqlClient({\n baseUrl: options.baseUrl,\n getToken: () => options.token,\n }).listTasks(options.workspaceId);\n\nexport const loadTaskByNumber = (\n _context: CliContext,\n options: {\n baseUrl: string;\n number: number;\n token: string;\n workspaceId: string;\n }\n): Promise<TaskRecord | null> =>\n createGraphqlClient({\n baseUrl: options.baseUrl,\n getToken: () => options.token,\n }).loadTaskByNumber(options.workspaceId, options.number);\n\nexport const loadTasksByWorkspaceIds = (\n context: CliContext,\n options: {\n baseUrl: string;\n token: string;\n workspaceIds: string[];\n }\n): Promise<TaskRecord[]> =>\n paginateGraphql<TaskGraphqlNode, TaskRecord>(context, {\n baseUrl: options.baseUrl,\n nodeKey: \"tasks\",\n query: TASKS_ALL_QUERY,\n token: options.token,\n transform: toTaskRecordFromGraphqlNode,\n variables: { workspaceIds: options.workspaceIds },\n });\n\nexport const loadTaskById = async (\n context: CliContext,\n options: {\n baseUrl: string;\n token: string;\n taskId: string;\n }\n): Promise<TaskRecord | null> => {\n const url = `${options.baseUrl}/sync/batch`;\n const body: SyncBatchRequest = {\n requests: [\n {\n indexedKey: \"id\",\n keyValue: options.taskId,\n modelName: \"Task\",\n },\n ],\n };\n\n const rows = await requestNdjson(context, url, {\n body,\n token: options.token,\n });\n\n for (const row of rows) {\n const task = toTaskRecord(row);\n\n if (task) {\n return task;\n }\n }\n\n return null;\n};\n\nexport const loadProjectsByWorkspace = (\n context: CliContext,\n options: {\n baseUrl: string;\n token: string;\n workspaceId: string;\n }\n): Promise<ProjectRecord[]> =>\n paginateGraphql<ProjectGraphqlNode, ProjectRecord>(context, {\n baseUrl: options.baseUrl,\n nodeKey: \"projects\",\n query: PROJECTS_QUERY,\n token: options.token,\n transform: toProjectRecordFromGraphqlNode,\n variables: { workspaceId: options.workspaceId },\n });\n\nexport const loadProjectsByWorkspaceIds = (\n context: CliContext,\n options: {\n baseUrl: string;\n token: string;\n workspaceIds: string[];\n }\n): Promise<ProjectRecord[]> =>\n paginateGraphql<ProjectGraphqlNode, ProjectRecord>(context, {\n baseUrl: options.baseUrl,\n nodeKey: \"projects\",\n query: PROJECTS_ALL_QUERY,\n token: options.token,\n transform: toProjectRecordFromGraphqlNode,\n variables: { workspaceIds: options.workspaceIds },\n });\n\nexport const loadLabelsByWorkspace = (\n context: CliContext,\n options: {\n baseUrl: string;\n token: string;\n workspaceId: string;\n }\n): Promise<LabelRecord[]> =>\n paginateGraphql<LabelGraphqlNode, LabelRecord>(context, {\n baseUrl: options.baseUrl,\n nodeKey: \"labels\",\n query: LABELS_QUERY,\n token: options.token,\n transform: toLabelRecordFromGraphqlNode,\n variables: { workspaceId: options.workspaceId },\n });\n\nexport const loadLabelsByWorkspaceIds = (\n context: CliContext,\n options: {\n baseUrl: string;\n token: string;\n workspaceIds: string[];\n }\n): Promise<LabelRecord[]> =>\n paginateGraphql<LabelGraphqlNode, LabelRecord>(context, {\n baseUrl: options.baseUrl,\n nodeKey: \"labels\",\n query: LABELS_ALL_QUERY,\n token: options.token,\n transform: toLabelRecordFromGraphqlNode,\n variables: { workspaceIds: options.workspaceIds },\n });\n\nexport const loadTeamsByWorkspace = (\n context: CliContext,\n options: {\n baseUrl: string;\n token: string;\n workspaceId: string;\n }\n): Promise<TeamRecord[]> =>\n paginateGraphql<TeamGraphqlNode, TeamRecord>(context, {\n baseUrl: options.baseUrl,\n nodeKey: \"teams\",\n query: TEAMS_QUERY,\n token: options.token,\n transform: toTeamRecordFromGraphqlNode,\n variables: { workspaceId: options.workspaceId },\n });\n\nexport const loadTeamsByWorkspaceIds = (\n context: CliContext,\n options: {\n baseUrl: string;\n token: string;\n workspaceIds: string[];\n }\n): Promise<TeamRecord[]> =>\n paginateGraphql<TeamGraphqlNode, TeamRecord>(context, {\n baseUrl: options.baseUrl,\n nodeKey: \"teams\",\n query: TEAMS_ALL_QUERY,\n token: options.token,\n transform: toTeamRecordFromGraphqlNode,\n variables: { workspaceIds: options.workspaceIds },\n });\n\nexport const loadChecklistItemsByTask = async (\n context: CliContext,\n options: {\n baseUrl: string;\n token: string;\n taskId: string;\n }\n): Promise<ChecklistItemRecord[]> => {\n const url = `${options.baseUrl}/sync/batch`;\n const body: SyncBatchRequest = {\n requests: [\n {\n indexedKey: \"taskId\",\n keyValue: options.taskId,\n modelName: \"TaskChecklistItem\",\n },\n ],\n };\n\n const rows = await requestNdjson(context, url, {\n body,\n token: options.token,\n });\n\n const results: ChecklistItemRecord[] = [];\n\n for (const row of rows) {\n const item = toChecklistItemRecord(row);\n\n if (item) {\n results.push(item);\n }\n }\n\n return results;\n};\n\nconst mapSyncMutateFailure = (failure: SyncMutateFailure): Error => {\n if (failure.type === \"http\") {\n const { body: responseBody, status } = failure;\n let body: unknown = responseBody;\n try {\n body =\n responseBody.length > 0 ? (JSON.parse(responseBody) as unknown) : null;\n } catch {\n // A plain-text upstream response is already a useful error message.\n }\n\n const exitCode =\n status === 401 || status === 403\n ? EXIT_CODES.AUTH_REQUIRED\n : EXIT_CODES.ERROR;\n return new CliError(extractErrorMessage(body), exitCode);\n }\n if (failure.type === \"mutation\") {\n const result = failure.response.results.find((item) => !item.success);\n return new CliError(\n result?.error ?? \"Sync mutation failed\",\n EXIT_CODES.ERROR\n );\n }\n if (failure.type === \"timeout\") {\n return new CliError(\n `Sync mutation timed out after ${failure.timeoutMs}ms`,\n EXIT_CODES.ERROR\n );\n }\n if (failure.cause instanceof Error) {\n return failure.cause;\n }\n return new CliError(\"Sync mutation request failed\", EXIT_CODES.ERROR);\n};\n\nexport const mutateModel = async (\n context: CliContext,\n options: {\n baseUrl: string;\n token: string;\n request: {\n batchId: string;\n transactions: {\n clientTxId: string;\n clientId: string;\n modelName: string;\n modelId: string;\n action: \"INSERT\" | \"UPDATE\" | \"ARCHIVE\" | \"UNARCHIVE\" | \"DELETE\";\n payload: Record<string, unknown>;\n }[];\n };\n }\n): Promise<void> => {\n if (context.dryRun) {\n writeWarning(context, \"dry run: mutation skipped\");\n writeOutput(context, {\n dryRun: true,\n transactions: options.request.transactions.map((tx) => ({\n action: tx.action,\n modelId: tx.modelId,\n modelName: tx.modelName,\n payload: tx.payload,\n })),\n });\n return;\n }\n\n const client = createSyncMutateClient({\n baseUrl: options.baseUrl,\n errorMapper: mapSyncMutateFailure,\n getToken: () => options.token,\n });\n await client.mutate(options.request);\n};\n\nexport const listWorkspaceMembers = async (\n context: CliContext,\n options: { baseUrl: string; token: string; workspaceId: string }\n): Promise<WorkspaceMemberRecord[]> =>\n await paginateGraphql<WorkspaceMembershipGraphqlNode, WorkspaceMemberRecord>(\n context,\n {\n baseUrl: options.baseUrl,\n nodeKey: \"workspaceMemberships\",\n query: WORKSPACE_MEMBERS_QUERY,\n token: options.token,\n transform: toWorkspaceMemberRecordFromGraphqlNode,\n variables: { workspaceId: options.workspaceId },\n }\n );\n\nexport const listWorkspaceInvitations = async (\n context: CliContext,\n options: { baseUrl: string; token: string; workspaceId: string }\n): Promise<WorkspaceInvitationRecord[]> =>\n await paginateGraphql<\n WorkspaceInvitationGraphqlNode,\n WorkspaceInvitationRecord\n >(context, {\n baseUrl: options.baseUrl,\n nodeKey: \"workspaceInvitations\",\n query: WORKSPACE_INVITATIONS_QUERY,\n token: options.token,\n transform: toWorkspaceInvitationRecordFromGraphqlNode,\n variables: { workspaceId: options.workspaceId },\n });\n\nexport const createWorkspaceInvitation = async (\n context: CliContext,\n options: {\n baseUrl: string;\n token: string;\n workspaceId: string;\n email?: string;\n role?: string;\n }\n): Promise<WorkspaceInvitationRecord> => {\n const input = omitUndefined({\n email: options.email,\n role: options.role,\n workspaceId: options.workspaceId,\n });\n\n const data = await requestGraphql<{\n workspaceInvitationCreate: {\n success: boolean;\n lastSyncId: string;\n invitation: WorkspaceInvitationGraphqlNode;\n };\n }>(context, options.baseUrl, {\n query: WORKSPACE_INVITATION_CREATE_MUTATION,\n token: options.token,\n variables: { input },\n });\n\n return toWorkspaceInvitationRecordFromGraphqlNode(\n data.workspaceInvitationCreate.invitation\n );\n};\n\nexport interface WorkspaceHistoryEntry {\n id: string;\n action: string;\n modelName: string;\n modelId: string;\n payload: Record<string, unknown> | null;\n createdAt: string;\n userId: string | null;\n}\n\nexport const listWorkspaceHistory = async (\n context: CliContext,\n options: {\n baseUrl: string;\n token: string;\n workspaceId: string;\n limit: number;\n model?: string;\n }\n): Promise<WorkspaceHistoryEntry[]> => {\n const variables = omitUndefined({\n limit: options.limit,\n model: options.model || undefined,\n workspaceId: options.workspaceId,\n });\n\n const data = await requestGraphql<{\n workspaceHistory: WorkspaceHistoryGraphqlNode[];\n }>(context, options.baseUrl, {\n query: WORKSPACE_HISTORY_QUERY,\n token: options.token,\n variables,\n });\n\n return data.workspaceHistory.map(toWorkspaceHistoryEntryFromGraphqlNode);\n};\n\n// --- API Keys ---\n\ninterface ApiKeyRecord {\n id: string;\n label: string;\n keyPrefix: string;\n scopes: string[];\n workspaceIds: string[] | null;\n expiresAt: string | null;\n lastUsedAt: string | null;\n revokedAt: string | null;\n createdAt: string;\n}\n\ninterface CreateApiKeyResponse {\n key: ApiKeyRecord & { token: string };\n}\n\nexport const createApiKey = async (\n context: CliContext,\n options: {\n baseUrl: string;\n token: string;\n label: string;\n scopes?: string[];\n workspaceIds?: string[];\n expiresAt?: string;\n }\n): Promise<CreateApiKeyResponse[\"key\"]> => {\n const variables = omitUndefined({\n expiresAt: options.expiresAt,\n label: options.label,\n scopes: options.scopes,\n workspaceIds: options.workspaceIds,\n });\n\n const data = await requestGraphql<{\n apiKeyCreate: {\n success: boolean;\n lastSyncId: string;\n apiKey: ApiKeyGraphqlNode;\n token: string;\n };\n }>(context, options.baseUrl, {\n query: API_KEY_CREATE_MUTATION,\n token: options.token,\n variables,\n });\n\n return {\n ...toApiKeyRecordFromGraphqlNode(data.apiKeyCreate.apiKey),\n token: data.apiKeyCreate.token,\n };\n};\n\nexport const listApiKeys = async (\n context: CliContext,\n options: { baseUrl: string; token: string }\n): Promise<ApiKeyRecord[]> => {\n const data = await requestGraphql<{\n apiKeys: ApiKeyGraphqlNode[];\n }>(context, options.baseUrl, {\n query: API_KEYS_QUERY,\n token: options.token,\n variables: {},\n });\n\n return data.apiKeys.map(toApiKeyRecordFromGraphqlNode);\n};\n\nexport const revokeApiKey = async (\n context: CliContext,\n options: { baseUrl: string; token: string; keyId: string }\n): Promise<void> => {\n await requestGraphql<{\n apiKeyRevoke: { success: boolean; lastSyncId: string };\n }>(context, options.baseUrl, {\n query: API_KEY_REVOKE_MUTATION,\n token: options.token,\n variables: { id: options.keyId },\n });\n};\n","import { resolveAuthToken } from \"./auth-session\";\nimport { ensureLocalContext } from \"./context-store\";\nimport { CliError, EXIT_CODES } from \"./errors\";\nimport { loadViewer, resolveApiBaseUrl } from \"./manage-api\";\nimport { resolveSupabaseConfig } from \"./supabase\";\nimport type { CliContext, ResolvedAuthToken } from \"./types\";\n\nconst getOptionalSupabaseConfig = () => {\n try {\n return resolveSupabaseConfig();\n } catch {\n return null;\n }\n};\n\nexport const requireAuthToken = async (\n context: CliContext\n): Promise<{\n token: string;\n resolvedToken: ResolvedAuthToken;\n}> => {\n const resolvedToken = await resolveAuthToken(\n context,\n getOptionalSupabaseConfig()\n );\n\n if (!resolvedToken) {\n throw new CliError(\n \"Not authenticated. Run `donebear auth login`.\",\n EXIT_CODES.AUTH_REQUIRED\n );\n }\n\n return {\n resolvedToken,\n token: resolvedToken.token,\n };\n};\n\nexport const resolveCommandContext = async (\n context: CliContext\n): Promise<{\n token: string;\n apiBaseUrl: string;\n resolvedToken: ResolvedAuthToken;\n localContext: Awaited<ReturnType<typeof ensureLocalContext>>;\n}> => {\n const { token, resolvedToken } = await requireAuthToken(context);\n\n if (!token) {\n throw new CliError(\"Missing access token\", EXIT_CODES.AUTH_REQUIRED);\n }\n\n return {\n apiBaseUrl: resolveApiBaseUrl(context),\n localContext: await ensureLocalContext(),\n resolvedToken,\n token,\n };\n};\n\nexport const requireUserId = async (\n context: CliContext,\n commandContext: {\n apiBaseUrl: string;\n token: string;\n resolvedToken: ResolvedAuthToken;\n }\n): Promise<string> => {\n const claimUserId = commandContext.resolvedToken.user?.id ?? null;\n\n if (typeof claimUserId === \"string\" && claimUserId.length > 0) {\n return claimUserId;\n }\n\n // `db_` API keys aren't JWTs, so the user id has to come from the server.\n const viewer = await loadViewer(context, {\n baseUrl: commandContext.apiBaseUrl,\n token: commandContext.token,\n });\n\n return viewer.id;\n};\n","import { InvalidArgumentError } from \"commander\";\nimport type { Command } from \"commander\";\n\nimport type { OutputFormat } from \"./types\";\n\ninterface GlobalOptions {\n json?: boolean;\n quiet?: boolean;\n color?: boolean;\n debug?: boolean;\n token?: string;\n apiUrl?: string;\n format?: string;\n copy?: boolean;\n total?: boolean;\n jq?: string;\n limit?: number;\n dryRun?: boolean;\n yes?: boolean;\n}\n\nexport const parseOutputFormat = (value: string | undefined): OutputFormat => {\n switch (value?.trim().toLowerCase()) {\n case \"json\": {\n return \"json\";\n }\n case \"csv\": {\n return \"csv\";\n }\n case \"tsv\": {\n return \"tsv\";\n }\n case \"yaml\": {\n return \"yaml\";\n }\n default: {\n return \"text\";\n }\n }\n};\n\nconst parseLimit = (value: string): number => {\n const parsed = Number.parseInt(value, 10);\n\n if (`${parsed}` !== value || !Number.isInteger(parsed) || parsed < 1) {\n throw new InvalidArgumentError(\n `invalid limit \"${value}\" (expected a positive integer)`\n );\n }\n\n return parsed;\n};\n\nexport const addGlobalOptions = (program: Command): void => {\n program\n .option(\"--json\", \"Output machine-readable JSON\")\n .option(\"-q, --quiet\", \"Suppress status output (implies --json)\")\n .option(\n \"--format <format>\",\n \"Output format: text|json|csv|tsv|yaml\",\n \"text\"\n )\n .option(\"--copy\", \"Copy output to clipboard\")\n .option(\"--total\", \"Print count only\")\n .option(\n \"--token <token>\",\n \"Use an explicit token (overrides DONEBEAR_TOKEN)\"\n )\n .option(\n \"--api-url <url>\",\n \"Manage API base URL (overrides DONEBEAR_API_URL)\"\n )\n .option(\"--debug\", \"Enable debug logs\")\n .option(\"--no-color\", \"Disable color output\")\n .option(\"--dry-run\", \"Preview mutations without executing\", false)\n .option(\"--jq <expression>\", \"Filter output with a JMESPath expression\")\n .option(\n \"--limit <n>\",\n \"Limit output to N items (for array results)\",\n parseLimit\n )\n .option(\"-y, --yes\", \"Skip confirmation prompts\", false);\n};\n\nexport const getGlobalOptions = (command: Command): GlobalOptions =>\n command.optsWithGlobals<GlobalOptions>();\n","import type { Command } from \"commander\";\n\nimport { DONEBEAR_DEBUG_ENV } from \"./constants\";\nimport { toCliError } from \"./errors\";\nimport { getGlobalOptions, parseOutputFormat } from \"./options\";\nimport { writeDebug, writeError, writeJson } from \"./output\";\nimport type { CliContext, OutputFormat } from \"./types\";\n\nexport const contextFromCommand = (command: Command): CliContext => {\n const options = getGlobalOptions(command);\n const quiet = options.quiet === true;\n const rawFormat = parseOutputFormat(options.format);\n const explicitFormat = options.json === true || quiet;\n const autoJson =\n !explicitFormat && rawFormat === \"text\" && !process.stdout.isTTY;\n const format = explicitFormat || autoJson ? \"json\" : rawFormat;\n\n return {\n apiUrlOverride: options.apiUrl?.trim() || null,\n color: options.color !== false && process.env.NO_COLOR !== \"1\",\n copy: options.copy === true,\n debug: options.debug === true || process.env[DONEBEAR_DEBUG_ENV] === \"1\",\n dryRun: options.dryRun === true,\n format,\n jq: options.jq?.trim() || null,\n json: format === \"json\",\n limit: options.limit ?? null,\n quiet,\n tokenOverride: options.token?.trim() || null,\n total: options.total === true,\n yes: options.yes === true,\n };\n};\n\nexport const contextFromArgv = (argv: string[]): CliContext => {\n const quiet = argv.includes(\"--quiet\") || argv.includes(\"-q\");\n const hasJsonFlag = argv.includes(\"--json\");\n const hasExplicitFormat = argv.some(\n (a) => a === \"--format\" || a.startsWith(\"--format=\")\n );\n const rawFormat = argv.some(\n (a) =>\n a === \"--format=json\" ||\n (argv[argv.indexOf(\"--format\") + 1] === \"json\" && a === \"--format\")\n )\n ? \"json\"\n : \"text\";\n const explicitJson = hasJsonFlag || quiet;\n const autoJson = !(explicitJson || hasExplicitFormat || process.stdout.isTTY);\n const format: OutputFormat = explicitJson || autoJson ? \"json\" : rawFormat;\n return {\n apiUrlOverride: null,\n color: !argv.includes(\"--no-color\") && process.env.NO_COLOR !== \"1\",\n copy: argv.includes(\"--copy\"),\n debug: argv.includes(\"--debug\") || process.env[DONEBEAR_DEBUG_ENV] === \"1\",\n dryRun: argv.includes(\"--dry-run\"),\n format,\n jq: null,\n json: format === \"json\",\n limit: null,\n quiet,\n tokenOverride: null,\n total: argv.includes(\"--total\"),\n yes: argv.includes(\"--yes\") || argv.includes(\"-y\"),\n };\n};\n\nexport const runWithErrorHandling = async (\n context: CliContext,\n action: () => Promise<void>\n): Promise<void> => {\n try {\n await action();\n } catch (error) {\n const cliError = toCliError(error);\n\n if (context.json) {\n writeJson({\n error: {\n code: cliError.code,\n exitCode: cliError.exitCode,\n message: cliError.message,\n ...(cliError.hint ? { hint: cliError.hint } : {}),\n },\n ok: false,\n });\n } else {\n writeError(context, cliError.message);\n if (cliError.hint) {\n writeError(context, cliError.hint);\n }\n }\n\n if (\n context.debug &&\n error instanceof Error &&\n typeof error.stack === \"string\"\n ) {\n writeDebug(context, error.stack);\n }\n\n process.exitCode = cliError.exitCode;\n }\n};\n","import type { Command } from \"commander\";\n\nimport { requireAuthToken } from \"../command-context\";\nimport { CliError, EXIT_CODES } from \"../errors\";\nimport {\n createApiKey,\n listApiKeys,\n listWorkspaces,\n resolveApiBaseUrl,\n revokeApiKey,\n} from \"../manage-api\";\nimport { writeInfo, writeOutput, writeSuccess, writeWarning } from \"../output\";\nimport { contextFromCommand, runWithErrorHandling } from \"../runtime\";\nimport type { CliContext } from \"../types\";\n\ntype PermissionLevel = \"full-access\" | \"read-only\";\n\nconst PERMISSION_SCOPES: Record<PermissionLevel, string[]> = {\n \"full-access\": [\"read\", \"write\", \"admin\"],\n \"read-only\": [\"read\"],\n};\n\nconst parseDuration = (duration: string): Date => {\n const match = duration.match(/^(\\d+)(d|y)$/u);\n\n if (!match) {\n throw new CliError(\n `Invalid duration \"${duration}\". Use a format like \"30d\", \"90d\", or \"1y\".`,\n EXIT_CODES.VALIDATION\n );\n }\n\n const [, rawAmount, unit] = match;\n const amount = Number(rawAmount);\n const now = new Date();\n\n if (unit === \"d\") {\n now.setDate(now.getDate() + amount);\n } else {\n now.setDate(now.getDate() + amount * 365);\n }\n\n return now;\n};\n\ninterface CreateOptions {\n permissions?: string;\n workspaces?: string;\n expires?: string;\n}\n\nconst runCreate = async (\n context: CliContext,\n label: string,\n options: CreateOptions\n): Promise<void> => {\n const { token } = await requireAuthToken(context);\n const baseUrl = resolveApiBaseUrl(context);\n\n // Resolve permissions to scopes\n let scopes: string[] | undefined;\n\n if (options.permissions !== undefined) {\n const level = options.permissions as PermissionLevel;\n\n if (!PERMISSION_SCOPES[level]) {\n throw new CliError(\n `Invalid permissions \"${options.permissions}\". Use \"full-access\" or \"read-only\".`,\n EXIT_CODES.VALIDATION\n );\n }\n\n scopes = PERMISSION_SCOPES[level];\n }\n\n // Resolve workspace slugs to IDs\n let workspaceIds: string[] | undefined;\n\n if (options.workspaces !== undefined) {\n const slugs = options.workspaces\n .split(\",\")\n .map((s) => s.trim())\n .filter(Boolean);\n\n if (slugs.length === 0) {\n throw new CliError(\n \"No workspace slugs provided for --workspaces.\",\n EXIT_CODES.VALIDATION\n );\n }\n\n const allWorkspaces = await listWorkspaces(context, { baseUrl, token });\n workspaceIds = [];\n\n for (const slug of slugs) {\n const match = allWorkspaces.find(\n (ws) =>\n ws.urlKey === slug ||\n ws.id === slug ||\n ws.name.toLowerCase() === slug.toLowerCase()\n );\n\n if (!match) {\n throw new CliError(\n `Workspace \"${slug}\" not found. Run \\`donebear workspace list\\` to see available workspaces.`,\n EXIT_CODES.VALIDATION\n );\n }\n\n workspaceIds.push(match.id);\n }\n }\n\n // Parse expiration duration\n let expiresAt: string | undefined;\n\n if (options.expires !== undefined) {\n expiresAt = parseDuration(options.expires).toISOString();\n }\n\n const key = await createApiKey(context, {\n baseUrl,\n expiresAt,\n label,\n scopes,\n token,\n workspaceIds,\n });\n\n if (context.json) {\n writeOutput(context, {\n createdAt: key.createdAt,\n expiresAt: key.expiresAt,\n id: key.id,\n keyPrefix: key.keyPrefix,\n label: key.label,\n scopes: key.scopes,\n token: key.token,\n workspaceIds: key.workspaceIds,\n });\n return;\n }\n\n writeSuccess(context, \"API key created.\");\n writeInfo(context, \"\");\n writeInfo(context, ` ${key.token}`);\n writeInfo(context, \"\");\n writeInfo(context, ` Scopes: ${key.scopes.join(\", \")}`);\n\n if (key.workspaceIds && key.workspaceIds.length > 0) {\n writeInfo(\n context,\n ` Restricted to workspaces: ${key.workspaceIds.join(\", \")}`\n );\n }\n\n if (key.expiresAt) {\n writeInfo(\n context,\n ` Expires: ${new Date(key.expiresAt).toLocaleDateString()}`\n );\n }\n\n writeInfo(context, \"\");\n writeWarning(context, \"Save this key now; it will not be shown again.\");\n};\n\nconst runList = async (context: CliContext): Promise<void> => {\n const { token } = await requireAuthToken(context);\n const baseUrl = resolveApiBaseUrl(context);\n\n const keys = await listApiKeys(context, { baseUrl, token });\n\n if (context.json) {\n writeOutput(context, keys);\n return;\n }\n\n if (keys.length === 0) {\n writeInfo(context, \"No API keys found.\");\n return;\n }\n\n for (const key of keys) {\n const status = key.revokedAt ? \" (revoked)\" : \"\";\n const lastUsed = key.lastUsedAt\n ? `Last used: ${new Date(key.lastUsedAt).toLocaleDateString()}`\n : \"Never used\";\n const scopeStr = `[${key.scopes.join(\",\")}]`;\n const wsStr =\n key.workspaceIds && key.workspaceIds.length > 0\n ? ` ws:${key.workspaceIds.length}`\n : \"\";\n const expStr = key.expiresAt\n ? ` exp:${new Date(key.expiresAt).toLocaleDateString()}`\n : \"\";\n writeInfo(\n context,\n `${key.keyPrefix}... ${key.label} ${scopeStr}${wsStr}${expStr} ${lastUsed}${status} [${key.id}]`\n );\n }\n};\n\nconst runRevoke = async (context: CliContext, keyId: string): Promise<void> => {\n const { token } = await requireAuthToken(context);\n const baseUrl = resolveApiBaseUrl(context);\n\n await revokeApiKey(context, { baseUrl, keyId, token });\n\n if (context.json) {\n writeOutput(context, { id: keyId, ok: true });\n return;\n }\n\n writeSuccess(context, `API key ${keyId} revoked.`);\n};\n\nexport const registerApiKeyCommands = (program: Command): void => {\n const apiKey = program\n .command(\"api-key\")\n .alias(\"key\")\n .description(\"Manage personal API keys\")\n .addHelpText(\n \"after\",\n `\nExamples:\n donebear api-key create \"Raycast\"\n donebear api-key create \"CI\" --permissions read-only --expires 90d\n donebear api-key create \"Scoped\" --workspaces my-org,side-project --expires 1y\n donebear api-key list\n donebear api-key revoke <key-id>\n`\n )\n .action(async (_options: unknown, command: Command) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runList(context);\n });\n });\n\n apiKey\n .command(\"create <label>\")\n .description(\"Create a new personal API key\")\n .option(\n \"--permissions <value>\",\n 'Permission level: \"full-access\" or \"read-only\"',\n \"full-access\"\n )\n .option(\n \"--workspaces <slugs>\",\n \"Comma-separated workspace slugs to restrict the key to\"\n )\n .option(\n \"--expires <duration>\",\n 'Expiration duration, e.g. \"30d\", \"90d\", \"1y\"'\n )\n .action(async (label: string, options: CreateOptions, command: Command) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runCreate(context, label, options);\n });\n });\n\n apiKey\n .command(\"list\")\n .description(\"List all personal API keys\")\n .action(async (_options: unknown, command: Command) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runList(context);\n });\n });\n\n apiKey\n .command(\"revoke <key-id>\")\n .description(\"Revoke an API key\")\n .action(async (keyId: string, _options: unknown, command: Command) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runRevoke(context, keyId);\n });\n });\n};\n","import { spawn } from \"node:child_process\";\n\ninterface OpenCommand {\n command: string;\n args: string[];\n}\n\nconst getOpenCommand = (url: string): OpenCommand => {\n if (process.platform === \"darwin\") {\n return {\n args: [url],\n command: \"open\",\n };\n }\n\n if (process.platform === \"win32\") {\n return {\n args: [\"/c\", \"start\", \"\", url],\n command: \"cmd\",\n };\n }\n\n return {\n args: [url],\n command: \"xdg-open\",\n };\n};\n\nexport const openUrl = async (url: string): Promise<boolean> => {\n const openCommand = getOpenCommand(url);\n\n return await new Promise<boolean>((resolve) => {\n try {\n const child = spawn(openCommand.command, openCommand.args, {\n detached: true,\n stdio: \"ignore\",\n });\n\n child.once(\"error\", () => {\n resolve(false);\n });\n\n child.once(\"spawn\", () => {\n child.unref();\n resolve(true);\n });\n } catch {\n resolve(false);\n }\n });\n};\n","export const parsePositiveInteger = (value: string, label: string): number => {\n const parsed = Number.parseInt(value, 10);\n\n if (!Number.isInteger(parsed) || parsed <= 0) {\n throw new Error(`${label} must be a positive integer`);\n }\n\n return parsed;\n};\n","import { createServer } from \"node:http\";\n\nimport { CliError, EXIT_CODES } from \"./errors\";\n\ninterface OAuthCallbackOptions {\n redirectUrl: URL;\n expectedState: string;\n timeoutMs: number;\n}\n\nconst successHtml = (): string =>\n `<!doctype html><html><head><meta charset=\"utf-8\"/><title>Done Bear CLI</title></head><body><h1>Authentication complete</h1><p>You can return to your terminal.</p></body></html>`;\n\nconst escapeHtml = (text: string): string =>\n text\n .replaceAll(\"&\", \"&amp;\")\n .replaceAll(\"<\", \"&lt;\")\n .replaceAll(\">\", \"&gt;\")\n .replaceAll('\"', \"&quot;\");\n\nconst errorHtml = (message: string): string =>\n `<!doctype html><html><head><meta charset=\"utf-8\"/><title>Done Bear CLI</title></head><body><h1>Authentication failed</h1><p>${escapeHtml(message)}</p></body></html>`;\n\nexport const waitForOAuthCode = async (\n options: OAuthCallbackOptions\n): Promise<string> =>\n await new Promise<string>((resolve, reject) => {\n const host = options.redirectUrl.hostname;\n const port = Number(options.redirectUrl.port);\n const { pathname } = options.redirectUrl;\n\n if (!Number.isInteger(port) || port <= 0) {\n reject(\n new CliError(\n \"OAuth redirect URL requires an explicit port\",\n EXIT_CODES.ERROR\n )\n );\n return;\n }\n\n let settled = false;\n\n const finish = (result: { code?: string; error?: CliError }): void => {\n if (settled) {\n return;\n }\n\n settled = true;\n clearTimeout(timeout);\n\n server.close(() => {\n if (result.error) {\n reject(result.error);\n return;\n }\n\n resolve(result.code ?? \"\");\n });\n };\n\n const server = createServer((request, response) => {\n if (!request.url) {\n response.writeHead(400, { \"content-type\": \"text/html; charset=utf-8\" });\n response.end(errorHtml(\"Missing request URL\"));\n finish({\n error: new CliError(\n \"OAuth callback is missing a request URL\",\n EXIT_CODES.ERROR\n ),\n });\n return;\n }\n\n const url = new URL(request.url, options.redirectUrl.origin);\n\n if (url.pathname !== pathname) {\n response.writeHead(404, { \"content-type\": \"text/html; charset=utf-8\" });\n response.end(errorHtml(\"Invalid callback path\"));\n return;\n }\n\n const providerError = url.searchParams.get(\"error\");\n if (providerError) {\n const description =\n url.searchParams.get(\"error_description\") ?? providerError;\n\n response.writeHead(400, { \"content-type\": \"text/html; charset=utf-8\" });\n response.end(errorHtml(description));\n\n finish({\n error: new CliError(\n `OAuth provider returned an error: ${description}`,\n EXIT_CODES.ERROR\n ),\n });\n return;\n }\n\n const state = url.searchParams.get(\"state\");\n if (state !== options.expectedState) {\n response.writeHead(400, { \"content-type\": \"text/html; charset=utf-8\" });\n response.end(errorHtml(\"State verification failed\"));\n\n finish({\n error: new CliError(\n \"OAuth state verification failed\",\n EXIT_CODES.ERROR\n ),\n });\n return;\n }\n\n const code = url.searchParams.get(\"code\");\n if (!code) {\n response.writeHead(400, { \"content-type\": \"text/html; charset=utf-8\" });\n response.end(errorHtml(\"Authorization code was missing\"));\n\n finish({\n error: new CliError(\n \"OAuth callback is missing an authorization code\",\n EXIT_CODES.ERROR\n ),\n });\n return;\n }\n\n response.writeHead(200, { \"content-type\": \"text/html; charset=utf-8\" });\n response.end(successHtml());\n finish({ code });\n });\n\n server.on(\"error\", (error) => {\n finish({\n error: new CliError(\n `Failed to start callback server on ${host}:${port}: ${error.message}`,\n EXIT_CODES.ERROR\n ),\n });\n });\n\n const timeout = setTimeout(() => {\n finish({\n error: new CliError(\n \"Timed out waiting for OAuth callback\",\n EXIT_CODES.CANCELLED\n ),\n });\n }, options.timeoutMs);\n\n server.listen(port, host);\n });\n","import { createHash, randomBytes } from \"node:crypto\";\n\nexport const createOAuthState = (): string => randomBytes(24).toString(\"hex\");\n\nexport const createCodeVerifier = (): string =>\n randomBytes(64).toString(\"base64url\");\n\nexport const createCodeChallenge = (verifier: string): string =>\n createHash(\"sha256\").update(verifier).digest().toString(\"base64url\");\n","import type { Command } from \"commander\";\n\nimport { resolveAuthToken, resolveTokenStatus } from \"../auth-session\";\nimport { openUrl } from \"../browser\";\nimport { parsePositiveInteger } from \"../command-parsers\";\nimport {\n DEFAULT_OAUTH_CALLBACK_PATH,\n DEFAULT_OAUTH_CALLBACK_PORT,\n DEFAULT_OAUTH_TIMEOUT_SECONDS,\n} from \"../constants\";\nimport { EXIT_CODES } from \"../errors\";\nimport { waitForOAuthCode } from \"../oauth-callback\";\nimport { exchangeAuthorizationCode } from \"../oauth-token\";\nimport type { OAuthTokenConfig } from \"../oauth-token\";\nimport { writeInfo, writeJson, writeSuccess, writeWarning } from \"../output\";\nimport {\n createCodeChallenge,\n createCodeVerifier,\n createOAuthState,\n} from \"../pkce\";\nimport { contextFromCommand, runWithErrorHandling } from \"../runtime\";\nimport {\n clearStoredAuthSession,\n readStoredAuthSession,\n writeStoredAuthSession,\n} from \"../storage\";\nimport {\n buildOAuthUrls,\n resolveOAuthClientId,\n resolveSupabaseConfig,\n tokenResponseToStoredSession,\n} from \"../supabase\";\nimport type { CliContext } from \"../types\";\n\ninterface AuthLoginOptions {\n port: number;\n timeout: number;\n open: boolean;\n}\n\nconst runLogin = async (\n context: CliContext,\n options: AuthLoginOptions\n): Promise<void> => {\n const config = resolveSupabaseConfig();\n const { authorizeUrl, tokenUrl } = buildOAuthUrls(config);\n const clientId = resolveOAuthClientId();\n\n const redirectUrl = new URL(\n `http://127.0.0.1:${options.port}${DEFAULT_OAUTH_CALLBACK_PATH}`\n );\n\n const state = createOAuthState();\n const codeVerifier = createCodeVerifier();\n const codeChallenge = createCodeChallenge(codeVerifier);\n\n const authUrl = new URL(authorizeUrl);\n authUrl.searchParams.set(\"client_id\", clientId);\n authUrl.searchParams.set(\"redirect_uri\", redirectUrl.toString());\n authUrl.searchParams.set(\"response_type\", \"code\");\n authUrl.searchParams.set(\"code_challenge\", codeChallenge);\n authUrl.searchParams.set(\"code_challenge_method\", \"S256\");\n authUrl.searchParams.set(\"state\", state);\n authUrl.searchParams.set(\"scope\", \"\");\n\n const callbackPromise = waitForOAuthCode({\n expectedState: state,\n redirectUrl,\n timeoutMs: options.timeout * 1000,\n });\n\n const authUrlString = authUrl.toString();\n\n if (!options.open) {\n writeInfo(context, \"Open this URL to continue authentication:\");\n writeInfo(context, authUrlString);\n } else if (await openUrl(authUrlString)) {\n writeInfo(context, \"Opened browser for authentication.\");\n } else {\n writeWarning(\n context,\n \"Failed to open the browser automatically. Open this URL manually:\"\n );\n writeInfo(context, authUrlString);\n }\n\n const authorizationCode = await callbackPromise;\n\n const tokenConfig: OAuthTokenConfig = { clientId, tokenUrl };\n const tokenResponse = await exchangeAuthorizationCode(\n tokenConfig,\n authorizationCode,\n codeVerifier,\n redirectUrl.toString()\n );\n\n const storedSession = tokenResponseToStoredSession(tokenResponse);\n await writeStoredAuthSession(storedSession);\n\n if (context.json) {\n writeJson({\n expiresAt: storedSession.expiresAt,\n ok: true,\n source: \"stored\",\n user: storedSession.user,\n });\n return;\n }\n\n writeSuccess(context, \"Authentication succeeded.\");\n\n if (storedSession.user?.email) {\n writeInfo(context, `Signed in as ${storedSession.user.email}`);\n }\n};\n\nconst runStatus = async (context: CliContext): Promise<void> => {\n const config = getOptionalSupabaseConfig();\n\n const token = await resolveAuthToken(context, config);\n\n if (!token) {\n if (context.json) {\n writeJson({\n authenticated: false,\n source: null,\n });\n } else {\n writeInfo(context, \"Not authenticated.\");\n writeInfo(context, \"Run `donebear auth login` to authenticate.\");\n }\n\n process.exitCode = EXIT_CODES.AUTH_REQUIRED;\n return;\n }\n\n const tokenStatus = resolveTokenStatus(token);\n\n if (context.json) {\n writeJson({\n authenticated: true,\n expired: tokenStatus.expired,\n expiresAt: token.expiresAt,\n expiresInSeconds: tokenStatus.expiresInSeconds,\n source: token.source,\n user: token.user,\n });\n return;\n }\n\n writeSuccess(context, \"Authenticated.\");\n writeInfo(context, `Source: ${token.source}`);\n\n if (token.user?.email) {\n writeInfo(context, `User: ${token.user.email}`);\n }\n\n if (token.expiresAt) {\n writeInfo(context, `Expires at: ${token.expiresAt}`);\n }\n};\n\nconst runLogout = async (context: CliContext): Promise<void> => {\n const existingSession = await readStoredAuthSession();\n await clearStoredAuthSession();\n\n if (context.json) {\n writeJson({\n ok: true,\n removedStoredCredentials: existingSession !== null,\n });\n return;\n }\n\n if (existingSession) {\n writeSuccess(context, \"Stored credentials removed.\");\n } else {\n writeInfo(context, \"No stored credentials found.\");\n }\n};\n\nconst getOptionalSupabaseConfig = () => {\n try {\n return resolveSupabaseConfig();\n } catch {\n return null;\n }\n};\n\nexport const registerAuthCommands = (program: Command): void => {\n const auth = program\n .command(\"auth\")\n .description(\"Authenticate donebear CLI\")\n .addHelpText(\n \"after\",\n `\nExamples:\n donebear auth login\n donebear auth login --no-open (print URL, don't open browser)\n donebear auth status --json\n donebear auth logout\n\nNon-interactive / CI use:\n export DONEBEAR_TOKEN=<your-token>\n donebear task list --json (no login required)\n`\n )\n .action(async (_options: unknown, command: Command) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runStatus(context);\n });\n });\n\n auth\n .command(\"login\")\n .description(\"Authenticate with OAuth in the browser\")\n .option(\n \"--port <port>\",\n \"Loopback callback port\",\n (value: string): number => parsePositiveInteger(value, \"Port\"),\n DEFAULT_OAUTH_CALLBACK_PORT\n )\n .option(\n \"--timeout <seconds>\",\n \"OAuth timeout in seconds\",\n (value: string): number => parsePositiveInteger(value, \"Timeout\"),\n DEFAULT_OAUTH_TIMEOUT_SECONDS\n )\n .option(\"--no-open\", \"Print URL instead of opening the browser\")\n .addHelpText(\n \"after\",\n `\nExamples:\n donebear auth login\n donebear auth login --no-open (print URL, copy and paste to browser)\n\nNon-interactive / CI use:\n Instead of logging in, set the DONEBEAR_TOKEN environment variable:\n export DONEBEAR_TOKEN=<your-api-token>\n`\n )\n .action(async (options: AuthLoginOptions, command: Command) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runLogin(context, options);\n });\n });\n\n auth\n .command(\"status\")\n .description(\"Check authentication status\")\n .action(async (_options: unknown, command: Command) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runStatus(context);\n });\n });\n\n auth\n .command(\"logout\")\n .alias(\"clear\")\n .description(\"Remove local cached credentials\")\n .action(async (_options: unknown, command: Command) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runLogout(context);\n });\n });\n};\n","import {\n buildTaskStartFields as buildCanonicalStartFields,\n getTaskState as getCanonicalTaskState,\n getTaskView,\n getTodayDateOnlyEpoch,\n isRepeatTemplate,\n} from \"@donebear/task-logic\";\n\nimport { formatInstantEpoch } from \"./date-codecs\";\nimport type { TaskRecord, TaskState, TaskView } from \"./types\";\n\nexport const buildTaskStartFields = (\n view: TaskView,\n now = new Date()\n): {\n start: string;\n startBucket: string;\n startDate: number | null;\n todayIndexReferenceDate: number | null;\n} => {\n const today = getTodayDateOnlyEpoch(now);\n const canonical = buildCanonicalStartFields(view, { now });\n\n return {\n ...canonical,\n todayIndexReferenceDate: view === \"today\" ? today : null,\n };\n};\n\nexport const getTaskState = (task: TaskRecord): Exclude<TaskState, \"all\"> =>\n getCanonicalTaskState(task);\n\n/**\n * Determine which view a task belongs to.\n *\n * Repeat templates are hidden from the CLI's list-level views (they only exist\n * to generate instances); everything else delegates to the canonical\n * task-logic derivation shared across every client.\n */\nexport const resolveTaskView = (task: TaskRecord): TaskView | null => {\n if (isRepeatTemplate(task)) {\n return null;\n }\n\n return getTaskView(task, getTodayDateOnlyEpoch());\n};\n\nexport const formatEpochDate = (epochMs: number | null): string | null =>\n formatInstantEpoch(epochMs);\n","import { formatDateOnlyEpoch } from \"./date-codecs\";\nimport { getTaskState } from \"./task-defaults\";\nimport type { TaskRecord, TaskState } from \"./types\";\n\nconst SHORT_ID_SUFFIX_PATTERN = /-([a-f0-9]{8})$/u;\nconst MAX_TASK_NUMBER = 2_147_483_647;\n\n/**\n * Find a record by reference: exact ID, key, ID prefix, slug shortId, or name.\n * Works for any entity with id, key, and name fields.\n */\nexport const findByRef = <T extends { id: string; key: string; name: string }>(\n ref: string,\n items: T[]\n): T | null => {\n const normalized = ref.trim().toLowerCase();\n const shortIdMatch = normalized.match(SHORT_ID_SUFFIX_PATTERN);\n const shortId = shortIdMatch?.[1] ?? null;\n\n for (const item of items) {\n if (\n item.id === ref ||\n item.key.toLowerCase() === normalized ||\n item.id.startsWith(ref) ||\n (shortId && item.id.replaceAll(\"-\", \"\").slice(0, 8) === shortId) ||\n item.name.toLowerCase() === normalized\n ) {\n return item;\n }\n }\n\n return null;\n};\n\nexport const normalizeWorkspaceRef = (\n value: string | undefined\n): string | null => {\n const normalized = value?.trim() ?? \"\";\n return normalized.length > 0 ? normalized : null;\n};\n\nexport const parseTaskNumberRef = (value: string): number => {\n const normalized = value.trim();\n if (!/^[1-9]\\d*$/u.test(normalized)) {\n throw new Error(\n `Invalid task number \"${normalized}\". Use the positive number shown on the task.`\n );\n }\n\n const number = Number(normalized);\n if (!Number.isSafeInteger(number) || number > MAX_TASK_NUMBER) {\n throw new TypeError(\n `Invalid task number \"${normalized}\". Number is too large.`\n );\n }\n return number;\n};\n\nexport const parseTaskState = (value: string): TaskState => {\n switch (value.trim().toLowerCase()) {\n case \"open\":\n case \"pending\": {\n return \"open\";\n }\n case \"done\":\n case \"complete\":\n case \"completed\": {\n return \"done\";\n }\n case \"archived\":\n case \"archive\": {\n return \"archived\";\n }\n case \"all\": {\n return \"all\";\n }\n default: {\n throw new Error(\n `Invalid state \"${value}\". Expected one of: open, done, archived, all.`\n );\n }\n }\n};\n\nconst toTaskMarker = (task: TaskRecord): string => {\n const state = getTaskState(task);\n\n if (state === \"done\") {\n return \"[x]\";\n }\n\n if (state === \"archived\") {\n return \"[-]\";\n }\n\n return \"[ ]\";\n};\n\nexport const taskListHeaders = (): string[] => [\n \"number\",\n \"title\",\n \"state\",\n \"deadline\",\n];\n\nexport const taskListRows = (tasks: TaskRecord[]): string[][] =>\n tasks.map((task) => [\n String(task.number),\n task.title,\n getTaskState(task),\n formatDateOnlyEpoch(task.deadlineAt) ?? \"\",\n ]);\n\nexport const taskListLines = (tasks: TaskRecord[]): string[] =>\n tasks.map((task) => {\n const marker = toTaskMarker(task);\n const deadline = formatDateOnlyEpoch(task.deadlineAt);\n const suffix = deadline ? ` due ${deadline}` : \"\";\n return `${marker} ${task.number} ${task.title}${suffix}`;\n });\n","import { createInterface } from \"node:readline\";\n\nimport type { CliContext } from \"./types\";\n\n/**\n * Prompt for confirmation on destructive actions.\n * Auto-skips when: --yes, --json, --dry-run, or non-TTY stdin.\n */\nexport const confirmAction = (\n context: CliContext,\n message: string\n): Promise<boolean> => {\n if (context.yes || context.json || context.dryRun || !process.stdin.isTTY) {\n return Promise.resolve(true);\n }\n\n const rl = createInterface({\n input: process.stdin,\n output: process.stderr,\n });\n\n return new Promise((resolve) => {\n rl.question(`${message} [y/N] `, (answer) => {\n rl.close();\n resolve(answer.trim().toLowerCase() === \"y\");\n });\n });\n};\n","export default /^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$/i;\n","import REGEX from './regex.js';\nfunction validate(uuid) {\n return typeof uuid === 'string' && REGEX.test(uuid);\n}\nexport default validate;\n","import validate from './validate.js';\nfunction parse(uuid) {\n if (!validate(uuid)) {\n throw TypeError('Invalid UUID');\n }\n let v;\n return Uint8Array.of((v = parseInt(uuid.slice(0, 8), 16)) >>> 24, (v >>> 16) & 0xff, (v >>> 8) & 0xff, v & 0xff, (v = parseInt(uuid.slice(9, 13), 16)) >>> 8, v & 0xff, (v = parseInt(uuid.slice(14, 18), 16)) >>> 8, v & 0xff, (v = parseInt(uuid.slice(19, 23), 16)) >>> 8, v & 0xff, ((v = parseInt(uuid.slice(24, 36), 16)) / 0x10000000000) & 0xff, (v / 0x100000000) & 0xff, (v >>> 24) & 0xff, (v >>> 16) & 0xff, (v >>> 8) & 0xff, v & 0xff);\n}\nexport default parse;\n","import validate from './validate.js';\nconst byteToHex = [];\nfor (let i = 0; i < 256; ++i) {\n byteToHex.push((i + 0x100).toString(16).slice(1));\n}\nexport function unsafeStringify(arr, offset = 0) {\n return (byteToHex[arr[offset + 0]] +\n byteToHex[arr[offset + 1]] +\n byteToHex[arr[offset + 2]] +\n byteToHex[arr[offset + 3]] +\n '-' +\n byteToHex[arr[offset + 4]] +\n byteToHex[arr[offset + 5]] +\n '-' +\n byteToHex[arr[offset + 6]] +\n byteToHex[arr[offset + 7]] +\n '-' +\n byteToHex[arr[offset + 8]] +\n byteToHex[arr[offset + 9]] +\n '-' +\n byteToHex[arr[offset + 10]] +\n byteToHex[arr[offset + 11]] +\n byteToHex[arr[offset + 12]] +\n byteToHex[arr[offset + 13]] +\n byteToHex[arr[offset + 14]] +\n byteToHex[arr[offset + 15]]).toLowerCase();\n}\nfunction stringify(arr, offset = 0) {\n const uuid = unsafeStringify(arr, offset);\n if (!validate(uuid)) {\n throw TypeError('Stringified UUID is invalid');\n }\n return uuid;\n}\nexport default stringify;\n","import parse from './parse.js';\nimport { unsafeStringify } from './stringify.js';\nexport function stringToBytes(str) {\n str = unescape(encodeURIComponent(str));\n const bytes = new Uint8Array(str.length);\n for (let i = 0; i < str.length; ++i) {\n bytes[i] = str.charCodeAt(i);\n }\n return bytes;\n}\nexport const DNS = '6ba7b810-9dad-11d1-80b4-00c04fd430c8';\nexport const URL = '6ba7b811-9dad-11d1-80b4-00c04fd430c8';\nexport default function v35(version, hash, value, namespace, buf, offset) {\n const valueBytes = typeof value === 'string' ? stringToBytes(value) : value;\n const namespaceBytes = typeof namespace === 'string' ? parse(namespace) : namespace;\n if (typeof namespace === 'string') {\n namespace = parse(namespace);\n }\n if (namespace?.length !== 16) {\n throw TypeError('Namespace must be array-like (16 iterable integer values, 0-255)');\n }\n let bytes = new Uint8Array(16 + valueBytes.length);\n bytes.set(namespaceBytes);\n bytes.set(valueBytes, namespaceBytes.length);\n bytes = hash(bytes);\n bytes[6] = (bytes[6] & 0x0f) | version;\n bytes[8] = (bytes[8] & 0x3f) | 0x80;\n if (buf) {\n offset ??= 0;\n if (offset < 0 || offset + 16 > buf.length) {\n throw new RangeError(`UUID byte range ${offset}:${offset + 15} is out of buffer bounds`);\n }\n for (let i = 0; i < 16; ++i) {\n buf[offset + i] = bytes[i];\n }\n return buf;\n }\n return unsafeStringify(bytes);\n}\n","import { createHash } from 'node:crypto';\nfunction sha1(bytes) {\n if (Array.isArray(bytes)) {\n bytes = Buffer.from(bytes);\n }\n else if (typeof bytes === 'string') {\n bytes = Buffer.from(bytes, 'utf8');\n }\n return createHash('sha1').update(bytes).digest();\n}\nexport default sha1;\n","import sha1 from './sha1.js';\nimport v35, { DNS, URL } from './v35.js';\nexport { DNS, URL } from './v35.js';\nfunction v5(value, namespace, buf, offset) {\n return v35(0x50, sha1, value, namespace, buf, offset);\n}\nv5.DNS = DNS;\nv5.URL = URL;\nexport default v5;\n","import { v5 as uuidv5 } from \"uuid\";\n\n// Deterministic sync IDs shared by manage-api, manage-frontend, and the CLI.\n// The iOS app has a parallel Swift port that must stay in lockstep:\n// apps/ios/Done Bear/Utilities/DeterministicIds.swift\n//\n// Node-only helpers that need `node:crypto` live in `@donebear/sync-ids/server`\n// so this entry stays browser-safe for manage-frontend / playground.\n\ntype CompositeModelName =\n | \"TaskLabel\"\n | \"TeamProject\"\n | \"TeamMembership\"\n | \"ProjectMembership\";\n\n// Keep this namespace stable. Changing it will regenerate all composite IDs.\nconst SYNC_COMPOSITE_ID_NAMESPACE = \"92a73695-d772-4b43-9fb4-d79f5fbef300\";\n\nexport const createDeterministicId = (\n namespace: string,\n name: string\n): string => uuidv5(name, namespace);\n\nconst createCompositeSyncId = (\n model: CompositeModelName,\n parts: readonly string[]\n): string =>\n createDeterministicId(\n SYNC_COMPOSITE_ID_NAMESPACE,\n `${model}:${JSON.stringify(parts)}`\n );\n\nexport const createTaskLabelId = (params: {\n workspaceId: string;\n taskId: string;\n labelId: string;\n}): string =>\n createCompositeSyncId(\"TaskLabel\", [\n params.workspaceId,\n params.taskId,\n params.labelId,\n ]);\n\nexport const createTeamProjectId = (params: {\n workspaceId: string;\n teamId: string;\n projectId: string;\n}): string =>\n createCompositeSyncId(\"TeamProject\", [\n params.workspaceId,\n params.teamId,\n params.projectId,\n ]);\n\nexport const createTeamMembershipId = (params: {\n workspaceId: string;\n teamId: string;\n userId: string;\n}): string =>\n createCompositeSyncId(\"TeamMembership\", [\n params.workspaceId,\n params.teamId,\n params.userId,\n ]);\n\nexport const createProjectMembershipId = (params: {\n workspaceId: string;\n projectId: string;\n userId: string;\n}): string =>\n createCompositeSyncId(\"ProjectMembership\", [\n params.workspaceId,\n params.projectId,\n params.userId,\n ]);\n","import { createDeterministicId } from \"@donebear/sync-ids\";\n\n// Composite sync ids (TaskLabel, TeamProject, ...) come from\n// `@donebear/sync-ids` so the CLI, server, web, and iOS all derive them the\n// same way. The namespaces below are CLI-only and must not move there.\nconst IMPORT_ID_NAMESPACE = \"b1f9f0ac-9f76-54ed-8eb0-7d6d3a0a0a31\";\nconst IDEMPOTENCY_ID_NAMESPACE = \"4c8af5e2-1d36-5a0b-9c47-2f81b3d6e955\";\n\nexport const createDeterministicImportId = (params: {\n workspaceId: string;\n modelName: string;\n sourceId: string;\n}): string =>\n createDeterministicId(\n IMPORT_ID_NAMESPACE,\n `things:${params.workspaceId}:${params.modelName}:${params.sourceId}`\n );\n\n// Stable ids for --idempotency-key: retried commands produce the same\n// model id, batch id, and clientTxId, so the sync layer's\n// (client_id, client_tx_id) unique constraint dedupes them server-side.\nexport const createIdempotentMutationId = (params: {\n workspaceId: string;\n modelName: string;\n key: string;\n part: \"model\" | \"tx\" | \"batch\";\n}): string =>\n createDeterministicId(\n IDEMPOTENCY_ID_NAMESPACE,\n `idem:${params.workspaceId}:${params.modelName}:${params.part}:${params.key}`\n );\n","import { setCurrentWorkspace } from \"./context-store\";\nimport { listWorkspaces } from \"./manage-api\";\nimport type { CliContext, WorkspaceScope, WorkspaceSummary } from \"./types\";\n\nconst WORKSPACE_URL_KEY_REGEX = /^[a-z0-9]+(?:-[a-z0-9]+)*$/u;\n\nconst fetchWorkspaces = async (\n context: CliContext,\n options: { token: string; apiBaseUrl: string }\n): Promise<WorkspaceSummary[]> => {\n const workspaces = await listWorkspaces(context, {\n baseUrl: options.apiBaseUrl,\n token: options.token,\n });\n\n if (workspaces.length === 0) {\n throw new Error(\"No workspaces available for this account\");\n }\n\n return workspaces;\n};\n\nexport const resolveWorkspaceScope = async (\n context: CliContext,\n options: {\n token: string;\n apiBaseUrl: string;\n workspaceRef: string | null;\n storedWorkspaceId: string | null;\n }\n): Promise<WorkspaceScope> => {\n const workspaces = await fetchWorkspaces(context, options);\n\n if (options.workspaceRef) {\n const selected = byReference(workspaces, options.workspaceRef);\n\n if (!selected) {\n throw new Error(\n `Workspace \"${options.workspaceRef}\" not found. Run \\`donebear workspace list\\`.`\n );\n }\n\n return { autoSelected: false, mode: \"single\", workspace: selected };\n }\n\n if (options.storedWorkspaceId) {\n const selected = byReference(workspaces, options.storedWorkspaceId);\n\n if (selected) {\n return { autoSelected: false, mode: \"single\", workspace: selected };\n }\n }\n\n if (workspaces.length === 1) {\n const [workspace] = workspaces;\n\n if (!workspace) {\n throw new Error(\"No workspaces available for this account\");\n }\n\n await setCurrentWorkspace(workspace.id);\n\n return { autoSelected: true, mode: \"single\", workspace };\n }\n\n return { mode: \"all\", workspaces };\n};\n\nexport const scopeLabel = (scope: WorkspaceScope): string =>\n scope.mode === \"all\" ? \"All Workspaces\" : scope.workspace.name;\n\nexport const scopeJsonFields = (\n scope: WorkspaceScope\n): Record<string, unknown> =>\n scope.mode === \"all\"\n ? { workspaces: scope.workspaces }\n : { autoSelected: scope.autoSelected, workspace: scope.workspace };\n\nconst normalize = (value: string): string => value.trim().toLowerCase();\n\nconst byReference = (\n workspaces: WorkspaceSummary[],\n reference: string\n): WorkspaceSummary | null => {\n const normalized = normalize(reference);\n\n for (const workspace of workspaces) {\n if (workspace.id === reference) {\n return workspace;\n }\n\n if (workspace.urlKey && normalize(workspace.urlKey) === normalized) {\n return workspace;\n }\n\n if (normalize(workspace.name) === normalized) {\n return workspace;\n }\n }\n\n return null;\n};\n\nexport const toWorkspaceUrlKey = (name: string): string => {\n const slug = name\n .trim()\n .toLowerCase()\n .replaceAll(/[^a-z0-9]+/gu, \"-\")\n .replaceAll(/^-+|-+$/gu, \"\")\n .replaceAll(/-{2,}/gu, \"-\");\n\n return slug.slice(0, 50);\n};\n\nexport const isValidWorkspaceUrlKey = (value: string): boolean =>\n WORKSPACE_URL_KEY_REGEX.test(value) && value.length >= 3;\n\nexport const resolveWorkspace = async (\n context: CliContext,\n options: {\n token: string;\n apiBaseUrl: string;\n workspaceRef: string | null;\n storedWorkspaceId: string | null;\n }\n): Promise<{ workspace: WorkspaceSummary; autoSelected: boolean }> => {\n const scope = await resolveWorkspaceScope(context, options);\n\n if (scope.mode === \"single\") {\n return { autoSelected: scope.autoSelected, workspace: scope.workspace };\n }\n\n throw new Error(\n \"No default workspace selected. Run `donebear workspace use <id-or-slug>`.\"\n );\n};\n","import { randomUUID } from \"node:crypto\";\n\nimport {\n buildMutateEnvelope,\n buildTaskInsertFields,\n} from \"@donebear/manage-client\";\nimport { DEFAULT_RANK_GAP } from \"@donebear/rank-logic\";\nimport { getTodayDateOnlyEpoch } from \"@donebear/task-logic\";\nimport type { ActiveTaskView } from \"@donebear/task-logic\";\nimport type { Command } from \"commander\";\n\nimport { requireUserId, resolveCommandContext } from \"../command-context\";\nimport {\n normalizeWorkspaceRef,\n parseTaskNumberRef,\n parseTaskState,\n taskListHeaders,\n taskListLines,\n taskListRows,\n} from \"../command-helpers\";\nimport { parsePositiveInteger } from \"../command-parsers\";\nimport { confirmAction } from \"../confirm\";\nimport {\n formatDateOnlyEpoch,\n formatInstantEpoch,\n parseCliDateOnlyToEpoch,\n} from \"../date-codecs\";\nimport { CliError, EXIT_CODES } from \"../errors\";\nimport { createIdempotentMutationId } from \"../import/model-id\";\nimport {\n loadChecklistItemsByTask,\n loadProjectsByWorkspace,\n loadReadyTaskAttachmentsByTask,\n loadTaskById,\n loadTaskByNumber,\n loadTasksByWorkspace,\n loadTasksByWorkspaceIds,\n loadTeamsByWorkspace,\n mutateModel,\n} from \"../manage-api\";\nimport {\n writeFormattedRows,\n writeInfo,\n writeOutput,\n writeSuccess,\n writeWarning,\n} from \"../output\";\nimport { promptForValue, readStdin } from \"../prompt\";\nimport { contextFromCommand, runWithErrorHandling } from \"../runtime\";\nimport {\n buildTaskStartFields,\n getTaskState,\n resolveTaskView,\n} from \"../task-defaults\";\nimport type {\n ChecklistItemRecord,\n TaskRecord,\n TaskState,\n TaskView,\n WorkspaceScope,\n} from \"../types\";\nimport {\n resolveWorkspace,\n resolveWorkspaceScope,\n scopeJsonFields,\n scopeLabel,\n} from \"../workspace-context\";\n\nconst DEFAULT_TASK_LIST_LIMIT = 20;\nconst VALID_TASK_VIEWS = new Set<TaskView>([\n \"inbox\",\n \"anytime\",\n \"today\",\n \"upcoming\",\n \"someday\",\n \"logbook\",\n \"trash\",\n]);\n\ninterface TaskListOptions {\n workspace?: string;\n state: string;\n view?: string;\n limit: number;\n search?: string;\n}\n\ninterface TaskAddOptions {\n workspace?: string;\n description?: string;\n /**\n * Optional on purpose. A Commander default would make this always set, so\n * \"typed nothing\" and \"typed --when today\" would be indistinguishable and\n * the deadline carve-out below could not tell them apart.\n */\n when?: string;\n deadline?: string;\n project?: string;\n team?: string;\n idempotencyKey?: string;\n}\n\ninterface TaskTargetOptions {\n workspace?: string;\n}\n\ninterface TaskEditOptions extends TaskTargetOptions {\n title?: string;\n description?: string;\n clearDescription: boolean;\n when?: string;\n deadline?: string;\n clearDeadline: boolean;\n project?: string;\n clearProject: boolean;\n team?: string;\n clearTeam: boolean;\n}\n\ninterface TaskRandomOptions {\n workspace?: string;\n state?: string;\n}\n\nconst parseTaskView = (value: string): TaskView => {\n const normalized = value.trim().toLowerCase();\n\n if (VALID_TASK_VIEWS.has(normalized as TaskView)) {\n return normalized as TaskView;\n }\n\n throw new Error(\n `Invalid view \"${value}\". Expected one of: inbox, anytime, today, upcoming, someday.`\n );\n};\n\nconst parseDeadline = (value: string | undefined): number | null =>\n parseCliDateOnlyToEpoch(value, \"deadline date\");\n\n/**\n * The view a `task add` lands in.\n *\n * A stated `--when` always wins. Otherwise today, with two carve-outs:\n *\n * 1. `--deadline 2026-09-30` says when the work is due, not when to do it, so\n * it rests in anytime and the deadline pulls it into today on the day it\n * falls due (see `getTaskView`). Matches Things 3, where When and Deadline\n * are independent fields.\n * 2. `--project` or `--team` means the task is already filed, so it is not an\n * uncommitted capture and should not also pile onto today while the user\n * outlines work. Matches `DEFAULT_CONTAINER_TASK_VIEW` on the web client\n * and `resolveTaskAddView` on the MCP server.\n *\n * Deadline beats container: a filed task that is due later still belongs in\n * anytime rather than inbox, because it has been triaged already.\n *\n * `when` is undefined rather than defaulted by Commander on purpose: a default\n * there would make \"typed nothing\" indistinguishable from \"typed --when today\".\n */\nexport const resolveAddView = (\n when: string | undefined,\n deadlineEpoch: number | null,\n hasContainer = false\n): ActiveTaskView => {\n if (when) {\n return parseTaskView(when) as ActiveTaskView;\n }\n\n if (deadlineEpoch !== null) {\n return \"anytime\";\n }\n\n return hasContainer ? \"inbox\" : \"today\";\n};\n\nconst sortTasksByUpdatedDesc = (tasks: TaskRecord[]): TaskRecord[] =>\n [...tasks].toSorted((a, b) => (b.updatedAt ?? 0) - (a.updatedAt ?? 0));\n\nexport const resolveTaskReference = async (\n context: ReturnType<typeof contextFromCommand>,\n options: {\n taskRef: string;\n commandContext: Awaited<ReturnType<typeof resolveCommandContext>>;\n workspaceRef: string | null;\n }\n): Promise<TaskRecord> => {\n const taskNumber = parseTaskNumberRef(options.taskRef);\n\n const { workspace, autoSelected } = await resolveWorkspace(context, {\n apiBaseUrl: options.commandContext.apiBaseUrl,\n storedWorkspaceId: options.commandContext.localContext.workspaceId,\n token: options.commandContext.token,\n workspaceRef: options.workspaceRef,\n });\n\n const match = await loadTaskByNumber(context, {\n baseUrl: options.commandContext.apiBaseUrl,\n number: taskNumber,\n token: options.commandContext.token,\n workspaceId: workspace.id,\n });\n if (!match) {\n throw new Error(\n `Task ${taskNumber} not found in workspace \"${workspace.name}\".`\n );\n }\n\n if (autoSelected && !context.json) {\n writeInfo(context, `Auto-selected workspace: ${workspace.name}`);\n }\n\n return match;\n};\n\nexport const filterTasks = (\n tasks: TaskRecord[],\n options: {\n state: TaskState;\n search: string | null;\n view: TaskView | null;\n }\n): TaskRecord[] => {\n // When filtering by view, auto-widen state to include the right tasks\n let effectiveState: TaskState = options.state;\n if (options.view === \"logbook\") {\n effectiveState = \"done\";\n } else if (options.view === \"trash\") {\n effectiveState = \"archived\";\n }\n\n const stateFiltered =\n effectiveState === \"all\"\n ? tasks\n : tasks.filter((task) => getTaskState(task) === effectiveState);\n\n const viewFiltered = options.view\n ? stateFiltered.filter((task) => resolveTaskView(task) === options.view)\n : stateFiltered;\n\n if (!options.search) {\n return viewFiltered;\n }\n\n const query = options.search.trim().toLowerCase();\n\n if (query.length === 0) {\n return viewFiltered;\n }\n\n return viewFiltered.filter((task) => {\n const title = task.title.toLowerCase();\n const description = task.description?.toLowerCase() ?? \"\";\n return title.includes(query) || description.includes(query);\n });\n};\n\nconst loadTasksForScope = (\n context: ReturnType<typeof contextFromCommand>,\n scope: WorkspaceScope,\n apiOptions: { baseUrl: string; token: string }\n): Promise<TaskRecord[]> => {\n if (scope.mode === \"all\") {\n return loadTasksByWorkspaceIds(context, {\n ...apiOptions,\n workspaceIds: scope.workspaces.map((w) => w.id),\n });\n }\n\n return loadTasksByWorkspace(context, {\n ...apiOptions,\n workspaceId: scope.workspace.id,\n });\n};\n\nconst runTaskList = async (\n context: ReturnType<typeof contextFromCommand>,\n options: TaskListOptions,\n workspaceOverride: string | null\n): Promise<void> => {\n const commandContext = await resolveCommandContext(context);\n const requestedState = parseTaskState(options.state);\n\n const scope = await resolveWorkspaceScope(context, {\n apiBaseUrl: commandContext.apiBaseUrl,\n storedWorkspaceId: commandContext.localContext.workspaceId,\n token: commandContext.token,\n workspaceRef: workspaceOverride ?? normalizeWorkspaceRef(options.workspace),\n });\n\n const tasks = await loadTasksForScope(context, scope, {\n baseUrl: commandContext.apiBaseUrl,\n token: commandContext.token,\n });\n\n const parsedView = options.view ? parseTaskView(options.view) : null;\n const filtered = filterTasks(sortTasksByUpdatedDesc(tasks), {\n search: options.search?.trim() ?? null,\n state: requestedState,\n view: parsedView,\n });\n const limited = filtered.slice(0, options.limit);\n\n if (context.json) {\n writeOutput(context, {\n ...scopeJsonFields(scope),\n count: limited.length,\n state: requestedState,\n tasks: limited,\n total: filtered.length,\n view: parsedView,\n });\n return;\n }\n\n if (\n writeFormattedRows(\n context,\n filtered.length,\n taskListHeaders(),\n taskListRows(limited)\n )\n ) {\n return;\n }\n\n if (scope.mode === \"single\" && scope.autoSelected) {\n writeInfo(context, `Auto-selected workspace: ${scope.workspace.name}`);\n }\n\n if (limited.length === 0) {\n writeInfo(context, \"No tasks found.\");\n return;\n }\n\n writeInfo(\n context,\n `${scopeLabel(scope)} (${limited.length}/${filtered.length})`\n );\n\n for (const line of taskListLines(limited)) {\n writeInfo(context, line);\n }\n};\n\nconst runTaskShow = async (\n context: ReturnType<typeof contextFromCommand>,\n taskRef: string,\n options: TaskTargetOptions,\n workspaceOverride: string | null\n): Promise<void> => {\n const commandContext = await resolveCommandContext(context);\n const task = await resolveTaskReference(context, {\n commandContext,\n taskRef,\n workspaceRef: workspaceOverride ?? normalizeWorkspaceRef(options.workspace),\n });\n\n const attachments = await loadReadyTaskAttachmentsByTask(context, {\n baseUrl: commandContext.apiBaseUrl,\n taskId: task.id,\n token: commandContext.token,\n });\n\n if (context.json) {\n writeOutput(context, {\n archivedAtIso: formatInstantEpoch(task.archivedAt),\n attachments,\n completedAtIso: formatInstantEpoch(task.completedAt),\n createdAtIso: formatInstantEpoch(task.createdAt),\n deadlineAtIso: formatDateOnlyEpoch(task.deadlineAt),\n state: getTaskState(task),\n task,\n updatedAtIso: formatInstantEpoch(task.updatedAt),\n });\n return;\n }\n\n writeSuccess(context, task.title);\n writeInfo(context, `number: ${task.number}`);\n writeInfo(context, `id: ${task.id}`);\n writeInfo(context, `state: ${getTaskState(task)}`);\n writeInfo(context, `workspaceId: ${task.workspaceId}`);\n writeInfo(context, `start: ${task.start}`);\n writeInfo(context, `startBucket: ${task.startBucket}`);\n writeInfo(\n context,\n `deadline: ${formatDateOnlyEpoch(task.deadlineAt) ?? \"(none)\"}`\n );\n\n if (task.projectId) {\n writeInfo(context, `projectId: ${task.projectId}`);\n }\n\n if (task.teamId) {\n writeInfo(context, `teamId: ${task.teamId}`);\n }\n\n if (task.assigneeId) {\n writeInfo(context, `assigneeId: ${task.assigneeId}`);\n }\n\n if (task.description) {\n writeInfo(context, `description: ${task.description}`);\n }\n\n if (attachments.length > 0) {\n writeInfo(\n context,\n `attachments: ${attachments.length} (${attachments\n .map((attachment) => attachment.filename)\n .join(\", \")})`\n );\n }\n};\n\nconst resolveTitle = async (\n context: ReturnType<typeof contextFromCommand>,\n rawTitle: string | undefined\n): Promise<string> => {\n if (rawTitle) {\n const trimmed = rawTitle.trim();\n if (trimmed.length > 0) {\n return trimmed;\n }\n }\n\n const prompted = await promptForValue(context, \"Title\");\n\n if (prompted) {\n return prompted;\n }\n\n throw new CliError(\n \"Task title is required.\",\n EXIT_CODES.VALIDATION,\n 'Provide a title as an argument: donebear task add \"My task\"'\n );\n};\n\nexport const resolveDescription = async (\n context: ReturnType<typeof contextFromCommand>,\n flagDescription: string | undefined\n): Promise<string | null> => {\n // No --description flag: never implicitly read stdin. In a non-interactive\n // agent/CI context stdin is usually empty (or an open pipe that blocks), so\n // the old implicit fallback silently dropped the description as `null` while\n // the command still reported success. Require an explicit opt-in instead.\n if (typeof flagDescription !== \"string\") {\n return null;\n }\n\n // `--description -` is the explicit opt-in to read from piped stdin.\n if (flagDescription === \"-\") {\n const piped = await readStdin();\n if (!piped) {\n writeWarning(\n context,\n \"No description received on stdin (--description -); task created without a description.\"\n );\n return null;\n }\n return piped;\n }\n\n const trimmed = flagDescription.trim();\n if (trimmed.length === 0) {\n writeWarning(\n context,\n \"Empty --description value; task created without a description.\"\n );\n return null;\n }\n return trimmed;\n};\n\nconst runTaskAdd = async (\n context: ReturnType<typeof contextFromCommand>,\n title: string | undefined,\n options: TaskAddOptions,\n workspaceOverride: string | null\n): Promise<void> => {\n const commandContext = await resolveCommandContext(context);\n const userId = await requireUserId(context, commandContext);\n const normalizedTitle = await resolveTitle(context, title);\n const description = await resolveDescription(context, options.description);\n\n const { workspace, autoSelected } = await resolveWorkspace(context, {\n apiBaseUrl: commandContext.apiBaseUrl,\n storedWorkspaceId: commandContext.localContext.workspaceId,\n token: commandContext.token,\n workspaceRef: workspaceOverride ?? normalizeWorkspaceRef(options.workspace),\n });\n\n const [projectId, teamId] = await Promise.all([\n options.project\n ? loadProjectsByWorkspace(context, {\n baseUrl: commandContext.apiBaseUrl,\n token: commandContext.token,\n workspaceId: workspace.id,\n }).then((projects) =>\n resolveEntityId(projects, options.project as string, \"Project\")\n )\n : Promise.resolve(null),\n options.team\n ? loadTeamsByWorkspace(context, {\n baseUrl: commandContext.apiBaseUrl,\n token: commandContext.token,\n workspaceId: workspace.id,\n }).then((teams) =>\n resolveEntityId(teams, options.team as string, \"Team\")\n )\n : Promise.resolve(null),\n ]);\n\n const idempotencyId = (part: \"model\" | \"tx\" | \"batch\"): string | null =>\n options.idempotencyKey\n ? createIdempotentMutationId({\n key: options.idempotencyKey,\n modelName: \"Task\",\n part,\n workspaceId: workspace.id,\n })\n : null;\n\n const taskId = idempotencyId(\"model\") ?? randomUUID();\n const now = Date.now();\n // Deadline first: it decides the default view when none was stated.\n const deadlineEpoch = parseDeadline(options.deadline);\n const view = resolveAddView(\n options.when,\n deadlineEpoch,\n Boolean(options.project || options.team)\n );\n const clientId = options.idempotencyKey\n ? \"cli-idem\"\n : commandContext.localContext.clientId;\n\n await mutateModel(context, {\n baseUrl: commandContext.apiBaseUrl,\n request: buildMutateEnvelope({\n batchId: idempotencyId(\"batch\") ?? randomUUID(),\n clientId,\n clientTxIds: [idempotencyId(\"tx\") ?? randomUUID()],\n transactions: [\n {\n action: \"INSERT\",\n modelId: taskId,\n modelName: \"Task\",\n payload: buildTaskInsertFields({\n deadlineAt: deadlineEpoch,\n description,\n ids: {\n creatorId: userId,\n taskId,\n workspaceId: workspace.id,\n },\n now,\n projectId,\n teamId,\n title: normalizedTitle,\n todayEpoch: getTodayDateOnlyEpoch(new Date(now)),\n view,\n }),\n },\n ],\n }),\n token: commandContext.token,\n });\n\n const createdTask = context.dryRun\n ? null\n : await loadTaskById(context, {\n baseUrl: commandContext.apiBaseUrl,\n taskId,\n token: commandContext.token,\n });\n\n if (context.json) {\n writeOutput(context, {\n autoSelected,\n created: true,\n deadlineAt: deadlineEpoch,\n description,\n id: taskId,\n number: createdTask?.number ?? null,\n projectId,\n teamId,\n title: normalizedTitle,\n view,\n workspaceId: workspace.id,\n workspaceName: workspace.name,\n });\n return;\n }\n\n if (autoSelected) {\n writeInfo(context, `Auto-selected workspace: ${workspace.name}`);\n }\n\n writeSuccess(context, `Added task: ${normalizedTitle}`);\n if (createdTask) {\n writeInfo(context, `number: ${createdTask.number}`);\n }\n if (description) {\n writeInfo(context, `description: ${description}`);\n }\n};\n\nconst runTaskMutation = async (\n context: ReturnType<typeof contextFromCommand>,\n taskRef: string,\n payload: {\n workspaceRef: string | null;\n action: \"UPDATE\" | \"ARCHIVE\" | \"UNARCHIVE\";\n data: Record<string, unknown>;\n successMessage: string;\n }\n): Promise<void> => {\n const commandContext = await resolveCommandContext(context);\n const task = await resolveTaskReference(context, {\n commandContext,\n taskRef,\n workspaceRef: payload.workspaceRef,\n });\n\n await mutateModel(context, {\n baseUrl: commandContext.apiBaseUrl,\n request: {\n batchId: randomUUID(),\n transactions: [\n {\n action: payload.action,\n clientId: commandContext.localContext.clientId,\n clientTxId: randomUUID(),\n modelId: task.id,\n modelName: \"Task\",\n payload: payload.data,\n },\n ],\n },\n token: commandContext.token,\n });\n\n if (context.json) {\n writeOutput(context, {\n action: payload.action,\n id: task.id,\n number: task.number,\n ok: true,\n });\n return;\n }\n\n writeSuccess(context, `${payload.successMessage}: Task ${task.number}`);\n};\n\nconst resolveEntityId = (\n entities: { id: string; key: string }[],\n ref: string,\n label: string\n): string => {\n const trimmed = ref.trim();\n const lower = trimmed.toLowerCase();\n const found = entities.find(\n (e) =>\n e.id === trimmed ||\n e.key.toLowerCase() === lower ||\n e.id.startsWith(trimmed)\n );\n\n if (!found) {\n throw new Error(`${label} \"${ref}\" not found.`);\n }\n\n return found.id;\n};\n\nconst resolveProjectId = async (\n context: ReturnType<typeof contextFromCommand>,\n commandContext: Awaited<ReturnType<typeof resolveCommandContext>>,\n projectRef: string,\n workspaceRef: string | null\n): Promise<string> => {\n const { workspace } = await resolveWorkspace(context, {\n apiBaseUrl: commandContext.apiBaseUrl,\n storedWorkspaceId: commandContext.localContext.workspaceId,\n token: commandContext.token,\n workspaceRef,\n });\n const projects = await loadProjectsByWorkspace(context, {\n baseUrl: commandContext.apiBaseUrl,\n token: commandContext.token,\n workspaceId: workspace.id,\n });\n return resolveEntityId(projects, projectRef, \"Project\");\n};\n\nconst resolveTeamId = async (\n context: ReturnType<typeof contextFromCommand>,\n commandContext: Awaited<ReturnType<typeof resolveCommandContext>>,\n teamRef: string,\n workspaceRef: string | null\n): Promise<string> => {\n const { workspace } = await resolveWorkspace(context, {\n apiBaseUrl: commandContext.apiBaseUrl,\n storedWorkspaceId: commandContext.localContext.workspaceId,\n token: commandContext.token,\n workspaceRef,\n });\n const teams = await loadTeamsByWorkspace(context, {\n baseUrl: commandContext.apiBaseUrl,\n token: commandContext.token,\n workspaceId: workspace.id,\n });\n return resolveEntityId(teams, teamRef, \"Team\");\n};\n\nconst validateTaskEditOptions = (options: TaskEditOptions): void => {\n if (options.clearDescription && typeof options.description === \"string\") {\n throw new Error(\n \"Use either --description or --clear-description, not both.\"\n );\n }\n if (options.clearDeadline && typeof options.deadline === \"string\") {\n throw new Error(\"Use either --deadline or --clear-deadline, not both.\");\n }\n if (options.clearProject && typeof options.project === \"string\") {\n throw new Error(\"Use either --project or --clear-project, not both.\");\n }\n if (options.clearTeam && typeof options.team === \"string\") {\n throw new Error(\"Use either --team or --clear-team, not both.\");\n }\n};\n\nconst applyScalarEdits = (\n updates: Record<string, unknown>,\n options: TaskEditOptions\n): void => {\n if (typeof options.title === \"string\") {\n const title = options.title.trim();\n if (title.length === 0) {\n throw new Error(\"Task title cannot be empty.\");\n }\n updates.title = title;\n }\n if (options.clearDescription) {\n updates.description = null;\n } else if (typeof options.description === \"string\") {\n const description = options.description.trim();\n updates.description = description.length > 0 ? description : null;\n }\n if (typeof options.when === \"string\") {\n Object.assign(updates, buildTaskStartFields(parseTaskView(options.when)));\n }\n if (options.clearDeadline) {\n updates.deadlineAt = null;\n } else if (typeof options.deadline === \"string\") {\n updates.deadlineAt = parseDeadline(options.deadline);\n }\n};\n\nconst runTaskEdit = async (\n context: ReturnType<typeof contextFromCommand>,\n taskRef: string,\n options: TaskEditOptions,\n workspaceOverride: string | null\n): Promise<void> => {\n validateTaskEditOptions(options);\n\n const updates: Record<string, unknown> = {};\n applyScalarEdits(updates, options);\n\n const wsRef = workspaceOverride ?? normalizeWorkspaceRef(options.workspace);\n const commandContext = await resolveCommandContext(context);\n\n if (options.clearProject) {\n updates.projectId = null;\n } else if (typeof options.project === \"string\") {\n updates.projectId = await resolveProjectId(\n context,\n commandContext,\n options.project,\n wsRef\n );\n }\n\n if (options.clearTeam) {\n updates.teamId = null;\n } else if (typeof options.team === \"string\") {\n updates.teamId = await resolveTeamId(\n context,\n commandContext,\n options.team,\n wsRef\n );\n }\n\n if (Object.keys(updates).length === 0) {\n throw new Error(\n \"No updates provided. Use --title, --description, --clear-description, --when, --deadline, --clear-deadline, --project, --clear-project, --team, or --clear-team.\"\n );\n }\n\n updates.updatedAt = Date.now();\n\n await runTaskMutation(context, taskRef, {\n action: \"UPDATE\",\n data: updates,\n successMessage: \"Updated\",\n workspaceRef: wsRef,\n });\n};\n\nconst runTaskRead = async (\n context: ReturnType<typeof contextFromCommand>,\n taskRef: string,\n options: TaskTargetOptions,\n workspaceOverride: string | null\n): Promise<void> => {\n const commandContext = await resolveCommandContext(context);\n const task = await resolveTaskReference(context, {\n commandContext,\n taskRef,\n workspaceRef: workspaceOverride ?? normalizeWorkspaceRef(options.workspace),\n });\n\n if (context.json) {\n writeOutput(context, {\n description: task.description,\n id: task.id,\n number: task.number,\n });\n return;\n }\n\n writeInfo(context, task.description ?? \"(empty)\");\n};\n\nconst runTaskAppend = async (\n context: ReturnType<typeof contextFromCommand>,\n taskRef: string,\n text: string,\n options: TaskTargetOptions,\n workspaceOverride: string | null\n): Promise<void> => {\n const commandContext = await resolveCommandContext(context);\n const task = await resolveTaskReference(context, {\n commandContext,\n taskRef,\n workspaceRef: workspaceOverride ?? normalizeWorkspaceRef(options.workspace),\n });\n\n const newDesc = `${task.description ?? \"\"}\\n${text.trim()}`;\n\n await runTaskMutation(context, taskRef, {\n action: \"UPDATE\",\n data: { description: newDesc, updatedAt: Date.now() },\n successMessage: \"Appended\",\n workspaceRef: workspaceOverride ?? normalizeWorkspaceRef(options.workspace),\n });\n};\n\nconst runTaskPrepend = async (\n context: ReturnType<typeof contextFromCommand>,\n taskRef: string,\n text: string,\n options: TaskTargetOptions,\n workspaceOverride: string | null\n): Promise<void> => {\n const commandContext = await resolveCommandContext(context);\n const task = await resolveTaskReference(context, {\n commandContext,\n taskRef,\n workspaceRef: workspaceOverride ?? normalizeWorkspaceRef(options.workspace),\n });\n\n const existing = task.description ?? \"\";\n const newDesc =\n existing.length > 0 ? `${text.trim()}\\n${existing}` : text.trim();\n\n await runTaskMutation(context, taskRef, {\n action: \"UPDATE\",\n data: { description: newDesc, updatedAt: Date.now() },\n successMessage: \"Prepended\",\n workspaceRef: workspaceOverride ?? normalizeWorkspaceRef(options.workspace),\n });\n};\n\nconst runTaskRandom = async (\n context: ReturnType<typeof contextFromCommand>,\n options: TaskRandomOptions,\n workspaceOverride: string | null\n): Promise<void> => {\n const commandContext = await resolveCommandContext(context);\n const requestedState = options.state ? parseTaskState(options.state) : \"open\";\n\n const { workspace, autoSelected } = await resolveWorkspace(context, {\n apiBaseUrl: commandContext.apiBaseUrl,\n storedWorkspaceId: commandContext.localContext.workspaceId,\n token: commandContext.token,\n workspaceRef: workspaceOverride ?? normalizeWorkspaceRef(options.workspace),\n });\n\n const tasks = await loadTasksByWorkspace(context, {\n baseUrl: commandContext.apiBaseUrl,\n token: commandContext.token,\n workspaceId: workspace.id,\n });\n\n const filtered = filterTasks(tasks, {\n search: null,\n state: requestedState,\n view: null,\n });\n\n if (filtered.length === 0) {\n if (context.json) {\n writeOutput(context, { task: null });\n return;\n }\n writeInfo(context, \"No tasks found.\");\n return;\n }\n\n const randomIndex = Math.floor(Math.random() * filtered.length);\n const task = filtered[randomIndex];\n\n if (!task) {\n throw new Error(\"Failed to pick a random task.\");\n }\n\n if (context.json) {\n writeOutput(context, {\n archivedAtIso: formatInstantEpoch(task.archivedAt),\n completedAtIso: formatInstantEpoch(task.completedAt),\n createdAtIso: formatInstantEpoch(task.createdAt),\n deadlineAtIso: formatDateOnlyEpoch(task.deadlineAt),\n state: getTaskState(task),\n task,\n updatedAtIso: formatInstantEpoch(task.updatedAt),\n });\n return;\n }\n\n if (autoSelected) {\n writeInfo(context, `Auto-selected workspace: ${workspace.name}`);\n }\n\n writeSuccess(context, task.title);\n writeInfo(context, `id: ${task.id}`);\n writeInfo(context, `state: ${getTaskState(task)}`);\n writeInfo(context, `workspaceId: ${task.workspaceId}`);\n writeInfo(context, `start: ${task.start}`);\n writeInfo(context, `startBucket: ${task.startBucket}`);\n writeInfo(\n context,\n `deadline: ${formatDateOnlyEpoch(task.deadlineAt) ?? \"(none)\"}`\n );\n\n if (task.description) {\n writeInfo(context, `description: ${task.description}`);\n }\n};\n\nconst resolveChecklistItemReference = async (\n context: ReturnType<typeof contextFromCommand>,\n commandContext: Awaited<ReturnType<typeof resolveCommandContext>>,\n taskId: string,\n itemRef: string\n): Promise<ChecklistItemRecord> => {\n const trimmed = itemRef.trim();\n\n if (!trimmed) {\n throw new Error(\"Checklist item id is required.\");\n }\n\n const items = await loadChecklistItemsByTask(context, {\n baseUrl: commandContext.apiBaseUrl,\n taskId,\n token: commandContext.token,\n });\n\n const exact = items.find((item) => item.id === trimmed);\n\n if (exact) {\n return exact;\n }\n\n const matches = items.filter((item) => item.id.startsWith(trimmed));\n\n if (matches.length === 0) {\n throw new Error(`Checklist item \"${trimmed}\" not found.`);\n }\n\n if (matches.length === 1) {\n const [match] = matches;\n\n if (!match) {\n throw new Error(`Checklist item \"${trimmed}\" not found.`);\n }\n\n return match;\n }\n\n throw new Error(\n `Checklist item prefix \"${trimmed}\" is ambiguous (${matches.length} matches). Use the full id.`\n );\n};\n\nconst runChecklistList = async (\n context: ReturnType<typeof contextFromCommand>,\n taskId: string,\n workspaceOption: string | undefined\n): Promise<void> => {\n const commandContext = await resolveCommandContext(context);\n const task = await resolveTaskReference(context, {\n commandContext,\n taskRef: taskId,\n workspaceRef: workspaceOption?.trim() ?? null,\n });\n const items = await loadChecklistItemsByTask(context, {\n baseUrl: commandContext.apiBaseUrl,\n taskId: task.id,\n token: commandContext.token,\n });\n const sorted = [...items].toSorted((a, b) => a.sortOrder - b.sortOrder);\n\n if (context.json) {\n writeOutput(context, { items: sorted, taskId: task.id });\n return;\n }\n\n if (sorted.length === 0) {\n writeInfo(context, \"No checklist items.\");\n return;\n }\n\n writeInfo(context, `Checklist for: ${task.title}`);\n\n for (const item of sorted) {\n const marker = item.completedAt === null ? \"[ ]\" : \"[x]\";\n writeInfo(context, `${marker} ${item.id.slice(0, 8)} ${item.title}`);\n }\n};\n\nexport const registerTaskCommands = (\n program: Command,\n workspaceOverride: string | null\n): void => {\n const task = program\n .command(\"task\")\n .alias(\"tasks\")\n .description(\"Manage tasks\")\n .addHelpText(\n \"after\",\n `\nExamples:\n donebear task list --json\n donebear task add \"Fix login bug\" --when today --json\n donebear task add \"Write tests\" --deadline 2026-03-15 --project PROJ --json\n donebear task edit 12 --deadline 2026-03-05 --json\n donebear task done 12 --json\n donebear task list --state done --limit 50 --json\n\nDate format: YYYY-MM-DD (e.g. 2026-03-15)\nTask number: workspace-scoped positive integer (e.g. 12)\nView buckets: inbox | anytime | today | upcoming | someday\nNew tasks default to today; to anytime with --deadline and no --when; to\ninbox with --project or --team and no --when. Pass --when inbox to capture\nwithout scheduling.\n\nAgent tip: run \"donebear spec task add\" for full option reference\n`\n )\n .action(async (_options: unknown, command: Command) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runTaskList(\n context,\n { limit: DEFAULT_TASK_LIST_LIMIT, state: \"open\" },\n workspaceOverride\n );\n });\n });\n\n task\n .command(\"list\")\n .alias(\"ls\")\n .description(\"List tasks\")\n .option(\"-w, --workspace <workspace>\", \"Workspace id, slug, or exact name\")\n .option(\"-s, --state <state>\", \"open|done|archived|all\", \"open\")\n .option(\n \"-n, --limit <count>\",\n \"Maximum number of tasks\",\n (value: string): number => parsePositiveInteger(value, \"Limit\"),\n DEFAULT_TASK_LIST_LIMIT\n )\n .option(\"-q, --search <query>\", \"Filter by title or description\")\n .option(\n \"-v, --view <view>\",\n \"Filter by view (inbox|anytime|today|upcoming|someday|logbook|trash)\"\n )\n .addHelpText(\n \"after\",\n `\nExamples:\n donebear task list --json\n donebear task list --state done --json\n donebear task list --view today --json\n donebear task list --search \"login\" --limit 50 --json\n\nStates: open (default) | done | archived | all\nViews: inbox | anytime | today | upcoming | someday | logbook | trash\n`\n )\n .action(async (options: TaskListOptions, command: Command) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runTaskList(context, options, workspaceOverride);\n });\n });\n\n task\n .command(\"show\")\n .description(\"Show task details\")\n .argument(\"<task-number>\", \"Workspace-scoped task number\")\n .option(\"-w, --workspace <workspace>\", \"Workspace id, slug, or exact name\")\n .action(\n async (taskId: string, options: TaskTargetOptions, command: Command) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runTaskShow(context, taskId, options, workspaceOverride);\n });\n }\n );\n\n task\n .command(\"read\")\n .description(\"Print the description of a task\")\n .argument(\"<task-number>\", \"Workspace-scoped task number\")\n .option(\"-w, --workspace <workspace>\", \"Workspace id, slug, or exact name\")\n .action(\n async (taskId: string, options: TaskTargetOptions, command: Command) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runTaskRead(context, taskId, options, workspaceOverride);\n });\n }\n );\n\n task\n .command(\"append\")\n .description(\"Append text to a task's description\")\n .argument(\"<task-number>\", \"Workspace-scoped task number\")\n .argument(\"<text>\", \"Text to append\")\n .option(\"-w, --workspace <workspace>\", \"Workspace id, slug, or exact name\")\n .action(\n async (\n taskId: string,\n text: string,\n options: TaskTargetOptions,\n command: Command\n ) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runTaskAppend(\n context,\n taskId,\n text,\n options,\n workspaceOverride\n );\n });\n }\n );\n\n task\n .command(\"prepend\")\n .description(\"Prepend text to a task's description\")\n .argument(\"<task-number>\", \"Workspace-scoped task number\")\n .argument(\"<text>\", \"Text to prepend\")\n .option(\"-w, --workspace <workspace>\", \"Workspace id, slug, or exact name\")\n .action(\n async (\n taskId: string,\n text: string,\n options: TaskTargetOptions,\n command: Command\n ) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runTaskPrepend(\n context,\n taskId,\n text,\n options,\n workspaceOverride\n );\n });\n }\n );\n\n task\n .command(\"random\")\n .description(\"Show a random task\")\n .option(\"-w, --workspace <workspace>\", \"Workspace id, slug, or exact name\")\n .option(\"-s, --state <state>\", \"open|done|archived|all\", \"open\")\n .action(async (options: TaskRandomOptions, command: Command) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runTaskRandom(context, options, workspaceOverride);\n });\n });\n\n task\n .command(\"add\")\n .alias(\"create\")\n .description(\"Create a task\")\n .argument(\"[title]\", \"Task title (prompted interactively if omitted)\")\n .option(\"-w, --workspace <workspace>\", \"Workspace id, slug, or exact name\")\n .option(\n \"-d, --description <text>\",\n \"Task description (use --description - to read from piped stdin)\"\n )\n // No Commander default: it would make --when always set, and the create\n // path needs to know whether the user stated a view (see TaskAddOptions).\n .option(\n \"--when <view>\",\n \"inbox|anytime|today|upcoming|someday (default: today, or anytime with --deadline)\"\n )\n .option(\"--deadline <date>\", \"Deadline (YYYY-MM-DD or ISO datetime)\")\n .option(\"--project <key-or-id>\", \"Project key or id\")\n .option(\"--team <key-or-id>\", \"Team key or id\")\n .option(\n \"--idempotency-key <key>\",\n \"Stable key making retries safe (repeated calls create only one task)\"\n )\n .addHelpText(\n \"after\",\n `\nExamples:\n donebear task add \"Fix login bug\" --when today --json\n donebear task add \"Write tests\" --deadline 2030-03-15 --project PROJ --json\n donebear task add \"Review PR\" --when anytime --description \"Check for XSS\" --json\n donebear task add \"Capture idea\" --when inbox --json\n echo \"Multi-line description\" | donebear task add \"My task\" --description -\n donebear task add # prompts for title interactively\n\nDate format: YYYY-MM-DD (e.g. 2030-03-15)\nView (--when): inbox | anytime | today | upcoming | someday\nWithout --when a new task lands in today, with two exceptions. With --deadline\nand no --when it lands in anytime, so work due weeks out does not sit in today\nuntil then; the deadline still surfaces it in today on the day. With --project\nor --team and no --when it lands in inbox, because the task is already filed by\nits container. A deadline wins over a container. Pass --when inbox to capture\nwithout scheduling.\n`\n )\n .action(\n async (\n title: string | undefined,\n options: TaskAddOptions,\n command: Command\n ) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runTaskAdd(context, title, options, workspaceOverride);\n });\n }\n );\n\n task\n .command(\"edit\")\n .description(\"Update task fields\")\n .argument(\"<task-number>\", \"Workspace-scoped task number\")\n .option(\"-w, --workspace <workspace>\", \"Workspace id, slug, or exact name\")\n .option(\"--title <title>\", \"Replace task title\")\n .option(\n \"--description <text>\",\n \"Replace task description (empty string clears)\"\n )\n .option(\"--clear-description\", \"Clear task description\")\n .option(\n \"--when <view>\",\n \"Set view bucket (inbox|anytime|today|upcoming|someday)\"\n )\n .option(\"--deadline <date>\", \"Set deadline (YYYY-MM-DD or ISO datetime)\")\n .option(\"--clear-deadline\", \"Clear deadline\")\n .option(\"--project <key-or-id>\", \"Set project (key or id)\")\n .option(\"--clear-project\", \"Remove project assignment\")\n .option(\"--team <key-or-id>\", \"Set team (key or id)\")\n .option(\"--clear-team\", \"Remove team assignment\")\n .action(\n async (taskId: string, options: TaskEditOptions, command: Command) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runTaskEdit(context, taskId, options, workspaceOverride);\n });\n }\n );\n\n task\n .command(\"done\")\n .alias(\"complete\")\n .description(\"Mark a task as completed\")\n .argument(\"<task-number>\", \"Workspace-scoped task number\")\n .option(\"-w, --workspace <workspace>\", \"Workspace id, slug, or exact name\")\n .action(\n async (taskId: string, options: TaskTargetOptions, command: Command) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n const now = Date.now();\n await runTaskMutation(context, taskId, {\n action: \"UPDATE\",\n data: { completedAt: now, updatedAt: now },\n successMessage: \"Marked done\",\n workspaceRef:\n workspaceOverride ?? normalizeWorkspaceRef(options.workspace),\n });\n });\n }\n );\n\n task\n .command(\"reopen\")\n .alias(\"undo\")\n .description(\"Reopen a completed task\")\n .argument(\"<task-number>\", \"Workspace-scoped task number\")\n .option(\"-w, --workspace <workspace>\", \"Workspace id, slug, or exact name\")\n .action(\n async (taskId: string, options: TaskTargetOptions, command: Command) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runTaskMutation(context, taskId, {\n action: \"UPDATE\",\n data: { completedAt: null, updatedAt: Date.now() },\n successMessage: \"Reopened\",\n workspaceRef:\n workspaceOverride ?? normalizeWorkspaceRef(options.workspace),\n });\n });\n }\n );\n\n task\n .command(\"archive\")\n .description(\"Archive a task\")\n .argument(\"<task-number>\", \"Workspace-scoped task number\")\n .option(\"-w, --workspace <workspace>\", \"Workspace id, slug, or exact name\")\n .action(\n async (taskId: string, options: TaskTargetOptions, command: Command) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n const confirmed = await confirmAction(\n context,\n `Archive task \"${taskId}\"?`\n );\n if (!confirmed) {\n throw new CliError(\"Cancelled\", EXIT_CODES.CANCELLED);\n }\n await runTaskMutation(context, taskId, {\n action: \"ARCHIVE\",\n data: { archivedAt: Date.now() },\n successMessage: \"Archived\",\n workspaceRef:\n workspaceOverride ?? normalizeWorkspaceRef(options.workspace),\n });\n });\n }\n );\n\n task\n .command(\"unarchive\")\n .alias(\"restore\")\n .description(\"Unarchive a task\")\n .argument(\"<task-number>\", \"Workspace-scoped task number\")\n .option(\"-w, --workspace <workspace>\", \"Workspace id, slug, or exact name\")\n .action(\n async (taskId: string, options: TaskTargetOptions, command: Command) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runTaskMutation(context, taskId, {\n action: \"UNARCHIVE\",\n data: {},\n successMessage: \"Unarchived\",\n workspaceRef:\n workspaceOverride ?? normalizeWorkspaceRef(options.workspace),\n });\n });\n }\n );\n\n const checklist = task\n .command(\"checklist\")\n .alias(\"cl\")\n .description(\"Manage task checklist items\")\n .argument(\"<task-number>\", \"Workspace-scoped task number\")\n .option(\"-w, --workspace <workspace>\", \"Workspace id, slug, or exact name\")\n .action(\n async (\n taskId: string,\n options: { workspace?: string },\n command: Command\n ) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runChecklistList(context, taskId, options.workspace);\n });\n }\n );\n\n checklist\n .command(\"add\")\n .description(\"Add a checklist item\")\n .argument(\"<task-number>\", \"Workspace-scoped task number\")\n .argument(\"<title>\", \"Item title\")\n .option(\"-w, --workspace <workspace>\", \"Workspace id, slug, or exact name\")\n .action(\n async (\n taskId: string,\n title: string,\n options: { workspace?: string },\n command: Command\n ) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n const commandContext = await resolveCommandContext(context);\n const resolvedTask = await resolveTaskReference(context, {\n commandContext,\n taskRef: taskId,\n workspaceRef: options.workspace?.trim() ?? null,\n });\n const itemId = randomUUID();\n const now = Date.now();\n const checklistItems = await loadChecklistItemsByTask(context, {\n baseUrl: commandContext.apiBaseUrl,\n taskId: resolvedTask.id,\n token: commandContext.token,\n });\n const maxSortOrder = Math.max(\n ...checklistItems.map((item) => item.sortOrder)\n );\n const sortOrder =\n checklistItems.length === 0\n ? DEFAULT_RANK_GAP\n : maxSortOrder + DEFAULT_RANK_GAP;\n await mutateModel(context, {\n baseUrl: commandContext.apiBaseUrl,\n request: {\n batchId: randomUUID(),\n transactions: [\n {\n action: \"INSERT\",\n clientId: commandContext.localContext.clientId,\n clientTxId: randomUUID(),\n modelId: itemId,\n modelName: \"TaskChecklistItem\",\n payload: {\n completedAt: null,\n createdAt: now,\n sortOrder,\n taskId: resolvedTask.id,\n title: title.trim(),\n updatedAt: now,\n workspaceId: resolvedTask.workspaceId,\n },\n },\n ],\n },\n token: commandContext.token,\n });\n if (context.json) {\n writeOutput(context, { created: true, id: itemId });\n return;\n }\n writeSuccess(context, `Added: ${title.trim()}`);\n });\n }\n );\n\n checklist\n .command(\"done\")\n .description(\"Mark a checklist item as complete\")\n .argument(\"<task-number>\", \"Workspace-scoped task number\")\n .argument(\"<item-id>\", \"Checklist item id or prefix\")\n .option(\"-w, --workspace <workspace>\", \"Workspace id, slug, or exact name\")\n .action(\n async (\n taskId: string,\n itemId: string,\n options: { workspace?: string },\n command: Command\n ) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n const commandContext = await resolveCommandContext(context);\n const resolvedTask = await resolveTaskReference(context, {\n commandContext,\n taskRef: taskId,\n workspaceRef: options.workspace?.trim() ?? null,\n });\n const item = await resolveChecklistItemReference(\n context,\n commandContext,\n resolvedTask.id,\n itemId\n );\n const now = Date.now();\n await mutateModel(context, {\n baseUrl: commandContext.apiBaseUrl,\n request: {\n batchId: randomUUID(),\n transactions: [\n {\n action: \"UPDATE\",\n clientId: commandContext.localContext.clientId,\n clientTxId: randomUUID(),\n modelId: item.id,\n modelName: \"TaskChecklistItem\",\n payload: { completedAt: now, updatedAt: now },\n },\n ],\n },\n token: commandContext.token,\n });\n if (context.json) {\n writeOutput(context, { id: item.id, ok: true });\n return;\n }\n writeSuccess(context, `Marked done: ${item.title}`);\n });\n }\n );\n\n checklist\n .command(\"reopen\")\n .description(\"Reopen a completed checklist item\")\n .argument(\"<task-number>\", \"Workspace-scoped task number\")\n .argument(\"<item-id>\", \"Checklist item id or prefix\")\n .option(\"-w, --workspace <workspace>\", \"Workspace id, slug, or exact name\")\n .action(\n async (\n taskId: string,\n itemId: string,\n options: { workspace?: string },\n command: Command\n ) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n const commandContext = await resolveCommandContext(context);\n const resolvedTask = await resolveTaskReference(context, {\n commandContext,\n taskRef: taskId,\n workspaceRef: options.workspace?.trim() ?? null,\n });\n const item = await resolveChecklistItemReference(\n context,\n commandContext,\n resolvedTask.id,\n itemId\n );\n const now = Date.now();\n await mutateModel(context, {\n baseUrl: commandContext.apiBaseUrl,\n request: {\n batchId: randomUUID(),\n transactions: [\n {\n action: \"UPDATE\",\n clientId: commandContext.localContext.clientId,\n clientTxId: randomUUID(),\n modelId: item.id,\n modelName: \"TaskChecklistItem\",\n payload: { completedAt: null, updatedAt: now },\n },\n ],\n },\n token: commandContext.token,\n });\n if (context.json) {\n writeOutput(context, { id: item.id, ok: true });\n return;\n }\n writeSuccess(context, `Reopened: ${item.title}`);\n });\n }\n );\n\n checklist\n .command(\"edit\")\n .description(\"Edit a checklist item title\")\n .argument(\"<task-number>\", \"Workspace-scoped task number\")\n .argument(\"<item-id>\", \"Checklist item id or prefix\")\n .requiredOption(\"--title <title>\", \"New item title\")\n .option(\"-w, --workspace <workspace>\", \"Workspace id, slug, or exact name\")\n .action(\n async (\n taskId: string,\n itemId: string,\n options: { title: string; workspace?: string },\n command: Command\n ) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n const newTitle = options.title.trim();\n\n if (newTitle.length === 0) {\n throw new Error(\"Checklist item title cannot be empty.\");\n }\n\n const commandContext = await resolveCommandContext(context);\n const resolvedTask = await resolveTaskReference(context, {\n commandContext,\n taskRef: taskId,\n workspaceRef: options.workspace?.trim() ?? null,\n });\n const item = await resolveChecklistItemReference(\n context,\n commandContext,\n resolvedTask.id,\n itemId\n );\n const now = Date.now();\n await mutateModel(context, {\n baseUrl: commandContext.apiBaseUrl,\n request: {\n batchId: randomUUID(),\n transactions: [\n {\n action: \"UPDATE\",\n clientId: commandContext.localContext.clientId,\n clientTxId: randomUUID(),\n modelId: item.id,\n modelName: \"TaskChecklistItem\",\n payload: { title: newTitle, updatedAt: now },\n },\n ],\n },\n token: commandContext.token,\n });\n if (context.json) {\n writeOutput(context, { id: item.id, ok: true });\n return;\n }\n writeSuccess(context, `Updated: ${newTitle}`);\n });\n }\n );\n\n checklist\n .command(\"remove\")\n .alias(\"rm\")\n .description(\"Remove a checklist item\")\n .argument(\"<task-number>\", \"Workspace-scoped task number\")\n .argument(\"<item-id>\", \"Checklist item id or prefix\")\n .option(\"-w, --workspace <workspace>\", \"Workspace id, slug, or exact name\")\n .action(\n async (\n taskId: string,\n itemId: string,\n options: { workspace?: string },\n command: Command\n ) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n const commandContext = await resolveCommandContext(context);\n const resolvedTask = await resolveTaskReference(context, {\n commandContext,\n taskRef: taskId,\n workspaceRef: options.workspace?.trim() ?? null,\n });\n const item = await resolveChecklistItemReference(\n context,\n commandContext,\n resolvedTask.id,\n itemId\n );\n await mutateModel(context, {\n baseUrl: commandContext.apiBaseUrl,\n request: {\n batchId: randomUUID(),\n transactions: [\n {\n action: \"ARCHIVE\",\n clientId: commandContext.localContext.clientId,\n clientTxId: randomUUID(),\n modelId: item.id,\n modelName: \"TaskChecklistItem\",\n payload: {},\n },\n ],\n },\n token: commandContext.token,\n });\n if (context.json) {\n writeOutput(context, { id: item.id, removed: true });\n return;\n }\n writeSuccess(context, `Removed: ${item.title}`);\n });\n }\n );\n};\n","// donebear comment ...\n// The comment thread on a task: read it, post to it, correct or remove one.\n//\n// Comments are workspace-visible messages about a task, not the task's own\n// content — `task edit --description` is where that lives. Nothing here\n// notifies anyone: Done Bear has no unread state, so a comment is read when\n// somebody next opens the task.\n\nimport { randomUUID } from \"node:crypto\";\n\nimport type { Command } from \"commander\";\n\nimport { resolveCommandContext } from \"../command-context\";\nimport { normalizeWorkspaceRef } from \"../command-helpers\";\nimport { formatInstantEpoch } from \"../date-codecs\";\nimport { CliError, EXIT_CODES } from \"../errors\";\nimport {\n listWorkspaceMembers,\n loadCommentsByTask,\n mutateModel,\n} from \"../manage-api\";\nimport { writeInfo, writeOutput, writeSuccess } from \"../output\";\nimport { readStdin } from \"../prompt\";\nimport { contextFromCommand, runWithErrorHandling } from \"../runtime\";\nimport type { CommentRecord } from \"../types\";\nimport { resolveTaskReference } from \"./task\";\n\n/**\n * Server-enforced ceiling on a comment body (`comments.body` is varchar(10000),\n * and `comment-rules.ts` rejects anything longer with a readable message).\n * Checked here too so an over-long body fails before the round trip.\n */\nconst MAX_COMMENT_LENGTH = 10_000;\n\n/** How much of a body identifies a comment in an ambiguous-prefix error. */\nconst PREVIEW_CHARS = 40;\n\ninterface WorkspaceOption {\n workspace?: string;\n}\n\n/**\n * A comment carries no \"edited\" column: the server does not touch `updatedAt`\n * on a body change, so the client sets it, and its distance from `createdAt` is\n * the whole signal.\n */\nexport const wasEdited = (comment: CommentRecord): boolean =>\n comment.updatedAt !== null && comment.updatedAt !== comment.createdAt;\n\nconst previewOf = (comment: CommentRecord): string => {\n const oneLine = comment.body.replaceAll(/\\s+/gu, \" \").trim();\n return oneLine.length > PREVIEW_CHARS\n ? `${oneLine.slice(0, PREVIEW_CHARS)}…`\n : oneLine;\n};\n\n/** A body of `-` is the explicit opt-in to read the comment from piped stdin. */\nexport const resolveCommentBody = async (flagBody: string): Promise<string> => {\n const raw = flagBody === \"-\" ? await readStdin() : flagBody;\n const body = (raw ?? \"\").trim();\n\n if (body.length === 0) {\n throw new CliError(\n \"A comment needs some text.\",\n EXIT_CODES.VALIDATION,\n flagBody === \"-\"\n ? \"Nothing arrived on stdin. Pipe the text in, or pass it directly.\"\n : 'Provide the text: donebear comment add 12 \"Looks good to me\"'\n );\n }\n\n if (body.length > MAX_COMMENT_LENGTH) {\n throw new CliError(\n `A comment is limited to ${MAX_COMMENT_LENGTH.toLocaleString(\"en-US\")} characters; this one is ${body.length.toLocaleString(\"en-US\")}.`,\n EXIT_CODES.VALIDATION\n );\n }\n\n return body;\n};\n\n/** The one comment a full id or a prefix names, or an error saying why not. */\nexport const matchCommentByRef = (\n comments: CommentRecord[],\n commentRef: string\n): CommentRecord => {\n const trimmed = commentRef.trim();\n\n if (!trimmed) {\n throw new Error(\"Comment id is required.\");\n }\n\n const exact = comments.find((comment) => comment.id === trimmed);\n\n if (exact) {\n return exact;\n }\n\n const matches = comments.filter((comment) => comment.id.startsWith(trimmed));\n const [match] = matches;\n\n if (matches.length === 0 || !match) {\n throw new Error(`Comment \"${trimmed}\" not found.`);\n }\n\n if (matches.length > 1) {\n const candidates = matches\n .map((comment) => `${comment.id.slice(0, 8)} (${previewOf(comment)})`)\n .join(\", \");\n throw new Error(\n `Comment prefix \"${trimmed}\" is ambiguous (${matches.length} matches): ${candidates}. Use a longer prefix.`\n );\n }\n\n return match;\n};\n\nconst resolveCommentReference = async (\n context: ReturnType<typeof contextFromCommand>,\n commandContext: Awaited<ReturnType<typeof resolveCommandContext>>,\n taskId: string,\n commentRef: string\n): Promise<CommentRecord> =>\n matchCommentByRef(\n await loadCommentsByTask(context, {\n baseUrl: commandContext.apiBaseUrl,\n taskId,\n token: commandContext.token,\n }),\n commentRef\n );\n\nconst runCommentList = async (\n context: ReturnType<typeof contextFromCommand>,\n taskRef: string,\n workspaceRef: string | null\n): Promise<void> => {\n const commandContext = await resolveCommandContext(context);\n const task = await resolveTaskReference(context, {\n commandContext,\n taskRef,\n workspaceRef,\n });\n const [comments, members] = await Promise.all([\n loadCommentsByTask(context, {\n baseUrl: commandContext.apiBaseUrl,\n taskId: task.id,\n token: commandContext.token,\n }),\n listWorkspaceMembers(context, {\n baseUrl: commandContext.apiBaseUrl,\n token: commandContext.token,\n workspaceId: task.workspaceId,\n }),\n ]);\n\n if (context.json) {\n writeOutput(context, { comments, ok: true, taskId: task.id });\n return;\n }\n\n if (comments.length === 0) {\n writeInfo(context, \"No comments.\");\n return;\n }\n\n const nameByUserId = new Map(\n members.map((member) => [\n member.userId,\n member.user.name ?? member.user.email ?? member.userId.slice(0, 8),\n ])\n );\n\n writeInfo(context, `Comments on: ${task.title}`);\n\n for (const comment of comments) {\n const author = nameByUserId.get(comment.userId) ?? \"Unknown member\";\n const when = formatInstantEpoch(comment.createdAt) ?? \"unknown date\";\n const edited = wasEdited(comment) ? \" (edited)\" : \"\";\n writeInfo(\n context,\n `${comment.id.slice(0, 8)} ${author} ${when}${edited}\\n ${comment.body}`\n );\n }\n};\n\nexport const registerCommentCommands = (\n program: Command,\n workspaceOverride: string | null\n): void => {\n const comment = program\n .command(\"comment\")\n .alias(\"comments\")\n .description(\"Read and write task comments\")\n .argument(\"<task-number>\", \"Workspace-scoped task number\")\n .option(\"-w, --workspace <workspace>\", \"Workspace id, slug, or exact name\")\n .addHelpText(\n \"after\",\n `\nExamples:\n donebear comment 12 --json\n donebear comment add 12 \"Blocked until the API ships\" --json\n cat notes.md | donebear comment add 12 - --json\n donebear comment edit 12 a1b2 --body \"Unblocked\" --json\n donebear comment remove 12 a1b2 --json\n\nComment id: full UUID or a prefix (from \"donebear comment <task>\").\nA comment is visible to the whole workspace and notifies nobody. Only its\nauthor can edit it; the author or a workspace owner/admin can remove it, and\nremoval is permanent.\n`\n )\n .action(\n async (\n taskRef: string,\n options: WorkspaceOption,\n command: Command\n ): Promise<void> => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runCommentList(\n context,\n taskRef,\n workspaceOverride ?? normalizeWorkspaceRef(options.workspace)\n );\n });\n }\n );\n\n comment\n .command(\"list\")\n .alias(\"ls\")\n .description(\"List a task's comments, oldest first\")\n .argument(\"<task-number>\", \"Workspace-scoped task number\")\n .option(\"-w, --workspace <workspace>\", \"Workspace id, slug, or exact name\")\n .action(\n async (\n taskRef: string,\n options: WorkspaceOption,\n command: Command\n ): Promise<void> => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runCommentList(\n context,\n taskRef,\n workspaceOverride ?? normalizeWorkspaceRef(options.workspace)\n );\n });\n }\n );\n\n comment\n .command(\"add\")\n .description(\"Post a comment on a task\")\n .argument(\"<task-number>\", \"Workspace-scoped task number\")\n .argument(\"<body>\", 'Comment text (pass \"-\" to read piped stdin)')\n .option(\"-w, --workspace <workspace>\", \"Workspace id, slug, or exact name\")\n .action(\n async (\n taskRef: string,\n bodyArgument: string,\n options: WorkspaceOption,\n command: Command\n ): Promise<void> => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n const body = await resolveCommentBody(bodyArgument);\n const commandContext = await resolveCommandContext(context);\n const task = await resolveTaskReference(context, {\n commandContext,\n taskRef,\n workspaceRef:\n workspaceOverride ?? normalizeWorkspaceRef(options.workspace),\n });\n const commentId = randomUUID();\n // One timestamp for both columns: an edit is signalled by updatedAt\n // moving away from createdAt, so a new comment starts with them equal.\n const now = Date.now();\n\n await mutateModel(context, {\n baseUrl: commandContext.apiBaseUrl,\n request: {\n batchId: randomUUID(),\n transactions: [\n {\n action: \"INSERT\",\n clientId: commandContext.localContext.clientId,\n clientTxId: randomUUID(),\n modelId: commentId,\n modelName: \"Comment\",\n // No userId: the server stamps the author from the session\n // and rejects a payload claiming anyone else.\n payload: {\n body,\n createdAt: now,\n taskId: task.id,\n updatedAt: now,\n workspaceId: task.workspaceId,\n },\n },\n ],\n },\n token: commandContext.token,\n });\n\n if (context.json) {\n writeOutput(context, { created: true, id: commentId });\n return;\n }\n\n writeSuccess(context, `Commented on ${task.title}`);\n });\n }\n );\n\n comment\n .command(\"edit\")\n .description(\"Rewrite one of your own comments\")\n .argument(\"<task-number>\", \"Workspace-scoped task number\")\n .argument(\"<comment-id>\", \"Comment id or prefix\")\n .requiredOption(\n \"--body <text>\",\n 'Replacement text (pass \"-\" to read piped stdin)'\n )\n .option(\"-w, --workspace <workspace>\", \"Workspace id, slug, or exact name\")\n .addHelpText(\n \"after\",\n `\nOnly the comment's author can edit it; the server refuses anyone else. To\nrespond to a teammate's comment, add your own instead.\n`\n )\n .action(\n async (\n taskRef: string,\n commentRef: string,\n options: WorkspaceOption & { body: string },\n command: Command\n ): Promise<void> => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n const body = await resolveCommentBody(options.body);\n const commandContext = await resolveCommandContext(context);\n const task = await resolveTaskReference(context, {\n commandContext,\n taskRef,\n workspaceRef:\n workspaceOverride ?? normalizeWorkspaceRef(options.workspace),\n });\n const existing = await resolveCommentReference(\n context,\n commandContext,\n task.id,\n commentRef\n );\n\n await mutateModel(context, {\n baseUrl: commandContext.apiBaseUrl,\n request: {\n batchId: randomUUID(),\n transactions: [\n {\n action: \"UPDATE\",\n clientId: commandContext.localContext.clientId,\n clientTxId: randomUUID(),\n modelId: existing.id,\n modelName: \"Comment\",\n // updatedAt is the client's to set: the server stores what\n // arrives, and its distance from createdAt marks the edit.\n payload: { body, updatedAt: Date.now() },\n },\n ],\n },\n token: commandContext.token,\n });\n\n if (context.json) {\n writeOutput(context, { id: existing.id, ok: true });\n return;\n }\n\n writeSuccess(context, `Updated comment ${existing.id.slice(0, 8)}`);\n });\n }\n );\n\n comment\n .command(\"remove\")\n .alias(\"rm\")\n .description(\"Delete a comment permanently\")\n .argument(\"<task-number>\", \"Workspace-scoped task number\")\n .argument(\"<comment-id>\", \"Comment id or prefix\")\n .option(\"-w, --workspace <workspace>\", \"Workspace id, slug, or exact name\")\n .addHelpText(\n \"after\",\n `\nComments have no Trash: this cannot be undone. You can remove your own; a\nworkspace owner or admin can remove anyone's.\n`\n )\n .action(\n async (\n taskRef: string,\n commentRef: string,\n options: WorkspaceOption,\n command: Command\n ): Promise<void> => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n const commandContext = await resolveCommandContext(context);\n const task = await resolveTaskReference(context, {\n commandContext,\n taskRef,\n workspaceRef:\n workspaceOverride ?? normalizeWorkspaceRef(options.workspace),\n });\n const existing = await resolveCommentReference(\n context,\n commandContext,\n task.id,\n commentRef\n );\n\n await mutateModel(context, {\n baseUrl: commandContext.apiBaseUrl,\n request: {\n batchId: randomUUID(),\n transactions: [\n {\n action: \"DELETE\",\n clientId: commandContext.localContext.clientId,\n clientTxId: randomUUID(),\n modelId: existing.id,\n modelName: \"Comment\",\n payload: {},\n },\n ],\n },\n token: commandContext.token,\n });\n\n if (context.json) {\n writeOutput(context, { id: existing.id, removed: true });\n return;\n }\n\n writeSuccess(context, `Removed comment ${existing.id.slice(0, 8)}`);\n });\n }\n );\n};\n","// donebear context [--workspace <ws>] [--tasks-limit <n>] [--markdown]\n// Workspace state snapshot for agent orientation\n\nimport type { Command } from \"commander\";\n\nimport { resolveCommandContext } from \"../command-context\";\nimport { normalizeWorkspaceRef } from \"../command-helpers\";\nimport { parsePositiveInteger } from \"../command-parsers\";\nimport { formatDateOnlyEpoch } from \"../date-codecs\";\nimport { loadProjectsByWorkspace, loadTasksByWorkspace } from \"../manage-api\";\nimport { writeInfo, writeOutput } from \"../output\";\nimport { contextFromCommand, runWithErrorHandling } from \"../runtime\";\nimport { getTaskState, resolveTaskView } from \"../task-defaults\";\nimport type { ProjectRecord, StoredSessionUser, TaskRecord } from \"../types\";\nimport { resolveWorkspace } from \"../workspace-context\";\n\nconst DEFAULT_TASKS_LIMIT = 10;\n\ninterface ContextOptions {\n workspace?: string;\n tasksLimit: number;\n markdown: boolean;\n}\n\ninterface TaskSummary {\n id: string;\n title: string;\n deadline: string | null;\n view: string | null;\n}\n\ninterface ProjectSummary {\n id: string;\n key: string;\n name: string;\n targetDate: string | null;\n}\n\ninterface TaskCounts {\n open: number;\n done: number;\n archived: number;\n total: number;\n}\n\nconst buildTaskCounts = (tasks: TaskRecord[]): TaskCounts => {\n const counts: TaskCounts = {\n archived: 0,\n done: 0,\n open: 0,\n total: tasks.length,\n };\n for (const task of tasks) {\n const state = getTaskState(task);\n if (state === \"open\") {\n counts.open += 1;\n } else if (state === \"done\") {\n counts.done += 1;\n } else if (state === \"archived\") {\n counts.archived += 1;\n }\n }\n return counts;\n};\n\nconst buildRecentTasks = (tasks: TaskRecord[], limit: number): TaskSummary[] =>\n [...tasks]\n .filter((t) => getTaskState(t) === \"open\")\n .toSorted((a, b) => (b.updatedAt ?? 0) - (a.updatedAt ?? 0))\n .slice(0, limit)\n .map((t) => ({\n deadline: formatDateOnlyEpoch(t.deadlineAt),\n id: t.id,\n title: t.title,\n view: resolveTaskView(t),\n }));\n\nconst buildActiveProjects = (projects: ProjectRecord[]): ProjectSummary[] =>\n projects\n .filter((p) => p.archivedAt === null && p.completedAt === null)\n .map((p) => ({\n id: p.id,\n key: p.key,\n name: p.name,\n targetDate: formatDateOnlyEpoch(p.targetDate),\n }));\n\nconst formatMarkdownOutput = (\n context: ReturnType<typeof contextFromCommand>,\n user: StoredSessionUser | null | undefined,\n workspace: { name: string; urlKey?: string | null },\n taskCounts: TaskCounts,\n recentTasks: TaskSummary[],\n activeProjects: ProjectSummary[]\n): void => {\n const lines: string[] = [\n \"# Donebear Context\",\n \"\",\n `## Workspace: ${workspace.name}${workspace.urlKey ? ` (${workspace.urlKey})` : \"\"}`,\n `User: ${user?.email ?? user?.id ?? \"(unknown)\"}`,\n \"\",\n `## Tasks: ${taskCounts.open} open / ${taskCounts.done} done / ${taskCounts.total} total`,\n ];\n\n if (recentTasks.length > 0) {\n lines.push(\"\", \"## Recent Open Tasks\");\n for (const t of recentTasks) {\n const deadline = t.deadline ? `, due ${t.deadline}` : \"\";\n lines.push(`- [${t.id.slice(0, 8)}] ${t.title} (${t.view})${deadline}`);\n }\n }\n\n if (activeProjects.length > 0) {\n lines.push(\"\", \"## Active Projects\");\n for (const p of activeProjects) {\n const target = p.targetDate ? ` (target: ${p.targetDate})` : \"\";\n lines.push(`- [${p.key}] ${p.name}${target}`);\n }\n }\n\n lines.push(\n \"\",\n \"## Quick Commands\",\n \"donebear spec # full CLI spec, no auth needed\",\n \"donebear spec task add # detailed spec for one command\",\n \"donebear guide # concepts: views, dates, bulk changes, ...\",\n \"donebear guide agents # how to drive Done Bear as an agent\",\n \"donebear task list --json\",\n 'donebear task add \"Title\" --when today --json',\n 'donebear search \"query\" --json'\n );\n\n writeInfo(context, lines.join(\"\\n\"));\n};\n\nconst writeTextOutput = (\n context: ReturnType<typeof contextFromCommand>,\n workspace: { name: string },\n taskCounts: TaskCounts,\n recentTasks: TaskSummary[],\n activeProjects: ProjectSummary[]\n): void => {\n writeInfo(context, `Workspace: ${workspace.name}`);\n writeInfo(\n context,\n `Tasks: ${taskCounts.open} open / ${taskCounts.done} done / ${taskCounts.total} total`\n );\n if (recentTasks.length > 0) {\n writeInfo(context, `Recent open tasks (${recentTasks.length}):`);\n for (const t of recentTasks) {\n const deadline = t.deadline ? ` (due ${t.deadline})` : \"\";\n writeInfo(context, ` [${t.id.slice(0, 8)}] ${t.title}${deadline}`);\n }\n }\n if (activeProjects.length > 0) {\n writeInfo(context, `Active projects (${activeProjects.length}):`);\n for (const p of activeProjects) {\n writeInfo(context, ` [${p.key}] ${p.name}`);\n }\n }\n};\n\nconst runContext = async (\n context: ReturnType<typeof contextFromCommand>,\n workspaceOverride: string | null,\n options: ContextOptions\n): Promise<void> => {\n const commandContext = await resolveCommandContext(context);\n\n const { workspace } = await resolveWorkspace(context, {\n apiBaseUrl: commandContext.apiBaseUrl,\n storedWorkspaceId: commandContext.localContext.workspaceId,\n token: commandContext.token,\n workspaceRef: workspaceOverride ?? normalizeWorkspaceRef(options.workspace),\n });\n\n const [tasks, projects] = await Promise.all([\n loadTasksByWorkspace(context, {\n baseUrl: commandContext.apiBaseUrl,\n token: commandContext.token,\n workspaceId: workspace.id,\n }),\n loadProjectsByWorkspace(context, {\n baseUrl: commandContext.apiBaseUrl,\n token: commandContext.token,\n workspaceId: workspace.id,\n }),\n ]);\n\n const taskCounts = buildTaskCounts(tasks);\n const recentTasks = buildRecentTasks(tasks, options.tasksLimit);\n const activeProjects = buildActiveProjects(projects);\n const { user } = commandContext.resolvedToken;\n\n if (options.markdown) {\n formatMarkdownOutput(\n context,\n user,\n workspace,\n taskCounts,\n recentTasks,\n activeProjects\n );\n return;\n }\n\n if (context.json) {\n writeOutput(context, {\n activeProjects,\n generatedAt: new Date().toISOString(),\n ok: true,\n recentTasks,\n taskCounts,\n user: {\n email: user?.email ?? null,\n id: user?.id ?? null,\n },\n workspace: {\n id: workspace.id,\n name: workspace.name,\n urlKey: workspace.urlKey,\n },\n });\n return;\n }\n\n writeTextOutput(context, workspace, taskCounts, recentTasks, activeProjects);\n};\n\nexport const registerContextCommand = (\n program: Command,\n workspaceOverride: string | null\n): void => {\n program\n .command(\"context\")\n .description(\"Workspace snapshot for agent orientation\")\n .option(\"-w, --workspace <workspace>\", \"Workspace id, slug, or exact name\")\n .option(\n \"--tasks-limit <count>\",\n \"Max recent open tasks to include\",\n (value: string): number => parsePositiveInteger(value, \"Tasks limit\"),\n DEFAULT_TASKS_LIMIT\n )\n .option(\"--markdown\", \"Output as markdown (for system prompt injection)\")\n .addHelpText(\n \"after\",\n `\nExamples:\n donebear context --json\n donebear context --markdown\n donebear context --tasks-limit 20 --json\n donebear context --markdown > context.md\n`\n )\n .action(async (options: ContextOptions, command: Command) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runContext(context, workspaceOverride, options);\n });\n });\n};\n","import { createRequire } from \"node:module\";\n\ninterface PackageManifest {\n version: string;\n}\n\n// This module must stay one directory below the package root so the relative\n// require resolves both from src/ (vitest) and from the bundled dist/ output.\nconst require = createRequire(import.meta.url);\n\nexport const packageManifest = require(\"../package.json\") as PackageManifest;\n","import { existsSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { styleText } from \"node:util\";\n\nimport type { Command } from \"commander\";\n\nimport { resolveAuthToken } from \"../auth-session\";\nimport { CLI_NAME } from \"../constants\";\nimport { EXIT_CODES } from \"../errors\";\nimport { packageManifest } from \"../manifest\";\nimport { writeJson } from \"../output\";\nimport { contextFromCommand, runWithErrorHandling } from \"../runtime\";\nimport { resolveSupabaseConfig } from \"../supabase\";\nimport type { CliContext } from \"../types\";\n\ntype CheckStatus = \"pass\" | \"warn\" | \"fail\";\n\ninterface CheckResult {\n name: string;\n status: CheckStatus;\n message: string;\n}\n\n// ---------------------------------------------------------------------------\n// Individual checks\n// ---------------------------------------------------------------------------\n\nconst checkCliVersion = async (): Promise<CheckResult> => {\n const current = packageManifest.version;\n\n try {\n const response = await fetch(\"https://registry.npmjs.org/donebear/latest\", {\n signal: AbortSignal.timeout(5000),\n });\n\n if (!response.ok) {\n return {\n message: `v${current} (unable to check for updates)`,\n name: \"CLI Version\",\n status: \"warn\",\n };\n }\n\n const data = (await response.json()) as { version?: string };\n const latest = data.version;\n\n if (!latest) {\n return {\n message: `v${current} (unable to check for updates)`,\n name: \"CLI Version\",\n status: \"warn\",\n };\n }\n\n if (current === latest) {\n return {\n message: `v${current} (latest)`,\n name: \"CLI Version\",\n status: \"pass\",\n };\n }\n\n return {\n message: `v${current} (update available: v${latest})`,\n name: \"CLI Version\",\n status: \"warn\",\n };\n } catch {\n return {\n message: `v${current} (unable to check for updates)`,\n name: \"CLI Version\",\n status: \"warn\",\n };\n }\n};\n\nconst maskToken = (token: string): string => {\n if (token.length <= 8) {\n return \"***\";\n }\n\n return `${token.slice(0, 4)}...${token.slice(-4)}`;\n};\n\nconst checkAuth = async (context: CliContext): Promise<CheckResult> => {\n try {\n const config = (() => {\n try {\n return resolveSupabaseConfig();\n } catch {\n return null;\n }\n })();\n\n const token = await resolveAuthToken(context, config);\n\n if (!token) {\n return {\n message: \"No API key or token found\",\n name: \"Auth\",\n status: \"fail\",\n };\n }\n\n return {\n message: `${maskToken(token.token)} (source: ${token.source})`,\n name: \"Auth\",\n status: \"pass\",\n };\n } catch {\n return {\n message: \"Failed to resolve authentication\",\n name: \"Auth\",\n status: \"fail\",\n };\n }\n};\n\nconst checkWorkspace = async (): Promise<CheckResult> => {\n try {\n const { ensureLocalContext } = await import(\"../context-store\");\n const localContext = await ensureLocalContext();\n\n if (!localContext.workspaceId) {\n return {\n message: \"No workspace selected (run `donebear workspace use`)\",\n name: \"Workspace\",\n status: \"warn\",\n };\n }\n\n return {\n message: `Selected: ${localContext.workspaceId.slice(0, 8)}...`,\n name: \"Workspace\",\n status: \"pass\",\n };\n } catch {\n return {\n message: \"Unable to read workspace state\",\n name: \"Workspace\",\n status: \"warn\",\n };\n }\n};\n\ninterface AgentInfo {\n name: string;\n detected: boolean;\n}\n\nconst detectClaudeDesktop = (home: string): boolean => {\n if (process.platform === \"darwin\") {\n return existsSync(\n join(\n home,\n \"Library\",\n \"Application Support\",\n \"Claude\",\n \"claude_desktop_config.json\"\n )\n );\n }\n\n if (process.platform === \"win32\") {\n const appData = process.env.APPDATA ?? join(home, \"AppData\", \"Roaming\");\n return existsSync(join(appData, \"Claude\", \"claude_desktop_config.json\"));\n }\n\n return existsSync(join(home, \".config\", \"claude\", \"config.json\"));\n};\n\nconst detectAgents = (): AgentInfo[] => {\n const home = homedir();\n\n const agents: AgentInfo[] = [\n {\n detected: existsSync(join(home, \".claude\")),\n name: \"Claude Code\",\n },\n {\n detected: existsSync(join(home, \".cursor\")),\n name: \"Cursor\",\n },\n {\n detected: detectClaudeDesktop(home),\n name: \"Claude Desktop\",\n },\n {\n detected: existsSync(join(process.cwd(), \".vscode\", \"mcp.json\")),\n name: \"VS Code\",\n },\n ];\n\n return agents;\n};\n\nconst checkAgents = (): CheckResult => {\n const agents = detectAgents();\n const detected = agents.filter((a) => a.detected);\n\n if (detected.length === 0) {\n return {\n message: \"None detected\",\n name: \"AI Agents\",\n status: \"pass\",\n };\n }\n\n return {\n message: `Detected: ${detected.map((a) => a.name).join(\", \")}`,\n name: \"AI Agents\",\n status: \"pass\",\n };\n};\n\n// ---------------------------------------------------------------------------\n// Output\n// ---------------------------------------------------------------------------\n\nconst STATUS_ICONS: Record<CheckStatus, string> = {\n fail: \"\\u2718\",\n pass: \"\\u2714\",\n warn: \"\\u26A0\",\n};\n\nconst STATUS_COLORS: Record<CheckStatus, Parameters<typeof styleText>[0]> = {\n fail: \"red\",\n pass: \"green\",\n warn: \"yellow\",\n};\n\nconst writeInteractiveResult = (\n context: CliContext,\n checks: CheckResult[]\n): void => {\n const title = context.color\n ? styleText(\"bold\", ` ${CLI_NAME} doctor`)\n : ` ${CLI_NAME} doctor`;\n\n process.stdout.write(`\\n${title}\\n\\n`);\n\n for (const check of checks) {\n const icon = STATUS_ICONS[check.status];\n const line = ` ${icon} ${check.name}: ${check.message}`;\n const colored = context.color\n ? styleText(STATUS_COLORS[check.status], line)\n : line;\n process.stdout.write(`${colored}\\n`);\n }\n\n process.stdout.write(\"\\n\");\n};\n\n// ---------------------------------------------------------------------------\n// Command\n// ---------------------------------------------------------------------------\n\nconst runDoctor = async (context: CliContext): Promise<void> => {\n const checks = await Promise.all([\n checkCliVersion(),\n checkAuth(context),\n checkWorkspace(),\n ]);\n\n checks.push(checkAgents());\n\n const ok = checks.every((c) => c.status !== \"fail\");\n\n if (context.json) {\n writeJson({ checks, ok });\n } else {\n writeInteractiveResult(context, checks);\n }\n\n if (!ok) {\n process.exitCode = EXIT_CODES.ERROR;\n }\n};\n\nexport const registerDoctorCommand = (program: Command): void => {\n program\n .command(\"doctor\")\n .description(\"Run environment diagnostics\")\n .action(async (_options: unknown, command: Command) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runDoctor(context);\n });\n });\n};\n","import { CliError, EXIT_CODES } from \"../errors\";\nimport type { CliContext } from \"../types\";\nimport { requestNdjson } from \"./http\";\n\n/**\n * Content models a workspace owner may export or re-read in bulk.\n *\n * `MODEL_CONFIG` on the server defines six more (`AgentThread`, `TeamMembership`,\n * `User`, `Workspace`, `WorkspaceInvitation`, `WorkspaceMembership`). Those carry\n * other members' identities and invitation email addresses, so bulk readers stay\n * on the content set rather than the full sync surface.\n *\n * This is the single source for the list. `ImportModelName` and the importer's\n * model array both alias it, so a content model cannot be added to one\n * reader and forgotten in the other.\n */\nexport const SYNC_CONTENT_MODELS = [\n \"Team\",\n \"Label\",\n \"Project\",\n \"TeamProject\",\n \"ProjectHeading\",\n \"Task\",\n \"TaskLabel\",\n \"TaskChecklistItem\",\n \"TaskAttachment\",\n] as const;\n\nexport type SyncContentModelName = (typeof SYNC_CONTENT_MODELS)[number];\n\nexport interface BootstrapStream {\n /** Server sync position the snapshot was taken at, or null on an older server. */\n lastSyncId: string | null;\n /** Model rows, each tagged with `__class`. The metadata line is not included. */\n rows: unknown[];\n}\n\ninterface BootstrapMetadata {\n lastSyncId: string | null;\n returnedModelsCount: Record<string, number> | null;\n}\n\n/**\n * The first line of a bootstrap stream is metadata, not a model row: it has no\n * `__class` and carries `returnedModelsCount`. Returns null for anything else,\n * so a server that stops sending it degrades to no verification rather than an\n * error.\n */\nconst readBootstrapMetadata = (line: unknown): BootstrapMetadata | null => {\n if (typeof line !== \"object\" || line === null) {\n return null;\n }\n\n const record = line as Record<string, unknown>;\n if (record.__class !== undefined) {\n return null;\n }\n\n const counts = record.returnedModelsCount;\n if (typeof counts !== \"object\" || counts === null) {\n return null;\n }\n\n return {\n lastSyncId:\n typeof record.lastSyncId === \"string\" ? record.lastSyncId : null,\n returnedModelsCount: counts as Record<string, number>,\n };\n};\n\nconst countRowsByModel = (rows: unknown[]): Map<string, number> => {\n const counts = new Map<string, number>();\n\n for (const row of rows) {\n if (typeof row !== \"object\" || row === null) {\n continue;\n }\n\n const modelName = (row as Record<string, unknown>).__class;\n if (typeof modelName !== \"string\") {\n continue;\n }\n\n counts.set(modelName, (counts.get(modelName) ?? 0) + 1);\n }\n\n return counts;\n};\n\n/**\n * A dropped connection truncates the stream without producing an error line:\n * the server never sees a failure, so it never serialises one, and if the cut\n * lands on a newline boundary every row that did arrive parses cleanly. The\n * only thing separating a short read from a complete one is the count the\n * server already sent us, so a bulk reader that ignores it cannot tell.\n */\nexport const assertBootstrapComplete = (\n rows: unknown[],\n metadata: BootstrapMetadata | null\n): void => {\n if (metadata === null || metadata.returnedModelsCount === null) {\n return;\n }\n\n const actual = countRowsByModel(rows);\n\n for (const [modelName, expected] of Object.entries(\n metadata.returnedModelsCount\n )) {\n const received = actual.get(modelName) ?? 0;\n\n if (received !== expected) {\n throw new CliError(\n `Incomplete response: the server sent ${expected} ${modelName} row(s) but ${received} arrived.`,\n EXIT_CODES.NETWORK,\n \"The connection dropped partway through. Retry; the partial result was discarded rather than used.\"\n );\n }\n }\n};\n\n/**\n * Streams `/sync/bootstrap` for one workspace.\n *\n * Rows arrive tagged with `__class` and `workspaceId`; callers filter. Both a\n * server-side failure and a truncated stream raise rather than returning a\n * partial result.\n */\nexport const fetchBootstrapRows = async (\n context: CliContext,\n options: {\n apiBaseUrl: string;\n token: string;\n workspaceId: string;\n modelNames: readonly string[];\n }\n): Promise<BootstrapStream> => {\n const query = new URLSearchParams({\n onlyModels: options.modelNames.join(\",\"),\n schemaHash: \"\",\n syncGroups: options.workspaceId,\n });\n\n const lines = await requestNdjson(\n context,\n `${options.apiBaseUrl}/sync/bootstrap?${query.toString()}`,\n {\n method: \"GET\",\n token: options.token,\n }\n );\n\n const metadata = readBootstrapMetadata(lines[0]);\n const rows = metadata === null ? lines : lines.slice(1);\n\n assertBootstrapComplete(rows, metadata);\n\n return { lastSyncId: metadata?.lastSyncId ?? null, rows };\n};\n","import { SYNC_CONTENT_MODELS } from \"../api/bootstrap\";\nimport type { WorkspaceExport } from \"./export-runner\";\n\ninterface WorkspaceExportTextSummary {\n successMessage: string;\n infoLines: string[];\n}\n\nexport const summarizeWorkspaceExport = (\n result: WorkspaceExport\n): WorkspaceExportTextSummary => {\n const total = SYNC_CONTENT_MODELS.reduce(\n (sum, modelName) => sum + result.counts[modelName],\n 0\n );\n\n const infoLines = [\n `workspace: ${result.workspace.name}`,\n `exported at: ${result.exportedAt}`,\n `format version: ${result.formatVersion}`,\n ...SYNC_CONTENT_MODELS.map(\n (modelName) => `${modelName}: ${result.counts[modelName]}`\n ),\n `total records: ${total}`,\n ];\n\n return {\n infoLines,\n successMessage: `Exported ${total} record(s) from ${result.workspace.name}`,\n };\n};\n","import { fetchBootstrapRows, SYNC_CONTENT_MODELS } from \"../api/bootstrap\";\nimport type { SyncContentModelName } from \"../api/bootstrap\";\nimport type { CliContext, WorkspaceSummary } from \"../types\";\n\nconst EXPORT_FORMAT_VERSION = 1;\n\nexport interface WorkspaceExport {\n formatVersion: number;\n exportedAt: string;\n /** Server sync position this snapshot represents, or null on an older server. */\n lastSyncId: string | null;\n workspace: {\n id: string;\n name: string;\n urlKey: string | null;\n };\n counts: Record<SyncContentModelName, number>;\n records: ExportRecords;\n}\n\ninterface RunExportOptions {\n context: CliContext;\n commandContext: {\n apiBaseUrl: string;\n token: string;\n };\n workspace: WorkspaceSummary;\n exportedAt: string;\n}\n\ntype ExportRecords = Record<SyncContentModelName, Record<string, unknown>[]>;\n\nconst emptyBuckets = (): ExportRecords => {\n const records = {} as ExportRecords;\n\n for (const modelName of SYNC_CONTENT_MODELS) {\n records[modelName] = [];\n }\n\n return records;\n};\n\n/**\n * Groups bootstrap rows by `__class`, dropping the sync envelope keys so the\n * archive holds the record as stored rather than as transported.\n *\n * Rows for other workspaces are dropped: `syncGroups` already scopes the request\n * to one workspace, but the caller's other groups can share the stream.\n */\nexport const groupExportRows = (\n rows: unknown[],\n workspaceId: string\n): ExportRecords => {\n const known = new Set<string>(SYNC_CONTENT_MODELS);\n const records = emptyBuckets();\n\n for (const row of rows) {\n if (typeof row !== \"object\" || row === null) {\n continue;\n }\n\n const record = row as Record<string, unknown>;\n const modelName = record.__class;\n\n if (typeof modelName !== \"string\" || !known.has(modelName)) {\n continue;\n }\n\n if (record.workspaceId !== workspaceId) {\n continue;\n }\n\n const { __class, ...rest } = record;\n records[modelName as SyncContentModelName].push(rest);\n }\n\n return records;\n};\n\nconst countBuckets = (\n records: ExportRecords\n): Record<SyncContentModelName, number> => {\n const counts = {} as Record<SyncContentModelName, number>;\n\n for (const modelName of SYNC_CONTENT_MODELS) {\n counts[modelName] = records[modelName].length;\n }\n\n return counts;\n};\n\nexport const runWorkspaceExport = async (\n options: RunExportOptions\n): Promise<WorkspaceExport> => {\n const { lastSyncId, rows } = await fetchBootstrapRows(options.context, {\n apiBaseUrl: options.commandContext.apiBaseUrl,\n modelNames: SYNC_CONTENT_MODELS,\n token: options.commandContext.token,\n workspaceId: options.workspace.id,\n });\n\n const records = groupExportRows(rows, options.workspace.id);\n\n return {\n counts: countBuckets(records),\n exportedAt: options.exportedAt,\n formatVersion: EXPORT_FORMAT_VERSION,\n lastSyncId,\n records,\n workspace: {\n id: options.workspace.id,\n name: options.workspace.name,\n urlKey: options.workspace.urlKey,\n },\n };\n};\n","import type { Command } from \"commander\";\n\nimport { resolveCommandContext } from \"../command-context\";\nimport { normalizeWorkspaceRef } from \"../command-helpers\";\nimport { summarizeWorkspaceExport } from \"../export/export-output\";\nimport { runWorkspaceExport } from \"../export/export-runner\";\nimport { writeInfo, writeOutput, writeSuccess } from \"../output\";\nimport { contextFromCommand, runWithErrorHandling } from \"../runtime\";\nimport { resolveWorkspace } from \"../workspace-context\";\n\ninterface ExportOptions {\n workspace?: string;\n}\n\nconst runExportCommand = async (\n context: ReturnType<typeof contextFromCommand>,\n options: ExportOptions,\n workspaceOverride: string | null\n): Promise<void> => {\n const commandContext = await resolveCommandContext(context);\n const { workspace, autoSelected } = await resolveWorkspace(context, {\n apiBaseUrl: commandContext.apiBaseUrl,\n storedWorkspaceId: commandContext.localContext.workspaceId,\n token: commandContext.token,\n workspaceRef: workspaceOverride ?? normalizeWorkspaceRef(options.workspace),\n });\n\n const result = await runWorkspaceExport({\n commandContext,\n context,\n exportedAt: new Date().toISOString(),\n workspace,\n });\n\n if (context.json) {\n writeOutput(context, result);\n return;\n }\n\n if (autoSelected) {\n writeInfo(context, `Auto-selected workspace: ${workspace.name}`);\n }\n\n const summary = summarizeWorkspaceExport(result);\n writeSuccess(context, summary.successMessage);\n\n for (const line of summary.infoLines) {\n writeInfo(context, line);\n }\n};\n\nexport const registerExportCommands = (\n program: Command,\n workspaceOverride: string | null\n): void => {\n program\n .command(\"export\")\n .description(\"Export a workspace as a portable JSON archive\")\n .option(\"-w, --workspace <workspace>\", \"Workspace id, slug, or exact name\")\n .addHelpText(\n \"after\",\n `\nExamples:\n donebear export > backup.json\n donebear export --workspace personal > personal-backup.json\n donebear export --json | jq '.counts'\n\nNotes:\n Output is JSON on stdout. Redirect it to a file; there is no --out flag.\n The archive carries every stored field, including ordering and repeat state that the read API omits.\n Teams, labels, projects, headings, tasks, task-label links, checklist items, and task attachment\n rows (filename, size, media type) are included. Attachment bytes are not copied — only the metadata\n row, not the uploaded file itself.\n Workspace members, invitations, and agent threads are not, because they hold other people's data.\n`\n )\n .action(async (options: ExportOptions, command: Command) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runExportCommand(context, options, workspaceOverride);\n });\n });\n};\n","// donebear guide [topic]\n// Concepts for agent discovery, no auth required.\n//\n// `donebear spec` answers \"what flags does this command take\". This answers\n// \"what does this concept mean and how do I use it well\" — the part an agent\n// cannot infer from a flag list, and the part it gets wrong in ways that cost\n// the user data (scrambled checklists, a 50-task bulk edit with no undo).\n//\n// The MCP server carries a sibling copy of this material in\n// `apps/manage-api/src/modules/mcp/guides.ts`, worded for tool callers rather\n// than CLI callers. Keep the facts in step; the phrasing is deliberately not\n// shared.\n\nimport type { Command } from \"commander\";\n\nimport { CliError, EXIT_CODES } from \"../errors\";\nimport { writeJson } from \"../output\";\nimport { contextFromCommand, runWithErrorHandling } from \"../runtime\";\n\nexport interface Guide {\n /** Stable topic id, used as the command argument. */\n id: string;\n title: string;\n /** One line, phrased as the task that should make an agent read it. */\n whenToUse: string;\n markdown: string;\n}\n\nexport const GUIDES: Guide[] = [\n {\n id: \"views\",\n markdown: `# Views\n\nDone Bear is GTD-shaped. Every task sits in exactly one view, derived from its\nstate and start date rather than stored as a column:\n\n- inbox captured, not yet placed\n- today start date today or earlier\n- upcoming start date in the future\n- anytime actionable now, no date pressure\n- someday parked, off every working list\n- logbook completed\n- trash archived\n\n\\`--when\\` sets the bucket on create and edit; \\`--state open|done|archived|all\\`\nreaches the Logbook and Trash on list.\n\n donebear task add \"Renew passport\" --when upcoming --deadline 2030-03-01 --json\n donebear task list --state done --json\n\n\\`donebear task add\\` defaults to today, so a task created without \\`--when\\`\nstarts today and shows up on the user's working list straight away. That is the\nright default for work the user is asking you to do now. When the user is only\ncapturing something to sort out later, say so with \\`--when inbox\\` rather than\nleaving it on the default. someday is for work the user has explicitly deferred,\nso do not use it to tidy up a long list.\n\nTwo exceptions. Passing \\`--deadline\\` without \\`--when\\` lands the task in\nanytime, because a thing due at the end of the month is not a thing to do\ntoday, and a run of those would bury the working list. The deadline still\npulls it into today on the day it falls due.\n\nPassing \\`--project\\` or \\`--team\\` without \\`--when\\` lands the task in inbox.\nThe task already has a home, so it is not an uncommitted capture, and filling\na project should not fill today at the same time. A deadline still wins over\nthis: filed work that is due later goes to anytime.\n\nA due deadline overrides the bucket. A task whose deadline is today or already\npast appears in today no matter which \\`--when\\` it has, so \\`donebear today\\`\nand \\`donebear task list --view today\\` will show it. A deadline that has\npassed is more urgent than one landing today, so an overdue task never quietly\ndrops back into anytime or someday. This is the usual answer to why a task is\nin today when nobody put it there.\n\nToday and Upcoming are computed against a calendar day, so they depend on the\nmachine's timezone. Check \\`donebear context --json\\` for the counts the server\nresolved rather than assuming.`,\n title: \"Views and the GTD model\",\n whenToUse:\n \"Placing a task in inbox/today/upcoming/anytime/someday, listing a view, or working out why today looks wrong.\",\n },\n {\n id: \"dates\",\n markdown: `# Dates\n\nDates are YYYY-MM-DD. Tasks have no time-of-day field.\n\nTwo date fields, two meanings:\n\n- start date when the task becomes relevant. \\`--when\\` sets it, and it decides\n today vs upcoming.\n- deadline when it is due. Independent of the view: a task can sit in\n anytime with a deadline next month.\n\n\"Due Friday\" is \\`--deadline\\`, not \\`--when\\`. Only move the view as well if the\nuser also said when to start. A deadline on its own does not schedule the\ntask; it stays wherever you put it until the deadline is today or overdue, at\nwhich point it appears in today (see \\`donebear guide views\\`).\n\nClear a date with the explicit flag rather than passing an empty value:\n\n donebear task edit 12 --clear-deadline --json\n donebear project edit launch --clear-target-date --json\n\nRepeating tasks exist in Done Bear but are not editable from the CLI. If a user\nasks to make something repeat, say so rather than creating a run of copies.`,\n title: \"Dates and deadlines\",\n whenToUse:\n \"Setting or clearing a due date, or choosing between a deadline and a start date.\",\n },\n {\n id: \"editing\",\n markdown: `# Editing tasks\n\n\\`donebear task edit\\` is a partial update. Omitted flags are left alone, so you\nnever have to read a task first just to preserve its other fields.\n\n- provided replaced. \\`--description\\` replaces the description outright;\n there is no append. To add to it, read the task first\n (\\`donebear task show <number> --json\\`) and send the combined text.\n- cleared use the paired flag: \\`--clear-deadline\\`, \\`--clear-project\\`,\n \\`--clear-team\\`, \\`--clear-description\\`.\n\nNot on \\`task edit\\`:\n\n- labels \\`donebear label add|remove\\`\n- completion \\`donebear task done|reopen\\`\n- archiving \\`donebear task archive\\` (moves to Trash, not a delete)\n\nTask numbers are positive integers scoped to the workspace. Projects, teams, and\nlabels also resolve by key or name.\n\n donebear task edit 12 --project launch --deadline 2030-01-15 --json`,\n title: \"Editing semantics\",\n whenToUse:\n \"Changing a task's fields, clearing a value, or appending to notes.\",\n },\n {\n id: \"bulk\",\n markdown: `# Bulk changes\n\nThere is no bulk subcommand. Changing many tasks means a loop, which makes it\neasy to run a hundred writes on a set nobody checked. Treat the set as the\nthing that needs care.\n\n1. Build it explicitly with \\`task list\\` or \\`search\\` and \\`--json\\`.\n2. Check for truncation. Results carry a count; if you passed \\`--limit\\`, you\n are looking at a page, not the set.\n3. Show the user the titles, not the ids, and get agreement before writing.\n4. Then write, one call per task.\n\n donebear task list --state open --view today --json --jq \"[].{number: number, title: title}\"\n\n\\`task done\\` is undone with \\`task reopen\\`, one task at a time. An edit\noverwrites the previous value with no history to restore from. When the change\nis lossy — clearing a field, moving everything to someday — do the unambiguous\npart and put the rest back to the user.\n\n\\`--dry-run\\` previews a mutation without sending it. Use it on the first task\nof a batch before running the rest.`,\n title: \"Bulk changes\",\n whenToUse:\n \"Completing, moving, or editing more than one task, or sweeping a view.\",\n },\n {\n id: \"checklists\",\n markdown: `# Checklists\n\nA checklist item is a sub-step of one task. It has a title, a completed flag,\nand a position. Items do not have dates, assignees, or labels — if the user\nwants any of those, they want a task, not a checklist item.\n\n donebear task checklist 12 --json\n donebear task checklist add 12 \"Pack charger\" --json\n donebear task checklist done 12 a1b2 --json\n donebear task checklist reopen 12 a1b2 --json\n donebear task checklist edit 12 a1b2 --title \"Pack cable\" --json\n donebear task checklist remove 12 a1b2 --json\n\n\\`donebear task show 12 --json\\` also returns checklistItems. Item ids accept a\nfull UUID or a prefix.\n\n## Order is the trap\n\nThe CLI adds one item per call. Add them in the order you want, one after\nanother — not in parallel. Parallel adds land in arrival order, which is\neffectively random, so a recipe or packing list comes out scrambled.\n\n## Task or checklist?\n\nChecklist items when the steps only make sense together and none of them needs\nits own date or owner (a shopping list, the steps of one errand). Separate\ntasks when any step could be scheduled, assigned, or completed on its own.`,\n title: \"Checklists\",\n whenToUse:\n \"Adding sub-steps to a task, building a list inside a task, or ticking items off.\",\n },\n {\n id: \"comments\",\n markdown: `# Comments\n\nA comment is a message on a task, written by a workspace member and readable by\neveryone who can see the task. It is the discussion around the work; the task's\nown description is the work itself. Rewriting the spec goes in the description\n(\\`task edit --description\\`), \"blocked until Priya is back\" goes in a comment.\n\n donebear comment 12 --json\n donebear comment add 12 \"Blocked until the API ships\" --json\n cat notes.md | donebear comment add 12 - --json\n donebear comment edit 12 a1b2 --body \"Unblocked\" --json\n donebear comment remove 12 a1b2 --json\n\nComment ids accept a full UUID or a prefix, the same as checklist items. The\nlisting is oldest first and marks a comment \"(edited)\" when its body has been\nchanged since it was posted.\n\n## You are posting as the authenticated user\n\nA comment goes out under that user's name and their whole workspace can read\nit. It is not a private note back to whoever ran the command, so write it as a\nmessage to their teammates — and when what you have is really an aside, say it\nin your own output instead of filing it on the task.\n\n## Who may change what\n\nAnyone in the workspace can comment. **Only the author can edit a comment**, so\n\\`comment edit\\` on a teammate's fails at the server; add your own instead of\ncorrecting theirs. You can remove your own; removing someone else's takes\nworkspace owner or admin.\n\nRemoval is permanent. Comments have no Trash — unlike a task, where\n\\`task archive\\` only moves it out of view — so there is nothing to restore.\nConfirm before removing one, especially one the user did not write.\n\n## Nobody is told\n\nPosting a comment sends no notification and raises no badge or unread count;\nDone Bear has none of that. A comment is read when someone next opens the task.\nThat makes it right for context that helps whoever picks the work up, and wrong\nfor something a person has to see now. Never report that a teammate has been\nnotified.`,\n title: \"Comments\",\n whenToUse:\n \"Discussing a task with teammates: reading its thread, replying, or correcting a comment.\",\n },\n {\n id: \"projects\",\n markdown: `# Projects, teams, and labels\n\nThree containers, and picking the wrong one is the most common modelling\nmistake:\n\n- project a body of work with an end. Has a key, a name, an optional target\n date, and a status. A task belongs to at most one.\n- team who owns the work. A task belongs to at most one. Organisational,\n not temporal: a task can have both a team and a project.\n- label a cross-cutting tag. A task can carry many. Reach for one when the\n grouping cuts across projects (errand, waiting-on, admin).\n\nIf the grouping has a finish line it is a project. If it describes a mode that\nrecurs forever it is a label.\n\n donebear project add \"Q3 Launch\" --target-date 2030-09-30 --json\n donebear label create urgent --json\n donebear label add 12 urgent --json\n\nCreating is cheap, but a workspace full of near-duplicate labels is worse than\na slightly wrong fit. Check \\`donebear label list --json\\` first and prefer an\nexisting label when it is a reasonable match. Teams are set up in the app;\nthere is no team create command.\n\nEvery workspace member sees every project; \\`donebear project join\\` and\n\\`donebear project leave\\` only change which ones sit in your sidebar's Your\nprojects list. Neither grants nor removes access, both are idempotent, and\ncreating a project already joins you to it.`,\n title: \"Projects, teams, and labels\",\n whenToUse:\n \"Deciding where a task belongs, creating a project or label, or joining/leaving a project.\",\n },\n {\n id: \"search\",\n markdown: `# Finding tasks\n\nTwo commands overlap:\n\n- \\`donebear search \"<query>\"\\` ranks matches over title and description across\n the whole workspace, including completed tasks.\n- \\`donebear task list --search \"<query>\"\\` applies the same ranking inside a\n view or state filter.\n\nRanking runs exact, then prefix, then word-boundary, then substring, then\nfuzzy, weighted toward the title and adjusted for recency. Multi-word queries\nmatch in any order, so \"login bug\" finds \"Bug in the login screen\". Keep\nqueries short: a whole sentence from the user rarely matches anything.\n\n donebear search \"login bug\" --json\n donebear task list --view today --search invoice --json\n\n\\`--limit\\` truncates silently, so raise it or drop it when the user needs the\nwhole set. Filter the output with \\`--jq\\` rather than re-running the search.`,\n title: \"Search and listing\",\n whenToUse: \"Looking a task up, listing a view, or filtering output.\",\n },\n {\n id: \"workspaces\",\n markdown: `# Workspaces and auth\n\nMost accounts have one workspace and the CLI resolves it, so leave targeting\noff unless the user named a second one:\n\n donebear workspace=myorg task list --json\n\nIds and names never cross workspaces. A missing task, project, or label is\nmissing from *this* workspace before it is deleted.\n\nAuth precedence: \\`DONEBEAR_TOKEN\\` in the environment, then the stored session\nfrom \\`donebear auth login\\`. Set the env var for anything non-interactive; the\nbrowser login flow will hang in CI.\n\n export DONEBEAR_TOKEN=<token>\n donebear whoami --json\n\nAPI keys carry scopes. A read-only key can run the read commands only, and a\nwrite fails with an explicit message rather than silently doing nothing — tell\nthe user they need a write-scoped key rather than trying to work around it.\n\\`donebear doctor --json\\` reports which of these is actually in effect.\n\n## Task attachments (read-only)\n\nTasks can carry file/image attachments, capped at 10 MB per file and roughly\n10 files per task, with a per-workspace monthly upload ceiling. Attaching a\nfile is a web-app action today: \\`donebear task show 12 --json\\` returns them\nin \\`attachments\\` (already-ready ones only, sorted for display), but there is\nno \\`task attachment add\\` — the CLI does not upload.`,\n title: \"Workspaces, auth, and scopes\",\n whenToUse:\n \"Working across multiple workspaces, running non-interactively, hitting a permission error, or checking task attachment caps.\",\n },\n {\n id: \"agents\",\n markdown: `# Driving Done Bear as an agent\n\nThree commands orient you, in order of cost:\n\n donebear spec every command and flag, no auth (~500 tokens)\n donebear guide <topic> concepts and conventions, no auth\n donebear context --json the live workspace: counts, recent tasks, projects\n\n\\`donebear spec <command> <subcommand>\\` narrows to one command's flags, output\nshape, and examples. Read that before guessing at a flag.\n\nEvery command takes \\`--json\\`. Use it, and filter with \\`--jq\\` (JMESPath) rather\nthan parsing the human output, which is formatted for a terminal and will\nchange.\n\n donebear task list --json --jq \"[].{number: number, title: title}\"\n\n\\`--dry-run\\` previews a mutation without sending it. \\`--format yaml|csv|tsv\\`\ncovers the other output shapes.\n\nExit codes are meaningful: non-zero means the command did not do the thing.\nRead stderr rather than assuming a write landed.\n\nDone Bear is also available as a hosted MCP server at\nhttps://mcp.donebear.com/mcp, which is the better fit when the host speaks MCP:\nit has a \\`guide\\` tool carrying this same material, and it resolves the\nworkspace from the token.`,\n title: \"Agent quickstart\",\n whenToUse: \"Starting work in a Done Bear workspace for the first time.\",\n },\n {\n id: \"importing\",\n markdown: `# Importing from another app\n\nTwo importers exist, and they are not the same thing.\n\n**In the terminal**, \\`donebear import things\\` reads a copy of a Things 3\nSQLite database and writes it into a workspace. It is the only import this CLI\nperforms. \\`donebear spec import things\\` lists its flags.\n\nOn macOS it finds that database itself — \\`donebear import things --dry-run\\`\nwith no other flags is the whole command. This is worth volunteering, because\nThings keeps its database inside a folder Finder hides, under a dated directory\nwhose name nobody can guess, and people hunting for it in Finder is the single\nmost common way this import stalls. \\`--database-url\\` is for a database\nsomewhere unusual: a backup, an external disk, another machine's copy.\n\n**In the web app**, Settings → Integrations & Import covers Todoist, TickTick,\nMicrosoft To Do, Any.do, Apple Reminders, Things 3, Trello, Asana, Notion,\nGoogle Tasks, and plain CSV, JSON or iCal files. If a user asks how to move a\nbacklog in from anything other than Things, that is where to send them; there\nis no CLI equivalent to offer.\n\nEach of those is a file the user exports and uploads — Todoist from Settings →\nBackups, Google Tasks from Google Takeout, Microsoft To Do from a read-only\n\\`GET /me/todo/lists?$expand=tasks\\` in Graph Explorer. Microsoft is the one\nthat may change: a read-only connect flow is being built so Done Bear can make\nthat call instead, so treat the Graph export as the current route and check the\nimport screen before promising a connection.\n\nThe other direction is here though: \\`donebear export\\` writes a portable JSON\narchive of a workspace, and the web importer restores one.\n\n## What an import does to the data\n\nWorth knowing, because it explains tasks that look odd afterwards:\n\n- Areas and folders from the source become **teams**, with their projects\n underneath.\n- Deadlines are whole calendar days, so a source due *time* becomes a\n **reminder** on the task rather than a deadline at an hour.\n- A subtask becomes a **checklist item** on its parent when a checklist item\n can hold everything it carries; one with its own dates, notes, labels or\n repeat rule is imported as a task in its own right.\n- A cancelled task lands in **Trash** — there is no cancelled state.\n- Priority collapses to none, low, medium or high. Urgent and P1 both become\n high.\n- A repeat rule that cannot be represented is never silently dropped: it is\n either converted, approximated with a warning, or preserved as text in the\n task's notes with a warning.\n\n## Re-running an import\n\nImported rows carry ids derived from the source record, so running the same\nimport twice resolves to the rows it created the first time rather than\nduplicating them. Both importers default to leaving those alone and adding\nonly what is new.\n\n## Undoing an import\n\nThere is no undo for \\`donebear import things\\`; a run has to be unpicked by\nhand. The web importer does offer one on its completion screen, but the receipt\nlives in the browser that ran the import, so it cannot be reached from the CLI,\nanother device or the iOS app. Say that plainly rather than sending someone\nlooking for a flag.`,\n title: \"Importing from another app\",\n whenToUse:\n \"Moving a backlog in from Things 3 or another task manager, or restoring an export.\",\n },\n];\n\nconst guideIndex = (): { id: string; title: string; whenToUse: string }[] =>\n GUIDES.map(({ id, title, whenToUse }) => ({ id, title, whenToUse }));\n\nconst writeIndexText = (): void => {\n process.stdout.write(\n \"Done Bear concept guides. Read one with: donebear guide <topic>\\n\\n\"\n );\n for (const { id, whenToUse } of GUIDES) {\n process.stdout.write(` ${id.padEnd(12)}${whenToUse}\\n`);\n }\n process.stdout.write(\"\\n\");\n};\n\nconst runGuide = (\n context: ReturnType<typeof contextFromCommand>,\n topic: string | undefined\n): void => {\n if (!topic) {\n if (context.json) {\n writeJson({ guides: guideIndex(), ok: true });\n return;\n }\n writeIndexText();\n return;\n }\n\n const key = topic.trim().toLowerCase();\n const guide = GUIDES.find((g) => g.id === key);\n\n if (!guide) {\n // Exits non-zero: an agent that pipes this needs the exit code to tell it\n // the topic was wrong, not an ok:false buried in stdout.\n throw new CliError(\n `No guide for \"${topic}\". Available: ${GUIDES.map((g) => g.id).join(\", \")}.`,\n EXIT_CODES.VALIDATION\n );\n }\n\n if (context.json) {\n writeJson({ ok: true, ...guide });\n return;\n }\n\n process.stdout.write(`${guide.markdown}\\n`);\n};\n\nexport const registerGuideCommand = (program: Command): void => {\n program\n .command(\"guide\")\n .description(\"Done Bear concepts for agents (no auth required)\")\n .argument(\"[topic]\", \"Guide topic (e.g. views, dates, bulk, checklists)\")\n .addHelpText(\n \"after\",\n `\nExamples:\n donebear guide List every topic\n donebear guide agents How to drive Done Bear as an agent\n donebear guide views Inbox/Today/Upcoming/Anytime/Someday\n donebear guide checklists Sub-steps inside a task\n donebear guide bulk Changing many tasks safely\n donebear guide --json Topic index as JSON\n`\n )\n .action(\n async (topic: string | undefined, _options: unknown, cmd: Command) => {\n const context = contextFromCommand(cmd);\n await runWithErrorHandling(context, () => {\n runGuide(context, topic);\n return Promise.resolve();\n });\n }\n );\n};\n","// donebear history [--workspace <ws>] [--model Task|Project|Label|Team] [--limit 50] [--format]\n// Shows recent sync actions as an audit log\n\nimport type { Command } from \"commander\";\n\nimport { resolveCommandContext } from \"../command-context\";\nimport { normalizeWorkspaceRef } from \"../command-helpers\";\nimport { parsePositiveInteger } from \"../command-parsers\";\nimport type { WorkspaceHistoryEntry } from \"../manage-api\";\nimport { listWorkspaceHistory } from \"../manage-api\";\nimport {\n writeFormattedRows,\n writeInfo,\n writeOutput,\n writeWarning,\n} from \"../output\";\nimport { contextFromCommand, runWithErrorHandling } from \"../runtime\";\nimport { resolveWorkspace } from \"../workspace-context\";\n\nconst DEFAULT_HISTORY_LIMIT = 50;\n\n// Sync action code mapping: I=create U=update A=archive D=delete V=unarchive\nconst ACTION_LABELS: Record<string, string> = {\n A: \"ARCHIVE\",\n D: \"DELETE\",\n I: \"CREATE\",\n U: \"UPDATE\",\n V: \"UNARCHIVE\",\n};\n\ninterface HistoryOptions {\n workspace?: string;\n model?: string;\n limit: number;\n}\n\nconst formatActionCode = (action: string): string =>\n ACTION_LABELS[action] ?? action;\n\nconst formatHistoryDate = (isoString: string): string => {\n const date = new Date(isoString);\n if (Number.isNaN(date.getTime())) {\n return isoString;\n }\n const yyyy = date.getFullYear();\n const mm = String(date.getMonth() + 1).padStart(2, \"0\");\n const dd = String(date.getDate()).padStart(2, \"0\");\n const hh = String(date.getHours()).padStart(2, \"0\");\n const min = String(date.getMinutes()).padStart(2, \"0\");\n return `${yyyy}-${mm}-${dd} ${hh}:${min}`;\n};\n\nconst extractPayloadTitle = (entry: WorkspaceHistoryEntry): string => {\n if (!entry.payload) {\n return \"\";\n }\n const { title } = entry.payload;\n if (typeof title === \"string\") {\n return ` (title: \"${title}\")`;\n }\n return \"\";\n};\n\nconst runHistory = async (\n context: ReturnType<typeof contextFromCommand>,\n workspaceOverride: string | null,\n options: HistoryOptions\n): Promise<void> => {\n const commandContext = await resolveCommandContext(context);\n\n const { workspace } = await resolveWorkspace(context, {\n apiBaseUrl: commandContext.apiBaseUrl,\n storedWorkspaceId: commandContext.localContext.workspaceId,\n token: commandContext.token,\n workspaceRef: workspaceOverride ?? normalizeWorkspaceRef(options.workspace),\n });\n\n try {\n const history = await listWorkspaceHistory(context, {\n baseUrl: commandContext.apiBaseUrl,\n limit: options.limit,\n model: options.model,\n token: commandContext.token,\n workspaceId: workspace.id,\n });\n\n if (context.json) {\n writeOutput(context, { history, workspace });\n return;\n }\n\n const historyHeaders = [\"date\", \"action\", \"model\", \"modelId\", \"title\"];\n const historyRows = history.map((entry) => [\n formatHistoryDate(entry.createdAt),\n formatActionCode(entry.action),\n entry.modelName,\n entry.modelId.slice(0, 8),\n typeof entry.payload?.title === \"string\" ? entry.payload.title : \"\",\n ]);\n\n if (\n writeFormattedRows(context, history.length, historyHeaders, historyRows)\n ) {\n return;\n }\n\n if (history.length === 0) {\n writeInfo(context, \"No history entries found.\");\n return;\n }\n\n writeInfo(context, `History for ${workspace.name}:`);\n\n for (const entry of history) {\n const date = formatHistoryDate(entry.createdAt);\n const action = formatActionCode(entry.action);\n const modelId = entry.modelId.slice(0, 8);\n const title = extractPayloadTitle(entry);\n writeInfo(\n context,\n `${date} ${action} ${entry.modelName} ${modelId}...${title}`\n );\n }\n } catch {\n writeWarning(context, \"History is not available for this server version.\");\n writeWarning(context, \"Upgrade your manage-api to enable audit logs.\");\n }\n};\n\nexport const registerHistoryCommand = (\n program: Command,\n workspaceOverride: string | null\n): void => {\n program\n .command(\"history\")\n .description(\"Show recent workspace audit log\")\n .option(\"-w, --workspace <workspace>\", \"Workspace id, slug, or exact name\")\n .option(\"--model <model>\", \"Filter by model name: Task|Project|Label|Team\")\n .option(\n \"-n, --limit <count>\",\n \"Maximum number of entries\",\n (value: string): number => parsePositiveInteger(value, \"Limit\"),\n DEFAULT_HISTORY_LIMIT\n )\n .addHelpText(\n \"after\",\n `\nExamples:\n donebear history\n donebear history --model Task --limit 20\n donebear history --format csv\n`\n )\n .action(async (options: HistoryOptions, command: Command) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runHistory(context, workspaceOverride, options);\n });\n });\n};\n","import type { ThingsImportResult } from \"./things-runner\";\n\ninterface ThingsImportTextSummary {\n successMessage: string;\n infoLines: string[];\n}\n\nexport const summarizeThingsImportResult = (\n result: ThingsImportResult\n): ThingsImportTextSummary => {\n const infoLines = [\n `workspace: ${result.workspace.name}`,\n `database: ${result.databasePath}`,\n `source: ${result.counts.source.tasks} tasks, ${result.counts.source.projects} projects, ${result.counts.source.headings} headings, ${result.counts.source.areas} areas, ${result.counts.source.tags} tags, ${result.counts.source.checklistItems} checklist items`,\n `planned: ${result.counts.planned.teams ?? 0} teams, ${result.counts.planned.labels ?? 0} labels, ${result.counts.planned.projects ?? 0} projects, ${result.counts.planned.teamProjects ?? 0} team-project links, ${result.counts.planned.headings ?? 0} headings, ${result.counts.planned.tasks ?? 0} tasks, ${result.counts.planned.taskLabels ?? 0} task-label links, ${result.counts.planned.checklistItems ?? 0} checklist items`,\n ];\n\n if (result.dryRun) {\n infoLines.push(\"dry run: no mutations sent\");\n } else {\n infoLines.push(\n `mutations: ${result.execution.inserted} inserted, ${result.execution.updated} updated, ${result.execution.skipped} skipped across ${result.execution.batches} batch(es)`\n );\n }\n\n return {\n infoLines,\n successMessage: result.dryRun\n ? \"Things 3 import dry run complete\"\n : \"Things 3 import complete\",\n };\n};\n","// Calendar and time-zone math shared by the CLI's Things import and the API's\n// repeat scheduler.\n//\n// These two grew as byte-identical copies in apps/cli/src/import/time-zone.ts\n// and apps/manage-api/src/modules/repeat/repeat-timezone.ts, and had already\n// begun to diverge: the API copy gained the DST-aware helpers below while the\n// CLI copy kept a day-end helper the API copy left dead. Time-zone math fails\n// quietly and seasonally, which is the worst kind of drift to carry twice.\n\nexport interface CalendarDateParts {\n year: number;\n month: number;\n day: number;\n}\n\nexport interface CalendarDateTimeParts extends CalendarDateParts {\n hour: number;\n minute: number;\n second: number;\n}\n\nconst formatterCache = new Map<string, Intl.DateTimeFormat>();\n\nconst getFormatter = (timeZone: string): Intl.DateTimeFormat => {\n const cached = formatterCache.get(timeZone);\n\n if (cached) {\n return cached;\n }\n\n const formatter = new Intl.DateTimeFormat(\"en-CA\", {\n day: \"2-digit\",\n hour: \"2-digit\",\n hourCycle: \"h23\",\n minute: \"2-digit\",\n month: \"2-digit\",\n second: \"2-digit\",\n timeZone,\n year: \"numeric\",\n });\n\n formatterCache.set(timeZone, formatter);\n return formatter;\n};\n\nconst toDateTimeParts = (\n date: Date,\n timeZone: string\n): CalendarDateTimeParts | null => {\n const raw: Record<string, string> = {};\n\n for (const part of getFormatter(timeZone).formatToParts(date)) {\n if (part.type === \"literal\") {\n continue;\n }\n\n raw[part.type] = part.value;\n }\n\n const year = Number(raw.year);\n const month = Number(raw.month);\n const day = Number(raw.day);\n const hour = Number(raw.hour);\n const minute = Number(raw.minute);\n const second = Number(raw.second);\n\n if (\n !(\n Number.isFinite(year) &&\n Number.isFinite(month) &&\n Number.isFinite(day) &&\n Number.isFinite(hour) &&\n Number.isFinite(minute) &&\n Number.isFinite(second)\n )\n ) {\n return null;\n }\n\n return {\n day,\n hour,\n minute,\n month,\n second,\n year,\n };\n};\n\nconst getTimeZoneOffsetMs = (epochMs: number, timeZone: string): number => {\n const parts = toDateTimeParts(new Date(epochMs), timeZone);\n\n if (!parts) {\n return 0;\n }\n\n const asUtc = Date.UTC(\n parts.year,\n parts.month - 1,\n parts.day,\n parts.hour,\n parts.minute,\n parts.second\n );\n\n return asUtc - epochMs;\n};\n\nconst addDays = (parts: CalendarDateParts, days: number): CalendarDateParts => {\n const date = new Date(Date.UTC(parts.year, parts.month - 1, parts.day, 12));\n date.setUTCDate(date.getUTCDate() + days);\n\n return {\n day: date.getUTCDate(),\n month: date.getUTCMonth() + 1,\n year: date.getUTCFullYear(),\n };\n};\n\nexport const resolveTimeZoneOrNull = (\n value: string | null | undefined\n): string | null => {\n if (typeof value !== \"string\") {\n return null;\n }\n\n const trimmed = value.trim();\n\n if (trimmed.length === 0) {\n return null;\n }\n\n try {\n getFormatter(trimmed).format(new Date(0));\n return trimmed;\n } catch {\n return null;\n }\n};\n\nexport const resolveLocalTimeZone = (): string | null =>\n resolveTimeZoneOrNull(Intl.DateTimeFormat().resolvedOptions().timeZone);\n\nexport const getUtcCalendarDateParts = (date: Date): CalendarDateParts => ({\n day: date.getUTCDate(),\n month: date.getUTCMonth() + 1,\n year: date.getUTCFullYear(),\n});\n\nexport const getCalendarDatePartsInTimeZone = (\n date: Date,\n timeZone: string\n): CalendarDateParts => {\n const parts = toDateTimeParts(date, timeZone);\n\n if (!parts) {\n return getUtcCalendarDateParts(date);\n }\n\n return {\n day: parts.day,\n month: parts.month,\n year: parts.year,\n };\n};\n\nexport const calendarDateToEpochInTimeZone = (\n parts: CalendarDateParts,\n timeZone: string | null\n): number => {\n if (!timeZone) {\n return Date.UTC(parts.year, parts.month - 1, parts.day);\n }\n\n let guess = Date.UTC(parts.year, parts.month - 1, parts.day);\n\n for (let attempt = 0; attempt < 4; attempt += 1) {\n const offset = getTimeZoneOffsetMs(guess, timeZone);\n const nextGuess = Date.UTC(parts.year, parts.month - 1, parts.day) - offset;\n\n if (nextGuess === guess) {\n break;\n }\n\n guess = nextGuess;\n }\n\n return guess;\n};\n\nexport const calendarDateToUtcEpoch = (parts: CalendarDateParts): number =>\n Date.UTC(parts.year, parts.month - 1, parts.day);\n\nexport const getUtcCalendarDayEndEpoch = (date: Date): number => {\n const parts = getUtcCalendarDateParts(date);\n\n return Date.UTC(parts.year, parts.month - 1, parts.day, 23, 59, 59, 999);\n};\n\nexport const getCalendarDayEndEpochInTimeZone = (\n date: Date,\n timeZone: string | null\n): number => {\n const parts = timeZone\n ? getCalendarDatePartsInTimeZone(date, timeZone)\n : getUtcCalendarDateParts(date);\n const nextDay = addDays(parts, 1);\n\n return calendarDateToEpochInTimeZone(nextDay, timeZone) - 1;\n};\n\nexport const addCalendarInterval = (\n parts: CalendarDateParts,\n options: {\n days?: number;\n weeks?: number;\n months?: number;\n years?: number;\n }\n): CalendarDateParts => {\n const date = new Date(Date.UTC(parts.year, parts.month - 1, parts.day, 12));\n\n if (options.days) {\n date.setUTCDate(date.getUTCDate() + options.days);\n }\n\n if (options.weeks) {\n date.setUTCDate(date.getUTCDate() + options.weeks * 7);\n }\n\n if (options.months) {\n date.setUTCMonth(date.getUTCMonth() + options.months);\n }\n\n if (options.years) {\n date.setUTCFullYear(date.getUTCFullYear() + options.years);\n }\n\n return {\n day: date.getUTCDate(),\n month: date.getUTCMonth() + 1,\n year: date.getUTCFullYear(),\n };\n};\n","import { createDeterministicId } from \"./index\";\n\n/**\n * Ids for the \"Meet Done Bear\" sample project every new workspace is seeded\n * with.\n *\n * `manage-api` seeds the rows; `manage-frontend` and the CLI have to recognise\n * and trash the same rows when an import lands, and neither can read the ids\n * off the server. All three therefore re-derive them from the workspace id,\n * which only works while the namespace and the row counts agree — so they live\n * here rather than in each app.\n *\n * Unlike the composite ids in `./index`, these have no Swift port and no entry\n * in `test-vectors.json`: iOS never seeds or dismisses the sample project.\n */\n\n// Keep this namespace stable. Changing it regenerates the sample ids and\n// leaves the previous project sitting in already-provisioned workspaces.\nconst MEET_DONE_BEAR_ID_NAMESPACE = \"b7e1d4a0-6c2f-4a8e-9d13-5f0c8a2b7e91\";\n\n/**\n * Row counts for the seeded sample. `manage-api` builds its heading and task\n * content against these; the clients walk the same ranges to derive the ids\n * they may need to trash.\n */\nexport const MEET_DONE_BEAR_HEADING_COUNT = 3;\nexport const MEET_DONE_BEAR_TASK_COUNT = 9;\n\nexport const createMeetDoneBearProjectId = (workspaceId: string): string =>\n createDeterministicId(\n MEET_DONE_BEAR_ID_NAMESPACE,\n `MeetDoneBear:Project:${workspaceId}`\n );\n\nexport const createMeetDoneBearHeadingId = (\n workspaceId: string,\n index: number\n): string =>\n createDeterministicId(\n MEET_DONE_BEAR_ID_NAMESPACE,\n `MeetDoneBear:Heading:${workspaceId}:${index}`\n );\n\nexport const createMeetDoneBearTaskId = (\n workspaceId: string,\n index: number\n): string =>\n createDeterministicId(\n MEET_DONE_BEAR_ID_NAMESPACE,\n `MeetDoneBear:Task:${workspaceId}:${index}`\n );\n\nexport const isMeetDoneBearProjectId = (\n workspaceId: string,\n projectId: string | null | undefined\n): boolean =>\n typeof projectId === \"string\" &&\n projectId === createMeetDoneBearProjectId(workspaceId);\n","import {\n createMeetDoneBearHeadingId,\n createMeetDoneBearProjectId,\n createMeetDoneBearTaskId,\n MEET_DONE_BEAR_HEADING_COUNT,\n MEET_DONE_BEAR_TASK_COUNT,\n} from \"@donebear/sync-ids/meet-done-bear\";\n\nexport { createMeetDoneBearProjectId, createMeetDoneBearTaskId };\n\nexport interface MeetDoneBearArchiveTarget {\n modelName: \"Project\" | \"ProjectHeading\" | \"Task\";\n modelId: string;\n}\n\n/**\n * Sample rows that still exist in the pre-import bootstrap. Missing or\n * already-trashed rows are omitted so a later import does not fail.\n */\nexport const listMeetDoneBearArchiveTargets = (options: {\n workspaceId: string;\n existingProjectIds: ReadonlySet<string>;\n existingTaskIds: ReadonlySet<string>;\n existingHeadingIds?: ReadonlySet<string>;\n}): MeetDoneBearArchiveTarget[] => {\n const projectId = createMeetDoneBearProjectId(options.workspaceId);\n if (!options.existingProjectIds.has(projectId)) {\n return [];\n }\n\n const targets: MeetDoneBearArchiveTarget[] = [\n { modelId: projectId, modelName: \"Project\" },\n ];\n\n const headingIds = options.existingHeadingIds;\n if (headingIds) {\n for (let index = 0; index < MEET_DONE_BEAR_HEADING_COUNT; index += 1) {\n const modelId = createMeetDoneBearHeadingId(options.workspaceId, index);\n if (headingIds.has(modelId)) {\n targets.push({ modelId, modelName: \"ProjectHeading\" });\n }\n }\n }\n\n for (let index = 0; index < MEET_DONE_BEAR_TASK_COUNT; index += 1) {\n const modelId = createMeetDoneBearTaskId(options.workspaceId, index);\n if (options.existingTaskIds.has(modelId)) {\n targets.push({ modelId, modelName: \"Task\" });\n }\n }\n\n return targets;\n};\n","export const normalizeThingsLabelLookupKey = (value: string): string =>\n value.trim().toLocaleLowerCase();\n","(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"rrule\"] = factory();\n\telse\n\t\troot[\"rrule\"] = factory();\n})(typeof self !== 'undefined' ? self : this, () => {\nreturn /******/ (() => { // webpackBootstrap\n/******/ \t\"use strict\";\n/******/ \t// The require scope\n/******/ \tvar __webpack_require__ = {};\n/******/ \t\n/************************************************************************/\n/******/ \t/* webpack/runtime/define property getters */\n/******/ \t(() => {\n/******/ \t\t// define getter functions for harmony exports\n/******/ \t\t__webpack_require__.d = (exports, definition) => {\n/******/ \t\t\tfor(var key in definition) {\n/******/ \t\t\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n/******/ \t\t\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n/******/ \t\t\t\t}\n/******/ \t\t\t}\n/******/ \t\t};\n/******/ \t})();\n/******/ \t\n/******/ \t/* webpack/runtime/hasOwnProperty shorthand */\n/******/ \t(() => {\n/******/ \t\t__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))\n/******/ \t})();\n/******/ \t\n/******/ \t/* webpack/runtime/make namespace object */\n/******/ \t(() => {\n/******/ \t\t// define __esModule on exports\n/******/ \t\t__webpack_require__.r = (exports) => {\n/******/ \t\t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n/******/ \t\t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n/******/ \t\t\t}\n/******/ \t\t\tObject.defineProperty(exports, '__esModule', { value: true });\n/******/ \t\t};\n/******/ \t})();\n/******/ \t\n/************************************************************************/\nvar __webpack_exports__ = {};\n// ESM COMPAT FLAG\n__webpack_require__.r(__webpack_exports__);\n\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n \"ALL_WEEKDAYS\": () => (/* reexport */ ALL_WEEKDAYS),\n \"Frequency\": () => (/* reexport */ Frequency),\n \"RRule\": () => (/* reexport */ RRule),\n \"RRuleSet\": () => (/* reexport */ RRuleSet),\n \"Weekday\": () => (/* reexport */ Weekday),\n \"datetime\": () => (/* reexport */ datetime),\n \"rrulestr\": () => (/* reexport */ rrulestr)\n});\n\n;// CONCATENATED MODULE: ./src/weekday.ts\n// =============================================================================\n// Weekday\n// =============================================================================\nvar ALL_WEEKDAYS = [\n 'MO',\n 'TU',\n 'WE',\n 'TH',\n 'FR',\n 'SA',\n 'SU',\n];\nvar Weekday = /** @class */ (function () {\n function Weekday(weekday, n) {\n if (n === 0)\n throw new Error(\"Can't create weekday with n == 0\");\n this.weekday = weekday;\n this.n = n;\n }\n Weekday.fromStr = function (str) {\n return new Weekday(ALL_WEEKDAYS.indexOf(str));\n };\n // __call__ - Cannot call the object directly, do it through\n // e.g. RRule.TH.nth(-1) instead,\n Weekday.prototype.nth = function (n) {\n return this.n === n ? this : new Weekday(this.weekday, n);\n };\n // __eq__\n Weekday.prototype.equals = function (other) {\n return this.weekday === other.weekday && this.n === other.n;\n };\n // __repr__\n Weekday.prototype.toString = function () {\n var s = ALL_WEEKDAYS[this.weekday];\n if (this.n)\n s = (this.n > 0 ? '+' : '') + String(this.n) + s;\n return s;\n };\n Weekday.prototype.getJsWeekday = function () {\n return this.weekday === 6 ? 0 : this.weekday + 1;\n };\n return Weekday;\n}());\n\n\n;// CONCATENATED MODULE: ./src/helpers.ts\n// =============================================================================\n// Helper functions\n// =============================================================================\n\nvar isPresent = function (value) {\n return value !== null && value !== undefined;\n};\nvar isNumber = function (value) {\n return typeof value === 'number';\n};\nvar isWeekdayStr = function (value) {\n return typeof value === 'string' && ALL_WEEKDAYS.includes(value);\n};\nvar isArray = Array.isArray;\n/**\n * Simplified version of python's range()\n */\nvar range = function (start, end) {\n if (end === void 0) { end = start; }\n if (arguments.length === 1) {\n end = start;\n start = 0;\n }\n var rang = [];\n for (var i = start; i < end; i++)\n rang.push(i);\n return rang;\n};\nvar clone = function (array) {\n return [].concat(array);\n};\nvar repeat = function (value, times) {\n var i = 0;\n var array = [];\n if (isArray(value)) {\n for (; i < times; i++)\n array[i] = [].concat(value);\n }\n else {\n for (; i < times; i++)\n array[i] = value;\n }\n return array;\n};\nvar toArray = function (item) {\n if (isArray(item)) {\n return item;\n }\n return [item];\n};\nfunction padStart(item, targetLength, padString) {\n if (padString === void 0) { padString = ' '; }\n var str = String(item);\n targetLength = targetLength >> 0;\n if (str.length > targetLength) {\n return String(str);\n }\n targetLength = targetLength - str.length;\n if (targetLength > padString.length) {\n padString += repeat(padString, targetLength / padString.length);\n }\n return padString.slice(0, targetLength) + String(str);\n}\n/**\n * Python like split\n */\nvar split = function (str, sep, num) {\n var splits = str.split(sep);\n return num\n ? splits.slice(0, num).concat([splits.slice(num).join(sep)])\n : splits;\n};\n/**\n * closure/goog/math/math.js:modulo\n * Copyright 2006 The Closure Library Authors.\n * The % operator in JavaScript returns the remainder of a / b, but differs from\n * some other languages in that the result will have the same sign as the\n * dividend. For example, -1 % 8 == -1, whereas in some other languages\n * (such as Python) the result would be 7. This function emulates the more\n * correct modulo behavior, which is useful for certain applications such as\n * calculating an offset index in a circular list.\n *\n * @param {number} a The dividend.\n * @param {number} b The divisor.\n * @return {number} a % b where the result is between 0 and b (either 0 <= x < b\n * or b < x <= 0, depending on the sign of b).\n */\nvar pymod = function (a, b) {\n var r = a % b;\n // If r and b differ in sign, add b to wrap the result to the correct sign.\n return r * b < 0 ? r + b : r;\n};\n/**\n * @see: <http://docs.python.org/library/functions.html#divmod>\n */\nvar divmod = function (a, b) {\n return { div: Math.floor(a / b), mod: pymod(a, b) };\n};\nvar empty = function (obj) {\n return !isPresent(obj) || obj.length === 0;\n};\n/**\n * Python-like boolean\n *\n * @return {Boolean} value of an object/primitive, taking into account\n * the fact that in Python an empty list's/tuple's\n * boolean value is False, whereas in JS it's true\n */\nvar notEmpty = function (obj) {\n return !empty(obj);\n};\n/**\n * Return true if a value is in an array\n */\nvar includes = function (arr, val) {\n return notEmpty(arr) && arr.indexOf(val) !== -1;\n};\n\n;// CONCATENATED MODULE: ./src/dateutil.ts\n\nvar datetime = function (y, m, d, h, i, s) {\n if (h === void 0) { h = 0; }\n if (i === void 0) { i = 0; }\n if (s === void 0) { s = 0; }\n return new Date(Date.UTC(y, m - 1, d, h, i, s));\n};\n/**\n * General date-related utilities.\n * Also handles several incompatibilities between JavaScript and Python\n *\n */\nvar MONTH_DAYS = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\n/**\n * Number of milliseconds of one day\n */\nvar ONE_DAY = 1000 * 60 * 60 * 24;\n/**\n * @see: <http://docs.python.org/library/datetime.html#datetime.MAXYEAR>\n */\nvar MAXYEAR = 9999;\n/**\n * Python uses 1-Jan-1 as the base for calculating ordinals but we don't\n * want to confuse the JS engine with milliseconds > Number.MAX_NUMBER,\n * therefore we use 1-Jan-1970 instead\n */\nvar ORDINAL_BASE = datetime(1970, 1, 1);\n/**\n * Python: MO-SU: 0 - 6\n * JS: SU-SAT 0 - 6\n */\nvar PY_WEEKDAYS = [6, 0, 1, 2, 3, 4, 5];\n/**\n * py_date.timetuple()[7]\n */\nvar getYearDay = function (date) {\n var dateNoTime = new Date(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate());\n return (Math.ceil((dateNoTime.valueOf() - new Date(date.getUTCFullYear(), 0, 1).valueOf()) /\n ONE_DAY) + 1);\n};\nvar isLeapYear = function (year) {\n return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;\n};\nvar isDate = function (value) {\n return value instanceof Date;\n};\nvar isValidDate = function (value) {\n return isDate(value) && !isNaN(value.getTime());\n};\n/**\n * @return {Number} the date's timezone offset in ms\n */\nvar tzOffset = function (date) {\n return date.getTimezoneOffset() * 60 * 1000;\n};\n/**\n * @see: <http://www.mcfedries.com/JavaScript/DaysBetween.asp>\n */\nvar daysBetween = function (date1, date2) {\n // The number of milliseconds in one day\n // Convert both dates to milliseconds\n var date1ms = date1.getTime();\n var date2ms = date2.getTime();\n // Calculate the difference in milliseconds\n var differencems = date1ms - date2ms;\n // Convert back to days and return\n return Math.round(differencems / ONE_DAY);\n};\n/**\n * @see: <http://docs.python.org/library/datetime.html#datetime.date.toordinal>\n */\nvar toOrdinal = function (date) {\n return daysBetween(date, ORDINAL_BASE);\n};\n/**\n * @see - <http://docs.python.org/library/datetime.html#datetime.date.fromordinal>\n */\nvar fromOrdinal = function (ordinal) {\n return new Date(ORDINAL_BASE.getTime() + ordinal * ONE_DAY);\n};\nvar getMonthDays = function (date) {\n var month = date.getUTCMonth();\n return month === 1 && isLeapYear(date.getUTCFullYear())\n ? 29\n : MONTH_DAYS[month];\n};\n/**\n * @return {Number} python-like weekday\n */\nvar getWeekday = function (date) {\n return PY_WEEKDAYS[date.getUTCDay()];\n};\n/**\n * @see: <http://docs.python.org/library/calendar.html#calendar.monthrange>\n */\nvar monthRange = function (year, month) {\n var date = datetime(year, month + 1, 1);\n return [getWeekday(date), getMonthDays(date)];\n};\n/**\n * @see: <http://docs.python.org/library/datetime.html#datetime.datetime.combine>\n */\nvar combine = function (date, time) {\n time = time || date;\n return new Date(Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(), time.getHours(), time.getMinutes(), time.getSeconds(), time.getMilliseconds()));\n};\nvar dateutil_clone = function (date) {\n var dolly = new Date(date.getTime());\n return dolly;\n};\nvar cloneDates = function (dates) {\n var clones = [];\n for (var i = 0; i < dates.length; i++) {\n clones.push(dateutil_clone(dates[i]));\n }\n return clones;\n};\n/**\n * Sorts an array of Date or Time objects\n */\nvar sort = function (dates) {\n dates.sort(function (a, b) {\n return a.getTime() - b.getTime();\n });\n};\nvar timeToUntilString = function (time, utc) {\n if (utc === void 0) { utc = true; }\n var date = new Date(time);\n return [\n padStart(date.getUTCFullYear().toString(), 4, '0'),\n padStart(date.getUTCMonth() + 1, 2, '0'),\n padStart(date.getUTCDate(), 2, '0'),\n 'T',\n padStart(date.getUTCHours(), 2, '0'),\n padStart(date.getUTCMinutes(), 2, '0'),\n padStart(date.getUTCSeconds(), 2, '0'),\n utc ? 'Z' : '',\n ].join('');\n};\nvar untilStringToDate = function (until) {\n var re = /^(\\d{4})(\\d{2})(\\d{2})(T(\\d{2})(\\d{2})(\\d{2})Z?)?$/;\n var bits = re.exec(until);\n if (!bits)\n throw new Error(\"Invalid UNTIL value: \".concat(until));\n return new Date(Date.UTC(parseInt(bits[1], 10), parseInt(bits[2], 10) - 1, parseInt(bits[3], 10), parseInt(bits[5], 10) || 0, parseInt(bits[6], 10) || 0, parseInt(bits[7], 10) || 0));\n};\nvar dateTZtoISO8601 = function (date, timeZone) {\n // date format for sv-SE is almost ISO8601\n var dateStr = date.toLocaleString('sv-SE', { timeZone: timeZone });\n // '2023-02-07 10:41:36'\n return dateStr.replace(' ', 'T') + 'Z';\n};\nvar dateInTimeZone = function (date, timeZone) {\n var localTimeZone = Intl.DateTimeFormat().resolvedOptions().timeZone;\n // Date constructor can only reliably parse dates in ISO8601 format\n var dateInLocalTZ = new Date(dateTZtoISO8601(date, localTimeZone));\n var dateInTargetTZ = new Date(dateTZtoISO8601(date, timeZone !== null && timeZone !== void 0 ? timeZone : 'UTC'));\n var tzOffset = dateInTargetTZ.getTime() - dateInLocalTZ.getTime();\n return new Date(date.getTime() - tzOffset);\n};\n\n;// CONCATENATED MODULE: ./src/iterresult.ts\n/**\n * This class helps us to emulate python's generators, sorta.\n */\nvar IterResult = /** @class */ (function () {\n function IterResult(method, args) {\n this.minDate = null;\n this.maxDate = null;\n this._result = [];\n this.total = 0;\n this.method = method;\n this.args = args;\n if (method === 'between') {\n this.maxDate = args.inc\n ? args.before\n : new Date(args.before.getTime() - 1);\n this.minDate = args.inc ? args.after : new Date(args.after.getTime() + 1);\n }\n else if (method === 'before') {\n this.maxDate = args.inc ? args.dt : new Date(args.dt.getTime() - 1);\n }\n else if (method === 'after') {\n this.minDate = args.inc ? args.dt : new Date(args.dt.getTime() + 1);\n }\n }\n /**\n * Possibly adds a date into the result.\n *\n * @param {Date} date - the date isn't necessarly added to the result\n * list (if it is too late/too early)\n * @return {Boolean} true if it makes sense to continue the iteration\n * false if we're done.\n */\n IterResult.prototype.accept = function (date) {\n ++this.total;\n var tooEarly = this.minDate && date < this.minDate;\n var tooLate = this.maxDate && date > this.maxDate;\n if (this.method === 'between') {\n if (tooEarly)\n return true;\n if (tooLate)\n return false;\n }\n else if (this.method === 'before') {\n if (tooLate)\n return false;\n }\n else if (this.method === 'after') {\n if (tooEarly)\n return true;\n this.add(date);\n return false;\n }\n return this.add(date);\n };\n /**\n *\n * @param {Date} date that is part of the result.\n * @return {Boolean} whether we are interested in more values.\n */\n IterResult.prototype.add = function (date) {\n this._result.push(date);\n return true;\n };\n /**\n * 'before' and 'after' return only one date, whereas 'all'\n * and 'between' an array.\n *\n * @return {Date,Array?}\n */\n IterResult.prototype.getValue = function () {\n var res = this._result;\n switch (this.method) {\n case 'all':\n case 'between':\n return res;\n case 'before':\n case 'after':\n default:\n return (res.length ? res[res.length - 1] : null);\n }\n };\n IterResult.prototype.clone = function () {\n return new IterResult(this.method, this.args);\n };\n return IterResult;\n}());\n/* harmony default export */ const iterresult = (IterResult);\n\n;// CONCATENATED MODULE: ./node_modules/tslib/tslib.es6.js\n/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nfunction __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nvar __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nfunction __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nfunction __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nfunction __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nfunction __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nfunction __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nfunction __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nvar __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n var desc = Object.getOwnPropertyDescriptor(m, k);\r\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\r\n desc = { enumerable: true, get: function() { return m[k]; } };\r\n }\r\n Object.defineProperty(o, k2, desc);\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nfunction __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nfunction __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nfunction __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nfunction __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nfunction __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nfunction __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nfunction __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nfunction __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nfunction __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nfunction __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nfunction __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nfunction __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nfunction __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nfunction __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nfunction __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\nfunction __classPrivateFieldIn(state, receiver) {\r\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\r\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\r\n}\r\n\n;// CONCATENATED MODULE: ./src/callbackiterresult.ts\n\n\n/**\n * IterResult subclass that calls a callback function on each add,\n * and stops iterating when the callback returns false.\n */\nvar CallbackIterResult = /** @class */ (function (_super) {\n __extends(CallbackIterResult, _super);\n function CallbackIterResult(method, args, iterator) {\n var _this = _super.call(this, method, args) || this;\n _this.iterator = iterator;\n return _this;\n }\n CallbackIterResult.prototype.add = function (date) {\n if (this.iterator(date, this._result.length)) {\n this._result.push(date);\n return true;\n }\n return false;\n };\n return CallbackIterResult;\n}(iterresult));\n/* harmony default export */ const callbackiterresult = (CallbackIterResult);\n\n;// CONCATENATED MODULE: ./src/nlp/i18n.ts\n// =============================================================================\n// i18n\n// =============================================================================\nvar ENGLISH = {\n dayNames: [\n 'Sunday',\n 'Monday',\n 'Tuesday',\n 'Wednesday',\n 'Thursday',\n 'Friday',\n 'Saturday',\n ],\n monthNames: [\n 'January',\n 'February',\n 'March',\n 'April',\n 'May',\n 'June',\n 'July',\n 'August',\n 'September',\n 'October',\n 'November',\n 'December',\n ],\n tokens: {\n SKIP: /^[ \\r\\n\\t]+|^\\.$/,\n number: /^[1-9][0-9]*/,\n numberAsText: /^(one|two|three)/i,\n every: /^every/i,\n 'day(s)': /^days?/i,\n 'weekday(s)': /^weekdays?/i,\n 'week(s)': /^weeks?/i,\n 'hour(s)': /^hours?/i,\n 'minute(s)': /^minutes?/i,\n 'month(s)': /^months?/i,\n 'year(s)': /^years?/i,\n on: /^(on|in)/i,\n at: /^(at)/i,\n the: /^the/i,\n first: /^first/i,\n second: /^second/i,\n third: /^third/i,\n nth: /^([1-9][0-9]*)(\\.|th|nd|rd|st)/i,\n last: /^last/i,\n for: /^for/i,\n 'time(s)': /^times?/i,\n until: /^(un)?til/i,\n monday: /^mo(n(day)?)?/i,\n tuesday: /^tu(e(s(day)?)?)?/i,\n wednesday: /^we(d(n(esday)?)?)?/i,\n thursday: /^th(u(r(sday)?)?)?/i,\n friday: /^fr(i(day)?)?/i,\n saturday: /^sa(t(urday)?)?/i,\n sunday: /^su(n(day)?)?/i,\n january: /^jan(uary)?/i,\n february: /^feb(ruary)?/i,\n march: /^mar(ch)?/i,\n april: /^apr(il)?/i,\n may: /^may/i,\n june: /^june?/i,\n july: /^july?/i,\n august: /^aug(ust)?/i,\n september: /^sep(t(ember)?)?/i,\n october: /^oct(ober)?/i,\n november: /^nov(ember)?/i,\n december: /^dec(ember)?/i,\n comma: /^(,\\s*|(and|or)\\s*)+/i,\n },\n};\n/* harmony default export */ const i18n = (ENGLISH);\n\n;// CONCATENATED MODULE: ./src/nlp/totext.ts\n\n\n\n// =============================================================================\n// Helper functions\n// =============================================================================\n/**\n * Return true if a value is in an array\n */\nvar contains = function (arr, val) {\n return arr.indexOf(val) !== -1;\n};\nvar defaultGetText = function (id) { return id.toString(); };\nvar defaultDateFormatter = function (year, month, day) { return \"\".concat(month, \" \").concat(day, \", \").concat(year); };\n/**\n *\n * @param {RRule} rrule\n * Optional:\n * @param {Function} gettext function\n * @param {Object} language definition\n * @constructor\n */\nvar ToText = /** @class */ (function () {\n function ToText(rrule, gettext, language, dateFormatter) {\n if (gettext === void 0) { gettext = defaultGetText; }\n if (language === void 0) { language = i18n; }\n if (dateFormatter === void 0) { dateFormatter = defaultDateFormatter; }\n this.text = [];\n this.language = language || i18n;\n this.gettext = gettext;\n this.dateFormatter = dateFormatter;\n this.rrule = rrule;\n this.options = rrule.options;\n this.origOptions = rrule.origOptions;\n if (this.origOptions.bymonthday) {\n var bymonthday = [].concat(this.options.bymonthday);\n var bynmonthday = [].concat(this.options.bynmonthday);\n bymonthday.sort(function (a, b) { return a - b; });\n bynmonthday.sort(function (a, b) { return b - a; });\n // 1, 2, 3, .., -5, -4, -3, ..\n this.bymonthday = bymonthday.concat(bynmonthday);\n if (!this.bymonthday.length)\n this.bymonthday = null;\n }\n if (isPresent(this.origOptions.byweekday)) {\n var byweekday = !isArray(this.origOptions.byweekday)\n ? [this.origOptions.byweekday]\n : this.origOptions.byweekday;\n var days = String(byweekday);\n this.byweekday = {\n allWeeks: byweekday.filter(function (weekday) {\n return !weekday.n;\n }),\n someWeeks: byweekday.filter(function (weekday) {\n return Boolean(weekday.n);\n }),\n isWeekdays: days.indexOf('MO') !== -1 &&\n days.indexOf('TU') !== -1 &&\n days.indexOf('WE') !== -1 &&\n days.indexOf('TH') !== -1 &&\n days.indexOf('FR') !== -1 &&\n days.indexOf('SA') === -1 &&\n days.indexOf('SU') === -1,\n isEveryDay: days.indexOf('MO') !== -1 &&\n days.indexOf('TU') !== -1 &&\n days.indexOf('WE') !== -1 &&\n days.indexOf('TH') !== -1 &&\n days.indexOf('FR') !== -1 &&\n days.indexOf('SA') !== -1 &&\n days.indexOf('SU') !== -1,\n };\n var sortWeekDays = function (a, b) {\n return a.weekday - b.weekday;\n };\n this.byweekday.allWeeks.sort(sortWeekDays);\n this.byweekday.someWeeks.sort(sortWeekDays);\n if (!this.byweekday.allWeeks.length)\n this.byweekday.allWeeks = null;\n if (!this.byweekday.someWeeks.length)\n this.byweekday.someWeeks = null;\n }\n else {\n this.byweekday = null;\n }\n }\n /**\n * Test whether the rrule can be fully converted to text.\n *\n * @param {RRule} rrule\n * @return {Boolean}\n */\n ToText.isFullyConvertible = function (rrule) {\n var canConvert = true;\n if (!(rrule.options.freq in ToText.IMPLEMENTED))\n return false;\n if (rrule.origOptions.until && rrule.origOptions.count)\n return false;\n for (var key in rrule.origOptions) {\n if (contains(['dtstart', 'tzid', 'wkst', 'freq'], key))\n return true;\n if (!contains(ToText.IMPLEMENTED[rrule.options.freq], key))\n return false;\n }\n return canConvert;\n };\n ToText.prototype.isFullyConvertible = function () {\n return ToText.isFullyConvertible(this.rrule);\n };\n /**\n * Perform the conversion. Only some of the frequencies are supported.\n * If some of the rrule's options aren't supported, they'll\n * be omitted from the output an \"(~ approximate)\" will be appended.\n *\n * @return {*}\n */\n ToText.prototype.toString = function () {\n var gettext = this.gettext;\n if (!(this.options.freq in ToText.IMPLEMENTED)) {\n return gettext('RRule error: Unable to fully convert this rrule to text');\n }\n this.text = [gettext('every')];\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n this[RRule.FREQUENCIES[this.options.freq]]();\n if (this.options.until) {\n this.add(gettext('until'));\n var until = this.options.until;\n this.add(this.dateFormatter(until.getUTCFullYear(), this.language.monthNames[until.getUTCMonth()], until.getUTCDate()));\n }\n else if (this.options.count) {\n this.add(gettext('for'))\n .add(this.options.count.toString())\n .add(this.plural(this.options.count) ? gettext('times') : gettext('time'));\n }\n if (!this.isFullyConvertible())\n this.add(gettext('(~ approximate)'));\n return this.text.join('');\n };\n ToText.prototype.HOURLY = function () {\n var gettext = this.gettext;\n if (this.options.interval !== 1)\n this.add(this.options.interval.toString());\n this.add(this.plural(this.options.interval) ? gettext('hours') : gettext('hour'));\n };\n ToText.prototype.MINUTELY = function () {\n var gettext = this.gettext;\n if (this.options.interval !== 1)\n this.add(this.options.interval.toString());\n this.add(this.plural(this.options.interval)\n ? gettext('minutes')\n : gettext('minute'));\n };\n ToText.prototype.DAILY = function () {\n var gettext = this.gettext;\n if (this.options.interval !== 1)\n this.add(this.options.interval.toString());\n if (this.byweekday && this.byweekday.isWeekdays) {\n this.add(this.plural(this.options.interval)\n ? gettext('weekdays')\n : gettext('weekday'));\n }\n else {\n this.add(this.plural(this.options.interval) ? gettext('days') : gettext('day'));\n }\n if (this.origOptions.bymonth) {\n this.add(gettext('in'));\n this._bymonth();\n }\n if (this.bymonthday) {\n this._bymonthday();\n }\n else if (this.byweekday) {\n this._byweekday();\n }\n else if (this.origOptions.byhour) {\n this._byhour();\n }\n };\n ToText.prototype.WEEKLY = function () {\n var gettext = this.gettext;\n if (this.options.interval !== 1) {\n this.add(this.options.interval.toString()).add(this.plural(this.options.interval) ? gettext('weeks') : gettext('week'));\n }\n if (this.byweekday && this.byweekday.isWeekdays) {\n if (this.options.interval === 1) {\n this.add(this.plural(this.options.interval)\n ? gettext('weekdays')\n : gettext('weekday'));\n }\n else {\n this.add(gettext('on')).add(gettext('weekdays'));\n }\n }\n else if (this.byweekday && this.byweekday.isEveryDay) {\n this.add(this.plural(this.options.interval) ? gettext('days') : gettext('day'));\n }\n else {\n if (this.options.interval === 1)\n this.add(gettext('week'));\n if (this.origOptions.bymonth) {\n this.add(gettext('in'));\n this._bymonth();\n }\n if (this.bymonthday) {\n this._bymonthday();\n }\n else if (this.byweekday) {\n this._byweekday();\n }\n if (this.origOptions.byhour) {\n this._byhour();\n }\n }\n };\n ToText.prototype.MONTHLY = function () {\n var gettext = this.gettext;\n if (this.origOptions.bymonth) {\n if (this.options.interval !== 1) {\n this.add(this.options.interval.toString()).add(gettext('months'));\n if (this.plural(this.options.interval))\n this.add(gettext('in'));\n }\n else {\n // this.add(gettext('MONTH'))\n }\n this._bymonth();\n }\n else {\n if (this.options.interval !== 1) {\n this.add(this.options.interval.toString());\n }\n this.add(this.plural(this.options.interval)\n ? gettext('months')\n : gettext('month'));\n }\n if (this.bymonthday) {\n this._bymonthday();\n }\n else if (this.byweekday && this.byweekday.isWeekdays) {\n this.add(gettext('on')).add(gettext('weekdays'));\n }\n else if (this.byweekday) {\n this._byweekday();\n }\n };\n ToText.prototype.YEARLY = function () {\n var gettext = this.gettext;\n if (this.origOptions.bymonth) {\n if (this.options.interval !== 1) {\n this.add(this.options.interval.toString());\n this.add(gettext('years'));\n }\n else {\n // this.add(gettext('YEAR'))\n }\n this._bymonth();\n }\n else {\n if (this.options.interval !== 1) {\n this.add(this.options.interval.toString());\n }\n this.add(this.plural(this.options.interval) ? gettext('years') : gettext('year'));\n }\n if (this.bymonthday) {\n this._bymonthday();\n }\n else if (this.byweekday) {\n this._byweekday();\n }\n if (this.options.byyearday) {\n this.add(gettext('on the'))\n .add(this.list(this.options.byyearday, this.nth, gettext('and')))\n .add(gettext('day'));\n }\n if (this.options.byweekno) {\n this.add(gettext('in'))\n .add(this.plural(this.options.byweekno.length)\n ? gettext('weeks')\n : gettext('week'))\n .add(this.list(this.options.byweekno, undefined, gettext('and')));\n }\n };\n ToText.prototype._bymonthday = function () {\n var gettext = this.gettext;\n if (this.byweekday && this.byweekday.allWeeks) {\n this.add(gettext('on'))\n .add(this.list(this.byweekday.allWeeks, this.weekdaytext, gettext('or')))\n .add(gettext('the'))\n .add(this.list(this.bymonthday, this.nth, gettext('or')));\n }\n else {\n this.add(gettext('on the')).add(this.list(this.bymonthday, this.nth, gettext('and')));\n }\n // this.add(gettext('DAY'))\n };\n ToText.prototype._byweekday = function () {\n var gettext = this.gettext;\n if (this.byweekday.allWeeks && !this.byweekday.isWeekdays) {\n this.add(gettext('on')).add(this.list(this.byweekday.allWeeks, this.weekdaytext));\n }\n if (this.byweekday.someWeeks) {\n if (this.byweekday.allWeeks)\n this.add(gettext('and'));\n this.add(gettext('on the')).add(this.list(this.byweekday.someWeeks, this.weekdaytext, gettext('and')));\n }\n };\n ToText.prototype._byhour = function () {\n var gettext = this.gettext;\n this.add(gettext('at')).add(this.list(this.origOptions.byhour, undefined, gettext('and')));\n };\n ToText.prototype._bymonth = function () {\n this.add(this.list(this.options.bymonth, this.monthtext, this.gettext('and')));\n };\n ToText.prototype.nth = function (n) {\n n = parseInt(n.toString(), 10);\n var nth;\n var gettext = this.gettext;\n if (n === -1)\n return gettext('last');\n var npos = Math.abs(n);\n switch (npos) {\n case 1:\n case 21:\n case 31:\n nth = npos + gettext('st');\n break;\n case 2:\n case 22:\n nth = npos + gettext('nd');\n break;\n case 3:\n case 23:\n nth = npos + gettext('rd');\n break;\n default:\n nth = npos + gettext('th');\n }\n return n < 0 ? nth + ' ' + gettext('last') : nth;\n };\n ToText.prototype.monthtext = function (m) {\n return this.language.monthNames[m - 1];\n };\n ToText.prototype.weekdaytext = function (wday) {\n var weekday = isNumber(wday) ? (wday + 1) % 7 : wday.getJsWeekday();\n return ((wday.n ? this.nth(wday.n) + ' ' : '') +\n this.language.dayNames[weekday]);\n };\n ToText.prototype.plural = function (n) {\n return n % 100 !== 1;\n };\n ToText.prototype.add = function (s) {\n this.text.push(' ');\n this.text.push(s);\n return this;\n };\n ToText.prototype.list = function (arr, callback, finalDelim, delim) {\n var _this = this;\n if (delim === void 0) { delim = ','; }\n if (!isArray(arr)) {\n arr = [arr];\n }\n var delimJoin = function (array, delimiter, finalDelimiter) {\n var list = '';\n for (var i = 0; i < array.length; i++) {\n if (i !== 0) {\n if (i === array.length - 1) {\n list += ' ' + finalDelimiter + ' ';\n }\n else {\n list += delimiter + ' ';\n }\n }\n list += array[i];\n }\n return list;\n };\n callback =\n callback ||\n function (o) {\n return o.toString();\n };\n var realCallback = function (arg) {\n return callback && callback.call(_this, arg);\n };\n if (finalDelim) {\n return delimJoin(arr.map(realCallback), delim, finalDelim);\n }\n else {\n return arr.map(realCallback).join(delim + ' ');\n }\n };\n return ToText;\n}());\n/* harmony default export */ const totext = (ToText);\n\n;// CONCATENATED MODULE: ./src/nlp/parsetext.ts\n\n\n// =============================================================================\n// Parser\n// =============================================================================\nvar Parser = /** @class */ (function () {\n function Parser(rules) {\n this.done = true;\n this.rules = rules;\n }\n Parser.prototype.start = function (text) {\n this.text = text;\n this.done = false;\n return this.nextSymbol();\n };\n Parser.prototype.isDone = function () {\n return this.done && this.symbol === null;\n };\n Parser.prototype.nextSymbol = function () {\n var best;\n var bestSymbol;\n this.symbol = null;\n this.value = null;\n do {\n if (this.done)\n return false;\n var rule = void 0;\n best = null;\n for (var name_1 in this.rules) {\n rule = this.rules[name_1];\n var match = rule.exec(this.text);\n if (match) {\n if (best === null || match[0].length > best[0].length) {\n best = match;\n bestSymbol = name_1;\n }\n }\n }\n if (best != null) {\n this.text = this.text.substr(best[0].length);\n if (this.text === '')\n this.done = true;\n }\n if (best == null) {\n this.done = true;\n this.symbol = null;\n this.value = null;\n return;\n }\n } while (bestSymbol === 'SKIP');\n this.symbol = bestSymbol;\n this.value = best;\n return true;\n };\n Parser.prototype.accept = function (name) {\n if (this.symbol === name) {\n if (this.value) {\n var v = this.value;\n this.nextSymbol();\n return v;\n }\n this.nextSymbol();\n return true;\n }\n return false;\n };\n Parser.prototype.acceptNumber = function () {\n return this.accept('number');\n };\n Parser.prototype.expect = function (name) {\n if (this.accept(name))\n return true;\n throw new Error('expected ' + name + ' but found ' + this.symbol);\n };\n return Parser;\n}());\nfunction parseText(text, language) {\n if (language === void 0) { language = i18n; }\n var options = {};\n var ttr = new Parser(language.tokens);\n if (!ttr.start(text))\n return null;\n S();\n return options;\n function S() {\n // every [n]\n ttr.expect('every');\n var n = ttr.acceptNumber();\n if (n)\n options.interval = parseInt(n[0], 10);\n if (ttr.isDone())\n throw new Error('Unexpected end');\n switch (ttr.symbol) {\n case 'day(s)':\n options.freq = RRule.DAILY;\n if (ttr.nextSymbol()) {\n AT();\n F();\n }\n break;\n // FIXME Note: every 2 weekdays != every two weeks on weekdays.\n // DAILY on weekdays is not a valid rule\n case 'weekday(s)':\n options.freq = RRule.WEEKLY;\n options.byweekday = [RRule.MO, RRule.TU, RRule.WE, RRule.TH, RRule.FR];\n ttr.nextSymbol();\n AT();\n F();\n break;\n case 'week(s)':\n options.freq = RRule.WEEKLY;\n if (ttr.nextSymbol()) {\n ON();\n AT();\n F();\n }\n break;\n case 'hour(s)':\n options.freq = RRule.HOURLY;\n if (ttr.nextSymbol()) {\n ON();\n F();\n }\n break;\n case 'minute(s)':\n options.freq = RRule.MINUTELY;\n if (ttr.nextSymbol()) {\n ON();\n F();\n }\n break;\n case 'month(s)':\n options.freq = RRule.MONTHLY;\n if (ttr.nextSymbol()) {\n ON();\n F();\n }\n break;\n case 'year(s)':\n options.freq = RRule.YEARLY;\n if (ttr.nextSymbol()) {\n ON();\n F();\n }\n break;\n case 'monday':\n case 'tuesday':\n case 'wednesday':\n case 'thursday':\n case 'friday':\n case 'saturday':\n case 'sunday':\n options.freq = RRule.WEEKLY;\n var key = ttr.symbol\n .substr(0, 2)\n .toUpperCase();\n options.byweekday = [RRule[key]];\n if (!ttr.nextSymbol())\n return;\n // TODO check for duplicates\n while (ttr.accept('comma')) {\n if (ttr.isDone())\n throw new Error('Unexpected end');\n var wkd = decodeWKD();\n if (!wkd) {\n throw new Error('Unexpected symbol ' + ttr.symbol + ', expected weekday');\n }\n options.byweekday.push(RRule[wkd]);\n ttr.nextSymbol();\n }\n AT();\n MDAYs();\n F();\n break;\n case 'january':\n case 'february':\n case 'march':\n case 'april':\n case 'may':\n case 'june':\n case 'july':\n case 'august':\n case 'september':\n case 'october':\n case 'november':\n case 'december':\n options.freq = RRule.YEARLY;\n options.bymonth = [decodeM()];\n if (!ttr.nextSymbol())\n return;\n // TODO check for duplicates\n while (ttr.accept('comma')) {\n if (ttr.isDone())\n throw new Error('Unexpected end');\n var m = decodeM();\n if (!m) {\n throw new Error('Unexpected symbol ' + ttr.symbol + ', expected month');\n }\n options.bymonth.push(m);\n ttr.nextSymbol();\n }\n ON();\n F();\n break;\n default:\n throw new Error('Unknown symbol');\n }\n }\n function ON() {\n var on = ttr.accept('on');\n var the = ttr.accept('the');\n if (!(on || the))\n return;\n do {\n var nth = decodeNTH();\n var wkd = decodeWKD();\n var m = decodeM();\n // nth <weekday> | <weekday>\n if (nth) {\n // ttr.nextSymbol()\n if (wkd) {\n ttr.nextSymbol();\n if (!options.byweekday)\n options.byweekday = [];\n options.byweekday.push(RRule[wkd].nth(nth));\n }\n else {\n if (!options.bymonthday)\n options.bymonthday = [];\n options.bymonthday.push(nth);\n ttr.accept('day(s)');\n }\n // <weekday>\n }\n else if (wkd) {\n ttr.nextSymbol();\n if (!options.byweekday)\n options.byweekday = [];\n options.byweekday.push(RRule[wkd]);\n }\n else if (ttr.symbol === 'weekday(s)') {\n ttr.nextSymbol();\n if (!options.byweekday) {\n options.byweekday = [RRule.MO, RRule.TU, RRule.WE, RRule.TH, RRule.FR];\n }\n }\n else if (ttr.symbol === 'week(s)') {\n ttr.nextSymbol();\n var n = ttr.acceptNumber();\n if (!n) {\n throw new Error('Unexpected symbol ' + ttr.symbol + ', expected week number');\n }\n options.byweekno = [parseInt(n[0], 10)];\n while (ttr.accept('comma')) {\n n = ttr.acceptNumber();\n if (!n) {\n throw new Error('Unexpected symbol ' + ttr.symbol + '; expected monthday');\n }\n options.byweekno.push(parseInt(n[0], 10));\n }\n }\n else if (m) {\n ttr.nextSymbol();\n if (!options.bymonth)\n options.bymonth = [];\n options.bymonth.push(m);\n }\n else {\n return;\n }\n } while (ttr.accept('comma') || ttr.accept('the') || ttr.accept('on'));\n }\n function AT() {\n var at = ttr.accept('at');\n if (!at)\n return;\n do {\n var n = ttr.acceptNumber();\n if (!n) {\n throw new Error('Unexpected symbol ' + ttr.symbol + ', expected hour');\n }\n options.byhour = [parseInt(n[0], 10)];\n while (ttr.accept('comma')) {\n n = ttr.acceptNumber();\n if (!n) {\n throw new Error('Unexpected symbol ' + ttr.symbol + '; expected hour');\n }\n options.byhour.push(parseInt(n[0], 10));\n }\n } while (ttr.accept('comma') || ttr.accept('at'));\n }\n function decodeM() {\n switch (ttr.symbol) {\n case 'january':\n return 1;\n case 'february':\n return 2;\n case 'march':\n return 3;\n case 'april':\n return 4;\n case 'may':\n return 5;\n case 'june':\n return 6;\n case 'july':\n return 7;\n case 'august':\n return 8;\n case 'september':\n return 9;\n case 'october':\n return 10;\n case 'november':\n return 11;\n case 'december':\n return 12;\n default:\n return false;\n }\n }\n function decodeWKD() {\n switch (ttr.symbol) {\n case 'monday':\n case 'tuesday':\n case 'wednesday':\n case 'thursday':\n case 'friday':\n case 'saturday':\n case 'sunday':\n return ttr.symbol.substr(0, 2).toUpperCase();\n default:\n return false;\n }\n }\n function decodeNTH() {\n switch (ttr.symbol) {\n case 'last':\n ttr.nextSymbol();\n return -1;\n case 'first':\n ttr.nextSymbol();\n return 1;\n case 'second':\n ttr.nextSymbol();\n return ttr.accept('last') ? -2 : 2;\n case 'third':\n ttr.nextSymbol();\n return ttr.accept('last') ? -3 : 3;\n case 'nth':\n var v = parseInt(ttr.value[1], 10);\n if (v < -366 || v > 366)\n throw new Error('Nth out of range: ' + v);\n ttr.nextSymbol();\n return ttr.accept('last') ? -v : v;\n default:\n return false;\n }\n }\n function MDAYs() {\n ttr.accept('on');\n ttr.accept('the');\n var nth = decodeNTH();\n if (!nth)\n return;\n options.bymonthday = [nth];\n ttr.nextSymbol();\n while (ttr.accept('comma')) {\n nth = decodeNTH();\n if (!nth) {\n throw new Error('Unexpected symbol ' + ttr.symbol + '; expected monthday');\n }\n options.bymonthday.push(nth);\n ttr.nextSymbol();\n }\n }\n function F() {\n if (ttr.symbol === 'until') {\n var date = Date.parse(ttr.text);\n if (!date)\n throw new Error('Cannot parse until date:' + ttr.text);\n options.until = new Date(date);\n }\n else if (ttr.accept('for')) {\n options.count = parseInt(ttr.value[0], 10);\n ttr.expect('number');\n // ttr.expect('times')\n }\n }\n}\n\n;// CONCATENATED MODULE: ./src/types.ts\nvar Frequency;\n(function (Frequency) {\n Frequency[Frequency[\"YEARLY\"] = 0] = \"YEARLY\";\n Frequency[Frequency[\"MONTHLY\"] = 1] = \"MONTHLY\";\n Frequency[Frequency[\"WEEKLY\"] = 2] = \"WEEKLY\";\n Frequency[Frequency[\"DAILY\"] = 3] = \"DAILY\";\n Frequency[Frequency[\"HOURLY\"] = 4] = \"HOURLY\";\n Frequency[Frequency[\"MINUTELY\"] = 5] = \"MINUTELY\";\n Frequency[Frequency[\"SECONDLY\"] = 6] = \"SECONDLY\";\n})(Frequency || (Frequency = {}));\nfunction freqIsDailyOrGreater(freq) {\n return freq < Frequency.HOURLY;\n}\n\n;// CONCATENATED MODULE: ./src/nlp/index.ts\n\n\n\n\n\n/* !\n * rrule.js - Library for working with recurrence rules for calendar dates.\n * https://github.com/jakubroztocil/rrule\n *\n * Copyright 2010, Jakub Roztocil and Lars Schoning\n * Licenced under the BSD licence.\n * https://github.com/jakubroztocil/rrule/blob/master/LICENCE\n *\n */\n/**\n *\n * Implementation of RRule.fromText() and RRule::toText().\n *\n *\n * On the client side, this file needs to be included\n * when those functions are used.\n *\n */\n// =============================================================================\n// fromText\n// =============================================================================\n/**\n * Will be able to convert some of the below described rules from\n * text format to a rule object.\n *\n *\n * RULES\n *\n * Every ([n])\n * day(s)\n * | [weekday], ..., (and) [weekday]\n * | weekday(s)\n * | week(s)\n * | month(s)\n * | [month], ..., (and) [month]\n * | year(s)\n *\n *\n * Plus 0, 1, or multiple of these:\n *\n * on [weekday], ..., (or) [weekday] the [monthday], [monthday], ... (or) [monthday]\n *\n * on [weekday], ..., (and) [weekday]\n *\n * on the [monthday], [monthday], ... (and) [monthday] (day of the month)\n *\n * on the [nth-weekday], ..., (and) [nth-weekday] (of the month/year)\n *\n *\n * Plus 0 or 1 of these:\n *\n * for [n] time(s)\n *\n * until [date]\n *\n * Plus (.)\n *\n *\n * Definitely no supported for parsing:\n *\n * (for year):\n * in week(s) [n], ..., (and) [n]\n *\n * on the [yearday], ..., (and) [n] day of the year\n * on day [yearday], ..., (and) [n]\n *\n *\n * NON-TERMINALS\n *\n * [n]: 1, 2 ..., one, two, three ..\n * [month]: January, February, March, April, May, ... December\n * [weekday]: Monday, ... Sunday\n * [nth-weekday]: first [weekday], 2nd [weekday], ... last [weekday], ...\n * [monthday]: first, 1., 2., 1st, 2nd, second, ... 31st, last day, 2nd last day, ..\n * [date]:\n * - [month] (0-31(,) ([year])),\n * - (the) 0-31.(1-12.([year])),\n * - (the) 0-31/(1-12/([year])),\n * - [weekday]\n *\n * [year]: 0000, 0001, ... 01, 02, ..\n *\n * Definitely not supported for parsing:\n *\n * [yearday]: first, 1., 2., 1st, 2nd, second, ... 366th, last day, 2nd last day, ..\n *\n * @param {String} text\n * @return {Object, Boolean} the rule, or null.\n */\nvar fromText = function (text, language) {\n if (language === void 0) { language = i18n; }\n return new RRule(parseText(text, language) || undefined);\n};\nvar common = [\n 'count',\n 'until',\n 'interval',\n 'byweekday',\n 'bymonthday',\n 'bymonth',\n];\ntotext.IMPLEMENTED = [];\ntotext.IMPLEMENTED[Frequency.HOURLY] = common;\ntotext.IMPLEMENTED[Frequency.MINUTELY] = common;\ntotext.IMPLEMENTED[Frequency.DAILY] = ['byhour'].concat(common);\ntotext.IMPLEMENTED[Frequency.WEEKLY] = common;\ntotext.IMPLEMENTED[Frequency.MONTHLY] = common;\ntotext.IMPLEMENTED[Frequency.YEARLY] = ['byweekno', 'byyearday'].concat(common);\n// =============================================================================\n// Export\n// =============================================================================\nvar toText = function (rrule, gettext, language, dateFormatter) {\n return new totext(rrule, gettext, language, dateFormatter).toString();\n};\nvar isFullyConvertible = totext.isFullyConvertible;\n\n\n;// CONCATENATED MODULE: ./src/datetime.ts\n\n\n\n\nvar Time = /** @class */ (function () {\n function Time(hour, minute, second, millisecond) {\n this.hour = hour;\n this.minute = minute;\n this.second = second;\n this.millisecond = millisecond || 0;\n }\n Time.prototype.getHours = function () {\n return this.hour;\n };\n Time.prototype.getMinutes = function () {\n return this.minute;\n };\n Time.prototype.getSeconds = function () {\n return this.second;\n };\n Time.prototype.getMilliseconds = function () {\n return this.millisecond;\n };\n Time.prototype.getTime = function () {\n return ((this.hour * 60 * 60 + this.minute * 60 + this.second) * 1000 +\n this.millisecond);\n };\n return Time;\n}());\n\nvar DateTime = /** @class */ (function (_super) {\n __extends(DateTime, _super);\n function DateTime(year, month, day, hour, minute, second, millisecond) {\n var _this = _super.call(this, hour, minute, second, millisecond) || this;\n _this.year = year;\n _this.month = month;\n _this.day = day;\n return _this;\n }\n DateTime.fromDate = function (date) {\n return new this(date.getUTCFullYear(), date.getUTCMonth() + 1, date.getUTCDate(), date.getUTCHours(), date.getUTCMinutes(), date.getUTCSeconds(), date.valueOf() % 1000);\n };\n DateTime.prototype.getWeekday = function () {\n return getWeekday(new Date(this.getTime()));\n };\n DateTime.prototype.getTime = function () {\n return new Date(Date.UTC(this.year, this.month - 1, this.day, this.hour, this.minute, this.second, this.millisecond)).getTime();\n };\n DateTime.prototype.getDay = function () {\n return this.day;\n };\n DateTime.prototype.getMonth = function () {\n return this.month;\n };\n DateTime.prototype.getYear = function () {\n return this.year;\n };\n DateTime.prototype.addYears = function (years) {\n this.year += years;\n };\n DateTime.prototype.addMonths = function (months) {\n this.month += months;\n if (this.month > 12) {\n var yearDiv = Math.floor(this.month / 12);\n var monthMod = pymod(this.month, 12);\n this.month = monthMod;\n this.year += yearDiv;\n if (this.month === 0) {\n this.month = 12;\n --this.year;\n }\n }\n };\n DateTime.prototype.addWeekly = function (days, wkst) {\n if (wkst > this.getWeekday()) {\n this.day += -(this.getWeekday() + 1 + (6 - wkst)) + days * 7;\n }\n else {\n this.day += -(this.getWeekday() - wkst) + days * 7;\n }\n this.fixDay();\n };\n DateTime.prototype.addDaily = function (days) {\n this.day += days;\n this.fixDay();\n };\n DateTime.prototype.addHours = function (hours, filtered, byhour) {\n if (filtered) {\n // Jump to one iteration before next day\n this.hour += Math.floor((23 - this.hour) / hours) * hours;\n }\n for (;;) {\n this.hour += hours;\n var _a = divmod(this.hour, 24), dayDiv = _a.div, hourMod = _a.mod;\n if (dayDiv) {\n this.hour = hourMod;\n this.addDaily(dayDiv);\n }\n if (empty(byhour) || includes(byhour, this.hour))\n break;\n }\n };\n DateTime.prototype.addMinutes = function (minutes, filtered, byhour, byminute) {\n if (filtered) {\n // Jump to one iteration before next day\n this.minute +=\n Math.floor((1439 - (this.hour * 60 + this.minute)) / minutes) * minutes;\n }\n for (;;) {\n this.minute += minutes;\n var _a = divmod(this.minute, 60), hourDiv = _a.div, minuteMod = _a.mod;\n if (hourDiv) {\n this.minute = minuteMod;\n this.addHours(hourDiv, false, byhour);\n }\n if ((empty(byhour) || includes(byhour, this.hour)) &&\n (empty(byminute) || includes(byminute, this.minute))) {\n break;\n }\n }\n };\n DateTime.prototype.addSeconds = function (seconds, filtered, byhour, byminute, bysecond) {\n if (filtered) {\n // Jump to one iteration before next day\n this.second +=\n Math.floor((86399 - (this.hour * 3600 + this.minute * 60 + this.second)) /\n seconds) * seconds;\n }\n for (;;) {\n this.second += seconds;\n var _a = divmod(this.second, 60), minuteDiv = _a.div, secondMod = _a.mod;\n if (minuteDiv) {\n this.second = secondMod;\n this.addMinutes(minuteDiv, false, byhour, byminute);\n }\n if ((empty(byhour) || includes(byhour, this.hour)) &&\n (empty(byminute) || includes(byminute, this.minute)) &&\n (empty(bysecond) || includes(bysecond, this.second))) {\n break;\n }\n }\n };\n DateTime.prototype.fixDay = function () {\n if (this.day <= 28) {\n return;\n }\n var daysinmonth = monthRange(this.year, this.month - 1)[1];\n if (this.day <= daysinmonth) {\n return;\n }\n while (this.day > daysinmonth) {\n this.day -= daysinmonth;\n ++this.month;\n if (this.month === 13) {\n this.month = 1;\n ++this.year;\n if (this.year > MAXYEAR) {\n return;\n }\n }\n daysinmonth = monthRange(this.year, this.month - 1)[1];\n }\n };\n DateTime.prototype.add = function (options, filtered) {\n var freq = options.freq, interval = options.interval, wkst = options.wkst, byhour = options.byhour, byminute = options.byminute, bysecond = options.bysecond;\n switch (freq) {\n case Frequency.YEARLY:\n return this.addYears(interval);\n case Frequency.MONTHLY:\n return this.addMonths(interval);\n case Frequency.WEEKLY:\n return this.addWeekly(interval, wkst);\n case Frequency.DAILY:\n return this.addDaily(interval);\n case Frequency.HOURLY:\n return this.addHours(interval, filtered, byhour);\n case Frequency.MINUTELY:\n return this.addMinutes(interval, filtered, byhour, byminute);\n case Frequency.SECONDLY:\n return this.addSeconds(interval, filtered, byhour, byminute, bysecond);\n }\n };\n return DateTime;\n}(Time));\n\n\n;// CONCATENATED MODULE: ./src/parseoptions.ts\n\n\n\n\n\n\n\nfunction initializeOptions(options) {\n var invalid = [];\n var keys = Object.keys(options);\n // Shallow copy for options and origOptions and check for invalid\n for (var _i = 0, keys_1 = keys; _i < keys_1.length; _i++) {\n var key = keys_1[_i];\n if (!includes(defaultKeys, key))\n invalid.push(key);\n if (isDate(options[key]) && !isValidDate(options[key])) {\n invalid.push(key);\n }\n }\n if (invalid.length) {\n throw new Error('Invalid options: ' + invalid.join(', '));\n }\n return __assign({}, options);\n}\nfunction parseOptions(options) {\n var opts = __assign(__assign({}, DEFAULT_OPTIONS), initializeOptions(options));\n if (isPresent(opts.byeaster))\n opts.freq = RRule.YEARLY;\n if (!(isPresent(opts.freq) && RRule.FREQUENCIES[opts.freq])) {\n throw new Error(\"Invalid frequency: \".concat(opts.freq, \" \").concat(options.freq));\n }\n if (!opts.dtstart)\n opts.dtstart = new Date(new Date().setMilliseconds(0));\n if (!isPresent(opts.wkst)) {\n opts.wkst = RRule.MO.weekday;\n }\n else if (isNumber(opts.wkst)) {\n // cool, just keep it like that\n }\n else {\n opts.wkst = opts.wkst.weekday;\n }\n if (isPresent(opts.bysetpos)) {\n if (isNumber(opts.bysetpos))\n opts.bysetpos = [opts.bysetpos];\n for (var i = 0; i < opts.bysetpos.length; i++) {\n var v = opts.bysetpos[i];\n if (v === 0 || !(v >= -366 && v <= 366)) {\n throw new Error('bysetpos must be between 1 and 366,' + ' or between -366 and -1');\n }\n }\n }\n if (!(Boolean(opts.byweekno) ||\n notEmpty(opts.byweekno) ||\n notEmpty(opts.byyearday) ||\n Boolean(opts.bymonthday) ||\n notEmpty(opts.bymonthday) ||\n isPresent(opts.byweekday) ||\n isPresent(opts.byeaster))) {\n switch (opts.freq) {\n case RRule.YEARLY:\n if (!opts.bymonth)\n opts.bymonth = opts.dtstart.getUTCMonth() + 1;\n opts.bymonthday = opts.dtstart.getUTCDate();\n break;\n case RRule.MONTHLY:\n opts.bymonthday = opts.dtstart.getUTCDate();\n break;\n case RRule.WEEKLY:\n opts.byweekday = [getWeekday(opts.dtstart)];\n break;\n }\n }\n // bymonth\n if (isPresent(opts.bymonth) && !isArray(opts.bymonth)) {\n opts.bymonth = [opts.bymonth];\n }\n // byyearday\n if (isPresent(opts.byyearday) &&\n !isArray(opts.byyearday) &&\n isNumber(opts.byyearday)) {\n opts.byyearday = [opts.byyearday];\n }\n // bymonthday\n if (!isPresent(opts.bymonthday)) {\n opts.bymonthday = [];\n opts.bynmonthday = [];\n }\n else if (isArray(opts.bymonthday)) {\n var bymonthday = [];\n var bynmonthday = [];\n for (var i = 0; i < opts.bymonthday.length; i++) {\n var v = opts.bymonthday[i];\n if (v > 0) {\n bymonthday.push(v);\n }\n else if (v < 0) {\n bynmonthday.push(v);\n }\n }\n opts.bymonthday = bymonthday;\n opts.bynmonthday = bynmonthday;\n }\n else if (opts.bymonthday < 0) {\n opts.bynmonthday = [opts.bymonthday];\n opts.bymonthday = [];\n }\n else {\n opts.bynmonthday = [];\n opts.bymonthday = [opts.bymonthday];\n }\n // byweekno\n if (isPresent(opts.byweekno) && !isArray(opts.byweekno)) {\n opts.byweekno = [opts.byweekno];\n }\n // byweekday / bynweekday\n if (!isPresent(opts.byweekday)) {\n opts.bynweekday = null;\n }\n else if (isNumber(opts.byweekday)) {\n opts.byweekday = [opts.byweekday];\n opts.bynweekday = null;\n }\n else if (isWeekdayStr(opts.byweekday)) {\n opts.byweekday = [Weekday.fromStr(opts.byweekday).weekday];\n opts.bynweekday = null;\n }\n else if (opts.byweekday instanceof Weekday) {\n if (!opts.byweekday.n || opts.freq > RRule.MONTHLY) {\n opts.byweekday = [opts.byweekday.weekday];\n opts.bynweekday = null;\n }\n else {\n opts.bynweekday = [[opts.byweekday.weekday, opts.byweekday.n]];\n opts.byweekday = null;\n }\n }\n else {\n var byweekday = [];\n var bynweekday = [];\n for (var i = 0; i < opts.byweekday.length; i++) {\n var wday = opts.byweekday[i];\n if (isNumber(wday)) {\n byweekday.push(wday);\n continue;\n }\n else if (isWeekdayStr(wday)) {\n byweekday.push(Weekday.fromStr(wday).weekday);\n continue;\n }\n if (!wday.n || opts.freq > RRule.MONTHLY) {\n byweekday.push(wday.weekday);\n }\n else {\n bynweekday.push([wday.weekday, wday.n]);\n }\n }\n opts.byweekday = notEmpty(byweekday) ? byweekday : null;\n opts.bynweekday = notEmpty(bynweekday) ? bynweekday : null;\n }\n // byhour\n if (!isPresent(opts.byhour)) {\n opts.byhour = opts.freq < RRule.HOURLY ? [opts.dtstart.getUTCHours()] : null;\n }\n else if (isNumber(opts.byhour)) {\n opts.byhour = [opts.byhour];\n }\n // byminute\n if (!isPresent(opts.byminute)) {\n opts.byminute =\n opts.freq < RRule.MINUTELY ? [opts.dtstart.getUTCMinutes()] : null;\n }\n else if (isNumber(opts.byminute)) {\n opts.byminute = [opts.byminute];\n }\n // bysecond\n if (!isPresent(opts.bysecond)) {\n opts.bysecond =\n opts.freq < RRule.SECONDLY ? [opts.dtstart.getUTCSeconds()] : null;\n }\n else if (isNumber(opts.bysecond)) {\n opts.bysecond = [opts.bysecond];\n }\n return { parsedOptions: opts };\n}\nfunction buildTimeset(opts) {\n var millisecondModulo = opts.dtstart.getTime() % 1000;\n if (!freqIsDailyOrGreater(opts.freq)) {\n return [];\n }\n var timeset = [];\n opts.byhour.forEach(function (hour) {\n opts.byminute.forEach(function (minute) {\n opts.bysecond.forEach(function (second) {\n timeset.push(new Time(hour, minute, second, millisecondModulo));\n });\n });\n });\n return timeset;\n}\n\n;// CONCATENATED MODULE: ./src/parsestring.ts\n\n\n\n\n\nfunction parseString(rfcString) {\n var options = rfcString\n .split('\\n')\n .map(parseLine)\n .filter(function (x) { return x !== null; });\n return __assign(__assign({}, options[0]), options[1]);\n}\nfunction parseDtstart(line) {\n var options = {};\n var dtstartWithZone = /DTSTART(?:;TZID=([^:=]+?))?(?::|=)([^;\\s]+)/i.exec(line);\n if (!dtstartWithZone) {\n return options;\n }\n var tzid = dtstartWithZone[1], dtstart = dtstartWithZone[2];\n if (tzid) {\n options.tzid = tzid;\n }\n options.dtstart = untilStringToDate(dtstart);\n return options;\n}\nfunction parseLine(rfcString) {\n rfcString = rfcString.replace(/^\\s+|\\s+$/, '');\n if (!rfcString.length)\n return null;\n var header = /^([A-Z]+?)[:;]/.exec(rfcString.toUpperCase());\n if (!header) {\n return parseRrule(rfcString);\n }\n var key = header[1];\n switch (key.toUpperCase()) {\n case 'RRULE':\n case 'EXRULE':\n return parseRrule(rfcString);\n case 'DTSTART':\n return parseDtstart(rfcString);\n default:\n throw new Error(\"Unsupported RFC prop \".concat(key, \" in \").concat(rfcString));\n }\n}\nfunction parseRrule(line) {\n var strippedLine = line.replace(/^RRULE:/i, '');\n var options = parseDtstart(strippedLine);\n var attrs = line.replace(/^(?:RRULE|EXRULE):/i, '').split(';');\n attrs.forEach(function (attr) {\n var _a = attr.split('='), key = _a[0], value = _a[1];\n switch (key.toUpperCase()) {\n case 'FREQ':\n options.freq = Frequency[value.toUpperCase()];\n break;\n case 'WKST':\n options.wkst = Days[value.toUpperCase()];\n break;\n case 'COUNT':\n case 'INTERVAL':\n case 'BYSETPOS':\n case 'BYMONTH':\n case 'BYMONTHDAY':\n case 'BYYEARDAY':\n case 'BYWEEKNO':\n case 'BYHOUR':\n case 'BYMINUTE':\n case 'BYSECOND':\n var num = parseNumber(value);\n var optionKey = key.toLowerCase();\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n options[optionKey] = num;\n break;\n case 'BYWEEKDAY':\n case 'BYDAY':\n options.byweekday = parseWeekday(value);\n break;\n case 'DTSTART':\n case 'TZID':\n // for backwards compatibility\n var dtstart = parseDtstart(line);\n options.tzid = dtstart.tzid;\n options.dtstart = dtstart.dtstart;\n break;\n case 'UNTIL':\n options.until = untilStringToDate(value);\n break;\n case 'BYEASTER':\n options.byeaster = Number(value);\n break;\n default:\n throw new Error(\"Unknown RRULE property '\" + key + \"'\");\n }\n });\n return options;\n}\nfunction parseNumber(value) {\n if (value.indexOf(',') !== -1) {\n var values = value.split(',');\n return values.map(parseIndividualNumber);\n }\n return parseIndividualNumber(value);\n}\nfunction parseIndividualNumber(value) {\n if (/^[+-]?\\d+$/.test(value)) {\n return Number(value);\n }\n return value;\n}\nfunction parseWeekday(value) {\n var days = value.split(',');\n return days.map(function (day) {\n if (day.length === 2) {\n // MO, TU, ...\n return Days[day]; // wday instanceof Weekday\n }\n // -1MO, +3FR, 1SO, 13TU ...\n var parts = day.match(/^([+-]?\\d{1,2})([A-Z]{2})$/);\n if (!parts || parts.length < 3) {\n throw new SyntaxError(\"Invalid weekday string: \".concat(day));\n }\n var n = Number(parts[1]);\n var wdaypart = parts[2];\n var wday = Days[wdaypart].weekday;\n return new Weekday(wday, n);\n });\n}\n\n;// CONCATENATED MODULE: ./src/datewithzone.ts\n\nvar DateWithZone = /** @class */ (function () {\n function DateWithZone(date, tzid) {\n if (isNaN(date.getTime())) {\n throw new RangeError('Invalid date passed to DateWithZone');\n }\n this.date = date;\n this.tzid = tzid;\n }\n Object.defineProperty(DateWithZone.prototype, \"isUTC\", {\n get: function () {\n return !this.tzid || this.tzid.toUpperCase() === 'UTC';\n },\n enumerable: false,\n configurable: true\n });\n DateWithZone.prototype.toString = function () {\n var datestr = timeToUntilString(this.date.getTime(), this.isUTC);\n if (!this.isUTC) {\n return \";TZID=\".concat(this.tzid, \":\").concat(datestr);\n }\n return \":\".concat(datestr);\n };\n DateWithZone.prototype.getTime = function () {\n return this.date.getTime();\n };\n DateWithZone.prototype.rezonedDate = function () {\n if (this.isUTC) {\n return this.date;\n }\n return dateInTimeZone(this.date, this.tzid);\n };\n return DateWithZone;\n}());\n\n\n;// CONCATENATED MODULE: ./src/optionstostring.ts\n\n\n\n\n\nfunction optionsToString(options) {\n var rrule = [];\n var dtstart = '';\n var keys = Object.keys(options);\n var defaultKeys = Object.keys(DEFAULT_OPTIONS);\n for (var i = 0; i < keys.length; i++) {\n if (keys[i] === 'tzid')\n continue;\n if (!includes(defaultKeys, keys[i]))\n continue;\n var key = keys[i].toUpperCase();\n var value = options[keys[i]];\n var outValue = '';\n if (!isPresent(value) || (isArray(value) && !value.length))\n continue;\n switch (key) {\n case 'FREQ':\n outValue = RRule.FREQUENCIES[options.freq];\n break;\n case 'WKST':\n if (isNumber(value)) {\n outValue = new Weekday(value).toString();\n }\n else {\n outValue = value.toString();\n }\n break;\n case 'BYWEEKDAY':\n /*\n NOTE: BYWEEKDAY is a special case.\n RRule() deconstructs the rule.options.byweekday array\n into an array of Weekday arguments.\n On the other hand, rule.origOptions is an array of Weekdays.\n We need to handle both cases here.\n It might be worth change RRule to keep the Weekdays.\n \n Also, BYWEEKDAY (used by RRule) vs. BYDAY (RFC)\n \n */\n key = 'BYDAY';\n outValue = toArray(value)\n .map(function (wday) {\n if (wday instanceof Weekday) {\n return wday;\n }\n if (isArray(wday)) {\n return new Weekday(wday[0], wday[1]);\n }\n return new Weekday(wday);\n })\n .toString();\n break;\n case 'DTSTART':\n dtstart = buildDtstart(value, options.tzid);\n break;\n case 'UNTIL':\n outValue = timeToUntilString(value, !options.tzid);\n break;\n default:\n if (isArray(value)) {\n var strValues = [];\n for (var j = 0; j < value.length; j++) {\n strValues[j] = String(value[j]);\n }\n outValue = strValues.toString();\n }\n else {\n outValue = String(value);\n }\n }\n if (outValue) {\n rrule.push([key, outValue]);\n }\n }\n var rules = rrule\n .map(function (_a) {\n var key = _a[0], value = _a[1];\n return \"\".concat(key, \"=\").concat(value.toString());\n })\n .join(';');\n var ruleString = '';\n if (rules !== '') {\n ruleString = \"RRULE:\".concat(rules);\n }\n return [dtstart, ruleString].filter(function (x) { return !!x; }).join('\\n');\n}\nfunction buildDtstart(dtstart, tzid) {\n if (!dtstart) {\n return '';\n }\n return 'DTSTART' + new DateWithZone(new Date(dtstart), tzid).toString();\n}\n\n;// CONCATENATED MODULE: ./src/cache.ts\n\n\n\nfunction argsMatch(left, right) {\n if (Array.isArray(left)) {\n if (!Array.isArray(right))\n return false;\n if (left.length !== right.length)\n return false;\n return left.every(function (date, i) { return date.getTime() === right[i].getTime(); });\n }\n if (left instanceof Date) {\n return right instanceof Date && left.getTime() === right.getTime();\n }\n return left === right;\n}\nvar Cache = /** @class */ (function () {\n function Cache() {\n this.all = false;\n this.before = [];\n this.after = [];\n this.between = [];\n }\n /**\n * @param {String} what - all/before/after/between\n * @param {Array,Date} value - an array of dates, one date, or null\n * @param {Object?} args - _iter arguments\n */\n Cache.prototype._cacheAdd = function (what, value, args) {\n if (value) {\n value = value instanceof Date ? dateutil_clone(value) : cloneDates(value);\n }\n if (what === 'all') {\n this.all = value;\n }\n else {\n args._value = value;\n this[what].push(args);\n }\n };\n /**\n * @return false - not in the cache\n * @return null - cached, but zero occurrences (before/after)\n * @return Date - cached (before/after)\n * @return [] - cached, but zero occurrences (all/between)\n * @return [Date1, DateN] - cached (all/between)\n */\n Cache.prototype._cacheGet = function (what, args) {\n var cached = false;\n var argsKeys = args ? Object.keys(args) : [];\n var findCacheDiff = function (item) {\n for (var i = 0; i < argsKeys.length; i++) {\n var key = argsKeys[i];\n if (!argsMatch(args[key], item[key])) {\n return true;\n }\n }\n return false;\n };\n var cachedObject = this[what];\n if (what === 'all') {\n cached = this.all;\n }\n else if (isArray(cachedObject)) {\n // Let's see whether we've already called the\n // 'what' method with the same 'args'\n for (var i = 0; i < cachedObject.length; i++) {\n var item = cachedObject[i];\n if (argsKeys.length && findCacheDiff(item))\n continue;\n cached = item._value;\n break;\n }\n }\n if (!cached && this.all) {\n // Not in the cache, but we already know all the occurrences,\n // so we can find the correct dates from the cached ones.\n var iterResult = new iterresult(what, args);\n for (var i = 0; i < this.all.length; i++) {\n if (!iterResult.accept(this.all[i]))\n break;\n }\n cached = iterResult.getValue();\n this._cacheAdd(what, cached, args);\n }\n return isArray(cached)\n ? cloneDates(cached)\n : cached instanceof Date\n ? dateutil_clone(cached)\n : cached;\n };\n return Cache;\n}());\n\n\n;// CONCATENATED MODULE: ./src/masks.ts\n\n\n// =============================================================================\n// Date masks\n// =============================================================================\n// Every mask is 7 days longer to handle cross-year weekly periods.\nvar M365MASK = __spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray([], repeat(1, 31), true), repeat(2, 28), true), repeat(3, 31), true), repeat(4, 30), true), repeat(5, 31), true), repeat(6, 30), true), repeat(7, 31), true), repeat(8, 31), true), repeat(9, 30), true), repeat(10, 31), true), repeat(11, 30), true), repeat(12, 31), true), repeat(1, 7), true);\nvar M366MASK = __spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray([], repeat(1, 31), true), repeat(2, 29), true), repeat(3, 31), true), repeat(4, 30), true), repeat(5, 31), true), repeat(6, 30), true), repeat(7, 31), true), repeat(8, 31), true), repeat(9, 30), true), repeat(10, 31), true), repeat(11, 30), true), repeat(12, 31), true), repeat(1, 7), true);\nvar M28 = range(1, 29);\nvar M29 = range(1, 30);\nvar M30 = range(1, 31);\nvar M31 = range(1, 32);\nvar MDAY366MASK = __spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray([], M31, true), M29, true), M31, true), M30, true), M31, true), M30, true), M31, true), M31, true), M30, true), M31, true), M30, true), M31, true), M31.slice(0, 7), true);\nvar MDAY365MASK = __spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray([], M31, true), M28, true), M31, true), M30, true), M31, true), M30, true), M31, true), M31, true), M30, true), M31, true), M30, true), M31, true), M31.slice(0, 7), true);\nvar NM28 = range(-28, 0);\nvar NM29 = range(-29, 0);\nvar NM30 = range(-30, 0);\nvar NM31 = range(-31, 0);\nvar NMDAY366MASK = __spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray([], NM31, true), NM29, true), NM31, true), NM30, true), NM31, true), NM30, true), NM31, true), NM31, true), NM30, true), NM31, true), NM30, true), NM31, true), NM31.slice(0, 7), true);\nvar NMDAY365MASK = __spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray([], NM31, true), NM28, true), NM31, true), NM30, true), NM31, true), NM30, true), NM31, true), NM31, true), NM30, true), NM31, true), NM30, true), NM31, true), NM31.slice(0, 7), true);\nvar M366RANGE = [0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366];\nvar M365RANGE = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365];\nvar WDAYMASK = (function () {\n var wdaymask = [];\n for (var i = 0; i < 55; i++)\n wdaymask = wdaymask.concat(range(7));\n return wdaymask;\n})();\n\n\n;// CONCATENATED MODULE: ./src/iterinfo/yearinfo.ts\n\n\n\n\nfunction rebuildYear(year, options) {\n var firstyday = datetime(year, 1, 1);\n var yearlen = isLeapYear(year) ? 366 : 365;\n var nextyearlen = isLeapYear(year + 1) ? 366 : 365;\n var yearordinal = toOrdinal(firstyday);\n var yearweekday = getWeekday(firstyday);\n var result = __assign(__assign({ yearlen: yearlen, nextyearlen: nextyearlen, yearordinal: yearordinal, yearweekday: yearweekday }, baseYearMasks(year)), { wnomask: null });\n if (empty(options.byweekno)) {\n return result;\n }\n result.wnomask = repeat(0, yearlen + 7);\n var firstwkst;\n var wyearlen;\n var no1wkst = (firstwkst = pymod(7 - yearweekday + options.wkst, 7));\n if (no1wkst >= 4) {\n no1wkst = 0;\n // Number of days in the year, plus the days we got\n // from last year.\n wyearlen = result.yearlen + pymod(yearweekday - options.wkst, 7);\n }\n else {\n // Number of days in the year, minus the days we\n // left in last year.\n wyearlen = yearlen - no1wkst;\n }\n var div = Math.floor(wyearlen / 7);\n var mod = pymod(wyearlen, 7);\n var numweeks = Math.floor(div + mod / 4);\n for (var j = 0; j < options.byweekno.length; j++) {\n var n = options.byweekno[j];\n if (n < 0) {\n n += numweeks + 1;\n }\n if (!(n > 0 && n <= numweeks)) {\n continue;\n }\n var i = void 0;\n if (n > 1) {\n i = no1wkst + (n - 1) * 7;\n if (no1wkst !== firstwkst) {\n i -= 7 - firstwkst;\n }\n }\n else {\n i = no1wkst;\n }\n for (var k = 0; k < 7; k++) {\n result.wnomask[i] = 1;\n i++;\n if (result.wdaymask[i] === options.wkst)\n break;\n }\n }\n if (includes(options.byweekno, 1)) {\n // Check week number 1 of next year as well\n // orig-TODO : Check -numweeks for next year.\n var i = no1wkst + numweeks * 7;\n if (no1wkst !== firstwkst)\n i -= 7 - firstwkst;\n if (i < yearlen) {\n // If week starts in next year, we\n // don't care about it.\n for (var j = 0; j < 7; j++) {\n result.wnomask[i] = 1;\n i += 1;\n if (result.wdaymask[i] === options.wkst)\n break;\n }\n }\n }\n if (no1wkst) {\n // Check last week number of last year as\n // well. If no1wkst is 0, either the year\n // started on week start, or week number 1\n // got days from last year, so there are no\n // days from last year's last week number in\n // this year.\n var lnumweeks = void 0;\n if (!includes(options.byweekno, -1)) {\n var lyearweekday = getWeekday(datetime(year - 1, 1, 1));\n var lno1wkst = pymod(7 - lyearweekday.valueOf() + options.wkst, 7);\n var lyearlen = isLeapYear(year - 1) ? 366 : 365;\n var weekst = void 0;\n if (lno1wkst >= 4) {\n lno1wkst = 0;\n weekst = lyearlen + pymod(lyearweekday - options.wkst, 7);\n }\n else {\n weekst = yearlen - no1wkst;\n }\n lnumweeks = Math.floor(52 + pymod(weekst, 7) / 4);\n }\n else {\n lnumweeks = -1;\n }\n if (includes(options.byweekno, lnumweeks)) {\n for (var i = 0; i < no1wkst; i++)\n result.wnomask[i] = 1;\n }\n }\n return result;\n}\nfunction baseYearMasks(year) {\n var yearlen = isLeapYear(year) ? 366 : 365;\n var firstyday = datetime(year, 1, 1);\n var wday = getWeekday(firstyday);\n if (yearlen === 365) {\n return {\n mmask: M365MASK,\n mdaymask: MDAY365MASK,\n nmdaymask: NMDAY365MASK,\n wdaymask: WDAYMASK.slice(wday),\n mrange: M365RANGE,\n };\n }\n return {\n mmask: M366MASK,\n mdaymask: MDAY366MASK,\n nmdaymask: NMDAY366MASK,\n wdaymask: WDAYMASK.slice(wday),\n mrange: M366RANGE,\n };\n}\n\n;// CONCATENATED MODULE: ./src/iterinfo/monthinfo.ts\n\n\nfunction rebuildMonth(year, month, yearlen, mrange, wdaymask, options) {\n var result = {\n lastyear: year,\n lastmonth: month,\n nwdaymask: [],\n };\n var ranges = [];\n if (options.freq === RRule.YEARLY) {\n if (empty(options.bymonth)) {\n ranges = [[0, yearlen]];\n }\n else {\n for (var j = 0; j < options.bymonth.length; j++) {\n month = options.bymonth[j];\n ranges.push(mrange.slice(month - 1, month + 1));\n }\n }\n }\n else if (options.freq === RRule.MONTHLY) {\n ranges = [mrange.slice(month - 1, month + 1)];\n }\n if (empty(ranges)) {\n return result;\n }\n // Weekly frequency won't get here, so we may not\n // care about cross-year weekly periods.\n result.nwdaymask = repeat(0, yearlen);\n for (var j = 0; j < ranges.length; j++) {\n var rang = ranges[j];\n var first = rang[0];\n var last = rang[1] - 1;\n for (var k = 0; k < options.bynweekday.length; k++) {\n var i = void 0;\n var _a = options.bynweekday[k], wday = _a[0], n = _a[1];\n if (n < 0) {\n i = last + (n + 1) * 7;\n i -= pymod(wdaymask[i] - wday, 7);\n }\n else {\n i = first + (n - 1) * 7;\n i += pymod(7 - wdaymask[i] + wday, 7);\n }\n if (first <= i && i <= last)\n result.nwdaymask[i] = 1;\n }\n }\n return result;\n}\n\n;// CONCATENATED MODULE: ./src/iterinfo/easter.ts\nfunction easter(y, offset) {\n if (offset === void 0) { offset = 0; }\n var a = y % 19;\n var b = Math.floor(y / 100);\n var c = y % 100;\n var d = Math.floor(b / 4);\n var e = b % 4;\n var f = Math.floor((b + 8) / 25);\n var g = Math.floor((b - f + 1) / 3);\n var h = Math.floor(19 * a + b - d - g + 15) % 30;\n var i = Math.floor(c / 4);\n var k = c % 4;\n var l = Math.floor(32 + 2 * e + 2 * i - h - k) % 7;\n var m = Math.floor((a + 11 * h + 22 * l) / 451);\n var month = Math.floor((h + l - 7 * m + 114) / 31);\n var day = ((h + l - 7 * m + 114) % 31) + 1;\n var date = Date.UTC(y, month - 1, day + offset);\n var yearStart = Date.UTC(y, 0, 1);\n return [Math.ceil((date - yearStart) / (1000 * 60 * 60 * 24))];\n}\n\n;// CONCATENATED MODULE: ./src/iterinfo/index.ts\n\n\n\n\n\n\n\n// =============================================================================\n// Iterinfo\n// =============================================================================\nvar Iterinfo = /** @class */ (function () {\n // eslint-disable-next-line no-empty-function\n function Iterinfo(options) {\n this.options = options;\n }\n Iterinfo.prototype.rebuild = function (year, month) {\n var options = this.options;\n if (year !== this.lastyear) {\n this.yearinfo = rebuildYear(year, options);\n }\n if (notEmpty(options.bynweekday) &&\n (month !== this.lastmonth || year !== this.lastyear)) {\n var _a = this.yearinfo, yearlen = _a.yearlen, mrange = _a.mrange, wdaymask = _a.wdaymask;\n this.monthinfo = rebuildMonth(year, month, yearlen, mrange, wdaymask, options);\n }\n if (isPresent(options.byeaster)) {\n this.eastermask = easter(year, options.byeaster);\n }\n };\n Object.defineProperty(Iterinfo.prototype, \"lastyear\", {\n get: function () {\n return this.monthinfo ? this.monthinfo.lastyear : null;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Iterinfo.prototype, \"lastmonth\", {\n get: function () {\n return this.monthinfo ? this.monthinfo.lastmonth : null;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Iterinfo.prototype, \"yearlen\", {\n get: function () {\n return this.yearinfo.yearlen;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Iterinfo.prototype, \"yearordinal\", {\n get: function () {\n return this.yearinfo.yearordinal;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Iterinfo.prototype, \"mrange\", {\n get: function () {\n return this.yearinfo.mrange;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Iterinfo.prototype, \"wdaymask\", {\n get: function () {\n return this.yearinfo.wdaymask;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Iterinfo.prototype, \"mmask\", {\n get: function () {\n return this.yearinfo.mmask;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Iterinfo.prototype, \"wnomask\", {\n get: function () {\n return this.yearinfo.wnomask;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Iterinfo.prototype, \"nwdaymask\", {\n get: function () {\n return this.monthinfo ? this.monthinfo.nwdaymask : [];\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Iterinfo.prototype, \"nextyearlen\", {\n get: function () {\n return this.yearinfo.nextyearlen;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Iterinfo.prototype, \"mdaymask\", {\n get: function () {\n return this.yearinfo.mdaymask;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Iterinfo.prototype, \"nmdaymask\", {\n get: function () {\n return this.yearinfo.nmdaymask;\n },\n enumerable: false,\n configurable: true\n });\n Iterinfo.prototype.ydayset = function () {\n return [range(this.yearlen), 0, this.yearlen];\n };\n Iterinfo.prototype.mdayset = function (_, month) {\n var start = this.mrange[month - 1];\n var end = this.mrange[month];\n var set = repeat(null, this.yearlen);\n for (var i = start; i < end; i++)\n set[i] = i;\n return [set, start, end];\n };\n Iterinfo.prototype.wdayset = function (year, month, day) {\n // We need to handle cross-year weeks here.\n var set = repeat(null, this.yearlen + 7);\n var i = toOrdinal(datetime(year, month, day)) - this.yearordinal;\n var start = i;\n for (var j = 0; j < 7; j++) {\n set[i] = i;\n ++i;\n if (this.wdaymask[i] === this.options.wkst)\n break;\n }\n return [set, start, i];\n };\n Iterinfo.prototype.ddayset = function (year, month, day) {\n var set = repeat(null, this.yearlen);\n var i = toOrdinal(datetime(year, month, day)) - this.yearordinal;\n set[i] = i;\n return [set, i, i + 1];\n };\n Iterinfo.prototype.htimeset = function (hour, _, second, millisecond) {\n var _this = this;\n var set = [];\n this.options.byminute.forEach(function (minute) {\n set = set.concat(_this.mtimeset(hour, minute, second, millisecond));\n });\n sort(set);\n return set;\n };\n Iterinfo.prototype.mtimeset = function (hour, minute, _, millisecond) {\n var set = this.options.bysecond.map(function (second) { return new Time(hour, minute, second, millisecond); });\n sort(set);\n return set;\n };\n Iterinfo.prototype.stimeset = function (hour, minute, second, millisecond) {\n return [new Time(hour, minute, second, millisecond)];\n };\n Iterinfo.prototype.getdayset = function (freq) {\n switch (freq) {\n case Frequency.YEARLY:\n return this.ydayset.bind(this);\n case Frequency.MONTHLY:\n return this.mdayset.bind(this);\n case Frequency.WEEKLY:\n return this.wdayset.bind(this);\n case Frequency.DAILY:\n return this.ddayset.bind(this);\n default:\n return this.ddayset.bind(this);\n }\n };\n Iterinfo.prototype.gettimeset = function (freq) {\n switch (freq) {\n case Frequency.HOURLY:\n return this.htimeset.bind(this);\n case Frequency.MINUTELY:\n return this.mtimeset.bind(this);\n case Frequency.SECONDLY:\n return this.stimeset.bind(this);\n }\n };\n return Iterinfo;\n}());\n/* harmony default export */ const iterinfo = (Iterinfo);\n\n;// CONCATENATED MODULE: ./src/iter/poslist.ts\n\n\nfunction buildPoslist(bysetpos, timeset, start, end, ii, dayset) {\n var poslist = [];\n for (var j = 0; j < bysetpos.length; j++) {\n var daypos = void 0;\n var timepos = void 0;\n var pos = bysetpos[j];\n if (pos < 0) {\n daypos = Math.floor(pos / timeset.length);\n timepos = pymod(pos, timeset.length);\n }\n else {\n daypos = Math.floor((pos - 1) / timeset.length);\n timepos = pymod(pos - 1, timeset.length);\n }\n var tmp = [];\n for (var k = start; k < end; k++) {\n var val = dayset[k];\n if (!isPresent(val))\n continue;\n tmp.push(val);\n }\n var i = void 0;\n if (daypos < 0) {\n i = tmp.slice(daypos)[0];\n }\n else {\n i = tmp[daypos];\n }\n var time = timeset[timepos];\n var date = fromOrdinal(ii.yearordinal + i);\n var res = combine(date, time);\n // XXX: can this ever be in the array?\n // - compare the actual date instead?\n if (!includes(poslist, res))\n poslist.push(res);\n }\n sort(poslist);\n return poslist;\n}\n\n;// CONCATENATED MODULE: ./src/iter/index.ts\n\n\n\n\n\n\n\n\n\nfunction iter(iterResult, options) {\n var dtstart = options.dtstart, freq = options.freq, interval = options.interval, until = options.until, bysetpos = options.bysetpos;\n var count = options.count;\n if (count === 0 || interval === 0) {\n return emitResult(iterResult);\n }\n var counterDate = DateTime.fromDate(dtstart);\n var ii = new iterinfo(options);\n ii.rebuild(counterDate.year, counterDate.month);\n var timeset = makeTimeset(ii, counterDate, options);\n for (;;) {\n var _a = ii.getdayset(freq)(counterDate.year, counterDate.month, counterDate.day), dayset = _a[0], start = _a[1], end = _a[2];\n var filtered = removeFilteredDays(dayset, start, end, ii, options);\n if (notEmpty(bysetpos)) {\n var poslist = buildPoslist(bysetpos, timeset, start, end, ii, dayset);\n for (var j = 0; j < poslist.length; j++) {\n var res = poslist[j];\n if (until && res > until) {\n return emitResult(iterResult);\n }\n if (res >= dtstart) {\n var rezonedDate = rezoneIfNeeded(res, options);\n if (!iterResult.accept(rezonedDate)) {\n return emitResult(iterResult);\n }\n if (count) {\n --count;\n if (!count) {\n return emitResult(iterResult);\n }\n }\n }\n }\n }\n else {\n for (var j = start; j < end; j++) {\n var currentDay = dayset[j];\n if (!isPresent(currentDay)) {\n continue;\n }\n var date = fromOrdinal(ii.yearordinal + currentDay);\n for (var k = 0; k < timeset.length; k++) {\n var time = timeset[k];\n var res = combine(date, time);\n if (until && res > until) {\n return emitResult(iterResult);\n }\n if (res >= dtstart) {\n var rezonedDate = rezoneIfNeeded(res, options);\n if (!iterResult.accept(rezonedDate)) {\n return emitResult(iterResult);\n }\n if (count) {\n --count;\n if (!count) {\n return emitResult(iterResult);\n }\n }\n }\n }\n }\n }\n if (options.interval === 0) {\n return emitResult(iterResult);\n }\n // Handle frequency and interval\n counterDate.add(options, filtered);\n if (counterDate.year > MAXYEAR) {\n return emitResult(iterResult);\n }\n if (!freqIsDailyOrGreater(freq)) {\n timeset = ii.gettimeset(freq)(counterDate.hour, counterDate.minute, counterDate.second, 0);\n }\n ii.rebuild(counterDate.year, counterDate.month);\n }\n}\nfunction isFiltered(ii, currentDay, options) {\n var bymonth = options.bymonth, byweekno = options.byweekno, byweekday = options.byweekday, byeaster = options.byeaster, bymonthday = options.bymonthday, bynmonthday = options.bynmonthday, byyearday = options.byyearday;\n return ((notEmpty(bymonth) && !includes(bymonth, ii.mmask[currentDay])) ||\n (notEmpty(byweekno) && !ii.wnomask[currentDay]) ||\n (notEmpty(byweekday) && !includes(byweekday, ii.wdaymask[currentDay])) ||\n (notEmpty(ii.nwdaymask) && !ii.nwdaymask[currentDay]) ||\n (byeaster !== null && !includes(ii.eastermask, currentDay)) ||\n ((notEmpty(bymonthday) || notEmpty(bynmonthday)) &&\n !includes(bymonthday, ii.mdaymask[currentDay]) &&\n !includes(bynmonthday, ii.nmdaymask[currentDay])) ||\n (notEmpty(byyearday) &&\n ((currentDay < ii.yearlen &&\n !includes(byyearday, currentDay + 1) &&\n !includes(byyearday, -ii.yearlen + currentDay)) ||\n (currentDay >= ii.yearlen &&\n !includes(byyearday, currentDay + 1 - ii.yearlen) &&\n !includes(byyearday, -ii.nextyearlen + currentDay - ii.yearlen)))));\n}\nfunction rezoneIfNeeded(date, options) {\n return new DateWithZone(date, options.tzid).rezonedDate();\n}\nfunction emitResult(iterResult) {\n return iterResult.getValue();\n}\nfunction removeFilteredDays(dayset, start, end, ii, options) {\n var filtered = false;\n for (var dayCounter = start; dayCounter < end; dayCounter++) {\n var currentDay = dayset[dayCounter];\n filtered = isFiltered(ii, currentDay, options);\n if (filtered)\n dayset[currentDay] = null;\n }\n return filtered;\n}\nfunction makeTimeset(ii, counterDate, options) {\n var freq = options.freq, byhour = options.byhour, byminute = options.byminute, bysecond = options.bysecond;\n if (freqIsDailyOrGreater(freq)) {\n return buildTimeset(options);\n }\n if ((freq >= RRule.HOURLY &&\n notEmpty(byhour) &&\n !includes(byhour, counterDate.hour)) ||\n (freq >= RRule.MINUTELY &&\n notEmpty(byminute) &&\n !includes(byminute, counterDate.minute)) ||\n (freq >= RRule.SECONDLY &&\n notEmpty(bysecond) &&\n !includes(bysecond, counterDate.second))) {\n return [];\n }\n return ii.gettimeset(freq)(counterDate.hour, counterDate.minute, counterDate.second, counterDate.millisecond);\n}\n\n;// CONCATENATED MODULE: ./src/rrule.ts\n\n\n\n\n\n\n\n\n\n\n\n// =============================================================================\n// RRule\n// =============================================================================\nvar Days = {\n MO: new Weekday(0),\n TU: new Weekday(1),\n WE: new Weekday(2),\n TH: new Weekday(3),\n FR: new Weekday(4),\n SA: new Weekday(5),\n SU: new Weekday(6),\n};\nvar DEFAULT_OPTIONS = {\n freq: Frequency.YEARLY,\n dtstart: null,\n interval: 1,\n wkst: Days.MO,\n count: null,\n until: null,\n tzid: null,\n bysetpos: null,\n bymonth: null,\n bymonthday: null,\n bynmonthday: null,\n byyearday: null,\n byweekno: null,\n byweekday: null,\n bynweekday: null,\n byhour: null,\n byminute: null,\n bysecond: null,\n byeaster: null,\n};\nvar defaultKeys = Object.keys(DEFAULT_OPTIONS);\n/**\n *\n * @param {Options?} options - see <http://labix.org/python-dateutil/#head-cf004ee9a75592797e076752b2a889c10f445418>\n * - The only required option is `freq`, one of RRule.YEARLY, RRule.MONTHLY, ...\n * @constructor\n */\nvar RRule = /** @class */ (function () {\n function RRule(options, noCache) {\n if (options === void 0) { options = {}; }\n if (noCache === void 0) { noCache = false; }\n // RFC string\n this._cache = noCache ? null : new Cache();\n // used by toString()\n this.origOptions = initializeOptions(options);\n var parsedOptions = parseOptions(options).parsedOptions;\n this.options = parsedOptions;\n }\n RRule.parseText = function (text, language) {\n return parseText(text, language);\n };\n RRule.fromText = function (text, language) {\n return fromText(text, language);\n };\n RRule.fromString = function (str) {\n return new RRule(RRule.parseString(str) || undefined);\n };\n RRule.prototype._iter = function (iterResult) {\n return iter(iterResult, this.options);\n };\n RRule.prototype._cacheGet = function (what, args) {\n if (!this._cache)\n return false;\n return this._cache._cacheGet(what, args);\n };\n RRule.prototype._cacheAdd = function (what, value, args) {\n if (!this._cache)\n return;\n return this._cache._cacheAdd(what, value, args);\n };\n /**\n * @param {Function} iterator - optional function that will be called\n * on each date that is added. It can return false\n * to stop the iteration.\n * @return Array containing all recurrences.\n */\n RRule.prototype.all = function (iterator) {\n if (iterator) {\n return this._iter(new callbackiterresult('all', {}, iterator));\n }\n var result = this._cacheGet('all');\n if (result === false) {\n result = this._iter(new iterresult('all', {}));\n this._cacheAdd('all', result);\n }\n return result;\n };\n /**\n * Returns all the occurrences of the rrule between after and before.\n * The inc keyword defines what happens if after and/or before are\n * themselves occurrences. With inc == True, they will be included in the\n * list, if they are found in the recurrence set.\n *\n * @return Array\n */\n RRule.prototype.between = function (after, before, inc, iterator) {\n if (inc === void 0) { inc = false; }\n if (!isValidDate(after) || !isValidDate(before)) {\n throw new Error('Invalid date passed in to RRule.between');\n }\n var args = {\n before: before,\n after: after,\n inc: inc,\n };\n if (iterator) {\n return this._iter(new callbackiterresult('between', args, iterator));\n }\n var result = this._cacheGet('between', args);\n if (result === false) {\n result = this._iter(new iterresult('between', args));\n this._cacheAdd('between', result, args);\n }\n return result;\n };\n /**\n * Returns the last recurrence before the given datetime instance.\n * The inc keyword defines what happens if dt is an occurrence.\n * With inc == True, if dt itself is an occurrence, it will be returned.\n *\n * @return Date or null\n */\n RRule.prototype.before = function (dt, inc) {\n if (inc === void 0) { inc = false; }\n if (!isValidDate(dt)) {\n throw new Error('Invalid date passed in to RRule.before');\n }\n var args = { dt: dt, inc: inc };\n var result = this._cacheGet('before', args);\n if (result === false) {\n result = this._iter(new iterresult('before', args));\n this._cacheAdd('before', result, args);\n }\n return result;\n };\n /**\n * Returns the first recurrence after the given datetime instance.\n * The inc keyword defines what happens if dt is an occurrence.\n * With inc == True, if dt itself is an occurrence, it will be returned.\n *\n * @return Date or null\n */\n RRule.prototype.after = function (dt, inc) {\n if (inc === void 0) { inc = false; }\n if (!isValidDate(dt)) {\n throw new Error('Invalid date passed in to RRule.after');\n }\n var args = { dt: dt, inc: inc };\n var result = this._cacheGet('after', args);\n if (result === false) {\n result = this._iter(new iterresult('after', args));\n this._cacheAdd('after', result, args);\n }\n return result;\n };\n /**\n * Returns the number of recurrences in this set. It will have go trough\n * the whole recurrence, if this hasn't been done before.\n */\n RRule.prototype.count = function () {\n return this.all().length;\n };\n /**\n * Converts the rrule into its string representation\n *\n * @see <http://www.ietf.org/rfc/rfc2445.txt>\n * @return String\n */\n RRule.prototype.toString = function () {\n return optionsToString(this.origOptions);\n };\n /**\n * Will convert all rules described in nlp:ToText\n * to text.\n */\n RRule.prototype.toText = function (gettext, language, dateFormatter) {\n return toText(this, gettext, language, dateFormatter);\n };\n RRule.prototype.isFullyConvertibleToText = function () {\n return isFullyConvertible(this);\n };\n /**\n * @return a RRule instance with the same freq and options\n * as this one (cache is not cloned)\n */\n RRule.prototype.clone = function () {\n return new RRule(this.origOptions);\n };\n // RRule class 'constants'\n RRule.FREQUENCIES = [\n 'YEARLY',\n 'MONTHLY',\n 'WEEKLY',\n 'DAILY',\n 'HOURLY',\n 'MINUTELY',\n 'SECONDLY',\n ];\n RRule.YEARLY = Frequency.YEARLY;\n RRule.MONTHLY = Frequency.MONTHLY;\n RRule.WEEKLY = Frequency.WEEKLY;\n RRule.DAILY = Frequency.DAILY;\n RRule.HOURLY = Frequency.HOURLY;\n RRule.MINUTELY = Frequency.MINUTELY;\n RRule.SECONDLY = Frequency.SECONDLY;\n RRule.MO = Days.MO;\n RRule.TU = Days.TU;\n RRule.WE = Days.WE;\n RRule.TH = Days.TH;\n RRule.FR = Days.FR;\n RRule.SA = Days.SA;\n RRule.SU = Days.SU;\n RRule.parseString = parseString;\n RRule.optionsToString = optionsToString;\n return RRule;\n}());\n\n\n;// CONCATENATED MODULE: ./src/iterset.ts\n\n\n\nfunction iterSet(iterResult, _rrule, _exrule, _rdate, _exdate, tzid) {\n var _exdateHash = {};\n var _accept = iterResult.accept;\n function evalExdate(after, before) {\n _exrule.forEach(function (rrule) {\n rrule.between(after, before, true).forEach(function (date) {\n _exdateHash[Number(date)] = true;\n });\n });\n }\n _exdate.forEach(function (date) {\n var zonedDate = new DateWithZone(date, tzid).rezonedDate();\n _exdateHash[Number(zonedDate)] = true;\n });\n iterResult.accept = function (date) {\n var dt = Number(date);\n if (isNaN(dt))\n return _accept.call(this, date);\n if (!_exdateHash[dt]) {\n evalExdate(new Date(dt - 1), new Date(dt + 1));\n if (!_exdateHash[dt]) {\n _exdateHash[dt] = true;\n return _accept.call(this, date);\n }\n }\n return true;\n };\n if (iterResult.method === 'between') {\n evalExdate(iterResult.args.after, iterResult.args.before);\n iterResult.accept = function (date) {\n var dt = Number(date);\n if (!_exdateHash[dt]) {\n _exdateHash[dt] = true;\n return _accept.call(this, date);\n }\n return true;\n };\n }\n for (var i = 0; i < _rdate.length; i++) {\n var zonedDate = new DateWithZone(_rdate[i], tzid).rezonedDate();\n if (!iterResult.accept(new Date(zonedDate.getTime())))\n break;\n }\n _rrule.forEach(function (rrule) {\n iter(iterResult, rrule.options);\n });\n var res = iterResult._result;\n sort(res);\n switch (iterResult.method) {\n case 'all':\n case 'between':\n return res;\n case 'before':\n return ((res.length && res[res.length - 1]) || null);\n case 'after':\n default:\n return ((res.length && res[0]) || null);\n }\n}\n\n;// CONCATENATED MODULE: ./src/rrulestr.ts\n\n\n\n\n\n\n/**\n * RRuleStr\n * To parse a set of rrule strings\n */\nvar rrulestr_DEFAULT_OPTIONS = {\n dtstart: null,\n cache: false,\n unfold: false,\n forceset: false,\n compatible: false,\n tzid: null,\n};\nfunction parseInput(s, options) {\n var rrulevals = [];\n var rdatevals = [];\n var exrulevals = [];\n var exdatevals = [];\n var parsedDtstart = parseDtstart(s);\n var dtstart = parsedDtstart.dtstart;\n var tzid = parsedDtstart.tzid;\n var lines = splitIntoLines(s, options.unfold);\n lines.forEach(function (line) {\n var _a;\n if (!line)\n return;\n var _b = breakDownLine(line), name = _b.name, parms = _b.parms, value = _b.value;\n switch (name.toUpperCase()) {\n case 'RRULE':\n if (parms.length) {\n throw new Error(\"unsupported RRULE parm: \".concat(parms.join(',')));\n }\n rrulevals.push(parseString(line));\n break;\n case 'RDATE':\n var _c = (_a = /RDATE(?:;TZID=([^:=]+))?/i.exec(line)) !== null && _a !== void 0 ? _a : [], rdateTzid = _c[1];\n if (rdateTzid && !tzid) {\n tzid = rdateTzid;\n }\n rdatevals = rdatevals.concat(parseRDate(value, parms));\n break;\n case 'EXRULE':\n if (parms.length) {\n throw new Error(\"unsupported EXRULE parm: \".concat(parms.join(',')));\n }\n exrulevals.push(parseString(value));\n break;\n case 'EXDATE':\n exdatevals = exdatevals.concat(parseRDate(value, parms));\n break;\n case 'DTSTART':\n break;\n default:\n throw new Error('unsupported property: ' + name);\n }\n });\n return {\n dtstart: dtstart,\n tzid: tzid,\n rrulevals: rrulevals,\n rdatevals: rdatevals,\n exrulevals: exrulevals,\n exdatevals: exdatevals,\n };\n}\nfunction buildRule(s, options) {\n var _a = parseInput(s, options), rrulevals = _a.rrulevals, rdatevals = _a.rdatevals, exrulevals = _a.exrulevals, exdatevals = _a.exdatevals, dtstart = _a.dtstart, tzid = _a.tzid;\n var noCache = options.cache === false;\n if (options.compatible) {\n options.forceset = true;\n options.unfold = true;\n }\n if (options.forceset ||\n rrulevals.length > 1 ||\n rdatevals.length ||\n exrulevals.length ||\n exdatevals.length) {\n var rset_1 = new RRuleSet(noCache);\n rset_1.dtstart(dtstart);\n rset_1.tzid(tzid || undefined);\n rrulevals.forEach(function (val) {\n rset_1.rrule(new RRule(groomRruleOptions(val, dtstart, tzid), noCache));\n });\n rdatevals.forEach(function (date) {\n rset_1.rdate(date);\n });\n exrulevals.forEach(function (val) {\n rset_1.exrule(new RRule(groomRruleOptions(val, dtstart, tzid), noCache));\n });\n exdatevals.forEach(function (date) {\n rset_1.exdate(date);\n });\n if (options.compatible && options.dtstart)\n rset_1.rdate(dtstart);\n return rset_1;\n }\n var val = rrulevals[0] || {};\n return new RRule(groomRruleOptions(val, val.dtstart || options.dtstart || dtstart, val.tzid || options.tzid || tzid), noCache);\n}\nfunction rrulestr(s, options) {\n if (options === void 0) { options = {}; }\n return buildRule(s, rrulestr_initializeOptions(options));\n}\nfunction groomRruleOptions(val, dtstart, tzid) {\n return __assign(__assign({}, val), { dtstart: dtstart, tzid: tzid });\n}\nfunction rrulestr_initializeOptions(options) {\n var invalid = [];\n var keys = Object.keys(options);\n var defaultKeys = Object.keys(rrulestr_DEFAULT_OPTIONS);\n keys.forEach(function (key) {\n if (!includes(defaultKeys, key))\n invalid.push(key);\n });\n if (invalid.length) {\n throw new Error('Invalid options: ' + invalid.join(', '));\n }\n return __assign(__assign({}, rrulestr_DEFAULT_OPTIONS), options);\n}\nfunction extractName(line) {\n if (line.indexOf(':') === -1) {\n return {\n name: 'RRULE',\n value: line,\n };\n }\n var _a = split(line, ':', 1), name = _a[0], value = _a[1];\n return {\n name: name,\n value: value,\n };\n}\nfunction breakDownLine(line) {\n var _a = extractName(line), name = _a.name, value = _a.value;\n var parms = name.split(';');\n if (!parms)\n throw new Error('empty property name');\n return {\n name: parms[0].toUpperCase(),\n parms: parms.slice(1),\n value: value,\n };\n}\nfunction splitIntoLines(s, unfold) {\n if (unfold === void 0) { unfold = false; }\n s = s && s.trim();\n if (!s)\n throw new Error('Invalid empty string');\n // More info about 'unfold' option\n // Go head to http://www.ietf.org/rfc/rfc2445.txt\n if (!unfold) {\n return s.split(/\\s/);\n }\n var lines = s.split('\\n');\n var i = 0;\n while (i < lines.length) {\n // TODO\n var line = (lines[i] = lines[i].replace(/\\s+$/g, ''));\n if (!line) {\n lines.splice(i, 1);\n }\n else if (i > 0 && line[0] === ' ') {\n lines[i - 1] += line.slice(1);\n lines.splice(i, 1);\n }\n else {\n i += 1;\n }\n }\n return lines;\n}\nfunction validateDateParm(parms) {\n parms.forEach(function (parm) {\n if (!/(VALUE=DATE(-TIME)?)|(TZID=)/.test(parm)) {\n throw new Error('unsupported RDATE/EXDATE parm: ' + parm);\n }\n });\n}\nfunction parseRDate(rdateval, parms) {\n validateDateParm(parms);\n return rdateval.split(',').map(function (datestr) { return untilStringToDate(datestr); });\n}\n\n;// CONCATENATED MODULE: ./src/rruleset.ts\n\n\n\n\n\n\n\nfunction createGetterSetter(fieldName) {\n var _this = this;\n return function (field) {\n if (field !== undefined) {\n _this[\"_\".concat(fieldName)] = field;\n }\n if (_this[\"_\".concat(fieldName)] !== undefined) {\n return _this[\"_\".concat(fieldName)];\n }\n for (var i = 0; i < _this._rrule.length; i++) {\n var field_1 = _this._rrule[i].origOptions[fieldName];\n if (field_1) {\n return field_1;\n }\n }\n };\n}\nvar RRuleSet = /** @class */ (function (_super) {\n __extends(RRuleSet, _super);\n /**\n *\n * @param {Boolean?} noCache\n * The same stratagy as RRule on cache, default to false\n * @constructor\n */\n function RRuleSet(noCache) {\n if (noCache === void 0) { noCache = false; }\n var _this = _super.call(this, {}, noCache) || this;\n _this.dtstart = createGetterSetter.apply(_this, ['dtstart']);\n _this.tzid = createGetterSetter.apply(_this, ['tzid']);\n _this._rrule = [];\n _this._rdate = [];\n _this._exrule = [];\n _this._exdate = [];\n return _this;\n }\n RRuleSet.prototype._iter = function (iterResult) {\n return iterSet(iterResult, this._rrule, this._exrule, this._rdate, this._exdate, this.tzid());\n };\n /**\n * Adds an RRule to the set\n *\n * @param {RRule}\n */\n RRuleSet.prototype.rrule = function (rrule) {\n _addRule(rrule, this._rrule);\n };\n /**\n * Adds an EXRULE to the set\n *\n * @param {RRule}\n */\n RRuleSet.prototype.exrule = function (rrule) {\n _addRule(rrule, this._exrule);\n };\n /**\n * Adds an RDate to the set\n *\n * @param {Date}\n */\n RRuleSet.prototype.rdate = function (date) {\n _addDate(date, this._rdate);\n };\n /**\n * Adds an EXDATE to the set\n *\n * @param {Date}\n */\n RRuleSet.prototype.exdate = function (date) {\n _addDate(date, this._exdate);\n };\n /**\n * Get list of included rrules in this recurrence set.\n *\n * @return List of rrules\n */\n RRuleSet.prototype.rrules = function () {\n return this._rrule.map(function (e) { return rrulestr(e.toString()); });\n };\n /**\n * Get list of excluded rrules in this recurrence set.\n *\n * @return List of exrules\n */\n RRuleSet.prototype.exrules = function () {\n return this._exrule.map(function (e) { return rrulestr(e.toString()); });\n };\n /**\n * Get list of included datetimes in this recurrence set.\n *\n * @return List of rdates\n */\n RRuleSet.prototype.rdates = function () {\n return this._rdate.map(function (e) { return new Date(e.getTime()); });\n };\n /**\n * Get list of included datetimes in this recurrence set.\n *\n * @return List of exdates\n */\n RRuleSet.prototype.exdates = function () {\n return this._exdate.map(function (e) { return new Date(e.getTime()); });\n };\n RRuleSet.prototype.valueOf = function () {\n var result = [];\n if (!this._rrule.length && this._dtstart) {\n result = result.concat(optionsToString({ dtstart: this._dtstart }));\n }\n this._rrule.forEach(function (rrule) {\n result = result.concat(rrule.toString().split('\\n'));\n });\n this._exrule.forEach(function (exrule) {\n result = result.concat(exrule\n .toString()\n .split('\\n')\n .map(function (line) { return line.replace(/^RRULE:/, 'EXRULE:'); })\n .filter(function (line) { return !/^DTSTART/.test(line); }));\n });\n if (this._rdate.length) {\n result.push(rdatesToString('RDATE', this._rdate, this.tzid()));\n }\n if (this._exdate.length) {\n result.push(rdatesToString('EXDATE', this._exdate, this.tzid()));\n }\n return result;\n };\n /**\n * to generate recurrence field such as:\n * DTSTART:19970902T010000Z\n * RRULE:FREQ=YEARLY;COUNT=2;BYDAY=TU\n * RRULE:FREQ=YEARLY;COUNT=1;BYDAY=TH\n */\n RRuleSet.prototype.toString = function () {\n return this.valueOf().join('\\n');\n };\n /**\n * Create a new RRuleSet Object completely base on current instance\n */\n RRuleSet.prototype.clone = function () {\n var rrs = new RRuleSet(!!this._cache);\n this._rrule.forEach(function (rule) { return rrs.rrule(rule.clone()); });\n this._exrule.forEach(function (rule) { return rrs.exrule(rule.clone()); });\n this._rdate.forEach(function (date) { return rrs.rdate(new Date(date.getTime())); });\n this._exdate.forEach(function (date) { return rrs.exdate(new Date(date.getTime())); });\n return rrs;\n };\n return RRuleSet;\n}(RRule));\n\nfunction _addRule(rrule, collection) {\n if (!(rrule instanceof RRule)) {\n throw new TypeError(String(rrule) + ' is not RRule instance');\n }\n if (!includes(collection.map(String), String(rrule))) {\n collection.push(rrule);\n }\n}\nfunction _addDate(date, collection) {\n if (!(date instanceof Date)) {\n throw new TypeError(String(date) + ' is not Date instance');\n }\n if (!includes(collection.map(Number), Number(date))) {\n collection.push(date);\n sort(collection);\n }\n}\nfunction rdatesToString(param, rdates, tzid) {\n var isUTC = !tzid || tzid.toUpperCase() === 'UTC';\n var header = isUTC ? \"\".concat(param, \":\") : \"\".concat(param, \";TZID=\").concat(tzid, \":\");\n var dateString = rdates\n .map(function (rdate) { return timeToUntilString(rdate.valueOf(), isUTC); })\n .join(',');\n return \"\".concat(header).concat(dateString);\n}\n\n;// CONCATENATED MODULE: ./src/index.ts\n/* !\n * rrule.js - Library for working with recurrence rules for calendar dates.\n * https://github.com/jakubroztocil/rrule\n *\n * Copyright 2010, Jakub Roztocil and Lars Schoning\n * Licenced under the BSD licence.\n * https://github.com/jakubroztocil/rrule/blob/master/LICENCE\n *\n * Based on:\n * python-dateutil - Extensions to the standard Python datetime module.\n * Copyright (c) 2003-2011 - Gustavo Niemeyer <gustavo@niemeyer.net>\n * Copyright (c) 2012 - Tomi Pieviläinen <tomi.pievilainen@iki.fi>\n * https://github.com/jakubroztocil/rrule/blob/master/LICENCE\n *\n */\n\n\n\n\n\n\n\n/******/ \treturn __webpack_exports__;\n/******/ })()\n;\n});","import {\n dateOnlyPartsToEpoch,\n epochToDateOnlyParts,\n formatDateOnlyParts,\n isValidDateOnlyParts,\n} from \"../date-codecs\";\nimport type { DateOnlyParts } from \"../date-codecs\";\n\nconst PACKED_DATE_MULTIPLIER = 128;\nconst PACKED_DATE_DAY_MASK = 0b1_1111;\nconst PACKED_DATE_MONTH_MASK = 0b1111;\nconst PACKED_DATE_MONTH_SHIFT = 5;\nconst PACKED_DATE_YEAR_SHIFT = 9;\nconst THINGS_REMINDER_HOUR_SCALE = 67_108_864;\n\ntype ThingsPackedDateParts = DateOnlyParts;\n\nconst isFiniteNumber = (value: number | null): value is number =>\n typeof value === \"number\" && Number.isFinite(value);\n\nconst isValidPackedDate = (parts: ThingsPackedDateParts): boolean =>\n isValidDateOnlyParts(parts);\n\nconst formatFloatingDate = (\n parts: ThingsPackedDateParts | null\n): string | null => {\n const formatted = parts ? formatDateOnlyParts(parts) : null;\n return formatted ? `${formatted.replaceAll(\"-\", \"\")}T000000` : null;\n};\n\nconst dateOnlyEpochToLocalMidnightInstant = (\n epochMs: number | null\n): number | null => {\n const parts = epochToDateOnlyParts(epochMs);\n\n if (!parts) {\n return null;\n }\n\n return new Date(parts.year, parts.month - 1, parts.day).getTime();\n};\n\nexport const decodeThingsPackedDateParts = (\n value: number | null\n): ThingsPackedDateParts | null => {\n if (!isFiniteNumber(value)) {\n return null;\n }\n\n const integer = Math.trunc(value);\n\n if (integer <= 0 || integer % PACKED_DATE_MULTIPLIER !== 0) {\n return null;\n }\n\n const packed = integer / PACKED_DATE_MULTIPLIER;\n const day = packed % (PACKED_DATE_DAY_MASK + 1);\n const month =\n Math.trunc(packed / 2 ** PACKED_DATE_MONTH_SHIFT) %\n (PACKED_DATE_MONTH_MASK + 1);\n const year = Math.trunc(packed / 2 ** PACKED_DATE_YEAR_SHIFT);\n const parts = {\n day,\n month,\n year,\n };\n\n return isValidPackedDate(parts) ? parts : null;\n};\n\nexport const decodeThingsPackedDate = (value: number | null): number | null => {\n const parts = decodeThingsPackedDateParts(value);\n\n if (!parts) {\n return null;\n }\n\n return dateOnlyPartsToEpoch(parts);\n};\n\nexport const decodeThingsPackedCalendarDate = (\n value: number | null,\n _timeZone: string | null\n): number | null => decodeThingsPackedDate(value);\n\nexport const formatThingsPackedDateAsFloatingDate = (\n value: number | null\n): string | null => formatFloatingDate(decodeThingsPackedDateParts(value));\n\nexport const formatThingsUnixDateAsFloatingDate = (\n value: number | null\n): string | null =>\n formatFloatingDate(epochToDateOnlyParts(decodeThingsUnixSeconds(value)));\n\nexport const decodeThingsUnixSeconds = (\n value: number | null\n): number | null => {\n if (!isFiniteNumber(value)) {\n return null;\n }\n\n return Math.round(value * 1000);\n};\n\nexport const decodeThingsUnixCalendarDate = (\n value: number | null,\n _timeZone: string | null\n): number | null => {\n const epochMs = decodeThingsUnixSeconds(value);\n\n if (epochMs === null) {\n return null;\n }\n\n const parts = epochToDateOnlyParts(epochMs);\n return parts ? dateOnlyPartsToEpoch(parts) : null;\n};\n\nexport const decodeThingsReminderOffset = (\n value: number | null\n): number | null => {\n if (!isFiniteNumber(value) || value < 0) {\n return null;\n }\n\n return Math.round((value / THINGS_REMINDER_HOUR_SCALE) * 60 * 60 * 1000);\n};\n\nexport const combineThingsReminderAt = (options: {\n reminderTime: number | null;\n startDate: number | null;\n nextStartDate?: number | null;\n deadlineDate?: number | null;\n}): number | null => {\n const offset = decodeThingsReminderOffset(options.reminderTime);\n const baseDate =\n options.startDate ?? options.nextStartDate ?? options.deadlineDate ?? null;\n\n if (offset === null || baseDate === null) {\n return null;\n }\n\n const baseInstant = dateOnlyEpochToLocalMidnightInstant(baseDate);\n return baseInstant === null ? null : baseInstant + offset;\n};\n","import {\n calendarDateToUtcEpoch,\n getCalendarDatePartsInTimeZone,\n getUtcCalendarDateParts,\n getUtcCalendarDayEndEpoch,\n resolveTimeZoneOrNull,\n} from \"@donebear/date-tz\";\nimport { RRule, rrulestr } from \"rrule\";\n\nimport type { ThingsTaskRecord } from \"./things-mapper\";\nimport {\n decodeThingsPackedCalendarDate,\n decodeThingsUnixCalendarDate,\n decodeThingsUnixSeconds,\n formatThingsPackedDateAsFloatingDate,\n formatThingsUnixDateAsFloatingDate,\n} from \"./things-values\";\n\nconst THINGS_FREQUENCY_TO_RRULE = new Map<number, string>([\n [4, \"YEARLY\"],\n [8, \"MONTHLY\"],\n [16, \"DAILY\"],\n [256, \"WEEKLY\"],\n]);\n\nconst THINGS_WEEKDAY_TO_RRULE = [\n \"SU\",\n \"MO\",\n \"TU\",\n \"WE\",\n \"TH\",\n \"FR\",\n \"SA\",\n] as const;\n\ninterface ThingsRecurrenceOffset {\n wd?: number;\n dy?: number;\n}\n\ninterface ThingsRecurrenceDefinition {\n ia: number | null;\n sr: number | null;\n ed: number | null;\n rc: number | null;\n fu: number | null;\n fa: number | null;\n tp: number | null;\n ts: number | null;\n offsets: ThingsRecurrenceOffset[];\n}\n\ninterface ThingsRepeatTemplateFields {\n repeatRule: string;\n repeatType: \"fixed\" | \"after_completion\";\n repeatStatus: \"active\" | \"paused\";\n repeatNextAt: number | null;\n currentInstanceDate: number | null;\n recurrence: ThingsRecurrenceDefinition;\n}\n\nconst parseNumericPlistField = (xml: string, key: string): number | null => {\n const match = new RegExp(\n `<key>${key}</key>\\\\s*<(integer|real)>([^<]+)</\\\\1>`,\n \"u\"\n ).exec(xml);\n\n if (!match?.[2]) {\n return null;\n }\n\n const parsed = Number(match[2]);\n return Number.isFinite(parsed) ? parsed : null;\n};\n\nconst PLIST_OFFSETS_ARRAY_PATTERN =\n /<key>of<\\/key>\\s*<array>([\\s\\S]*?)<\\/array>/u;\n\nconst parseOffsets = (xml: string): ThingsRecurrenceOffset[] => {\n const arrayMatch = PLIST_OFFSETS_ARRAY_PATTERN.exec(xml);\n\n if (!arrayMatch?.[1]) {\n return [];\n }\n\n const offsets: ThingsRecurrenceOffset[] = [];\n\n for (const dictMatch of arrayMatch[1].matchAll(\n /<dict>([\\s\\S]*?)<\\/dict>/gu\n )) {\n const [, fragment] = dictMatch;\n\n if (!fragment) {\n continue;\n }\n\n const weekday = parseNumericPlistField(fragment, \"wd\");\n const monthDay = parseNumericPlistField(fragment, \"dy\");\n\n offsets.push({\n dy: monthDay ?? undefined,\n wd: weekday ?? undefined,\n });\n }\n\n return offsets;\n};\n\nconst parseRRule = (rule: string): InstanceType<typeof RRule> | null => {\n try {\n const parsed = rrulestr(rule);\n return parsed instanceof RRule ? parsed : null;\n } catch {\n return null;\n }\n};\n\nconst buildByDayTokens = (definition: ThingsRecurrenceDefinition): string[] => {\n const tokens = definition.offsets\n .map((offset) =>\n typeof offset.wd === \"number\"\n ? (THINGS_WEEKDAY_TO_RRULE[offset.wd] ?? null)\n : null\n )\n .filter(\n (value): value is (typeof THINGS_WEEKDAY_TO_RRULE)[number] =>\n value !== null\n );\n\n if (tokens.length > 0) {\n return tokens;\n }\n\n if (definition.ia === null) {\n return [];\n }\n\n const weekday = new Date(definition.ia * 1000).getUTCDay();\n return [THINGS_WEEKDAY_TO_RRULE[weekday] ?? \"MO\"];\n};\n\nconst buildMonthDays = (definition: ThingsRecurrenceDefinition): number[] => {\n const monthDays = definition.offsets\n .map((offset) =>\n typeof offset.dy === \"number\" ? Math.trunc(offset.dy) + 1 : null\n )\n .filter((value): value is number => value !== null && value >= 1);\n\n if (monthDays.length > 0) {\n return monthDays;\n }\n\n if (definition.ia === null) {\n return [];\n }\n\n return [new Date(definition.ia * 1000).getUTCDate()];\n};\n\nconst buildAnchor = (\n definition: ThingsRecurrenceDefinition,\n task: ThingsTaskRecord,\n timeZone: string | null\n): string | null => {\n const anchor =\n formatThingsUnixDateAsFloatingDate(definition.ia) ??\n formatThingsUnixDateAsFloatingDate(definition.sr) ??\n formatThingsPackedDateAsFloatingDate(task.nextInstanceStartDate) ??\n formatThingsPackedDateAsFloatingDate(task.startDate) ??\n formatThingsPackedDateAsFloatingDate(task.instanceCreationStartDate) ??\n null;\n\n if (!anchor) {\n return null;\n }\n\n if (!timeZone) {\n return `DTSTART:${anchor}`;\n }\n\n return `DTSTART;TZID=${timeZone}:${anchor}`;\n};\n\nconst buildRepeatRule = (\n definition: ThingsRecurrenceDefinition,\n task: ThingsTaskRecord,\n timeZone: string | null\n): string | null => {\n const frequency =\n definition.fu === null\n ? null\n : (THINGS_FREQUENCY_TO_RRULE.get(definition.fu) ?? null);\n\n if (!frequency) {\n return null;\n }\n\n const parts = [`FREQ=${frequency}`];\n const interval =\n definition.fa !== null && definition.fa > 0 ? Math.trunc(definition.fa) : 1;\n\n if (interval > 1) {\n parts.push(`INTERVAL=${interval}`);\n }\n\n if (frequency === \"WEEKLY\") {\n const byDayTokens = buildByDayTokens(definition);\n\n if (byDayTokens.length > 0) {\n parts.push(`BYDAY=${byDayTokens.join(\",\")}`);\n }\n }\n\n if (frequency === \"MONTHLY\") {\n const monthDays = buildMonthDays(definition);\n\n if (monthDays.length > 0) {\n parts.push(`BYMONTHDAY=${monthDays.join(\",\")}`);\n }\n }\n\n if (frequency === \"YEARLY\" && definition.ia !== null) {\n const anchor = new Date(definition.ia * 1000);\n parts.push(`BYMONTH=${anchor.getUTCMonth() + 1}`);\n parts.push(`BYMONTHDAY=${anchor.getUTCDate()}`);\n }\n\n const anchor = buildAnchor(definition, task, timeZone);\n\n if (!anchor) {\n return `RRULE:${parts.join(\";\")}`;\n }\n\n return `${anchor}\\nRRULE:${parts.join(\";\")}`;\n};\n\nconst getRuleTimeZone = (rule: InstanceType<typeof RRule>): string | null =>\n resolveTimeZoneOrNull(\n typeof rule.origOptions.tzid === \"string\" ? rule.origOptions.tzid : null\n );\n\nconst getOccurrenceCalendarParts = (\n occurrence: Date,\n timeZone: string | null\n) =>\n timeZone\n ? getCalendarDatePartsInTimeZone(occurrence, timeZone)\n : getUtcCalendarDateParts(occurrence);\n\nconst normalizeOccurrenceEpoch = (\n occurrence: Date,\n timeZone: string | null\n): number =>\n calendarDateToUtcEpoch(getOccurrenceCalendarParts(occurrence, timeZone));\n\nconst calculateNextOccurrence = (\n repeatRule: string,\n currentInstanceDate: number | null\n): number | null => {\n if (currentInstanceDate === null) {\n return null;\n }\n\n const parsed = parseRRule(repeatRule);\n\n if (!parsed) {\n return null;\n }\n\n const timeZone = getRuleTimeZone(parsed);\n const comparisonDate = new Date(\n getUtcCalendarDayEndEpoch(new Date(currentInstanceDate))\n );\n const next = parsed.after(comparisonDate, false);\n\n return next ? normalizeOccurrenceEpoch(next, timeZone) : null;\n};\n\nconst parseThingsRecurrenceDefinition = (\n xml: string | null\n): ThingsRecurrenceDefinition | null => {\n if (typeof xml !== \"string\" || xml.trim().length === 0) {\n return null;\n }\n\n const definition: ThingsRecurrenceDefinition = {\n ed: parseNumericPlistField(xml, \"ed\"),\n fa: parseNumericPlistField(xml, \"fa\"),\n fu: parseNumericPlistField(xml, \"fu\"),\n ia: parseNumericPlistField(xml, \"ia\"),\n offsets: parseOffsets(xml),\n rc: parseNumericPlistField(xml, \"rc\"),\n sr: parseNumericPlistField(xml, \"sr\"),\n tp: parseNumericPlistField(xml, \"tp\"),\n ts: parseNumericPlistField(xml, \"ts\"),\n };\n\n if (\n definition.ia === null &&\n definition.sr === null &&\n definition.ed === null &&\n definition.rc === null &&\n definition.fu === null &&\n definition.fa === null &&\n definition.tp === null &&\n definition.ts === null &&\n definition.offsets.length === 0\n ) {\n return null;\n }\n\n return definition;\n};\n\nexport const isThingsRepeatTemplateTask = (task: ThingsTaskRecord): boolean =>\n task.recurrenceRuleRaw !== null && task.repeatTemplateSourceId === null;\n\nexport const isThingsRepeatInstanceTask = (task: ThingsTaskRecord): boolean =>\n task.repeatTemplateSourceId !== null;\n\nexport const resolveThingsRepeatTemplateFields = (\n task: ThingsTaskRecord,\n timeZone?: string | null\n): ThingsRepeatTemplateFields | null => {\n if (!isThingsRepeatTemplateTask(task)) {\n return null;\n }\n\n const recurrence = parseThingsRecurrenceDefinition(task.recurrenceRuleRaw);\n\n if (!recurrence) {\n return null;\n }\n\n const repeatTimeZone = resolveTimeZoneOrNull(timeZone);\n const repeatRule = buildRepeatRule(recurrence, task, repeatTimeZone);\n\n if (!repeatRule) {\n return null;\n }\n\n const currentInstanceDate =\n decodeThingsPackedCalendarDate(\n task.nextInstanceStartDate,\n repeatTimeZone\n ) ??\n decodeThingsPackedCalendarDate(task.startDate, repeatTimeZone) ??\n decodeThingsUnixCalendarDate(recurrence.ia, repeatTimeZone) ??\n decodeThingsUnixSeconds(recurrence.ia);\n const repeatType =\n recurrence.tp === 1 ? \"after_completion\" : (\"fixed\" as const);\n\n return {\n currentInstanceDate,\n recurrence,\n repeatNextAt:\n repeatType === \"fixed\"\n ? calculateNextOccurrence(repeatRule, currentInstanceDate)\n : null,\n repeatRule,\n repeatStatus:\n task.instanceCreationPaused || recurrence.ts === 1 ? \"paused\" : \"active\",\n repeatType,\n };\n};\n\nexport const resolveThingsRepeatInstanceDate = (\n task: ThingsTaskRecord,\n timeZone?: string | null\n): number | null => {\n const repeatTimeZone = resolveTimeZoneOrNull(timeZone);\n\n return (\n decodeThingsPackedCalendarDate(task.startDate, repeatTimeZone) ??\n decodeThingsPackedCalendarDate(\n task.nextInstanceStartDate,\n repeatTimeZone\n ) ??\n null\n );\n};\n","import { createTaskLabelId, createTeamProjectId } from \"@donebear/sync-ids\";\n\nimport type { SyncContentModelName } from \"../api/bootstrap\";\nimport { dateOnlyEpochFromLocalDate } from \"../date-codecs\";\nimport { createDeterministicImportId } from \"./model-id\";\nimport { normalizeThingsLabelLookupKey } from \"./things-labels\";\nimport {\n isThingsRepeatInstanceTask,\n isThingsRepeatTemplateTask,\n resolveThingsRepeatInstanceDate,\n resolveThingsRepeatTemplateFields,\n} from \"./things-recurrence\";\nimport {\n combineThingsReminderAt,\n decodeThingsPackedDate,\n decodeThingsUnixSeconds,\n} from \"./things-values\";\n\nexport type ThingsMetadataMode = \"note\" | \"none\";\n\n/** The importer writes exactly the content models a bulk reader reads. */\nexport type ImportModelName = SyncContentModelName;\n\nexport type ThingsSqlitePrimitive = Uint8Array | number | string | null;\nexport type ThingsSqliteRow = Record<string, ThingsSqlitePrimitive>;\n\nexport interface ThingsTaskRecord {\n raw: ThingsSqliteRow;\n uuid: string;\n title: string | null;\n notes: string | null;\n status: number | null;\n stopDate: number | null;\n trashed: boolean;\n type: number | null;\n start: number | null;\n startDate: number | null;\n startBucket: number | null;\n reminderTime: number | null;\n lastReminderInteractionDate: number | null;\n deadline: number | null;\n deadlineSuppressionDate: number | null;\n deadlineOffset: number | null;\n sortIndex: number | null;\n todayIndex: number | null;\n todayIndexReferenceDate: number | null;\n areaId: string | null;\n projectId: string | null;\n headingId: string | null;\n contactId: string | null;\n creationDate: number | null;\n userModificationDate: number | null;\n repeatTemplateSourceId: string | null;\n recurrenceRuleRaw: string | null;\n instanceCreationStartDate: number | null;\n instanceCreationPaused: boolean;\n instanceCreationCount: number | null;\n afterCompletionReferenceDate: number | null;\n nextInstanceStartDate: number | null;\n repeaterRaw: string | null;\n repeaterMigrationDate: number | null;\n}\n\nexport interface ThingsAreaRecord {\n raw: ThingsSqliteRow;\n uuid: string;\n title: string | null;\n visible: boolean | null;\n sortIndex: number | null;\n}\n\nexport interface ThingsTagRecord {\n raw: ThingsSqliteRow;\n uuid: string;\n title: string | null;\n shortcut: string | null;\n parentId: string | null;\n usedDate: number | null;\n sortIndex: number | null;\n}\n\nexport interface ThingsChecklistItemRecord {\n raw: ThingsSqliteRow;\n uuid: string;\n taskId: string | null;\n title: string | null;\n status: number | null;\n stopDate: number | null;\n creationDate: number | null;\n userModificationDate: number | null;\n sortIndex: number | null;\n}\n\nexport interface ThingsTaskTagRecord {\n taskId: string;\n tagId: string;\n}\n\nexport interface ThingsAreaTagRecord {\n areaId: string;\n tagId: string;\n}\n\nexport interface ThingsContactRecord {\n raw: ThingsSqliteRow;\n uuid: string;\n displayName: string | null;\n firstName: string | null;\n lastName: string | null;\n emails: string | null;\n appleAddressBookId: string | null;\n}\n\nexport interface ThingsDatabaseSnapshot {\n databasePath: string;\n taskColumns: string[];\n tasks: ThingsTaskRecord[];\n areas: ThingsAreaRecord[];\n tags: ThingsTagRecord[];\n checklistItems: ThingsChecklistItemRecord[];\n taskTags: ThingsTaskTagRecord[];\n areaTags: ThingsAreaTagRecord[];\n contacts: ThingsContactRecord[];\n}\n\ninterface PlannedModelMutation {\n modelName: ImportModelName;\n modelId: string;\n payload: Record<string, unknown>;\n sourceId: string;\n}\n\ninterface ThingsImportPlan {\n databasePath: string;\n taskColumns: string[];\n counts: {\n source: Record<string, number>;\n planned: Record<string, number>;\n };\n phases: {\n name: string;\n items: PlannedModelMutation[];\n }[];\n}\n\ninterface BuildThingsImportPlanOptions {\n snapshot: ThingsDatabaseSnapshot;\n workspaceId: string;\n creatorId: string;\n metadataMode: ThingsMetadataMode;\n skipTeams?: boolean;\n existingLabelsByTitle?: Map<string, string>;\n timeZone?: string | null;\n}\n\ntype JsonValue =\n | null\n | boolean\n | number\n | string\n | JsonValue[]\n | { [key: string]: JsonValue };\n\nconst MAX_CHECKLIST_TITLE_LENGTH = 500;\n\nconst classifyTaskKind = (\n task: ThingsTaskRecord\n): \"task\" | \"project\" | \"heading\" => {\n if (task.type === 2) {\n return \"heading\";\n }\n\n if (task.type === 1 && task.projectId) {\n return \"heading\";\n }\n\n if (task.type === 1) {\n return \"project\";\n }\n\n return \"task\";\n};\n\nconst compareNullableNumber = (a: number | null, b: number | null): number =>\n (a ?? Number.MAX_SAFE_INTEGER) - (b ?? Number.MAX_SAFE_INTEGER);\n\nconst compareNullableString = (a: string | null, b: string | null): number =>\n (a ?? \"\").localeCompare(b ?? \"\");\n\nconst normalizeTitle = (\n value: string | null | undefined,\n fallback: string\n): string => {\n const trimmed = value?.trim();\n return trimmed && trimmed.length > 0 ? trimmed : fallback;\n};\n\nconst NON_ALPHANUMERIC_PATTERN = /[^A-Z0-9]+/gu;\nconst WHITESPACE_SPLIT_PATTERN = /\\s+/u;\nconst NON_ALPHANUMERIC_STRICT_PATTERN = /[^A-Z0-9]/gu;\nconst READABLE_TEXT_PATTERN = /^[\\t\\n\\r\\u0020-\\u007E\\u00A0-\\uFFFF]*$/u;\nconst EMAIL_SPLIT_PATTERN = /[,\\n;]/u;\n\nconst normalizeKeyBase = (value: string, fallback: string): string => {\n const words = value\n .toUpperCase()\n .replace(NON_ALPHANUMERIC_PATTERN, \" \")\n .trim()\n .split(WHITESPACE_SPLIT_PATTERN)\n .filter((word) => word.length > 0);\n const initials = words.map((word) => word[0] ?? \"\").join(\"\");\n const compact = value\n .toUpperCase()\n .replace(NON_ALPHANUMERIC_STRICT_PATTERN, \"\");\n return initials || compact || fallback;\n};\n\nconst buildUniqueKeys = <T extends { uuid: string; title: string | null }>(\n items: T[],\n options: { fallback: string; maxLength: number }\n): Map<string, string> => {\n const sorted = [...items].toSorted((a, b) => {\n const titleComparison = compareNullableString(a.title, b.title);\n if (titleComparison !== 0) {\n return titleComparison;\n }\n\n return a.uuid.localeCompare(b.uuid);\n });\n\n const keys = new Map<string, string>();\n const used = new Set<string>();\n\n for (const item of sorted) {\n const base = normalizeKeyBase(\n normalizeTitle(item.title, options.fallback),\n options.fallback\n ).slice(0, options.maxLength);\n\n let candidate = base || options.fallback;\n\n if (used.has(candidate)) {\n const suffixBase = item.uuid.replaceAll(/[^a-zA-Z0-9]/gu, \"\").slice(-4);\n const suffix = suffixBase.length > 0 ? suffixBase.toUpperCase() : \"X\";\n const headLength = Math.max(1, options.maxLength - suffix.length - 1);\n candidate = `${candidate.slice(0, headLength)}-${suffix}`;\n }\n\n let counter = 2;\n while (used.has(candidate)) {\n const suffix = String(counter);\n const headLength = Math.max(1, options.maxLength - suffix.length - 1);\n candidate = `${base.slice(0, headLength)}-${suffix}`;\n counter += 1;\n }\n\n used.add(candidate);\n keys.set(item.uuid, candidate);\n }\n\n return keys;\n};\n\nconst buildTaskFields = (\n task: ThingsTaskRecord\n): {\n start: string;\n startBucket: string;\n startDate: number | null;\n todayIndexReferenceDate: number | null;\n} => {\n const startDate =\n decodeThingsPackedDate(task.startDate) ??\n (isThingsRepeatTemplateTask(task)\n ? decodeThingsPackedDate(task.nextInstanceStartDate)\n : null);\n const todayReference = decodeThingsPackedDate(task.todayIndexReferenceDate);\n\n if (task.start === 0) {\n return {\n start: \"not_started\",\n startBucket: \"today\",\n startDate: null,\n todayIndexReferenceDate: null,\n };\n }\n\n if (task.start === 2) {\n if (startDate !== null || task.recurrenceRuleRaw !== null) {\n return {\n start: \"started\",\n startBucket: \"upcoming\",\n startDate,\n todayIndexReferenceDate: null,\n };\n }\n\n return {\n start: \"someday\",\n startBucket: \"today\",\n startDate: null,\n todayIndexReferenceDate: null,\n };\n }\n\n if (startDate !== null) {\n return {\n start: \"started\",\n startBucket: \"today\",\n startDate,\n todayIndexReferenceDate: todayReference ?? startDate,\n };\n }\n\n return {\n start: \"started\",\n startBucket: \"today\",\n startDate: null,\n todayIndexReferenceDate: null,\n };\n};\n\nconst buildReminderAt = (\n task: ThingsTaskRecord,\n startDate: number | null\n): number | null =>\n combineThingsReminderAt({\n deadlineDate: decodeThingsPackedDate(task.deadline),\n nextStartDate: decodeThingsPackedDate(task.nextInstanceStartDate),\n reminderTime: task.reminderTime,\n startDate,\n });\n\nconst pickArchivedAt = (task: ThingsTaskRecord): number | null => {\n const updatedAt = decodeThingsUnixSeconds(task.userModificationDate);\n const completedAt = decodeThingsUnixSeconds(task.stopDate);\n const createdAt = decodeThingsUnixSeconds(task.creationDate);\n\n if (task.trashed || task.status === 2) {\n return updatedAt ?? completedAt ?? createdAt;\n }\n\n return null;\n};\n\nconst pickCompletedAt = (task: ThingsTaskRecord): number | null => {\n if (task.status !== 3) {\n return null;\n }\n\n return (\n decodeThingsUnixSeconds(task.stopDate) ??\n decodeThingsUnixSeconds(task.userModificationDate) ??\n decodeThingsUnixSeconds(task.creationDate)\n );\n};\n\nconst sortValue = (primary: number | null, fallback: number): number =>\n typeof primary === \"number\" ? primary : fallback;\n\nconst textDecoder = new TextDecoder();\n\nconst encodeBase64 = (value: Uint8Array): string => {\n let binary = \"\";\n\n for (const byte of value) {\n binary += String.fromCodePoint(byte);\n }\n\n return btoa(binary);\n};\n\nconst sanitizeBinary = (value: Uint8Array): JsonValue => {\n const asText = textDecoder.decode(value);\n const isReadable =\n !asText.includes(\"\\uFFFD\") && READABLE_TEXT_PATTERN.test(asText);\n\n if (isReadable) {\n const trimmed = asText.trim();\n if (trimmed.length > 0) {\n return trimmed;\n }\n }\n\n return {\n data: encodeBase64(value),\n encoding: \"base64\",\n };\n};\n\nconst sanitizeValue = (value: unknown): JsonValue | undefined => {\n if (value === undefined || value === null) {\n return undefined;\n }\n\n if (\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\"\n ) {\n return value;\n }\n\n if (value instanceof Uint8Array) {\n return sanitizeBinary(value);\n }\n\n if (Array.isArray(value)) {\n const items = value\n .map((entry) => sanitizeValue(entry))\n .filter((entry): entry is JsonValue => entry !== undefined);\n return items.length > 0 ? items : undefined;\n }\n\n if (typeof value === \"object\") {\n const record: Record<string, JsonValue> = {};\n\n for (const [key, entry] of Object.entries(\n value as Record<string, unknown>\n )) {\n const sanitized = sanitizeValue(entry);\n if (sanitized !== undefined) {\n record[key] = sanitized;\n }\n }\n\n return Object.keys(record).length > 0 ? record : undefined;\n }\n\n return String(value);\n};\n\nconst appendMetadataBlock = (\n base: string | null,\n metadataMode: ThingsMetadataMode,\n metadata: Record<string, unknown> | null\n): string | null => {\n const sanitized = sanitizeValue(metadata);\n\n if (metadataMode === \"none\" || sanitized === undefined) {\n const trimmed = base?.trim();\n return trimmed && trimmed.length > 0 ? trimmed : null;\n }\n\n const block = [\n \"Things 3 import metadata\",\n \"```json\",\n JSON.stringify(sanitized, null, 2),\n \"```\",\n ].join(\"\\n\");\n const trimmed = base?.trim();\n\n return trimmed && trimmed.length > 0 ? `${trimmed}\\n\\n---\\n\\n${block}` : null;\n};\n\nconst buildTaskMetadata = (\n task: ThingsTaskRecord,\n contact: ThingsContactRecord | null,\n extraMetadata?: Record<string, unknown> | null\n): Record<string, unknown> | null => {\n const metadata: Record<string, unknown> = {\n sourceUuid: task.uuid,\n };\n\n if (task.status === 2) {\n metadata.status = \"canceled\";\n }\n\n if (contact) {\n metadata.contact = {\n appleAddressBookId: contact.appleAddressBookId,\n displayName: contact.displayName,\n emails: decodeEmails(contact.emails),\n emailsRaw: contact.emails,\n firstName: contact.firstName,\n lastName: contact.lastName,\n uuid: contact.uuid,\n };\n }\n\n if (\n task.recurrenceRuleRaw !== null ||\n task.repeatTemplateSourceId !== null ||\n task.instanceCreationStartDate !== null ||\n task.instanceCreationPaused ||\n task.afterCompletionReferenceDate !== null ||\n task.nextInstanceStartDate !== null ||\n task.repeaterRaw !== null ||\n task.repeaterMigrationDate !== null\n ) {\n metadata.repeating = {\n afterCompletionReferenceDate: decodeThingsPackedDate(\n task.afterCompletionReferenceDate\n ),\n instanceCreationCount: task.instanceCreationCount,\n instanceCreationPaused: task.instanceCreationPaused,\n instanceCreationStartDate: decodeThingsPackedDate(\n task.instanceCreationStartDate\n ),\n nextInstanceStartDate: decodeThingsPackedDate(task.nextInstanceStartDate),\n recurrenceRuleRaw: task.recurrenceRuleRaw,\n repeaterMigrationDate: decodeThingsUnixSeconds(\n task.repeaterMigrationDate\n ),\n repeaterRaw: task.repeaterRaw,\n templateSourceId: task.repeatTemplateSourceId,\n };\n }\n\n if (\n task.deadlineOffset !== null ||\n task.raw.cachedTags !== null ||\n task.raw.experimental !== null\n ) {\n metadata.raw = {\n cachedTags: task.raw.cachedTags,\n deadlineOffset: task.deadlineOffset,\n experimental: task.raw.experimental,\n };\n }\n\n if (extraMetadata) {\n Object.assign(metadata, extraMetadata);\n }\n\n return Object.keys(metadata).length > 1 ? metadata : null;\n};\n\nconst buildProjectMetadata = (\n project: ThingsTaskRecord,\n directTagTitles: string[],\n teamName: string | null\n): Record<string, unknown> | null => {\n const metadata: Record<string, unknown> = {\n sourceUuid: project.uuid,\n };\n\n if (project.status === 2) {\n metadata.status = \"canceled\";\n }\n\n if (project.start !== null && project.start !== 1) {\n metadata.when = {\n start: project.start,\n startDate: decodeThingsPackedDate(project.startDate),\n };\n }\n\n if (teamName) {\n metadata.area = teamName;\n }\n\n if (directTagTitles.length > 0) {\n metadata.directTags = directTagTitles;\n }\n\n return Object.keys(metadata).length > 1 ? metadata : null;\n};\n\nconst buildAreaMetadata = (\n area: ThingsAreaRecord,\n directTagTitles: string[]\n): Record<string, unknown> | null => {\n const metadata: Record<string, unknown> = {\n sourceUuid: area.uuid,\n };\n\n if (area.visible === false) {\n metadata.visible = false;\n }\n\n if (directTagTitles.length > 0) {\n metadata.directTags = directTagTitles;\n }\n\n if (area.raw.cachedTags !== null || area.raw.experimental !== null) {\n metadata.raw = {\n cachedTags: area.raw.cachedTags,\n experimental: area.raw.experimental,\n };\n }\n\n return Object.keys(metadata).length > 1 ? metadata : null;\n};\n\nconst buildGroupMap = <T>(\n rows: T[],\n getKey: (row: T) => string | null\n): Map<string, T[]> => {\n const grouped = new Map<string, T[]>();\n\n for (const row of rows) {\n const key = getKey(row);\n if (!key) {\n continue;\n }\n\n const existing = grouped.get(key);\n if (existing) {\n existing.push(row);\n continue;\n }\n\n grouped.set(key, [row]);\n }\n\n return grouped;\n};\n\nconst decodeEmails = (value: string | null): string[] => {\n if (typeof value !== \"string\") {\n return [];\n }\n\n return value\n .split(EMAIL_SPLIT_PATTERN)\n .map((entry) => entry.trim())\n .filter((entry) => entry.length > 0);\n};\n\nconst buildTagTitleMap = (\n tags: readonly {\n uuid: string;\n title: string | null;\n parentId: string | null;\n }[]\n): Map<string, string> => {\n const tagById = new Map(tags.map((tag) => [tag.uuid, tag]));\n const titleById = new Map<string, string>();\n\n const resolveTitle = (tagId: string, trail: Set<string>): string => {\n const cached = titleById.get(tagId);\n if (cached) {\n return cached;\n }\n\n const tag = tagById.get(tagId);\n if (!tag) {\n return `Tag ${tagId.slice(0, 8)}`;\n }\n\n const title = normalizeTitle(tag.title, `Tag ${tag.uuid.slice(0, 8)}`);\n\n if (!tag.parentId || trail.has(tag.parentId)) {\n titleById.set(tagId, title);\n return title;\n }\n\n const nextTrail = new Set(trail);\n nextTrail.add(tagId);\n const parentTitle = resolveTitle(tag.parentId, nextTrail);\n const fullTitle = `${parentTitle} / ${title}`;\n\n titleById.set(tagId, fullTitle);\n return fullTitle;\n };\n\n for (const tag of tags) {\n resolveTitle(tag.uuid, new Set());\n }\n\n return titleById;\n};\n\nconst buildChecklistMutation = (options: {\n item: ThingsChecklistItemRecord;\n sourceId?: string;\n workspaceId: string;\n taskId: string;\n fallbackCreatedAt: number;\n}): PlannedModelMutation => {\n const sourceId = options.sourceId ?? options.item.uuid;\n const title = normalizeTitle(\n options.item.title,\n `Checklist item ${options.item.uuid.slice(0, 8)}`\n );\n const safeTitle =\n title.length > MAX_CHECKLIST_TITLE_LENGTH\n ? `${title.slice(0, MAX_CHECKLIST_TITLE_LENGTH - 3)}...`\n : title;\n\n return {\n modelId: createDeterministicImportId({\n modelName: \"TaskChecklistItem\",\n sourceId,\n workspaceId: options.workspaceId,\n }),\n modelName: \"TaskChecklistItem\",\n payload: {\n completedAt:\n options.item.status === 3\n ? (decodeThingsUnixSeconds(options.item.stopDate) ??\n decodeThingsUnixSeconds(options.item.userModificationDate) ??\n decodeThingsUnixSeconds(options.item.creationDate))\n : null,\n createdAt:\n decodeThingsUnixSeconds(options.item.creationDate) ??\n options.fallbackCreatedAt,\n sortOrder: sortValue(options.item.sortIndex, options.fallbackCreatedAt),\n taskId: options.taskId,\n title: safeTitle,\n updatedAt:\n decodeThingsUnixSeconds(options.item.userModificationDate) ??\n decodeThingsUnixSeconds(options.item.creationDate) ??\n options.fallbackCreatedAt,\n workspaceId: options.workspaceId,\n },\n sourceId,\n };\n};\n\ninterface ImportPlanContext {\n workspaceId: string;\n creatorId: string;\n metadataMode: ThingsMetadataMode;\n createdAtFallback: number;\n todayDateOnly: number;\n timeZone?: string | null;\n areaById: Map<string, ThingsAreaRecord>;\n contactById: Map<string, ThingsContactRecord>;\n tagTitleById: Map<string, string>;\n existingLabelIdByTitle: Map<string, string>;\n taskTagMap: Map<string, { taskId: string; tagId: string }[]>;\n areaTagMap: Map<string, { areaId: string; tagId: string }[]>;\n checklistByTaskId: Map<string, ThingsChecklistItemRecord[]>;\n teamKeys: Map<string, string>;\n projectKeyCandidates: Map<string, string>;\n areaTeamIdBySourceId: Map<string, string>;\n tagLabelIdBySourceId: Map<string, string>;\n projectIdBySourceId: Map<string, string>;\n headingIdBySourceId: Map<string, string>;\n taskIdBySourceId: Map<string, string>;\n}\n\nconst buildTeamActions = (\n ctx: ImportPlanContext,\n areas: ThingsAreaRecord[]\n): PlannedModelMutation[] => {\n const teams: PlannedModelMutation[] = [];\n\n for (const area of [...areas].toSorted((a, b) => {\n const indexComparison = compareNullableNumber(a.sortIndex, b.sortIndex);\n if (indexComparison !== 0) {\n return indexComparison;\n }\n return a.uuid.localeCompare(b.uuid);\n })) {\n const teamId = createDeterministicImportId({\n modelName: \"Team\",\n sourceId: area.uuid,\n workspaceId: ctx.workspaceId,\n });\n ctx.areaTeamIdBySourceId.set(area.uuid, teamId);\n\n const areaTagTitles = (ctx.areaTagMap.get(area.uuid) ?? [])\n .map((link) => ctx.tagTitleById.get(link.tagId) ?? null)\n .filter((title): title is string => typeof title === \"string\");\n\n teams.push({\n modelId: teamId,\n modelName: \"Team\",\n payload: {\n archivedAt: null,\n createdAt: ctx.createdAtFallback,\n description: appendMetadataBlock(\n null,\n ctx.metadataMode,\n buildAreaMetadata(area, areaTagTitles)\n ),\n icon: null,\n key: ctx.teamKeys.get(area.uuid) ?? \"AREA\",\n name: normalizeTitle(area.title, `Area ${area.uuid.slice(0, 8)}`),\n updatedAt: ctx.createdAtFallback,\n workspaceId: ctx.workspaceId,\n },\n sourceId: area.uuid,\n });\n }\n\n return teams;\n};\n\nconst buildLabelActions = (\n ctx: ImportPlanContext,\n tags: readonly {\n uuid: string;\n title: string | null;\n parentId: string | null;\n usedDate: number | null;\n sortIndex: number | null;\n }[]\n): PlannedModelMutation[] => {\n const labels: PlannedModelMutation[] = [];\n\n for (const tag of [...tags].toSorted((a, b) => {\n const indexComparison = compareNullableNumber(a.sortIndex, b.sortIndex);\n if (indexComparison !== 0) {\n return indexComparison;\n }\n return a.uuid.localeCompare(b.uuid);\n })) {\n const labelTitle =\n ctx.tagTitleById.get(tag.uuid) ??\n normalizeTitle(tag.title, `Tag ${tag.uuid.slice(0, 8)}`);\n const existingLabelId = ctx.existingLabelIdByTitle.get(\n normalizeThingsLabelLookupKey(labelTitle)\n );\n const labelId =\n existingLabelId ??\n createDeterministicImportId({\n modelName: \"Label\",\n sourceId: tag.uuid,\n workspaceId: ctx.workspaceId,\n });\n ctx.tagLabelIdBySourceId.set(tag.uuid, labelId);\n\n if (!existingLabelId) {\n labels.push({\n modelId: labelId,\n modelName: \"Label\",\n payload: {\n createdAt:\n decodeThingsUnixSeconds(tag.usedDate) ?? ctx.createdAtFallback,\n title: labelTitle,\n updatedAt:\n decodeThingsUnixSeconds(tag.usedDate) ?? ctx.createdAtFallback,\n workspaceId: ctx.workspaceId,\n },\n sourceId: tag.uuid,\n });\n }\n }\n\n return labels;\n};\n\nconst buildProjectActions = (\n ctx: ImportPlanContext,\n sourceProjects: ThingsTaskRecord[]\n): {\n projects: PlannedModelMutation[];\n teamProjects: PlannedModelMutation[];\n} => {\n const projects: PlannedModelMutation[] = [];\n const teamProjects: PlannedModelMutation[] = [];\n\n for (const project of [...sourceProjects].toSorted((a, b) => {\n const indexComparison = compareNullableNumber(a.sortIndex, b.sortIndex);\n if (indexComparison !== 0) {\n return indexComparison;\n }\n return a.uuid.localeCompare(b.uuid);\n })) {\n const projectId = createDeterministicImportId({\n modelName: \"Project\",\n sourceId: project.uuid,\n workspaceId: ctx.workspaceId,\n });\n ctx.projectIdBySourceId.set(project.uuid, projectId);\n\n const directTagTitles = (ctx.taskTagMap.get(project.uuid) ?? [])\n .map((link) => ctx.tagTitleById.get(link.tagId) ?? null)\n .filter((title): title is string => typeof title === \"string\");\n const teamName =\n project.areaId === null\n ? null\n : (ctx.areaById.get(project.areaId)?.title ?? null);\n\n projects.push({\n modelId: projectId,\n modelName: \"Project\",\n payload: {\n archivedAt: pickArchivedAt(project),\n color: null,\n completedAt: pickCompletedAt(project),\n createdAt:\n decodeThingsUnixSeconds(project.creationDate) ??\n ctx.createdAtFallback,\n creatorId: ctx.creatorId,\n description: appendMetadataBlock(\n project.notes,\n ctx.metadataMode,\n buildProjectMetadata(project, directTagTitles, teamName)\n ),\n icon: null,\n key: ctx.projectKeyCandidates.get(project.uuid) ?? \"PROJ\",\n name: normalizeTitle(\n project.title,\n `Project ${project.uuid.slice(0, 8)}`\n ),\n sortOrder: sortValue(project.sortIndex, projects.length),\n status: project.status === 3 ? \"completed\" : \"active\",\n targetDate: decodeThingsPackedDate(project.deadline),\n updatedAt:\n decodeThingsUnixSeconds(project.userModificationDate) ??\n decodeThingsUnixSeconds(project.creationDate) ??\n ctx.createdAtFallback,\n workspaceId: ctx.workspaceId,\n },\n sourceId: project.uuid,\n });\n\n if (project.areaId !== null) {\n const teamId = ctx.areaTeamIdBySourceId.get(project.areaId);\n if (teamId) {\n teamProjects.push({\n modelId: createTeamProjectId({\n projectId,\n teamId,\n workspaceId: ctx.workspaceId,\n }),\n modelName: \"TeamProject\",\n payload: {\n createdAt:\n decodeThingsUnixSeconds(project.creationDate) ??\n ctx.createdAtFallback,\n projectId,\n teamId,\n workspaceId: ctx.workspaceId,\n },\n sourceId: `${project.areaId}:${project.uuid}`,\n });\n }\n }\n }\n\n return { projects, teamProjects };\n};\n\nconst buildHeadingActions = (\n ctx: ImportPlanContext,\n sourceHeadings: ThingsTaskRecord[]\n): PlannedModelMutation[] => {\n const headings: PlannedModelMutation[] = [];\n\n for (const heading of [...sourceHeadings].toSorted((a, b) => {\n const projectComparison = compareNullableString(a.projectId, b.projectId);\n if (projectComparison !== 0) {\n return projectComparison;\n }\n const indexComparison = compareNullableNumber(a.sortIndex, b.sortIndex);\n if (indexComparison !== 0) {\n return indexComparison;\n }\n return a.uuid.localeCompare(b.uuid);\n })) {\n const parentProjectId =\n heading.projectId === null\n ? null\n : (ctx.projectIdBySourceId.get(heading.projectId) ?? null);\n if (!parentProjectId) {\n continue;\n }\n\n const headingId = createDeterministicImportId({\n modelName: \"ProjectHeading\",\n sourceId: heading.uuid,\n workspaceId: ctx.workspaceId,\n });\n ctx.headingIdBySourceId.set(heading.uuid, headingId);\n\n headings.push({\n modelId: headingId,\n modelName: \"ProjectHeading\",\n payload: {\n archivedAt: pickArchivedAt(heading),\n createdAt:\n decodeThingsUnixSeconds(heading.creationDate) ??\n ctx.createdAtFallback,\n projectId: parentProjectId,\n sortOrder: sortValue(heading.sortIndex, headings.length),\n title: normalizeTitle(\n heading.title,\n `Heading ${heading.uuid.slice(0, 8)}`\n ),\n updatedAt:\n decodeThingsUnixSeconds(heading.userModificationDate) ??\n decodeThingsUnixSeconds(heading.creationDate) ??\n ctx.createdAtFallback,\n workspaceId: ctx.workspaceId,\n },\n sourceId: heading.uuid,\n });\n }\n\n return headings;\n};\n\nconst collectEffectiveTagIds = (\n task: ThingsTaskRecord,\n taskTagMap: Map<string, { taskId: string; tagId: string }[]>,\n areaTagMap: Map<string, { areaId: string; tagId: string }[]>\n): Set<string> => {\n const effectiveTagIds = new Set<string>();\n\n for (const link of taskTagMap.get(task.uuid) ?? []) {\n effectiveTagIds.add(link.tagId);\n }\n\n if (task.areaId !== null) {\n for (const link of areaTagMap.get(task.areaId) ?? []) {\n effectiveTagIds.add(link.tagId);\n }\n }\n\n if (task.projectId !== null) {\n for (const link of taskTagMap.get(task.projectId) ?? []) {\n effectiveTagIds.add(link.tagId);\n }\n }\n\n if (task.headingId !== null) {\n for (const link of taskTagMap.get(task.headingId) ?? []) {\n effectiveTagIds.add(link.tagId);\n }\n }\n\n return effectiveTagIds;\n};\n\nconst buildChecklistOverflowMetadata = (\n task: ThingsTaskRecord,\n checklistByTaskId: Map<string, ThingsChecklistItemRecord[]>\n): Record<string, unknown> | null => {\n const overflowItems = (checklistByTaskId.get(task.uuid) ?? [])\n .map((item) => ({\n title: normalizeTitle(\n item.title,\n `Checklist item ${item.uuid.slice(0, 8)}`\n ),\n uuid: item.uuid,\n }))\n .filter((item) => item.title.length > MAX_CHECKLIST_TITLE_LENGTH);\n\n return overflowItems.length > 0\n ? {\n checklistOverflow: overflowItems,\n }\n : null;\n};\n\nconst appendTaskRelations = (\n ctx: ImportPlanContext,\n taskLabels: PlannedModelMutation[],\n checklistItems: PlannedModelMutation[],\n relationOptions: {\n task: ThingsTaskRecord;\n taskId: string;\n createdAt: number;\n sourcePrefix?: string;\n }\n): void => {\n const tagIds = collectEffectiveTagIds(\n relationOptions.task,\n ctx.taskTagMap,\n ctx.areaTagMap\n );\n\n for (const sourceTagId of tagIds) {\n const labelId = ctx.tagLabelIdBySourceId.get(sourceTagId);\n if (!labelId) {\n continue;\n }\n\n taskLabels.push({\n modelId: createTaskLabelId({\n labelId,\n taskId: relationOptions.taskId,\n workspaceId: ctx.workspaceId,\n }),\n modelName: \"TaskLabel\",\n payload: {\n createdAt: relationOptions.createdAt,\n labelId,\n taskId: relationOptions.taskId,\n workspaceId: ctx.workspaceId,\n },\n sourceId: relationOptions.sourcePrefix\n ? `${relationOptions.sourcePrefix}:${sourceTagId}`\n : `${relationOptions.task.uuid}:${sourceTagId}`,\n });\n }\n\n for (const item of [\n ...(ctx.checklistByTaskId.get(relationOptions.task.uuid) ?? []),\n ].toSorted((a, b) => {\n const indexComparison = compareNullableNumber(a.sortIndex, b.sortIndex);\n if (indexComparison !== 0) {\n return indexComparison;\n }\n return a.uuid.localeCompare(b.uuid);\n })) {\n checklistItems.push(\n buildChecklistMutation({\n fallbackCreatedAt: relationOptions.createdAt,\n item,\n sourceId: relationOptions.sourcePrefix\n ? `${relationOptions.sourcePrefix}:checklist:${item.uuid}`\n : undefined,\n taskId: relationOptions.taskId,\n workspaceId: ctx.workspaceId,\n })\n );\n }\n};\n\n// oxlint-ignore-next-line complexity -- Things 3 import maps many task fields and relationships\nconst pushTaskMutation = (\n ctx: ImportPlanContext,\n tasks: PlannedModelMutation[],\n taskLabels: PlannedModelMutation[],\n checklistItems: PlannedModelMutation[],\n mutationOptions: {\n task: ThingsTaskRecord;\n taskId: string;\n sourceId: string;\n taskFields?: ReturnType<typeof buildTaskFields>;\n repeat?: {\n repeatRule: string | null;\n repeatType: \"fixed\" | \"after_completion\" | null;\n repeatStatus: \"active\" | \"paused\" | null;\n repeatTemplateId: string | null;\n repeatInstanceDate: number | null;\n repeatNextAt: number | null;\n };\n }\n): number => {\n const contact =\n mutationOptions.task.contactId === null\n ? null\n : (ctx.contactById.get(mutationOptions.task.contactId) ?? null);\n const taskFields =\n mutationOptions.taskFields ?? buildTaskFields(mutationOptions.task);\n const createdAt =\n decodeThingsUnixSeconds(mutationOptions.task.creationDate) ??\n ctx.createdAtFallback;\n const updatedAt =\n decodeThingsUnixSeconds(mutationOptions.task.userModificationDate) ??\n decodeThingsUnixSeconds(mutationOptions.task.creationDate) ??\n ctx.createdAtFallback;\n const sortOrder = sortValue(\n mutationOptions.task.sortIndex,\n tasks.length * 1000\n );\n\n tasks.push({\n modelId: mutationOptions.taskId,\n modelName: \"Task\",\n payload: {\n archivedAt: pickArchivedAt(mutationOptions.task),\n assigneeId: null,\n completedAt: pickCompletedAt(mutationOptions.task),\n createdAt,\n creatorId: ctx.creatorId,\n deadlineAt: decodeThingsPackedDate(mutationOptions.task.deadline),\n deadlineSuppressionAt: decodeThingsPackedDate(\n mutationOptions.task.deadlineSuppressionDate\n ),\n description: appendMetadataBlock(\n mutationOptions.task.notes,\n ctx.metadataMode,\n buildTaskMetadata(\n mutationOptions.task,\n contact,\n buildChecklistOverflowMetadata(\n mutationOptions.task,\n ctx.checklistByTaskId\n )\n )\n ),\n headingId:\n mutationOptions.task.headingId === null\n ? null\n : (ctx.headingIdBySourceId.get(mutationOptions.task.headingId) ??\n null),\n lastReminderInteractionAt: decodeThingsUnixSeconds(\n mutationOptions.task.lastReminderInteractionDate\n ),\n projectId:\n mutationOptions.task.projectId === null\n ? null\n : (ctx.projectIdBySourceId.get(mutationOptions.task.projectId) ??\n null),\n projectSortOrder: sortOrder,\n reminderAt: buildReminderAt(mutationOptions.task, taskFields.startDate),\n repeatInstanceDate: mutationOptions.repeat?.repeatInstanceDate ?? null,\n repeatNextAt: mutationOptions.repeat?.repeatNextAt ?? null,\n repeatRule: mutationOptions.repeat?.repeatRule ?? null,\n repeatStatus: mutationOptions.repeat?.repeatStatus ?? null,\n repeatTemplateId: mutationOptions.repeat?.repeatTemplateId ?? null,\n repeatType: mutationOptions.repeat?.repeatType ?? null,\n sortOrder,\n start: taskFields.start,\n startBucket: taskFields.startBucket,\n startDate: taskFields.startDate,\n teamId:\n mutationOptions.task.areaId === null\n ? null\n : (ctx.areaTeamIdBySourceId.get(mutationOptions.task.areaId) ?? null),\n title: normalizeTitle(\n mutationOptions.task.title,\n `Task ${mutationOptions.task.uuid.slice(0, 8)}`\n ),\n todayIndexReferenceDate: taskFields.todayIndexReferenceDate,\n todaySortOrder: sortValue(mutationOptions.task.todayIndex, sortOrder),\n updatedAt,\n workspaceId: ctx.workspaceId,\n },\n sourceId: mutationOptions.sourceId,\n });\n\n appendTaskRelations(ctx, taskLabels, checklistItems, {\n createdAt,\n sourcePrefix:\n mutationOptions.sourceId === mutationOptions.task.uuid\n ? undefined\n : mutationOptions.sourceId,\n task: mutationOptions.task,\n taskId: mutationOptions.taskId,\n });\n\n return createdAt;\n};\n\nconst planRepeatTemplateTask = (\n ctx: ImportPlanContext,\n task: ThingsTaskRecord,\n taskId: string,\n openRepeatInstanceTemplateIds: Set<string>,\n tasks: PlannedModelMutation[],\n taskLabels: PlannedModelMutation[],\n checklistItems: PlannedModelMutation[]\n): void => {\n const repeatTemplate = resolveThingsRepeatTemplateFields(task, ctx.timeZone);\n\n if (!repeatTemplate) {\n pushTaskMutation(ctx, tasks, taskLabels, checklistItems, {\n sourceId: task.uuid,\n task,\n taskId,\n });\n return;\n }\n\n pushTaskMutation(ctx, tasks, taskLabels, checklistItems, {\n repeat: {\n repeatInstanceDate: null,\n repeatNextAt: repeatTemplate.repeatNextAt,\n repeatRule: repeatTemplate.repeatRule,\n repeatStatus: repeatTemplate.repeatStatus,\n repeatTemplateId: null,\n repeatType: repeatTemplate.repeatType,\n },\n sourceId: task.uuid,\n task,\n taskId,\n });\n\n if (\n pickCompletedAt(task) !== null ||\n pickArchivedAt(task) !== null ||\n openRepeatInstanceTemplateIds.has(task.uuid)\n ) {\n return;\n }\n\n const currentInstanceTaskId = createDeterministicImportId({\n modelName: \"Task\",\n sourceId: `${task.uuid}:current-instance`,\n workspaceId: ctx.workspaceId,\n });\n const { currentInstanceDate } = repeatTemplate;\n const currentTaskFields =\n currentInstanceDate === null\n ? buildTaskFields(task)\n : {\n start: \"started\",\n startBucket:\n currentInstanceDate <= ctx.todayDateOnly ? \"today\" : \"upcoming\",\n startDate: currentInstanceDate,\n todayIndexReferenceDate:\n currentInstanceDate <= ctx.todayDateOnly\n ? currentInstanceDate\n : null,\n };\n\n pushTaskMutation(ctx, tasks, taskLabels, checklistItems, {\n repeat: {\n repeatInstanceDate: currentInstanceDate,\n repeatNextAt: null,\n repeatRule: null,\n repeatStatus: null,\n repeatTemplateId: taskId,\n repeatType: null,\n },\n sourceId: `${task.uuid}:current-instance`,\n task,\n taskFields: currentTaskFields,\n taskId: currentInstanceTaskId,\n });\n};\n\nconst buildTaskActions = (\n ctx: ImportPlanContext,\n sourceTasks: ThingsTaskRecord[]\n): {\n tasks: PlannedModelMutation[];\n taskLabels: PlannedModelMutation[];\n checklistItems: PlannedModelMutation[];\n} => {\n const tasks: PlannedModelMutation[] = [];\n const taskLabels: PlannedModelMutation[] = [];\n const checklistItems: PlannedModelMutation[] = [];\n\n const sortedSourceTasks = [...sourceTasks].toSorted((a, b) => {\n const indexComparison = compareNullableNumber(a.sortIndex, b.sortIndex);\n if (indexComparison !== 0) {\n return indexComparison;\n }\n const todayComparison = compareNullableNumber(a.todayIndex, b.todayIndex);\n if (todayComparison !== 0) {\n return todayComparison;\n }\n return a.uuid.localeCompare(b.uuid);\n });\n\n const openRepeatInstanceTemplateIds = new Set(\n sourceTasks\n .filter(isThingsRepeatInstanceTask)\n .filter(\n (task) =>\n pickCompletedAt(task) === null && pickArchivedAt(task) === null\n )\n .map((task) => task.repeatTemplateSourceId)\n .filter((value): value is string => typeof value === \"string\")\n );\n\n for (const task of sortedSourceTasks) {\n ctx.taskIdBySourceId.set(\n task.uuid,\n createDeterministicImportId({\n modelName: \"Task\",\n sourceId: task.uuid,\n workspaceId: ctx.workspaceId,\n })\n );\n }\n\n const taskPlanningOrder = [\n ...sortedSourceTasks.filter(isThingsRepeatTemplateTask),\n ...sortedSourceTasks.filter((task) => !isThingsRepeatTemplateTask(task)),\n ];\n\n for (const task of taskPlanningOrder) {\n const taskId = ctx.taskIdBySourceId.get(task.uuid);\n\n if (!taskId) {\n continue;\n }\n\n if (isThingsRepeatTemplateTask(task)) {\n planRepeatTemplateTask(\n ctx,\n task,\n taskId,\n openRepeatInstanceTemplateIds,\n tasks,\n taskLabels,\n checklistItems\n );\n continue;\n }\n\n if (isThingsRepeatInstanceTask(task)) {\n const repeatTemplateId =\n task.repeatTemplateSourceId === null\n ? null\n : (ctx.taskIdBySourceId.get(task.repeatTemplateSourceId) ?? null);\n\n pushTaskMutation(ctx, tasks, taskLabels, checklistItems, {\n repeat: {\n repeatInstanceDate: resolveThingsRepeatInstanceDate(\n task,\n ctx.timeZone\n ),\n repeatNextAt: null,\n repeatRule: null,\n repeatStatus: null,\n repeatTemplateId,\n repeatType: null,\n },\n sourceId: task.uuid,\n task,\n taskId,\n });\n\n continue;\n }\n\n pushTaskMutation(ctx, tasks, taskLabels, checklistItems, {\n sourceId: task.uuid,\n task,\n taskId,\n });\n }\n\n return { checklistItems, taskLabels, tasks };\n};\n\nexport const buildThingsImportPlan = (\n options: BuildThingsImportPlanOptions\n): ThingsImportPlan => {\n const { snapshot, workspaceId, existingLabelsByTitle } = options;\n\n const ctx: ImportPlanContext = {\n areaById: new Map(snapshot.areas.map((area) => [area.uuid, area])),\n areaTagMap: buildGroupMap(snapshot.areaTags, (row) => row.areaId),\n areaTeamIdBySourceId: new Map<string, string>(),\n checklistByTaskId: buildGroupMap(\n snapshot.checklistItems,\n (row) => row.taskId\n ),\n contactById: new Map(\n snapshot.contacts.map((contact) => [contact.uuid, contact])\n ),\n createdAtFallback: Date.now(),\n creatorId: options.creatorId,\n existingLabelIdByTitle: existingLabelsByTitle ?? new Map<string, string>(),\n headingIdBySourceId: new Map<string, string>(),\n metadataMode: options.metadataMode,\n projectIdBySourceId: new Map<string, string>(),\n projectKeyCandidates: buildUniqueKeys(\n snapshot.tasks.filter((task) => classifyTaskKind(task) === \"project\"),\n {\n fallback: \"PROJ\",\n maxLength: 12,\n }\n ),\n tagLabelIdBySourceId: new Map<string, string>(),\n tagTitleById: buildTagTitleMap(snapshot.tags),\n taskIdBySourceId: new Map<string, string>(),\n taskTagMap: buildGroupMap(snapshot.taskTags, (row) => row.taskId),\n teamKeys: options.skipTeams\n ? new Map<string, string>()\n : buildUniqueKeys(snapshot.areas, {\n fallback: \"AREA\",\n maxLength: 24,\n }),\n timeZone: options.timeZone,\n todayDateOnly: dateOnlyEpochFromLocalDate(),\n workspaceId,\n };\n\n const teams = options.skipTeams ? [] : buildTeamActions(ctx, snapshot.areas);\n const labels = buildLabelActions(ctx, snapshot.tags);\n\n const sourceProjects = snapshot.tasks.filter(\n (task) => classifyTaskKind(task) === \"project\"\n );\n const sourceHeadings = snapshot.tasks.filter(\n (task) => classifyTaskKind(task) === \"heading\"\n );\n const sourceTasks = snapshot.tasks.filter(\n (task) => classifyTaskKind(task) === \"task\"\n );\n\n const { projects, teamProjects } = buildProjectActions(ctx, sourceProjects);\n const headings = buildHeadingActions(ctx, sourceHeadings);\n const { tasks, taskLabels, checklistItems } = buildTaskActions(\n ctx,\n sourceTasks\n );\n\n const phases = [\n { items: teams, name: \"teams\" },\n { items: labels, name: \"labels\" },\n { items: projects, name: \"projects\" },\n { items: teamProjects, name: \"teamProjects\" },\n { items: headings, name: \"headings\" },\n { items: tasks, name: \"tasks\" },\n { items: taskLabels, name: \"taskLabels\" },\n { items: checklistItems, name: \"checklistItems\" },\n ];\n\n return {\n counts: {\n planned: Object.fromEntries(\n phases.map((phase) => [phase.name, phase.items.length])\n ),\n source: {\n areaTagLinks: snapshot.areaTags.length,\n areas: snapshot.areas.length,\n checklistItems: snapshot.checklistItems.length,\n headings: sourceHeadings.length,\n projects: sourceProjects.length,\n tags: snapshot.tags.length,\n taskTagLinks: snapshot.taskTags.length,\n tasks: sourceTasks.length,\n },\n },\n databasePath: snapshot.databasePath,\n phases,\n taskColumns: snapshot.taskColumns,\n };\n};\n","import {\n accessSync,\n constants as fsConstants,\n readdirSync,\n statSync,\n} from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { basename, join, resolve } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nimport Database from \"better-sqlite3\";\n\nconst THINGS_CONTAINER_PATH = join(\n homedir(),\n \"Library/Group Containers/JLMPQHK86H.com.culturedcode.ThingsMac\"\n);\nconst THINGS_BUNDLE_NAME = \"Things Database.thingsdatabase\";\nconst THINGS_SQLITE_FILE = \"main.sqlite\";\nconst LEGACY_THINGS_SQLITE_FILE = \"Things.sqlite3\";\n\ntype SqlitePrimitive = Buffer | number | string | null;\ntype SqliteRow = Record<string, SqlitePrimitive>;\n\nexport interface ThingsTaskRecord {\n raw: SqliteRow;\n uuid: string;\n title: string | null;\n notes: string | null;\n status: number | null;\n stopDate: number | null;\n trashed: boolean;\n type: number | null;\n start: number | null;\n startDate: number | null;\n startBucket: number | null;\n reminderTime: number | null;\n lastReminderInteractionDate: number | null;\n deadline: number | null;\n deadlineSuppressionDate: number | null;\n deadlineOffset: number | null;\n sortIndex: number | null;\n todayIndex: number | null;\n todayIndexReferenceDate: number | null;\n areaId: string | null;\n projectId: string | null;\n headingId: string | null;\n contactId: string | null;\n creationDate: number | null;\n userModificationDate: number | null;\n repeatTemplateSourceId: string | null;\n recurrenceRuleRaw: string | null;\n instanceCreationStartDate: number | null;\n instanceCreationPaused: boolean;\n instanceCreationCount: number | null;\n afterCompletionReferenceDate: number | null;\n nextInstanceStartDate: number | null;\n repeaterRaw: string | null;\n repeaterMigrationDate: number | null;\n}\n\nexport interface ThingsAreaRecord {\n raw: SqliteRow;\n uuid: string;\n title: string | null;\n visible: boolean | null;\n sortIndex: number | null;\n}\n\nexport interface ThingsTagRecord {\n raw: SqliteRow;\n uuid: string;\n title: string | null;\n shortcut: string | null;\n parentId: string | null;\n usedDate: number | null;\n sortIndex: number | null;\n}\n\nexport interface ThingsChecklistItemRecord {\n raw: SqliteRow;\n uuid: string;\n taskId: string | null;\n title: string | null;\n status: number | null;\n stopDate: number | null;\n creationDate: number | null;\n userModificationDate: number | null;\n sortIndex: number | null;\n}\n\nexport interface ThingsTaskTagRecord {\n taskId: string;\n tagId: string;\n}\n\nexport interface ThingsAreaTagRecord {\n areaId: string;\n tagId: string;\n}\n\nexport interface ThingsContactRecord {\n raw: SqliteRow;\n uuid: string;\n displayName: string | null;\n firstName: string | null;\n lastName: string | null;\n emails: string | null;\n appleAddressBookId: string | null;\n}\n\nexport interface ThingsDatabaseSnapshot {\n databasePath: string;\n taskColumns: string[];\n tasks: ThingsTaskRecord[];\n areas: ThingsAreaRecord[];\n tags: ThingsTagRecord[];\n checklistItems: ThingsChecklistItemRecord[];\n taskTags: ThingsTaskTagRecord[];\n areaTags: ThingsAreaTagRecord[];\n contacts: ThingsContactRecord[];\n}\n\nconst URL_SCHEME_PATTERN = /^[a-z][a-z0-9+.-]*:/iu;\n\nconst isUrlLike = (value: string): boolean => URL_SCHEME_PATTERN.test(value);\n\nconst resolveInputPath = (databaseUrl: string): string => {\n if (!isUrlLike(databaseUrl)) {\n return resolve(databaseUrl);\n }\n\n const parsed = new URL(databaseUrl);\n\n if (parsed.protocol === \"file:\") {\n return fileURLToPath(parsed);\n }\n\n if (parsed.protocol === \"sqlite:\") {\n return resolve(decodeURIComponent(parsed.pathname));\n }\n\n throw new Error(\n `Unsupported Things database URL scheme \"${parsed.protocol}\". Use a file path, file:// URL, or sqlite:// URL.`\n );\n};\n\nconst expandThingsDatabasePath = (inputPath: string): string => {\n const resolvedPath = resolve(inputPath);\n const lastSegment = basename(resolvedPath);\n\n if (\n lastSegment === THINGS_SQLITE_FILE ||\n lastSegment === LEGACY_THINGS_SQLITE_FILE\n ) {\n return resolvedPath;\n }\n\n if (lastSegment === THINGS_BUNDLE_NAME) {\n return join(resolvedPath, THINGS_SQLITE_FILE);\n }\n\n if (lastSegment.startsWith(\"ThingsData-\")) {\n return join(resolvedPath, THINGS_BUNDLE_NAME, THINGS_SQLITE_FILE);\n }\n\n return resolvedPath;\n};\n\nconst isReadableFile = (path: string): boolean => {\n try {\n accessSync(path, fsConstants.R_OK);\n return statSync(path).isFile();\n } catch {\n return false;\n }\n};\n\nconst findLatestThingsDatabasePath = (): string | null => {\n const candidates: { path: string; mtimeMs: number }[] = [];\n\n for (const name of [\n join(THINGS_CONTAINER_PATH, THINGS_BUNDLE_NAME, THINGS_SQLITE_FILE),\n join(THINGS_CONTAINER_PATH, LEGACY_THINGS_SQLITE_FILE),\n ]) {\n if (isReadableFile(name)) {\n candidates.push({ mtimeMs: statSync(name).mtimeMs, path: name });\n }\n }\n\n try {\n const entries = readdirSync(THINGS_CONTAINER_PATH, { withFileTypes: true });\n\n for (const entry of entries) {\n if (!(entry.isDirectory() && entry.name.startsWith(\"ThingsData-\"))) {\n continue;\n }\n\n const candidate = join(\n THINGS_CONTAINER_PATH,\n entry.name,\n THINGS_BUNDLE_NAME,\n THINGS_SQLITE_FILE\n );\n\n if (!isReadableFile(candidate)) {\n continue;\n }\n\n candidates.push({\n mtimeMs: statSync(candidate).mtimeMs,\n path: candidate,\n });\n }\n } catch {\n return null;\n }\n\n if (candidates.length === 0) {\n return null;\n }\n\n candidates.sort((left, right) => right.mtimeMs - left.mtimeMs);\n return candidates[0]?.path ?? null;\n};\n\nconst readRows = (\n database: Database.Database,\n tableName: string\n): SqliteRow[] =>\n database.prepare(`SELECT * FROM ${tableName}`).all() as SqliteRow[];\n\nconst hasTable = (database: Database.Database, tableName: string): boolean => {\n const row = database\n .prepare(\n \"SELECT name FROM sqlite_master WHERE type = 'table' AND name = ? LIMIT 1\"\n )\n .get(tableName) as { name?: string } | undefined;\n\n return row?.name === tableName;\n};\n\nconst getTableColumns = (\n database: Database.Database,\n tableName: string\n): string[] => {\n if (!hasTable(database, tableName)) {\n return [];\n }\n\n const rows = database.prepare(`PRAGMA table_info(${tableName})`).all() as {\n name?: string;\n }[];\n\n return rows\n .map((row) => (typeof row.name === \"string\" ? row.name : null))\n .filter((name): name is string => name !== null);\n};\n\nconst toStringValue = (value: SqlitePrimitive | undefined): string | null => {\n if (typeof value === \"string\") {\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : null;\n }\n\n if (Buffer.isBuffer(value)) {\n const text = value.toString(\"utf-8\").trim();\n return text.length > 0 ? text : null;\n }\n\n return null;\n};\n\nconst toNumberValue = (value: SqlitePrimitive | undefined): number | null =>\n typeof value === \"number\" && Number.isFinite(value) ? value : null;\n\nconst toBooleanValue = (value: SqlitePrimitive | undefined): boolean | null => {\n const numeric = toNumberValue(value);\n return numeric === null ? null : numeric !== 0;\n};\n\nconst normalizeTaskRecord = (row: SqliteRow): ThingsTaskRecord | null => {\n const uuid = toStringValue(row.uuid);\n\n if (!uuid) {\n return null;\n }\n\n return {\n afterCompletionReferenceDate: toNumberValue(\n row.rt1_afterCompletionReferenceDate ?? row.afterCompletionReferenceDate\n ),\n areaId: toStringValue(row.area),\n contactId: toStringValue(row.contact ?? row.delegate),\n creationDate: toNumberValue(row.creationDate),\n deadline: toNumberValue(row.deadline ?? row.dueDate),\n deadlineOffset: toNumberValue(row.t2_deadlineOffset ?? row.dueDateOffset),\n deadlineSuppressionDate: toNumberValue(\n row.deadlineSuppressionDate ?? row.dueDateSuppressionDate\n ),\n headingId: toStringValue(row.heading ?? row.actionGroup),\n instanceCreationCount: toNumberValue(\n row.rt1_instanceCreationCount ?? row.instanceCreationCount\n ),\n instanceCreationPaused:\n toBooleanValue(\n row.rt1_instanceCreationPaused ?? row.instanceCreationPaused\n ) ?? false,\n instanceCreationStartDate: toNumberValue(\n row.rt1_instanceCreationStartDate ?? row.instanceCreationStartDate\n ),\n lastReminderInteractionDate: toNumberValue(\n row.lastReminderInteractionDate ?? row.lastAlarmInteractionDate\n ),\n nextInstanceStartDate: toNumberValue(\n row.rt1_nextInstanceStartDate ?? row.nextInstanceStartDate\n ),\n notes: toStringValue(row.notes),\n projectId: toStringValue(row.project),\n raw: row,\n recurrenceRuleRaw: toStringValue(\n row.rt1_recurrenceRule ?? row.recurrenceRule\n ),\n reminderTime: toNumberValue(row.reminderTime),\n repeatTemplateSourceId: toStringValue(\n row.rt1_repeatingTemplate ?? row.repeatingTemplate\n ),\n repeaterMigrationDate: toNumberValue(row.repeaterMigrationDate),\n repeaterRaw: toStringValue(row.repeater),\n sortIndex: toNumberValue(row.index),\n start: toNumberValue(row.start),\n startBucket: toNumberValue(row.startBucket),\n startDate: toNumberValue(row.startDate),\n status: toNumberValue(row.status),\n stopDate: toNumberValue(row.stopDate),\n title: toStringValue(row.title),\n todayIndex: toNumberValue(row.todayIndex),\n todayIndexReferenceDate: toNumberValue(row.todayIndexReferenceDate),\n trashed: toBooleanValue(row.trashed) ?? false,\n type: toNumberValue(row.type),\n userModificationDate: toNumberValue(row.userModificationDate),\n uuid,\n };\n};\n\nconst normalizeAreaRecord = (row: SqliteRow): ThingsAreaRecord | null => {\n const uuid = toStringValue(row.uuid);\n\n if (!uuid) {\n return null;\n }\n\n return {\n raw: row,\n sortIndex: toNumberValue(row.index),\n title: toStringValue(row.title),\n uuid,\n visible: toBooleanValue(row.visible),\n };\n};\n\nconst normalizeTagRecord = (row: SqliteRow): ThingsTagRecord | null => {\n const uuid = toStringValue(row.uuid);\n\n if (!uuid) {\n return null;\n }\n\n return {\n parentId: toStringValue(row.parent),\n raw: row,\n shortcut: toStringValue(row.shortcut),\n sortIndex: toNumberValue(row.index),\n title: toStringValue(row.title),\n usedDate: toNumberValue(row.usedDate),\n uuid,\n };\n};\n\nconst normalizeChecklistItemRecord = (\n row: SqliteRow\n): ThingsChecklistItemRecord | null => {\n const uuid = toStringValue(row.uuid);\n\n if (!uuid) {\n return null;\n }\n\n return {\n creationDate: toNumberValue(row.creationDate),\n raw: row,\n sortIndex: toNumberValue(row.index),\n status: toNumberValue(row.status),\n stopDate: toNumberValue(row.stopDate),\n taskId: toStringValue(row.task),\n title: toStringValue(row.title),\n userModificationDate: toNumberValue(row.userModificationDate),\n uuid,\n };\n};\n\nconst normalizeTaskTagRecord = (row: SqliteRow): ThingsTaskTagRecord | null => {\n const taskId = toStringValue(row.tasks);\n const tagId = toStringValue(row.tags);\n return taskId && tagId ? { tagId, taskId } : null;\n};\n\nconst normalizeAreaTagRecord = (row: SqliteRow): ThingsAreaTagRecord | null => {\n const areaId = toStringValue(row.areas);\n const tagId = toStringValue(row.tags);\n return areaId && tagId ? { areaId, tagId } : null;\n};\n\nconst normalizeContactRecord = (row: SqliteRow): ThingsContactRecord | null => {\n const uuid = toStringValue(row.uuid);\n\n if (!uuid) {\n return null;\n }\n\n return {\n appleAddressBookId: toStringValue(row.appleAddressBookId),\n displayName: toStringValue(row.displayName),\n emails: toStringValue(row.emails),\n firstName: toStringValue(row.firstName),\n lastName: toStringValue(row.lastName),\n raw: row,\n uuid,\n };\n};\n\nexport const resolveThingsDatabasePath = (databaseUrl: string): string =>\n expandThingsDatabasePath(resolveInputPath(databaseUrl));\n\nexport const resolveDefaultThingsDatabasePath = (): string => {\n const resolved = findLatestThingsDatabasePath();\n\n if (!resolved) {\n throw new Error(\n `Could not find a Things database under ${THINGS_CONTAINER_PATH}. Pass --database-url with a main.sqlite path, a .thingsdatabase bundle, or a ThingsData-* directory.`\n );\n }\n\n return resolved;\n};\n\nexport const loadThingsDatabase = (\n databaseUrl?: string | null\n): ThingsDatabaseSnapshot => {\n const databasePath = databaseUrl\n ? resolveThingsDatabasePath(databaseUrl)\n : resolveDefaultThingsDatabasePath();\n\n if (!isReadableFile(databasePath)) {\n throw new Error(`Things database file not found: ${databasePath}`);\n }\n\n const database = new Database(databasePath, {\n fileMustExist: true,\n readonly: true,\n });\n\n try {\n return {\n areaTags: hasTable(database, \"TMAreaTag\")\n ? readRows(database, \"TMAreaTag\")\n .map(normalizeAreaTagRecord)\n .filter((record): record is ThingsAreaTagRecord => record !== null)\n : [],\n areas: hasTable(database, \"TMArea\")\n ? readRows(database, \"TMArea\")\n .map(normalizeAreaRecord)\n .filter((record): record is ThingsAreaRecord => record !== null)\n : [],\n checklistItems: hasTable(database, \"TMChecklistItem\")\n ? readRows(database, \"TMChecklistItem\")\n .map(normalizeChecklistItemRecord)\n .filter(\n (record): record is ThingsChecklistItemRecord => record !== null\n )\n : [],\n contacts: hasTable(database, \"TMContact\")\n ? readRows(database, \"TMContact\")\n .map(normalizeContactRecord)\n .filter((record): record is ThingsContactRecord => record !== null)\n : [],\n databasePath,\n tags: hasTable(database, \"TMTag\")\n ? readRows(database, \"TMTag\")\n .map(normalizeTagRecord)\n .filter((record): record is ThingsTagRecord => record !== null)\n : [],\n taskColumns: getTableColumns(database, \"TMTask\"),\n taskTags: hasTable(database, \"TMTaskTag\")\n ? readRows(database, \"TMTaskTag\")\n .map(normalizeTaskTagRecord)\n .filter((record): record is ThingsTaskTagRecord => record !== null)\n : [],\n tasks: readRows(database, \"TMTask\")\n .map(normalizeTaskRecord)\n .filter((record): record is ThingsTaskRecord => record !== null),\n };\n } finally {\n database.close();\n }\n};\n","import { randomUUID } from \"node:crypto\";\n\nimport { resolveLocalTimeZone } from \"@donebear/date-tz\";\n\nimport { fetchBootstrapRows, SYNC_CONTENT_MODELS } from \"../api/bootstrap\";\nimport { mutateModel } from \"../manage-api\";\nimport { writeWarning } from \"../output\";\nimport type { CliContext, WorkspaceSummary } from \"../types\";\nimport { listMeetDoneBearArchiveTargets } from \"./meet-done-bear\";\nimport { normalizeThingsLabelLookupKey } from \"./things-labels\";\nimport { buildThingsImportPlan } from \"./things-mapper\";\nimport type { ImportModelName, ThingsMetadataMode } from \"./things-mapper\";\nimport { loadThingsDatabase } from \"./things-sqlite\";\n\ninterface CommandContextLike {\n apiBaseUrl: string;\n token: string;\n localContext: {\n clientId: string;\n };\n}\n\ninterface RunThingsImportOptions {\n context: CliContext;\n commandContext: CommandContextLike;\n workspace: WorkspaceSummary;\n creatorId: string;\n databaseUrl?: string;\n metadataMode: ThingsMetadataMode;\n batchSize: number;\n dryRun: boolean;\n skipTeams: boolean;\n}\n\ntype SyncAction = \"INSERT\" | \"UPDATE\";\n\ninterface ImportTransaction {\n clientTxId: string;\n clientId: string;\n modelName: ImportModelName;\n modelId: string;\n action: SyncAction;\n payload: Record<string, unknown>;\n}\n\ninterface ImportExecutionSummary {\n inserted: number;\n updated: number;\n skipped: number;\n batches: number;\n}\n\ninterface PreparedTransactions {\n transactions: ImportTransaction[];\n inserted: number;\n updated: number;\n skipped: number;\n}\n\ninterface ExistingImportState {\n rowsByModel: Map<ImportModelName, unknown[]>;\n existingLabelIdsByTitle: Map<string, string>;\n}\n\nexport interface ThingsImportResult {\n workspace: WorkspaceSummary;\n databasePath: string;\n taskColumns: string[];\n counts: {\n source: Record<string, number>;\n planned: Record<string, number>;\n };\n execution: ImportExecutionSummary;\n dryRun: boolean;\n}\n\nconst WORKSPACE_SCOPED_MODELS: readonly ImportModelName[] = SYNC_CONTENT_MODELS;\n\nconst INSERT_ONLY_MODELS = new Set<ImportModelName>([\n \"TaskLabel\",\n \"TeamProject\",\n]);\n\nconst chunk = <T>(items: T[], size: number): T[][] => {\n const result: T[][] = [];\n\n for (let index = 0; index < items.length; index += size) {\n result.push(items.slice(index, index + size));\n }\n\n return result;\n};\n\nconst collectRowIds = (\n rows: unknown[],\n modelName: ImportModelName\n): Set<string> => {\n const ids = new Set<string>();\n\n for (const row of rows) {\n if (typeof row !== \"object\" || row === null) {\n continue;\n }\n\n const record = row as Record<string, unknown>;\n if (record.__class !== modelName || typeof record.id !== \"string\") {\n continue;\n }\n\n ids.add(record.id);\n }\n\n return ids;\n};\n\nconst createWorkspaceScopedRowMap = (\n modelNames: readonly ImportModelName[]\n): Map<ImportModelName, unknown[]> =>\n new Map(\n modelNames.map((modelName): [ImportModelName, unknown[]] => [modelName, []])\n );\n\nexport const collectWorkspaceScopedRowsByModel = (\n rows: unknown[],\n options: {\n workspaceId: string;\n modelNames: readonly ImportModelName[];\n }\n): Map<ImportModelName, unknown[]> => {\n const modelNames = new Set<string>(options.modelNames);\n const rowsByModel = createWorkspaceScopedRowMap(options.modelNames);\n\n for (const row of rows) {\n if (typeof row !== \"object\" || row === null) {\n continue;\n }\n\n const record = row as Record<string, unknown>;\n if (record.workspaceId !== options.workspaceId) {\n continue;\n }\n\n const modelName = record.__class;\n if (typeof modelName !== \"string\" || !modelNames.has(modelName)) {\n continue;\n }\n\n rowsByModel.get(modelName as ImportModelName)?.push(row);\n }\n\n return rowsByModel;\n};\n\nconst loadWorkspaceScopedRowsByModel = async (\n context: CliContext,\n options: {\n apiBaseUrl: string;\n token: string;\n workspaceId: string;\n modelNames: readonly ImportModelName[];\n }\n): Promise<Map<ImportModelName, unknown[]>> => {\n const { rows } = await fetchBootstrapRows(context, {\n apiBaseUrl: options.apiBaseUrl,\n modelNames: options.modelNames,\n token: options.token,\n workspaceId: options.workspaceId,\n });\n\n return collectWorkspaceScopedRowsByModel(rows, {\n modelNames: options.modelNames,\n workspaceId: options.workspaceId,\n });\n};\n\nconst loadExistingImportState = async (\n options: RunThingsImportOptions\n): Promise<ExistingImportState> => {\n let modelNames: readonly ImportModelName[];\n if (options.dryRun) {\n modelNames = [\"Label\"];\n } else if (options.skipTeams) {\n modelNames = WORKSPACE_SCOPED_MODELS.filter(\n (m) => m !== \"Team\" && m !== \"TeamProject\"\n );\n } else {\n modelNames = WORKSPACE_SCOPED_MODELS;\n }\n const rowsByModel = await loadWorkspaceScopedRowsByModel(options.context, {\n apiBaseUrl: options.commandContext.apiBaseUrl,\n modelNames,\n token: options.commandContext.token,\n workspaceId: options.workspace.id,\n });\n\n return {\n existingLabelIdsByTitle: buildExistingLabelIdsByTitle(rowsByModel),\n rowsByModel,\n };\n};\n\nconst buildExistingLabelIdsByTitle = (\n rowsByModel: Map<ImportModelName, unknown[]>\n): Map<string, string> => {\n const rows = rowsByModel.get(\"Label\") ?? [];\n const labelsByTitle = new Map<string, string>();\n\n for (const row of rows) {\n if (typeof row !== \"object\" || row === null) {\n continue;\n }\n\n const record = row as Record<string, unknown>;\n if (record.__class !== \"Label\") {\n continue;\n }\n\n const id = typeof record.id === \"string\" ? record.id : null;\n const title = typeof record.title === \"string\" ? record.title.trim() : \"\";\n\n if (!id || title.length === 0) {\n continue;\n }\n\n labelsByTitle.set(normalizeThingsLabelLookupKey(title), id);\n }\n\n return labelsByTitle;\n};\n\nconst buildExistingIds = (\n rowsByModel: Map<ImportModelName, unknown[]>\n): Map<ImportModelName, Set<string>> => {\n const entries = WORKSPACE_SCOPED_MODELS.map(\n (modelName): readonly [ImportModelName, Set<string>] => [\n modelName,\n collectRowIds(rowsByModel.get(modelName) ?? [], modelName),\n ]\n );\n\n return new Map(entries);\n};\n\nconst buildTransactions = (\n phaseItems: ReturnType<\n typeof buildThingsImportPlan\n >[\"phases\"][number][\"items\"],\n options: {\n existingIds: Map<ImportModelName, Set<string>>;\n clientId: string;\n }\n): PreparedTransactions => {\n const transactions: ImportTransaction[] = [];\n let inserted = 0;\n let updated = 0;\n let skipped = 0;\n\n for (const item of phaseItems) {\n const existingIds = options.existingIds.get(item.modelName) ?? new Set();\n const exists = existingIds.has(item.modelId);\n\n if (exists && INSERT_ONLY_MODELS.has(item.modelName)) {\n skipped += 1;\n continue;\n }\n\n const action: SyncAction = exists ? \"UPDATE\" : \"INSERT\";\n\n if (action === \"INSERT\") {\n inserted += 1;\n existingIds.add(item.modelId);\n } else {\n updated += 1;\n }\n\n transactions.push({\n action,\n clientId: options.clientId,\n clientTxId: randomUUID(),\n modelId: item.modelId,\n modelName: item.modelName,\n payload: item.payload,\n });\n }\n\n return { inserted, skipped, transactions, updated };\n};\n\nconst executeImportPlan = async (\n options: RunThingsImportOptions,\n plan: ReturnType<typeof buildThingsImportPlan>,\n rowsByModel: Map<ImportModelName, unknown[]>\n): Promise<ImportExecutionSummary> => {\n const execution: ImportExecutionSummary = {\n batches: 0,\n inserted: 0,\n skipped: 0,\n updated: 0,\n };\n const existingIds = buildExistingIds(rowsByModel);\n\n for (const phase of plan.phases) {\n const prepared = buildTransactions(phase.items, {\n clientId: options.commandContext.localContext.clientId,\n existingIds,\n });\n\n execution.inserted += prepared.inserted;\n execution.updated += prepared.updated;\n execution.skipped += prepared.skipped;\n\n const transactionBatches = chunk(prepared.transactions, options.batchSize);\n\n for (const transactionBatch of transactionBatches) {\n if (transactionBatch.length === 0) {\n continue;\n }\n\n await mutateModel(options.context, {\n baseUrl: options.commandContext.apiBaseUrl,\n request: {\n batchId: randomUUID(),\n transactions: transactionBatch,\n },\n token: options.commandContext.token,\n });\n\n execution.batches += 1;\n }\n }\n\n return execution;\n};\n\nconst archiveMeetDoneBearSample = async (\n options: RunThingsImportOptions,\n rowsByModel: Map<ImportModelName, unknown[]>\n): Promise<void> => {\n const targets = listMeetDoneBearArchiveTargets({\n existingHeadingIds: collectRowIds(\n rowsByModel.get(\"ProjectHeading\") ?? [],\n \"ProjectHeading\"\n ),\n existingProjectIds: collectRowIds(\n rowsByModel.get(\"Project\") ?? [],\n \"Project\"\n ),\n existingTaskIds: collectRowIds(rowsByModel.get(\"Task\") ?? [], \"Task\"),\n workspaceId: options.workspace.id,\n });\n\n if (targets.length === 0) {\n return;\n }\n\n const now = Date.now();\n\n try {\n await mutateModel(options.context, {\n baseUrl: options.commandContext.apiBaseUrl,\n request: {\n batchId: randomUUID(),\n transactions: targets.map((target) => ({\n action: \"ARCHIVE\" as const,\n clientId: options.commandContext.localContext.clientId,\n clientTxId: randomUUID(),\n modelId: target.modelId,\n modelName: target.modelName,\n payload: { archivedAt: now },\n })),\n },\n token: options.commandContext.token,\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : \"unknown error\";\n writeWarning(\n options.context,\n `Imported, but could not remove Meet Done Bear: ${message}`\n );\n }\n};\n\nexport const runThingsImport = async (\n options: RunThingsImportOptions\n): Promise<ThingsImportResult> => {\n const snapshot = loadThingsDatabase(options.databaseUrl);\n const existingState = await loadExistingImportState(options);\n const plan = buildThingsImportPlan({\n creatorId: options.creatorId,\n existingLabelsByTitle: existingState.existingLabelIdsByTitle,\n metadataMode: options.metadataMode,\n skipTeams: options.skipTeams,\n snapshot,\n timeZone: resolveLocalTimeZone(),\n workspaceId: options.workspace.id,\n });\n\n if (options.dryRun) {\n return {\n counts: plan.counts,\n databasePath: plan.databasePath,\n dryRun: true,\n execution: {\n batches: 0,\n inserted: 0,\n skipped: 0,\n updated: 0,\n },\n taskColumns: plan.taskColumns,\n workspace: options.workspace,\n };\n }\n const execution = await executeImportPlan(\n options,\n plan,\n existingState.rowsByModel\n );\n\n if (execution.inserted > 0) {\n await archiveMeetDoneBearSample(options, existingState.rowsByModel);\n }\n\n return {\n counts: plan.counts,\n databasePath: plan.databasePath,\n dryRun: false,\n execution,\n taskColumns: plan.taskColumns,\n workspace: options.workspace,\n };\n};\n","import type { Command } from \"commander\";\n\nimport { requireUserId, resolveCommandContext } from \"../command-context\";\nimport { normalizeWorkspaceRef } from \"../command-helpers\";\nimport { parsePositiveInteger } from \"../command-parsers\";\nimport type { ThingsMetadataMode } from \"../import/things-mapper\";\nimport { summarizeThingsImportResult } from \"../import/things-output\";\nimport { runThingsImport } from \"../import/things-runner\";\nimport { writeInfo, writeOutput, writeSuccess } from \"../output\";\nimport { contextFromCommand, runWithErrorHandling } from \"../runtime\";\nimport { resolveWorkspace } from \"../workspace-context\";\n\ninterface ThingsImportOptions {\n databaseUrl?: string;\n workspace?: string;\n skipTeams: boolean;\n metadataMode: string;\n batchSize: number;\n}\n\nconst parseMetadataMode = (value: string): ThingsMetadataMode => {\n const normalized = value.trim().toLowerCase();\n\n if (normalized === \"note\" || normalized === \"none\") {\n return normalized;\n }\n\n throw new Error(\n `Invalid metadata mode \"${value}\". Expected one of: note, none.`\n );\n};\n\nconst runThingsImportCommand = async (\n context: ReturnType<typeof contextFromCommand>,\n options: ThingsImportOptions,\n workspaceOverride: string | null\n): Promise<void> => {\n const commandContext = await resolveCommandContext(context);\n const creatorId = await requireUserId(context, commandContext);\n const metadataMode = parseMetadataMode(options.metadataMode);\n const { workspace, autoSelected } = await resolveWorkspace(context, {\n apiBaseUrl: commandContext.apiBaseUrl,\n storedWorkspaceId: commandContext.localContext.workspaceId,\n token: commandContext.token,\n workspaceRef: workspaceOverride ?? normalizeWorkspaceRef(options.workspace),\n });\n const result = await runThingsImport({\n batchSize: options.batchSize,\n commandContext,\n context,\n creatorId,\n databaseUrl: options.databaseUrl,\n dryRun: context.dryRun,\n metadataMode,\n skipTeams: options.skipTeams,\n workspace,\n });\n\n if (context.json) {\n writeOutput(context, result);\n return;\n }\n\n if (autoSelected) {\n writeInfo(context, `Auto-selected workspace: ${workspace.name}`);\n }\n\n const summary = summarizeThingsImportResult(result);\n writeSuccess(context, summary.successMessage);\n\n for (const line of summary.infoLines) {\n writeInfo(context, line);\n }\n};\n\nexport const registerImportCommands = (\n program: Command,\n workspaceOverride: string | null\n): void => {\n const importCommand = program\n .command(\"import\")\n .description(\"Import external data into Done Bear\");\n\n importCommand\n .command(\"things\")\n .description(\"Import a Things 3 SQLite export\")\n .option(\n \"--database-url <database-url>\",\n \"Path, file:// URL, sqlite:// URL, .thingsdatabase bundle, or ThingsData-* directory\"\n )\n .option(\"-w, --workspace <workspace>\", \"Workspace id, slug, or exact name\")\n .option(\n \"--skip-teams\",\n \"Skip importing Things Areas as Teams and TeamProject links\",\n false\n )\n .option(\n \"--metadata-mode <mode>\",\n \"How to preserve Things-only metadata: note|none\",\n \"none\"\n )\n .option(\n \"--batch-size <count>\",\n \"Maximum sync mutations per batch\",\n (value: string): number => parsePositiveInteger(value, \"Batch size\"),\n 100\n )\n .addHelpText(\n \"after\",\n `\nExamples:\n donebear import things --dry-run --json\n donebear import things --database-url ~/Backups/Things\\\\ Database.thingsdatabase --json\n donebear import things --database-url file:///Users/me/Backups/main.sqlite --workspace personal\n\nNotes:\n --database-url accepts a copied Things 3 export bundle, a direct main.sqlite path, or a ThingsData-* directory.\n --metadata-mode note preserves Things-only fields in task/project/team descriptions using a structured appendix.\n`\n )\n .action(async (options: ThingsImportOptions, command: Command) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runThingsImportCommand(context, options, workspaceOverride);\n });\n });\n};\n","import { randomUUID } from \"node:crypto\";\n\nimport type { Command } from \"commander\";\n\nimport { resolveCommandContext } from \"../command-context\";\nimport { normalizeWorkspaceRef, parseTaskNumberRef } from \"../command-helpers\";\nimport {\n loadLabelsByWorkspace,\n loadLabelsByWorkspaceIds,\n loadTaskByNumber,\n mutateModel,\n} from \"../manage-api\";\nimport {\n copyToClipboard,\n writeFormattedRows,\n writeInfo,\n writeOutput,\n writeSuccess,\n} from \"../output\";\nimport { contextFromCommand, runWithErrorHandling } from \"../runtime\";\nimport { formatEpochDate } from \"../task-defaults\";\nimport type { LabelRecord, TaskRecord } from \"../types\";\nimport {\n resolveWorkspace,\n resolveWorkspaceScope,\n scopeJsonFields,\n scopeLabel,\n} from \"../workspace-context\";\n\ninterface LabelListOptions {\n workspace?: string;\n}\n\ninterface LabelShowOptions {\n workspace?: string;\n}\n\nconst resolveLabel = async (\n context: ReturnType<typeof contextFromCommand>,\n options: {\n labelRef: string;\n commandContext: Awaited<ReturnType<typeof resolveCommandContext>>;\n workspaceRef: string | null;\n }\n): Promise<LabelRecord> => {\n const { workspace } = await resolveWorkspace(context, {\n apiBaseUrl: options.commandContext.apiBaseUrl,\n storedWorkspaceId: options.commandContext.localContext.workspaceId,\n token: options.commandContext.token,\n workspaceRef: options.workspaceRef,\n });\n\n const labels = await loadLabelsByWorkspace(context, {\n baseUrl: options.commandContext.apiBaseUrl,\n token: options.commandContext.token,\n workspaceId: workspace.id,\n });\n\n const normalized = options.labelRef.trim().toLowerCase();\n const found = labels.find(\n (l) =>\n l.id === options.labelRef ||\n l.title.toLowerCase() === normalized ||\n l.id.startsWith(options.labelRef)\n );\n\n if (!found) {\n throw new Error(`Label \"${options.labelRef}\" not found.`);\n }\n\n return found;\n};\n\nconst runLabelList = async (\n context: ReturnType<typeof contextFromCommand>,\n options: LabelListOptions\n): Promise<void> => {\n const commandContext = await resolveCommandContext(context);\n\n const scope = await resolveWorkspaceScope(context, {\n apiBaseUrl: commandContext.apiBaseUrl,\n storedWorkspaceId: commandContext.localContext.workspaceId,\n token: commandContext.token,\n workspaceRef: normalizeWorkspaceRef(options.workspace),\n });\n\n const allLabels =\n scope.mode === \"all\"\n ? await loadLabelsByWorkspaceIds(context, {\n baseUrl: commandContext.apiBaseUrl,\n token: commandContext.token,\n workspaceIds: scope.workspaces.map((w) => w.id),\n })\n : await loadLabelsByWorkspace(context, {\n baseUrl: commandContext.apiBaseUrl,\n token: commandContext.token,\n workspaceId: scope.workspace.id,\n });\n\n const sorted = [...allLabels].toSorted((a, b) =>\n a.title.localeCompare(b.title)\n );\n\n if (context.json) {\n writeOutput(context, {\n ...scopeJsonFields(scope),\n labels: sorted,\n total: sorted.length,\n });\n return;\n }\n\n const headers = [\"id\", \"title\", \"createdAt\", \"updatedAt\"];\n const rows = sorted.map((l) => [\n l.id,\n l.title,\n formatEpochDate(l.createdAt) ?? \"\",\n formatEpochDate(l.updatedAt) ?? \"\",\n ]);\n\n if (writeFormattedRows(context, sorted.length, headers, rows)) {\n return;\n }\n\n if (scope.mode === \"single\" && scope.autoSelected) {\n writeInfo(context, `Auto-selected workspace: ${scope.workspace.name}`);\n }\n\n if (sorted.length === 0) {\n writeInfo(context, \"No labels found.\");\n return;\n }\n\n writeInfo(context, `${scopeLabel(scope)} (${sorted.length} label(s))`);\n\n for (const labelRecord of sorted) {\n writeInfo(context, `${labelRecord.id.slice(0, 8)} ${labelRecord.title}`);\n }\n\n if (context.copy) {\n const text = sorted\n .map((l) => `${l.id.slice(0, 8)} ${l.title}`)\n .join(\"\\n\");\n copyToClipboard(text);\n }\n};\n\nconst runLabelShow = async (\n context: ReturnType<typeof contextFromCommand>,\n labelRef: string,\n options: LabelShowOptions\n): Promise<void> => {\n const commandContext = await resolveCommandContext(context);\n const label = await resolveLabel(context, {\n commandContext,\n labelRef,\n workspaceRef: normalizeWorkspaceRef(options.workspace),\n });\n\n if (context.json) {\n writeOutput(context, {\n createdAtIso: formatEpochDate(label.createdAt),\n label,\n updatedAtIso: formatEpochDate(label.updatedAt),\n });\n return;\n }\n\n writeSuccess(context, label.title);\n writeInfo(context, `id: ${label.id}`);\n writeInfo(context, `workspaceId: ${label.workspaceId}`);\n writeInfo(\n context,\n `createdAt: ${formatEpochDate(label.createdAt) ?? \"(none)\"}`\n );\n writeInfo(\n context,\n `updatedAt: ${formatEpochDate(label.updatedAt) ?? \"(none)\"}`\n );\n};\n\nconst resolveTaskForLabel = async (\n context: ReturnType<typeof contextFromCommand>,\n options: {\n taskRef: string;\n commandContext: Awaited<ReturnType<typeof resolveCommandContext>>;\n workspaceRef: string | null;\n }\n): Promise<TaskRecord> => {\n const taskNumber = parseTaskNumberRef(options.taskRef);\n\n const { workspace } = await resolveWorkspace(context, {\n apiBaseUrl: options.commandContext.apiBaseUrl,\n storedWorkspaceId: options.commandContext.localContext.workspaceId,\n token: options.commandContext.token,\n workspaceRef: options.workspaceRef,\n });\n\n const match = await loadTaskByNumber(context, {\n baseUrl: options.commandContext.apiBaseUrl,\n number: taskNumber,\n token: options.commandContext.token,\n workspaceId: workspace.id,\n });\n if (!match) {\n throw new Error(\n `Task ${taskNumber} not found in workspace \"${workspace.name}\".`\n );\n }\n return match;\n};\n\nconst runLabelCreate = async (\n context: ReturnType<typeof contextFromCommand>,\n title: string,\n options: { workspace?: string }\n): Promise<void> => {\n const commandContext = await resolveCommandContext(context);\n const { workspace } = await resolveWorkspace(context, {\n apiBaseUrl: commandContext.apiBaseUrl,\n storedWorkspaceId: commandContext.localContext.workspaceId,\n token: commandContext.token,\n workspaceRef: normalizeWorkspaceRef(options.workspace),\n });\n\n const labelId = randomUUID();\n const now = Date.now();\n await mutateModel(context, {\n baseUrl: commandContext.apiBaseUrl,\n request: {\n batchId: randomUUID(),\n transactions: [\n {\n action: \"INSERT\",\n clientId: commandContext.localContext.clientId,\n clientTxId: randomUUID(),\n modelId: labelId,\n modelName: \"Label\",\n payload: {\n createdAt: now,\n key: labelId.replaceAll(\"-\", \"\").slice(0, 8),\n title: title.trim(),\n updatedAt: now,\n workspaceId: workspace.id,\n },\n },\n ],\n },\n token: commandContext.token,\n });\n\n if (context.json) {\n writeOutput(context, { created: true, id: labelId, title: title.trim() });\n return;\n }\n writeSuccess(context, `Created label: ${title.trim()}`);\n};\n\nconst runLabelAdd = async (\n context: ReturnType<typeof contextFromCommand>,\n taskRef: string,\n labelRef: string,\n options: { workspace?: string }\n): Promise<void> => {\n const commandContext = await resolveCommandContext(context);\n const workspaceRef = normalizeWorkspaceRef(options.workspace);\n\n const task = await resolveTaskForLabel(context, {\n commandContext,\n taskRef,\n workspaceRef,\n });\n const label = await resolveLabel(context, {\n commandContext,\n labelRef,\n workspaceRef,\n });\n\n await mutateModel(context, {\n baseUrl: commandContext.apiBaseUrl,\n request: {\n batchId: randomUUID(),\n transactions: [\n {\n action: \"INSERT\",\n clientId: commandContext.localContext.clientId,\n clientTxId: randomUUID(),\n modelId: `${task.id}:${label.id}`,\n modelName: \"TaskLabel\",\n payload: {\n createdAt: Date.now(),\n labelId: label.id,\n taskId: task.id,\n workspaceId: task.workspaceId,\n },\n },\n ],\n },\n token: commandContext.token,\n });\n\n if (context.json) {\n writeOutput(context, {\n added: true,\n labelId: label.id,\n labelTitle: label.title,\n taskId: task.id,\n });\n return;\n }\n writeSuccess(context, `Added label \"${label.title}\" to task \"${task.title}\"`);\n};\n\nconst runLabelRemove = async (\n context: ReturnType<typeof contextFromCommand>,\n taskRef: string,\n labelRef: string,\n options: { workspace?: string }\n): Promise<void> => {\n const commandContext = await resolveCommandContext(context);\n const workspaceRef = normalizeWorkspaceRef(options.workspace);\n\n const task = await resolveTaskForLabel(context, {\n commandContext,\n taskRef,\n workspaceRef,\n });\n const label = await resolveLabel(context, {\n commandContext,\n labelRef,\n workspaceRef,\n });\n\n await mutateModel(context, {\n baseUrl: commandContext.apiBaseUrl,\n request: {\n batchId: randomUUID(),\n transactions: [\n {\n action: \"DELETE\",\n clientId: commandContext.localContext.clientId,\n clientTxId: randomUUID(),\n modelId: `${task.id}:${label.id}`,\n modelName: \"TaskLabel\",\n payload: {\n labelId: label.id,\n taskId: task.id,\n },\n },\n ],\n },\n token: commandContext.token,\n });\n\n if (context.json) {\n writeOutput(context, {\n labelId: label.id,\n labelTitle: label.title,\n removed: true,\n taskId: task.id,\n });\n return;\n }\n writeSuccess(\n context,\n `Removed label \"${label.title}\" from task \"${task.title}\"`\n );\n};\n\nexport const registerLabelCommands = (\n program: Command,\n workspaceOverride: string | null\n): void => {\n const label = program\n .command(\"label\")\n .alias(\"labels\")\n .description(\"Manage labels\")\n .addHelpText(\n \"after\",\n `\nExamples:\n donebear label\n donebear label list\n donebear label show bug\n donebear label create \"urgent\"\n donebear label add <task-number> <label>\n donebear label remove <task-number> <label>\n`\n )\n .action(async (_options: unknown, command: Command) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runLabelList(context, {});\n });\n });\n\n label\n .command(\"list\")\n .alias(\"ls\")\n .description(\"List labels\")\n .option(\"-w, --workspace <workspace>\", \"Workspace id, slug, or exact name\")\n .action(async (options: LabelListOptions, command: Command) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runLabelList(context, {\n ...options,\n workspace:\n workspaceOverride ??\n normalizeWorkspaceRef(options.workspace) ??\n undefined,\n });\n });\n });\n\n label\n .command(\"show\")\n .description(\"Show label details\")\n .argument(\"<id-or-title>\", \"Label id, title, or id prefix\")\n .option(\"-w, --workspace <workspace>\", \"Workspace id, slug, or exact name\")\n .action(\n async (labelRef: string, options: LabelShowOptions, command: Command) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runLabelShow(context, labelRef, {\n workspace:\n workspaceOverride ??\n normalizeWorkspaceRef(options.workspace) ??\n undefined,\n });\n });\n }\n );\n\n label\n .command(\"create\")\n .description(\"Create a new label\")\n .argument(\"<title>\", \"Label title\")\n .option(\"-w, --workspace <workspace>\", \"Workspace id, slug, or exact name\")\n .action(\n async (\n title: string,\n options: { workspace?: string },\n command: Command\n ) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runLabelCreate(context, title, {\n workspace:\n workspaceOverride ??\n normalizeWorkspaceRef(options.workspace) ??\n undefined,\n });\n });\n }\n );\n\n label\n .command(\"add\")\n .description(\"Add a label to a task\")\n .argument(\"<task-number>\", \"Workspace-scoped task number\")\n .argument(\"<label>\", \"Label id, title, or id prefix\")\n .option(\"-w, --workspace <workspace>\", \"Workspace id, slug, or exact name\")\n .action(\n async (\n taskRef: string,\n labelRef: string,\n options: { workspace?: string },\n command: Command\n ) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runLabelAdd(context, taskRef, labelRef, {\n workspace:\n workspaceOverride ??\n normalizeWorkspaceRef(options.workspace) ??\n undefined,\n });\n });\n }\n );\n\n label\n .command(\"remove\")\n .alias(\"rm\")\n .description(\"Remove a label from a task\")\n .argument(\"<task-number>\", \"Workspace-scoped task number\")\n .argument(\"<label>\", \"Label id, title, or id prefix\")\n .option(\"-w, --workspace <workspace>\", \"Workspace id, slug, or exact name\")\n .action(\n async (\n taskRef: string,\n labelRef: string,\n options: { workspace?: string },\n command: Command\n ) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runLabelRemove(context, taskRef, labelRef, {\n workspace:\n workspaceOverride ??\n normalizeWorkspaceRef(options.workspace) ??\n undefined,\n });\n });\n }\n );\n};\n","import { randomUUID } from \"node:crypto\";\n\nimport { createProjectMembershipId } from \"@donebear/sync-ids\";\nimport type { Command } from \"commander\";\n\nimport { requireUserId, resolveCommandContext } from \"../command-context\";\nimport { findByRef, normalizeWorkspaceRef } from \"../command-helpers\";\nimport { confirmAction } from \"../confirm\";\nimport {\n formatDateOnlyEpoch,\n formatInstantEpoch,\n parseCliDateOnlyToEpoch,\n} from \"../date-codecs\";\nimport { CliError, EXIT_CODES } from \"../errors\";\nimport { createIdempotentMutationId } from \"../import/model-id\";\nimport {\n loadProjectsByWorkspace,\n loadProjectsByWorkspaceIds,\n mutateModel,\n} from \"../manage-api\";\nimport {\n copyToClipboard,\n writeFormattedRows,\n writeInfo,\n writeOutput,\n writeSuccess,\n} from \"../output\";\nimport { contextFromCommand, runWithErrorHandling } from \"../runtime\";\nimport type { ProjectRecord, WorkspaceSummary } from \"../types\";\nimport {\n resolveWorkspace,\n resolveWorkspaceScope,\n scopeJsonFields,\n scopeLabel,\n} from \"../workspace-context\";\n\ntype ProjectStatus = \"active\" | \"done\" | \"archived\" | \"all\";\n\ninterface ProjectListOptions {\n workspace?: string;\n status: string;\n total?: boolean;\n format?: string;\n}\n\ninterface ProjectShowOptions {\n workspace?: string;\n}\n\ninterface ProjectAddOptions {\n workspace?: string;\n description?: string;\n targetDate?: string;\n idempotencyKey?: string;\n}\n\ninterface ProjectEditOptions {\n workspace?: string;\n name?: string;\n description?: string;\n clearDescription: boolean;\n status?: string;\n targetDate?: string;\n clearTargetDate: boolean;\n}\n\ninterface ProjectTargetOptions {\n workspace?: string;\n}\n\nconst parseProjectStatus = (value: string): ProjectStatus => {\n switch (value.trim().toLowerCase()) {\n case \"active\": {\n return \"active\";\n }\n case \"done\":\n case \"complete\":\n case \"completed\": {\n return \"done\";\n }\n case \"archived\":\n case \"archive\": {\n return \"archived\";\n }\n case \"all\": {\n return \"all\";\n }\n default: {\n throw new Error(\n `Invalid status \"${value}\". Expected one of: active, done, archived, all.`\n );\n }\n }\n};\n\nconst getProjectStatus = (\n project: ProjectRecord\n): Exclude<ProjectStatus, \"all\"> => {\n if (project.archivedAt !== null) {\n return \"archived\";\n }\n\n if (project.completedAt !== null) {\n return \"done\";\n }\n\n return \"active\";\n};\n\nconst parseTargetDate = (value: string | undefined): number | null =>\n parseCliDateOnlyToEpoch(value, \"target date\");\n\nconst generateProjectSlug = (name: string, id: string): string => {\n const slug = name\n .toLowerCase()\n .trim()\n .replaceAll(/[^a-z0-9]+/gu, \"-\")\n .replaceAll(/^-|-$/gu, \"\")\n .slice(0, 39);\n const shortId = id.replaceAll(\"-\", \"\").slice(0, 8);\n return slug ? `${slug}-${shortId}` : shortId;\n};\n\nconst filterProjects = (\n projects: ProjectRecord[],\n status: ProjectStatus\n): ProjectRecord[] => {\n if (status === \"all\") {\n return projects;\n }\n\n return projects.filter((p) => getProjectStatus(p) === status);\n};\n\nconst sortProjectsByUpdatedDesc = (\n projects: ProjectRecord[]\n): ProjectRecord[] =>\n [...projects].toSorted((a, b) => (b.updatedAt ?? 0) - (a.updatedAt ?? 0));\n\nconst resolveProjectReference = async (\n context: ReturnType<typeof contextFromCommand>,\n options: {\n projectRef: string;\n commandContext: Awaited<ReturnType<typeof resolveCommandContext>>;\n workspaceRef: string | null;\n }\n): Promise<{ project: ProjectRecord; workspace: WorkspaceSummary }> => {\n const { workspace } = await resolveWorkspace(context, {\n apiBaseUrl: options.commandContext.apiBaseUrl,\n storedWorkspaceId: options.commandContext.localContext.workspaceId,\n token: options.commandContext.token,\n workspaceRef: options.workspaceRef,\n });\n\n const projects = await loadProjectsByWorkspace(context, {\n baseUrl: options.commandContext.apiBaseUrl,\n token: options.commandContext.token,\n workspaceId: workspace.id,\n });\n\n const found = findByRef(options.projectRef, projects);\n\n if (!found) {\n throw new Error(`Project \"${options.projectRef}\" not found.`);\n }\n\n return { project: found, workspace };\n};\n\nconst runProjectList = async (\n context: ReturnType<typeof contextFromCommand>,\n options: ProjectListOptions\n): Promise<void> => {\n const commandContext = await resolveCommandContext(context);\n const requestedStatus = parseProjectStatus(options.status);\n\n const scope = await resolveWorkspaceScope(context, {\n apiBaseUrl: commandContext.apiBaseUrl,\n storedWorkspaceId: commandContext.localContext.workspaceId,\n token: commandContext.token,\n workspaceRef: normalizeWorkspaceRef(options.workspace),\n });\n\n const allProjects =\n scope.mode === \"all\"\n ? await loadProjectsByWorkspaceIds(context, {\n baseUrl: commandContext.apiBaseUrl,\n token: commandContext.token,\n workspaceIds: scope.workspaces.map((w) => w.id),\n })\n : await loadProjectsByWorkspace(context, {\n baseUrl: commandContext.apiBaseUrl,\n token: commandContext.token,\n workspaceId: scope.workspace.id,\n });\n\n const filtered = filterProjects(\n sortProjectsByUpdatedDesc(allProjects),\n requestedStatus\n );\n\n if (context.json) {\n writeOutput(context, {\n ...scopeJsonFields(scope),\n projects: filtered,\n status: requestedStatus,\n total: filtered.length,\n });\n return;\n }\n\n const headers = [\"id\", \"key\", \"name\", \"status\", \"targetDate\", \"updatedAt\"];\n const rows = filtered.map((p) => [\n p.id,\n p.key,\n p.name,\n getProjectStatus(p),\n formatDateOnlyEpoch(p.targetDate) ?? \"\",\n formatInstantEpoch(p.updatedAt) ?? \"\",\n ]);\n\n if (writeFormattedRows(context, filtered.length, headers, rows)) {\n return;\n }\n\n if (scope.mode === \"single\" && scope.autoSelected) {\n writeInfo(context, `Auto-selected workspace: ${scope.workspace.name}`);\n }\n\n if (filtered.length === 0) {\n writeInfo(context, \"No projects found.\");\n return;\n }\n\n writeInfo(context, `${scopeLabel(scope)} (${filtered.length} project(s))`);\n\n for (const project of filtered) {\n const status = getProjectStatus(project);\n const target = formatDateOnlyEpoch(project.targetDate);\n const suffix = target ? ` due ${target}` : \"\";\n writeInfo(\n context,\n `${project.id.slice(0, 8)} [${project.key}] ${project.name} (${status})${suffix}`\n );\n }\n\n if (context.copy) {\n const text = filtered\n .map(\n (p) =>\n `${p.id.slice(0, 8)} [${p.key}] ${p.name} (${getProjectStatus(p)})`\n )\n .join(\"\\n\");\n copyToClipboard(text);\n }\n};\n\nconst runProjectShow = async (\n context: ReturnType<typeof contextFromCommand>,\n projectRef: string,\n options: ProjectShowOptions\n): Promise<void> => {\n const commandContext = await resolveCommandContext(context);\n const { project, workspace } = await resolveProjectReference(context, {\n commandContext,\n projectRef,\n workspaceRef: normalizeWorkspaceRef(options.workspace),\n });\n\n if (context.json) {\n writeOutput(context, {\n archivedAtIso: formatInstantEpoch(project.archivedAt),\n completedAtIso: formatInstantEpoch(project.completedAt),\n createdAtIso: formatInstantEpoch(project.createdAt),\n project,\n status: getProjectStatus(project),\n targetDateIso: formatDateOnlyEpoch(project.targetDate),\n updatedAtIso: formatInstantEpoch(project.updatedAt),\n workspace,\n });\n return;\n }\n\n writeSuccess(context, project.name);\n writeInfo(context, `id: ${project.id}`);\n writeInfo(context, `key: ${project.key}`);\n writeInfo(context, `status: ${getProjectStatus(project)}`);\n writeInfo(context, `workspaceId: ${project.workspaceId}`);\n writeInfo(\n context,\n `targetDate: ${formatDateOnlyEpoch(project.targetDate) ?? \"(none)\"}`\n );\n writeInfo(\n context,\n `createdAt: ${formatInstantEpoch(project.createdAt) ?? \"(none)\"}`\n );\n writeInfo(\n context,\n `updatedAt: ${formatInstantEpoch(project.updatedAt) ?? \"(none)\"}`\n );\n\n if (project.description) {\n writeInfo(context, `description: ${project.description}`);\n }\n};\n\nconst resolveProjectName = async (\n context: ReturnType<typeof contextFromCommand>,\n rawName: string | undefined\n): Promise<string> => {\n if (rawName) {\n const trimmed = rawName.trim();\n if (trimmed.length > 0) {\n return trimmed;\n }\n }\n\n const { promptForValue } = await import(\"../prompt\");\n const prompted = await promptForValue(context, \"Project name\");\n\n if (prompted) {\n return prompted;\n }\n\n throw new CliError(\n \"Project name is required.\",\n EXIT_CODES.VALIDATION,\n 'Provide a name: donebear project add \"My project\"'\n );\n};\n\nconst runProjectAdd = async (\n context: ReturnType<typeof contextFromCommand>,\n name: string | undefined,\n options: ProjectAddOptions\n): Promise<void> => {\n const commandContext = await resolveCommandContext(context);\n const userId = await requireUserId(context, commandContext);\n const normalizedName = await resolveProjectName(context, name);\n\n const { workspace, autoSelected } = await resolveWorkspace(context, {\n apiBaseUrl: commandContext.apiBaseUrl,\n storedWorkspaceId: commandContext.localContext.workspaceId,\n token: commandContext.token,\n workspaceRef: normalizeWorkspaceRef(options.workspace),\n });\n\n const idempotencyId = (part: \"model\" | \"tx\" | \"batch\"): string | null =>\n options.idempotencyKey\n ? createIdempotentMutationId({\n key: options.idempotencyKey,\n modelName: \"Project\",\n part,\n workspaceId: workspace.id,\n })\n : null;\n\n const projectId = idempotencyId(\"model\") ?? randomUUID();\n const now = Date.now();\n const key = generateProjectSlug(normalizedName, projectId);\n\n await mutateModel(context, {\n baseUrl: commandContext.apiBaseUrl,\n request: {\n batchId: idempotencyId(\"batch\") ?? randomUUID(),\n transactions: [\n {\n action: \"INSERT\",\n clientId: options.idempotencyKey\n ? \"cli-idem\"\n : commandContext.localContext.clientId,\n clientTxId: idempotencyId(\"tx\") ?? randomUUID(),\n modelId: projectId,\n modelName: \"Project\",\n payload: {\n archivedAt: null,\n completedAt: null,\n createdAt: now,\n creatorId: userId,\n description: options.description?.trim() || null,\n key,\n name: normalizedName,\n sortOrder: 0,\n status: \"active\",\n targetDate: parseTargetDate(options.targetDate),\n updatedAt: now,\n workspaceId: workspace.id,\n },\n },\n {\n action: \"INSERT\",\n clientId: options.idempotencyKey\n ? \"cli-idem\"\n : commandContext.localContext.clientId,\n clientTxId: randomUUID(),\n modelId: createProjectMembershipId({\n projectId,\n userId,\n workspaceId: workspace.id,\n }),\n modelName: \"ProjectMembership\",\n payload: {\n createdAt: now,\n projectId,\n userId,\n workspaceId: workspace.id,\n },\n },\n ],\n },\n token: commandContext.token,\n });\n\n if (context.json) {\n writeOutput(context, {\n autoSelected,\n created: true,\n id: projectId,\n key,\n workspaceId: workspace.id,\n workspaceName: workspace.name,\n });\n return;\n }\n\n if (autoSelected) {\n writeInfo(context, `Auto-selected workspace: ${workspace.name}`);\n }\n\n writeSuccess(context, `Added project: ${normalizedName}`);\n writeInfo(context, `id: ${projectId}`);\n writeInfo(context, `key: ${key}`);\n};\n\nconst buildProjectUpdates = (\n options: ProjectEditOptions\n): Record<string, unknown> => {\n if (options.clearDescription && typeof options.description === \"string\") {\n throw new Error(\n \"Use either --description or --clear-description, not both.\"\n );\n }\n\n if (options.clearTargetDate && typeof options.targetDate === \"string\") {\n throw new Error(\n \"Use either --target-date or --clear-target-date, not both.\"\n );\n }\n\n const updates: Record<string, unknown> = {};\n\n if (typeof options.name === \"string\") {\n const name = options.name.trim();\n if (name.length === 0) {\n throw new Error(\"Project name cannot be empty.\");\n }\n updates.name = name;\n }\n\n if (options.clearDescription) {\n updates.description = null;\n } else if (typeof options.description === \"string\") {\n const desc = options.description.trim();\n updates.description = desc.length > 0 ? desc : null;\n }\n\n if (options.clearTargetDate) {\n updates.targetDate = null;\n } else if (typeof options.targetDate === \"string\") {\n updates.targetDate = parseTargetDate(options.targetDate);\n }\n\n if (typeof options.status === \"string\") {\n applyStatusToUpdates(updates, parseProjectStatus(options.status));\n }\n\n if (Object.keys(updates).length === 0) {\n throw new Error(\n \"No updates provided. Use --name, --description, --clear-description, --status, --target-date, or --clear-target-date.\"\n );\n }\n\n updates.updatedAt = Date.now();\n return updates;\n};\n\nconst applyStatusToUpdates = (\n updates: Record<string, unknown>,\n status: ProjectStatus\n): void => {\n if (status === \"done\") {\n updates.completedAt = Date.now();\n updates.archivedAt = null;\n } else if (status === \"active\") {\n updates.completedAt = null;\n updates.archivedAt = null;\n } else if (status === \"archived\") {\n updates.archivedAt = Date.now();\n }\n};\n\nconst runProjectEdit = async (\n context: ReturnType<typeof contextFromCommand>,\n projectRef: string,\n options: ProjectEditOptions\n): Promise<void> => {\n const updates = buildProjectUpdates(options);\n\n const commandContext = await resolveCommandContext(context);\n const { project } = await resolveProjectReference(context, {\n commandContext,\n projectRef,\n workspaceRef: normalizeWorkspaceRef(options.workspace),\n });\n\n await mutateModel(context, {\n baseUrl: commandContext.apiBaseUrl,\n request: {\n batchId: randomUUID(),\n transactions: [\n {\n action: \"UPDATE\",\n clientId: commandContext.localContext.clientId,\n clientTxId: randomUUID(),\n modelId: project.id,\n modelName: \"Project\",\n payload: updates,\n },\n ],\n },\n token: commandContext.token,\n });\n\n if (context.json) {\n writeOutput(context, { action: \"UPDATE\", id: project.id, ok: true });\n return;\n }\n\n writeSuccess(context, `Updated project: ${project.id}`);\n};\n\nconst runProjectMutation = async (\n context: ReturnType<typeof contextFromCommand>,\n projectRef: string,\n payload: {\n workspaceRef: string | null;\n action: \"UPDATE\" | \"ARCHIVE\" | \"UNARCHIVE\";\n data: Record<string, unknown>;\n successMessage: string;\n }\n): Promise<void> => {\n const commandContext = await resolveCommandContext(context);\n const { project } = await resolveProjectReference(context, {\n commandContext,\n projectRef,\n workspaceRef: payload.workspaceRef,\n });\n\n await mutateModel(context, {\n baseUrl: commandContext.apiBaseUrl,\n request: {\n batchId: randomUUID(),\n transactions: [\n {\n action: payload.action,\n clientId: commandContext.localContext.clientId,\n clientTxId: randomUUID(),\n modelId: project.id,\n modelName: \"Project\",\n payload: payload.data,\n },\n ],\n },\n token: commandContext.token,\n });\n\n if (context.json) {\n writeOutput(context, { action: payload.action, id: project.id, ok: true });\n return;\n }\n\n writeSuccess(context, `${payload.successMessage}: ${project.id}`);\n};\n\nconst runProjectMembershipChange = async (\n context: ReturnType<typeof contextFromCommand>,\n projectRef: string,\n options: { workspaceRef: string | null; membershipAction: \"join\" | \"leave\" }\n): Promise<void> => {\n const commandContext = await resolveCommandContext(context);\n const userId = await requireUserId(context, commandContext);\n const { project, workspace } = await resolveProjectReference(context, {\n commandContext,\n projectRef,\n workspaceRef: options.workspaceRef,\n });\n\n const membershipId = createProjectMembershipId({\n projectId: project.id,\n userId,\n workspaceId: workspace.id,\n });\n const now = Date.now();\n const joining = options.membershipAction === \"join\";\n\n let action: \"joined\" | \"left\" | \"already_member\" | \"not_a_member\" = joining\n ? \"joined\"\n : \"left\";\n\n try {\n await mutateModel(context, {\n baseUrl: commandContext.apiBaseUrl,\n request: {\n batchId: randomUUID(),\n transactions: [\n {\n action: joining ? \"INSERT\" : \"DELETE\",\n clientId: commandContext.localContext.clientId,\n clientTxId: randomUUID(),\n modelId: membershipId,\n modelName: \"ProjectMembership\",\n payload: joining\n ? {\n createdAt: now,\n projectId: project.id,\n userId,\n workspaceId: workspace.id,\n }\n : {\n projectId: project.id,\n userId,\n workspaceId: workspace.id,\n },\n },\n ],\n },\n token: commandContext.token,\n });\n } catch (error) {\n // The membership id is deterministic, so joining twice trips the primary\n // key and leaving a project you are not in deletes nothing. Both are the\n // idempotent no-change case, not failures.\n const message = error instanceof Error ? error.message : \"\";\n if (joining && message.includes(\"duplicate key\")) {\n action = \"already_member\";\n } else if (!joining && message.includes(\"record not found\")) {\n action = \"not_a_member\";\n } else {\n throw error;\n }\n }\n\n if (context.json) {\n writeOutput(context, { action, id: project.id, ok: true });\n return;\n }\n\n switch (action) {\n case \"joined\": {\n writeSuccess(context, `Joined project: ${project.name}`);\n writeInfo(context, \"It now shows under Your projects in the sidebar.\");\n break;\n }\n case \"left\": {\n writeSuccess(context, `Left project: ${project.name}`);\n break;\n }\n case \"already_member\": {\n writeInfo(context, `Already in project: ${project.name}`);\n break;\n }\n case \"not_a_member\": {\n writeInfo(context, `Not in project: ${project.name}`);\n break;\n }\n default: {\n break;\n }\n }\n};\n\nexport const registerProjectCommands = (\n program: Command,\n workspaceOverride: string | null\n): void => {\n const project = program\n .command(\"project\")\n .alias(\"projects\")\n .description(\"Manage projects\")\n .addHelpText(\n \"after\",\n `\nExamples:\n donebear project list --json\n donebear project add \"Q1 Launch\" --json\n donebear project add \"Website Redesign\" --target-date 2026-06-30 --json\n donebear project edit \"Q1 Launch\" --target-date 2026-03-31 --json\n donebear project done \"Q1 Launch\" --json\n\nDate format: YYYY-MM-DD (e.g. 2026-03-31)\nProject id: full UUID, slug, id prefix, or name\nStatus: active | done | archived | all\n\nAgent tip: run \"donebear spec project add\" for full option reference\n`\n )\n .action(async (_options: unknown, command: Command) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runProjectList(context, { status: \"active\" });\n });\n });\n\n project\n .command(\"list\")\n .alias(\"ls\")\n .description(\"List projects\")\n .option(\"-w, --workspace <workspace>\", \"Workspace id, slug, or exact name\")\n .option(\"-s, --status <status>\", \"active|done|archived|all\", \"active\")\n .action(async (options: ProjectListOptions, command: Command) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runProjectList(context, {\n ...options,\n workspace:\n workspaceOverride ??\n normalizeWorkspaceRef(options.workspace) ??\n undefined,\n });\n });\n });\n\n project\n .command(\"show\")\n .description(\"Show project details\")\n .argument(\"<id-or-key>\", \"Project id, key, or id prefix\")\n .option(\"-w, --workspace <workspace>\", \"Workspace id, slug, or exact name\")\n .action(\n async (\n projectRef: string,\n options: ProjectShowOptions,\n command: Command\n ) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runProjectShow(context, projectRef, {\n workspace:\n workspaceOverride ??\n normalizeWorkspaceRef(options.workspace) ??\n undefined,\n });\n });\n }\n );\n\n project\n .command(\"add\")\n .alias(\"create\")\n .description(\"Create a project\")\n .argument(\"[name]\", \"Project name (prompted interactively if omitted)\")\n .option(\"-w, --workspace <workspace>\", \"Workspace id, slug, or exact name\")\n .option(\"-d, --description <text>\", \"Project description\")\n .option(\"--target-date <date>\", \"Target date (YYYY-MM-DD)\")\n .option(\n \"--idempotency-key <key>\",\n \"Stable key making retries safe (repeated calls create only one project)\"\n )\n .action(\n async (\n name: string | undefined,\n options: ProjectAddOptions,\n command: Command\n ) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runProjectAdd(context, name, {\n ...options,\n workspace:\n workspaceOverride ??\n normalizeWorkspaceRef(options.workspace) ??\n undefined,\n });\n });\n }\n );\n\n project\n .command(\"edit\")\n .description(\"Update project fields\")\n .argument(\"<id-or-key>\", \"Project id, key, or id prefix\")\n .option(\"-w, --workspace <workspace>\", \"Workspace id, slug, or exact name\")\n .option(\"--name <name>\", \"Replace project name\")\n .option(\"-d, --description <text>\", \"Replace project description\")\n .option(\"--clear-description\", \"Clear project description\")\n .option(\"--status <status>\", \"Set status (active|done|archived)\")\n .option(\"--target-date <date>\", \"Set target date (YYYY-MM-DD)\")\n .option(\"--clear-target-date\", \"Clear target date\")\n .action(\n async (\n projectRef: string,\n options: ProjectEditOptions,\n command: Command\n ) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runProjectEdit(context, projectRef, {\n ...options,\n workspace:\n workspaceOverride ??\n normalizeWorkspaceRef(options.workspace) ??\n undefined,\n });\n });\n }\n );\n\n project\n .command(\"join\")\n .description(\"Join a project (adds it to Your projects in the sidebar)\")\n .argument(\"<id-or-key>\", \"Project id, key, or id prefix\")\n .option(\"-w, --workspace <workspace>\", \"Workspace id, slug, or exact name\")\n .action(\n async (\n projectRef: string,\n options: ProjectTargetOptions,\n command: Command\n ) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runProjectMembershipChange(context, projectRef, {\n membershipAction: \"join\",\n workspaceRef:\n workspaceOverride ?? normalizeWorkspaceRef(options.workspace),\n });\n });\n }\n );\n\n project\n .command(\"leave\")\n .description(\"Leave a project (removes it from Your projects)\")\n .argument(\"<id-or-key>\", \"Project id, key, or id prefix\")\n .option(\"-w, --workspace <workspace>\", \"Workspace id, slug, or exact name\")\n .action(\n async (\n projectRef: string,\n options: ProjectTargetOptions,\n command: Command\n ) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runProjectMembershipChange(context, projectRef, {\n membershipAction: \"leave\",\n workspaceRef:\n workspaceOverride ?? normalizeWorkspaceRef(options.workspace),\n });\n });\n }\n );\n\n project\n .command(\"done\")\n .alias(\"complete\")\n .description(\"Mark a project as completed\")\n .argument(\"<id-or-key>\", \"Project id, key, or id prefix\")\n .option(\"-w, --workspace <workspace>\", \"Workspace id, slug, or exact name\")\n .action(\n async (\n projectRef: string,\n options: ProjectTargetOptions,\n command: Command\n ) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n const now = Date.now();\n await runProjectMutation(context, projectRef, {\n action: \"UPDATE\",\n data: { completedAt: now, updatedAt: now },\n successMessage: \"Marked done\",\n workspaceRef:\n workspaceOverride ?? normalizeWorkspaceRef(options.workspace),\n });\n });\n }\n );\n\n project\n .command(\"archive\")\n .description(\"Archive a project\")\n .argument(\"<id-or-key>\", \"Project id, key, or id prefix\")\n .option(\"-w, --workspace <workspace>\", \"Workspace id, slug, or exact name\")\n .action(\n async (\n projectRef: string,\n options: ProjectTargetOptions,\n command: Command\n ) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n const confirmed = await confirmAction(\n context,\n `Archive project \"${projectRef}\"?`\n );\n if (!confirmed) {\n throw new CliError(\"Cancelled\", EXIT_CODES.CANCELLED);\n }\n await runProjectMutation(context, projectRef, {\n action: \"ARCHIVE\",\n data: { archivedAt: Date.now() },\n successMessage: \"Archived\",\n workspaceRef:\n workspaceOverride ?? normalizeWorkspaceRef(options.workspace),\n });\n });\n }\n );\n\n project\n .command(\"unarchive\")\n .alias(\"restore\")\n .description(\"Unarchive a project\")\n .argument(\"<id-or-key>\", \"Project id, key, or id prefix\")\n .option(\"-w, --workspace <workspace>\", \"Workspace id, slug, or exact name\")\n .action(\n async (\n projectRef: string,\n options: ProjectTargetOptions,\n command: Command\n ) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runProjectMutation(context, projectRef, {\n action: \"UNARCHIVE\",\n data: {},\n successMessage: \"Unarchived\",\n workspaceRef:\n workspaceOverride ?? normalizeWorkspaceRef(options.workspace),\n });\n });\n }\n );\n};\n","import type { Command } from \"commander\";\n\nimport { resolveCommandContext } from \"../command-context\";\nimport {\n normalizeWorkspaceRef,\n parseTaskState,\n taskListHeaders,\n taskListLines,\n taskListRows,\n} from \"../command-helpers\";\nimport { parsePositiveInteger } from \"../command-parsers\";\nimport { CliError, EXIT_CODES } from \"../errors\";\nimport { loadTasksByWorkspace, loadTasksByWorkspaceIds } from \"../manage-api\";\nimport {\n copyToClipboard,\n writeFormattedRows,\n writeInfo,\n writeOutput,\n} from \"../output\";\nimport { promptForValue } from \"../prompt\";\nimport { contextFromCommand, runWithErrorHandling } from \"../runtime\";\nimport {\n resolveWorkspaceScope,\n scopeJsonFields,\n scopeLabel,\n} from \"../workspace-context\";\nimport { filterTasks } from \"./task\";\n\nconst DEFAULT_SEARCH_LIMIT = 20;\n\ninterface SearchOptions {\n workspace?: string;\n state: string;\n limit: number;\n}\n\nconst resolveQuery = async (\n context: ReturnType<typeof contextFromCommand>,\n rawQuery: string | undefined\n): Promise<string> => {\n if (rawQuery) {\n const trimmed = rawQuery.trim();\n if (trimmed.length > 0) {\n return trimmed;\n }\n }\n\n const prompted = await promptForValue(context, \"Search query\");\n\n if (prompted) {\n return prompted;\n }\n\n throw new CliError(\n \"Search query is required.\",\n EXIT_CODES.VALIDATION,\n 'Provide a query: donebear search \"my query\"'\n );\n};\n\nconst runSearch = async (\n context: ReturnType<typeof contextFromCommand>,\n query: string | undefined,\n options: SearchOptions,\n workspaceOverride: string | null\n): Promise<void> => {\n const commandContext = await resolveCommandContext(context);\n const requestedState = parseTaskState(options.state);\n const trimmedQuery = await resolveQuery(context, query);\n\n const scope = await resolveWorkspaceScope(context, {\n apiBaseUrl: commandContext.apiBaseUrl,\n storedWorkspaceId: commandContext.localContext.workspaceId,\n token: commandContext.token,\n workspaceRef: workspaceOverride ?? normalizeWorkspaceRef(options.workspace),\n });\n\n const tasks =\n scope.mode === \"all\"\n ? await loadTasksByWorkspaceIds(context, {\n baseUrl: commandContext.apiBaseUrl,\n token: commandContext.token,\n workspaceIds: scope.workspaces.map((w) => w.id),\n })\n : await loadTasksByWorkspace(context, {\n baseUrl: commandContext.apiBaseUrl,\n token: commandContext.token,\n workspaceId: scope.workspace.id,\n });\n\n const filtered = filterTasks(tasks, {\n search: trimmedQuery,\n state: requestedState,\n view: null,\n });\n\n const limited = filtered.slice(0, options.limit);\n\n if (context.json) {\n writeOutput(context, {\n ...scopeJsonFields(scope),\n count: limited.length,\n query: trimmedQuery,\n state: requestedState,\n tasks: limited,\n total: filtered.length,\n });\n return;\n }\n\n if (\n writeFormattedRows(\n context,\n filtered.length,\n taskListHeaders(),\n taskListRows(limited)\n )\n ) {\n return;\n }\n\n if (scope.mode === \"single\" && scope.autoSelected) {\n writeInfo(context, `Auto-selected workspace: ${scope.workspace.name}`);\n }\n\n if (limited.length === 0) {\n writeInfo(context, `No tasks found matching \"${trimmedQuery}\".`);\n return;\n }\n\n writeInfo(\n context,\n `${scopeLabel(scope)}: \"${trimmedQuery}\" (${limited.length}/${filtered.length})`\n );\n\n for (const line of taskListLines(limited)) {\n writeInfo(context, line);\n }\n\n if (context.copy) {\n copyToClipboard(taskListLines(limited).join(\"\\n\"));\n }\n};\n\nexport const registerSearchCommand = (\n program: Command,\n workspaceOverride: string | null\n): void => {\n program\n .command(\"search\")\n .description(\"Search tasks by title or description\")\n .argument(\"[query]\", \"Search query (prompted interactively if omitted)\")\n .option(\"-w, --workspace <workspace>\", \"Workspace id, slug, or exact name\")\n .option(\"-s, --state <state>\", \"open|done|archived|all\", \"all\")\n .option(\n \"-n, --limit <count>\",\n \"Maximum number of results\",\n (value: string): number => parsePositiveInteger(value, \"Limit\"),\n DEFAULT_SEARCH_LIMIT\n )\n .addHelpText(\n \"after\",\n `\nExamples:\n donebear search \"meeting\"\n donebear search \"launch\" --state open\n donebear search \"Q1\" --format csv --copy\n donebear search \"review\" --total\n donebear search # prompts for query interactively\n`\n )\n .action(\n async (\n query: string | undefined,\n options: SearchOptions,\n command: Command\n ) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runSearch(context, query, options, workspaceOverride);\n });\n }\n );\n};\n","// donebear spec [command] [subcommand]\n// Progressive CLI spec for agent discovery (no auth required)\n\nimport type { Command } from \"commander\";\n\nimport { writeJson } from \"../output\";\nimport { contextFromCommand, runWithErrorHandling } from \"../runtime\";\n\nexport const OVERVIEW = {\n authentication: \"Set DONEBEAR_TOKEN env var, or run: donebear auth login\",\n commands: {\n \"api-key\": {\n description: \"Manage personal API keys\",\n quick_example: \"donebear api-key list --json\",\n subcommands: [\"create\", \"list\", \"revoke\"],\n },\n auth: {\n description: \"Authentication\",\n quick_example: \"donebear auth status --json\",\n subcommands: [\"login\", \"status\", \"logout\"],\n },\n comment: {\n description: \"Read and write task comments\",\n quick_example: \"donebear comment 12 --json\",\n subcommands: [\"list\", \"add\", \"edit\", \"remove\"],\n },\n context: {\n description:\n \"Current workspace snapshot: user, task counts, recent tasks, active projects\",\n quick_example: \"donebear context --json\",\n },\n doctor: {\n description:\n \"Run environment diagnostics: CLI version, auth, workspace, AI agent detection\",\n quick_example: \"donebear doctor --json\",\n },\n export: {\n description: \"Export a workspace as a portable JSON archive\",\n quick_example: \"donebear export > backup.json\",\n },\n guide: {\n description:\n \"Done Bear concepts for agents: views, dates, editing, bulk, checklists, comments, projects, search, workspaces, agents\",\n quick_example: \"donebear guide views\",\n },\n history: {\n description: \"Workspace audit log (recent sync actions)\",\n quick_example: \"donebear history --json\",\n },\n import: {\n description: \"Import external data into Done Bear\",\n quick_example: \"donebear import things --dry-run --json\",\n subcommands: [\"things\"],\n },\n label: {\n description: \"Manage workspace labels and task label assignments\",\n quick_example: \"donebear label list --json\",\n subcommands: [\"list\", \"show\", \"create\", \"add\", \"remove\"],\n },\n project: {\n description: \"Manage projects\",\n quick_example: \"donebear project list --json\",\n subcommands: [\n \"list\",\n \"show\",\n \"add\",\n \"edit\",\n \"join\",\n \"leave\",\n \"done\",\n \"archive\",\n \"unarchive\",\n ],\n },\n search: {\n description: \"Search tasks by title/description across the workspace\",\n quick_example: 'donebear search \"login bug\" --json',\n },\n spec: {\n description: \"Progressive CLI spec for agent discovery (this command)\",\n quick_example: \"donebear spec task add\",\n },\n task: {\n description: \"Create and manage tasks\",\n quick_example: 'donebear task add \"Fix bug\" --when today --json',\n subcommands: [\n \"list\",\n \"show\",\n \"add\",\n \"edit\",\n \"done\",\n \"reopen\",\n \"archive\",\n \"unarchive\",\n \"read\",\n \"append\",\n \"prepend\",\n \"random\",\n \"checklist\",\n ],\n },\n team: {\n description: \"List workspace teams\",\n quick_example: \"donebear team list --json\",\n subcommands: [\"list\", \"show\"],\n },\n today: {\n description: \"List today's tasks (shortcut for task list --view today)\",\n quick_example: \"donebear today --json\",\n },\n whoami: {\n description: \"Show the current authenticated user\",\n quick_example: \"donebear whoami --json\",\n },\n workspace: {\n description: \"Manage workspaces\",\n quick_example: \"donebear workspace list --json\",\n subcommands: [\n \"list\",\n \"current\",\n \"use\",\n \"clear\",\n \"create\",\n \"join\",\n \"members\",\n \"invitations\",\n \"invite\",\n ],\n },\n },\n global_options: {\n \"--copy\": \"Copy output to clipboard\",\n \"--dry-run\": \"Preview mutations without executing\",\n \"--format\": \"text|json|csv|tsv|yaml\",\n \"--jq <expression>\": \"Filter output with a JMESPath expression\",\n \"--json\": \"Machine-readable JSON output (use this for agent scripting)\",\n \"--limit <n>\": \"Limit output to N items (for array results)\",\n \"--total\": \"Print count only\",\n \"-q, --quiet\": \"Suppress status output (implies --json)\",\n \"-y, --yes\": \"Skip confirmation prompts\",\n },\n output_behavior:\n \"Auto-detects TTY vs pipe: JSON output activates automatically when piped to another command.\",\n tip: \"Drill into any command: donebear spec <command> [subcommand] e.g. donebear spec task add\",\n workspace_targeting:\n \"Prefix any command: donebear workspace=<slug> task list\",\n};\n\n// Detailed specs keyed by \"command\" or \"command subcommand\"\nexport const COMMAND_SPECS: Record<string, object> = {\n \"api-key create\": {\n arguments: {\n label: {\n description: \"Human-readable label for the key\",\n required: true,\n type: \"string\",\n },\n },\n command: \"api-key create\",\n examples: [\n 'donebear api-key create \"Raycast\" --json',\n 'donebear api-key create \"CI\" --permissions read-only --expires 90d --json',\n 'donebear api-key create \"Scoped\" --workspaces my-org,side-project --expires 1y --json',\n ],\n json_output: {\n createdAt: \"string\",\n expiresAt: \"string | null\",\n id: \"string\",\n keyPrefix: \"string\",\n label: \"string\",\n scopes: \"string[]\",\n token: \"string\",\n workspaceIds: \"string[] | null\",\n },\n notes:\n \"The full token is only shown once at creation time. Scopes default to full-access (read, write, admin).\",\n options: {\n \"--expires\": {\n description: 'Expiration duration, e.g. \"30d\", \"90d\", \"1y\"',\n type: \"string\",\n },\n \"--permissions\": {\n default: \"full-access\",\n description:\n '\"full-access\" (read, write, admin) or \"read-only\" (read only)',\n enum: [\"full-access\", \"read-only\"],\n type: \"string\",\n },\n \"--workspaces\": {\n description: \"Comma-separated workspace slugs to restrict the key to\",\n type: \"string\",\n },\n },\n usage: \"donebear api-key create <label> [options]\",\n },\n \"api-key list\": {\n command: \"api-key list\",\n examples: [\"donebear api-key list --json\"],\n json_output: {\n keys: \"ApiKeyRecord[]\",\n },\n notes: \"Each key includes scopes, workspaceIds, and expiresAt fields.\",\n options: {},\n usage: \"donebear api-key list\",\n },\n \"api-key revoke\": {\n arguments: {\n \"key-id\": {\n description: \"The UUID of the API key to revoke\",\n required: true,\n type: \"string\",\n },\n },\n command: \"api-key revoke\",\n examples: [\"donebear api-key revoke abc12345 --json\"],\n json_output: { id: \"string\", ok: \"boolean\" },\n options: {},\n usage: \"donebear api-key revoke <key-id>\",\n },\n \"auth login\": {\n command: \"auth login\",\n examples: [\n \"donebear auth login\",\n \"donebear auth login --no-open\",\n \"donebear auth login --no-open\",\n ],\n json_output: { ok: \"boolean\", source: \"string\", user: \"{ id, email }\" },\n non_interactive:\n \"For CI/scripts, set DONEBEAR_TOKEN=<token> instead of using auth login.\",\n options: {\n \"--no-open\": {\n description: \"Print auth URL instead of opening browser\",\n type: \"boolean\",\n },\n \"--port\": {\n default: 8787,\n description: \"Loopback callback port for the OAuth redirect\",\n type: \"number\",\n },\n \"--timeout\": {\n description: \"Seconds to wait for the OAuth callback\",\n type: \"number\",\n },\n },\n usage: \"donebear auth login [options]\",\n },\n \"auth status\": {\n command: \"auth status\",\n examples: [\"donebear auth status --json\"],\n json_output: {\n authenticated: \"boolean\",\n ok: \"boolean\",\n source: \"string | null\",\n user: \"{ id, email } | null\",\n },\n options: {},\n usage: \"donebear auth status\",\n },\n \"comment add\": {\n arguments: {\n body: {\n description: 'Comment text; pass \"-\" to read it from piped stdin',\n required: true,\n type: \"string\",\n },\n \"task-number\": {\n description: \"Workspace-scoped task number\",\n required: true,\n type: \"string\",\n },\n },\n command: \"comment add\",\n description:\n \"Post a comment. Attributed to the authenticated user and visible to the whole workspace; nobody is notified.\",\n examples: [\n 'donebear comment add 12 \"Blocked until the API ships\" --json',\n \"cat notes.md | donebear comment add 12 - --json\",\n ],\n json_output: { created: \"boolean\", id: \"string\" },\n options: {\n \"--workspace\": {\n description: \"Workspace id, slug, or name\",\n type: \"string\",\n },\n },\n usage: \"donebear comment add <task-number> <body> [options]\",\n },\n \"comment edit\": {\n arguments: {\n \"comment-id\": {\n description: \"Comment id or prefix\",\n required: true,\n type: \"string\",\n },\n \"task-number\": {\n description: \"Workspace-scoped task number\",\n required: true,\n type: \"string\",\n },\n },\n command: \"comment edit\",\n description:\n \"Rewrite a comment. Only its author may edit it; the server refuses anyone else.\",\n examples: ['donebear comment edit 12 a1b2 --body \"Unblocked\" --json'],\n json_output: { id: \"string\", ok: \"boolean\" },\n options: {\n \"--body\": {\n description: 'Replacement text; pass \"-\" to read piped stdin',\n required: true,\n type: \"string\",\n },\n \"--workspace\": { type: \"string\" },\n },\n usage: \"donebear comment edit <task-number> <comment-id> --body <text>\",\n },\n \"comment list\": {\n arguments: {\n \"task-number\": {\n description: \"Workspace-scoped task number\",\n required: true,\n type: \"string\",\n },\n },\n command: \"comment list\",\n description: \"List a task's comments, oldest first\",\n examples: [\"donebear comment list 12 --json\", \"donebear comment 12 --json\"],\n json_output: {\n comments: \"CommentRecord[]\",\n ok: \"boolean\",\n taskId: \"string\",\n },\n options: { \"--workspace\": { type: \"string\" } },\n usage: \"donebear comment list <task-number> [options]\",\n },\n \"comment remove\": {\n arguments: {\n \"comment-id\": {\n description: \"Comment id or prefix\",\n required: true,\n type: \"string\",\n },\n \"task-number\": {\n description: \"Workspace-scoped task number\",\n required: true,\n type: \"string\",\n },\n },\n command: \"comment remove\",\n description:\n \"Delete a comment permanently. Comments have no Trash. Authors may remove their own; a workspace owner or admin may remove anyone's.\",\n examples: [\"donebear comment remove 12 a1b2 --json\"],\n json_output: { id: \"string\", removed: \"boolean\" },\n options: { \"--workspace\": { type: \"string\" } },\n usage: \"donebear comment remove <task-number> <comment-id> [options]\",\n },\n context: {\n command: \"context\",\n description:\n \"Current workspace snapshot: user, task counts, recent tasks, active projects\",\n examples: [\n \"donebear context --json\",\n \"donebear context --markdown\",\n \"donebear context --tasks-limit 20 --json\",\n ],\n json_output: {\n activeProjects: \"Array<{ id, key, name, targetDate }>\",\n generatedAt: \"ISO 8601 timestamp\",\n ok: \"boolean\",\n recentTasks: \"Array<{ id, title, deadline, view }>\",\n taskCounts: \"{ open, done, archived, total }\",\n user: \"{ id, email }\",\n workspace: \"{ id, name, urlKey }\",\n },\n options: {\n \"--markdown\": {\n description: \"Output as markdown (for system prompt injection)\",\n type: \"boolean\",\n },\n \"--tasks-limit\": {\n default: 10,\n description: \"Max recent tasks to return\",\n type: \"number\",\n },\n \"--workspace\": { type: \"string\" },\n },\n usage: \"donebear context [options]\",\n },\n doctor: {\n command: \"doctor\",\n description:\n \"Run environment diagnostics: CLI version, auth status, workspace, AI agent detection\",\n examples: [\"donebear doctor\", \"donebear doctor --json\"],\n json_output: {\n checks:\n \"Array<{ name: string, status: 'pass' | 'warn' | 'fail', message: string }>\",\n ok: \"boolean\",\n },\n notes:\n \"Exits 0 if all checks pass or warn. Exits 1 if any check fails. Detects Claude Code, Cursor, Claude Desktop, and VS Code.\",\n options: {},\n usage: \"donebear doctor\",\n },\n export: {\n command: \"export\",\n description:\n \"Export every record in a workspace as a portable JSON archive on stdout\",\n examples: [\n \"donebear export > backup.json\",\n \"donebear export --workspace personal > personal-backup.json\",\n \"donebear export --json | jq '.counts'\",\n ],\n json_output: {\n counts: \"Record<string, number>\",\n exportedAt: \"string (ISO 8601)\",\n formatVersion: \"number\",\n lastSyncId: \"string | null (server sync position of the snapshot)\",\n records:\n \"{ Team, Label, Project, TeamProject, ProjectHeading, Task, TaskLabel, TaskChecklistItem: Record<string, unknown>[] }\",\n workspace: \"{ id, name, urlKey }\",\n },\n notes:\n \"Output goes to stdout as JSON; redirect it to a file. The archive reads from the sync bootstrap projection, so it carries every stored field including ordering and repeat state that the GraphQL read API omits. Workspace members, invitations, and agent threads are excluded because they hold other people's data.\",\n options: {\n \"--workspace\": {\n description: \"Workspace id, slug, or name\",\n type: \"string\",\n },\n },\n usage: \"donebear export [options]\",\n },\n guide: {\n arguments: {\n topic: {\n description: \"Guide topic. Omit to list them all.\",\n enum: [\n \"views\",\n \"dates\",\n \"editing\",\n \"bulk\",\n \"projects\",\n \"search\",\n \"workspaces\",\n \"agents\",\n ],\n required: false,\n type: \"string\",\n },\n },\n command: \"guide\",\n description:\n \"Done Bear concepts for agents: what each idea means and how to use it well\",\n examples: [\n \"donebear guide\",\n \"donebear guide agents\",\n \"donebear guide views\",\n \"donebear guide bulk --json\",\n ],\n json_output: {\n id: \"string\",\n markdown: \"string\",\n ok: \"boolean\",\n title: \"string\",\n whenToUse: \"string\",\n },\n notes:\n \"No auth required. `spec` covers command mechanics; `guide` covers the concepts behind them. Without a topic, returns the index.\",\n usage: \"donebear guide [topic]\",\n },\n history: {\n command: \"history\",\n examples: [\n \"donebear history --json\",\n \"donebear history --model Task --limit 20 --json\",\n ],\n json_output: {\n history: \"WorkspaceHistoryEntry[]\",\n ok: \"boolean\",\n workspace: \"WorkspaceSummary\",\n },\n options: {\n \"--limit\": { default: 50, type: \"number\" },\n \"--model\": {\n description: \"Filter by model\",\n enum: [\"Task\", \"Project\", \"Label\", \"Team\"],\n type: \"string\",\n },\n \"--workspace\": { type: \"string\" },\n },\n usage: \"donebear history [options]\",\n },\n \"import things\": {\n command: \"import things\",\n description: \"Import a Things 3 SQLite export into the selected workspace\",\n examples: [\n \"donebear import things --dry-run --json\",\n \"donebear import things --database-url ~/Backups/Things\\\\ Database.thingsdatabase --json\",\n \"donebear import things --database-url file:///Users/me/Backups/main.sqlite --workspace personal\",\n ],\n json_output: {\n counts:\n \"{ source: Record<string, number>, planned: Record<string, number> }\",\n databasePath: \"string\",\n dryRun: \"boolean\",\n execution: \"{ inserted, updated, skipped, batches }\",\n taskColumns: \"string[]\",\n workspace: \"WorkspaceSummary\",\n },\n notes:\n \"The importer reads the official Things SQLite export (`main.sqlite`). Pass `--metadata-mode note` to preserve unmapped Things-only fields in descriptions.\",\n options: {\n \"--batch-size\": {\n default: 100,\n description: \"Maximum sync mutations per batch\",\n type: \"number\",\n },\n \"--database-url\": {\n description:\n \"Path, file:// URL, sqlite:// URL, .thingsdatabase bundle, or ThingsData-* directory\",\n type: \"string\",\n },\n \"--dry-run\": {\n description: \"Plan the import without sending sync mutations\",\n type: \"boolean\",\n },\n \"--metadata-mode\": {\n default: \"none\",\n description:\n \"Preserve Things-only metadata in descriptions (`note`) or drop it (`none`)\",\n enum: [\"note\", \"none\"],\n type: \"string\",\n },\n \"--skip-teams\": {\n description:\n \"Skip importing Things Areas as Teams and TeamProject links\",\n type: \"boolean\",\n },\n \"--workspace\": {\n description: \"Workspace id, slug, or name\",\n type: \"string\",\n },\n },\n usage: \"donebear import things [options]\",\n },\n \"label list\": {\n command: \"label list\",\n examples: [\"donebear label list --json\"],\n json_output: {\n labels: \"LabelRecord[]\",\n ok: \"boolean\",\n workspace: \"WorkspaceSummary\",\n },\n options: {\n \"--workspace\": { type: \"string\" },\n },\n usage: \"donebear label list [options]\",\n },\n \"project add\": {\n arguments: { name: { required: true, type: \"string\" } },\n command: \"project add\",\n examples: [\n 'donebear project add \"Q2 Launch\" --json',\n 'donebear project add \"Website Redesign\" --target-date 2026-06-30 --json',\n ],\n json_output: {\n id: \"string\",\n key: \"string\",\n ok: \"boolean\",\n workspaceId: \"string\",\n },\n notes:\n \"URL slug is auto-generated from name (e.g. 'Q2 Launch' → 'q2-launch-a1b2c3d4').\",\n options: {\n \"--description\": { type: \"string\" },\n \"--idempotency-key\": {\n description:\n \"Stable key making retries safe (repeated calls create only one project)\",\n type: \"string\",\n },\n \"--target-date\": {\n description: \"Target completion date\",\n format: \"YYYY-MM-DD\",\n type: \"string\",\n },\n \"--workspace\": { type: \"string\" },\n },\n usage: \"donebear project add <name> [options]\",\n },\n \"project done\": {\n arguments: {\n id: {\n description: \"Project UUID, key, or name\",\n required: true,\n type: \"string\",\n },\n },\n command: \"project done\",\n examples: [\"donebear project done PROJ --json\"],\n json_output: { id: \"string\", ok: \"boolean\" },\n options: { \"--workspace\": { type: \"string\" } },\n usage: \"donebear project done <id> [options]\",\n },\n \"project edit\": {\n arguments: {\n id: {\n description: \"Project UUID, key, or name\",\n required: true,\n type: \"string\",\n },\n },\n command: \"project edit\",\n examples: ['donebear project edit PROJ --name \"Updated Name\" --json'],\n json_output: { action: \"string\", id: \"string\", ok: \"boolean\" },\n options: {\n \"--clear-description\": {\n description: \"Clear the project description\",\n type: \"boolean\",\n },\n \"--clear-target-date\": {\n description: \"Clear the project target date\",\n type: \"boolean\",\n },\n \"--description\": { type: \"string\" },\n \"--name\": { type: \"string\" },\n \"--status\": {\n description: \"Set status\",\n enum: [\"active\", \"done\", \"archived\"],\n type: \"string\",\n },\n \"--target-date\": { format: \"YYYY-MM-DD\", type: \"string\" },\n \"--workspace\": { type: \"string\" },\n },\n usage: \"donebear project edit <id> [options]\",\n },\n \"project join\": {\n arguments: {\n id: {\n description: \"Project UUID, key, or name\",\n required: true,\n type: \"string\",\n },\n },\n command: \"project join\",\n examples: [\"donebear project join PROJ --json\"],\n json_output: { action: \"string\", id: \"string\", ok: \"boolean\" },\n notes:\n \"Membership is personal list state, not access: joining puts the project in your sidebar's Your projects list, and every workspace member can already see every project. Joining a project you are in reports action already_member and changes nothing.\",\n options: { \"--workspace\": { type: \"string\" } },\n usage: \"donebear project join <id> [options]\",\n },\n \"project leave\": {\n arguments: {\n id: {\n description: \"Project UUID, key, or name\",\n required: true,\n type: \"string\",\n },\n },\n command: \"project leave\",\n examples: [\"donebear project leave PROJ --json\"],\n json_output: { action: \"string\", id: \"string\", ok: \"boolean\" },\n notes:\n \"Removes the project from your Your projects list; the project itself is untouched. Leaving a project you are not in reports action not_a_member and changes nothing.\",\n options: { \"--workspace\": { type: \"string\" } },\n usage: \"donebear project leave <id> [options]\",\n },\n \"project list\": {\n command: \"project list\",\n examples: [\n \"donebear project list --json\",\n \"donebear project list --status all --json\",\n ],\n json_output: {\n count: \"number\",\n ok: \"boolean\",\n projects: \"ProjectRecord[]\",\n status: \"string\",\n workspace: \"WorkspaceSummary\",\n },\n options: {\n \"--status\": {\n default: \"active\",\n enum: [\"active\", \"done\", \"archived\", \"all\"],\n type: \"string\",\n },\n \"--workspace\": { type: \"string\" },\n },\n usage: \"donebear project list [options]\",\n },\n search: {\n arguments: {\n query: {\n description: \"Prompted interactively in TTY if omitted.\",\n required: false,\n type: \"string\",\n },\n },\n command: \"search\",\n examples: [\n 'donebear search \"login bug\" --json',\n 'donebear search \"Q1\" --state open --json',\n ],\n json_output: {\n count: \"number\",\n limited: \"TaskRecord[]\",\n ok: \"boolean\",\n query: \"string\",\n workspace: \"WorkspaceSummary\",\n },\n options: {\n \"--limit\": { default: 20, type: \"number\" },\n \"--state\": {\n default: \"all\",\n enum: [\"open\", \"done\", \"archived\", \"all\"],\n type: \"string\",\n },\n \"--workspace\": { type: \"string\" },\n },\n usage: \"donebear search [query] [options]\",\n },\n \"task add\": {\n arguments: {\n title: {\n description:\n \"Task title. Prompted interactively in TTY if omitted. Required in non-TTY.\",\n required: false,\n type: \"string\",\n },\n },\n command: \"task add\",\n examples: [\n 'donebear task add \"Fix login bug\" --when today --json',\n 'donebear task add \"Write tests\" --deadline 2026-03-15 --project PROJ --json',\n 'donebear task add \"Review PR\" --when anytime --description \"Triage for bugs\" --json',\n 'donebear task add \"Capture idea\" --when inbox --json',\n 'echo \"Multi-line description\" | donebear task add \"My task\" --description -',\n \"donebear task add # prompts for title interactively in TTY\",\n ],\n json_output: {\n created: \"boolean\",\n deadlineAt: \"number | null\",\n description: \"string | null\",\n id: \"string (UUID)\",\n number: \"number\",\n projectId: \"string | null\",\n teamId: \"string | null\",\n title: \"string\",\n view: \"string\",\n workspaceId: \"string\",\n workspaceName: \"string\",\n },\n notes:\n \"Without --when the task lands in today, with two exceptions: --deadline without --when lands in anytime, so a task due weeks out does not sit in today until then (the deadline still surfaces it in today on the day), and --project or --team without --when lands in inbox, because the task is already filed by its container. A deadline wins over a container. Pass --when inbox to capture without scheduling. Title is prompted interactively when omitted in TTY. The description is NOT read from stdin unless you pass --description - explicitly; without --description the task is created with no description (and the saved description is echoed back in the output). Other task subcommands accept the workspace-scoped task number.\",\n options: {\n \"--deadline\": {\n description: \"Due date\",\n format: \"YYYY-MM-DD\",\n type: \"string\",\n },\n \"--description\": {\n description:\n \"Body / description text. Pass --description - to read from piped stdin.\",\n type: \"string\",\n },\n \"--idempotency-key\": {\n description:\n \"Stable key making retries safe (repeated calls create only one task)\",\n type: \"string\",\n },\n \"--project\": { description: \"Project id, key, or name\", type: \"string\" },\n \"--team\": { description: \"Team id, key, or name\", type: \"string\" },\n \"--when\": {\n description:\n \"View bucket. Defaults to today; to anytime when --deadline is given without --when; to inbox when --project or --team is given without --when. Pass inbox to capture without scheduling.\",\n enum: [\"inbox\", \"anytime\", \"today\", \"upcoming\", \"someday\"],\n type: \"string\",\n },\n \"--workspace\": {\n description: \"Workspace id, slug, or name\",\n type: \"string\",\n },\n },\n usage: \"donebear task add [title] [options]\",\n },\n \"task append\": {\n arguments: {\n number: {\n description: \"Workspace-scoped task number\",\n required: true,\n type: \"string\",\n },\n text: { required: true, type: \"string\" },\n },\n command: \"task append\",\n description: \"Append text to a task's description\",\n examples: ['donebear task append 12 \"Additional context\" --json'],\n json_output: {\n action: \"string\",\n id: \"string\",\n number: \"number\",\n ok: \"boolean\",\n },\n options: { \"--workspace\": { type: \"string\" } },\n usage: \"donebear task append <number> <text> [options]\",\n },\n \"task archive\": {\n arguments: {\n number: {\n description: \"Workspace-scoped task number\",\n required: true,\n type: \"string\",\n },\n },\n command: \"task archive\",\n examples: [\"donebear task archive 12 --json\"],\n json_output: {\n action: \"string\",\n id: \"string\",\n number: \"number\",\n ok: \"boolean\",\n },\n options: { \"--workspace\": { type: \"string\" } },\n usage: \"donebear task archive <number> [options]\",\n },\n \"task done\": {\n arguments: {\n number: {\n description: \"Workspace-scoped task number\",\n required: true,\n type: \"string\",\n },\n },\n command: \"task done\",\n examples: [\"donebear task done 12 --json\"],\n json_output: {\n action: \"string\",\n id: \"string\",\n number: \"number\",\n ok: \"boolean\",\n },\n options: { \"--workspace\": { type: \"string\" } },\n usage: \"donebear task done <number> [options]\",\n },\n \"task edit\": {\n arguments: {\n number: {\n description: \"Workspace-scoped task number\",\n required: true,\n type: \"string\",\n },\n },\n command: \"task edit\",\n examples: [\n 'donebear task edit 12 --title \"Updated title\" --json',\n \"donebear task edit 12 --when today --deadline 2030-01-15 --json\",\n \"donebear task edit 12 --clear-deadline --json\",\n ],\n json_output: {\n action: \"string\",\n id: \"string\",\n number: \"number\",\n ok: \"boolean\",\n },\n options: {\n \"--clear-deadline\": {\n description: \"Clear the due date\",\n type: \"boolean\",\n },\n \"--clear-description\": {\n description: \"Clear the description\",\n type: \"boolean\",\n },\n \"--clear-project\": {\n description: \"Remove the task from its project\",\n type: \"boolean\",\n },\n \"--clear-team\": {\n description: \"Remove the task from its team\",\n type: \"boolean\",\n },\n \"--deadline\": {\n description: \"Set due date\",\n format: \"YYYY-MM-DD\",\n type: \"string\",\n },\n \"--description\": {\n description: \"Replace the task description\",\n type: \"string\",\n },\n \"--project\": { description: \"Project id, key, or name\", type: \"string\" },\n \"--team\": { description: \"Team id, key, or name\", type: \"string\" },\n \"--title\": { type: \"string\" },\n \"--when\": {\n enum: [\"inbox\", \"anytime\", \"today\", \"upcoming\", \"someday\"],\n type: \"string\",\n },\n \"--workspace\": {\n description: \"Workspace id, slug, or name\",\n type: \"string\",\n },\n },\n usage: \"donebear task edit <number> [options]\",\n },\n \"task list\": {\n command: \"task list\",\n examples: [\n \"donebear task list --json\",\n \"donebear task list --state done --json\",\n \"donebear task list --view today --json\",\n 'donebear task list --search \"login\" --json',\n ],\n json_output: {\n autoSelected: \"boolean\",\n count: \"number\",\n limited: \"TaskRecord[]\",\n ok: \"boolean\",\n search: \"string | null\",\n state: \"string\",\n view: \"string | null\",\n workspace: \"WorkspaceSummary\",\n },\n options: {\n \"--limit\": { default: 20, description: \"Max results\", type: \"number\" },\n \"--search\": {\n description: \"Filter by title/description substring\",\n type: \"string\",\n },\n \"--state\": {\n default: \"open\",\n enum: [\"open\", \"done\", \"archived\", \"all\"],\n type: \"string\",\n },\n \"--view\": {\n description: \"Filter by view bucket\",\n enum: [\"inbox\", \"anytime\", \"today\", \"upcoming\", \"someday\"],\n type: \"string\",\n },\n \"--workspace\": {\n description: \"Workspace id, slug, or name\",\n type: \"string\",\n },\n },\n usage: \"donebear task list [options]\",\n },\n \"task prepend\": {\n arguments: {\n number: {\n description: \"Workspace-scoped task number\",\n required: true,\n type: \"string\",\n },\n text: { required: true, type: \"string\" },\n },\n command: \"task prepend\",\n description: \"Prepend text to a task's description\",\n examples: ['donebear task prepend 12 \"URGENT: \" --json'],\n json_output: {\n action: \"string\",\n id: \"string\",\n number: \"number\",\n ok: \"boolean\",\n },\n options: { \"--workspace\": { type: \"string\" } },\n usage: \"donebear task prepend <number> <text> [options]\",\n },\n \"task read\": {\n arguments: {\n number: {\n description: \"Workspace-scoped task number\",\n required: true,\n type: \"string\",\n },\n },\n command: \"task read\",\n description: \"Print task description as plain text\",\n examples: [\"donebear task read 12\"],\n json_output: {\n description: \"string | null\",\n id: \"string\",\n number: \"number\",\n },\n options: { \"--workspace\": { type: \"string\" } },\n usage: \"donebear task read <number> [options]\",\n },\n \"task reopen\": {\n arguments: {\n number: {\n description: \"Workspace-scoped task number\",\n required: true,\n type: \"string\",\n },\n },\n command: \"task reopen\",\n examples: [\"donebear task reopen 12 --json\"],\n json_output: {\n action: \"string\",\n id: \"string\",\n number: \"number\",\n ok: \"boolean\",\n },\n options: { \"--workspace\": { type: \"string\" } },\n usage: \"donebear task reopen <number> [options]\",\n },\n \"task show\": {\n arguments: {\n number: {\n description: \"Workspace-scoped task number\",\n required: true,\n type: \"string\",\n },\n },\n command: \"task show\",\n examples: [\"donebear task show 12 --json\"],\n json_output: {\n attachments: \"TaskAttachmentRecord[]\",\n checklistItems: \"ChecklistItemRecord[]\",\n ok: \"boolean\",\n task: \"TaskRecord\",\n },\n options: {\n \"--workspace\": {\n description: \"Workspace id, slug, or name\",\n type: \"string\",\n },\n },\n usage: \"donebear task show <number> [options]\",\n },\n \"task unarchive\": {\n arguments: {\n number: {\n description: \"Workspace-scoped task number\",\n required: true,\n type: \"string\",\n },\n },\n command: \"task unarchive\",\n examples: [\"donebear task unarchive 12 --json\"],\n json_output: {\n action: \"string\",\n id: \"string\",\n number: \"number\",\n ok: \"boolean\",\n },\n options: { \"--workspace\": { type: \"string\" } },\n usage: \"donebear task unarchive <number> [options]\",\n },\n \"team list\": {\n command: \"team list\",\n examples: [\"donebear team list --json\"],\n json_output: {\n ok: \"boolean\",\n teams: \"TeamRecord[]\",\n workspace: \"WorkspaceSummary\",\n },\n options: { \"--workspace\": { type: \"string\" } },\n usage: \"donebear team list [options]\",\n },\n today: {\n command: \"today\",\n description: \"List today's open tasks\",\n examples: [\"donebear today --json\"],\n json_output: {\n count: \"number\",\n limited: \"TaskRecord[]\",\n ok: \"boolean\",\n workspace: \"WorkspaceSummary\",\n },\n options: { \"--workspace\": { type: \"string\" } },\n usage: \"donebear today [options]\",\n },\n whoami: {\n command: \"whoami\",\n examples: [\"donebear whoami --json\"],\n json_output: { ok: \"boolean\", source: \"string\", user: \"{ id, email }\" },\n options: {},\n usage: \"donebear whoami\",\n },\n \"workspace list\": {\n command: \"workspace list\",\n examples: [\"donebear workspace list --json\"],\n json_output: {\n currentWorkspaceId: \"string | null\",\n ok: \"boolean\",\n workspaces: \"WorkspaceSummary[]\",\n },\n options: {},\n usage: \"donebear workspace list [options]\",\n },\n \"workspace use\": {\n arguments: {\n id: {\n description: \"Workspace id, urlKey, or name\",\n required: true,\n type: \"string\",\n },\n },\n command: \"workspace use\",\n examples: [\n \"donebear workspace use my-org --json\",\n \"donebear workspace use 122345 --json\",\n ],\n json_output: { ok: \"boolean\", workspace: \"WorkspaceSummary\" },\n notes: \"Persists selected workspace to ~/.config/donebear/context.json\",\n options: {},\n usage: \"donebear workspace use <id-or-slug>\",\n },\n};\n\n// Top-level command summaries (for \"donebear spec task\" without subcommand)\nexport const TOP_LEVEL_SPECS: Record<string, object> = {\n \"api-key\": {\n command: \"api-key\",\n description: \"Manage personal API keys\",\n subcommands: {\n create: \"Create a new API key (--permissions, --workspaces, --expires)\",\n list: \"List all API keys with scopes and expiration\",\n revoke: \"Revoke an API key by id\",\n },\n tip: \"donebear spec api-key create: get full spec for api-key create\",\n },\n auth: {\n command: \"auth\",\n description: \"Authentication\",\n non_interactive: \"Set DONEBEAR_TOKEN=<token> to skip interactive login.\",\n subcommands: {\n login: \"OAuth login (Google or GitHub)\",\n logout: \"Sign out and remove stored session\",\n status: \"Show auth status\",\n },\n tip: \"donebear spec auth login: get full spec for auth login\",\n },\n comment: {\n command: \"comment\",\n description: \"Read and write task comments\",\n notes:\n \"Workspace-visible, and nobody is notified. Only the author can edit a comment; the author or a workspace owner/admin can remove one, permanently.\",\n subcommands: {\n add: \"Post a comment on a task\",\n edit: \"Rewrite one of your own comments (--body)\",\n list: \"List a task's comments, oldest first\",\n remove: \"Delete a comment permanently\",\n },\n tip: \"donebear spec comment add: get full spec for comment add\",\n },\n import: {\n command: \"import\",\n description: \"Import external data into Done Bear\",\n subcommands: {\n things: \"Import a Things 3 SQLite export into the selected workspace\",\n },\n tip: \"donebear spec import things: get full spec for the Things importer\",\n },\n label: {\n command: \"label\",\n description: \"Manage workspace labels and task label assignments\",\n subcommands: {\n add: \"Add a label to a task\",\n create: \"Create a new label\",\n list: \"List all labels\",\n remove: \"Remove a label from a task\",\n show: \"Get label details\",\n },\n },\n project: {\n command: \"project\",\n description: \"Manage projects\",\n subcommands: {\n add: \"Create a new project\",\n archive: \"Archive a project\",\n done: \"Mark a project as complete\",\n edit: \"Update project fields\",\n join: \"Join a project (adds it to Your projects in the sidebar)\",\n leave: \"Leave a project (removes it from Your projects)\",\n list: \"List projects (--status: active|done|archived|all)\",\n show: \"Get project details by id, key, or name\",\n unarchive: \"Restore an archived project\",\n },\n tip: \"donebear spec project add: get full spec for project add\",\n },\n task: {\n command: \"task\",\n description: \"Create and manage tasks\",\n notes: \"Task numbers are workspace-scoped positive integers.\",\n subcommands: {\n add: \"Create a new task\",\n append: \"Append text to a task's description\",\n archive: \"Archive a task\",\n checklist: \"Manage task checklist items\",\n done: \"Mark a task as complete\",\n edit: \"Update task fields\",\n list: \"List tasks (--state, --view, --search, --limit)\",\n prepend: \"Prepend text to a task's description\",\n random: \"Pick a random task (--state to filter)\",\n read: \"Print task description as plain text\",\n reopen: \"Reopen a completed task\",\n show: \"Get task details by id\",\n unarchive: \"Restore an archived task\",\n },\n tip: \"donebear spec task add: get full spec for task add\",\n },\n team: {\n command: \"team\",\n description: \"List workspace teams\",\n subcommands: { list: \"List all teams\", show: \"Get team details\" },\n },\n workspace: {\n command: \"workspace\",\n description: \"Manage workspaces\",\n subcommands: {\n clear: \"Clear the default workspace\",\n create: \"Create a new workspace\",\n current: \"Show the active workspace\",\n invitations: \"List pending invitations\",\n invite: \"Invite a user by email\",\n join: \"Join a workspace by invite\",\n list: \"List all workspaces\",\n members: \"List workspace members\",\n use: \"Set the default workspace\",\n },\n tip: \"donebear spec workspace use: get full spec for workspace use\",\n },\n};\n\nconst runSpec = (\n _context: ReturnType<typeof contextFromCommand>,\n args: string[]\n): void => {\n // No args: return overview\n if (args.length === 0) {\n writeJson({ ok: true, ...OVERVIEW });\n return;\n }\n\n // Build lookup key: \"task add\" or just \"task\"\n const key = args.join(\" \");\n\n // Check detailed spec first\n const detail = COMMAND_SPECS[key];\n if (detail) {\n writeJson({ ok: true, ...detail });\n return;\n }\n\n // Check top-level command summary\n const topLevel = TOP_LEVEL_SPECS[key];\n if (topLevel) {\n writeJson({ ok: true, ...topLevel });\n return;\n }\n\n writeJson({\n error: {\n message: `No spec found for \"${key}\". Run \\`donebear spec\\` to see all commands.`,\n },\n ok: false,\n });\n};\n\nexport const registerSpecCommand = (program: Command): void => {\n program\n .command(\"spec\")\n .description(\"Progressive CLI spec for agent discovery (no auth required)\")\n .argument(\"[command]\", \"Command name (e.g. task, project)\")\n .argument(\"[subcommand]\", \"Subcommand name (e.g. add, list)\")\n .addHelpText(\n \"after\",\n `\nExamples:\n donebear spec Full CLI overview (~500 tokens)\n donebear spec task All task subcommands\n donebear spec task add Detailed spec: options, output shape, examples\n donebear spec project list Detailed spec for project list\n donebear spec import things Detailed spec for the Things importer\n donebear spec search Detailed spec for search\n donebear spec auth login Auth login options and non-interactive notes\n`\n )\n .action(\n async (\n command: string | undefined,\n subcommand: string | undefined,\n _options: unknown,\n cmd: Command\n ) => {\n const context = contextFromCommand(cmd);\n await runWithErrorHandling(context, () => {\n const args: string[] = [];\n if (command) {\n args.push(command.trim().toLowerCase());\n }\n if (subcommand) {\n args.push(subcommand.trim().toLowerCase());\n }\n runSpec(context, args);\n return Promise.resolve();\n });\n }\n );\n};\n","// donebear team [list|show]\n// donebear team list [--workspace <ws>]\n// donebear team show <id-or-key> [--workspace <ws>]\n\nimport type { Command } from \"commander\";\n\nimport { resolveCommandContext } from \"../command-context\";\nimport { findByRef, normalizeWorkspaceRef } from \"../command-helpers\";\nimport { loadTeamsByWorkspace, loadTeamsByWorkspaceIds } from \"../manage-api\";\nimport {\n writeFormattedRows,\n writeInfo,\n writeOutput,\n writeSuccess,\n} from \"../output\";\nimport { contextFromCommand, runWithErrorHandling } from \"../runtime\";\nimport {\n resolveWorkspace,\n resolveWorkspaceScope,\n scopeJsonFields,\n scopeLabel,\n} from \"../workspace-context\";\n\ninterface TeamListOptions {\n workspace?: string;\n}\n\ninterface TeamShowOptions {\n workspace?: string;\n}\n\nconst runTeamList = async (\n context: ReturnType<typeof contextFromCommand>,\n workspaceOverride: string | null,\n options: TeamListOptions\n): Promise<void> => {\n const commandContext = await resolveCommandContext(context);\n\n const scope = await resolveWorkspaceScope(context, {\n apiBaseUrl: commandContext.apiBaseUrl,\n storedWorkspaceId: commandContext.localContext.workspaceId,\n token: commandContext.token,\n workspaceRef: workspaceOverride ?? normalizeWorkspaceRef(options.workspace),\n });\n\n const teams =\n scope.mode === \"all\"\n ? await loadTeamsByWorkspaceIds(context, {\n baseUrl: commandContext.apiBaseUrl,\n token: commandContext.token,\n workspaceIds: scope.workspaces.map((w) => w.id),\n })\n : await loadTeamsByWorkspace(context, {\n baseUrl: commandContext.apiBaseUrl,\n token: commandContext.token,\n workspaceId: scope.workspace.id,\n });\n\n if (context.json) {\n writeOutput(context, {\n ...scopeJsonFields(scope),\n teams,\n });\n return;\n }\n\n const headers = [\"id\", \"key\", \"name\"];\n const rows = teams.map((t) => [t.id, t.key, t.name]);\n\n if (writeFormattedRows(context, teams.length, headers, rows)) {\n return;\n }\n\n if (teams.length === 0) {\n writeInfo(context, \"No teams found.\");\n return;\n }\n\n writeInfo(context, `Teams in ${scopeLabel(scope)}:`);\n\n for (const team of teams) {\n writeInfo(context, `${team.id.slice(0, 8)} [${team.key}] ${team.name}`);\n }\n};\n\nconst runTeamShow = async (\n context: ReturnType<typeof contextFromCommand>,\n teamRef: string,\n workspaceOverride: string | null,\n options: TeamShowOptions\n): Promise<void> => {\n const commandContext = await resolveCommandContext(context);\n\n const { workspace } = await resolveWorkspace(context, {\n apiBaseUrl: commandContext.apiBaseUrl,\n storedWorkspaceId: commandContext.localContext.workspaceId,\n token: commandContext.token,\n workspaceRef: workspaceOverride ?? normalizeWorkspaceRef(options.workspace),\n });\n\n const teams = await loadTeamsByWorkspace(context, {\n baseUrl: commandContext.apiBaseUrl,\n token: commandContext.token,\n workspaceId: workspace.id,\n });\n\n const team = findByRef(teamRef.trim(), teams);\n\n if (!team) {\n throw new Error(`Team \"${teamRef}\" not found. Run \\`donebear team list\\`.`);\n }\n\n if (context.json) {\n writeOutput(context, { team, workspace });\n return;\n }\n\n writeSuccess(context, team.name);\n writeInfo(context, `id: ${team.id}`);\n writeInfo(context, `key: ${team.key}`);\n writeInfo(context, `name: ${team.name}`);\n writeInfo(context, `description: ${team.description ?? \"(none)\"}`);\n writeInfo(context, `workspaceId: ${team.workspaceId ?? \"(none)\"}`);\n};\n\nexport const registerTeamCommands = (\n program: Command,\n workspaceOverride: string | null\n): void => {\n const team = program\n .command(\"team\")\n .alias(\"teams\")\n .description(\"Manage teams\")\n .addHelpText(\n \"after\",\n `\nExamples:\n donebear team\n donebear team list\n donebear team show engineering-a1b2c3d4\n donebear team show Engineering\n donebear team list --format csv\n`\n )\n .action(async (_options: unknown, command: Command) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runTeamList(context, workspaceOverride, {});\n });\n });\n\n team\n .command(\"list\")\n .alias(\"ls\")\n .description(\"List teams in the current or specified workspace\")\n .option(\"-w, --workspace <workspace>\", \"Workspace id, slug, or exact name\")\n .action(async (options: TeamListOptions, command: Command) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runTeamList(context, workspaceOverride, options);\n });\n });\n\n team\n .command(\"show\")\n .description(\"Show team details\")\n .argument(\"<ref>\", \"Team id, key, slug, name, or id prefix\")\n .option(\"-w, --workspace <workspace>\", \"Workspace id, slug, or exact name\")\n .action(\n async (teamRef: string, options: TeamShowOptions, command: Command) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runTeamShow(context, teamRef, workspaceOverride, options);\n });\n }\n );\n};\n","import type { Command } from \"commander\";\n\nimport { resolveCommandContext } from \"../command-context\";\nimport {\n normalizeWorkspaceRef,\n taskListHeaders,\n taskListLines,\n taskListRows,\n} from \"../command-helpers\";\nimport { parsePositiveInteger } from \"../command-parsers\";\nimport { loadTasksByWorkspace, loadTasksByWorkspaceIds } from \"../manage-api\";\nimport {\n copyToClipboard,\n writeFormattedRows,\n writeInfo,\n writeOutput,\n} from \"../output\";\nimport { contextFromCommand, runWithErrorHandling } from \"../runtime\";\nimport { resolveTaskView } from \"../task-defaults\";\nimport type { TaskRecord } from \"../types\";\nimport {\n resolveWorkspaceScope,\n scopeJsonFields,\n scopeLabel,\n} from \"../workspace-context\";\n\nconst DEFAULT_TODAY_LIMIT = 20;\n\ninterface TodayOptions {\n workspace?: string;\n limit: number;\n}\n\nconst filterToday = (tasks: TaskRecord[]): TaskRecord[] =>\n tasks.filter((task) => resolveTaskView(task) === \"today\");\n\nconst runToday = async (\n context: ReturnType<typeof contextFromCommand>,\n options: TodayOptions,\n workspaceOverride: string | null\n): Promise<void> => {\n const commandContext = await resolveCommandContext(context);\n\n const scope = await resolveWorkspaceScope(context, {\n apiBaseUrl: commandContext.apiBaseUrl,\n storedWorkspaceId: commandContext.localContext.workspaceId,\n token: commandContext.token,\n workspaceRef: workspaceOverride ?? normalizeWorkspaceRef(options.workspace),\n });\n\n const tasks =\n scope.mode === \"all\"\n ? await loadTasksByWorkspaceIds(context, {\n baseUrl: commandContext.apiBaseUrl,\n token: commandContext.token,\n workspaceIds: scope.workspaces.map((w) => w.id),\n })\n : await loadTasksByWorkspace(context, {\n baseUrl: commandContext.apiBaseUrl,\n token: commandContext.token,\n workspaceId: scope.workspace.id,\n });\n\n const todayTasks = filterToday(tasks);\n const limited = todayTasks.slice(0, options.limit);\n\n if (context.json) {\n writeOutput(context, {\n ...scopeJsonFields(scope),\n count: limited.length,\n tasks: limited,\n total: todayTasks.length,\n });\n return;\n }\n\n if (\n writeFormattedRows(\n context,\n todayTasks.length,\n taskListHeaders(),\n taskListRows(limited)\n )\n ) {\n return;\n }\n\n if (scope.mode === \"single\" && scope.autoSelected) {\n writeInfo(context, `Auto-selected workspace: ${scope.workspace.name}`);\n }\n\n if (limited.length === 0) {\n writeInfo(context, \"No tasks for today.\");\n return;\n }\n\n writeInfo(\n context,\n `${scopeLabel(scope)}: Today (${limited.length}/${todayTasks.length})`\n );\n\n for (const line of taskListLines(limited)) {\n writeInfo(context, line);\n }\n\n if (context.copy) {\n copyToClipboard(taskListLines(limited).join(\"\\n\"));\n }\n};\n\nexport const registerTodayCommand = (\n program: Command,\n workspaceOverride: string | null\n): void => {\n program\n .command(\"today\")\n .description(\"List today's tasks\")\n .option(\"-w, --workspace <workspace>\", \"Workspace id, slug, or exact name\")\n .option(\n \"-n, --limit <count>\",\n \"Maximum number of tasks\",\n (value: string): number => parsePositiveInteger(value, \"Limit\"),\n DEFAULT_TODAY_LIMIT\n )\n .addHelpText(\n \"after\",\n `\nExamples:\n donebear today\n donebear today --limit 10\n donebear today --format csv\n donebear today --total\n`\n )\n .action(async (options: TodayOptions, command: Command) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runToday(context, options, workspaceOverride);\n });\n });\n};\n","import type { Command } from \"commander\";\n\nimport { resolveAuthToken } from \"../auth-session\";\nimport { EXIT_CODES } from \"../errors\";\nimport { loadViewer, resolveApiBaseUrl } from \"../manage-api\";\nimport { writeInfo, writeOutput, writeSuccess } from \"../output\";\nimport { contextFromCommand, runWithErrorHandling } from \"../runtime\";\nimport { resolveSupabaseConfig } from \"../supabase\";\n\nconst runWhoAmI = async (\n context: ReturnType<typeof contextFromCommand>\n): Promise<void> => {\n let supabaseConfig: ReturnType<typeof resolveSupabaseConfig> | null = null;\n try {\n supabaseConfig = resolveSupabaseConfig();\n } catch {\n supabaseConfig = null;\n }\n\n const resolvedToken = await resolveAuthToken(context, supabaseConfig);\n\n if (!resolvedToken) {\n process.exitCode = EXIT_CODES.AUTH_REQUIRED;\n\n if (context.json) {\n writeOutput(context, {\n error: {\n exitCode: EXIT_CODES.AUTH_REQUIRED,\n message: \"Not authenticated\",\n },\n ok: false,\n });\n return;\n }\n\n writeInfo(context, \"Not authenticated.\");\n writeInfo(context, \"Run `donebear auth login`.\");\n return;\n }\n\n const user = await loadViewer(context, {\n baseUrl: resolveApiBaseUrl(context),\n token: resolvedToken.token,\n });\n\n if (context.json) {\n writeOutput(context, {\n ok: true,\n source: resolvedToken.source,\n user: {\n email: user.email ?? null,\n id: user.id,\n },\n });\n return;\n }\n\n writeSuccess(context, \"Authenticated user:\");\n writeInfo(context, `id: ${user.id}`);\n writeInfo(context, `email: ${user.email ?? \"(none)\"}`);\n writeInfo(context, `source: ${resolvedToken.source}`);\n};\n\nexport const registerWhoAmICommand = (program: Command): void => {\n program\n .command(\"whoami\")\n .alias(\"me\")\n .description(\"Show the current authenticated user\")\n .action(async (_options: unknown, command: Command) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runWhoAmI(context);\n });\n });\n};\n","import type { Command } from \"commander\";\n\nimport { resolveCommandContext } from \"../command-context\";\nimport { setCurrentWorkspace } from \"../context-store\";\nimport {\n createWorkspace,\n createWorkspaceInvitation,\n joinWorkspace,\n listWorkspaceInvitations,\n listWorkspaceMembers,\n listWorkspaces,\n} from \"../manage-api\";\nimport {\n copyToClipboard,\n writeCsv,\n writeInfo,\n writeOutput,\n writeSuccess,\n writeTotal,\n writeTsv,\n} from \"../output\";\nimport { contextFromCommand, runWithErrorHandling } from \"../runtime\";\nimport {\n isValidWorkspaceUrlKey,\n resolveWorkspace,\n toWorkspaceUrlKey,\n} from \"../workspace-context\";\n\ninterface WorkspaceCreateOptions {\n slug?: string;\n logoUrl?: string;\n use: boolean;\n}\n\ninterface WorkspaceJoinOptions {\n use: boolean;\n}\n\ninterface WorkspaceMembersOptions {\n format?: string;\n total?: boolean;\n}\n\ninterface WorkspaceInviteOptions {\n email?: string;\n role?: string;\n}\n\nconst findWorkspace = (\n workspaceRef: string,\n workspaces: Awaited<ReturnType<typeof listWorkspaces>>\n) => {\n const normalizedReference = workspaceRef.trim().toLowerCase();\n\n return workspaces.find((workspace) => {\n if (workspace.id === workspaceRef) {\n return true;\n }\n\n if (workspace.urlKey?.toLowerCase() === normalizedReference) {\n return true;\n }\n\n return workspace.name.toLowerCase() === normalizedReference;\n });\n};\n\nconst writeCurrentWorkspaceNotAvailable = (\n context: ReturnType<typeof contextFromCommand>,\n message: string\n): void => {\n if (context.json) {\n writeOutput(context, {\n workspace: null,\n });\n return;\n }\n\n writeInfo(context, message);\n writeInfo(context, \"Run `donebear workspace use <id-or-slug>`.\");\n};\n\nconst runWorkspaceList = async (\n context: ReturnType<typeof contextFromCommand>\n) => {\n const commandContext = await resolveCommandContext(context);\n\n const workspaces = await listWorkspaces(context, {\n baseUrl: commandContext.apiBaseUrl,\n token: commandContext.token,\n });\n\n if (context.json) {\n writeOutput(context, {\n currentWorkspaceId: commandContext.localContext.workspaceId,\n workspaces,\n });\n return;\n }\n\n if (workspaces.length === 0) {\n writeInfo(context, \"No workspaces found.\");\n return;\n }\n\n writeInfo(context, \"Workspaces:\");\n\n for (const workspace of workspaces) {\n const marker =\n workspace.id === commandContext.localContext.workspaceId ? \"*\" : \" \";\n\n writeInfo(\n context,\n `${marker} ${workspace.id} ${workspace.name}${workspace.urlKey ? ` (${workspace.urlKey})` : \"\"} role=${workspace.role}`\n );\n }\n};\n\nconst runWorkspaceCurrent = async (\n context: ReturnType<typeof contextFromCommand>\n): Promise<void> => {\n const commandContext = await resolveCommandContext(context);\n\n if (!commandContext.localContext.workspaceId) {\n writeCurrentWorkspaceNotAvailable(\n context,\n \"No default workspace selected.\"\n );\n return;\n }\n\n const workspaces = await listWorkspaces(context, {\n baseUrl: commandContext.apiBaseUrl,\n token: commandContext.token,\n });\n\n const workspace = workspaces.find(\n (item) => item.id === commandContext.localContext.workspaceId\n );\n\n if (!workspace) {\n writeCurrentWorkspaceNotAvailable(\n context,\n \"Saved workspace is no longer accessible.\"\n );\n return;\n }\n\n if (context.json) {\n writeOutput(context, {\n workspace,\n });\n return;\n }\n\n writeSuccess(context, `Current workspace: ${workspace.name}`);\n writeInfo(context, `id: ${workspace.id}`);\n writeInfo(context, `slug: ${workspace.urlKey ?? \"(none)\"}`);\n writeInfo(context, `role: ${workspace.role}`);\n};\n\nconst runWorkspaceUse = async (\n context: ReturnType<typeof contextFromCommand>,\n reference: string\n): Promise<void> => {\n const commandContext = await resolveCommandContext(context);\n\n const workspaces = await listWorkspaces(context, {\n baseUrl: commandContext.apiBaseUrl,\n token: commandContext.token,\n });\n\n const selected = findWorkspace(reference, workspaces);\n\n if (!selected) {\n throw new Error(\n `Workspace \"${reference}\" not found. Run \\`donebear workspace list\\`.`\n );\n }\n\n await setCurrentWorkspace(selected.id);\n\n if (context.json) {\n writeOutput(context, {\n selected: true,\n workspace: selected,\n });\n return;\n }\n\n writeSuccess(context, `Selected workspace: ${selected.name}`);\n writeInfo(context, `id: ${selected.id}`);\n};\n\nconst runWorkspaceClear = async (\n context: ReturnType<typeof contextFromCommand>\n): Promise<void> => {\n await setCurrentWorkspace(null);\n\n if (context.json) {\n writeOutput(context, {\n cleared: true,\n workspace: null,\n });\n return;\n }\n\n writeSuccess(context, \"Cleared current workspace.\");\n};\n\nconst runWorkspaceCreate = async (\n context: ReturnType<typeof contextFromCommand>,\n name: string,\n options: WorkspaceCreateOptions\n): Promise<void> => {\n const commandContext = await resolveCommandContext(context);\n\n const slug = (options.slug ?? toWorkspaceUrlKey(name)).trim();\n\n if (!isValidWorkspaceUrlKey(slug)) {\n throw new Error(\n \"Workspace slug must be lowercase alphanumeric with hyphens and at least 3 characters\"\n );\n }\n\n const workspace = await createWorkspace(context, {\n baseUrl: commandContext.apiBaseUrl,\n body: {\n logoUrl: options.logoUrl,\n name,\n urlKey: slug,\n },\n token: commandContext.token,\n });\n\n if (options.use) {\n await setCurrentWorkspace(workspace.id);\n }\n\n if (context.json) {\n writeOutput(context, {\n selected: options.use,\n workspace,\n });\n return;\n }\n\n writeSuccess(context, `Created workspace: ${workspace.name}`);\n writeInfo(context, `id: ${workspace.id}`);\n writeInfo(context, `slug: ${workspace.urlKey ?? slug}`);\n\n if (options.use) {\n writeInfo(context, \"Set as current workspace.\");\n }\n};\n\nconst runWorkspaceJoin = async (\n context: ReturnType<typeof contextFromCommand>,\n code: string,\n options: WorkspaceJoinOptions\n): Promise<void> => {\n const commandContext = await resolveCommandContext(context);\n const trimmedCode = code.trim();\n\n if (!trimmedCode) {\n throw new Error(\"Invitation code is required.\");\n }\n\n const joined = await joinWorkspace(context, {\n baseUrl: commandContext.apiBaseUrl,\n code: trimmedCode,\n token: commandContext.token,\n });\n\n if (options.use) {\n await setCurrentWorkspace(joined.workspace.id);\n }\n\n if (context.json) {\n writeOutput(context, {\n role: joined.role,\n selected: options.use,\n workspace: joined.workspace,\n });\n return;\n }\n\n writeSuccess(context, `Joined workspace: ${joined.workspace.name}`);\n writeInfo(context, `id: ${joined.workspace.id}`);\n writeInfo(context, `role: ${joined.role}`);\n\n if (options.use) {\n writeInfo(context, \"Set as current workspace.\");\n }\n};\n\nconst runWorkspaceMembers = async (\n context: ReturnType<typeof contextFromCommand>,\n workspaceRefArg: string | undefined,\n workspaceOverride: string | null,\n options: WorkspaceMembersOptions\n): Promise<void> => {\n const commandContext = await resolveCommandContext(context);\n\n const { workspace } = await resolveWorkspace(context, {\n apiBaseUrl: commandContext.apiBaseUrl,\n storedWorkspaceId: commandContext.localContext.workspaceId,\n token: commandContext.token,\n workspaceRef: workspaceOverride ?? workspaceRefArg ?? null,\n });\n\n const members = await listWorkspaceMembers(context, {\n baseUrl: commandContext.apiBaseUrl,\n token: commandContext.token,\n workspaceId: workspace.id,\n });\n\n if (context.json) {\n writeOutput(context, { members, workspace });\n return;\n }\n\n if (context.total) {\n writeTotal(context, members.length);\n return;\n }\n\n const format = options.format?.trim().toLowerCase() ?? context.format;\n\n if (format === \"csv\") {\n writeCsv(\n [\"userId\", \"name\", \"email\", \"role\"],\n members.map((m) => [\n m.userId,\n m.user.name ?? \"\",\n m.user.email ?? \"\",\n m.role,\n ])\n );\n return;\n }\n\n if (format === \"tsv\") {\n writeTsv(\n [\"userId\", \"name\", \"email\", \"role\"],\n members.map((m) => [\n m.userId,\n m.user.name ?? \"\",\n m.user.email ?? \"\",\n m.role,\n ])\n );\n return;\n }\n\n if (members.length === 0) {\n writeInfo(context, \"No members found.\");\n return;\n }\n\n writeInfo(context, `Members of ${workspace.name}:`);\n\n for (const member of members) {\n writeInfo(\n context,\n `${member.userId} ${member.user.name ?? \"(no name)\"} ${member.user.email ?? \"(no email)\"} ${member.role}`\n );\n }\n};\n\nconst runWorkspaceInvitations = async (\n context: ReturnType<typeof contextFromCommand>,\n workspaceRefArg: string | undefined,\n workspaceOverride: string | null\n): Promise<void> => {\n const commandContext = await resolveCommandContext(context);\n\n const { workspace } = await resolveWorkspace(context, {\n apiBaseUrl: commandContext.apiBaseUrl,\n storedWorkspaceId: commandContext.localContext.workspaceId,\n token: commandContext.token,\n workspaceRef: workspaceOverride ?? workspaceRefArg ?? null,\n });\n\n const invitations = await listWorkspaceInvitations(context, {\n baseUrl: commandContext.apiBaseUrl,\n token: commandContext.token,\n workspaceId: workspace.id,\n });\n\n if (context.json) {\n writeOutput(context, { invitations, workspace });\n return;\n }\n\n if (invitations.length === 0) {\n writeInfo(context, \"No invitations found.\");\n return;\n }\n\n writeInfo(context, `Invitations for ${workspace.name}:`);\n\n for (const invitation of invitations) {\n const used = invitation.usedAt ? \"yes\" : \"no\";\n writeInfo(\n context,\n `${invitation.id.slice(0, 8)} ${invitation.email ?? \"(open)\"} ${invitation.role} expires=${invitation.expiresAt} used=${used}`\n );\n }\n};\n\nconst runWorkspaceInvite = async (\n context: ReturnType<typeof contextFromCommand>,\n workspaceRefArg: string | undefined,\n workspaceOverride: string | null,\n options: WorkspaceInviteOptions\n): Promise<void> => {\n const commandContext = await resolveCommandContext(context);\n\n const { workspace } = await resolveWorkspace(context, {\n apiBaseUrl: commandContext.apiBaseUrl,\n storedWorkspaceId: commandContext.localContext.workspaceId,\n token: commandContext.token,\n workspaceRef: workspaceOverride ?? workspaceRefArg ?? null,\n });\n\n const invitation = await createWorkspaceInvitation(context, {\n baseUrl: commandContext.apiBaseUrl,\n email: options.email,\n role: options.role ?? \"member\",\n token: commandContext.token,\n workspaceId: workspace.id,\n });\n\n if (context.json) {\n writeOutput(context, { invitation, workspace });\n return;\n }\n\n writeSuccess(context, `Invitation created for ${workspace.name}`);\n writeInfo(context, `code: ${invitation.code}`);\n writeInfo(context, `role: ${invitation.role}`);\n writeInfo(context, `expires: ${invitation.expiresAt}`);\n\n if (invitation.email) {\n writeInfo(context, `email: ${invitation.email}`);\n }\n\n const link = `${commandContext.apiBaseUrl}/invite/${invitation.code}`;\n writeInfo(context, `link: ${link}`);\n\n if (context.copy) {\n const copied = copyToClipboard(link);\n if (copied) {\n writeInfo(context, \"Link copied to clipboard.\");\n }\n }\n};\n\nexport const registerWorkspaceCommands = (\n program: Command,\n workspaceOverride: string | null\n): void => {\n const workspace = program\n .command(\"workspace\")\n .alias(\"ws\")\n .description(\"Manage workspaces\")\n .addHelpText(\n \"after\",\n `\nExamples:\n donebear workspace\n donebear workspace use personal\n donebear workspace create \"Personal\" --slug personal\n donebear workspace join ABCD2345\n donebear workspace members\n donebear workspace invitations\n donebear workspace invite --email user@example.com --role member\n`\n )\n .action(async (_options: unknown, command: Command) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runWorkspaceList(context);\n });\n });\n\n workspace\n .command(\"list\")\n .alias(\"ls\")\n .description(\"List workspaces available to the current user\")\n .action(async (_options: unknown, command: Command) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runWorkspaceList(context);\n });\n });\n\n workspace\n .command(\"current\")\n .description(\"Show the current default workspace\")\n .action(async (_options: unknown, command: Command) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runWorkspaceCurrent(context);\n });\n });\n\n workspace\n .command(\"use\")\n .description(\"Set the default workspace\")\n .argument(\"<workspace>\", \"Workspace id, slug, or exact name\")\n .action(\n async (workspaceRef: string, _options: unknown, command: Command) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runWorkspaceUse(context, workspaceRef);\n });\n }\n );\n\n workspace\n .command(\"clear\")\n .description(\"Clear the default workspace\")\n .action(async (_options: unknown, command: Command) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runWorkspaceClear(context);\n });\n });\n\n workspace\n .command(\"create\")\n .description(\"Create a workspace\")\n .argument(\"<name>\", \"Workspace display name\")\n .option(\"--slug <slug>\", \"Workspace urlKey slug\")\n .option(\"--logo-url <url>\", \"Workspace logo URL\")\n .option(\"--no-use\", \"Do not set as current workspace\")\n .action(\n async (\n name: string,\n options: WorkspaceCreateOptions,\n command: Command\n ) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runWorkspaceCreate(context, name, options);\n });\n }\n );\n\n workspace\n .command(\"join\")\n .description(\"Join a workspace with an invitation code\")\n .argument(\"<code>\", \"Invitation code\")\n .option(\"--no-use\", \"Do not set joined workspace as current\")\n .action(\n async (code: string, options: WorkspaceJoinOptions, command: Command) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runWorkspaceJoin(context, code, options);\n });\n }\n );\n\n workspace\n .command(\"members\")\n .description(\"List members of the current or specified workspace\")\n .argument(\"[workspace]\", \"Workspace id, slug, or exact name\")\n .option(\"--format <format>\", \"Output format: text|json|csv|tsv\")\n .option(\"--total\", \"Print member count only\")\n .action(\n async (\n workspaceRef: string | undefined,\n options: WorkspaceMembersOptions,\n command: Command\n ) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runWorkspaceMembers(\n context,\n workspaceRef,\n workspaceOverride,\n options\n );\n });\n }\n );\n\n workspace\n .command(\"invitations\")\n .alias(\"invites\")\n .description(\n \"List pending invitations for the current or specified workspace\"\n )\n .argument(\"[workspace]\", \"Workspace id, slug, or exact name\")\n .action(\n async (\n workspaceRef: string | undefined,\n _options: unknown,\n command: Command\n ) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runWorkspaceInvitations(\n context,\n workspaceRef,\n workspaceOverride\n );\n });\n }\n );\n\n workspace\n .command(\"invite\")\n .description(\"Create an invitation for the current or specified workspace\")\n .argument(\"[workspace]\", \"Workspace id, slug, or exact name\")\n .option(\"--email <email>\", \"Email address to invite\")\n .option(\"--role <role>\", \"Role for the invitee: member|admin\", \"member\")\n .action(\n async (\n workspaceRef: string | undefined,\n options: WorkspaceInviteOptions,\n command: Command\n ) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runWorkspaceInvite(\n context,\n workspaceRef,\n workspaceOverride,\n options\n );\n });\n }\n );\n};\n","import { Command } from \"commander\";\n\nimport { registerApiKeyCommands } from \"./commands/api-key\";\nimport { registerAuthCommands } from \"./commands/auth\";\nimport { registerCommentCommands } from \"./commands/comment\";\nimport { registerContextCommand } from \"./commands/context\";\nimport { registerDoctorCommand } from \"./commands/doctor\";\nimport { registerExportCommands } from \"./commands/export\";\nimport { registerGuideCommand } from \"./commands/guide\";\nimport { registerHistoryCommand } from \"./commands/history\";\nimport { registerImportCommands } from \"./commands/import\";\nimport { registerLabelCommands } from \"./commands/label\";\nimport { registerProjectCommands } from \"./commands/project\";\nimport { registerSearchCommand } from \"./commands/search\";\nimport { registerSpecCommand } from \"./commands/spec\";\nimport { registerTaskCommands } from \"./commands/task\";\nimport { registerTeamCommands } from \"./commands/team\";\nimport { registerTodayCommand } from \"./commands/today\";\nimport { registerWhoAmICommand } from \"./commands/whoami\";\nimport { registerWorkspaceCommands } from \"./commands/workspace\";\nimport { CLI_NAME } from \"./constants\";\nimport { packageManifest } from \"./manifest\";\nimport { addGlobalOptions } from \"./options\";\n\nexport const buildProgram = (\n workspaceOverride: string | null = null\n): Command => {\n const program = new Command();\n\n program\n .name(CLI_NAME)\n .description(\"Done Bear CLI for auth, workspace, and task workflows\")\n .version(packageManifest.version, \"-v, --version\")\n .showHelpAfterError()\n .showSuggestionAfterError();\n\n addGlobalOptions(program);\n\n program.addHelpText(\n \"after\",\n `\nAgent quickstart (no auth needed):\n donebear spec Full CLI spec (~500 tokens)\n donebear spec task add Detailed spec for one command\n donebear guide Concept guides (views, dates, bulk, ...)\n donebear guide agents How to drive Done Bear as an agent\n\nWith auth:\n donebear context Current workspace state\n donebear context --markdown Markdown snapshot for system prompts\n donebear task list --json List open tasks\n donebear task add \"Fix bug\" --when today --json\n donebear import things --dry-run --json\n\nAuth:\n donebear auth login OAuth browser login\n DONEBEAR_TOKEN=<token> Non-interactive / CI: set this env var\n\nWorkspace targeting:\n donebear workspace=myorg task list\n\nFiltering & output:\n donebear task list --json --jq \"[0].title\" JMESPath filter\n donebear task list --format yaml YAML output\n donebear task list --limit 5 Limit results\n donebear task add \"X\" --dry-run Preview mutation\n`\n );\n\n registerSpecCommand(program);\n registerGuideCommand(program);\n registerDoctorCommand(program);\n registerContextCommand(program, workspaceOverride);\n registerAuthCommands(program);\n registerApiKeyCommands(program);\n registerWorkspaceCommands(program, workspaceOverride);\n registerTaskCommands(program, workspaceOverride);\n registerCommentCommands(program, workspaceOverride);\n registerProjectCommands(program, workspaceOverride);\n registerImportCommands(program, workspaceOverride);\n registerExportCommands(program, workspaceOverride);\n registerLabelCommands(program, workspaceOverride);\n registerTeamCommands(program, workspaceOverride);\n registerTodayCommand(program, workspaceOverride);\n registerSearchCommand(program, workspaceOverride);\n registerHistoryCommand(program, workspaceOverride);\n registerWhoAmICommand(program);\n\n return program;\n};\n","import { runInteractiveMode } from \"./commands/interactive\";\nimport { loadCliEnvironmentFiles } from \"./env\";\nimport { buildProgram } from \"./program\";\nimport { contextFromArgv, runWithErrorHandling } from \"./runtime\";\n\nconst WORKSPACE_PREFIX_REGEX = /^workspace=(.+)$/iu;\n\nconst extractWorkspaceTarget = (\n argv: string[]\n): {\n processedArgv: string[];\n workspaceOverride: string | null;\n} => {\n const processedArgv = [...argv];\n // oxlint-disable-next-line eslint/prefer-destructuring -- index access keeps intent clear\n const firstArg = processedArgv[2];\n\n if (firstArg) {\n const match = WORKSPACE_PREFIX_REGEX.exec(firstArg);\n if (match?.[1]) {\n processedArgv.splice(2, 1);\n return { processedArgv, workspaceOverride: match[1].trim() };\n }\n }\n\n return { processedArgv, workspaceOverride: null };\n};\n\nconst main = async (): Promise<void> => {\n loadCliEnvironmentFiles();\n\n const { processedArgv, workspaceOverride } = extractWorkspaceTarget(\n process.argv\n );\n\n const program = buildProgram(workspaceOverride);\n\n const hasUserArgs = processedArgv.length <= 2;\n const isTTY = process.stdin.isTTY === true;\n\n if (hasUserArgs && isTTY) {\n const ttyContext = contextFromArgv(processedArgv);\n await runInteractiveMode(ttyContext, program);\n return;\n }\n\n await program.parseAsync(processedArgv);\n};\n\nconst fallbackContext = contextFromArgv(process.argv);\n\nawait runWithErrorHandling(fallbackContext, main);\n"],"x_google_ignoreList":[31,32,33,34,35,36,37,57],"mappings":"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GAC9B;EACD,OAAO;GACL,aAAa;GACb,eAAe;GAChB;EACD,QAAQ;GACN,aAAa;GACb,eAAe;GAChB;EACD,WAAW;GACT,aAAa;GACb,eAAe;GACf,aAAa;IACX;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACD;GACF;EACF;CACD,gBAAgB;EACd,UAAU;EACV,aAAa;EACb,YAAY;EACZ,qBAAqB;EACrB,UAAU;EACV,eAAe;EACf,WAAW;EACX,eAAe;EACf,aAAa;EACd;CACD,iBACE;CACF,KAAK;CACL,qBACE;CACH;AAGD,MAAa,gBAAwC;CACnD,kBAAkB;EAChB,WAAW,EACT,OAAO;GACL,aAAa;GACb,UAAU;GACV,MAAM;GACP,EACF;EACD,SAAS;EACT,UAAU;GACR;GACA;GACA;GACD;EACD,aAAa;GACX,WAAW;GACX,WAAW;GACX,IAAI;GACJ,WAAW;GACX,OAAO;GACP,QAAQ;GACR,OAAO;GACP,cAAc;GACf;EACD,OACE;EACF,SAAS;GACP,aAAa;IACX,aAAa;IACb,MAAM;IACP;GACD,iBAAiB;IACf,SAAS;IACT,aACE;IACF,MAAM,CAAC,eAAe,YAAY;IAClC,MAAM;IACP;GACD,gBAAgB;IACd,aAAa;IACb,MAAM;IACP;GACF;EACD,OAAO;EACR;CACD,gBAAgB;EACd,SAAS;EACT,UAAU,CAAC,+BAA+B;EAC1C,aAAa,EACX,MAAM,kBACP;EACD,OAAO;EACP,SAAS,EAAE;EACX,OAAO;EACR;CACD,kBAAkB;EAChB,WAAW,EACT,UAAU;GACR,aAAa;GACb,UAAU;GACV,MAAM;GACP,EACF;EACD,SAAS;EACT,UAAU,CAAC,0CAA0C;EACrD,aAAa;GAAE,IAAI;GAAU,IAAI;GAAW;EAC5C,SAAS,EAAE;EACX,OAAO;EACR;CACD,cAAc;EACZ,SAAS;EACT,UAAU;GACR;GACA;GACA;GACD;EACD,aAAa;GAAE,IAAI;GAAW,QAAQ;GAAU,MAAM;GAAiB;EACvE,iBACE;EACF,SAAS;GACP,aAAa;IACX,aAAa;IACb,MAAM;IACP;GACD,UAAU;IACR,SAAS;IACT,aAAa;IACb,MAAM;IACP;GACD,aAAa;IACX,aAAa;IACb,MAAM;IACP;GACF;EACD,OAAO;EACR;CACD,eAAe;EACb,SAAS;EACT,UAAU,CAAC,8BAA8B;EACzC,aAAa;GACX,eAAe;GACf,IAAI;GACJ,QAAQ;GACR,MAAM;GACP;EACD,SAAS,EAAE;EACX,OAAO;EACR;CACD,eAAe;EACb,WAAW;GACT,MAAM;IACJ,aAAa;IACb,UAAU;IACV,MAAM;IACP;GACD,eAAe;IACb,aAAa;IACb,UAAU;IACV,MAAM;IACP;GACF;EACD,SAAS;EACT,aACE;EACF,UAAU,CACR,kEACA,kDACD;EACD,aAAa;GAAE,SAAS;GAAW,IAAI;GAAU;EACjD,SAAS,EACP,eAAe;GACb,aAAa;GACb,MAAM;GACP,EACF;EACD,OAAO;EACR;CACD,gBAAgB;EACd,WAAW;GACT,cAAc;IACZ,aAAa;IACb,UAAU;IACV,MAAM;IACP;GACD,eAAe;IACb,aAAa;IACb,UAAU;IACV,MAAM;IACP;GACF;EACD,SAAS;EACT,aACE;EACF,UAAU,CAAC,4DAA0D;EACrE,aAAa;GAAE,IAAI;GAAU,IAAI;GAAW;EAC5C,SAAS;GACP,UAAU;IACR,aAAa;IACb,UAAU;IACV,MAAM;IACP;GACD,eAAe,EAAE,MAAM,UAAU;GAClC;EACD,OAAO;EACR;CACD,gBAAgB;EACd,WAAW,EACT,eAAe;GACb,aAAa;GACb,UAAU;GACV,MAAM;GACP,EACF;EACD,SAAS;EACT,aAAa;EACb,UAAU,CAAC,mCAAmC,6BAA6B;EAC3E,aAAa;GACX,UAAU;GACV,IAAI;GACJ,QAAQ;GACT;EACD,SAAS,EAAE,eAAe,EAAE,MAAM,UAAU,EAAE;EAC9C,OAAO;EACR;CACD,kBAAkB;EAChB,WAAW;GACT,cAAc;IACZ,aAAa;IACb,UAAU;IACV,MAAM;IACP;GACD,eAAe;IACb,aAAa;IACb,UAAU;IACV,MAAM;IACP;GACF;EACD,SAAS;EACT,aACE;EACF,UAAU,CAAC,yCAAyC;EACpD,aAAa;GAAE,IAAI;GAAU,SAAS;GAAW;EACjD,SAAS,EAAE,eAAe,EAAE,MAAM,UAAU,EAAE;EAC9C,OAAO;EACR;CACD,SAAS;EACP,SAAS;EACT,aACE;EACF,UAAU;GACR;GACA;GACA;GACD;EACD,aAAa;GACX,gBAAgB;GAChB,aAAa;GACb,IAAI;GACJ,aAAa;GACb,YAAY;GACZ,MAAM;GACN,WAAW;GACZ;EACD,SAAS;GACP,cAAc;IACZ,aAAa;IACb,MAAM;IACP;GACD,iBAAiB;IACf,SAAS;IACT,aAAa;IACb,MAAM;IACP;GACD,eAAe,EAAE,MAAM,UAAU;GAClC;EACD,OAAO;EACR;CACD,QAAQ;EACN,SAAS;EACT,aACE;EACF,UAAU,CAAC,mBAAmB,yBAAyB;EACvD,aAAa;GACX,QACE;GACF,IAAI;GACL;EACD,OACE;EACF,SAAS,EAAE;EACX,OAAO;EACR;CACD,QAAQ;EACN,SAAS;EACT,aACE;EACF,UAAU;GACR;GACA;GACA;GACD;EACD,aAAa;GACX,QAAQ;GACR,YAAY;GACZ,eAAe;GACf,YAAY;GACZ,SACE;GACF,WAAW;GACZ;EACD,OACE;EACF,SAAS,EACP,eAAe;GACb,aAAa;GACb,MAAM;GACP,EACF;EACD,OAAO;EACR;CACD,OAAO;EACL,WAAW,EACT,OAAO;GACL,aAAa;GACb,MAAM;IACJ;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACD;GACD,UAAU;GACV,MAAM;GACP,EACF;EACD,SAAS;EACT,aACE;EACF,UAAU;GACR;GACA;GACA;GACA;GACD;EACD,aAAa;GACX,IAAI;GACJ,UAAU;GACV,IAAI;GACJ,OAAO;GACP,WAAW;GACZ;EACD,OACE;EACF,OAAO;EACR;CACD,SAAS;EACP,SAAS;EACT,UAAU,CACR,2BACA,kDACD;EACD,aAAa;GACX,SAAS;GACT,IAAI;GACJ,WAAW;GACZ;EACD,SAAS;GACP,WAAW;IAAE,SAAS;IAAI,MAAM;IAAU;GAC1C,WAAW;IACT,aAAa;IACb,MAAM;KAAC;KAAQ;KAAW;KAAS;KAAO;IAC1C,MAAM;IACP;GACD,eAAe,EAAE,MAAM,UAAU;GAClC;EACD,OAAO;EACR;CACD,iBA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"}