codexmate 0.0.29 → 0.0.30

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 (143) 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 -1725
  7. package/cli/claude-proxy.js +1022 -1022
  8. package/cli/config-bootstrap.js +402 -384
  9. package/cli/config-health.js +454 -338
  10. package/cli/doctor-core.js +903 -903
  11. package/cli/import-skills-url.js +356 -356
  12. package/cli/local-bridge.js +324 -0
  13. package/cli/openai-bridge.js +1653 -1576
  14. package/cli/openclaw-config.js +629 -629
  15. package/cli/session-convert-args.js +65 -65
  16. package/cli/session-convert-io.js +82 -82
  17. package/cli/session-convert.js +43 -43
  18. package/cli/session-usage.concurrent.js +28 -28
  19. package/cli/session-usage.js +118 -118
  20. package/cli/session-usage.models.js +176 -176
  21. package/cli/skills.js +1141 -1141
  22. package/cli/zip-commands.js +510 -510
  23. package/cli.js +15481 -15340
  24. package/lib/automation.js +404 -404
  25. package/lib/cli-file-utils.js +151 -151
  26. package/lib/cli-models-utils.js +440 -440
  27. package/lib/cli-network-utils.js +190 -190
  28. package/lib/cli-path-utils.js +85 -85
  29. package/lib/cli-session-utils.js +121 -121
  30. package/lib/cli-sessions.js +417 -417
  31. package/lib/cli-utils.js +155 -155
  32. package/lib/cli-webhook.js +126 -126
  33. package/lib/download-artifacts.js +92 -92
  34. package/lib/mcp-stdio.js +453 -453
  35. package/lib/task-orchestrator.js +869 -869
  36. package/lib/text-diff.js +303 -303
  37. package/lib/workflow-engine.js +340 -340
  38. package/package.json +76 -76
  39. package/plugins/README.md +20 -20
  40. package/plugins/README.zh-CN.md +20 -20
  41. package/plugins/prompt-templates/comment-polish/index.mjs +25 -25
  42. package/plugins/prompt-templates/computed.mjs +253 -253
  43. package/plugins/prompt-templates/index.mjs +8 -8
  44. package/plugins/prompt-templates/manifest.mjs +15 -15
  45. package/plugins/prompt-templates/methods.mjs +553 -553
  46. package/plugins/prompt-templates/overview.mjs +91 -91
  47. package/plugins/prompt-templates/ownership.mjs +19 -19
  48. package/plugins/prompt-templates/rule-ack/index.mjs +21 -21
  49. package/plugins/prompt-templates/storage.mjs +64 -64
  50. package/plugins/registry.mjs +16 -16
  51. package/web-ui/app.js +645 -639
  52. package/web-ui/index.html +36 -36
  53. package/web-ui/logic.agents-diff.mjs +386 -386
  54. package/web-ui/logic.claude.mjs +168 -168
  55. package/web-ui/logic.codex.mjs +69 -69
  56. package/web-ui/logic.mjs +5 -5
  57. package/web-ui/logic.runtime.mjs +128 -128
  58. package/web-ui/logic.session-convert.mjs +70 -70
  59. package/web-ui/logic.sessions.mjs +765 -765
  60. package/web-ui/modules/api.mjs +90 -90
  61. package/web-ui/modules/app.computed.dashboard.mjs +248 -225
  62. package/web-ui/modules/app.computed.index.mjs +17 -17
  63. package/web-ui/modules/app.computed.main-tabs.mjs +205 -205
  64. package/web-ui/modules/app.computed.session.mjs +999 -999
  65. package/web-ui/modules/app.constants.mjs +15 -15
  66. package/web-ui/modules/app.methods.agents.mjs +632 -632
  67. package/web-ui/modules/app.methods.claude-config.mjs +200 -200
  68. package/web-ui/modules/app.methods.codex-config.mjs +917 -892
  69. package/web-ui/modules/app.methods.index.mjs +94 -94
  70. package/web-ui/modules/app.methods.install.mjs +205 -205
  71. package/web-ui/modules/app.methods.navigation.mjs +774 -761
  72. package/web-ui/modules/app.methods.openclaw-core.mjs +814 -814
  73. package/web-ui/modules/app.methods.openclaw-editing.mjs +372 -372
  74. package/web-ui/modules/app.methods.openclaw-persist.mjs +369 -369
  75. package/web-ui/modules/app.methods.providers.mjs +529 -493
  76. package/web-ui/modules/app.methods.runtime.mjs +345 -345
  77. package/web-ui/modules/app.methods.session-actions.mjs +593 -593
  78. package/web-ui/modules/app.methods.session-browser.mjs +984 -984
  79. package/web-ui/modules/app.methods.session-timeline.mjs +479 -479
  80. package/web-ui/modules/app.methods.session-trash.mjs +438 -438
  81. package/web-ui/modules/app.methods.startup-claude.mjs +534 -533
  82. package/web-ui/modules/app.methods.task-orchestration.mjs +556 -556
  83. package/web-ui/modules/app.methods.webhook.mjs +79 -79
  84. package/web-ui/modules/config-mode.computed.mjs +124 -124
  85. package/web-ui/modules/config-template-confirm-pref.mjs +33 -33
  86. package/web-ui/modules/i18n.dict.mjs +3146 -3131
  87. package/web-ui/modules/i18n.mjs +62 -62
  88. package/web-ui/modules/plugins.computed.mjs +3 -3
  89. package/web-ui/modules/plugins.methods.mjs +3 -3
  90. package/web-ui/modules/plugins.storage.mjs +11 -11
  91. package/web-ui/modules/provider-url-display.mjs +17 -17
  92. package/web-ui/modules/sessions-filters-url.mjs +85 -85
  93. package/web-ui/modules/skills.computed.mjs +107 -107
  94. package/web-ui/modules/skills.methods.mjs +482 -481
  95. package/web-ui/partials/index/layout-footer.html +13 -13
  96. package/web-ui/partials/index/layout-header.html +500 -500
  97. package/web-ui/partials/index/modal-config-template-agents.html +174 -174
  98. package/web-ui/partials/index/modal-confirm-toast.html +32 -32
  99. package/web-ui/partials/index/modal-health-check.html +45 -45
  100. package/web-ui/partials/index/modal-openclaw-config.html +280 -280
  101. package/web-ui/partials/index/modal-skills.html +200 -200
  102. package/web-ui/partials/index/modals-basic.html +162 -162
  103. package/web-ui/partials/index/panel-config-claude.html +194 -194
  104. package/web-ui/partials/index/panel-config-codex.html +337 -323
  105. package/web-ui/partials/index/panel-config-openclaw.html +83 -83
  106. package/web-ui/partials/index/panel-dashboard.html +219 -186
  107. package/web-ui/partials/index/panel-docs.html +147 -147
  108. package/web-ui/partials/index/panel-market.html +177 -177
  109. package/web-ui/partials/index/panel-orchestration.html +391 -391
  110. package/web-ui/partials/index/panel-plugins.html +253 -253
  111. package/web-ui/partials/index/panel-sessions.html +308 -316
  112. package/web-ui/partials/index/panel-settings.html +190 -190
  113. package/web-ui/partials/index/panel-trash.html +88 -88
  114. package/web-ui/partials/index/panel-usage.html +371 -371
  115. package/web-ui/res/json5.min.js +1 -1
  116. package/web-ui/res/vue.global.prod.js +13 -13
  117. package/web-ui/session-helpers.mjs +594 -576
  118. package/web-ui/source-bundle.cjs +233 -233
  119. package/web-ui/styles/base-theme.css +281 -281
  120. package/web-ui/styles/controls-forms.css +422 -422
  121. package/web-ui/styles/dashboard.css +406 -274
  122. package/web-ui/styles/docs-panel.css +271 -271
  123. package/web-ui/styles/feedback.css +108 -108
  124. package/web-ui/styles/health-check-dialog.css +144 -144
  125. package/web-ui/styles/layout-shell.css +626 -626
  126. package/web-ui/styles/modals-core.css +466 -466
  127. package/web-ui/styles/navigation-panels.css +391 -391
  128. package/web-ui/styles/openclaw-structured.css +266 -266
  129. package/web-ui/styles/plugins-panel.css +564 -523
  130. package/web-ui/styles/responsive.css +454 -454
  131. package/web-ui/styles/sessions-list.css +417 -419
  132. package/web-ui/styles/sessions-preview.css +407 -411
  133. package/web-ui/styles/sessions-toolbar-trash.css +334 -330
  134. package/web-ui/styles/sessions-usage.css +1040 -1040
  135. package/web-ui/styles/settings-panel.css +349 -349
  136. package/web-ui/styles/skills-list.css +305 -303
  137. package/web-ui/styles/skills-market.css +429 -406
  138. package/web-ui/styles/task-orchestration.css +822 -822
  139. package/web-ui/styles/titles-cards.css +472 -472
  140. package/web-ui/styles/trash-panel.css +90 -90
  141. package/web-ui/styles/webhook.css +81 -81
  142. package/web-ui/styles.css +23 -23
  143. package/web-ui.html +17 -17
@@ -1,303 +1,305 @@
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 solid var(--color-border-soft);
53
+ border-radius: var(--radius-sm);
54
+ padding: var(--spacing-xs);
55
+ background: rgba(255,255,255,0.5);
56
+ transition: all 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(200,121,99,0.35);
96
+ background: rgba(255,243,236,0.3);
97
+ }
98
+
99
+ .skill-item.selected {
100
+ border-color: rgba(200,121,99,0.5);
101
+ background: linear-gradient(to right, rgba(255,243,236,0.7) 0%, rgba(255,255,255,0.6) 100%);
102
+ box-shadow: inset 3px 0 0 var(--color-brand);
103
+ }
104
+
105
+ .skills-empty-state {
106
+ margin-bottom: var(--spacing-sm);
107
+ border: 1px solid var(--color-border-soft);
108
+ border-radius: var(--radius-md);
109
+ background: linear-gradient(to bottom, rgba(255,255,255,0.7) 0%, rgba(255,248,241,0.5) 100%);
110
+ color: var(--color-text-tertiary);
111
+ font-size: var(--font-size-secondary);
112
+ text-align: center;
113
+ padding: 24px var(--spacing-sm);
114
+ }
115
+
116
+ .skills-import-block {
117
+ margin-bottom: var(--spacing-sm);
118
+ }
119
+
120
+ .skills-import-title {
121
+ font-size: var(--font-size-body);
122
+ font-weight: var(--font-weight-secondary);
123
+ color: var(--color-text-secondary);
124
+ }
125
+
126
+ .skills-import-list {
127
+ max-height: min(28vh, 260px);
128
+ }
129
+
130
+ .skills-import-empty {
131
+ margin-bottom: 0;
132
+ }
133
+
134
+ .list-row {
135
+ display: flex;
136
+ flex-wrap: wrap;
137
+ gap: var(--spacing-xs);
138
+ align-items: center;
139
+ margin-bottom: var(--spacing-xs);
140
+ }
141
+
142
+ .list-row:last-child {
143
+ margin-bottom: 0;
144
+ }
145
+
146
+ .list-row .form-input {
147
+ flex: 1;
148
+ min-width: 140px;
149
+ }
150
+
151
+ .btn-mini {
152
+ padding: 6px 10px;
153
+ border-radius: var(--radius-sm);
154
+ border: 1px solid var(--color-border-soft);
155
+ background: linear-gradient(to bottom, rgba(255, 255, 255, 0.95) 0%, rgba(255, 255, 255, 0.85) 100%);
156
+ font-size: var(--font-size-caption);
157
+ font-weight: var(--font-weight-secondary);
158
+ color: var(--color-text-secondary);
159
+ cursor: pointer;
160
+ transition: all var(--transition-fast) var(--ease-spring);
161
+ box-shadow: var(--shadow-subtle);
162
+ }
163
+
164
+ .btn-mini:hover {
165
+ border-color: var(--color-brand);
166
+ color: var(--color-brand);
167
+ transform: translateY(-1px);
168
+ }
169
+
170
+ .btn-mini.delete {
171
+ color: var(--color-error);
172
+ border-color: rgba(193, 72, 59, 0.35);
173
+ }
174
+
175
+ .btn-mini.delete:hover {
176
+ border-color: rgba(193, 72, 59, 0.7);
177
+ color: var(--color-error);
178
+ }
179
+
180
+ .btn-group {
181
+ display: flex;
182
+ gap: var(--spacing-sm);
183
+ margin-top: var(--spacing-md);
184
+ }
185
+
186
+ .btn {
187
+ flex: 1;
188
+ padding: 14px var(--spacing-sm);
189
+ border-radius: var(--radius-sm);
190
+ font-size: var(--font-size-body);
191
+ font-weight: var(--font-weight-secondary);
192
+ cursor: pointer;
193
+ transition: all var(--transition-fast) var(--ease-spring);
194
+ border: 1px solid var(--color-border-soft);
195
+ background: linear-gradient(to bottom, var(--color-surface) 0%, rgba(255, 255, 255, 0.95) 100%);
196
+ color: var(--color-text-secondary);
197
+ box-shadow: var(--shadow-subtle);
198
+ letter-spacing: -0.01em;
199
+ }
200
+
201
+ .btn:active {
202
+ transform: scale(0.985);
203
+ }
204
+
205
+ .btn-cancel {
206
+ background: linear-gradient(to bottom, var(--color-bg) 0%, rgba(247, 241, 232, 0.8) 100%);
207
+ color: var(--color-text-primary);
208
+ border: 1px solid var(--color-border-soft);
209
+ }
210
+
211
+ .btn-cancel:hover {
212
+ background: linear-gradient(to bottom, var(--color-border) 0%, rgba(208, 196, 182, 0.5) 100%);
213
+ }
214
+
215
+ .btn-confirm {
216
+ background: linear-gradient(135deg, var(--color-brand) 0%, var(--color-brand-dark) 100%);
217
+ color: white;
218
+ box-shadow: 0 2px 4px rgba(210, 107, 90, 0.2);
219
+ border: none;
220
+ }
221
+
222
+ .btn-confirm:hover {
223
+ box-shadow: 0 4px 8px rgba(210, 107, 90, 0.25);
224
+ filter: brightness(1.05);
225
+ }
226
+
227
+ .btn-confirm.secondary {
228
+ background: linear-gradient(135deg, var(--color-success) 0%, rgba(90, 139, 106, 0.85) 100%);
229
+ box-shadow: 0 2px 4px rgba(90, 139, 106, 0.2);
230
+ border: none;
231
+ }
232
+
233
+ .btn-confirm.secondary:hover {
234
+ box-shadow: 0 4px 8px rgba(90, 139, 106, 0.25);
235
+ filter: brightness(1.05);
236
+ }
237
+
238
+ .btn-confirm.btn-danger {
239
+ background: linear-gradient(135deg, #c75642 0%, #9f392c 100%);
240
+ box-shadow: 0 2px 4px rgba(163, 51, 38, 0.24);
241
+ }
242
+
243
+ .btn-confirm.btn-danger:hover {
244
+ box-shadow: 0 4px 10px rgba(163, 51, 38, 0.28);
245
+ filter: brightness(1.04);
246
+ }
247
+
248
+ /* ============================================
249
+ 模型列表
250
+ ============================================ */
251
+ .model-list {
252
+ max-height: 200px;
253
+ overflow-y: auto;
254
+ border: 1px solid rgba(208, 196, 182, 0.4);
255
+ border-radius: var(--radius-sm);
256
+ margin-bottom: var(--spacing-sm);
257
+ scrollbar-width: none;
258
+ background: linear-gradient(to bottom, var(--color-surface) 0%, rgba(255, 255, 255, 0.8) 100%);
259
+ box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.02);
260
+ }
261
+
262
+ .model-list::-webkit-scrollbar {
263
+ display: none;
264
+ }
265
+
266
+ .model-item {
267
+ display: flex;
268
+ justify-content: space-between;
269
+ align-items: center;
270
+ padding: 11px var(--spacing-sm);
271
+ border-bottom: 1px solid rgba(208, 196, 182, 0.3);
272
+ font-size: var(--font-size-body);
273
+ color: var(--color-text-primary);
274
+ transition: all var(--transition-fast) var(--ease-spring);
275
+ letter-spacing: -0.005em;
276
+ }
277
+
278
+ .model-item:last-child {
279
+ border-bottom: none;
280
+ }
281
+
282
+ .model-item:hover {
283
+ background: linear-gradient(to right, rgba(247, 241, 232, 0.6) 0%, rgba(247, 241, 232, 0.3) 100%);
284
+ }
285
+
286
+ .btn-remove-model {
287
+ font-size: var(--font-size-caption);
288
+ font-weight: var(--font-weight-caption);
289
+ color: var(--color-text-tertiary);
290
+ cursor: pointer;
291
+ padding: 5px 10px;
292
+ border-radius: var(--radius-full);
293
+ transition: all var(--transition-fast) var(--ease-spring);
294
+ background: transparent;
295
+ border: 1px solid rgba(139, 118, 104, 0.2);
296
+ letter-spacing: 0.03em;
297
+ }
298
+
299
+ .btn-remove-model:hover {
300
+ background: linear-gradient(135deg, var(--color-error) 0%, rgba(200, 74, 58, 0.9) 100%);
301
+ color: white;
302
+ transform: scale(1.08);
303
+ box-shadow: 0 2px 6px rgba(200, 74, 58, 0.25);
304
+ border-color: transparent;
305
+ }