auto-coder-web 0.1.24__py3-none-any.whl → 0.1.26__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (30) hide show
  1. auto_coder_web/auto_coder_runner_wrapper.py +7 -0
  2. auto_coder_web/common_router/__init__.py +0 -0
  3. auto_coder_web/common_router/auto_coder_conf_router.py +39 -0
  4. auto_coder_web/common_router/chat_list_router.py +75 -0
  5. auto_coder_web/common_router/completions_router.py +53 -0
  6. auto_coder_web/common_router/file_group_router.py +192 -0
  7. auto_coder_web/common_router/file_router.py +79 -0
  8. auto_coder_web/proxy.py +22 -477
  9. auto_coder_web/routers/chat_router.py +330 -0
  10. auto_coder_web/routers/coding_router.py +330 -0
  11. auto_coder_web/routers/config_router.py +199 -0
  12. auto_coder_web/routers/todo_router.py +463 -20
  13. auto_coder_web/version.py +1 -1
  14. auto_coder_web/web/asset-manifest.json +6 -6
  15. auto_coder_web/web/index.html +1 -1
  16. auto_coder_web/web/static/css/main.b9764291.css +6 -0
  17. auto_coder_web/web/static/css/main.b9764291.css.map +1 -0
  18. auto_coder_web/web/static/js/main.a707a18c.js +3 -0
  19. auto_coder_web/web/static/js/{main.470202a1.js.LICENSE.txt → main.a707a18c.js.LICENSE.txt} +43 -1
  20. auto_coder_web/web/static/js/{main.470202a1.js.map → main.a707a18c.js.map} +1 -1
  21. {auto_coder_web-0.1.24.dist-info → auto_coder_web-0.1.26.dist-info}/METADATA +1 -1
  22. {auto_coder_web-0.1.24.dist-info → auto_coder_web-0.1.26.dist-info}/RECORD +27 -16
  23. {auto_coder_web-0.1.24.dist-info → auto_coder_web-0.1.26.dist-info}/top_level.txt +1 -0
  24. expert_routers/__init__.py +3 -0
  25. expert_routers/history_router.py +333 -0
  26. auto_coder_web/web/static/css/main.770925e5.css +0 -6
  27. auto_coder_web/web/static/css/main.770925e5.css.map +0 -1
  28. auto_coder_web/web/static/js/main.470202a1.js +0 -3
  29. {auto_coder_web-0.1.24.dist-info → auto_coder_web-0.1.26.dist-info}/WHEEL +0 -0
  30. {auto_coder_web-0.1.24.dist-info → auto_coder_web-0.1.26.dist-info}/entry_points.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: auto_coder_web
3
- Version: 0.1.24
3
+ Version: 0.1.26
4
4
  Summary: auto-coder.web: A Python Project
5
5
  Author: allwefantasy
6
6
  Classifier: Programming Language :: Python :: 3.9
@@ -1,21 +1,30 @@
1
1
  auto_coder_web/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
2
  auto_coder_web/auto_coder_runner.py,sha256=avOF60tq2TkMAgLPbnengs2WEU8I8fUzmmFbLQacmUY,33817
3
- auto_coder_web/auto_coder_runner_wrapper.py,sha256=G5qViGEMdU3ZinMfDCCriYrp8vb8FvbKEykzs_pmT-8,1049
3
+ auto_coder_web/auto_coder_runner_wrapper.py,sha256=1uJMlTocssXXLghUVkKlajfjCfAmI00HA3oQVMd-eis,1188
4
4
  auto_coder_web/file_group.py,sha256=wS52bHDT_gATIrHgVq62Mv1JMLGzdY_AU08iPzw4eLU,2540
5
5
  auto_coder_web/file_manager.py,sha256=wYe0NKqclhB22zTXT7du-5WRqne65tAZiTVAKsEZiaA,4236
6
6
  auto_coder_web/json_file_storage.py,sha256=elthpcdclXITX3jew2EtT-ypyxZzDAzG1U7_k3looHI,1757
7
- auto_coder_web/proxy.py,sha256=SXbb1-JFhfuMSINJjFfH54eCH1l5LBZt7icPOVIxj1Q,40002
7
+ auto_coder_web/proxy.py,sha256=so7Myu5RkoJqDDrNxBKAbU94vnh5LaqXiogVUVPWlWg,20322
8
8
  auto_coder_web/terminal.py,sha256=jtAH7FaC573cgxc7FnI_mOZ3D2dSCO3PrZN0OehtbNQ,9521
9
9
  auto_coder_web/types.py,sha256=TT-0UruUi67wz7w1DpjFyYeaCnkdKYviJvlpSnrdtD4,1435
10
- auto_coder_web/version.py,sha256=Jq7e1LcKcQSNVg4EOJ-acPyPgs8Os5cYEZWXrQsI7Pg,23
10
+ auto_coder_web/version.py,sha256=3_QdGLpuk_SDY7k9PpNcHpSTjlPdhadPiEgF82wzkqk,23
11
+ auto_coder_web/common_router/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
12
+ auto_coder_web/common_router/auto_coder_conf_router.py,sha256=w6Ekrftlmb1QyVYi7f_RFBtPqtot59BVJ1QcUASKFe0,995
13
+ auto_coder_web/common_router/chat_list_router.py,sha256=Au84BGChRETQ_Vib0zMc1Wh7hwsxpd96XeSZJxqluSM,2820
14
+ auto_coder_web/common_router/completions_router.py,sha256=vrTOPb0OsjPHBDjLlHVP1szce9SZCsKvJkFks1MA_sg,2059
15
+ auto_coder_web/common_router/file_group_router.py,sha256=KC10xFNBgEMXAQEk8W53KjeRxYb6oXfroCigxhq7XRw,6182
16
+ auto_coder_web/common_router/file_router.py,sha256=-mUeTotSvkIsXn6BHY91ikYyKvhsJqP4x3vESU-Lc6Y,2414
11
17
  auto_coder_web/routers/__init__.py,sha256=q68zNG2ztrLJn56_d7xX1JyfBnVjj_pXeoLxKP6sasQ,81
12
18
  auto_coder_web/routers/auto_router.py,sha256=rWLyspJresYjDf_Xz2K5nODlsjqMSBpkIbc-VSXfbEY,12739
19
+ auto_coder_web/routers/chat_router.py,sha256=P0MIV8-EIBUNvoVeTyREnEGID_enSQCilhh1uXP4Wq0,12178
20
+ auto_coder_web/routers/coding_router.py,sha256=SGU9_DtDLEA_nrq3HFnltUddGwLzI9dUOXxr71rJHmU,12217
13
21
  auto_coder_web/routers/commit_router.py,sha256=uy1EKOP8OsnnSjeDIElssiD41VxJIFRJjJSzhLrrey4,27335
22
+ auto_coder_web/routers/config_router.py,sha256=QZ0hSTeFmU2B8NEv-VlCmRp7hbnzjGU07vw5IA1J8zg,6342
14
23
  auto_coder_web/routers/settings_router.py,sha256=YeOY2GLhpu8kLRXrUrN7-IMt_Do__Y30G2wNRvGTPiM,2363
15
- auto_coder_web/routers/todo_router.py,sha256=RLQJnutyqaZ99mQYCEhP6Sa-4YLTQY8h_w_u91wCET8,4835
16
- auto_coder_web/web/asset-manifest.json,sha256=lA68MPjRwJ77kyAwVlfSOyj0yJDmy8WdIfLhPVIKNwg,517
24
+ auto_coder_web/routers/todo_router.py,sha256=ZzLt4ZZu8i8lhRFMlLugZuOpEk1mz3PKVZGKFJXlD9E,19465
25
+ auto_coder_web/web/asset-manifest.json,sha256=VwrHhJfNik2CUl6slgXRITvak_A4ad33WDhI9wb2NN4,517
17
26
  auto_coder_web/web/favicon.ico,sha256=PRD32mxgMXg0AIFmjErFs66XQ8qaJiqw_NMS-7n0i90,3870
18
- auto_coder_web/web/index.html,sha256=cJDCaK5m4p_r9bI3dPLK6HOteK0cgBqlR-Fx0ZVfM1A,644
27
+ auto_coder_web/web/index.html,sha256=qRFS_MEpNhZQHTvk3Ub8_ni-C2LASYuo2ntziKyYgUM,644
19
28
  auto_coder_web/web/logo192.png,sha256=w4Y5bscNs2CAdbX7-qxKscyqhroFpoqzk-xVHrZsPgA,5347
20
29
  auto_coder_web/web/logo512.png,sha256=nqT02nBQwMxAiSb2o5wlNiTpursdQ8eXfNghRFpgtGE,9664
21
30
  auto_coder_web/web/manifest.json,sha256=ULPYw5A68_eNhxuUVXqxT045yhkurKPSz6hjyGcnmhQ,492
@@ -123,15 +132,17 @@ auto_coder_web/web/monaco-editor/min/vs/language/json/jsonMode.js,sha256=kgD_zkr
123
132
  auto_coder_web/web/monaco-editor/min/vs/language/json/jsonWorker.js,sha256=Sxl8QWXjVqBIV-kxfsPVNv27krkQd7xINZDE9RBW498,131177
124
133
  auto_coder_web/web/monaco-editor/min/vs/language/typescript/tsMode.js,sha256=-ycH7oQBPivkxY9WVOPWI8z3PPwz283Qv4KngJRc_PE,23919
125
134
  auto_coder_web/web/monaco-editor/min/vs/language/typescript/tsWorker.js,sha256=_9-LDU1BwUWvrmkZvroRAzaGB1nc4L2twqFFwGoaSO0,5749518
126
- auto_coder_web/web/static/css/main.770925e5.css,sha256=CfMGV-_9OBw0J1HABWvOZmj77SxHVCKCLluesDFd6fc,41066
127
- auto_coder_web/web/static/css/main.770925e5.css.map,sha256=Kz7xsizdoFEGNJzBKquX5al8ParHkte5xtzVP6jY2YE,25827
135
+ auto_coder_web/web/static/css/main.b9764291.css,sha256=WKQFynC8JvOsq8qlkp0lZketLwI51GAZ29ig-OlEo14,59585
136
+ auto_coder_web/web/static/css/main.b9764291.css.map,sha256=rluupN2QzXsi96JQ4s1KY1lJmmF419_mDjKx5x9ybvE,59128
128
137
  auto_coder_web/web/static/js/453.d855a71b.chunk.js,sha256=Uozi_HuBwNjbUKVqSIMLOC3N3Zv28KY7ujj08kX0kuA,4517
129
138
  auto_coder_web/web/static/js/453.d855a71b.chunk.js.map,sha256=PXkP8ryNTOc0rDK7NXOpD9F_10SfoGNuo7ZfKj2gjh8,10597
130
- auto_coder_web/web/static/js/main.470202a1.js,sha256=5itJniNTa_IWOUmiTdgNI2PAZ_4DiPociNrdne2o_ZY,2645422
131
- auto_coder_web/web/static/js/main.470202a1.js.LICENSE.txt,sha256=cEkExHTWgoixJvKZ-w3glgeiffYclkDxaBYIXTX74K0,30453
132
- auto_coder_web/web/static/js/main.470202a1.js.map,sha256=G2ZV_qYCi5dC-q3JgFb0SPjkOYEz4g2fNEmiMsdqEZc,9434031
133
- auto_coder_web-0.1.24.dist-info/METADATA,sha256=k_2bYbaKkBrY6oGEJ7EMlXDjXqbHgdGP1iLaE8GJyfQ,1378
134
- auto_coder_web-0.1.24.dist-info/WHEEL,sha256=GV9aMThwP_4oNCtvEC2ec3qUYutgWeAzklro_0m4WJQ,91
135
- auto_coder_web-0.1.24.dist-info/entry_points.txt,sha256=oh8kd1ZecWDgdv-bIj_ru3phvl4scuxwXl9DK0Khltg,61
136
- auto_coder_web-0.1.24.dist-info/top_level.txt,sha256=UCzEw494Im0KvR-FTYf2jh-okqHvLsC_0JLOrQZoSpg,15
137
- auto_coder_web-0.1.24.dist-info/RECORD,,
139
+ auto_coder_web/web/static/js/main.a707a18c.js,sha256=LXiLFS09-JKYgt0Su7o_zn3L_wwDTHAWxK6fN85evHE,2782620
140
+ auto_coder_web/web/static/js/main.a707a18c.js.LICENSE.txt,sha256=4s31uMgM16-ShH9qH-ejykD6t5cKnoV5w9U5Yr_BzPo,49044
141
+ auto_coder_web/web/static/js/main.a707a18c.js.map,sha256=0U6VAwaDro5LFo7va-5YBkEYvORh1Q2L-gHK_hKQmAY,10077190
142
+ expert_routers/__init__.py,sha256=4vN4-vaaDwBV11jxd7QXXJu_quwgk4NwvB15X30TE8Y,83
143
+ expert_routers/history_router.py,sha256=Q0yxKY4IY6aGQoEZo16Wmk8gNWZor-mNfLGAd7obwsY,11641
144
+ auto_coder_web-0.1.26.dist-info/METADATA,sha256=dUHCAs2lYDMS3t8vQwFiUtzMSCiUZOtiLFzgILdFpQY,1378
145
+ auto_coder_web-0.1.26.dist-info/WHEEL,sha256=GV9aMThwP_4oNCtvEC2ec3qUYutgWeAzklro_0m4WJQ,91
146
+ auto_coder_web-0.1.26.dist-info/entry_points.txt,sha256=oh8kd1ZecWDgdv-bIj_ru3phvl4scuxwXl9DK0Khltg,61
147
+ auto_coder_web-0.1.26.dist-info/top_level.txt,sha256=2Uh6zUNZ_Kp9Ceq60CVouVqtwAZK7cSZ61h3O7MtmEc,30
148
+ auto_coder_web-0.1.26.dist-info/RECORD,,
@@ -1 +1,2 @@
1
1
  auto_coder_web
2
+ expert_routers
@@ -0,0 +1,3 @@
1
+ from .history_router import router as history_router
2
+
3
+ __all__ = ['history_router']
@@ -0,0 +1,333 @@
1
+ import os
2
+ import re
3
+ from datetime import datetime
4
+ from typing import Dict, List, Optional, Any
5
+
6
+ from fastapi import APIRouter, HTTPException, Request, Depends, Query
7
+ from pydantic import BaseModel
8
+ from loguru import logger
9
+ import git
10
+ from git import Repo, GitCommandError
11
+ from loguru import logger
12
+
13
+ # 导入获取事件和action文件的相关模块
14
+ from autocoder.events.event_manager_singleton import get_event_manager, get_event_file_path
15
+ from autocoder.events.event_types import EventType
16
+ from autocoder.common.action_yml_file_manager import ActionYmlFileManager
17
+
18
+ router = APIRouter()
19
+
20
+
21
+ class Query(BaseModel):
22
+ query: str
23
+ timestamp: Optional[str] = None
24
+ response: Optional[str] = None
25
+ urls: Optional[List[str]] = None
26
+ file_number: int
27
+ is_reverted: bool = False
28
+
29
+
30
+ class HistoryResponse(BaseModel):
31
+ success: bool
32
+ message: Optional[str] = None
33
+ queries: Optional[List[Query]] = None
34
+
35
+
36
+ class DiffResponse(BaseModel):
37
+ success: bool
38
+ message: Optional[str] = None
39
+ diff: Optional[str] = None
40
+ file_changes: Optional[List[Dict[str, str]]] = None
41
+
42
+
43
+ class FileDiffResponse(BaseModel):
44
+ success: bool
45
+ message: Optional[str] = None
46
+ file_diff: Optional[Dict[str, str]] = None
47
+
48
+
49
+ async def get_project_path(request: Request) -> str:
50
+ """
51
+ 从FastAPI请求上下文中获取项目路径
52
+ """
53
+ return request.app.state.project_path
54
+
55
+
56
+ def get_repo(project_path: str) -> Repo:
57
+ """
58
+ 获取Git仓库对象
59
+ """
60
+ try:
61
+ return Repo(project_path)
62
+ except (git.NoSuchPathError, git.InvalidGitRepositoryError) as e:
63
+ logger.error(f"Git repository error: {str(e)}")
64
+ raise HTTPException(
65
+ status_code=404,
66
+ detail="No Git repository found in the project path"
67
+ )
68
+
69
+
70
+ @router.get("/api/history/validate-and-load", response_model=HistoryResponse)
71
+ async def validate_and_load_history(
72
+ project_path: str = Depends(get_project_path)
73
+ ):
74
+ """
75
+ 验证并加载历史记录
76
+
77
+ Args:
78
+ project_path: 项目路径
79
+
80
+ Returns:
81
+ 历史记录查询列表
82
+ """
83
+ try:
84
+ # # 获取事件管理器
85
+ # event_manager = get_event_manager()
86
+
87
+ # # 获取所有事件文件
88
+ # event_files = event_manager.get_all_event_files()
89
+
90
+ # 过滤出聊天动作事件
91
+ action_manager = ActionYmlFileManager(project_path)
92
+ chat_action_files = action_manager.get_action_files()
93
+
94
+ # 获取Git仓库,用于检查提交是否被撤销
95
+ repo = get_repo(project_path)
96
+
97
+ # 查找所有撤销提交
98
+ reverted_commits = {}
99
+ try:
100
+ # 遍历所有提交查找撤销提交
101
+ for commit in repo.iter_commits():
102
+ message = commit.message.strip()
103
+ if message.startswith("<revert>"):
104
+ # 尝试从撤销提交消息中提取原始提交哈希值
105
+ # <revert>原始消息\n原始提交哈希
106
+ lines = message.split('\n')
107
+ if len(lines) > 1:
108
+ original_hash = lines[-1].strip()
109
+ reverted_commits[original_hash] = True
110
+ logger.info(f"找到撤销提交 {commit.hexsha[:7]} 撤销了 {original_hash[:7]}")
111
+ except Exception as e:
112
+ logger.error(f"获取撤销提交信息时出错: {str(e)}")
113
+
114
+ queries = []
115
+ for file_path in chat_action_files:
116
+ try:
117
+ # 获取文件内容
118
+ action_data = action_manager.load_yaml_content(file_path)
119
+ timestamp = os.path.getmtime(os.path.join(action_manager.actions_dir, file_path))
120
+
121
+ if not action_data:
122
+ continue
123
+
124
+ # 提取查询内容
125
+ file_number_str = file_path.split("_")[0]
126
+ try:
127
+ file_number = int(file_number_str)
128
+ except ValueError:
129
+ file_number = 0
130
+
131
+ query_content = action_data.get("query", "")
132
+
133
+ # 提取响应ID(如果有)
134
+ response_id = action_manager.get_commit_id_from_file(file_path)
135
+
136
+ # 检查该提交是否已被撤销
137
+ is_reverted = False
138
+ if response_id and response_id in reverted_commits:
139
+ logger.info(f"提交 {response_id[:7]} 已被撤销")
140
+ is_reverted = True
141
+
142
+ # 提取上下文URL(如果有)
143
+ context_urls = action_data.get("urls", []) + action_data.get("dynamic_urls", [])
144
+ if context_urls is None:
145
+ context_urls = []
146
+
147
+ # 格式化时间戳为字符串
148
+ timestamp_str = datetime.fromtimestamp(timestamp).strftime('%Y-%m-%d %H:%M:%S')
149
+
150
+ # 创建查询对象
151
+ query = Query(
152
+ query=query_content,
153
+ timestamp=timestamp_str,
154
+ response=response_id,
155
+ urls=context_urls,
156
+ file_number=file_number,
157
+ is_reverted=is_reverted
158
+ )
159
+
160
+ queries.append(query)
161
+ except Exception as e:
162
+ logger.error(f"Error processing file {file_path}: {str(e)}")
163
+ continue
164
+
165
+ # 按文件编号降序排序
166
+ queries.sort(key=lambda x: x.file_number, reverse=True)
167
+
168
+ return {"success": True, "queries": queries}
169
+ except Exception as e:
170
+ logger.error(f"Error loading history: {str(e)}")
171
+ return {"success": False, "message": f"加载历史记录失败: {str(e)}"}
172
+
173
+
174
+ @router.get("/api/history/commit-diff/{response_id}", response_model=DiffResponse)
175
+ async def get_commit_diff(
176
+ response_id: str,
177
+ project_path: str = Depends(get_project_path)
178
+ ):
179
+ """
180
+ 获取指定响应ID对应的提交差异
181
+
182
+ Args:
183
+ response_id: 响应ID,通常是提交哈希值
184
+ project_path: 项目路径
185
+
186
+ Returns:
187
+ 提交差异信息
188
+ """
189
+ try:
190
+ repo = get_repo(project_path)
191
+
192
+ # 尝试获取提交
193
+ try:
194
+ commit = repo.commit(response_id)
195
+ except GitCommandError:
196
+ return {"success": False, "message": f"找不到提交: {response_id}"}
197
+
198
+ # 获取父提交
199
+ if not commit.parents:
200
+ # 如果没有父提交,这是第一个提交
201
+ diff = repo.git.show(commit.hexsha, format="")
202
+ file_changes = []
203
+
204
+ # 解析diff获取文件变更
205
+ for file_path in commit.stats.files:
206
+ file_changes.append({
207
+ "path": file_path,
208
+ "change_type": "added"
209
+ })
210
+ else:
211
+ # 获取与父提交的差异
212
+ parent = commit.parents[0]
213
+ diff = repo.git.diff(parent.hexsha, commit.hexsha)
214
+
215
+ # 获取文件变更列表
216
+ file_changes = []
217
+ for file_path, stats in commit.stats.files.items():
218
+ # 判断文件变更类型
219
+ if not os.path.exists(os.path.join(project_path, file_path)):
220
+ change_type = "deleted"
221
+ elif file_path not in parent.stats.files:
222
+ change_type = "added"
223
+ else:
224
+ change_type = "modified"
225
+
226
+ file_changes.append({
227
+ "path": file_path,
228
+ "change_type": change_type
229
+ })
230
+
231
+ return {
232
+ "success": True,
233
+ "diff": diff,
234
+ "file_changes": file_changes
235
+ }
236
+ except Exception as e:
237
+ logger.error(f"Error getting commit diff: {str(e)}")
238
+ return {"success": False, "message": f"获取差异失败: {str(e)}"}
239
+
240
+
241
+ @router.get("/api/history/file-diff/{response_id}", response_model=FileDiffResponse)
242
+ async def get_file_diff(
243
+ response_id: str,
244
+ file_path: str,
245
+ project_path: str = Depends(get_project_path)
246
+ ):
247
+ """
248
+ 获取指定提交中特定文件的差异详情
249
+
250
+ Args:
251
+ response_id: 响应ID,通常是提交哈希值
252
+ file_path: 文件路径
253
+ project_path: 项目路径
254
+
255
+ Returns:
256
+ 文件差异详情
257
+ """
258
+ try:
259
+ repo = get_repo(project_path)
260
+
261
+ # 尝试获取提交
262
+ try:
263
+ commit = repo.commit(response_id)
264
+ except GitCommandError:
265
+ return {"success": False, "message": f"找不到提交: {response_id}"}
266
+
267
+ # 获取文件差异信息
268
+ file_status = ""
269
+ before_content = ""
270
+ after_content = ""
271
+ diff_content = ""
272
+
273
+ # 处理父提交
274
+ if not commit.parents:
275
+ # 如果没有父提交,这是第一个提交
276
+ try:
277
+ # 检查文件是否在提交中
278
+ blob = commit.tree[file_path]
279
+ after_content = blob.data_stream.read().decode('utf-8', errors='replace')
280
+ diff_content = repo.git.show(f"{commit.hexsha} -- {file_path}")
281
+ file_status = "added"
282
+ except (KeyError, UnicodeDecodeError, git.GitCommandError) as e:
283
+ logger.error(f"Error getting file content: {str(e)}")
284
+ return {"success": False, "message": f"获取文件内容失败: {str(e)}"}
285
+ else:
286
+ # 有父提交,获取差异
287
+ parent = commit.parents[0]
288
+
289
+ # 检查文件在当前提交中是否存在
290
+ file_in_current = False
291
+ try:
292
+ blob = commit.tree[file_path]
293
+ after_content = blob.data_stream.read().decode('utf-8', errors='replace')
294
+ file_in_current = True
295
+ except (KeyError, UnicodeDecodeError):
296
+ after_content = ""
297
+
298
+ # 检查文件在父提交中是否存在
299
+ file_in_parent = False
300
+ try:
301
+ blob = parent.tree[file_path]
302
+ before_content = blob.data_stream.read().decode('utf-8', errors='replace')
303
+ file_in_parent = True
304
+ except (KeyError, UnicodeDecodeError):
305
+ before_content = ""
306
+
307
+ # 确定文件状态
308
+ if file_in_current and file_in_parent:
309
+ file_status = "modified"
310
+ elif file_in_current:
311
+ file_status = "added"
312
+ else:
313
+ file_status = "deleted"
314
+
315
+ # 获取文件差异
316
+ try:
317
+ diff_content = repo.git.diff(f"{parent.hexsha}..{commit.hexsha}", "--", file_path)
318
+ except git.GitCommandError as e:
319
+ logger.error(f"Error getting file diff: {str(e)}")
320
+ diff_content = ""
321
+
322
+ return {
323
+ "success": True,
324
+ "file_diff": {
325
+ "before_content": before_content,
326
+ "after_content": after_content,
327
+ "diff_content": diff_content,
328
+ "file_status": file_status
329
+ }
330
+ }
331
+ except Exception as e:
332
+ logger.error(f"Error getting file diff: {str(e)}")
333
+ return {"success": False, "message": f"获取文件差异失败: {str(e)}"}
@@ -1,6 +0,0 @@
1
- /*
2
- ! tailwindcss v3.4.14 | MIT License | https://tailwindcss.com
3
- */body{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif;font-size:14px;line-height:1.5}code{font-family:source-code-pro,Menlo,Monaco,Consolas,Courier New,monospace}.xterm{cursor:text;position:relative;user-select:none;-ms-user-select:none;-webkit-user-select:none}.xterm.focus,.xterm:focus{outline:none}.xterm .xterm-helpers{position:absolute;top:0;z-index:5}.xterm .xterm-helper-textarea{border:0;height:0;left:-9999em;margin:0;opacity:0;overflow:hidden;padding:0;position:absolute;resize:none;top:0;white-space:nowrap;width:0;z-index:-5}.xterm .composition-view{background:#000;color:#fff;display:none;position:absolute;white-space:nowrap;z-index:1}.xterm .composition-view.active{display:block}.xterm .xterm-viewport{background-color:#000;bottom:0;cursor:default;left:0;overflow-y:scroll;position:absolute;right:0;top:0}.xterm .xterm-screen{position:relative}.xterm .xterm-screen canvas{left:0;position:absolute;top:0}.xterm .xterm-scroll-area{visibility:hidden}.xterm-char-measure-element{display:inline-block;left:-9999em;line-height:normal;position:absolute;top:0;visibility:hidden}.xterm.enable-mouse-events{cursor:default}.xterm .xterm-cursor-pointer,.xterm.xterm-cursor-pointer{cursor:pointer}.xterm.column-select.focus{cursor:crosshair}.xterm .xterm-accessibility:not(.debug),.xterm .xterm-message{bottom:0;color:#0000;left:0;pointer-events:none;position:absolute;right:0;top:0;z-index:10}.xterm .xterm-accessibility-tree:not(.debug) ::selection{color:#0000}.xterm .xterm-accessibility-tree{-webkit-user-select:text;user-select:text;white-space:pre}.xterm .live-region{height:1px;left:-9999px;overflow:hidden;position:absolute;width:1px}.xterm-dim{opacity:1!important}.xterm-underline-1{text-decoration:underline}.xterm-underline-2{-webkit-text-decoration:double underline;text-decoration:double underline}.xterm-underline-3{-webkit-text-decoration:wavy underline;text-decoration:wavy underline}.xterm-underline-4{-webkit-text-decoration:dotted underline;text-decoration:dotted underline}.xterm-underline-5{-webkit-text-decoration:dashed underline;text-decoration:dashed underline}.xterm-overline{text-decoration:overline}.xterm-overline.xterm-underline-1{text-decoration:overline underline}.xterm-overline.xterm-underline-2{-webkit-text-decoration:overline double underline;text-decoration:overline double underline}.xterm-overline.xterm-underline-3{-webkit-text-decoration:overline wavy underline;text-decoration:overline wavy underline}.xterm-overline.xterm-underline-4{-webkit-text-decoration:overline dotted underline;text-decoration:overline dotted underline}.xterm-overline.xterm-underline-5{-webkit-text-decoration:overline dashed underline;text-decoration:overline dashed underline}.xterm-strikethrough{text-decoration:line-through}.xterm-screen .xterm-decoration-container .xterm-decoration{position:absolute;z-index:6}.xterm-screen .xterm-decoration-container .xterm-decoration.xterm-decoration-top-layer{z-index:7}.xterm-decoration-overview-ruler{pointer-events:none;position:absolute;right:0;top:0;z-index:8}.xterm-decoration-top{position:relative;z-index:2}.split-container{display:flex;height:100%;width:100%}.gutter{position:relative}.gutter.gutter-horizontal{cursor:col-resize}.gutter:after{background-color:#9ca3af;border-radius:2px;content:"";height:20px;left:50%;position:absolute;top:50%;transform:translate(-50%,-50%);width:4px}.gutter:hover:after{background-color:#f3f4f6}.split-container>div{height:100%;min-width:0;overflow:hidden}.todo-container{background-color:initial}.todo-column{background-color:#1a1a1a;border:1px solid #2d2d2d;min-height:200px;transition:all .2s ease}.todo-column:hover{border-color:#3d3d3d}.todo-column.is-dragging-over{background:#3b82f61a;border-color:#3b82f6;transition:background .2s ease}.todo-card{background-color:#2d2d2d;border:1px solid #374151;cursor:move;transition:all .2s ease;-webkit-user-select:none;user-select:none}.todo-card:hover{background-color:#374151;box-shadow:0 2px 4px #0000001a;transform:translateY(-1px)}.todo-card.is-dragging{border-color:#3b82f6;box-shadow:0 4px 8px #3b82f633;opacity:.8;transform:scale(1.02)}.todo-title{color:#e5e7eb;font-size:14px;line-height:1.4}.todo-due-date{color:#9ca3af;font-size:12px;margin-top:4px}.todo-tags{display:flex;flex-wrap:wrap;gap:4px}.ant-modal-title{color:#e5e7eb!important}.ant-modal-close{color:#9ca3af!important}.ant-modal-close:hover{color:#e5e7eb!important}.custom-input{border-color:#374151!important}.custom-select .ant-select-selector{background-color:#1f2937!important;border-color:#374151!important;color:#e5e7eb!important}*,::backdrop,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#3b82f680;--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }/*
4
- ! tailwindcss v3.4.14 | MIT License | https://tailwindcss.com
5
- */*,:after,:before{border:0 solid #e5e7eb;box-sizing:border-box}:after,:before{--tw-content:""}:host,html{-webkit-text-size-adjust:100%;font-feature-settings:normal;-webkit-tap-highlight-color:transparent;font-family:ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-variation-settings:normal;line-height:1.5;tab-size:4}body{line-height:inherit;margin:0}hr{border-top-width:1px;color:inherit;height:0}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-feature-settings:normal;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:1em;font-variation-settings:normal}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:initial}sub{bottom:-.25em}sup{top:-.5em}table{border-collapse:collapse;border-color:inherit;text-indent:0}button,input,optgroup,select,textarea{font-feature-settings:inherit;color:inherit;font-family:inherit;font-size:100%;font-variation-settings:inherit;font-weight:inherit;letter-spacing:inherit;line-height:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:initial;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:initial}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::placeholder,textarea::placeholder{color:#9ca3af;opacity:1}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{height:auto;max-width:100%}[hidden]:where(:not([hidden=until-found])){display:none}*{scrollbar-color:auto;scrollbar-width:auto}.\!container{width:100%!important}.container{width:100%}@media (min-width:640px){.\!container{max-width:640px!important}.container{max-width:640px}}@media (min-width:768px){.\!container{max-width:768px!important}.container{max-width:768px}}@media (min-width:1024px){.\!container{max-width:1024px!important}.container{max-width:1024px}}@media (min-width:1280px){.\!container{max-width:1280px!important}.container{max-width:1280px}}@media (min-width:1536px){.\!container{max-width:1536px!important}.container{max-width:1536px}}.visible{visibility:visible}.invisible{visibility:hidden}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{inset:0}.-right-2{right:-.5rem}.-right-4{right:-1rem}.-top-2{top:-.5rem}.bottom-0{bottom:0}.left-0{left:0}.left-10{left:2.5rem}.left-2{left:.5rem}.left-3\.5{left:.875rem}.right-0{right:0}.right-4{right:1rem}.top-0{top:0}.top-1\/2{top:50%}.top-2{top:.5rem}.top-4{top:1rem}.top-full{top:100%}.z-10{z-index:10}.z-20{z-index:20}.z-50{z-index:50}.col-span-3{grid-column:span 3/span 3}.mx-1{margin-left:.25rem;margin-right:.25rem}.mx-2{margin-left:.5rem;margin-right:.5rem}.mx-auto{margin-left:auto;margin-right:auto}.my-1{margin-bottom:.25rem;margin-top:.25rem}.my-4{margin-bottom:1rem;margin-top:1rem}.-ml-1{margin-left:-.25rem}.mb-1{margin-bottom:.25rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.mb-6{margin-bottom:1.5rem}.ml-1{margin-left:.25rem}.ml-2{margin-left:.5rem}.ml-4{margin-left:1rem}.ml-auto{margin-left:auto}.mr-1{margin-right:.25rem}.mr-1\.5{margin-right:.375rem}.mr-2{margin-right:.5rem}.mr-3{margin-right:.75rem}.mt-1{margin-top:.25rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.mt-4{margin-top:1rem}.mt-6{margin-top:1.5rem}.mt-auto{margin-top:auto}.block{display:block}.\!inline{display:inline!important}.inline{display:inline}.flex{display:flex}.table{display:table}.grid{display:grid}.hidden{display:none}.h-1\.5{height:.375rem}.h-10{height:2.5rem}.h-12{height:3rem}.h-2{height:.5rem}.h-3{height:.75rem}.h-3\.5{height:.875rem}.h-4{height:1rem}.h-48{height:12rem}.h-5{height:1.25rem}.h-7{height:1.75rem}.h-8{height:2rem}.h-9{height:2.25rem}.h-\[1px\]{height:1px}.h-\[50\%\]{height:50%}.h-\[80vh\]{height:80vh}.h-\[calc\(100\%-80px\)\]{height:calc(100% - 80px)}.h-full{height:100%}.h-screen{height:100vh}.max-h-80{max-height:20rem}.max-h-96{max-height:24rem}.max-h-\[150px\]{max-height:150px}.max-h-screen{max-height:100vh}.min-h-\[150px\]{min-height:150px}.w-1\.5{width:.375rem}.w-10{width:2.5rem}.w-12{width:3rem}.w-2{width:.5rem}.w-28{width:7rem}.w-3{width:.75rem}.w-3\.5{width:.875rem}.w-4{width:1rem}.w-48{width:12rem}.w-5{width:1.25rem}.w-56{width:14rem}.w-60{width:15rem}.w-64{width:16rem}.w-7{width:1.75rem}.w-8{width:2rem}.w-80{width:20rem}.w-96{width:24rem}.w-\[50px\]{width:50px}.w-\[80\%\]{width:80%}.w-full{width:100%}.max-w-3xl{max-width:48rem}.max-w-4xl{max-width:56rem}.max-w-5xl{max-width:64rem}.max-w-\[80\%\]{max-width:80%}.max-w-full{max-width:100%}.max-w-md{max-width:28rem}.max-w-none{max-width:none}.flex-1{flex:1 1}.flex-shrink-0{flex-shrink:0}.flex-grow{flex-grow:1}.origin-top-right{transform-origin:top right}.-translate-y-1\/2{--tw-translate-y:-50%}.-translate-y-1\/2,.rotate-180{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rotate-180{--tw-rotate:180deg}.rotate-45{--tw-rotate:45deg}.rotate-45,.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes bounce{0%,to{animation-timing-function:cubic-bezier(.8,0,1,1);transform:translateY(-25%)}50%{animation-timing-function:cubic-bezier(0,0,.2,1);transform:none}}.animate-bounce{animation:bounce 1s infinite}@keyframes spin{to{transform:rotate(1turn)}}.animate-spin{animation:spin 1s linear infinite}.cursor-pointer{cursor:pointer}.resize{resize:both}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-\[120px_1fr\]{grid-template-columns:120px 1fr}.flex-row{flex-direction:row}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-start{align-items:flex-start}.items-center{align-items:center}.justify-start{justify-content:flex-start}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-1{gap:.25rem}.gap-2{gap:.5rem}.gap-4{gap:1rem}.space-x-0>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(0px*(1 - var(--tw-space-x-reverse)));margin-right:calc(0px*var(--tw-space-x-reverse))}.space-x-1>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(.25rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(.25rem*var(--tw-space-x-reverse))}.space-x-1\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(.375rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(.375rem*var(--tw-space-x-reverse))}.space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(.5rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(.5rem*var(--tw-space-x-reverse))}.space-x-3>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(.75rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(.75rem*var(--tw-space-x-reverse))}.space-x-4>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(1rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(1rem*var(--tw-space-x-reverse))}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(.25rem*var(--tw-space-y-reverse));margin-top:calc(.25rem*(1 - var(--tw-space-y-reverse)))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(.5rem*var(--tw-space-y-reverse));margin-top:calc(.5rem*(1 - var(--tw-space-y-reverse)))}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(.75rem*var(--tw-space-y-reverse));margin-top:calc(.75rem*(1 - var(--tw-space-y-reverse)))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(1rem*var(--tw-space-y-reverse));margin-top:calc(1rem*(1 - var(--tw-space-y-reverse)))}.space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(1.5rem*var(--tw-space-y-reverse));margin-top:calc(1.5rem*(1 - var(--tw-space-y-reverse)))}.self-start{align-self:flex-start}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-y-auto{overflow-y:auto}.truncate{overflow:hidden;text-overflow:ellipsis}.truncate,.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.rounded{border-radius:.25rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.rounded-xl{border-radius:.75rem}.rounded-l{border-bottom-left-radius:.25rem;border-top-left-radius:.25rem}.rounded-l-lg{border-bottom-left-radius:.5rem;border-top-left-radius:.5rem}.rounded-l-md{border-bottom-left-radius:.375rem;border-top-left-radius:.375rem}.rounded-r-lg{border-bottom-right-radius:.5rem;border-top-right-radius:.5rem}.rounded-r-md{border-bottom-right-radius:.375rem;border-top-right-radius:.375rem}.rounded-t{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.rounded-t-lg{border-top-left-radius:.5rem;border-top-right-radius:.5rem}.rounded-tl-none{border-top-left-radius:0}.rounded-tr-none{border-top-right-radius:0}.border{border-width:1px}.border-0{border-width:0}.border-b{border-bottom-width:1px}.border-b-2{border-bottom-width:2px}.border-l{border-left-width:1px}.border-l-0{border-left-width:0}.border-l-2{border-left-width:2px}.border-l-4{border-left-width:4px}.border-r{border-right-width:1px}.border-t{border-top-width:1px}.border-none{border-style:none}.border-\[\#374151\]{--tw-border-opacity:1;border-color:rgb(55 65 81/var(--tw-border-opacity))}.border-blue-500{--tw-border-opacity:1;border-color:rgb(59 130 246/var(--tw-border-opacity))}.border-gray-600{--tw-border-opacity:1;border-color:rgb(75 85 99/var(--tw-border-opacity))}.border-gray-600\/50{border-color:#4b556380}.border-gray-700{--tw-border-opacity:1;border-color:rgb(55 65 81/var(--tw-border-opacity))}.border-gray-700\/50{border-color:#37415180}.border-indigo-500{--tw-border-opacity:1;border-color:rgb(99 102 241/var(--tw-border-opacity))}.border-indigo-500\/50{border-color:#6366f180}.border-indigo-600{--tw-border-opacity:1;border-color:rgb(79 70 229/var(--tw-border-opacity))}.border-red-500{--tw-border-opacity:1;border-color:rgb(239 68 68/var(--tw-border-opacity))}.border-red-700{--tw-border-opacity:1;border-color:rgb(185 28 28/var(--tw-border-opacity))}.bg-\[\#111827\]{--tw-bg-opacity:1;background-color:rgb(17 24 39/var(--tw-bg-opacity))}.bg-\[\#1F2937\]{--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity))}.bg-\[\#1e1e1e\]{--tw-bg-opacity:1;background-color:rgb(30 30 30/var(--tw-bg-opacity))}.bg-\[\#1f1f1f\]{--tw-bg-opacity:1;background-color:rgb(31 31 31/var(--tw-bg-opacity))}.bg-\[\#2d2d2d\]{--tw-bg-opacity:1;background-color:rgb(45 45 45/var(--tw-bg-opacity))}.bg-black{--tw-bg-opacity:1;background-color:rgb(0 0 0/var(--tw-bg-opacity))}.bg-blue-500{--tw-bg-opacity:1;background-color:rgb(59 130 246/var(--tw-bg-opacity))}.bg-blue-600{--tw-bg-opacity:1;background-color:rgb(37 99 235/var(--tw-bg-opacity))}.bg-gray-400{--tw-bg-opacity:1;background-color:rgb(156 163 175/var(--tw-bg-opacity))}.bg-gray-600{--tw-bg-opacity:1;background-color:rgb(75 85 99/var(--tw-bg-opacity))}.bg-gray-700{--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity))}.bg-gray-700\/50{background-color:#37415180}.bg-gray-700\/70{background-color:#374151b3}.bg-gray-800{--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity))}.bg-gray-800\/20{background-color:#1f293733}.bg-gray-800\/30{background-color:#1f29374d}.bg-gray-800\/50{background-color:#1f293780}.bg-gray-800\/60{background-color:#1f293799}.bg-gray-800\/90{background-color:#1f2937e6}.bg-gray-900{--tw-bg-opacity:1;background-color:rgb(17 24 39/var(--tw-bg-opacity))}.bg-green-500{--tw-bg-opacity:1;background-color:rgb(34 197 94/var(--tw-bg-opacity))}.bg-green-800{--tw-bg-opacity:1;background-color:rgb(22 101 52/var(--tw-bg-opacity))}.bg-green-900{--tw-bg-opacity:1;background-color:rgb(20 83 45/var(--tw-bg-opacity))}.bg-indigo-600{--tw-bg-opacity:1;background-color:rgb(79 70 229/var(--tw-bg-opacity))}.bg-red-500{--tw-bg-opacity:1;background-color:rgb(239 68 68/var(--tw-bg-opacity))}.bg-red-600{--tw-bg-opacity:1;background-color:rgb(220 38 38/var(--tw-bg-opacity))}.bg-red-900{--tw-bg-opacity:1;background-color:rgb(127 29 29/var(--tw-bg-opacity))}.bg-red-900\/80{background-color:#7f1d1dcc}.bg-transparent{background-color:initial}.bg-yellow-500{--tw-bg-opacity:1;background-color:rgb(234 179 8/var(--tw-bg-opacity))}.bg-opacity-25{--tw-bg-opacity:0.25}.bg-opacity-50{--tw-bg-opacity:0.5}.bg-opacity-70{--tw-bg-opacity:0.7}.bg-gradient-to-r{background-image:linear-gradient(to right,var(--tw-gradient-stops))}.from-amber-500{--tw-gradient-from:#f59e0b var(--tw-gradient-from-position);--tw-gradient-to:#f59e0b00 var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.from-blue-500{--tw-gradient-from:#3b82f6 var(--tw-gradient-from-position);--tw-gradient-to:#3b82f600 var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.from-blue-600{--tw-gradient-from:#2563eb var(--tw-gradient-from-position);--tw-gradient-to:#2563eb00 var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.from-blue-900\/70{--tw-gradient-from:#1e3a8ab3 var(--tw-gradient-from-position);--tw-gradient-to:#1e3a8a00 var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.from-gray-800{--tw-gradient-from:#1f2937 var(--tw-gradient-from-position);--tw-gradient-to:#1f293700 var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.from-green-900\/70{--tw-gradient-from:#14532db3 var(--tw-gradient-from-position);--tw-gradient-to:#14532d00 var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.from-indigo-500{--tw-gradient-from:#6366f1 var(--tw-gradient-from-position);--tw-gradient-to:#6366f100 var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.from-purple-800{--tw-gradient-from:#6b21a8 var(--tw-gradient-from-position);--tw-gradient-to:#6b21a800 var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.from-purple-900\/70{--tw-gradient-from:#581c87b3 var(--tw-gradient-from-position);--tw-gradient-to:#581c8700 var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.to-indigo-600{--tw-gradient-to:#4f46e5 var(--tw-gradient-to-position)}.to-indigo-900\/70{--tw-gradient-to:#312e81b3 var(--tw-gradient-to-position)}.to-orange-600{--tw-gradient-to:#ea580c var(--tw-gradient-to-position)}.to-purple-500{--tw-gradient-to:#a855f7 var(--tw-gradient-to-position)}.to-purple-700{--tw-gradient-to:#7e22ce var(--tw-gradient-to-position)}.to-teal-900\/70{--tw-gradient-to:#134e4ab3 var(--tw-gradient-to-position)}.bg-clip-text{-webkit-background-clip:text;background-clip:text}.p-0{padding:0}.p-1{padding:.25rem}.p-1\.5{padding:.375rem}.p-2{padding:.5rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-5{padding:1.25rem}.p-6{padding:1.5rem}.px-1{padding-left:.25rem;padding-right:.25rem}.px-1\.5{padding-left:.375rem;padding-right:.375rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.py-0\.5{padding-bottom:.125rem;padding-top:.125rem}.py-1{padding-bottom:.25rem;padding-top:.25rem}.py-1\.5{padding-bottom:.375rem;padding-top:.375rem}.py-10{padding-bottom:2.5rem;padding-top:2.5rem}.py-2{padding-bottom:.5rem;padding-top:.5rem}.py-3{padding-bottom:.75rem;padding-top:.75rem}.py-6{padding-bottom:1.5rem;padding-top:1.5rem}.pl-16{padding-left:4rem}.pl-4{padding-left:1rem}.pr-16{padding-right:4rem}.pr-2{padding-right:.5rem}.pt-1{padding-top:.25rem}.pt-2{padding-top:.5rem}.pt-4{padding-top:1rem}.pt-6{padding-top:1.5rem}.text-left{text-align:left}.text-center{text-align:center}.font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.font-sans{font-family:ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji}.text-2xs{font-size:.625rem}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-\[9px\]{font-size:9px}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-medium{font-weight:500}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.italic{font-style:italic}.tracking-wider{letter-spacing:.05em}.text-amber-400{--tw-text-opacity:1;color:rgb(251 191 36/var(--tw-text-opacity))}.text-blue-300{--tw-text-opacity:1;color:rgb(147 197 253/var(--tw-text-opacity))}.text-blue-400{--tw-text-opacity:1;color:rgb(96 165 250/var(--tw-text-opacity))}.text-gray-200{--tw-text-opacity:1;color:rgb(229 231 235/var(--tw-text-opacity))}.text-gray-300{--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity))}.text-gray-400{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity))}.text-gray-500{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity))}.text-green-100{--tw-text-opacity:1;color:rgb(220 252 231/var(--tw-text-opacity))}.text-green-300{--tw-text-opacity:1;color:rgb(134 239 172/var(--tw-text-opacity))}.text-green-400{--tw-text-opacity:1;color:rgb(74 222 128/var(--tw-text-opacity))}.text-green-500{--tw-text-opacity:1;color:rgb(34 197 94/var(--tw-text-opacity))}.text-indigo-300{--tw-text-opacity:1;color:rgb(165 180 252/var(--tw-text-opacity))}.text-indigo-400{--tw-text-opacity:1;color:rgb(129 140 248/var(--tw-text-opacity))}.text-purple-300{--tw-text-opacity:1;color:rgb(216 180 254/var(--tw-text-opacity))}.text-purple-400{--tw-text-opacity:1;color:rgb(192 132 252/var(--tw-text-opacity))}.text-purple-500{--tw-text-opacity:1;color:rgb(168 85 247/var(--tw-text-opacity))}.text-red-300{--tw-text-opacity:1;color:rgb(252 165 165/var(--tw-text-opacity))}.text-red-400{--tw-text-opacity:1;color:rgb(248 113 113/var(--tw-text-opacity))}.text-red-500{--tw-text-opacity:1;color:rgb(239 68 68/var(--tw-text-opacity))}.text-transparent{color:#0000}.text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}.text-yellow-400{--tw-text-opacity:1;color:rgb(250 204 21/var(--tw-text-opacity))}.line-through{text-decoration-line:line-through}.opacity-0{opacity:0}.opacity-25{opacity:.25}.opacity-75{opacity:.75}.opacity-80{opacity:.8}.shadow-inner{--tw-shadow:inset 0 2px 4px 0 #0000000d;--tw-shadow-colored:inset 0 2px 4px 0 var(--tw-shadow-color)}.shadow-inner,.shadow-lg{box-shadow:0 0 #0000,0 0 #0000,var(--tw-shadow);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px #0000001a,0 4px 6px -4px #0000001a;--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color)}.shadow-md{--tw-shadow:0 4px 6px -1px #0000001a,0 2px 4px -2px #0000001a;--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color)}.shadow-md,.shadow-sm{box-shadow:0 0 #0000,0 0 #0000,var(--tw-shadow);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 2px 0 #0000000d;--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color)}.shadow-xl{--tw-shadow:0 20px 25px -5px #0000001a,0 8px 10px -6px #0000001a;--tw-shadow-colored:0 20px 25px -5px var(--tw-shadow-color),0 8px 10px -6px var(--tw-shadow-color);box-shadow:0 0 #0000,0 0 #0000,var(--tw-shadow);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-blue-500\/20{--tw-shadow-color:#3b82f633;--tw-shadow:var(--tw-shadow-colored)}.shadow-indigo-500\/20{--tw-shadow-color:#6366f133;--tw-shadow:var(--tw-shadow-colored)}.outline-none{outline:2px solid #0000;outline-offset:2px}.ring-1{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),0 0 #0000;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.ring-black{--tw-ring-opacity:1;--tw-ring-color:rgb(0 0 0/var(--tw-ring-opacity))}.ring-opacity-5{--tw-ring-opacity:0.05}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.backdrop-blur-sm{--tw-backdrop-blur:blur(4px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.transition-all{transition-duration:.15s;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition-colors{transition-duration:.15s;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition-opacity{transition-duration:.15s;transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition-transform{transition-duration:.15s;transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1)}.delay-100{transition-delay:.1s}.delay-200{transition-delay:.2s}.duration-150{transition-duration:.15s}.duration-200{transition-duration:.2s}.duration-300{transition-duration:.3s}.scrollbar{scrollbar-color:initial initial;scrollbar-color:var(--scrollbar-thumb,initial) var(--scrollbar-track,initial)}.scrollbar::-webkit-scrollbar-track{background-color:var(--scrollbar-track);border-radius:var(--scrollbar-track-radius)}.scrollbar::-webkit-scrollbar-track:hover{background-color:var(--scrollbar-track);background-color:var(--scrollbar-track-hover,var(--scrollbar-track))}.scrollbar::-webkit-scrollbar-track:active{background-color:var(--scrollbar-track);background-color:var(--scrollbar-track-active,var(--scrollbar-track-hover,var(--scrollbar-track)))}.scrollbar::-webkit-scrollbar-thumb{background-color:var(--scrollbar-thumb);border-radius:var(--scrollbar-thumb-radius)}.scrollbar::-webkit-scrollbar-thumb:hover{background-color:var(--scrollbar-thumb);background-color:var(--scrollbar-thumb-hover,var(--scrollbar-thumb))}.scrollbar::-webkit-scrollbar-thumb:active{background-color:var(--scrollbar-thumb);background-color:var(--scrollbar-thumb-active,var(--scrollbar-thumb-hover,var(--scrollbar-thumb)))}.scrollbar::-webkit-scrollbar-corner{background-color:var(--scrollbar-corner);border-radius:var(--scrollbar-corner-radius)}.scrollbar::-webkit-scrollbar-corner:hover{background-color:var(--scrollbar-corner);background-color:var(--scrollbar-corner-hover,var(--scrollbar-corner))}.scrollbar::-webkit-scrollbar-corner:active{background-color:var(--scrollbar-corner);background-color:var(--scrollbar-corner-active,var(--scrollbar-corner-hover,var(--scrollbar-corner)))}.scrollbar{scrollbar-width:auto}.scrollbar::-webkit-scrollbar{display:block;height:16px;height:var(--scrollbar-height,16px);width:16px;width:var(--scrollbar-width,16px)}.scrollbar-thin{scrollbar-color:initial initial;scrollbar-color:var(--scrollbar-thumb,initial) var(--scrollbar-track,initial)}.scrollbar-thin::-webkit-scrollbar-track{background-color:var(--scrollbar-track);border-radius:var(--scrollbar-track-radius)}.scrollbar-thin::-webkit-scrollbar-track:hover{background-color:var(--scrollbar-track);background-color:var(--scrollbar-track-hover,var(--scrollbar-track))}.scrollbar-thin::-webkit-scrollbar-track:active{background-color:var(--scrollbar-track);background-color:var(--scrollbar-track-active,var(--scrollbar-track-hover,var(--scrollbar-track)))}.scrollbar-thin::-webkit-scrollbar-thumb{background-color:var(--scrollbar-thumb);border-radius:var(--scrollbar-thumb-radius)}.scrollbar-thin::-webkit-scrollbar-thumb:hover{background-color:var(--scrollbar-thumb);background-color:var(--scrollbar-thumb-hover,var(--scrollbar-thumb))}.scrollbar-thin::-webkit-scrollbar-thumb:active{background-color:var(--scrollbar-thumb);background-color:var(--scrollbar-thumb-active,var(--scrollbar-thumb-hover,var(--scrollbar-thumb)))}.scrollbar-thin::-webkit-scrollbar-corner{background-color:var(--scrollbar-corner);border-radius:var(--scrollbar-corner-radius)}.scrollbar-thin::-webkit-scrollbar-corner:hover{background-color:var(--scrollbar-corner);background-color:var(--scrollbar-corner-hover,var(--scrollbar-corner))}.scrollbar-thin::-webkit-scrollbar-corner:active{background-color:var(--scrollbar-corner);background-color:var(--scrollbar-corner-active,var(--scrollbar-corner-hover,var(--scrollbar-corner)))}.scrollbar-thin{scrollbar-width:thin}.scrollbar-thin::-webkit-scrollbar{display:block;height:8px;width:8px}.scrollbar-track-gray-100{--scrollbar-track:#f3f4f6!important}.scrollbar-track-gray-800{--scrollbar-track:#1f2937!important}.scrollbar-thumb-gray-400{--scrollbar-thumb:#9ca3af!important}.scrollbar-thumb-gray-700{--scrollbar-thumb:#374151!important}body,html{background-color:#1a1a1a;margin:0}#root,body,html{height:100%}::-webkit-scrollbar{height:4px;width:4px}::-webkit-scrollbar-track{background:#2d2d2d}::-webkit-scrollbar-thumb{background:#888;border-radius:4px}::-webkit-scrollbar-thumb:hover{background:#555}.custom-select .ant-select-selector{background-color:#374151!important;border-color:#4b5563!important;color:#fff!important;font-size:12px!important;height:24px!important;padding:0 6px!important}.custom-select .ant-select-selection-placeholder{color:#9ca3af!important}.custom-select .ant-select-selection-item{background-color:#4b5563!important;border-color:#6b7280!important;color:#fff!important}.custom-select .ant-select-dropdown{background-color:#374151!important;border:1px solid #4b5563!important}.custom-select .ant-select-item{color:#fff!important}.custom-select .ant-select-item-option-active{background-color:#4b5563!important}.custom-select .ant-select-item-option-selected{background-color:#6b7280!important}.custom-select .ant-select-selection-search input{color:#fff!important}.custom-select .ant-select-clear{background-color:initial!important;color:#9ca3af!important}.custom-select .ant-select-arrow{color:#9ca3af!important}.dark-theme-modal .ant-modal-title{color:#e5e7eb!important}.dark-theme-modal .ant-modal-close{color:#9ca3af!important}.dark-theme-modal .ant-modal-close:hover{color:#e5e7eb!important}.dark-theme-list .ant-list-item{border-color:#374151!important}.dark-theme-list .ant-list-item:hover{background-color:#374151!important}.dark-theme-input{background-color:#1f2937!important;border-color:#374151!important;color:#e5e7eb!important}.dark-theme-input::placeholder{color:#9ca3af!important}.dark-theme-input:focus,.dark-theme-input:hover{border-color:#6366f1!important;box-shadow:0 0 0 2px #6366f133!important}.split{display:flex;flex-direction:row}.gutter{background-color:#4b5563;cursor:col-resize;width:2px!important}.gutter:hover{background-color:#6b7280}.custom-input{background-color:#1f2937!important;border-color:#4b5563!important;color:#e5e7eb!important}.custom-input::placeholder{color:#9ca3af!important;opacity:1!important}.custom-input:focus,.custom-input:hover{border-color:#6366f1!important;box-shadow:0 0 0 2px #6366f133!important}.custom-input input{background-color:initial!important;color:#e5e7eb!important}.custom-input .anticon{color:#9ca3af!important}.dark-mode-table,.dark-mode-table .ant-table{background-color:initial!important}.dark-mode-table .ant-table-thead>tr>th{background-color:#374151!important}.dark-mode-table .ant-table-tbody>tr>td,.dark-mode-table .ant-table-thead>tr>th{border-bottom:1px solid #4b5563!important;color:#fff!important}.dark-mode-table .ant-table-tbody>tr:hover>td{background-color:#4b5563!important}.dark-mode-table .ant-table-row-expand-icon{background-color:#4b5563!important;border-color:#6b7280!important;color:#fff!important}.dark-mode-table .nested-table{margin:0!important;padding:0!important}.dark-mode-table .nested-table .ant-table-tbody>tr>td{background-color:#1f2937!important}.dark-mode-table .nested-table .ant-table-tbody>tr:hover>td{background-color:#374151!important}.last\:border-b-0:last-child{border-bottom-width:0}.group:hover .group-hover\:visible{visibility:visible}.group:hover .group-hover\:-translate-x-0\.5{--tw-translate-x:-0.125rem}.group:hover .group-hover\:-translate-x-0\.5,.group:hover .group-hover\:translate-x-0\.5{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.group:hover .group-hover\:translate-x-0\.5{--tw-translate-x:0.125rem}.group:hover .group-hover\:rotate-180{--tw-rotate:180deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.group:hover .group-hover\:opacity-100{opacity:1}.hover\:-translate-y-0\.5:hover{--tw-translate-y:-0.125rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.hover\:border-gray-500:hover{--tw-border-opacity:1;border-color:rgb(107 114 128/var(--tw-border-opacity))}.hover\:border-indigo-400:hover{--tw-border-opacity:1;border-color:rgb(129 140 248/var(--tw-border-opacity))}.hover\:bg-\[\#2D3748\]:hover{--tw-bg-opacity:1;background-color:rgb(45 55 72/var(--tw-bg-opacity))}.hover\:bg-blue-700:hover{--tw-bg-opacity:1;background-color:rgb(29 78 216/var(--tw-bg-opacity))}.hover\:bg-gray-600:hover{--tw-bg-opacity:1;background-color:rgb(75 85 99/var(--tw-bg-opacity))}.hover\:bg-gray-700:hover{--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity))}.hover\:bg-gray-700\/50:hover{background-color:#37415180}.hover\:bg-gray-700\/80:hover{background-color:#374151cc}.hover\:bg-gray-800:hover{--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity))}.hover\:bg-indigo-700:hover{--tw-bg-opacity:1;background-color:rgb(67 56 202/var(--tw-bg-opacity))}.hover\:bg-red-700:hover{--tw-bg-opacity:1;background-color:rgb(185 28 28/var(--tw-bg-opacity))}.hover\:from-amber-600:hover{--tw-gradient-from:#d97706 var(--tw-gradient-from-position);--tw-gradient-to:#d9770600 var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.hover\:from-blue-600:hover{--tw-gradient-from:#2563eb var(--tw-gradient-from-position);--tw-gradient-to:#2563eb00 var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.hover\:from-blue-700:hover{--tw-gradient-from:#1d4ed8 var(--tw-gradient-from-position);--tw-gradient-to:#1d4ed800 var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.hover\:to-indigo-700:hover{--tw-gradient-to:#4338ca var(--tw-gradient-to-position)}.hover\:to-orange-700:hover{--tw-gradient-to:#c2410c var(--tw-gradient-to-position)}.hover\:text-blue-300:hover{--tw-text-opacity:1;color:rgb(147 197 253/var(--tw-text-opacity))}.hover\:text-gray-200:hover{--tw-text-opacity:1;color:rgb(229 231 235/var(--tw-text-opacity))}.hover\:text-red-300:hover{--tw-text-opacity:1;color:rgb(252 165 165/var(--tw-text-opacity))}.hover\:text-red-400:hover{--tw-text-opacity:1;color:rgb(248 113 113/var(--tw-text-opacity))}.hover\:text-red-500:hover{--tw-text-opacity:1;color:rgb(239 68 68/var(--tw-text-opacity))}.hover\:text-white:hover{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}.hover\:shadow-lg:hover{--tw-shadow:0 10px 15px -3px #0000001a,0 4px 6px -4px #0000001a;--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color)}.hover\:shadow-lg:hover,.hover\:shadow-sm:hover{box-shadow:0 0 #0000,0 0 #0000,var(--tw-shadow);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.hover\:shadow-sm:hover{--tw-shadow:0 1px 2px 0 #0000000d;--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color)}.hover\:shadow-blue-500\/30:hover{--tw-shadow-color:#3b82f64d;--tw-shadow:var(--tw-shadow-colored)}.hover\:shadow-indigo-500\/30:hover{--tw-shadow-color:#6366f14d;--tw-shadow:var(--tw-shadow-colored)}.focus\:border-blue-500:focus{--tw-border-opacity:1;border-color:rgb(59 130 246/var(--tw-border-opacity))}.focus\:outline-none:focus{outline:2px solid #0000;outline-offset:2px}.focus\:ring-2:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),0 0 #0000;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.focus\:ring-blue-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(59 130 246/var(--tw-ring-opacity))}.focus\:ring-gray-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(107 114 128/var(--tw-ring-opacity))}.focus\:ring-indigo-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(99 102 241/var(--tw-ring-opacity))}.focus\:ring-offset-2:focus{--tw-ring-offset-width:2px}.focus\:ring-offset-gray-800:focus{--tw-ring-offset-color:#1f2937}.focus\:ring-offset-gray-900:focus{--tw-ring-offset-color:#111827}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-50:disabled{opacity:.5}@media (min-width:640px){.sm\:px-0{padding-left:0;padding-right:0}}
6
- /*# sourceMappingURL=main.770925e5.css.map*/
@@ -1 +0,0 @@
1
- {"version":3,"file":"static/css/main.770925e5.css","mappings":"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","sources":["index.css","../node_modules/@xterm/xterm/css/xterm.css","components/MainContent/PreviewPanel.css","components/MainContent/TodoPanel.css","App.css"],"sourcesContent":["@import 'tailwindcss/base';\n@import 'tailwindcss/components';\n@import 'tailwindcss/utilities';\nbody {\n margin: 0;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen',\n 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue',\n sans-serif;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n font-size: 14px;\n line-height: 1.5;\n}\n\ncode {\n font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New',\n monospace;\n}\n\n","/**\n * Copyright (c) 2014 The xterm.js authors. All rights reserved.\n * Copyright (c) 2012-2013, Christopher Jeffrey (MIT License)\n * https://github.com/chjj/term.js\n * @license MIT\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * Originally forked from (with the author's permission):\n * Fabrice Bellard's javascript vt100 for jslinux:\n * http://bellard.org/jslinux/\n * Copyright (c) 2011 Fabrice Bellard\n * The original design remains. The terminal itself\n * has been extended to include xterm CSI codes, among\n * other features.\n */\n\n/**\n * Default styles for xterm.js\n */\n\n.xterm {\n cursor: text;\n position: relative;\n user-select: none;\n -ms-user-select: none;\n -webkit-user-select: none;\n}\n\n.xterm.focus,\n.xterm:focus {\n outline: none;\n}\n\n.xterm .xterm-helpers {\n position: absolute;\n top: 0;\n /**\n * The z-index of the helpers must be higher than the canvases in order for\n * IMEs to appear on top.\n */\n z-index: 5;\n}\n\n.xterm .xterm-helper-textarea {\n padding: 0;\n border: 0;\n margin: 0;\n /* Move textarea out of the screen to the far left, so that the cursor is not visible */\n position: absolute;\n opacity: 0;\n left: -9999em;\n top: 0;\n width: 0;\n height: 0;\n z-index: -5;\n /** Prevent wrapping so the IME appears against the textarea at the correct position */\n white-space: nowrap;\n overflow: hidden;\n resize: none;\n}\n\n.xterm .composition-view {\n /* TODO: Composition position got messed up somewhere */\n background: #000;\n color: #FFF;\n display: none;\n position: absolute;\n white-space: nowrap;\n z-index: 1;\n}\n\n.xterm .composition-view.active {\n display: block;\n}\n\n.xterm .xterm-viewport {\n /* On OS X this is required in order for the scroll bar to appear fully opaque */\n background-color: #000;\n overflow-y: scroll;\n cursor: default;\n position: absolute;\n right: 0;\n left: 0;\n top: 0;\n bottom: 0;\n}\n\n.xterm .xterm-screen {\n position: relative;\n}\n\n.xterm .xterm-screen canvas {\n position: absolute;\n left: 0;\n top: 0;\n}\n\n.xterm .xterm-scroll-area {\n visibility: hidden;\n}\n\n.xterm-char-measure-element {\n display: inline-block;\n visibility: hidden;\n position: absolute;\n top: 0;\n left: -9999em;\n line-height: normal;\n}\n\n.xterm.enable-mouse-events {\n /* When mouse events are enabled (eg. tmux), revert to the standard pointer cursor */\n cursor: default;\n}\n\n.xterm.xterm-cursor-pointer,\n.xterm .xterm-cursor-pointer {\n cursor: pointer;\n}\n\n.xterm.column-select.focus {\n /* Column selection mode */\n cursor: crosshair;\n}\n\n.xterm .xterm-accessibility:not(.debug),\n.xterm .xterm-message {\n position: absolute;\n left: 0;\n top: 0;\n bottom: 0;\n right: 0;\n z-index: 10;\n color: transparent;\n pointer-events: none;\n}\n\n.xterm .xterm-accessibility-tree:not(.debug) *::selection {\n color: transparent;\n}\n\n.xterm .xterm-accessibility-tree {\n user-select: text;\n white-space: pre;\n}\n\n.xterm .live-region {\n position: absolute;\n left: -9999px;\n width: 1px;\n height: 1px;\n overflow: hidden;\n}\n\n.xterm-dim {\n /* Dim should not apply to background, so the opacity of the foreground color is applied\n * explicitly in the generated class and reset to 1 here */\n opacity: 1 !important;\n}\n\n.xterm-underline-1 { text-decoration: underline; }\n.xterm-underline-2 { text-decoration: double underline; }\n.xterm-underline-3 { text-decoration: wavy underline; }\n.xterm-underline-4 { text-decoration: dotted underline; }\n.xterm-underline-5 { text-decoration: dashed underline; }\n\n.xterm-overline {\n text-decoration: overline;\n}\n\n.xterm-overline.xterm-underline-1 { text-decoration: overline underline; }\n.xterm-overline.xterm-underline-2 { text-decoration: overline double underline; }\n.xterm-overline.xterm-underline-3 { text-decoration: overline wavy underline; }\n.xterm-overline.xterm-underline-4 { text-decoration: overline dotted underline; }\n.xterm-overline.xterm-underline-5 { text-decoration: overline dashed underline; }\n\n.xterm-strikethrough {\n text-decoration: line-through;\n}\n\n.xterm-screen .xterm-decoration-container .xterm-decoration {\n\tz-index: 6;\n\tposition: absolute;\n}\n\n.xterm-screen .xterm-decoration-container .xterm-decoration.xterm-decoration-top-layer {\n\tz-index: 7;\n}\n\n.xterm-decoration-overview-ruler {\n z-index: 8;\n position: absolute;\n top: 0;\n right: 0;\n pointer-events: none;\n}\n\n.xterm-decoration-top {\n z-index: 2;\n position: relative;\n}\n",".split-container {\n display: flex;\n width: 100%;\n height: 100%;\n}\n\n.gutter {\n background-color: #4B5563;\n position: relative;\n}\n\n.gutter:hover {\n background-color: #6B7280;\n}\n\n.gutter.gutter-horizontal {\n cursor: col-resize;\n}\n\n.gutter::after {\n content: \"\";\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n width: 4px;\n height: 20px;\n background-color: #9CA3AF;\n border-radius: 2px;\n}\n\n.gutter:hover::after {\n background-color: #F3F4F6;\n}\n\n/* Make sure panels take full height */\n.split-container > div {\n height: 100%;\n min-width: 0; /* Prevent flex items from growing beyond their container */\n overflow: hidden;\n}",".todo-container {\n background-color: transparent;\n}\n\n.todo-column {\n background-color: #1a1a1a;\n border: 1px solid #2d2d2d;\n transition: all 0.2s ease;\n min-height: 200px;\n}\n\n.todo-column:hover {\n border-color: #3d3d3d;\n}\n\n.todo-column.is-dragging-over {\n border-color: #3b82f6;\n background: rgba(59, 130, 246, 0.1);\n transition: background 0.2s ease;\n}\n\n.todo-card {\n background-color: #2d2d2d;\n border: 1px solid #374151;\n transition: all 0.2s ease;\n cursor: move;\n user-select: none;\n}\n\n.todo-card:hover {\n background-color: #374151;\n transform: translateY(-1px);\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);\n}\n\n.todo-card.is-dragging {\n border-color: #3b82f6;\n box-shadow: 0 4px 8px rgba(59, 130, 246, 0.2);\n transform: scale(1.02);\n opacity: 0.8;\n}\n\n.todo-title {\n color: #e5e7eb;\n font-size: 14px;\n line-height: 1.4;\n}\n\n.todo-due-date {\n color: #9ca3af;\n font-size: 12px;\n margin-top: 4px;\n}\n\n.todo-tags {\n display: flex;\n gap: 4px;\n flex-wrap: wrap;\n}\n\n/* 适配Antd组件 */\n.ant-modal-title {\n color: #e5e7eb !important;\n}\n\n.ant-modal-close {\n color: #9ca3af !important;\n}\n\n.ant-modal-close:hover {\n color: #e5e7eb !important;\n}\n\n.custom-input {\n background-color: #1f2937 !important;\n border-color: #374151 !important;\n color: #e5e7eb !important;\n}\n\n.custom-input:hover,\n.custom-input:focus {\n border-color: #6366F1 !important;\n box-shadow: 0 0 0 2px rgba(99, 102, 241, 0.2) !important;\n}\n\n.custom-select .ant-select-selector {\n background-color: #1f2937 !important;\n border-color: #374151 !important;\n color: #e5e7eb !important;\n}\n\n.custom-select .ant-select-arrow {\n color: #9ca3af !important;\n}","@tailwind base;\n@tailwind components;\n@tailwind utilities;\n\nhtml, body {\n @apply h-full m-0;\n background-color: #1a1a1a;\n}\n\n#root {\n @apply h-full;\n}\n\n/* 滚动条样式 */\n::-webkit-scrollbar {\n width: 4px;\n height: 4px;\n}\n\n::-webkit-scrollbar-track {\n background: #2d2d2d;\n}\n\n::-webkit-scrollbar-thumb {\n background: #888;\n border-radius: 4px;\n}\n\n::-webkit-scrollbar-thumb:hover {\n background: #555;\n}\n\n/* Select custom styles */\n.custom-select .ant-select-selector {\n background-color: #374151 !important;\n border-color: #4B5563 !important;\n color: white !important;\n height: 24px !important;\n padding: 0 6px !important;\n font-size: 12px !important;\n}\n\n.custom-select .ant-select-selection-placeholder {\n color: #9CA3AF !important;\n}\n\n.custom-select .ant-select-selection-item {\n background-color: #4B5563 !important;\n border-color: #6B7280 !important;\n color: white !important;\n}\n\n.custom-select .ant-select-dropdown {\n background-color: #374151 !important;\n border: 1px solid #4B5563 !important;\n}\n\n.custom-select .ant-select-item {\n color: white !important;\n}\n\n.custom-select .ant-select-item-option-active {\n background-color: #4B5563 !important;\n}\n\n.custom-select .ant-select-item-option-selected {\n background-color: #6B7280 !important;\n}\n\n.custom-select .ant-select-selection-search input {\n color: white !important;\n}\n\n.custom-select .ant-select-clear {\n background-color: transparent !important;\n color: #9CA3AF !important;\n}\n\n.custom-select .ant-select-arrow {\n color: #9CA3AF !important;\n}\n\n/* Dark theme modal styles */\n.dark-theme-modal .ant-modal-title {\n color: #e5e7eb !important;\n}\n\n.dark-theme-modal .ant-modal-close {\n color: #9CA3AF !important;\n}\n\n.dark-theme-modal .ant-modal-close:hover {\n color: #e5e7eb !important;\n}\n\n.dark-theme-list .ant-list-item {\n border-color: #374151 !important;\n}\n\n.dark-theme-list .ant-list-item:hover {\n background-color: #374151 !important;\n}\n\n.dark-theme-input {\n background-color: #1f2937 !important;\n border-color: #374151 !important;\n color: #e5e7eb !important;\n}\n\n.dark-theme-input::placeholder {\n color: #9CA3AF !important;\n}\n\n.dark-theme-input:hover,\n.dark-theme-input:focus {\n border-color: #6366F1 !important;\n box-shadow: 0 0 0 2px rgba(99, 102, 241, 0.2) !important;\n}\n\n/* Split pane styles */\n.split {\n display: flex;\n flex-direction: row;\n}\n\n.gutter {\n background-color: #4B5563;\n cursor: col-resize;\n width: 2px !important;\n}\n\n.gutter:hover {\n background-color: #6B7280;\n}\n\n/* Custom input styles for dark mode */\n.custom-input {\n background-color: #1F2937 !important;\n border-color: #4B5563 !important;\n color: #E5E7EB !important;\n}\n\n.custom-input::placeholder {\n color: #9CA3AF !important;\n opacity: 1 !important;\n}\n\n.custom-input:hover,\n.custom-input:focus {\n border-color: #6366F1 !important;\n box-shadow: 0 0 0 2px rgba(99, 102, 241, 0.2) !important;\n}\n\n.custom-input input {\n background-color: transparent !important;\n color: #E5E7EB !important;\n}\n\n.custom-input .anticon {\n color: #9CA3AF !important;\n}\n\n/* Dark mode table styles */\n.dark-mode-table {\n background-color: transparent !important;\n}\n\n.dark-mode-table .ant-table {\n background-color: transparent !important;\n}\n\n.dark-mode-table .ant-table-thead > tr > th {\n background-color: #374151 !important;\n color: #ffffff !important;\n border-bottom: 1px solid #4B5563 !important;\n}\n\n.dark-mode-table .ant-table-tbody > tr > td {\n border-bottom: 1px solid #4B5563 !important;\n color: #ffffff !important;\n}\n\n.dark-mode-table .ant-table-tbody > tr:hover > td {\n background-color: #4B5563 !important;\n}\n\n.dark-mode-table .ant-table-row-expand-icon {\n background-color: #4B5563 !important;\n border-color: #6B7280 !important;\n color: #ffffff !important;\n}\n\n.dark-mode-table .nested-table {\n margin: 0 !important;\n padding: 0 !important;\n}\n\n.dark-mode-table .nested-table .ant-table-tbody > tr > td {\n background-color: #1F2937 !important;\n}\n\n.dark-mode-table .nested-table .ant-table-tbody > tr:hover > td {\n background-color: #374151 !important;\n}\n"],"names":[],"sourceRoot":""}