codexmate 0.0.55 → 0.0.57

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 (49) hide show
  1. package/README.md +2 -0
  2. package/README.vi.md +2 -0
  3. package/README.zh.md +2 -0
  4. package/cli/local-bridge.js +221 -22
  5. package/cli.js +797 -134
  6. package/lib/task-orchestrator.js +90 -21
  7. package/lib/task-workspace-chat.js +292 -0
  8. package/package.json +2 -2
  9. package/web-ui/app.js +57 -129
  10. package/web-ui/modules/app.computed.main-tabs.mjs +304 -7
  11. package/web-ui/modules/app.computed.session.mjs +210 -0
  12. package/web-ui/modules/app.methods.agents.mjs +3 -0
  13. package/web-ui/modules/app.methods.claude-config.mjs +178 -22
  14. package/web-ui/modules/app.methods.codex-config.mjs +294 -65
  15. package/web-ui/modules/app.methods.navigation.mjs +71 -84
  16. package/web-ui/modules/app.methods.openclaw-editing.mjs +3 -6
  17. package/web-ui/modules/app.methods.providers.mjs +15 -1
  18. package/web-ui/modules/app.methods.runtime.mjs +7 -2
  19. package/web-ui/modules/app.methods.session-actions.mjs +25 -12
  20. package/web-ui/modules/app.methods.session-browser.mjs +23 -54
  21. package/web-ui/modules/app.methods.session-trash.mjs +0 -1
  22. package/web-ui/modules/app.methods.startup-claude.mjs +35 -17
  23. package/web-ui/modules/app.methods.task-orchestration.mjs +347 -8
  24. package/web-ui/modules/app.methods.tool-config-permissions.mjs +0 -3
  25. package/web-ui/modules/app.methods.web-ui-preferences.mjs +415 -68
  26. package/web-ui/modules/config-template-confirm-pref.mjs +2 -3
  27. package/web-ui/modules/i18n/locales/en.mjs +187 -28
  28. package/web-ui/modules/i18n/locales/ja.mjs +184 -25
  29. package/web-ui/modules/i18n/locales/vi.mjs +186 -33
  30. package/web-ui/modules/i18n/locales/zh-tw.mjs +187 -28
  31. package/web-ui/modules/i18n/locales/zh.mjs +189 -30
  32. package/web-ui/modules/i18n.mjs +5 -12
  33. package/web-ui/modules/provider-default-names.mjs +25 -0
  34. package/web-ui/modules/sessions-filters-url.mjs +1 -2
  35. package/web-ui/partials/index/layout-header.html +37 -14
  36. package/web-ui/partials/index/modal-health-check.html +69 -5
  37. package/web-ui/partials/index/panel-config-codex.html +2 -2
  38. package/web-ui/partials/index/panel-orchestration.html +489 -282
  39. package/web-ui/partials/index/panel-sessions.html +97 -17
  40. package/web-ui/res/web-ui-render.precompiled.js +1423 -732
  41. package/web-ui/session-helpers.mjs +4 -1
  42. package/web-ui/styles/layout-shell.css +157 -1
  43. package/web-ui/styles/navigation-panels.css +11 -0
  44. package/web-ui/styles/responsive.css +98 -0
  45. package/web-ui/styles/sessions-preview.css +212 -2
  46. package/web-ui/styles/sessions-toolbar-trash.css +61 -18
  47. package/web-ui/styles/skills-list.css +122 -0
  48. package/web-ui/styles/task-orchestration.css +2161 -4
  49. package/web-ui/styles/titles-cards.css +52 -0
@@ -478,7 +478,10 @@ export async function loadActiveSessionDetail(api, options = {}) {
478
478
  const nextLimit = Math.min(currentLimit + fetchStep, limitCap);
479
479
  if (nextLimit <= currentLimit) return;
480
480
  this.sessionDetailMessageLimit = nextLimit;
481
- this.sessionPreviewPendingVisibleCount = nextLimit;
481
+ const currentVisible = Number(this.sessionPreviewVisibleCount);
482
+ this.sessionPreviewPendingVisibleCount = Number.isFinite(currentVisible)
483
+ ? Math.max(0, Math.floor(currentVisible))
484
+ : 0;
482
485
  void this.loadActiveSessionDetail({ preserveVisibleCount: true });
483
486
  });
484
487
  }
@@ -21,6 +21,7 @@ body::after {
21
21
 
22
22
  :root {
23
23
  --side-rail-width: 248px;
24
+ --side-rail-collapsed-width: 136px;
24
25
  }
25
26
 
26
27
  /* ============================================
@@ -28,7 +29,7 @@ body::after {
28
29
  ============================================ */
29
30
  .app-shell {
30
31
  display: grid;
31
- grid-template-columns: 248px minmax(0, 1fr);
32
+ grid-template-columns: var(--side-rail-width, 248px) minmax(0, 1fr);
32
33
  gap: 0;
33
34
  align-items: stretch;
34
35
  min-height: 100vh;
@@ -37,6 +38,10 @@ body::after {
37
38
  background: transparent;
38
39
  }
39
40
 
41
+ .app-shell.sidebar-collapsed {
42
+ --side-rail-width: var(--side-rail-collapsed-width, 136px);
43
+ }
44
+
40
45
  .app-shell.standalone {
41
46
  grid-template-columns: 1fr;
42
47
  }
@@ -58,6 +63,40 @@ body::after {
58
63
  scrollbar-width: none;
59
64
  -ms-overflow-style: none;
60
65
  backdrop-filter: blur(18px) saturate(130%);
66
+ width: var(--side-rail-width, 248px);
67
+ transition: width 180ms var(--ease-out-expo), padding 180ms var(--ease-out-expo);
68
+ }
69
+
70
+ .side-rail-collapse-toggle {
71
+ position: absolute;
72
+ top: 50%;
73
+ right: -13px;
74
+ z-index: 5;
75
+ width: 26px;
76
+ height: 26px;
77
+ border-radius: 999px;
78
+ border: 1px solid rgba(137, 111, 94, 0.18);
79
+ background: rgba(255, 253, 250, 0.96);
80
+ color: var(--color-text-secondary);
81
+ box-shadow: 0 8px 18px rgba(92, 68, 52, 0.10);
82
+ cursor: pointer;
83
+ display: inline-flex;
84
+ align-items: center;
85
+ justify-content: center;
86
+ font-size: 18px;
87
+ line-height: 1;
88
+ transform: translateY(-50%);
89
+ transition: color 160ms var(--ease-out-expo), border-color 160ms var(--ease-out-expo), transform 160ms var(--ease-out-expo);
90
+ }
91
+
92
+ .side-rail-collapse-toggle:hover {
93
+ color: var(--color-brand-dark);
94
+ border-color: rgba(200, 121, 99, 0.35);
95
+ transform: translate(-1px, -50%);
96
+ }
97
+
98
+ .sidebar-collapsed .side-rail-collapse-toggle:hover {
99
+ transform: translate(1px, -50%);
61
100
  }
62
101
 
63
102
  .side-rail::-webkit-scrollbar {
@@ -80,6 +119,7 @@ body::after {
80
119
  flex-direction: column;
81
120
  flex: 1 1 auto;
82
121
  gap: 0;
122
+ padding-bottom: 64px;
83
123
  overflow-y: auto;
84
124
  scrollbar-width: none;
85
125
  -ms-overflow-style: none;
@@ -356,6 +396,19 @@ body::after {
356
396
  position: relative;
357
397
  }
358
398
 
399
+ .side-item-icon {
400
+ display: none;
401
+ width: 28px;
402
+ height: 28px;
403
+ border-radius: 10px;
404
+ align-items: center;
405
+ justify-content: center;
406
+ font-size: 15px;
407
+ font-weight: 700;
408
+ line-height: 1;
409
+ color: currentColor;
410
+ }
411
+
359
412
  .side-item::before {
360
413
  content: "";
361
414
  position: absolute;
@@ -374,6 +427,17 @@ body::after {
374
427
  transform: translateX(2px);
375
428
  }
376
429
 
430
+ .side-item.side-item-disabled,
431
+ .side-item.side-item-disabled:hover {
432
+ border-color: transparent;
433
+ background: transparent;
434
+ color: var(--color-text-muted);
435
+ cursor: not-allowed;
436
+ opacity: 0.62;
437
+ transform: none;
438
+ box-shadow: none;
439
+ }
440
+
377
441
  .side-item.active,
378
442
  .side-item.nav-intent-active {
379
443
  border-color: rgba(200, 121, 99, 0.22);
@@ -438,6 +502,98 @@ body::after {
438
502
  flex: 0 0 auto;
439
503
  }
440
504
 
505
+ .sidebar-collapsed .side-rail {
506
+ padding: 14px 8px;
507
+ }
508
+
509
+ .sidebar-collapsed .brand-block {
510
+ padding: 14px 6px 16px;
511
+ align-items: stretch;
512
+ }
513
+
514
+ .sidebar-collapsed .brand-head {
515
+ justify-content: flex-start;
516
+ gap: 8px;
517
+ }
518
+
519
+ .sidebar-collapsed .side-item-meta {
520
+ display: none;
521
+ }
522
+
523
+ .sidebar-collapsed .brand-copy,
524
+ .sidebar-collapsed .side-update-copy {
525
+ display: flex;
526
+ }
527
+
528
+ .sidebar-collapsed .brand-kicker {
529
+ font-size: 13px;
530
+ white-space: nowrap;
531
+ }
532
+
533
+ .sidebar-collapsed .side-update-notice {
534
+ padding: 7px 8px;
535
+ gap: 6px;
536
+ }
537
+
538
+ .sidebar-collapsed .side-section {
539
+ padding: 5px 0;
540
+ align-items: stretch;
541
+ }
542
+
543
+ .sidebar-collapsed .side-section + .side-section {
544
+ border-top-color: rgba(137, 111, 94, 0.06);
545
+ }
546
+
547
+ .sidebar-collapsed .side-item {
548
+ width: 100%;
549
+ min-height: 36px;
550
+ padding: 8px 10px;
551
+ align-items: center;
552
+ justify-content: center;
553
+ text-align: center;
554
+ gap: 0;
555
+ border-radius: 14px;
556
+ }
557
+
558
+ .sidebar-collapsed .side-item-icon {
559
+ display: none;
560
+ }
561
+
562
+ .sidebar-collapsed .side-section-title {
563
+ display: block;
564
+ padding: 0 10px;
565
+ margin: 4px 0 5px;
566
+ text-align: left;
567
+ white-space: nowrap;
568
+ }
569
+
570
+ .sidebar-collapsed .side-item-title {
571
+ display: block;
572
+ max-width: 100%;
573
+ white-space: nowrap;
574
+ font-size: 12px;
575
+ line-height: 1.2;
576
+ }
577
+
578
+ .sidebar-collapsed .side-item::before {
579
+ left: -3px;
580
+ }
581
+
582
+ .sidebar-collapsed .side-rail-lang {
583
+ padding-inline: 4px;
584
+ }
585
+
586
+ .sidebar-collapsed .side-rail-lang-actions {
587
+ justify-content: center;
588
+ width: calc(100% - 8px);
589
+ }
590
+
591
+ .sidebar-collapsed .side-rail-lang .language-settings-link {
592
+ display: inline-flex;
593
+ padding-inline: 10px;
594
+ font-size: 12px;
595
+ }
596
+
441
597
  @media (min-width: 721px) {
442
598
  body:not(.force-compact) #app > .top-tabs {
443
599
  display: none;
@@ -305,6 +305,17 @@
305
305
  transform: translateY(-1px);
306
306
  }
307
307
 
308
+ .top-tab.top-tab-disabled,
309
+ .top-tab.top-tab-disabled:hover {
310
+ border-color: var(--color-border-soft);
311
+ background: rgba(255, 255, 255, 0.38);
312
+ color: var(--color-text-muted);
313
+ cursor: not-allowed;
314
+ opacity: 0.64;
315
+ transform: none;
316
+ box-shadow: none;
317
+ }
318
+
308
319
  .top-tab.active,
309
320
  .top-tab.nav-intent-active {
310
321
  border-color: rgba(200, 121, 99, 0.28);
@@ -274,6 +274,8 @@ textarea:focus-visible {
274
274
  }
275
275
  .main-panel {
276
276
  padding: 0 10px 12px;
277
+ max-width: 100%;
278
+ overflow-x: hidden;
277
279
  }
278
280
 
279
281
  .main-panel-topbar {
@@ -286,6 +288,35 @@ textarea:focus-visible {
286
288
  grid-template-columns: 1fr;
287
289
  height: auto;
288
290
  min-height: 0;
291
+ max-width: 100%;
292
+ overflow-x: hidden;
293
+ }
294
+
295
+ .session-toolbar,
296
+ .session-toolbar-group,
297
+ .session-toolbar-primary,
298
+ .session-toolbar-secondary,
299
+ .session-toolbar-grow,
300
+ .session-list,
301
+ .session-preview,
302
+ .session-preview-scroll,
303
+ .session-preview-body,
304
+ .session-workspace,
305
+ .session-workspace-card,
306
+ .session-item,
307
+ .session-item-main {
308
+ min-width: 0;
309
+ max-width: 100%;
310
+ box-sizing: border-box;
311
+ }
312
+
313
+ .session-toolbar {
314
+ grid-template-columns: minmax(0, 1fr);
315
+ overflow-x: hidden;
316
+ }
317
+
318
+ .session-toolbar-group {
319
+ width: 100%;
289
320
  }
290
321
 
291
322
  .status-strip {
@@ -400,6 +431,13 @@ textarea:focus-visible {
400
431
  padding: 8px;
401
432
  }
402
433
 
434
+ #panel-config-provider .card-list > .card,
435
+ #panel-config-claude .card-list > .card {
436
+ min-height: 84px;
437
+ padding-top: 18px;
438
+ padding-bottom: 18px;
439
+ }
440
+
403
441
  .card-list {
404
442
  gap: 4px;
405
443
  margin-bottom: 4px;
@@ -477,6 +515,66 @@ textarea:focus-visible {
477
515
 
478
516
  .session-preview {
479
517
  border-radius: var(--radius-lg);
518
+ overflow: hidden;
519
+ }
520
+
521
+ .session-preview-header {
522
+ padding: 12px;
523
+ gap: 10px;
524
+ max-width: 100%;
525
+ box-sizing: border-box;
526
+ overflow: hidden;
527
+ }
528
+
529
+ .session-preview-header > div:first-child {
530
+ width: 100%;
531
+ min-width: 0;
532
+ }
533
+
534
+ .session-preview-meta {
535
+ min-width: 0;
536
+ }
537
+
538
+ .session-preview-meta-item {
539
+ min-width: 0;
540
+ max-width: 100%;
541
+ white-space: normal;
542
+ overflow-wrap: anywhere;
543
+ }
544
+
545
+ .session-preview-title {
546
+ -webkit-line-clamp: 3;
547
+ overflow-wrap: anywhere;
548
+ }
549
+
550
+ .session-actions {
551
+ display: grid;
552
+ grid-template-columns: repeat(4, minmax(0, 1fr));
553
+ width: 100%;
554
+ gap: 6px;
555
+ justify-content: stretch;
556
+ }
557
+
558
+ .session-link-group {
559
+ display: contents;
560
+ }
561
+
562
+ .session-actions .btn-session-export,
563
+ .session-actions .btn-session-open,
564
+ .session-actions .btn-session-refresh,
565
+ .session-actions .btn-session-delete,
566
+ .session-link-group .btn-session-open {
567
+ width: 100%;
568
+ min-width: 0;
569
+ height: 40px;
570
+ }
571
+
572
+ .session-preview-body {
573
+ padding: 12px;
574
+ }
575
+
576
+ .session-workspace {
577
+ border-radius: 14px;
480
578
  }
481
579
 
482
580
  .skills-summary-strip {
@@ -9,6 +9,8 @@
9
9
  overflow-y: auto;
10
10
  overflow-x: hidden;
11
11
  padding-right: 52px;
12
+ padding-bottom: 28px;
13
+ scroll-padding-bottom: 40px;
12
14
  display: flex;
13
15
  flex-direction: column;
14
16
  scrollbar-width: none;
@@ -100,6 +102,7 @@
100
102
  flex: 1;
101
103
  min-height: 0;
102
104
  padding: var(--spacing-md);
105
+ padding-bottom: calc(var(--spacing-md) + 20px);
103
106
  display: flex;
104
107
  flex-direction: column;
105
108
  gap: 12px;
@@ -110,9 +113,146 @@
110
113
  display: flex;
111
114
  flex-direction: column;
112
115
  gap: 12px;
116
+ padding-bottom: 28px;
113
117
  contain: layout style;
114
118
  }
115
119
 
120
+ .session-workspace {
121
+ border: 1px solid rgba(88, 94, 112, 0.12);
122
+ border-radius: 18px;
123
+ background:
124
+ linear-gradient(135deg, rgba(255, 255, 255, 0.94), rgba(251, 247, 244, 0.9)),
125
+ var(--color-surface-elevated);
126
+ box-shadow: 0 14px 34px rgba(50, 38, 30, 0.08);
127
+ padding: 16px;
128
+ display: flex;
129
+ flex-direction: column;
130
+ gap: 14px;
131
+ }
132
+
133
+ .session-workspace-header {
134
+ display: flex;
135
+ align-items: flex-start;
136
+ justify-content: space-between;
137
+ gap: 12px;
138
+ }
139
+
140
+ .session-workspace-kicker {
141
+ font-size: 11px;
142
+ font-weight: 700;
143
+ letter-spacing: 0.08em;
144
+ color: var(--color-brand);
145
+ text-transform: uppercase;
146
+ }
147
+
148
+ .session-workspace-title {
149
+ margin: 2px 0 0;
150
+ font-size: 16px;
151
+ line-height: 1.35;
152
+ color: var(--color-text-primary);
153
+ }
154
+
155
+ .session-workspace-subtitle {
156
+ margin: 4px 0 0;
157
+ color: var(--color-text-tertiary);
158
+ font-size: var(--font-size-caption);
159
+ line-height: 1.45;
160
+ }
161
+
162
+ .session-workspace-metrics {
163
+ display: grid;
164
+ grid-template-columns: repeat(6, minmax(0, 1fr));
165
+ gap: 8px;
166
+ }
167
+
168
+ .session-workspace-metric {
169
+ min-width: 0;
170
+ border: 1px solid var(--color-border-soft);
171
+ border-radius: 12px;
172
+ background: rgba(255, 255, 255, 0.72);
173
+ padding: 10px;
174
+ }
175
+
176
+ .session-workspace-metric-value {
177
+ display: block;
178
+ font-size: 18px;
179
+ line-height: 1.1;
180
+ font-weight: 750;
181
+ color: var(--color-text-primary);
182
+ }
183
+
184
+ .session-workspace-metric-label {
185
+ display: block;
186
+ margin-top: 4px;
187
+ font-size: 11px;
188
+ line-height: 1.2;
189
+ color: var(--color-text-tertiary);
190
+ overflow: hidden;
191
+ white-space: nowrap;
192
+ text-overflow: ellipsis;
193
+ }
194
+
195
+ .session-workspace-grid {
196
+ display: grid;
197
+ grid-template-columns: repeat(2, minmax(0, 1fr));
198
+ gap: 10px;
199
+ }
200
+
201
+ .session-workspace-card {
202
+ min-width: 0;
203
+ border: 1px solid var(--color-border-soft);
204
+ border-radius: 14px;
205
+ background: rgba(255, 255, 255, 0.7);
206
+ padding: 12px;
207
+ }
208
+
209
+ .session-workspace-card-wide {
210
+ grid-column: 1 / -1;
211
+ }
212
+
213
+ .session-workspace-card-alert {
214
+ border-color: rgba(210, 107, 90, 0.28);
215
+ background: rgba(210, 107, 90, 0.06);
216
+ }
217
+
218
+ .session-workspace-card-title {
219
+ font-size: 12px;
220
+ font-weight: 720;
221
+ color: var(--color-text-primary);
222
+ margin-bottom: 8px;
223
+ }
224
+
225
+ .session-workspace-list {
226
+ margin: 0;
227
+ padding-left: 17px;
228
+ display: flex;
229
+ flex-direction: column;
230
+ gap: 6px;
231
+ color: var(--color-text-secondary);
232
+ font-size: var(--font-size-caption);
233
+ line-height: 1.45;
234
+ }
235
+
236
+ .session-workspace-list li {
237
+ min-width: 0;
238
+ overflow-wrap: anywhere;
239
+ }
240
+
241
+ .session-workspace-code-list code {
242
+ font-size: 11px;
243
+ line-height: 1.4;
244
+ color: var(--color-text-primary);
245
+ background: rgba(35, 39, 47, 0.06);
246
+ border-radius: 6px;
247
+ padding: 2px 5px;
248
+ }
249
+
250
+ .session-workspace-empty {
251
+ color: var(--color-text-tertiary);
252
+ font-size: var(--font-size-caption);
253
+ line-height: 1.45;
254
+ }
255
+
116
256
  .session-timeline {
117
257
  position: absolute;
118
258
  top: var(--session-preview-header-offset, 72px);
@@ -307,6 +447,17 @@
307
447
  word-break: break-word;
308
448
  }
309
449
 
450
+ .session-preview-load-more {
451
+ display: flex;
452
+ align-items: center;
453
+ justify-content: center;
454
+ gap: 10px;
455
+ padding: 10px 0 8px;
456
+ margin-bottom: 18px;
457
+ color: var(--color-text-tertiary);
458
+ font-size: var(--font-size-caption);
459
+ }
460
+
310
461
  .session-preview-empty {
311
462
  flex: 1;
312
463
  display: flex;
@@ -380,6 +531,14 @@
380
531
  justify-content: flex-start;
381
532
  }
382
533
 
534
+ .session-workspace-metrics {
535
+ grid-template-columns: repeat(3, minmax(0, 1fr));
536
+ }
537
+
538
+ .session-workspace-grid {
539
+ grid-template-columns: 1fr;
540
+ }
541
+
383
542
  .session-preview.active {
384
543
  box-shadow: var(--shadow-float);
385
544
  }
@@ -402,10 +561,24 @@
402
561
  }
403
562
 
404
563
  .btn-session-refresh,
405
- .btn-session-export {
564
+ .btn-session-export,
565
+ .btn-session-open {
406
566
  width: 100%;
407
567
  }
408
568
 
569
+ .session-workspace {
570
+ padding: 12px;
571
+ }
572
+
573
+ .session-workspace-header {
574
+ flex-direction: column;
575
+ align-items: stretch;
576
+ }
577
+
578
+ .session-workspace-metrics {
579
+ grid-template-columns: repeat(2, minmax(0, 1fr));
580
+ }
581
+
409
582
  .session-toolbar-group.session-toolbar-actions {
410
583
  flex-direction: column;
411
584
  align-items: stretch;
@@ -415,6 +588,44 @@
415
588
  width: 100%;
416
589
  }
417
590
 
591
+ .session-toolbar-group {
592
+ align-items: stretch;
593
+ }
594
+
595
+ .session-source-pills {
596
+ max-width: 100%;
597
+ overflow-x: auto;
598
+ flex-wrap: nowrap;
599
+ scrollbar-width: none;
600
+ }
601
+
602
+ .session-source-pills::-webkit-scrollbar {
603
+ display: none;
604
+ }
605
+
606
+ .session-path-select,
607
+ .session-query-input,
608
+ .session-role-select,
609
+ .session-time-select {
610
+ width: 100%;
611
+ min-width: 0;
612
+ }
613
+
614
+ .session-toolbar-footer {
615
+ flex-wrap: wrap;
616
+ align-items: stretch;
617
+ justify-content: flex-start;
618
+ }
619
+
620
+ .session-toolbar-footer .quick-option {
621
+ flex: 1 1 calc(50% - 6px);
622
+ text-align: center;
623
+ }
624
+
625
+ .session-filter-chip-value {
626
+ max-width: 180px;
627
+ }
628
+
418
629
  .trash-item-header {
419
630
  flex-direction: column;
420
631
  align-items: stretch;
@@ -460,4 +671,3 @@
460
671
  transform: none;
461
672
  box-shadow: none;
462
673
  }
463
-