feihong-code 7.6.0 → 8.0.1

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 (146) hide show
  1. package/.github/ISSUE_TEMPLATE/bug_report.md +36 -22
  2. package/.github/ISSUE_TEMPLATE/config.yml +10 -13
  3. package/.github/ISSUE_TEMPLATE/feature_request.md +38 -13
  4. package/.github/PULL_REQUEST_TEMPLATE.md +65 -30
  5. package/.github/workflows/ci.yml +2 -2
  6. package/.github/workflows/release.yml +5 -5
  7. package/.github/workflows/swebench-real.yml +2 -2
  8. package/CONTRIBUTING.md +52 -3
  9. package/README.md +656 -636
  10. package/agent-team/.env.example +13 -0
  11. package/agent-team/README.md +42 -0
  12. package/agent-team/agents/__init__.py +0 -0
  13. package/agent-team/agents/l1_acquisition.py +207 -0
  14. package/agent-team/agents/l2_content.py +237 -0
  15. package/agent-team/agents/l3_conversion.py +148 -0
  16. package/agent-team/agents/l4_analysis.py +118 -0
  17. package/agent-team/agents/l5_management.py +52 -0
  18. package/agent-team/agents/registry.py +60 -0
  19. package/agent-team/config.py +39 -0
  20. package/agent-team/core/__init__.py +0 -0
  21. package/agent-team/core/agent.py +73 -0
  22. package/agent-team/core/models.py +347 -0
  23. package/agent-team/core/scheduler.py +150 -0
  24. package/agent-team/core/task.py +121 -0
  25. package/agent-team/feihongzhi.db +0 -0
  26. package/agent-team/llm/__init__.py +12 -0
  27. package/agent-team/llm/base.py +22 -0
  28. package/agent-team/llm/doubao_llm.py +52 -0
  29. package/agent-team/llm/mock_llm.py +42 -0
  30. package/agent-team/main.py +235 -0
  31. package/agent-team/requirements.txt +2 -0
  32. package/agent-team/skill_packager.py +248 -0
  33. package/agent-team/skills/01_AI/350/216/267/345/256/242/347/272/277/347/264/242/351/233/267/350/276/276/SKILL.md +40 -0
  34. package/agent-team/skills/01_AI/350/216/267/345/256/242/347/272/277/347/264/242/351/233/267/350/276/276/run.py +111 -0
  35. package/agent-team/skills/02_AI/351/224/200/345/224/256/350/267/237/350/277/233/351/224/200/345/206/240/SKILL.md +38 -0
  36. package/agent-team/skills/02_AI/351/224/200/345/224/256/350/267/237/350/277/233/351/224/200/345/206/240/run.py +108 -0
  37. package/agent-team/skills/03_/350/257/204/350/256/272/345/214/272/345/225/206/346/234/272/350/257/206/345/210/253/345/256/230/SKILL.md +38 -0
  38. package/agent-team/skills/03_/350/257/204/350/256/272/345/214/272/345/225/206/346/234/272/350/257/206/345/210/253/345/256/230/run.py +106 -0
  39. package/agent-team/skills/04_/345/256/242/346/210/267/350/201/212/345/244/251/346/210/220/344/272/244/345/210/206/346/236/220/345/256/230/SKILL.md +37 -0
  40. package/agent-team/skills/04_/345/256/242/346/210/267/350/201/212/345/244/251/346/210/220/344/272/244/345/210/206/346/236/220/345/256/230/run.py +107 -0
  41. package/agent-team/skills/05_/345/220/214/350/241/214/347/210/206/346/254/276/351/233/267/350/276/276/SKILL.md +38 -0
  42. package/agent-team/skills/05_/345/220/214/350/241/214/347/210/206/346/254/276/351/233/267/350/276/276/run.py +99 -0
  43. package/agent-team/skills/06_/346/257/217/346/227/245/347/262/276/345/207/206/350/216/267/345/256/242/351/200/211/351/242/230/345/256/230/SKILL.md +39 -0
  44. package/agent-team/skills/06_/346/257/217/346/227/245/347/262/276/345/207/206/350/216/267/345/256/242/351/200/211/351/242/230/345/256/230/run.py +103 -0
  45. package/agent-team/skills/07_AI/345/244/226/350/264/270/345/274/200/345/217/221/345/256/242/346/210/267/345/221/230/345/267/245/SKILL.md +39 -0
  46. package/agent-team/skills/07_AI/345/244/226/350/264/270/345/274/200/345/217/221/345/256/242/346/210/267/345/221/230/345/267/245/run.py +103 -0
  47. package/agent-team/skills/08_/345/260/217/347/272/242/344/271/246/347/262/276/345/207/206/350/216/267/345/256/242/345/221/230/345/267/245/SKILL.md +40 -0
  48. package/agent-team/skills/08_/345/260/217/347/272/242/344/271/246/347/262/276/345/207/206/350/216/267/345/256/242/345/221/230/345/267/245/run.py +97 -0
  49. package/agent-team/skills/09_/347/247/201/345/237/237/345/256/242/346/210/267/345/210/206/345/261/202/350/267/237/350/277/233/345/256/230/SKILL.md +38 -0
  50. package/agent-team/skills/09_/347/247/201/345/237/237/345/256/242/346/210/267/345/210/206/345/261/202/350/267/237/350/277/233/345/256/230/run.py +106 -0
  51. package/agent-team/skills/10_GEO/345/225/206/346/234/272/350/257/212/346/226/255/345/256/230/SKILL.md +38 -0
  52. package/agent-team/skills/10_GEO/345/225/206/346/234/272/350/257/212/346/226/255/345/256/230/run.py +108 -0
  53. package/agent-team/skills/11_/344/270/200/344/272/272/345/205/254/345/217/270AI/345/221/230/345/267/245/350/260/203/345/272/246/345/256/230/SKILL.md +37 -0
  54. package/agent-team/skills/11_/344/270/200/344/272/272/345/205/254/345/217/270AI/345/221/230/345/267/245/350/260/203/345/272/246/345/256/230/run.py +111 -0
  55. package/agent-team/skills/12_/350/200/201/346/235/277/347/237/255/350/247/206/351/242/221/350/216/267/345/256/242/350/204/232/346/234/254/345/256/230/SKILL.md +39 -0
  56. package/agent-team/skills/12_/350/200/201/346/235/277/347/237/255/350/247/206/351/242/221/350/216/267/345/256/242/350/204/232/346/234/254/345/256/230/run.py +104 -0
  57. package/agent-team/skills/13_/345/215/232/344/270/273/350/264/246/345/217/267/346/267/261/345/272/246/346/213/206/350/247/243/345/256/230/SKILL.md +37 -0
  58. package/agent-team/skills/13_/345/215/232/344/270/273/350/264/246/345/217/267/346/267/261/345/272/246/346/213/206/350/247/243/345/256/230/run.py +105 -0
  59. package/agent-team/skills/14_AI/347/237/255/350/247/206/351/242/221/350/207/252/345/212/250/345/211/252/350/276/221/345/270/210/SKILL.md +39 -0
  60. package/agent-team/skills/14_AI/347/237/255/350/247/206/351/242/221/350/207/252/345/212/250/345/211/252/350/276/221/345/270/210/run.py +108 -0
  61. package/agent-team/skills/15_/345/205/254/344/274/227/345/217/267/350/207/252/345/212/250/350/277/220/350/220/245/345/217/221/345/270/203/345/256/230/SKILL.md +38 -0
  62. package/agent-team/skills/15_/345/205/254/344/274/227/345/217/267/350/207/252/345/212/250/350/277/220/350/220/245/345/217/221/345/270/203/345/256/230/run.py +105 -0
  63. package/agent-team/skills/16_/350/241/214/344/270/232/346/267/261/345/272/246/345/210/206/346/236/220/345/270/210/SKILL.md +38 -0
  64. package/agent-team/skills/16_/350/241/214/344/270/232/346/267/261/345/272/246/345/210/206/346/236/220/345/270/210/run.py +108 -0
  65. package/agent-team/skills/17_/346/212/225/350/265/204/347/240/224/347/251/266/345/222/250/350/257/242/345/256/230/SKILL.md +38 -0
  66. package/agent-team/skills/17_/346/212/225/350/265/204/347/240/224/347/251/266/345/222/250/350/257/242/345/256/230/run.py +106 -0
  67. package/agent-team/tests/__init__.py +0 -0
  68. package/agent-team/tests/test_core.py +156 -0
  69. package/dist/agent/agent-session.js +103 -0
  70. package/dist/agent/agent-session.js.map +1 -0
  71. package/dist/agent/orchestrator.js +8 -0
  72. package/dist/agent/orchestrator.js.map +1 -1
  73. package/dist/agent/steer.js +52 -0
  74. package/dist/agent/steer.js.map +1 -0
  75. package/dist/cli/run.js +2 -0
  76. package/dist/cli/run.js.map +1 -1
  77. package/dist/cli/version.js +1 -1
  78. package/dist/enterprise/policy.js +40 -17
  79. package/dist/enterprise/policy.js.map +1 -1
  80. package/dist/memory/honcho-store.js +231 -0
  81. package/dist/memory/honcho-store.js.map +1 -0
  82. package/dist/shared/log-rotator.js +238 -0
  83. package/dist/shared/log-rotator.js.map +1 -0
  84. package/dist/shared/sqlite-store.js +512 -0
  85. package/dist/shared/sqlite-store.js.map +1 -0
  86. package/dist/tools/agents/agents-bridge.js +144 -0
  87. package/dist/tools/agents/agents-bridge.js.map +1 -0
  88. package/dist/tools/desktop/desktop-guard.js +81 -0
  89. package/dist/tools/desktop/desktop-guard.js.map +1 -0
  90. package/dist/tools/desktop/desktop.tool.js +201 -0
  91. package/dist/tools/desktop/desktop.tool.js.map +1 -0
  92. package/dist/tools/desktop/feihong-win.js +163 -0
  93. package/dist/tools/desktop/feihong-win.js.map +1 -0
  94. package/dist/tools/desktop/index.js +37 -0
  95. package/dist/tools/desktop/index.js.map +1 -0
  96. package/dist/tools/docker-sandbox.js +212 -0
  97. package/dist/tools/docker-sandbox.js.map +1 -0
  98. package/dist/tools/index.js +2 -0
  99. package/dist/tools/index.js.map +1 -1
  100. package/dist/tools/mcp/index.js +10 -2
  101. package/dist/tools/mcp/index.js.map +1 -1
  102. package/dist/tools/mcp/mcp-client.js +4 -0
  103. package/dist/tools/mcp/mcp-client.js.map +1 -1
  104. package/dist/tools/sandbox.js +28 -0
  105. package/dist/tools/sandbox.js.map +1 -1
  106. package/dist/web/public/favicon.svg +11 -0
  107. package/dist/web/public/index.html +4 -1
  108. package/dist/web/public/public/css/style.css +1756 -0
  109. package/dist/web/public/public/favicon.svg +11 -0
  110. package/dist/web/public/public/index.html +1246 -0
  111. package/dist/web/public/public/js/api.js +558 -0
  112. package/dist/web/public/public/js/app.js +2233 -0
  113. package/dist/web/public/public/js/mock-api.js +259 -0
  114. package/dist/web/public/public/js/monaco-editor.js +363 -0
  115. package/dist/web/public/public/js/ui.js +2217 -0
  116. package/dist/web/public/public/js/utils.js +214 -0
  117. package/dist/web/public/public/manifest.json +59 -0
  118. package/dist/web/public/public/robots.txt +14 -0
  119. package/dist/web/public/public/service-worker.js +149 -0
  120. package/dist/web/public/robots.txt +14 -0
  121. package/dist/web/server.js +70 -0
  122. package/dist/web/server.js.map +1 -1
  123. package/docs/AI/345/221/230/345/267/245/345/206/233/345/233/242-/346/225/264/345/220/210/350/257/264/346/230/216.md +68 -0
  124. package/docs/API.md +827 -0
  125. package/docs/App/346/212/200/346/234/257/350/257/264/346/230/216/344/271/246.md +3 -3
  126. package/docs/P1.1-P3-P5/345/267/245/347/250/213/345/256/236/346/226/275/346/200/273/347/273/223.md +328 -0
  127. package/docs/P5-Pi/345/257/271/347/205/247/350/257/204/346/265/213/346/212/245/345/221/212-mock/346/250/241/345/274/217.json +125 -0
  128. package/docs/P5-Pi/345/257/271/347/205/247/350/257/204/346/265/213/346/212/245/345/221/212-/347/234/237/345/256/236/346/250/241/345/236/213.json +138 -0
  129. package/docs/P5-pi-compare-real-report.json +138 -0
  130. package/docs/P5-pi-compare-report.json +125 -0
  131. package/docs/PROJECT-ANALYSIS-AND-TEST.md +721 -0
  132. package/docs/Pi-Agent/346/216/245/345/205/245/351/243/236/350/231/271Code-MVP/351/233/206/346/210/220/344/272/244/344/273/230/347/211/251.md +355 -0
  133. package/docs/Pi-Agent/346/216/245/345/205/245/351/243/236/350/231/271Code/344/273/267/345/200/274/345/210/206/346/236/220-/345/274/200/345/217/221/346/226/207/346/241/243.md +291 -0
  134. package/docs/Pi-Agent/346/216/245/345/205/245/351/243/236/350/231/271Code/344/273/267/345/200/274/351/207/215/344/274/260-/345/217/257/350/247/206/345/214/226.html +84 -0
  135. package/docs/SWE-bench-300-agnes-2.5-flash-/346/234/200/347/273/210/346/212/245/345/221/212.json +2012 -0
  136. package/docs/SWE-bench-300-agnes-2.5-flash-/350/267/221/345/210/206/346/212/245/345/221/212.md +74 -0
  137. package/docs/SWE-bench-Lite-DeepSeek-V4-Flash-/350/267/221/345/210/206/346/212/245/345/221/212.md +102 -0
  138. package/docs/TECHNICAL-SPECIFICATION.md +812 -0
  139. package/docs/TECHNICAL-SPECIFICATION.pdf +0 -0
  140. package/docs/UPGRADE-v7.9.0.md +291 -0
  141. package/docs/UPGRADE-v8.0.0.md +237 -0
  142. package/docs/Windows/346/211/213/350/204/232-POC/346/274/224/347/244/272/350/204/232/346/234/254.md +131 -0
  143. package/docs/Windows/346/211/213/350/204/232/346/216/245/345/205/245/346/214/207/345/215/227.md +181 -0
  144. package/docs//344/275/277/347/224/250/350/257/264/346/230/216/344/271/246-v8.0.0.md +922 -0
  145. package/docs//344/275/277/347/224/250/350/257/264/346/230/216/344/271/246-v8.0.1.md +146 -0
  146. package/package.json +7 -6
@@ -0,0 +1,1756 @@
1
+ :root {
2
+ --bg: #f5f7fa;
3
+ --card: #ffffff;
4
+ --ink: #1f2933;
5
+ --ink-2: #475569;
6
+ --muted: #6b7785;
7
+ --brand: #2563eb;
8
+ --brand-soft: #eff4ff;
9
+ --ok: #16a34a;
10
+ --err: #dc2626;
11
+ --warn: #d97706;
12
+ --border: #e3e8ef;
13
+ --line: #e3e8ef;
14
+ --sidebar-width: 56px;
15
+ --topbar-height: 48px;
16
+ }
17
+ .dark {
18
+ --bg: #0f172a;
19
+ --card: #1e293b;
20
+ --ink: #f1f5f9;
21
+ --ink-2: #cbd5e1;
22
+ --muted: #94a3b8;
23
+ --brand: #3b82f6;
24
+ --brand-soft: #1e3a8a;
25
+ --border: #334155;
26
+ --line: #334155;
27
+ }
28
+ * { box-sizing: border-box; }
29
+ body {
30
+ margin: 0;
31
+ font-family: -apple-system, "Segoe UI", "PingFang SC", "Microsoft YaHei", Roboto, Helvetica, Arial, sans-serif;
32
+ background: var(--bg);
33
+ color: var(--ink);
34
+ height: 100vh;
35
+ overflow: hidden;
36
+ }
37
+
38
+ /* ========== 鐧诲綍閬僵 ========== */
39
+ #loginOverlay {
40
+ position: fixed; inset: 0; background: var(--bg); z-index: 50;
41
+ display: flex; align-items: center; justify-content: center;
42
+ }
43
+ #loginOverlay .login-card {
44
+ background: var(--card); border: 1px solid var(--border); border-radius: 16px;
45
+ padding: 32px; width: 360px; box-shadow: 0 10px 30px rgba(31,41,51,0.08);
46
+ }
47
+ #loginOverlay h2 { margin: 0 0 4px; font-size: 20px; }
48
+ #loginOverlay p { margin: 0 0 20px; color: var(--muted); font-size: 13px; }
49
+ #loginOverlay input {
50
+ width: 100%; border: 1px solid var(--border); border-radius: 10px;
51
+ padding: 10px 12px; font-size: 14px; margin-bottom: 12px; font-family: inherit;
52
+ background: var(--card); color: var(--ink);
53
+ }
54
+ #loginOverlay button {
55
+ width: 100%; border: none; background: var(--brand); color: #fff;
56
+ border-radius: 10px; padding: 10px; font-size: 14px; cursor: pointer;
57
+ }
58
+ #loginOverlay .login-status { font-size: 13px; margin-top: 10px; min-height: 18px; }
59
+ #loginOverlay .login-status.err { color: var(--err); }
60
+
61
+ /* ========== 涓诲竷灞€ ========== */
62
+ .app-layout {
63
+ display: flex;
64
+ flex-direction: column;
65
+ height: 100vh;
66
+ display: none;
67
+ }
68
+ .app-layout.show { display: flex; }
69
+ /* 宸茬櫥褰曠姸鎬侊細鎻愬墠闅愯棌鐧诲綍椤碉紝鏄剧ず搴旂敤甯冨眬锛岄伩鍏嶉棯鐑侊紙鎰熻鍍忔墦寮€涓ゆ锛?*/
70
+ html.logged-in #loginOverlay { display: none !important; }
71
+ html.logged-in .app-layout { display: flex !important; }
72
+
73
+ /* ========== 椤堕儴瀵艰埅鏍?========== */
74
+ .topbar {
75
+ height: var(--topbar-height);
76
+ background: var(--card);
77
+ border-bottom: 1px solid var(--border);
78
+ display: flex;
79
+ align-items: center;
80
+ padding: 0 16px;
81
+ gap: 12px;
82
+ flex-shrink: 0;
83
+ }
84
+ .topbar-brand {
85
+ font-weight: 700;
86
+ font-size: 15px;
87
+ color: var(--brand);
88
+ display: flex;
89
+ align-items: center;
90
+ gap: 8px;
91
+ }
92
+ .topbar-brand .logo {
93
+ width: 28px;
94
+ height: 28px;
95
+ background: var(--brand);
96
+ color: #fff;
97
+ border-radius: 8px;
98
+ display: flex;
99
+ align-items: center;
100
+ justify-content: center;
101
+ font-size: 14px;
102
+ }
103
+ .topbar-nav {
104
+ display: flex;
105
+ gap: 4px;
106
+ margin-left: 24px;
107
+ }
108
+ .topbar-nav-item {
109
+ padding: 6px 12px;
110
+ border-radius: 8px;
111
+ font-size: 13px;
112
+ color: var(--ink-2);
113
+ cursor: pointer;
114
+ display: flex;
115
+ align-items: center;
116
+ gap: 6px;
117
+ transition: all 0.15s;
118
+ }
119
+ .topbar-nav-item:hover {
120
+ background: var(--bg);
121
+ color: var(--ink);
122
+ }
123
+ .topbar-nav-item.active {
124
+ background: var(--brand-soft);
125
+ color: var(--brand);
126
+ font-weight: 600;
127
+ }
128
+ .topbar-spacer { flex: 1; }
129
+ .topbar-user {
130
+ display: flex;
131
+ align-items: center;
132
+ gap: 10px;
133
+ padding: 6px 10px;
134
+ border-radius: 10px;
135
+ cursor: pointer;
136
+ transition: background 0.15s;
137
+ }
138
+ .topbar-user:hover { background: var(--bg); }
139
+ .topbar-avatar {
140
+ width: 32px;
141
+ height: 32px;
142
+ background: var(--brand-soft);
143
+ border-radius: 50%;
144
+ display: flex;
145
+ align-items: center;
146
+ justify-content: center;
147
+ font-size: 16px;
148
+ }
149
+ .topbar-phone { font-size: 13px; font-weight: 500; color: var(--ink); }
150
+ .lang-switcher { display: flex; align-items: center; gap: 2px; border: 1px solid var(--border); border-radius: 8px; overflow: hidden; }
151
+ .lang-btn { padding: 4px 10px; font-size: 12px; cursor: pointer; border: none; background: transparent; color: var(--ink-2); font-weight: 500; transition: all 0.15s; }
152
+ .lang-btn.active { background: var(--brand); color: #fff; }
153
+ .lang-btn:hover:not(.active) { background: var(--bg); }
154
+
155
+ /* ========== 涓讳綋鍐呭鍖?========== */
156
+ /* overflow 蹇呴』涓?hidden锛氱害鏉熷唴閮?.messages / .sidebar 鍚勮嚜婊氬姩锛?
157
+ 鍘熺敓 <select> 寮瑰眰鐢辨祻瑙堝櫒缁樺埗鍦ㄩ《灞傦紝涓嶅彈姝よ鍓奖鍝嶃€?*/
158
+ .main-area {
159
+ flex: 1;
160
+ display: flex;
161
+ min-height: 0;
162
+ overflow: hidden;
163
+ max-width: 1400px;
164
+ margin: 0 auto;
165
+ width: 100%;
166
+ }
167
+
168
+ /* ========== 宸︿晶渚ц竟鏍?========== */
169
+ .sidebar {
170
+ width: 200px;
171
+ background: var(--card);
172
+ border-right: 1px solid var(--border);
173
+ display: flex;
174
+ flex-direction: column;
175
+ padding: 12px 8px;
176
+ gap: 2px;
177
+ flex-shrink: 0;
178
+ overflow-y: auto;
179
+ }
180
+ .sidebar-section {
181
+ margin-bottom: 8px;
182
+ padding-bottom: 8px;
183
+ border-bottom: 1px solid var(--border);
184
+ }
185
+ .sidebar-section-title {
186
+ font-size: 11px;
187
+ color: var(--muted);
188
+ text-transform: uppercase;
189
+ letter-spacing: 0.5px;
190
+ padding: 4px 8px;
191
+ margin-bottom: 4px;
192
+ }
193
+ .sidebar-icon {
194
+ width: 100%;
195
+ height: 36px;
196
+ border-radius: 8px;
197
+ display: flex;
198
+ align-items: center;
199
+ gap: 10px;
200
+ padding: 0 8px;
201
+ cursor: pointer;
202
+ color: var(--ink-2);
203
+ transition: all 0.15s;
204
+ position: relative;
205
+ font-size: 13px;
206
+ }
207
+ .sidebar-icon .icon {
208
+ font-size: 16px;
209
+ width: 20px;
210
+ text-align: center;
211
+ flex-shrink: 0;
212
+ }
213
+ .sidebar-icon .label {
214
+ flex: 1;
215
+ white-space: nowrap;
216
+ overflow: hidden;
217
+ text-overflow: ellipsis;
218
+ }
219
+ .sidebar-icon .badge {
220
+ font-size: 10px;
221
+ padding: 2px 6px;
222
+ border-radius: 10px;
223
+ background: var(--brand-soft);
224
+ color: var(--brand);
225
+ font-weight: 600;
226
+ flex-shrink: 0;
227
+ }
228
+ .sidebar-icon:hover {
229
+ background: var(--bg);
230
+ color: var(--ink);
231
+ }
232
+ .sidebar-icon.active {
233
+ background: var(--brand-soft);
234
+ color: var(--brand);
235
+ font-weight: 600;
236
+ }
237
+ .sidebar-icon.active::before {
238
+ content: '';
239
+ position: absolute;
240
+ left: 0;
241
+ top: 50%;
242
+ transform: translateY(-50%);
243
+ width: 3px;
244
+ height: 20px;
245
+ background: var(--brand);
246
+ border-radius: 0 2px 2px 0;
247
+ }
248
+ .sidebar-spacer { flex: 1; }
249
+ .sidebar-pin {
250
+ font-size: 10px;
251
+ color: var(--warn);
252
+ flex-shrink: 0;
253
+ }
254
+ .task-item {
255
+ display: flex;
256
+ align-items: center;
257
+ gap: 8px;
258
+ padding: 8px;
259
+ border-radius: 6px;
260
+ cursor: pointer;
261
+ font-size: 12px;
262
+ transition: background 0.15s;
263
+ }
264
+ .task-item:hover { background: var(--bg); }
265
+ .task-item.active { background: var(--brand-soft); }
266
+ .task-item .task-icon { font-size: 14px; }
267
+ .task-item .task-title {
268
+ flex: 1;
269
+ white-space: nowrap;
270
+ overflow: hidden;
271
+ text-overflow: ellipsis;
272
+ color: var(--ink-2);
273
+ }
274
+ .task-item.active .task-title { color: var(--brand); }
275
+ .task-item .task-actions {
276
+ display: none;
277
+ gap: 4px;
278
+ font-size: 11px;
279
+ }
280
+ .task-item:hover .task-actions { display: flex; }
281
+ .task-item .task-actions button {
282
+ padding: 2px 4px;
283
+ border: none;
284
+ background: transparent;
285
+ cursor: pointer;
286
+ border-radius: 4px;
287
+ font-size: 10px;
288
+ }
289
+ .task-item .task-actions button:hover { background: var(--border); }
290
+ .task-item .task-actions .delete-btn:hover { background: #fee2e2; color: var(--err); }
291
+ .task-pinned { color: var(--warn); }
292
+
293
+ /* ========== 涓棿瀵硅瘽鍖?========== */
294
+ .chat-area {
295
+ flex: 1;
296
+ display: flex;
297
+ flex-direction: column;
298
+ min-width: 0;
299
+ background: var(--bg);
300
+ }
301
+
302
+ /* ========== 浠诲姟涓婁笅鏂囧ご閮?========== */
303
+ .task-context-header {
304
+ display: flex;
305
+ align-items: center;
306
+ gap: 12px;
307
+ padding: 12px 16px;
308
+ background: var(--card);
309
+ border-bottom: 1px solid var(--border);
310
+ flex-shrink: 0;
311
+ }
312
+ .tch-left { flex: 1; min-width: 0; }
313
+ .tch-title { font-size: 15px; font-weight: 700; color: var(--ink); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
314
+ .tch-sub { font-size: 12px; color: var(--muted); margin-top: 2px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
315
+ .tch-right { display: flex; align-items: center; gap: 10px; flex-shrink: 0; }
316
+ .tch-time { font-size: 12px; color: var(--muted); }
317
+
318
+ /* ========== 鎬濈淮閾捐矾绾跨▼ ========== */
319
+ .messages { flex: 1; overflow-y: auto; display: flex; flex-direction: column; gap: 10px; padding: 16px; padding-right: 4px; }
320
+ .step { max-width: 92%; font-size: 13.5px; line-height: 1.6; word-break: break-word; }
321
+ .step.created {
322
+ align-self: stretch; background: var(--bg); border: 1px dashed var(--border);
323
+ border-radius: 10px; padding: 8px 12px; color: var(--muted); font-size: 12.5px;
324
+ }
325
+ .step.reasoning {
326
+ align-self: flex-start; background: var(--card); border: 1px solid var(--border);
327
+ border-left: 3px solid var(--brand); border-radius: 10px; padding: 10px 14px;
328
+ white-space: pre-wrap; color: var(--ink-2);
329
+ }
330
+ .step.reasoning .reasoning-head { font-size: 11px; color: var(--brand); font-weight: 600; margin-bottom: 4px; display: flex; align-items: center; gap: 6px; }
331
+ .step.toolcall {
332
+ align-self: flex-start; background: #fffbeb; border: 1px solid #fde68a;
333
+ border-radius: 10px; padding: 8px 12px; color: #92400e; font-size: 12.5px;
334
+ }
335
+ .dark .step.toolcall { background: #3a2f12; color: #fcd34d; border-color: #5b4a1f; }
336
+ .step.toolcall .tc-name { font-weight: 600; }
337
+ .step.toolcall .tc-args {
338
+ color: var(--muted); font-size: 12px; margin-top: 2px; white-space: pre-wrap; word-break: break-word;
339
+ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
340
+ }
341
+ .step.result {
342
+ align-self: flex-start; background: var(--card); border: 1px solid var(--border);
343
+ border-radius: 10px; padding: 8px 12px; color: var(--ink-2); font-size: 12.5px; max-width: 92%;
344
+ }
345
+ .step.result .res-head { font-weight: 600; display: flex; align-items: center; gap: 6px; }
346
+ .step.result.ok .res-head { color: var(--ok); }
347
+ .step.result.fail .res-head { color: var(--err); }
348
+ .step.result .res-out {
349
+ margin-top: 4px; white-space: pre-wrap; word-break: break-word; max-height: 160px; overflow-y: auto;
350
+ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace; font-size: 12px; color: var(--muted);
351
+ }
352
+ .step.note { align-self: stretch; background: var(--bg); border-radius: 8px; padding: 6px 12px; color: var(--muted); font-size: 12px; }
353
+ /* 瀵硅瘽娴佷笌鎬濈淮閾捐矾鍒嗛殧鏍囬 */
354
+ .conv-divider {
355
+ align-self: stretch; text-align: center; font-size: 11px; color: var(--muted);
356
+ border-top: 1px solid var(--line); padding-top: 8px; margin-top: 4px;
357
+ }
358
+ .step.final {
359
+ align-self: flex-end; background: var(--ok); color: #fff; border-radius: 12px;
360
+ padding: 12px 16px; white-space: pre-wrap; word-break: break-word; max-width: 92%;
361
+ position: relative;
362
+ }
363
+ .step.final .final-head { font-size: 11px; opacity: 0.85; margin-bottom: 4px; font-weight: 600; }
364
+ .step.final .final-actions {
365
+ position: absolute; top: 8px; right: 8px; display: flex; gap: 4px;
366
+ opacity: 0.85; transition: opacity 0.2s;
367
+ background: rgba(0,0,0,0.18); border-radius: 8px; padding: 2px 4px;
368
+ }
369
+ .step.final:hover .final-actions { opacity: 1; background: rgba(0,0,0,0.32); }
370
+ .step.final .final-actions button {
371
+ background: transparent; border: none; color: #fff;
372
+ border-radius: 4px; padding: 3px 7px; font-size: 11px; cursor: pointer;
373
+ transition: background 0.15s;
374
+ }
375
+ .step.final .final-actions button:hover { background: rgba(255,255,255,0.28); }
376
+ .step.error {
377
+ align-self: flex-end; background: var(--err); color: #fff; border-radius: 12px;
378
+ padding: 12px 16px; white-space: pre-wrap; word-break: break-word; max-width: 92%;
379
+ }
380
+
381
+ /* 瀵硅瘽娑堟伅鍖?*/
382
+ .conv {
383
+ flex: 1;
384
+ display: flex;
385
+ flex-direction: column;
386
+ padding: 16px;
387
+ gap: 12px;
388
+ overflow: hidden;
389
+ }
390
+ .messages {
391
+ flex: 1;
392
+ overflow-y: auto;
393
+ display: flex;
394
+ flex-direction: column;
395
+ gap: 10px;
396
+ padding-right: 4px;
397
+ }
398
+ .msg {
399
+ padding: 10px 14px;
400
+ border-radius: 12px;
401
+ font-size: 13.5px;
402
+ line-height: 1.6;
403
+ max-width: 85%;
404
+ white-space: pre-wrap;
405
+ word-break: break-word;
406
+ position: relative;
407
+ user-select: text;
408
+ -webkit-user-select: text;
409
+ cursor: text;
410
+ }
411
+ .msg-actions {
412
+ position: absolute;
413
+ bottom: 4px;
414
+ right: 8px;
415
+ display: flex;
416
+ gap: 4px;
417
+ background: rgba(255,255,255,0.92);
418
+ border-radius: 6px;
419
+ padding: 2px 4px;
420
+ box-shadow: 0 1px 6px rgba(0,0,0,0.08);
421
+ opacity: 0.35;
422
+ transition: opacity 0.2s ease;
423
+ user-select: none;
424
+ z-index: 2;
425
+ }
426
+ .msg:hover .msg-actions {
427
+ opacity: 1;
428
+ }
429
+ .msg-action-btn {
430
+ background: none;
431
+ border: none;
432
+ padding: 5px 10px;
433
+ font-size: 12px;
434
+ cursor: pointer;
435
+ border-radius: 4px;
436
+ color: var(--ink-2);
437
+ white-space: nowrap;
438
+ }
439
+ .msg-action-btn:hover {
440
+ background: var(--brand-soft);
441
+ color: var(--brand);
442
+ }
443
+ .msg.user {
444
+ background: var(--brand-soft);
445
+ align-self: flex-end;
446
+ }
447
+ .msg.assistant {
448
+ background: var(--card);
449
+ border: 1px solid var(--border);
450
+ align-self: flex-start;
451
+ }
452
+ /* ========== 鎬濊€冭繃绋嬫皵娉★紙Cursor 椋庢牸锛?========== */
453
+ .msg.assistant.thinking-msg {
454
+ background: var(--card);
455
+ border: 1px solid var(--border);
456
+ border-left: 3px solid var(--brand);
457
+ position: relative;
458
+ padding: 10px 12px;
459
+ }
460
+ .thinking-header {
461
+ display: flex;
462
+ align-items: center;
463
+ gap: 6px;
464
+ cursor: pointer;
465
+ user-select: none;
466
+ padding: 2px 0;
467
+ border-radius: 4px;
468
+ transition: background 0.15s;
469
+ }
470
+ .thinking-header:hover {
471
+ background: var(--brand-soft);
472
+ }
473
+ .thinking-arrow {
474
+ font-size: 10px;
475
+ color: var(--ink-2);
476
+ transition: transform 0.2s;
477
+ flex-shrink: 0;
478
+ width: 14px;
479
+ text-align: center;
480
+ }
481
+ .thinking-label {
482
+ font-size: 12px;
483
+ font-weight: 600;
484
+ color: var(--ink);
485
+ flex-shrink: 0;
486
+ }
487
+ .thinking-summary {
488
+ font-size: 11px;
489
+ color: var(--muted);
490
+ overflow: hidden;
491
+ text-overflow: ellipsis;
492
+ white-space: nowrap;
493
+ }
494
+ .thinking-body {
495
+ margin-top: 8px;
496
+ border-top: 1px solid var(--line);
497
+ padding-top: 6px;
498
+ }
499
+ .thinking-step {
500
+ display: flex;
501
+ align-items: flex-start;
502
+ gap: 6px;
503
+ padding: 3px 0;
504
+ font-size: 12px;
505
+ color: var(--ink-2);
506
+ line-height: 1.5;
507
+ }
508
+ .thinking-step-icon {
509
+ flex-shrink: 0;
510
+ width: 16px;
511
+ text-align: center;
512
+ font-size: 11px;
513
+ }
514
+ .thinking-step-text {
515
+ flex: 1;
516
+ word-break: break-word;
517
+ }
518
+ .thinking-step-text code {
519
+ font-size: 11px;
520
+ background: var(--brand-soft);
521
+ padding: 1px 4px;
522
+ border-radius: 3px;
523
+ color: var(--brand);
524
+ }
525
+ .thinking-step-detail {
526
+ font-size: 11px;
527
+ color: var(--muted);
528
+ cursor: pointer;
529
+ margin-left: 22px;
530
+ padding: 1px 6px;
531
+ border-radius: 3px;
532
+ background: var(--bg);
533
+ display: inline-block;
534
+ }
535
+ .thinking-step-detail:hover {
536
+ background: var(--brand-soft);
537
+ }
538
+ .thinking-args {
539
+ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
540
+ font-size: 11px;
541
+ color: var(--muted);
542
+ margin: 4px 0 4px 22px;
543
+ padding: 6px 8px;
544
+ background: var(--bg);
545
+ border-radius: 4px;
546
+ overflow-x: auto;
547
+ white-space: pre-wrap;
548
+ word-break: break-all;
549
+ display: none;
550
+ }
551
+ .thinking-args.show {
552
+ display: block;
553
+ }
554
+ .thinking-reply {
555
+ font-size: 13px;
556
+ line-height: 1.7;
557
+ color: var(--ink);
558
+ margin-top: 8px;
559
+ padding-top: 8px;
560
+ border-top: 1px solid var(--line);
561
+ }
562
+ /* 鎬濊€冧腑鐘舵€佹寚绀?*/
563
+ .thinking-indicator {
564
+ display: flex;
565
+ align-items: center;
566
+ gap: 8px;
567
+ padding: 4px 0;
568
+ font-size: 12px;
569
+ color: var(--ink-2);
570
+ }
571
+ @keyframes pulse-dot {
572
+ 0%, 100% { opacity: 1; }
573
+ 50% { opacity: 0.3; }
574
+ }
575
+ .thinking-indicator .dot {
576
+ width: 6px;
577
+ height: 6px;
578
+ border-radius: 50%;
579
+ background: var(--brand);
580
+ animation: pulse-dot 1.2s infinite;
581
+ }
582
+ .thinking-indicator .dot:nth-child(2) { animation-delay: 0.2s; }
583
+ .thinking-indicator .dot:nth-child(3) { animation-delay: 0.4s; }
584
+ .dark .msg.assistant { background: #1e293b; }
585
+ .msg.sys {
586
+ background: #f1f5f9;
587
+ align-self: flex-start;
588
+ color: var(--ink-2);
589
+ }
590
+ .dark .msg.sys { background: #334155; }
591
+ .msg .artifact { color: var(--brand); text-decoration: underline; cursor: pointer; }
592
+ /* 鍐呴儴鎵ц杩囩▼锛氶粯璁ゆ姌鍙狅紝閬垮厤"涓€鐩撮兘鍦ㄨ皟鐢?楠岃瘉"鐨勫櫔澹帮紱鐐瑰嚮灞曞紑鏌ョ湅鎬濊€冧笌宸ュ叿璋冪敤 */
593
+ .proc-details {
594
+ align-self: stretch; margin-top: 6px; border-top: 1px dashed var(--line);
595
+ padding: 8px 0 2px; display: flex; flex-direction: column; gap: 8px;
596
+ }
597
+ .proc-summary {
598
+ cursor: pointer; font-size: 12px; color: var(--muted); user-select: none;
599
+ padding: 4px 6px; border-radius: 6px; background: var(--card);
600
+ border: 1px solid var(--border); width: fit-content;
601
+ }
602
+ .proc-summary:hover { color: var(--brand); border-color: var(--brand); }
603
+ .proc-details[open] .proc-summary { color: var(--brand); margin-bottom: 6px; }
604
+ .final-msg { border-left: 3px solid var(--ok); align-self: flex-start; }
605
+ .error-msg { border-left: 3px solid var(--err); align-self: flex-start; color: var(--err); }
606
+ .msg .artifact:hover { opacity: 0.8; }
607
+
608
+ /* 杈撳叆鏍?*/
609
+ .input-area {
610
+ padding: 0 16px 16px;
611
+ flex-shrink: 0;
612
+ }
613
+ .input-bar {
614
+ border: 1px solid var(--border);
615
+ border-radius: 14px;
616
+ padding: 12px;
617
+ background: var(--card);
618
+ box-shadow: 0 4px 12px rgba(0,0,0,0.04);
619
+ }
620
+ .input-bar textarea {
621
+ width: 100%;
622
+ border: none;
623
+ margin: 0;
624
+ min-height: 60px;
625
+ resize: none;
626
+ background: transparent;
627
+ color: var(--ink);
628
+ font-size: 14px;
629
+ font-family: inherit;
630
+ }
631
+ .input-bar textarea:focus { outline: none; }
632
+ .input-toolbar {
633
+ display: flex;
634
+ align-items: center;
635
+ gap: 8px;
636
+ margin-top: 10px;
637
+ flex-wrap: wrap;
638
+ }
639
+ .input-toolbar .spacer { flex: 1; }
640
+ .pill {
641
+ border: 1px solid var(--border);
642
+ border-radius: 8px;
643
+ padding: 5px 10px;
644
+ font-size: 12.5px;
645
+ background: var(--card);
646
+ color: var(--ink-2);
647
+ cursor: pointer;
648
+ user-select: none;
649
+ }
650
+ .pill:hover { border-color: var(--brand); }
651
+ .voice-badge { display: inline-flex; align-items: center; gap: 6px; color: var(--err); font-size: 12px; }
652
+
653
+ /* 宸ヤ綔鍖烘潯 */
654
+ .workspace-bar {
655
+ display: flex;
656
+ align-items: center;
657
+ gap: 8px;
658
+ padding: 8px 0;
659
+ font-size: 13px;
660
+ color: var(--muted);
661
+ }
662
+ .wb-select {
663
+ display: flex;
664
+ align-items: center;
665
+ gap: 6px;
666
+ cursor: pointer;
667
+ padding: 5px 10px;
668
+ border-radius: 8px;
669
+ background: var(--bg);
670
+ border: 1px solid var(--border);
671
+ font-size: 13px;
672
+ color: var(--ink);
673
+ max-width: 320px;
674
+ transition: border-color 0.15s;
675
+ }
676
+ .wb-select:hover { border-color: var(--brand); }
677
+ .wb-icon { font-size: 15px; }
678
+ .wb-label {
679
+ flex: 1;
680
+ white-space: nowrap;
681
+ overflow: hidden;
682
+ text-overflow: ellipsis;
683
+ }
684
+ .wb-arrow { font-size: 10px; color: var(--muted); }
685
+ .wb-perm {
686
+ display: flex;
687
+ align-items: center;
688
+ gap: 5px;
689
+ cursor: pointer;
690
+ padding: 5px 10px;
691
+ border-radius: 8px;
692
+ background: var(--bg);
693
+ border: 1px solid var(--border);
694
+ font-size: 13px;
695
+ color: var(--ink);
696
+ transition: border-color 0.15s;
697
+ }
698
+ .wb-perm:hover { border-color: var(--brand); }
699
+
700
+ /* 閫氳瘽鏍?*/
701
+ .call-bar {
702
+ display: flex;
703
+ align-items: center;
704
+ gap: 10px;
705
+ padding: 10px 0;
706
+ border-top: 1px solid var(--border);
707
+ margin-top: 8px;
708
+ }
709
+ .call-hint { font-size: 12px; color: var(--muted); text-transform: uppercase; letter-spacing: 0.5px; }
710
+ .call-btn {
711
+ border: 1px solid var(--border);
712
+ background: var(--brand-soft);
713
+ color: var(--brand);
714
+ border-radius: 8px;
715
+ padding: 7px 12px;
716
+ cursor: pointer;
717
+ font-size: 13px;
718
+ font-weight: 600;
719
+ }
720
+ .call-btn:hover { filter: brightness(0.97); }
721
+ .call-btn.hangup { background: #fee2e2; color: var(--err); border-color: #fecaca; }
722
+ .call-status { font-size: 12px; color: var(--muted); margin-left: auto; }
723
+
724
+ /* 瑙嗛閫氳瘽绐楀彛 */
725
+ .video-call-window {
726
+ position: fixed;
727
+ bottom: 100px;
728
+ right: 20px;
729
+ width: 240px;
730
+ background: var(--card);
731
+ border: 1px solid var(--border);
732
+ border-radius: 12px;
733
+ overflow: hidden;
734
+ box-shadow: 0 8px 32px rgba(0,0,0,0.2);
735
+ z-index: 100;
736
+ }
737
+ .video-call-header {
738
+ display: flex;
739
+ align-items: center;
740
+ justify-content: space-between;
741
+ padding: 8px 12px;
742
+ background: var(--brand);
743
+ color: #fff;
744
+ font-size: 13px;
745
+ font-weight: 600;
746
+ }
747
+ .video-call-close {
748
+ background: none;
749
+ border: none;
750
+ color: #fff;
751
+ cursor: pointer;
752
+ font-size: 14px;
753
+ padding: 0;
754
+ line-height: 1;
755
+ }
756
+ .video-call-snapshot {
757
+ background: rgba(255,255,255,0.2);
758
+ border: none;
759
+ color: #fff;
760
+ cursor: pointer;
761
+ font-size: 14px;
762
+ padding: 2px 6px;
763
+ border-radius: 4px;
764
+ line-height: 1;
765
+ }
766
+ .video-call-snapshot:hover { background: rgba(255,255,255,0.35); }
767
+ .video-call-window video {
768
+ width: 100%;
769
+ display: block;
770
+ background: #000;
771
+ }
772
+
773
+ /* 搴曢儴宸ュ叿鏍?*/
774
+ .chat-footbar {
775
+ display: flex;
776
+ align-items: center;
777
+ justify-content: space-between;
778
+ padding: 8px 16px;
779
+ background: var(--card);
780
+ border-top: 1px solid var(--border);
781
+ font-size: 13px;
782
+ }
783
+ .model-label { font-size: 13px; color: var(--muted); }
784
+ .model-select {
785
+ padding: 6px 10px;
786
+ border: 1px solid var(--border);
787
+ border-radius: 8px;
788
+ background: var(--card);
789
+ color: var(--ink);
790
+ font-size: 13px;
791
+ }
792
+ .ghost-btn {
793
+ border: 1px solid var(--border);
794
+ background: var(--card);
795
+ color: var(--ink-2);
796
+ border-radius: 8px;
797
+ padding: 6px 9px;
798
+ cursor: pointer;
799
+ font-size: 14px;
800
+ }
801
+ .ghost-btn:hover { background: var(--brand-soft); }
802
+
803
+ /* 鏂板缓浠诲姟鎸夐挳锛堜晶杈规爮锛?*/
804
+ .new-task-btn {
805
+ border: 1px solid var(--border);
806
+ background: var(--brand);
807
+ color: #fff;
808
+ border-radius: 8px;
809
+ padding: 3px 8px;
810
+ cursor: pointer;
811
+ font-size: 11px;
812
+ font-weight: 600;
813
+ line-height: 1.6;
814
+ }
815
+ .new-task-btn:hover { opacity: 0.88; }
816
+
817
+ /* 鏂板缓瀵硅瘽浠诲姟寮圭獥 */
818
+ .nt-form { display: flex; flex-direction: column; gap: 12px; margin-top: 4px; }
819
+ .nt-label { font-size: 12.5px; font-weight: 600; color: var(--ink-2); display: block; margin-bottom: 4px; }
820
+ .nt-form textarea, .nt-form select {
821
+ width: 100%; box-sizing: border-box; padding: 8px 10px; font-size: 13px;
822
+ border: 1px solid var(--border); border-radius: 10px; background: var(--bg);
823
+ color: var(--ink); resize: vertical; font-family: inherit;
824
+ }
825
+ .nt-form select { cursor: pointer; }
826
+ .nt-row { display: flex; gap: 12px; }
827
+ .nt-row > div { flex: 1; }
828
+ .nt-hint { font-size: 12px; color: var(--muted); }
829
+
830
+ /* ========== 鍙充晶闈㈡澘 ========== */
831
+ .right-panel {
832
+ width: 320px;
833
+ background: var(--card);
834
+ border-left: 1px solid var(--border);
835
+ display: flex;
836
+ flex-direction: column;
837
+ flex-shrink: 0;
838
+ overflow: hidden;
839
+ }
840
+ .right-panel.collapsed { width: 0; border: none; }
841
+ .right-tabs {
842
+ display: flex;
843
+ gap: 4px;
844
+ padding: 12px 12px 0;
845
+ border-bottom: 1px solid var(--line);
846
+ }
847
+ .right-tab {
848
+ padding: 8px 14px;
849
+ font-size: 13px;
850
+ color: var(--muted);
851
+ cursor: pointer;
852
+ border-bottom: 2px solid transparent;
853
+ }
854
+ .right-tab.active { color: var(--brand); border-bottom-color: var(--brand); font-weight: 600; }
855
+ .right-body { flex: 1; overflow-y: auto; padding: 12px; }
856
+ .preview-panel { display: none; }
857
+ .preview-panel.active { display: block; }
858
+ .preview-title { font-size: 13px; font-weight: 600; margin-bottom: 8px; color: var(--ink); }
859
+ .preview-content {
860
+ background: var(--bg);
861
+ border: 1px solid var(--border);
862
+ border-radius: 10px;
863
+ padding: 12px;
864
+ font-size: 12.5px;
865
+ overflow-x: auto;
866
+ }
867
+ .preview-content pre { margin: 0; white-space: pre-wrap; word-break: break-word; font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace; }
868
+
869
+ /* 鐢佃剳鎿嶄綔闈㈡澘 */
870
+ .computer-controls { display: flex; align-items: center; gap: 10px; margin-bottom: 10px; }
871
+ .screen-preview {
872
+ background: var(--bg);
873
+ border: 1px solid var(--border);
874
+ border-radius: 8px;
875
+ overflow: hidden;
876
+ margin-bottom: 12px;
877
+ min-height: 150px;
878
+ display: flex;
879
+ align-items: center;
880
+ justify-content: center;
881
+ }
882
+ .screen-preview img { width: 100%; height: auto; display: block; cursor: crosshair; }
883
+ .computer-actions {
884
+ background: var(--bg);
885
+ border: 1px solid var(--border);
886
+ border-radius: 8px;
887
+ padding: 10px;
888
+ }
889
+ .computer-actions .pill {
890
+ padding: 5px 10px;
891
+ font-size: 12px;
892
+ border: 1px solid var(--border);
893
+ background: var(--card);
894
+ border-radius: 6px;
895
+ cursor: pointer;
896
+ }
897
+ .computer-actions .pill:hover { background: var(--brand-soft); border-color: var(--brand); color: var(--brand); }
898
+
899
+ /* 浠诲姟璇︽儏 */
900
+ .detail-ops {
901
+ display: grid;
902
+ grid-template-columns: 1fr 1fr;
903
+ gap: 8px;
904
+ margin-bottom: 14px;
905
+ }
906
+ .detail-ops .secondary {
907
+ border: 1px solid var(--border);
908
+ background: var(--brand-soft);
909
+ color: var(--brand);
910
+ border-radius: 8px;
911
+ padding: 7px 11px;
912
+ cursor: pointer;
913
+ font-size: 12.5px;
914
+ font-weight: 600;
915
+ }
916
+ .detail-ops .secondary:hover { filter: brightness(0.97); }
917
+ .artifact-list { display: flex; flex-direction: column; gap: 4px; }
918
+ .artifact-file {
919
+ padding: 6px 8px;
920
+ border: 1px solid var(--border);
921
+ border-radius: 6px;
922
+ font-size: 12.5px;
923
+ color: var(--ink-2);
924
+ cursor: pointer;
925
+ background: var(--bg);
926
+ }
927
+ .artifact-file:hover { background: var(--brand-soft); color: var(--brand); }
928
+
929
+ /* ========== 鍔熻兘椤甸潰 ========== */
930
+ .page-view {
931
+ flex: 1;
932
+ display: none;
933
+ flex-direction: column;
934
+ padding: 24px;
935
+ overflow-y: auto;
936
+ }
937
+ .page-view.active { display: flex; }
938
+ .page-head { display: flex; align-items: center; justify-content: space-between; margin-bottom: 20px; }
939
+ .page-head h2 { margin: 0; font-size: 20px; }
940
+ .page-head .sub { color: var(--muted); font-size: 13px; margin-top: 4px; }
941
+ .grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); gap: 12px; }
942
+ .tile {
943
+ border: 1px solid var(--border);
944
+ border-radius: 12px;
945
+ padding: 16px;
946
+ cursor: pointer;
947
+ background: var(--card);
948
+ transition: all 0.15s;
949
+ }
950
+ .tile:hover { border-color: var(--brand); box-shadow: 0 6px 18px rgba(37,99,235,0.12); }
951
+ .tile .icon { font-size: 24px; }
952
+ .tile .title { font-weight: 600; margin: 8px 0 4px; font-size: 14px; }
953
+ .tile .desc { color: var(--muted); font-size: 12px; line-height: 1.5; }
954
+ .tile .ops { display: flex; gap: 6px; margin-top: 12px; }
955
+ .tile .ops button { padding: 6px 12px; font-size: 12px; flex: 1; }
956
+ /* 棰勭疆鎸囦护鍗$墖锛氬甫娓愬彉杈规锛屽拰鐢ㄦ埛鑷畾涔夊尯鍒?*/
957
+ .tile.builtin-tile {
958
+ background: linear-gradient(135deg, var(--card) 0%, rgba(37,99,235,0.03) 100%);
959
+ border: 1px solid var(--brand-soft);
960
+ }
961
+ .tile.builtin-tile:hover { border-color: var(--brand); box-shadow: 0 6px 18px rgba(37,99,235,0.15); }
962
+ .tile.builtin-tile .ops { flex-wrap: wrap; }
963
+ .tile.builtin-tile .ops button { flex: 1 1 auto; }
964
+
965
+ /* ========== 浜у搧鍙戝竷鏁呬簨椤甸潰 ========== */
966
+ .release-container { max-width: 900px; margin: 0 auto; }
967
+ .release-hero {
968
+ text-align: center;
969
+ padding: 48px 24px;
970
+ background: linear-gradient(135deg, var(--brand-soft) 0%, rgba(37,99,235,0.08) 100%);
971
+ border-radius: 20px;
972
+ margin-bottom: 40px;
973
+ }
974
+ .release-badge {
975
+ display: inline-block;
976
+ padding: 6px 16px;
977
+ background: var(--brand);
978
+ color: #fff;
979
+ border-radius: 20px;
980
+ font-size: 13px;
981
+ font-weight: 600;
982
+ margin-bottom: 16px;
983
+ }
984
+ .release-title {
985
+ font-size: 48px;
986
+ font-weight: 800;
987
+ margin: 0 0 12px;
988
+ background: linear-gradient(135deg, var(--brand), #6366f1);
989
+ -webkit-background-clip: text;
990
+ -webkit-text-fill-color: transparent;
991
+ background-clip: text;
992
+ }
993
+ .release-subtitle {
994
+ font-size: 18px;
995
+ color: var(--ink-2);
996
+ margin: 0 0 8px;
997
+ }
998
+ .release-tagline {
999
+ font-size: 16px;
1000
+ color: var(--muted);
1001
+ font-style: italic;
1002
+ margin: 16px 0 32px;
1003
+ }
1004
+ .release-stats {
1005
+ display: flex;
1006
+ justify-content: center;
1007
+ gap: 32px;
1008
+ flex-wrap: wrap;
1009
+ }
1010
+ .stat-item {
1011
+ text-align: center;
1012
+ }
1013
+ .stat-num {
1014
+ display: block;
1015
+ font-size: 28px;
1016
+ font-weight: 700;
1017
+ color: var(--brand);
1018
+ }
1019
+ .stat-label {
1020
+ font-size: 12px;
1021
+ color: var(--muted);
1022
+ }
1023
+ .section-title {
1024
+ font-size: 28px;
1025
+ font-weight: 700;
1026
+ margin: 48px 0 24px;
1027
+ text-align: center;
1028
+ }
1029
+ .release-timeline { margin-bottom: 48px; }
1030
+ .timeline {
1031
+ position: relative;
1032
+ padding-left: 40px;
1033
+ }
1034
+ .timeline::before {
1035
+ content: '';
1036
+ position: absolute;
1037
+ left: 15px;
1038
+ top: 0;
1039
+ bottom: 0;
1040
+ width: 2px;
1041
+ background: linear-gradient(to bottom, var(--brand), var(--brand-soft));
1042
+ }
1043
+ .timeline-item {
1044
+ position: relative;
1045
+ margin-bottom: 32px;
1046
+ }
1047
+ .timeline-dot {
1048
+ position: absolute;
1049
+ left: -32px;
1050
+ top: 4px;
1051
+ width: 12px;
1052
+ height: 12px;
1053
+ border-radius: 50%;
1054
+ background: var(--brand-soft);
1055
+ border: 2px solid var(--brand);
1056
+ }
1057
+ .timeline-dot.active {
1058
+ background: var(--brand);
1059
+ box-shadow: 0 0 0 4px rgba(37,99,235,0.2);
1060
+ }
1061
+ .timeline-date {
1062
+ font-size: 13px;
1063
+ color: var(--brand);
1064
+ font-weight: 600;
1065
+ margin-bottom: 4px;
1066
+ }
1067
+ .timeline-content h3 {
1068
+ margin: 0 0 8px;
1069
+ font-size: 18px;
1070
+ }
1071
+ .timeline-content p {
1072
+ color: var(--ink-2);
1073
+ line-height: 1.6;
1074
+ margin: 0 0 8px;
1075
+ }
1076
+ .timeline-quote {
1077
+ font-style: italic;
1078
+ color: var(--muted);
1079
+ border-left: 3px solid var(--brand-soft);
1080
+ padding-left: 12px;
1081
+ margin: 12px 0;
1082
+ }
1083
+ .timeline-tags { display: flex; gap: 8px; flex-wrap: wrap; margin-top: 8px; }
1084
+ .tag {
1085
+ padding: 4px 10px;
1086
+ background: var(--bg);
1087
+ border: 1px solid var(--border);
1088
+ border-radius: 12px;
1089
+ font-size: 11px;
1090
+ color: var(--muted);
1091
+ }
1092
+ .release-team { margin-bottom: 48px; }
1093
+ .team-grid {
1094
+ display: grid;
1095
+ grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
1096
+ gap: 20px;
1097
+ }
1098
+ .team-card {
1099
+ text-align: center;
1100
+ padding: 24px;
1101
+ background: var(--card);
1102
+ border: 1px solid var(--border);
1103
+ border-radius: 16px;
1104
+ }
1105
+ .team-avatar { font-size: 48px; margin-bottom: 12px; }
1106
+ .team-card h3 { margin: 0 0 8px; font-size: 16px; }
1107
+ .team-card p { color: var(--ink-2); font-size: 13px; line-height: 1.5; margin: 0 0 12px; }
1108
+ .team-role {
1109
+ font-size: 12px;
1110
+ color: var(--brand);
1111
+ font-weight: 600;
1112
+ }
1113
+ .release-challenges { margin-bottom: 48px; }
1114
+ .challenges-list { display: flex; flex-direction: column; gap: 16px; }
1115
+ .challenge-item {
1116
+ display: flex;
1117
+ gap: 16px;
1118
+ padding: 20px;
1119
+ background: var(--card);
1120
+ border: 1px solid var(--border);
1121
+ border-radius: 12px;
1122
+ }
1123
+ .challenge-icon { font-size: 28px; flex-shrink: 0; }
1124
+ .challenge-item h4 { margin: 0 0 4px; font-size: 15px; }
1125
+ .challenge-item p { color: var(--ink-2); font-size: 13px; margin: 0; }
1126
+ .release-features { margin-bottom: 48px; }
1127
+ .features-grid {
1128
+ display: grid;
1129
+ grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));
1130
+ gap: 16px;
1131
+ }
1132
+ .feature-card {
1133
+ text-align: center;
1134
+ padding: 24px 16px;
1135
+ background: var(--card);
1136
+ border: 1px solid var(--border);
1137
+ border-radius: 12px;
1138
+ transition: all 0.15s;
1139
+ }
1140
+ .feature-card:hover {
1141
+ border-color: var(--brand);
1142
+ transform: translateY(-2px);
1143
+ box-shadow: 0 8px 24px rgba(37,99,235,0.12);
1144
+ }
1145
+ .feature-icon { font-size: 32px; margin-bottom: 12px; }
1146
+ .feature-card h4 { margin: 0 0 6px; font-size: 14px; }
1147
+ .feature-card p { color: var(--muted); font-size: 12px; margin: 0; }
1148
+ .release-quote {
1149
+ text-align: center;
1150
+ padding: 40px 24px;
1151
+ background: linear-gradient(135deg, var(--brand-soft), rgba(99,102,241,0.1));
1152
+ border-radius: 16px;
1153
+ margin-bottom: 48px;
1154
+ }
1155
+ .release-quote blockquote {
1156
+ font-size: 20px;
1157
+ font-style: italic;
1158
+ color: var(--ink);
1159
+ margin: 0 0 16px;
1160
+ line-height: 1.6;
1161
+ }
1162
+ .release-quote cite {
1163
+ font-size: 14px;
1164
+ color: var(--muted);
1165
+ }
1166
+ .release-cta {
1167
+ text-align: center;
1168
+ padding: 48px 24px;
1169
+ background: var(--card);
1170
+ border: 1px solid var(--border);
1171
+ border-radius: 20px;
1172
+ }
1173
+ .release-cta h2 { margin: 0 0 24px; font-size: 28px; }
1174
+ .cta-buttons { display: flex; gap: 16px; justify-content: center; flex-wrap: wrap; margin-bottom: 20px; }
1175
+ .cta-btn {
1176
+ display: inline-block;
1177
+ padding: 12px 28px;
1178
+ border-radius: 10px;
1179
+ font-size: 15px;
1180
+ font-weight: 600;
1181
+ text-decoration: none;
1182
+ transition: all 0.15s;
1183
+ }
1184
+ .cta-btn.primary {
1185
+ background: var(--brand);
1186
+ color: #fff;
1187
+ }
1188
+ .cta-btn.primary:hover { filter: brightness(1.1); transform: translateY(-1px); }
1189
+ .cta-btn.secondary {
1190
+ background: transparent;
1191
+ color: var(--brand);
1192
+ border: 2px solid var(--brand);
1193
+ }
1194
+ .cta-btn.secondary:hover { background: var(--brand-soft); }
1195
+ .cta-sub { color: var(--muted); font-size: 13px; }
1196
+
1197
+ /* ========== 閫氱敤鏍峰紡 ========== */
1198
+ .card {
1199
+ background: var(--card);
1200
+ border: 1px solid var(--border);
1201
+ border-radius: 16px;
1202
+ padding: 20px;
1203
+ box-shadow: 0 8px 24px rgba(31,41,51,0.06);
1204
+ }
1205
+ label { font-size: 13px; color: var(--muted); display: block; margin-bottom: 6px; }
1206
+ input[type="text"], textarea, select {
1207
+ width: 100%;
1208
+ border: 1px solid var(--border);
1209
+ border-radius: 10px;
1210
+ padding: 10px 12px;
1211
+ font-size: 14px;
1212
+ font-family: inherit;
1213
+ margin-bottom: 12px;
1214
+ background: var(--card);
1215
+ color: var(--ink);
1216
+ }
1217
+ textarea { min-height: 80px; resize: vertical; }
1218
+ button {
1219
+ border: none;
1220
+ background: var(--brand);
1221
+ color: #fff;
1222
+ border-radius: 10px;
1223
+ padding: 9px 16px;
1224
+ font-size: 14px;
1225
+ cursor: pointer;
1226
+ }
1227
+ button:hover { filter: brightness(1.05); }
1228
+ button.secondary { background: #fff; color: var(--ink); border: 1px solid var(--border); }
1229
+ button.ghost { background: transparent; color: var(--ink-2); border: 1px solid var(--border); }
1230
+ button.danger { background: var(--err); }
1231
+ button:disabled { opacity: 0.5; cursor: not-allowed; }
1232
+ .row { display: flex; gap: 8px; }
1233
+ .row > * { flex: 1; }
1234
+ .muted { color: var(--muted); font-size: 12.5px; }
1235
+ .empty { color: var(--muted); font-size: 13px; text-align: center; padding: 18px; }
1236
+ .badge { display: inline-block; padding: 2px 8px; border-radius: 999px; font-size: 11px; font-weight: 600; }
1237
+ .badge.queued { background: #eef2f7; color: var(--muted); }
1238
+ .badge.running { background: var(--brand-soft); color: var(--brand); }
1239
+ .badge.done { background: #f0fdf4; color: var(--ok); }
1240
+ .badge.failed { background: #fef2f2; color: var(--err); }
1241
+
1242
+ /* ========== 妯℃€佹 ========== */
1243
+ .mask {
1244
+ position: fixed;
1245
+ inset: 0;
1246
+ background: rgba(15,23,42,0.45);
1247
+ z-index: 60;
1248
+ display: none;
1249
+ align-items: center;
1250
+ justify-content: center;
1251
+ }
1252
+ .mask.show { display: flex; }
1253
+ .modal {
1254
+ background: var(--card);
1255
+ border-radius: 16px;
1256
+ padding: 24px;
1257
+ width: 520px;
1258
+ max-width: 92vw;
1259
+ max-height: 88vh;
1260
+ overflow-y: auto;
1261
+ box-shadow: 0 20px 60px rgba(0,0,0,0.25);
1262
+ }
1263
+ .modal h3 { margin: 0 0 6px; font-size: 18px; }
1264
+ .modal .hint { color: var(--muted); font-size: 12.5px; margin: 0 0 16px; }
1265
+ .modal .footer { display: flex; gap: 8px; justify-content: flex-end; margin-top: 16px; }
1266
+ .close-x { float: right; cursor: pointer; color: var(--muted); font-size: 18px; }
1267
+
1268
+ /* ========== 涓嬫媺鑿滃崟 ========== */
1269
+ .dropdown { position: relative; }
1270
+ .dropdown-menu {
1271
+ position: absolute;
1272
+ bottom: 100%;
1273
+ left: 0;
1274
+ margin-bottom: 6px;
1275
+ background: var(--card);
1276
+ border: 1px solid var(--border);
1277
+ border-radius: 12px;
1278
+ box-shadow: 0 10px 30px rgba(0,0,0,0.12);
1279
+ min-width: 180px;
1280
+ display: none;
1281
+ z-index: 55;
1282
+ padding: 6px 0;
1283
+ }
1284
+ .dropdown-menu.show { display: block; }
1285
+ .dropdown-item { padding: 9px 14px; font-size: 13px; color: var(--ink-2); cursor: pointer; display: flex; align-items: center; gap: 8px; }
1286
+ .dropdown-item:hover { background: var(--bg); }
1287
+ .dropdown-divider { height: 1px; background: var(--line); margin: 6px 0; }
1288
+
1289
+ /* ========== 鏉冮檺绐楀彛 ========== */
1290
+ .perm-section { margin-bottom: 14px; }
1291
+ .perm-title { font-size: 13px; font-weight: 600; margin-bottom: 8px; }
1292
+ .perm-row { display: flex; align-items: center; gap: 10px; margin-bottom: 8px; font-size: 13px; }
1293
+ .perm-row input[type="checkbox"] { width: auto; margin: 0; }
1294
+ .perm-row label { margin: 0; color: var(--ink-2); }
1295
+
1296
+ /* ========== 鏅鸿兘浣撻€夋嫨 ========== */
1297
+ .agent-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; }
1298
+ .agent-card { border: 1px solid var(--border); border-radius: 12px; padding: 14px; text-align: center; cursor: pointer; }
1299
+ .agent-card:hover, .agent-card.selected { border-color: var(--brand); background: var(--brand-soft); }
1300
+ .agent-card .icon { font-size: 24px; }
1301
+ .agent-card .title { font-size: 13px; font-weight: 600; margin-top: 6px; }
1302
+
1303
+ /* ========== 澶фā鍨嬬鐞?========== */
1304
+ .model-list { display: flex; flex-direction: column; gap: 8px; margin-bottom: 14px; max-height: 200px; overflow-y: auto; }
1305
+ .model-item {
1306
+ border: 1px solid var(--border);
1307
+ border-radius: 10px;
1308
+ padding: 10px 12px;
1309
+ display: flex;
1310
+ align-items: center;
1311
+ gap: 10px;
1312
+ background: var(--bg);
1313
+ }
1314
+ .model-item .mi-name { font-weight: 600; color: var(--ink); font-size: 13px; }
1315
+ .model-item .mi-base { font-size: 11px; color: var(--muted); word-break: break-all; }
1316
+ .model-item .mi-default { font-size: 11px; color: var(--ok); border: 1px solid #bbf7d0; background: #f0fdf4; border-radius: 6px; padding: 1px 6px; }
1317
+ .model-item .mi-actions { margin-left: auto; display: flex; gap: 6px; }
1318
+ .model-item .mi-actions button {
1319
+ border: 1px solid var(--border);
1320
+ background: var(--card);
1321
+ color: var(--ink-2);
1322
+ border-radius: 6px;
1323
+ padding: 4px 8px;
1324
+ cursor: pointer;
1325
+ font-size: 12px;
1326
+ }
1327
+ .model-item .mi-actions button:hover { background: var(--brand-soft); }
1328
+ .model-item .mi-actions button.danger { color: var(--err); }
1329
+ .model-form { border-top: 1px solid var(--line); padding-top: 14px; }
1330
+ .form-row { display: flex; gap: 10px; }
1331
+ .form-row .form-field { flex: 1; }
1332
+ .form-field { margin-bottom: 10px; }
1333
+ .form-field label { font-size: 12px; color: var(--muted); display: block; margin-bottom: 5px; }
1334
+ .form-field input {
1335
+ width: 100%;
1336
+ padding: 8px 10px;
1337
+ border: 1px solid var(--border);
1338
+ border-radius: 8px;
1339
+ background: var(--card);
1340
+ color: var(--ink);
1341
+ font-size: 13px;
1342
+ box-sizing: border-box;
1343
+ margin: 0;
1344
+ }
1345
+ .form-actions { display: flex; align-items: center; gap: 10px; margin-top: 4px; }
1346
+ .model-form-msg { font-size: 12px; color: var(--ok); }
1347
+ .model-form-msg.err { color: var(--err); }
1348
+ .primary { background: var(--brand); color: #fff; border: none; border-radius: 8px; padding: 8px 16px; cursor: pointer; font-size: 13px; font-weight: 600; }
1349
+ .ghost { background: var(--card); color: var(--ink-2); border: 1px solid var(--border); border-radius: 8px; padding: 8px 16px; cursor: pointer; font-size: 13px; }
1350
+ .primary.sm, .ghost.sm { padding: 5px 12px; font-size: 12px; }
1351
+
1352
+ /* ========== 璁剧疆闈㈡澘 ========== */
1353
+ .settings-layout { display: flex; gap: 0; min-height: 360px; }
1354
+ .settings-nav { flex: 0 0 130px; border-right: 1px solid var(--line); padding-right: 8px; }
1355
+ .settings-cat { padding: 9px 10px; border-radius: 8px; cursor: pointer; font-size: 13px; color: var(--ink-2); }
1356
+ .settings-cat:hover { background: var(--bg); }
1357
+ .settings-cat.active { background: var(--brand-soft); color: var(--brand); font-weight: 600; }
1358
+ .settings-body { flex: 1; padding: 4px 4px 4px 16px; overflow-y: auto; }
1359
+ .settings-item {
1360
+ display: flex;
1361
+ align-items: center;
1362
+ gap: 12px;
1363
+ padding: 12px;
1364
+ border: 1px solid var(--border);
1365
+ border-radius: 10px;
1366
+ margin-bottom: 10px;
1367
+ cursor: pointer;
1368
+ background: var(--card);
1369
+ }
1370
+ .settings-item:hover { background: var(--brand-soft); }
1371
+ .settings-item .si-icon { font-size: 18px; }
1372
+ .settings-item .si-main { flex: 1; }
1373
+ .settings-item .si-title { font-weight: 600; font-size: 13.5px; color: var(--ink); }
1374
+ .settings-item .si-desc { font-size: 12px; color: var(--muted); }
1375
+ .settings-item .si-arrow { color: var(--muted); }
1376
+
1377
+ /* ========== 璁剧疆路澶фā鍨嬬鐞嗭紙绠€娲佸崱鐗囬锛?========== */
1378
+ .model-manage { margin-top: 4px; }
1379
+ .mm-list { display: flex; flex-direction: column; gap: 8px; }
1380
+ .mm-empty {
1381
+ padding: 28px 16px;
1382
+ text-align: center;
1383
+ color: var(--muted);
1384
+ font-size: 13px;
1385
+ background: var(--bg);
1386
+ border: 1px dashed var(--border);
1387
+ border-radius: 10px;
1388
+ }
1389
+ .mm-empty .mm-empty-icon { font-size: 28px; margin-bottom: 6px; opacity: 0.6; }
1390
+ .mm-empty .mm-empty-hint { font-size: 12px; margin-top: 4px; color: var(--muted); }
1391
+ .mm-card {
1392
+ display: flex;
1393
+ flex-direction: column;
1394
+ gap: 6px;
1395
+ padding: 12px 14px;
1396
+ border: 1px solid var(--border);
1397
+ border-radius: 10px;
1398
+ background: var(--card);
1399
+ transition: border-color 0.15s;
1400
+ }
1401
+ .mm-card:hover { border-color: var(--brand); }
1402
+ .mm-card-head { display: flex; align-items: center; gap: 8px; }
1403
+ .mm-card-name { font-weight: 600; font-size: 14px; color: var(--ink); flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
1404
+ .mm-default-tag {
1405
+ font-size: 11px;
1406
+ padding: 1px 7px;
1407
+ border-radius: 99px;
1408
+ background: var(--brand-soft);
1409
+ color: var(--brand);
1410
+ font-weight: 500;
1411
+ flex: 0 0 auto;
1412
+ }
1413
+ .mm-card-url {
1414
+ font-size: 12px;
1415
+ color: var(--muted);
1416
+ word-break: break-all;
1417
+ display: flex;
1418
+ align-items: center;
1419
+ gap: 4px;
1420
+ }
1421
+ .mm-card-url::before { content: '馃敆'; font-size: 11px; opacity: 0.7; }
1422
+ .mm-card-meta { font-size: 11px; color: var(--muted); }
1423
+ .mm-card-actions {
1424
+ display: flex;
1425
+ gap: 4px;
1426
+ justify-content: flex-end;
1427
+ margin-top: 2px;
1428
+ border-top: 1px solid var(--line);
1429
+ padding-top: 8px;
1430
+ }
1431
+ .mm-act {
1432
+ font-size: 12px;
1433
+ padding: 4px 10px;
1434
+ border-radius: 6px;
1435
+ background: transparent;
1436
+ border: 1px solid var(--border);
1437
+ color: var(--ink-2);
1438
+ cursor: pointer;
1439
+ transition: all 0.15s;
1440
+ }
1441
+ .mm-act:hover { background: var(--bg); color: var(--ink); }
1442
+ .mm-act-primary { color: var(--brand); border-color: var(--brand-soft); }
1443
+ .mm-act-primary:hover { background: var(--brand-soft); }
1444
+ .mm-act-danger { color: var(--muted); }
1445
+ .mm-act-danger:hover { color: var(--err); background: transparent; }
1446
+ /* 鍒嗛殧 */
1447
+ .mm-divider {
1448
+ display: flex;
1449
+ align-items: center;
1450
+ gap: 8px;
1451
+ margin: 16px 0 10px;
1452
+ font-size: 12px;
1453
+ color: var(--muted);
1454
+ }
1455
+ .mm-divider::before, .mm-divider::after {
1456
+ content: '';
1457
+ flex: 1;
1458
+ height: 1px;
1459
+ background: var(--line);
1460
+ }
1461
+ /* 琛ㄥ崟 */
1462
+ .mm-form {
1463
+ display: flex;
1464
+ flex-direction: column;
1465
+ gap: 10px;
1466
+ padding: 14px;
1467
+ border: 1px solid var(--border);
1468
+ border-radius: 10px;
1469
+ background: var(--bg);
1470
+ }
1471
+ .mm-form-title { font-size: 13px; font-weight: 600; color: var(--ink); margin-bottom: 2px; }
1472
+ .mm-form input, .mm-form textarea {
1473
+ margin: 0;
1474
+ padding: 8px 10px;
1475
+ font-size: 13px;
1476
+ border: 1px solid var(--border);
1477
+ border-radius: 8px;
1478
+ background: var(--card);
1479
+ transition: border-color 0.15s;
1480
+ }
1481
+ .mm-form input:focus, .mm-form textarea:focus {
1482
+ outline: none;
1483
+ border-color: var(--brand);
1484
+ }
1485
+ .mm-form textarea { resize: vertical; min-height: 56px; font-family: inherit; }
1486
+ .mm-form-actions { display: flex; align-items: center; gap: 8px; margin-top: 2px; }
1487
+ .mm-form-actions .mm-form-msg { font-size: 12px; color: var(--muted); margin-left: auto; }
1488
+ .mm-form-actions .mm-form-msg.err { color: var(--err); }
1489
+
1490
+ /* ========== 鐢ㄦ埛鑿滃崟锛堝彸渚т晶杈规爮鏍峰紡锛?========== */
1491
+ .bottom-sheet-mask {
1492
+ position: fixed;
1493
+ inset: 0;
1494
+ background: rgba(15,23,42,0.35);
1495
+ z-index: 70;
1496
+ display: none;
1497
+ justify-content: flex-end;
1498
+ }
1499
+ .bottom-sheet-mask.show { display: flex; }
1500
+ .bottom-sheet {
1501
+ background: var(--card);
1502
+ border-radius: 16px 0 0 16px;
1503
+ width: 280px;
1504
+ max-width: 85vw;
1505
+ max-height: 100vh;
1506
+ overflow-y: auto;
1507
+ padding: 16px 0;
1508
+ box-shadow: -10px 0 40px rgba(0,0,0,0.15);
1509
+ transform: translateX(100%);
1510
+ transition: transform 0.25s ease;
1511
+ }
1512
+ .bottom-sheet-mask.show .bottom-sheet { transform: translateX(0); }
1513
+ .sheet-header { padding: 8px 20px 16px; display: flex; align-items: center; gap: 12px; border-bottom: 1px solid var(--line); margin-bottom: 6px; }
1514
+ .sheet-item { padding: 12px 20px; display: flex; align-items: center; gap: 12px; cursor: pointer; font-size: 14px; color: var(--ink-2); }
1515
+ .sheet-item:hover { background: var(--bg); }
1516
+ .sheet-item .icon { width: 22px; text-align: center; }
1517
+ .sheet-item .right { margin-left: auto; font-size: 12px; color: var(--muted); }
1518
+
1519
+ /* ========== 宸ヤ綔鍖?========== */
1520
+ .workspace-box { border: 1px solid var(--border); border-radius: 10px; padding: 10px; background: var(--bg); }
1521
+ .workspace-cwd { font-size: 12px; color: var(--ink-2); word-break: break-all; margin-bottom: 8px; }
1522
+ .workspace-input { display: flex; gap: 6px; }
1523
+ .workspace-input input { flex: 1; margin: 0; font-size: 12px; padding: 6px 8px; }
1524
+ .workspace-input button { padding: 6px 10px; font-size: 12px; }
1525
+ .file-tree { margin-top: 8px; display: flex; flex-direction: column; gap: 2px; max-height: 220px; overflow-y: auto; }
1526
+ .file-item { padding: 5px 8px; border-radius: 6px; cursor: pointer; font-size: 12px; display: flex; align-items: center; gap: 6px; color: var(--ink-2); }
1527
+ .file-item:hover { background: var(--brand-soft); }
1528
+ .file-item.dir { font-weight: 500; }
1529
+ .file-item.drive-switcher { flex-direction: column; align-items: flex-start; padding: 8px; background: var(--bg); border: 1px dashed var(--border); }
1530
+ .drive-option { padding: 3px 10px; margin-top: 4px; border-radius: 4px; font-size: 11px; cursor: pointer; color: var(--ink-2); }
1531
+ .drive-option:hover { background: var(--brand-soft); color: var(--brand); }
1532
+
1533
+ /* ========== 鏂囦欢鑺墖 ========== */
1534
+ .file-chip { display: inline-flex; align-items: center; gap: 6px; background: var(--brand-soft); color: var(--brand); padding: 4px 8px; border-radius: 6px; font-size: 12px; cursor: pointer; }
1535
+ .file-chip:hover { opacity: 0.85; }
1536
+ /* 杈撳叆鍖郝峰緟鍙戦€侀檮浠舵殏瀛橈紙鐐瑰彂閫佹椂缁熶竴涓婁紶缁?AI锛?*/
1537
+ .staged-area {
1538
+ display: none;
1539
+ flex-wrap: wrap;
1540
+ gap: 6px;
1541
+ padding: 0 0 8px 0;
1542
+ border-bottom: 1px dashed var(--border);
1543
+ margin-bottom: 8px;
1544
+ }
1545
+ .staged-area.show { display: flex; }
1546
+ .staged-chip {
1547
+ display: inline-flex;
1548
+ align-items: center;
1549
+ gap: 6px;
1550
+ padding: 4px 4px 4px 8px;
1551
+ background: var(--brand-soft);
1552
+ color: var(--brand);
1553
+ border-radius: 6px;
1554
+ font-size: 12px;
1555
+ max-width: 240px;
1556
+ }
1557
+ .staged-chip .staged-name { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; max-width: 180px; }
1558
+ .staged-chip .staged-size { color: var(--muted); font-size: 11px; }
1559
+ .staged-chip .staged-remove {
1560
+ display: inline-flex;
1561
+ align-items: center;
1562
+ justify-content: center;
1563
+ width: 18px;
1564
+ height: 18px;
1565
+ border-radius: 50%;
1566
+ background: transparent;
1567
+ border: none;
1568
+ color: var(--brand);
1569
+ cursor: pointer;
1570
+ font-size: 14px;
1571
+ line-height: 1;
1572
+ padding: 0;
1573
+ }
1574
+ .staged-chip .staged-remove:hover { background: rgba(0,0,0,.08); }
1575
+ .staged-hint {
1576
+ font-size: 11px;
1577
+ color: var(--muted);
1578
+ align-self: center;
1579
+ margin-left: 4px;
1580
+ }
1581
+
1582
+ /* ========== 鎴浘閬僵 ========== */
1583
+ .crop-overlay { position: fixed; inset: 0; z-index: 9999; background: #000; cursor: crosshair; }
1584
+ .crop-tip { position: fixed; top: 16px; left: 50%; transform: translateX(-50%); background: rgba(0,0,0,0.8); color: #fff; padding: 8px 18px; border-radius: 20px; font-size: 13px; pointer-events: none; z-index: 10001; }
1585
+ .crop-selection { position: fixed; border: 2px dashed #00ffcc; background: rgba(0,255,204,0.08); box-shadow: 0 0 0 9999px rgba(0,0,0,0.5); pointer-events: none; z-index: 10000; display: none; }
1586
+
1587
+ /* ========== Toast ========== */
1588
+ .toast {
1589
+ position: fixed;
1590
+ bottom: 24px;
1591
+ left: 50%;
1592
+ transform: translateX(-50%);
1593
+ background: #1f2933;
1594
+ color: #fff;
1595
+ padding: 10px 18px;
1596
+ border-radius: 10px;
1597
+ font-size: 13px;
1598
+ z-index: 80;
1599
+ opacity: 0;
1600
+ transition: 0.25s;
1601
+ pointer-events: none;
1602
+ }
1603
+ .toast.show { opacity: 1; }
1604
+
1605
+ /* ========== 闅愯棌鏂囦欢杈撳叆 ========== */
1606
+ input[type="file"] { display: none; }
1607
+
1608
+ /* ========== 璁板繂绯荤粺 ========== */
1609
+ .stat-card { text-align: center; padding: 16px; }
1610
+ .stat-label { font-size: 12px; color: var(--muted); margin-bottom: 8px; }
1611
+ .stat-value { font-size: 24px; font-weight: 700; color: var(--brand); }
1612
+ .stat-date { font-size: 13px; color: var(--ink-2); font-weight: 400; }
1613
+ .memory-content { max-height: 60vh; overflow-y: auto; white-space: pre-wrap; font-family: "SF Mono", Monaco, monospace; font-size: 12.5px; line-height: 1.7; }
1614
+ .memory-content h1, .memory-content h2, .memory-content h3 { color: var(--brand); margin-top: 0; }
1615
+ .memory-content pre { background: var(--bg); padding: 12px; border-radius: 8px; overflow-x: auto; }
1616
+ .memory-content code { background: var(--bg); padding: 2px 6px; border-radius: 4px; font-size: 12px; }
1617
+
1618
+ /* ========== 娆㈣繋寮曞寮圭獥 ========== */
1619
+ #welcomeGuideModal .modal { width: 480px; }
1620
+ .welcome-guide-header { display: flex; align-items: center; gap: 12px; margin-bottom: 16px; }
1621
+ .welcome-guide-header .icon { font-size: 32px; }
1622
+ .welcome-guide-header h3 { margin: 0; font-size: 18px; }
1623
+ .welcome-guide-header p { margin: 4px 0 0; font-size: 12px; color: var(--muted); }
1624
+ .welcome-task-list { display: flex; flex-direction: column; gap: 8px; margin-bottom: 16px; }
1625
+ .welcome-task-item {
1626
+ display: flex;
1627
+ align-items: center;
1628
+ gap: 12px;
1629
+ padding: 12px;
1630
+ border: 1px solid var(--border);
1631
+ border-radius: 10px;
1632
+ background: var(--bg);
1633
+ cursor: pointer;
1634
+ transition: all 0.15s;
1635
+ }
1636
+ .welcome-task-item:hover {
1637
+ border-color: var(--brand);
1638
+ background: var(--brand-soft);
1639
+ }
1640
+ .welcome-task-index {
1641
+ width: 28px;
1642
+ height: 28px;
1643
+ border-radius: 50%;
1644
+ background: var(--brand);
1645
+ color: #fff;
1646
+ display: flex;
1647
+ align-items: center;
1648
+ justify-content: center;
1649
+ font-size: 13px;
1650
+ font-weight: 700;
1651
+ flex-shrink: 0;
1652
+ }
1653
+ .welcome-task-content { flex: 1; min-width: 0; }
1654
+ .welcome-task-title { font-size: 13px; font-weight: 600; color: var(--ink); }
1655
+ .welcome-task-desc { font-size: 11px; color: var(--muted); margin-top: 2px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
1656
+ .welcome-task-run {
1657
+ padding: 4px 10px;
1658
+ border: 1px solid var(--brand);
1659
+ background: transparent;
1660
+ color: var(--brand);
1661
+ border-radius: 6px;
1662
+ font-size: 11px;
1663
+ cursor: pointer;
1664
+ flex-shrink: 0;
1665
+ transition: all 0.15s;
1666
+ }
1667
+ .welcome-task-run:hover {
1668
+ background: var(--brand);
1669
+ color: #fff;
1670
+ }
1671
+ .empty-welcome {
1672
+ text-align: center;
1673
+ padding: 20px;
1674
+ color: var(--muted);
1675
+ font-size: 13px;
1676
+ }
1677
+
1678
+ /* ========== 鍚庣鏈嶅姟鏂繛鎻愮ず妯箙 ========== */
1679
+ .backend-offline-banner {
1680
+ position: fixed;
1681
+ top: 0;
1682
+ left: 0;
1683
+ right: 0;
1684
+ z-index: 10000;
1685
+ background: linear-gradient(90deg, #c62828, #e53935);
1686
+ color: #fff;
1687
+ padding: 9px 20px;
1688
+ display: flex;
1689
+ align-items: center;
1690
+ gap: 10px;
1691
+ font-size: 13px;
1692
+ font-weight: 500;
1693
+ box-shadow: 0 2px 10px rgba(0, 0, 0, 0.25);
1694
+ animation: bob-slide-down 0.25s ease;
1695
+ }
1696
+ .backend-offline-banner .bob-icon { font-size: 16px; flex-shrink: 0; }
1697
+ .backend-offline-banner .bob-text { flex: 1; min-width: 0; }
1698
+ .backend-offline-banner .bob-reconnect {
1699
+ background: rgba(255, 255, 255, 0.18);
1700
+ border: 1px solid rgba(255, 255, 255, 0.4);
1701
+ color: #fff;
1702
+ padding: 3px 12px;
1703
+ border-radius: 5px;
1704
+ cursor: pointer;
1705
+ font-size: 12px;
1706
+ font-weight: 500;
1707
+ flex-shrink: 0;
1708
+ transition: background 0.15s;
1709
+ }
1710
+ .backend-offline-banner .bob-reconnect:hover {
1711
+ background: rgba(255, 255, 255, 0.3);
1712
+ }
1713
+ .backend-offline-banner .bob-reconnect:active {
1714
+ transform: scale(0.96);
1715
+ }
1716
+ @keyframes bob-slide-down {
1717
+ from { transform: translateY(-100%); opacity: 0; }
1718
+ to { transform: translateY(0); opacity: 1; }
1719
+ }
1720
+
1721
+ /* ========== P2-1: 璁捐绋胯浆浠g爜 ========== */
1722
+ @keyframes spin {
1723
+ to { transform: rotate(360deg); }
1724
+ }
1725
+ .design-result-tab.active {
1726
+ background: var(--accent, #2d5a3d) !important;
1727
+ color: #fff !important;
1728
+ border-color: var(--accent, #2d5a3d) !important;
1729
+ }
1730
+ #designDropZone:hover {
1731
+ border-color: var(--accent, #2d5a3d);
1732
+ background: var(--card, #f5f5f5);
1733
+ }
1734
+
1735
+
1736
+ /* ===== 文字选择优化(精确选择、长按复制、不跳开) ===== */
1737
+ .msg, .msg * {
1738
+ -webkit-user-select: text !important;
1739
+ user-select: text !important;
1740
+ -webkit-touch-callout: default !important;
1741
+ }
1742
+ .msg {
1743
+ cursor: text;
1744
+ }
1745
+ .msg ::selection, .msg::selection {
1746
+ background: rgba(79, 110, 247, 0.25);
1747
+ color: inherit;
1748
+ }
1749
+ .msg ::-moz-selection {
1750
+ background: rgba(79, 110, 247, 0.25);
1751
+ }
1752
+ /* 代码块内文字也可选择 */
1753
+ pre, code, .code-block, .code-block * {
1754
+ -webkit-user-select: text !important;
1755
+ user-select: text !important;
1756
+ }