gitextract_hsh8svta/ ├── DEPLOYMENT.md ├── LICENSE ├── README.md └── tmarks/ ├── .gitignore ├── .prettierignore ├── .prettierrc ├── API-DATABASE-AUDIT.md ├── eslint.config.js ├── functions/ │ ├── api/ │ │ ├── _middleware.ts │ │ ├── index.ts │ │ ├── public/ │ │ │ └── [slug].ts │ │ ├── share/ │ │ │ └── [token].ts │ │ ├── shared/ │ │ │ └── cache.ts │ │ ├── snapshot-images/ │ │ │ └── [hash].ts │ │ ├── tab/ │ │ │ ├── bookmarks/ │ │ │ │ ├── [id]/ │ │ │ │ │ ├── click.ts │ │ │ │ │ ├── permanent.ts │ │ │ │ │ ├── restore.ts │ │ │ │ │ ├── snapshot-upload.ts │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ ├── [snapshotId].ts │ │ │ │ │ │ └── cleanup.ts │ │ │ │ │ ├── snapshots-v2.ts │ │ │ │ │ ├── snapshots.ts │ │ │ │ │ └── trash.ts │ │ │ │ ├── [id].ts │ │ │ │ ├── batch/ │ │ │ │ │ └── index.ts │ │ │ │ ├── batch-handler.ts │ │ │ │ ├── bookmark-batch.ts │ │ │ │ ├── bookmark-list.ts │ │ │ │ ├── index.ts │ │ │ │ ├── reorder-pinned.ts │ │ │ │ ├── trash/ │ │ │ │ │ └── empty.ts │ │ │ │ └── trash.ts │ │ │ ├── me.ts │ │ │ ├── search.ts │ │ │ ├── statistics/ │ │ │ │ └── index.ts │ │ │ ├── tab-groups/ │ │ │ │ ├── [id]/ │ │ │ │ │ ├── items/ │ │ │ │ │ │ └── batch.ts │ │ │ │ │ ├── permanent-delete.ts │ │ │ │ │ ├── restore.ts │ │ │ │ │ └── share.ts │ │ │ │ ├── [id].ts │ │ │ │ ├── index.ts │ │ │ │ ├── items/ │ │ │ │ │ ├── [id]/ │ │ │ │ │ │ └── move.ts │ │ │ │ │ └── [id].ts │ │ │ │ └── trash.ts │ │ │ └── tags/ │ │ │ ├── [id]/ │ │ │ │ └── click.ts │ │ │ ├── [id].ts │ │ │ └── index.ts │ │ └── v1/ │ │ ├── auth/ │ │ │ ├── login.ts │ │ │ ├── logout.ts │ │ │ ├── refresh.ts │ │ │ └── register.ts │ │ ├── bookmarks/ │ │ │ ├── [id]/ │ │ │ │ ├── click.ts │ │ │ │ ├── permanent.ts │ │ │ │ ├── restore.ts │ │ │ │ ├── snapshot-cleanup.ts │ │ │ │ ├── snapshots/ │ │ │ │ │ ├── [snapshotId]/ │ │ │ │ │ │ └── view.ts │ │ │ │ │ ├── [snapshotId].ts │ │ │ │ │ └── cleanup.ts │ │ │ │ └── snapshots.ts │ │ │ ├── [id].ts │ │ │ ├── bulk.ts │ │ │ ├── index.ts │ │ │ ├── statistics-helpers.ts │ │ │ ├── statistics.ts │ │ │ ├── trash/ │ │ │ │ └── empty.ts │ │ │ └── trash.ts │ │ ├── change-password.ts │ │ ├── export.ts │ │ ├── health.ts │ │ ├── preferences-helpers.ts │ │ ├── preferences.ts │ │ ├── settings/ │ │ │ ├── api-keys/ │ │ │ │ ├── [id].ts │ │ │ │ └── index.ts │ │ │ ├── share.ts │ │ │ └── storage.ts │ │ ├── shared/ │ │ │ └── cache.ts │ │ ├── statistics/ │ │ │ └── index.ts │ │ ├── tab-groups/ │ │ │ ├── [id]/ │ │ │ │ ├── items/ │ │ │ │ │ └── batch.ts │ │ │ │ ├── permanent-delete.ts │ │ │ │ ├── restore.ts │ │ │ │ └── share.ts │ │ │ ├── [id].ts │ │ │ ├── batch-update.ts │ │ │ ├── index.ts │ │ │ ├── items/ │ │ │ │ ├── [id]/ │ │ │ │ │ └── move.ts │ │ │ │ └── [id].ts │ │ │ └── trash.ts │ │ └── tags/ │ │ ├── [id].ts │ │ └── index.ts │ ├── lib/ │ │ ├── api-key/ │ │ │ ├── generator.ts │ │ │ ├── logger.ts │ │ │ ├── rate-limiter-types.ts │ │ │ ├── rate-limiter.ts │ │ │ └── validator.ts │ │ ├── bookmark-utils.ts │ │ ├── cache/ │ │ │ ├── README.md │ │ │ ├── bookmark-cache.ts │ │ │ ├── config.ts │ │ │ ├── index.ts │ │ │ ├── service.ts │ │ │ ├── strategies.ts │ │ │ └── types.ts │ │ ├── config.ts │ │ ├── crypto.ts │ │ ├── data-fetchers.ts │ │ ├── error-handler.ts │ │ ├── image-sig.ts │ │ ├── image-upload.ts │ │ ├── import-export/ │ │ │ ├── collect-export-data.ts │ │ │ ├── export-scope.ts │ │ │ ├── export-stats.ts │ │ │ └── exporters/ │ │ │ ├── html-exporter.ts │ │ │ ├── json-exporter.ts │ │ │ └── tab-groups-netscape.ts │ │ ├── index.ts │ │ ├── input-sanitizer.ts │ │ ├── jwt.ts │ │ ├── rate-limit.ts │ │ ├── response.ts │ │ ├── signed-url.ts │ │ ├── storage-quota.ts │ │ ├── tags.ts │ │ ├── types.ts │ │ ├── utils.ts │ │ └── validation.ts │ └── middleware/ │ ├── api-key-auth-pages.ts │ ├── api-key-auth.ts │ ├── auth.ts │ ├── dual-auth.ts │ ├── index.ts │ └── security.ts ├── index.html ├── migrations/ │ ├── 0001_d1_console.sql │ ├── 0002_d1_console_ai_settings.sql │ ├── 0103_api_key_rate_limits.sql │ └── 0104_rate_limits.sql ├── package.json ├── postcss.config.js ├── public/ │ ├── _headers │ └── _routes.json ├── scripts/ │ ├── auto-migrate.js │ ├── check-db-schema.js │ ├── check-migrations.js │ └── prepare-deploy.js ├── shared/ │ ├── import-export-types.ts │ └── permissions.ts ├── src/ │ ├── App.tsx │ ├── components/ │ │ ├── api-keys/ │ │ │ ├── ApiKeyCard.tsx │ │ │ ├── ApiKeyDetailModal.tsx │ │ │ ├── CreateApiKeyModal.tsx │ │ │ ├── StepBasicInfo.tsx │ │ │ ├── StepPermissions.tsx │ │ │ └── StepSuccess.tsx │ │ ├── auth/ │ │ │ └── ProtectedRoute.tsx │ │ ├── bookmarks/ │ │ │ ├── BatchActionBar.tsx │ │ │ ├── BookmarkCardView.tsx │ │ │ ├── BookmarkForm.tsx │ │ │ ├── BookmarkListContainer.tsx │ │ │ ├── BookmarkListItem.tsx │ │ │ ├── BookmarkListLayout.tsx │ │ │ ├── BookmarkListView.tsx │ │ │ ├── BookmarkMinimalListView.tsx │ │ │ ├── BookmarkTitleView.tsx │ │ │ ├── DefaultBookmarkIcon.tsx │ │ │ ├── SnapshotViewer.tsx │ │ │ ├── TagSelector.tsx │ │ │ ├── bookmark-utils.ts │ │ │ ├── defaultIconOptions.ts │ │ │ ├── hooks/ │ │ │ │ └── useBookmarkFormState.ts │ │ │ ├── shared/ │ │ │ │ ├── BookmarkActions.tsx │ │ │ │ ├── BookmarkTagList.tsx │ │ │ │ ├── MasonryGrid.tsx │ │ │ │ ├── useFaviconFallback.ts │ │ │ │ └── useResponsiveColumns.ts │ │ │ ├── useBookmarkForm.ts │ │ │ └── useSnapshots.ts │ │ ├── common/ │ │ │ ├── AdaptiveImage.tsx │ │ │ ├── AlertDialog.tsx │ │ │ ├── BookmarkIcons.tsx │ │ │ ├── BottomNav.tsx │ │ │ ├── CircularProgress.tsx │ │ │ ├── ColorThemeSelector.tsx │ │ │ ├── ConfirmDialog.tsx │ │ │ ├── DialogHost.tsx │ │ │ ├── DragDropUpload.tsx │ │ │ ├── Drawer.tsx │ │ │ ├── DropdownMenu.tsx │ │ │ ├── ErrorBoundary.tsx │ │ │ ├── ErrorDisplay.tsx │ │ │ ├── LanguageSelector.tsx │ │ │ ├── LazyImage.tsx │ │ │ ├── MobileHeader.tsx │ │ │ ├── PaginationFooter.tsx │ │ │ ├── ProgressIndicator.tsx │ │ │ ├── ResizablePanel.tsx │ │ │ ├── SearchToolbar.tsx │ │ │ ├── SimpleProgress.tsx │ │ │ ├── SortSelector.tsx │ │ │ ├── ThemeToggle.tsx │ │ │ ├── Toast.tsx │ │ │ ├── Toggle.tsx │ │ │ ├── progressUtils.ts │ │ │ └── useAnimatedProgress.ts │ │ ├── import-export/ │ │ │ ├── ExportOptionsForm.tsx │ │ │ └── ExportSection.tsx │ │ ├── layout/ │ │ │ ├── AppShell.tsx │ │ │ ├── FullScreenAppShell.tsx │ │ │ ├── MobileBottomNav.tsx │ │ │ ├── PublicAppShell.tsx │ │ │ ├── ShellHeader.tsx │ │ │ └── ThemedRoot.tsx │ │ ├── settings/ │ │ │ ├── InfoBox.tsx │ │ │ ├── SearchAutoClearSettings.tsx │ │ │ ├── SettingsNav.tsx │ │ │ ├── SettingsSaveBar.tsx │ │ │ ├── SettingsSection.tsx │ │ │ ├── SettingsTips.tsx │ │ │ ├── TagSelectionAutoClearSettings.tsx │ │ │ └── tabs/ │ │ │ ├── ApiSettingsTab.tsx │ │ │ ├── AutomationSettingsTab.tsx │ │ │ ├── BasicSettingsTab.tsx │ │ │ ├── BrowserSettingsTab.tsx │ │ │ ├── DataSettingsTab.tsx │ │ │ ├── ShareSettingsTab.tsx │ │ │ └── SnapshotSettingsTab.tsx │ │ ├── tab-groups/ │ │ │ ├── BatchActionBar.tsx │ │ │ ├── ColorPicker.tsx │ │ │ ├── EmptyState.tsx │ │ │ ├── InsertionIndicator.tsx │ │ │ ├── MoveItemDialog.tsx │ │ │ ├── MoveToFolderDialog.tsx │ │ │ ├── PinnedItemsSection.tsx │ │ │ ├── SearchBar.tsx │ │ │ ├── ShareDialog.tsx │ │ │ ├── SortSelector.tsx │ │ │ ├── TabGroupCard.tsx │ │ │ ├── TabGroupHeader.tsx │ │ │ ├── TabGroupSidebar.tsx │ │ │ ├── TabGroupTree.tsx │ │ │ ├── TabItem.tsx │ │ │ ├── TabItemList.tsx │ │ │ ├── TagsInput.tsx │ │ │ ├── TodoItemCard.tsx │ │ │ ├── TodoSidebar.tsx │ │ │ ├── colorUtils.ts │ │ │ ├── sortUtils.ts │ │ │ └── tree/ │ │ │ ├── TreeNode.css │ │ │ ├── TreeNode.tsx │ │ │ ├── TreeNodeContent.tsx │ │ │ ├── TreeNodeMenu.tsx │ │ │ ├── TreeNodeSimple.tsx │ │ │ ├── TreeUtils.ts │ │ │ └── useDragAndDrop.ts │ │ └── tags/ │ │ ├── TagControls.tsx │ │ ├── TagFormModal.tsx │ │ ├── TagItem.tsx │ │ ├── TagManageModal.tsx │ │ ├── TagSidebar.tsx │ │ └── useTagFiltering.ts │ ├── hooks/ │ │ ├── buildTabOpenerHtml.ts │ │ ├── index.ts │ │ ├── useAnimatedProgress.ts │ │ ├── useApiKeys.ts │ │ ├── useBatchActions.ts │ │ ├── useBookmarkFilters.ts │ │ ├── useBookmarks.ts │ │ ├── useClientSideFilter.ts │ │ ├── useLanguage.ts │ │ ├── useLocalPreferences.ts │ │ ├── useMediaQuery.ts │ │ ├── usePreferences.ts │ │ ├── useShare.ts │ │ ├── useStorage.ts │ │ ├── useTabGroupActions.ts │ │ ├── useTabGroupItemActions.ts │ │ ├── useTabGroupMenu.ts │ │ ├── useTabGroupsQuery.ts │ │ └── useTags.ts │ ├── i18n/ │ │ ├── index.ts │ │ └── locales/ │ │ ├── en/ │ │ │ ├── auth.json │ │ │ ├── bookmarks.json │ │ │ ├── common.json │ │ │ ├── errors.json │ │ │ ├── import.json │ │ │ ├── info.json │ │ │ ├── settings.json │ │ │ ├── share.json │ │ │ ├── tabGroups.json │ │ │ └── tags.json │ │ └── zh-CN/ │ │ ├── auth.json │ │ ├── bookmarks.json │ │ ├── common.json │ │ ├── errors.json │ │ ├── import.json │ │ ├── info.json │ │ ├── settings.json │ │ ├── share.json │ │ ├── tabGroups.json │ │ └── tags.json │ ├── lib/ │ │ ├── ai/ │ │ │ ├── client.ts │ │ │ ├── constants.ts │ │ │ └── models.ts │ │ ├── api-client.ts │ │ ├── constants/ │ │ │ ├── bookmarks.ts │ │ │ └── z-index.ts │ │ ├── image-utils.ts │ │ ├── logger.ts │ │ ├── query-client.ts │ │ ├── search-utils.ts │ │ ├── types/ │ │ │ ├── api.types.ts │ │ │ ├── auth.types.ts │ │ │ ├── bookmark.types.ts │ │ │ ├── index.ts │ │ │ ├── preferences.types.ts │ │ │ └── tab-group.types.ts │ │ └── types.ts │ ├── main.tsx │ ├── pages/ │ │ ├── about/ │ │ │ └── AboutPage.tsx │ │ ├── auth/ │ │ │ ├── LoginPage.tsx │ │ │ └── RegisterPage.tsx │ │ ├── bookmarks/ │ │ │ ├── BookmarkStatisticsPage.tsx │ │ │ ├── BookmarkTrashPage.tsx │ │ │ ├── BookmarksPage.tsx │ │ │ ├── TrashBookmarkItem.tsx │ │ │ ├── components/ │ │ │ │ ├── BatchSelectionPrompt.tsx │ │ │ │ ├── MobileTagDrawer.tsx │ │ │ │ └── StatisticsCards.tsx │ │ │ └── hooks/ │ │ │ ├── useBookmarksEffects.ts │ │ │ ├── useBookmarksState.ts │ │ │ └── useStatisticsData.ts │ │ ├── extension/ │ │ │ └── ExtensionPage.tsx │ │ ├── info/ │ │ │ ├── AboutPage.tsx │ │ │ ├── HelpPage.tsx │ │ │ ├── PrivacyPage.tsx │ │ │ └── TermsPage.tsx │ │ ├── settings/ │ │ │ ├── ApiKeysPage.tsx │ │ │ ├── GeneralSettingsPage.tsx │ │ │ ├── ImportExportPage.tsx │ │ │ ├── PermissionsPage.tsx │ │ │ └── ShareSettingsPage.tsx │ │ ├── share/ │ │ │ ├── PublicSharePage.tsx │ │ │ ├── components/ │ │ │ │ └── ShareTopBar.tsx │ │ │ └── hooks/ │ │ │ └── usePublicShareState.ts │ │ └── tab-groups/ │ │ ├── StatisticsPage.tsx │ │ ├── TabGroupDetailHeader.tsx │ │ ├── TabGroupDetailPage.tsx │ │ ├── TabGroupEmptyState.tsx │ │ ├── TabGroupItem.tsx │ │ ├── TabGroupsPage.tsx │ │ ├── TodoPage.tsx │ │ ├── TrashPage.tsx │ │ ├── components/ │ │ │ ├── TabGroupsGrid.tsx │ │ │ └── TabGroupsList.tsx │ │ └── hooks/ │ │ ├── useGroupManagement.ts │ │ ├── useTabGroupDetailState.ts │ │ ├── useTabGroupItemDnD.ts │ │ ├── useTabGroupsData.ts │ │ └── useTabGroupsState.ts │ ├── routes/ │ │ └── index.tsx │ ├── services/ │ │ ├── api-keys.ts │ │ ├── auth.ts │ │ ├── bookmarks.ts │ │ ├── index.ts │ │ ├── preferences.ts │ │ ├── share.ts │ │ ├── storage.ts │ │ ├── tab-groups.ts │ │ └── tags.ts │ ├── stores/ │ │ ├── authStore.ts │ │ ├── dialogStore.ts │ │ ├── index.ts │ │ ├── themeStore.ts │ │ └── toastStore.ts │ ├── styles/ │ │ ├── components.css │ │ ├── index.css │ │ └── themes/ │ │ ├── default.css │ │ └── orange.css │ └── vite-env.d.ts ├── tailwind.config.js ├── test-register.js ├── tsconfig.json ├── vite.config.ts └── wrangler.toml.example