codexmate 0.0.27 → 0.0.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 (51) hide show
  1. package/README.md +1 -1
  2. package/README.zh.md +1 -1
  3. package/cli/builtin-proxy.js +430 -4
  4. package/cli/openai-bridge.js +498 -13
  5. package/cli.js +130 -41
  6. package/lib/cli-models-utils.js +71 -10
  7. package/lib/cli-webhook.js +126 -0
  8. package/package.json +76 -74
  9. package/plugins/prompt-templates/computed.mjs +1 -1
  10. package/plugins/prompt-templates/methods.mjs +0 -66
  11. package/plugins/prompt-templates/overview.mjs +1 -0
  12. package/web-ui/app.js +21 -16
  13. package/web-ui/index.html +1 -0
  14. package/web-ui/logic.codex.mjs +69 -0
  15. package/web-ui/modules/app.computed.dashboard.mjs +54 -0
  16. package/web-ui/modules/app.computed.session.mjs +22 -17
  17. package/web-ui/modules/app.methods.claude-config.mjs +24 -8
  18. package/web-ui/modules/app.methods.codex-config.mjs +35 -3
  19. package/web-ui/modules/app.methods.index.mjs +2 -0
  20. package/web-ui/modules/app.methods.navigation.mjs +21 -3
  21. package/web-ui/modules/app.methods.providers.mjs +96 -7
  22. package/web-ui/modules/app.methods.session-actions.mjs +3 -6
  23. package/web-ui/modules/app.methods.session-browser.mjs +1 -6
  24. package/web-ui/modules/app.methods.session-trash.mjs +6 -7
  25. package/web-ui/modules/app.methods.startup-claude.mjs +8 -1
  26. package/web-ui/modules/app.methods.webhook.mjs +79 -0
  27. package/web-ui/modules/i18n.dict.mjs +1104 -104
  28. package/web-ui/modules/i18n.mjs +9 -3
  29. package/web-ui/modules/provider-url-display.mjs +17 -0
  30. package/web-ui/partials/index/layout-header.html +25 -0
  31. package/web-ui/partials/index/modals-basic.html +0 -3
  32. package/web-ui/partials/index/panel-config-claude.html +10 -3
  33. package/web-ui/partials/index/panel-config-codex.html +44 -4
  34. package/web-ui/partials/index/panel-plugins.html +3 -29
  35. package/web-ui/partials/index/panel-sessions.html +0 -10
  36. package/web-ui/partials/index/panel-settings.html +93 -177
  37. package/web-ui/partials/index/panel-trash.html +88 -0
  38. package/web-ui/session-helpers.mjs +2 -2
  39. package/web-ui/styles/base-theme.css +47 -34
  40. package/web-ui/styles/controls-forms.css +27 -28
  41. package/web-ui/styles/docs-panel.css +63 -39
  42. package/web-ui/styles/layout-shell.css +69 -46
  43. package/web-ui/styles/modals-core.css +12 -10
  44. package/web-ui/styles/navigation-panels.css +36 -35
  45. package/web-ui/styles/responsive.css +4 -4
  46. package/web-ui/styles/sessions-list.css +10 -6
  47. package/web-ui/styles/settings-panel.css +197 -33
  48. package/web-ui/styles/titles-cards.css +90 -26
  49. package/web-ui/styles/trash-panel.css +90 -0
  50. package/web-ui/styles/webhook.css +81 -0
  51. package/web-ui/styles.css +2 -0
@@ -35,14 +35,14 @@
35
35
  ============================================ */
36
36
  .segmented-control {
37
37
  display: flex;
38
- background: var(--color-surface);
39
- border-radius: 10px;
38
+ background: rgba(255, 255, 255, 0.48);
39
+ border-radius: var(--radius-md);
40
40
  padding: 4px;
41
41
  margin-bottom: 14px;
42
42
  position: relative;
43
- box-shadow: none;
44
- border: 1px solid var(--color-border);
45
- backdrop-filter: none;
43
+ box-shadow: var(--shadow-subtle);
44
+ border: 1px solid var(--color-border-soft);
45
+ backdrop-filter: blur(12px);
46
46
  }
47
47
 
48
48
  .segment {
@@ -54,7 +54,7 @@
54
54
  font-weight: var(--font-weight-secondary);
55
55
  color: var(--color-text-secondary);
56
56
  cursor: pointer;
57
- border-radius: 8px;
57
+ border-radius: var(--radius-sm);
58
58
  transition: color var(--transition-fast) var(--ease-smooth), background-color var(--transition-fast) var(--ease-smooth);
59
59
  position: relative;
60
60
  z-index: 2;
@@ -67,8 +67,8 @@
67
67
 
68
68
  .segment.active {
69
69
  color: var(--color-brand-dark);
70
- background: var(--color-brand-light);
71
- box-shadow: inset 0 0 0 1px rgba(199, 116, 98, 0.12);
70
+ background: rgba(255, 255, 255, 0.78);
71
+ box-shadow: 0 8px 18px rgba(92, 68, 52, 0.08), inset 0 0 0 1px rgba(200, 121, 99, 0.12);
72
72
  }
73
73
 
74
74
  /* ============================================
@@ -77,7 +77,7 @@
77
77
  .card-list {
78
78
  display: flex;
79
79
  flex-direction: column;
80
- gap: 8px;
80
+ gap: 10px;
81
81
  margin-bottom: 8px;
82
82
  }
83
83
 
@@ -85,9 +85,10 @@
85
85
  卡片
86
86
  ============================================ */
87
87
  .card {
88
- background: var(--color-surface);
89
- border-radius: 10px;
90
- padding: 10px 12px;
88
+ background:
89
+ linear-gradient(180deg, rgba(255, 255, 255, 0.86), rgba(255, 251, 247, 0.76));
90
+ border-radius: var(--radius-md);
91
+ padding: 12px 14px;
91
92
  display: flex;
92
93
  align-items: center;
93
94
  justify-content: space-between;
@@ -95,18 +96,20 @@
95
96
  transition:
96
97
  border-color var(--transition-fast) var(--ease-smooth),
97
98
  background-color var(--transition-fast) var(--ease-smooth),
98
- box-shadow var(--transition-fast) var(--ease-smooth);
99
- box-shadow: none;
99
+ box-shadow var(--transition-fast) var(--ease-smooth),
100
+ transform var(--transition-fast) var(--ease-smooth);
101
+ box-shadow: var(--shadow-card);
100
102
  user-select: none;
101
103
  will-change: auto;
102
- border: 1px solid var(--color-border);
104
+ border: 1px solid var(--color-border-soft);
103
105
  position: relative;
104
106
  overflow: hidden;
105
107
  }
106
108
 
107
109
  .card:hover {
108
110
  border-color: var(--color-border-strong);
109
- box-shadow: none;
111
+ box-shadow: var(--shadow-card-hover);
112
+ transform: translateY(-1px);
110
113
  }
111
114
 
112
115
  .card::before,
@@ -130,7 +133,7 @@
130
133
  .card::after {
131
134
  inset: 0;
132
135
  border-radius: inherit;
133
- background: linear-gradient(120deg, rgba(255, 255, 255, 0.1) 0%, transparent 55%);
136
+ background: linear-gradient(120deg, rgba(255, 255, 255, 0.55) 0%, transparent 58%);
134
137
  opacity: 0;
135
138
  transition: opacity var(--transition-fast) var(--ease-smooth);
136
139
  }
@@ -141,9 +144,10 @@
141
144
  }
142
145
 
143
146
  .card.active {
144
- background: var(--color-brand-light);
145
- border-color: rgba(199, 116, 98, 0.18);
146
- box-shadow: none;
147
+ background:
148
+ linear-gradient(135deg, rgba(255, 255, 255, 0.9), rgba(200, 121, 99, 0.15));
149
+ border-color: rgba(200, 121, 99, 0.28);
150
+ box-shadow: 0 14px 34px rgba(92, 68, 52, 0.12);
147
151
  }
148
152
 
149
153
  .card.active::before {
@@ -169,8 +173,8 @@
169
173
  .card-icon {
170
174
  width: 32px;
171
175
  height: 32px;
172
- border-radius: 8px;
173
- background: rgba(199, 116, 98, 0.1);
176
+ border-radius: var(--radius-sm);
177
+ background: rgba(200, 121, 99, 0.12);
174
178
  display: flex;
175
179
  align-items: center;
176
180
  justify-content: center;
@@ -179,13 +183,13 @@
179
183
  color: var(--color-brand-dark);
180
184
  flex-shrink: 0;
181
185
  transition: background-color var(--transition-fast) var(--ease-smooth), color var(--transition-fast) var(--ease-smooth);
182
- box-shadow: none;
186
+ box-shadow: inset 0 0 0 1px rgba(200, 121, 99, 0.08);
183
187
  }
184
188
 
185
189
  .card.active .card-icon {
186
- background: rgba(199, 116, 98, 0.14);
190
+ background: rgba(200, 121, 99, 0.18);
187
191
  color: var(--color-brand-dark);
188
- box-shadow: none;
192
+ box-shadow: inset 0 0 0 1px rgba(200, 121, 99, 0.14);
189
193
  }
190
194
 
191
195
  .card-content {
@@ -239,6 +243,19 @@
239
243
  opacity: 0.9;
240
244
  }
241
245
 
246
+ .card-subtitle-model {
247
+ font-weight: 500;
248
+ color: var(--color-text-secondary);
249
+ opacity: 1;
250
+ }
251
+
252
+ .card-subtitle-url {
253
+ font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
254
+ font-size: 11px;
255
+ opacity: 0.75;
256
+ margin-top: 2px;
257
+ }
258
+
242
259
  .card-trailing {
243
260
  display: grid;
244
261
  grid-auto-flow: column;
@@ -304,7 +321,7 @@
304
321
  }
305
322
 
306
323
  .card-action-btn:hover {
307
- background: linear-gradient(135deg, rgba(210, 107, 90, 0.08) 0%, rgba(255, 255, 255, 0.95) 100%);
324
+ background: linear-gradient(135deg, rgba(200, 121, 99, 0.1) 0%, rgba(255, 255, 255, 0.95) 100%);
308
325
  color: var(--color-text-primary);
309
326
  transform: translateY(-1px);
310
327
  }
@@ -406,3 +423,50 @@
406
423
  color: var(--color-text-tertiary);
407
424
  opacity: 0.5;
408
425
  }
426
+
427
+ .provider-transform-icon {
428
+ display: inline-flex;
429
+ align-items: center;
430
+ justify-content: center;
431
+ margin-left: 6px;
432
+ font-size: 14px;
433
+ line-height: 1;
434
+ opacity: 0.6;
435
+ flex-shrink: 0;
436
+ cursor: help;
437
+ transition: opacity 0.2s ease;
438
+ }
439
+
440
+ .provider-transform-icon:hover {
441
+ opacity: 1;
442
+ }
443
+
444
+ .card-icon {
445
+ position: relative;
446
+ }
447
+
448
+ .card-icon-dot {
449
+ position: absolute;
450
+ bottom: -2px;
451
+ right: -2px;
452
+ width: 7px;
453
+ height: 7px;
454
+ border-radius: 50%;
455
+ background: #22c55e;
456
+ border: 1.5px solid var(--color-surface);
457
+ box-shadow: 0 0 4px rgba(34, 197, 94, 0.6), 0 0 8px rgba(34, 197, 94, 0.3);
458
+ animation: breathe 2s ease-in-out infinite;
459
+ }
460
+
461
+ @keyframes breathe {
462
+ 0%, 100% {
463
+ box-shadow: 0 0 4px rgba(34, 197, 94, 0.6), 0 0 8px rgba(34, 197, 94, 0.3);
464
+ }
465
+ 50% {
466
+ box-shadow: 0 0 10px rgba(34, 197, 94, 0.8), 0 0 18px rgba(34, 197, 94, 0.5);
467
+ }
468
+ }
469
+
470
+ .provider-transform-icon {
471
+ display: none;
472
+ }
@@ -0,0 +1,90 @@
1
+ /* 回收站面板 — 极简·本质 */
2
+
3
+ .trash-panel-shell {
4
+ max-width: 720px;
5
+ margin: 0 auto;
6
+ padding: 20px 0 40px;
7
+ }
8
+
9
+ /* ---- 空态 — 宁静留白 ---- */
10
+ .trash-empty-state {
11
+ display: flex;
12
+ flex-direction: column;
13
+ align-items: center;
14
+ justify-content: center;
15
+ gap: 12px;
16
+ padding: 80px 20px;
17
+ text-align: center;
18
+ }
19
+
20
+ .trash-empty-icon {
21
+ font-size: 40px;
22
+ line-height: 1;
23
+ opacity: 0.45;
24
+ margin-bottom: 4px;
25
+ }
26
+
27
+ .trash-empty-title {
28
+ font-size: 15px;
29
+ font-weight: 600;
30
+ color: var(--color-text-secondary);
31
+ }
32
+
33
+ .trash-empty-hint {
34
+ font-size: var(--font-size-caption);
35
+ color: var(--color-text-muted);
36
+ max-width: 280px;
37
+ line-height: 1.5;
38
+ }
39
+
40
+ /* ---- 工具栏 — 克制·精确 ---- */
41
+ .trash-toolbar {
42
+ display: flex;
43
+ align-items: center;
44
+ justify-content: space-between;
45
+ gap: 12px;
46
+ padding: 0 0 14px;
47
+ border-bottom: 1px solid var(--color-border-soft);
48
+ margin-bottom: 14px;
49
+ }
50
+
51
+ .trash-toolbar-left {
52
+ display: flex;
53
+ align-items: baseline;
54
+ gap: 6px;
55
+ }
56
+
57
+ .trash-toolbar-count {
58
+ font-size: 13px;
59
+ font-weight: 600;
60
+ color: var(--color-text-primary);
61
+ }
62
+
63
+ .trash-toolbar-retention {
64
+ font-size: var(--font-size-caption);
65
+ color: var(--color-text-muted);
66
+ }
67
+
68
+ .trash-toolbar-right {
69
+ display: flex;
70
+ align-items: center;
71
+ gap: 6px;
72
+ }
73
+
74
+ /* ---- 列表项微调 ---- */
75
+ .trash-item-dot {
76
+ color: var(--color-text-muted);
77
+ margin: 0 2px;
78
+ }
79
+
80
+ .trash-item-time {
81
+ font-size: var(--font-size-caption);
82
+ color: var(--color-text-muted);
83
+ }
84
+
85
+ /* ---- 加载更多 ---- */
86
+ .trash-list-footer {
87
+ display: flex;
88
+ justify-content: center;
89
+ padding: 16px 0;
90
+ }
@@ -0,0 +1,81 @@
1
+ /* webhook 行 — 对齐暖色设计系统 */
2
+ .webhook-row {
3
+ display: flex;
4
+ align-items: center;
5
+ gap: 6px;
6
+ margin: 6px 0;
7
+ }
8
+
9
+ .webhook-events {
10
+ display: flex;
11
+ flex-wrap: wrap;
12
+ gap: 8px;
13
+ margin: 6px 0;
14
+ }
15
+
16
+ .webhook-event-item {
17
+ display: inline-flex;
18
+ align-items: center;
19
+ gap: 4px;
20
+ font-size: var(--font-size-caption);
21
+ color: var(--color-text-secondary);
22
+ }
23
+
24
+ .status-on {
25
+ color: var(--color-success);
26
+ font-weight: var(--font-weight-secondary);
27
+ }
28
+
29
+ .status-off {
30
+ color: var(--color-text-muted);
31
+ }
32
+
33
+ /* 只读展示行 */
34
+ .webhook-readonly-row {
35
+ display: flex;
36
+ align-items: flex-start;
37
+ gap: 12px;
38
+ padding: 6px 0;
39
+ }
40
+
41
+ .webhook-readonly-row + .webhook-readonly-row {
42
+ border-top: 1px solid var(--color-border-soft);
43
+ }
44
+
45
+ .webhook-readonly-label {
46
+ flex: 0 0 56px;
47
+ font-size: var(--font-size-caption);
48
+ color: var(--color-text-muted);
49
+ font-weight: var(--font-weight-secondary);
50
+ padding-top: 2px;
51
+ }
52
+
53
+ .webhook-readonly-value {
54
+ flex: 1 1 auto;
55
+ min-width: 0;
56
+ font-family: var(--font-family-mono);
57
+ font-size: 11px;
58
+ padding: 2px 8px;
59
+ border-radius: 6px;
60
+ background: rgba(247, 240, 233, 0.55);
61
+ color: var(--color-text-secondary);
62
+ word-break: break-all;
63
+ line-height: 1.5;
64
+ }
65
+
66
+ .webhook-readonly-tags {
67
+ display: flex;
68
+ flex-wrap: wrap;
69
+ gap: 6px;
70
+ }
71
+
72
+ .webhook-event-tag {
73
+ display: inline-block;
74
+ padding: 2px 8px;
75
+ border-radius: 999px;
76
+ border: 1px solid var(--color-border);
77
+ background: var(--color-brand-light);
78
+ color: var(--color-brand-dark);
79
+ font-size: var(--font-size-caption);
80
+ font-weight: var(--font-weight-secondary);
81
+ }
package/web-ui/styles.css CHANGED
@@ -19,3 +19,5 @@
19
19
  @import url('./styles/docs-panel.css');
20
20
  @import url('./styles/feedback.css');
21
21
  @import url('./styles/responsive.css');
22
+ @import url('./styles/webhook.css');
23
+ @import url('./styles/trash-panel.css');