codexmate 0.0.18 → 0.0.20

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 (73) hide show
  1. package/README.en.md +34 -17
  2. package/README.md +34 -25
  3. package/cli/config-health.js +338 -0
  4. package/cli.js +1570 -839
  5. package/lib/cli-models-utils.js +186 -27
  6. package/lib/cli-network-utils.js +117 -101
  7. package/package.json +8 -1
  8. package/web-ui/app.js +379 -5754
  9. package/web-ui/index.html +15 -2079
  10. package/web-ui/logic.agents-diff.mjs +386 -0
  11. package/web-ui/logic.claude.mjs +108 -0
  12. package/web-ui/logic.mjs +5 -793
  13. package/web-ui/logic.runtime.mjs +124 -0
  14. package/web-ui/logic.sessions.mjs +263 -0
  15. package/web-ui/modules/api.mjs +69 -0
  16. package/web-ui/modules/app.computed.dashboard.mjs +113 -0
  17. package/web-ui/modules/app.computed.index.mjs +13 -0
  18. package/web-ui/modules/app.computed.session.mjs +141 -0
  19. package/web-ui/modules/app.constants.mjs +15 -0
  20. package/web-ui/modules/app.methods.agents.mjs +493 -0
  21. package/web-ui/modules/app.methods.claude-config.mjs +174 -0
  22. package/web-ui/modules/app.methods.codex-config.mjs +640 -0
  23. package/web-ui/modules/app.methods.index.mjs +86 -0
  24. package/web-ui/modules/app.methods.install.mjs +157 -0
  25. package/web-ui/modules/app.methods.navigation.mjs +478 -0
  26. package/web-ui/modules/app.methods.openclaw-core.mjs +514 -0
  27. package/web-ui/modules/app.methods.openclaw-editing.mjs +337 -0
  28. package/web-ui/modules/app.methods.openclaw-persist.mjs +251 -0
  29. package/web-ui/modules/app.methods.providers.mjs +265 -0
  30. package/web-ui/modules/app.methods.runtime.mjs +323 -0
  31. package/web-ui/modules/app.methods.session-actions.mjs +457 -0
  32. package/web-ui/modules/app.methods.session-browser.mjs +435 -0
  33. package/web-ui/modules/app.methods.session-timeline.mjs +441 -0
  34. package/web-ui/modules/app.methods.session-trash.mjs +419 -0
  35. package/web-ui/modules/app.methods.startup-claude.mjs +406 -0
  36. package/web-ui/modules/config-mode.computed.mjs +1 -0
  37. package/web-ui/modules/skills.computed.mjs +26 -1
  38. package/web-ui/modules/skills.methods.mjs +154 -23
  39. package/web-ui/partials/index/layout-footer.html +69 -0
  40. package/web-ui/partials/index/layout-header.html +337 -0
  41. package/web-ui/partials/index/modal-config-template-agents.html +125 -0
  42. package/web-ui/partials/index/modal-confirm-toast.html +32 -0
  43. package/web-ui/partials/index/modal-health-check.html +72 -0
  44. package/web-ui/partials/index/modal-openclaw-config.html +275 -0
  45. package/web-ui/partials/index/modal-skills.html +184 -0
  46. package/web-ui/partials/index/modals-basic.html +196 -0
  47. package/web-ui/partials/index/panel-config-claude.html +100 -0
  48. package/web-ui/partials/index/panel-config-codex.html +237 -0
  49. package/web-ui/partials/index/panel-config-openclaw.html +84 -0
  50. package/web-ui/partials/index/panel-market.html +174 -0
  51. package/web-ui/partials/index/panel-sessions.html +387 -0
  52. package/web-ui/partials/index/panel-settings.html +166 -0
  53. package/web-ui/session-helpers.mjs +12 -0
  54. package/web-ui/source-bundle.cjs +233 -0
  55. package/web-ui/styles/base-theme.css +373 -0
  56. package/web-ui/styles/controls-forms.css +354 -0
  57. package/web-ui/styles/feedback.css +108 -0
  58. package/web-ui/styles/health-check-dialog.css +144 -0
  59. package/web-ui/styles/layout-shell.css +330 -0
  60. package/web-ui/styles/modals-core.css +449 -0
  61. package/web-ui/styles/navigation-panels.css +381 -0
  62. package/web-ui/styles/openclaw-structured.css +266 -0
  63. package/web-ui/styles/responsive.css +416 -0
  64. package/web-ui/styles/sessions-list.css +414 -0
  65. package/web-ui/styles/sessions-preview.css +405 -0
  66. package/web-ui/styles/sessions-toolbar-trash.css +243 -0
  67. package/web-ui/styles/sessions-usage.css +276 -0
  68. package/web-ui/styles/skills-list.css +298 -0
  69. package/web-ui/styles/skills-market.css +335 -0
  70. package/web-ui/styles/titles-cards.css +407 -0
  71. package/web-ui/styles.css +16 -4499
  72. package/doc/CHANGELOG.md +0 -32
  73. package/doc/CHANGELOG.zh-CN.md +0 -34
@@ -0,0 +1,276 @@
1
+ .sessions-subtabs {
2
+ display: flex;
3
+ gap: 10px;
4
+ align-items: center;
5
+ margin: 0 0 16px;
6
+ }
7
+
8
+ .sessions-subtab {
9
+ border: 1px solid var(--color-border);
10
+ background: var(--color-surface-alt);
11
+ color: var(--color-text-secondary);
12
+ padding: 8px 14px;
13
+ border-radius: 999px;
14
+ cursor: pointer;
15
+ font-size: 13px;
16
+ font-weight: 600;
17
+ transition:
18
+ background var(--transition-fast) var(--ease-smooth),
19
+ color var(--transition-fast) var(--ease-smooth),
20
+ border-color var(--transition-fast) var(--ease-smooth),
21
+ box-shadow var(--transition-fast) var(--ease-smooth),
22
+ transform var(--transition-fast) var(--ease-smooth);
23
+ }
24
+
25
+ .sessions-subtab:hover {
26
+ background: var(--color-surface);
27
+ border-color: var(--color-border-strong);
28
+ color: var(--color-text-primary);
29
+ }
30
+
31
+ .sessions-subtab.active {
32
+ background: var(--color-brand-light);
33
+ color: var(--color-brand-dark);
34
+ border-color: var(--color-brand);
35
+ box-shadow: var(--shadow-subtle);
36
+ }
37
+
38
+ .usage-toolbar {
39
+ display: flex;
40
+ justify-content: space-between;
41
+ align-items: center;
42
+ gap: 12px;
43
+ flex-wrap: wrap;
44
+ margin-bottom: 16px;
45
+ }
46
+
47
+ .usage-range-group {
48
+ display: flex;
49
+ gap: 8px;
50
+ flex-wrap: wrap;
51
+ }
52
+
53
+ .usage-range-btn {
54
+ border: 1px solid var(--color-border);
55
+ background: var(--color-surface-alt);
56
+ color: var(--color-text-secondary);
57
+ padding: 6px 12px;
58
+ border-radius: 999px;
59
+ cursor: pointer;
60
+ font-size: 12px;
61
+ font-weight: 600;
62
+ transition:
63
+ background var(--transition-fast) var(--ease-smooth),
64
+ color var(--transition-fast) var(--ease-smooth),
65
+ border-color var(--transition-fast) var(--ease-smooth),
66
+ box-shadow var(--transition-fast) var(--ease-smooth);
67
+ }
68
+
69
+ .usage-range-btn:hover {
70
+ background: var(--color-surface);
71
+ border-color: var(--color-border-strong);
72
+ color: var(--color-text-primary);
73
+ }
74
+
75
+ .usage-range-btn.active {
76
+ background: var(--color-brand-light);
77
+ color: var(--color-brand-dark);
78
+ border-color: var(--color-brand);
79
+ box-shadow: var(--shadow-subtle);
80
+ }
81
+
82
+ .usage-summary-grid {
83
+ display: grid;
84
+ grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));
85
+ gap: 12px;
86
+ margin-bottom: 16px;
87
+ }
88
+
89
+ .usage-summary-card {
90
+ padding: 14px 16px;
91
+ border-radius: 14px;
92
+ background: var(--color-surface-alt);
93
+ border: 1px solid var(--color-border-soft);
94
+ box-shadow: var(--shadow-subtle);
95
+ }
96
+
97
+ .usage-summary-label {
98
+ font-size: 12px;
99
+ color: var(--color-text-secondary);
100
+ margin-bottom: 6px;
101
+ }
102
+
103
+ .usage-summary-value {
104
+ font-size: 24px;
105
+ font-weight: 700;
106
+ color: var(--color-text-primary);
107
+ }
108
+
109
+ .usage-chart-grid {
110
+ display: grid;
111
+ grid-template-columns: 2fr 1fr;
112
+ gap: 16px;
113
+ }
114
+
115
+ .usage-card {
116
+ padding: 16px;
117
+ border-radius: 16px;
118
+ background: var(--color-surface);
119
+ border: 1px solid var(--color-border-soft);
120
+ box-shadow: var(--shadow-subtle);
121
+ min-width: 0;
122
+ overflow: hidden;
123
+ }
124
+
125
+ .usage-card-title {
126
+ font-size: 14px;
127
+ font-weight: 700;
128
+ color: var(--color-text-primary);
129
+ margin-bottom: 12px;
130
+ }
131
+
132
+ .usage-bars {
133
+ display: flex;
134
+ align-items: flex-end;
135
+ gap: 8px;
136
+ min-height: 180px;
137
+ width: 100%;
138
+ min-width: 0;
139
+ overflow-x: auto;
140
+ overflow-y: hidden;
141
+ padding-bottom: 4px;
142
+ }
143
+
144
+ .usage-bar-group {
145
+ flex: 1 0 44px;
146
+ min-width: 44px;
147
+ display: flex;
148
+ flex-direction: column;
149
+ align-items: center;
150
+ gap: 8px;
151
+ }
152
+
153
+ .usage-bar-stack {
154
+ width: 100%;
155
+ max-width: 36px;
156
+ height: 160px;
157
+ display: flex;
158
+ align-items: flex-end;
159
+ gap: 4px;
160
+ }
161
+
162
+ .usage-bar {
163
+ flex: 1;
164
+ border-radius: 10px 10px 4px 4px;
165
+ min-height: 4px;
166
+ }
167
+
168
+ .usage-bar.codex {
169
+ background: var(--color-brand);
170
+ }
171
+
172
+ .usage-bar.claude {
173
+ background: #8b6bd6;
174
+ }
175
+
176
+ .usage-bar-label {
177
+ font-size: 11px;
178
+ color: var(--color-text-secondary);
179
+ width: 100%;
180
+ text-align: center;
181
+ white-space: nowrap;
182
+ overflow: hidden;
183
+ text-overflow: ellipsis;
184
+ }
185
+
186
+ .usage-legend {
187
+ display: flex;
188
+ gap: 14px;
189
+ flex-wrap: wrap;
190
+ font-size: 12px;
191
+ color: var(--color-text-secondary);
192
+ margin-bottom: 10px;
193
+ }
194
+
195
+ .usage-legend-dot {
196
+ width: 10px;
197
+ height: 10px;
198
+ border-radius: 999px;
199
+ display: inline-block;
200
+ margin-right: 6px;
201
+ }
202
+
203
+ .usage-list {
204
+ display: flex;
205
+ flex-direction: column;
206
+ gap: 10px;
207
+ min-width: 0;
208
+ }
209
+
210
+ .usage-list-row {
211
+ display: grid;
212
+ grid-template-columns: minmax(56px, 72px) minmax(0, 1fr) minmax(48px, auto);
213
+ gap: 10px;
214
+ align-items: center;
215
+ min-width: 0;
216
+ }
217
+
218
+ .usage-list-label,
219
+ .usage-list-value {
220
+ font-size: 12px;
221
+ color: var(--color-text-secondary);
222
+ min-width: 0;
223
+ }
224
+
225
+ .usage-list-value {
226
+ word-break: break-word;
227
+ overflow-wrap: anywhere;
228
+ text-align: right;
229
+ }
230
+
231
+ .usage-progress {
232
+ height: 8px;
233
+ border-radius: 999px;
234
+ background: rgba(71, 60, 52, 0.10);
235
+ overflow: hidden;
236
+ }
237
+
238
+ .usage-progress-fill {
239
+ height: 100%;
240
+ border-radius: 999px;
241
+ background: linear-gradient(90deg, var(--color-brand), #8b6bd6);
242
+ }
243
+
244
+ .usage-empty {
245
+ padding: 24px 16px;
246
+ border-radius: 16px;
247
+ background: var(--color-surface-alt);
248
+ border: 1px dashed var(--color-border);
249
+ color: var(--color-text-secondary);
250
+ }
251
+
252
+ @media (max-width: 960px) {
253
+ .usage-chart-grid {
254
+ grid-template-columns: 1fr;
255
+ }
256
+ }
257
+
258
+ @media (max-width: 640px) {
259
+ .usage-list-row {
260
+ grid-template-columns: 1fr;
261
+ gap: 6px;
262
+ }
263
+
264
+ .usage-list-value {
265
+ text-align: left;
266
+ }
267
+
268
+ .usage-bar-group {
269
+ flex-basis: 36px;
270
+ min-width: 36px;
271
+ }
272
+
273
+ .usage-bar-stack {
274
+ max-width: 28px;
275
+ }
276
+ }
@@ -0,0 +1,298 @@
1
+ .skills-hint-line,
2
+ .hint-single-line {
3
+ display: block;
4
+ white-space: nowrap;
5
+ overflow: hidden;
6
+ text-overflow: ellipsis;
7
+ max-width: 100%;
8
+ }
9
+
10
+ .skill-list {
11
+ display: flex;
12
+ flex-direction: column;
13
+ gap: var(--spacing-xs);
14
+ margin-bottom: var(--spacing-sm);
15
+ max-height: min(52vh, 440px);
16
+ overflow-y: auto;
17
+ padding-right: 2px;
18
+ scrollbar-width: thin;
19
+ scrollbar-color: rgba(166, 149, 130, 0.82) transparent;
20
+ }
21
+
22
+ .skill-list::-webkit-scrollbar {
23
+ width: 6px;
24
+ height: 6px;
25
+ }
26
+
27
+ .skill-list::-webkit-scrollbar-track {
28
+ background: transparent;
29
+ border-radius: 999px;
30
+ }
31
+
32
+ .skill-list::-webkit-scrollbar-thumb {
33
+ background: linear-gradient(to bottom, rgba(191, 174, 154, 0.95) 0%, rgba(160, 141, 121, 0.9) 100%);
34
+ border-radius: 999px;
35
+ border: 1px solid rgba(255, 255, 255, 0.9);
36
+ }
37
+
38
+ .skill-list::-webkit-scrollbar-thumb:hover {
39
+ background: linear-gradient(to bottom, rgba(176, 157, 137, 0.95) 0%, rgba(145, 126, 107, 0.92) 100%);
40
+ }
41
+
42
+ .skill-item {
43
+ display: flex;
44
+ align-items: flex-start;
45
+ gap: var(--spacing-xs);
46
+ border: 1px dashed var(--color-border-soft);
47
+ border-radius: var(--radius-sm);
48
+ padding: var(--spacing-xs);
49
+ background: var(--color-surface-alt);
50
+ transition: border-color var(--transition-fast) var(--ease-spring), background-color var(--transition-fast) var(--ease-spring);
51
+ }
52
+
53
+ .skill-item-main {
54
+ min-width: 0;
55
+ display: flex;
56
+ flex-direction: column;
57
+ gap: 6px;
58
+ flex: 1;
59
+ }
60
+
61
+ .skill-item-title {
62
+ font-size: var(--font-size-secondary);
63
+ font-weight: var(--font-weight-secondary);
64
+ color: var(--color-text-secondary);
65
+ }
66
+
67
+ .skill-item-description {
68
+ font-size: var(--font-size-caption);
69
+ line-height: 1.45;
70
+ color: var(--color-text-tertiary);
71
+ }
72
+
73
+ .skill-item-meta {
74
+ display: flex;
75
+ flex-wrap: wrap;
76
+ gap: var(--spacing-xs);
77
+ align-items: center;
78
+ min-width: 0;
79
+ }
80
+
81
+ .skill-item-path {
82
+ font-family: var(--font-family-mono);
83
+ font-size: var(--font-size-caption);
84
+ color: var(--color-text-tertiary);
85
+ word-break: break-all;
86
+ }
87
+
88
+ .skill-item:hover {
89
+ border-color: rgba(201, 94, 75, 0.35);
90
+ }
91
+
92
+ .skill-item.selected {
93
+ border-color: rgba(201, 94, 75, 0.55);
94
+ background: linear-gradient(to bottom, rgba(201, 94, 75, 0.10) 0%, rgba(201, 94, 75, 0.04) 100%);
95
+ }
96
+
97
+ .skills-empty-state {
98
+ margin-bottom: var(--spacing-sm);
99
+ border: 1px dashed var(--color-border-soft);
100
+ border-radius: var(--radius-sm);
101
+ background: linear-gradient(to bottom, rgba(255, 255, 255, 0.78) 0%, rgba(255, 255, 255, 0.58) 100%);
102
+ color: var(--color-text-tertiary);
103
+ font-size: var(--font-size-secondary);
104
+ text-align: center;
105
+ padding: 18px 12px;
106
+ }
107
+
108
+ .skills-import-block {
109
+ margin-bottom: var(--spacing-sm);
110
+ }
111
+
112
+ .skills-import-title {
113
+ font-size: var(--font-size-body);
114
+ font-weight: var(--font-weight-secondary);
115
+ color: var(--color-text-secondary);
116
+ }
117
+
118
+ .skills-import-list {
119
+ max-height: min(28vh, 260px);
120
+ }
121
+
122
+ .skills-import-empty {
123
+ margin-bottom: 0;
124
+ }
125
+
126
+ .list-row {
127
+ display: flex;
128
+ flex-wrap: wrap;
129
+ gap: var(--spacing-xs);
130
+ align-items: center;
131
+ margin-bottom: var(--spacing-xs);
132
+ }
133
+
134
+ .list-row:last-child {
135
+ margin-bottom: 0;
136
+ }
137
+
138
+ .list-row .form-input {
139
+ flex: 1;
140
+ min-width: 140px;
141
+ }
142
+
143
+ .btn-mini {
144
+ padding: 6px 10px;
145
+ border-radius: var(--radius-sm);
146
+ border: 1px solid var(--color-border-soft);
147
+ background: linear-gradient(to bottom, rgba(255, 255, 255, 0.95) 0%, rgba(255, 255, 255, 0.85) 100%);
148
+ font-size: var(--font-size-caption);
149
+ font-weight: var(--font-weight-secondary);
150
+ color: var(--color-text-secondary);
151
+ cursor: pointer;
152
+ transition: all var(--transition-fast) var(--ease-spring);
153
+ box-shadow: var(--shadow-subtle);
154
+ }
155
+
156
+ .btn-mini:hover {
157
+ border-color: var(--color-brand);
158
+ color: var(--color-brand);
159
+ transform: translateY(-1px);
160
+ }
161
+
162
+ .btn-mini.delete {
163
+ color: var(--color-error);
164
+ border-color: rgba(193, 72, 59, 0.35);
165
+ }
166
+
167
+ .btn-mini.delete:hover {
168
+ border-color: rgba(193, 72, 59, 0.7);
169
+ color: var(--color-error);
170
+ }
171
+
172
+ .btn-group {
173
+ display: flex;
174
+ gap: var(--spacing-sm);
175
+ margin-top: var(--spacing-md);
176
+ }
177
+
178
+ .btn {
179
+ flex: 1;
180
+ padding: 14px var(--spacing-sm);
181
+ border-radius: var(--radius-sm);
182
+ font-size: var(--font-size-body);
183
+ font-weight: var(--font-weight-secondary);
184
+ cursor: pointer;
185
+ transition: all var(--transition-fast) var(--ease-spring);
186
+ border: 1px solid var(--color-border-soft);
187
+ background: linear-gradient(to bottom, var(--color-surface) 0%, rgba(255, 255, 255, 0.95) 100%);
188
+ color: var(--color-text-secondary);
189
+ box-shadow: var(--shadow-subtle);
190
+ letter-spacing: -0.01em;
191
+ }
192
+
193
+ .btn:active {
194
+ transform: scale(0.985);
195
+ }
196
+
197
+ .btn-cancel {
198
+ background: linear-gradient(to bottom, var(--color-bg) 0%, rgba(247, 241, 232, 0.8) 100%);
199
+ color: var(--color-text-primary);
200
+ border: 1px solid var(--color-border-soft);
201
+ }
202
+
203
+ .btn-cancel:hover {
204
+ background: linear-gradient(to bottom, var(--color-border) 0%, rgba(208, 196, 182, 0.5) 100%);
205
+ }
206
+
207
+ .btn-confirm {
208
+ background: linear-gradient(135deg, var(--color-brand) 0%, var(--color-brand-dark) 100%);
209
+ color: white;
210
+ box-shadow: 0 2px 4px rgba(210, 107, 90, 0.2);
211
+ border: none;
212
+ }
213
+
214
+ .btn-confirm:hover {
215
+ box-shadow: 0 4px 8px rgba(210, 107, 90, 0.25);
216
+ filter: brightness(1.05);
217
+ }
218
+
219
+ .btn-confirm.secondary {
220
+ background: linear-gradient(135deg, var(--color-success) 0%, rgba(90, 139, 106, 0.85) 100%);
221
+ box-shadow: 0 2px 4px rgba(90, 139, 106, 0.2);
222
+ border: none;
223
+ }
224
+
225
+ .btn-confirm.secondary:hover {
226
+ box-shadow: 0 4px 8px rgba(90, 139, 106, 0.25);
227
+ filter: brightness(1.05);
228
+ }
229
+
230
+ .btn-confirm.btn-danger {
231
+ background: linear-gradient(135deg, #c75642 0%, #9f392c 100%);
232
+ box-shadow: 0 2px 4px rgba(163, 51, 38, 0.24);
233
+ }
234
+
235
+ .btn-confirm.btn-danger:hover {
236
+ box-shadow: 0 4px 10px rgba(163, 51, 38, 0.28);
237
+ filter: brightness(1.04);
238
+ }
239
+
240
+ /* ============================================
241
+ 模型列表
242
+ ============================================ */
243
+ .model-list {
244
+ max-height: 200px;
245
+ overflow-y: auto;
246
+ border: 1px solid rgba(208, 196, 182, 0.4);
247
+ border-radius: var(--radius-sm);
248
+ margin-bottom: var(--spacing-sm);
249
+ scrollbar-width: none;
250
+ background: linear-gradient(to bottom, var(--color-surface) 0%, rgba(255, 255, 255, 0.8) 100%);
251
+ box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.02);
252
+ }
253
+
254
+ .model-list::-webkit-scrollbar {
255
+ display: none;
256
+ }
257
+
258
+ .model-item {
259
+ display: flex;
260
+ justify-content: space-between;
261
+ align-items: center;
262
+ padding: 11px var(--spacing-sm);
263
+ border-bottom: 1px solid rgba(208, 196, 182, 0.3);
264
+ font-size: var(--font-size-body);
265
+ color: var(--color-text-primary);
266
+ transition: all var(--transition-fast) var(--ease-spring);
267
+ letter-spacing: -0.005em;
268
+ }
269
+
270
+ .model-item:last-child {
271
+ border-bottom: none;
272
+ }
273
+
274
+ .model-item:hover {
275
+ background: linear-gradient(to right, rgba(247, 241, 232, 0.6) 0%, rgba(247, 241, 232, 0.3) 100%);
276
+ }
277
+
278
+ .btn-remove-model {
279
+ font-size: var(--font-size-caption);
280
+ font-weight: var(--font-weight-caption);
281
+ color: var(--color-text-tertiary);
282
+ cursor: pointer;
283
+ padding: 5px 10px;
284
+ border-radius: var(--radius-full);
285
+ transition: all var(--transition-fast) var(--ease-spring);
286
+ background: transparent;
287
+ border: 1px solid rgba(139, 118, 104, 0.2);
288
+ letter-spacing: 0.03em;
289
+ }
290
+
291
+ .btn-remove-model:hover {
292
+ background: linear-gradient(135deg, var(--color-error) 0%, rgba(200, 74, 58, 0.9) 100%);
293
+ color: white;
294
+ transform: scale(1.08);
295
+ box-shadow: 0 2px 6px rgba(200, 74, 58, 0.25);
296
+ border-color: transparent;
297
+ }
298
+