codexmate 0.0.20 → 0.0.21

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 (102) hide show
  1. package/README.en.md +349 -259
  2. package/README.md +284 -252
  3. package/cli/agents-files.js +162 -0
  4. package/cli/archive-helpers.js +446 -0
  5. package/cli/auth-profiles.js +359 -0
  6. package/cli/builtin-proxy.js +580 -0
  7. package/cli/claude-proxy.js +998 -0
  8. package/cli/config-bootstrap.js +384 -0
  9. package/cli/config-health.js +338 -338
  10. package/cli/openclaw-config.js +629 -0
  11. package/cli/skills.js +1141 -0
  12. package/cli/zip-commands.js +510 -0
  13. package/cli.js +13101 -13497
  14. package/lib/cli-file-utils.js +151 -151
  15. package/lib/cli-models-utils.js +419 -311
  16. package/lib/cli-network-utils.js +164 -164
  17. package/lib/cli-path-utils.js +69 -0
  18. package/lib/cli-session-utils.js +121 -121
  19. package/lib/cli-sessions.js +386 -0
  20. package/lib/cli-utils.js +155 -155
  21. package/lib/download-artifacts.js +77 -0
  22. package/lib/mcp-stdio.js +440 -440
  23. package/lib/task-orchestrator.js +869 -0
  24. package/lib/text-diff.js +303 -303
  25. package/lib/workflow-engine.js +340 -340
  26. package/package.json +74 -70
  27. package/res/json5.min.js +1 -1
  28. package/res/vue.global.prod.js +13 -0
  29. package/web-ui/app.js +530 -397
  30. package/web-ui/index.html +33 -30
  31. package/web-ui/logic.agents-diff.mjs +386 -386
  32. package/web-ui/logic.claude.mjs +168 -108
  33. package/web-ui/logic.mjs +5 -5
  34. package/web-ui/logic.runtime.mjs +124 -124
  35. package/web-ui/logic.sessions.mjs +581 -263
  36. package/web-ui/modules/api.mjs +90 -69
  37. package/web-ui/modules/app.computed.dashboard.mjs +113 -113
  38. package/web-ui/modules/app.computed.index.mjs +15 -13
  39. package/web-ui/modules/app.computed.main-tabs.mjs +195 -0
  40. package/web-ui/modules/app.computed.session.mjs +507 -141
  41. package/web-ui/modules/app.constants.mjs +15 -15
  42. package/web-ui/modules/app.methods.agents.mjs +493 -493
  43. package/web-ui/modules/app.methods.claude-config.mjs +174 -174
  44. package/web-ui/modules/app.methods.codex-config.mjs +640 -640
  45. package/web-ui/modules/app.methods.index.mjs +88 -86
  46. package/web-ui/modules/app.methods.install.mjs +149 -157
  47. package/web-ui/modules/app.methods.navigation.mjs +619 -478
  48. package/web-ui/modules/app.methods.openclaw-core.mjs +814 -514
  49. package/web-ui/modules/app.methods.openclaw-editing.mjs +372 -337
  50. package/web-ui/modules/app.methods.openclaw-persist.mjs +369 -251
  51. package/web-ui/modules/app.methods.providers.mjs +363 -265
  52. package/web-ui/modules/app.methods.runtime.mjs +323 -323
  53. package/web-ui/modules/app.methods.session-actions.mjs +520 -457
  54. package/web-ui/modules/app.methods.session-browser.mjs +626 -435
  55. package/web-ui/modules/app.methods.session-timeline.mjs +448 -441
  56. package/web-ui/modules/app.methods.session-trash.mjs +422 -419
  57. package/web-ui/modules/app.methods.startup-claude.mjs +412 -406
  58. package/web-ui/modules/app.methods.task-orchestration.mjs +471 -0
  59. package/web-ui/modules/config-mode.computed.mjs +126 -124
  60. package/web-ui/modules/skills.computed.mjs +107 -107
  61. package/web-ui/modules/skills.methods.mjs +481 -481
  62. package/web-ui/partials/index/layout-footer.html +13 -69
  63. package/web-ui/partials/index/layout-header.html +402 -337
  64. package/web-ui/partials/index/modal-config-template-agents.html +125 -125
  65. package/web-ui/partials/index/modal-confirm-toast.html +32 -32
  66. package/web-ui/partials/index/modal-health-check.html +72 -72
  67. package/web-ui/partials/index/modal-openclaw-config.html +280 -275
  68. package/web-ui/partials/index/modal-skills.html +184 -184
  69. package/web-ui/partials/index/modals-basic.html +156 -196
  70. package/web-ui/partials/index/panel-config-claude.html +126 -100
  71. package/web-ui/partials/index/panel-config-codex.html +237 -237
  72. package/web-ui/partials/index/panel-config-openclaw.html +78 -84
  73. package/web-ui/partials/index/panel-docs.html +130 -0
  74. package/web-ui/partials/index/panel-market.html +174 -174
  75. package/web-ui/partials/index/panel-orchestration.html +397 -0
  76. package/web-ui/partials/index/panel-sessions.html +292 -387
  77. package/web-ui/partials/index/panel-settings.html +190 -166
  78. package/web-ui/partials/index/panel-usage.html +213 -0
  79. package/web-ui/session-helpers.mjs +559 -362
  80. package/web-ui/source-bundle.cjs +233 -233
  81. package/web-ui/styles/base-theme.css +271 -373
  82. package/web-ui/styles/controls-forms.css +360 -354
  83. package/web-ui/styles/docs-panel.css +182 -0
  84. package/web-ui/styles/feedback.css +108 -108
  85. package/web-ui/styles/health-check-dialog.css +144 -144
  86. package/web-ui/styles/layout-shell.css +376 -330
  87. package/web-ui/styles/modals-core.css +464 -449
  88. package/web-ui/styles/navigation-panels.css +348 -381
  89. package/web-ui/styles/openclaw-structured.css +266 -266
  90. package/web-ui/styles/responsive.css +450 -416
  91. package/web-ui/styles/sessions-list.css +400 -414
  92. package/web-ui/styles/sessions-preview.css +411 -405
  93. package/web-ui/styles/sessions-toolbar-trash.css +243 -243
  94. package/web-ui/styles/sessions-usage.css +628 -276
  95. package/web-ui/styles/skills-list.css +296 -298
  96. package/web-ui/styles/skills-market.css +335 -335
  97. package/web-ui/styles/task-orchestration.css +776 -0
  98. package/web-ui/styles/titles-cards.css +408 -407
  99. package/web-ui/styles.css +18 -16
  100. package/web-ui.html +17 -17
  101. package/res/screenshot.png +0 -0
  102. package/res/vue.global.js +0 -18552
@@ -1,298 +1,296 @@
1
- .skills-hint-line,
2
- .hint-single-line {
3
- display: block;
4
- white-space: nowrap;
5
- overflow: hidden;
6
- text-overflow: ellipsis;
7
- max-width: 100%;
8
- }
9
-
10
- .skill-list {
11
- display: flex;
12
- flex-direction: column;
13
- gap: var(--spacing-xs);
14
- margin-bottom: var(--spacing-sm);
15
- max-height: min(52vh, 440px);
16
- overflow-y: auto;
17
- padding-right: 2px;
18
- scrollbar-width: thin;
19
- scrollbar-color: rgba(166, 149, 130, 0.82) transparent;
20
- }
21
-
22
- .skill-list::-webkit-scrollbar {
23
- width: 6px;
24
- height: 6px;
25
- }
26
-
27
- .skill-list::-webkit-scrollbar-track {
28
- background: transparent;
29
- border-radius: 999px;
30
- }
31
-
32
- .skill-list::-webkit-scrollbar-thumb {
33
- background: linear-gradient(to bottom, rgba(191, 174, 154, 0.95) 0%, rgba(160, 141, 121, 0.9) 100%);
34
- border-radius: 999px;
35
- border: 1px solid rgba(255, 255, 255, 0.9);
36
- }
37
-
38
- .skill-list::-webkit-scrollbar-thumb:hover {
39
- background: linear-gradient(to bottom, rgba(176, 157, 137, 0.95) 0%, rgba(145, 126, 107, 0.92) 100%);
40
- }
41
-
42
- .skill-item {
43
- display: flex;
44
- align-items: flex-start;
45
- gap: var(--spacing-xs);
46
- border: 1px dashed var(--color-border-soft);
47
- border-radius: var(--radius-sm);
48
- padding: var(--spacing-xs);
49
- background: var(--color-surface-alt);
50
- transition: border-color var(--transition-fast) var(--ease-spring), background-color var(--transition-fast) var(--ease-spring);
51
- }
52
-
53
- .skill-item-main {
54
- min-width: 0;
55
- display: flex;
56
- flex-direction: column;
57
- gap: 6px;
58
- flex: 1;
59
- }
60
-
61
- .skill-item-title {
62
- font-size: var(--font-size-secondary);
63
- font-weight: var(--font-weight-secondary);
64
- color: var(--color-text-secondary);
65
- }
66
-
67
- .skill-item-description {
68
- font-size: var(--font-size-caption);
69
- line-height: 1.45;
70
- color: var(--color-text-tertiary);
71
- }
72
-
73
- .skill-item-meta {
74
- display: flex;
75
- flex-wrap: wrap;
76
- gap: var(--spacing-xs);
77
- align-items: center;
78
- min-width: 0;
79
- }
80
-
81
- .skill-item-path {
82
- font-family: var(--font-family-mono);
83
- font-size: var(--font-size-caption);
84
- color: var(--color-text-tertiary);
85
- word-break: break-all;
86
- }
87
-
88
- .skill-item:hover {
89
- border-color: rgba(201, 94, 75, 0.35);
90
- }
91
-
92
- .skill-item.selected {
93
- border-color: rgba(201, 94, 75, 0.55);
94
- background: linear-gradient(to bottom, rgba(201, 94, 75, 0.10) 0%, rgba(201, 94, 75, 0.04) 100%);
95
- }
96
-
97
- .skills-empty-state {
98
- margin-bottom: var(--spacing-sm);
99
- border: 1px dashed var(--color-border-soft);
100
- border-radius: var(--radius-sm);
101
- background: linear-gradient(to bottom, rgba(255, 255, 255, 0.78) 0%, rgba(255, 255, 255, 0.58) 100%);
102
- color: var(--color-text-tertiary);
103
- font-size: var(--font-size-secondary);
104
- text-align: center;
105
- padding: 18px 12px;
106
- }
107
-
108
- .skills-import-block {
109
- margin-bottom: var(--spacing-sm);
110
- }
111
-
112
- .skills-import-title {
113
- font-size: var(--font-size-body);
114
- font-weight: var(--font-weight-secondary);
115
- color: var(--color-text-secondary);
116
- }
117
-
118
- .skills-import-list {
119
- max-height: min(28vh, 260px);
120
- }
121
-
122
- .skills-import-empty {
123
- margin-bottom: 0;
124
- }
125
-
126
- .list-row {
127
- display: flex;
128
- flex-wrap: wrap;
129
- gap: var(--spacing-xs);
130
- align-items: center;
131
- margin-bottom: var(--spacing-xs);
132
- }
133
-
134
- .list-row:last-child {
135
- margin-bottom: 0;
136
- }
137
-
138
- .list-row .form-input {
139
- flex: 1;
140
- min-width: 140px;
141
- }
142
-
143
- .btn-mini {
144
- padding: 6px 10px;
145
- border-radius: var(--radius-sm);
146
- border: 1px solid var(--color-border-soft);
147
- background: linear-gradient(to bottom, rgba(255, 255, 255, 0.95) 0%, rgba(255, 255, 255, 0.85) 100%);
148
- font-size: var(--font-size-caption);
149
- font-weight: var(--font-weight-secondary);
150
- color: var(--color-text-secondary);
151
- cursor: pointer;
152
- transition: all var(--transition-fast) var(--ease-spring);
153
- box-shadow: var(--shadow-subtle);
154
- }
155
-
156
- .btn-mini:hover {
157
- border-color: var(--color-brand);
158
- color: var(--color-brand);
159
- transform: translateY(-1px);
160
- }
161
-
162
- .btn-mini.delete {
163
- color: var(--color-error);
164
- border-color: rgba(193, 72, 59, 0.35);
165
- }
166
-
167
- .btn-mini.delete:hover {
168
- border-color: rgba(193, 72, 59, 0.7);
169
- color: var(--color-error);
170
- }
171
-
172
- .btn-group {
173
- display: flex;
174
- gap: var(--spacing-sm);
175
- margin-top: var(--spacing-md);
176
- }
177
-
178
- .btn {
179
- flex: 1;
180
- padding: 14px var(--spacing-sm);
181
- border-radius: var(--radius-sm);
182
- font-size: var(--font-size-body);
183
- font-weight: var(--font-weight-secondary);
184
- cursor: pointer;
185
- transition: all var(--transition-fast) var(--ease-spring);
186
- border: 1px solid var(--color-border-soft);
187
- background: linear-gradient(to bottom, var(--color-surface) 0%, rgba(255, 255, 255, 0.95) 100%);
188
- color: var(--color-text-secondary);
189
- box-shadow: var(--shadow-subtle);
190
- letter-spacing: -0.01em;
191
- }
192
-
193
- .btn:active {
194
- transform: scale(0.985);
195
- }
196
-
197
- .btn-cancel {
198
- background: linear-gradient(to bottom, var(--color-bg) 0%, rgba(247, 241, 232, 0.8) 100%);
199
- color: var(--color-text-primary);
200
- border: 1px solid var(--color-border-soft);
201
- }
202
-
203
- .btn-cancel:hover {
204
- background: linear-gradient(to bottom, var(--color-border) 0%, rgba(208, 196, 182, 0.5) 100%);
205
- }
206
-
207
- .btn-confirm {
208
- background: linear-gradient(135deg, var(--color-brand) 0%, var(--color-brand-dark) 100%);
209
- color: white;
210
- box-shadow: 0 2px 4px rgba(210, 107, 90, 0.2);
211
- border: none;
212
- }
213
-
214
- .btn-confirm:hover {
215
- box-shadow: 0 4px 8px rgba(210, 107, 90, 0.25);
216
- filter: brightness(1.05);
217
- }
218
-
219
- .btn-confirm.secondary {
220
- background: linear-gradient(135deg, var(--color-success) 0%, rgba(90, 139, 106, 0.85) 100%);
221
- box-shadow: 0 2px 4px rgba(90, 139, 106, 0.2);
222
- border: none;
223
- }
224
-
225
- .btn-confirm.secondary:hover {
226
- box-shadow: 0 4px 8px rgba(90, 139, 106, 0.25);
227
- filter: brightness(1.05);
228
- }
229
-
230
- .btn-confirm.btn-danger {
231
- background: linear-gradient(135deg, #c75642 0%, #9f392c 100%);
232
- box-shadow: 0 2px 4px rgba(163, 51, 38, 0.24);
233
- }
234
-
235
- .btn-confirm.btn-danger:hover {
236
- box-shadow: 0 4px 10px rgba(163, 51, 38, 0.28);
237
- filter: brightness(1.04);
238
- }
239
-
240
- /* ============================================
241
- 模型列表
242
- ============================================ */
243
- .model-list {
244
- max-height: 200px;
245
- overflow-y: auto;
246
- border: 1px solid rgba(208, 196, 182, 0.4);
247
- border-radius: var(--radius-sm);
248
- margin-bottom: var(--spacing-sm);
249
- scrollbar-width: none;
250
- background: linear-gradient(to bottom, var(--color-surface) 0%, rgba(255, 255, 255, 0.8) 100%);
251
- box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.02);
252
- }
253
-
254
- .model-list::-webkit-scrollbar {
255
- display: none;
256
- }
257
-
258
- .model-item {
259
- display: flex;
260
- justify-content: space-between;
261
- align-items: center;
262
- padding: 11px var(--spacing-sm);
263
- border-bottom: 1px solid rgba(208, 196, 182, 0.3);
264
- font-size: var(--font-size-body);
265
- color: var(--color-text-primary);
266
- transition: all var(--transition-fast) var(--ease-spring);
267
- letter-spacing: -0.005em;
268
- }
269
-
270
- .model-item:last-child {
271
- border-bottom: none;
272
- }
273
-
274
- .model-item:hover {
275
- background: linear-gradient(to right, rgba(247, 241, 232, 0.6) 0%, rgba(247, 241, 232, 0.3) 100%);
276
- }
277
-
278
- .btn-remove-model {
279
- font-size: var(--font-size-caption);
280
- font-weight: var(--font-weight-caption);
281
- color: var(--color-text-tertiary);
282
- cursor: pointer;
283
- padding: 5px 10px;
284
- border-radius: var(--radius-full);
285
- transition: all var(--transition-fast) var(--ease-spring);
286
- background: transparent;
287
- border: 1px solid rgba(139, 118, 104, 0.2);
288
- letter-spacing: 0.03em;
289
- }
290
-
291
- .btn-remove-model:hover {
292
- background: linear-gradient(135deg, var(--color-error) 0%, rgba(200, 74, 58, 0.9) 100%);
293
- color: white;
294
- transform: scale(1.08);
295
- box-shadow: 0 2px 6px rgba(200, 74, 58, 0.25);
296
- border-color: transparent;
297
- }
298
-
1
+ .skills-hint-line,
2
+ .hint-single-line {
3
+ display: block;
4
+ white-space: nowrap;
5
+ overflow: hidden;
6
+ text-overflow: ellipsis;
7
+ max-width: 100%;
8
+ }
9
+
10
+ .skill-list {
11
+ display: flex;
12
+ flex-direction: column;
13
+ gap: var(--spacing-xs);
14
+ margin-bottom: var(--spacing-sm);
15
+ max-height: min(52vh, 440px);
16
+ overflow-y: auto;
17
+ padding-right: 0;
18
+ scrollbar-width: none;
19
+ -ms-overflow-style: none;
20
+ }
21
+
22
+ .skill-list::-webkit-scrollbar {
23
+ width: 0;
24
+ height: 0;
25
+ }
26
+
27
+ .skill-list::-webkit-scrollbar-track {
28
+ background: transparent;
29
+ }
30
+
31
+ .skill-list::-webkit-scrollbar-thumb {
32
+ background: transparent;
33
+ border: 0;
34
+ }
35
+
36
+ .skill-list::-webkit-scrollbar-thumb:hover {
37
+ background: transparent;
38
+ }
39
+
40
+ .skill-item {
41
+ display: flex;
42
+ align-items: flex-start;
43
+ gap: var(--spacing-xs);
44
+ border: 1px dashed var(--color-border-soft);
45
+ border-radius: var(--radius-sm);
46
+ padding: var(--spacing-xs);
47
+ background: var(--color-surface-alt);
48
+ transition: border-color var(--transition-fast) var(--ease-spring), background-color var(--transition-fast) var(--ease-spring);
49
+ }
50
+
51
+ .skill-item-main {
52
+ min-width: 0;
53
+ display: flex;
54
+ flex-direction: column;
55
+ gap: 6px;
56
+ flex: 1;
57
+ }
58
+
59
+ .skill-item-title {
60
+ font-size: var(--font-size-secondary);
61
+ font-weight: var(--font-weight-secondary);
62
+ color: var(--color-text-secondary);
63
+ }
64
+
65
+ .skill-item-description {
66
+ font-size: var(--font-size-caption);
67
+ line-height: 1.45;
68
+ color: var(--color-text-tertiary);
69
+ }
70
+
71
+ .skill-item-meta {
72
+ display: flex;
73
+ flex-wrap: wrap;
74
+ gap: var(--spacing-xs);
75
+ align-items: center;
76
+ min-width: 0;
77
+ }
78
+
79
+ .skill-item-path {
80
+ font-family: var(--font-family-mono);
81
+ font-size: var(--font-size-caption);
82
+ color: var(--color-text-tertiary);
83
+ word-break: break-all;
84
+ }
85
+
86
+ .skill-item:hover {
87
+ border-color: rgba(201, 94, 75, 0.35);
88
+ }
89
+
90
+ .skill-item.selected {
91
+ border-color: rgba(201, 94, 75, 0.55);
92
+ background: linear-gradient(to bottom, rgba(201, 94, 75, 0.10) 0%, rgba(201, 94, 75, 0.04) 100%);
93
+ }
94
+
95
+ .skills-empty-state {
96
+ margin-bottom: var(--spacing-sm);
97
+ border: 1px dashed var(--color-border-soft);
98
+ border-radius: var(--radius-sm);
99
+ background: linear-gradient(to bottom, rgba(255, 255, 255, 0.78) 0%, rgba(255, 255, 255, 0.58) 100%);
100
+ color: var(--color-text-tertiary);
101
+ font-size: var(--font-size-secondary);
102
+ text-align: center;
103
+ padding: 18px 12px;
104
+ }
105
+
106
+ .skills-import-block {
107
+ margin-bottom: var(--spacing-sm);
108
+ }
109
+
110
+ .skills-import-title {
111
+ font-size: var(--font-size-body);
112
+ font-weight: var(--font-weight-secondary);
113
+ color: var(--color-text-secondary);
114
+ }
115
+
116
+ .skills-import-list {
117
+ max-height: min(28vh, 260px);
118
+ }
119
+
120
+ .skills-import-empty {
121
+ margin-bottom: 0;
122
+ }
123
+
124
+ .list-row {
125
+ display: flex;
126
+ flex-wrap: wrap;
127
+ gap: var(--spacing-xs);
128
+ align-items: center;
129
+ margin-bottom: var(--spacing-xs);
130
+ }
131
+
132
+ .list-row:last-child {
133
+ margin-bottom: 0;
134
+ }
135
+
136
+ .list-row .form-input {
137
+ flex: 1;
138
+ min-width: 140px;
139
+ }
140
+
141
+ .btn-mini {
142
+ padding: 6px 10px;
143
+ border-radius: var(--radius-sm);
144
+ border: 1px solid var(--color-border-soft);
145
+ background: linear-gradient(to bottom, rgba(255, 255, 255, 0.95) 0%, rgba(255, 255, 255, 0.85) 100%);
146
+ font-size: var(--font-size-caption);
147
+ font-weight: var(--font-weight-secondary);
148
+ color: var(--color-text-secondary);
149
+ cursor: pointer;
150
+ transition: all var(--transition-fast) var(--ease-spring);
151
+ box-shadow: var(--shadow-subtle);
152
+ }
153
+
154
+ .btn-mini:hover {
155
+ border-color: var(--color-brand);
156
+ color: var(--color-brand);
157
+ transform: translateY(-1px);
158
+ }
159
+
160
+ .btn-mini.delete {
161
+ color: var(--color-error);
162
+ border-color: rgba(193, 72, 59, 0.35);
163
+ }
164
+
165
+ .btn-mini.delete:hover {
166
+ border-color: rgba(193, 72, 59, 0.7);
167
+ color: var(--color-error);
168
+ }
169
+
170
+ .btn-group {
171
+ display: flex;
172
+ gap: var(--spacing-sm);
173
+ margin-top: var(--spacing-md);
174
+ }
175
+
176
+ .btn {
177
+ flex: 1;
178
+ padding: 14px var(--spacing-sm);
179
+ border-radius: var(--radius-sm);
180
+ font-size: var(--font-size-body);
181
+ font-weight: var(--font-weight-secondary);
182
+ cursor: pointer;
183
+ transition: all var(--transition-fast) var(--ease-spring);
184
+ border: 1px solid var(--color-border-soft);
185
+ background: linear-gradient(to bottom, var(--color-surface) 0%, rgba(255, 255, 255, 0.95) 100%);
186
+ color: var(--color-text-secondary);
187
+ box-shadow: var(--shadow-subtle);
188
+ letter-spacing: -0.01em;
189
+ }
190
+
191
+ .btn:active {
192
+ transform: scale(0.985);
193
+ }
194
+
195
+ .btn-cancel {
196
+ background: linear-gradient(to bottom, var(--color-bg) 0%, rgba(247, 241, 232, 0.8) 100%);
197
+ color: var(--color-text-primary);
198
+ border: 1px solid var(--color-border-soft);
199
+ }
200
+
201
+ .btn-cancel:hover {
202
+ background: linear-gradient(to bottom, var(--color-border) 0%, rgba(208, 196, 182, 0.5) 100%);
203
+ }
204
+
205
+ .btn-confirm {
206
+ background: linear-gradient(135deg, var(--color-brand) 0%, var(--color-brand-dark) 100%);
207
+ color: white;
208
+ box-shadow: 0 2px 4px rgba(210, 107, 90, 0.2);
209
+ border: none;
210
+ }
211
+
212
+ .btn-confirm:hover {
213
+ box-shadow: 0 4px 8px rgba(210, 107, 90, 0.25);
214
+ filter: brightness(1.05);
215
+ }
216
+
217
+ .btn-confirm.secondary {
218
+ background: linear-gradient(135deg, var(--color-success) 0%, rgba(90, 139, 106, 0.85) 100%);
219
+ box-shadow: 0 2px 4px rgba(90, 139, 106, 0.2);
220
+ border: none;
221
+ }
222
+
223
+ .btn-confirm.secondary:hover {
224
+ box-shadow: 0 4px 8px rgba(90, 139, 106, 0.25);
225
+ filter: brightness(1.05);
226
+ }
227
+
228
+ .btn-confirm.btn-danger {
229
+ background: linear-gradient(135deg, #c75642 0%, #9f392c 100%);
230
+ box-shadow: 0 2px 4px rgba(163, 51, 38, 0.24);
231
+ }
232
+
233
+ .btn-confirm.btn-danger:hover {
234
+ box-shadow: 0 4px 10px rgba(163, 51, 38, 0.28);
235
+ filter: brightness(1.04);
236
+ }
237
+
238
+ /* ============================================
239
+ 模型列表
240
+ ============================================ */
241
+ .model-list {
242
+ max-height: 200px;
243
+ overflow-y: auto;
244
+ border: 1px solid rgba(208, 196, 182, 0.4);
245
+ border-radius: var(--radius-sm);
246
+ margin-bottom: var(--spacing-sm);
247
+ scrollbar-width: none;
248
+ background: linear-gradient(to bottom, var(--color-surface) 0%, rgba(255, 255, 255, 0.8) 100%);
249
+ box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.02);
250
+ }
251
+
252
+ .model-list::-webkit-scrollbar {
253
+ display: none;
254
+ }
255
+
256
+ .model-item {
257
+ display: flex;
258
+ justify-content: space-between;
259
+ align-items: center;
260
+ padding: 11px var(--spacing-sm);
261
+ border-bottom: 1px solid rgba(208, 196, 182, 0.3);
262
+ font-size: var(--font-size-body);
263
+ color: var(--color-text-primary);
264
+ transition: all var(--transition-fast) var(--ease-spring);
265
+ letter-spacing: -0.005em;
266
+ }
267
+
268
+ .model-item:last-child {
269
+ border-bottom: none;
270
+ }
271
+
272
+ .model-item:hover {
273
+ background: linear-gradient(to right, rgba(247, 241, 232, 0.6) 0%, rgba(247, 241, 232, 0.3) 100%);
274
+ }
275
+
276
+ .btn-remove-model {
277
+ font-size: var(--font-size-caption);
278
+ font-weight: var(--font-weight-caption);
279
+ color: var(--color-text-tertiary);
280
+ cursor: pointer;
281
+ padding: 5px 10px;
282
+ border-radius: var(--radius-full);
283
+ transition: all var(--transition-fast) var(--ease-spring);
284
+ background: transparent;
285
+ border: 1px solid rgba(139, 118, 104, 0.2);
286
+ letter-spacing: 0.03em;
287
+ }
288
+
289
+ .btn-remove-model:hover {
290
+ background: linear-gradient(135deg, var(--color-error) 0%, rgba(200, 74, 58, 0.9) 100%);
291
+ color: white;
292
+ transform: scale(1.08);
293
+ box-shadow: 0 2px 6px rgba(200, 74, 58, 0.25);
294
+ border-color: transparent;
295
+ }
296
+