donebear 0.3.8 → 0.3.9

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","packageManifest","exports","RRule","fsConstants","UUID_REGEX"],"sources":["../src/jwt.ts","../src/oauth-token.ts","../src/storage.ts","../src/env.ts","../src/supabase.ts","../src/auth-session.ts","../src/api/http.ts","../src/date-codecs.ts","../src/output.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/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/interactive.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/cli.ts"],"sourcesContent":["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 { 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","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 { 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 { 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 { existsSync } from \"node:fs\";\nimport { createRequire } from \"node:module\";\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 { writeJson } from \"../output\";\nimport { contextFromCommand, runWithErrorHandling } from \"../runtime\";\nimport { resolveSupabaseConfig } from \"../supabase\";\nimport type { CliContext } from \"../types\";\n\ninterface PackageManifest {\n version: string;\n}\n\nconst require = createRequire(import.meta.url);\nconst packageManifest = require(\"../package.json\") as PackageManifest;\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\";\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\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 { 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 { 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 {\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}\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 projectId = 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: randomUUID(),\n transactions: [\n {\n action: \"INSERT\",\n clientId: commandContext.localContext.clientId,\n clientTxId: 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 .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 {\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} 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 notes?: string;\n when: string;\n deadline?: string;\n project?: string;\n team?: string;\n}\n\ninterface TaskTargetOptions {\n workspace?: string;\n}\n\ninterface TaskEditOptions extends TaskTargetOptions {\n title?: string;\n notes?: string;\n clearNotes: 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 notes = task.description?.toLowerCase() ?? \"\";\n return title.includes(query) || notes.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, `notes: ${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\nconst resolveNotes = async (\n _context: ReturnType<typeof contextFromCommand>,\n flagNotes: string | undefined\n): Promise<string | null> => {\n // Explicit --notes flag takes priority\n if (typeof flagNotes === \"string\") {\n const trimmed = flagNotes.trim();\n return trimmed.length > 0 ? trimmed : null;\n }\n\n // Try reading from stdin pipe\n const stdinContent = await readStdin();\n if (stdinContent) {\n return stdinContent;\n }\n\n return null;\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 notes = await resolveNotes(context, options.notes);\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 taskId = 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: randomUUID(),\n transactions: [\n {\n action: \"INSERT\",\n clientId: commandContext.localContext.clientId,\n clientTxId: 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: notes,\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 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};\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.clearNotes && typeof options.notes === \"string\") {\n throw new Error(\"Use either --notes or --clear-notes, not both.\");\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.clearNotes) {\n updates.description = null;\n } else if (typeof options.notes === \"string\") {\n const notes = options.notes.trim();\n updates.description = notes.length > 0 ? notes : 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, --notes, --clear-notes, --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, `notes: ${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 notes\")\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 (notes) 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, --notes <text>\", \"Task notes (or pipe via stdin)\")\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 .addHelpText(\n \"after\",\n `\nExamples:\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 --notes \"Check for XSS\" --json\n echo \"Multi-line notes\" | donebear task add \"My task\"\n donebear task add # prompts for title interactively\n\nDate format: YYYY-MM-DD (e.g. 2026-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(\"--notes <text>\", \"Replace task notes (empty string clears)\")\n .option(\"--clear-notes\", \"Clear task notes\")\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 notes\")\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\nconst 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: \"List workspace labels\",\n quick_example: \"donebear label list --json\",\n subcommands: [\"list\", \"show\"],\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 \"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\"\nconst 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 },\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 \"--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: { \"--workspace\": { type: \"string\" } },\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 \"--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 \"--description\": { type: \"string\" },\n \"--name\": { type: \"string\" },\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 --notes \"Triage for bugs\" --json',\n 'echo \"Multi-line notes\" | donebear task add \"My task\"',\n \"donebear task add # prompts for title interactively in TTY\",\n ],\n json_output: {\n created: \"boolean\",\n deadlineAt: \"number | 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. Notes can be piped via stdin. 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 \"--notes\": {\n description: \"Body / description text (or pipe via stdin)\",\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 task notes\",\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 2026-03-20 --json\",\n ],\n json_output: { action: \"string\", id: \"string\", ok: \"boolean\" },\n options: {\n \"--deadline\": {\n description: \"Set due date (pass empty string to clear)\",\n format: \"YYYY-MM-DD\",\n type: \"string\",\n },\n \"--notes\": { description: \"Replace notes/description\", type: \"string\" },\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 task notes\",\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/notes 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)\nconst 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: \"List workspace labels\",\n subcommands: { list: \"List all labels\", show: \"Get label details\" },\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 task notes\",\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 task notes\",\n read: \"Print task notes 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 { createRequire } from \"node:module\";\n\nimport { 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 { runInteractiveMode } from \"./commands/interactive\";\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 { loadCliEnvironmentFiles } from \"./env\";\nimport { addGlobalOptions } from \"./options\";\nimport { contextFromArgv, runWithErrorHandling } from \"./runtime\";\n\ninterface PackageManifest {\n version: string;\n}\n\nconst require = createRequire(import.meta.url);\nconst packageManifest = require(\"../package.json\") as PackageManifest;\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 = 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 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":[28],"mappings":"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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;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,MAAM,gBAAwC;CAC5C,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;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"}
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} 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 notes?: 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 notes?: string;\n clearNotes: 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 notes = task.description?.toLowerCase() ?? \"\";\n return title.includes(query) || notes.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, `notes: ${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\nconst resolveNotes = async (\n _context: ReturnType<typeof contextFromCommand>,\n flagNotes: string | undefined\n): Promise<string | null> => {\n // Explicit --notes flag takes priority\n if (typeof flagNotes === \"string\") {\n const trimmed = flagNotes.trim();\n return trimmed.length > 0 ? trimmed : null;\n }\n\n // Try reading from stdin pipe\n const stdinContent = await readStdin();\n if (stdinContent) {\n return stdinContent;\n }\n\n return null;\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 notes = await resolveNotes(context, options.notes);\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: notes,\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 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};\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.clearNotes && typeof options.notes === \"string\") {\n throw new Error(\"Use either --notes or --clear-notes, not both.\");\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.clearNotes) {\n updates.description = null;\n } else if (typeof options.notes === \"string\") {\n const notes = options.notes.trim();\n updates.description = notes.length > 0 ? notes : 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, --notes, --clear-notes, --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, `notes: ${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 notes\")\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 (notes) 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, --notes <text>\", \"Task notes (or pipe via stdin)\")\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 --notes \"Check for XSS\" --json\n echo \"Multi-line notes\" | donebear task add \"My task\"\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(\"--notes <text>\", \"Replace task notes (empty string clears)\")\n .option(\"--clear-notes\", \"Clear task notes\")\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 notes\")\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 --notes \"Triage for bugs\" --json',\n 'echo \"Multi-line notes\" | donebear task add \"My task\"',\n \"donebear task add # prompts for title interactively in TTY\",\n ],\n json_output: {\n created: \"boolean\",\n deadlineAt: \"number | 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. Notes can be piped via stdin. 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 \"--idempotency-key\": {\n description:\n \"Stable key making retries safe (repeated calls create only one task)\",\n type: \"string\",\n },\n \"--notes\": {\n description: \"Body / description text (or pipe via stdin)\",\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 task notes\",\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-notes\": {\n description: \"Clear notes/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 \"--notes\": { description: \"Replace notes/description\", type: \"string\" },\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 task notes\",\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/notes 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 task notes\",\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 task notes\",\n random: \"Pick a random task (--state to filter)\",\n read: \"Print task notes 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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AAa,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;GA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"}