SYMBOL INDEX (1104 symbols across 305 files) FILE: tmarks/functions/api/public/[slug].ts type PublicSharePayload (line 8) | interface PublicSharePayload { type PublicSharePaginatedPayload (line 20) | interface PublicSharePaginatedPayload { FILE: tmarks/functions/api/share/[token].ts type ShareRow (line 11) | interface ShareRow { type TabGroupRow (line 22) | interface TabGroupRow { type TabGroupItemRow (line 32) | interface TabGroupItemRow { FILE: tmarks/functions/api/shared/cache.ts function invalidatePublicShareCache (line 9) | async function invalidatePublicShareCache(env: Env, userId: string) { FILE: tmarks/functions/api/tab/bookmarks/[id].ts type UpdateBookmarkRequest (line 16) | interface UpdateBookmarkRequest { FILE: tmarks/functions/api/tab/bookmarks/[id]/snapshot-upload.ts constant R2_UPLOAD_CONCURRENCY (line 8) | const R2_UPLOAD_CONCURRENCY = 6 type ImageInput (line 10) | interface ImageInput { type DecodedImage (line 16) | interface DecodedImage { function decodeBase64Image (line 23) | function decodeBase64Image(image: ImageInput): DecodedImage | null { type UploadResult (line 39) | interface UploadResult { function uploadImagesConcurrently (line 48) | async function uploadImagesConcurrently( function replaceImagePlaceholders (line 94) | function replaceImagePlaceholders( FILE: tmarks/functions/api/tab/bookmarks/[id]/snapshots-v2.ts function generateNanoId (line 18) | function generateNanoId(): string { function sha256 (line 29) | async function sha256(content: string): Promise { type CreateSnapshotV2Request (line 36) | interface CreateSnapshotV2Request { FILE: tmarks/functions/api/tab/bookmarks/[id]/snapshots.ts function generateNanoId (line 14) | function generateNanoId(): string { function sha256 (line 28) | async function sha256(content: string): Promise { type CreateSnapshotRequest (line 36) | interface CreateSnapshotRequest { constant MAX_SNAPSHOT_SIZE (line 44) | const MAX_SNAPSHOT_SIZE = 50 * 1024 * 1024 // 50MB function cleanupOldSnapshots (line 271) | async function cleanupOldSnapshots( FILE: tmarks/functions/api/tab/bookmarks/[id]/snapshots/cleanup.ts type CleanupRequest (line 12) | interface CleanupRequest { type RouteParams (line 18) | interface RouteParams { type SnapshotRow (line 22) | interface SnapshotRow { function deleteSnapshotRows (line 28) | async function deleteSnapshotRows( function updateBookmarkSnapshotCount (line 38) | async function updateBookmarkSnapshotCount( function handleVerifyAndFix (line 68) | async function handleVerifyAndFix( FILE: tmarks/functions/api/tab/bookmarks/batch-handler.ts type BatchCreateBookmarkItem (line 14) | interface BatchCreateBookmarkItem { type BatchCreateResult (line 26) | interface BatchCreateResult { function batchCreateBookmarks (line 43) | async function batchCreateBookmarks( FILE: tmarks/functions/api/tab/bookmarks/batch/index.ts type BatchCreateBookmarkItem (line 16) | interface BatchCreateBookmarkItem { type BatchCreateRequest (line 28) | interface BatchCreateRequest { type BatchCreateResult (line 32) | interface BatchCreateResult { FILE: tmarks/functions/api/tab/bookmarks/bookmark-batch.ts type BatchCreateResult (line 6) | type BatchCreateResult = { function handleBatchCreate (line 15) | async function handleBatchCreate( FILE: tmarks/functions/api/tab/bookmarks/bookmark-list.ts type BookmarkWithTags (line 3) | interface BookmarkWithTags extends Bookmark { type BookmarkListRow (line 7) | interface BookmarkListRow extends BookmarkRow { type BookmarkPageCursor (line 11) | interface BookmarkPageCursor { function parseBookmarkPageCursor (line 18) | function parseBookmarkPageCursor(raw: string | null): BookmarkPageCursor... function createBookmarkPageCursor (line 43) | function createBookmarkPageCursor(row: BookmarkListRow, sortBy: 'created... function buildBookmarkListQuery (line 52) | function buildBookmarkListQuery( function fetchBookmarkTags (line 170) | async function fetchBookmarkTags( FILE: tmarks/functions/api/tab/bookmarks/index.ts type CreateBookmarkRequest (line 26) | interface CreateBookmarkRequest { FILE: tmarks/functions/api/tab/bookmarks/reorder-pinned.ts type ReorderPinnedRequest (line 11) | interface ReorderPinnedRequest { FILE: tmarks/functions/api/tab/bookmarks/trash.ts type TrashQueryParams (line 13) | interface TrashQueryParams { FILE: tmarks/functions/api/tab/me.ts type BookmarkStats (line 13) | type BookmarkStats = { FILE: tmarks/functions/api/tab/search.ts type BookmarkWithTags (line 13) | type BookmarkWithTags = Bookmark & { FILE: tmarks/functions/api/tab/statistics/index.ts type DomainCount (line 8) | interface DomainCount { FILE: tmarks/functions/api/tab/tab-groups/[id].ts type TabGroupRow (line 13) | interface TabGroupRow { type TabGroupItemRow (line 28) | interface TabGroupItemRow { type UpdateTabGroupRequest (line 38) | interface UpdateTabGroupRequest { FILE: tmarks/functions/api/tab/tab-groups/[id]/items/batch.ts type TabGroupRow (line 14) | interface TabGroupRow { type BatchAddItemsRequest (line 20) | interface BatchAddItemsRequest { FILE: tmarks/functions/api/tab/tab-groups/[id]/permanent-delete.ts type TabGroupRow (line 12) | interface TabGroupRow { FILE: tmarks/functions/api/tab/tab-groups/[id]/restore.ts type TabGroupRow (line 12) | interface TabGroupRow { FILE: tmarks/functions/api/tab/tab-groups/[id]/share.ts type TabGroupRow (line 13) | interface TabGroupRow { type ShareRow (line 19) | interface ShareRow { type CreateShareRequest (line 30) | interface CreateShareRequest { FILE: tmarks/functions/api/tab/tab-groups/index.ts type TabGroupRow (line 14) | interface TabGroupRow { type TabGroupItemRow (line 29) | interface TabGroupItemRow { type CreateTabGroupRequest (line 39) | interface CreateTabGroupRequest { function parseTags (line 50) | function parseTags(group: TabGroupRow): string[] | null { FILE: tmarks/functions/api/tab/tab-groups/items/[id].ts type TabGroupItemRow (line 13) | interface TabGroupItemRow { type UpdateTabGroupItemRequest (line 26) | interface UpdateTabGroupItemRequest { FILE: tmarks/functions/api/tab/tab-groups/items/[id]/move.ts type TabGroupItemRow (line 12) | interface TabGroupItemRow { type MoveItemRequest (line 24) | interface MoveItemRequest { FILE: tmarks/functions/api/tab/tab-groups/trash.ts type TabGroupRow (line 8) | interface TabGroupRow { FILE: tmarks/functions/api/tab/tags/[id].ts type UpdateTagRequest (line 13) | interface UpdateTagRequest { FILE: tmarks/functions/api/tab/tags/index.ts type CreateTagRequest (line 14) | interface CreateTagRequest { type TagWithCount (line 19) | interface TagWithCount { FILE: tmarks/functions/api/v1/auth/login.ts type LoginRequest (line 9) | interface LoginRequest { type DbUser (line 26) | type DbUser = User & { role?: string | null } FILE: tmarks/functions/api/v1/auth/logout.ts type LogoutRequest (line 7) | interface LogoutRequest { FILE: tmarks/functions/api/v1/auth/refresh.ts type RefreshRequest (line 8) | interface RefreshRequest { type DbUser (line 62) | type DbUser = { id: string; username: string; email: string | null; role... function parseExpiresInToSeconds (line 121) | function parseExpiresInToSeconds(expiresIn: string): number { FILE: tmarks/functions/api/v1/auth/register.ts type RegisterRequest (line 7) | interface RegisterRequest { FILE: tmarks/functions/api/v1/bookmarks/[id].ts type UpdateBookmarkRequest (line 10) | interface UpdateBookmarkRequest { FILE: tmarks/functions/api/v1/bookmarks/[id]/snapshot-cleanup.ts function cleanupOldSnapshots (line 5) | async function cleanupOldSnapshots( FILE: tmarks/functions/api/v1/bookmarks/[id]/snapshots.ts function sha256 (line 17) | async function sha256(content: string): Promise { type CreateSnapshotRequest (line 25) | interface CreateSnapshotRequest { constant MAX_SNAPSHOT_SIZE (line 33) | const MAX_SNAPSHOT_SIZE = 50 * 1024 * 1024 // 50MB FILE: tmarks/functions/api/v1/bookmarks/[id]/snapshots/cleanup.ts type CleanupRequest (line 12) | interface CleanupRequest { type RouteParams (line 18) | interface RouteParams { type SnapshotRow (line 22) | interface SnapshotRow { function deleteSnapshotRows (line 28) | async function deleteSnapshotRows( function updateBookmarkSnapshotCount (line 38) | async function updateBookmarkSnapshotCount( function handleVerifyAndFix (line 68) | async function handleVerifyAndFix( FILE: tmarks/functions/api/v1/bookmarks/bulk.ts type BatchActionType (line 8) | type BatchActionType = 'delete' | 'update_tags' | 'pin' | 'unpin' | 'arc... type BatchActionRequest (line 9) | interface BatchActionRequest { type BatchActionResponse (line 15) | interface BatchActionResponse { FILE: tmarks/functions/api/v1/bookmarks/statistics-helpers.ts type BookmarkStatistics (line 1) | interface BookmarkStatistics { function getDateGroupSql (line 49) | function getDateGroupSql(granularity: string, field: string) { FILE: tmarks/functions/api/v1/bookmarks/trash.ts type TrashQueryParams (line 13) | interface TrashQueryParams { FILE: tmarks/functions/api/v1/change-password.ts type ChangePasswordRequest (line 13) | interface ChangePasswordRequest { FILE: tmarks/functions/api/v1/export.ts type ExportPreviewRequest (line 17) | interface ExportPreviewRequest { function parseCommonOptions (line 23) | function parseCommonOptions(url: URL): { FILE: tmarks/functions/api/v1/preferences-helpers.ts type UserPreferences (line 1) | interface UserPreferences { type UpdatePreferencesRequest (line 21) | interface UpdatePreferencesRequest { function hasTagLayoutColumn (line 39) | async function hasTagLayoutColumn(db: D1Database): Promise { function hasSortByColumn (line 51) | async function hasSortByColumn(db: D1Database): Promise { function hasAutomationColumns (line 63) | async function hasAutomationColumns(db: D1Database): Promise { function mapPreferences (line 80) | function mapPreferences(preferences: UserPreferences) { function validatePreferences (line 101) | function validatePreferences(body: UpdatePreferencesRequest): string | n... FILE: tmarks/functions/api/v1/settings/api-keys/[id].ts type UpdateApiKeyRequest (line 15) | interface UpdateApiKeyRequest { type ApiKeyDetail (line 24) | interface ApiKeyDetail { FILE: tmarks/functions/api/v1/settings/api-keys/index.ts type CreateApiKeyRequest (line 10) | interface CreateApiKeyRequest { function getUserApiKeyLimit (line 18) | async function getUserApiKeyLimit(_db: D1Database, _userId: string): Pro... type ApiKeyRow (line 26) | interface ApiKeyRow { FILE: tmarks/functions/api/v1/settings/share.ts type UpdateShareSettingsRequest (line 9) | interface UpdateShareSettingsRequest { constant SLUG_MAX_LENGTH (line 17) | const SLUG_MAX_LENGTH = 64 function generateUniqueSlug (line 137) | async function generateUniqueSlug(env: Env, userId: string): Promise { function isValidApiKeyFormat (line 56) | function isValidApiKeyFormat(key: string): boolean { FILE: tmarks/functions/lib/api-key/logger.ts type LogEntry (line 6) | interface LogEntry { function logApiKeyUsage (line 20) | async function logApiKeyUsage(entry: LogEntry, db: D1Database): Promise<... function cleanupOldLogs (line 50) | async function cleanupOldLogs(apiKeyId: string, db: D1Database): Promise... function getApiKeyLogs (line 78) | async function getApiKeyLogs( function getApiKeyStats (line 103) | async function getApiKeyStats( FILE: tmarks/functions/lib/api-key/rate-limiter-types.ts type RateLimitWindow (line 5) | type RateLimitWindow = 'minute' | 'hour' | 'day'; type RateLimitConfig (line 7) | interface RateLimitConfig { constant DEFAULT_LIMITS (line 14) | const DEFAULT_LIMITS: RateLimitConfig = { type RateLimitResult (line 20) | interface RateLimitResult { FILE: tmarks/functions/lib/api-key/rate-limiter.ts function ensureTable (line 14) | async function ensureTable(db: D1Database): Promise { function getWindowMs (line 35) | function getWindowMs(window: RateLimitWindow): number { function getLimit (line 41) | function getLimit(limits: RateLimitConfig, window: RateLimitWindow): num... function getWindowStart (line 47) | function getWindowStart(now: number, windowMs: number): number { function maybeCleanup (line 51) | async function maybeCleanup(db: D1Database, now: number): Promise { function getCounts (line 59) | async function getCounts( function checkRateLimit (line 95) | async function checkRateLimit( function consumeRateLimit (line 168) | async function consumeRateLimit( function recordRequest (line 197) | async function recordRequest( FILE: tmarks/functions/lib/api-key/validator.ts type ApiKeyData (line 8) | interface ApiKeyData { type ValidationResult (line 18) | interface ValidationResult { function validateApiKey (line 31) | async function validateApiKey( function checkPermission (line 96) | function checkPermission(permissions: string[], requiredPermission: stri... function markAsExpired (line 105) | async function markAsExpired(keyId: string, db: D1Database): Promise(userId: string, params?: QueryParams): Promis... method setBookmarkList (line 28) | async setBookmarkList( method invalidateUserBookmarks (line 44) | async invalidateUserBookmarks(userId: string): Promise { method invalidateQuery (line 51) | async invalidateQuery(userId: string, params?: QueryParams): Promise { method refreshCommonQueries (line 72) | private refreshCommonQueries(userId: string): void { function createBookmarkCacheManager (line 88) | function createBookmarkCacheManager(cache: CacheService): BookmarkCacheM... FILE: tmarks/functions/lib/cache/config.ts constant CACHE_PRESETS (line 11) | const CACHE_PRESETS: Record = { function loadCacheConfig (line 151) | function loadCacheConfig(env: Env): CacheConfig { function validateCacheConfig (line 197) | function validateCacheConfig(config: CacheConfig): boolean { FILE: tmarks/functions/lib/cache/service.ts class CacheService (line 19) | class CacheService { method constructor (line 27) | constructor(env: Env) { method get (line 34) | async get( method set (line 60) | async set( method delete (line 80) | async delete(key: string): Promise { method invalidate (line 90) | async invalidate(prefix: string): Promise { method shouldCache (line 106) | shouldCache(type: CacheStrategyType, params?: Record)... method getStats (line 115) | getStats(): CacheStats { method getConfig (line 130) | getConfig(): CacheConfig { method isEnabled (line 137) | private isEnabled(type: CacheStrategyType): boolean { method getFromMemory (line 143) | private getFromMemory(key: string): T | null { method setToMemory (line 156) | private setToMemory(key: string, data: T, ttlSeconds?: number): void { method handleError (line 175) | private handleError(operation: string, error: unknown): void { FILE: tmarks/functions/lib/cache/strategies.ts function generateCacheKey (line 10) | function generateCacheKey( function getQueryType (line 63) | function getQueryType(params?: QueryParams): CacheStrategyType { function shouldCacheQuery (line 83) | function shouldCacheQuery( function getCacheInvalidationPrefix (line 107) | function getCacheInvalidationPrefix( function hashQueryParams (line 123) | function hashQueryParams(params: QueryParams): string { FILE: tmarks/functions/lib/cache/types.ts type CacheLevel (line 1) | type CacheLevel = 0 | 1 | 2 | 3 type CacheStrategyType (line 3) | type CacheStrategyType = type CacheConfig (line 11) | interface CacheConfig { type CacheEntry (line 26) | interface CacheEntry { type CacheSetOptions (line 31) | interface CacheSetOptions { type CacheStats (line 36) | interface CacheStats { type QueryParams (line 46) | interface QueryParams { FILE: tmarks/functions/lib/config.ts constant DEFAULT_CONFIG (line 11) | const DEFAULT_CONFIG = { function getJwtAccessTokenExpiresIn (line 19) | function getJwtAccessTokenExpiresIn(env?: Env): string { function getJwtRefreshTokenExpiresIn (line 26) | function getJwtRefreshTokenExpiresIn(env?: Env): string { function isRegistrationAllowed (line 35) | function isRegistrationAllowed(env: Env): boolean { function getEnvironment (line 44) | function getEnvironment(env: Env): 'development' | 'production' { FILE: tmarks/functions/lib/crypto.ts constant PBKDF2_ITERATIONS (line 4) | const PBKDF2_ITERATIONS = 100000 // OWASP constant SALT_LENGTH (line 5) | const SALT_LENGTH = 16 constant HASH_LENGTH (line 6) | const HASH_LENGTH = 32 function hashPassword (line 10) | async function hashPassword(password: string): Promise { function verifyPassword (line 45) | async function verifyPassword(password: string, hash: string): Promise { function generateUUID (line 99) | function generateUUID(): string { function generateShortUUID (line 109) | function generateShortUUID(): string { function generateNanoId (line 121) | function generateNanoId(length: number = 21): string { function timingSafeEqual (line 135) | function timingSafeEqual(a: Uint8Array, b: Uint8Array): boolean { function arrayBufferToBase64 (line 148) | function arrayBufferToBase64(buffer: Uint8Array): string { function base64ToArrayBuffer (line 155) | function base64ToArrayBuffer(base64: string): Uint8Array { FILE: tmarks/functions/lib/data-fetchers.ts function fetchFullBookmarks (line 4) | async function fetchFullBookmarks( FILE: tmarks/functions/lib/error-handler.ts type ErrorContext (line 6) | interface ErrorContext { type ErrorDetails (line 14) | interface ErrorDetails { function handleError (line 24) | function handleError(error: unknown, context?: ErrorContext): Response { function normalizeError (line 53) | function normalizeError(error: unknown, context?: ErrorContext): ErrorDe... function logError (line 104) | function logError(errorDetails: ErrorDetails): void { function createErrorContext (line 118) | function createErrorContext(request: Request, userId?: string): ErrorCon... function withErrorHandling (line 133) | function withErrorHandling( FILE: tmarks/functions/lib/image-sig.ts function generateImageSig (line 4) | async function generateImageSig( FILE: tmarks/functions/lib/image-upload.ts type UploadImageResult (line 8) | interface UploadImageResult { type ExistingImage (line 19) | interface ExistingImage { function uploadCoverImageToR2 (line 36) | async function uploadCoverImageToR2( function calculateHash (line 164) | async function calculateHash(data: ArrayBuffer): Promise { function getExtensionFromContentType (line 173) | function getExtensionFromContentType(contentType: string): string { function deleteBookmarkImage (line 187) | async function deleteBookmarkImage( function cleanupOrphanedImages (line 219) | async function cleanupOrphanedImages(db: D1Database, bucket: R2Bucket): ... FILE: tmarks/functions/lib/import-export/collect-export-data.ts constant DEFAULT_TAG_COLOR (line 12) | const DEFAULT_TAG_COLOR = '#3b82f6' function parseMaybeJsonStringArray (line 14) | function parseMaybeJsonStringArray(raw: unknown): string[] | undefined { function collectUser (line 27) | async function collectUser(db: D1Database, userId: string): Promise): stri... method generateMetadataComment (line 151) | private generateMetadataComment(data: TMarksExportData): string { method generateFilename (line 172) | private generateFilename(exportedAt: string): string { method toUnixTimestamp (line 179) | private toUnixTimestamp(isoString: string): string { method escapeHtml (line 183) | private escapeHtml(text: string): string { method validateData (line 196) | validateData(data: TMarksExportData): { valid: boolean; errors: string... method isValidUrl (line 223) | private isValidUrl(url: string): boolean { method getPreview (line 235) | getPreview(data: TMarksExportData, maxItems: number = 5): string { function createHtmlExporter (line 252) | function createHtmlExporter(): HtmlExporter { function exportToHtml (line 259) | async function exportToHtml( FILE: tmarks/functions/lib/import-export/exporters/json-exporter.ts class JsonExporter (line 13) | class JsonExporter implements Exporter { method export (line 16) | async export(data: TMarksExportData, options?: ExportOptions): Promise... method filterData (line 36) | private filterData(data: TMarksExportData, options?: ExportOptions): T... method formatJson (line 73) | private formatJson(data: TMarksExportData, options?: ExportOptions): s... method generateFilename (line 83) | private generateFilename(exportedAt: string): string { method validateData (line 94) | validateData(data: TMarksExportData): { valid: boolean; errors: string... method isValidUrl (line 125) | private isValidUrl(url: string): boolean { method isValidColor (line 134) | private isValidColor(color: string): boolean { method getExportStats (line 142) | getExportStats(data: TMarksExportData): { function createJsonExporter (line 166) | function createJsonExporter(): JsonExporter { function exportToJson (line 173) | async function exportToJson( function exportToCompactJson (line 185) | async function exportToCompactJson(data: TMarksExportData): Promise string type ToUnixTimestamp (line 4) | type ToUnixTimestamp = (isoString: string) => string function generateTabGroupsNetscapeSection (line 6) | function generateTabGroupsNetscapeSection(params: { FILE: tmarks/functions/lib/input-sanitizer.ts function escapeHtml (line 7) | function escapeHtml(text: string): string { function sanitizeString (line 21) | function sanitizeString(input: string, options: { function sanitizeUrl (line 47) | function sanitizeUrl(url: string): string | null { function sanitizeEmail (line 66) | function sanitizeEmail(email: string): string | null { function sanitizeUsername (line 80) | function sanitizeUsername(username: string): string | null { function sanitizeTagName (line 92) | function sanitizeTagName(tagName: string): string | null { function sanitizeFileName (line 107) | function sanitizeFileName(fileName: string): string { function sanitizeColor (line 117) | function sanitizeColor(color: string): string | null { function sanitizeSearchQuery (line 137) | function sanitizeSearchQuery(query: string): string { function sanitizePaginationParams (line 146) | function sanitizePaginationParams(params: { function sanitizeObject (line 169) | function sanitizeObject>( function validateJsonStructure (line 188) | function validateJsonStructure( FILE: tmarks/functions/lib/jwt.ts type JWTPayload (line 1) | interface JWTPayload { function generateJWT (line 10) | async function generateJWT( function verifyJWT (line 34) | async function verifyJWT(token: string, secret: string): Promise { function base64UrlEncode (line 83) | function base64UrlEncode(data: string | ArrayBuffer): string { function base64UrlDecode (line 97) | function base64UrlDecode(data: string): string { function parseExpiry (line 107) | function parseExpiry(expiry: string): number { FILE: tmarks/functions/lib/rate-limit.ts type RateLimiterContext (line 4) | type RateLimiterContext = Parameters>[0] type RateLimitResult (line 6) | interface RateLimitResult { function ensureTable (line 15) | async function ensureTable(db: D1Database): Promise { function getWindowStart (line 36) | function getWindowStart(now: number, windowSeconds: number): number { function checkAndRecord (line 41) | async function checkAndRecord( function getClientIP (line 82) | function getClientIP(request: Request): string { function createRateLimiter (line 97) | function createRateLimiter( FILE: tmarks/functions/lib/response.ts function success (line 3) | function success(data: T, meta?: ApiResponse['meta']): Response { function created (line 11) | function created(data: T): Response { function noContent (line 15) | function noContent(): Response { function badRequest (line 19) | function badRequest(error: string | ApiError | Partial, code =... function unauthorized (line 26) | function unauthorized(error: string | ApiError | Partial, code... function forbidden (line 33) | function forbidden(error: string | ApiError | Partial, code?: ... function notFound (line 40) | function notFound(message = 'Not found', code = 'NOT_FOUND'): Response { function conflict (line 45) | function conflict(message: string, code = 'CONFLICT'): Response { function tooManyRequests (line 50) | function tooManyRequests(error: string | ApiError | Partial, h... function internalError (line 66) | function internalError(message = 'Internal server error', code = 'INTERN... FILE: tmarks/functions/lib/signed-url.ts type SignedUrlParams (line 7) | interface SignedUrlParams { type SignedUrlData (line 14) | interface SignedUrlData { function generateSignedUrl (line 27) | async function generateSignedUrl( function verifySignedUrl (line 58) | async function verifySignedUrl( function extractSignedParams (line 86) | function extractSignedParams(request: Request): { function timingSafeEqual (line 118) | function timingSafeEqual(a: string, b: string): boolean { function sign (line 130) | async function sign(message: string, secret: string): Promise { FILE: tmarks/functions/lib/storage-quota.ts type UsageRow (line 12) | type UsageRow = { function getR2MaxTotalBytes (line 25) | function getR2MaxTotalBytes(env: Env): number { function getCurrentR2UsageBytes (line 53) | async function getCurrentR2UsageBytes(db: D1Database): Promise { type R2QuotaCheckResult (line 74) | interface R2QuotaCheckResult { function checkR2Quota (line 83) | async function checkR2Quota( FILE: tmarks/functions/lib/tags.ts function normalizeTagNames (line 3) | function normalizeTagNames(tagNames: string[]): string[] { function uniqueTagIds (line 21) | function uniqueTagIds(tagIds: string[]): string[] { function getValidTagIds (line 36) | async function getValidTagIds( function resolveOrCreateTagIds (line 57) | async function resolveOrCreateTagIds( function createOrLinkTags (line 97) | async function createOrLinkTags( function replaceBookmarkTags (line 115) | async function replaceBookmarkTags( function replaceBookmarkTagsByNames (line 139) | async function replaceBookmarkTagsByNames( FILE: tmarks/functions/lib/types.ts type Env (line 1) | interface Env { type User (line 24) | interface User { type Bookmark (line 32) | interface Bookmark { type BookmarkRow (line 52) | interface BookmarkRow extends Omit { type RouteParams (line 91) | type RouteParams = Record type SQLParam (line 92) | type SQLParam = string | number | boolean | null FILE: tmarks/functions/lib/utils.ts function generateSlug (line 1) | function generateSlug(): string { FILE: tmarks/functions/lib/validation.ts function isValidEmail (line 1) | function isValidEmail(email: string): boolean { function isValidUrl (line 7) | function isValidUrl(url: string): boolean { function isValidUsername (line 16) | function isValidUsername(username: string): boolean { function isValidPassword (line 22) | function isValidPassword(password: string): boolean { function sanitizeString (line 27) | function sanitizeString(str: string, maxLength = 1000): string { function escapeHtml (line 34) | function escapeHtml(str: string): string { function sanitizeForHtml (line 46) | function sanitizeForHtml(str: string, maxLength = 1000): string { FILE: tmarks/functions/middleware/api-key-auth-pages.ts type ApiKeyAuthContext (line 12) | interface ApiKeyAuthContext extends Record { function requireApiKeyAuth (line 21) | function requireApiKeyAuth( FILE: tmarks/functions/middleware/api-key-auth.ts type ApiKeyAuthOptions (line 11) | interface ApiKeyAuthOptions { function requireApiKey (line 20) | function requireApiKey(options: ApiKeyAuthOptions) { function optionalApiKey (line 129) | function optionalApiKey() { FILE: tmarks/functions/middleware/auth.ts type AuthContext (line 6) | interface AuthContext extends Record { FILE: tmarks/functions/middleware/dual-auth.ts type DualAuthContext (line 14) | interface DualAuthContext { function requireDualAuth (line 25) | function requireDualAuth( FILE: tmarks/functions/middleware/security.ts function getCorsPolicy (line 142) | function getCorsPolicy(request: Request, allowedOriginsEnv?: string): { ... function validateInput (line 186) | function validateInput(validator: (data: unknown) => data is T) { function rateLimitByIP (line 234) | function rateLimitByIP(_limit: number, _windowSeconds: number) { FILE: tmarks/migrations/0001_d1_console.sql type users (line 1) | CREATE TABLE IF NOT EXISTS users (id TEXT PRIMARY KEY, username TEXT NOT... type idx_users_username_lower (line 2) | CREATE INDEX IF NOT EXISTS idx_users_username_lower ON users(LOWER(usern... type idx_users_email_lower (line 3) | CREATE INDEX IF NOT EXISTS idx_users_email_lower ON users(LOWER(email)) type idx_users_role (line 4) | CREATE INDEX IF NOT EXISTS idx_users_role ON users(role) type idx_users_public_slug (line 5) | CREATE UNIQUE INDEX IF NOT EXISTS idx_users_public_slug ON users(public_... type auth_tokens (line 6) | CREATE TABLE IF NOT EXISTS auth_tokens (id INTEGER PRIMARY KEY AUTOINCRE... type idx_auth_tokens_user_id (line 7) | CREATE INDEX IF NOT EXISTS idx_auth_tokens_user_id ON auth_tokens(user_id) type idx_auth_tokens_hash (line 8) | CREATE INDEX IF NOT EXISTS idx_auth_tokens_hash ON auth_tokens(refresh_t... type idx_auth_tokens_expires (line 9) | CREATE INDEX IF NOT EXISTS idx_auth_tokens_expires ON auth_tokens(expire... type bookmarks (line 10) | CREATE TABLE IF NOT EXISTS bookmarks (id TEXT PRIMARY KEY, user_id TEXT ... type idx_bookmarks_user_created (line 11) | CREATE INDEX IF NOT EXISTS idx_bookmarks_user_created ON bookmarks(user_... type idx_bookmarks_user_url (line 12) | CREATE INDEX IF NOT EXISTS idx_bookmarks_user_url ON bookmarks(user_id, ... type idx_bookmarks_url (line 13) | CREATE INDEX IF NOT EXISTS idx_bookmarks_url ON bookmarks(url) type idx_bookmarks_user_deleted (line 14) | CREATE INDEX IF NOT EXISTS idx_bookmarks_user_deleted ON bookmarks(user_... type idx_bookmarks_pinned (line 15) | CREATE INDEX IF NOT EXISTS idx_bookmarks_pinned ON bookmarks(user_id, is... type idx_bookmarks_click_count (line 16) | CREATE INDEX IF NOT EXISTS idx_bookmarks_click_count ON bookmarks(user_i... type idx_bookmarks_last_clicked (line 17) | CREATE INDEX IF NOT EXISTS idx_bookmarks_last_clicked ON bookmarks(user_... type idx_bookmarks_user_archived_created (line 18) | CREATE INDEX IF NOT EXISTS idx_bookmarks_user_archived_created ON bookma... type idx_bookmarks_user_archived_updated (line 19) | CREATE INDEX IF NOT EXISTS idx_bookmarks_user_archived_updated ON bookma... type idx_bookmarks_user_archived_pinned_created (line 20) | CREATE INDEX IF NOT EXISTS idx_bookmarks_user_archived_pinned_created ON... type idx_bookmarks_user_archived_pinned_updated (line 21) | CREATE INDEX IF NOT EXISTS idx_bookmarks_user_archived_pinned_updated ON... type idx_bookmarks_user_archived_pinned_clicks (line 22) | CREATE INDEX IF NOT EXISTS idx_bookmarks_user_archived_pinned_clicks ON ... type idx_bookmarks_user_deleted_created (line 23) | CREATE INDEX IF NOT EXISTS idx_bookmarks_user_deleted_created ON bookmar... type idx_bookmarks_has_snapshot (line 24) | CREATE INDEX IF NOT EXISTS idx_bookmarks_has_snapshot ON bookmarks(user_... type idx_bookmarks_cover_image_id (line 25) | CREATE INDEX IF NOT EXISTS idx_bookmarks_cover_image_id ON bookmarks(cov... type tags (line 26) | CREATE TABLE IF NOT EXISTS tags (id TEXT PRIMARY KEY, user_id TEXT NOT N... type idx_tags_user_name (line 27) | CREATE INDEX IF NOT EXISTS idx_tags_user_name ON tags(user_id, LOWER(name)) type idx_tags_user_deleted (line 28) | CREATE INDEX IF NOT EXISTS idx_tags_user_deleted ON tags(user_id, delete... type idx_tags_click_count (line 29) | CREATE INDEX IF NOT EXISTS idx_tags_click_count ON tags(user_id, click_c... type idx_tags_last_clicked (line 30) | CREATE INDEX IF NOT EXISTS idx_tags_last_clicked ON tags(user_id, last_c... type bookmark_tags (line 31) | CREATE TABLE IF NOT EXISTS bookmark_tags (bookmark_id TEXT NOT NULL, tag... type idx_bookmark_tags_tag_user (line 32) | CREATE INDEX IF NOT EXISTS idx_bookmark_tags_tag_user ON bookmark_tags(t... type idx_bookmark_tags_bookmark (line 33) | CREATE INDEX IF NOT EXISTS idx_bookmark_tags_bookmark ON bookmark_tags(b... type bookmark_snapshots (line 34) | CREATE TABLE IF NOT EXISTS bookmark_snapshots (id TEXT PRIMARY KEY, book... type idx_bookmark_snapshots_bookmark_id (line 35) | CREATE INDEX IF NOT EXISTS idx_bookmark_snapshots_bookmark_id ON bookmar... type idx_bookmark_snapshots_user_id (line 36) | CREATE INDEX IF NOT EXISTS idx_bookmark_snapshots_user_id ON bookmark_sn... type idx_bookmark_snapshots_created_at (line 37) | CREATE INDEX IF NOT EXISTS idx_bookmark_snapshots_created_at ON bookmark... type idx_bookmark_snapshots_content_hash (line 38) | CREATE INDEX IF NOT EXISTS idx_bookmark_snapshots_content_hash ON bookma... type idx_bookmark_snapshots_bookmark_latest (line 39) | CREATE INDEX IF NOT EXISTS idx_bookmark_snapshots_bookmark_latest ON boo... type idx_bookmark_snapshots_bookmark_version (line 40) | CREATE INDEX IF NOT EXISTS idx_bookmark_snapshots_bookmark_version ON bo... type bookmark_images (line 41) | CREATE TABLE IF NOT EXISTS bookmark_images (id TEXT PRIMARY KEY, bookmar... type idx_bookmark_images_bookmark_id (line 42) | CREATE INDEX IF NOT EXISTS idx_bookmark_images_bookmark_id ON bookmark_i... type idx_bookmark_images_user_id (line 43) | CREATE INDEX IF NOT EXISTS idx_bookmark_images_user_id ON bookmark_image... type idx_bookmark_images_hash (line 44) | CREATE INDEX IF NOT EXISTS idx_bookmark_images_hash ON bookmark_images(i... type idx_bookmark_images_created_at (line 45) | CREATE INDEX IF NOT EXISTS idx_bookmark_images_created_at ON bookmark_im... type user_preferences (line 46) | CREATE TABLE IF NOT EXISTS user_preferences (user_id TEXT PRIMARY KEY, t... type api_keys (line 47) | CREATE TABLE IF NOT EXISTS api_keys (id TEXT PRIMARY KEY, user_id TEXT N... type idx_api_keys_user (line 48) | CREATE INDEX IF NOT EXISTS idx_api_keys_user ON api_keys(user_id) type idx_api_keys_hash (line 49) | CREATE INDEX IF NOT EXISTS idx_api_keys_hash ON api_keys(key_hash) type idx_api_keys_status (line 50) | CREATE INDEX IF NOT EXISTS idx_api_keys_status ON api_keys(user_id, status) type api_key_logs (line 51) | CREATE TABLE IF NOT EXISTS api_key_logs (id INTEGER PRIMARY KEY AUTOINCR... type idx_api_logs_key (line 52) | CREATE INDEX IF NOT EXISTS idx_api_logs_key ON api_key_logs(api_key_id, ... type idx_api_logs_user (line 53) | CREATE INDEX IF NOT EXISTS idx_api_logs_user ON api_key_logs(user_id, cr... type tab_groups (line 54) | CREATE TABLE IF NOT EXISTS tab_groups (id TEXT PRIMARY KEY, user_id TEXT... type idx_tab_groups_user_created (line 55) | CREATE INDEX IF NOT EXISTS idx_tab_groups_user_created ON tab_groups(use... type idx_tab_groups_user_id (line 56) | CREATE INDEX IF NOT EXISTS idx_tab_groups_user_id ON tab_groups(user_id) type idx_tab_groups_parent_id (line 57) | CREATE INDEX IF NOT EXISTS idx_tab_groups_parent_id ON tab_groups(parent... type idx_tab_groups_is_folder (line 58) | CREATE INDEX IF NOT EXISTS idx_tab_groups_is_folder ON tab_groups(is_fol... type idx_tab_groups_user_parent (line 59) | CREATE INDEX IF NOT EXISTS idx_tab_groups_user_parent ON tab_groups(user... type idx_tab_groups_parent_position (line 60) | CREATE INDEX IF NOT EXISTS idx_tab_groups_parent_position ON tab_groups(... type idx_tab_groups_user_parent_position (line 61) | CREATE INDEX IF NOT EXISTS idx_tab_groups_user_parent_position ON tab_gr... type idx_tab_groups_deleted (line 62) | CREATE INDEX IF NOT EXISTS idx_tab_groups_deleted ON tab_groups(user_id,... type tab_group_items (line 63) | CREATE TABLE IF NOT EXISTS tab_group_items (id TEXT PRIMARY KEY, group_i... type idx_tab_group_items_group_id (line 64) | CREATE INDEX IF NOT EXISTS idx_tab_group_items_group_id ON tab_group_ite... type idx_tab_group_items_group_created (line 65) | CREATE INDEX IF NOT EXISTS idx_tab_group_items_group_created ON tab_grou... type idx_tab_group_items_pinned (line 66) | CREATE INDEX IF NOT EXISTS idx_tab_group_items_pinned ON tab_group_items... type idx_tab_group_items_archived (line 67) | CREATE INDEX IF NOT EXISTS idx_tab_group_items_archived ON tab_group_ite... type idx_tab_group_items_not_archived (line 68) | CREATE INDEX IF NOT EXISTS idx_tab_group_items_not_archived ON tab_group... type shares (line 69) | CREATE TABLE IF NOT EXISTS shares (id TEXT PRIMARY KEY, group_id TEXT NO... type idx_shares_token (line 70) | CREATE INDEX IF NOT EXISTS idx_shares_token ON shares(share_token) type idx_shares_group_id (line 71) | CREATE INDEX IF NOT EXISTS idx_shares_group_id ON shares(group_id) type idx_shares_user_id (line 72) | CREATE INDEX IF NOT EXISTS idx_shares_user_id ON shares(user_id) type statistics (line 73) | CREATE TABLE IF NOT EXISTS statistics (id TEXT PRIMARY KEY, user_id TEXT... type idx_statistics_user_date (line 74) | CREATE UNIQUE INDEX IF NOT EXISTS idx_statistics_user_date ON statistics... type idx_statistics_user_id (line 75) | CREATE INDEX IF NOT EXISTS idx_statistics_user_id ON statistics(user_id) type idx_statistics_date (line 76) | CREATE INDEX IF NOT EXISTS idx_statistics_date ON statistics(stat_date) type audit_logs (line 77) | CREATE TABLE IF NOT EXISTS audit_logs (id INTEGER PRIMARY KEY AUTOINCREM... type idx_audit_logs_user (line 78) | CREATE INDEX IF NOT EXISTS idx_audit_logs_user ON audit_logs(user_id, cr... type idx_audit_logs_event (line 79) | CREATE INDEX IF NOT EXISTS idx_audit_logs_event ON audit_logs(event_type... type idx_audit_logs_created (line 80) | CREATE INDEX IF NOT EXISTS idx_audit_logs_created ON audit_logs(created_... type registration_limits (line 81) | CREATE TABLE IF NOT EXISTS registration_limits (date TEXT PRIMARY KEY, c... type bookmark_click_events (line 82) | CREATE TABLE IF NOT EXISTS bookmark_click_events (id INTEGER PRIMARY KEY... type idx_bookmark_click_events_user_clicked_at (line 83) | CREATE INDEX IF NOT EXISTS idx_bookmark_click_events_user_clicked_at ON ... type idx_bookmark_click_events_bookmark_clicked_at (line 84) | CREATE INDEX IF NOT EXISTS idx_bookmark_click_events_bookmark_clicked_at... type schema_migrations (line 86) | CREATE TABLE IF NOT EXISTS schema_migrations (version TEXT PRIMARY KEY, ... FILE: tmarks/migrations/0002_d1_console_ai_settings.sql type ai_settings (line 1) | CREATE TABLE IF NOT EXISTS ai_settings ( type idx_ai_settings_user_id (line 16) | CREATE INDEX IF NOT EXISTS idx_ai_settings_user_id ON ai_settings(user_id) FILE: tmarks/migrations/0103_api_key_rate_limits.sql type api_key_rate_limits (line 1) | CREATE TABLE IF NOT EXISTS api_key_rate_limits ( type idx_api_key_rate_limits_updated_at (line 10) | CREATE INDEX IF NOT EXISTS idx_api_key_rate_limits_updated_at ON api_key... FILE: tmarks/migrations/0104_rate_limits.sql type rate_limits (line 1) | CREATE TABLE IF NOT EXISTS rate_limits ( type idx_rate_limits_updated_at (line 10) | CREATE INDEX IF NOT EXISTS idx_rate_limits_updated_at ON rate_limits(upd... FILE: tmarks/scripts/auto-migrate.js constant MIGRATIONS_DIR (line 24) | const MIGRATIONS_DIR = join(__dirname, '../migrations') constant MIGRATION_HISTORY_FILE (line 25) | const MIGRATION_HISTORY_FILE = join(__dirname, '../.migration-history.js... function log (line 37) | function log(message, color = 'reset') { function getMigrationHistory (line 42) | function getMigrationHistory() { function saveMigrationHistory (line 55) | function saveMigrationHistory(history) { function getMigrationFiles (line 60) | function getMigrationFiles() { function executeMigration (line 72) | function executeMigration(filename, isLocal = false) { function main (line 111) | function main() { FILE: tmarks/scripts/check-db-schema.js function executeQuery (line 71) | function executeQuery(query) { function checkTable (line 81) | function checkTable(tableName) { function checkTableFields (line 94) | function checkTableFields(tableName, requiredFields) { function checkMigrations (line 124) | function checkMigrations() { FILE: tmarks/scripts/check-migrations.js constant MIGRATIONS_DIR (line 15) | const MIGRATIONS_DIR = join(__dirname, '../migrations') constant MIGRATION_HISTORY_FILE (line 16) | const MIGRATION_HISTORY_FILE = join(__dirname, '../.migration-history.js... function log (line 26) | function log(message, color = 'reset') { function getMigrationHistory (line 31) | function getMigrationHistory() { function getMigrationFiles (line 43) | function getMigrationFiles() { function main (line 54) | function main() { FILE: tmarks/scripts/prepare-deploy.js function copyDir (line 49) | function copyDir(src, dest) { FILE: tmarks/shared/import-export-types.ts type ExportBookmark (line 8) | interface ExportBookmark { type ExportTag (line 30) | interface ExportTag { type ExportUser (line 42) | interface ExportUser { type ExportTabGroupItem (line 49) | interface ExportTabGroupItem { type ExportTabGroup (line 61) | interface ExportTabGroup { type ExportFormat (line 78) | type ExportFormat = 'json' type TMarksExportData (line 80) | interface TMarksExportData { type ImportFormat (line 99) | type ImportFormat = 'html' | 'json' | 'tmarks' type ParsedBookmark (line 101) | interface ParsedBookmark { type ParsedTag (line 111) | interface ParsedTag { type ParsedTabGroupItem (line 116) | interface ParsedTabGroupItem { type ParsedTabGroup (line 128) | interface ParsedTabGroup { type ImportData (line 141) | interface ImportData { type ImportResult (line 155) | interface ImportResult { type ExportResult (line 168) | interface ExportResult { type ImportError (line 177) | interface ImportError { type ImportErrorCode (line 184) | type ImportErrorCode = type ProgressInfo (line 195) | interface ProgressInfo { type ProgressStatus (line 204) | type ProgressStatus = type ImportOptions (line 216) | interface ImportOptions { type ExportOptions (line 226) | interface ExportOptions { type ExportRequest (line 238) | interface ExportRequest { type ImportRequest (line 243) | interface ImportRequest { type ImportProgressResponse (line 249) | interface ImportProgressResponse { type ExportProgressResponse (line 254) | interface ExportProgressResponse { type ImportParser (line 261) | interface ImportParser { type ValidationResult (line 267) | interface ValidationResult { type ValidationError (line 273) | interface ValidationError { type ValidationWarning (line 279) | interface ValidationWarning { type Exporter (line 287) | interface Exporter { type ExportOutput (line 292) | interface ExportOutput { type DateParser (line 301) | type DateParser = (dateString: string) => Date | null type URLValidator (line 302) | type URLValidator = (url: string) => boolean type TagNormalizer (line 303) | type TagNormalizer = (tagName: string) => string constant SUPPORTED_IMPORT_FORMATS (line 307) | const SUPPORTED_IMPORT_FORMATS: ImportFormat[] = ['html', 'json', 'tmarks'] constant SUPPORTED_EXPORT_FORMATS (line 308) | const SUPPORTED_EXPORT_FORMATS: ExportFormat[] = ['json'] constant DEFAULT_IMPORT_OPTIONS (line 310) | const DEFAULT_IMPORT_OPTIONS: ImportOptions = { constant DEFAULT_EXPORT_OPTIONS (line 320) | const DEFAULT_EXPORT_OPTIONS: ExportOptions = { constant EXPORT_VERSION (line 330) | const EXPORT_VERSION = '1.0.0' FILE: tmarks/shared/permissions.ts constant PERMISSIONS (line 9) | const PERMISSIONS = { type Permission (line 40) | type Permission = typeof PERMISSIONS[keyof typeof PERMISSIONS] constant PERMISSION_TEMPLATES (line 45) | const PERMISSION_TEMPLATES = { type PermissionTemplate (line 82) | type PermissionTemplate = keyof typeof PERMISSION_TEMPLATES function hasPermission (line 90) | function hasPermission( constant PERMISSION_I18N_KEYS (line 111) | const PERMISSION_I18N_KEYS: Record = { function getPermissionI18nKey (line 138) | function getPermissionI18nKey(permission: string): string { function getPermissionLabel (line 148) | function getPermissionLabel(permission: string, t?: (key: string) => str... constant PERMISSION_GROUP_I18N_KEYS (line 160) | const PERMISSION_GROUP_I18N_KEYS = { function getPermissionGroups (line 170) | function getPermissionGroups(t?: (key: string) => string): Array<{ FILE: tmarks/src/App.tsx function App (line 13) | function App() { FILE: tmarks/src/components/api-keys/ApiKeyCard.tsx type ApiKeyCardProps (line 11) | interface ApiKeyCardProps { function ApiKeyCard (line 18) | function ApiKeyCard({ apiKey, onViewDetails, onRevoke, onDelete }: ApiKe... FILE: tmarks/src/components/api-keys/ApiKeyDetailModal.tsx type ApiKeyDetailModalProps (line 14) | interface ApiKeyDetailModalProps { function ApiKeyDetailModal (line 19) | function ApiKeyDetailModal({ apiKey, onClose }: ApiKeyDetailModalProps) { FILE: tmarks/src/components/api-keys/CreateApiKeyModal.tsx type CreateApiKeyModalProps (line 17) | interface CreateApiKeyModalProps { type Step (line 21) | type Step = 'basic' | 'permissions' | 'expiration' | 'success' function CreateApiKeyModal (line 23) | function CreateApiKeyModal({ onClose }: CreateApiKeyModalProps) { FILE: tmarks/src/components/api-keys/StepBasicInfo.tsx type StepBasicInfoProps (line 4) | interface StepBasicInfoProps { function StepBasicInfo (line 12) | function StepBasicInfo({ FILE: tmarks/src/components/api-keys/StepPermissions.tsx type StepPermissionsProps (line 9) | interface StepPermissionsProps { function StepPermissions (line 17) | function StepPermissions({ FILE: tmarks/src/components/api-keys/StepSuccess.tsx type StepSuccessProps (line 5) | interface StepSuccessProps { function StepSuccess (line 10) | function StepSuccess({ createdKey, onClose }: StepSuccessProps) { FILE: tmarks/src/components/auth/ProtectedRoute.tsx function ProtectedRoute (line 5) | function ProtectedRoute() { FILE: tmarks/src/components/bookmarks/BatchActionBar.tsx type BatchActionBarProps (line 10) | interface BatchActionBarProps { function BatchActionBar (line 16) | function BatchActionBar({ FILE: tmarks/src/components/bookmarks/BookmarkCardView.tsx type BookmarkCardViewProps (line 14) | interface BookmarkCardViewProps { function BookmarkCardView (line 23) | function BookmarkCardView({ type BookmarkCardProps (line 47) | interface BookmarkCardProps { function BookmarkCard (line 57) | function BookmarkCard({ FILE: tmarks/src/components/bookmarks/BookmarkForm.tsx type BookmarkFormProps (line 8) | interface BookmarkFormProps { function BookmarkForm (line 14) | function BookmarkForm({ bookmark, onClose, onSuccess }: BookmarkFormProp... FILE: tmarks/src/components/bookmarks/BookmarkListContainer.tsx type BookmarkListContainerProps (line 8) | interface BookmarkListContainerProps { function BookmarkListContainer (line 20) | function BookmarkListContainer({ FILE: tmarks/src/components/bookmarks/BookmarkListItem.tsx type BookmarkListItemProps (line 10) | interface BookmarkListItemProps { FILE: tmarks/src/components/bookmarks/BookmarkListLayout.tsx type BookmarkListLayoutProps (line 19) | interface BookmarkListLayoutProps { function BookmarkListLayout (line 81) | function BookmarkListLayout({ function FullScreenContent (line 169) | function FullScreenContent(props: { function FlowContent (line 228) | function FlowContent(props: { FILE: tmarks/src/components/bookmarks/BookmarkListView.tsx type BookmarkListViewProps (line 7) | interface BookmarkListViewProps { function BookmarkListView (line 20) | function BookmarkListView({ FILE: tmarks/src/components/bookmarks/BookmarkMinimalListView.tsx type BookmarkMinimalListViewProps (line 5) | interface BookmarkMinimalListViewProps { function BookmarkMinimalListView (line 14) | function BookmarkMinimalListView({ type MinimalRowProps (line 51) | interface MinimalRowProps { function MinimalRow (line 60) | function MinimalRow({ FILE: tmarks/src/components/bookmarks/BookmarkTitleView.tsx type BookmarkTitleViewProps (line 12) | interface BookmarkTitleViewProps { function BookmarkTitleView (line 21) | function BookmarkTitleView({ type TitleOnlyCardProps (line 51) | interface TitleOnlyCardProps { function TitleOnlyCard (line 61) | function TitleOnlyCard({ function FaviconIcon (line 149) | function FaviconIcon(props: { FILE: tmarks/src/components/bookmarks/DefaultBookmarkIcon.tsx type DefaultBookmarkIconProps (line 3) | interface DefaultBookmarkIconProps { function DefaultBookmarkIconComponent (line 8) | function DefaultBookmarkIconComponent({ FILE: tmarks/src/components/bookmarks/SnapshotViewer.tsx type SnapshotViewerProps (line 11) | interface SnapshotViewerProps { function SnapshotViewer (line 26) | function SnapshotViewer({ bookmarkId, bookmarkTitle, snapshotCount = 0 }... FILE: tmarks/src/components/bookmarks/TagSelector.tsx type TagSelectorProps (line 5) | interface TagSelectorProps { function TagSelector (line 15) | function TagSelector({ FILE: tmarks/src/components/bookmarks/defaultIconOptions.ts constant DEFAULT_ICON_OPTIONS (line 4) | const DEFAULT_ICON_OPTIONS: Array<{ value: DefaultBookmarkIcon; label: s... FILE: tmarks/src/components/bookmarks/hooks/useBookmarkFormState.ts function useBookmarkFormState (line 4) | function useBookmarkFormState(bookmark?: Bookmark | null) { FILE: tmarks/src/components/bookmarks/shared/BookmarkActions.tsx type BatchCheckboxProps (line 7) | interface BatchCheckboxProps { function BatchCheckbox (line 14) | function BatchCheckbox({ bookmarkId, isSelected, onToggleSelect, size = ... type EditButtonProps (line 38) | interface EditButtonProps { function EditButton (line 43) | function EditButton({ onEdit, showHint }: EditButtonProps) { FILE: tmarks/src/components/bookmarks/shared/BookmarkTagList.tsx type BookmarkTagListProps (line 8) | interface BookmarkTagListProps { function BookmarkTagList (line 13) | function BookmarkTagList({ bookmark, maxTags = 4 }: BookmarkTagListProps) { FILE: tmarks/src/components/bookmarks/shared/MasonryGrid.tsx type MasonryGridProps (line 10) | interface MasonryGridProps { function MasonryGrid (line 24) | function MasonryGrid({ FILE: tmarks/src/components/bookmarks/shared/useFaviconFallback.ts function useFaviconFallback (line 7) | function useFaviconFallback(bookmark: Bookmark) { FILE: tmarks/src/components/bookmarks/shared/useResponsiveColumns.ts type ColumnConfig (line 3) | interface ColumnConfig { function useResponsiveColumns (line 13) | function useResponsiveColumns( function useEditHintVisibility (line 51) | function useEditHintVisibility() { FILE: tmarks/src/components/bookmarks/useBookmarkForm.ts type UseBookmarkFormProps (line 9) | interface UseBookmarkFormProps { function useBookmarkForm (line 16) | function useBookmarkForm({ bookmark, onClose, onSuccess, tags }: UseBook... FILE: tmarks/src/components/bookmarks/useSnapshots.ts type Snapshot (line 8) | interface Snapshot { constant SNAPSHOTS_QUERY_KEY (line 17) | const SNAPSHOTS_QUERY_KEY = 'snapshots'; function useSnapshots (line 19) | function useSnapshots(bookmarkId: string) { FILE: tmarks/src/components/common/AdaptiveImage.tsx type AdaptiveImageProps (line 4) | interface AdaptiveImageProps { FILE: tmarks/src/components/common/AlertDialog.tsx type AlertDialogProps (line 6) | interface AlertDialogProps { function AlertDialog (line 15) | function AlertDialog({ FILE: tmarks/src/components/common/BookmarkIcons.tsx function ViewModeIcon (line 17) | function ViewModeIcon({ mode, className }: { mode: ViewMode, className?:... function VisibilityIcon (line 33) | function VisibilityIcon({ filter, className }: { filter: VisibilityFilte... function SortIcon (line 47) | function SortIcon({ sort, className }: { sort: SortOption, className?: s... FILE: tmarks/src/components/common/BottomNav.tsx type NavItem (line 5) | interface NavItem { function BottomNav (line 29) | function BottomNav() { FILE: tmarks/src/components/common/CircularProgress.tsx type CircularProgressProps (line 3) | interface CircularProgressProps { function CircularProgress (line 16) | function CircularProgress({ FILE: tmarks/src/components/common/ColorThemeSelector.tsx function ColorThemeSelector (line 4) | function ColorThemeSelector() { FILE: tmarks/src/components/common/ConfirmDialog.tsx type ConfirmDialogProps (line 6) | interface ConfirmDialogProps { function ConfirmDialog (line 17) | function ConfirmDialog({ FILE: tmarks/src/components/common/DialogHost.tsx function DialogHost (line 5) | function DialogHost() { FILE: tmarks/src/components/common/DragDropUpload.tsx type DragDropUploadProps (line 10) | interface DragDropUploadProps { type UploadState (line 19) | interface UploadState { function DragDropUpload (line 25) | function DragDropUpload({ function formatFileSize (line 261) | function formatFileSize(bytes: number): string { FILE: tmarks/src/components/common/Drawer.tsx type DrawerProps (line 7) | interface DrawerProps { function Drawer (line 19) | function Drawer({ isOpen, onClose, children, title, side = 'left' }: Dra... FILE: tmarks/src/components/common/DropdownMenu.tsx type MenuItem (line 5) | interface MenuItem { type DropdownMenuProps (line 14) | interface DropdownMenuProps { function DropdownMenu (line 20) | function DropdownMenu({ trigger, items, align = 'right' }: DropdownMenuP... FILE: tmarks/src/components/common/ErrorBoundary.tsx type Props (line 4) | interface Props { type State (line 8) | interface State { class ErrorBoundary (line 13) | class ErrorBoundary extends Component { method constructor (line 14) | constructor(props: Props) { method getDerivedStateFromError (line 19) | static getDerivedStateFromError(error: Error): State { method componentDidCatch (line 23) | componentDidCatch(error: Error, errorInfo: ErrorInfo) { method render (line 27) | render() { FILE: tmarks/src/components/common/ErrorDisplay.tsx type ErrorItem (line 20) | interface ErrorItem { type ErrorDisplayProps (line 29) | interface ErrorDisplayProps { function ErrorDisplay (line 42) | function ErrorDisplay({ type ErrorItemProps (line 197) | interface ErrorItemProps { function ErrorItem (line 206) | function ErrorItem({ error, variant, showDetails, onCopy, isCopied }: Er... function getDefaultTitle (line 280) | function getDefaultTitle(variant: string, count: number, t: (key: string... FILE: tmarks/src/components/common/LanguageSelector.tsx type LanguageSelectorProps (line 4) | interface LanguageSelectorProps { function LanguageSelector (line 9) | function LanguageSelector({ className = '', showLabel = true }: Language... FILE: tmarks/src/components/common/LazyImage.tsx type LazyImageProps (line 9) | interface LazyImageProps { FILE: tmarks/src/components/common/MobileHeader.tsx type MobileHeaderProps (line 4) | interface MobileHeaderProps { function MobileHeader (line 17) | function MobileHeader({ FILE: tmarks/src/components/common/PaginationFooter.tsx type PaginationFooterProps (line 3) | interface PaginationFooterProps { function PaginationFooter (line 11) | function PaginationFooter({ FILE: tmarks/src/components/common/ProgressIndicator.tsx type ProgressInfo (line 11) | interface ProgressInfo { type ProgressIndicatorProps (line 21) | interface ProgressIndicatorProps { function ProgressIndicator (line 29) | function ProgressIndicator({ function formatTime (line 210) | function formatTime(seconds: number, t: (key: string, options?: Record( function DataSettingsTab (line 38) | function DataSettingsTab() { FILE: tmarks/src/components/settings/tabs/ShareSettingsTab.tsx function ShareSettingsTab (line 15) | function ShareSettingsTab() { FILE: tmarks/src/components/settings/tabs/SnapshotSettingsTab.tsx type SnapshotSettingsTabProps (line 11) | interface SnapshotSettingsTabProps { function SnapshotSettingsTab (line 16) | function SnapshotSettingsTab({ FILE: tmarks/src/components/tab-groups/BatchActionBar.tsx type BatchActionBarProps (line 5) | interface BatchActionBarProps { function BatchActionBar (line 16) | function BatchActionBar({ FILE: tmarks/src/components/tab-groups/ColorPicker.tsx type ColorPickerProps (line 6) | interface ColorPickerProps { function ColorPicker (line 12) | function ColorPicker({ currentColor, onColorChange, onClose }: ColorPick... FILE: tmarks/src/components/tab-groups/EmptyState.tsx type EmptyStateProps (line 4) | interface EmptyStateProps { function EmptyState (line 9) | function EmptyState({ isSearching, searchQuery }: EmptyStateProps) { FILE: tmarks/src/components/tab-groups/InsertionIndicator.tsx type InsertionIndicatorProps (line 6) | interface InsertionIndicatorProps { function InsertionIndicator (line 10) | function InsertionIndicator({ position }: InsertionIndicatorProps) { FILE: tmarks/src/components/tab-groups/MoveItemDialog.tsx type MoveItemDialogProps (line 9) | interface MoveItemDialogProps { function MoveItemDialog (line 18) | function MoveItemDialog({ FILE: tmarks/src/components/tab-groups/MoveToFolderDialog.tsx type MoveToFolderDialogProps (line 9) | interface MoveToFolderDialogProps { function MoveToFolderDialog (line 17) | function MoveToFolderDialog({ FILE: tmarks/src/components/tab-groups/PinnedItemsSection.tsx type PinnedItem (line 10) | interface PinnedItem extends TabGroupItem { type PinnedItemsSectionProps (line 15) | interface PinnedItemsSectionProps { function PinnedItemsSection (line 20) | function PinnedItemsSection({ tabGroups, onUnpin }: PinnedItemsSectionPr... FILE: tmarks/src/components/tab-groups/SearchBar.tsx type SearchBarProps (line 7) | interface SearchBarProps { function SearchBar (line 16) | function SearchBar({ FILE: tmarks/src/components/tab-groups/ShareDialog.tsx type ShareDialogProps (line 12) | interface ShareDialogProps { function ShareDialog (line 18) | function ShareDialog({ groupId, groupTitle, onClose }: ShareDialogProps) { FILE: tmarks/src/components/tab-groups/SortSelector.tsx type SortSelectorProps (line 5) | interface SortSelectorProps { function SortSelector (line 10) | function SortSelector({ value, onChange }: SortSelectorProps) { FILE: tmarks/src/components/tab-groups/TabGroupCard.tsx type TabItem (line 9) | interface TabItem { type TabGroupCardProps (line 16) | interface TabGroupCardProps { function TabGroupCard (line 33) | function TabGroupCard({ FILE: tmarks/src/components/tab-groups/TabGroupHeader.tsx type TabGroupHeaderProps (line 9) | interface TabGroupHeaderProps { function TabGroupHeader (line 24) | function TabGroupHeader({ FILE: tmarks/src/components/tab-groups/TabGroupSidebar.tsx type TabGroupSidebarProps (line 6) | interface TabGroupSidebarProps { function TabGroupSidebar (line 12) | function TabGroupSidebar({ FILE: tmarks/src/components/tab-groups/TabGroupTree.tsx type TabGroupTreeProps (line 12) | interface TabGroupTreeProps { function TabGroupTree (line 22) | function TabGroupTree({ FILE: tmarks/src/components/tab-groups/TabItem.tsx type TabItemProps (line 9) | interface TabItemProps { function TabItem (line 29) | function TabItem({ FILE: tmarks/src/components/tab-groups/TabItemList.tsx type TabItemListProps (line 9) | interface TabItemListProps { function TabItemList (line 29) | function TabItemList({ FILE: tmarks/src/components/tab-groups/TagsInput.tsx type TagsInputProps (line 6) | interface TagsInputProps { function TagsInput (line 12) | function TagsInput({ tags, onTagsChange, onClose }: TagsInputProps) { function TagsList (line 116) | function TagsList({ tags }: { tags: string[] | null }) { FILE: tmarks/src/components/tab-groups/TodoItemCard.tsx type TodoItemCardProps (line 8) | interface TodoItemCardProps { function TodoItemCard (line 29) | function TodoItemCard({ FILE: tmarks/src/components/tab-groups/TodoSidebar.tsx type TodoSidebarProps (line 13) | interface TodoSidebarProps { function TodoSidebar (line 17) | function TodoSidebar({ tabGroups }: TodoSidebarProps) { FILE: tmarks/src/components/tab-groups/colorUtils.ts constant COLORS (line 6) | const COLORS = [ constant COLOR_MAP (line 18) | const COLOR_MAP: Record = { constant LEFT_BORDER_MAP (line 35) | const LEFT_BORDER_MAP: Record = { function getColorClasses (line 52) | function getColorClasses(color: string | null): string { function getLeftBorderColor (line 57) | function getLeftBorderColor(color: string | null): string { FILE: tmarks/src/components/tab-groups/sortUtils.ts type SortOption (line 13) | type SortOption = 'created' | 'title' | 'count' function sortTabGroupsForView (line 15) | function sortTabGroupsForView = { function loadPreferencesFromStorage (line 26) | function loadPreferencesFromStorage(): Partial { function savePreferencesToStorage (line 45) | function savePreferencesToStorage(preferences: Partial)... function useLocalPreferences (line 59) | function useLocalPreferences() { FILE: tmarks/src/hooks/useMediaQuery.ts function useMediaQuery (line 7) | function useMediaQuery(query: string): boolean { function useIsMobile (line 43) | function useIsMobile() { function useIsTablet (line 47) | function useIsTablet() { function useIsDesktop (line 51) | function useIsDesktop() { function useDeviceType (line 58) | function useDeviceType(): 'mobile' | 'tablet' | 'desktop' { FILE: tmarks/src/hooks/usePreferences.ts constant PREFERENCES_QUERY_KEY (line 7) | const PREFERENCES_QUERY_KEY = 'preferences' constant PREFERENCES_STORAGE_KEY (line 8) | const PREFERENCES_STORAGE_KEY = 'tmarks:preferences' function getStoredPreferences (line 11) | function getStoredPreferences(): UserPreferences | null { function saveStoredPreferences (line 27) | function saveStoredPreferences(preferences: UserPreferences): void { function getStoredViewMode (line 38) | function getStoredViewMode(): 'list' | 'card' | 'minimal' | 'title' | nu... function getDefaultPreferences (line 46) | function getDefaultPreferences(): UserPreferences { function usePreferences (line 78) | function usePreferences() { function useUpdatePreferences (line 119) | function useUpdatePreferences() { FILE: tmarks/src/hooks/useShare.ts constant SHARE_SETTINGS_QUERY_KEY (line 5) | const SHARE_SETTINGS_QUERY_KEY = 'share-settings' function useShareSettings (line 7) | function useShareSettings() { function useUpdateShareSettings (line 15) | function useUpdateShareSettings() { function usePublicShare (line 25) | function usePublicShare(slug: string, enabled: boolean) { function useInfinitePublicShare (line 34) | function useInfinitePublicShare(slug: string, enabled: boolean, pageSize... FILE: tmarks/src/hooks/useStorage.ts function useR2StorageQuota (line 9) | function useR2StorageQuota() { FILE: tmarks/src/hooks/useTabGroupActions.ts type UseTabGroupActionsProps (line 13) | interface UseTabGroupActionsProps { function useTabGroupActions (line 30) | function useTabGroupActions({ FILE: tmarks/src/hooks/useTabGroupItemActions.ts type UseTabGroupItemActionsProps (line 9) | interface UseTabGroupItemActionsProps { function useTabGroupItemActions (line 25) | function useTabGroupItemActions({ FILE: tmarks/src/hooks/useTabGroupMenu.ts type TabGroupMenuActions (line 7) | interface TabGroupMenuActions { type UseTabGroupMenuProps (line 24) | interface UseTabGroupMenuProps { function useTabGroupMenu (line 30) | function useTabGroupMenu({ onRefresh, onStartRename, onOpenMoveDialog }:... FILE: tmarks/src/hooks/useTabGroupsQuery.ts constant TAB_GROUPS_QUERY_KEY (line 4) | const TAB_GROUPS_QUERY_KEY = ['tab-groups', 'all'] as const constant TAB_GROUPS_TRASH_QUERY_KEY (line 5) | const TAB_GROUPS_TRASH_QUERY_KEY = ['tab-groups', 'trash'] as const constant TAB_GROUP_DETAIL_QUERY_KEY (line 6) | const TAB_GROUP_DETAIL_QUERY_KEY = 'tab-group-detail' constant TAB_GROUPS_STATISTICS_QUERY_KEY (line 7) | const TAB_GROUPS_STATISTICS_QUERY_KEY = 'tab-groups-statistics' function useTabGroupsQuery (line 9) | function useTabGroupsQuery() { function useTabGroupsTrashQuery (line 22) | function useTabGroupsTrashQuery() { function useTabGroupDetailQuery (line 35) | function useTabGroupDetailQuery(groupId?: string) { function useTabGroupsStatisticsQuery (line 51) | function useTabGroupsStatisticsQuery(days: number) { function useInvalidateTabGroups (line 61) | function useInvalidateTabGroups() { FILE: tmarks/src/hooks/useTags.ts constant TAGS_QUERY_KEY (line 5) | const TAGS_QUERY_KEY = 'tags' function useTags (line 10) | function useTags( function useCreateTag (line 27) | function useCreateTag() { function useUpdateTag (line 41) | function useUpdateTag() { function useDeleteTag (line 56) | function useDeleteTag() { FILE: tmarks/src/i18n/index.ts type LanguageCode (line 34) | type LanguageCode = (typeof supportedLanguages)[number]['code'] FILE: tmarks/src/lib/ai/client.ts constant SYSTEM_PROMPT (line 9) | const SYSTEM_PROMPT = '你是一个智能书签整理助手。请根据用户的要求整理书签数据。返回格式必须是 JSON。' type AICallParams (line 12) | interface AICallParams { type AICallResult (line 24) | interface AICallResult { function resolveEndpoint (line 32) | function resolveEndpoint(baseUrl: string, endpoint: string): string { function buildOpenAIRequest (line 45) | function buildOpenAIRequest(params: AICallParams, options?: { function buildClaudeRequest (line 83) | function buildClaudeRequest(params: AICallParams) { function extractOpenAIContent (line 111) | function extractOpenAIContent(data: unknown): string | undefined { function extractClaudeContent (line 134) | function extractClaudeContent(data: unknown): string | undefined { function callAI (line 153) | async function callAI(params: AICallParams): Promise { function testAIConnection (line 236) | async function testAIConnection(params: { FILE: tmarks/src/lib/ai/constants.ts type AIProvider (line 6) | type AIProvider = 'openai' | 'deepseek' | 'claude' | 'siliconflow' | 'mo... constant AI_SERVICE_URLS (line 8) | const AI_SERVICE_URLS: Record = { constant AI_DEFAULT_MODELS (line 17) | const AI_DEFAULT_MODELS: Record = { constant AI_TIMEOUT (line 26) | const AI_TIMEOUT = 60_000 FILE: tmarks/src/lib/ai/models.ts constant OPENAI_COMPATIBLE_PROVIDERS (line 11) | const OPENAI_COMPATIBLE_PROVIDERS = new Set([ function fetchAvailableModels (line 101) | async function fetchAvailableModels( FILE: tmarks/src/lib/api-client.ts constant API_BASE_URL (line 5) | const API_BASE_URL = import.meta.env.VITE_API_URL || '/api/v1' class ApiError (line 7) | class ApiError extends Error { method constructor (line 8) | constructor( function subscribeToRefresh (line 24) | function subscribeToRefresh(): { promise: Promise; unsubscribe: ... function onRefreshed (line 36) | function onRefreshed(token: string) { function rejectSubscribers (line 41) | function rejectSubscribers(error: Error) { class HttpClient (line 49) | class HttpClient { method constructor (line 52) | constructor(baseURL: string) { method getAuthToken (line 56) | private getAuthToken(): string | null { method request (line 60) | private async request( method clearAuthAndRedirect (line 189) | private clearAuthAndRedirect() { method get (line 198) | async get(endpoint: string, options?: RequestInit): Promise(endpoint: string, body?: unknown, options?: RequestInit)... method put (line 210) | async put(endpoint: string, body?: unknown, options?: RequestInit):... method patch (line 218) | async patch(endpoint: string, body?: unknown, options?: RequestInit... method delete (line 226) | async delete(endpoint: string, options?: RequestInit): Promise { function detectImageType (line 36) | function detectImageType(width: number, height: number): ImageType { function analyzeImage (line 60) | async function analyzeImage(url: string): Promise { function getImageClassName (line 84) | function getImageClassName(type: ImageType): string { FILE: tmarks/src/lib/logger.ts type LogValue (line 8) | type LogValue = string | number | boolean | null | undefined | Error | R... FILE: tmarks/src/lib/search-utils.ts function fastIncludes (line 8) | function fastIncludes(text: string, query: string): boolean { function searchInFields (line 27) | function searchInFields(fields: string[], query: string): boolean { FILE: tmarks/src/lib/types/api.types.ts type ApiResponse (line 1) | interface ApiResponse { type ApiError (line 13) | interface ApiError { FILE: tmarks/src/lib/types/auth.types.ts type User (line 1) | interface User { type LoginRequest (line 9) | interface LoginRequest { type LoginResponse (line 15) | interface LoginResponse { type RegisterRequest (line 23) | interface RegisterRequest { type RegisterResponse (line 29) | interface RegisterResponse { type RefreshTokenRequest (line 33) | interface RefreshTokenRequest { type RefreshTokenResponse (line 37) | interface RefreshTokenResponse { FILE: tmarks/src/lib/types/bookmark.types.ts type Tag (line 1) | interface Tag { type Bookmark (line 13) | interface Bookmark { type CreateBookmarkRequest (line 36) | interface CreateBookmarkRequest { type UpdateBookmarkRequest (line 48) | interface UpdateBookmarkRequest { type BookmarksResponse (line 60) | interface BookmarksResponse { type CreateTagRequest (line 71) | interface CreateTagRequest { type UpdateTagRequest (line 76) | interface UpdateTagRequest { type TagsResponse (line 81) | interface TagsResponse { type BookmarkQueryParams (line 85) | interface BookmarkQueryParams { type TagQueryParams (line 95) | interface TagQueryParams { type BatchActionType (line 99) | type BatchActionType = 'delete' | 'update_tags' | 'pin' | 'unpin' | 'arc... type BatchActionRequest (line 101) | interface BatchActionRequest { type BatchActionResponse (line 108) | interface BatchActionResponse { FILE: tmarks/src/lib/types/preferences.types.ts type TagLayoutPreference (line 3) | type TagLayoutPreference = 'grid' | 'masonry' type SortByPreference (line 4) | type SortByPreference = 'created' | 'updated' | 'pinned' | 'popular' type DefaultBookmarkIcon (line 6) | type DefaultBookmarkIcon = 'favicon' | 'letter' | 'hash' | 'none' | 'orb... type UserPreferences (line 8) | interface UserPreferences { type UpdatePreferencesRequest (line 25) | interface UpdatePreferencesRequest { type PreferencesResponse (line 56) | interface PreferencesResponse { type ShareSettings (line 60) | interface ShareSettings { type ShareSettingsResponse (line 67) | interface ShareSettingsResponse { type R2StorageQuota (line 71) | interface R2StorageQuota { type R2StorageQuotaResponse (line 77) | interface R2StorageQuotaResponse { type UpdateShareSettingsRequest (line 81) | interface UpdateShareSettingsRequest { type PublicSharePayload (line 89) | interface PublicSharePayload { type PublicSharePaginatedPayload (line 101) | interface PublicSharePaginatedPayload { FILE: tmarks/src/lib/types/tab-group.types.ts type TabGroupItem (line 1) | interface TabGroupItem { type TabGroup (line 14) | interface TabGroup { type CreateTabGroupRequest (line 32) | interface CreateTabGroupRequest { type UpdateTabGroupRequest (line 43) | interface UpdateTabGroupRequest { type TabGroupsResponse (line 51) | interface TabGroupsResponse { type TabGroupResponse (line 61) | interface TabGroupResponse { type Share (line 65) | interface Share { type ShareResponse (line 76) | interface ShareResponse { type StatisticsSummary (line 81) | interface StatisticsSummary { type TrendData (line 88) | interface TrendData { type DomainCount (line 93) | interface DomainCount { type GroupSizeDistribution (line 98) | interface GroupSizeDistribution { type StatisticsResponse (line 103) | interface StatisticsResponse { FILE: tmarks/src/pages/auth/LoginPage.tsx function LoginPage (line 7) | function LoginPage() { FILE: tmarks/src/pages/auth/RegisterPage.tsx function RegisterPage (line 7) | function RegisterPage() { FILE: tmarks/src/pages/bookmarks/BookmarkStatisticsPage.tsx type BookmarkStatisticsPageProps (line 10) | interface BookmarkStatisticsPageProps { function BookmarkStatisticsPage (line 14) | function BookmarkStatisticsPage({ embedded = false }: BookmarkStatistics... FILE: tmarks/src/pages/bookmarks/BookmarkTrashPage.tsx function BookmarkTrashPage (line 14) | function BookmarkTrashPage() { FILE: tmarks/src/pages/bookmarks/BookmarksPage.tsx function BookmarksPage (line 15) | function BookmarksPage() { FILE: tmarks/src/pages/bookmarks/TrashBookmarkItem.tsx type TrashBookmarkItemProps (line 7) | interface TrashBookmarkItemProps { function TrashBookmarkItem (line 13) | function TrashBookmarkItem({ bookmark, onRestore, onDelete }: TrashBookm... FILE: tmarks/src/pages/bookmarks/components/BatchSelectionPrompt.tsx type BatchSelectionPromptProps (line 3) | interface BatchSelectionPromptProps { function BatchSelectionPrompt (line 11) | function BatchSelectionPrompt({ FILE: tmarks/src/pages/bookmarks/components/MobileTagDrawer.tsx type MobileTagDrawerProps (line 6) | interface MobileTagDrawerProps { function MobileTagDrawer (line 20) | function MobileTagDrawer({ FILE: tmarks/src/pages/bookmarks/components/StatisticsCards.tsx type StatisticsCardsProps (line 5) | interface StatisticsCardsProps { function StatisticsCards (line 11) | function StatisticsCards({ statistics, formatDate, formatDateTime }: Sta... FILE: tmarks/src/pages/bookmarks/hooks/useBookmarksEffects.ts type UseBookmarksEffectsProps (line 7) | interface UseBookmarksEffectsProps { function useBookmarksEffects (line 23) | function useBookmarksEffects({ FILE: tmarks/src/pages/bookmarks/hooks/useBookmarksState.ts function useBookmarksState (line 8) | function useBookmarksState() { FILE: tmarks/src/pages/bookmarks/hooks/useStatisticsData.ts type BookmarkStatistics (line 6) | interface BookmarkStatistics { type Granularity (line 50) | type Granularity = 'day' | 'week' | 'month' | 'year' function useStatisticsData (line 52) | function useStatisticsData(granularity: Granularity, currentDate: Date) { FILE: tmarks/src/pages/extension/ExtensionPage.tsx constant EXTENSION_ZIP (line 4) | const EXTENSION_ZIP = 'tmarks-extension-chrome.zip' constant CHROMIUM_BROWSERS (line 5) | const CHROMIUM_BROWSERS = ['Chrome', 'Edge', 'Brave', 'Opera', '360', 'Q... function ExtensionPage (line 7) | function ExtensionPage() { FILE: tmarks/src/pages/info/AboutPage.tsx function AboutPage (line 4) | function AboutPage() { FILE: tmarks/src/pages/info/HelpPage.tsx function HelpPage (line 5) | function HelpPage() { FILE: tmarks/src/pages/info/PrivacyPage.tsx function PrivacyPage (line 4) | function PrivacyPage() { FILE: tmarks/src/pages/info/TermsPage.tsx function TermsPage (line 4) | function TermsPage() { FILE: tmarks/src/pages/settings/ApiKeysPage.tsx function ApiKeysPage (line 15) | function ApiKeysPage() { FILE: tmarks/src/pages/settings/GeneralSettingsPage.tsx constant VALID_SECTIONS (line 19) | const VALID_SECTIONS = ['basic', 'automation', 'snapshot', 'api', 'share... type SectionId (line 20) | type SectionId = typeof VALID_SECTIONS[number] function isValidSection (line 22) | function isValidSection(s: string | null): s is SectionId { function GeneralSettingsPage (line 26) | function GeneralSettingsPage() { FILE: tmarks/src/pages/settings/ImportExportPage.tsx function ImportExportPage (line 12) | function ImportExportPage() { FILE: tmarks/src/pages/settings/PermissionsPage.tsx function PermissionsPage (line 4) | function PermissionsPage() { FILE: tmarks/src/pages/settings/ShareSettingsPage.tsx function ShareSettingsPage (line 5) | function ShareSettingsPage() { FILE: tmarks/src/pages/share/PublicSharePage.tsx function PublicSharePage (line 9) | function PublicSharePage() { function ShareHeader (line 94) | function ShareHeader({ shareInfo, totalCount, filteredCount, t }: { FILE: tmarks/src/pages/share/components/ShareTopBar.tsx function ViewModeIcon (line 20) | function ViewModeIcon({ mode }: { mode: ViewMode }) { function VisibilityIcon (line 35) | function VisibilityIcon({ filter }: { filter: VisibilityFilter }) { function SortIcon (line 48) | function SortIcon({ sort }: { sort: SortOption }) { type ShareTopBarProps (line 63) | interface ShareTopBarProps { constant SORT_OPTIONS (line 77) | const SORT_OPTIONS: SortOption[] = ['created', 'updated', 'pinned', 'pop... constant VIEW_MODES (line 78) | const VIEW_MODES = ['list', 'card', 'minimal', 'title'] as const function ShareTopBar (line 80) | function ShareTopBar({ FILE: tmarks/src/pages/share/hooks/usePublicShareState.ts type ViewMode (line 4) | type ViewMode = 'list' | 'card' | 'minimal' | 'title' type VisibilityFilter (line 5) | type VisibilityFilter = 'all' | 'public' | 'private' function usePublicShareState (line 7) | function usePublicShareState() { FILE: tmarks/src/pages/tab-groups/StatisticsPage.tsx function StatisticsPage (line 10) | function StatisticsPage() { FILE: tmarks/src/pages/tab-groups/TabGroupDetailHeader.tsx type TabGroupDetailHeaderProps (line 20) | interface TabGroupDetailHeaderProps { function TabGroupDetailHeader (line 26) | function TabGroupDetailHeader({ tabGroup, onRefresh, onDelete }: TabGrou... FILE: tmarks/src/pages/tab-groups/TabGroupDetailPage.tsx function TabGroupDetailPage (line 15) | function TabGroupDetailPage() { FILE: tmarks/src/pages/tab-groups/TabGroupEmptyState.tsx function TabGroupEmptyState (line 4) | function TabGroupEmptyState() { FILE: tmarks/src/pages/tab-groups/TabGroupItem.tsx type TabGroupItemProps (line 9) | interface TabGroupItemProps { function TabGroupItem (line 15) | function TabGroupItem({ item, index, onRefresh }: TabGroupItemProps) { FILE: tmarks/src/pages/tab-groups/TabGroupsPage.tsx function TabGroupsPage (line 26) | function TabGroupsPage() { FILE: tmarks/src/pages/tab-groups/TodoPage.tsx function TodoPage (line 7) | function TodoPage() { FILE: tmarks/src/pages/tab-groups/TrashPage.tsx function TrashPage (line 16) | function TrashPage() { FILE: tmarks/src/pages/tab-groups/components/TabGroupsGrid.tsx type TabGroupsGridProps (line 9) | interface TabGroupsGridProps { function renderGroupCard (line 47) | function renderGroupCard(props: TabGroupsGridProps & { group: TabGroup }) { function TabGroupsGrid (line 123) | function TabGroupsGrid(props: TabGroupsGridProps) { FILE: tmarks/src/pages/tab-groups/components/TabGroupsList.tsx type TabGroupsListProps (line 7) | interface TabGroupsListProps { function TabGroupsList (line 39) | function TabGroupsList({ FILE: tmarks/src/pages/tab-groups/hooks/useGroupManagement.ts type UseGroupManagementProps (line 6) | interface UseGroupManagementProps { function useGroupManagement (line 16) | function useGroupManagement({ FILE: tmarks/src/pages/tab-groups/hooks/useTabGroupDetailState.ts function useTabGroupDetailState (line 4) | function useTabGroupDetailState() { FILE: tmarks/src/pages/tab-groups/hooks/useTabGroupItemDnD.ts type UseTabGroupItemDnDProps (line 8) | interface UseTabGroupItemDnDProps { function useTabGroupItemDnD (line 28) | function useTabGroupItemDnD({ FILE: tmarks/src/pages/tab-groups/hooks/useTabGroupsData.ts type UseTabGroupsDataProps (line 8) | interface UseTabGroupsDataProps { function useTabGroupsData (line 16) | function useTabGroupsData({ FILE: tmarks/src/pages/tab-groups/hooks/useTabGroupsState.ts function useTabGroupsState (line 5) | function useTabGroupsState() { FILE: tmarks/src/routes/index.tsx function PageLoader (line 29) | function PageLoader() { function AppRouter (line 44) | function AppRouter() { FILE: tmarks/src/services/api-keys.ts type ApiKey (line 9) | interface ApiKey { type ApiKeyWithKey (line 23) | interface ApiKeyWithKey extends ApiKey { type ApiKeyStats (line 27) | interface ApiKeyStats { type ApiKeyWithStats (line 33) | interface ApiKeyWithStats extends ApiKey { type ApiKeyLog (line 37) | interface ApiKeyLog { type CreateApiKeyRequest (line 47) | interface CreateApiKeyRequest { type UpdateApiKeyRequest (line 55) | interface UpdateApiKeyRequest { function getApiKeys (line 66) | async function getApiKeys(): Promise<{ function getApiKey (line 77) | async function getApiKey(id: string): Promise { function createApiKey (line 85) | async function createApiKey(data: CreateApiKeyRequest): Promise { function deleteApiKey (line 108) | async function deleteApiKey(id: string): Promise { function getApiKeyLogs (line 115) | async function getApiKeyLogs( FILE: tmarks/src/services/auth.ts method register (line 16) | async register(data: RegisterRequest) { method login (line 24) | async login(data: LoginRequest) { method refreshToken (line 32) | async refreshToken(data: RefreshTokenRequest) { method logout (line 40) | async logout(refreshToken: string, revokeAll = false) { FILE: tmarks/src/services/bookmarks.ts method getBookmarks (line 17) | async getBookmarks(params?: BookmarkQueryParams) { method createBookmark (line 38) | async createBookmark(data: CreateBookmarkRequest) { method updateBookmark (line 46) | async updateBookmark(id: string, data: UpdateBookmarkRequest) { method deleteBookmark (line 54) | async deleteBookmark(id: string) { method restoreBookmark (line 61) | async restoreBookmark(id: string) { method recordClick (line 69) | async recordClick(id: string) { method batchAction (line 77) | async batchAction(data: BatchActionRequest) { method getStatistics (line 85) | async getStatistics(params: { method checkUrlExists (line 100) | async checkUrlExists(url: string) { method getTrash (line 110) | async getTrash(params?: { page_size?: number; page_cursor?: string }) { method restoreFromTrash (line 125) | async restoreFromTrash(id: string) { method permanentDelete (line 133) | async permanentDelete(id: string) { method emptyTrash (line 140) | async emptyTrash() { FILE: tmarks/src/services/index.ts function assertData (line 15) | function assertData(data: T | undefined, context: string): T { FILE: tmarks/src/services/preferences.ts method getPreferences (line 9) | async getPreferences(): Promise { method updatePreferences (line 17) | async updatePreferences(data: UpdatePreferencesRequest): Promise { method updateSettings (line 20) | async updateSettings(payload: UpdateShareSettingsRequest): Promise { method getPublicSharePaginated (line 44) | async getPublicSharePaginated( FILE: tmarks/src/services/storage.ts method getR2Quota (line 6) | async getR2Quota(): Promise { FILE: tmarks/src/services/tab-groups.ts method getTabGroups (line 16) | async getTabGroups(params?: { page_size?: number; page_cursor?: string }) { method listAllTabGroups (line 32) | async listAllTabGroups() { method getAllTabGroups (line 54) | async getAllTabGroups() { method getTabGroup (line 61) | async getTabGroup(id: string) { method createTabGroup (line 69) | async createTabGroup(data: CreateTabGroupRequest) { method createFolder (line 77) | async createFolder(title: string, parentId?: string | null) { method updateTabGroup (line 89) | async updateTabGroup(id: string, data: UpdateTabGroupRequest) { method deleteTabGroup (line 97) | async deleteTabGroup(id: string) { method updateTabGroupItem (line 104) | async updateTabGroupItem( method deleteTabGroupItem (line 128) | async deleteTabGroupItem(itemId: string) { method moveTabGroupItem (line 135) | async moveTabGroupItem(itemId: string, targetGroupId: string, position?:... method addItemsToGroup (line 162) | async addItemsToGroup(groupId: string, items: Array<{ title: string; url... method batchUpdatePositions (line 183) | async batchUpdatePositions(updates: Array<{ id: string; position: number... method getTrash (line 194) | async getTrash() { method restoreTabGroup (line 202) | async restoreTabGroup(id: string) { method permanentDeleteTabGroup (line 209) | async permanentDeleteTabGroup(id: string) { method createShare (line 216) | async createShare(groupId: string, options?: { is_public?: boolean; expi... method getShare (line 224) | async getShare(groupId: string) { method deleteShare (line 232) | async deleteShare(groupId: string) { method getStatistics (line 239) | async getStatistics(days: number = 30) { FILE: tmarks/src/services/tags.ts method getTags (line 15) | async getTags(params?: TagQueryParams) { method createTag (line 30) | async createTag(data: CreateTagRequest) { method updateTag (line 38) | async updateTag(id: string, data: UpdateTagRequest) { method deleteTag (line 46) | async deleteTag(id: string) { method incrementClick (line 53) | async incrementClick(id: string) { FILE: tmarks/src/stores/authStore.ts type AuthState (line 7) | interface AuthState { FILE: tmarks/src/stores/dialogStore.ts type DialogType (line 3) | type DialogType = 'info' | 'warning' | 'error' | 'success' type ConfirmDialogState (line 5) | interface ConfirmDialogState { type AlertDialogState (line 15) | interface AlertDialogState { type DialogState (line 24) | interface DialogState { FILE: tmarks/src/stores/themeStore.ts type Theme (line 4) | type Theme = 'light' | 'dark' type ColorTheme (line 5) | type ColorTheme = 'default' | 'violet' | 'green' | 'orange' type ThemeStore (line 7) | interface ThemeStore { FILE: tmarks/src/stores/toastStore.ts type ToastState (line 4) | interface ToastState {