codexmate 0.0.43 → 0.0.45

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 (42) hide show
  1. package/README.md +2 -0
  2. package/README.zh.md +2 -0
  3. package/cli/claude-proxy.js +611 -14
  4. package/cli/update.js +77 -7
  5. package/cli.js +188 -21
  6. package/package.json +1 -1
  7. package/web-ui/app.js +36 -3
  8. package/web-ui/index.html +1 -0
  9. package/web-ui/logic.claude.mjs +65 -2
  10. package/web-ui/logic.runtime.mjs +0 -7
  11. package/web-ui/modules/app.computed.index.mjs +3 -1
  12. package/web-ui/modules/app.computed.main-tabs.mjs +3 -0
  13. package/web-ui/modules/app.computed.prompts.mjs +28 -0
  14. package/web-ui/modules/app.computed.session.mjs +23 -1
  15. package/web-ui/modules/app.methods.agents.mjs +50 -4
  16. package/web-ui/modules/app.methods.claude-config.mjs +28 -12
  17. package/web-ui/modules/app.methods.index.mjs +1 -1
  18. package/web-ui/modules/app.methods.install.mjs +129 -1
  19. package/web-ui/modules/app.methods.navigation.mjs +2 -1
  20. package/web-ui/modules/app.methods.session-actions.mjs +17 -2
  21. package/web-ui/modules/app.methods.session-timeline.mjs +0 -1
  22. package/web-ui/modules/app.methods.startup-claude.mjs +26 -3
  23. package/web-ui/modules/i18n/locales/en.mjs +42 -5
  24. package/web-ui/modules/i18n/locales/ja.mjs +42 -5
  25. package/web-ui/modules/i18n/locales/vi.mjs +51 -0
  26. package/web-ui/modules/i18n/locales/zh.mjs +42 -5
  27. package/web-ui/partials/index/layout-footer.html +1 -1
  28. package/web-ui/partials/index/layout-header.html +64 -0
  29. package/web-ui/partials/index/modal-config-template-agents.html +12 -13
  30. package/web-ui/partials/index/modals-basic.html +18 -1
  31. package/web-ui/partials/index/panel-config-claude.html +4 -7
  32. package/web-ui/partials/index/panel-config-codex.html +2 -6
  33. package/web-ui/partials/index/panel-prompts.html +100 -0
  34. package/web-ui/partials/index/panel-sessions.html +30 -10
  35. package/web-ui/partials/index/panel-usage.html +34 -18
  36. package/web-ui/res/web-ui-render.precompiled.js +579 -149
  37. package/web-ui/styles/controls-forms.css +5 -5
  38. package/web-ui/styles/layout-shell.css +145 -0
  39. package/web-ui/styles/modals-core.css +162 -0
  40. package/web-ui/styles/responsive.css +77 -5
  41. package/web-ui/styles/sessions-toolbar-trash.css +45 -10
  42. package/web-ui/styles/sessions-usage.css +31 -2
@@ -483,16 +483,16 @@
483
483
  }
484
484
 
485
485
  .tool-config-write-overlay {
486
- position: absolute;
486
+ position: fixed;
487
487
  inset: 0;
488
- z-index: 20;
488
+ z-index: 90;
489
489
  display: flex;
490
490
  align-items: center;
491
491
  justify-content: center;
492
492
  box-sizing: border-box;
493
- min-height: 360px;
494
- padding: 16px;
495
- border-radius: 18px;
493
+ min-height: 100dvh;
494
+ padding: max(16px, env(safe-area-inset-top)) max(16px, env(safe-area-inset-right)) max(16px, env(safe-area-inset-bottom)) max(16px, env(safe-area-inset-left));
495
+ border-radius: 0;
496
496
  background: rgba(247, 240, 233, 0.78);
497
497
  background: color-mix(in srgb, var(--color-bg) 68%, transparent);
498
498
  backdrop-filter: blur(2px);
@@ -507,6 +507,151 @@ body::after {
507
507
  -webkit-text-fill-color: #8e8e93;
508
508
  }
509
509
 
510
+ .mobile-brand-bar {
511
+ display: none;
512
+ }
513
+
514
+ .mobile-brand-title {
515
+ min-width: 0;
516
+ font-size: 15px;
517
+ font-weight: 760;
518
+ letter-spacing: -0.02em;
519
+ color: var(--color-text-primary);
520
+ white-space: nowrap;
521
+ overflow: hidden;
522
+ text-overflow: ellipsis;
523
+ }
524
+
525
+ .mobile-update-chip {
526
+ min-width: 0;
527
+ max-width: 58vw;
528
+ height: 30px;
529
+ padding: 0 9px;
530
+ border: 1px solid rgba(200, 121, 99, 0.16);
531
+ border-radius: 999px;
532
+ background: rgba(255, 255, 255, 0.58);
533
+ color: var(--color-text-secondary);
534
+ display: inline-flex;
535
+ align-items: center;
536
+ justify-content: center;
537
+ gap: 7px;
538
+ cursor: pointer;
539
+ white-space: nowrap;
540
+ box-shadow: none;
541
+ }
542
+
543
+ .mobile-update-chip--current {
544
+ border-color: rgba(72, 138, 102, 0.14);
545
+ }
546
+
547
+ .mobile-update-chip--current .side-update-dot {
548
+ background: rgba(72, 138, 102, 0.70);
549
+ box-shadow: 0 0 0 4px rgba(72, 138, 102, 0.08);
550
+ }
551
+
552
+ .mobile-update-chip--loading .side-update-dot {
553
+ animation: side-update-pulse 1.2s ease-in-out infinite;
554
+ }
555
+
556
+ .mobile-update-chip--error {
557
+ border-color: rgba(203, 75, 75, 0.18);
558
+ }
559
+
560
+ .mobile-update-chip--error .side-update-dot {
561
+ background: rgba(203, 75, 75, 0.78);
562
+ box-shadow: 0 0 0 4px rgba(203, 75, 75, 0.08);
563
+ }
564
+
565
+ .mobile-update-text {
566
+ min-width: 0;
567
+ overflow: hidden;
568
+ text-overflow: ellipsis;
569
+ font-size: 11px;
570
+ font-weight: 680;
571
+ }
572
+
573
+ .side-update-notice {
574
+ width: 100%;
575
+ margin-top: 12px;
576
+ padding: 8px 9px;
577
+ border: 1px solid rgba(200, 121, 99, 0.16);
578
+ border-radius: 12px;
579
+ background: rgba(255, 255, 255, 0.52);
580
+ color: var(--color-text-secondary);
581
+ display: flex;
582
+ align-items: center;
583
+ gap: 8px;
584
+ text-align: left;
585
+ cursor: pointer;
586
+ box-shadow: none;
587
+ transition: border-color 160ms ease, background 160ms ease, color 160ms ease;
588
+ }
589
+
590
+ .side-update-notice:hover {
591
+ border-color: rgba(200, 121, 99, 0.30);
592
+ background: rgba(255, 255, 255, 0.74);
593
+ color: var(--color-text-primary);
594
+ }
595
+
596
+ .side-update-notice--current {
597
+ border-color: rgba(72, 138, 102, 0.14);
598
+ }
599
+
600
+ .side-update-notice--current .side-update-dot {
601
+ background: rgba(72, 138, 102, 0.70);
602
+ box-shadow: 0 0 0 4px rgba(72, 138, 102, 0.08);
603
+ }
604
+
605
+ .side-update-notice--loading .side-update-dot {
606
+ animation: side-update-pulse 1.2s ease-in-out infinite;
607
+ }
608
+
609
+ .side-update-notice--error {
610
+ border-color: rgba(203, 75, 75, 0.18);
611
+ }
612
+
613
+ .side-update-notice--error .side-update-dot {
614
+ background: rgba(203, 75, 75, 0.78);
615
+ box-shadow: 0 0 0 4px rgba(203, 75, 75, 0.08);
616
+ }
617
+
618
+ @keyframes side-update-pulse {
619
+ 0%, 100% { opacity: 0.48; transform: scale(0.94); }
620
+ 50% { opacity: 1; transform: scale(1.08); }
621
+ }
622
+
623
+ .side-update-dot {
624
+ width: 7px;
625
+ height: 7px;
626
+ border-radius: 50%;
627
+ background: rgba(200, 121, 99, 0.72);
628
+ box-shadow: 0 0 0 4px rgba(200, 121, 99, 0.08);
629
+ flex-shrink: 0;
630
+ }
631
+
632
+ .side-update-copy {
633
+ min-width: 0;
634
+ display: flex;
635
+ flex-direction: column;
636
+ gap: 1px;
637
+ }
638
+
639
+ .side-update-title {
640
+ font-size: 11px;
641
+ line-height: 1.25;
642
+ font-weight: 650;
643
+ color: inherit;
644
+ }
645
+
646
+ .side-update-meta {
647
+ font-size: 10px;
648
+ line-height: 1.2;
649
+ color: var(--color-text-tertiary);
650
+ white-space: nowrap;
651
+ overflow: hidden;
652
+ text-overflow: ellipsis;
653
+ }
654
+
510
655
  .brand-version-fade-enter-active,
511
656
  .brand-version-fade-leave-active {
512
657
  transition: opacity 0.2s var(--ease-smooth);
@@ -427,6 +427,7 @@
427
427
  line-height: 1.55;
428
428
  max-height: min(32vh, 280px);
429
429
  overflow: auto;
430
+ animation: diffSlideIn var(--transition-normal) var(--ease-spring);
430
431
  }
431
432
 
432
433
 
@@ -497,3 +498,164 @@
497
498
  color: var(--color-error);
498
499
  opacity: 1;
499
500
  }
501
+
502
+ .btn-confirm-mini {
503
+ background: linear-gradient(135deg, var(--color-brand) 0%, var(--color-brand-dark) 100%);
504
+ color: white;
505
+ border: none;
506
+ box-shadow: 0 2px 4px rgba(210, 107, 90, 0.2);
507
+ }
508
+
509
+ .btn-confirm-mini:hover {
510
+ box-shadow: 0 4px 8px rgba(210, 107, 90, 0.25);
511
+ filter: brightness(1.05);
512
+ transform: translateY(-1px);
513
+ }
514
+
515
+ .prompts-editor {
516
+ margin-top: 12px;
517
+ flex: 1;
518
+ display: flex;
519
+ flex-direction: column;
520
+ min-height: 0;
521
+ }
522
+
523
+ .prompts-editor .form-group {
524
+ flex: 1;
525
+ display: flex;
526
+ flex-direction: column;
527
+ min-height: 0;
528
+ }
529
+
530
+ .prompts-editor .editor-frame {
531
+ min-height: 75vh;
532
+ }
533
+
534
+ .prompts-editor .template-editor {
535
+ min-height: 75vh;
536
+ max-height: none;
537
+ }
538
+
539
+ .prompts-editor-toolbar {
540
+ display: flex;
541
+ align-items: center;
542
+ justify-content: space-between;
543
+ gap: 12px;
544
+ margin-bottom: 8px;
545
+ }
546
+
547
+ .prompts-editor-toolbar .form-hint {
548
+ margin-top: 0;
549
+ }
550
+
551
+ .prompts-editor-actions {
552
+ display: flex;
553
+ gap: 6px;
554
+ flex-shrink: 0;
555
+ align-items: center;
556
+ }
557
+
558
+ .prompts-editor-group {
559
+ display: flex;
560
+ gap: 6px;
561
+ align-items: center;
562
+ }
563
+
564
+ .prompts-editor-group--secondary .btn-mini {
565
+ color: var(--color-text-tertiary);
566
+ border-color: transparent;
567
+ background: transparent;
568
+ box-shadow: none;
569
+ }
570
+
571
+ .prompts-editor-group--secondary .btn-mini:hover {
572
+ color: var(--color-brand);
573
+ background: var(--color-brand-light);
574
+ transform: none;
575
+ }
576
+
577
+ .prompts-editor-group--workflow {
578
+ margin-left: 4px;
579
+ padding-left: 10px;
580
+ border-left: 1px solid var(--color-border-soft);
581
+ }
582
+
583
+ .editor-frame {
584
+ position: relative;
585
+ border-radius: var(--radius-md);
586
+ border: 1.5px solid var(--color-border-soft);
587
+ transition: border-color var(--transition-fast) var(--ease-spring),
588
+ box-shadow var(--transition-normal) var(--ease-spring);
589
+ overflow: hidden;
590
+ }
591
+
592
+ .editor-frame:focus-within {
593
+ border-color: var(--color-brand);
594
+ box-shadow: var(--shadow-input-focus);
595
+ }
596
+
597
+ .editor-frame .form-input {
598
+ border: none;
599
+ border-radius: 0;
600
+ box-shadow: none;
601
+ }
602
+
603
+ .editor-frame .form-input:focus {
604
+ border-color: transparent;
605
+ box-shadow: none;
606
+ }
607
+
608
+ .editor-frame--loading .form-input {
609
+ opacity: 0;
610
+ }
611
+
612
+ .editor-skeleton {
613
+ position: absolute;
614
+ inset: 13px var(--spacing-sm);
615
+ display: flex;
616
+ flex-direction: column;
617
+ gap: 10px;
618
+ pointer-events: none;
619
+ }
620
+
621
+ .skeleton-line {
622
+ height: 13px;
623
+ border-radius: 4px;
624
+ background: linear-gradient(90deg, var(--color-border-soft) 25%, rgba(255, 255, 255, 0.6) 50%, var(--color-border-soft) 75%);
625
+ background-size: 200% 100%;
626
+ animation: shimmer 1.5s ease-in-out infinite;
627
+ }
628
+
629
+ .skeleton-line:nth-child(2) { width: 85%; }
630
+ .skeleton-line:nth-child(3) { width: 92%; }
631
+ .skeleton-line:nth-child(4) { width: 60%; }
632
+ .skeleton-line:nth-child(5) { width: 78%; }
633
+ .skeleton-line:nth-child(6) { width: 45%; }
634
+
635
+ @keyframes shimmer {
636
+ 0% { background-position: 200% 0; }
637
+ 100% { background-position: -200% 0; }
638
+ }
639
+
640
+ .prompts-context-hint {
641
+ margin-top: 6px;
642
+ font-size: var(--font-size-caption);
643
+ color: var(--color-text-muted);
644
+ opacity: 0.7;
645
+ transition: opacity var(--transition-fast);
646
+ line-height: 1.4;
647
+ }
648
+
649
+ .prompts-context-hint:hover {
650
+ opacity: 1;
651
+ }
652
+
653
+ .prompts-context-hint--warn {
654
+ color: #8d5b31;
655
+ opacity: 0.85;
656
+ }
657
+
658
+ @keyframes diffSlideIn {
659
+ from { opacity: 0; transform: translateY(-8px); }
660
+ to { opacity: 1; transform: translateY(0); }
661
+ }
@@ -94,6 +94,18 @@ textarea:focus-visible {
94
94
  overflow: hidden;
95
95
  }
96
96
 
97
+ .mobile-brand-bar {
98
+ display: flex;
99
+ flex: 0 0 auto;
100
+ align-items: center;
101
+ justify-content: space-between;
102
+ gap: 10px;
103
+ padding: 9px 12px 6px;
104
+ background: rgba(255, 248, 241, 0.96);
105
+ position: relative;
106
+ z-index: 32;
107
+ }
108
+
97
109
  .app-shell {
98
110
  grid-template-columns: 1fr;
99
111
  flex: 1 1 auto;
@@ -172,6 +184,32 @@ textarea:focus-visible {
172
184
  gap: 6px;
173
185
  }
174
186
 
187
+ .mode-cards > .segmented-control {
188
+ flex-direction: row;
189
+ }
190
+
191
+ .prompts-editor-toolbar {
192
+ flex-direction: column;
193
+ align-items: flex-start;
194
+ gap: 8px;
195
+ }
196
+
197
+ .prompts-editor-actions {
198
+ width: 100%;
199
+ flex-wrap: wrap;
200
+ }
201
+
202
+ .template-editor,
203
+ .agents-diff-editor {
204
+ min-height: min(50vh, 400px);
205
+ max-height: min(56vh, 480px);
206
+ }
207
+
208
+ .prompts-editor .template-editor {
209
+ min-height: 60vh;
210
+ max-height: none;
211
+ }
212
+
175
213
  .status-strip {
176
214
  gap: 12px;
177
215
  }
@@ -204,6 +242,15 @@ textarea:focus-visible {
204
242
  grid-template-columns: 1fr;
205
243
  }
206
244
 
245
+ .usage-wave-container {
246
+ grid-template-columns: 28px 1fr;
247
+ padding: 16px 14px 16px 8px;
248
+ }
249
+
250
+ .usage-wave-ytick {
251
+ font-size: 9px;
252
+ }
253
+
207
254
  }
208
255
 
209
256
  @media (max-width: 540px) {
@@ -256,11 +303,6 @@ textarea:focus-visible {
256
303
  .btn-add,
257
304
  .btn-tool,
258
305
  .card-action-btn,
259
- .btn-session-export,
260
- .btn-session-open,
261
- .btn-session-clone,
262
- .btn-session-refresh,
263
- .btn-session-delete,
264
306
  .btn-icon,
265
307
  .session-item-copy {
266
308
  min-height: 44px;
@@ -268,6 +310,20 @@ textarea:focus-visible {
268
310
  padding-bottom: 12px;
269
311
  }
270
312
 
313
+ .btn-session-export,
314
+ .btn-session-open,
315
+ .btn-session-clone,
316
+ .btn-session-refresh,
317
+ .btn-session-delete {
318
+ width: 44px;
319
+ height: 44px;
320
+ }
321
+
322
+ .session-link-group .btn-session-open {
323
+ width: 44px;
324
+ height: 44px;
325
+ }
326
+
271
327
  .btn-icon,
272
328
  .session-item-copy {
273
329
  min-width: 36px;
@@ -434,6 +490,22 @@ textarea:focus-visible {
434
490
  .skills-root-box {
435
491
  font-size: 11px;
436
492
  }
493
+
494
+ .prompts-editor-actions .btn-mini {
495
+ min-height: 40px;
496
+ padding: 6px 12px;
497
+ }
498
+
499
+ .prompts-editor-toolbar {
500
+ flex-direction: column;
501
+ align-items: flex-start;
502
+ gap: 8px;
503
+ }
504
+
505
+ .prompts-editor-actions {
506
+ width: 100%;
507
+ flex-wrap: wrap;
508
+ }
437
509
  }
438
510
 
439
511
  @media (max-width: 820px) {
@@ -388,31 +388,33 @@
388
388
  .btn-session-open,
389
389
  .btn-session-clone,
390
390
  .btn-session-refresh {
391
+ display: inline-flex;
392
+ align-items: center;
393
+ justify-content: center;
394
+ width: 32px;
395
+ height: 32px;
396
+ padding: 0;
391
397
  border: 1px solid var(--color-border-soft);
392
398
  border-radius: var(--radius-md);
393
399
  background: var(--color-surface);
394
400
  color: var(--color-text-secondary);
395
- padding: 7px 12px;
396
- font-size: var(--font-size-secondary);
397
- font-weight: var(--font-weight-secondary);
398
401
  cursor: pointer;
399
402
  transition: all var(--transition-fast) var(--ease-spring);
400
- white-space: nowrap;
401
- letter-spacing: -0.01em;
402
403
  }
403
404
 
404
405
  .btn-session-delete {
406
+ display: inline-flex;
407
+ align-items: center;
408
+ justify-content: center;
409
+ width: 32px;
410
+ height: 32px;
411
+ padding: 0;
405
412
  border: 1px solid rgba(189, 70, 68, 0.4);
406
413
  border-radius: var(--radius-md);
407
414
  background: var(--color-surface);
408
415
  color: #b74545;
409
- padding: 7px 12px;
410
- font-size: var(--font-size-secondary);
411
- font-weight: var(--font-weight-secondary);
412
416
  cursor: pointer;
413
417
  transition: all var(--transition-fast) var(--ease-spring);
414
- white-space: nowrap;
415
- letter-spacing: -0.01em;
416
418
  }
417
419
 
418
420
  .btn-session-refresh:hover {
@@ -427,6 +429,39 @@
427
429
  transform: none;
428
430
  }
429
431
 
432
+ .btn-session-refresh svg,
433
+ .btn-session-delete svg,
434
+ .btn-session-export svg,
435
+ .btn-session-open svg {
436
+ width: 15px;
437
+ height: 15px;
438
+ flex-shrink: 0;
439
+ }
440
+
441
+ .session-link-group {
442
+ display: inline-flex;
443
+ border-radius: var(--radius-md);
444
+ border: 1px solid var(--color-border-soft);
445
+ overflow: hidden;
446
+ }
447
+
448
+ .session-link-group .btn-session-open {
449
+ border: none;
450
+ border-radius: 0;
451
+ }
452
+
453
+ .session-link-group .btn-session-open + .btn-session-open {
454
+ border-left: 1px solid var(--color-border-soft);
455
+ }
456
+
457
+ .session-link-group:hover {
458
+ border-color: var(--color-brand);
459
+ }
460
+
461
+ .session-link-group .btn-session-open:disabled {
462
+ opacity: 0.45;
463
+ }
464
+
430
465
  .btn-session-export:hover,
431
466
  .btn-session-open:hover {
432
467
  border-color: var(--color-brand);
@@ -264,8 +264,11 @@
264
264
 
265
265
  .usage-wave-container {
266
266
  margin-top: 16px;
267
- position: relative;
268
- padding: 20px;
267
+ display: grid;
268
+ grid-template-columns: 36px 1fr;
269
+ gap: 8px;
270
+ align-items: stretch;
271
+ padding: 20px 20px 20px 12px;
269
272
  border-radius: 18px;
270
273
  background: linear-gradient(135deg, rgba(255,255,255,0.8), rgba(252,248,241,0.6));
271
274
  border: 1px solid rgba(137, 111, 94, 0.06);
@@ -273,6 +276,27 @@
273
276
  backdrop-filter: blur(8px);
274
277
  }
275
278
 
279
+ .usage-wave-yaxis {
280
+ position: relative;
281
+ height: 150px;
282
+ }
283
+
284
+ .usage-wave-ytick {
285
+ position: absolute;
286
+ right: 0;
287
+ font-size: 10px;
288
+ font-weight: 500;
289
+ color: var(--color-text-muted);
290
+ line-height: 1;
291
+ transform: translateY(50%);
292
+ white-space: nowrap;
293
+ pointer-events: none;
294
+ }
295
+
296
+ .usage-wave-chart-area {
297
+ min-width: 0;
298
+ }
299
+
276
300
  .usage-wave-chart {
277
301
  width: 100%;
278
302
  height: 150px;
@@ -332,6 +356,11 @@
332
356
  transition: all 180ms var(--ease-spring);
333
357
  -webkit-tap-highlight-color: transparent;
334
358
  font-weight: 500;
359
+ appearance: none;
360
+ background: none;
361
+ border: none;
362
+ font-family: inherit;
363
+ line-height: inherit;
335
364
  }
336
365
 
337
366
  .usage-wave-label:hover {