codexmate 0.0.38 → 0.0.39

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 (34) hide show
  1. package/cli/builtin-proxy.js +626 -207
  2. package/cli/openai-bridge.js +541 -210
  3. package/cli.js +19 -1
  4. package/package.json +1 -1
  5. package/web-ui/app.js +12 -3
  6. package/web-ui/modules/app.computed.main-tabs.mjs +37 -30
  7. package/web-ui/modules/app.methods.claude-config.mjs +111 -9
  8. package/web-ui/modules/app.methods.openclaw-editing.mjs +48 -0
  9. package/web-ui/modules/app.methods.openclaw-persist.mjs +13 -7
  10. package/web-ui/modules/app.methods.providers.mjs +36 -10
  11. package/web-ui/modules/app.methods.runtime.mjs +76 -1
  12. package/web-ui/modules/app.methods.startup-claude.mjs +1 -0
  13. package/web-ui/modules/config-mode.computed.mjs +3 -3
  14. package/web-ui/modules/i18n.dict.mjs +13 -0
  15. package/web-ui/modules/i18n.mjs +65 -16
  16. package/web-ui/partials/index/layout-header.html +16 -46
  17. package/web-ui/partials/index/modal-openclaw-config.html +135 -71
  18. package/web-ui/partials/index/modal-webhook.html +8 -8
  19. package/web-ui/partials/index/modals-basic.html +56 -16
  20. package/web-ui/partials/index/panel-config-claude.html +20 -20
  21. package/web-ui/partials/index/panel-config-codex.html +5 -5
  22. package/web-ui/partials/index/panel-config-openclaw.html +70 -64
  23. package/web-ui/partials/index/panel-dashboard.html +62 -77
  24. package/web-ui/partials/index/panel-settings.html +28 -7
  25. package/web-ui/partials/index/panel-trash.html +14 -14
  26. package/web-ui/res/web-ui-render.precompiled.js +846 -539
  27. package/web-ui/styles/controls-forms.css +6 -0
  28. package/web-ui/styles/dashboard.css +46 -14
  29. package/web-ui/styles/layout-shell.css +45 -0
  30. package/web-ui/styles/navigation-panels.css +3 -3
  31. package/web-ui/styles/openclaw-structured.css +383 -33
  32. package/web-ui/styles/responsive.css +68 -0
  33. package/web-ui/styles/sessions-usage.css +105 -9
  34. package/web-ui/styles/settings-panel.css +4 -0
@@ -406,6 +406,12 @@
406
406
  font-size: 12px;
407
407
  }
408
408
 
409
+ .btn-sm {
410
+ min-height: 32px;
411
+ padding: 6px 12px;
412
+ font-size: 12px;
413
+ }
414
+
409
415
  .selector-header .btn-tool-compact {
410
416
  display: inline-flex;
411
417
  align-items: center;
@@ -4,8 +4,9 @@
4
4
 
5
5
  .doctor-grid {
6
6
  display: grid;
7
- grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
7
+ grid-template-columns: repeat(auto-fit, minmax(210px, 1fr));
8
8
  gap: 12px;
9
+ margin-top: 12px;
9
10
  }
10
11
 
11
12
  .doctor-card {
@@ -78,8 +79,8 @@
78
79
  -webkit-line-clamp: 2;
79
80
  overflow-wrap: anywhere;
80
81
  word-break: break-word;
81
- justify-self: center;
82
- text-align: center;
82
+ justify-self: start;
83
+ text-align: left;
83
84
  }
84
85
 
85
86
  .doctor-kv-error {
@@ -90,11 +91,11 @@
90
91
  }
91
92
 
92
93
  .doctor-status-row {
93
- margin-top: 12px;
94
+ margin-top: 4px;
94
95
  display: flex;
95
96
  flex-wrap: wrap;
96
97
  gap: 10px;
97
- justify-content: center;
98
+ justify-content: flex-start;
98
99
  }
99
100
 
100
101
  .doctor-status-chip {
@@ -135,12 +136,12 @@
135
136
  }
136
137
 
137
138
  .doctor-health-result {
138
- margin-top: 14px;
139
+ margin-top: 12px;
139
140
  border-radius: var(--radius-lg);
140
141
  border: 1px solid var(--color-border-soft);
141
142
  padding: 12px 12px 10px;
142
143
  background: rgba(255, 255, 255, 0.78);
143
- text-align: center;
144
+ text-align: left;
144
145
  }
145
146
 
146
147
  .doctor-health-result.ok {
@@ -158,8 +159,7 @@
158
159
  .doctor-health-title {
159
160
  font-weight: var(--font-weight-secondary);
160
161
  color: var(--color-text-primary);
161
- margin-bottom: 8px;
162
- text-align: center;
162
+ text-align: left;
163
163
  }
164
164
 
165
165
  .doctor-health-issues {
@@ -195,13 +195,13 @@
195
195
  background: rgba(255, 255, 255, 0.78);
196
196
  padding: 12px;
197
197
  overflow: hidden;
198
- text-align: center;
198
+ text-align: left;
199
199
  }
200
200
 
201
201
  .doctor-action-head {
202
202
  display: flex;
203
203
  align-items: center;
204
- justify-content: center;
204
+ justify-content: space-between;
205
205
  gap: 10px;
206
206
  flex-wrap: wrap;
207
207
  margin-bottom: 8px;
@@ -215,9 +215,11 @@
215
215
  text-overflow: ellipsis;
216
216
  white-space: nowrap;
217
217
  max-width: 100%;
218
+ flex: 1 1 220px;
218
219
  }
219
220
 
220
221
  .doctor-action-severity {
222
+ flex: 0 0 auto;
221
223
  font-size: var(--font-size-caption);
222
224
  padding: 3px 10px;
223
225
  border-radius: 999px;
@@ -251,26 +253,56 @@
251
253
  overflow-wrap: anywhere;
252
254
  word-break: break-word;
253
255
  max-width: 920px;
254
- margin: 0 auto 10px;
256
+ margin: 0 0 10px;
255
257
  }
256
258
 
257
259
  .doctor-action-buttons {
258
260
  display: flex;
259
261
  flex-wrap: wrap;
260
262
  gap: 8px;
261
- justify-content: center;
263
+ justify-content: flex-start;
262
264
  }
263
265
 
264
266
  .doctor-action-footer {
265
267
  display: flex;
266
- justify-content: center;
268
+ justify-content: flex-start;
269
+ flex-wrap: wrap;
270
+ gap: 8px;
267
271
  margin-top: 2px;
268
272
  }
269
273
 
270
274
  @media (max-width: 520px) {
275
+ .doctor-grid {
276
+ grid-template-columns: 1fr;
277
+ gap: 10px;
278
+ }
279
+
280
+ .doctor-card {
281
+ padding: 12px;
282
+ gap: 6px;
283
+ }
284
+
271
285
  .doctor-card-kv {
272
286
  grid-template-columns: 76px minmax(0, 1fr);
273
287
  }
288
+
289
+ .doctor-status-row {
290
+ gap: 8px;
291
+ }
292
+
293
+ .doctor-status-chip {
294
+ flex: 1 1 120px;
295
+ }
296
+
297
+ .doctor-action-card {
298
+ padding: 10px;
299
+ }
300
+
301
+ .doctor-action-buttons .btn-tool,
302
+ .doctor-action-footer .btn-tool {
303
+ flex: 1 1 150px;
304
+ justify-content: center;
305
+ }
274
306
  }
275
307
 
276
308
  .doctor-providers-health {
@@ -664,3 +664,48 @@ body::after {
664
664
  line-height: 1;
665
665
  box-shadow: 0 2px 6px rgba(200, 121, 99, 0.28);
666
666
  }
667
+
668
+ .language-settings-link {
669
+ display: inline-flex;
670
+ align-items: center;
671
+ justify-content: center;
672
+ gap: 8px;
673
+ min-height: 36px;
674
+ max-width: calc(100% - 16px);
675
+ padding: 8px 14px;
676
+ border-radius: 999px;
677
+ border: 1px solid rgba(163, 146, 134, 0.28);
678
+ background: rgba(255, 253, 252, 0.92);
679
+ color: var(--color-text-secondary);
680
+ font-size: 13px;
681
+ font-weight: 700;
682
+ line-height: 1;
683
+ white-space: nowrap;
684
+ overflow: hidden;
685
+ text-overflow: ellipsis;
686
+ box-shadow: 0 10px 28px rgba(27, 23, 20, 0.12);
687
+ cursor: pointer;
688
+ transition: background-color var(--transition-fast) var(--ease-smooth), border-color var(--transition-fast) var(--ease-smooth), color var(--transition-fast) var(--ease-smooth), transform var(--transition-fast) var(--ease-smooth);
689
+ }
690
+
691
+ .language-settings-link:hover {
692
+ border-color: rgba(200, 121, 99, 0.58);
693
+ background: rgba(255, 255, 255, 0.96);
694
+ color: var(--color-text-primary);
695
+ transform: translateY(-1px);
696
+ }
697
+
698
+ .language-settings-link:active {
699
+ transform: translateY(0);
700
+ }
701
+
702
+ .side-rail-lang .language-settings-link {
703
+ width: calc(100% - 20px);
704
+ box-shadow: none;
705
+ }
706
+
707
+ .lang-fab .language-settings-link {
708
+ pointer-events: auto;
709
+ position: relative;
710
+ z-index: 1;
711
+ }
@@ -170,7 +170,7 @@
170
170
  border: none;
171
171
  border-radius: 0;
172
172
  box-shadow: none;
173
- padding: 0 28px 28px;
173
+ padding: 0 16px 16px;
174
174
  backdrop-filter: none;
175
175
  position: relative;
176
176
  overflow-x: hidden;
@@ -189,8 +189,8 @@
189
189
  position: sticky;
190
190
  top: 0;
191
191
  z-index: 12;
192
- margin: 0 -28px 18px;
193
- padding: 0 28px 14px;
192
+ margin: 0 -16px 18px;
193
+ padding: 0 16px 14px;
194
194
  background: linear-gradient(180deg, var(--color-bg-topbar-strong) 0%, var(--color-bg-topbar-soft) 78%, var(--color-bg-topbar-clear) 100%);
195
195
  backdrop-filter: blur(18px) saturate(130%);
196
196
  }
@@ -1,9 +1,9 @@
1
1
  .quick-section {
2
2
  margin-top: var(--spacing-md);
3
- padding: var(--spacing-sm);
3
+ padding: 0;
4
4
  border-radius: var(--radius-lg);
5
- border: 1px solid var(--color-border-soft);
6
- background: linear-gradient(140deg, rgba(255, 252, 247, 0.95), rgba(255, 255, 255, 0.6));
5
+ border: none;
6
+ background: transparent;
7
7
  }
8
8
 
9
9
  .quick-header {
@@ -27,52 +27,128 @@
27
27
  gap: var(--spacing-xs);
28
28
  }
29
29
 
30
- .quick-steps {
30
+ /* Accordion Stepper */
31
+ .quick-accordion {
31
32
  display: flex;
32
- flex-wrap: wrap;
33
- gap: var(--spacing-xs);
34
- margin-bottom: var(--spacing-sm);
33
+ flex-direction: column;
34
+ gap: 8px;
35
+ margin-top: 16px;
35
36
  }
36
37
 
37
- .quick-step {
38
- display: inline-flex;
39
- align-items: center;
40
- gap: 6px;
41
- padding: 4px 10px;
42
- border-radius: 999px;
43
- border: 1px dashed var(--color-border-soft);
38
+ .accordion-panel {
44
39
  background: var(--color-surface);
45
- font-size: var(--font-size-caption);
46
- color: var(--color-text-secondary);
40
+ border: 1px solid var(--color-border-soft);
41
+ border-radius: var(--radius-md);
42
+ overflow: hidden;
43
+ transition: border-color 0.2s ease, box-shadow 0.2s ease;
44
+ }
45
+
46
+ .accordion-panel.active {
47
+ border-color: rgba(200, 121, 99, 0.25);
48
+ box-shadow: 0 2px 12px rgba(200, 121, 99, 0.08);
49
+ }
50
+
51
+ .accordion-panel.completed {
52
+ border-color: rgba(90, 139, 106, 0.2);
53
+ }
54
+
55
+ .accordion-trigger {
56
+ width: 100%;
57
+ display: flex;
58
+ align-items: center;
59
+ gap: 12px;
60
+ padding: 12px 16px;
61
+ background: transparent;
62
+ border: none;
63
+ cursor: pointer;
64
+ transition: background-color 0.15s ease;
65
+ text-align: left;
66
+ font-family: inherit;
67
+ }
68
+
69
+ .accordion-trigger:hover {
70
+ background: rgba(200, 121, 99, 0.04);
47
71
  }
48
72
 
49
- .step-badge {
50
- width: 20px;
51
- height: 20px;
52
- border-radius: 999px;
53
- display: inline-flex;
73
+ .accordion-step-badge {
74
+ width: 24px;
75
+ height: 24px;
76
+ border-radius: 50%;
77
+ display: flex;
54
78
  align-items: center;
55
79
  justify-content: center;
80
+ background: var(--color-border-soft);
81
+ color: var(--color-text-secondary);
82
+ font-size: 12px;
83
+ font-weight: 600;
84
+ flex-shrink: 0;
85
+ transition: all 0.2s ease;
86
+ }
87
+
88
+ .accordion-panel.active .accordion-step-badge {
56
89
  background: var(--color-brand);
57
90
  color: #fff;
58
- font-size: 12px;
59
- font-weight: var(--font-weight-secondary);
60
91
  }
61
92
 
62
- .quick-grid {
63
- display: grid;
64
- gap: var(--spacing-sm);
65
- grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
93
+ .accordion-panel.completed .accordion-step-badge {
94
+ background: rgba(90, 139, 106, 0.2);
95
+ color: var(--color-success);
66
96
  }
67
97
 
68
- .quick-card {
69
- background: var(--color-surface);
70
- border: 1px solid var(--color-border-soft);
71
- border-radius: var(--radius-sm);
72
- padding: var(--spacing-sm);
73
- box-shadow: var(--shadow-subtle);
98
+ .accordion-title {
99
+ font-size: 13px;
100
+ font-weight: 500;
101
+ color: var(--color-text-primary);
102
+ flex: 1;
103
+ }
104
+
105
+ .accordion-status {
106
+ font-size: 11px;
107
+ color: var(--color-text-tertiary);
108
+ max-width: 200px;
109
+ overflow: hidden;
110
+ text-overflow: ellipsis;
111
+ white-space: nowrap;
112
+ }
113
+
114
+ .accordion-chevron {
115
+ width: 16px;
116
+ height: 16px;
117
+ color: var(--color-text-muted);
118
+ transition: transform 0.2s ease;
119
+ flex-shrink: 0;
120
+ }
121
+
122
+ .accordion-panel.active .accordion-chevron {
123
+ transform: rotate(180deg);
124
+ }
125
+
126
+ .accordion-content {
127
+ padding: 0 16px 16px;
128
+ animation: accordionSlide 0.2s ease;
129
+ }
130
+
131
+ @keyframes accordionSlide {
132
+ from {
133
+ opacity: 0;
134
+ transform: translateY(-8px);
135
+ }
136
+ to {
137
+ opacity: 1;
138
+ transform: translateY(0);
139
+ }
74
140
  }
75
141
 
142
+ .accordion-actions {
143
+ display: flex;
144
+ justify-content: space-between;
145
+ gap: 8px;
146
+ margin-top: 16px;
147
+ padding-top: 16px;
148
+ border-top: 1px solid var(--color-border-soft);
149
+ }
150
+
151
+ /* Quick option checkboxes in accordion */
76
152
  .quick-option {
77
153
  display: flex;
78
154
  align-items: center;
@@ -80,10 +156,23 @@
80
156
  font-size: var(--font-size-caption);
81
157
  color: var(--color-text-secondary);
82
158
  margin-bottom: 6px;
159
+ cursor: pointer;
83
160
  }
84
161
 
85
162
  .quick-option input {
86
163
  accent-color: var(--color-brand);
164
+ width: 16px;
165
+ height: 16px;
166
+ }
167
+
168
+ /* Form hint error state */
169
+ .form-hint.hint-error {
170
+ color: var(--color-error);
171
+ }
172
+
173
+ /* Form hint error state */
174
+ .form-hint.hint-error {
175
+ color: var(--color-error);
87
176
  }
88
177
 
89
178
  .structured-section {
@@ -264,3 +353,264 @@
264
353
  word-break: break-all;
265
354
  }
266
355
 
356
+
357
+ /* OpenClaw config tab: align with current settings/card system */
358
+ .openclaw-layout {
359
+ display: grid;
360
+ gap: 10px;
361
+ padding: 0;
362
+ width: 100%;
363
+ }
364
+
365
+ .openclaw-workspace-card.settings-card,
366
+ .openclaw-configs-card {
367
+ margin: 0;
368
+ padding: 0;
369
+ width: 100%;
370
+ align-items: stretch;
371
+ border: 0;
372
+ border-radius: 0;
373
+ background: transparent;
374
+ box-shadow: none;
375
+ }
376
+
377
+ .openclaw-workspace-card.settings-card:hover,
378
+ .openclaw-configs-card:hover {
379
+ border-color: transparent;
380
+ box-shadow: none;
381
+ }
382
+
383
+ .openclaw-workspace-card.settings-card > .settings-card-body,
384
+ .openclaw-configs-card > .settings-card-body {
385
+ width: 100%;
386
+ min-width: 0;
387
+ }
388
+
389
+ /* Nested workspace card - distinguish from outer section */
390
+ .openclaw-workspace-card.settings-card > .settings-card-body > .openclaw-workspace-card {
391
+ display: flex;
392
+ flex-direction: column;
393
+ justify-content: center;
394
+ gap: 8px;
395
+ min-height: 70px;
396
+ padding: 14px 16px;
397
+ border: 1px solid rgba(137, 111, 94, 0.12);
398
+ border-radius: var(--radius-lg);
399
+ background: rgba(255, 255, 255, 0.76);
400
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.04);
401
+ }
402
+
403
+ /* Workspace tool button */
404
+ .openclaw-tools-grid {
405
+ display: grid;
406
+ grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
407
+ gap: 8px;
408
+ align-items: stretch;
409
+ }
410
+
411
+ .openclaw-tool-btn {
412
+ min-width: 0;
413
+ display: flex;
414
+ align-items: center;
415
+ gap: 12px;
416
+ min-height: 70px;
417
+ padding: 14px 16px;
418
+ width: 100%;
419
+ border-radius: var(--radius-lg);
420
+ border: 1px solid rgba(137, 111, 94, 0.12);
421
+ background: rgba(255, 255, 255, 0.76);
422
+ cursor: pointer;
423
+ transition: all 0.2s ease;
424
+ text-align: left;
425
+ font-family: inherit;
426
+ }
427
+
428
+ .openclaw-tool-btn:hover:not(:disabled) {
429
+ border-color: rgba(137, 111, 94, 0.18);
430
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.06);
431
+ transform: translateY(-1px);
432
+ }
433
+
434
+ .openclaw-tool-btn:disabled {
435
+ opacity: 0.6;
436
+ cursor: not-allowed;
437
+ }
438
+
439
+ .tool-icon {
440
+ width: 40px;
441
+ height: 40px;
442
+ display: flex;
443
+ align-items: center;
444
+ justify-content: center;
445
+ font-size: 20px;
446
+ background: rgba(200, 121, 99, 0.08);
447
+ border-radius: var(--radius-md);
448
+ flex-shrink: 0;
449
+ }
450
+
451
+ .tool-content {
452
+ flex: 1;
453
+ min-width: 0;
454
+ display: flex;
455
+ flex-direction: column;
456
+ gap: 2px;
457
+ }
458
+
459
+ .tool-title {
460
+ font-size: 14px;
461
+ font-weight: 500;
462
+ color: var(--color-text-primary);
463
+ }
464
+
465
+ .tool-meta {
466
+ font-size: 11px;
467
+ color: var(--color-text-tertiary);
468
+ line-height: 1.45;
469
+ }
470
+
471
+ .tool-chevron {
472
+ width: 18px;
473
+ height: 18px;
474
+ color: var(--color-text-muted);
475
+ flex-shrink: 0;
476
+ }
477
+
478
+ .workspace-label {
479
+ font-size: 13px;
480
+ font-weight: 500;
481
+ color: var(--color-text-primary);
482
+ }
483
+
484
+ .workspace-input-group {
485
+ display: grid;
486
+ grid-template-columns: minmax(0, 1fr) max-content;
487
+ gap: 8px;
488
+ align-items: center;
489
+ width: 100%;
490
+ }
491
+
492
+ .workspace-input-group .form-input {
493
+ min-height: 36px;
494
+ width: 100%;
495
+ }
496
+
497
+ .workspace-input-group .btn-tool {
498
+ white-space: nowrap;
499
+ }
500
+
501
+ .workspace-meta {
502
+ font-size: 11px;
503
+ color: var(--color-text-tertiary);
504
+ line-height: 1.45;
505
+ }
506
+
507
+ .openclaw-card-list {
508
+ margin-bottom: 0;
509
+ }
510
+
511
+ .openclaw-card-list .card {
512
+ width: 100%;
513
+ min-height: 70px;
514
+ flex-direction: row;
515
+ align-items: center;
516
+ gap: 14px;
517
+ padding: 14px 16px;
518
+ }
519
+
520
+ .openclaw-card-list .card-icon {
521
+ display: none;
522
+ }
523
+
524
+ .openclaw-card-list .card-leading {
525
+ flex: 1 1 auto;
526
+ min-width: 0;
527
+ }
528
+
529
+ .openclaw-card-list .card-content {
530
+ flex: 1;
531
+ }
532
+
533
+ .openclaw-card-list .card-title {
534
+ white-space: normal;
535
+ overflow: visible;
536
+ }
537
+
538
+ .openclaw-card-list .card-subtitle {
539
+ white-space: normal;
540
+ overflow: visible;
541
+ }
542
+
543
+ .openclaw-card-list .card-trailing {
544
+ width: auto;
545
+ min-width: max-content;
546
+ grid-auto-flow: column;
547
+ grid-auto-columns: max-content;
548
+ align-items: center;
549
+ justify-content: end;
550
+ }
551
+
552
+ .openclaw-card-list .card {
553
+ background: rgba(255, 255, 255, 0.76);
554
+ border-color: rgba(137, 111, 94, 0.12);
555
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.04);
556
+ }
557
+
558
+ .openclaw-card-list .card-subtitle {
559
+ white-space: normal;
560
+ display: -webkit-box;
561
+ -webkit-box-orient: vertical;
562
+ -webkit-line-clamp: 2;
563
+ overflow-wrap: anywhere;
564
+ }
565
+
566
+ @media (min-width: 1200px) {
567
+ .tool-icon {
568
+ width: 42px;
569
+ height: 42px;
570
+ font-size: 21px;
571
+ }
572
+ }
573
+
574
+ @media (max-width: 820px) {
575
+ .openclaw-tools-grid {
576
+ grid-template-columns: 1fr;
577
+ }
578
+
579
+ .workspace-input-group {
580
+ grid-template-columns: 1fr;
581
+ }
582
+
583
+ .workspace-input-group .btn-tool {
584
+ width: 100%;
585
+ }
586
+ }
587
+
588
+ @media (max-width: 520px) {
589
+ .openclaw-layout {
590
+ gap: 12px;
591
+ padding-top: 0;
592
+ }
593
+
594
+ .openclaw-tool-btn {
595
+ padding: 14px;
596
+ }
597
+
598
+ .tool-icon {
599
+ width: 36px;
600
+ height: 36px;
601
+ font-size: 18px;
602
+ }
603
+
604
+ .openclaw-card-list .card {
605
+ align-items: center;
606
+ flex-direction: row;
607
+ gap: 10px;
608
+ }
609
+
610
+ .openclaw-card-list .card-trailing {
611
+ width: auto;
612
+ min-width: max-content;
613
+ grid-auto-flow: column;
614
+ justify-content: end;
615
+ }
616
+ }