{ "extensions": [ [ ".js", 6314 ], [ ".ts", 6118 ], [ ".py", 3944 ], [ ".map", 3663 ], [ ".mjs", 2080 ], [ "[no extension]", 1926 ], [ ".css", 1294 ], [ ".md", 820 ], [ ".png", 525 ], [ ".json", 473 ], [ ".vue", 354 ], [ ".txt", 212 ], [ ".html", 182 ], [ ".gz", 132 ], [ ".sh", 125 ], [ ".cjs", 104 ], [ ".mts", 71 ], [ ".webp", 61 ], [ ".ps1", 59 ], [ ".yml", 56 ], [ ".zip", 55 ], [ ".h", 55 ], [ ".typed", 53 ], [ ".pyi", 49 ], [ ".cts", 48 ], [ ".dll", 44 ], [ ".log", 42 ], [ ".pyx", 38 ], [ ".mermaid", 35 ], [ ".bin", 34 ], [ ".snap", 34 ], [ ".sql", 31 ], [ ".pdf", 30 ], [ ".exe", 30 ], [ ".cc", 29 ], [ ".pyd", 27 ], [ ".b64", 24 ], [ ".cmd", 21 ], [ ".conf", 20 ], [ ".bat", 18 ], [ ".mp4", 18 ], [ ".pxd", 18 ], [ ".hh", 18 ], [ ".mako", 15 ], [ ".cpp", 15 ], [ ".docx", 14 ], [ ".hpp", 13 ], [ ".dev", 8 ], [ ".yaml", 8 ], [ ".tab", 8 ], [ ".tsbuildinfo", 8 ], [ ".flow", 7 ], [ ".svg", 6 ], [ ".part1", 6 ], [ ".part2", 6 ], [ ".part", 6 ], [ ".cypher", 6 ], [ ".cfg", 6 ], [ ".lua", 6 ], [ ".node", 6 ], [ ".ini", 5 ], [ ".xlsx", 5 ], [ ".bsd", 5 ], [ ".rst", 5 ], [ ".xml", 5 ], [ ".pxi", 4 ], [ ".apache", 4 ], [ ".c", 4 ], [ ".gyp", 4 ], [ ".gypi", 4 ], [ ".tgz", 3 ], [ ".example", 3 ], [ ".db", 3 ], [ ".mmd", 2 ], [ ".part10", 2 ], [ ".part11", 2 ], [ ".part12", 2 ], [ ".part3", 2 ], [ ".part4", 2 ], [ ".part5", 2 ], [ ".part6", 2 ], [ ".part7", 2 ], [ ".part8", 2 ], [ ".part9", 2 ], [ ".part0", 2 ], [ ".pem", 2 ], [ ".asm", 2 ], [ ".obj", 2 ], [ ".zi", 2 ], [ ".development", 2 ], [ ".properties", 2 ], [ ".s1", 1 ], [ ".s2", 1 ], [ ".0", 1 ], [ ".sqlite-shm", 1 ], [ ".sqlite-wal", 1 ], [ ".chunk0", 1 ], [ ".chunk1", 1 ], [ ".chunk2", 1 ], [ ".sha256", 1 ], [ ".jpg", 1 ], [ ".yml-archived-20260704", 1 ], [ ".conf-archived-20260704", 1 ], [ ".python", 1 ], [ ".psf", 1 ], [ ".fish", 1 ], [ ".production", 1 ], [ ".applescript", 1 ], [ ".sln", 1 ], [ ".vcxproj", 1 ], [ ".filters", 1 ], [ ".lock", 1 ], [ ".markdown", 1 ], [ ".1", 1 ], [ ".iml", 1 ], [ ".apache2", 1 ], [ ".mit", 1 ], [ ".mdown", 1 ], [ ".snapshot", 1 ], [ ".bnf", 1 ], [ ".tar", 1 ] ], "relevant_duplicates": [ [ "agent-v1.4.zip", "archives\\agent-v1.4.zip" ], [ "agent-v1.5.zip", "archives\\agent-v1.5.zip" ], [ "agent-v1.6.zip", "archives\\agent-v1.6.zip" ], [ "agent-v1.7.zip", "archives\\agent-v1.7.zip" ], [ "chunk_0000.bin", "archives\\chunk_0000.bin" ], [ "CONTRIBUTING.md", "docs\\CONTRIBUTING.md" ], [ "diagnose-500.b64", "archives\\diagnose-500.b64" ], [ "diagnose-500.sh", "scripts\\diagnose-500.sh", "scripts\\debug\\diagnose-500.sh" ], [ "fix-prod.b64", "archives\\fix-prod.b64" ], [ "fix-prod.sh", "scripts\\debug\\fix-prod.sh" ], [ "fix_alembic.sql", "scripts\\debug\\fix_alembic.sql" ], [ "frontend-h5-dist-part1.bin", "archives\\frontend-h5-dist-part1.bin" ], [ "frontend-h5-dist-part2.bin", "archives\\frontend-h5-dist-part2.bin" ], [ "frontend-h5-dist-part3.bin", "archives\\frontend-h5-dist-part3.bin" ], [ "list_nas_full.ps1", "scripts\\debug\\list_nas_full.ps1" ], [ "list_nas_volumes.ps1", "scripts\\debug\\list_nas_volumes.ps1" ], [ "nas_probe_output.txt", "archives\\nas_probe_output.txt" ], [ "nas_volumes.txt", "archives\\nas_volumes.txt" ], [ "probe_nas.ps1", "scripts\\debug\\probe_nas.ps1" ], [ "README.md", "docs\\README.md" ], [ "set-real-ip-patch.md", "docs\\set-real-ip-patch.md", "docs\\04-运维文档\\部署运维\\set-real-ip-patch.md" ], [ "split-b64.ps1", "scripts\\split-b64.ps1", "scripts\\debug\\split-b64.ps1" ], [ "stage1-probe.sh", "scripts\\debug\\stage1-probe.sh" ], [ "start-backend.sh", "scripts\\debug\\start-backend.sh" ], [ "test_contact_verify.py", "scripts\\debug\\test_contact_verify.py" ], [ "test_detect_api.py", "scripts\\debug\\test_detect_api.py" ], [ "test_detect_internal.py", "scripts\\debug\\test_detect_internal.py" ], [ "test_detect_v2.py", "scripts\\debug\\test_detect_v2.py" ], [ "test_dify_approval.py", "scripts\\debug\\test_dify_approval.py" ], [ "test_dify_composite.py", "scripts\\debug\\test_dify_composite.py" ], [ "test_dify_models.py", "scripts\\debug\\test_dify_models.py" ], [ "update_mfa.sh", "scripts\\debug\\update_mfa.sh" ], [ "update_mfa.sql", "scripts\\debug\\update_mfa.sql" ], [ "REQ编号", "代码核查范围:仅", "任务性质:技术可行性验证(未修改任何业务源码)", "优先级", "作者", "关联", "关联", "文档版本:v1.0", "日期", "版本", "状态", "验证人:高见远(架构师)", "验证日期:2026-08-08", ".workbuddy\\tmp\\upload_log.txt", "backend\\alembic\\versions\\.gitkeep", "backend\\tests\\__init__.py", "frontend-agent\\_tmp_29372_1009f75a5f4920154481edd364faddc5", "frontend-agent\\_tmp_35932_8fbbec5837c1aa586dcffeb17312f17c", "frontend-agent\\_tmp_7080_b6f58a22b62945d3984da41b01a52ca4", "scripts\\_ssh_test.txt", "scripts\\_test_result2.txt", "src\\backend\\alembic\\versions\\.gitkeep", "src\\backend\\tests\\__init__.py", "src\\backend\\venv\\Lib\\site-packages\\aiosqlite\\py.typed", "src\\backend\\venv\\Lib\\site-packages\\aiosqlite-0.22.1.dist-info\\REQUESTED", "src\\backend\\venv\\Lib\\site-packages\\alembic\\py.typed", "src\\backend\\venv\\Lib\\site-packages\\alembic\\runtime\\__init__.py", "src\\backend\\venv\\Lib\\site-packages\\alembic\\testing\\plugin\\__init__.py", "src\\backend\\venv\\Lib\\site-packages\\alembic-1.18.5.dist-info\\REQUESTED", "src\\backend\\venv\\Lib\\site-packages\\annotated_doc\\py.typed", "src\\backend\\venv\\Lib\\site-packages\\annotated_types\\py.typed", "src\\backend\\venv\\Lib\\site-packages\\anyio\\py.typed", "src\\backend\\venv\\Lib\\site-packages\\anyio\\streams\\__init__.py", "src\\backend\\venv\\Lib\\site-packages\\anyio\\_backends\\__init__.py", "src\\backend\\venv\\Lib\\site-packages\\anyio\\_core\\__init__.py", "src\\backend\\venv\\Lib\\site-packages\\apscheduler\\executors\\__init__.py", "src\\backend\\venv\\Lib\\site-packages\\apscheduler\\jobstores\\__init__.py", "src\\backend\\venv\\Lib\\site-packages\\apscheduler\\triggers\\__init__.py", "src\\backend\\venv\\Lib\\site-packages\\apscheduler-3.11.3.dist-info\\REQUESTED", "src\\backend\\venv\\Lib\\site-packages\\asyncpg\\protocol\\codecs\\__init__.py", "src\\backend\\venv\\Lib\\site-packages\\asyncpg-0.31.0.dist-info\\REQUESTED", "src\\backend\\venv\\Lib\\site-packages\\bcrypt\\py.typed", "src\\backend\\venv\\Lib\\site-packages\\bcrypt-5.0.0.dist-info\\REQUESTED", "src\\backend\\venv\\Lib\\site-packages\\certifi\\py.typed", "src\\backend\\venv\\Lib\\site-packages\\click\\py.typed", "src\\backend\\venv\\Lib\\site-packages\\cryptography\\py.typed", "src\\backend\\venv\\Lib\\site-packages\\cryptography-49.0.0.dist-info\\REQUESTED", "src\\backend\\venv\\Lib\\site-packages\\fastapi\\py.typed", "src\\backend\\venv\\Lib\\site-packages\\fastapi\\dependencies\\__init__.py", "src\\backend\\venv\\Lib\\site-packages\\fastapi\\openapi\\__init__.py", "src\\backend\\venv\\Lib\\site-packages\\fastapi-0.139.0.dist-info\\REQUESTED", "src\\backend\\venv\\Lib\\site-packages\\greenlet\\platform\\__init__.py", "src\\backend\\venv\\Lib\\site-packages\\httpcore\\py.typed", "src\\backend\\venv\\Lib\\site-packages\\httpcore\\_backends\\__init__.py", "src\\backend\\venv\\Lib\\site-packages\\httpx\\py.typed", "src\\backend\\venv\\Lib\\site-packages\\httpx-0.28.1.dist-info\\REQUESTED", "src\\backend\\venv\\Lib\\site-packages\\idna\\py.typed", "src\\backend\\venv\\Lib\\site-packages\\iniconfig\\py.typed", "src\\backend\\venv\\Lib\\site-packages\\limits\\py.typed", "src\\backend\\venv\\Lib\\site-packages\\mako\\ext\\__init__.py", "src\\backend\\venv\\Lib\\site-packages\\mako\\testing\\__init__.py", "src\\backend\\venv\\Lib\\site-packages\\markupsafe\\py.typed", "src\\backend\\venv\\Lib\\site-packages\\neo4j\\py.typed", "src\\backend\\venv\\Lib\\site-packages\\neo4j-6.2.0.dist-info\\REQUESTED", "src\\backend\\venv\\Lib\\site-packages\\openpyxl-3.1.5.dist-info\\REQUESTED", "src\\backend\\venv\\Lib\\site-packages\\packaging\\py.typed", "src\\backend\\venv\\Lib\\site-packages\\passlib-1.7.4.dist-info\\REQUESTED", "src\\backend\\venv\\Lib\\site-packages\\PIL\\py.typed", "src\\backend\\venv\\Lib\\site-packages\\pillow-12.3.0.dist-info\\REQUESTED", "src\\backend\\venv\\Lib\\site-packages\\pip\\_internal\\operations\\__init__.py", "src\\backend\\venv\\Lib\\site-packages\\pip\\_internal\\operations\\build\\__init__.py", "src\\backend\\venv\\Lib\\site-packages\\pip\\_internal\\resolution\\__init__.py", "src\\backend\\venv\\Lib\\site-packages\\pip\\_internal\\resolution\\legacy\\__init__.py", "src\\backend\\venv\\Lib\\site-packages\\pip\\_internal\\resolution\\resolvelib\\__init__.py", "src\\backend\\venv\\Lib\\site-packages\\pip\\_internal\\utils\\__init__.py", "src\\backend\\venv\\Lib\\site-packages\\pip\\_vendor\\cachecontrol\\py.typed", "src\\backend\\venv\\Lib\\site-packages\\pip\\_vendor\\certifi\\py.typed", "src\\backend\\venv\\Lib\\site-packages\\pip\\_vendor\\dependency_groups\\py.typed", "src\\backend\\venv\\Lib\\site-packages\\pip\\_vendor\\distro\\py.typed", "src\\backend\\venv\\Lib\\site-packages\\pip\\_vendor\\idna\\py.typed", "src\\backend\\venv\\Lib\\site-packages\\pip\\_vendor\\packaging\\py.typed", "src\\backend\\venv\\Lib\\site-packages\\pip\\_vendor\\platformdirs\\py.typed", "src\\backend\\venv\\Lib\\site-packages\\pip\\_vendor\\pyproject_hooks\\py.typed", "src\\backend\\venv\\Lib\\site-packages\\pip\\_vendor\\resolvelib\\py.typed", "src\\backend\\venv\\Lib\\site-packages\\pip\\_vendor\\rich\\py.typed", "src\\backend\\venv\\Lib\\site-packages\\pip\\_vendor\\truststore\\py.typed", "src\\backend\\venv\\Lib\\site-packages\\pip\\_vendor\\urllib3\\contrib\\__init__.py", "src\\backend\\venv\\Lib\\site-packages\\pip\\_vendor\\urllib3\\contrib\\_securetransport\\__init__.py", "src\\backend\\venv\\Lib\\site-packages\\pip\\_vendor\\urllib3\\packages\\__init__.py", "src\\backend\\venv\\Lib\\site-packages\\pip\\_vendor\\urllib3\\packages\\backports\\__init__.py", "src\\backend\\venv\\Lib\\site-packages\\pip-25.3.dist-info\\REQUESTED", "src\\backend\\venv\\Lib\\site-packages\\pluggy\\py.typed", "src\\backend\\venv\\Lib\\site-packages\\psutil-7.2.2.dist-info\\REQUESTED", "src\\backend\\venv\\Lib\\site-packages\\pydantic\\py.typed", "src\\backend\\venv\\Lib\\site-packages\\pydantic\\deprecated\\__init__.py", "src\\backend\\venv\\Lib\\site-packages\\pydantic\\v1\\py.typed", "src\\backend\\venv\\Lib\\site-packages\\pydantic\\_internal\\__init__.py", "src\\backend\\venv\\Lib\\site-packages\\pydantic-2.13.4.dist-info\\REQUESTED", "src\\backend\\venv\\Lib\\site-packages\\pydantic_core\\py.typed", "src\\backend\\venv\\Lib\\site-packages\\pydantic_settings\\py.typed", "src\\backend\\venv\\Lib\\site-packages\\pydantic_settings-2.14.2.dist-info\\REQUESTED", "src\\backend\\venv\\Lib\\site-packages\\pyotp\\py.typed", "src\\backend\\venv\\Lib\\site-packages\\pyotp-2.10.0.dist-info\\REQUESTED", "src\\backend\\venv\\Lib\\site-packages\\pytest\\py.typed", "src\\backend\\venv\\Lib\\site-packages\\pytest-9.1.1.dist-info\\REQUESTED", "src\\backend\\venv\\Lib\\site-packages\\pytest_asyncio\\py.typed", "src\\backend\\venv\\Lib\\site-packages\\pytest_asyncio-1.4.0.dist-info\\REQUESTED", "src\\backend\\venv\\Lib\\site-packages\\python_dotenv-1.2.2.dist-info\\REQUESTED", "src\\backend\\venv\\Lib\\site-packages\\python_jose-3.5.0.dist-info\\REQUESTED", "src\\backend\\venv\\Lib\\site-packages\\python_multipart\\py.typed", "src\\backend\\venv\\Lib\\site-packages\\python_multipart-0.0.32.dist-info\\REQUESTED", "src\\backend\\venv\\Lib\\site-packages\\pyyaml-6.0.3.dist-info\\REQUESTED", "src\\backend\\venv\\Lib\\site-packages\\qrcode\\compat\\__init__.py", "src\\backend\\venv\\Lib\\site-packages\\qrcode\\image\\__init__.py", "src\\backend\\venv\\Lib\\site-packages\\qrcode\\image\\styles\\__init__.py", "src\\backend\\venv\\Lib\\site-packages\\qrcode\\tests\\__init__.py", "src\\backend\\venv\\Lib\\site-packages\\qrcode-8.2.dist-info\\REQUESTED", "src\\backend\\venv\\Lib\\site-packages\\redis\\py.typed", "src\\backend\\venv\\Lib\\site-packages\\redis\\asyncio\\http\\__init__.py", "src\\backend\\venv\\Lib\\site-packages\\redis\\asyncio\\multidb\\__init__.py", "src\\backend\\venv\\Lib\\site-packages\\redis\\auth\\__init__.py", "src\\backend\\venv\\Lib\\site-packages\\redis\\http\\__init__.py", "src\\backend\\venv\\Lib\\site-packages\\redis\\multidb\\__init__.py", "src\\backend\\venv\\Lib\\site-packages\\redis-8.0.1.dist-info\\REQUESTED", "src\\backend\\venv\\Lib\\site-packages\\slowapi\\py.typed", "src\\backend\\venv\\Lib\\site-packages\\slowapi-0.1.10.dist-info\\REQUESTED", "src\\backend\\venv\\Lib\\site-packages\\sqlalchemy\\py.typed", "src\\backend\\venv\\Lib\\site-packages\\sqlalchemy-2.0.51.dist-info\\REQUESTED", "src\\backend\\venv\\Lib\\site-packages\\starlette\\py.typed", "src\\backend\\venv\\Lib\\site-packages\\typing_inspection\\py.typed", "src\\backend\\venv\\Lib\\site-packages\\typing_inspection\\__init__.py", "src\\backend\\venv\\Lib\\site-packages\\tzdata\\zoneinfo\\__init__.py", "src\\backend\\venv\\Lib\\site-packages\\tzdata\\zoneinfo\\Africa\\__init__.py", "src\\backend\\venv\\Lib\\site-packages\\tzdata\\zoneinfo\\America\\__init__.py", "src\\backend\\venv\\Lib\\site-packages\\tzdata\\zoneinfo\\America\\Argentina\\__init__.py", "src\\backend\\venv\\Lib\\site-packages\\tzdata\\zoneinfo\\America\\Indiana\\__init__.py", "src\\backend\\venv\\Lib\\site-packages\\tzdata\\zoneinfo\\America\\Kentucky\\__init__.py", "src\\backend\\venv\\Lib\\site-packages\\tzdata\\zoneinfo\\America\\North_Dakota\\__init__.py", "src\\backend\\venv\\Lib\\site-packages\\tzdata\\zoneinfo\\Antarctica\\__init__.py", "src\\backend\\venv\\Lib\\site-packages\\tzdata\\zoneinfo\\Arctic\\__init__.py", "src\\backend\\venv\\Lib\\site-packages\\tzdata\\zoneinfo\\Asia\\__init__.py", "src\\backend\\venv\\Lib\\site-packages\\tzdata\\zoneinfo\\Atlantic\\__init__.py", "src\\backend\\venv\\Lib\\site-packages\\tzdata\\zoneinfo\\Australia\\__init__.py", "src\\backend\\venv\\Lib\\site-packages\\tzdata\\zoneinfo\\Brazil\\__init__.py", "src\\backend\\venv\\Lib\\site-packages\\tzdata\\zoneinfo\\Canada\\__init__.py", "src\\backend\\venv\\Lib\\site-packages\\tzdata\\zoneinfo\\Chile\\__init__.py", "src\\backend\\venv\\Lib\\site-packages\\tzdata\\zoneinfo\\Etc\\__init__.py", "src\\backend\\venv\\Lib\\site-packages\\tzdata\\zoneinfo\\Europe\\__init__.py", "src\\backend\\venv\\Lib\\site-packages\\tzdata\\zoneinfo\\Indian\\__init__.py", "src\\backend\\venv\\Lib\\site-packages\\tzdata\\zoneinfo\\Mexico\\__init__.py", "src\\backend\\venv\\Lib\\site-packages\\tzdata\\zoneinfo\\Pacific\\__init__.py", "src\\backend\\venv\\Lib\\site-packages\\tzdata\\zoneinfo\\US\\__init__.py", "src\\backend\\venv\\Lib\\site-packages\\tzlocal\\py.typed", "src\\backend\\venv\\Lib\\site-packages\\uvicorn\\lifespan\\__init__.py", "src\\backend\\venv\\Lib\\site-packages\\uvicorn\\loops\\__init__.py", "src\\backend\\venv\\Lib\\site-packages\\uvicorn\\middleware\\__init__.py", "src\\backend\\venv\\Lib\\site-packages\\uvicorn\\protocols\\__init__.py", "src\\backend\\venv\\Lib\\site-packages\\uvicorn\\protocols\\http\\__init__.py", "src\\backend\\venv\\Lib\\site-packages\\uvicorn\\protocols\\websockets\\__init__.py", "src\\backend\\venv\\Lib\\site-packages\\uvicorn-0.50.0.dist-info\\REQUESTED", "src\\backend\\venv\\Lib\\site-packages\\wordfilter-0.2.7.dist-info\\REQUESTED", "src\\backend\\venv\\Lib\\site-packages\\_pytest\\py.typed", "src\\backend\\venv\\Lib\\site-packages\\_pytest\\_py\\__init__.py", "src\\frontend-admin\\_tmp_10700_eea2ff15ef7e4a7a4dcc582455c464b3", "src\\frontend-admin\\_tmp_33128_dce88b57677b229a9f995be5048e5170", "src\\frontend-agent\\agent_dev.log", "src\\frontend-agent\\agent_dev_err.log", "src\\frontend-agent\\_tmp_29372_1009f75a5f4920154481edd364faddc5", "src\\frontend-agent\\_tmp_33248_43e1a5598013c000ff42881e2bfff7b1", "src\\frontend-agent\\_tmp_35932_8fbbec5837c1aa586dcffeb17312f17c", "src\\frontend-agent\\_tmp_42692_4702be5b34292aa674230cb235ba770d", "src\\frontend-agent\\_tmp_45344_9114b5d5194ff8a1c8628d2b71f1b1e1", "src\\frontend-agent\\_tmp_48280_f21ce13609a336ee57bd49393e164b45", "src\\frontend-agent\\_tmp_7080_b6f58a22b62945d3984da41b01a52ca4", "src\\frontend-h5\\node_modules_old\\.ignored\\html2canvas-pro\\dist\\types\\dom\\replaced-elements\\pseudo-elements.d.ts", "src\\frontend-h5\\node_modules_old\\.ignored\\unplugin-vue-components\\dist\\chunk-6F4PWJZI.js", "src\\frontend-h5\\node_modules_old\\.ignored\\vant\\es\\action-bar\\types.mjs", "src\\frontend-h5\\node_modules_old\\.ignored\\vant\\es\\action-bar-button\\types.mjs", "src\\frontend-h5\\node_modules_old\\.ignored\\vant\\es\\action-bar-icon\\types.mjs", "src\\frontend-h5\\node_modules_old\\.ignored\\vant\\es\\action-sheet\\types.mjs", "src\\frontend-h5\\node_modules_old\\.ignored\\vant\\es\\address-edit\\types.mjs", "src\\frontend-h5\\node_modules_old\\.ignored\\vant\\es\\address-list\\types.mjs", "src\\frontend-h5\\node_modules_old\\.ignored\\vant\\es\\area\\types.mjs", "src\\frontend-h5\\node_modules_old\\.ignored\\vant\\es\\back-top\\types.mjs", "src\\frontend-h5\\node_modules_old\\.ignored\\vant\\es\\badge\\types.mjs", "src\\frontend-h5\\node_modules_old\\.ignored\\vant\\es\\barrage\\types.mjs", "src\\frontend-h5\\node_modules_old\\.ignored\\vant\\es\\button\\types.mjs", "src\\frontend-h5\\node_modules_old\\.ignored\\vant\\es\\calendar\\types.mjs", "src\\frontend-h5\\node_modules_old\\.ignored\\vant\\es\\card\\types.mjs", "src\\frontend-h5\\node_modules_old\\.ignored\\vant\\es\\cascader\\types.mjs", "src\\frontend-h5\\node_modules_old\\.ignored\\vant\\es\\cell\\types.mjs", "src\\frontend-h5\\node_modules_old\\.ignored\\vant\\es\\cell-group\\types.mjs", "src\\frontend-h5\\node_modules_old\\.ignored\\vant\\es\\checkbox\\types.mjs", "src\\frontend-h5\\node_modules_old\\.ignored\\vant\\es\\checkbox-group\\types.mjs", "src\\frontend-h5\\node_modules_old\\.ignored\\vant\\es\\circle\\types.mjs", "src\\frontend-h5\\node_modules_old\\.ignored\\vant\\es\\collapse-item\\types.mjs", "src\\frontend-h5\\node_modules_old\\.ignored\\vant\\es\\config-provider\\types.mjs", "src\\frontend-h5\\node_modules_old\\.ignored\\vant\\es\\contact-card\\types.mjs", "src\\frontend-h5\\node_modules_old\\.ignored\\vant\\es\\contact-edit\\types.mjs", "src\\frontend-h5\\node_modules_old\\.ignored\\vant\\es\\contact-list\\types.mjs", "src\\frontend-h5\\node_modules_old\\.ignored\\vant\\es\\count-down\\types.mjs", "src\\frontend-h5\\node_modules_old\\.ignored\\vant\\es\\coupon\\types.mjs", "src\\frontend-h5\\node_modules_old\\.ignored\\vant\\es\\coupon-cell\\types.mjs", "src\\frontend-h5\\node_modules_old\\.ignored\\vant\\es\\coupon-list\\types.mjs", "src\\frontend-h5\\node_modules_old\\.ignored\\vant\\es\\dialog\\types.mjs", "src\\frontend-h5\\node_modules_old\\.ignored\\vant\\es\\divider\\types.mjs", "src\\frontend-h5\\node_modules_old\\.ignored\\vant\\es\\dropdown-item\\types.mjs", "src\\frontend-h5\\node_modules_old\\.ignored\\vant\\es\\dropdown-menu\\types.mjs", "src\\frontend-h5\\node_modules_old\\.ignored\\vant\\es\\empty\\types.mjs", "src\\frontend-h5\\node_modules_old\\.ignored\\vant\\es\\field\\types.mjs", "src\\frontend-h5\\node_modules_old\\.ignored\\vant\\es\\floating-bubble\\types.mjs", "src\\frontend-h5\\node_modules_old\\.ignored\\vant\\es\\floating-panel\\types.mjs", "src\\frontend-h5\\node_modules_old\\.ignored\\vant\\es\\form\\types.mjs", "src\\frontend-h5\\node_modules_old\\.ignored\\vant\\es\\grid-item\\types.mjs", "src\\frontend-h5\\node_modules_old\\.ignored\\vant\\es\\highlight\\types.mjs", "src\\frontend-h5\\node_modules_old\\.ignored\\vant\\es\\image\\types.mjs", "src\\frontend-h5\\node_modules_old\\.ignored\\vant\\es\\image-preview\\types.mjs", "src\\frontend-h5\\node_modules_old\\.ignored\\vant\\es\\index-anchor\\types.mjs", "src\\frontend-h5\\node_modules_old\\.ignored\\vant\\es\\index-bar\\types.mjs", "src\\frontend-h5\\node_modules_old\\.ignored\\vant\\es\\list\\types.mjs", "src\\frontend-h5\\node_modules_old\\.ignored\\vant\\es\\loading\\types.mjs", "src\\frontend-h5\\node_modules_old\\.ignored\\vant\\es\\nav-bar\\types.mjs", "src\\frontend-h5\\node_modules_old\\.ignored\\vant\\es\\notice-bar\\types.mjs", "src\\frontend-h5\\node_modules_old\\.ignored\\vant\\es\\notify\\types.mjs", "src\\frontend-h5\\node_modules_old\\.ignored\\vant\\es\\number-keyboard\\types.mjs", "src\\frontend-h5\\node_modules_old\\.ignored\\vant\\es\\overlay\\types.mjs", "src\\frontend-h5\\node_modules_old\\.ignored\\vant\\es\\pagination\\types.mjs", "src\\frontend-h5\\node_modules_old\\.ignored\\vant\\es\\password-input\\types.mjs", "src\\frontend-h5\\node_modules_old\\.ignored\\vant\\es\\picker\\types.mjs", "src\\frontend-h5\\node_modules_old\\.ignored\\vant\\es\\picker-group\\types.mjs", "src\\frontend-h5\\node_modules_old\\.ignored\\vant\\es\\popover\\types.mjs", "src\\frontend-h5\\node_modules_old\\.ignored\\vant\\es\\popup\\types.mjs", "src\\frontend-h5\\node_modules_old\\.ignored\\vant\\es\\progress\\types.mjs", "src\\frontend-h5\\node_modules_old\\.ignored\\vant\\es\\pull-refresh\\types.mjs", "src\\frontend-h5\\node_modules_old\\.ignored\\vant\\es\\radio\\types.mjs", "src\\frontend-h5\\node_modules_old\\.ignored\\vant\\es\\rate\\types.mjs", "src\\frontend-h5\\node_modules_old\\.ignored\\vant\\es\\rolling-text\\types.mjs", "src\\frontend-h5\\node_modules_old\\.ignored\\vant\\es\\search\\types.mjs", "src\\frontend-h5\\node_modules_old\\.ignored\\vant\\es\\share-sheet\\types.mjs", "src\\frontend-h5\\node_modules_old\\.ignored\\vant\\es\\sidebar\\types.mjs", "src\\frontend-h5\\node_modules_old\\.ignored\\vant\\es\\sidebar-item\\types.mjs", "src\\frontend-h5\\node_modules_old\\.ignored\\vant\\es\\signature\\types.mjs", "src\\frontend-h5\\node_modules_old\\.ignored\\vant\\es\\skeleton\\types.mjs", "src\\frontend-h5\\node_modules_old\\.ignored\\vant\\es\\slider\\types.mjs", "src\\frontend-h5\\node_modules_old\\.ignored\\vant\\es\\step\\types.mjs", "src\\frontend-h5\\node_modules_old\\.ignored\\vant\\es\\stepper\\types.mjs", "src\\frontend-h5\\node_modules_old\\.ignored\\vant\\es\\steps\\types.mjs", "src\\frontend-h5\\node_modules_old\\.ignored\\vant\\es\\sticky\\types.mjs", "src\\frontend-h5\\node_modules_old\\.ignored\\vant\\es\\style\\mixins\\clearfix.css", "src\\frontend-h5\\node_modules_old\\.ignored\\vant\\es\\style\\mixins\\ellipsis.css", "src\\frontend-h5\\node_modules_old\\.ignored\\vant\\es\\style\\mixins\\hairline.css", "src\\frontend-h5\\node_modules_old\\.ignored\\vant\\es\\submit-bar\\types.mjs", "src\\frontend-h5\\node_modules_old\\.ignored\\vant\\es\\swipe\\types.mjs", "src\\frontend-h5\\node_modules_old\\.ignored\\vant\\es\\swipe-cell\\types.mjs", "src\\frontend-h5\\node_modules_old\\.ignored\\vant\\es\\switch\\types.mjs", "src\\frontend-h5\\node_modules_old\\.ignored\\vant\\es\\tabbar\\types.mjs", "src\\frontend-h5\\node_modules_old\\.ignored\\vant\\es\\tabbar-item\\types.mjs", "src\\frontend-h5\\node_modules_old\\.ignored\\vant\\es\\tabs\\types.mjs", "src\\frontend-h5\\node_modules_old\\.ignored\\vant\\es\\tag\\types.mjs", "src\\frontend-h5\\node_modules_old\\.ignored\\vant\\es\\text-ellipsis\\types.mjs", "src\\frontend-h5\\node_modules_old\\.ignored\\vant\\es\\toast\\types.mjs", "src\\frontend-h5\\node_modules_old\\.ignored\\vant\\es\\tree-select\\types.mjs", "src\\frontend-h5\\node_modules_old\\.ignored\\vant\\es\\uploader\\types.mjs", "src\\frontend-h5\\node_modules_old\\.ignored\\vant\\es\\watermark\\types.mjs", "src\\frontend-h5\\node_modules_old\\.ignored\\vant\\lib\\style\\mixins\\clearfix.css", "src\\frontend-h5\\node_modules_old\\.ignored\\vant\\lib\\style\\mixins\\ellipsis.css", "src\\frontend-h5\\node_modules_old\\.ignored\\vant\\lib\\style\\mixins\\hairline.css", "src\\frontend-h5\\node_modules_old\\@standard-schema\\spec\\dist\\index.js", "src\\frontend-h5\\node_modules_old\\html2canvas-pro\\dist\\types\\dom\\replaced-elements\\pseudo-elements.d.ts", "src\\frontend-h5\\node_modules_old\\napi-build-utils\\index.md", "src\\frontend-h5\\node_modules_old\\node-addon-api\\nothing.c", "src\\frontend-h5\\node_modules_old\\nwsapi\\dist\\lint.log", "src\\frontend-h5\\node_modules_old\\tar-fs\\test\\fixtures\\d\\file1", "src\\frontend-h5\\node_modules_old\\tar-fs\\test\\fixtures\\d\\file2", "src\\frontend-h5\\node_modules_old\\tar-fs\\test\\fixtures\\d\\sub-dir\\file5", "src\\frontend-h5\\node_modules_old\\tar-fs\\test\\fixtures\\d\\sub-files\\file3", "src\\frontend-h5\\node_modules_old\\tar-fs\\test\\fixtures\\d\\sub-files\\file4", "src\\frontend-h5\\node_modules_old\\tar-fs\\test\\fixtures\\e\\file", "src\\frontend-h5\\node_modules_old\\tar-fs\\test\\fixtures\\e\\directory\\.ignore", "src\\frontend-h5\\node_modules_old\\unplugin-vue-components\\dist\\chunk-6F4PWJZI.js", "src\\frontend-h5\\node_modules_old\\vant\\es\\action-bar\\types.mjs", "src\\frontend-h5\\node_modules_old\\vant\\es\\action-bar-button\\types.mjs", "src\\frontend-h5\\node_modules_old\\vant\\es\\action-bar-icon\\types.mjs", "src\\frontend-h5\\node_modules_old\\vant\\es\\action-sheet\\types.mjs", "src\\frontend-h5\\node_modules_old\\vant\\es\\address-edit\\types.mjs", "src\\frontend-h5\\node_modules_old\\vant\\es\\address-list\\types.mjs", "src\\frontend-h5\\node_modules_old\\vant\\es\\area\\types.mjs", "src\\frontend-h5\\node_modules_old\\vant\\es\\back-top\\types.mjs", "src\\frontend-h5\\node_modules_old\\vant\\es\\badge\\types.mjs", "src\\frontend-h5\\node_modules_old\\vant\\es\\barrage\\types.mjs", "src\\frontend-h5\\node_modules_old\\vant\\es\\button\\types.mjs", "src\\frontend-h5\\node_modules_old\\vant\\es\\calendar\\types.mjs", "src\\frontend-h5\\node_modules_old\\vant\\es\\card\\types.mjs", "src\\frontend-h5\\node_modules_old\\vant\\es\\cascader\\types.mjs", "src\\frontend-h5\\node_modules_old\\vant\\es\\cell\\types.mjs", "src\\frontend-h5\\node_modules_old\\vant\\es\\cell-group\\types.mjs", "src\\frontend-h5\\node_modules_old\\vant\\es\\checkbox\\types.mjs", "src\\frontend-h5\\node_modules_old\\vant\\es\\checkbox-group\\types.mjs", "src\\frontend-h5\\node_modules_old\\vant\\es\\circle\\types.mjs", "src\\frontend-h5\\node_modules_old\\vant\\es\\collapse-item\\types.mjs", "src\\frontend-h5\\node_modules_old\\vant\\es\\config-provider\\types.mjs", "src\\frontend-h5\\node_modules_old\\vant\\es\\contact-card\\types.mjs", "src\\frontend-h5\\node_modules_old\\vant\\es\\contact-edit\\types.mjs", "src\\frontend-h5\\node_modules_old\\vant\\es\\contact-list\\types.mjs", "src\\frontend-h5\\node_modules_old\\vant\\es\\count-down\\types.mjs", "src\\frontend-h5\\node_modules_old\\vant\\es\\coupon\\types.mjs", "src\\frontend-h5\\node_modules_old\\vant\\es\\coupon-cell\\types.mjs", "src\\frontend-h5\\node_modules_old\\vant\\es\\coupon-list\\types.mjs", "src\\frontend-h5\\node_modules_old\\vant\\es\\dialog\\types.mjs", "src\\frontend-h5\\node_modules_old\\vant\\es\\divider\\types.mjs", "src\\frontend-h5\\node_modules_old\\vant\\es\\dropdown-item\\types.mjs", "src\\frontend-h5\\node_modules_old\\vant\\es\\dropdown-menu\\types.mjs", "src\\frontend-h5\\node_modules_old\\vant\\es\\empty\\types.mjs", "src\\frontend-h5\\node_modules_old\\vant\\es\\field\\types.mjs", "src\\frontend-h5\\node_modules_old\\vant\\es\\floating-bubble\\types.mjs", "src\\frontend-h5\\node_modules_old\\vant\\es\\floating-panel\\types.mjs", "src\\frontend-h5\\node_modules_old\\vant\\es\\form\\types.mjs", "src\\frontend-h5\\node_modules_old\\vant\\es\\grid-item\\types.mjs", "src\\frontend-h5\\node_modules_old\\vant\\es\\highlight\\types.mjs", "src\\frontend-h5\\node_modules_old\\vant\\es\\image\\types.mjs", "src\\frontend-h5\\node_modules_old\\vant\\es\\image-preview\\types.mjs", "src\\frontend-h5\\node_modules_old\\vant\\es\\index-anchor\\types.mjs", "src\\frontend-h5\\node_modules_old\\vant\\es\\index-bar\\types.mjs", "src\\frontend-h5\\node_modules_old\\vant\\es\\list\\types.mjs", "src\\frontend-h5\\node_modules_old\\vant\\es\\loading\\types.mjs", "src\\frontend-h5\\node_modules_old\\vant\\es\\nav-bar\\types.mjs", "src\\frontend-h5\\node_modules_old\\vant\\es\\notice-bar\\types.mjs", "src\\frontend-h5\\node_modules_old\\vant\\es\\notify\\types.mjs", "src\\frontend-h5\\node_modules_old\\vant\\es\\number-keyboard\\types.mjs", "src\\frontend-h5\\node_modules_old\\vant\\es\\overlay\\types.mjs", "src\\frontend-h5\\node_modules_old\\vant\\es\\pagination\\types.mjs", "src\\frontend-h5\\node_modules_old\\vant\\es\\password-input\\types.mjs", "src\\frontend-h5\\node_modules_old\\vant\\es\\picker\\types.mjs", "src\\frontend-h5\\node_modules_old\\vant\\es\\picker-group\\types.mjs", "src\\frontend-h5\\node_modules_old\\vant\\es\\popover\\types.mjs", "src\\frontend-h5\\node_modules_old\\vant\\es\\popup\\types.mjs", "src\\frontend-h5\\node_modules_old\\vant\\es\\progress\\types.mjs", "src\\frontend-h5\\node_modules_old\\vant\\es\\pull-refresh\\types.mjs", "src\\frontend-h5\\node_modules_old\\vant\\es\\radio\\types.mjs", "src\\frontend-h5\\node_modules_old\\vant\\es\\rate\\types.mjs", "src\\frontend-h5\\node_modules_old\\vant\\es\\rolling-text\\types.mjs", "src\\frontend-h5\\node_modules_old\\vant\\es\\search\\types.mjs", "src\\frontend-h5\\node_modules_old\\vant\\es\\share-sheet\\types.mjs", "src\\frontend-h5\\node_modules_old\\vant\\es\\sidebar\\types.mjs", "src\\frontend-h5\\node_modules_old\\vant\\es\\sidebar-item\\types.mjs", "src\\frontend-h5\\node_modules_old\\vant\\es\\signature\\types.mjs", "src\\frontend-h5\\node_modules_old\\vant\\es\\skeleton\\types.mjs", "src\\frontend-h5\\node_modules_old\\vant\\es\\slider\\types.mjs", "src\\frontend-h5\\node_modules_old\\vant\\es\\step\\types.mjs", "src\\frontend-h5\\node_modules_old\\vant\\es\\stepper\\types.mjs", "src\\frontend-h5\\node_modules_old\\vant\\es\\steps\\types.mjs", "src\\frontend-h5\\node_modules_old\\vant\\es\\sticky\\types.mjs", "src\\frontend-h5\\node_modules_old\\vant\\es\\style\\mixins\\clearfix.css", "src\\frontend-h5\\node_modules_old\\vant\\es\\style\\mixins\\ellipsis.css", "src\\frontend-h5\\node_modules_old\\vant\\es\\style\\mixins\\hairline.css", "src\\frontend-h5\\node_modules_old\\vant\\es\\submit-bar\\types.mjs", "src\\frontend-h5\\node_modules_old\\vant\\es\\swipe\\types.mjs", "src\\frontend-h5\\node_modules_old\\vant\\es\\swipe-cell\\types.mjs", "src\\frontend-h5\\node_modules_old\\vant\\es\\switch\\types.mjs", "src\\frontend-h5\\node_modules_old\\vant\\es\\tabbar\\types.mjs", "src\\frontend-h5\\node_modules_old\\vant\\es\\tabbar-item\\types.mjs", "src\\frontend-h5\\node_modules_old\\vant\\es\\tabs\\types.mjs", "src\\frontend-h5\\node_modules_old\\vant\\es\\tag\\types.mjs", "src\\frontend-h5\\node_modules_old\\vant\\es\\text-ellipsis\\types.mjs", "src\\frontend-h5\\node_modules_old\\vant\\es\\toast\\types.mjs", "src\\frontend-h5\\node_modules_old\\vant\\es\\tree-select\\types.mjs", "src\\frontend-h5\\node_modules_old\\vant\\es\\uploader\\types.mjs", "src\\frontend-h5\\node_modules_old\\vant\\es\\watermark\\types.mjs", "src\\frontend-h5\\node_modules_old\\vant\\lib\\style\\mixins\\clearfix.css", "src\\frontend-h5\\node_modules_old\\vant\\lib\\style\\mixins\\ellipsis.css", "src\\frontend-h5\\node_modules_old\\vant\\lib\\style\\mixins\\hairline.css" ], [ ".workbuddy\\outputs\\itdesk-after-portal-token.png", ".workbuddy\\outputs\\itdesk-stable.png" ], [ ".workbuddy\\tmp\\dify_workflow_BACKUP.json", ".workbuddy\\tmp\\dify_workflow_draft.json" ], [ ".workbuddy\\tmp\\deploy\\app\\services\\wingman_service.py", "src\\backend\\app\\services\\wingman_service.py" ], [ ".workbuddy\\tmp\\orphan-backup\\InputBox.vue", "frontend-h5\\src\\components\\chat\\InputBox.vue" ], [ "backend\\.dockerignore", "src\\backend\\.dockerignore" ], [ "backend\\alembic.ini", "docs\\08-历史归档\\deploy-nas-archived-20260704\\backend\\alembic.ini", "src\\backend\\alembic.ini" ], [ "backend\\create_meetingroom_tables.py", "src\\backend\\create_meetingroom_tables.py" ], [ "backend\\Dockerfile", "src\\backend\\Dockerfile" ], [ "backend\\Dockerfile.dev", "src\\backend\\Dockerfile.dev" ], [ "backend\\hello.py", "src\\backend\\hello.py" ], [ "backend\\migrate_employee_v53.py", "src\\backend\\migrate_employee_v53.py" ], [ "backend\\migrate_v53.py", "src\\backend\\migrate_v53.py" ], [ "backend\\pytest.ini", "src\\backend\\pytest.ini" ], [ "backend\\pytest_result.txt", "src\\backend\\pytest_result.txt" ], [ "backend\\requirements.txt", "src\\backend\\requirements.txt" ], [ "backend\\run_tests.bat", "src\\backend\\run_tests.bat" ], [ "backend\\run_tests.ps1", "src\\backend\\run_tests.ps1" ], [ "backend\\run_tests.py", "src\\backend\\run_tests.py" ], [ "backend\\run_tests_v2.py", "src\\backend\\run_tests_v2.py" ], [ "backend\\seed_conversations.py", "src\\backend\\seed_conversations.py" ], [ "backend\\setup_test_env.py", "src\\backend\\setup_test_env.py" ], [ "backend\\start_backend.py", "src\\backend\\start_backend.py" ], [ "backend\\stderr.txt", "src\\backend\\stderr.txt" ], [ "backend\\stdout.txt", "src\\backend\\stdout.txt" ], [ "backend\\test_env.py", "src\\backend\\test_env.py" ], [ "backend\\test_nontext_result.txt", "src\\backend\\test_nontext_result.txt" ], [ "backend\\test_service_routes.py", "src\\backend\\test_service_routes.py" ], [ "backend\\tmp_create_dev_agent.py", "src\\backend\\tmp_create_dev_agent.py" ], [ "backend\\tmp_create_test_conversation.py", "src\\backend\\tmp_create_test_conversation.py" ], [ "backend\\tmp_seed_test_data.py", "src\\backend\\tmp_seed_test_data.py" ], [ "backend\\__init__.py", "src\\backend\\__init__.py" ], [ "backend\\alembic\\env.py", "docs\\08-历史归档\\deploy-nas-archived-20260704\\backend\\alembic\\env.py", "src\\backend\\alembic\\env.py" ], [ "backend\\alembic\\script.py.mako", "docs\\08-历史归档\\deploy-nas-archived-20260704\\backend\\alembic\\script.py.mako", "src\\backend\\alembic\\script.py.mako" ], [ "backend\\alembic\\versions\\002_add_media_fields.py", "docs\\08-历史归档\\deploy-nas-archived-20260704\\backend\\alembic\\versions\\002_add_media_fields.py", "src\\backend\\alembic\\versions\\002_add_media_fields.py" ], [ "backend\\alembic\\versions\\003_add_suggestion_action.py", "docs\\08-历史归档\\deploy-nas-archived-20260704\\backend\\alembic\\versions\\003_add_suggestion_action.py", "src\\backend\\alembic\\versions\\003_add_suggestion_action.py" ], [ "backend\\alembic\\versions\\004_add_participants.py", "src\\backend\\alembic\\versions\\004_add_participants.py" ], [ "backend\\alembic\\versions\\005_add_reply_to_id.py", "src\\backend\\alembic\\versions\\005_add_reply_to_id.py" ], [ "backend\\alembic\\versions\\006_admin_ext.py", "src\\backend\\alembic\\versions\\006_admin_ext.py" ], [ "backend\\alembic\\versions\\007_role_system.py", "src\\backend\\alembic\\versions\\007_role_system.py" ], [ "backend\\alembic\\versions\\008_add_agent_password.py", "src\\backend\\alembic\\versions\\008_add_agent_password.py" ], [ "backend\\alembic\\versions\\009_add_message_status.py", "src\\backend\\alembic\\versions\\009_add_message_status.py" ], [ "backend\\alembic\\versions\\010_add_agent_otp.py", "src\\backend\\alembic\\versions\\010_add_agent_otp.py" ], [ "backend\\alembic\\versions\\011_add_conversation_impact_fields.py", "src\\backend\\alembic\\versions\\011_add_conversation_impact_fields.py" ], [ "backend\\alembic\\versions\\012_sync_remaining_fields.py", "src\\backend\\alembic\\versions\\012_sync_remaining_fields.py" ], [ "backend\\alembic\\versions\\021_rbac.py", "src\\backend\\alembic\\versions\\021_rbac.py" ], [ "backend\\alembic\\versions\\022_qrcode_login.py", "src\\backend\\alembic\\versions\\022_qrcode_login.py" ], [ "backend\\alembic\\versions\\023_mfa_fields.py", "src\\backend\\alembic\\versions\\023_mfa_fields.py" ], [ "backend\\alembic\\versions\\025_messages_id_uuid.py", "src\\backend\\alembic\\versions\\025_messages_id_uuid.py" ], [ "backend\\alembic\\versions\\026_drop_agent_otp_legacy.py", "src\\backend\\alembic\\versions\\026_drop_agent_otp_legacy.py" ], [ "backend\\alembic\\versions\\027_audit_logs.py", "src\\backend\\alembic\\versions\\027_audit_logs.py" ], [ "backend\\alembic\\versions\\028_merge_heads_022_023_027.py", "src\\backend\\alembic\\versions\\028_merge_heads_022_023_027.py" ], [ "backend\\alembic\\versions\\041_message_server_timestamp.py", "src\\backend\\alembic\\versions\\041_message_server_timestamp.py" ], [ "backend\\alembic\\versions\\042_add_employee_avatar_updated_at.py", "src\\backend\\alembic\\versions\\042_add_employee_avatar_updated_at.py" ], [ "backend\\alembic\\versions\\043_knowledge_iteration.py", "src\\backend\\alembic\\versions\\043_knowledge_iteration.py" ], [ "backend\\alembic\\versions\\044_automation.py", "src\\backend\\alembic\\versions\\044_automation.py" ], [ "backend\\alembic\\versions\\045_add_graph_confidence_audience.py", "src\\backend\\alembic\\versions\\045_add_graph_confidence_audience.py" ], [ "backend\\alembic\\versions\\046_add_login_logs.py", "src\\backend\\alembic\\versions\\046_add_login_logs.py" ], [ "backend\\alembic\\versions\\047_business_contacts.py", "src\\backend\\alembic\\versions\\047_business_contacts.py" ], [ "backend\\alembic\\versions\\048_add_information_items.py", "src\\backend\\alembic\\versions\\048_add_information_items.py" ], [ "backend\\alembic\\versions\\049_add_p2_p3_tables.py", "src\\backend\\alembic\\versions\\049_add_p2_p3_tables.py" ], [ "backend\\alembic\\versions\\050_add_meetingroom_tables.py", "src\\backend\\alembic\\versions\\050_add_meetingroom_tables.py" ], [ "backend\\alembic\\versions\\051_add_meetingroom_repair_guide.py", "src\\backend\\alembic\\versions\\051_add_meetingroom_repair_guide.py" ], [ "backend\\alembic\\versions\\051_triage_exclusion_tables.py", "src\\backend\\alembic\\versions\\051_triage_exclusion_tables.py" ], [ "backend\\alembic\\versions\\052_diagnostic_queue_quiz_closing.py", "src\\backend\\alembic\\versions\\052_diagnostic_queue_quiz_closing.py" ], [ "backend\\alembic\\versions\\6d5520491644_initial_all_tables.py", "docs\\08-历史归档\\deploy-nas-archived-20260704\\backend\\alembic\\versions\\6d5520491644_initial_all_tables.py", "src\\backend\\alembic\\versions\\6d5520491644_initial_all_tables.py" ], [ "backend\\app\\constants.py", "deploy-temp\\p2p3\\app\\constants.py", "src\\backend\\app\\constants\\automation.py" ], [ "backend\\app\\database.py", "src\\backend\\app\\database.py" ], [ "backend\\app\\__init__.py", "src\\backend\\app\\__init__.py" ], [ "backend\\app\\api\\admin_roles.py", "src\\backend\\app\\api\\admin_roles.py" ], [ "backend\\app\\api\\admin_users.py", "src\\backend\\app\\api\\admin_users.py" ], [ "backend\\app\\api\\agent_notes.py", "src\\backend\\app\\api\\agent_notes.py" ], [ "backend\\app\\api\\approval_queue.py", "src\\backend\\app\\api\\approval_queue.py" ], [ "backend\\app\\api\\audit_logs.py", "src\\backend\\app\\api\\audit_logs.py" ], [ "backend\\app\\api\\auth.py", "src\\backend\\app\\api\\auth.py" ], [ "backend\\app\\api\\automation.py", "deploy-temp\\p2p3\\app\\api\\automation.py", "src\\backend\\app\\api\\automation.py" ], [ "backend\\app\\api\\avatar.py", "src\\backend\\app\\api\\avatar.py" ], [ "backend\\app\\api\\conversation_annotation.py", "src\\backend\\app\\api\\conversation_annotation.py" ], [ "backend\\app\\api\\dev_auth.py", "src\\backend\\app\\api\\dev_auth.py" ], [ "backend\\app\\api\\employees.py", "src\\backend\\app\\api\\employees.py" ], [ "backend\\app\\api\\employees_simple.py", "src\\backend\\app\\api\\employees_simple.py" ], [ "backend\\app\\api\\evaluations.py", "src\\backend\\app\\api\\evaluations.py" ], [ "backend\\app\\api\\exclusion_rules.py", "src\\backend\\app\\api\\exclusion_rules.py" ], [ "backend\\app\\api\\knowledge_base.py", "src\\backend\\app\\api\\knowledge_base.py" ], [ "backend\\app\\api\\knowledge_iteration.py", "deploy-staging-ki\\app\\api\\knowledge_iteration.py", "src\\backend\\app\\api\\knowledge_iteration.py" ], [ "backend\\app\\api\\meetingroom.py", "src\\backend\\app\\api\\meetingroom.py" ], [ "backend\\app\\api\\queue.py", "src\\backend\\app\\api\\queue.py" ], [ "backend\\app\\api\\quick_replies.py", "src\\backend\\app\\api\\quick_replies.py" ], [ "backend\\app\\api\\quiz.py", "src\\backend\\app\\api\\quiz.py" ], [ "backend\\app\\api\\quiz_admin.py", "src\\backend\\app\\api\\quiz_admin.py" ], [ "backend\\app\\api\\ragflow_ingestion.py", "src\\backend\\app\\api\\ragflow_ingestion.py" ], [ "backend\\app\\api\\routing.py", "src\\backend\\app\\api\\routing.py" ], [ "backend\\app\\api\\runtime_logs.py", "src\\backend\\app\\api\\runtime_logs.py" ], [ "backend\\app\\api\\service_routes.py", "src\\backend\\app\\api\\service_routes.py" ], [ "backend\\app\\api\\statistics.py", "src\\backend\\app\\api\\statistics.py" ], [ "backend\\app\\api\\system.py", "src\\backend\\app\\api\\system.py" ], [ "backend\\app\\api\\todo_items.py", "src\\backend\\app\\api\\todo_items.py" ], [ "backend\\app\\api\\triage.py", "src\\backend\\app\\api\\triage.py" ], [ "backend\\app\\api\\upload.py", "src\\backend\\app\\api\\upload.py" ], [ "backend\\app\\api\\vision.py", "src\\backend\\app\\api\\vision.py" ], [ "backend\\app\\api\\wecom_jsapi.py", "src\\backend\\app\\api\\wecom_jsapi.py" ], [ "backend\\app\\api\\__init__.py", "src\\backend\\app\\api\\__init__.py" ], [ "backend\\app\\api\\admin\\security_comparison.py", "src\\backend\\app\\api\\admin\\security_comparison.py" ], [ "backend\\app\\api\\admin\\terminal_binding.py", "src\\backend\\app\\api\\admin\\terminal_binding.py" ], [ "backend\\app\\api\\admin\\__init__.py", "src\\backend\\app\\api\\admin\\__init__.py" ], [ "backend\\app\\core\\__init__.py", "src\\backend\\app\\core\\__init__.py" ], [ "backend\\app\\core\\clients\\base.py", "src\\backend\\app\\core\\clients\\base.py" ], [ "backend\\app\\core\\clients\\dify.py", "src\\backend\\app\\core\\clients\\dify.py" ], [ "backend\\app\\core\\clients\\ehr.py", "src\\backend\\app\\core\\clients\\ehr.py" ], [ "backend\\app\\core\\clients\\huorong.py", "src\\backend\\app\\core\\clients\\huorong.py" ], [ "backend\\app\\core\\clients\\lianruan.py", "src\\backend\\app\\core\\clients\\lianruan.py" ], [ "backend\\app\\core\\clients\\ragflow.py", "src\\backend\\app\\core\\clients\\ragflow.py" ], [ "backend\\app\\core\\clients\\__init__.py", "src\\backend\\app\\core\\clients\\__init__.py" ], [ "backend\\app\\data\\seed_rbac.py", "src\\backend\\app\\data\\seed_rbac.py" ], [ "backend\\app\\dependencies\\automation.py", "src\\backend\\app\\dependencies\\automation.py" ], [ "backend\\app\\integrations\\base.py", "src\\backend\\app\\integrations\\base.py" ], [ "backend\\app\\integrations\\dify.py", "src\\backend\\app\\integrations\\dify.py" ], [ "backend\\app\\integrations\\ehr.py", "src\\backend\\app\\integrations\\ehr.py" ], [ "backend\\app\\integrations\\factory.py", "src\\backend\\app\\integrations\\factory.py" ], [ "backend\\app\\integrations\\__init__.py", "src\\backend\\app\\integrations\\__init__.py" ], [ "backend\\app\\integrations\\ehr\\__init__.py", "src\\backend\\app\\integrations\\ehr\\__init__.py" ], [ "backend\\app\\integrations\\huorong\\client.py", "src\\backend\\app\\integrations\\huorong\\client.py" ], [ "backend\\app\\integrations\\huorong\\config.py", "src\\backend\\app\\integrations\\huorong\\config.py" ], [ "backend\\app\\integrations\\huorong\\exceptions.py", "src\\backend\\app\\integrations\\huorong\\exceptions.py" ], [ "backend\\app\\integrations\\huorong\\models.py", "src\\backend\\app\\integrations\\huorong\\models.py" ], [ "backend\\app\\integrations\\huorong\\__init__.py", "src\\backend\\app\\integrations\\huorong\\__init__.py" ], [ "backend\\app\\integrations\\lianruan\\exceptions.py", "src\\backend\\app\\integrations\\lianruan\\exceptions.py" ], [ "backend\\app\\integrations\\lianruan\\models.py", "src\\backend\\app\\integrations\\lianruan\\models.py" ], [ "backend\\app\\integrations\\lianruan\\__init__.py", "src\\backend\\app\\integrations\\lianruan\\__init__.py" ], [ "backend\\app\\middleware\\admin_ip_whitelist.py", "src\\backend\\app\\middleware\\admin_ip_whitelist.py" ], [ "backend\\app\\models\\agent.py", "src\\backend\\app\\models\\agent.py" ], [ "backend\\app\\models\\agent_note.py", "src\\backend\\app\\models\\agent_note.py" ], [ "backend\\app\\models\\approval_link.py", "src\\backend\\app\\models\\approval_link.py" ], [ "backend\\app\\models\\audit_log.py", "src\\backend\\app\\models\\audit_log.py" ], [ "backend\\app\\models\\automation.py", "deploy-temp\\p2p3\\app\\models\\automation.py", "src\\backend\\app\\models\\automation.py" ], [ "backend\\app\\models\\business_contact.py", "src\\backend\\app\\models\\business_contact.py" ], [ "backend\\app\\models\\config_change_log.py", "src\\backend\\app\\models\\config_change_log.py" ], [ "backend\\app\\models\\conversation_annotation.py", "src\\backend\\app\\models\\conversation_annotation.py" ], [ "backend\\app\\models\\conversation_evaluation.py", "src\\backend\\app\\models\\conversation_evaluation.py" ], [ "backend\\app\\models\\diagnostic.py", "src\\backend\\app\\models\\diagnostic.py" ], [ "backend\\app\\models\\employee.py", "src\\backend\\app\\models\\employee.py" ], [ "backend\\app\\models\\exclusion_log.py", "src\\backend\\app\\models\\exclusion_log.py" ], [ "backend\\app\\models\\exclusion_rule.py", "src\\backend\\app\\models\\exclusion_rule.py" ], [ "backend\\app\\models\\funny_phrase.py", "src\\backend\\app\\models\\funny_phrase.py" ], [ "backend\\app\\models\\knowledge_base.py", "src\\backend\\app\\models\\knowledge_base.py" ], [ "backend\\app\\models\\knowledge_suggestion.py", "src\\backend\\app\\models\\knowledge_suggestion.py" ], [ "backend\\app\\models\\login_log.py", "src\\backend\\app\\models\\login_log.py" ], [ "backend\\app\\models\\meetingroom_booking_snapshot.py", "src\\backend\\app\\models\\meetingroom_booking_snapshot.py" ], [ "backend\\app\\models\\meetingroom_guide.py", "src\\backend\\app\\models\\meetingroom_guide.py" ], [ "backend\\app\\models\\meetingroom_repair.py", "src\\backend\\app\\models\\meetingroom_repair.py" ], [ "backend\\app\\models\\neo4j_schema.py", "src\\backend\\app\\models\\neo4j_schema.py" ], [ "backend\\app\\models\\quick_reply_template.py", "src\\backend\\app\\models\\quick_reply_template.py" ], [ "backend\\app\\models\\quiz.py", "src\\backend\\app\\models\\quiz.py" ], [ "backend\\app\\models\\role.py", "src\\backend\\app\\models\\role.py" ], [ "backend\\app\\models\\role_mapping_rule.py", "src\\backend\\app\\models\\role_mapping_rule.py" ], [ "backend\\app\\models\\routing_event.py", "src\\backend\\app\\models\\routing_event.py" ], [ "backend\\app\\models\\software_download.py", "src\\backend\\app\\models\\software_download.py" ], [ "backend\\app\\models\\system_config.py", "src\\backend\\app\\models\\system_config.py" ], [ "backend\\app\\models\\terminal_room_binding.py", "src\\backend\\app\\models\\terminal_room_binding.py" ], [ "backend\\app\\models\\todo_item.py", "src\\backend\\app\\models\\todo_item.py" ], [ "backend\\app\\models\\triage_session.py", "src\\backend\\app\\models\\triage_session.py" ], [ "backend\\app\\models\\troubleshooting_template.py", "src\\backend\\app\\models\\troubleshooting_template.py" ], [ "backend\\app\\models\\user_role.py", "src\\backend\\app\\models\\user_role.py" ], [ "backend\\app\\schemas\\admin.py", "src\\backend\\app\\schemas\\admin.py" ], [ "backend\\app\\schemas\\admin_user.py", "src\\backend\\app\\schemas\\admin_user.py" ], [ "backend\\app\\schemas\\agent.py", "src\\backend\\app\\schemas\\agent.py" ], [ "backend\\app\\schemas\\auth.py", "src\\backend\\app\\schemas\\auth.py" ], [ "backend\\app\\schemas\\automation.py", "deploy-temp\\p2p3\\app\\schemas\\automation.py", "src\\backend\\app\\schemas\\automation.py" ], [ "backend\\app\\schemas\\conversation_annotation.py", "src\\backend\\app\\schemas\\conversation_annotation.py" ], [ "backend\\app\\schemas\\employee.py", "src\\backend\\app\\schemas\\employee.py" ], [ "backend\\app\\schemas\\enums.py", "src\\backend\\app\\schemas\\enums.py" ], [ "backend\\app\\schemas\\evaluation.py", "src\\backend\\app\\schemas\\evaluation.py" ], [ "backend\\app\\schemas\\exclusion.py", "src\\backend\\app\\schemas\\exclusion.py" ], [ "backend\\app\\schemas\\h5.py", "src\\backend\\app\\schemas\\h5.py" ], [ "backend\\app\\schemas\\knowledge_base.py", "src\\backend\\app\\schemas\\knowledge_base.py" ], [ "backend\\app\\schemas\\knowledge_suggestion.py", "src\\backend\\app\\schemas\\knowledge_suggestion.py" ], [ "backend\\app\\schemas\\meetingroom.py", "src\\backend\\app\\schemas\\meetingroom.py" ], [ "backend\\app\\schemas\\qrcode.py", "src\\backend\\app\\schemas\\qrcode.py" ], [ "backend\\app\\schemas\\quick_reply.py", "src\\backend\\app\\schemas\\quick_reply.py" ], [ "backend\\app\\schemas\\role.py", "src\\backend\\app\\schemas\\role.py" ], [ "backend\\app\\schemas\\todo_item.py", "src\\backend\\app\\schemas\\todo_item.py" ], [ "backend\\app\\schemas\\triage.py", "src\\backend\\app\\schemas\\triage.py" ], [ "backend\\app\\schemas\\troubleshooting_template.py", "src\\backend\\app\\schemas\\troubleshooting_template.py" ], [ "backend\\app\\schemas\\wecom.py", "src\\backend\\app\\schemas\\wecom.py" ], [ "backend\\app\\schemas\\__init__.py", "src\\backend\\app\\schemas\\__init__.py" ], [ "backend\\app\\services\\admin_user_service.py", "src\\backend\\app\\services\\admin_user_service.py" ], [ "backend\\app\\services\\asset_service.py", "src\\backend\\app\\services\\asset_service.py" ], [ "backend\\app\\services\\audit_log_service.py", "src\\backend\\app\\services\\audit_log_service.py" ], [ "backend\\app\\services\\auth_service.py", "src\\backend\\app\\services\\auth_service.py" ], [ "backend\\app\\services\\avatar_service.py", "src\\backend\\app\\services\\avatar_service.py" ], [ "backend\\app\\services\\cache_service.py", "src\\backend\\app\\services\\cache_service.py" ], [ "backend\\app\\services\\closing_service.py", "src\\backend\\app\\services\\closing_service.py" ], [ "backend\\app\\services\\dify_triage_service.py", "src\\backend\\app\\services\\dify_triage_service.py" ], [ "backend\\app\\services\\exclusion_service.py", "src\\backend\\app\\services\\exclusion_service.py" ], [ "backend\\app\\services\\funny_phrase_service.py", "src\\backend\\app\\services\\funny_phrase_service.py" ], [ "backend\\app\\services\\itsm_service.py", "src\\backend\\app\\services\\itsm_service.py" ], [ "backend\\app\\services\\knowledge_iteration_service.py", "src\\backend\\app\\services\\knowledge_iteration_service.py" ], [ "backend\\app\\services\\meetingroom_service.py", "src\\backend\\app\\services\\meetingroom_service.py" ], [ "backend\\app\\services\\mfa_service.py", "src\\backend\\app\\services\\mfa_service.py" ], [ "backend\\app\\services\\neo4j_client.py", "deploy-staging-ki\\app\\services\\neo4j_client.py" ], [ "backend\\app\\services\\qrcode_service.py", "src\\backend\\app\\services\\qrcode_service.py" ], [ "backend\\app\\services\\queue_service.py", "src\\backend\\app\\services\\queue_service.py" ], [ "backend\\app\\services\\quiz_generation_service.py", "src\\backend\\app\\services\\quiz_generation_service.py" ], [ "backend\\app\\services\\quiz_service.py", "src\\backend\\app\\services\\quiz_service.py" ], [ "backend\\app\\services\\ragflow_ingestion_service.py", "src\\backend\\app\\services\\ragflow_ingestion_service.py" ], [ "backend\\app\\services\\rbac_service.py", "src\\backend\\app\\services\\rbac_service.py" ], [ "backend\\app\\services\\reminder_service.py", "src\\backend\\app\\services\\reminder_service.py" ], [ "backend\\app\\services\\repair_service.py", "src\\backend\\app\\services\\repair_service.py" ], [ "backend\\app\\services\\role_mapping_service.py", "src\\backend\\app\\services\\role_mapping_service.py" ], [ "backend\\app\\services\\runtime_log_service.py", "src\\backend\\app\\services\\runtime_log_service.py" ], [ "backend\\app\\services\\scoring_service.py", "src\\backend\\app\\services\\scoring_service.py" ], [ "backend\\app\\services\\security_comparison.py", "src\\backend\\app\\services\\security_comparison.py" ], [ "backend\\app\\services\\todo_aggregator_service.py", "src\\backend\\app\\services\\todo_aggregator_service.py" ], [ "backend\\app\\services\\todo_source_service.py", "src\\backend\\app\\services\\todo_source_service.py" ], [ "backend\\app\\services\\triage_service.py", "src\\backend\\app\\services\\triage_service.py" ], [ "backend\\app\\services\\vision_service.py", "src\\backend\\app\\services\\vision_service.py" ], [ "backend\\app\\services\\xylink_service.py", "src\\backend\\app\\services\\xylink_service.py" ], [ "backend\\app\\services\\__init__.py", "src\\backend\\app\\services\\__init__.py" ], [ "backend\\app\\services\\admin\\admin_agent_service.py", "src\\backend\\app\\services\\admin\\admin_agent_service.py" ], [ "backend\\app\\services\\admin\\admin_audit_service.py", "src\\backend\\app\\services\\admin\\admin_audit_service.py" ], [ "backend\\app\\services\\admin\\admin_config_service.py", "src\\backend\\app\\services\\admin\\admin_config_service.py" ], [ "backend\\app\\services\\admin\\admin_dashboard_service.py", "src\\backend\\app\\services\\admin\\admin_dashboard_service.py" ], [ "backend\\app\\services\\admin\\admin_integration_service.py", "src\\backend\\app\\services\\admin\\admin_integration_service.py" ], [ "backend\\app\\services\\admin\\admin_moderation_service.py", "src\\backend\\app\\services\\admin\\admin_moderation_service.py" ], [ "backend\\app\\services\\admin\\admin_monitoring_service.py", "src\\backend\\app\\services\\admin\\admin_monitoring_service.py" ], [ "backend\\app\\services\\admin\\__init__.py", "src\\backend\\app\\services\\admin\\__init__.py" ], [ "backend\\app\\services\\agent\\__init__.py", "src\\backend\\app\\services\\agent\\__init__.py" ], [ "backend\\app\\services\\ai\\__init__.py", "src\\backend\\app\\services\\ai\\__init__.py" ], [ "backend\\app\\services\\automation\\action_registry.py", "src\\backend\\app\\services\\automation\\action_registry.py" ], [ "backend\\app\\services\\automation\\approval.py", "src\\backend\\app\\services\\automation\\approval.py" ], [ "backend\\app\\services\\automation\\context_compressor.py", "src\\backend\\app\\services\\automation\\context_compressor.py" ], [ "backend\\app\\services\\automation\\correction_service.py", "src\\backend\\app\\services\\automation\\correction_service.py" ], [ "backend\\app\\services\\automation\\exception_handler.py", "src\\backend\\app\\services\\automation\\exception_handler.py" ], [ "backend\\app\\services\\automation\\executor.py", "src\\backend\\app\\services\\automation\\executor.py" ], [ "backend\\app\\services\\automation\\information_item_service.py", "src\\backend\\app\\services\\automation\\information_item_service.py" ], [ "backend\\app\\services\\automation\\intent_router.py", "src\\backend\\app\\services\\automation\\intent_router.py" ], [ "backend\\app\\services\\automation\\mapping_resolver.py", "src\\backend\\app\\services\\automation\\mapping_resolver.py" ], [ "backend\\app\\services\\automation\\progress_publisher.py", "src\\backend\\app\\services\\automation\\progress_publisher.py" ], [ "backend\\app\\services\\automation\\rollback.py", "src\\backend\\app\\services\\automation\\rollback.py" ], [ "backend\\app\\services\\automation\\session_manager.py", "src\\backend\\app\\services\\automation\\session_manager.py" ], [ "backend\\app\\services\\automation\\snapshot_service.py", "src\\backend\\app\\services\\automation\\snapshot_service.py" ], [ "backend\\app\\services\\automation\\timeout_cleaner.py", "src\\backend\\app\\services\\automation\\timeout_cleaner.py" ], [ "backend\\app\\services\\automation\\__init__.py", "deploy-temp\\p2p3\\app\\services\\automation\\__init__.py", "src\\backend\\app\\services\\automation\\__init__.py" ], [ "backend\\app\\services\\conversation\\session_collaboration_service.py", "src\\backend\\app\\services\\conversation\\session_collaboration_service.py" ], [ "backend\\app\\services\\conversation\\session_lifecycle_service.py", "src\\backend\\app\\services\\conversation\\session_lifecycle_service.py" ], [ "backend\\app\\services\\conversation\\session_participant_service.py", "src\\backend\\app\\services\\conversation\\session_participant_service.py" ], [ "backend\\app\\services\\conversation\\__init__.py", "src\\backend\\app\\services\\conversation\\__init__.py" ], [ "backend\\app\\services\\core\\__init__.py", "src\\backend\\app\\services\\core\\__init__.py" ], [ "backend\\app\\services\\external\\base.py", "src\\backend\\app\\services\\external\\base.py" ], [ "backend\\app\\services\\external\\cache.py", "src\\backend\\app\\services\\external\\cache.py" ], [ "backend\\app\\services\\external\\config.py", "src\\backend\\app\\services\\external\\config.py" ], [ "backend\\app\\services\\external\\mock.py", "src\\backend\\app\\services\\external\\mock.py" ], [ "backend\\app\\services\\external\\service.py", "src\\backend\\app\\services\\external\\service.py" ], [ "backend\\app\\services\\external\\__init__.py", "src\\backend\\app\\services\\external\\__init__.py" ], [ "backend\\app\\services\\integration\\__init__.py", "src\\backend\\app\\services\\integration\\__init__.py" ], [ "backend\\app\\services\\matchers\\base.py", "src\\backend\\app\\services\\matchers\\base.py" ], [ "backend\\app\\services\\matchers\\category_matcher.py", "src\\backend\\app\\services\\matchers\\category_matcher.py" ], [ "backend\\app\\services\\matchers\\intent_matcher.py", "src\\backend\\app\\services\\matchers\\intent_matcher.py" ], [ "backend\\app\\services\\matchers\\keyword_matcher.py", "src\\backend\\app\\services\\matchers\\keyword_matcher.py" ], [ "backend\\app\\services\\matchers\\regex_matcher.py", "src\\backend\\app\\services\\matchers\\regex_matcher.py" ], [ "backend\\app\\services\\matchers\\__init__.py", "src\\backend\\app\\services\\matchers\\__init__.py" ], [ "backend\\app\\tasks\\quiz_generation_task.py", "src\\backend\\app\\tasks\\quiz_generation_task.py" ], [ "backend\\app\\tasks\\reminder_task.py", "src\\backend\\app\\tasks\\reminder_task.py" ], [ "backend\\app\\utils\\env_gating.py", "src\\backend\\app\\utils\\env_gating.py" ], [ "backend\\app\\utils\\error_codes.py", "src\\backend\\app\\utils\\error_codes.py" ], [ "backend\\app\\utils\\itsm_signer.py", "src\\backend\\app\\utils\\itsm_signer.py" ], [ "backend\\app\\utils\\logging_config.py", "src\\backend\\app\\utils\\logging_config.py" ] ], "texts": { "README.md": "# 企微智能IT支持服务台 (IT Smart Desk)\n\n> **环境状态**: 预生产(独立主机,共享域名)→ 正式环境迁移 K8s \n> **维护者**: 税友集团 IT支持组(宋献) \n> **最后更新**: 2026-06-03\n\n---\n\n## 📖 阅读指南(按对象)\n\n| 阅读对象 | 推荐文档 | 内容 |\n|---------|---------|------|\n| **新人/产品经理** | 本文档 + docs/ARCHITECTURE.md 前半部分 | 项目背景、功能清单、如何使用 |\n| **开发人员** | docs/ARCHITECTURE.md + backend/app/ 代码 | 架构设计、API 接口、数据模型、开发规范 |\n| **运维/部署人员** | 本文档「部署」章节 + scripts/deploy.sh | Docker 编排、Nginx 配置、环境变量 |\n| **测试人员** | docs/ARCHITECTURE.md 「任务清单」 | 功能模块划分、待完善项 |\n\n---\n\n## 🎯 项目背景\n\n税友集团内部 IT 支持渠道分散(企微群、电话、走访),缺乏统一 SLA 追踪。本项目构建一个 **AI + 人工坐席协作** 的智能服务台:\n\n- **员工端**(H5):企微 OAuth2 免登,AI 自动回复 + 人工兜底,支持「敲桌子」趣味呼叫\n- **坐席端**(Web):三栏工作台,会话分配/抢单/协作/转接,实时 WebSocket 推送\n- **AI 层**:接入 RAGFLOW/Dify 知识库,自动回复常见 IT 问题\n\n**核心指标**:AI 自助解决率 55%(实际 1-5月已达 70.2%)\n\n---\n\n## ✅ 当前实现进度\n\n### 后端(FastAPI + PostgreSQL + Redis)\n- [x] 企微回调加解密(AES-CBC-256)\n- [x] 消息路由(VIP 识别、紧急度评分 1-5、标记检测)\n- [x] WebSocket 实时推送(心跳、重连、定向广播)\n- [x] 会话全生命周期(创建→分配→处理→结单→转接)\n- [x] 坐席管理(登录、状态切换、在线列表)\n- [x] H5 端 OAuth2 认证、审批链接、软件下载\n- [x] 应急模式(系统故障时手动开启)\n- [x] Alembic 数据库迁移(初始表结构)\n- [ ] **AI 回复集成**(需接入 Dify,目前新会话直接进入队列)\n- [ ] 自动化测试(pytest)\n\n### 坐席前端(Vue 3 + Element Plus)\n- [x] 登录页(用户ID + 姓名,无密码)\n- [x] 三栏工作台(会话列表 + 对话区 + AI 助手面板)\n- [x] 6 分区会话列表(待接单/我的/协作/其他坐席/AI处理/已结单)\n- [x] 协作功能(摇人邀请、接受/拒绝)\n- [x] WebSocket + 轮询双模式(自动降级)\n- [ ] 操作步骤、风险提示、用户信息面板(需确认后端数据)\n\n### 员工前端(Vue 3 + Vant)\n- [x] OAuth2 静默授权登录\n- [x] 聊天界面(员工/坐席/AI/系统 4 种消息气泡)\n- [x] 「敲桌子」呼叫坐席(7 种 SVG 动画)\n- [x] AI 助手面板、审批流程链接、软件下载\n- [ ] AI 回复展示(依赖后端 AI 集成)\n\n### 部署\n- [x] Docker Compose 4 容器编排(nginx + backend + postgres + redis)\n- [x] Nginx 反向代理(与数据平台共享域名,独立主机部署)\n- [x] 部署脚本(build.sh + deploy.sh)\n- [ ] HTTPS 启用(nginx.conf 已预留模板)\n- [ ] **预生产环境验证**(独立主机,路径路由到数据平台远程主机)\n\n---\n\n## 🚀 快速启动\n\n### 前置条件\n- Docker Desktop / Docker Compose\n- 企微企业应用(需配置 Token、EncodingAESKey、CorpID)\n- 公钥上传至服务器(部署用)\n\n### 本地开发\n```bash\n# 1. 复制环境变量\ncp .env.example .env\n# 编辑 .env 填入企微凭据和数据库密码\n\n# 2. 启动数据库(仅 PostgreSQL)\ndocker compose up -d postgres redis\n\n# 3. 后端开发模式\ncd backend\npython -m venv venv && venv\\Scripts\\activate\npip install -r requirements.txt\nuvicorn app.main:app --reload\n\n# 4. 前端开发模式(另开终端)\ncd frontend-agent\nnpm install && npm run dev\n```\n\n### 预生产部署\n> **注意**:预生产环境中,智能咨询系统与数据平台在不同主机上。部署前需将 `nginx/nginx.conf` 中 `DATAQUERY_HOST` 替换为数据平台实际 IP。\n\n```bash\n# 1. 修改 nginx 反代地址\n# 编辑 nginx/nginx.conf,将 DATAQUERY_HOST 改为数据平台主机 IP\n\n# 2. 使用部署脚本\nbash scripts/deploy.sh deploy\n\n# 3. 或手动\ndocker compose up -d --build\n```\n\n> 正式环境将迁移到 K8s 集群,届时部署方式另行调整。\n\n---\n\n## 📂 项目结构\n\n```\nwecom_it_smart_desk/\n├── backend/ # FastAPI 后端\n│ ├── app/\n│ │ ├── api/ # 8 个路由模块\n│ │ ├── models/ # 9 个数据模型\n│ │ ├── services/ # 核心服务(消息路由、会话管理、企微API)\n│ │ ├── schemas/ # Pydantic 请求/响应 Schema\n│ │ └── utils/ # 加解密、Token管理、WebSocket\n│ └── alembic/ # 数据库迁移\n├── frontend-agent/ # 坐席工作台(Vue 3 + Element Plus)\n├── frontend-h5/ # 员工端(Vue 3 + Vant)\n├── nginx/ # Nginx 反向代理配置\n├── scripts/ # 构建和部署脚本\n├── docs/ # 项目文档(架构/PRD/测试报告等)\n└── docker-compose.yml # 容器编排\n```\n\n---\n\n## 🔧 核心配置项(.env)\n\n| 变量 | 说明 | 示例 |\n|------|------|------|\n| `WECOM_CORPID` | 企微企业ID | `ww...` |\n| `WECOM_AGENT_TOKEN` | 企微应用 Token | `your_token` |\n| `WECOM_AGENT_ENCODING_AES_KEY` | 企微消息加解密密钥 | `32位Base64` |\n| `DATABASE_URL` | 数据库连接串 | `postgresql+asyncpg://...` |\n| `REDIS_URL` | Redis 连接串 | `redis://...` |\n| `BACKEND_PORT` | 后端端口(容器内需 8000) | `8000` |\n\n---\n\n## 📊 API 端点概览\n\n| 模块 | 端点前缀 | 核心功能 |\n|------|---------|---------|\n| 坐席管理 | `/api/v1/agents` | 登录、状态切换、在线列表 |\n| 会话管理 | `/api/v1/conversations` | 列表、详情、分配、结单、转接 |\n| 消息管理 | `/api/v1/messages` | 消息列表、发送、轮询 |\n| 企微回调 | `/api/v1/wecom` | GET 验证、POST 接收消息 |\n| H5 员工端 | `/api/v1/h5` | OAuth2、消息、举手、审批 |\n| 快速回复 | `/api/v1/quick-replies` | 模板 CRUD |\n| 系统 | `/api/v1/system` | 应急模式开关 |\n\n> 详细请求/响应格式见 `docs/ARCHITECTURE.md` 或运行后访问 `/docs`(Swagger UI)\n\n---\n\n## 🐛 已知问题 / 待完善\n\n1. **AI 回复未集成**:目前新会话直接进入 `queued` 状态,需接入 Dify 工作流\n2. **无自动化测试**:后端 pytest、前端 Vitest 均未配置\n3. **Alembic 迁移不完整**:仅初始迁移,后续模型变更需手动管理\n4. **HTTPS 未启用**:nginx.conf 有模板但未配置证书\n5. **VIP 缓存未实现**:`message_router.py` 中 Redis 缓存被注释\n\n---\n\n## 📝 相关文档\n\n- **docs/01-项目总览与部署手册.md**:完整项目背景、架构设计、部署运维(本文档的详细版本)\n- **docs/智能IT服务系统运维手册.md**:统一运维文档,涵盖部署/监控/故障处理\n- **scripts/deploy.sh**:部署脚本详细说明(5 种运行模式)\n- **docs/archive/**:历史版本文档归档\n\n---\n\n## 📞 联系\n\n- **项目负责人**:宋献 — 税友集团 IT支持组\n- **企业微信**:通过内部企微联系\n- **Issue 反馈**:在项目目录创建任务文档或联系开发组\n\n---\n\n*最后更新:2026-06-03 - 合并文档,反映当前实际完成进度*\n\n---\n\n## 🏛️ 仓库与治理\n\n- **Gitea 仓库(公网 Funnel)**: `https://ds923plus.tail58d872.ts.net/simon/wecom_it_smart_desk`\n- **Gitea 内网地址(LAN 加速)**: `http://100.85.152.112:8418/simon/wecom_it_smart_desk`\n- **贡献指南**: [`CONTRIBUTING.md`](CONTRIBUTING.md) — 分支模型 + Commit 规范 + PR 流程\n- **评审报告**: [`docs/评审报告/`](docs/评审报告/) — 历次 workbuddy 推送评审\n- **风险跟踪表**: [`docs/风险跟踪表.md`](docs/风险跟踪表.md) — 22 项审计追踪\n- **workbuddy 记忆**: [`.workbuddy/memory/`](.workbuddy/memory/) — workbuddy 启动读这里接任务\n\n### 评审与提交约定\n\n- 🔴 **所有 P0 鉴权修复必须走评审**(`docs/评审报告/` 留档,含 workbuddy 推送)\n- 🟡 **端点变更需 `Depends(get_current_agent)` 或 `_get_current_employee` 鉴权依赖**\n- 🟡 **数据库 schema 变化必须 alembic 迁移**(无手动 ALTER)\n- 🟢 **workbuddy 推送前自检**: 鉴权 + 依赖 + alembic + 配置 4 件套\n- 🟢 **任何部署包 / SSL 私钥 / 推送 token 不入仓**(见 `.gitignore`)\n\n", "CHANGELOG.md": "# 变更日志 (Changelog)\n\n本项目的所有重要变更都会记录在此文件。\n\n格式基于 [Keep a Changelog](https://keepachangelog.com/zh-CN/1.1.0/),\n本项目遵循 [语义化版本](https://semver.org/lang/zh-CN/)。\n\n## [未发布] - 2026-07-13\n\n### 🚀 功能增强 (Features)\n\n#### Agent 坐席端 v5 — AI 结构化消息 + 思考指示器(2026-07-13 01:38 部署)\n- **ai_structured 只读渲染**:坐席端 `MessageBubble.vue` 新增 AI 结构化消息渲染分支(文字 + 只读选项标签 + 推荐摘要)\n- **byod_card 渲染**:补全之前缺失的 `byod_card` 消息类型渲染分支\n- **AI 思考指示器**:`ChatArea.vue` 新增 `aiThinkingText` 计算属性 + 脉冲动画 CSS,坐席可实时看到 AI 正在思考\n- **handleNewMessage 透传修复**:修复 `msg_type` 和 `extra_data` 硬编码为 `'text'` 的问题,正确透传消息类型\n- **ai_thinking 双推**:后端 `ai_thinking` WS 消息同时推送给员工端和坐席端\n- 验证:JS hash `index-2BTn4SZz.js` ✅,5 容器全部 healthy ✅\n\n#### H5 员工端 v4 — 人工坐席交互改造(#116, 2026-07-13 部署)\n- **人工按钮三态文案统一**为\"人工坐席\"(原\"人工(需更多对话)\"等多态文案)\n- **按钮位置调整**:移至发送键 + 语音转文字图标上方(`.input-bar__controls` 容器内垂直堆叠)\n- **删除 CallAgentModal 弹窗动画**:点击按钮直接调用 `store.shakeAgent()`,无中间浮窗\n- **截图快捷键提示改版**:改为\"截图->粘贴:Alt+Shift+A-Ctrl+V ---> Ctrl+V\",排列在工具图标后\n- **移动端隐藏截图提示**:CSS `@media (max-width: 768px)` 媒体查询\n- **AI 转人工提示**:\"已为您呼叫人工坐席,请稍等!\"(原\"少主,折旧为您去摇人,稍等….\")\n- **坐席接入提示**:\"坐席正在查看您的信息,请等待处理回复!\"(原\"坐席已为您服务,请稍后….\")\n- **删除\"摇铃呼叫坐席\"入口和文案**\n- **清理孤儿组件** `MessageList.vue`(全项目无引用)\n- **删除 CSS** `@keyframes shake` 动画及相关变量\n- **DB 同步**:PostgreSQL `funny_phrases` 表 3 条记录(shake/connected/keyword)UPDATE\n- 验证:JS hash `index-eQVEQIDL.js` → `index-B6dzwk-X.js` ✅,JS 包内容检查通过\n\n#### AI 对话链路全栈改造 Phase 1-6(#59-#69, 2026-07-13 01:38 生产部署)\n- **Phase 1 ✅**:Dify Prompt JSON 输出 + 后端 blocking + JSON 解析 + 双 WS 推送 + 错误降级(30s 超时 / 15s still_thinking)\n- **Phase 2 ✅**:审批关键词收窄(~40→~25 强意图词)+ 两级分类 Prompt v4.0(4粗→12细)+ 删除前端 `checkApprovalIntent()`\n- **Phase 3 ✅**:WS 扩展(`ai_thinking` + `dynamic_recommend`)+ `MessageBubble` ai_structured 渲染 + `RightPanel` v2(手风琴 + 底部标签)+ `DynamicRecommend.vue`(新建)+ `sendOptionSelect` WS 回传\n- **Phase 4 ✅**:`VisionService` 接入(`_enrich_image_content` + `_fetch_recent_employee_text` 5秒融合)+ 图片消息跳过关键词拦截 + 降级策略\n- **Phase 5 ✅**:坐席端 `ai_thinking` WS + 指示器 UI + `MessageBubble` ai_structured/byod_card 渲染 + `handleNewMessage` 修复\n- **Phase 6 ✅**:`diagnosis_stage` 字段(6种值)→ `closing_service` 辅助方法 + `response_time_ms` 计时 + 慢响应告警(>10s)\n\n#### 上下文感知智能诊断→修复闭环(2026-07-12 部署)\n- **三层诊断**:API → Script → AI 递进式诊断\n- **三段排队**:VIP → info_locked → not locked\n- **答题插队**:员工答题期间优先处理\n- **五场景关闭**:五种场景自动关闭会话\n- 后端:迁移 052(6表+6列)/ `queue_service` / `quiz_service` / `closing_service` / `seed_quiz` / 每日3:00定时生成\n- H5 前端:`QueueWaiting` / `RightPanel` 双Tab / `InputBar` 三态\"人工\"按钮 / `ResolveConfirmCard`\n- 坐席前端:`pending_close` 结单流程;信息锁定(Dify 步骤完成 + 有效回答率≥70%)\n\n#### 坐席端布局优化 v2.0(2026-07-12 部署)\n- 8 新增 + 7 修改 + 3 删除\n- `QuickReplyBar` L1+L2 悬浮;`ReplyBox` 左右分区;右栏 260↔560px 模式切换\n- **键盘快捷键 v2.3**:纯数字 1~9 上下文路由(AI/L1/L2);ESC 分层撤销;Shift+Space 用 `event.code` 匹配(不受 IME 影响)\n- `useKeyboardShortcuts.ts` 中央管理器,IME/ScreenCapture 守卫\n\n#### 知识库迭代 3 功能(2026-07-12 部署)\n- 分诊交互(H5+坐席+Dify 独立应用)\n- 拓扑预览(ECharts 只读)\n- 代答排除(4种匹配器)\n- 44 文件 43 测试通过;迁移 051\n\n### 🐛 缺陷修复 (Bug Fixes)\n- 修复:代办事项企微审批 API 返回空列表(8 个问题逐一修复)\n 1. `WECOM_APPROVAL_SECRET` 未注入容器 → docker-compose.yml 添加环境变量\n 2. Redis 无密码认证 → Redis command 添加 `--requirepass`\n 3. Docker bind mount `./app:/app/app` 丢失 → 恢复卷挂载\n 4. 企微 `getapprovaldata` API 已废弃(404) → 改用 `getapprovalinfo` 新 API(`new_cursor` 分页 + `sp_no_list`)\n 5. `token_manager.py` 两处 `cached.decode(\"utf-8\")` 报错 → `isinstance` 安全检查(Redis `decode_responses=True` 返回 str)\n 6. errcode=60020 IP 不在\"审批\"应用白名单 → 改用 `TokenManager`(IT 支持应用 Secret,IP 已在白名单)\n 7. errcode=301025 invalid filter → 企微 API 每个 filter key 只能出现一次,去掉 API 层 template_id 过滤,改代码层过滤\n 8. `_extract_current_approver` 字段名全错 → `record.status` 改 `record.sp_status`,`record.approver[]` 改 `record.details[].approver.userid`(经 JSON dump 确认实际 API 返回结构)\n- 修复:验证通过,sxn 名下 2 条审批待办正确返回(IT 资产外修申请)\n- 修复:nginx 容器配置丢失导致页面加载失败\n- 修复:后端 h5.py `_require_wework_ua` NameError 导致 OAuth 认证失败\n\n### 🔐 安全 (Security)\n- P0:WS token 改走 `Sec-WebSocket-Protocol` subprotocol(已修)\n- P0:坐席登录加 `password_hash` bcrypt 字段\n- P0:`/ws/` 路径 nginx access_log 关闭\n- P0:5 鉴权漏洞全部修复(消息 5 端点)\n- WECOM_SECRET 集中化(待 NAS Vault)\n- Gitea 凭据走 wincred,不入文件\n\n### 🏗️ 基础设施 (Infrastructure)\n- 蓝绿部署支持:新增 docker-compose-green.yml、switch-blue-green.sh、nginx-green-upstream.conf\n- Green 环境端口:后端 5002,Nginx 5080/5443\n- Gitea 自托管部署(Synology 套件 8418 端口)\n- Tailscale Funnel 暴露给 workbuddy 沙箱\n- 分支保护:main 需 PR + 1 reviewer\n- workbuddy-claude 配 access token + 自动跑批\n- 备份脚本(7 天保留 + cron 3 点)\n- **服务器部署路径修正**:确认服务器项目根路径 `/opt/wecom-it-desk/`,所有前端 dist 均为 ro bind mount\n- **前端部署命令模板**:`H5_DIR=/opt/wecom-it-desk/frontend-h5/dist && cp -r $H5_DIR ${H5_DIR}_bak && rm -rf $H5_DIR/* && tar -xzf /tmp/h5-dist-vX.tar.gz -C $H5_DIR/ && docker exec wecom_it_nginx nginx -s reload`\n\n### 📚 文档 (Documentation)\n- 新增 8 份审计/设计报告(Dockerfile / ER / 依赖 / 健康检查 / CORS / 一键部署 / 健康度 / 惊喜汇总)\n- 4 份 ADR(ADRs 001-004)\n- 4 份 SOP(SOPs 001-004)\n- 2 份路线图(阶段 1 盘点 + 阶段 4-5 规划)\n- Wingman 设计文档\n- 4 前端审计 + 16 项统一优化路线\n- AI 对话链路全栈改造实施计划 v1.0(`docs/02-产品需求/AI对话链路全栈改造实施计划-v1.0.md`)\n\n### 🛠️ 工具链 (Tooling)\n- `scripts/pre-commit-check.sh`:4 件套预检(鉴权+依赖+alembic+配置)\n- `scripts/backup-gitea.sh`:Gitea 备份 + 恢复\n- `scripts/security-audit.sh`:5 工具集成审计\n- `scripts/generate-api-docs.sh`:OpenAPI + Swagger UI + ReDoc\n- `scripts/dashboard.py`:项目健康度仪表盘\n- `scripts/oneclick-deploy.sh`:一键部署\n\n---\n\n## [0.5.0] - 2026-05-30\n\n### ✨ 新增 (Added)\n- 阶段 1 完成度 66%(47 项功能盘点)\n- H5 员工端完整功能(11 组件)\n- 坐席工作台三栏(23 组件)\n- 管理后台 13+ 视图\n- 统一入口 portal\n- WebSocket 实时通信\n- WebSocket fallback 轮询\n- Dify AI 集成(基础)\n- 4 个外部系统集成(火绒/联软/aTrust/eHR)\n- 快速回复 + 排障模板 + 待办事项\n\n### 🐛 修复 (Fixed)\n- 5 鉴权漏洞\n- WS token 泄露到 URL 和日志\n- 坐席登录缺 password\n- Mock login bypass\n\n### 📈 性能 (Performance)\n- 4 前端路由级代码分割\n- WebSocket 长连接(替代轮询)\n- 模板缓存(Redis)\n\n---\n\n## [0.4.0] - 2026-04-15\n\n### ✨ 新增\n- RBAC 角色管理(user/agent/admin)\n- 角色自动映射(企微标签 + eHR 字段)\n- 配置变更日志(审计)\n- 趣味话术(摇人/等待/接入)\n- 审批流程链接\n- 软件下载入口\n\n### 🐛 修复\n- 部门权限粒度\n- 紧急度评分算法\n- VIP 标记自动匹配\n\n---\n\n## [0.3.0] - 2026-03-01\n\n### ✨ 新增\n- AI 草稿回复(坐席采纳)\n- AI 实质性回复计数\n- 紧急度评分(1-5)\n- 标签系统(举手/情绪/需介入)\n- 影响范围评估\n- 阻断性标记\n\n---\n\n## [0.2.0] - 2026-01-15\n\n### ✨ 新增\n- 4 前端基础架构(Vue 3 + Vite + TS + Pinia)\n- 16 张数据表\n- 核心 API(40+ 端点)\n- OAuth2 企微登录\n- 消息收发(文本/图片/文件/语音)\n- 会话分配/抢单/转接\n- 协作坐席(摇人)\n- 邀请功能(P0-09~11)\n\n---\n\n## [0.1.0] - 2025-12-01\n\n### ✨ 初始版本\n- 项目初始化\n- 基础 FastAPI 框架\n- SQLAlchemy 2.0 + async\n- Alembic 迁移\n- Docker Compose 编排\n- 4 前端工程搭建\n- 企微回调基础\n\n---\n\n## 版本说明\n\n- **0.x.y** - 阶段 1-5 演进(0.1-0.5 已发布,0.6+ 阶段 2 启动)\n- **1.0.0** - 正式版目标(预计 2026-12,阶段 5 完成后)\n\n> 📌 **文档同步说明**:各版本的详细变更记录请参考 `docs/archive/RELEASE_NOTES_*.md`,本文档仅保留版本概览。\n\n## 图例\n\n- ✨ 新增 - 新功能\n- 🐛 修复 - Bug 修复\n- 📈 性能 - 性能优化\n- 🔐 安全 - 安全修复\n- ⚠️ 弃用 - 即将移除\n- 🏗️ 基础设施 - 部署/工具/流程\n- 📚 文档 - 文档更新\n- 🛠️ 工具链 - 工具脚本\n\n[未发布]: https://gitea.simon.local/simon/wecom/wecom_it_smart_desk/compare/v0.7.0...HEAD\n\n## [v0.7.1] - 2026-06-23(规划中)\n\n> **决策背景**(2026-06-22):v0.7.0.1-hotfix1(QR 码生成)上线后,生产仍报 2 个 bug:\n> - 员工/坐席扫码登录报错(`/api/auth_qrcode/scan` 失败)\n> - 管理员 sxn 登录报错(`agents.otp_secret` 列不存在 — alembic 010 未跑)\n> 用户决策:**不再修 7.0.1**,直接进 v0.7.1 统一治理。\n\n### 🔧 修复 (Fixed)\n\n#### P0 — 登录失败\n- **管理员 sxn 登录报错**:根因 — alembic 010 `agents.otp_secret` 列未在生产数据库创建\n - 修复:合并 `otp_secret/otp_enabled`(010)与 `mfa_secret/mfa_enabled`(023)双字段,模型统一引用 `mfa_secret/mfa_enabled`\n - migration:重写 021_rbac(原文件丢失),统一 010-025 chain\n- **员工/坐席扫码登录报错**:根因待查(预计 ticket 状态机 / WecomService 初始化 / 高并发 session)\n - 修复:在 dev 复现,出 patch\n\n#### P0 — 基础设施\n- **修 `/api/ready` import error**(原 defer to v0.7.1)\n- **审计 alembic chain**:`021_rbac` 缺失 / 022-025 chain 错乱,出 `docs/alembic_history_audit.md`\n\n### 🆕 新增 (Added)\n\n#### P1 — 体验优化\n- **企微入口 SSO**(原 v0.7.1+ backlog):识别 WeChat Work User-Agent,自动识别员工身份 + 跳对应端点,扫码登录降级为 fallback\n\n#### P1 — 权限\n- **管理后台 RBAC 细粒度角色权限**:5 角色 + 4 资源 + 4 操作 + 3 数据范围\n\n### 📝 文档 (Documentation)\n- `docs/DEPLOY-QUICK-v0.7.1.md` — 一键部署操作包(基于 7.0 模板)\n- `docs/alembic_history_audit.md` — chain 审计报告\n- `docs/USER-GUIDE-WECOM-SSO.md` — 企微 SSO 用户手册\n\n---\n\n## [v0.7.0] - 2026-06-21\n\n### 🎉 新增 (Added)\n\n#### 扫码登录(阶段 1.1-1.3)\n- 后端 `app/api/auth_qrcode.py` (236 行) — 4 端点 create / poll / scan / confirm\n- 后端 `app/services/qrcode_service.py` (487 行) — 业务逻辑 + dev 模式 mock OAuth\n- 后端 `app/schemas/qrcode.py` (127 行) — Pydantic 模型\n- 后端 alembic migration 022_qrcode_login(数据存 Redis,无 schema 变更)\n- 前端 `frontend-agent/src/views/Login.vue` — ElementPlus 扫码 UI + 倒计时\n- 前端 `frontend-portal/src/views/QrcodeLogin.vue` — 角色自动分发\n- 前端 `useQrcodeLogin.ts` composable (agent + portal 双端) — 2s 轮询 + 120s TTL\n- 前端 `frontend-portal/src/router/index.ts` — 默认 `/` 跳 `/qrcode-login`\n- 文档 `docs/NGINX-DOMAIN-ROUTING.md` — 单域名 + 多路径架构\n- 文档 `docs/USER-GUIDE-QRCODE-MFA.md` — 员工/坐席/管理员用户手册\n\n#### MFA 二次认证(阶段 2.1-2.4)\n- 后端 `app/api/mfa.py` (389 行) — 6 端点:status / bind/start / bind/confirm / verify / disable / admin/reset\n- 后端 `app/services/mfa_service.py` (179 行) — pyotp TOTP + Redis verified TTL 1800s\n- 后端 `app/models/agent.py` — mfa_secret / mfa_enabled / mfa_bound_at / mfa_last_verified_at\n- 后端 alembic migration 023_mfa_fields — User MFA 4 列\n- 前端 `frontend-agent/src/api/mfa.ts` — 5 个用户端 API\n- 前端 `frontend-agent/src/views/MfaBind.vue` — 4 步绑定流程\n- 前端 `frontend-agent/src/composables/useHighRiskOtp.ts` — 高危弹窗 30 分钟超时\n- 前端 `frontend-admin/src/api/mfa.ts` — 管理员视角 API\n- 前端 `frontend-admin/src/views/MfaManage.vue` — MFA 管理表格(搜索/过滤/分页)\n\n#### 高危操作守卫(阶段 1.3 task #19)\n- 后端 `app/services/high_risk_guard.py` (291 行) — HighRiskGuard service 类\n- 后端 `app/api/high_risk_routes.py` (327 行) — 演示端点 + 白名单查询\n- 后端 `app/dependencies.py` — HIGH_RISK_OPERATIONS 5 类白名单 + require_high_risk_otp 依赖\n- 5 类高危操作:改权限 / 改配置 / 导出数据 / 封号 / 新增账号或重置\n\n### 🐛 修复 (Fixed)\n- WS endpoint `missing argument 'request'` 错误(加 8 个回归测试)\n- messages.id VARCHAR → UUID(migration 025,加 8 个兼容测试)\n- wordfilter API 适配(1.0.6:Wordfilter 实例 + addWords + blacklisted)\n- conftest SQLite ARRAY/JSONB 编译补丁(quiz.keywords / themes.palette)\n- conftest autouse 业务表清理(feedback 事务隔离)\n- h5_client 用 127.0.0.1 跳过企微 UA 检测\n- test_conversation_grab wecom mock 默认 name 不覆盖 body.name\n- Gitea push token 从 URL 清理(`http://workbuddy-claude@...`)\n\n### 🔐 安全 (Security)\n- 高危操作必须过 OTP 二次验证(管理员 30 分钟内)\n- WS 推送端点签名保护(防 request: Request 加回去)\n- nginx access_log 脱敏脚本(删 Authorization / Cookie)\n- 5 鉴权漏洞已修(2026-06-14 评审清单)\n\n### 📚 文档 (Documentation)\n- `docs/E2E-CHECKLIST-v0.7.0.md` (176 行) — 35 项 E2E 验收清单\n- `docs/DEPLOY-QUICK-v0.7.0.md` (252 行) — 一键部署操作包(分步+回滚+预计时间)\n- `docs/DEPLOY-LOGIN-MIGRATION-v0.7.0.md` (220 行) — 部署手册\n- `docs/NGINX-DOMAIN-ROUTING.md` (256 行) — nginx 域名分发\n- `docs/USER-GUIDE-QRCODE-MFA.md` (165 行) — 用户手册\n\n### 📈 测试 (Test)\n- 新增 78 测试全过(扫码 13 + MFA 21 + 高危 28 + WS/UUID 16)\n- 4 xfailed(端点路径不一致 pre-existing,已标 xfail)\n- 修 5 处 pre-existing 失败(+27 测试):content_moderation / conversation_grab / feedback / h5_oauth / SQLite 编译\n- 全量 pytest: 470 passed, 4 xfailed, 64 failed(pre-existing 设计问题)\n\n### 📦 Commits(本次 session 5 个)\n- `1255e95` docs: v0.7.0 一键部署操作包\n- `c33abb6` fix(tests): h5_client 用 127.0.0.1 跳过企微 UA 检测\n- `a9b97de` fix(tests): wordfilter API 适配 + SQLite ARRAY/JSONB 补丁 + 事务隔离\n- `e96fbb2` docs: v0.7.0 E2E 验收清单\n- `bf872da` feat(merge): 4 个 worktree 合入 main(扫码+MFA+高危+P0)\n\n[0.7.0]: https://gitea.simon.local/simon/wecom_it_smart_desk/compare/v0.6.0...v0.7.0\n[0.5.0]: https://gitea.simon.local/simon/wecom_it_smart_desk/releases/tag/v0.5.0\n[0.4.0]: https://gitea.simon.local/simon/wecom_it_smart_desk/releases/tag/v0.4.0\n[0.3.0]: https://gitea.simon.local/simon/wecom_it_smart_desk/releases/tag/v0.3.0\n[0.2.0]: https://gitea.simon.local/simon/wecom_it_smart_desk/releases/tag/v0.2.0\n[0.1.0]: https://gitea.simon.local/simon/wecom_it_smart_desk/releases/tag/v0.1.0\n", "CONTRIBUTING.md": "# 贡献指南 (CONTRIBUTING)\n\n**适用范围**: 企微 IT 智能服务台 (`wecom_it_smart_desk`)\n**维护者**: 宋献(项目负责人)+ Claude(评审协作)+ workbuddy(自动化开发)\n**最后更新**: 2026-06-14\n\n---\n\n## 📌 仓库入口\n\n- **Gitea(公网 Funnel)**: `https://ds923plus.tail58d872.ts.net/simon/wecom_it_smart_desk`\n- **Gitea(内网 LAN)**: `http://100.85.152.112:8418/simon/wecom_it_smart_desk`\n- **Tailscale 私网**: `100.85.152.112:8418`\n\n---\n\n## 🌿 分支模型\n\n| 分支 | 用途 | 保护规则 |\n|---|---|---|\n| `main` | 稳定可发布版本 | 🔒 禁止直推,需 PR + 1 reviewer |\n| `develop` | 主开发分支 | 🟡 允许 push |\n| `feature/*` | 新功能(从 develop 拉) | 🟢 自由 |\n| `hotfix/*` | 紧急修复(从 main 拉) | 🟢 自由,合入需评审 |\n| `release/*` | 发布准备 | 🟡 自由,合入 main 需评审 |\n\n**主分支**: `main`(默认推送目标)\n\n---\n\n## 📝 Commit 规范\n\n**格式** (Conventional Commits):\n\n```\n(): \n\n\n\n