codexmate 0.0.31 → 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 (37) hide show
  1. package/README.md +92 -308
  2. package/README.zh.md +94 -318
  3. package/cli/local-bridge.js +227 -0
  4. package/cli/update.js +162 -0
  5. package/cli.js +357 -112
  6. package/lib/cli-sessions.js +16 -6
  7. package/lib/win-tray.js +119 -0
  8. package/package.json +2 -2
  9. package/web-ui/app.js +4 -0
  10. package/web-ui/logic.sessions.mjs +17 -1
  11. package/web-ui/modules/app.computed.session.mjs +51 -315
  12. package/web-ui/modules/app.methods.agents.mjs +19 -0
  13. package/web-ui/modules/app.methods.claude-config.mjs +71 -2
  14. package/web-ui/modules/app.methods.codex-config.mjs +20 -0
  15. package/web-ui/modules/app.methods.providers.mjs +53 -7
  16. package/web-ui/modules/app.methods.session-actions.mjs +1 -1
  17. package/web-ui/modules/app.methods.session-browser.mjs +29 -1
  18. package/web-ui/modules/app.methods.startup-claude.mjs +4 -0
  19. package/web-ui/modules/i18n.dict.mjs +21 -3
  20. package/web-ui/partials/index/layout-header.html +1 -2
  21. package/web-ui/partials/index/modal-config-template-agents.html +12 -1
  22. package/web-ui/partials/index/modals-basic.html +14 -3
  23. package/web-ui/partials/index/panel-config-claude.html +57 -85
  24. package/web-ui/partials/index/panel-config-codex.html +60 -226
  25. package/web-ui/partials/index/panel-dashboard.html +0 -33
  26. package/web-ui/partials/index/panel-docs.html +21 -53
  27. package/web-ui/partials/index/panel-sessions.html +37 -20
  28. package/web-ui/partials/index/panel-trash.html +33 -38
  29. package/web-ui/partials/index/panel-usage.html +71 -304
  30. package/web-ui/styles/controls-forms.css +11 -0
  31. package/web-ui/styles/docs-panel.css +57 -83
  32. package/web-ui/styles/layout-shell.css +26 -24
  33. package/web-ui/styles/modals-core.css +33 -0
  34. package/web-ui/styles/responsive.css +5 -67
  35. package/web-ui/styles/sessions-list.css +274 -8
  36. package/web-ui/styles/sessions-toolbar-trash.css +185 -15
  37. package/web-ui/styles/sessions-usage.css +336 -788
@@ -19,20 +19,250 @@
19
19
  opacity: 0.18;
20
20
  }
21
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
+ /* ---- 列表 ---- */
22
106
  .trash-list {
23
- display: grid;
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;
24
130
  gap: 12px;
25
- margin-top: 12px;
26
131
  }
27
132
 
28
- .trash-item.session-item {
29
- min-height: auto;
30
- height: auto;
31
- cursor: default;
32
- content-visibility: visible;
33
- contain-intrinsic-size: auto;
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;
34
203
  }
35
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
+
36
266
  .trash-item.session-item:hover,
37
267
  .trash-item.session-item:active {
38
268
  transform: none;
@@ -415,3 +645,39 @@
415
645
  position: relative;
416
646
  transition: box-shadow var(--transition-normal) var(--ease-spring-soft);
417
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
+ }
@@ -120,7 +120,137 @@
120
120
  border-color: var(--color-brand);
121
121
  }
122
122
 
123
- .session-source-select,
123
+ /* ===== Session source pill bar ===== */
124
+ .session-source-pills {
125
+ display: flex;
126
+ gap: 4px;
127
+ padding: 3px;
128
+ border-radius: var(--radius-md);
129
+ background: var(--color-surface-alt);
130
+ border: 1px solid var(--color-border-soft);
131
+ }
132
+
133
+ .session-source-pill {
134
+ display: inline-flex;
135
+ align-items: center;
136
+ gap: 6px;
137
+ padding: 6px 12px;
138
+ border-radius: var(--radius-sm);
139
+ border: none;
140
+ background: transparent;
141
+ color: var(--color-text-tertiary);
142
+ font-size: var(--font-size-secondary);
143
+ font-family: var(--font-family);
144
+ font-weight: var(--font-weight-secondary);
145
+ cursor: pointer;
146
+ transition: all var(--transition-fast) var(--ease-spring);
147
+ outline: none;
148
+ white-space: nowrap;
149
+ user-select: none;
150
+ -webkit-tap-highlight-color: transparent;
151
+ }
152
+
153
+ .session-source-pill:hover:not(:disabled) {
154
+ color: var(--color-text-secondary);
155
+ background: var(--color-surface);
156
+ }
157
+
158
+ .session-source-pill:active:not(:disabled) {
159
+ transform: scale(0.97);
160
+ }
161
+
162
+ .session-source-pill.active {
163
+ color: #fff;
164
+ background: var(--color-brand);
165
+ box-shadow: 0 1px 3px rgba(200, 121, 99, 0.35);
166
+ font-weight: var(--font-weight-primary);
167
+ }
168
+
169
+ .session-source-pill.active .session-source-pill-dot {
170
+ background: rgba(255,255,255,0.9);
171
+ box-shadow: 0 0 0 1px rgba(255,255,255,0.3);
172
+ }
173
+
174
+ .session-source-pill:focus-visible {
175
+ box-shadow: 0 0 0 2px var(--color-brand-light);
176
+ }
177
+
178
+ .session-source-pill:disabled {
179
+ opacity: 0.5;
180
+ cursor: not-allowed;
181
+ }
182
+
183
+ .session-source-pill-dot {
184
+ width: 7px;
185
+ height: 7px;
186
+ border-radius: 50%;
187
+ background: var(--color-text-muted);
188
+ flex-shrink: 0;
189
+ transition: all var(--transition-fast) var(--ease-spring);
190
+ }
191
+
192
+ .session-source-pill[data-source="codex"] .session-source-pill-dot {
193
+ background: #D26B5A;
194
+ }
195
+ .session-source-pill[data-source="claude"] .session-source-pill-dot {
196
+ background: #D97757;
197
+ }
198
+ .session-source-pill[data-source="gemini"] .session-source-pill-dot {
199
+ background: #5B8C5A;
200
+ }
201
+ .session-source-pill[data-source="codebuddy"] .session-source-pill-dot {
202
+ background: #6B8EB5;
203
+ }
204
+
205
+ .session-source-pill-label {
206
+ font-size: var(--font-size-secondary);
207
+ line-height: 1;
208
+ }
209
+
210
+ /* ===== Session card source badge ===== */
211
+ .session-source {
212
+ display: inline-flex;
213
+ align-items: center;
214
+ gap: 4px;
215
+ font-size: var(--font-size-caption);
216
+ font-weight: var(--font-weight-caption);
217
+ border-radius: 999px;
218
+ padding: 2px 8px;
219
+ white-space: nowrap;
220
+ background: var(--color-surface-alt);
221
+ color: var(--color-text-tertiary);
222
+ border: 1px solid var(--color-border-soft);
223
+ transition: all var(--transition-fast) var(--ease-spring);
224
+ }
225
+
226
+ .session-source[data-source="codex"],
227
+ .session-source.codex {
228
+ background: rgba(210, 107, 90, 0.08);
229
+ color: #B54A3A;
230
+ border-color: rgba(210, 107, 90, 0.2);
231
+ }
232
+
233
+ .session-source[data-source="claude"],
234
+ .session-source.claude {
235
+ background: rgba(217, 119, 87, 0.08);
236
+ color: #B55A3A;
237
+ border-color: rgba(217, 119, 87, 0.2);
238
+ }
239
+
240
+ .session-source[data-source="gemini"],
241
+ .session-source.gemini {
242
+ background: rgba(91, 140, 90, 0.08);
243
+ color: #3A6B38;
244
+ border-color: rgba(91, 140, 90, 0.2);
245
+ }
246
+
247
+ .session-source[data-source="codebuddy"],
248
+ .session-source.codebuddy {
249
+ background: rgba(107, 142, 181, 0.08);
250
+ color: #3A5A7A;
251
+ border-color: rgba(107, 142, 181, 0.2);
252
+ }
253
+
124
254
  .session-path-select,
125
255
  .session-query-input,
126
256
  .session-role-select,
@@ -144,18 +274,17 @@
144
274
  }
145
275
 
146
276
  @media (min-width: 980px) {
147
- /* Wider screens: align left/right control groups, keep query spanning full width. */
148
277
  .session-toolbar {
149
278
  grid-template-columns: repeat(12, minmax(0, 1fr));
150
279
  gap: 10px;
151
280
  }
152
281
 
153
282
  .session-toolbar-primary {
154
- grid-column: span 6;
283
+ grid-column: span 7;
155
284
  }
156
285
 
157
286
  .session-toolbar-secondary {
158
- grid-column: span 6;
287
+ grid-column: span 5;
159
288
  justify-content: flex-end;
160
289
  }
161
290
 
@@ -164,7 +293,6 @@
164
293
  }
165
294
  }
166
295
 
167
- .session-source-select:hover,
168
296
  .session-path-select:hover,
169
297
  .session-query-input:hover,
170
298
  .session-role-select:hover,
@@ -172,7 +300,6 @@
172
300
  border-color: var(--color-border-strong);
173
301
  }
174
302
 
175
- .session-source-select:focus,
176
303
  .session-path-select:focus,
177
304
  .session-query-input:focus,
178
305
  .session-role-select:focus,
@@ -218,15 +345,7 @@
218
345
  flex-shrink: 0;
219
346
  }
220
347
 
221
- .session-source {
222
- font-size: var(--font-size-caption);
223
- color: var(--color-text-tertiary);
224
- border: 1px solid var(--color-border-soft);
225
- border-radius: 999px;
226
- padding: 2px 8px;
227
- background: var(--color-surface-alt);
228
- white-space: nowrap;
229
- }
348
+ /* .session-source now defined above with per-source colors */
230
349
 
231
350
  .session-derived-badge {
232
351
  display: inline-flex;
@@ -346,3 +465,54 @@
346
465
  cursor: not-allowed;
347
466
  transform: none;
348
467
  }
468
+
469
+ .btn-icon-sm {
470
+ width: 16px;
471
+ height: 16px;
472
+ flex-shrink: 0;
473
+ }
474
+
475
+ /* ===== Session match badges ===== */
476
+ .session-match-badge {
477
+ display: inline-flex;
478
+ align-items: center;
479
+ justify-content: center;
480
+ min-width: 18px;
481
+ height: 18px;
482
+ padding: 0 5px;
483
+ border-radius: 999px;
484
+ background: var(--color-brand-light);
485
+ color: var(--color-brand-dark);
486
+ font-size: 10px;
487
+ font-weight: 600;
488
+ line-height: 1;
489
+ flex-shrink: 0;
490
+ }
491
+
492
+ .session-match-snippets {
493
+ margin-top: 4px;
494
+ grid-column: 1 / -1;
495
+ }
496
+
497
+ .session-match-snippet {
498
+ font-size: var(--font-size-caption);
499
+ color: var(--color-text-tertiary);
500
+ line-height: 1.35;
501
+ padding: 3px 8px;
502
+ margin-bottom: 2px;
503
+ background: var(--color-surface-alt);
504
+ border-radius: var(--radius-sm);
505
+ border-left: 2px solid var(--color-brand-light);
506
+ overflow: hidden;
507
+ text-overflow: ellipsis;
508
+ white-space: nowrap;
509
+ max-width: 100%;
510
+ }
511
+
512
+ /* ===== Session preview match highlight ===== */
513
+ .session-msg-content mark {
514
+ background: rgba(200, 121, 99, 0.18);
515
+ color: var(--color-brand-dark);
516
+ border-radius: 2px;
517
+ padding: 0 1px;
518
+ }