codexmate 0.0.30 → 0.0.32

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 (144) hide show
  1. package/README.md +363 -421
  2. package/README.zh.md +371 -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 -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 +324 -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 -65
  16. package/cli/session-convert-io.js +82 -82
  17. package/cli/session-convert.js +150 -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 +15829 -15481
  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 +426 -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 +647 -645
  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 +781 -765
  60. package/web-ui/modules/api.mjs +90 -90
  61. package/web-ui/modules/app.computed.dashboard.mjs +248 -248
  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 +693 -999
  65. package/web-ui/modules/app.constants.mjs +15 -15
  66. package/web-ui/modules/app.methods.agents.mjs +651 -632
  67. package/web-ui/modules/app.methods.claude-config.mjs +200 -200
  68. package/web-ui/modules/app.methods.codex-config.mjs +861 -917
  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 -774
  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 -529
  76. package/web-ui/modules/app.methods.runtime.mjs +345 -345
  77. package/web-ui/modules/app.methods.session-actions.mjs +591 -593
  78. package/web-ui/modules/app.methods.session-browser.mjs +1012 -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 +537 -534
  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 +3177 -3146
  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 -482
  95. package/web-ui/partials/index/layout-footer.html +13 -13
  96. package/web-ui/partials/index/layout-header.html +503 -500
  97. package/web-ui/partials/index/modal-config-template-agents.html +185 -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 +136 -194
  104. package/web-ui/partials/index/panel-config-codex.html +197 -337
  105. package/web-ui/partials/index/panel-config-openclaw.html +83 -83
  106. package/web-ui/partials/index/panel-dashboard.html +219 -219
  107. package/web-ui/partials/index/panel-docs.html +115 -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 +313 -308
  112. package/web-ui/partials/index/panel-settings.html +190 -190
  113. package/web-ui/partials/index/panel-trash.html +83 -88
  114. package/web-ui/partials/index/panel-usage.html +138 -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 +591 -594
  118. package/web-ui/source-bundle.cjs +233 -233
  119. package/web-ui/styles/base-theme.css +281 -281
  120. package/web-ui/styles/bridge-pool.css +197 -0
  121. package/web-ui/styles/controls-forms.css +433 -422
  122. package/web-ui/styles/dashboard.css +406 -406
  123. package/web-ui/styles/docs-panel.css +245 -271
  124. package/web-ui/styles/feedback.css +108 -108
  125. package/web-ui/styles/health-check-dialog.css +144 -144
  126. package/web-ui/styles/layout-shell.css +638 -626
  127. package/web-ui/styles/modals-core.css +466 -466
  128. package/web-ui/styles/navigation-panels.css +391 -391
  129. package/web-ui/styles/openclaw-structured.css +266 -266
  130. package/web-ui/styles/plugins-panel.css +564 -564
  131. package/web-ui/styles/responsive.css +392 -454
  132. package/web-ui/styles/sessions-list.css +647 -417
  133. package/web-ui/styles/sessions-preview.css +407 -407
  134. package/web-ui/styles/sessions-toolbar-trash.css +518 -334
  135. package/web-ui/styles/sessions-usage.css +588 -1040
  136. package/web-ui/styles/settings-panel.css +349 -349
  137. package/web-ui/styles/skills-list.css +305 -305
  138. package/web-ui/styles/skills-market.css +429 -429
  139. package/web-ui/styles/task-orchestration.css +822 -822
  140. package/web-ui/styles/titles-cards.css +472 -472
  141. package/web-ui/styles/trash-panel.css +90 -90
  142. package/web-ui/styles/webhook.css +81 -81
  143. package/web-ui/styles.css +24 -23
  144. package/web-ui.html +17 -17
@@ -1,417 +1,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
- .trash-list {
23
- display: grid;
24
- gap: 12px;
25
- margin-top: 12px;
26
- }
27
-
28
- .trash-item.session-item {
29
- min-height: auto;
30
- height: auto;
31
- cursor: default;
32
- content-visibility: visible;
33
- contain-intrinsic-size: auto;
34
- }
35
-
36
- .trash-item.session-item:hover,
37
- .trash-item.session-item:active {
38
- transform: none;
39
- border-color: var(--color-border-soft);
40
- background: linear-gradient(to bottom, var(--color-surface) 0%, rgba(255, 255, 255, 0.92) 100%);
41
- box-shadow: var(--shadow-subtle);
42
- }
43
-
44
- .trash-item.session-item::before {
45
- background: var(--color-border-soft);
46
- }
47
-
48
- .trash-item-main {
49
- min-width: 0;
50
- flex: 1;
51
- }
52
-
53
- .trash-item-mainline {
54
- display: flex;
55
- align-items: flex-start;
56
- gap: 8px;
57
- }
58
-
59
- .trash-item-title {
60
- flex: 1;
61
- font-size: var(--font-size-body);
62
- font-weight: var(--font-weight-secondary);
63
- color: var(--color-text-primary);
64
- line-height: 1.4;
65
- display: -webkit-box;
66
- -webkit-line-clamp: 2;
67
- -webkit-box-orient: vertical;
68
- white-space: normal;
69
- overflow: hidden;
70
- overflow-wrap: anywhere;
71
- }
72
-
73
- .trash-item-meta {
74
- margin-top: 6px;
75
- }
76
-
77
- .trash-item-side {
78
- display: flex;
79
- flex-direction: column;
80
- align-items: flex-end;
81
- gap: 8px;
82
- flex-shrink: 0;
83
- min-width: 132px;
84
- }
85
-
86
- .trash-item-actions {
87
- display: grid;
88
- grid-template-columns: repeat(2, minmax(116px, 116px));
89
- align-self: flex-end;
90
- justify-content: flex-end;
91
- gap: 8px;
92
- }
93
-
94
- .trash-item-actions .btn-mini {
95
- width: 100%;
96
- height: 38px;
97
- min-height: 38px;
98
- padding: 0 12px;
99
- display: inline-flex;
100
- align-items: center;
101
- justify-content: center;
102
- line-height: 1;
103
- white-space: nowrap;
104
- }
105
-
106
- .trash-item-time {
107
- width: 100%;
108
- text-align: right;
109
- white-space: nowrap;
110
- color: var(--color-text-tertiary);
111
- }
112
-
113
- .trash-item-path {
114
- margin-top: 8px;
115
- display: grid;
116
- grid-template-columns: 48px minmax(0, 1fr);
117
- gap: 8px;
118
- align-items: start;
119
- white-space: normal;
120
- overflow-wrap: anywhere;
121
- }
122
-
123
- .trash-item-label {
124
- display: inline-block;
125
- color: var(--color-text-secondary);
126
- font-weight: var(--font-weight-secondary);
127
- }
128
-
129
- .trash-item-path span:last-child {
130
- min-width: 0;
131
- word-break: break-word;
132
- }
133
-
134
- .trash-item .session-count-badge {
135
- margin-top: 2px;
136
- }
137
-
138
- .session-layout {
139
- display: grid;
140
- grid-template-columns: minmax(260px, 360px) minmax(0, 1fr);
141
- gap: var(--spacing-md);
142
- align-items: start;
143
- height: min(72vh, 760px);
144
- min-height: 360px;
145
- }
146
-
147
- .session-layout.session-standalone {
148
- grid-template-columns: minmax(0, 1fr);
149
- }
150
-
151
- .session-standalone-page {
152
- max-width: 960px;
153
- margin: 0 auto;
154
- padding: var(--spacing-sm) 0;
155
- }
156
-
157
- .session-standalone-title {
158
- font-size: var(--font-size-title);
159
- font-weight: var(--font-weight-title);
160
- color: var(--color-text-primary);
161
- margin-bottom: var(--spacing-sm);
162
- letter-spacing: -0.01em;
163
- }
164
-
165
- .session-standalone-text {
166
- white-space: pre-wrap;
167
- font-family: var(--font-family-body);
168
- font-size: var(--font-size-body);
169
- line-height: 1.7;
170
- color: var(--color-text-primary);
171
- word-break: break-word;
172
- }
173
-
174
- .session-list {
175
- display: flex;
176
- flex-direction: column;
177
- gap: var(--spacing-xs);
178
- position: sticky;
179
- top: 12px;
180
- height: 100%;
181
- max-height: none;
182
- overflow-y: auto;
183
- overflow-x: hidden;
184
- padding-right: 0;
185
- min-width: 0;
186
- scrollbar-width: none;
187
- -ms-overflow-style: none;
188
- }
189
-
190
- .session-list::-webkit-scrollbar {
191
- width: 0;
192
- height: 0;
193
- display: none;
194
- }
195
-
196
- .session-item {
197
- border: 1px solid var(--color-border-soft);
198
- border-radius: var(--radius-md);
199
- background: var(--color-surface);
200
- padding: 14px 16px;
201
- cursor: pointer;
202
- transition: all var(--transition-fast) var(--ease-spring);
203
- user-select: none;
204
- min-width: 0;
205
- position: relative;
206
- overflow: hidden;
207
- min-height: 108px;
208
- content-visibility: auto;
209
- contain-intrinsic-size: 108px;
210
- }
211
-
212
- .session-item-header {
213
- display: flex;
214
- align-items: center;
215
- justify-content: space-between;
216
- gap: 10px;
217
- margin-bottom: 4px;
218
- }
219
-
220
- .session-item-main {
221
- min-width: 0;
222
- flex: 1;
223
- display: flex;
224
- align-items: center;
225
- gap: 8px;
226
- }
227
-
228
- .session-item:hover {
229
- border-color: var(--color-brand);
230
- background: linear-gradient(to bottom, rgba(210, 107, 90, 0.08) 0%, rgba(255, 255, 255, 0.98) 100%);
231
- transform: translateY(-1px);
232
- }
233
-
234
- .session-item:focus-visible {
235
- outline: 3px solid rgba(210, 107, 90, 0.2);
236
- outline-offset: 2px;
237
- border-color: var(--color-brand);
238
- background: linear-gradient(to bottom, rgba(210, 107, 90, 0.06) 0%, rgba(255, 255, 255, 0.98) 100%);
239
- }
240
-
241
- .session-item::before {
242
- content: "";
243
- position: absolute;
244
- left: 0;
245
- top: 10px;
246
- bottom: 10px;
247
- width: 3px;
248
- border-radius: 999px;
249
- background: var(--color-border-soft);
250
- transition: background var(--transition-fast) var(--ease-spring);
251
- }
252
-
253
- .session-item:active {
254
- transform: scale(0.99);
255
- }
256
-
257
- .session-item.active {
258
- border-color: var(--color-brand);
259
- background: linear-gradient(to bottom, rgba(210, 107, 90, 0.06) 0%, rgba(255, 255, 255, 0.98) 100%);
260
- box-shadow: var(--shadow-float);
261
- }
262
-
263
- .session-item.pinned {
264
- border-color: var(--color-brand);
265
- background: linear-gradient(to bottom, rgba(210, 107, 90, 0.08) 0%, rgba(255, 251, 247, 0.98) 100%);
266
- box-shadow: 0 4px 12px rgba(210, 107, 90, 0.08);
267
- }
268
-
269
- .session-item.pinned::before {
270
- background: linear-gradient(180deg, var(--color-brand), var(--color-brand-dark));
271
- opacity: 0.7;
272
- }
273
-
274
- .session-item.active::before {
275
- background: linear-gradient(180deg, var(--color-brand), var(--color-brand-dark));
276
- }
277
-
278
- .session-item-title {
279
- font-size: var(--font-size-body);
280
- font-weight: var(--font-weight-secondary);
281
- color: var(--color-text-primary);
282
- line-height: 1.4;
283
- white-space: nowrap;
284
- overflow: hidden;
285
- text-overflow: ellipsis;
286
- flex: 1;
287
- max-width: none;
288
- }
289
-
290
- .session-item-actions {
291
- display: inline-flex;
292
- align-items: center;
293
- gap: 6px;
294
- flex-shrink: 0;
295
- }
296
-
297
- .session-item-copy {
298
- border: 1px solid var(--color-border-soft);
299
- background: var(--color-surface-alt);
300
- color: var(--color-text-secondary);
301
- width: 24px;
302
- height: 24px;
303
- border-radius: 8px;
304
- display: inline-flex;
305
- align-items: center;
306
- justify-content: center;
307
- cursor: pointer;
308
- flex-shrink: 0;
309
- transition: all var(--transition-fast) var(--ease-spring);
310
- }
311
-
312
- .session-item-copy:hover {
313
- border-color: var(--color-brand);
314
- background: var(--color-surface);
315
- color: var(--color-brand);
316
- transform: translateY(-1px);
317
- }
318
-
319
- .session-item-copy:disabled {
320
- opacity: 0.5;
321
- cursor: not-allowed;
322
- transform: none;
323
- }
324
-
325
- .session-item-copy svg {
326
- width: 10px;
327
- height: 10px;
328
- }
329
-
330
- .session-item-pin {
331
- border-color: var(--color-border-soft);
332
- }
333
-
334
- .session-item-pin .pin-icon,
335
- .session-item-pin svg {
336
- width: 9px;
337
- height: 9px;
338
- color: var(--color-text-tertiary);
339
- }
340
-
341
- .session-item.pinned .session-item-pin {
342
- background: var(--color-brand);
343
- border-color: var(--color-brand);
344
- opacity: 0.85;
345
- }
346
-
347
- .session-item.pinned .session-item-pin .pin-icon,
348
- .session-item.pinned .session-item-pin svg {
349
- color: #fff;
350
- }
351
-
352
- .session-item-sub.session-item-snippet {
353
- display: none !important;
354
- }
355
-
356
- .session-item-sub {
357
- font-size: var(--font-size-caption);
358
- color: var(--color-text-tertiary);
359
- line-height: 1.35;
360
- white-space: nowrap;
361
- overflow: hidden;
362
- text-overflow: ellipsis;
363
- }
364
-
365
- .session-item-sub.session-item-wrap {
366
- white-space: normal;
367
- }
368
-
369
- .session-item-meta {
370
- display: flex;
371
- flex-wrap: wrap;
372
- align-items: center;
373
- gap: 6px 8px;
374
- margin-top: 4px;
375
- margin-bottom: 2px;
376
- }
377
-
378
- .session-item-time {
379
- font-size: var(--font-size-caption);
380
- color: var(--color-text-tertiary);
381
- white-space: nowrap;
382
- }
383
-
384
- .session-item-hot {
385
- font-size: var(--font-size-caption);
386
- padding: 2px 8px;
387
- border-radius: 999px;
388
- background: linear-gradient(135deg, var(--color-brand) 0%, var(--color-brand-dark) 100%);
389
- color: #fff;
390
- line-height: 1;
391
- white-space: nowrap;
392
- }
393
-
394
- .session-item-cwd {
395
- flex: 1 0 100%;
396
- min-width: 0;
397
- color: var(--color-text-muted);
398
- white-space: normal;
399
- overflow: visible;
400
- text-overflow: clip;
401
- overflow-wrap: anywhere;
402
- }
403
-
404
- .session-preview {
405
- border: 1px solid var(--color-border-soft);
406
- border-radius: var(--radius-xl);
407
- background: var(--color-surface-elevated);
408
- box-shadow: var(--shadow-card);
409
- min-height: 0;
410
- max-height: none;
411
- height: 100%;
412
- display: flex;
413
- flex-direction: column;
414
- overflow: hidden;
415
- position: relative;
416
- transition: box-shadow var(--transition-normal) var(--ease-spring-soft);
417
- }
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
+ }