@oh-my-pi/pi-coding-agent 17.1.6 → 17.1.8

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