codexmate 0.0.28 → 0.0.29

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 (142) hide show
  1. package/README.md +421 -421
  2. package/README.zh.md +354 -354
  3. package/cli/agents-files.js +224 -224
  4. package/cli/archive-helpers.js +446 -446
  5. package/cli/auth-profiles.js +375 -375
  6. package/cli/builtin-proxy.js +1725 -1620
  7. package/cli/claude-proxy.js +1022 -1022
  8. package/cli/config-bootstrap.js +384 -384
  9. package/cli/config-health.js +338 -338
  10. package/cli/doctor-core.js +903 -903
  11. package/cli/import-skills-url.js +356 -356
  12. package/cli/openai-bridge.js +1576 -1489
  13. package/cli/openclaw-config.js +629 -629
  14. package/cli/session-convert-args.js +65 -65
  15. package/cli/session-convert-io.js +82 -82
  16. package/cli/session-convert.js +43 -43
  17. package/cli/session-usage.concurrent.js +28 -28
  18. package/cli/session-usage.js +118 -118
  19. package/cli/session-usage.models.js +176 -176
  20. package/cli/skills.js +1141 -1141
  21. package/cli/zip-commands.js +510 -510
  22. package/cli.js +15340 -15264
  23. package/lib/automation.js +404 -404
  24. package/lib/cli-file-utils.js +151 -151
  25. package/lib/cli-models-utils.js +440 -440
  26. package/lib/cli-network-utils.js +190 -190
  27. package/lib/cli-path-utils.js +85 -85
  28. package/lib/cli-session-utils.js +121 -121
  29. package/lib/cli-sessions.js +417 -417
  30. package/lib/cli-utils.js +155 -155
  31. package/lib/cli-webhook.js +126 -0
  32. package/lib/download-artifacts.js +92 -92
  33. package/lib/mcp-stdio.js +453 -453
  34. package/lib/task-orchestrator.js +869 -869
  35. package/lib/text-diff.js +303 -303
  36. package/lib/workflow-engine.js +340 -340
  37. package/package.json +76 -76
  38. package/plugins/README.md +20 -20
  39. package/plugins/README.zh-CN.md +20 -20
  40. package/plugins/prompt-templates/comment-polish/index.mjs +25 -25
  41. package/plugins/prompt-templates/computed.mjs +253 -253
  42. package/plugins/prompt-templates/index.mjs +8 -8
  43. package/plugins/prompt-templates/manifest.mjs +15 -15
  44. package/plugins/prompt-templates/methods.mjs +553 -553
  45. package/plugins/prompt-templates/overview.mjs +91 -91
  46. package/plugins/prompt-templates/ownership.mjs +19 -19
  47. package/plugins/prompt-templates/rule-ack/index.mjs +21 -21
  48. package/plugins/prompt-templates/storage.mjs +64 -64
  49. package/plugins/registry.mjs +16 -16
  50. package/web-ui/app.js +639 -625
  51. package/web-ui/index.html +36 -35
  52. package/web-ui/logic.agents-diff.mjs +386 -386
  53. package/web-ui/logic.claude.mjs +168 -168
  54. package/web-ui/logic.codex.mjs +69 -56
  55. package/web-ui/logic.mjs +5 -5
  56. package/web-ui/logic.runtime.mjs +128 -128
  57. package/web-ui/logic.session-convert.mjs +70 -70
  58. package/web-ui/logic.sessions.mjs +765 -765
  59. package/web-ui/modules/api.mjs +90 -90
  60. package/web-ui/modules/app.computed.dashboard.mjs +225 -225
  61. package/web-ui/modules/app.computed.index.mjs +17 -17
  62. package/web-ui/modules/app.computed.main-tabs.mjs +205 -205
  63. package/web-ui/modules/app.computed.session.mjs +999 -994
  64. package/web-ui/modules/app.constants.mjs +15 -15
  65. package/web-ui/modules/app.methods.agents.mjs +632 -632
  66. package/web-ui/modules/app.methods.claude-config.mjs +200 -190
  67. package/web-ui/modules/app.methods.codex-config.mjs +892 -892
  68. package/web-ui/modules/app.methods.index.mjs +94 -92
  69. package/web-ui/modules/app.methods.install.mjs +205 -205
  70. package/web-ui/modules/app.methods.navigation.mjs +761 -743
  71. package/web-ui/modules/app.methods.openclaw-core.mjs +814 -814
  72. package/web-ui/modules/app.methods.openclaw-editing.mjs +372 -372
  73. package/web-ui/modules/app.methods.openclaw-persist.mjs +369 -369
  74. package/web-ui/modules/app.methods.providers.mjs +493 -412
  75. package/web-ui/modules/app.methods.runtime.mjs +345 -345
  76. package/web-ui/modules/app.methods.session-actions.mjs +593 -593
  77. package/web-ui/modules/app.methods.session-browser.mjs +984 -984
  78. package/web-ui/modules/app.methods.session-timeline.mjs +479 -479
  79. package/web-ui/modules/app.methods.session-trash.mjs +438 -439
  80. package/web-ui/modules/app.methods.startup-claude.mjs +533 -533
  81. package/web-ui/modules/app.methods.task-orchestration.mjs +556 -556
  82. package/web-ui/modules/app.methods.webhook.mjs +79 -0
  83. package/web-ui/modules/config-mode.computed.mjs +124 -124
  84. package/web-ui/modules/config-template-confirm-pref.mjs +33 -33
  85. package/web-ui/modules/i18n.dict.mjs +3131 -2109
  86. package/web-ui/modules/i18n.mjs +62 -56
  87. package/web-ui/modules/plugins.computed.mjs +3 -3
  88. package/web-ui/modules/plugins.methods.mjs +3 -3
  89. package/web-ui/modules/plugins.storage.mjs +11 -11
  90. package/web-ui/modules/provider-url-display.mjs +17 -17
  91. package/web-ui/modules/sessions-filters-url.mjs +85 -85
  92. package/web-ui/modules/skills.computed.mjs +107 -107
  93. package/web-ui/modules/skills.methods.mjs +481 -481
  94. package/web-ui/partials/index/layout-footer.html +13 -13
  95. package/web-ui/partials/index/layout-header.html +500 -475
  96. package/web-ui/partials/index/modal-config-template-agents.html +174 -174
  97. package/web-ui/partials/index/modal-confirm-toast.html +32 -32
  98. package/web-ui/partials/index/modal-health-check.html +45 -45
  99. package/web-ui/partials/index/modal-openclaw-config.html +280 -280
  100. package/web-ui/partials/index/modal-skills.html +200 -200
  101. package/web-ui/partials/index/modals-basic.html +162 -165
  102. package/web-ui/partials/index/panel-config-claude.html +194 -188
  103. package/web-ui/partials/index/panel-config-codex.html +323 -312
  104. package/web-ui/partials/index/panel-config-openclaw.html +83 -83
  105. package/web-ui/partials/index/panel-dashboard.html +186 -186
  106. package/web-ui/partials/index/panel-docs.html +147 -147
  107. package/web-ui/partials/index/panel-market.html +177 -177
  108. package/web-ui/partials/index/panel-orchestration.html +391 -391
  109. package/web-ui/partials/index/panel-plugins.html +253 -253
  110. package/web-ui/partials/index/panel-sessions.html +316 -316
  111. package/web-ui/partials/index/panel-settings.html +190 -253
  112. package/web-ui/partials/index/panel-trash.html +88 -0
  113. package/web-ui/partials/index/panel-usage.html +371 -371
  114. package/web-ui/res/json5.min.js +1 -1
  115. package/web-ui/res/vue.global.prod.js +13 -13
  116. package/web-ui/session-helpers.mjs +576 -576
  117. package/web-ui/source-bundle.cjs +233 -233
  118. package/web-ui/styles/base-theme.css +281 -281
  119. package/web-ui/styles/controls-forms.css +422 -422
  120. package/web-ui/styles/dashboard.css +274 -274
  121. package/web-ui/styles/docs-panel.css +271 -247
  122. package/web-ui/styles/feedback.css +108 -108
  123. package/web-ui/styles/health-check-dialog.css +144 -144
  124. package/web-ui/styles/layout-shell.css +626 -606
  125. package/web-ui/styles/modals-core.css +466 -466
  126. package/web-ui/styles/navigation-panels.css +391 -391
  127. package/web-ui/styles/openclaw-structured.css +266 -266
  128. package/web-ui/styles/plugins-panel.css +523 -523
  129. package/web-ui/styles/responsive.css +454 -454
  130. package/web-ui/styles/sessions-list.css +419 -419
  131. package/web-ui/styles/sessions-preview.css +411 -411
  132. package/web-ui/styles/sessions-toolbar-trash.css +330 -330
  133. package/web-ui/styles/sessions-usage.css +1040 -1040
  134. package/web-ui/styles/settings-panel.css +349 -185
  135. package/web-ui/styles/skills-list.css +303 -303
  136. package/web-ui/styles/skills-market.css +406 -406
  137. package/web-ui/styles/task-orchestration.css +822 -822
  138. package/web-ui/styles/titles-cards.css +472 -472
  139. package/web-ui/styles/trash-panel.css +90 -0
  140. package/web-ui/styles/webhook.css +81 -0
  141. package/web-ui/styles.css +23 -21
  142. package/web-ui.html +17 -17
@@ -1,303 +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
- .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
- }
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
+ }