codexmate 0.1.28 → 0.1.29

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 (41) hide show
  1. package/README.md +53 -44
  2. package/README.vi.md +45 -36
  3. package/README.zh.md +51 -42
  4. package/cli/session-usage.js +2 -2
  5. package/cli.js +369 -15
  6. package/package.json +1 -1
  7. package/web-ui/app.js +3 -0
  8. package/web-ui/index.html +3 -2
  9. package/web-ui/logic.sessions.mjs +6 -4
  10. package/web-ui/modules/app.computed.session.mjs +52 -33
  11. package/web-ui/modules/app.methods.agents.mjs +36 -0
  12. package/web-ui/modules/app.methods.codex-config.mjs +3 -1
  13. package/web-ui/modules/app.methods.providers.mjs +12 -4
  14. package/web-ui/modules/app.methods.session-actions.mjs +10 -8
  15. package/web-ui/modules/app.methods.session-browser.mjs +3 -1
  16. package/web-ui/modules/app.methods.session-trash.mjs +16 -16
  17. package/web-ui/modules/app.methods.theme.mjs +5 -4
  18. package/web-ui/modules/i18n/locales/en.mjs +74 -1
  19. package/web-ui/modules/i18n/locales/ja.mjs +74 -1
  20. package/web-ui/modules/i18n/locales/vi.mjs +74 -1
  21. package/web-ui/modules/i18n/locales/zh-tw.mjs +74 -1
  22. package/web-ui/modules/i18n/locales/zh.mjs +74 -1
  23. package/web-ui/modules/i18n.mjs +7 -0
  24. package/web-ui/partials/index/modal-config-template-agents.html +1 -1
  25. package/web-ui/partials/index/modal-health-check.html +1 -1
  26. package/web-ui/partials/index/modal-openclaw-config.html +50 -50
  27. package/web-ui/partials/index/panel-dashboard.html +1 -1
  28. package/web-ui/partials/index/panel-prompts.html +2 -2
  29. package/web-ui/partials/index/panel-sessions.html +45 -28
  30. package/web-ui/partials/index/panel-settings.html +6 -0
  31. package/web-ui/res/web-ui-render.precompiled.js +219 -156
  32. package/web-ui/session-helpers.mjs +3 -0
  33. package/web-ui/styles/base-theme.css +2 -2
  34. package/web-ui/styles/bridge-pool.css +1 -1
  35. package/web-ui/styles/layout-shell.css +0 -1
  36. package/web-ui/styles/sessions-preview.css +77 -0
  37. package/web-ui/styles/theme-dark-tokens.css +2 -2
  38. package/web-ui/styles/theme-dark.css +2 -2
  39. package/web-ui/styles/theme-ocean-tokens.css +88 -0
  40. package/web-ui/styles/theme-ocean.css +920 -0
  41. package/web-ui/styles.css +1 -0
@@ -222,6 +222,7 @@ export async function loadSessions(api, options = {}) {
222
222
  const normalizedOptions = normalizeSessionLoadOptions(options);
223
223
  const includeActiveDetail = shouldIncludeActiveSessionDetail(this, normalizedOptions);
224
224
  this.sessionsLoading = true;
225
+ this.sessionSearchInfo = null;
225
226
  this.activeSessionDetailError = '';
226
227
  let loadSucceeded = false;
227
228
  const params = buildSessionListParams({
@@ -257,6 +258,7 @@ export async function loadSessions(api, options = {}) {
257
258
  clearSessionTimelineRefs(this);
258
259
  } else {
259
260
  loadSucceeded = true;
261
+ this.sessionSearchInfo = res.searchInfo || null;
260
262
  const rawSessions = Array.isArray(res.sessions) ? res.sessions : [];
261
263
  this.sessionsList = rawSessions.filter(s => s && typeof s === 'object');
262
264
  if (typeof this.clearSessionBatchSelection === 'function') {
@@ -313,6 +315,7 @@ export async function loadSessions(api, options = {}) {
313
315
  }
314
316
  }
315
317
  } catch (e) {
318
+ this.sessionSearchInfo = null;
316
319
  emitSessionLoadDebug(this, 'loadSessions:exception', e && e.message ? e.message : String(e));
317
320
  this.sessionsList = [];
318
321
  if (typeof this.primeSessionListRender === 'function') {
@@ -18,8 +18,8 @@
18
18
  --color-surface-chip: rgba(255, 255, 255, 0.76);
19
19
  --color-text-primary: #241F1C;
20
20
  --color-text-secondary: #5A504A;
21
- --color-text-tertiary: #82746A;
22
- --color-text-muted: #A99B91;
21
+ --color-text-tertiary: #74655B;
22
+ --color-text-muted: #77675C;
23
23
  --color-border: rgba(137, 111, 94, 0.18);
24
24
  --color-border-soft: rgba(137, 111, 94, 0.13);
25
25
  --color-border-strong: rgba(137, 111, 94, 0.34);
@@ -32,7 +32,7 @@
32
32
 
33
33
  /* ---- 轮询池触发按钮 ---- */
34
34
  .bridge-pool-trigger {
35
- color: var(--color-brand);
35
+ color: var(--color-brand-dark);
36
36
  background: rgba(200, 121, 99, 0.08);
37
37
  }
38
38
 
@@ -377,7 +377,6 @@ body::after {
377
377
  text-transform: uppercase;
378
378
  padding: 0 8px;
379
379
  margin-bottom: 6px;
380
- opacity: 0.72;
381
380
  }
382
381
 
383
382
  .side-item {
@@ -758,3 +758,80 @@
758
758
  width: 14px;
759
759
  height: 14px;
760
760
  }
761
+
762
+ /* Refined session workspace: preserve the list/detail structure and action contracts. */
763
+ #panel-sessions.session-browser-refined .session-preview-header {
764
+ padding: 12px 16px 8px; gap: 8px 16px;
765
+ display: grid; grid-template-columns: minmax(0, 1fr) auto;
766
+ grid-template-areas: "title export" "actions actions";
767
+ background: var(--color-surface); backdrop-filter: none;
768
+ }
769
+ #panel-sessions.session-browser-refined .session-preview-title {
770
+ font-size: 17px; line-height: 1.5; letter-spacing: -.015em;
771
+ }
772
+ #panel-sessions.session-browser-refined .session-preview-header > div:first-child { grid-area: title; min-width: 0; }
773
+ #panel-sessions .session-preview-actions { grid-area: actions; gap: 10px; justify-content: flex-start; margin-top: 0; }
774
+ #panel-sessions .session-export-control {
775
+ grid-area: export; justify-self: end; align-self: start;
776
+ display: flex; flex-wrap: wrap; align-items: center; gap: 6px;
777
+ padding: 2px; border: 1px solid var(--color-border-soft); border-radius: var(--radius-md);
778
+ background: var(--color-surface-alt); max-width: 100%;
779
+ }
780
+ #panel-sessions .session-export-label { font-size: 12px; line-height: 1; color: var(--color-text-secondary); padding-inline: 6px 0; margin-block: 0; }
781
+ #panel-sessions #session-export-range {
782
+ min-height: 44px; min-width: 0; max-width: 100%; padding: 8px 28px 8px 10px;
783
+ border: 0; border-radius: var(--radius-sm); background: var(--color-surface);
784
+ color: var(--color-text-primary); font: inherit; font-size: 14px; cursor: pointer;
785
+ }
786
+ #panel-sessions .session-preview-actions button {
787
+ min-width: 44px; min-height: 44px; height: auto; width: auto; padding: 9px 12px;
788
+ border-radius: var(--radius-sm); box-shadow: none;
789
+ transition: background-color 120ms ease-out, transform 100ms ease-out, color 120ms ease-out;
790
+ touch-action: manipulation;
791
+ }
792
+ #panel-sessions .session-export-control .btn-session-export {
793
+ background: var(--color-text-primary); color: var(--color-surface);
794
+ border-color: transparent; font-weight: 600;
795
+ }
796
+ #panel-sessions .session-secondary-actions { display: flex; align-items: center; flex-wrap: wrap; gap: 4px; }
797
+ #panel-sessions .session-secondary-actions button { background: transparent; border-color: transparent; color: var(--color-text-secondary); }
798
+ #panel-sessions .session-secondary-actions .session-link-group { display: inline-flex; gap: 2px; }
799
+ #panel-sessions .session-danger-action { margin-inline-start: auto; padding-inline-start: 12px; border-inline-start: 1px solid var(--color-border-soft); }
800
+ #panel-sessions .session-danger-action button { background: transparent; border-color: transparent; }
801
+ #panel-sessions .session-preview-actions button:hover:not(:disabled) { transform: none; background: var(--color-surface-alt); }
802
+ #panel-sessions .session-export-control .btn-session-export:hover:not(:disabled) { background: var(--color-text-secondary); }
803
+ #panel-sessions .session-preview-actions button:active:not(:disabled) { transform: scale(.97); }
804
+ #panel-sessions .session-preview-actions :is(button, select):focus-visible,
805
+ #panel-sessions .session-empty-refined button:focus-visible { outline: 2px solid var(--color-brand); outline-offset: 3px; }
806
+ #panel-sessions .session-preview-actions :disabled { opacity: .5; cursor: not-allowed; }
807
+ #panel-sessions .session-export-feedback { padding: 0 16px 16px; color: var(--color-text-secondary); line-height: 1.6; }
808
+ #panel-sessions .session-export-feedback small { display: block; font-size: 12px; }
809
+ #panel-sessions .session-export-notice {
810
+ margin: 10px 0 0; padding: 10px 12px; border: 1px solid var(--color-border-soft);
811
+ border-radius: var(--radius-sm); background: var(--color-surface-alt); font-size: 13px;
812
+ }
813
+ #panel-sessions .session-search-status {
814
+ display: flex; flex-wrap: wrap; align-items: baseline; gap: 4px 14px;
815
+ padding: 10px 2px 14px; font-size: 12px; line-height: 1.6; color: var(--color-text-secondary);
816
+ }
817
+ #panel-sessions .session-search-count { font-weight: 600; color: var(--color-text-primary); font-variant-numeric: tabular-nums; }
818
+ #panel-sessions .session-search-partial { color: var(--color-text-secondary); }
819
+ #panel-sessions .session-search-scope { font-size: inherit; margin-inline-start: auto; }
820
+ #panel-sessions .session-empty-refined { padding: 40px 20px; border: 1px dashed var(--color-border-soft); background: transparent; }
821
+ #panel-sessions .session-empty-refined::before { display: none; }
822
+ #panel-sessions .session-empty-refined p { margin: 0 0 16px; line-height: 1.65; }
823
+ #panel-sessions .session-empty-refined button { min-height: 44px; padding-inline: 16px; }
824
+ @media (max-width: 640px) {
825
+ #panel-sessions .session-preview-actions { flex-direction: row; align-items: center; gap: 10px; }
826
+ #panel-sessions .session-export-control { justify-self: stretch; }
827
+ #panel-sessions #session-export-range { flex: 1 1 120px; }
828
+ #panel-sessions .session-secondary-actions { flex: 1 1 180px; }
829
+ #panel-sessions .session-preview-actions button { width: auto; }
830
+ #panel-sessions .session-search-scope { flex-basis: 100%; margin-inline-start: 0; }
831
+ #panel-sessions.session-browser-refined .session-preview-header { padding: 12px 12px 8px; gap: 8px; grid-template-columns: 1fr; grid-template-areas: "title" "export" "actions"; }
832
+ #panel-sessions .session-export-feedback { padding-inline: 12px; }
833
+ }
834
+ @media (prefers-reduced-motion: reduce) {
835
+ #panel-sessions .session-preview-actions button { transition: none; }
836
+ #panel-sessions .session-preview-actions button:active:not(:disabled) { transform: none; }
837
+ }
@@ -20,8 +20,8 @@
20
20
  --color-surface-chip: rgba(30, 31, 34, 0.76);
21
21
  --color-text-primary: #ECE8E4;
22
22
  --color-text-secondary: #B5ABA4;
23
- --color-text-tertiary: #8F847D;
24
- --color-text-muted: #6E6259;
23
+ --color-text-tertiary: #A59A91;
24
+ --color-text-muted: #9A8D83;
25
25
  --color-border: rgba(255, 255, 255, 0.09);
26
26
  --color-border-soft: rgba(255, 255, 255, 0.06);
27
27
  --color-border-strong: rgba(255, 255, 255, 0.2);
@@ -29,8 +29,8 @@
29
29
  --color-surface-chip: rgba(30, 31, 34, 0.76);
30
30
  --color-text-primary: #ECE8E4;
31
31
  --color-text-secondary: #B5ABA4;
32
- --color-text-tertiary: #8F847D;
33
- --color-text-muted: #6E6259;
32
+ --color-text-tertiary: #A59A91;
33
+ --color-text-muted: #9A8D83;
34
34
  --color-border: rgba(255, 255, 255, 0.09);
35
35
  --color-border-soft: rgba(255, 255, 255, 0.06);
36
36
  --color-border-strong: rgba(255, 255, 255, 0.2);
@@ -0,0 +1,88 @@
1
+ /*
2
+ * Codex Mate Web UI - ocean light theme tokens (hand maintained).
3
+ *
4
+ * Background layer adapted from the "dafy-whale-theme" project
5
+ * (https://github.com/DViridescent/dafy-whale-theme, MIT licensed).
6
+ * Only the static background layer (the ocean wash gradients) is reused:
7
+ * no mascot, no fish swarm, no bubble animation, no plugin dependency.
8
+ *
9
+ * The component section of theme-ocean.css is GENERATED - do not edit by hand.
10
+ * Regenerate after changing any stylesheet:
11
+ * node scripts/generate-ocean-theme-css.mjs
12
+ */
13
+ :root[data-theme="ocean"] {
14
+ color-scheme: light;
15
+
16
+ /* 品牌色:海洋蓝(源自 dafy-whale-theme 的 --dsw-alias-brand-primary) */
17
+ --color-brand: #3B62F6;
18
+ --color-brand-dark: #2B4BD0;
19
+ --color-brand-light: rgba(59, 98, 246, 0.13);
20
+ --color-brand-subtle: rgba(59, 98, 246, 0.2);
21
+
22
+ /* 中性蓝层级底色 */
23
+ --color-bg: #E9F3FC;
24
+ --color-surface: #F3F9FE;
25
+ --color-surface-alt: #E0EDF9;
26
+ --color-surface-elevated: #FFFFFF;
27
+ --color-surface-tint: rgba(243, 249, 254, 0.86);
28
+ --color-surface-chip: rgba(255, 255, 255, 0.76);
29
+ --color-text-primary: #0E2A5C;
30
+ --color-text-secondary: #3B5C85;
31
+ --color-text-tertiary: #45678F;
32
+ --color-text-muted: #476A90;
33
+ --color-border: rgba(31, 86, 150, 0.18);
34
+ --color-border-soft: rgba(31, 86, 150, 0.13);
35
+ --color-border-strong: rgba(31, 86, 150, 0.34);
36
+
37
+ --color-success: #127450;
38
+ --color-error: #B92A50;
39
+
40
+ /* Delta 指示色 */
41
+ --color-delta-up: #127450;
42
+ --color-delta-down: #B92A50;
43
+
44
+ /* 热力图色阶:海洋蓝 alpha 阶梯 */
45
+ --color-heatmap-1: rgba(59, 98, 246, 0.2);
46
+ --color-heatmap-2: rgba(59, 98, 246, 0.4);
47
+ --color-heatmap-3: rgba(59, 98, 246, 0.6);
48
+ --color-heatmap-4: rgba(59, 98, 246, 0.85);
49
+
50
+ /*
51
+ * 背景海面光晕:取自 dafy-whale-theme 的 .dafy-wash 三层径向渐变,
52
+ * 仅保留静态渐变层,颜色全部由下方 wash token 承载。
53
+ */
54
+ --color-ocean-wash-brand: rgba(59, 98, 246, 0.30);
55
+ --color-ocean-wash-cyan: rgba(87, 199, 232, 0.26);
56
+ --color-ocean-wash-teal: rgba(47, 208, 181, 0.14);
57
+
58
+ --bg-warm-gradient:
59
+ radial-gradient(circle at 14% 8%, rgba(255, 255, 255, 0.62), rgba(255, 255, 255, 0) 26%),
60
+ radial-gradient(circle at 86% 18%, rgba(214, 236, 255, 0.55), rgba(214, 236, 255, 0) 30%),
61
+ linear-gradient(135deg, var(--color-bg) 0%, var(--color-surface-alt) 100%);
62
+
63
+ --color-bg-topbar-strong: rgba(233, 243, 252, 0.96);
64
+ --color-bg-topbar-soft: rgba(233, 243, 252, 0.86);
65
+ --color-bg-topbar-clear: rgba(233, 243, 252, 0);
66
+
67
+ /* 阴影系统:冷色蓝调 */
68
+ --shadow-subtle: 0 1px 2px rgba(16, 48, 92, 0.05);
69
+ --shadow-card: 0 12px 30px rgba(16, 48, 92, 0.08);
70
+ --shadow-card-hover: 0 18px 44px rgba(16, 48, 92, 0.14);
71
+ --shadow-float: 0 22px 56px rgba(12, 40, 80, 0.18);
72
+ --shadow-raised: 0 14px 30px rgba(16, 48, 92, 0.14);
73
+ --shadow-modal:
74
+ 0 16px 42px rgba(12, 40, 80, 0.16),
75
+ 0 34px 84px rgba(12, 40, 80, 0.16);
76
+ --shadow-input-focus:
77
+ 0 0 0 3px var(--color-brand-light),
78
+ 0 1px 2px rgba(16, 48, 92, 0.06);
79
+ }
80
+
81
+ /* 背景海面光晕:固定层,不参与滚动,避免长页面拉伸与错位 */
82
+ :root[data-theme="ocean"] body::before {
83
+ background:
84
+ radial-gradient(1100px 620px at 88% -8%, var(--color-ocean-wash-brand), transparent 62%),
85
+ radial-gradient(900px 560px at -6% 108%, var(--color-ocean-wash-cyan), transparent 58%),
86
+ radial-gradient(520px 340px at 50% 46%, var(--color-ocean-wash-teal), transparent 70%);
87
+ mix-blend-mode: soft-light;
88
+ }