@xenosystem/agent-conversation 0.1.35 → 0.1.37

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 (86) hide show
  1. package/dist/adapters/xenoAgentHostCatalog.d.ts.map +1 -1
  2. package/dist/adapters/xenoAgentHostCatalog.js +20 -5
  3. package/dist/adapters/xenoAgentHostCatalog.js.map +1 -1
  4. package/dist/components/agent/AgentView.d.ts +9 -0
  5. package/dist/components/agent/AgentView.d.ts.map +1 -1
  6. package/dist/components/agent/AgentView.js +883 -1045
  7. package/dist/components/agent/AgentView.js.map +1 -1
  8. package/dist/components/agent/GhostTextArea.d.ts +6 -0
  9. package/dist/components/agent/GhostTextArea.d.ts.map +1 -1
  10. package/dist/components/agent/GhostTextArea.js +15 -5
  11. package/dist/components/agent/GhostTextArea.js.map +1 -1
  12. package/dist/components/agent/LiveConversationCollaboration.d.ts +3 -1
  13. package/dist/components/agent/LiveConversationCollaboration.d.ts.map +1 -1
  14. package/dist/components/agent/LiveConversationCollaboration.js +3 -1
  15. package/dist/components/agent/LiveConversationCollaboration.js.map +1 -1
  16. package/dist/components/agent/MessageText.d.ts +36 -0
  17. package/dist/components/agent/MessageText.d.ts.map +1 -0
  18. package/dist/components/agent/MessageText.js +76 -0
  19. package/dist/components/agent/MessageText.js.map +1 -0
  20. package/dist/components/agent/SdkSessionPanel.d.ts +2 -0
  21. package/dist/components/agent/SdkSessionPanel.d.ts.map +1 -1
  22. package/dist/components/agent/SdkSessionPanel.js +1 -1
  23. package/dist/components/agent/SdkSessionPanel.js.map +1 -1
  24. package/dist/components/agent/composer/Composer.d.ts +282 -0
  25. package/dist/components/agent/composer/Composer.d.ts.map +1 -0
  26. package/dist/components/agent/composer/Composer.js +393 -0
  27. package/dist/components/agent/composer/Composer.js.map +1 -0
  28. package/dist/components/agent/composer/EffortCells.d.ts +12 -0
  29. package/dist/components/agent/composer/EffortCells.d.ts.map +1 -0
  30. package/dist/components/agent/composer/EffortCells.js +146 -0
  31. package/dist/components/agent/composer/EffortCells.js.map +1 -0
  32. package/dist/components/agent/composer/Tip.d.ts +19 -0
  33. package/dist/components/agent/composer/Tip.d.ts.map +1 -0
  34. package/dist/components/agent/composer/Tip.js +78 -0
  35. package/dist/components/agent/composer/Tip.js.map +1 -0
  36. package/dist/components/agent/composer/TypedMenu.d.ts +56 -0
  37. package/dist/components/agent/composer/TypedMenu.d.ts.map +1 -0
  38. package/dist/components/agent/composer/TypedMenu.js +156 -0
  39. package/dist/components/agent/composer/TypedMenu.js.map +1 -0
  40. package/dist/components/agent/mainAssistant.d.ts +9 -2
  41. package/dist/components/agent/mainAssistant.d.ts.map +1 -1
  42. package/dist/components/agent/mainAssistant.js +9 -2
  43. package/dist/components/agent/mainAssistant.js.map +1 -1
  44. package/dist/components/agent/toolCallDerive.d.ts +82 -0
  45. package/dist/components/agent/toolCallDerive.d.ts.map +1 -0
  46. package/dist/components/agent/toolCallDerive.js +741 -0
  47. package/dist/components/agent/toolCallDerive.js.map +1 -0
  48. package/dist/components/agent/transcript/Transcript.d.ts +127 -0
  49. package/dist/components/agent/transcript/Transcript.d.ts.map +1 -0
  50. package/dist/components/agent/transcript/Transcript.js +544 -0
  51. package/dist/components/agent/transcript/Transcript.js.map +1 -0
  52. package/dist/components/agent/transcript/glyphs.d.ts +83 -0
  53. package/dist/components/agent/transcript/glyphs.d.ts.map +1 -0
  54. package/dist/components/agent/transcript/glyphs.js +124 -0
  55. package/dist/components/agent/transcript/glyphs.js.map +1 -0
  56. package/dist/components/agent/transcript/stepModel.d.ts +163 -0
  57. package/dist/components/agent/transcript/stepModel.d.ts.map +1 -0
  58. package/dist/components/agent/transcript/stepModel.js +701 -0
  59. package/dist/components/agent/transcript/stepModel.js.map +1 -0
  60. package/dist/components/agent/transcript/turnModel.d.ts +124 -0
  61. package/dist/components/agent/transcript/turnModel.d.ts.map +1 -0
  62. package/dist/components/agent/transcript/turnModel.js +166 -0
  63. package/dist/components/agent/transcript/turnModel.js.map +1 -0
  64. package/dist/components/agent/transcript/useAskActions.d.ts +23 -0
  65. package/dist/components/agent/transcript/useAskActions.d.ts.map +1 -0
  66. package/dist/components/agent/transcript/useAskActions.js +92 -0
  67. package/dist/components/agent/transcript/useAskActions.js.map +1 -0
  68. package/dist/parityFixture.d.ts +54 -0
  69. package/dist/parityFixture.d.ts.map +1 -0
  70. package/dist/parityFixture.js +195 -0
  71. package/dist/parityFixture.js.map +1 -0
  72. package/dist/platformApiTypes.d.ts +10 -1
  73. package/dist/platformApiTypes.d.ts.map +1 -1
  74. package/dist/stores/agentChatStore.d.ts +61 -1
  75. package/dist/stores/agentChatStore.d.ts.map +1 -1
  76. package/dist/stores/agentChatStore.js +63 -8
  77. package/dist/stores/agentChatStore.js.map +1 -1
  78. package/dist/types/agentPermissions.d.ts +3 -1
  79. package/dist/types/agentPermissions.d.ts.map +1 -1
  80. package/dist/utils/acpExecutionAuthority.d.ts.map +1 -1
  81. package/dist/utils/acpExecutionAuthority.js +2 -0
  82. package/dist/utils/acpExecutionAuthority.js.map +1 -1
  83. package/package.json +6 -5
  84. package/src/composer.css +334 -0
  85. package/src/styles.css +7 -0
  86. package/src/transcript.css +585 -0
@@ -0,0 +1,585 @@
1
+ /* =============================================================================
2
+ The XENO Agent transcript — D10 of `XENO AGENT PANEL - SPEC.md`, as CSS.
3
+ -----------------------------------------------------------------------------
4
+ Ported from the Turn Modes Bench (v20), geometry for geometry: the clock line, the rail
5
+ (28 px rows, 12 px apart, the marker's box EARNED), details as children on branches, asks as
6
+ cards that stop the rail, the sub-turn's tree, the fold to a receipt, both step modes.
7
+
8
+ Every class is `xa-` prefixed and every rule lives under `.xa-transcript`, so nothing here
9
+ reaches a host's document — this stylesheet ships with a panel that mounts at runtime.
10
+
11
+ One ink, two themes: every grey is the ink at an alpha, so the light theme is one flip of
12
+ `--xa-ink` and the six text greys. A colour that only exists in one theme is a defect.
13
+ ============================================================================= */
14
+
15
+ /* the tokens are shared with the composer (`composer.css`), which is the same ink on the same plate.
16
+ `.xa-app` is the panel's root and carries them for everything it holds; `.xa-transcript` and
17
+ `.xa-dock` keep them too, because the trays and the vocabulary sheet mount those alone. */
18
+ .xa-app, .xa-transcript, .xa-dock {
19
+ color-scheme: dark;
20
+ --xa-ink: 255, 255, 255;
21
+ /* the panel paints its OWN ground and plate — the bench's, in both themes — rather than borrowing the
22
+ host's page: a tile reads the same in every host, and a host whose light page is a shade greyer
23
+ (`--xeno-page-bg: #ececee`) does not tint the conversation */
24
+ --xa-ground: #08080a;
25
+ --xa-plate: #161618;
26
+ --xa-box: #141416;
27
+ --xa-code: #0e0e10;
28
+ --xa-well: #111113;
29
+ --xa-menu: #101011;
30
+ --xa-ink-text: #e6e6ea;
31
+ --xa-send: #e8e8ec;
32
+ --xa-send-hover: #ffffff;
33
+ --xa-line: rgba(var(--xa-ink), 0.08);
34
+ --xa-line-soft: rgba(var(--xa-ink), 0.07);
35
+ --xa-line-tip: rgba(var(--xa-ink), 0.10);
36
+ --xa-wash: rgba(var(--xa-ink), 0.03);
37
+ --xa-wash-hover: rgba(var(--xa-ink), 0.05);
38
+ --xa-t1: #f4f4f4;
39
+ --xa-t2: #d8d8de;
40
+ --xa-t3: #acacb4;
41
+ --xa-t4: #7f7f86;
42
+ --xa-t5: #6c6c74;
43
+ --xa-t6: #5b5b62;
44
+ --xa-label: rgba(244, 244, 244, 0.32);
45
+ --xa-amber: #d99a4e;
46
+ --xa-green: #6fbf73;
47
+ --xa-red: #d76f6f;
48
+ --xa-ease: cubic-bezier(0.2, 0.7, 0.2, 1);
49
+ --xa-ease-out: cubic-bezier(0.4, 0, 0.8, 0.4);
50
+ --xa-glide: cubic-bezier(0.3, 0, 0.2, 1);
51
+ /* the composer's own tokens, from the locked prototype */
52
+ --xa-tile: #1c1c1f;
53
+ --xa-tile-img: #232326;
54
+ --xa-line-menu: rgba(var(--xa-ink), 0.09);
55
+ --xa-seg-on: rgba(var(--xa-ink), 0.12);
56
+ --xa-amber-wash: rgba(217, 154, 78, 0.08);
57
+ --xa-amber-line: rgba(217, 154, 78, 0.26);
58
+ --xa-amber-dim: #8a7a63;
59
+ }
60
+ /* the panel's typography — the bench sets it on its page body; a panel that mounts inside another
61
+ product cannot rely on the host's body, so the root declares it */
62
+ .xa-app, .xa-transcript {
63
+ color: var(--xa-t2);
64
+ font-family: Inter, ui-sans-serif, system-ui, -apple-system, 'Segoe UI', sans-serif;
65
+ font-size: 13px;
66
+ line-height: 20px;
67
+ font-feature-settings: 'cv02' 1, 'cv03' 1, 'cv04' 1, 'cv11' 1, 'ss01' 1;
68
+ letter-spacing: -0.006em;
69
+ -webkit-font-smoothing: antialiased;
70
+ tab-size: 8;
71
+ text-size-adjust: auto;
72
+ }
73
+ /* the frame: a column — the thread scrolling inside it, the dock pinned to its bottom edge (bench `.app`) */
74
+ .xa-app { display: flex; flex-direction: column; position: relative; flex: 1; min-height: 0; background: var(--xa-ground); overflow: hidden; user-select: none; }
75
+ /* the scroller (bench `.transcript`) — only as the frame's own child: trays and standalone sheets
76
+ also carry `.xa-transcript` for its scope, and must not become scrollers */
77
+ .xa-app > .xa-transcript { flex: 1; min-height: 0; overflow-y: auto; padding: 26px 16px 14px; scrollbar-width: thin; scrollbar-color: rgba(var(--xa-ink), 0.12) transparent; }
78
+ .xa-app > .xa-transcript::-webkit-scrollbar { width: 8px; }
79
+ .xa-app > .xa-transcript::-webkit-scrollbar-thumb { background: rgba(var(--xa-ink), 0.12); border-radius: 2px; }
80
+ /* the thread: the column the messages stand in (bench `.thread`) */
81
+ .xa-thread { max-width: 820px; margin: 0 auto; display: flex; flex-direction: column; gap: 20px; }
82
+ :root[data-theme='light'] .xa-app, :root[data-theme='light'] .xa-transcript, :root[data-theme='light'] .xa-dock {
83
+ color-scheme: light;
84
+ --xa-ink: 0, 0, 0;
85
+ --xa-ground: #f5f5f6;
86
+ --xa-plate: #ffffff;
87
+ --xa-box: #ffffff;
88
+ --xa-code: #f3f3f5;
89
+ --xa-well: #f0f0f2;
90
+ --xa-menu: #ffffff;
91
+ --xa-ink-text: #1a1a1e;
92
+ --xa-send: #111114;
93
+ --xa-send-hover: #000000;
94
+ --xa-line: rgba(0, 0, 0, 0.10);
95
+ --xa-line-soft: rgba(0, 0, 0, 0.08);
96
+ --xa-line-tip: rgba(0, 0, 0, 0.13);
97
+ --xa-wash: rgba(0, 0, 0, 0.03);
98
+ --xa-wash-hover: rgba(0, 0, 0, 0.05);
99
+ --xa-t1: #111114;
100
+ --xa-t2: #2a2a30;
101
+ --xa-t3: #4b4b53;
102
+ --xa-t4: #6f6f78;
103
+ --xa-t5: #8b8b94;
104
+ --xa-t6: #a3a3ab;
105
+ --xa-label: rgba(17, 17, 20, 0.4);
106
+ --xa-green: #3f9a45;
107
+ --xa-red: #c24f4f;
108
+ --xa-amber: #b57a2c;
109
+ --xa-tile: #f0f0f2;
110
+ --xa-tile-img: #e8e8ec;
111
+ --xa-amber-wash: rgba(181, 122, 44, 0.10);
112
+ --xa-amber-line: rgba(181, 122, 44, 0.30);
113
+ --xa-amber-dim: #8a6f3f;
114
+ }
115
+
116
+ /* The bench's element resets (`* {}`, `button {}`, `svg {}`) at the bench's OWN specificity. Scoped with a
117
+ plain class they became (0,1,1) and beat every single-class rule — `.xa-tobottom` lost its background,
118
+ border and colour to `.xa-app button`. `:where()` scopes them to the panel and adds nothing. */
119
+ /* the bench's `*` — elements only; a pseudo-element keeps the UA's content-box, as it does there */
120
+ :where(.xa-app, .xa-transcript, .xa-dock) * { box-sizing: border-box; }
121
+ :where(.xa-app, .xa-transcript, .xa-dock) button { font: inherit; color: inherit; letter-spacing: inherit; background: none; border: 0; padding: 0; margin: 0; cursor: pointer; display: inline-flex; align-items: center; justify-content: center; }
122
+ /* Two things a HOST's preflight (Tailwind's) writes that the bench never does, put back at one class
123
+ of specificity so the panel reads the same in every host: pseudo-elements keep the UA's
124
+ content-box, and a button keeps the UA's `appearance: auto` — `button` reads the same and is not
125
+ the same value. */
126
+ .xa-app *::before, .xa-app *::after, .xa-transcript *::before, .xa-transcript *::after, .xa-dock *::before, .xa-dock *::after { box-sizing: content-box; }
127
+ .xa-app button, .xa-transcript button, .xa-dock button { appearance: auto; }
128
+ :where(.xa-app, .xa-transcript, .xa-dock) button:focus-visible { outline: 1px solid rgba(var(--xa-ink), 0.45); outline-offset: 2px; }
129
+ .xa-app svg, .xa-transcript svg, .xa-dock svg { flex: none; display: block; vertical-align: baseline; }
130
+ :where(.xa-app, .xa-transcript, .xa-dock) .xeno-element {
131
+ display: block;
132
+ /* The canonical renderer remains the source; this consumer reset matches the bench's baseline
133
+ SVG metrics without changing the shared element declaration or geometry. */
134
+ line-height: inherit;
135
+ vertical-align: baseline;
136
+ transition: all 0s ease 0s;
137
+ }
138
+ /* the bench's motion rule: a person who asked for less motion gets none — no rise, no glide, no breathing */
139
+ @media (prefers-reduced-motion: reduce) {
140
+ :where(.xa-app, .xa-transcript, .xa-dock), :where(.xa-app, .xa-transcript, .xa-dock) *, :where(.xa-app, .xa-transcript, .xa-dock) *::before, :where(.xa-app, .xa-transcript, .xa-dock) *::after { animation: none !important; transition: none !important; }
141
+ }
142
+ /* back to the live end of the thread — shows only when you have scrolled up (bench `.tobottom`) */
143
+ .xa-tobottom { position: absolute; right: 22px; z-index: 5; width: 24px; height: 24px; border-radius: 4px; background: var(--xa-plate); border: 1px solid var(--xa-line-tip); color: var(--xa-t3); opacity: 0; pointer-events: none; transform: translateY(6px); transition: opacity 160ms linear, transform 160ms var(--xa-ease); }
144
+ .xa-tobottom.xa-show { opacity: 1; pointer-events: auto; transform: none; }
145
+ .xa-tobottom:hover { color: var(--xa-t1); background: var(--xa-menu); }
146
+ .xa-tobottom svg { width: 12px; height: 12px; }
147
+ .xa-num { font-variant-numeric: tabular-nums; }
148
+ .xa-mono { font-family: ui-monospace, 'Cascadia Mono', 'JetBrains Mono', Menlo, Consolas, monospace; }
149
+ .xa-label { font-size: 10px; line-height: 12px; font-weight: 600; letter-spacing: 0.09em; text-transform: uppercase; color: var(--xa-label); }
150
+
151
+ /* ── motion: the composer's pair, at the transcript's scale ─────────────── */
152
+ @keyframes xa-breathe { 0%, 100% { opacity: 0.35; } 50% { opacity: 1; } }
153
+ @keyframes xa-rise { 0% { transform: translateY(10px); opacity: 0; filter: blur(3px); } 45% { transform: translateY(4px); opacity: 0; filter: blur(3px); } 100% { transform: none; opacity: 1; filter: blur(0); } }
154
+ @keyframes xa-sink { 0% { transform: none; opacity: 1; filter: blur(0); } 55% { transform: translateY(4px); opacity: 0; filter: blur(3px); } 100% { transform: translateY(10px); opacity: 0; filter: blur(3px); } }
155
+ @keyframes xa-raildraw { from { transform: scaleY(0); } to { transform: scaleY(1); } }
156
+ @keyframes xa-drawx { from { transform: scaleX(0); } to { transform: scaleX(1); } }
157
+ @keyframes xa-dotout { to { opacity: 0; filter: blur(3px); transform: scale(0.6); } }
158
+ @keyframes xa-slidein { from { transform: translateX(-16px); opacity: 0; filter: blur(3px); } to { transform: none; opacity: 1; filter: blur(0); } }
159
+ @keyframes xa-frombelow { from { transform: translateY(14px); opacity: 0; filter: blur(2px); } to { transform: none; opacity: 1; filter: blur(0); } }
160
+ @keyframes xa-toabove { to { transform: translateY(-14px); opacity: 0; filter: blur(2px); } }
161
+ @keyframes xa-blurout { to { opacity: 0; filter: blur(3px); } }
162
+
163
+ /* the glyph of a LIVE step plays its icon-motion on a loop — the trigger xeno-elements does not ship yet
164
+ (hover and selection are its two); until it does, this is the one rule the transcript adds to the set */
165
+ .xa-transcript .xa-row.xa-now .xeno-element[data-glyph],
166
+ .xa-transcript .xa-row.xa-ask:not(.xa-ok):not(.xa-bad) .xeno-element[data-glyph],
167
+ .xa-transcript .xa-cur .xa-gl .xeno-element[data-glyph] {
168
+ animation: var(--xeno-icon-anim) var(--xeno-icon-dur) var(--xeno-icon-ease) infinite;
169
+ }
170
+ .xa-transcript .xa-row.xa-now .xeno-element[data-glyph] .xeno-part,
171
+ .xa-transcript .xa-row.xa-ask:not(.xa-ok):not(.xa-bad) .xeno-element[data-glyph] .xeno-part,
172
+ .xa-transcript .xa-cur .xa-gl .xeno-element[data-glyph] .xeno-part {
173
+ animation: var(--part-anim) var(--part-dur) var(--xeno-icon-ease) infinite;
174
+ vector-effect: var(--part-vfx, none);
175
+ }
176
+
177
+ /* ── messages ─────────────────────────────────────────────────────────── */
178
+ .xa-user { align-self: flex-end; display: flex; flex-direction: column; align-items: flex-end; gap: 4px; max-width: 82%; animation: xa-rise 280ms var(--xa-ease) both; }
179
+ .xa-bubble { padding: 9px 12px; background: var(--xa-wash-hover); border: 1px solid var(--xa-line-soft); border-radius: 6px; color: var(--xa-ink-text); overflow-wrap: normal; }
180
+ .xa-bubble.xa-queued { background: var(--xa-wash); border-style: dashed; }
181
+ .xa-bubble img { display: block; max-width: 100%; border-radius: 4px; border: 1px solid var(--xa-line-soft); margin-bottom: 6px; }
182
+ /* what you can do to a message shows when you reach for it */
183
+ .xa-acts { display: flex; align-items: center; gap: 2px; height: 18px; opacity: 0; transition: opacity 160ms linear; }
184
+ .xa-user:hover .xa-acts, .xa-agent:hover .xa-acts, .xa-acts.xa-on, .xa-acts:focus-within { opacity: 1; }
185
+ .xa-acts .xa-t { font-size: 10px; color: var(--xa-t6); padding: 0 6px; }
186
+ .xa-acts .xa-b { height: 18px; padding: 0 6px; gap: 5px; border-radius: 3px; font-size: 10px; color: var(--xa-t5); }
187
+ .xa-acts .xa-b:hover { color: var(--xa-t2); background: var(--xa-wash); }
188
+ .xa-acts .xa-b:disabled { opacity: 0.4; cursor: not-allowed; }
189
+ .xa-acts .xa-b svg { width: 11px; height: 11px; }
190
+ .xa-acts .xa-b.xa-done { color: var(--xa-green); }
191
+ .xa-acts .xa-b.xa-failed { color: var(--xa-red); }
192
+ .xa-acts .xa-b.xa-tog.xa-on { color: var(--xa-t1); }
193
+ .xa-acts .xa-vr { width: 1px; height: 10px; margin: 0 4px; background: rgba(var(--xa-ink), 0.12); }
194
+ .xa-chip { display: inline-flex; align-items: center; gap: 5px; vertical-align: top; margin-top: 1px; height: 18px; padding: 0 6px 0 5px; background: rgba(var(--xa-ink), 0.07); border: 1px solid var(--xa-line-soft); border-radius: 3px; font-size: 12px; line-height: 16px; color: var(--xa-t1); white-space: nowrap; }
195
+ .xa-chip svg { width: 12px; height: 12px; color: var(--xa-t4); }
196
+ /* a day boundary in the thread */
197
+ .xa-sep { display: flex; align-items: center; gap: 10px; }
198
+ .xa-sep::before, .xa-sep::after { content: ''; flex: 1; height: 1px; background: var(--xa-line-soft); }
199
+ .xa-agent { display: flex; flex-direction: column; gap: 10px; }
200
+ /* the reply's markdown — the agent-interface's vocabulary: square bullets, quiet headings, a bordered table */
201
+ .xa-body { color: var(--xa-t2); max-width: 66ch; }
202
+ .xa-body p { margin: 0 0 8px; } .xa-body p:last-child { margin: 0; }
203
+ .xa-body h1, .xa-body h2, .xa-body h3, .xa-body h4 { margin: 4px 0 6px; font-size: 13px; line-height: 20px; font-weight: 600; color: var(--xa-t1); }
204
+ .xa-body ul, .xa-body ol { margin: 0 0 8px; padding: 0; list-style: none; }
205
+ .xa-body ul li, .xa-body ol li { position: relative; padding-left: 14px; margin: 0 0 3px; }
206
+ .xa-body ul li::before { content: ''; position: absolute; left: 2px; top: 8px; width: 4px; height: 4px; background: var(--xa-t5); border-radius: 1px; }
207
+ .xa-body ol { counter-reset: xa-ol; }
208
+ .xa-body ol li { padding-left: 20px; counter-increment: xa-ol; }
209
+ .xa-body ol li::before { content: counter(xa-ol) '.'; position: absolute; left: 0; top: 0; font-size: 11px; color: var(--xa-t5); font-variant-numeric: tabular-nums; }
210
+ .xa-body strong { font-weight: 600; color: var(--xa-t1); }
211
+ .xa-body a { color: var(--xa-t1); text-decoration: underline; text-decoration-color: rgba(var(--xa-ink), 0.3); text-underline-offset: 2px; }
212
+ .xa-body blockquote { margin: 0 0 8px; padding: 6px 0 6px 11px; border-left: 2px solid var(--xa-line-tip); color: var(--xa-t3); }
213
+ .xa-body table { border-collapse: separate; border-spacing: 0; margin: 2px 0 8px; font-size: 12px; line-height: 17px; border: 1px solid var(--xa-line-soft); border-radius: 4px; overflow: hidden; }
214
+ .xa-body th { text-align: left; padding: 5px 10px; font-size: 10px; line-height: 12px; font-weight: 600; letter-spacing: 0.06em; text-transform: uppercase; color: var(--xa-label); background: var(--xa-well); border-bottom: 1px solid var(--xa-line-soft); }
215
+ .xa-body td { padding: 5px 10px; color: var(--xa-t3); border-bottom: 1px solid rgba(var(--xa-ink), 0.05); vertical-align: top; }
216
+ .xa-body tr:last-child td { border-bottom: 0; }
217
+ .xa-body th + th, .xa-body td + td { border-left: 1px solid rgba(var(--xa-ink), 0.05); }
218
+ .xa-body td:first-child { color: var(--xa-t2); white-space: nowrap; }
219
+ .xa-body code, .xa-row code, .xa-card code { font-family: ui-monospace, 'Cascadia Mono', Menlo, Consolas, monospace; font-size: 11.5px; padding: 1px 4px; background: rgba(var(--xa-ink), 0.06); border-radius: 3px; color: var(--xa-t1); }
220
+ .xa-body hr { border: 0; border-top: 1px solid var(--xa-line-soft); margin: 8px 0; }
221
+ /* the reply arrives as it is written; the caret is the same 6px state square, breathing */
222
+ .xa-body .xa-caret { display: inline-block; width: 6px; height: 6px; margin-left: 3px; vertical-align: -1px; background: var(--xa-t2); border-radius: 1px; animation: xa-breathe 1.4s ease-in-out infinite; }
223
+ .xa-body .xa-cite { display: inline-flex; align-items: center; justify-content: center; min-width: 14px; height: 14px; padding: 0 3px; margin: 0 1px; vertical-align: 2px; border-radius: 2px; background: rgba(var(--xa-ink), 0.07); border: 1px solid var(--xa-line-soft); font-size: 9px; line-height: 12px; font-weight: 500; color: var(--xa-t3); cursor: default; transition: background 120ms linear, color 120ms linear; }
224
+ .xa-body .xa-cite:hover { background: rgba(var(--xa-ink), 0.14); color: var(--xa-t1); }
225
+ /* a code block in the reply: a header that says what it is and what you can do */
226
+ .xa-code { max-width: 66ch; border: 1px solid var(--xa-line-soft); border-radius: 4px; overflow: hidden; margin: 0 0 8px; animation: xa-rise 260ms var(--xa-ease) both; }
227
+ .xa-code .xa-hd { display: flex; align-items: center; height: 24px; padding: 0 4px 0 9px; background: var(--xa-well); border-bottom: 1px solid rgba(var(--xa-ink), 0.05); font-size: 10px; color: var(--xa-t5); }
228
+ .xa-code .xa-hd .xa-b { margin-left: auto; height: 18px; padding: 0 6px; gap: 5px; border-radius: 3px; font-size: 10px; color: var(--xa-t5); }
229
+ .xa-code .xa-hd .xa-b:hover { color: var(--xa-t2); background: var(--xa-wash); }
230
+ .xa-code .xa-hd .xa-b svg { width: 11px; height: 11px; }
231
+ .xa-code pre { margin: 0; padding: 8px 9px; background: var(--xa-code); font-size: 11px; line-height: 16px; color: var(--xa-t3); white-space: pre; overflow-x: auto; scrollbar-width: thin; scrollbar-color: rgba(var(--xa-ink), 0.12) transparent; }
232
+ .xa-code pre code { padding: 0; background: none; font-size: inherit; color: inherit; }
233
+ /* the sources stay with the answer once the rail has folded: a line the citations point at */
234
+ .xa-srcline { display: flex; align-items: center; gap: 8px; height: 22px; cursor: pointer; font-size: 11px; color: var(--xa-t4); }
235
+ .xa-srcline:hover { color: var(--xa-t2); }
236
+ .xa-srcline .xa-stack { display: flex; }
237
+ .xa-srcline .xa-stack .xa-fav { width: 14px; height: 14px; margin-left: -4px; border-radius: 2px; border: 1px solid var(--xa-line-tip); background: linear-gradient(135deg, #2a2a2f, #1c1c1f); box-shadow: 0 0 0 1px var(--xa-ground); }
238
+ .xa-srcline .xa-stack .xa-fav:first-child { margin-left: 0; }
239
+ .xa-srcline .xa-chev { color: var(--xa-t6); transition: transform 160ms var(--xa-ease); }
240
+ .xa-srcline.xa-open .xa-chev { transform: rotate(90deg); }
241
+ .xa-srcwrap { display: grid; grid-template-rows: 0fr; transition: grid-template-rows 220ms var(--xa-ease); }
242
+ .xa-srcwrap.xa-open { grid-template-rows: 1fr; }
243
+ .xa-srcwrap > div { min-height: 0; overflow: hidden; }
244
+ .xa-srcwrap .xa-detail { margin: 0; animation: none; }
245
+ /* the action row under a reply: what it cost, when, and what you can do with it */
246
+ .xa-rfoot .xa-meta { margin-left: auto; font-size: 10px; color: var(--xa-t6); }
247
+ .xa-rfoot .xa-meta .xa-vr { display: inline-block; vertical-align: -1px; }
248
+ /* what you might say next — the reply offers it, the composer takes it */
249
+ .xa-pills { display: flex; flex-wrap: wrap; gap: 6px; }
250
+ .xa-pills button { height: 24px; padding: 0 9px; border-radius: 4px; font-size: 11px; font-weight: 500; color: var(--xa-t3); background: var(--xa-wash); border: 1px solid var(--xa-line-soft); animation: xa-rise 260ms var(--xa-ease) both; animation-delay: var(--xa-d, 0ms); }
251
+ .xa-pills button:hover { color: var(--xa-t1); background: var(--xa-wash-hover); border-color: var(--xa-line-tip); }
252
+
253
+ /* ── the turn: Z ──────────────────────────────────────────────────────── */
254
+ .xa-turn { display: flex; flex-direction: column; gap: 2px; }
255
+ .xa-line { display: flex; align-items: center; gap: 10px; min-height: 22px; animation: xa-rise 280ms var(--xa-ease) both; animation-delay: 160ms; }
256
+ .xa-line .xa-dot { flex: none; width: 6px; height: 6px; margin: 0 5px 0 6px; border-radius: 1px; background: var(--xa-t3); animation: xa-breathe 1.4s ease-in-out infinite; transition: background 160ms linear; }
257
+ .xa-turn:not(.xa-live) .xa-line .xa-dot { animation: none; background: var(--xa-t5); }
258
+ .xa-turn.xa-settle .xa-line .xa-dot { animation: xa-dotout 200ms var(--xa-ease-out) both; }
259
+ .xa-line .xa-dot.xa-gone { display: none; }
260
+ .xa-line .xa-read { font-size: 11.5px; line-height: 16px; color: var(--xa-t4); white-space: nowrap; }
261
+ .xa-line .xa-read .xa-n { color: var(--xa-t6); }
262
+ .xa-turn:not(.xa-live) .xa-line { cursor: pointer; }
263
+ .xa-turn:not(.xa-live) .xa-line:hover .xa-read { color: var(--xa-t3); }
264
+ .xa-line .xa-chev { flex: none; color: var(--xa-t6); opacity: 0; transition: transform 160ms var(--xa-ease), opacity 160ms linear; }
265
+ .xa-turn:not(.xa-live) .xa-line .xa-chev { opacity: 1; }
266
+ .xa-turn.xa-open .xa-line .xa-chev { transform: rotate(90deg); }
267
+ /* collapsed steps: while it works the rail stays folded and the clock line carries the current step —
268
+ "Working for 4s | Clicked Message @Lil Bro" — the text fading out on the right when it is long */
269
+ .xa-line .xa-vr { display: none; flex: none; width: 1px; height: 10px; background: rgba(var(--xa-ink), 0.12); }
270
+ .xa-line .xa-cur { display: none; align-items: center; gap: 7px; flex: 1 1 0; min-width: 0; height: 16px; overflow: hidden; font-size: 11.5px; line-height: 16px; color: var(--xa-t4); mask-image: linear-gradient(to right, #000 calc(100% - 44px), transparent 100%); -webkit-mask-image: linear-gradient(to right, #000 calc(100% - 44px), transparent 100%); }
271
+ .xa-line .xa-cur .xa-mono { font-size: 11px; }
272
+ /* the first step slides out from behind the clock — glyph, then its words; every later step replaces the
273
+ pair: the glyph rises from below as the old one leaves upward, the words come out from behind the glyph */
274
+ .xa-line .xa-cur .xa-slot { position: relative; flex: none; width: 12px; height: 16px; overflow: hidden; }
275
+ .xa-line .xa-cur .xa-gl { position: absolute; left: 0; top: 2px; width: 12px; height: 12px; display: flex; align-items: center; justify-content: center; color: var(--xa-t4); }
276
+ .xa-line .xa-cur .xa-gl svg { width: 12px; height: 12px; }
277
+ .xa-line .xa-cur .xa-gl .xa-sq { width: 4px; height: 4px; background: var(--xa-t5); border-radius: 1px; }
278
+ .xa-line .xa-cur .xa-gl.xa-first { animation: xa-slidein 280ms var(--xa-ease) both; }
279
+ .xa-line .xa-cur .xa-gl.xa-in { animation: xa-frombelow 240ms var(--xa-ease) both; }
280
+ .xa-line .xa-cur .xa-gl.xa-out { animation: xa-toabove 200ms var(--xa-ease-out) both; }
281
+ .xa-line .xa-cur .xa-tx { position: relative; flex: 1 1 0; min-width: 0; height: 16px; overflow: hidden; }
282
+ .xa-line .xa-cur .xa-t { position: absolute; left: 0; top: 0; white-space: nowrap; }
283
+ .xa-line .xa-cur .xa-t.xa-first { animation: xa-slidein 280ms var(--xa-ease) both; animation-delay: 120ms; }
284
+ .xa-line .xa-cur .xa-t.xa-in { animation: xa-slidein 260ms var(--xa-ease) both; animation-delay: 90ms; }
285
+ .xa-line .xa-cur .xa-t.xa-out { animation: xa-blurout 160ms var(--xa-ease-out) both; }
286
+ .xa-collapsed .xa-turn.xa-live:not(.xa-open):not(.xa-done) .xa-line .xa-vr { display: block; }
287
+ .xa-collapsed .xa-turn.xa-live:not(.xa-open):not(.xa-done) .xa-line .xa-cur { display: flex; }
288
+ .xa-collapsed .xa-turn.xa-live:not(.xa-open):not(.xa-asking) .xa-railwrap { grid-template-rows: 0fr; }
289
+ /* an ask surfaces alone: its row and its card, the rest of the rail stays folded */
290
+ .xa-collapsed .xa-turn.xa-live.xa-asking:not(.xa-open) .xa-rail .xa-row:not(.xa-ask):not(.xa-sub),
291
+ .xa-collapsed .xa-turn.xa-live.xa-asking:not(.xa-open) .xa-rail .xa-row.xa-ask.xa-ok,
292
+ .xa-collapsed .xa-turn.xa-live.xa-asking:not(.xa-open) .xa-rail .xa-row.xa-ask.xa-bad { display: none; }
293
+ .xa-collapsed .xa-turn.xa-live.xa-asking:not(.xa-open) .xa-rail .xa-row.xa-ask::before { display: none; }
294
+ .xa-collapsed .xa-turn.xa-live.xa-asking:not(.xa-open) .xa-line .xa-vr,
295
+ .xa-collapsed .xa-turn.xa-live.xa-asking:not(.xa-open) .xa-line .xa-cur { display: none; }
296
+ .xa-collapsed .xa-turn.xa-live .xa-line { cursor: pointer; }
297
+ .xa-collapsed .xa-turn.xa-live.xa-asking:not(.xa-open) .xa-rail .xa-row.xa-sub { display: flex; }
298
+ .xa-collapsed .xa-turn.xa-live.xa-asking:not(.xa-open) .xa-rail .xa-row.xa-sub.xa-folded { display: none; }
299
+ .xa-line .xa-shots { margin-left: auto; display: flex; gap: 4px; }
300
+ .xa-railwrap { display: grid; grid-template-rows: 1fr; transition: grid-template-rows 220ms var(--xa-ease); }
301
+ .xa-turn:not(.xa-live):not(.xa-open) .xa-railwrap { grid-template-rows: 0fr; }
302
+ .xa-rail { overflow: hidden; min-height: 0; display: flex; flex-direction: column; gap: 12px; }
303
+ .xa-row { position: relative; display: flex; align-items: center; flex-wrap: wrap; gap: 9px; min-height: 28px; font-size: 11.5px; line-height: 16px; color: var(--xa-t4); animation: xa-rise 240ms var(--xa-ease) both; }
304
+ .xa-row::before { content: ''; position: absolute; left: 8.5px; top: 23px; bottom: -17px; width: 1px; background: var(--xa-line); transform-origin: top; animation: xa-raildraw 200ms linear both; }
305
+ .xa-row:last-child::before { display: none; }
306
+ .xa-row .xa-ic { position: relative; flex: none; width: 18px; height: 18px; display: flex; align-items: center; justify-content: center; border-radius: 3px; background: var(--xa-box); border: 1px solid var(--xa-line-soft); color: var(--xa-t5); transition: background 160ms var(--xa-ease), border-color 160ms var(--xa-ease); }
307
+ .xa-row .xa-ic svg { width: 12px; height: 12px; }
308
+ .xa-row.xa-note .xa-ic { background: var(--xa-ground); border-color: var(--xa-line-tip); }
309
+ .xa-row.xa-note .xa-ic::after { content: ''; width: 4px; height: 4px; background: var(--xa-t5); border-radius: 1px; }
310
+ .xa-row.xa-now .xa-ic { color: var(--xa-t2); animation: xa-breathe 1.4s ease-in-out infinite; }
311
+ .xa-row.xa-now .xa-ic, .xa-row.xa-ask:not(.xa-ok):not(.xa-bad) .xa-ic { background: transparent; border-color: transparent; }
312
+ .xa-row.xa-ask .xa-ic { color: var(--xa-t1); animation: xa-breathe 1.4s ease-in-out infinite; }
313
+ .xa-row.xa-ask.xa-ok .xa-ic, .xa-row.xa-ask.xa-bad .xa-ic { animation: none; }
314
+ .xa-row.xa-ask.xa-ok .xa-ic { color: var(--xa-green); border-color: rgba(111, 191, 115, 0.45); background: rgba(111, 191, 115, 0.08); }
315
+ .xa-row.xa-ask.xa-bad .xa-ic, .xa-row.xa-bad .xa-ic { color: var(--xa-red); border-color: rgba(215, 111, 111, 0.45); background: rgba(215, 111, 111, 0.08); }
316
+ .xa-row.xa-warn .xa-ic { color: var(--xa-amber); border-color: rgba(217, 154, 78, 0.45); background: rgba(217, 154, 78, 0.08); }
317
+ .xa-row.xa-stop .xa-ic { color: var(--xa-t3); border-color: var(--xa-line-tip); background: var(--xa-well); }
318
+ .xa-row.xa-note, .xa-row.xa-think { color: var(--xa-t2); animation-duration: 300ms; }
319
+ .xa-row .xa-verb { flex: none; }
320
+ .xa-row .xa-obj { flex: 1 1 0; color: var(--xa-t3); min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
321
+ .xa-row .xa-res { margin-left: auto; flex: none; font-size: 10px; color: var(--xa-t6); transition: opacity 160ms linear; }
322
+ .xa-row.xa-now .xa-res.xa-late { opacity: 0; }
323
+ .xa-row .xa-what { color: var(--xa-t2); }
324
+ .xa-row .xa-why { flex: 1 1 0; min-width: 0; color: var(--xa-t4); }
325
+ .xa-row.xa-bad, .xa-row.xa-warn, .xa-row.xa-stop { color: var(--xa-t3); }
326
+ .xa-row .xa-act { flex: none; height: 20px; padding: 0 8px; border-radius: 3px; font-size: 10.5px; font-weight: 500; color: var(--xa-t2); background: rgba(var(--xa-ink), 0.06); border: 1px solid var(--xa-line-soft); }
327
+ .xa-row .xa-act:hover { color: var(--xa-t1); background: rgba(var(--xa-ink), 0.1); }
328
+ .xa-row .xa-act:disabled { opacity: 0.45; cursor: not-allowed; }
329
+ .xa-row .xa-chev { flex: none; color: var(--xa-t6); transition: transform 160ms var(--xa-ease); }
330
+ .xa-row.xa-open .xa-chev { transform: rotate(90deg); }
331
+ .xa-frame { display: inline-block; width: 34px; height: 21px; border-radius: 3px; border: 1px solid var(--xa-line-tip); background: var(--xa-well); object-fit: cover; }
332
+ /* the note row: the agent's own sentence between steps — markdown, a line or two */
333
+ .xa-row.xa-note .xa-body { flex: 1 1 0; min-width: 0; font-size: 11.5px; line-height: 16px; color: var(--xa-t2); }
334
+ .xa-row.xa-note .xa-body p { margin: 0 0 4px; } .xa-row.xa-note .xa-body p:last-child { margin: 0; }
335
+
336
+ /* thinking: one line — "Thinking · <the current thought>" — the phrase swapping as the reasoning moves,
337
+ nothing boxed, nothing masked. Done, it reads "Thought for Ns ›" and opens to the full text. */
338
+ .xa-row.xa-think .xa-head { display: flex; align-items: center; gap: 8px; flex: 1; min-width: 0; cursor: pointer; }
339
+ .xa-row.xa-think .xa-head .xa-what { flex: none; }
340
+ .xa-row.xa-think .xa-head .xa-dot2 { flex: none; color: var(--xa-t6); }
341
+ .xa-row.xa-think .xa-head .xa-curthought { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: var(--xa-t4); animation: xa-rise 280ms var(--xa-ease) both; }
342
+ .xa-row.xa-think:not(.xa-now) .xa-head .xa-dot2, .xa-row.xa-think:not(.xa-now) .xa-head .xa-curthought { display: none; }
343
+ .xa-row.xa-think .xa-fullwrap { flex-basis: 100%; margin: -9px 0 0 43px; display: grid; grid-template-rows: 0fr; transition: grid-template-rows 220ms var(--xa-ease), margin 220ms var(--xa-ease); }
344
+ .xa-row.xa-think.xa-open .xa-fullwrap { grid-template-rows: 1fr; margin: 0 0 2px 43px; }
345
+ .xa-row.xa-think .xa-full { min-height: 0; overflow: hidden; font-size: 11.5px; line-height: 16px; color: var(--xa-t4); }
346
+ .xa-row.xa-think .xa-full p { margin: 0 0 4px; } .xa-row.xa-think .xa-full p:last-child { margin: 0; }
347
+ /* the plan row keeps the list folded under it for the record; the list itself rides the composer */
348
+ .xa-row.xa-plan .xa-head { display: flex; align-items: center; gap: 9px; flex: 1; min-width: 0; cursor: pointer; }
349
+ .xa-planwrap { flex-basis: 100%; margin: -9px 0 0 43px; display: grid; grid-template-rows: 0fr; transition: grid-template-rows 220ms var(--xa-ease), margin 220ms var(--xa-ease); }
350
+ .xa-row.xa-plan.xa-open .xa-planwrap { grid-template-rows: 1fr; margin: 0 0 0 43px; }
351
+ .xa-planwrap > div { min-height: 0; overflow: hidden; }
352
+ .xa-plan-list { display: flex; flex-direction: column; padding-bottom: 2px; }
353
+ .xa-plan-list .xa-item, .xa-tasks .xa-item { display: flex; align-items: center; gap: 9px; min-height: 22px; font-size: 11px; color: var(--xa-t4); }
354
+ .xa-plan-list .xa-item .xa-sq, .xa-tasks .xa-item .xa-sq { flex: none; width: 6px; height: 6px; border-radius: 1px; border: 1px solid var(--xa-t5); background: none; transition: background 160ms linear, border-color 160ms linear; }
355
+ .xa-plan-list .xa-item.xa-now, .xa-tasks .xa-item.xa-now { color: var(--xa-t2); }
356
+ .xa-plan-list .xa-item.xa-now .xa-sq, .xa-tasks .xa-item.xa-now .xa-sq { border-color: var(--xa-t2); background: var(--xa-t2); animation: xa-breathe 1.4s ease-in-out infinite; }
357
+ .xa-plan-list .xa-item.xa-done, .xa-tasks .xa-item.xa-done { color: var(--xa-t5); }
358
+ .xa-plan-list .xa-item.xa-done .xa-sq, .xa-tasks .xa-item.xa-done .xa-sq { border-color: var(--xa-t4); background: var(--xa-t4); animation: none; }
359
+ .xa-plan-list .xa-item.xa-blocked .xa-sq, .xa-tasks .xa-item.xa-blocked .xa-sq { border-color: var(--xa-amber); background: rgba(217, 154, 78, 0.4); }
360
+
361
+ /* a sub-turn: a turn inside a row — the bot, the mode as a badge, the brief, its own clock, its own
362
+ rail nested under it, folding like a turn and reopening from its row (D11) */
363
+ .xa-row .xa-mode, .xa-line .xa-cur .xa-mode { display: inline-flex; align-items: center; flex: none; height: 16px; padding: 0 5px; border-radius: 3px; background: rgba(var(--xa-ink), 0.06); font-size: 10px; line-height: 1; font-weight: 500; color: var(--xa-t4); }
364
+ .xa-row.xa-sub .xa-head { display: flex; align-items: center; gap: 9px; flex: 1; min-width: 0; }
365
+ .xa-row.xa-sub.xa-folded .xa-head { cursor: pointer; }
366
+ .xa-row.xa-sub .xa-head .xa-obj { flex: 1 1 0; }
367
+ .xa-row.xa-sub .xa-head .xa-res { margin-left: auto; }
368
+ .xa-subwrap { flex-basis: 100%; margin: 0; display: grid; grid-template-rows: 1fr; transition: grid-template-rows 220ms var(--xa-ease), margin-top 220ms var(--xa-ease); }
369
+ .xa-row.xa-sub.xa-folded:not(.xa-open) .xa-subwrap { grid-template-rows: 0fr; margin-top: -9px; }
370
+ .xa-subwrap > span { display: block; min-height: 0; overflow: hidden; }
371
+ .xa-subwrap > span > .xa-rail { padding: 2px 0 2px 27px; overflow: visible; }
372
+ /* the nested rows are CHILDREN of the sub-turn, and the delegation attaches ONCE: the parent's line branches into the
373
+ sub-turn's FIRST row, and every row after it hangs on the sub-turn's own rail under that one — the delegate's trail,
374
+ never a set of siblings each hooked to the parent. The tree at every depth: one branch per child. */
375
+ .xa-subwrap > span > .xa-rail > .xa-row:first-child::after, .xa-detail.xa-nest > .xa-rail > .xa-row:first-child::after { content: ''; position: absolute; left: -18.5px; top: 13.5px; width: 18.5px; height: 1px; background: var(--xa-line); pointer-events: none; transform-origin: left center; animation: xa-drawx 160ms linear both; }
376
+ .xa-detail.xa-nest > .xa-rail > .xa-row:first-child::after { left: -34.5px; width: 34.5px; }
377
+ /* a rail's last row draws no line of its own — so when the sub-turn IS the parent's last row, the piece from the
378
+ parent's marker down to the first nested row's branch is drawn by the wrapper, outside the fold's clip */
379
+ .xa-subwrap, .xa-row .xa-dwrap { position: relative; }
380
+ .xa-row:last-child > .xa-subwrap::before { content: ''; position: absolute; left: 8.5px; top: -14px; height: 30px; width: 1px; background: var(--xa-line); transform-origin: top; animation: xa-raildraw 200ms linear both; }
381
+ .xa-row.xa-sub.xa-folded:not(.xa-open) > .xa-subwrap::before { display: none; }
382
+ /* an ask pending as a sub-turn's FIRST row: the parent's line runs on past its branch, down into the card, and
383
+ branches into it — the card is that row's child. A later pending ask hangs on the sub-turn's own rail, which stops
384
+ at it, as a pending ask stops any rail. */
385
+ .xa-subwrap > span > .xa-rail > .xa-row.xa-ask:first-child:not(.xa-ok):not(.xa-bad) .xa-cardslot::before { transform: scaleX(1); }
386
+ .xa-subwrap > span > .xa-rail > .xa-row.xa-ask:first-child:not(.xa-ok):not(.xa-bad) .xa-cardslot::after { content: ''; position: absolute; left: -18.5px; top: -23px; height: calc(50% + 23px); width: 1px; background: var(--xa-line); transform-origin: top; animation: xa-raildraw 200ms linear both; }
387
+ /* collapsed mode shows the pending ask alone, so it is the first row on screen whatever its place in the rail */
388
+ .xa-collapsed .xa-turn.xa-live.xa-asking:not(.xa-open) .xa-subwrap > span > .xa-rail > .xa-row.xa-ask::after { content: ''; position: absolute; left: -18.5px; top: 13.5px; width: 18.5px; height: 1px; background: var(--xa-line); pointer-events: none; }
389
+ .xa-collapsed .xa-turn.xa-live.xa-asking:not(.xa-open) .xa-subwrap .xa-row.xa-ask:not(.xa-ok):not(.xa-bad) .xa-cardslot::before { transform: scaleX(1); }
390
+ .xa-collapsed .xa-turn.xa-live.xa-asking:not(.xa-open) .xa-subwrap .xa-row.xa-ask:not(.xa-ok):not(.xa-bad) .xa-cardslot::after { content: ''; position: absolute; left: -18.5px; top: -23px; height: calc(50% + 23px); width: 1px; background: var(--xa-line); transform-origin: top; animation: xa-raildraw 200ms linear both; }
391
+
392
+ /* ── what opens under a row ───────────────────────────────────────────── */
393
+ /* a detail is open while its step is current, folded once the step is behind — the row keeps the count,
394
+ a chevron says it opens, a click reopens it. Everything in it hangs on the rail by a branch. */
395
+ .xa-row .xa-dwrap { flex-basis: 100%; display: grid; grid-template-rows: 1fr; transition: grid-template-rows 220ms var(--xa-ease), margin-top 220ms var(--xa-ease); }
396
+ .xa-row:not(.xa-now):not(.xa-open) .xa-dwrap { grid-template-rows: 0fr; margin-top: -9px; }
397
+ .xa-row .xa-dwrap > div { min-height: 0; overflow: hidden; }
398
+ .xa-row.xa-hasd { cursor: default; }
399
+ .xa-row.xa-hasd:not(.xa-now) { cursor: pointer; }
400
+ .xa-row.xa-hasd .xa-chev { flex: none; color: var(--xa-t6); opacity: 0; transition: transform 160ms var(--xa-ease), opacity 160ms linear; }
401
+ .xa-row.xa-hasd:not(.xa-now) .xa-chev { opacity: 1; }
402
+ .xa-row .xa-detail { flex-basis: 100%; margin: 0 0 2px 43px; min-width: 0; animation: xa-rise 240ms var(--xa-ease) both; animation-delay: 120ms; }
403
+ .xa-rail .xa-detail.xa-list .xa-it, .xa-rail .xa-detail.xa-sources .xa-it, .xa-rail .xa-detail.xa-matches .xa-file, .xa-rail .xa-detail.xa-output, .xa-rail .xa-detail.xa-diff, .xa-rail .xa-detail.xa-prose, .xa-rail .xa-detail.xa-slice { position: relative; }
404
+ .xa-rail .xa-detail.xa-list .xa-it::before, .xa-rail .xa-detail.xa-sources .xa-it::before, .xa-rail .xa-detail.xa-matches .xa-file::before { content: ''; position: absolute; left: -34.5px; top: 50%; width: 34.5px; height: 1px; background: var(--xa-line); }
405
+ /* a block detail (output, diff, prose, a slice) hangs by ONE branch at its mid-height. The branch is drawn by the
406
+ detail's wrapper, not by the block: the block clips its overflow for its corners, and a branch that starts 35px
407
+ outside a clipping box is a branch nobody sees. */
408
+ .xa-row .xa-dwrap > div { position: relative; }
409
+ .xa-row .xa-dwrap > div:has(> :is(.xa-detail.xa-output, .xa-detail.xa-diff, .xa-detail.xa-prose, .xa-detail.xa-slice))::before { content: ''; position: absolute; left: 8.5px; top: calc(50% - 2px); width: 34.5px; height: 1px; background: var(--xa-line); }
410
+ /* when the row is the rail's LAST — a live step always is — the row draws no line of its own, so the spine its
411
+ children hang on is drawn here: a piece from the marker to the detail's top (outside the fold's clip), then each
412
+ child its own segment, the last ending at its branch. Scoped to :last-child so nothing is ever drawn twice. */
413
+ .xa-row:last-child > .xa-dwrap::before { content: ''; position: absolute; left: 8.5px; top: -14px; height: 14px; width: 1px; background: var(--xa-line); transform-origin: top; animation: xa-raildraw 200ms linear both; }
414
+ .xa-row:last-child:has(> .xa-dwrap > div > .xa-detail.xa-nest) > .xa-dwrap::before { height: 30px; }
415
+ .xa-row:not(.xa-now):not(.xa-open) > .xa-dwrap::before { display: none; }
416
+ .xa-row:last-child > .xa-dwrap > div:has(> :is(.xa-detail.xa-output, .xa-detail.xa-diff, .xa-detail.xa-prose, .xa-detail.xa-slice))::after { content: ''; position: absolute; left: 8.5px; top: 0; height: calc(50% - 2px); width: 1px; background: var(--xa-line); }
417
+ .xa-row:last-child > .xa-dwrap > div > .xa-detail.xa-list .xa-it::after, .xa-row:last-child > .xa-dwrap > div > .xa-detail.xa-sources .xa-it::after { content: ''; position: absolute; left: -34.5px; top: 0; bottom: 0; width: 1px; background: var(--xa-line); pointer-events: none; }
418
+ .xa-row:last-child > .xa-dwrap > div > .xa-detail.xa-list .xa-it:last-child::after, .xa-row:last-child > .xa-dwrap > div > .xa-detail.xa-sources .xa-it:last-child::after { bottom: 50%; }
419
+ .xa-detail.xa-matches .xa-grp { position: relative; }
420
+ .xa-row:last-child > .xa-dwrap > div > .xa-detail.xa-matches .xa-grp::after { content: ''; position: absolute; left: -34.5px; top: 0; bottom: 0; width: 1px; background: var(--xa-line); pointer-events: none; }
421
+ .xa-row:last-child > .xa-dwrap > div > .xa-detail.xa-matches .xa-grp:last-child::after { bottom: auto; height: 12px; }
422
+ .xa-detail.xa-output, .xa-detail.xa-diff pre, .xa-card .xa-bd pre, .xa-detail.xa-slice pre { scrollbar-width: thin; scrollbar-color: rgba(var(--xa-ink), 0.12) transparent; }
423
+ .xa-detail.xa-output, .xa-detail.xa-slice { border: 1px solid rgba(var(--xa-ink), 0.06); border-radius: 4px; overflow: hidden; background: var(--xa-well); }
424
+ .xa-detail.xa-output pre, .xa-detail.xa-slice pre { margin: 0; padding: 7px 9px; font-size: 11px; line-height: 16px; color: var(--xa-t3); white-space: pre; overflow-x: auto; max-height: 320px; overflow-y: auto; }
425
+ .xa-detail.xa-output pre.xa-err { color: var(--xa-red); border-top: 1px solid rgba(var(--xa-ink), 0.05); }
426
+ .xa-detail.xa-slice pre .xa-gut { display: inline-block; width: 34px; margin-right: 10px; text-align: right; color: var(--xa-t6); }
427
+ .xa-detail.xa-slice .xa-more { padding: 0 9px 6px; font-size: 10px; color: var(--xa-t6); }
428
+ .xa-detail.xa-prose { font-size: 11.5px; line-height: 16px; color: var(--xa-t3); white-space: pre-wrap; overflow-wrap: anywhere; max-height: 320px; overflow-y: auto; }
429
+ .xa-detail .xa-add { color: var(--xa-green); } .xa-detail .xa-del { color: var(--xa-red); }
430
+ /* the footer of a detail: what it cost and where it ran */
431
+ .xa-detail .xa-foot { display: flex; gap: 12px; height: 22px; align-items: center; padding: 0 9px; border-top: 1px solid rgba(var(--xa-ink), 0.05); font-size: 10px; color: var(--xa-t6); }
432
+ .xa-detail .xa-foot .xa-cwd { margin-left: auto; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
433
+ .xa-detail.xa-diff { border: 1px solid rgba(var(--xa-ink), 0.06); border-radius: 4px; overflow: hidden; }
434
+ .xa-detail.xa-diff .xa-hunk { display: flex; align-items: center; gap: 8px; padding: 5px 9px; background: var(--xa-well); border-bottom: 1px solid rgba(var(--xa-ink), 0.05); font-size: 10.5px; color: var(--xa-t5); }
435
+ .xa-detail.xa-diff .xa-hunk .xa-keep { margin-left: auto; display: inline-flex; gap: 8px; }
436
+ .xa-detail.xa-diff .xa-hunk .xa-keep button { font-size: 10px; color: var(--xa-t5); }
437
+ .xa-detail.xa-diff .xa-hunk .xa-keep button:hover { color: var(--xa-t2); }
438
+ .xa-detail.xa-diff .xa-hunk .xa-keep button:disabled { opacity: 0.45; cursor: not-allowed; }
439
+ .xa-detail.xa-diff .xa-hk .xa-hstate { margin-left: auto; font-size: 10px; color: var(--xa-t5); display: none; }
440
+ .xa-detail.xa-diff .xa-hk.xa-kept .xa-hstate, .xa-detail.xa-diff .xa-hk.xa-undone .xa-hstate { display: inline; }
441
+ .xa-detail.xa-diff .xa-hk.xa-kept .xa-keep, .xa-detail.xa-diff .xa-hk.xa-undone .xa-keep { display: none; }
442
+ .xa-detail.xa-diff .xa-hk.xa-undone pre .xa-add { text-decoration: line-through; opacity: 0.45; }
443
+ .xa-detail.xa-diff pre { margin: 0; padding: 6px 9px; background: var(--xa-code); font-size: 11px; line-height: 16px; color: var(--xa-t3); white-space: pre; overflow-x: auto; max-height: 320px; overflow-y: auto; }
444
+ .xa-detail.xa-list { display: flex; flex-direction: column; }
445
+ .xa-detail.xa-list .xa-it { display: flex; align-items: center; gap: 8px; min-height: 22px; font-size: 11px; color: var(--xa-t4); }
446
+ .xa-detail.xa-list .xa-it .xa-k { color: var(--xa-t3); min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
447
+ .xa-detail.xa-list .xa-it .xa-where { margin-left: auto; flex: none; font-size: 10px; color: var(--xa-t6); }
448
+ .xa-detail.xa-list .xa-it button.xa-k { text-align: left; justify-content: flex-start; }
449
+ .xa-detail.xa-list .xa-it button.xa-k:hover { color: var(--xa-t1); }
450
+ /* search results: grouped by file, each match with its line and what is on it */
451
+ .xa-detail.xa-matches { display: flex; flex-direction: column; }
452
+ .xa-detail.xa-matches .xa-file { display: flex; align-items: center; gap: 8px; min-height: 24px; font-size: 11px; color: var(--xa-t3); }
453
+ .xa-detail.xa-matches .xa-file .xa-fg { flex: none; display: flex; color: var(--xa-t5); }
454
+ .xa-detail.xa-matches .xa-file .xa-fg svg { width: 12px; height: 12px; }
455
+ .xa-detail.xa-matches .xa-file .xa-k { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
456
+ .xa-detail.xa-matches .xa-file .xa-where { margin-left: auto; flex: none; font-size: 10px; color: var(--xa-t6); }
457
+ /* the matches hang on the FILE the way the file hangs on the rail: a line dropped from under the file's glyph to the
458
+ last match, and a branch from it to each line number (the tree at every depth — a child is drawn on its parent) */
459
+ .xa-detail.xa-matches .xa-lns { position: relative; }
460
+ .xa-detail.xa-matches .xa-lns::before { content: ''; position: absolute; left: 5.5px; top: -5px; bottom: 10px; width: 1px; background: var(--xa-line); transform-origin: top; animation: xa-raildraw 200ms linear both; }
461
+ .xa-detail.xa-matches .xa-ln { display: flex; align-items: center; gap: 10px; min-height: 20px; padding-left: 6px; font-size: 11px; }
462
+ .xa-detail.xa-matches .xa-ln .xa-n { flex: none; display: flex; align-items: center; justify-content: flex-end; width: 48px; color: var(--xa-t6); }
463
+ .xa-detail.xa-matches .xa-ln .xa-n::before { content: ''; flex: 1 1 auto; height: 1px; margin-right: 6px; background: var(--xa-line); transform-origin: left center; animation: xa-drawx 160ms linear 200ms both; }
464
+ .xa-detail.xa-matches .xa-ln .xa-s { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: 10.5px; color: var(--xa-t5); }
465
+ /* sources: numbered so the reply can point at them */
466
+ .xa-detail.xa-sources { display: flex; flex-direction: column; }
467
+ .xa-detail.xa-sources .xa-it { display: flex; align-items: center; gap: 8px; min-height: 24px; font-size: 11px; color: var(--xa-t4); border-radius: 3px; transition: background 120ms linear; }
468
+ .xa-detail.xa-sources .xa-it:hover, .xa-detail.xa-sources .xa-it.xa-hi { background: var(--xa-wash); }
469
+ .xa-detail.xa-sources .xa-it .xa-n { flex: none; width: 16px; height: 16px; display: flex; align-items: center; justify-content: center; border-radius: 2px; background: rgba(var(--xa-ink), 0.07); border: 1px solid var(--xa-line-soft); font-size: 9px; font-weight: 500; color: var(--xa-t3); }
470
+ .xa-detail.xa-sources .xa-it .xa-fav { flex: none; width: 14px; height: 14px; border-radius: 2px; border: 1px solid var(--xa-line-tip); background: linear-gradient(135deg, #2a2a2f, #1c1c1f); }
471
+ .xa-detail.xa-sources .xa-it .xa-k { color: var(--xa-t3); min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; text-align: left; justify-content: flex-start; }
472
+ .xa-detail.xa-sources .xa-it .xa-where { margin-left: auto; flex: none; font-size: 10px; color: var(--xa-t6); }
473
+ .xa-detail.xa-sources .xa-it .xa-go { flex: none; width: 16px; color: var(--xa-t6); opacity: 0; transition: opacity 120ms linear; }
474
+ .xa-detail.xa-sources .xa-it:hover .xa-go { opacity: 1; }
475
+ .xa-detail.xa-sources .xa-it .xa-go svg { width: 10px; height: 10px; }
476
+ .xa-detail.xa-frames { display: flex; gap: 4px; }
477
+ .xa-detail.xa-frames .xa-frame { width: auto; height: 84px; max-width: 100%; }
478
+ .xa-detail.xa-nest > .xa-rail { gap: 12px; padding: 2px 0; overflow: visible; }
479
+
480
+ /* ── cards: A's card, Z's cadence — Cancel left, the way forward right ─── */
481
+ .xa-row .xa-brk { flex: 0 0 100%; height: 0; }
482
+ .xa-row .xa-brk + .xa-cardslot { margin-top: -9px; }
483
+ .xa-cardslot { position: relative; flex-basis: 100%; max-width: 420px; margin: 0 0 2px 27px; transform: translateX(-27px); transition: transform 280ms var(--xa-glide); }
484
+ .xa-row.xa-ask.xa-ok .xa-cardslot, .xa-row.xa-ask.xa-bad .xa-cardslot { transform: none; }
485
+ /* the rail stops at an ask — the loop waits here. Answered and followed by the next step, the line comes down
486
+ and connects: a TRANSITION to a static end state, so an interrupted draw can only snap complete, never stop short */
487
+ .xa-row.xa-ask::before { animation: none; transform: scaleY(0); transition: transform 200ms linear; }
488
+ .xa-row.xa-ask.xa-joined::before { transform: scaleY(1); }
489
+ .xa-cardslot::before { content: ''; position: absolute; left: -18.5px; top: 50%; width: 18.5px; height: 1px; background: var(--xa-line); transform-origin: left center; transform: scaleX(0); transition: transform 180ms linear 200ms; }
490
+ .xa-row.xa-ask.xa-joined .xa-cardslot::before { transform: scaleX(1); }
491
+ .xa-card { background: var(--xa-plate); border: 1px solid var(--xa-line-soft); border-radius: 6px; overflow: hidden; animation: xa-rise 260ms var(--xa-ease) both; animation-delay: 150ms; }
492
+ .xa-card .xa-hd, .xa-card .xa-bd, .xa-card .xa-ft { animation: xa-rise 220ms var(--xa-ease) both; }
493
+ .xa-card .xa-hd { animation-delay: 210ms; } .xa-card .xa-bd { animation-delay: 270ms; } .xa-card .xa-ft { animation-delay: 350ms; }
494
+ .xa-card .xa-hd { display: flex; align-items: center; gap: 8px; height: 30px; padding: 0 11px; font-size: 11.5px; font-weight: 500; color: var(--xa-t2); border-bottom: 1px solid var(--xa-line-soft); }
495
+ .xa-card .xa-hd svg { width: 12px; height: 12px; color: var(--xa-t4); }
496
+ .xa-card .xa-hd .xa-right { margin-left: auto; font-size: 10px; font-weight: 400; color: var(--xa-t6); }
497
+ .xa-card .xa-bd { padding: 9px 11px 10px; font-size: 11.5px; line-height: 17px; color: var(--xa-t4); }
498
+ .xa-card .xa-bd .xa-what { display: flex; align-items: center; gap: 8px; margin-bottom: 4px; color: var(--xa-t2); }
499
+ .xa-card .xa-bd .xa-what .xa-sq { flex: none; width: 6px; height: 6px; background: var(--xa-t3); border-radius: 1px; animation: xa-breathe 1.4s ease-in-out infinite; }
500
+ .xa-card .xa-bd .xa-what .xa-scope { margin-left: auto; font-size: 10px; color: var(--xa-t6); }
501
+ .xa-card.xa-ok .xa-bd .xa-what .xa-sq { animation: none; background: var(--xa-green); }
502
+ .xa-card.xa-bad .xa-bd .xa-what .xa-sq { animation: none; background: var(--xa-red); }
503
+ .xa-card .xa-bd pre { margin: 6px 0 0; padding: 6px 9px; background: var(--xa-well); border: 1px solid rgba(var(--xa-ink), 0.06); border-radius: 4px; font-size: 11px; line-height: 16px; color: var(--xa-t3); white-space: pre-wrap; overflow-wrap: anywhere; max-height: 200px; overflow: auto; }
504
+ .xa-card .xa-bd .xa-opts { display: flex; flex-direction: column; margin-top: 4px; }
505
+ .xa-card .xa-bd .xa-opt { display: flex; align-items: center; justify-content: flex-start; gap: 9px; width: 100%; min-height: 24px; padding: 0 4px; margin: 0 -4px; border-radius: 3px; font-size: 11.5px; color: var(--xa-t3); text-align: left; }
506
+ .xa-card .xa-bd .xa-opt:hover { background: var(--xa-wash-hover); color: var(--xa-t1); }
507
+ .xa-card .xa-bd .xa-opt .xa-osq { flex: none; width: 6px; height: 6px; border: 1px solid var(--xa-t5); border-radius: 1px; transition: background 120ms linear, border-color 120ms linear; }
508
+ .xa-card .xa-bd .xa-opt.xa-on { color: var(--xa-t1); }
509
+ .xa-card .xa-bd .xa-opt.xa-on .xa-osq { background: var(--xa-t2); border-color: var(--xa-t2); }
510
+ .xa-card.xa-answered .xa-bd .xa-opt { pointer-events: none; }
511
+ .xa-card .xa-bd .xa-free { display: flex; gap: 6px; margin-top: 8px; }
512
+ .xa-card .xa-bd .xa-free input { flex: 1; min-width: 0; height: 26px; padding: 0 8px; border-radius: 4px; border: 1px solid var(--xa-line-soft); background: var(--xa-well); color: var(--xa-t1); font: inherit; font-size: 11.5px; outline: none; }
513
+ .xa-card .xa-bd .xa-free input:focus { border-color: var(--xa-line-tip); }
514
+ .xa-card .xa-ft { display: flex; align-items: center; gap: 6px; padding: 8px 11px; border-top: 1px solid var(--xa-line-soft); }
515
+ .xa-card .xa-ft .xa-cacts { display: flex; flex: 1; justify-content: space-between; gap: 6px; }
516
+ .xa-card .xa-ft .xa-hint { font-size: 10px; color: var(--xa-t6); align-self: center; }
517
+ /* a key name inherits the card's type wherever it sits — a host's preflight would hand kbd a monospace face */
518
+ .xa-card .xa-ft kbd { font: inherit; font-feature-settings: inherit; }
519
+ .xa-card .xa-bd .xa-plan-list { margin-top: 2px; }
520
+ .xa-card .xa-ft .xa-b { height: 24px; padding: 0 9px; gap: 7px; border-radius: 4px; font-size: 11px; font-weight: 500; color: var(--xa-t3); background: rgba(var(--xa-ink), 0.05); }
521
+ .xa-card .xa-ft .xa-b:hover { color: var(--xa-t1); background: var(--xa-wash-hover); }
522
+ .xa-card .xa-ft .xa-b:disabled { opacity: 0.45; cursor: not-allowed; }
523
+ .xa-card .xa-ft .xa-b.xa-main, .xa-card .xa-ft .xa-b.xa-main:hover { color: var(--xa-ground); background: var(--xa-send); }
524
+ .xa-card .xa-ft .xa-b.xa-main:hover { background: var(--xa-send-hover); }
525
+ .xa-card .xa-ft .xa-b kbd { font: inherit; font-size: 10px; opacity: 0.6; }
526
+ .xa-card .xa-ft .xa-more { position: relative; }
527
+ .xa-card .xa-ft .xa-menu { position: absolute; left: 0; bottom: 100%; margin-bottom: 4px; min-width: 190px; padding: 4px; border-radius: 4px; background: var(--xa-menu); border: 1px solid var(--xa-line-tip); display: flex; flex-direction: column; gap: 1px; z-index: 5; }
528
+ .xa-card .xa-ft .xa-menu button { width: 100%; height: 24px; padding: 0 8px; justify-content: flex-start; border-radius: 3px; font-size: 11px; color: var(--xa-t3); text-align: left; }
529
+ .xa-card .xa-ft .xa-menu button:hover { color: var(--xa-t1); background: var(--xa-wash-hover); }
530
+ .xa-card .xa-ft .xa-verdict { display: none; font-size: 11px; color: var(--xa-t4); }
531
+ .xa-card.xa-answered .xa-ft .xa-cacts { display: none; }
532
+ .xa-card.xa-answered .xa-ft .xa-verdict { display: inline; animation: xa-rise 280ms var(--xa-ease) both; animation-delay: 170ms; }
533
+ .xa-card .xa-error { padding: 0 11px 8px; font-size: 10.5px; color: var(--xa-red); }
534
+
535
+ /* ── the receipt: consequences only, each with a way back ─────────────── */
536
+ .xa-files { max-width: 420px; background: var(--xa-plate); border: 1px solid var(--xa-line-soft); border-radius: 6px; overflow: hidden; animation: xa-rise 280ms var(--xa-ease) both; animation-delay: 200ms; }
537
+ .xa-files .xa-hd { display: flex; align-items: center; gap: 10px; height: 36px; padding: 0 11px; border-bottom: 1px solid var(--xa-line-soft); }
538
+ .xa-files .xa-hd .xa-ic { flex: none; width: 18px; height: 18px; display: flex; align-items: center; justify-content: center; border-radius: 3px; background: var(--xa-box); border: 1px solid var(--xa-line-soft); color: var(--xa-t4); }
539
+ .xa-files .xa-hd .xa-ic svg { width: 12px; height: 12px; }
540
+ .xa-files .xa-hd .xa-t { font-size: 11.5px; font-weight: 500; color: var(--xa-t2); }
541
+ .xa-files .xa-hd .xa-t .xa-n { font-weight: 400; color: var(--xa-t5); margin-left: 6px; }
542
+ .xa-files .xa-hd .xa-b { margin-left: auto; height: 24px; padding: 0 9px; border-radius: 4px; font-size: 11px; font-weight: 500; color: var(--xa-t3); background: rgba(var(--xa-ink), 0.05); }
543
+ .xa-files .xa-hd .xa-b + .xa-b { margin-left: 0; }
544
+ .xa-files .xa-hd .xa-b:hover { color: var(--xa-t1); background: var(--xa-wash-hover); }
545
+ .xa-files .xa-hd .xa-b:disabled { opacity: 0.45; cursor: not-allowed; }
546
+ .xa-files .xa-frow { display: flex; align-items: center; gap: 8px; min-height: 26px; padding: 0 11px; font-size: 11px; color: var(--xa-t4); border-bottom: 1px solid rgba(var(--xa-ink), 0.05); }
547
+ .xa-files .xa-frow:last-child { border-bottom: 0; }
548
+ .xa-files .xa-frow .xa-name { color: var(--xa-t3); min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; text-align: left; justify-content: flex-start; }
549
+ .xa-files .xa-frow button.xa-name:hover { color: var(--xa-t1); }
550
+ .xa-files .xa-frow .xa-n { margin-left: auto; flex: none; font-size: 10px; }
551
+ .xa-files .xa-n .xa-add { color: var(--xa-green); } .xa-files .xa-n .xa-del { color: var(--xa-red); margin-left: 5px; }
552
+ .xa-files.xa-reverted .xa-frow .xa-name { text-decoration: line-through; color: var(--xa-t5); }
553
+ .xa-files .xa-review { border-top: 1px solid var(--xa-line-soft); padding: 8px 11px 10px; }
554
+ .xa-files .xa-review .xa-detail { margin: 0; animation: none; }
555
+
556
+ /* ── the plan on the composer's top edge: the Tasks tray ─────────────── */
557
+ .xa-tasks { display: flex; flex-direction: column; background: var(--xa-wash); border: 1px solid var(--xa-line-soft); border-radius: 4px; overflow: hidden; }
558
+ .xa-tasks .xa-bar { display: flex; align-items: center; gap: 8px; height: 30px; padding: 0 10px; cursor: pointer; width: 100%; }
559
+ .xa-tasks .xa-bar:hover { background: var(--xa-wash-hover); }
560
+ .xa-tasks .xa-bar .xa-label { color: var(--xa-label); }
561
+ .xa-tasks .xa-bar .xa-curtask { font-size: 11px; color: var(--xa-t3); min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
562
+ .xa-tasks .xa-bar .xa-cnt { margin-left: auto; flex: none; font-size: 10px; color: var(--xa-t6); }
563
+ .xa-tasks .xa-bar .xa-chev { flex: none; color: var(--xa-t6); transition: transform 160ms var(--xa-ease); }
564
+ .xa-tasks.xa-open .xa-bar .xa-chev { transform: rotate(-90deg); }
565
+ .xa-tasks .xa-listwrap { display: grid; grid-template-rows: 0fr; transition: grid-template-rows 220ms var(--xa-ease); }
566
+ .xa-tasks.xa-open .xa-listwrap { grid-template-rows: 1fr; }
567
+ .xa-tasks .xa-list { min-height: 0; overflow: hidden; }
568
+ .xa-tasks .xa-list .xa-in { padding: 2px 10px 6px; border-top: 1px solid rgba(var(--xa-ink), 0.05); max-height: 160px; overflow-y: auto; scrollbar-width: thin; scrollbar-color: rgba(var(--xa-ink), 0.12) transparent; }
569
+
570
+ /* a background run's controls — on the row that started it, and on the tray's items. Text, never a
571
+ button plate: a row is a sentence, and these are the two verbs it accepts. */
572
+ .xa-rowacts { display: inline-flex; align-items: center; gap: 8px; flex: none; margin-left: 8px; opacity: 0; transition: opacity 120ms linear; }
573
+ .xa-row:hover .xa-rowacts, .xa-row.xa-now .xa-rowacts, .xa-tasks .xa-item:hover .xa-rowacts, .xa-tasks .xa-item.xa-now .xa-rowacts, .xa-rowacts:focus-within { opacity: 1; }
574
+ .xa-rowacts button { font-size: 10px; line-height: 1; color: var(--xa-t5); }
575
+ .xa-rowacts button:hover { color: var(--xa-t2); }
576
+ .xa-rowacts button:disabled { color: var(--xa-t6); cursor: default; }
577
+ .xa-bgruns .xa-item { gap: 8px; }
578
+ .xa-bgruns .xa-item > .xa-mono { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
579
+ .xa-bgruns .xa-item .xa-runres { margin-left: auto; flex: none; font-size: 10px; color: var(--xa-t6); }
580
+ .xa-agents .xa-item > span:nth-child(2) { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
581
+ .xa-agents .xa-item .xa-runres { margin-left: auto; flex: none; font-size: 10px; color: var(--xa-t6); }
582
+
583
+ /* the thread is still opening: the clock line alone, the reply not yet begun */
584
+ .xa-turn.xa-opening .xa-rail { min-height: 0; }
585
+