gitextract_n1v0oway/ ├── .dockerignore ├── .github/ │ └── workflows/ │ ├── docker-image.yml │ ├── fly.yml │ ├── mobile-build.yml │ └── publish.yml ├── .gitignore ├── AGENTS.md ├── CLAUDE.md ├── Dockerfile ├── README.md ├── api/ │ ├── .air.toml │ ├── .github/ │ │ └── workflows/ │ │ └── go.yml │ ├── .gitignore │ ├── .vscode/ │ │ └── settings.json │ ├── LICENSE │ ├── Makefile │ ├── README.md │ ├── admin_handler.go │ ├── ai/ │ │ └── model.go │ ├── artifact_instruction.txt │ ├── auth/ │ │ ├── auth.go │ │ ├── auth_test.go │ │ ├── token.go │ │ └── token_test.go │ ├── bot_answer_history_handler.go │ ├── bot_answer_history_service.go │ ├── chat_artifact.go │ ├── chat_auth_user_handler.go │ ├── chat_auth_user_service.go │ ├── chat_comment_handler.go │ ├── chat_comment_service.go │ ├── chat_main_handler.go │ ├── chat_main_service.go │ ├── chat_message_handler.go │ ├── chat_message_service.go │ ├── chat_message_service_test.go │ ├── chat_model_handler.go │ ├── chat_model_handler_test.go │ ├── chat_model_privilege_handler.go │ ├── chat_prompt_hander.go │ ├── chat_prompt_service.go │ ├── chat_prompt_service_test.go │ ├── chat_session_handler.go │ ├── chat_session_service.go │ ├── chat_session_service_test.go │ ├── chat_snapshot_handler.go │ ├── chat_snapshot_handler_test.go │ ├── chat_snapshot_service.go │ ├── chat_user_active_chat_session_handler.go │ ├── chat_user_active_chat_session_sevice.go │ ├── chat_workspace_handler.go │ ├── chat_workspace_service.go │ ├── constants.go │ ├── embed_debug_test.go │ ├── errors.go │ ├── file_upload_handler.go │ ├── file_upload_service.go │ ├── go.mod │ ├── go.sum │ ├── handle_tts.go │ ├── jwt_secret_service.go │ ├── llm/ │ │ ├── claude/ │ │ │ └── claude.go │ │ ├── gemini/ │ │ │ ├── gemini.go │ │ │ └── gemini_test.go │ │ └── openai/ │ │ ├── chat.go │ │ ├── client.go │ │ ├── common.go │ │ └── openai.go │ ├── llm_openai.go │ ├── llm_summary.go │ ├── main.go │ ├── main_test.go │ ├── middleware_authenticate.go │ ├── middleware_gzip.go │ ├── middleware_lastRequestTime.go │ ├── middleware_rateLimit.go │ ├── middleware_validation.go │ ├── model_claude3_service.go │ ├── model_completion_service.go │ ├── model_custom_service.go │ ├── model_gemini_service.go │ ├── model_ollama_service.go │ ├── model_openai_service.go │ ├── model_test_service.go │ ├── models/ │ │ └── models.go │ ├── models.go │ ├── openai_test.go │ ├── pre-commit.sh │ ├── sqlc/ │ │ ├── README.txt │ │ ├── queries/ │ │ │ ├── auth_user.sql │ │ │ ├── auth_user_management.sql │ │ │ ├── bot_answer_history.sql │ │ │ ├── chat_comment.sql │ │ │ ├── chat_file.sql │ │ │ ├── chat_log.sql │ │ │ ├── chat_message.sql │ │ │ ├── chat_model.sql │ │ │ ├── chat_prompt.sql │ │ │ ├── chat_session.sql │ │ │ ├── chat_snapshot.sql │ │ │ ├── chat_workspace.sql │ │ │ ├── jwt_secrets.sql │ │ │ ├── user_active_chat_session.sql │ │ │ └── user_chat_model_privilege.sql │ │ └── schema.sql │ ├── sqlc.yaml │ ├── sqlc_queries/ │ │ ├── auth_user.sql.go │ │ ├── auth_user_management.sql.go │ │ ├── bot_answer_history.sql.go │ │ ├── chat_comment.sql.go │ │ ├── chat_file.sql.go │ │ ├── chat_log.sql.go │ │ ├── chat_message.sql.go │ │ ├── chat_model.sql.go │ │ ├── chat_prompt.sql.go │ │ ├── chat_session.sql.go │ │ ├── chat_snapshot.sql.go │ │ ├── chat_workspace.sql.go │ │ ├── db.go │ │ ├── jwt_secrets.sql.go │ │ ├── models.go │ │ ├── user_active_chat_session.sql.go │ │ ├── user_chat_model_privilege.sql.go │ │ ├── zz_custom_method.go │ │ └── zz_custom_query.go │ ├── static/ │ │ ├── awesome-chatgpt-prompts-en.json │ │ ├── awesome-chatgpt-prompts-zh.json │ │ └── static.go │ ├── streaming_helpers.go │ ├── test_build │ ├── text_buffer.go │ ├── tools/ │ │ ├── apply_a_similar_change/ │ │ │ ├── README.md │ │ │ ├── apply_diff.py │ │ │ ├── apply_diff_uselib.py │ │ │ ├── parse_diff.py │ │ │ ├── parse_diff2.py │ │ │ ├── parse_diff3.py │ │ │ └── stream.diff │ │ └── fix_eris.py │ ├── util.go │ ├── util_test.go │ └── util_words_test.go ├── artifacts.md ├── chat.code-workspace ├── docker-compose.yaml ├── docs/ │ ├── add_model_en.md │ ├── add_model_zh.md │ ├── artifact_gallery_en.md │ ├── artifact_gallery_zh.md │ ├── code_runner_artifacts_tutorial.md │ ├── code_runner_capabilities.md │ ├── code_runner_csv_tutorial.md │ ├── custom_model_api_en.md │ ├── deployment_en.md │ ├── deployment_zh.md │ ├── dev/ │ │ ├── ERROR_HANDLING_STANDARDS.md │ │ ├── INTEGRATION_GUIDE.md │ │ ├── code_runner_manual.md │ │ ├── conversation_patch_example.js │ │ ├── conversation_vfs_integration.md │ │ ├── python_async_execution.md │ │ ├── sse_processing_logic.md │ │ ├── vfs_integration_example.md │ │ ├── virtual_file_system_plan.md │ │ └── virtual_file_system_usage.md │ ├── dev_locally_en.md │ ├── dev_locally_zh.md │ ├── ollama_en.md │ ├── ollama_zh.md │ ├── prompts.md │ ├── snapshots_vs_chatbots_en.md │ ├── snapshots_vs_chatbots_zh.md │ ├── tool_use_code_runner.md │ └── tool_use_showcase.md ├── e2e/ │ ├── .gitignore │ ├── LICENSE │ ├── Makefile │ ├── lib/ │ │ ├── button-helpers.ts │ │ ├── chat-test-setup.ts │ │ ├── db/ │ │ │ ├── chat_message/ │ │ │ │ └── index.ts │ │ │ ├── chat_model/ │ │ │ │ └── index.ts │ │ │ ├── chat_prompt/ │ │ │ │ └── index.ts │ │ │ ├── chat_session/ │ │ │ │ └── index.ts │ │ │ ├── chat_workspace/ │ │ │ │ └── index.ts │ │ │ ├── config.ts │ │ │ └── user/ │ │ │ └── index.ts │ │ ├── message-helpers.ts │ │ └── sample.ts │ ├── package.json │ ├── playwright.config.ts │ ├── tests/ │ │ ├── 00_chat_gpt_web.spec.ts │ │ ├── 01_register.spec.ts │ │ ├── 02_simpe_prompt.spec.ts │ │ ├── 03_chat_session.spec.ts │ │ ├── 04_simpe_prompt_and_message.spec.ts │ │ ├── 05_chat_session.spec.ts │ │ ├── 06_clear_messages.spec.ts │ │ ├── 07_set_session_max_len.spec.ts │ │ ├── 08_session_config.spec.ts │ │ ├── 09_session_answer.spec.ts │ │ ├── 10_session_answer_regenerate.spec.ts │ │ ├── 10_session_answer_regenerate_fixed.spec.ts │ │ └── 11_workspace.spec.ts │ └── tests-examples/ │ └── demo-todo-app.spec.ts ├── fly.toml ├── mobile/ │ ├── .gitignore │ ├── .metadata │ ├── README.md │ ├── analysis_options.yaml │ ├── android/ │ │ ├── .gitignore │ │ ├── app/ │ │ │ ├── build.gradle.kts │ │ │ └── src/ │ │ │ ├── debug/ │ │ │ │ └── AndroidManifest.xml │ │ │ ├── main/ │ │ │ │ ├── AndroidManifest.xml │ │ │ │ ├── kotlin/ │ │ │ │ │ └── com/ │ │ │ │ │ └── example/ │ │ │ │ │ └── chat_mobile/ │ │ │ │ │ └── MainActivity.kt │ │ │ │ └── res/ │ │ │ │ ├── drawable/ │ │ │ │ │ └── launch_background.xml │ │ │ │ ├── drawable-v21/ │ │ │ │ │ └── launch_background.xml │ │ │ │ ├── values/ │ │ │ │ │ └── styles.xml │ │ │ │ └── values-night/ │ │ │ │ └── styles.xml │ │ │ └── profile/ │ │ │ └── AndroidManifest.xml │ │ ├── build.gradle.kts │ │ ├── gradle/ │ │ │ └── wrapper/ │ │ │ └── gradle-wrapper.properties │ │ ├── gradle.properties │ │ └── settings.gradle.kts │ ├── devtools_options.yaml │ ├── ios/ │ │ ├── .gitignore │ │ ├── Flutter/ │ │ │ ├── AppFrameworkInfo.plist │ │ │ ├── Debug.xcconfig │ │ │ └── Release.xcconfig │ │ ├── Podfile │ │ ├── Runner/ │ │ │ ├── AppDelegate.swift │ │ │ ├── Assets.xcassets/ │ │ │ │ ├── AppIcon.appiconset/ │ │ │ │ │ └── Contents.json │ │ │ │ └── LaunchImage.imageset/ │ │ │ │ ├── Contents.json │ │ │ │ └── README.md │ │ │ ├── Base.lproj/ │ │ │ │ ├── LaunchScreen.storyboard │ │ │ │ └── Main.storyboard │ │ │ ├── Info.plist │ │ │ └── Runner-Bridging-Header.h │ │ ├── Runner.xcodeproj/ │ │ │ ├── project.pbxproj │ │ │ ├── project.xcworkspace/ │ │ │ │ ├── contents.xcworkspacedata │ │ │ │ └── xcshareddata/ │ │ │ │ ├── IDEWorkspaceChecks.plist │ │ │ │ └── WorkspaceSettings.xcsettings │ │ │ └── xcshareddata/ │ │ │ └── xcschemes/ │ │ │ └── Runner.xcscheme │ │ ├── Runner.xcworkspace/ │ │ │ ├── contents.xcworkspacedata │ │ │ └── xcshareddata/ │ │ │ ├── IDEWorkspaceChecks.plist │ │ │ └── WorkspaceSettings.xcsettings │ │ └── RunnerTests/ │ │ └── RunnerTests.swift │ ├── lib/ │ │ ├── api/ │ │ │ ├── api_config.dart │ │ │ ├── api_exception.dart │ │ │ └── chat_api.dart │ │ ├── constants/ │ │ │ └── chat.dart │ │ ├── main.dart │ │ ├── models/ │ │ │ ├── auth_token_result.dart │ │ │ ├── chat_message.dart │ │ │ ├── chat_model.dart │ │ │ ├── chat_session.dart │ │ │ ├── chat_snapshot.dart │ │ │ ├── suggestions_response.dart │ │ │ └── workspace.dart │ │ ├── screens/ │ │ │ ├── auth_gate.dart │ │ │ ├── chat_screen.dart │ │ │ ├── home_screen.dart │ │ │ ├── login_screen.dart │ │ │ ├── snapshot_list_screen.dart │ │ │ └── snapshot_screen.dart │ │ ├── state/ │ │ │ ├── auth_provider.dart │ │ │ ├── message_provider.dart │ │ │ ├── model_provider.dart │ │ │ ├── session_provider.dart │ │ │ └── workspace_provider.dart │ │ ├── theme/ │ │ │ ├── app_theme.dart │ │ │ └── color_utils.dart │ │ ├── utils/ │ │ │ ├── api_error.dart │ │ │ └── thinking_parser.dart │ │ └── widgets/ │ │ ├── icon_map.dart │ │ ├── message_bubble.dart │ │ ├── message_composer.dart │ │ ├── session_tile.dart │ │ ├── suggested_questions.dart │ │ ├── thinking_section.dart │ │ └── workspace_selector.dart │ ├── linux/ │ │ ├── .gitignore │ │ ├── CMakeLists.txt │ │ ├── flutter/ │ │ │ ├── CMakeLists.txt │ │ │ ├── generated_plugin_registrant.cc │ │ │ ├── generated_plugin_registrant.h │ │ │ └── generated_plugins.cmake │ │ └── runner/ │ │ ├── CMakeLists.txt │ │ ├── main.cc │ │ ├── my_application.cc │ │ └── my_application.h │ ├── macos/ │ │ ├── .gitignore │ │ ├── Flutter/ │ │ │ ├── Flutter-Debug.xcconfig │ │ │ ├── Flutter-Release.xcconfig │ │ │ └── GeneratedPluginRegistrant.swift │ │ ├── Podfile │ │ ├── Runner/ │ │ │ ├── AppDelegate.swift │ │ │ ├── Assets.xcassets/ │ │ │ │ └── AppIcon.appiconset/ │ │ │ │ └── Contents.json │ │ │ ├── Base.lproj/ │ │ │ │ └── MainMenu.xib │ │ │ ├── Configs/ │ │ │ │ ├── AppInfo.xcconfig │ │ │ │ ├── Debug.xcconfig │ │ │ │ ├── Release.xcconfig │ │ │ │ └── Warnings.xcconfig │ │ │ ├── DebugProfile.entitlements │ │ │ ├── Info.plist │ │ │ ├── MainFlutterWindow.swift │ │ │ └── Release.entitlements │ │ ├── Runner.xcodeproj/ │ │ │ ├── project.pbxproj │ │ │ ├── project.xcworkspace/ │ │ │ │ └── xcshareddata/ │ │ │ │ └── IDEWorkspaceChecks.plist │ │ │ └── xcshareddata/ │ │ │ └── xcschemes/ │ │ │ └── Runner.xcscheme │ │ ├── Runner.xcworkspace/ │ │ │ ├── contents.xcworkspacedata │ │ │ └── xcshareddata/ │ │ │ └── IDEWorkspaceChecks.plist │ │ └── RunnerTests/ │ │ └── RunnerTests.swift │ ├── pubspec.yaml │ ├── test/ │ │ └── widget_test.dart │ ├── web/ │ │ ├── index.html │ │ └── manifest.json │ └── windows/ │ ├── .gitignore │ ├── CMakeLists.txt │ ├── flutter/ │ │ ├── CMakeLists.txt │ │ ├── generated_plugin_registrant.cc │ │ ├── generated_plugin_registrant.h │ │ └── generated_plugins.cmake │ └── runner/ │ ├── CMakeLists.txt │ ├── Runner.rc │ ├── flutter_window.cpp │ ├── flutter_window.h │ ├── main.cpp │ ├── resource.h │ ├── runner.exe.manifest │ ├── utils.cpp │ ├── utils.h │ ├── win32_window.cpp │ └── win32_window.h ├── scripts/ │ ├── branch_clean.py │ ├── locale_missing_key.py │ ├── merge_keys.py │ └── remove_older_branch.py └── web/ ├── .commitlintrc.json ├── .editorconfig ├── .eslintrc.cjs ├── .gitattributes ├── .gitignore ├── .husky/ │ ├── commit-msg │ └── pre-commit ├── .vscode/ │ ├── extensions.json │ └── settings.json ├── docker-compose/ │ ├── docker-compose.yml │ ├── nginx/ │ │ └── nginx.conf │ └── readme.md ├── docs/ │ └── code_runner.md ├── index.html ├── license ├── package.json ├── postcss.config.js ├── public/ │ ├── awesome-chatgpt-prompts-en.json │ └── awesome-chatgpt-prompts-zh.json ├── rsbuild.config.ts ├── src/ │ ├── App.vue │ ├── api/ │ │ ├── admin.ts │ │ ├── bot_answer_history.ts │ │ ├── chat_active_user_session.ts │ │ ├── chat_file.ts │ │ ├── chat_instructions.ts │ │ ├── chat_message.ts │ │ ├── chat_model.ts │ │ ├── chat_prompt.ts │ │ ├── chat_session.ts │ │ ├── chat_snapshot.ts │ │ ├── chat_user_model_privilege.ts │ │ ├── chat_workspace.ts │ │ ├── comment.ts │ │ ├── content.ts │ │ ├── export.ts │ │ ├── index.ts │ │ ├── token.ts │ │ ├── use_chat_session.ts │ │ └── user.ts │ ├── assets/ │ │ └── recommend.json │ ├── components/ │ │ ├── admin/ │ │ │ ├── ModelCard.vue │ │ │ ├── SessionSnapshotModal.vue │ │ │ └── UserAnalysisModal.vue │ │ ├── common/ │ │ │ ├── EnhancedNotification.vue │ │ │ ├── HoverButton/ │ │ │ │ ├── Button.vue │ │ │ │ └── index.vue │ │ │ ├── NaiveProvider/ │ │ │ │ └── index.vue │ │ │ ├── NotificationDemo.vue │ │ │ ├── PromptStore/ │ │ │ │ └── index.vue │ │ │ ├── Setting/ │ │ │ │ ├── Admin.vue │ │ │ │ ├── General.vue │ │ │ │ └── index.vue │ │ │ ├── SvgIcon/ │ │ │ │ └── index.vue │ │ │ ├── UserAvatar/ │ │ │ │ └── index.vue │ │ │ └── index.ts │ │ └── custom/ │ │ ├── GithubSite.vue │ │ └── index.ts │ ├── config/ │ │ └── api.ts │ ├── constants/ │ │ ├── apiTypes.ts │ │ └── chat.ts │ ├── hooks/ │ │ ├── useBasicLayout.ts │ │ ├── useChatModels.ts │ │ ├── useCopyCode.ts │ │ ├── useIconRender.ts │ │ ├── useLanguage.ts │ │ ├── useOnlineStatus.ts │ │ ├── useTheme.ts │ │ └── useWorkspaceRouting.ts │ ├── icons/ │ │ ├── 403.vue │ │ └── 500.vue │ ├── locales/ │ │ ├── en-US-more.json │ │ ├── en-US.json │ │ ├── en.ts │ │ ├── index.ts │ │ ├── zh-CN.json │ │ ├── zh-TW-more.json │ │ └── zh-TW.json │ ├── main.ts │ ├── plugins/ │ │ ├── assets.ts │ │ └── index.ts │ ├── router/ │ │ ├── index.ts │ │ └── permission.ts │ ├── service/ │ │ └── snapshot.ts │ ├── services/ │ │ └── codeTemplates.ts │ ├── store/ │ │ ├── index.ts │ │ └── modules/ │ │ ├── app/ │ │ │ ├── helper.ts │ │ │ └── index.ts │ │ ├── auth/ │ │ │ ├── helper.ts │ │ │ └── index.ts │ │ ├── index.ts │ │ ├── message/ │ │ │ └── index.ts │ │ ├── prompt/ │ │ │ ├── helper.ts │ │ │ └── index.ts │ │ ├── session/ │ │ │ └── index.ts │ │ ├── user/ │ │ │ ├── helper.ts │ │ │ └── index.ts │ │ └── workspace/ │ │ └── index.ts │ ├── styles/ │ │ ├── global.less │ │ └── lib/ │ │ ├── github-markdown.less │ │ ├── highlight.less │ │ └── tailwind.css │ ├── types/ │ │ └── chat-models.ts │ ├── typings/ │ │ ├── chat.d.ts │ │ └── global.d.ts │ ├── utils/ │ │ ├── __tests__/ │ │ │ └── date.test.ts │ │ ├── artifacts.ts │ │ ├── crypto/ │ │ │ └── index.ts │ │ ├── date.ts │ │ ├── download.ts │ │ ├── errorHandler.ts │ │ ├── format/ │ │ │ └── index.ts │ │ ├── is/ │ │ │ └── index.ts │ │ ├── jwt.ts │ │ ├── logger.ts │ │ ├── notificationManager.ts │ │ ├── prompt.ts │ │ ├── rand.ts │ │ ├── request/ │ │ │ ├── axios.ts │ │ │ └── index.ts │ │ ├── sanitize.ts │ │ ├── storage/ │ │ │ ├── index.ts │ │ │ └── local.ts │ │ ├── string.ts │ │ ├── tooling.ts │ │ └── workspaceUrls.ts │ └── views/ │ ├── admin/ │ │ ├── index.vue │ │ ├── model/ │ │ │ ├── AddModelForm.vue │ │ │ └── index.vue │ │ ├── modelRateLimit/ │ │ │ ├── addChatModelForm.vue │ │ │ └── index.vue │ │ └── user/ │ │ └── index.vue │ ├── bot/ │ │ ├── all.vue │ │ ├── components/ │ │ │ ├── AnswerHistory.vue │ │ │ └── Message/ │ │ │ ├── index.vue │ │ │ └── style.less │ │ └── page.vue │ ├── chat/ │ │ ├── components/ │ │ │ ├── ArtifactGallery.vue │ │ │ ├── AudioPlayer/ │ │ │ │ └── index.vue │ │ │ ├── Conversation.vue │ │ │ ├── HeaderMobile/ │ │ │ │ └── index.vue │ │ │ ├── JumpToBottom.vue │ │ │ ├── Message/ │ │ │ │ ├── ArtifactContent.vue │ │ │ │ ├── ArtifactEditor.vue │ │ │ │ ├── ArtifactHeader.vue │ │ │ │ ├── ArtifactViewer.vue │ │ │ │ ├── ArtifactViewerBase.vue │ │ │ │ ├── SuggestedQuestions.vue │ │ │ │ └── index.vue │ │ │ ├── MessageList.vue │ │ │ ├── ModelSelector.vue │ │ │ ├── PromptGallery/ │ │ │ │ ├── PromptCards.vue │ │ │ │ └── index.vue │ │ │ ├── RenderMessage.vue │ │ │ ├── Session/ │ │ │ │ └── SessionConfig.vue │ │ │ ├── UploadModal.vue │ │ │ ├── Uploader.vue │ │ │ ├── UploaderReadOnly.vue │ │ │ ├── WorkspaceSelector/ │ │ │ │ ├── WorkspaceCard.vue │ │ │ │ ├── WorkspaceManagementModal.vue │ │ │ │ ├── WorkspaceModal.vue │ │ │ │ └── index.vue │ │ │ ├── __tests__/ │ │ │ │ └── modelSelectorUtils.test.ts │ │ │ └── modelSelectorUtils.ts │ │ ├── composables/ │ │ │ ├── README.md │ │ │ ├── useChatActions.ts │ │ │ ├── useConversationFlow.ts │ │ │ ├── useErrorHandling.ts │ │ │ ├── usePerformanceOptimizations.ts │ │ │ ├── useRegenerate.ts │ │ │ ├── useSearchAndPrompts.ts │ │ │ ├── useStreamHandling.ts │ │ │ └── useValidation.ts │ │ ├── hooks/ │ │ │ ├── useChat.ts │ │ │ ├── useCopyCode.ts │ │ │ ├── useScroll.ts │ │ │ ├── useSlashToFocus.ts │ │ │ └── useUsingContext.ts │ │ ├── index.vue │ │ └── layout/ │ │ ├── Layout.vue │ │ ├── index.ts │ │ └── sider/ │ │ ├── Footer.vue │ │ ├── List.vue │ │ └── index.vue │ ├── components/ │ │ ├── Avatar/ │ │ │ ├── MessageAvatar.vue │ │ │ └── ModelAvatar.vue │ │ ├── Message/ │ │ │ ├── AnswerContent.vue │ │ │ ├── Text.vue │ │ │ ├── ThinkingRenderer.vue │ │ │ ├── Util.ts │ │ │ ├── style.less │ │ │ ├── thinkingParser.ts │ │ │ ├── types/ │ │ │ │ └── thinking.ts │ │ │ └── useThinkingContent.ts │ │ └── Permission.vue │ ├── exception/ │ │ ├── 404/ │ │ │ └── index.vue │ │ └── 500/ │ │ └── index.vue │ ├── prompt/ │ │ ├── components/ │ │ │ ├── Definitions.vue │ │ │ ├── PromptCreator.vue │ │ │ └── PromptProcess.vue │ │ └── creator.vue │ └── snapshot/ │ ├── all.vue │ ├── components/ │ │ ├── Comment/ │ │ │ └── index.vue │ │ ├── Header/ │ │ │ └── index.vue │ │ ├── Message/ │ │ │ ├── index.vue │ │ │ └── style.less │ │ └── Search.vue │ └── page.vue ├── tailwind.config.js └── tsconfig.json