codexmate 0.0.21 → 0.0.22

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