@chrysb/alphaclaw 0.8.2 → 0.8.3-beta.0

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.
package/README.md CHANGED
@@ -175,6 +175,7 @@ If you need OpenClaw's full security posture (manual pairing codes, no query-str
175
175
 
176
176
  ```bash
177
177
  npm install
178
+ npm run build:ui # Generate Setup UI bundle, Tailwind CSS, and vendor CSS (required for local runs from a git checkout)
178
179
  npm test # Full suite (440 tests)
179
180
  npm run test:watchdog # Watchdog-focused suite (14 tests)
180
181
  npm run test:watch # Watch mode
@@ -0,0 +1,426 @@
1
+ /* ── Chat route ──────────────────────────────── */
2
+
3
+ .app-content-pane.chat-pane {
4
+ padding: 0;
5
+ }
6
+
7
+ .chat-route-shell {
8
+ display: flex;
9
+ flex-direction: column;
10
+ min-height: 100%;
11
+ height: 100%;
12
+ }
13
+
14
+ .chat-route-header {
15
+ padding: 16px 24px 10px;
16
+ border-bottom: 1px solid var(--border);
17
+ }
18
+
19
+ .chat-route-title {
20
+ font-size: 16px;
21
+ font-weight: 600;
22
+ color: var(--text);
23
+ }
24
+
25
+ .chat-route-subtitle {
26
+ margin-top: 4px;
27
+ font-size: 12px;
28
+ color: var(--text-muted);
29
+ }
30
+
31
+ .chat-route-warning {
32
+ margin-top: 8px;
33
+ font-size: 12px;
34
+ color: #fca5a5;
35
+ }
36
+
37
+ .chat-thread {
38
+ flex: 1 1 auto;
39
+ min-height: 0;
40
+ overflow-y: auto;
41
+ padding: 16px 24px;
42
+ display: flex;
43
+ flex-direction: column;
44
+ gap: 10px;
45
+ }
46
+
47
+ .chat-empty-state {
48
+ color: var(--text-dim);
49
+ font-size: 12px;
50
+ text-align: center;
51
+ margin-top: 24px;
52
+ }
53
+
54
+ .chat-bubble {
55
+ max-width: 86%;
56
+ border-radius: 10px;
57
+ border: 1px solid var(--panel-border-contrast);
58
+ background: rgba(255, 255, 255, 0.02);
59
+ padding: 12px 14px;
60
+ }
61
+
62
+ .chat-bubble.is-user {
63
+ align-self: flex-end;
64
+ background: rgba(99, 235, 255, 0.06);
65
+ border-color: rgba(99, 235, 255, 0.24);
66
+ }
67
+
68
+ .chat-bubble.is-assistant {
69
+ align-self: flex-start;
70
+ }
71
+
72
+ .chat-bubble-meta {
73
+ display: flex;
74
+ align-items: center;
75
+ justify-content: space-between;
76
+ gap: 10px;
77
+ margin-bottom: 8px;
78
+ font-size: 11px;
79
+ color: var(--text-muted);
80
+ }
81
+
82
+ .chat-bubble-content {
83
+ margin: 0;
84
+ font-family: inherit;
85
+ font-size: 12px;
86
+ color: var(--text);
87
+ line-height: 1.6;
88
+ white-space: pre-wrap;
89
+ overflow-wrap: anywhere;
90
+ word-break: break-word;
91
+ }
92
+
93
+ .chat-bubble-markdown > :first-child {
94
+ margin-top: 0;
95
+ }
96
+
97
+ .chat-bubble-markdown > :last-child {
98
+ margin-bottom: 0;
99
+ }
100
+
101
+ .chat-bubble-markdown {
102
+ white-space: normal;
103
+ }
104
+
105
+ .chat-bubble-markdown p,
106
+ .chat-bubble-markdown ul,
107
+ .chat-bubble-markdown ol,
108
+ .chat-bubble-markdown pre,
109
+ .chat-bubble-markdown blockquote {
110
+ margin: 8px 0;
111
+ }
112
+
113
+ .chat-bubble-markdown ul,
114
+ .chat-bubble-markdown ol {
115
+ padding-left: 18px;
116
+ padding-top: 0;
117
+ padding-bottom: 0;
118
+ }
119
+
120
+ .chat-bubble-markdown ul {
121
+ list-style: disc;
122
+ }
123
+
124
+ .chat-bubble-markdown ol {
125
+ list-style: decimal;
126
+ }
127
+
128
+ .chat-bubble-markdown li > p {
129
+ margin: 0;
130
+ }
131
+
132
+ .chat-bubble-markdown li + li {
133
+ margin-top: 4px;
134
+ }
135
+
136
+ .chat-bubble-markdown > * + * {
137
+ margin-top: 8px;
138
+ }
139
+
140
+ .chat-bubble-markdown h1,
141
+ .chat-bubble-markdown h2,
142
+ .chat-bubble-markdown h3,
143
+ .chat-bubble-markdown h4 {
144
+ margin: 0;
145
+ line-height: 1.25;
146
+ }
147
+
148
+ .chat-bubble-markdown h1 {
149
+ font-size: 16px;
150
+ }
151
+
152
+ .chat-bubble-markdown h2 {
153
+ font-size: 14px;
154
+ }
155
+
156
+ .chat-bubble-markdown h3,
157
+ .chat-bubble-markdown h4 {
158
+ font-size: 13px;
159
+ }
160
+
161
+ .chat-bubble-markdown h1 + *,
162
+ .chat-bubble-markdown h2 + *,
163
+ .chat-bubble-markdown h3 + *,
164
+ .chat-bubble-markdown h4 + * {
165
+ margin-top: 10px;
166
+ }
167
+
168
+ .chat-bubble-markdown code {
169
+ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono",
170
+ "Courier New", monospace;
171
+ font-size: 11px;
172
+ background: rgba(255, 255, 255, 0.06);
173
+ padding: 1px 4px;
174
+ border-radius: 4px;
175
+ }
176
+
177
+ .chat-bubble-markdown pre code {
178
+ display: block;
179
+ white-space: pre-wrap;
180
+ overflow-wrap: anywhere;
181
+ padding: 8px;
182
+ }
183
+
184
+ .chat-bubble-json {
185
+ white-space: pre-wrap;
186
+ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono",
187
+ "Courier New", monospace;
188
+ font-size: 11px;
189
+ line-height: 1.6;
190
+ background: rgba(255, 255, 255, 0.04);
191
+ border: 1px solid var(--panel-border-contrast);
192
+ border-radius: 8px;
193
+ padding: 10px;
194
+ }
195
+
196
+ .chat-message-json {
197
+ margin-top: 10px;
198
+ border-top: 1px dashed var(--border);
199
+ padding-top: 8px;
200
+ }
201
+
202
+ .chat-message-json summary {
203
+ cursor: pointer;
204
+ color: var(--text-muted);
205
+ font-size: 11px;
206
+ }
207
+
208
+ .chat-message-json pre {
209
+ margin: 8px 0 0;
210
+ font-size: 11px;
211
+ line-height: 1.45;
212
+ color: var(--text-muted);
213
+ white-space: pre-wrap;
214
+ overflow-wrap: anywhere;
215
+ word-break: break-word;
216
+ }
217
+
218
+ .chat-tool-call-list {
219
+ display: flex;
220
+ flex-direction: column;
221
+ gap: 8px;
222
+ margin-top: 6px;
223
+ }
224
+
225
+ .chat-tool-call-row {
226
+ border: 1px dashed var(--border);
227
+ border-radius: 8px;
228
+ padding: 6px 8px;
229
+ }
230
+
231
+ .chat-tool-call-row summary {
232
+ cursor: pointer;
233
+ display: flex;
234
+ align-items: center;
235
+ justify-content: space-between;
236
+ gap: 8px;
237
+ }
238
+
239
+ .chat-tool-call-name {
240
+ color: var(--text);
241
+ font-size: 12px;
242
+ }
243
+
244
+ .chat-tool-call-status {
245
+ color: var(--text-muted);
246
+ font-size: 10px;
247
+ text-transform: lowercase;
248
+ }
249
+
250
+ .chat-tool-inline {
251
+ font-weight: 600;
252
+ }
253
+
254
+ .chat-tool-inline-message {
255
+ margin: 0;
256
+ }
257
+
258
+ .chat-tool-inline-message summary {
259
+ cursor: pointer;
260
+ list-style: none;
261
+ color: var(--text);
262
+ display: flex;
263
+ align-items: center;
264
+ justify-content: flex-start;
265
+ gap: 10px;
266
+ font-size: 12px;
267
+ line-height: 1.6;
268
+ }
269
+
270
+ .chat-tool-inline-message summary::-webkit-details-marker {
271
+ display: none;
272
+ }
273
+
274
+ .chat-tool-inline-message summary::before {
275
+ content: "▸";
276
+ color: var(--text-muted);
277
+ font-size: 12px;
278
+ line-height: 1;
279
+ margin-right: 2px;
280
+ }
281
+
282
+ .chat-tool-inline-message[open] summary::before {
283
+ content: "▾";
284
+ }
285
+
286
+ .chat-tool-inline-icon {
287
+ font-size: 12px;
288
+ line-height: 1;
289
+ }
290
+
291
+ .chat-tool-inline-title {
292
+ font-weight: 600;
293
+ }
294
+
295
+ .chat-tool-inline-time {
296
+ margin-left: auto;
297
+ font-size: 11px;
298
+ color: var(--text-muted);
299
+ }
300
+
301
+ .chat-tool-inline-body {
302
+ margin-top: 8px;
303
+ }
304
+
305
+ .chat-tool-inline-label {
306
+ margin-top: 8px;
307
+ margin-bottom: 4px;
308
+ font-size: 11px;
309
+ color: var(--text-muted);
310
+ text-transform: uppercase;
311
+ letter-spacing: 0.04em;
312
+ }
313
+
314
+ .chat-tool-inline-body pre {
315
+ margin: 0;
316
+ font-size: 11px;
317
+ line-height: 1.45;
318
+ color: var(--text-muted);
319
+ white-space: pre-wrap;
320
+ overflow-wrap: anywhere;
321
+ word-break: break-word;
322
+ }
323
+
324
+ .chat-typing-indicator {
325
+ min-width: 170px;
326
+ }
327
+
328
+ .chat-typing-dots {
329
+ display: inline-flex;
330
+ align-items: center;
331
+ gap: 5px;
332
+ padding: 2px 0 1px;
333
+ }
334
+
335
+ .chat-typing-dots span {
336
+ width: 6px;
337
+ height: 6px;
338
+ border-radius: 999px;
339
+ background: var(--text-muted);
340
+ opacity: 0.45;
341
+ animation: chatTypingPulse 1.2s infinite ease-in-out;
342
+ }
343
+
344
+ .chat-typing-dots span:nth-child(2) {
345
+ animation-delay: 0.15s;
346
+ }
347
+
348
+ .chat-typing-dots span:nth-child(3) {
349
+ animation-delay: 0.3s;
350
+ }
351
+
352
+ @keyframes chatTypingPulse {
353
+ 0%,
354
+ 80%,
355
+ 100% {
356
+ transform: translateY(0);
357
+ opacity: 0.35;
358
+ }
359
+ 40% {
360
+ transform: translateY(-2px);
361
+ opacity: 0.9;
362
+ }
363
+ }
364
+
365
+ .chat-composer {
366
+ border-top: 1px solid var(--border);
367
+ padding: 12px 24px 16px;
368
+ display: flex;
369
+ align-items: flex-end;
370
+ gap: 10px;
371
+ }
372
+
373
+ .chat-composer-input {
374
+ flex: 1;
375
+ min-height: 68px;
376
+ max-height: 180px;
377
+ border-radius: 10px;
378
+ resize: vertical;
379
+ font-family: inherit;
380
+ font-size: 12px;
381
+ line-height: 1.4;
382
+ padding: 10px;
383
+ }
384
+
385
+ .chat-composer-send {
386
+ white-space: nowrap;
387
+ padding: 8px 14px;
388
+ border-radius: 9px;
389
+ font-family: inherit;
390
+ font-size: 12px;
391
+ }
392
+
393
+ .chat-composer-actions {
394
+ display: inline-flex;
395
+ align-items: center;
396
+ gap: 8px;
397
+ }
398
+
399
+ .chat-composer-stop {
400
+ white-space: nowrap;
401
+ padding: 8px 12px;
402
+ border-radius: 9px;
403
+ font-family: inherit;
404
+ font-size: 12px;
405
+ }
406
+
407
+ .chat-raw-debug {
408
+ margin-top: 8px;
409
+ border-top: 1px dashed var(--border);
410
+ padding-top: 8px;
411
+ }
412
+
413
+ .chat-raw-debug summary {
414
+ cursor: pointer;
415
+ color: var(--text-muted);
416
+ font-size: 11px;
417
+ }
418
+
419
+ .chat-raw-debug pre {
420
+ margin: 8px 0 0;
421
+ font-size: 11px;
422
+ color: var(--text-muted);
423
+ white-space: pre-wrap;
424
+ overflow-wrap: anywhere;
425
+ word-break: break-word;
426
+ }
@@ -210,6 +210,107 @@
210
210
  margin-top: 8px;
211
211
  }
212
212
 
213
+ /* ── Sidebar chat sessions ───────────────────── */
214
+
215
+ .sidebar-chat-header {
216
+ display: flex;
217
+ align-items: center;
218
+ justify-content: space-between;
219
+ gap: 8px;
220
+ padding: 12px 16px 4px;
221
+ }
222
+
223
+ .sidebar-chat-label {
224
+ padding: 0;
225
+ }
226
+
227
+ .sidebar-chat-new-button {
228
+ border: none;
229
+ background: transparent;
230
+ color: var(--text-muted);
231
+ font: inherit;
232
+ display: inline-flex;
233
+ align-items: center;
234
+ justify-content: center;
235
+ line-height: 1;
236
+ padding: 6px;
237
+ margin: -6px;
238
+ cursor: pointer;
239
+ opacity: 0.9;
240
+ transition: color 0.1s, opacity 0.1s;
241
+ }
242
+
243
+ .sidebar-chat-new-icon {
244
+ width: 16px;
245
+ height: 16px;
246
+ display: block;
247
+ }
248
+
249
+ .sidebar-chat-new-button:hover {
250
+ color: var(--text);
251
+ opacity: 1;
252
+ }
253
+
254
+ .sidebar-chat-sessions-list {
255
+ flex: 1 1 auto;
256
+ min-height: 0;
257
+ overflow-y: auto;
258
+ padding: 2px 0 8px;
259
+ }
260
+
261
+ .sidebar-chat-session-item {
262
+ display: flex;
263
+ align-items: center;
264
+ gap: 6px;
265
+ padding: 6px 16px 6px 24px;
266
+ color: var(--text-muted);
267
+ font-size: 13px;
268
+ line-height: 1.4;
269
+ cursor: pointer;
270
+ transition: background 0.1s, color 0.1s;
271
+ position: relative;
272
+ user-select: none;
273
+ border: none;
274
+ background: transparent;
275
+ width: 100%;
276
+ text-align: left;
277
+ font-family: inherit;
278
+ }
279
+
280
+ .sidebar-chat-session-item:hover {
281
+ background: var(--bg-hover);
282
+ color: var(--text);
283
+ }
284
+
285
+ .sidebar-chat-session-item.active {
286
+ background: var(--bg-active);
287
+ color: var(--accent);
288
+ }
289
+
290
+ .sidebar-chat-session-item.active::before {
291
+ content: "";
292
+ position: absolute;
293
+ left: 0;
294
+ top: 0;
295
+ bottom: 0;
296
+ width: 2px;
297
+ background: var(--accent);
298
+ }
299
+
300
+ .sidebar-chat-session-name {
301
+ flex: 1;
302
+ min-width: 0;
303
+ overflow: hidden;
304
+ text-overflow: ellipsis;
305
+ white-space: nowrap;
306
+ }
307
+
308
+ .sidebar-chat-empty {
309
+ padding: 10px 16px 10px 24px;
310
+ color: var(--text-dim);
311
+ font-size: 12px;
312
+ }
313
+
213
314
  .file-tree-wrap {
214
315
  width: 100%;
215
316
  display: flex;