Files
wecom_it_smart_desk/.workbuddy/audit_content.json

2085 lines
134 KiB
JSON
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{
"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/keywordUPDATE\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.04粗→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- 后端:迁移 0526表+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.02026-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 支持应用 SecretIP 已在白名单)\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 环境端口:后端 5002Nginx 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<type>(<scope>): <subject>\n\n<body>\n\n<footer>\n```\n\n**type 取值**:\n\n| type | 用途 | 示例 |\n|---|---|---|\n| `feat` | 新功能 | `feat(messages): 撤回消息端点` |\n| `fix` | Bug 修复 | `fix(h5): 修复参与者权限校验` |\n| `refactor` | 重构(无新功能 / 无 Bug 修复) | `refactor(agents): 提取鉴权中间件` |\n| `docs` | 文档变更 | `docs: 评审报告 workbuddy-2026-06-14` |\n| `chore` | 构建/工具/依赖 | `chore: 强化 .gitignore` |\n| `security` | 安全相关 | `security: P0 鉴权止血` |\n| `perf` | 性能优化 | `perf(messages): 消息批量插入` |\n| `test` | 测试相关 | `test: 加 mark_read 鉴权测试` |\n\n**scope 取值**: 模块名,如 `agents` / `messages` / `h5` / `frontend-agent` / `nginx` / `workbuddy`\n\n**subject**: 中文,不超过 50 字,**祈使句**,如 \"修复 xx\" 而非 \"修复了 xx\"\n\n**body** (可选): 详细说明,**每行 ≤ 72 字**\n\n**footer** (可选): 关联 Issue / workbuddy 任务编号,如:\n```\nRefs: #18\nRefs: workbuddy-2026-06-14-任务-修遗留\n```\n\n**示例**:\n```\nsecurity(ws): WS token 从 URL 改 header 鉴权\n\n【workbuddy 推送 2026-06-14】\n- ws.py 服务端: 优先 Authorization: Bearer header, query 降级\n- ws.ts 前端: 待 workbuddy 改 Sec-WebSocket-Protocol 方案\n- 详见 docs/评审报告/workbuddy-2026-06-14-P0安全.md\n\nRefs: #18\nRefs: workbuddy-2026-06-14-任务-修遗留\n```\n\n---\n\n## 🔄 PR 流程\n\n### 推送前自检清单\n\n**所有 P0 修复推送前必须 4 件套自检**:\n\n- [ ] **鉴权**: 新增/修改端点是否有 `Depends(get_current_agent)` 或 `_get_current_employee`?\n- [ ] **依赖**: 改代码是否同步 `requirements.txt` / `package.json`?\n- [ ] **alembic**: 数据库 schema 变化是否生成迁移脚本?\n- [ ] **配置**: nginx / docker / conf 变化 plan 写了是否做完?\n\n### PR 流程\n\n1. **本地开发**\n ```bash\n git checkout develop\n git pull\n git checkout -b feature/xxx\n # 改代码\n git add .\n git commit -m \"feat(xxx): ...\"\n git push origin feature/xxx\n ```\n\n2. **开 PR**(走 Gitea Web 或 API)\n - 标题 = commit subject\n - 描述 = body 内容 + 关联评审报告 / workbuddy 任务\n - Reviewer: `simon`(主) + 可选 workbuddy auto-review\n\n3. **评审员评审**(Gitea UI)\n - 🟢 **P0 鉴权 / 安全**: 必须 Claude 评审 + 通过\n - 🟡 **功能 / 重构**: 至少 1 reviewer 通过\n - 🟢 **docs / chore**: 自审即可\n\n4. **合并**\n - 评审通过 + status check 绿 → squash merge → 删 feature 分支\n\n---\n\n## 🔒 main 分支保护规则\n\n由 Gitea API 配置,目前设定:\n\n| 项 | 值 |\n|---|---|\n| 禁止直推 | ✅ |\n| 需 PR | ✅ |\n| Approvals 数 | 1 |\n| Dismiss stale approvals | ✅ |\n| 状态检查必须通过 | ✅(待配) |\n| 管理员限制 | ✅(管理员也走 PR) |\n\n**配分支保护**:\n```bash\ncurl -X POST \\\n -H \"Authorization: token <ADMIN_TOKEN>\" \\\n -H \"Content-Type: application/json\" \\\n -d '{\n \"enable_push\": false,\n \"enable_pull_request\": true,\n \"required_approvals\": 1,\n \"dismiss_stale_approvals\": true,\n \"block_admin_merge\": true\n }' \\\n \"https://ds923plus.tail58d872.ts.net/api/v1/repos/simon/wecom_it_smart_desk/branch_protections/main\"\n```\n\n---\n\n## 🤖 workbuddy 推送规则\n\nworkbuddy 自动化开发,推送必须满足:\n\n1. **完整自检**: 鉴权 + 依赖 + alembic + 配置 4 件套\n2. **评审报告**: 每次推送**生成** `docs/评审报告/workbuddy-{日期}-{主题}.md`\n3. **workbuddy 记忆更新**: `.workbuddy/memory/{日期}-{主题}.md`\n4. **5 项遗留**: 上一轮评审遗留的 5 项必须修完才能合入下一轮\n5. **不叠加新功能**: 评审未消化前不推新功能(见 `docs/评审报告/` 历次教训)\n\n**评审失败处理**:\n- 评审标 🔴 P0 → 立即修,不接受反驳(除非评审员改判)\n- 评审标 🟡 P1 → 列入遗留表(workbuddy 记忆 + 风险跟踪表)\n- 评审标 🟢 P2 → 知识库积累,不强制修\n\n---\n\n## 🆘 紧急修复 (hotfix)\n\n**场景**: 生产 P0 漏洞 / 数据丢失风险\n\n**流程**:\n1. 从 main 拉 `hotfix/xxx`\n2. 改 + 测(用预生产环境)\n3. PR → main(快通道,reviewer 优先 @ 宋献)\n4. 评审通过 → 立即合并 + 部署\n5. 同步 cherry-pick 回 develop\n\n**禁止**:\n- ❌ 跳过评审\n- ❌ 推 main 直接部署\n- ❌ 评审未通过就部署\n\n---\n\n## 📚 关联文档\n\n- [`README.md`](README.md) — 项目总览(新人快速入门)\n- [`docs/01-项目总览与部署手册.md`](docs/01-项目总览与部署手册.md) — 完整架构设计与部署详情\n- [`docs/智能IT服务系统运维手册.md`](docs/智能IT服务系统运维手册.md) — 统一运维手册\n- [`docs/索引.md`](docs/索引.md) — 文档目录索引(快速导航)\n- [`CHANGELOG.md`](CHANGELOG.md) — 版本变更概览\n- [`docs/archive-归档/`](docs/archive-归档/) — 历史版本详情\n- [`.workbuddy/memory/`](.workbuddy/memory/) — workbuddy 任务记忆\n\n---\n\n## 📑 文档同步规则\n\n**更新文档时需同步关联文档**:\n\n| 更新内容 | 需同步的文档 |\n|---------|-------------|\n| 新功能/重构 | README.md(进度)+ CHANGELOG.md + 相关 docs/*.md |\n| 部署变更 | 智能IT服务系统运维手册.md + 01-项目总览与部署手册.md |\n| 安全修复 | CHANGELOG.mdSecurity 章节)+ 评审报告 |\n| API 变更 | README.mdAPI 概览)+ 01-项目总览与部署手册.md |\n\n**文档目录规范**\n- `docs/` 目录下按类型分子目录(deploy/, SOPs/, ADRs/, 评审报告/, archive/ 等)\n- 根目录保留 README.md / CONTRIBUTING.md / CHANGELOG.mdGit 生态标准)\n- 新增文档优先放在 `docs/`,避免根目录文件膨胀\n",
"overview.md": "# H5 会话关闭「重复提醒」优化(方案A)— 交付概要\n\n## 问题\n员工端会话关闭后,消息列表**系统消息**(`✅ 会话已关闭。24小时内可重新打开。`)与底部 **QueueCapsule 横幅**`会话已关闭 · 24小时内可重新打开 点击重新打开 🔄`)两处重复展示同一提醒文案,且横幅另带「点击重新打开」入口,造成信息冗余。\n\n## 方案(用户选定 · 方案A)\n- 保留消息列表系统消息,在其卡片内新增「🔄 重新打开」按钮(上下文最近、最自然);\n- 删除底部 QueueCapsule 的 resolved 横幅(去重)。\n\n## 改动文件(均位于真实部署目录 `src/frontend-h5/`\n1. **`src/frontend-h5/src/components/chat/MessageBubble.vue`**\n - 模板:系统消息 `<div>` 内新增 `v-if=\"isResolveMessage && canReopen\"` 的「🔄 重新打开」按钮,点击 `handleReopen`\n - script:新增 `isResolveMessage`content 含「可重新打开」判定)/ `canReopen`store.canReopen/ `isReopening`store.isReopening/ `handleReopen`(调 `store.reopenCurrentConversation()` + toast 展示后端真实错误);\n - CSS`.message-bubble__reopen-btn`(企微绿 `#07c160` 圆角胶囊,含 `:active`/`:disabled` 态)。\n2. **`src/frontend-h5/src/components/chat/QueueCapsule.vue`**\n - `visible` computed 新增 `if (currentState.value === 'resolved') return false`,隐藏 resolved 横幅;\n - 纯函数 `computeVisible` / `computeCapsuleState` 保持不变(既有逻辑测试不受影响)。\n\n## 设计决定(透明说明)\nInputBar 的「人工坐席」按钮在 resolved 态仍保留 `reopen` 能力 —— 它仅显示徽标 + tooltip(**无可见重复文案**),作为常驻 reopen 入口;6 态状态机与既有测试不变。若你希望 reopen 入口**唯一收口**到系统消息卡片,可再隐藏该按钮(需同步改 `inputBarCallAgentState.ts` 的 `reopen` 分支,并调整 28 例相关测试)。\n\n## 验证结果\n- **vue-tsc**:仅历史既有类型错误(RecommendCard / SelfDiagnosis / conversation.ts 等),**无本次新增**;模板引用 `handleReopen`/`isResolveMessage`/`canReopen`/`isReopening` 均已正确定义;\n- **vitest**171 例(inputBarCallAgentState / QueueCapsule / integrationZoneLogic**全过**\n- **vite build**:成功(529 模块,built in 2.74s)。\n\n## 回滚能力(满足用户硬约束:微小改动后页面回老版本)\n- 改动前已备份:`D:\\资料\\03-项目开发\\wecom_it_smart_desk\\.backup\\h5-20260807\\src-frontend-h5-src.tar.gz`171MB,排除 node_modules/dist);\n- 回滚:`tar -xzf .backup/h5-20260807/src-frontend-h5-src.tar.gz -C <项目根>` 还原 `src/frontend-h5/`\n - ⚠️ 本环境 safe-delete 垫片会**拦截 `rm`**fail-closed),勿先 `rm -rf`;用 `tar` 直接覆盖即可。\n\n## 部署状态:**已上线生产(2026-08-07 13:15**\n\n采用既有「版本化 PATH + 302 跳板」体系破除 WAF path 缓存:\n- 新版本入口:`/h5/v20260807a/`nginx `alias` 指向同一 root `dist/`,仅 URL 路径不同)\n- `/h5/go` 302 目标已由 `v20260806g` 改为 `v20260807a`\n- 改后 `docker exec wecom_it_nginx nginx -t` 通过 → `docker restart wecom_it_nginx`\n\n**验证(内网 + 外网 WAF 双通过)**\n- 内网:`/h5/v20260807a/`=200、`/h5/go`=302→`/h5/v20260807a/`、`/h5/assets/index-C1Q6Rane.js`=200(新 hash\n- 外网:`https://itsupport.servyou.com.cn/h5/go`=302→`/h5/v20260807a/`;外部 index.html 引用新 hash `index-C1Q6Rane.js`\n- 产物核对:built JS 含「🔄 重新打开」「重新打开中」、CSS 含 `message-bubble__reopen-btn` → 方案A 代码确已生效\n\n**回滚预案(nginx 层,秒级)**\n```\nsudo cp /opt/wecom-it-desk/nginx/nginx.conf.bak-20260807 /opt/wecom-it-desk/nginx/nginx.conf\ndocker restart wecom_it_nginx\n```\ndist 构建产物回退需重新解上次构建包;源码级备份见 `.backup/h5-20260807/src-frontend-h5-src.tar.gz`\n",
"docker-compose.yml": "# =============================================================================\n# 企微IT智能服务台 — Docker Compose(公司内网服务器版)\n# =============================================================================\n# 目标服务器:10.90.5.110\n# 域名:itsupport.servyou.com.cn\n#\n# 用法:\n# 1. 上传部署包到服务器\n# 2. cp .env.example .env && vim .env # 填入真实配置\n# 3. docker compose up -d # 启动所有服务\n# 4. docker compose logs -f # 查看日志\n#\n# 架构:\n# 客户端浏览器 → Nginx:80 → { /itdesk/, /itagent/, /itadmin/, /api/, /ws/ }\n# =============================================================================\n\nservices:\n # --------------------------------------------------------------------------\n # PostgreSQL 16 — 持久化数据库\n # --------------------------------------------------------------------------\n postgres:\n image: postgres:16-alpine\n container_name: wecom_it_postgres\n restart: unless-stopped\n environment:\n POSTGRES_USER: ${POSTGRES_USER:-wecom}\n POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-wecom_secret}\n POSTGRES_DB: ${POSTGRES_DB:-wecom_it_desk}\n volumes:\n - postgres_data:/var/lib/postgresql/data\n healthcheck:\n test: [\"CMD-SHELL\", \"pg_isready -U ${POSTGRES_USER:-wecom}\"]\n interval: 5s\n timeout: 5s\n retries: 5\n networks:\n - it-desk-internal\n logging:\n driver: \"json-file\"\n options:\n max-size: \"10m\"\n max-file: \"3\"\n\n # --------------------------------------------------------------------------\n # Redis 7 — 缓存服务(token、会话、员工信息)\n # --------------------------------------------------------------------------\n redis:\n image: redis:7-alpine\n container_name: wecom_it_redis\n restart: unless-stopped\n command: redis-server --appendonly yes --save 900 1 --save 300 10 --requirepass 'R3d!s@2026#Secure'\n volumes:\n - redis_data:/data\n healthcheck:\n test: [\"CMD\", \"redis-cli\", \"ping\"]\n interval: 5s\n timeout: 5s\n retries: 5\n networks:\n - it-desk-internal\n logging:\n driver: \"json-file\"\n options:\n max-size: \"10m\"\n max-file: \"3\"\n\n # --------------------------------------------------------------------------\n # Neo4j 5 — 知识图谱存储(社区版)\n # --------------------------------------------------------------------------\n neo4j:\n image: neo4j:5-community\n container_name: wecom_it_neo4j\n restart: unless-stopped\n environment:\n NEO4J_AUTH: neo4j/${NEO4J_PASSWORD}\n NEO4J_PLUGINS: '[\"apoc\"]'\n volumes:\n - neo4j_data:/data\n - neo4j_logs:/logs\n healthcheck:\n test: [\"CMD-SHELL\", \"cypher-shell -u neo4j -p ${NEO4J_PASSWORD} 'RETURN 1'\"]\n interval: 10s\n timeout: 5s\n retries: 10\n networks:\n - it-desk-internal\n logging:\n driver: \"json-file\"\n options:\n max-size: \"10m\"\n max-file: \"3\"\n\n # --------------------------------------------------------------------------\n # FastAPI 后端 — 核心业务服务\n # --------------------------------------------------------------------------\n backend:\n build:\n context: ./backend\n dockerfile: Dockerfile\n image: wecom-it-desk-backend:latest\n container_name: wecom_it_backend\n restart: unless-stopped\n environment:\n # 企微凭证\n - WECOM_CORP_ID=${WECOM_CORP_ID}\n - WECOM_AGENT_ID=${WECOM_AGENT_ID}\n - WECOM_SECRET=${WECOM_SECRET}\n - WECOM_APPROVAL_SECRET=${WECOM_APPROVAL_SECRET:-}\n - WECOM_TOKEN=${WECOM_TOKEN}\n - WECOM_ENCODING_AES_KEY=${WECOM_ENCODING_AES_KEY}\n # ITSM 运维平台(app_id/app_secret 待申请,先占位)\n - ITSM_APP_ID=${ITSM_APP_ID:-}\n - ITSM_APP_SECRET=${ITSM_APP_SECRET:-}\n # 数据库(Docker 内部网络,用容器名通信)\n - DATABASE_URL=postgresql://${POSTGRES_USER:-wecom}:${POSTGRES_PASSWORD:-wecom_secret}@postgres:5432/${POSTGRES_DB:-wecom_it_desk}\n # RedisDocker 内部网络)\n # Redis URL - 密码中的特殊字符需要URL编码 (#→%23)\n - REDIS_URL=redis://:R3d%21s%402026%23Secure@redis:6379/0\n # CORS\n - CORS_ORIGINS=${CORS_ORIGINS:-http://itsupport.servyou.com.cn}\n # AI 服务(Dify\n - DIFY_API_URL=${DIFY_API_URL}\n - DIFY_API_KEY=${DIFY_API_KEY}\n - DIFY_TIMEOUT=${DIFY_TIMEOUT:-30}\n # AI Wingman(留空禁用)\n - DIFY_WINGMAN_API_URL=${DIFY_WINGMAN_API_URL:-}\n - DIFY_WINGMAN_API_KEY=${DIFY_WINGMAN_API_KEY:-}\n - DIFY_WINGMAN_TIMEOUT=${DIFY_WINGMAN_TIMEOUT:-30}\n # Neo4j 知识图谱\n - NEO4J_URI=${NEO4J_URI:-bolt://neo4j:7687}\n - NEO4J_USER=${NEO4J_USER:-neo4j}\n - NEO4J_PASSWORD=${NEO4J_PASSWORD}\n - NEO4J_DATABASE=${NEO4J_DATABASE:-neo4j}\n - NEO4J_MAX_CONNECTION_LIFETIME=${NEO4J_MAX_CONNECTION_LIFETIME:-3600}\n - NEO4J_MAX_CONNECTION_POOL_SIZE=${NEO4J_MAX_CONNECTION_POOL_SIZE:-50}\n # Mock 登录(生产环境默认关闭,如需临时调试请在 .env 中显式设置为 true\n - MOCK_LOGIN_ENABLED=${MOCK_LOGIN_ENABLED:-false}\n # 终端页面基础URL(用于NE2005等终端生成二维码)\n - TERMINAL_BASE_URL=${TERMINAL_BASE_URL:-https://itsupport.servyou.com.cn/itterminal/}\n # 服务配置\n - BACKEND_HOST=0.0.0.0\n - BACKEND_PORT=8000\n # 上传文件目录(持久化)\n - UPLOAD_DIR=/app/uploads\n # 运行期日志目录(供\"运行期日志\"管理页面读取,需与下方 volumes 挂载一致)\n - RUNTIME_LOG_DIR=/app/logs\n volumes:\n # 代码热更新(生产环境:宿主机 ./app → 容器 /app/app\n - ./app:/app/app\n - backend-uploads:/app/uploads\n - ${RUNTIME_LOG_HOST_DIR:-/var/log/wecom-it-desk}:/app/logs\n depends_on:\n postgres:\n condition: service_healthy\n redis:\n condition: service_healthy\n neo4j:\n condition: service_healthy\n command: >\n /bin/sh -c \"\n echo '>>> 启动 API 服务 (跳过迁移)...' &&\n uvicorn app.main:app --host 0.0.0.0 --port 8000 --workers 1\n \"\n networks:\n - it-desk-internal\n healthcheck:\n test: [\"CMD\", \"python\", \"-c\", \"import urllib.request; urllib.request.urlopen('http://localhost:8000/health').read()\"]\n interval: 30s\n timeout: 10s\n retries: 3\n start_period: 40s\n logging:\n driver: \"json-file\"\n options:\n max-size: \"20m\"\n max-file: \"5\"\n\n # --------------------------------------------------------------------------\n # Nginx — 反向代理 + 静态文件服务\n # --------------------------------------------------------------------------\n nginx:\n image: nginx:1.27-alpine\n container_name: wecom_it_nginx\n restart: unless-stopped\n ports:\n - \"80:80\"\n - \"443:443\"\n volumes:\n - ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro\n - ./nginx/ssl:/etc/nginx/ssl:ro\n - ./src/frontend-h5/dist:/usr/share/nginx/html/itdesk:ro\n - ./src/frontend-agent/dist:/usr/share/nginx/html/itagent:ro\n - ./src/frontend-admin/dist:/usr/share/nginx/html/itadmin:ro\n - ./frontend-portal/dist:/usr/share/nginx/html/itportal:ro\n - ./src/frontend-terminal/dist:/usr/share/nginx/html/itterminal:ro\n depends_on:\n - backend\n networks:\n - it-desk-internal\n healthcheck:\n test: [\"CMD-SHELL\", \"curl -f http://localhost:80/itdesk/health || exit 1\"]\n interval: 15s\n timeout: 5s\n retries: 3\n logging:\n driver: \"json-file\"\n options:\n max-size: \"10m\"\n max-file: \"3\"\n\n# =============================================================================\n# 网络\n# =============================================================================\nnetworks:\n it-desk-internal:\n driver: bridge\n\n# =============================================================================\n# 数据卷 — 持久化存储\n# =============================================================================\nvolumes:\n postgres_data:\n name: wecom_it_postgres_data\n redis_data:\n name: wecom_it_redis_data\n neo4j_data:\n name: wecom_it_neo4j_data\n neo4j_logs:\n name: wecom_it_neo4j_logs\n backend-uploads:\n name: wecom_it_backend_uploads\n",
"docker-compose.dev.yml": "# =============================================================================\n# 企微IT智能服务台 — 本地开发环境 Docker Compose\n# =============================================================================\n# 目标:本地电脑(Windows + Docker Desktop)\n# 用途:开发 + 测试,不依赖企微 OAuth,代码 volume mount 自动 reload\n# 用法:\n# 1. cp .env.example .env.dev (编辑填值,或直接用 .env.dev 模板)\n# 2. docker compose -f docker-compose.dev.yml up -d\n# 3. 访问 http://localhost:80/itdesk/ 等\n# 启动后:\n# - Nginx: http://localhost:80 (统一入口)\n# - Postgres: localhost:5432\n# - Redis: localhost:6379\n# - Backend: localhost:8000 (可选)\n# =============================================================================\n\nservices:\n # --------------------------------------------------------------------------\n # PostgreSQL 16 — 开发数据库\n # --------------------------------------------------------------------------\n postgres:\n image: postgres:16-alpine\n container_name: dev_wecom_postgres\n restart: unless-stopped\n environment:\n POSTGRES_USER: ${POSTGRES_USER:-wecom}\n POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-wecom_dev}\n POSTGRES_DB: ${POSTGRES_DB:-wecom_it_desk_dev}\n ports:\n - \"5432:5432\"\n volumes:\n - postgres_dev_data:/var/lib/postgresql/data\n healthcheck:\n test: [\"CMD-SHELL\", \"pg_isready -U ${POSTGRES_USER:-wecom}\"]\n interval: 5s\n timeout: 5s\n retries: 5\n networks:\n - dev-net\n\n # --------------------------------------------------------------------------\n # Redis 7 — 开发缓存\n # --------------------------------------------------------------------------\n redis:\n image: redis:7-alpine\n container_name: dev_wecom_redis\n restart: unless-stopped\n command: redis-server --appendonly yes --save 900 1 --save 300 10\n ports:\n - \"6379:6379\"\n volumes:\n - redis_dev_data:/data\n healthcheck:\n test: [\"CMD\", \"redis-cli\", \"ping\"]\n interval: 5s\n timeout: 5s\n retries: 5\n networks:\n - dev-net\n\n # --------------------------------------------------------------------------\n # Neo4j 5 — 知识图谱存储\n # --------------------------------------------------------------------------\n neo4j:\n image: neo4j:5-community\n container_name: dev_wecom_neo4j\n restart: unless-stopped\n environment:\n NEO4J_AUTH: neo4j/${NEO4J_PASSWORD:-password}\n NEO4J_PLUGINS: '[\"apoc\"]'\n ports:\n - \"7474:7474\"\n - \"7687:7687\"\n volumes:\n - neo4j_dev_data:/data\n - neo4j_dev_logs:/logs\n healthcheck:\n test: [\"CMD-SHELL\", \"cypher-shell -u neo4j -p ${NEO4J_PASSWORD:-password} 'RETURN 1'\"]\n interval: 10s\n timeout: 5s\n retries: 10\n networks:\n - dev-net\n\n # --------------------------------------------------------------------------\n # Backend — 开发模式(代码 volume mount + uvicorn --reload)\n # --------------------------------------------------------------------------\n backend:\n build:\n context: ./backend\n dockerfile: Dockerfile.dev\n image: wecom-it-desk-backend:dev\n container_name: dev_wecom_backend\n restart: unless-stopped\n env_file:\n - .env.dev\n environment:\n - DATABASE_URL=postgresql://wecom:wecom_dev@postgres:5432/wecom_it_desk_dev\n - REDIS_URL=redis://redis:6379/0\n - DEV_MODE=true\n - WECOM_SSO_CALLBACK_BASE=http://localhost:80\n - CORS_ORIGINS=http://localhost:80\n # Dify AI 服务(生产环境)\n - DIFY_API_URL=http://yw-dify.dc.servyou-it.com/dify2openai/v1/chat/completions\n - DIFY_API_KEY=app-7jkRkAzvX4QM9v9SM3P8mMEO\n - DIFY_TIMEOUT=30\n - PYTHONPATH=/app\n # Neo4j 知识图谱\n - NEO4J_URI=bolt://neo4j:7687\n - NEO4J_USER=neo4j\n - NEO4J_PASSWORD=${NEO4J_PASSWORD:-password}\n - NEO4J_DATABASE=neo4j\n ports:\n - \"8000:8000\"\n volumes:\n - ./backend/app:/app/app\n - ./backend/alembic:/app/alembic\n - ./backend/scripts:/app/scripts\n command: >\n sh -c \"uvicorn app.main:app --host 0.0.0.0 --port 8000 --reload\"\n depends_on:\n postgres:\n condition: service_healthy\n redis:\n condition: service_healthy\n neo4j:\n condition: service_healthy\n networks:\n - dev-net\n\n # --------------------------------------------------------------------------\n # Frontend-Agent — 坐席前端开发模式\n # --------------------------------------------------------------------------\n frontend-agent:\n build:\n context: ./src/frontend-agent\n dockerfile: Dockerfile.dev\n image: wecom-it-desk-agent:dev\n container_name: dev_wecom_frontend_agent\n restart: unless-stopped\n environment:\n - VITE_API_BASE=http://localhost:80/api\n - VITE_WS_BASE=ws://localhost:80/ws\n ports:\n - \"5173:5173\"\n volumes:\n - ./src/frontend-agent/src:/app/src\n depends_on:\n - backend\n networks:\n - dev-net\n\n # --------------------------------------------------------------------------\n # Frontend-H5 — H5前端开发模式\n # --------------------------------------------------------------------------\n frontend-h5:\n build:\n context: ./src/frontend-h5\n dockerfile: Dockerfile.dev\n image: wecom-it-desk-h5:dev\n container_name: dev_wecom_frontend_h5\n restart: unless-stopped\n environment:\n - VITE_API_BASE=http://localhost:80/api\n - VITE_WS_BASE=ws://localhost:80/ws\n # dev 容器内 Vite 代理目标:指向 compose 服务名 backend(容器内 localhost 不是后端)\n - VITE_PROXY_TARGET=http://backend:8000\n ports:\n - \"5174:5174\"\n volumes:\n - ./src/frontend-h5/src:/app/src\n # dev 热更新:同时挂载 public/,否则容器镜像内烘焙的 public/ 不含后续新增资源\n # (如 duckula.webp),导致 Vite 解析 <img src=\"/duckula.webp\"> 失败、整个应用无法挂载\n - ./src/frontend-h5/public:/app/public\n # 挂载 vite.config.ts 使代理目标等配置可热生效(无需重建镜像)\n - ./src/frontend-h5/vite.config.ts:/app/vite.config.ts\n # 挂载 index.html 使 CSP(含 dev WS 端口)修改可热生效\n - ./src/frontend-h5/index.html:/app/index.html\n depends_on:\n - backend\n networks:\n - dev-net\n\n # --------------------------------------------------------------------------\n # Frontend-Admin — 管理前端开发模式\n # --------------------------------------------------------------------------\n frontend-admin:\n build:\n context: ./src/frontend-admin\n dockerfile: Dockerfile.dev\n image: wecom-it-desk-admin:dev\n container_name: dev_wecom_frontend_admin\n restart: unless-stopped\n environment:\n - VITE_API_BASE=http://localhost:80/api\n ports:\n - \"5175:5175\"\n volumes:\n - ./src/frontend-admin/src:/app/src\n depends_on:\n - backend\n networks:\n - dev-net\n\n # --------------------------------------------------------------------------\n # Nginx — 反向代理(统一入口)\n # --------------------------------------------------------------------------\n nginx:\n image: nginx:1.27-alpine\n container_name: dev_wecom_nginx\n restart: unless-stopped\n ports:\n - \"80:80\"\n volumes:\n - ./nginx/nginx.dev.conf:/etc/nginx/nginx.conf:ro\n depends_on:\n - backend\n - frontend-agent\n - frontend-h5\n - frontend-admin\n networks:\n - dev-net\n\nvolumes:\n postgres_dev_data:\n redis_dev_data:\n neo4j_dev_data:\n neo4j_dev_logs:\n\nnetworks:\n dev-net:\n driver: bridge\n",
"mkdocs.yml": "site_name: WeCom IT 智能服务台\nsite_description: 企微 IT 智能服务台项目文档\nsite_author: Simon & Claude\ndocs_dir: docs\nsite_dir: site\ntheme:\n name: material\n language: zh\n features:\n - navigation.instant\n - navigation.tabs\n - search.suggest\nnav:\n - 首页: 01-项目总览/01-项目总览与部署手册-20260704.md\n - 文档索引: 01-项目总览/00-索引-20260704.md\n - 总览:\n - 运维手册: 01-项目总览/01-智能IT服务系统运维手册-20260704.md\n - 项目全面评估: 01-项目总览/03-项目全面评估报告-20260625.md\n - 产品需求:\n - PRD v1.2: 02-产品需求/02-产品需求文档PRD-v1.2-20260704.md\n - 架构:\n - 系统架构设计: 03-技术架构/00-系统架构设计文档-v1.3.md\n - 部署:\n - 一键部署操作包: 09-部署运维/deploy/10-一键部署操作包-v0.7.0.md\n - NAS部署指南: 09-部署运维/deploy/09-NAS部署指南-群晖Cloudflare.md\n - 发布说明 v0.7.1: 09-部署运维/deploy/03-RELEASE-NOTES-v0.7.1-20260623.md\n - 安全:\n - OTP 双因素认证: 09-部署运维/deploy/06-OTP二次验证实现.md\n - 安全审计报告: 08-安全审计/审计报告-安全审计/02-安全审计报告-20260614.md\n - 故障排查:\n - 标准故障排查手册: 09-部署运维/00-标准故障排查手册.md\n - 测试质量:\n - E2E 验收清单: 06-测试质量/testing-测试/E2E-CHECKLIST-v0.7.0.md\n - QA 综合报告: 06-测试质量/testing-测试/QA_COMPREHENSIVE_REPORT.md\n - 项目管理:\n - 任务总索引: 10-项目管理/01-任务总索引.md\n - 项目状态看板: 10-项目管理/05-项目状态看板/01-项目状态看板.md\n - 风险跟踪表: 10-项目管理/02-风险跟踪表.md\nmarkdown_extensions:\n - admonition\n - codehilite\n - toc:\n permalink: true\n",
".gitignore": "# Python\n__pycache__/\n*.py[cod]\n*$py.class\n*.egg-info/\ndist/\nbuild/\n.venv/\nvenv/\n.eggs/\n\n# 环境变量\n.env\n.env.local\n.env.*\n\n# IDE\n.vscode/\n.idea/\n*.swp\n*.swo\n\n# 系统\n.DS_Store\nThumbs.db\n\n# Node\nnode_modules/\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\n\n# 前端构建\nfrontend-agent/dist/\nfrontend-h5/dist/\n\n# 日志\n*.log\nlogs/\n\n# Docker\n*.pid\n*.seed\n*.pid.lock\n\n# =============================================================================\n# P0 安全: SSL 私钥 / 部署包 / 历史日志 (2026-06-14 强化)\n# =============================================================================\n\n# SSL 私钥 + 证书请求\n*.key\n*.pem\n*.csr\n\n# docs/ 下所有 servyou.com.cn 证书(目录 + 文件 + zip 全部,** 匹配任意深度)\ndocs/servyou.com.cn**\ndocs/*证书*/\ndocs/*ssl*/\ndocs/*SSL*/\ndocs/*证书*.zip\n/docs/*证书*.zip\n\n# 部署包 + 部署产物(体积大 + 经常含私钥)\ndeploy-*.tar\ndeploy-*.tar.gz\ndeploy-packages/\ndeploy-patch.tar\ndeploy-admin.tar\ndeploy-agent.tar\ndeploy-backend.tar\ndeploy-h5.tar\ndeploy-portal.tar\n*.tar\n*.tar.gz\n\n# 历史日志 + 构建日志(stderr 噪声)\n*.log.err\nbuild_logs/\nagent_build.log.err\nbuild-agent.log.err\nbuild-agent2.log.err\nbuild-h5.log.err\nbuild-h5-fix.log.err\nbuild_all.log.err\n\n# 本地部署脚本 + 部署目录\nbuild.ps1\nbuild_all.ps1\ndeploy-frontend-nas.bat\ndeploy-nas/\n\n# 部署产物 zip(体积大 + 含 dist)\nfrontend-*-dist-fix*.zip\nfrontend-*-dist-fix-*.zip\nit-smart-desk-*-deploy.zip\n\n# deploy-server/ 部署配置(nginx conf 入仓, .env 排除)\ndeploy-server/**/.env*\ndeploy-server/**/secrets/\ndeploy-server/**/*.pem\ndeploy-server/**/*.key\n\n# SQLite 本地测试库\nit_smart_desk.db\n*.db\n*.sqlite\n*.sqlite3\n\n# Base64 编码凭据(部署脚本用,含 admin token / 证书)\n# 2026-06-22: gen_admin_token.b64 含生产 admin token,不能入仓\n*.b64\n\n# pytest / 临时\n.pytest_cache/\n/tmp/\n*.pid\n.coverage\nhtmlcov/\n\n# 本地开发脚本 + 临时文件(2026-06-14 强化)\ndev-start.bat\ndev-start.ps1\nstart-backend.ps1\ntemp_*.txt\ntemp_*.py\nwecom-it-desk-nas.zip\nwecom-it-desk-server-deploy.zip\n\n# =============================================================================\n# P0 安全: workbuddy 凭据(2026-06-14 强化)\n# =============================================================================\n# workbuddy config 含 Gitea access token,绝对不入仓\n# 类比 .git/config: 工作目录可写,但 git add . 时排除\n.workbuddy/config.json\n.workbuddy/config.local.json\n.workbuddy/*.token\n.workbuddy/credentials*\n.workbuddy/.env*\n# workbuddy 临时日志(评审/任务跑批的中间产物)\n.workbuddy/logs/\n.workbuddy/*.log\n.workbuddy/*.log.err\n# workbuddy 记忆目录(个人上下文,不 入仓)\n.workbuddy/memory/\n\n# =============================================================================\n# 工作树清理 (2026-07-09): 产物 / 临时 / 上传 / 调试 dump 不入仓\n# 说明: 仅停止版本跟踪, 文件保留在磁盘 (git rm --cached), 全部可逆\n# =============================================================================\n\n# 部署/构建产物 zip (体积大, 含 dist)\n*.zip\n*-dist/\n\n# 压缩包 / 备份 dump\n*.tar.xz\n*.dump\n\n# 后端运行时上传 (员工上传的 pdf/png, 非源码)\nbackend/media/files/\nbackend/media/images/\n\n# 调试 dump\nbackend/*_dump.txt\nbackend/all_routes.txt\nbackend/auto_routes.txt\nbackend/route_dump*.txt\nbackend/api_router_dump.txt\n\n# 根目录 scratch 脚本 (一次性修复/检查/测试)\ncheck_*.py\nfix_*.py\nextract_and_migrate.py\nupdate_password.py\nupload_*.py\n_ctrt_transform.py\nencoded_knowledge_suggestion.txt\ndeploy_to_container.py\ntest_login*.py\ntest_login*.json\ntest_login*.sh\ntest_redis*.py\ntest_redis*.sh\ntest_send.sh\ntest_redis_conn.py\nkeep_alive.ps1\nstart_backend.sh\nstart_dev_services.bat\nstart_dev_services.ps1\notp-bind.sh\n\n# 部署 scratch\ndeploy-*.bat\ndeploy-staging/\ndeploy-scripts/\ndeploy-temp/\nchunks/\ndify/\nragflow/\nneo4j5*\n\n# nginx 实验配置 (nginx/nginx.dev.conf 如需则解除忽略)\nnginx*.conf\nnginx.conf.bak\nitdesk-nginx-block.conf\n\n# 截图 / 录屏\nlogin_*.png\nlogin_shot.mjs\ndocs/06-测试质量/e2e-screenshots/\n\n# base64 头 dump\n*_b64_head.txt\n\n# scratch SQL (一次性)\ndisable_mfa.sql\ncheck_sxn.sql\nreset_pass.sql\nreset_pwd.sql\n\n# 杂项\n-w\n\n# 补充忽略 (2026-07-09 收尾): 残余 scratch / 构建缓存\nops-tools/\ndist-new/\n_tmp_*\n*.timestamp-*.mjs\nfix_redis.sh\n/test/\nbackend/scripts/create_test_agent.py\n\n# 补充忽略 (2026-07-09 WIP 提交): 新增构建产物\ndist-deploy/\ndist-v2/\n\n# 补充忽略 (2026-07-13): 临时目录 / 备份 / 截图\n.workbuddy/tmp/\n.workbuddy/automations/\ndeploy-staging-ki/\ndist-old-*/\ndist_deploy/\nscreenshots/\ntest-screenshots/\ntools/\nchat_export/\ndeliverables/\n02meiti/\n/data/\n\n# === src/ 专用: 构建产物与运行期上传 (2026-08-08 将 src/ 纳入版本控制时补充) ===\n# 活跃前端/后端源码需入仓; 以下生成物与运行数据排除\nsrc/backend/uploads/\nsrc/frontend-*/dist*/\n**/node_modules_*/\n"
},
"git_status": " M .workbuddy/automations/automation-1782986180887/memory.md\n M .workbuddy/memory/MEMORY.md\n M backend/app/api/h5.py\n M \"docs/01-\\344\\272\\247\\345\\223\\201\\346\\226\\207\\346\\241\\243/04-\\345\\235\\220\\345\\270\\255\\345\\267\\245\\344\\275\\234\\345\\217\\260/PRD-REQ-\\345\\235\\220\\345\\270\\255-011-\\347\\273\\237\\344\\270\\200\\345\\267\\245\\344\\275\\234\\351\\230\\237\\345\\210\\227\\351\\207\\215\\346\\236\\204-v0.1.md\"\n M \"docs/01-\\344\\272\\247\\345\\223\\201\\346\\226\\207\\346\\241\\243/05-\\347\\224\\250\\346\\210\\267\\347\\253\\257H5/PRD-REQ-\\347\\224\\250\\346\\210\\267-001-\\347\\276\\244\\350\\201\\212\\345\\217\\214\\346\\250\\241\\345\\274\\217-v1.0.md\"\n M \"docs/07-\\351\\241\\271\\347\\233\\256\\347\\256\\241\\347\\220\\206/\\351\\241\\271\\347\\233\\256\\347\\212\\266\\346\\200\\201\\347\\234\\213\\346\\235\\277.html\"\n M \"docs/07-\\351\\241\\271\\347\\233\\256\\347\\256\\241\\347\\220\\206/\\351\\241\\271\\347\\233\\256\\347\\212\\266\\346\\200\\201\\347\\234\\213\\346\\235\\277.md\"\n M frontend-h5/components.d.ts\n M frontend-h5/index.html\n M frontend-h5/src/api/employee.ts\n M frontend-h5/src/components/chat/ChatPanel.vue\n M frontend-h5/src/components/chat/InputBar.vue\n M frontend-h5/src/router/index.ts\n M frontend-h5/src/stores/conversation.ts\n M frontend-h5/src/stores/employee.ts\n M frontend-h5/src/styles/global.css\n M overview.md\n?? .gitea/workflows/\n?? .workbuddy/artifacts/agent-avatar-fix-overview.md\n?? .workbuddy/audit_scan.json\n?? .workbuddy/outputs/\n?? \"IT\\346\\231\\272\\350\\203\\275\\346\\234\\215\\345\\212\\241\\345\\217\\260-\\346\\212\\200\\346\\234\\257\\346\\236\\266\\346\\236\\204\\345\\233\\276-2026-08-07.html\"\n?? \"IT\\346\\231\\272\\350\\203\\275\\346\\234\\215\\345\\212\\241\\345\\217\\260-\\351\\241\\271\\347\\233\\256\\346\\203\\205\\345\\206\\265\\346\\212\\245\\345\\221\\212-2026-08-07.md\"\n?? __deploy_artifacts_20260807/\n?? _analyze_c.py\n?? _check_json.py\n?? _fuzzy_residual.py\n?? _list_c.py\n?? _resolve_residual.py\n?? archives/\n?? cmp_docs.py\n?? cmp_docs2.py\n?? cmp_docs3.py\n?? compose_dev_err.txt\n?? compose_main_err.txt\n?? \"docs/01-\\344\\272\\247\\345\\223\\201\\346\\226\\207\\346\\241\\243/04-\\345\\235\\220\\345\\270\\255\\345\\267\\245\\344\\275\\234\\345\\217\\260/PRD-REQ-\\345\\235\\220\\345\\270\\255-012-\\344\\274\\232\\350\\257\\235\\346\\235\\241\\347\\233\\256\\346\\223\\215\\344\\275\\234\\350\\217\\234\\345\\215\\225-v1.0.md\"\n?? \"docs/01-\\344\\272\\247\\345\\223\\201\\346\\226\\207\\346\\241\\243/04-\\345\\235\\220\\345\\270\\255\\345\\267\\245\\344\\275\\234\\345\\217\\260/\\345\\216\\237\\345\\236\\213-REQ-\\345\\235\\220\\345\\270\\255-000-\\345\\235\\220\\345\\270\\255\\345\\267\\245\\344\\275\\234\\345\\217\\260-v1.7.html\"\n?? \"docs/02-\\346\\212\\200\\346\\234\\257\\346\\226\\207\\346\\241\\243/\\346\\212\\200\\346\\234\\257\\346\\226\\271\\346\\241\\210-REQ-\\347\\224\\250\\346\\210\\267-001-\\347\\276\\244\\350\\201\\212\\345\\205\\245\\345\\217\\243\\346\\216\\245\\347\\272\\277-v1.0.md\"\n?? \"docs/02-\\346\\212\\200\\346\\234\\257\\346\\226\\207\\346\\241\\243/\\346\\212\\200\\346\\234\\257\\346\\236\\266\\346\\236\\204/\\346\\212\\200\\346\\234\\257\\346\\240\\270\\346\\237\\245-\\345\\235\\220\\345\\270\\255\\344\\274\\232\\350\\257\\235\\346\\235\\241\\347\\233\\256\\346\\223\\215\\344\\275\\234\\350\\217\\234\\345\\215\\225-v1.0.md\"\n?? \"docs/07-\\351\\241\\271\\347\\233\\256\\347\\256\\241\\347\\220\\206/\\344\\273\\273\\345\\212\\241\\350\\257\\264\\346\\230\\216\\344\\271\\246/\\344\\273\\273\\345\\212\\241\\350\\257\\264\\346\\230\\216\\344\\271\\246-REQ-\\347\\224\\250\\346\\210\\267-001-\\347\\276\\244\\350\\201\\212\\345\\205\\245\\345\\217\\243\\346\\216\\245\\347\\272\\277.md\"\n?? docs_cmp_result.json\n?? docs_cmp_result2.json\n?? docs_cmp_result3.json\n?? docs_repair_b2.py\n?? docs_repair_c.py\n?? docs_repair_del.py\n?? docs_repair_del2.py\n?? docs_repair_refs.py\n?? docs_repair_refs2.py\n?? docs_repair_rmdir.py\n?? docs_repair_rmdir2.py\n?? frontend-h5/dist_d3/\n?? frontend-h5/dist_d4/\n?? frontend-h5/dist_g/\n?? frontend-h5/dist_v20260806/\n?? frontend-h5/dist_v20260806b/\n?? frontend-h5/dist_v20260806c/\n?? frontend-h5/dist_v20260806d/\n?? frontend-h5/dist_v20260806d2/\n?? frontend-h5/dist_v20260806f/\n?? frontend-h5/dist_v8/\n?? frontend-h5/src/assets/\n?? jumpserver-webcli/deploy_0802_clean_cmds.txt\n?? jumpserver-webcli/deploy_0802_cmds.txt\n?? jumpserver-webcli/deploy_0802_v2_cmds.txt\n?? jumpserver-webcli/deploy_0802_v3_cmds.txt\n?? jumpserver-webcli/diag_0802_compare.txt\n?? jumpserver-webcli/diag_0802_perm.txt\n?? jumpserver-webcli/diag_0802_served.txt\n?? jumpserver-webcli/diag_184715.txt\n?? scripts/agent-browser-auth-wait.ps1\n?? scripts/build-and-verify.sh\n?? scripts/build_inspection_report.py\n?? scripts/build_kanban_html.py\n?? scripts/check-wcag-tokens.mjs\n?? scripts/debug/\n?? scripts/debug_redis.py\n?? scripts/deploy-v1.2-staging.ps1\n?? scripts/deploy-v1.2.ps1\n?? scripts/deploy/\n?? scripts/deploy_cmds_v1.2-staging.txt\n?? scripts/deploy_cmds_v1.2.txt\n?? scripts/deploy_inspection_to_jumpserver.sh\n?? scripts/deploy_kanban_to_jumpserver.sh\n?? scripts/dify_export_BACKUP.yaml\n?? scripts/find_admin_user.sql\n?? scripts/fix/\n?? scripts/fix_priority_null.sql\n?? scripts/gen_admin_token.py\n?? scripts/init_quick_rules.sql\n?? scripts/test_inventory.py\n?? scripts/test_quick_rules_api.sh\n?? scripts/verify_api.py\n?? scripts/verify_fix.sh\n?? scripts/verify_fix_v2.sh\n?? scripts/verify_openapi.py\n?? scripts/verify_quickrules.sh\n?? temp/\n?? tests/\n?? \"\\357\\200\\252\\357\\200\\252REQ\\347\\274\\226\\345\\217\\267\\357\\200\\252\\357\\200\\252\\357\\200\\272\"\n?? \"\\357\\200\\252\\357\\200\\252\\344\\273\\243\\347\\240\\201\\346\\240\\270\\346\\237\\245\\350\\214\\203\\345\\233\\264\\357\\200\\252\\357\\200\\252\\357\\274\\232\\344\\273\\205\"\n?? \"\\357\\200\\252\\357\\200\\252\\344\\273\\273\\345\\212\\241\\346\\200\\247\\350\\264\\250\\357\\200\\252\\357\\200\\252\\357\\274\\232\\346\\212\\200\\346\\234\\257\\345\\217\\257\\350\\241\\214\\346\\200\\247\\351\\252\\214\\350\\257\\201\\357\\274\\210\\357\\200\\252\\357\\200\\252\\346\\234\\252\\344\\277\\256\\346\\224\\271\\344\\273\\273\\344\\275\\225\\344\\270\\232\\345\\212\\241\\346\\272\\220\\347\\240\\201\\357\\200\\252\\357\\200\\252\\357\\274\\211\"\n?? \"\\357\\200\\252\\357\\200\\252\\344\\274\\230\\345\\205\\210\\347\\272\\247\\357\\200\\252\\357\\200\\252\\357\\200\\272\"\n?? \"\\357\\200\\252\\357\\200\\252\\344\\275\\234\\350\\200\\205\\357\\200\\252\\357\\200\\252\\357\\200\\272\"\n?? \"\\357\\200\\252\\357\\200\\252\\345\\205\\263\\350\\201\\224\"\n?? \"\\357\\200\\252\\357\\200\\252\\345\\205\\263\\350\\201\\224\\357\\200\\252\\357\\200\\252\\357\\200\\272\"\n?? \"\\357\\200\\252\\357\\200\\252\\346\\226\\207\\346\\241\\243\\347\\211\\210\\346\\234\\254\\357\\200\\252\\357\\200\\252\\357\\274\\232v1.0\"\n?? \"\\357\\200\\252\\357\\200\\252\\346\\227\\245\\346\\234\\237\\357\\200\\252\\357\\200\\252\\357\\200\\272\"\n?? \"\\357\\200\\252\\357\\200\\252\\347\\211\\210\\346\\234\\254\\357\\200\\252\\357\\200\\252\\357\\200\\272\"\n?? \"\\357\\200\\252\\357\\200\\252\\347\\212\\266\\346\\200\\201\\357\\200\\252\\357\\200\\252\\357\\200\\272\"\n?? \"\\357\\200\\252\\357\\200\\252\\351\\252\\214\\350\\257\\201\\344\\272\\272\\357\\200\\252\\357\\200\\252\\357\\274\\232\\351\\253\\230\\350\\247\\201\\350\\277\\234\\357\\274\\210\\346\\236\\266\\346\\236\\204\\345\\270\\210\\357\\274\\211\"\n?? \"\\357\\200\\252\\357\\200\\252\\351\\252\\214\\350\\257\\201\\346\\227\\245\\346\\234\\237\\357\\200\\252\\357\\200\\252\\357\\274\\2322026-08-08\"\n"
}