gitextract_pcspcjt1/ ├── .dockerignore ├── .github/ │ └── workflows/ │ ├── claude.yml │ └── docker-image.yml ├── .gitignore ├── AGENTS.md ├── CLAUDE.md ├── DISCLAIMER.md ├── Dockerfile ├── Dockerfile.base ├── Dockerfile.release ├── LICENSE ├── README.md ├── README_EN.md ├── chrome-extension/ │ ├── README.md │ ├── background.js │ ├── manifest.json │ ├── popup.html │ └── popup.js ├── config.json.example ├── desktop_launcher.py ├── docker-compose.dev.yaml ├── docker-compose.yaml ├── pyproject.toml ├── requirements-runtime.txt ├── requirements.txt ├── run_live_smoke.sh ├── spider_v2.py ├── src/ │ ├── __init__.py │ ├── ai_handler.py │ ├── ai_message_builder.py │ ├── api/ │ │ ├── __init__.py │ │ ├── dependencies.py │ │ └── routes/ │ │ ├── __init__.py │ │ ├── accounts.py │ │ ├── dashboard.py │ │ ├── login_state.py │ │ ├── logs.py │ │ ├── prompts.py │ │ ├── results.py │ │ ├── settings.py │ │ ├── tasks.py │ │ └── websocket.py │ ├── app.py │ ├── config.py │ ├── core/ │ │ └── cron_utils.py │ ├── domain/ │ │ ├── __init__.py │ │ ├── models/ │ │ │ ├── __init__.py │ │ │ ├── task.py │ │ │ └── task_generation.py │ │ └── repositories/ │ │ ├── __init__.py │ │ └── task_repository.py │ ├── failure_guard.py │ ├── infrastructure/ │ │ ├── __init__.py │ │ ├── config/ │ │ │ ├── __init__.py │ │ │ ├── env_manager.py │ │ │ └── settings.py │ │ ├── external/ │ │ │ ├── __init__.py │ │ │ ├── ai_client.py │ │ │ └── notification_clients/ │ │ │ ├── __init__.py │ │ │ ├── bark_client.py │ │ │ ├── base.py │ │ │ ├── factory.py │ │ │ ├── gotify_client.py │ │ │ ├── ntfy_client.py │ │ │ ├── telegram_client.py │ │ │ ├── webhook_client.py │ │ │ └── wecom_bot_client.py │ │ └── persistence/ │ │ ├── __init__.py │ │ ├── json_task_repository.py │ │ ├── sqlite_bootstrap.py │ │ ├── sqlite_connection.py │ │ ├── sqlite_task_repository.py │ │ └── storage_names.py │ ├── keyword_rule_engine.py │ ├── parsers.py │ ├── prompt_utils.py │ ├── rotation.py │ ├── scraper.py │ ├── services/ │ │ ├── __init__.py │ │ ├── account_strategy_service.py │ │ ├── ai_request_compat.py │ │ ├── ai_response_parser.py │ │ ├── ai_service.py │ │ ├── dashboard_payloads.py │ │ ├── dashboard_service.py │ │ ├── item_analysis_dispatcher.py │ │ ├── notification_config_service.py │ │ ├── notification_service.py │ │ ├── price_history_service.py │ │ ├── process_service.py │ │ ├── result_export_service.py │ │ ├── result_file_service.py │ │ ├── result_storage_service.py │ │ ├── scheduler_service.py │ │ ├── search_pagination.py │ │ ├── seller_profile_cache.py │ │ ├── task_generation_runner.py │ │ ├── task_generation_service.py │ │ ├── task_log_cleanup_service.py │ │ ├── task_payloads.py │ │ └── task_service.py │ └── utils.py ├── start.sh ├── tests/ │ ├── README.md │ ├── __init__.py │ ├── conftest.py │ ├── fixtures/ │ │ ├── config.sample.json │ │ ├── ratings.json │ │ ├── search_results.json │ │ ├── state.sample.json │ │ ├── user_head.json │ │ └── user_items.json │ ├── integration/ │ │ ├── test_api_dashboard.py │ │ ├── test_api_results.py │ │ ├── test_api_settings.py │ │ ├── test_api_tasks.py │ │ ├── test_cli_spider.py │ │ └── test_pipeline_parse.py │ ├── live/ │ │ ├── _support.py │ │ ├── conftest.py │ │ └── test_live_smoke.py │ ├── test_failure_guard.py │ ├── test_frontend_build_paths.py │ └── unit/ │ ├── test_ai_client.py │ ├── test_ai_handler_analysis.py │ ├── test_ai_handler_downloads.py │ ├── test_ai_request_compat.py │ ├── test_ai_response_parser.py │ ├── test_app_lifespan.py │ ├── test_cron_utils.py │ ├── test_domain_task.py │ ├── test_item_analysis_dispatcher.py │ ├── test_keyword_rule_engine.py │ ├── test_notification_service.py │ ├── test_price_history_service.py │ ├── test_process_service.py │ ├── test_prompt_utils.py │ ├── test_scraper_browser_channel.py │ ├── test_search_pagination.py │ ├── test_seller_profile_cache.py │ ├── test_task_log_cleanup_service.py │ └── test_utils.py ├── web-ui/ │ ├── .gitignore │ ├── .vscode/ │ │ └── extensions.json │ ├── Dockerfile │ ├── README.md │ ├── components.json │ ├── index.html │ ├── nginx.conf │ ├── package.json │ ├── postcss.config.cjs │ ├── src/ │ │ ├── App.vue │ │ ├── api/ │ │ │ ├── accounts.ts │ │ │ ├── dashboard.ts │ │ │ ├── logs.ts │ │ │ ├── prompts.ts │ │ │ ├── results.ts │ │ │ ├── settings.ts │ │ │ └── tasks.ts │ │ ├── assets/ │ │ │ └── main.css │ │ ├── components/ │ │ │ ├── HelloWorld.vue │ │ │ ├── layout/ │ │ │ │ ├── DashboardTaskSearch.vue │ │ │ │ ├── LocaleToggle.vue │ │ │ │ ├── TheHeader.vue │ │ │ │ └── TheSidebar.vue │ │ │ ├── results/ │ │ │ │ ├── PriceTrendChart.vue │ │ │ │ ├── ResultCard.vue │ │ │ │ ├── ResultsFilterBar.vue │ │ │ │ ├── ResultsGrid.vue │ │ │ │ └── ResultsInsightsPanel.vue │ │ │ ├── settings/ │ │ │ │ ├── NotificationSettingsPanel.vue │ │ │ │ └── RotationSettingsPanel.vue │ │ │ ├── tasks/ │ │ │ │ ├── TaskCreateDialog.vue │ │ │ │ ├── TaskForm.vue │ │ │ │ ├── TaskGenerationDialog.vue │ │ │ │ ├── TaskGenerationProgress.vue │ │ │ │ ├── TaskRegionSelector.vue │ │ │ │ └── TasksTable.vue │ │ │ └── ui/ │ │ │ ├── badge/ │ │ │ │ ├── Badge.vue │ │ │ │ └── index.ts │ │ │ ├── button/ │ │ │ │ ├── Button.vue │ │ │ │ └── index.ts │ │ │ ├── card/ │ │ │ │ ├── Card.vue │ │ │ │ ├── CardContent.vue │ │ │ │ ├── CardDescription.vue │ │ │ │ ├── CardFooter.vue │ │ │ │ ├── CardHeader.vue │ │ │ │ ├── CardTitle.vue │ │ │ │ └── index.ts │ │ │ ├── checkbox/ │ │ │ │ ├── Checkbox.vue │ │ │ │ └── index.ts │ │ │ ├── dialog/ │ │ │ │ ├── Dialog.vue │ │ │ │ ├── DialogClose.vue │ │ │ │ ├── DialogContent.vue │ │ │ │ ├── DialogDescription.vue │ │ │ │ ├── DialogFooter.vue │ │ │ │ ├── DialogHeader.vue │ │ │ │ ├── DialogScrollContent.vue │ │ │ │ ├── DialogTitle.vue │ │ │ │ ├── DialogTrigger.vue │ │ │ │ └── index.ts │ │ │ ├── input/ │ │ │ │ ├── Input.vue │ │ │ │ └── index.ts │ │ │ ├── label/ │ │ │ │ ├── Label.vue │ │ │ │ └── index.ts │ │ │ ├── select/ │ │ │ │ ├── Select.vue │ │ │ │ ├── SelectContent.vue │ │ │ │ ├── SelectGroup.vue │ │ │ │ ├── SelectItem.vue │ │ │ │ ├── SelectItemText.vue │ │ │ │ ├── SelectLabel.vue │ │ │ │ ├── SelectScrollDownButton.vue │ │ │ │ ├── SelectScrollUpButton.vue │ │ │ │ ├── SelectSeparator.vue │ │ │ │ ├── SelectTrigger.vue │ │ │ │ ├── SelectValue.vue │ │ │ │ └── index.ts │ │ │ ├── switch/ │ │ │ │ ├── Switch.vue │ │ │ │ └── index.ts │ │ │ ├── table/ │ │ │ │ ├── Table.vue │ │ │ │ ├── TableBody.vue │ │ │ │ ├── TableCaption.vue │ │ │ │ ├── TableCell.vue │ │ │ │ ├── TableHead.vue │ │ │ │ ├── TableHeader.vue │ │ │ │ ├── TableRow.vue │ │ │ │ └── index.ts │ │ │ ├── tabs/ │ │ │ │ ├── Tabs.vue │ │ │ │ ├── TabsContent.vue │ │ │ │ ├── TabsList.vue │ │ │ │ ├── TabsTrigger.vue │ │ │ │ └── index.ts │ │ │ ├── textarea/ │ │ │ │ ├── Textarea.vue │ │ │ │ └── index.ts │ │ │ └── toast/ │ │ │ ├── Toast.vue │ │ │ ├── ToastAction.vue │ │ │ ├── ToastClose.vue │ │ │ ├── ToastDescription.vue │ │ │ ├── ToastProvider.vue │ │ │ ├── ToastTitle.vue │ │ │ ├── ToastViewport.vue │ │ │ ├── Toaster.vue │ │ │ ├── index.ts │ │ │ └── use-toast.ts │ │ ├── composables/ │ │ │ ├── useAuth.ts │ │ │ ├── useDashboard.ts │ │ │ ├── useLogs.ts │ │ │ ├── useMobileNav.ts │ │ │ ├── useResults.ts │ │ │ ├── useSettings.ts │ │ │ ├── useTaskGenerationJob.ts │ │ │ ├── useTasks.ts │ │ │ └── useWebSocket.ts │ │ ├── i18n/ │ │ │ ├── index.ts │ │ │ └── messages/ │ │ │ ├── en-US-extra.ts │ │ │ ├── en-US.ts │ │ │ ├── zh-CN-extra.ts │ │ │ └── zh-CN.ts │ │ ├── layouts/ │ │ │ └── MainLayout.vue │ │ ├── lib/ │ │ │ ├── http.ts │ │ │ ├── taskFormQuery.ts │ │ │ ├── taskSchedule.ts │ │ │ └── utils.ts │ │ ├── main.ts │ │ ├── router/ │ │ │ └── index.ts │ │ ├── services/ │ │ │ └── websocket.ts │ │ ├── style.css │ │ ├── types/ │ │ │ ├── dashboard.d.ts │ │ │ ├── result.d.ts │ │ │ └── task.d.ts │ │ └── views/ │ │ ├── AccountsView.vue │ │ ├── DashboardView.vue │ │ ├── LoginView.vue │ │ ├── LogsView.vue │ │ ├── ResultsView.vue │ │ ├── SettingsView.vue │ │ └── TasksView.vue │ ├── tailwind.config.cjs │ ├── tsconfig.app.json │ ├── tsconfig.json │ ├── tsconfig.node.json │ └── vite.config.ts └── xianyu-login-state-privacy.html