codexmate 0.0.32 → 0.0.33

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 (147) hide show
  1. package/README.md +147 -363
  2. package/README.zh.md +147 -371
  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 -402
  9. package/cli/config-health.js +454 -454
  10. package/cli/doctor-core.js +903 -903
  11. package/cli/import-skills-url.js +356 -356
  12. package/cli/local-bridge.js +551 -324
  13. package/cli/openai-bridge.js +1653 -1653
  14. package/cli/openclaw-config.js +629 -629
  15. package/cli/session-convert-args.js +69 -69
  16. package/cli/session-convert-io.js +82 -82
  17. package/cli/session-convert.js +150 -150
  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/update.js +162 -0
  23. package/cli/zip-commands.js +510 -510
  24. package/cli.js +16023 -15829
  25. package/lib/automation.js +404 -404
  26. package/lib/cli-file-utils.js +151 -151
  27. package/lib/cli-models-utils.js +440 -440
  28. package/lib/cli-network-utils.js +190 -190
  29. package/lib/cli-path-utils.js +85 -85
  30. package/lib/cli-session-utils.js +121 -121
  31. package/lib/cli-sessions.js +427 -426
  32. package/lib/cli-utils.js +155 -155
  33. package/lib/cli-webhook.js +126 -126
  34. package/lib/download-artifacts.js +92 -92
  35. package/lib/mcp-stdio.js +453 -453
  36. package/lib/task-orchestrator.js +869 -869
  37. package/lib/text-diff.js +303 -303
  38. package/lib/win-tray.js +119 -0
  39. package/lib/workflow-engine.js +340 -340
  40. package/package.json +76 -76
  41. package/plugins/README.md +20 -20
  42. package/plugins/README.zh-CN.md +20 -20
  43. package/plugins/prompt-templates/comment-polish/index.mjs +25 -25
  44. package/plugins/prompt-templates/computed.mjs +253 -253
  45. package/plugins/prompt-templates/index.mjs +8 -8
  46. package/plugins/prompt-templates/manifest.mjs +15 -15
  47. package/plugins/prompt-templates/methods.mjs +553 -553
  48. package/plugins/prompt-templates/overview.mjs +91 -91
  49. package/plugins/prompt-templates/ownership.mjs +19 -19
  50. package/plugins/prompt-templates/rule-ack/index.mjs +21 -21
  51. package/plugins/prompt-templates/storage.mjs +64 -64
  52. package/plugins/registry.mjs +16 -16
  53. package/web-ui/app.js +650 -647
  54. package/web-ui/index.html +36 -36
  55. package/web-ui/logic.agents-diff.mjs +386 -386
  56. package/web-ui/logic.claude.mjs +168 -168
  57. package/web-ui/logic.codex.mjs +69 -69
  58. package/web-ui/logic.mjs +5 -5
  59. package/web-ui/logic.runtime.mjs +128 -128
  60. package/web-ui/logic.session-convert.mjs +70 -70
  61. package/web-ui/logic.sessions.mjs +781 -781
  62. package/web-ui/modules/api.mjs +90 -90
  63. package/web-ui/modules/app.computed.dashboard.mjs +248 -248
  64. package/web-ui/modules/app.computed.index.mjs +17 -17
  65. package/web-ui/modules/app.computed.main-tabs.mjs +205 -205
  66. package/web-ui/modules/app.computed.session.mjs +735 -693
  67. package/web-ui/modules/app.constants.mjs +15 -15
  68. package/web-ui/modules/app.methods.agents.mjs +651 -651
  69. package/web-ui/modules/app.methods.claude-config.mjs +269 -200
  70. package/web-ui/modules/app.methods.codex-config.mjs +861 -861
  71. package/web-ui/modules/app.methods.index.mjs +94 -94
  72. package/web-ui/modules/app.methods.install.mjs +205 -205
  73. package/web-ui/modules/app.methods.navigation.mjs +774 -774
  74. package/web-ui/modules/app.methods.openclaw-core.mjs +814 -814
  75. package/web-ui/modules/app.methods.openclaw-editing.mjs +372 -372
  76. package/web-ui/modules/app.methods.openclaw-persist.mjs +369 -369
  77. package/web-ui/modules/app.methods.providers.mjs +575 -529
  78. package/web-ui/modules/app.methods.runtime.mjs +345 -345
  79. package/web-ui/modules/app.methods.session-actions.mjs +591 -591
  80. package/web-ui/modules/app.methods.session-browser.mjs +1012 -1012
  81. package/web-ui/modules/app.methods.session-timeline.mjs +479 -479
  82. package/web-ui/modules/app.methods.session-trash.mjs +438 -438
  83. package/web-ui/modules/app.methods.startup-claude.mjs +538 -537
  84. package/web-ui/modules/app.methods.task-orchestration.mjs +556 -556
  85. package/web-ui/modules/app.methods.webhook.mjs +79 -79
  86. package/web-ui/modules/config-mode.computed.mjs +124 -124
  87. package/web-ui/modules/config-template-confirm-pref.mjs +33 -33
  88. package/web-ui/modules/i18n.dict.mjs +3192 -3177
  89. package/web-ui/modules/i18n.mjs +62 -62
  90. package/web-ui/modules/plugins.computed.mjs +3 -3
  91. package/web-ui/modules/plugins.methods.mjs +3 -3
  92. package/web-ui/modules/plugins.storage.mjs +11 -11
  93. package/web-ui/modules/provider-url-display.mjs +17 -17
  94. package/web-ui/modules/sessions-filters-url.mjs +85 -85
  95. package/web-ui/modules/skills.computed.mjs +107 -107
  96. package/web-ui/modules/skills.methods.mjs +482 -482
  97. package/web-ui/partials/index/layout-footer.html +13 -13
  98. package/web-ui/partials/index/layout-header.html +499 -503
  99. package/web-ui/partials/index/modal-config-template-agents.html +185 -185
  100. package/web-ui/partials/index/modal-confirm-toast.html +32 -32
  101. package/web-ui/partials/index/modal-health-check.html +45 -45
  102. package/web-ui/partials/index/modal-openclaw-config.html +280 -280
  103. package/web-ui/partials/index/modal-skills.html +200 -200
  104. package/web-ui/partials/index/modals-basic.html +173 -162
  105. package/web-ui/partials/index/panel-config-claude.html +166 -136
  106. package/web-ui/partials/index/panel-config-codex.html +190 -196
  107. package/web-ui/partials/index/panel-config-codex.html.bak +337 -0
  108. package/web-ui/partials/index/panel-config-openclaw.html +83 -83
  109. package/web-ui/partials/index/panel-dashboard.html +186 -219
  110. package/web-ui/partials/index/panel-docs.html +114 -114
  111. package/web-ui/partials/index/panel-market.html +177 -177
  112. package/web-ui/partials/index/panel-orchestration.html +391 -391
  113. package/web-ui/partials/index/panel-plugins.html +253 -253
  114. package/web-ui/partials/index/panel-sessions.html +319 -313
  115. package/web-ui/partials/index/panel-settings.html +190 -190
  116. package/web-ui/partials/index/panel-trash.html +82 -82
  117. package/web-ui/partials/index/panel-usage.html +137 -137
  118. package/web-ui/res/json5.min.js +1 -1
  119. package/web-ui/res/vue.global.prod.js +13 -13
  120. package/web-ui/session-helpers.mjs +591 -591
  121. package/web-ui/source-bundle.cjs +233 -233
  122. package/web-ui/styles/base-theme.css +281 -281
  123. package/web-ui/styles/bridge-pool.css +197 -197
  124. package/web-ui/styles/controls-forms.css +433 -433
  125. package/web-ui/styles/dashboard.css +406 -406
  126. package/web-ui/styles/docs-panel.css +245 -245
  127. package/web-ui/styles/feedback.css +108 -108
  128. package/web-ui/styles/health-check-dialog.css +144 -144
  129. package/web-ui/styles/layout-shell.css +628 -638
  130. package/web-ui/styles/modals-core.css +499 -466
  131. package/web-ui/styles/navigation-panels.css +391 -391
  132. package/web-ui/styles/openclaw-structured.css +266 -266
  133. package/web-ui/styles/plugins-panel.css +564 -564
  134. package/web-ui/styles/responsive.css +392 -392
  135. package/web-ui/styles/sessions-list.css +683 -647
  136. package/web-ui/styles/sessions-preview.css +407 -407
  137. package/web-ui/styles/sessions-toolbar-trash.css +518 -518
  138. package/web-ui/styles/sessions-usage.css +588 -588
  139. package/web-ui/styles/settings-panel.css +349 -349
  140. package/web-ui/styles/skills-list.css +305 -305
  141. package/web-ui/styles/skills-market.css +429 -429
  142. package/web-ui/styles/task-orchestration.css +822 -822
  143. package/web-ui/styles/titles-cards.css +472 -472
  144. package/web-ui/styles/trash-panel.css +90 -90
  145. package/web-ui/styles/webhook.css +81 -81
  146. package/web-ui/styles.css +24 -24
  147. package/web-ui.html +17 -17
@@ -1,647 +1,683 @@
1
- .session-empty {
2
- padding: 40px var(--spacing-md);
3
- text-align: center;
4
- border: 1px solid var(--color-border-soft);
5
- border-radius: var(--radius-lg);
6
- color: var(--color-text-tertiary);
7
- background: var(--bg-warm-gradient);
8
- box-shadow: var(--shadow-subtle);
9
- }
10
-
11
- .session-empty::before {
12
- content: "";
13
- display: block;
14
- width: 40px;
15
- height: 40px;
16
- border-radius: 50%;
17
- margin: 0 auto 14px;
18
- background: linear-gradient(135deg, var(--color-brand) 0%, var(--color-brand-dark) 100%);
19
- opacity: 0.18;
20
- }
21
-
22
-
23
- /* ============================================
24
- 回收站 — 极简·本质
25
- ============================================ */
26
-
27
- /* ---- 空态 ---- */
28
- .trash-empty-state {
29
- display: flex;
30
- flex-direction: column;
31
- align-items: center;
32
- justify-content: center;
33
- gap: 12px;
34
- padding: 64px 24px;
35
- text-align: center;
36
- }
37
-
38
- .trash-empty-svg {
39
- width: 56px;
40
- height: 56px;
41
- color: var(--color-text-muted);
42
- opacity: 0.6;
43
- }
44
-
45
- .trash-spinner {
46
- width: 28px;
47
- height: 28px;
48
- border-radius: 50%;
49
- border: 2.5px solid var(--color-border-soft);
50
- border-top-color: var(--color-brand);
51
- animation: trash-spin 0.7s linear infinite;
52
- }
53
-
54
- @keyframes trash-spin {
55
- to { transform: rotate(360deg); }
56
- }
57
-
58
- .trash-empty-title {
59
- font-size: 15px;
60
- font-weight: 600;
61
- color: var(--color-text-secondary);
62
- }
63
-
64
- .trash-empty-hint {
65
- font-size: 12px;
66
- color: var(--color-text-muted);
67
- max-width: 280px;
68
- line-height: 1.5;
69
- }
70
-
71
- /* ---- 工具栏 ---- */
72
- .trash-toolbar {
73
- display: flex;
74
- justify-content: space-between;
75
- align-items: center;
76
- gap: 12px;
77
- flex-wrap: wrap;
78
- margin-bottom: 14px;
79
- }
80
-
81
- .trash-toolbar-left {
82
- display: flex;
83
- align-items: center;
84
- gap: 8px;
85
- font-size: 13px;
86
- color: var(--color-text-secondary);
87
- }
88
-
89
- .trash-toolbar-count {
90
- font-weight: 600;
91
- color: var(--color-text-primary);
92
- }
93
-
94
- .trash-toolbar-retention {
95
- color: var(--color-text-muted);
96
- font-size: 12px;
97
- }
98
-
99
- .trash-toolbar-right {
100
- display: flex;
101
- gap: 8px;
102
- align-items: center;
103
- }
104
-
105
- /* ---- 列表 ---- */
106
- .trash-list {
107
- display: flex;
108
- flex-direction: column;
109
- gap: 6px;
110
- }
111
-
112
- .trash-item {
113
- display: flex;
114
- flex-direction: column;
115
- padding: 12px 16px;
116
- border-radius: var(--radius-md);
117
- background: var(--color-surface);
118
- border: 1px solid var(--color-border-soft);
119
- transition: all 120ms var(--ease-spring);
120
- }
121
-
122
- .trash-item:hover {
123
- border-color: var(--color-border-strong);
124
- background: var(--color-surface-alt);
125
- }
126
-
127
- .trash-item-body {
128
- display: flex;
129
- align-items: center;
130
- gap: 12px;
131
- }
132
-
133
- .trash-item-main {
134
- flex: 1;
135
- min-width: 0;
136
- }
137
-
138
- .trash-item-title {
139
- font-size: 14px;
140
- font-weight: 600;
141
- color: var(--color-text-primary);
142
- overflow: hidden;
143
- text-overflow: ellipsis;
144
- white-space: nowrap;
145
- line-height: 1.3;
146
- }
147
-
148
- .trash-item-meta {
149
- display: flex;
150
- align-items: center;
151
- gap: 8px;
152
- margin-top: 4px;
153
- font-size: 12px;
154
- color: var(--color-text-tertiary);
155
- flex-wrap: wrap;
156
- }
157
-
158
- .trash-item-time {
159
- white-space: nowrap;
160
- }
161
-
162
- .trash-item-cwd {
163
- overflow: hidden;
164
- text-overflow: ellipsis;
165
- white-space: nowrap;
166
- max-width: 200px;
167
- color: var(--color-text-muted);
168
- font-family: var(--font-family-mono);
169
- font-size: 11px;
170
- }
171
-
172
- /* ---- 操作按钮(悬浮显示) ---- */
173
- .trash-item-actions {
174
- display: flex;
175
- gap: 6px;
176
- flex-shrink: 0;
177
- opacity: 0;
178
- transition: opacity 120ms var(--ease-spring);
179
- }
180
-
181
- .trash-item:hover .trash-item-actions {
182
- opacity: 1;
183
- }
184
-
185
- .trash-action-btn {
186
- width: 34px;
187
- height: 34px;
188
- display: inline-flex;
189
- align-items: center;
190
- justify-content: center;
191
- border-radius: var(--radius-sm);
192
- border: 1px solid var(--color-border-soft);
193
- background: var(--color-surface);
194
- color: var(--color-text-tertiary);
195
- cursor: pointer;
196
- transition: all 120ms var(--ease-spring);
197
- padding: 0;
198
- }
199
-
200
- .trash-action-btn svg {
201
- width: 16px;
202
- height: 16px;
203
- }
204
-
205
- .trash-action-btn:hover:not(:disabled) {
206
- border-color: var(--color-border-strong);
207
- color: var(--color-text-primary);
208
- }
209
-
210
- .trash-action-btn.restore:hover:not(:disabled) {
211
- border-color: var(--color-success);
212
- color: var(--color-success);
213
- background: rgba(75, 139, 106, 0.06);
214
- }
215
-
216
- .trash-action-btn.delete:hover:not(:disabled) {
217
- border-color: var(--color-error);
218
- color: var(--color-error);
219
- background: rgba(196, 69, 54, 0.06);
220
- }
221
-
222
- .trash-action-btn:disabled {
223
- opacity: 0.35;
224
- cursor: not-allowed;
225
- }
226
-
227
- .trash-action-btn:active:not(:disabled) {
228
- transform: scale(0.95);
229
- }
230
-
231
- /* ---- 加载更多 ---- */
232
- .trash-list-footer {
233
- display: flex;
234
- justify-content: center;
235
- padding: 12px 0 4px;
236
- }
237
-
238
- /* ---- 响应式 ---- */
239
- @media (max-width: 640px) {
240
- .trash-item-body {
241
- flex-direction: column;
242
- align-items: stretch;
243
- gap: 10px;
244
- }
245
-
246
- .trash-item-actions {
247
- opacity: 1;
248
- justify-content: flex-end;
249
- }
250
-
251
- .trash-toolbar {
252
- flex-direction: column;
253
- align-items: stretch;
254
- }
255
-
256
- .trash-toolbar-right {
257
- justify-content: flex-end;
258
- }
259
-
260
- .trash-empty-state {
261
- padding: 40px 16px;
262
- }
263
- }
264
-
265
-
266
- .trash-item.session-item:hover,
267
- .trash-item.session-item:active {
268
- transform: none;
269
- border-color: var(--color-border-soft);
270
- background: linear-gradient(to bottom, var(--color-surface) 0%, rgba(255, 255, 255, 0.92) 100%);
271
- box-shadow: var(--shadow-subtle);
272
- }
273
-
274
- .trash-item.session-item::before {
275
- background: var(--color-border-soft);
276
- }
277
-
278
- .trash-item-main {
279
- min-width: 0;
280
- flex: 1;
281
- }
282
-
283
- .trash-item-mainline {
284
- display: flex;
285
- align-items: flex-start;
286
- gap: 8px;
287
- }
288
-
289
- .trash-item-title {
290
- flex: 1;
291
- font-size: var(--font-size-body);
292
- font-weight: var(--font-weight-secondary);
293
- color: var(--color-text-primary);
294
- line-height: 1.4;
295
- display: -webkit-box;
296
- -webkit-line-clamp: 2;
297
- -webkit-box-orient: vertical;
298
- white-space: normal;
299
- overflow: hidden;
300
- overflow-wrap: anywhere;
301
- }
302
-
303
- .trash-item-meta {
304
- margin-top: 6px;
305
- }
306
-
307
- .trash-item-side {
308
- display: flex;
309
- flex-direction: column;
310
- align-items: flex-end;
311
- gap: 8px;
312
- flex-shrink: 0;
313
- min-width: 132px;
314
- }
315
-
316
- .trash-item-actions {
317
- display: grid;
318
- grid-template-columns: repeat(2, minmax(116px, 116px));
319
- align-self: flex-end;
320
- justify-content: flex-end;
321
- gap: 8px;
322
- }
323
-
324
- .trash-item-actions .btn-mini {
325
- width: 100%;
326
- height: 38px;
327
- min-height: 38px;
328
- padding: 0 12px;
329
- display: inline-flex;
330
- align-items: center;
331
- justify-content: center;
332
- line-height: 1;
333
- white-space: nowrap;
334
- }
335
-
336
- .trash-item-time {
337
- width: 100%;
338
- text-align: right;
339
- white-space: nowrap;
340
- color: var(--color-text-tertiary);
341
- }
342
-
343
- .trash-item-path {
344
- margin-top: 8px;
345
- display: grid;
346
- grid-template-columns: 48px minmax(0, 1fr);
347
- gap: 8px;
348
- align-items: start;
349
- white-space: normal;
350
- overflow-wrap: anywhere;
351
- }
352
-
353
- .trash-item-label {
354
- display: inline-block;
355
- color: var(--color-text-secondary);
356
- font-weight: var(--font-weight-secondary);
357
- }
358
-
359
- .trash-item-path span:last-child {
360
- min-width: 0;
361
- word-break: break-word;
362
- }
363
-
364
- .trash-item .session-count-badge {
365
- margin-top: 2px;
366
- }
367
-
368
- .session-layout {
369
- display: grid;
370
- grid-template-columns: minmax(260px, 360px) minmax(0, 1fr);
371
- gap: var(--spacing-md);
372
- align-items: start;
373
- height: min(72vh, 760px);
374
- min-height: 360px;
375
- }
376
-
377
- .session-layout.session-standalone {
378
- grid-template-columns: minmax(0, 1fr);
379
- }
380
-
381
- .session-standalone-page {
382
- max-width: 960px;
383
- margin: 0 auto;
384
- padding: var(--spacing-sm) 0;
385
- }
386
-
387
- .session-standalone-title {
388
- font-size: var(--font-size-title);
389
- font-weight: var(--font-weight-title);
390
- color: var(--color-text-primary);
391
- margin-bottom: var(--spacing-sm);
392
- letter-spacing: -0.01em;
393
- }
394
-
395
- .session-standalone-text {
396
- white-space: pre-wrap;
397
- font-family: var(--font-family-body);
398
- font-size: var(--font-size-body);
399
- line-height: 1.7;
400
- color: var(--color-text-primary);
401
- word-break: break-word;
402
- }
403
-
404
- .session-list {
405
- display: flex;
406
- flex-direction: column;
407
- gap: var(--spacing-xs);
408
- position: sticky;
409
- top: 12px;
410
- height: 100%;
411
- max-height: none;
412
- overflow-y: auto;
413
- overflow-x: hidden;
414
- padding-right: 0;
415
- min-width: 0;
416
- scrollbar-width: none;
417
- -ms-overflow-style: none;
418
- }
419
-
420
- .session-list::-webkit-scrollbar {
421
- width: 0;
422
- height: 0;
423
- display: none;
424
- }
425
-
426
- .session-item {
427
- border: 1px solid var(--color-border-soft);
428
- border-radius: var(--radius-md);
429
- background: var(--color-surface);
430
- padding: 14px 16px;
431
- cursor: pointer;
432
- transition: all var(--transition-fast) var(--ease-spring);
433
- user-select: none;
434
- min-width: 0;
435
- position: relative;
436
- overflow: hidden;
437
- min-height: 84px;
438
- content-visibility: auto;
439
- contain-intrinsic-size: 84px;
440
- }
441
-
442
- .session-item-header {
443
- display: flex;
444
- align-items: center;
445
- justify-content: space-between;
446
- gap: 10px;
447
- margin-bottom: 4px;
448
- }
449
-
450
- .session-item-main {
451
- min-width: 0;
452
- flex: 1;
453
- display: flex;
454
- align-items: center;
455
- gap: 8px;
456
- }
457
-
458
- .session-item:hover {
459
- border-color: var(--color-brand);
460
- background: linear-gradient(to bottom, rgba(210, 107, 90, 0.08) 0%, rgba(255, 255, 255, 0.98) 100%);
461
- transform: translateY(-1px);
462
- }
463
-
464
- .session-item:focus-visible {
465
- outline: 3px solid rgba(210, 107, 90, 0.2);
466
- outline-offset: 2px;
467
- border-color: var(--color-brand);
468
- background: linear-gradient(to bottom, rgba(210, 107, 90, 0.06) 0%, rgba(255, 255, 255, 0.98) 100%);
469
- }
470
-
471
- .session-item::before {
472
- content: "";
473
- position: absolute;
474
- left: 0;
475
- top: 10px;
476
- bottom: 10px;
477
- width: 3px;
478
- border-radius: 999px;
479
- background: var(--color-border-soft);
480
- transition: background var(--transition-fast) var(--ease-spring);
481
- }
482
-
483
- .session-item:active {
484
- transform: scale(0.99);
485
- }
486
-
487
- .session-item.active {
488
- border-color: var(--color-brand);
489
- background: linear-gradient(to bottom, rgba(210, 107, 90, 0.06) 0%, rgba(255, 255, 255, 0.98) 100%);
490
- box-shadow: var(--shadow-float);
491
- }
492
-
493
- .session-item.pinned {
494
- border-color: var(--color-brand);
495
- background: linear-gradient(to bottom, rgba(210, 107, 90, 0.08) 0%, rgba(255, 251, 247, 0.98) 100%);
496
- box-shadow: 0 4px 12px rgba(210, 107, 90, 0.08);
497
- }
498
-
499
- .session-item.pinned::before {
500
- background: linear-gradient(180deg, var(--color-brand), var(--color-brand-dark));
501
- opacity: 0.7;
502
- }
503
-
504
- .session-item.active::before {
505
- background: linear-gradient(180deg, var(--color-brand), var(--color-brand-dark));
506
- }
507
-
508
- .session-item-title {
509
- font-size: var(--font-size-body);
510
- font-weight: var(--font-weight-secondary);
511
- color: var(--color-text-primary);
512
- line-height: 1.4;
513
- white-space: nowrap;
514
- overflow: hidden;
515
- text-overflow: ellipsis;
516
- flex: 1;
517
- max-width: none;
518
- }
519
-
520
- .session-item-actions {
521
- display: inline-flex;
522
- align-items: center;
523
- gap: 6px;
524
- flex-shrink: 0;
525
- }
526
-
527
- .session-item-copy {
528
- border: 1px solid var(--color-border-soft);
529
- background: var(--color-surface-alt);
530
- color: var(--color-text-secondary);
531
- width: 24px;
532
- height: 24px;
533
- border-radius: 8px;
534
- display: inline-flex;
535
- align-items: center;
536
- justify-content: center;
537
- cursor: pointer;
538
- flex-shrink: 0;
539
- transition: all var(--transition-fast) var(--ease-spring);
540
- }
541
-
542
- .session-item-copy:hover {
543
- border-color: var(--color-brand);
544
- background: var(--color-surface);
545
- color: var(--color-brand);
546
- transform: translateY(-1px);
547
- }
548
-
549
- .session-item-copy:disabled {
550
- opacity: 0.5;
551
- cursor: not-allowed;
552
- transform: none;
553
- }
554
-
555
- .session-item-copy svg {
556
- width: 10px;
557
- height: 10px;
558
- }
559
-
560
- .session-item-pin {
561
- border-color: var(--color-border-soft);
562
- }
563
-
564
- .session-item-pin .pin-icon,
565
- .session-item-pin svg {
566
- width: 9px;
567
- height: 9px;
568
- color: var(--color-text-tertiary);
569
- }
570
-
571
- .session-item.pinned .session-item-pin {
572
- background: var(--color-brand);
573
- border-color: var(--color-brand);
574
- opacity: 0.85;
575
- }
576
-
577
- .session-item.pinned .session-item-pin .pin-icon,
578
- .session-item.pinned .session-item-pin svg {
579
- color: #fff;
580
- }
581
-
582
- .session-item-sub.session-item-snippet {
583
- display: none !important;
584
- }
585
-
586
- .session-item-sub {
587
- font-size: var(--font-size-caption);
588
- color: var(--color-text-tertiary);
589
- line-height: 1.35;
590
- white-space: nowrap;
591
- overflow: hidden;
592
- text-overflow: ellipsis;
593
- }
594
-
595
- .session-item-sub.session-item-wrap {
596
- white-space: normal;
597
- }
598
-
599
- .session-item-meta {
600
- display: flex;
601
- flex-wrap: wrap;
602
- align-items: center;
603
- gap: 6px 8px;
604
- margin-top: 4px;
605
- margin-bottom: 2px;
606
- }
607
-
608
- .session-item-time {
609
- font-size: var(--font-size-caption);
610
- color: var(--color-text-tertiary);
611
- white-space: nowrap;
612
- }
613
-
614
- .session-item-hot {
615
- font-size: var(--font-size-caption);
616
- padding: 2px 8px;
617
- border-radius: 999px;
618
- background: linear-gradient(135deg, var(--color-brand) 0%, var(--color-brand-dark) 100%);
619
- color: #fff;
620
- line-height: 1;
621
- white-space: nowrap;
622
- }
623
-
624
- .session-item-cwd {
625
- flex: 1 0 100%;
626
- min-width: 0;
627
- color: var(--color-text-muted);
628
- white-space: normal;
629
- overflow: visible;
630
- text-overflow: clip;
631
- overflow-wrap: anywhere;
632
- }
633
-
634
- .session-preview {
635
- border: 1px solid var(--color-border-soft);
636
- border-radius: var(--radius-xl);
637
- background: var(--color-surface-elevated);
638
- box-shadow: var(--shadow-card);
639
- min-height: 0;
640
- max-height: none;
641
- height: 100%;
642
- display: flex;
643
- flex-direction: column;
644
- overflow: hidden;
645
- position: relative;
646
- transition: box-shadow var(--transition-normal) var(--ease-spring-soft);
647
- }
1
+ .session-empty {
2
+ padding: 40px var(--spacing-md);
3
+ text-align: center;
4
+ border: 1px solid var(--color-border-soft);
5
+ border-radius: var(--radius-lg);
6
+ color: var(--color-text-tertiary);
7
+ background: var(--bg-warm-gradient);
8
+ box-shadow: var(--shadow-subtle);
9
+ }
10
+
11
+ .session-empty::before {
12
+ content: "";
13
+ display: block;
14
+ width: 40px;
15
+ height: 40px;
16
+ border-radius: 50%;
17
+ margin: 0 auto 14px;
18
+ background: linear-gradient(135deg, var(--color-brand) 0%, var(--color-brand-dark) 100%);
19
+ opacity: 0.18;
20
+ }
21
+
22
+
23
+ /* ============================================
24
+ 回收站 — 极简·本质
25
+ ============================================ */
26
+
27
+ /* ---- 空态 ---- */
28
+ .trash-empty-state {
29
+ display: flex;
30
+ flex-direction: column;
31
+ align-items: center;
32
+ justify-content: center;
33
+ gap: 12px;
34
+ padding: 64px 24px;
35
+ text-align: center;
36
+ }
37
+
38
+ .trash-empty-svg {
39
+ width: 56px;
40
+ height: 56px;
41
+ color: var(--color-text-muted);
42
+ opacity: 0.6;
43
+ }
44
+
45
+ .trash-spinner {
46
+ width: 28px;
47
+ height: 28px;
48
+ border-radius: 50%;
49
+ border: 2.5px solid var(--color-border-soft);
50
+ border-top-color: var(--color-brand);
51
+ animation: trash-spin 0.7s linear infinite;
52
+ }
53
+
54
+ @keyframes trash-spin {
55
+ to { transform: rotate(360deg); }
56
+ }
57
+
58
+ .trash-empty-title {
59
+ font-size: 15px;
60
+ font-weight: 600;
61
+ color: var(--color-text-secondary);
62
+ }
63
+
64
+ .trash-empty-hint {
65
+ font-size: 12px;
66
+ color: var(--color-text-muted);
67
+ max-width: 280px;
68
+ line-height: 1.5;
69
+ }
70
+
71
+ /* ---- 工具栏 ---- */
72
+ .trash-toolbar {
73
+ display: flex;
74
+ justify-content: space-between;
75
+ align-items: center;
76
+ gap: 12px;
77
+ flex-wrap: wrap;
78
+ margin-bottom: 14px;
79
+ }
80
+
81
+ .trash-toolbar-left {
82
+ display: flex;
83
+ align-items: center;
84
+ gap: 8px;
85
+ font-size: 13px;
86
+ color: var(--color-text-secondary);
87
+ }
88
+
89
+ .trash-toolbar-count {
90
+ font-weight: 600;
91
+ color: var(--color-text-primary);
92
+ }
93
+
94
+ .trash-toolbar-retention {
95
+ color: var(--color-text-muted);
96
+ font-size: 12px;
97
+ }
98
+
99
+ .trash-toolbar-right {
100
+ display: flex;
101
+ gap: 8px;
102
+ align-items: center;
103
+ }
104
+
105
+ /* ---- 列表 ---- */
106
+ .trash-list {
107
+ display: flex;
108
+ flex-direction: column;
109
+ gap: 6px;
110
+ }
111
+
112
+ .trash-item {
113
+ display: flex;
114
+ flex-direction: column;
115
+ padding: 12px 16px;
116
+ border-radius: var(--radius-md);
117
+ background: var(--color-surface);
118
+ border: 1px solid var(--color-border-soft);
119
+ transition: all 120ms var(--ease-spring);
120
+ }
121
+
122
+ .trash-item:hover {
123
+ border-color: var(--color-border-strong);
124
+ background: var(--color-surface-alt);
125
+ }
126
+
127
+ .trash-item-body {
128
+ display: flex;
129
+ align-items: center;
130
+ gap: 12px;
131
+ }
132
+
133
+ .trash-item-main {
134
+ flex: 1;
135
+ min-width: 0;
136
+ }
137
+
138
+ .trash-item-title {
139
+ font-size: 14px;
140
+ font-weight: 600;
141
+ color: var(--color-text-primary);
142
+ overflow: hidden;
143
+ text-overflow: ellipsis;
144
+ white-space: nowrap;
145
+ line-height: 1.3;
146
+ }
147
+
148
+ .trash-item-meta {
149
+ display: flex;
150
+ align-items: center;
151
+ gap: 8px;
152
+ margin-top: 4px;
153
+ font-size: 12px;
154
+ color: var(--color-text-tertiary);
155
+ flex-wrap: wrap;
156
+ }
157
+
158
+ .trash-item-time {
159
+ white-space: nowrap;
160
+ }
161
+
162
+ .trash-item-cwd {
163
+ overflow: hidden;
164
+ text-overflow: ellipsis;
165
+ white-space: nowrap;
166
+ max-width: 200px;
167
+ color: var(--color-text-muted);
168
+ font-family: var(--font-family-mono);
169
+ font-size: 11px;
170
+ }
171
+
172
+ /* ---- 操作按钮(悬浮显示) ---- */
173
+ .trash-item-actions {
174
+ display: flex;
175
+ gap: 6px;
176
+ flex-shrink: 0;
177
+ opacity: 0;
178
+ transition: opacity 120ms var(--ease-spring);
179
+ }
180
+
181
+ .trash-item:hover .trash-item-actions {
182
+ opacity: 1;
183
+ }
184
+
185
+ .trash-action-btn {
186
+ width: 34px;
187
+ height: 34px;
188
+ display: inline-flex;
189
+ align-items: center;
190
+ justify-content: center;
191
+ border-radius: var(--radius-sm);
192
+ border: 1px solid var(--color-border-soft);
193
+ background: var(--color-surface);
194
+ color: var(--color-text-tertiary);
195
+ cursor: pointer;
196
+ transition: all 120ms var(--ease-spring);
197
+ padding: 0;
198
+ }
199
+
200
+ .trash-action-btn svg {
201
+ width: 16px;
202
+ height: 16px;
203
+ }
204
+
205
+ .trash-action-btn:hover:not(:disabled) {
206
+ border-color: var(--color-border-strong);
207
+ color: var(--color-text-primary);
208
+ }
209
+
210
+ .trash-action-btn.restore:hover:not(:disabled) {
211
+ border-color: var(--color-success);
212
+ color: var(--color-success);
213
+ background: rgba(75, 139, 106, 0.06);
214
+ }
215
+
216
+ .trash-action-btn.delete:hover:not(:disabled) {
217
+ border-color: var(--color-error);
218
+ color: var(--color-error);
219
+ background: rgba(196, 69, 54, 0.06);
220
+ }
221
+
222
+ .trash-action-btn:disabled {
223
+ opacity: 0.35;
224
+ cursor: not-allowed;
225
+ }
226
+
227
+ .trash-action-btn:active:not(:disabled) {
228
+ transform: scale(0.95);
229
+ }
230
+
231
+ /* ---- 加载更多 ---- */
232
+ .trash-list-footer {
233
+ display: flex;
234
+ justify-content: center;
235
+ padding: 12px 0 4px;
236
+ }
237
+
238
+ /* ---- 响应式 ---- */
239
+ @media (max-width: 640px) {
240
+ .trash-item-body {
241
+ flex-direction: column;
242
+ align-items: stretch;
243
+ gap: 10px;
244
+ }
245
+
246
+ .trash-item-actions {
247
+ opacity: 1;
248
+ justify-content: flex-end;
249
+ }
250
+
251
+ .trash-toolbar {
252
+ flex-direction: column;
253
+ align-items: stretch;
254
+ }
255
+
256
+ .trash-toolbar-right {
257
+ justify-content: flex-end;
258
+ }
259
+
260
+ .trash-empty-state {
261
+ padding: 40px 16px;
262
+ }
263
+ }
264
+
265
+
266
+ .trash-item.session-item:hover,
267
+ .trash-item.session-item:active {
268
+ transform: none;
269
+ border-color: var(--color-border-soft);
270
+ background: linear-gradient(to bottom, var(--color-surface) 0%, rgba(255, 255, 255, 0.92) 100%);
271
+ box-shadow: var(--shadow-subtle);
272
+ }
273
+
274
+ .trash-item.session-item::before {
275
+ background: var(--color-border-soft);
276
+ }
277
+
278
+ .trash-item-main {
279
+ min-width: 0;
280
+ flex: 1;
281
+ }
282
+
283
+ .trash-item-mainline {
284
+ display: flex;
285
+ align-items: flex-start;
286
+ gap: 8px;
287
+ }
288
+
289
+ .trash-item-title {
290
+ flex: 1;
291
+ font-size: var(--font-size-body);
292
+ font-weight: var(--font-weight-secondary);
293
+ color: var(--color-text-primary);
294
+ line-height: 1.4;
295
+ display: -webkit-box;
296
+ -webkit-line-clamp: 2;
297
+ -webkit-box-orient: vertical;
298
+ white-space: normal;
299
+ overflow: hidden;
300
+ overflow-wrap: anywhere;
301
+ }
302
+
303
+ .trash-item-meta {
304
+ margin-top: 6px;
305
+ }
306
+
307
+ .trash-item-side {
308
+ display: flex;
309
+ flex-direction: column;
310
+ align-items: flex-end;
311
+ gap: 8px;
312
+ flex-shrink: 0;
313
+ min-width: 132px;
314
+ }
315
+
316
+ .trash-item-actions {
317
+ display: grid;
318
+ grid-template-columns: repeat(2, minmax(116px, 116px));
319
+ align-self: flex-end;
320
+ justify-content: flex-end;
321
+ gap: 8px;
322
+ }
323
+
324
+ .trash-item-actions .btn-mini {
325
+ width: 100%;
326
+ height: 38px;
327
+ min-height: 38px;
328
+ padding: 0 12px;
329
+ display: inline-flex;
330
+ align-items: center;
331
+ justify-content: center;
332
+ line-height: 1;
333
+ white-space: nowrap;
334
+ }
335
+
336
+ .trash-item-time {
337
+ width: 100%;
338
+ text-align: right;
339
+ white-space: nowrap;
340
+ color: var(--color-text-tertiary);
341
+ }
342
+
343
+ .trash-item-path {
344
+ margin-top: 8px;
345
+ display: grid;
346
+ grid-template-columns: 48px minmax(0, 1fr);
347
+ gap: 8px;
348
+ align-items: start;
349
+ white-space: normal;
350
+ overflow-wrap: anywhere;
351
+ }
352
+
353
+ .trash-item-label {
354
+ display: inline-block;
355
+ color: var(--color-text-secondary);
356
+ font-weight: var(--font-weight-secondary);
357
+ }
358
+
359
+ .trash-item-path span:last-child {
360
+ min-width: 0;
361
+ word-break: break-word;
362
+ }
363
+
364
+ .trash-item .session-count-badge {
365
+ margin-top: 2px;
366
+ }
367
+
368
+ .session-layout {
369
+ display: grid;
370
+ grid-template-columns: minmax(260px, 360px) minmax(0, 1fr);
371
+ gap: var(--spacing-md);
372
+ align-items: start;
373
+ height: min(72vh, 760px);
374
+ min-height: 360px;
375
+ }
376
+
377
+ .session-layout.session-standalone {
378
+ grid-template-columns: minmax(0, 1fr);
379
+ }
380
+
381
+ .session-standalone-page {
382
+ max-width: 960px;
383
+ margin: 0 auto;
384
+ padding: var(--spacing-sm) 0;
385
+ }
386
+
387
+ .session-standalone-title {
388
+ font-size: var(--font-size-title);
389
+ font-weight: var(--font-weight-title);
390
+ color: var(--color-text-primary);
391
+ margin-bottom: var(--spacing-sm);
392
+ letter-spacing: -0.01em;
393
+ }
394
+
395
+ .session-standalone-text {
396
+ white-space: pre-wrap;
397
+ font-family: var(--font-family-body);
398
+ font-size: var(--font-size-body);
399
+ line-height: 1.7;
400
+ color: var(--color-text-primary);
401
+ word-break: break-word;
402
+ }
403
+
404
+ .session-list {
405
+ display: flex;
406
+ flex-direction: column;
407
+ gap: var(--spacing-xs);
408
+ position: sticky;
409
+ top: 12px;
410
+ height: 100%;
411
+ max-height: none;
412
+ overflow-y: auto;
413
+ overflow-x: hidden;
414
+ padding-right: 0;
415
+ min-width: 0;
416
+ scrollbar-width: none;
417
+ -ms-overflow-style: none;
418
+ }
419
+
420
+ .session-list::-webkit-scrollbar {
421
+ width: 0;
422
+ height: 0;
423
+ display: none;
424
+ }
425
+
426
+ .session-item {
427
+ border: 1px solid var(--color-border-soft);
428
+ border-radius: var(--radius-md);
429
+ background: var(--color-surface);
430
+ padding: 14px 16px;
431
+ cursor: pointer;
432
+ transition: all var(--transition-fast) var(--ease-spring);
433
+ user-select: none;
434
+ min-width: 0;
435
+ position: relative;
436
+ overflow: hidden;
437
+ min-height: 84px;
438
+ content-visibility: auto;
439
+ contain-intrinsic-size: 84px;
440
+ }
441
+
442
+ .session-item-header {
443
+ display: flex;
444
+ align-items: center;
445
+ justify-content: space-between;
446
+ gap: 10px;
447
+ margin-bottom: 4px;
448
+ }
449
+
450
+ .session-item-main {
451
+ min-width: 0;
452
+ flex: 1;
453
+ display: flex;
454
+ align-items: center;
455
+ gap: 8px;
456
+ }
457
+
458
+ .session-item:hover {
459
+ border-color: var(--color-brand);
460
+ background: linear-gradient(to bottom, rgba(210, 107, 90, 0.08) 0%, rgba(255, 255, 255, 0.98) 100%);
461
+ transform: translateY(-1px);
462
+ }
463
+
464
+ .session-item:focus-visible {
465
+ outline: 3px solid rgba(210, 107, 90, 0.2);
466
+ outline-offset: 2px;
467
+ border-color: var(--color-brand);
468
+ background: linear-gradient(to bottom, rgba(210, 107, 90, 0.06) 0%, rgba(255, 255, 255, 0.98) 100%);
469
+ }
470
+
471
+ .session-item::before {
472
+ content: "";
473
+ position: absolute;
474
+ left: 0;
475
+ top: 10px;
476
+ bottom: 10px;
477
+ width: 3px;
478
+ border-radius: 999px;
479
+ background: var(--color-border-soft);
480
+ transition: background var(--transition-fast) var(--ease-spring);
481
+ }
482
+
483
+ .session-item:active {
484
+ transform: scale(0.99);
485
+ }
486
+
487
+ .session-item.active {
488
+ border-color: var(--color-brand);
489
+ background: linear-gradient(to bottom, rgba(210, 107, 90, 0.06) 0%, rgba(255, 255, 255, 0.98) 100%);
490
+ box-shadow: var(--shadow-float);
491
+ }
492
+
493
+ .session-item.pinned {
494
+ border-color: var(--color-brand);
495
+ background: linear-gradient(to bottom, rgba(210, 107, 90, 0.08) 0%, rgba(255, 251, 247, 0.98) 100%);
496
+ box-shadow: 0 4px 12px rgba(210, 107, 90, 0.08);
497
+ }
498
+
499
+ .session-item.pinned::before {
500
+ background: linear-gradient(180deg, var(--color-brand), var(--color-brand-dark));
501
+ opacity: 0.7;
502
+ }
503
+
504
+ .session-item.active::before {
505
+ background: linear-gradient(180deg, var(--color-brand), var(--color-brand-dark));
506
+ }
507
+
508
+ .session-item-title {
509
+ font-size: var(--font-size-body);
510
+ font-weight: var(--font-weight-secondary);
511
+ color: var(--color-text-primary);
512
+ line-height: 1.4;
513
+ white-space: nowrap;
514
+ overflow: hidden;
515
+ text-overflow: ellipsis;
516
+ flex: 1;
517
+ max-width: none;
518
+ }
519
+
520
+ .session-item-actions {
521
+ display: inline-flex;
522
+ align-items: center;
523
+ gap: 6px;
524
+ flex-shrink: 0;
525
+ }
526
+
527
+ .session-item-copy {
528
+ border: 1px solid var(--color-border-soft);
529
+ background: var(--color-surface-alt);
530
+ color: var(--color-text-secondary);
531
+ width: 24px;
532
+ height: 24px;
533
+ border-radius: 8px;
534
+ display: inline-flex;
535
+ align-items: center;
536
+ justify-content: center;
537
+ cursor: pointer;
538
+ flex-shrink: 0;
539
+ transition: all var(--transition-fast) var(--ease-spring);
540
+ }
541
+
542
+ .session-item-copy:hover {
543
+ border-color: var(--color-brand);
544
+ background: var(--color-surface);
545
+ color: var(--color-brand);
546
+ transform: translateY(-1px);
547
+ }
548
+
549
+ .session-item-copy:disabled {
550
+ opacity: 0.5;
551
+ cursor: not-allowed;
552
+ transform: none;
553
+ }
554
+
555
+ .session-item-copy svg {
556
+ width: 10px;
557
+ height: 10px;
558
+ }
559
+
560
+ .session-item-pin {
561
+ border-color: var(--color-border-soft);
562
+ }
563
+
564
+ .session-item-pin .pin-icon,
565
+ .session-item-pin svg {
566
+ width: 9px;
567
+ height: 9px;
568
+ color: var(--color-text-tertiary);
569
+ }
570
+
571
+ .session-item.pinned .session-item-pin {
572
+ background: var(--color-brand);
573
+ border-color: var(--color-brand);
574
+ opacity: 0.85;
575
+ }
576
+
577
+ .session-item.pinned .session-item-pin .pin-icon,
578
+ .session-item.pinned .session-item-pin svg {
579
+ color: #fff;
580
+ }
581
+
582
+ .session-item-sub.session-item-snippet {
583
+ display: none !important;
584
+ }
585
+
586
+ .session-item-sub {
587
+ font-size: var(--font-size-caption);
588
+ color: var(--color-text-tertiary);
589
+ line-height: 1.35;
590
+ white-space: nowrap;
591
+ overflow: hidden;
592
+ text-overflow: ellipsis;
593
+ }
594
+
595
+ .session-item-sub.session-item-wrap {
596
+ white-space: normal;
597
+ }
598
+
599
+ .session-item-meta {
600
+ display: flex;
601
+ flex-wrap: wrap;
602
+ align-items: center;
603
+ gap: 6px 8px;
604
+ margin-top: 4px;
605
+ margin-bottom: 2px;
606
+ }
607
+
608
+ .session-item-time {
609
+ font-size: var(--font-size-caption);
610
+ color: var(--color-text-tertiary);
611
+ white-space: nowrap;
612
+ }
613
+
614
+ .session-item-hot {
615
+ font-size: var(--font-size-caption);
616
+ padding: 2px 8px;
617
+ border-radius: 999px;
618
+ background: linear-gradient(135deg, var(--color-brand) 0%, var(--color-brand-dark) 100%);
619
+ color: #fff;
620
+ line-height: 1;
621
+ white-space: nowrap;
622
+ }
623
+
624
+ .session-item-cwd {
625
+ flex: 1 0 100%;
626
+ min-width: 0;
627
+ color: var(--color-text-muted);
628
+ white-space: normal;
629
+ overflow: visible;
630
+ text-overflow: clip;
631
+ overflow-wrap: anywhere;
632
+ }
633
+
634
+ .session-preview {
635
+ border: 1px solid var(--color-border-soft);
636
+ border-radius: var(--radius-xl);
637
+ background: var(--color-surface-elevated);
638
+ box-shadow: var(--shadow-card);
639
+ min-height: 0;
640
+ max-height: none;
641
+ height: 100%;
642
+ display: flex;
643
+ flex-direction: column;
644
+ overflow: hidden;
645
+ position: relative;
646
+ transition: box-shadow var(--transition-normal) var(--ease-spring-soft);
647
+ }
648
+
649
+ .session-context-badge {
650
+ font-size: 10px;
651
+ padding: 1px 6px;
652
+ border-radius: 999px;
653
+ font-weight: 600;
654
+ line-height: 1.4;
655
+ white-space: nowrap;
656
+ }
657
+
658
+ .session-context-normal {
659
+ background: rgba(75, 139, 106, 0.12);
660
+ color: #4b8b6a;
661
+ }
662
+
663
+ .session-context-warning {
664
+ background: rgba(217, 119, 6, 0.15);
665
+ color: #b45309;
666
+ animation: context-warning-pulse 2s ease-in-out infinite;
667
+ }
668
+
669
+ .session-context-critical {
670
+ background: rgba(196, 69, 54, 0.18);
671
+ color: #c2410c;
672
+ animation: context-critical-pulse 1s ease-in-out infinite;
673
+ }
674
+
675
+ @keyframes context-warning-pulse {
676
+ 0%, 100% { opacity: 1; }
677
+ 50% { opacity: 0.7; }
678
+ }
679
+
680
+ @keyframes context-critical-pulse {
681
+ 0%, 100% { opacity: 1; }
682
+ 50% { opacity: 0.6; }
683
+ }