@oh-my-pi/pi-coding-agent 15.11.7 → 15.12.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.
Files changed (107) hide show
  1. package/CHANGELOG.md +63 -1
  2. package/dist/cli.js +8106 -7708
  3. package/dist/types/cli/args.d.ts +2 -0
  4. package/dist/types/collab/crypto.d.ts +7 -0
  5. package/dist/types/collab/guest.d.ts +23 -0
  6. package/dist/types/collab/host.d.ts +29 -0
  7. package/dist/types/collab/protocol.d.ts +113 -0
  8. package/dist/types/collab/relay-client.d.ts +22 -0
  9. package/dist/types/commands/join.d.ts +12 -0
  10. package/dist/types/config/settings-schema.d.ts +60 -5
  11. package/dist/types/export/custom-share.d.ts +1 -2
  12. package/dist/types/export/html/index.d.ts +39 -1
  13. package/dist/types/export/share.d.ts +43 -0
  14. package/dist/types/extensibility/slash-commands.d.ts +1 -11
  15. package/dist/types/main.d.ts +2 -0
  16. package/dist/types/modes/components/agent-hub.d.ts +32 -1
  17. package/dist/types/modes/components/collab-prompt-message.d.ts +10 -0
  18. package/dist/types/modes/components/hook-selector.d.ts +4 -6
  19. package/dist/types/modes/components/segment-track.d.ts +11 -6
  20. package/dist/types/modes/components/status-line/component.d.ts +10 -2
  21. package/dist/types/modes/components/status-line/types.d.ts +11 -0
  22. package/dist/types/modes/controllers/event-controller.d.ts +7 -0
  23. package/dist/types/modes/controllers/input-controller.d.ts +1 -1
  24. package/dist/types/modes/controllers/session-focus-controller.d.ts +31 -0
  25. package/dist/types/modes/interactive-mode.d.ts +16 -0
  26. package/dist/types/modes/session-observer-registry.d.ts +7 -0
  27. package/dist/types/modes/theme/theme.d.ts +2 -1
  28. package/dist/types/modes/types.d.ts +20 -0
  29. package/dist/types/session/agent-session.d.ts +13 -0
  30. package/dist/types/session/codex-auto-reset.d.ts +8 -4
  31. package/dist/types/session/session-manager.d.ts +21 -0
  32. package/dist/types/session/snapcompact-inline.d.ts +6 -3
  33. package/dist/types/slash-commands/builtin-registry.d.ts +9 -0
  34. package/dist/types/task/executor.d.ts +7 -0
  35. package/dist/types/task/types.d.ts +9 -0
  36. package/package.json +14 -13
  37. package/scripts/bench-guard.ts +71 -0
  38. package/scripts/build-binary.ts +4 -0
  39. package/scripts/bundle-dist.ts +4 -0
  40. package/scripts/generate-share-viewer.ts +34 -0
  41. package/src/cli/args.ts +2 -0
  42. package/src/cli-commands.ts +1 -0
  43. package/src/collab/crypto.ts +63 -0
  44. package/src/collab/guest.ts +450 -0
  45. package/src/collab/host.ts +556 -0
  46. package/src/collab/protocol.ts +232 -0
  47. package/src/collab/relay-client.ts +216 -0
  48. package/src/commands/join.ts +39 -0
  49. package/src/config/model-registry.ts +22 -14
  50. package/src/config/settings-schema.ts +67 -5
  51. package/src/config/settings.ts +12 -0
  52. package/src/export/custom-share.ts +1 -1
  53. package/src/export/html/index.ts +122 -17
  54. package/src/export/html/share-loader.js +102 -0
  55. package/src/export/html/template.css +745 -459
  56. package/src/export/html/template.html +6 -3
  57. package/src/export/html/template.js +240 -915
  58. package/src/export/html/tool-views.generated.js +38 -0
  59. package/src/export/share.ts +268 -0
  60. package/src/extensibility/slash-commands.ts +1 -97
  61. package/src/internal-urls/docs-index.generated.ts +74 -73
  62. package/src/main.ts +33 -11
  63. package/src/modes/components/agent-hub.ts +659 -431
  64. package/src/modes/components/assistant-message.ts +126 -6
  65. package/src/modes/components/collab-prompt-message.ts +30 -0
  66. package/src/modes/components/hook-selector.ts +4 -5
  67. package/src/modes/components/segment-track.ts +44 -7
  68. package/src/modes/components/status-line/component.ts +59 -6
  69. package/src/modes/components/status-line/presets.ts +1 -1
  70. package/src/modes/components/status-line/segments.ts +18 -1
  71. package/src/modes/components/status-line/types.ts +12 -0
  72. package/src/modes/components/tips.txt +4 -1
  73. package/src/modes/controllers/command-controller.ts +55 -96
  74. package/src/modes/controllers/event-controller.ts +45 -16
  75. package/src/modes/controllers/input-controller.ts +175 -9
  76. package/src/modes/controllers/selector-controller.ts +13 -15
  77. package/src/modes/controllers/session-focus-controller.ts +112 -0
  78. package/src/modes/controllers/streaming-reveal.ts +7 -0
  79. package/src/modes/interactive-mode.ts +56 -6
  80. package/src/modes/session-observer-registry.ts +11 -0
  81. package/src/modes/theme/theme.ts +6 -0
  82. package/src/modes/types.ts +20 -0
  83. package/src/modes/utils/ui-helpers.ts +23 -13
  84. package/src/prompts/tools/job.md +1 -1
  85. package/src/sdk.ts +239 -36
  86. package/src/session/agent-session.ts +82 -7
  87. package/src/session/codex-auto-reset.ts +23 -11
  88. package/src/session/session-manager.ts +44 -0
  89. package/src/session/snapcompact-inline.ts +9 -3
  90. package/src/slash-commands/builtin-registry.ts +261 -24
  91. package/src/task/executor.ts +14 -0
  92. package/src/task/index.ts +5 -1
  93. package/src/task/render.ts +76 -5
  94. package/src/task/types.ts +9 -0
  95. package/src/tiny/worker.ts +17 -95
  96. package/src/tools/job.ts +6 -9
  97. package/src/tools/read.ts +38 -5
  98. package/src/tools/write.ts +13 -42
  99. package/dist/tokenizers.linux-x64-gnu-xcjh3jwk.node +0 -0
  100. package/dist/types/export/html/template.generated.d.ts +0 -1
  101. package/dist/types/export/html/template.macro.d.ts +0 -5
  102. package/dist/types/tiny/compiled-runtime.d.ts +0 -35
  103. package/scripts/generate-template.ts +0 -33
  104. package/src/bun-imports.d.ts +0 -28
  105. package/src/export/html/template.generated.ts +0 -2
  106. package/src/export/html/template.macro.ts +0 -25
  107. package/src/tiny/compiled-runtime.ts +0 -179
@@ -1,3 +1,10 @@
1
+ /* Export page chrome — dense devtool aesthetic shared with the tv- tool
2
+ cards (tool-render.css): mono type, hairline borders via color-mix,
3
+ small radii, tinted neutrals, whisper hovers. All colors derive from
4
+ the theme vars injected on :root (--text, --muted, --dim, --accent,
5
+ --border, --success, --error, --warning, --body-bg, --container-bg,
6
+ --info-bg, …) so light and dark themes both work. */
7
+
1
8
  * { margin: 0; padding: 0; box-sizing: border-box; }
2
9
 
3
10
  :root {
@@ -6,14 +13,62 @@
6
13
  --sidebar-min-width: 240px;
7
14
  --sidebar-max-width: 840px;
8
15
  --sidebar-resizer-width: 6px;
16
+ --content-max-width: 1100px;
17
+ --hairline: color-mix(in srgb, var(--text) 10%, transparent);
18
+ --hairline-soft: color-mix(in srgb, var(--text) 7%, transparent);
19
+ --hairline-strong: color-mix(in srgb, var(--text) 18%, transparent);
20
+ --hover-wash: color-mix(in srgb, var(--text) 5%, transparent);
21
+ --inset-bg: var(--info-bg, color-mix(in srgb, var(--text) 4%, transparent));
22
+ --ring: color-mix(in srgb, var(--accent) 70%, transparent);
23
+ --radius-card: 8px;
24
+ --radius-ctl: 6px;
25
+ }
26
+
27
+ html {
28
+ scrollbar-width: thin;
29
+ scrollbar-color: color-mix(in srgb, var(--text) 22%, transparent) transparent;
9
30
  }
10
31
 
11
32
  body {
12
- font-family: ui-monospace, 'Cascadia Code', 'Source Code Pro', Menlo, Consolas, 'DejaVu Sans Mono', monospace;
33
+ font-family: ui-monospace, 'SF Mono', 'Cascadia Code', 'Source Code Pro', Menlo, Consolas, 'DejaVu Sans Mono', monospace;
13
34
  font-size: 12px;
14
35
  line-height: var(--line-height);
15
36
  color: var(--text);
16
37
  background: var(--body-bg);
38
+ -webkit-font-smoothing: antialiased;
39
+ }
40
+
41
+ ::selection {
42
+ background: color-mix(in srgb, var(--accent) 28%, transparent);
43
+ }
44
+
45
+ :focus-visible {
46
+ outline: 2px solid var(--ring);
47
+ outline-offset: 1px;
48
+ }
49
+
50
+ /* Thin themed scrollbars everywhere */
51
+ * {
52
+ scrollbar-width: thin;
53
+ scrollbar-color: color-mix(in srgb, var(--text) 22%, transparent) transparent;
54
+ }
55
+
56
+ ::-webkit-scrollbar {
57
+ width: 8px;
58
+ height: 8px;
59
+ }
60
+
61
+ ::-webkit-scrollbar-track {
62
+ background: transparent;
63
+ }
64
+
65
+ ::-webkit-scrollbar-thumb {
66
+ background: color-mix(in srgb, var(--text) 18%, transparent);
67
+ border-radius: 4px;
68
+ }
69
+
70
+ ::-webkit-scrollbar-thumb:hover {
71
+ background: color-mix(in srgb, var(--text) 30%, transparent);
17
72
  }
18
73
 
19
74
  body.sidebar-resizing {
@@ -26,121 +81,147 @@
26
81
  min-height: 100vh;
27
82
  }
28
83
 
29
- /* Sidebar */
84
+ /* ================= Sidebar ================= */
85
+
30
86
  #sidebar {
31
87
  width: var(--sidebar-width);
32
88
  min-width: var(--sidebar-width);
33
89
  max-width: var(--sidebar-width);
34
- background: var(--container-bg);
90
+ background: color-mix(in srgb, var(--container-bg) 72%, var(--body-bg));
35
91
  flex-shrink: 0;
36
92
  display: flex;
37
93
  flex-direction: column;
38
94
  position: sticky;
39
95
  top: 0;
40
96
  height: 100vh;
41
- border-right: 1px solid var(--dim);
97
+ border-right: 1px solid var(--hairline);
42
98
  }
43
99
 
44
100
  .sidebar-header {
45
- padding: 8px 12px;
101
+ padding: 10px 12px 8px;
46
102
  flex-shrink: 0;
103
+ border-bottom: 1px solid var(--hairline-soft);
47
104
  }
48
105
 
49
106
  .sidebar-controls {
50
- padding: 8px 8px 4px 8px;
107
+ padding: 0 0 6px;
51
108
  }
52
109
 
53
110
  .sidebar-search {
54
111
  width: 100%;
55
112
  box-sizing: border-box;
56
- padding: 4px 8px;
113
+ padding: 5px 9px;
57
114
  font-size: 11px;
58
115
  font-family: inherit;
59
- background: var(--body-bg);
116
+ background: color-mix(in srgb, var(--body-bg) 70%, transparent);
60
117
  color: var(--text);
61
- border: 1px solid var(--dim);
62
- border-radius: 3px;
118
+ border: 1px solid var(--hairline);
119
+ border-radius: var(--radius-ctl);
120
+ transition: border-color 0.12s ease, box-shadow 0.12s ease;
63
121
  }
64
122
 
65
- .sidebar-filters {
66
- display: flex;
67
- padding: 4px 8px 8px 8px;
68
- gap: 4px;
69
- align-items: center;
70
- flex-wrap: wrap;
123
+ .sidebar-search:hover {
124
+ border-color: var(--hairline-strong);
71
125
  }
72
126
 
73
127
  .sidebar-search:focus {
74
128
  outline: none;
75
- border-color: var(--accent);
129
+ border-color: color-mix(in srgb, var(--accent) 55%, transparent);
130
+ box-shadow: 0 0 0 2px color-mix(in srgb, var(--accent) 18%, transparent);
131
+ }
132
+
133
+ .sidebar-search:focus-visible {
134
+ outline: none;
76
135
  }
77
136
 
78
137
  .sidebar-search::placeholder {
79
138
  color: var(--muted);
80
139
  }
81
140
 
141
+ .sidebar-filters {
142
+ display: flex;
143
+ gap: 4px;
144
+ align-items: center;
145
+ flex-wrap: wrap;
146
+ }
147
+
82
148
  .filter-btn {
83
- padding: 3px 8px;
149
+ padding: 2px 8px;
84
150
  font-size: 10px;
85
151
  font-family: inherit;
86
152
  background: transparent;
87
153
  color: var(--muted);
88
- border: 1px solid var(--dim);
89
- border-radius: 3px;
154
+ border: 1px solid var(--hairline);
155
+ border-radius: 999px;
90
156
  cursor: pointer;
157
+ transition: color 0.12s ease, border-color 0.12s ease, background 0.12s ease, transform 0.08s ease;
91
158
  }
92
159
 
93
160
  .filter-btn:hover {
94
161
  color: var(--text);
95
- border-color: var(--text);
162
+ background: var(--hover-wash);
163
+ border-color: var(--hairline-strong);
164
+ }
165
+
166
+ .filter-btn:active {
167
+ transform: scale(0.95);
96
168
  }
97
169
 
98
170
  .filter-btn.active {
99
- background: var(--accent);
100
- color: var(--body-bg);
101
- border-color: var(--accent);
171
+ background: color-mix(in srgb, var(--accent) 16%, transparent);
172
+ color: color-mix(in srgb, var(--accent) 80%, var(--text));
173
+ border-color: color-mix(in srgb, var(--accent) 45%, transparent);
102
174
  }
103
175
 
104
176
  .sidebar-close {
105
177
  display: none;
106
- padding: 3px 8px;
107
- font-size: 12px;
178
+ width: 22px;
179
+ height: 22px;
180
+ padding: 0;
181
+ font-size: 11px;
182
+ line-height: 20px;
108
183
  font-family: inherit;
109
184
  background: transparent;
110
185
  color: var(--muted);
111
- border: 1px solid var(--dim);
112
- border-radius: 3px;
186
+ border: 1px solid var(--hairline);
187
+ border-radius: var(--radius-ctl);
113
188
  cursor: pointer;
114
189
  margin-left: auto;
190
+ transition: color 0.12s ease, background 0.12s ease, transform 0.08s ease;
115
191
  }
116
192
 
117
193
  .sidebar-close:hover {
118
194
  color: var(--text);
119
- border-color: var(--text);
195
+ background: var(--hover-wash);
196
+ }
197
+
198
+ .sidebar-close:active {
199
+ transform: scale(0.95);
120
200
  }
121
201
 
122
202
  .tree-container {
123
203
  flex: 1;
124
204
  overflow: auto;
125
- padding: 4px 0;
205
+ padding: 6px 0;
126
206
  }
127
207
 
128
208
  .tree-node {
129
- padding: 0 8px;
209
+ padding: 1px 10px;
130
210
  cursor: pointer;
131
211
  display: flex;
132
212
  align-items: baseline;
133
213
  font-size: 11px;
134
- line-height: 13px;
214
+ line-height: 15px;
135
215
  white-space: nowrap;
136
216
  }
137
217
 
138
218
  .tree-node:hover {
139
- background: var(--selectedBg);
219
+ background: var(--hover-wash);
140
220
  }
141
221
 
142
222
  .tree-node.active {
143
223
  background: var(--selectedBg);
224
+ box-shadow: inset 2px 0 0 var(--accent);
144
225
  }
145
226
 
146
227
  .tree-node.active .tree-content {
@@ -148,11 +229,15 @@
148
229
  }
149
230
 
150
231
  .tree-node.in-path {
151
- background: color-mix(in srgb, var(--accent) 10%, transparent);
232
+ background: color-mix(in srgb, var(--accent) 8%, transparent);
233
+ }
234
+
235
+ .tree-node.in-path.active {
236
+ background: var(--selectedBg);
152
237
  }
153
238
 
154
239
  .tree-node:not(.in-path) {
155
- opacity: 0.5;
240
+ opacity: 0.45;
156
241
  }
157
242
 
158
243
  .tree-node:not(.in-path):hover {
@@ -160,9 +245,9 @@
160
245
  }
161
246
 
162
247
  .tree-prefix {
163
- color: var(--muted);
248
+ color: color-mix(in srgb, var(--muted) 65%, transparent);
164
249
  flex-shrink: 0;
165
- font-family: monospace;
250
+ font-family: inherit;
166
251
  white-space: pre;
167
252
  }
168
253
 
@@ -175,6 +260,10 @@
175
260
  color: var(--text);
176
261
  }
177
262
 
263
+ .tree-label {
264
+ color: color-mix(in srgb, var(--accent) 80%, var(--text));
265
+ }
266
+
178
267
  .tree-role-user {
179
268
  color: var(--accent);
180
269
  }
@@ -212,10 +301,11 @@
212
301
  }
213
302
 
214
303
  .tree-status {
215
- padding: 4px 12px;
304
+ padding: 5px 12px;
216
305
  font-size: 10px;
217
306
  color: var(--muted);
218
307
  flex-shrink: 0;
308
+ border-top: 1px solid var(--hairline-soft);
219
309
  }
220
310
 
221
311
  #sidebar-resizer {
@@ -227,22 +317,20 @@
227
317
  cursor: col-resize;
228
318
  touch-action: none;
229
319
  background: transparent;
230
- border-right: 1px solid transparent;
320
+ transition: background 0.12s ease;
231
321
  }
232
322
 
233
323
  #sidebar-resizer:hover,
234
324
  body.sidebar-resizing #sidebar-resizer {
235
- background: var(--selectedBg);
236
- border-right-color: var(--dim);
325
+ background: color-mix(in srgb, var(--accent) 25%, transparent);
237
326
  }
238
327
 
239
- /* Main content */
328
+ /* ================= Main content ================= */
329
+
240
330
  #content {
241
331
  flex: 1;
242
332
  min-width: 0;
243
- flex: 1;
244
- overflow-y: auto;
245
- padding: var(--line-height) calc(var(--line-height) * 2);
333
+ padding: 20px 28px 48px;
246
334
  display: flex;
247
335
  flex-direction: column;
248
336
  align-items: center;
@@ -250,78 +338,233 @@
250
338
 
251
339
  #content > * {
252
340
  width: 100%;
253
- max-width: 800px;
341
+ max-width: var(--content-max-width);
254
342
  }
255
343
 
256
- /* Help bar */
257
- .help-bar {
258
- font-size: 11px;
259
- color: var(--warning);
260
- margin-bottom: var(--line-height);
261
- }
344
+ /* ================= Header card ================= */
262
345
 
263
- /* Header */
264
346
  .header {
265
- background: var(--container-bg);
266
- border-radius: 4px;
267
- padding: var(--line-height);
268
- margin-bottom: var(--line-height);
347
+ background: color-mix(in srgb, var(--container-bg) 60%, var(--body-bg));
348
+ border: 1px solid var(--hairline);
349
+ border-radius: var(--radius-card);
350
+ padding: 12px 16px;
351
+ margin-bottom: 14px;
269
352
  }
270
353
 
271
354
  .header h1 {
272
- font-size: 12px;
273
- font-weight: bold;
274
- color: var(--borderAccent);
275
- margin-bottom: var(--line-height);
355
+ font-size: 12.5px;
356
+ font-weight: 650;
357
+ letter-spacing: 0.01em;
358
+ color: var(--text);
359
+ margin-bottom: 2px;
360
+ overflow-wrap: anywhere;
361
+ }
362
+
363
+ .help-bar {
364
+ font-size: 10px;
365
+ color: var(--dim);
366
+ margin-bottom: 10px;
276
367
  }
277
368
 
278
369
  .header-info {
279
370
  display: flex;
280
- flex-direction: column;
281
- gap: 0;
371
+ flex-wrap: wrap;
372
+ gap: 3px 22px;
282
373
  font-size: 11px;
283
374
  }
284
375
 
285
376
  .info-item {
286
- color: var(--dim);
287
377
  display: flex;
288
378
  align-items: baseline;
379
+ gap: 6px;
380
+ min-width: 0;
289
381
  }
290
382
 
291
383
  .info-label {
384
+ font-size: 9.5px;
292
385
  font-weight: 600;
293
- margin-right: 8px;
294
- min-width: 100px;
386
+ letter-spacing: 0.06em;
387
+ text-transform: uppercase;
388
+ color: var(--dim);
295
389
  }
296
390
 
297
391
  .info-value {
298
392
  color: var(--text);
299
- flex: 1;
393
+ overflow-wrap: anywhere;
394
+ }
395
+
396
+ /* ================= System prompt / tools panels ================= */
397
+
398
+ .system-prompt {
399
+ background: color-mix(in srgb, var(--container-bg) 45%, var(--body-bg));
400
+ border: 1px solid var(--hairline);
401
+ border-radius: var(--radius-card);
402
+ padding: 10px 14px;
403
+ margin-bottom: 14px;
404
+ }
405
+
406
+ .system-prompt-header {
407
+ font-size: 10px;
408
+ font-weight: 600;
409
+ letter-spacing: 0.06em;
410
+ text-transform: uppercase;
411
+ color: var(--customMessageLabel, var(--muted));
412
+ }
413
+
414
+ .system-prompt-content {
415
+ color: var(--customMessageText, var(--muted));
416
+ white-space: pre-wrap;
417
+ word-wrap: break-word;
418
+ font-size: 11px;
419
+ max-height: 240px;
420
+ overflow-y: auto;
421
+ overscroll-behavior: contain;
422
+ margin-top: 8px;
423
+ padding: 8px 10px;
424
+ background: var(--inset-bg);
425
+ border-radius: var(--radius-ctl);
426
+ }
427
+
428
+ .system-prompt.provider-prompt {
429
+ border-left: 2px solid var(--warning);
430
+ }
431
+
432
+ .system-prompt-note {
433
+ font-size: 10px;
434
+ font-style: italic;
435
+ color: var(--muted);
436
+ margin-top: 6px;
437
+ }
438
+
439
+ .tools-list {
440
+ background: color-mix(in srgb, var(--container-bg) 45%, var(--body-bg));
441
+ border: 1px solid var(--hairline);
442
+ border-radius: var(--radius-card);
443
+ padding: 10px 14px;
444
+ margin-bottom: 14px;
445
+ cursor: pointer;
446
+ }
447
+
448
+ .tools-header {
449
+ font-size: 10px;
450
+ font-weight: 600;
451
+ letter-spacing: 0.06em;
452
+ text-transform: uppercase;
453
+ color: var(--warning);
454
+ margin-bottom: 8px;
455
+ }
456
+
457
+ .tools-list.collapsed .tools-header {
458
+ margin-bottom: 0;
459
+ }
460
+
461
+ .tools-list.collapsed .tools-content {
462
+ display: none;
463
+ }
464
+
465
+ .tools-list:not(.collapsed) .tools-collapsed {
466
+ display: none;
467
+ }
468
+
469
+ .tools-collapsed {
470
+ margin-top: 6px;
471
+ display: flex;
472
+ flex-wrap: wrap;
473
+ gap: 4px;
474
+ }
475
+
476
+ .tools-content {
477
+ display: flex;
478
+ flex-direction: column;
479
+ gap: 3px;
480
+ max-height: 320px;
481
+ overflow-y: auto;
482
+ overscroll-behavior: contain;
483
+ }
484
+
485
+ .tool-name-chip {
486
+ display: inline-block;
487
+ padding: 0 6px;
488
+ border-radius: 3px;
489
+ background: color-mix(in srgb, var(--text) 6%, transparent);
490
+ color: var(--muted);
491
+ font-size: 10px;
492
+ line-height: 17px;
493
+ font-weight: 500;
494
+ }
495
+
496
+ .tool-item {
497
+ font-size: 11px;
498
+ }
499
+
500
+ .tool-item-name {
501
+ font-weight: 600;
502
+ color: var(--text);
503
+ }
504
+
505
+ .tool-item-desc {
506
+ color: var(--dim);
300
507
  }
301
508
 
302
- /* Messages */
509
+ /* ================= Messages ================= */
510
+
303
511
  #messages {
304
512
  display: flex;
305
513
  flex-direction: column;
306
- gap: var(--line-height);
514
+ gap: 14px;
307
515
  }
308
516
 
309
517
  .message-timestamp {
310
518
  font-size: 10px;
311
519
  color: var(--dim);
312
- opacity: 0.8;
520
+ opacity: 0.85;
313
521
  }
314
522
 
315
- .user-message {
316
- background: var(--userMessageBg);
317
- color: var(--userMessageText);
318
- padding: var(--line-height);
319
- border-radius: 4px;
523
+ .user-message,
524
+ .assistant-message {
320
525
  position: relative;
526
+ border-radius: var(--radius-card);
527
+ }
528
+
529
+ .user-message > .message-timestamp,
530
+ .assistant-message > .message-timestamp {
531
+ position: absolute;
532
+ top: 9px;
533
+ right: 40px;
534
+ line-height: 14px;
535
+ }
536
+
537
+ .user-message::before,
538
+ .assistant-message::before {
539
+ display: block;
540
+ font-size: 9.5px;
541
+ font-weight: 600;
542
+ letter-spacing: 0.08em;
543
+ text-transform: uppercase;
544
+ line-height: 14px;
545
+ margin-bottom: 6px;
546
+ }
547
+
548
+ .user-message {
549
+ background: color-mix(in srgb, var(--accent) 6%, transparent);
550
+ border: 1px solid color-mix(in srgb, var(--accent) 22%, var(--hairline));
551
+ color: var(--userMessageText, var(--text));
552
+ padding: 9px 14px 11px;
553
+ }
554
+
555
+ .user-message::before {
556
+ content: 'user';
557
+ color: color-mix(in srgb, var(--accent) 85%, var(--text));
321
558
  }
322
559
 
323
560
  .user-message.developer-message {
324
- opacity: 0.7;
561
+ background: color-mix(in srgb, var(--text) 3%, transparent);
562
+ border-color: var(--hairline);
563
+ }
564
+
565
+ .user-message.developer-message::before {
566
+ content: 'developer';
567
+ color: var(--dim);
325
568
  }
326
569
 
327
570
  .user-message.developer-message .markdown-content {
@@ -329,46 +572,69 @@
329
572
  }
330
573
 
331
574
  .assistant-message {
575
+ display: flex;
576
+ flex-direction: column;
577
+ gap: 8px;
578
+ padding: 0 1px;
579
+ }
580
+
581
+ .assistant-message::before {
582
+ content: 'assistant';
583
+ color: color-mix(in srgb, var(--success) 80%, var(--text));
584
+ margin-bottom: -2px;
585
+ }
586
+
587
+ .assistant-text {
332
588
  padding: 0;
333
- position: relative;
334
589
  }
335
590
 
336
591
  /* Copy link button - appears on hover */
337
592
  .copy-link-btn {
338
593
  position: absolute;
339
- top: 8px;
340
- right: 8px;
341
- width: 28px;
342
- height: 28px;
343
- padding: 6px;
344
- background: var(--container-bg);
345
- border: 1px solid var(--dim);
346
- border-radius: 4px;
594
+ top: 5px;
595
+ right: 6px;
596
+ width: 24px;
597
+ height: 24px;
598
+ padding: 5px;
599
+ background: color-mix(in srgb, var(--body-bg) 70%, transparent);
600
+ border: 1px solid var(--hairline);
601
+ border-radius: var(--radius-ctl);
347
602
  color: var(--muted);
348
603
  cursor: pointer;
349
604
  opacity: 0;
350
- transition: opacity 0.15s, background 0.15s, color 0.15s;
605
+ transition: opacity 0.15s ease, background 0.15s ease, color 0.15s ease, transform 0.08s ease;
351
606
  display: flex;
352
607
  align-items: center;
353
608
  justify-content: center;
354
609
  z-index: 10;
355
610
  }
356
611
 
612
+ .copy-link-btn svg {
613
+ width: 12px;
614
+ height: 12px;
615
+ }
616
+
357
617
  .user-message:hover .copy-link-btn,
358
- .assistant-message:hover .copy-link-btn {
618
+ .assistant-message:hover .copy-link-btn,
619
+ .copy-link-btn:focus-visible {
359
620
  opacity: 1;
360
621
  }
361
622
 
362
623
  .copy-link-btn:hover {
363
- background: var(--accent);
364
- color: var(--body-bg);
365
- border-color: var(--accent);
624
+ background: var(--hover-wash);
625
+ color: var(--text);
626
+ border-color: var(--hairline-strong);
627
+ }
628
+
629
+ .copy-link-btn:active {
630
+ transform: scale(0.92);
366
631
  }
367
632
 
368
633
  .copy-link-btn.copied {
369
- background: var(--success, #22c55e);
370
- color: white;
371
- border-color: var(--success, #22c55e);
634
+ opacity: 1;
635
+ background: color-mix(in srgb, var(--success) 15%, transparent);
636
+ color: var(--success);
637
+ border-color: color-mix(in srgb, var(--success) 45%, transparent);
372
638
  }
373
639
 
374
640
  /* Highlight effect for deep-linked messages */
@@ -386,89 +652,102 @@
386
652
  }
387
653
  }
388
654
 
389
- .assistant-message > .message-timestamp {
390
- padding-left: var(--line-height);
391
- }
392
-
393
- .assistant-text {
394
- padding: var(--line-height);
395
- padding-bottom: 0;
396
- }
397
-
398
- .message-timestamp + .assistant-text,
399
- .message-timestamp + .thinking-block {
400
- padding-top: 0;
401
- }
655
+ /* ================= Thinking blocks ================= */
402
656
 
403
- .thinking-block + .assistant-text {
404
- padding-top: 0;
657
+ .thinking-block {
658
+ border-left: 2px solid var(--hairline-strong);
659
+ padding: 1px 0 1px 12px;
405
660
  }
406
661
 
407
662
  .thinking-text {
408
- padding: var(--line-height);
409
- color: var(--thinkingText);
663
+ display: none;
664
+ color: var(--thinkingText, var(--muted));
410
665
  font-style: italic;
666
+ font-size: 11.5px;
411
667
  white-space: pre-wrap;
412
668
  }
413
669
 
414
- .message-timestamp + .thinking-block .thinking-text,
415
- .message-timestamp + .thinking-block .thinking-collapsed {
416
- padding-top: 0;
417
- }
418
-
419
670
  .thinking-collapsed {
420
- display: none;
421
- padding: var(--line-height);
422
- color: var(--thinkingText);
671
+ display: block;
672
+ color: var(--dim);
423
673
  font-style: italic;
674
+ font-size: 11px;
424
675
  }
425
676
 
426
- /* Tool execution */
427
- .tool-execution {
428
- padding: var(--line-height);
429
- border-radius: 4px;
430
- }
677
+ /* ================= Tool executions (bash / js) ================= */
431
678
 
432
- .tool-execution + .tool-execution {
433
- margin-top: var(--line-height);
679
+ .tool-execution {
680
+ border: 1px solid var(--hairline);
681
+ border-radius: var(--radius-ctl);
682
+ padding: 8px 12px;
683
+ font-size: 11.5px;
684
+ overflow: hidden;
434
685
  }
435
686
 
436
- .tool-execution.pending { background: var(--toolPendingBg); }
437
- .tool-execution.success { background: var(--toolSuccessBg); }
438
- .tool-execution.error { background: var(--toolErrorBg); }
439
-
440
- .tool-header, .tool-name {
441
- font-weight: bold;
687
+ .tool-execution.error {
688
+ border-color: color-mix(in srgb, var(--error) 40%, var(--hairline));
442
689
  }
443
690
 
444
- .tool-path {
445
- color: var(--accent);
446
- word-break: break-all;
691
+ .tool-execution.pending {
692
+ border-style: dashed;
447
693
  }
448
694
 
449
- .line-numbers {
450
- color: var(--warning);
695
+ .tool-execution > .message-timestamp {
696
+ float: right;
697
+ margin-left: 10px;
451
698
  }
452
699
 
453
- .line-count {
454
- color: var(--dim);
700
+ /* Tool calls render inside the <omp-tool-view> web component, which draws
701
+ its own card chrome; the host box collapses to a plain block. */
702
+ omp-tool-view.tool-execution {
703
+ display: block;
704
+ padding: 0;
705
+ background: none;
706
+ border: none;
707
+ border-radius: 0;
708
+ overflow: visible;
455
709
  }
456
710
 
457
711
  .tool-command {
458
- font-weight: bold;
712
+ font-weight: 600;
459
713
  white-space: pre-wrap;
460
714
  word-wrap: break-word;
461
715
  overflow-wrap: break-word;
462
716
  word-break: break-word;
717
+ padding-left: 13px;
718
+ position: relative;
719
+ }
720
+
721
+ .tool-command::before {
722
+ content: '';
723
+ position: absolute;
724
+ left: 0;
725
+ top: 5px;
726
+ width: 7px;
727
+ height: 7px;
728
+ border-radius: 50%;
729
+ background: var(--dim);
730
+ }
731
+
732
+ .tool-execution.success > .tool-command::before {
733
+ background: var(--success);
734
+ }
735
+
736
+ .tool-execution.error > .tool-command::before {
737
+ background: var(--error);
463
738
  }
464
739
 
465
740
  .tool-output {
466
- margin-top: var(--line-height);
467
- color: var(--toolOutput);
741
+ margin-top: 8px;
742
+ padding: 7px 9px;
743
+ border-radius: 4px;
744
+ background: var(--inset-bg);
745
+ color: var(--toolOutput, var(--muted));
468
746
  word-wrap: break-word;
469
747
  overflow-wrap: break-word;
470
748
  word-break: break-word;
471
749
  font-family: inherit;
750
+ font-size: 11.5px;
472
751
  overflow-x: auto;
473
752
  }
474
753
 
@@ -500,8 +779,9 @@
500
779
  cursor: pointer;
501
780
  }
502
781
 
503
- .tool-output.expandable:hover {
504
- opacity: 0.9;
782
+ .tool-output.expandable:hover .expand-hint {
783
+ color: var(--text);
784
+ text-decoration: underline;
505
785
  }
506
786
 
507
787
  .tool-output.expandable .output-full {
@@ -516,102 +796,55 @@
516
796
  display: block;
517
797
  }
518
798
 
519
- .ansi-line {
520
- white-space: pre-wrap;
799
+ .expand-hint {
800
+ color: var(--dim);
801
+ font-size: 10.5px;
521
802
  }
522
803
 
523
- .tool-images {
524
- }
804
+ /* ================= Meta entries ================= */
525
805
 
526
- .tool-image {
527
- max-width: 100%;
528
- max-height: 500px;
529
- border-radius: 4px;
530
- margin: var(--line-height) 0;
531
- }
532
-
533
- .expand-hint {
534
- color: var(--toolOutput);
535
- }
536
-
537
- /* Diff */
538
- .tool-diff {
539
- font-size: 11px;
540
- overflow-x: auto;
541
- white-space: pre;
542
- }
543
-
544
- .diff-added { color: var(--toolDiffAdded); }
545
- .diff-removed { color: var(--toolDiffRemoved); }
546
- .diff-context { color: var(--toolDiffContext); }
547
-
548
- /* Model change */
549
- .model-change {
550
- padding: 0 var(--line-height);
806
+ .model-change,
807
+ .thinking-change {
808
+ padding: 0 2px;
551
809
  color: var(--dim);
552
810
  font-size: 11px;
553
811
  }
554
812
 
555
- .model-name {
556
- color: var(--borderAccent);
557
- font-weight: bold;
558
- }
559
-
560
- .codex-bridge-toggle {
561
- color: var(--muted);
562
- cursor: pointer;
563
- text-decoration: underline;
564
- font-size: 10px;
565
- }
566
-
567
- .codex-bridge-toggle:hover {
568
- color: var(--accent);
569
- }
570
-
571
- .codex-bridge-content {
572
- display: none;
573
- margin-top: 8px;
574
- padding: 8px;
575
- background: var(--exportCardBg, var(--container-bg));
576
- border-radius: 4px;
577
- font-size: 11px;
578
- max-height: 300px;
579
- overflow: auto;
580
- }
581
-
582
- .codex-bridge-content pre {
583
- margin: 0;
584
- white-space: pre-wrap;
585
- word-break: break-word;
586
- color: var(--muted);
587
- }
588
-
589
- .model-change.show-bridge .codex-bridge-content {
590
- display: block;
813
+ .model-name,
814
+ .thinking-level {
815
+ color: var(--borderAccent, var(--accent));
816
+ font-weight: 600;
591
817
  }
592
818
 
593
819
  /* Compaction / Branch Summary - matches customMessage colors from TUI */
594
820
  .compaction {
595
- background: var(--customMessageBg);
596
- border-radius: 4px;
597
- padding: var(--line-height);
821
+ background: color-mix(in srgb, var(--customMessageBg, var(--container-bg)) 70%, var(--body-bg));
822
+ border: 1px solid var(--hairline);
823
+ border-radius: var(--radius-card);
824
+ padding: 9px 14px;
598
825
  cursor: pointer;
599
826
  }
600
827
 
601
828
  .compaction-label {
602
- color: var(--customMessageLabel);
603
- font-weight: bold;
829
+ font-size: 10px;
830
+ font-weight: 600;
831
+ letter-spacing: 0.06em;
832
+ text-transform: uppercase;
833
+ color: var(--customMessageLabel, var(--muted));
834
+ margin-bottom: 2px;
604
835
  }
605
836
 
606
837
  .compaction-collapsed {
607
- color: var(--customMessageText);
838
+ color: var(--customMessageText, var(--muted));
839
+ font-size: 11px;
608
840
  }
609
841
 
610
842
  .compaction-content {
611
843
  display: none;
612
- color: var(--customMessageText);
844
+ color: var(--customMessageText, var(--muted));
613
845
  white-space: pre-wrap;
614
- margin-top: var(--line-height);
846
+ margin-top: 8px;
847
+ font-size: 11.5px;
615
848
  }
616
849
 
617
850
  .compaction.expanded .compaction-collapsed {
@@ -622,326 +855,194 @@
622
855
  display: block;
623
856
  }
624
857
 
625
- /* System prompt */
626
- .system-prompt {
627
- background: var(--customMessageBg);
628
- padding: var(--line-height);
629
- border-radius: 4px;
630
- margin-bottom: var(--line-height);
631
- }
632
-
633
- .system-prompt-header {
634
- font-weight: bold;
635
- color: var(--customMessageLabel);
636
- }
637
-
638
- .system-prompt-content {
639
- color: var(--customMessageText);
640
- white-space: pre-wrap;
641
- word-wrap: break-word;
642
- font-size: 11px;
643
- max-height: 200px;
644
- overflow-y: auto;
645
- margin-top: var(--line-height);
646
- }
647
-
648
- .system-prompt.provider-prompt {
649
- border-left: 3px solid var(--warning);
858
+ .branch-summary {
859
+ background: color-mix(in srgb, var(--customMessageBg, var(--container-bg)) 70%, var(--body-bg));
860
+ border: 1px solid var(--hairline);
861
+ border-radius: var(--radius-card);
862
+ padding: 9px 14px;
650
863
  }
651
864
 
652
- .system-prompt-note {
865
+ .branch-summary-header {
653
866
  font-size: 10px;
654
- font-style: italic;
655
- color: var(--muted);
656
- margin-top: 4px;
657
- }
658
-
659
- /* Tools list */
660
- .tools-list {
661
- background: var(--customMessageBg);
662
- padding: var(--line-height);
663
- border-radius: 4px;
664
- margin-bottom: var(--line-height);
665
- cursor: pointer;
666
- }
667
-
668
- .tools-header {
669
- font-weight: bold;
670
- color: var(--warning);
671
- margin-bottom: var(--line-height);
672
- }
673
-
674
- .tools-list.collapsed .tools-header {
675
- margin-bottom: 0;
676
- }
677
-
678
- .tools-list.collapsed .tools-content {
679
- display: none;
680
- }
681
-
682
- .tools-list:not(.collapsed) .tools-collapsed {
683
- display: none;
684
- }
685
-
686
- .tools-collapsed {
687
- margin-top: 6px;
688
- display: flex;
689
- flex-wrap: wrap;
690
- gap: 4px;
691
- }
692
-
693
- .tool-name-chip {
694
- display: inline-block;
695
- padding: 1px 6px;
696
- border-radius: 3px;
697
- background: var(--container-bg);
698
- color: var(--text);
699
- font-size: 11px;
700
- font-weight: 500;
701
- }
702
-
703
- .tool-item {
704
- font-size: 11px;
705
- }
706
-
707
- .tool-item-name {
708
- font-weight: bold;
709
- color: var(--text);
710
- }
711
-
712
- .tool-item-desc {
713
- color: var(--dim);
867
+ font-weight: 600;
868
+ letter-spacing: 0.06em;
869
+ text-transform: uppercase;
870
+ color: var(--borderAccent, var(--accent));
871
+ margin-bottom: 4px;
714
872
  }
715
873
 
716
874
  /* Hook/custom messages */
717
875
  .hook-message {
718
- background: var(--customMessageBg);
719
- color: var(--customMessageText);
720
- padding: var(--line-height);
721
- border-radius: 4px;
876
+ background: color-mix(in srgb, var(--customMessageBg, var(--container-bg)) 70%, var(--body-bg));
877
+ border: 1px solid var(--hairline);
878
+ border-radius: var(--radius-card);
879
+ color: var(--customMessageText, var(--muted));
880
+ padding: 9px 14px;
722
881
  }
723
882
 
724
883
  .hook-type {
725
- color: var(--customMessageLabel);
726
- font-weight: bold;
727
- }
728
-
729
- /* Branch summary */
730
- .branch-summary {
731
- background: var(--customMessageBg);
732
- padding: var(--line-height);
733
- border-radius: 4px;
734
- }
735
-
736
- .branch-summary-header {
737
- font-weight: bold;
738
- color: var(--borderAccent);
884
+ font-size: 10px;
885
+ font-weight: 600;
886
+ letter-spacing: 0.06em;
887
+ text-transform: uppercase;
888
+ color: var(--customMessageLabel, var(--muted));
889
+ margin-bottom: 2px;
739
890
  }
740
891
 
741
892
  /* Error */
742
893
  .error-text {
743
894
  color: var(--error);
744
- padding: 0 var(--line-height);
745
- }
746
- .tool-error {
747
- color: var(--error);
748
- }
749
-
750
- /* Tool renderer extras */
751
- .tool-meta {
752
- margin-top: 4px;
753
- }
754
-
755
- .tool-badge {
756
- display: inline-block;
757
- padding: 0 6px;
758
- margin-right: 4px;
759
- border-radius: 3px;
760
- background: rgba(255, 255, 255, 0.06);
761
- color: var(--dim);
762
- font-size: 11px;
763
- font-weight: normal;
764
- vertical-align: baseline;
765
- }
766
-
767
- .tool-pattern {
768
- color: var(--warning);
769
- }
770
-
771
- .tool-intent {
772
- color: var(--muted);
773
- font-style: italic;
774
- font-size: 11px;
775
- margin-bottom: 4px;
776
- opacity: 0.85;
777
- }
778
-
779
- .tool-args {
780
- margin-top: 4px;
781
- color: var(--toolOutput);
782
- }
783
-
784
- .tool-arg {
785
- display: block;
786
- line-height: var(--line-height);
787
- white-space: pre-wrap;
788
- word-break: break-word;
789
- }
790
-
791
- .tool-arg-key {
792
- color: var(--dim);
793
- }
794
-
795
- .tool-arg-val {
796
- color: var(--text);
797
- }
798
-
799
- .tool-cell {
800
- margin-top: var(--line-height);
895
+ padding: 0 2px;
801
896
  }
802
897
 
803
- .tool-cell-title {
804
- color: var(--dim);
805
- font-size: 11px;
806
- margin-bottom: 2px;
807
- }
808
-
809
- /* Todo write tree */
810
- .todo-tree {
811
- margin-top: var(--line-height);
812
- }
813
-
814
- .todo-phase {
815
- margin-top: 6px;
816
- color: var(--accent);
817
- font-weight: bold;
818
- }
819
-
820
- .todo-task {
821
- padding-left: 12px;
822
- line-height: var(--line-height);
823
- }
824
-
825
- .todo-icon {
826
- display: inline-block;
827
- width: 14px;
828
- text-align: center;
829
- color: var(--dim);
898
+ /* Share viewer fetch/decrypt failure (template.js showLoadError) */
899
+ .share-load-error {
900
+ margin: 36px auto;
901
+ max-width: 640px;
902
+ padding: 14px 16px;
903
+ background: color-mix(in srgb, var(--error) 7%, transparent);
904
+ border: 1px solid color-mix(in srgb, var(--error) 40%, transparent);
905
+ border-radius: var(--radius-card);
906
+ color: var(--error);
830
907
  }
831
908
 
832
- .todo-completed { color: var(--toolDiffAdded); }
833
- .todo-completed .todo-icon { color: var(--toolDiffAdded); }
834
- .todo-in_progress { color: var(--warning); }
835
- .todo-in_progress .todo-icon { color: var(--warning); }
836
- .todo-abandoned { color: var(--toolDiffRemoved); }
837
- .todo-abandoned .todo-icon { color: var(--toolDiffRemoved); }
838
- .todo-pending { color: var(--toolOutput); }
839
-
840
909
  /* Images */
841
910
  .message-images {
842
- margin-bottom: 12px;
911
+ display: flex;
912
+ flex-wrap: wrap;
913
+ gap: 8px;
914
+ margin-bottom: 10px;
843
915
  }
844
916
 
845
917
  .message-image {
846
918
  max-width: 100%;
847
919
  max-height: 400px;
848
- border-radius: 4px;
849
- margin: var(--line-height) 0;
920
+ border-radius: var(--radius-ctl);
921
+ border: 1px solid var(--hairline);
922
+ margin: 0;
923
+ }
924
+
925
+ /* ================= Markdown content ================= */
926
+
927
+ .markdown-content {
928
+ overflow-wrap: anywhere;
850
929
  }
851
930
 
852
- /* Markdown content */
853
931
  .markdown-content h1,
854
932
  .markdown-content h2,
855
933
  .markdown-content h3,
856
934
  .markdown-content h4,
857
935
  .markdown-content h5,
858
936
  .markdown-content h6 {
859
- color: var(--mdHeading);
860
- margin: var(--line-height) 0 0 0;
861
- font-weight: bold;
937
+ color: var(--mdHeading, var(--text));
938
+ margin: var(--line-height) 0 4px 0;
939
+ font-weight: 650;
940
+ line-height: 1.4;
862
941
  }
863
942
 
864
- .markdown-content h1 { font-size: 1em; }
865
- .markdown-content h2 { font-size: 1em; }
866
- .markdown-content h3 { font-size: 1em; }
943
+ .markdown-content h1:first-child,
944
+ .markdown-content h2:first-child,
945
+ .markdown-content h3:first-child {
946
+ margin-top: 0;
947
+ }
948
+
949
+ .markdown-content h1 { font-size: 1.25em; }
950
+ .markdown-content h2 { font-size: 1.15em; }
951
+ .markdown-content h3 { font-size: 1.05em; }
867
952
  .markdown-content h4 { font-size: 1em; }
868
953
  .markdown-content h5 { font-size: 1em; }
869
- .markdown-content h6 { font-size: 1em; }
954
+ .markdown-content h6 { font-size: 1em; letter-spacing: 0.04em; }
870
955
  .markdown-content p { margin: 0; }
871
956
  .markdown-content p + p { margin-top: var(--line-height); }
872
957
 
873
958
  .markdown-content a {
874
- color: var(--mdLink);
959
+ color: var(--mdLink, var(--accent));
875
960
  text-decoration: underline;
961
+ text-decoration-color: color-mix(in srgb, var(--mdLink, var(--accent)) 45%, transparent);
962
+ text-underline-offset: 2px;
963
+ }
964
+
965
+ .markdown-content a:hover {
966
+ text-decoration-color: currentColor;
876
967
  }
877
968
 
878
969
  .markdown-content code {
879
- background: rgba(128, 128, 128, 0.2);
880
- color: var(--mdCode);
970
+ background: color-mix(in srgb, var(--text) 8%, transparent);
971
+ color: var(--mdCode, var(--text));
881
972
  padding: 0 4px;
882
973
  border-radius: 3px;
883
974
  font-family: inherit;
975
+ font-size: 0.95em;
884
976
  }
885
977
 
886
978
  .markdown-content pre {
887
- background: transparent;
888
- margin: var(--line-height) 0;
979
+ background: var(--inset-bg);
980
+ border: 1px solid var(--hairline-soft);
981
+ border-radius: var(--radius-ctl);
982
+ padding: 8px 10px;
983
+ margin: 10px 0;
889
984
  overflow-x: auto;
890
985
  }
891
986
 
892
987
  .markdown-content pre code {
893
988
  display: block;
894
989
  background: none;
990
+ padding: 0;
991
+ font-size: 11.5px;
895
992
  color: var(--text);
896
993
  }
897
994
 
898
995
  .markdown-content blockquote {
899
- border-left: 3px solid var(--mdQuoteBorder);
900
- padding-left: var(--line-height);
901
- margin: var(--line-height) 0;
902
- color: var(--mdQuote);
996
+ border-left: 2px solid var(--mdQuoteBorder, var(--hairline-strong));
997
+ padding-left: 12px;
998
+ margin: 10px 0;
999
+ color: var(--mdQuote, var(--muted));
903
1000
  font-style: italic;
904
1001
  }
905
1002
 
906
1003
  .markdown-content ul,
907
1004
  .markdown-content ol {
908
- margin: var(--line-height) 0;
909
- padding-left: calc(var(--line-height) * 2);
1005
+ margin: 8px 0;
1006
+ padding-left: 26px;
910
1007
  }
911
1008
 
912
1009
  .markdown-content li { margin: 0; }
913
- .markdown-content li::marker { color: var(--mdListBullet); }
1010
+ .markdown-content li + li { margin-top: 2px; }
1011
+ .markdown-content li::marker { color: var(--mdListBullet, var(--dim)); }
914
1012
 
915
1013
  .markdown-content hr {
916
1014
  border: none;
917
- border-top: 1px solid var(--mdHr);
918
- margin: var(--line-height) 0;
1015
+ border-top: 1px solid var(--hairline);
1016
+ margin: 14px 0;
919
1017
  }
920
1018
 
921
1019
  .markdown-content table {
922
1020
  border-collapse: collapse;
923
- margin: 0.5em 0;
1021
+ margin: 10px 0;
924
1022
  width: 100%;
1023
+ font-size: 11.5px;
925
1024
  }
926
1025
 
927
1026
  .markdown-content th,
928
1027
  .markdown-content td {
929
- border: 1px solid var(--mdCodeBlockBorder);
930
- padding: 6px 10px;
1028
+ border: 1px solid var(--hairline);
1029
+ padding: 5px 9px;
931
1030
  text-align: left;
932
1031
  }
933
1032
 
934
1033
  .markdown-content th {
935
- background: rgba(128, 128, 128, 0.1);
936
- font-weight: bold;
1034
+ background: color-mix(in srgb, var(--text) 5%, transparent);
1035
+ font-weight: 600;
937
1036
  }
938
1037
 
939
1038
  .markdown-content img {
940
1039
  max-width: 100%;
941
- border-radius: 4px;
1040
+ border-radius: var(--radius-ctl);
1041
+ border: 1px solid var(--hairline);
942
1042
  }
943
1043
 
944
- /* Syntax highlighting */
1044
+ /* ================= Syntax highlighting ================= */
1045
+
945
1046
  .hljs { background: transparent; color: var(--text); }
946
1047
  .hljs-comment, .hljs-quote { color: var(--syntaxComment); }
947
1048
  .hljs-keyword, .hljs-selector-tag { color: var(--syntaxKeyword); }
@@ -957,38 +1058,75 @@
957
1058
  .hljs-punctuation { color: var(--syntaxPunctuation); }
958
1059
  .hljs-subst { color: var(--text); }
959
1060
 
960
- /* Footer */
1061
+ /* ================= Image modal ================= */
1062
+
1063
+ .image-modal {
1064
+ display: none;
1065
+ position: fixed;
1066
+ inset: 0;
1067
+ z-index: 200;
1068
+ align-items: center;
1069
+ justify-content: center;
1070
+ padding: 32px;
1071
+ background: color-mix(in srgb, var(--body-bg) 72%, transparent);
1072
+ backdrop-filter: blur(3px);
1073
+ }
1074
+
1075
+ .image-modal.open {
1076
+ display: flex;
1077
+ }
1078
+
1079
+ .image-modal img {
1080
+ max-width: 100%;
1081
+ max-height: 100%;
1082
+ border-radius: var(--radius-card);
1083
+ border: 1px solid var(--hairline-strong);
1084
+ box-shadow: 0 16px 48px color-mix(in srgb, var(--text) 12%, transparent);
1085
+ }
1086
+
1087
+ /* ================= Footer ================= */
1088
+
961
1089
  .footer {
962
1090
  margin-top: 48px;
963
- padding: 20px;
1091
+ padding: 16px 0 8px;
964
1092
  text-align: center;
965
1093
  color: var(--dim);
966
1094
  font-size: 10px;
1095
+ border-top: 1px solid var(--hairline-soft);
967
1096
  }
968
1097
 
969
- /* Mobile */
1098
+ /* ================= Mobile chrome ================= */
1099
+
970
1100
  #hamburger {
971
1101
  display: none;
972
1102
  position: fixed;
973
1103
  top: 10px;
974
1104
  left: 10px;
975
1105
  z-index: 100;
976
- padding: 3px 8px;
1106
+ width: 28px;
1107
+ height: 28px;
1108
+ padding: 0;
977
1109
  font-size: 12px;
978
1110
  font-family: inherit;
979
- background: transparent;
1111
+ background: color-mix(in srgb, var(--body-bg) 80%, transparent);
1112
+ backdrop-filter: blur(3px);
980
1113
  color: var(--muted);
981
- border: 1px solid var(--dim);
982
- border-radius: 3px;
1114
+ border: 1px solid var(--hairline);
1115
+ border-radius: var(--radius-ctl);
983
1116
  cursor: pointer;
1117
+ align-items: center;
1118
+ justify-content: center;
1119
+ transition: color 0.12s ease, background 0.12s ease, transform 0.08s ease;
984
1120
  }
985
1121
 
986
1122
  #hamburger:hover {
987
1123
  color: var(--text);
988
- border-color: var(--text);
1124
+ background: var(--hover-wash);
989
1125
  }
990
1126
 
991
-
1127
+ #hamburger:active {
1128
+ transform: scale(0.95);
1129
+ }
992
1130
 
993
1131
  #sidebar-overlay {
994
1132
  display: none;
@@ -997,7 +1135,8 @@
997
1135
  left: 0;
998
1136
  right: 0;
999
1137
  bottom: 0;
1000
- background: rgba(0, 0, 0, 0.5);
1138
+ background: color-mix(in srgb, var(--body-bg) 55%, transparent);
1139
+ backdrop-filter: blur(2px);
1001
1140
  z-index: 98;
1002
1141
  }
1003
1142
 
@@ -1012,7 +1151,8 @@
1012
1151
  bottom: 0;
1013
1152
  height: 100vh;
1014
1153
  z-index: 99;
1015
- transition: transform 0.3s;
1154
+ transition: transform 0.25s ease;
1155
+ box-shadow: 8px 0 32px color-mix(in srgb, var(--text) 10%, transparent);
1016
1156
  }
1017
1157
 
1018
1158
  #sidebar.open {
@@ -1024,7 +1164,7 @@
1024
1164
  }
1025
1165
 
1026
1166
  #hamburger {
1027
- display: block;
1167
+ display: flex;
1028
1168
  }
1029
1169
 
1030
1170
  .sidebar-close {
@@ -1036,7 +1176,7 @@
1036
1176
  }
1037
1177
 
1038
1178
  #content {
1039
- padding: var(--line-height) 16px;
1179
+ padding: 48px 14px 32px;
1040
1180
  }
1041
1181
 
1042
1182
  #content > * {
@@ -1044,8 +1184,154 @@
1044
1184
  }
1045
1185
  }
1046
1186
 
1187
+ /* ================= Motion & print ================= */
1188
+
1189
+ @media (prefers-reduced-motion: reduce) {
1190
+ *, *::before, *::after {
1191
+ animation-duration: 0.01ms !important;
1192
+ animation-iteration-count: 1 !important;
1193
+ transition-duration: 0.01ms !important;
1194
+ }
1195
+
1196
+ .filter-btn:active,
1197
+ .sidebar-close:active,
1198
+ .copy-link-btn:active,
1199
+ #hamburger:active {
1200
+ transform: none;
1201
+ }
1202
+ }
1203
+
1047
1204
  @media print {
1048
- #sidebar, #sidebar-toggle, #sidebar-resizer { display: none !important; }
1205
+ #sidebar, #sidebar-toggle, #sidebar-resizer, #hamburger, .copy-link-btn { display: none !important; }
1049
1206
  body { background: white; color: black; }
1050
- #content { max-width: none; }
1207
+ #content { max-width: none; padding: 0; }
1208
+ .user-message, .tool-execution, .compaction, .branch-summary, .hook-message { break-inside: avoid; }
1209
+ }
1210
+
1211
+ /* ==== sub-session overlay (owned by template.js) ==== */
1212
+
1213
+ #subsession-overlay {
1214
+ position: fixed;
1215
+ inset: 0;
1216
+ z-index: 1000;
1217
+ display: none;
1218
+ }
1219
+
1220
+ #subsession-overlay.open {
1221
+ display: block;
1222
+ }
1223
+
1224
+ .subsession-backdrop {
1225
+ position: absolute;
1226
+ inset: 0;
1227
+ background: color-mix(in srgb, var(--body-bg) 55%, transparent);
1228
+ backdrop-filter: blur(3px);
1229
+ -webkit-backdrop-filter: blur(3px);
1230
+ }
1231
+
1232
+ .subsession-panel {
1233
+ position: absolute;
1234
+ top: 50%;
1235
+ left: 50%;
1236
+ transform: translate(-50%, -50%);
1237
+ display: flex;
1238
+ flex-direction: column;
1239
+ width: min(1100px, 92vw);
1240
+ max-height: 90vh;
1241
+ background: var(--container-bg);
1242
+ border: 1px solid var(--border);
1243
+ border-radius: 8px;
1244
+ box-shadow: 0 24px 64px color-mix(in srgb, var(--body-bg) 70%, transparent);
1245
+ outline: none;
1246
+ overflow: hidden;
1247
+ }
1248
+
1249
+ .subsession-header {
1250
+ display: flex;
1251
+ align-items: center;
1252
+ justify-content: space-between;
1253
+ gap: 12px;
1254
+ padding: 10px 14px;
1255
+ border-bottom: 1px solid var(--border);
1256
+ flex: none;
1257
+ }
1258
+
1259
+ .subsession-breadcrumb {
1260
+ display: flex;
1261
+ align-items: center;
1262
+ flex-wrap: wrap;
1263
+ gap: 6px;
1264
+ min-width: 0;
1265
+ }
1266
+
1267
+ .subsession-crumb {
1268
+ font: inherit;
1269
+ color: var(--accent);
1270
+ background: color-mix(in srgb, var(--accent) 12%, transparent);
1271
+ border: 1px solid color-mix(in srgb, var(--accent) 30%, transparent);
1272
+ border-radius: 6px;
1273
+ padding: 1px 8px;
1274
+ max-width: 240px;
1275
+ overflow: hidden;
1276
+ text-overflow: ellipsis;
1277
+ white-space: nowrap;
1278
+ }
1279
+
1280
+ button.subsession-crumb {
1281
+ cursor: pointer;
1282
+ }
1283
+
1284
+ button.subsession-crumb:hover {
1285
+ background: color-mix(in srgb, var(--accent) 22%, transparent);
1286
+ }
1287
+
1288
+ .subsession-crumb.current {
1289
+ color: var(--text);
1290
+ background: transparent;
1291
+ border-color: var(--border);
1292
+ font-weight: bold;
1293
+ }
1294
+
1295
+ .subsession-crumb-sep {
1296
+ color: var(--muted);
1297
+ flex: none;
1298
+ }
1299
+
1300
+ .subsession-close {
1301
+ font: inherit;
1302
+ font-size: 14px;
1303
+ line-height: 1;
1304
+ color: var(--muted);
1305
+ background: transparent;
1306
+ border: 1px solid var(--border);
1307
+ border-radius: 6px;
1308
+ width: 24px;
1309
+ height: 24px;
1310
+ flex: none;
1311
+ cursor: pointer;
1312
+ }
1313
+
1314
+ .subsession-close:hover,
1315
+ .subsession-close:focus-visible {
1316
+ color: var(--text);
1317
+ border-color: var(--accent);
1318
+ }
1319
+
1320
+ .subsession-meta {
1321
+ padding: 4px 14px;
1322
+ color: var(--muted);
1323
+ font-size: 11px;
1324
+ border-bottom: 1px solid var(--border);
1325
+ flex: none;
1326
+ }
1327
+
1328
+ .subsession-body {
1329
+ flex: 1 1 auto;
1330
+ overflow-y: auto;
1331
+ padding: 14px;
1332
+ overscroll-behavior: contain;
1333
+ }
1334
+
1335
+ .subsession-empty {
1336
+ color: var(--muted);
1051
1337
  }