@tt-a1i/openpi 0.4.0 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (141) hide show
  1. package/README.md +116 -46
  2. package/SETUP.md +29 -7
  3. package/THIRD_PARTY_NOTICES.md +16 -0
  4. package/assets/openpi-launch-card-v1.webp +0 -0
  5. package/bin/openpi.js +155 -0
  6. package/extensions/ai-providers/LICENSE.upstream +23 -0
  7. package/extensions/ai-providers/README.md +59 -0
  8. package/extensions/ai-providers/antigravity/credentials.ts +52 -0
  9. package/extensions/ai-providers/antigravity/discovery.ts +130 -0
  10. package/extensions/ai-providers/antigravity/google-conversion.ts +455 -0
  11. package/extensions/ai-providers/antigravity/models.ts +84 -0
  12. package/extensions/ai-providers/antigravity/oauth.ts +700 -0
  13. package/extensions/ai-providers/antigravity/provider.ts +1116 -0
  14. package/extensions/ai-providers/antigravity/routing.ts +340 -0
  15. package/extensions/ai-providers/antigravity/with-resolvers.d.ts +19 -0
  16. package/extensions/ai-providers/cursor/constants.ts +5 -0
  17. package/extensions/ai-providers/cursor/credentials.ts +14 -0
  18. package/extensions/ai-providers/cursor/discovery.ts +291 -0
  19. package/extensions/ai-providers/cursor/input-images.ts +106 -0
  20. package/extensions/ai-providers/cursor/models.ts +45 -0
  21. package/extensions/ai-providers/cursor/oauth.ts +263 -0
  22. package/extensions/ai-providers/cursor/proto.ts +1064 -0
  23. package/extensions/ai-providers/cursor/protobuf.ts +1171 -0
  24. package/extensions/ai-providers/cursor/provider.ts +1175 -0
  25. package/extensions/ai-providers/cursor/proxy.ts +213 -0
  26. package/extensions/ai-providers/cursor/with-resolvers.d.ts +12 -0
  27. package/extensions/ai-providers/index.ts +86 -0
  28. package/extensions/ai-providers/oauth-adapter.ts +81 -0
  29. package/extensions/ai-providers/usage.ts +10 -0
  30. package/extensions/background-terminals/index.ts +38 -3
  31. package/extensions/background-terminals/src/domain.ts +2 -0
  32. package/extensions/background-terminals/src/manager.ts +484 -106
  33. package/extensions/background-terminals/src/output.ts +33 -0
  34. package/extensions/background-terminals/src/prompt.ts +13 -5
  35. package/extensions/background-terminals/src/result-delivery.ts +47 -24
  36. package/extensions/clear-context/index.ts +83 -0
  37. package/extensions/context-pivot/index.ts +16 -6
  38. package/extensions/cron/index.ts +68 -27
  39. package/extensions/cron/schedule.ts +12 -2
  40. package/extensions/file-mutation-display/render.ts +17 -257
  41. package/extensions/file-search/src/binaries.ts +57 -41
  42. package/extensions/git-read/index.ts +1 -3
  43. package/extensions/model-info/cache-diagnostics.ts +220 -0
  44. package/extensions/model-info/index.ts +65 -33
  45. package/extensions/model-info/session-metrics.ts +96 -0
  46. package/extensions/plan-mode/bash-policy.ts +54 -9
  47. package/extensions/plan-mode/index.ts +82 -6
  48. package/extensions/post-edit/index.ts +16 -6
  49. package/extensions/sessions/git-stats.ts +258 -72
  50. package/extensions/sessions/index.ts +153 -86
  51. package/extensions/sessions/preview-cache.ts +104 -0
  52. package/extensions/sessions/preview-loader.ts +856 -0
  53. package/extensions/sessions/sessions.ts +43 -4
  54. package/extensions/setup/index.ts +138 -130
  55. package/extensions/shared/activity-status.ts +30 -0
  56. package/extensions/shared/agent-session-page.ts +319 -0
  57. package/extensions/shared/agent-tool-renderer.ts +218 -0
  58. package/extensions/shared/agent-transcript.ts +524 -0
  59. package/extensions/shared/capability-intent.ts +1 -1
  60. package/extensions/shared/child-session.ts +457 -21
  61. package/extensions/shared/completion-inbox.ts +193 -0
  62. package/extensions/shared/result-delivery.ts +34 -0
  63. package/extensions/shared/setup-config.ts +83 -34
  64. package/extensions/shared/setup-episode-state.ts +1 -1
  65. package/extensions/shared/structured-output.ts +154 -0
  66. package/extensions/shared/terminal-text.ts +110 -23
  67. package/extensions/shared/text-projection.ts +72 -15
  68. package/extensions/shared/tool-activity.ts +382 -0
  69. package/extensions/shared/tool-surface.ts +29 -2
  70. package/extensions/shared/transcript-viewport.ts +46 -0
  71. package/extensions/shared/web-observer-registry.ts +390 -0
  72. package/extensions/shared/worktree.ts +11 -0
  73. package/extensions/subagents/index.ts +313 -62
  74. package/extensions/subagents/navigation.ts +34 -5
  75. package/extensions/subagents/src/backend.ts +12 -1
  76. package/extensions/subagents/src/backends/pi.ts +450 -70
  77. package/extensions/subagents/src/domain.ts +21 -1
  78. package/extensions/subagents/src/manager.ts +39 -2
  79. package/extensions/subagents/src/prompt.ts +49 -7
  80. package/extensions/subagents/src/result-artifact.ts +36 -0
  81. package/extensions/subagents/src/result-delivery.ts +39 -14
  82. package/extensions/subagents/src/runtime.ts +15 -1
  83. package/extensions/subagents/src/ui/takeover.ts +73 -257
  84. package/extensions/subagents/src/ui/transcript.ts +38 -535
  85. package/extensions/subagents/src/ui/wait-result.ts +103 -15
  86. package/extensions/suggestions/src/ui.ts +10 -4
  87. package/extensions/tasks/index.ts +0 -3
  88. package/extensions/ui-customization/footer.ts +16 -45
  89. package/extensions/ui-customization/index.ts +0 -4
  90. package/extensions/user-input-fold/index.ts +42 -6
  91. package/extensions/web/index.ts +257 -0
  92. package/extensions/workflows/acceptance.ts +43 -19
  93. package/extensions/workflows/artifacts.ts +137 -47
  94. package/extensions/workflows/completion-projection.ts +459 -0
  95. package/extensions/workflows/coordinator.ts +8 -10
  96. package/extensions/workflows/dashboard.ts +175 -228
  97. package/extensions/workflows/handoff.ts +70 -16
  98. package/extensions/workflows/index.ts +501 -198
  99. package/extensions/workflows/journal.ts +148 -13
  100. package/extensions/workflows/model.ts +79 -5
  101. package/extensions/workflows/navigation.ts +32 -8
  102. package/extensions/workflows/progress-projection.ts +306 -0
  103. package/extensions/workflows/prompt.ts +70 -16
  104. package/extensions/workflows/replay-safety.ts +42 -21
  105. package/extensions/workflows/result-delivery.ts +214 -76
  106. package/extensions/workflows/retention.ts +599 -0
  107. package/extensions/workflows/runner.ts +389 -345
  108. package/extensions/workflows/sandbox-child.cjs +25 -3
  109. package/extensions/workflows/sandbox.ts +62 -8
  110. package/extensions/workflows/serialization.ts +325 -17
  111. package/extensions/workflows/tool-renderer.ts +22 -0
  112. package/extensions/workflows/transcript.ts +149 -0
  113. package/extensions/workspace-cleanup-guard/index.ts +54 -0
  114. package/extensions/workspace-cleanup-guard/workspace-provenance.ts +563 -0
  115. package/package.json +34 -14
  116. package/skills/subagents/REFERENCE.md +190 -0
  117. package/skills/subagents/SKILL.md +2 -1
  118. package/skills/workflows/REFERENCE.md +6 -4
  119. package/skills/workflows/SKILL.md +1 -1
  120. package/web/adapter/pi-adapter.ts +664 -0
  121. package/web/host/browser-launcher.ts +20 -0
  122. package/web/host/pi-coding-agent-entry.ts +162 -0
  123. package/web/host/static-assets.ts +4 -0
  124. package/web/host/terminal-status.ts +38 -0
  125. package/web/host/web-host.ts +1069 -0
  126. package/web/http-dispatcher.ts +125 -0
  127. package/web/protocol/types.ts +467 -0
  128. package/web/runtime/pi-runtime.ts +1206 -0
  129. package/web/runtime/types.ts +102 -0
  130. package/web/runtime/web-host-lease.ts +497 -0
  131. package/web/trace.ts +18 -0
  132. package/web/ui/app.js +1700 -0
  133. package/web/ui/index.html +142 -0
  134. package/web/ui/styles.css +680 -0
  135. package/web/vite.config.mjs +34 -0
  136. package/extensions/execution-convergence/active-evidence.ts +0 -129
  137. package/extensions/execution-convergence/index.ts +0 -442
  138. package/extensions/execution-convergence/workspace-provenance.ts +0 -338
  139. package/extensions/setup/intercom-fs-helper.cjs +0 -130
  140. package/extensions/setup/intercom.ts +0 -603
  141. package/extensions/subagents/src/backends/stub.ts +0 -303
@@ -0,0 +1,680 @@
1
+ :root {
2
+ color-scheme: light;
3
+ --page: #ffffff;
4
+ --page-grid: #faf7ed;
5
+ --grid-line: rgba(182, 165, 119, .2);
6
+ --sidebar: #faf7ed;
7
+ --sidebar-hover: #f3ead0;
8
+ --sidebar-active: #eee9dc;
9
+ --border: #e3e7eb;
10
+ --border-strong: #d2d8de;
11
+ --text: #1f252c;
12
+ --muted: #69737d;
13
+ --subtle: #929ba4;
14
+ --accent: #2867b2;
15
+ --warm-accent: #faf7ed;
16
+ --warm-accent-hover: #f3ead0;
17
+ --warm-accent-disabled: #faf7ed;
18
+ --focus: #4c88cf;
19
+ --healthy: #28835a;
20
+ --error: #b42318;
21
+ --surface-hover: #fafbfc;
22
+ --surface-soft: #f1f3f5;
23
+ --surface-selected: #eef1f4;
24
+ --surface-code: #f5f6f7;
25
+ --secondary-text: #39434d;
26
+ --tertiary-text: #5f6973;
27
+ --placeholder: #7f8993;
28
+ --icon-muted: #9aa2aa;
29
+ --clear-muted: #737b83;
30
+ --danger-border: #f0c6c6;
31
+ --danger: #e55353;
32
+ --danger-hover: #fff3f3;
33
+ --inverse-text: #ffffff;
34
+ --warm-border: #d8cfae;
35
+ --reconnecting: #9a6700;
36
+ --input-surface: rgba(255, 255, 255, .48);
37
+ --hover-overlay: rgba(255, 255, 255, .72);
38
+ --header-surface: rgba(251, 250, 245, .76);
39
+ --details-hover: rgba(238, 241, 244, .72);
40
+ --details-surface: rgba(247, 248, 249, .82);
41
+ --dock-start: rgba(250, 247, 237, 0);
42
+ --dock-end: rgba(250, 247, 237, .94);
43
+ --link-underline: rgba(40, 103, 178, .35);
44
+ }
45
+
46
+ :root[data-theme="dark"] {
47
+ color-scheme: dark;
48
+ --page: #17191c;
49
+ --page-grid: #111315;
50
+ --grid-line: rgba(135, 144, 153, .12);
51
+ --sidebar: #1d2024;
52
+ --sidebar-hover: #292d32;
53
+ --sidebar-active: #30353b;
54
+ --border: #353a40;
55
+ --border-strong: #48515a;
56
+ --text: #edf0f2;
57
+ --muted: #a8b0b8;
58
+ --subtle: #7f8993;
59
+ --accent: #74a9e6;
60
+ --warm-accent: #303026;
61
+ --warm-accent-hover: #3b3a2d;
62
+ --warm-accent-disabled: #252722;
63
+ --focus: #78aee9;
64
+ --healthy: #62c795;
65
+ --error: #ff8c84;
66
+ --surface-hover: #25292e;
67
+ --surface-soft: #282d32;
68
+ --surface-selected: #30363d;
69
+ --surface-code: #20242a;
70
+ --secondary-text: #cbd1d7;
71
+ --tertiary-text: #b2bac2;
72
+ --placeholder: #929ba4;
73
+ --icon-muted: #858f98;
74
+ --clear-muted: #a1aab3;
75
+ --danger-border: #704240;
76
+ --danger: #ff8c84;
77
+ --danger-hover: #382322;
78
+ --inverse-text: #111315;
79
+ --warm-border: #615d49;
80
+ --reconnecting: #e5b64f;
81
+ --input-surface: rgba(17, 19, 21, .48);
82
+ --hover-overlay: rgba(255, 255, 255, .07);
83
+ --header-surface: rgba(29, 32, 36, .8);
84
+ --details-hover: rgba(255, 255, 255, .06);
85
+ --details-surface: rgba(32, 36, 42, .88);
86
+ --dock-start: rgba(17, 19, 21, 0);
87
+ --dock-end: rgba(17, 19, 21, .94);
88
+ --link-underline: rgba(116, 169, 230, .45);
89
+ }
90
+
91
+ * { box-sizing: border-box; }
92
+ html, body { width: 100%; height: 100%; overflow: hidden; }
93
+ body {
94
+ margin: 0;
95
+ background-color: var(--page-grid);
96
+ background-image:
97
+ linear-gradient(var(--grid-line) 1px, transparent 1px),
98
+ linear-gradient(90deg, var(--grid-line) 1px, transparent 1px);
99
+ background-size: 24px 24px;
100
+ color: var(--text);
101
+ font: 14px/1.5 Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
102
+ }
103
+ button, input, textarea { font: inherit; letter-spacing: 0; }
104
+ button { color: inherit; cursor: pointer; }
105
+ button:disabled { cursor: default; }
106
+ .icon {
107
+ display: block;
108
+ fill: none;
109
+ stroke: currentColor;
110
+ stroke-linecap: round;
111
+ stroke-linejoin: round;
112
+ stroke-width: 1.8;
113
+ vector-effect: non-scaling-stroke;
114
+ }
115
+ .visually-hidden {
116
+ position: absolute;
117
+ width: 1px;
118
+ height: 1px;
119
+ padding: 0;
120
+ margin: -1px;
121
+ overflow: hidden;
122
+ clip: rect(0, 0, 0, 0);
123
+ white-space: nowrap;
124
+ border: 0;
125
+ }
126
+ button:focus-visible, input:focus-visible, textarea:focus-visible {
127
+ outline: 2px solid var(--focus);
128
+ outline-offset: 2px;
129
+ }
130
+
131
+ .app-shell {
132
+ display: grid;
133
+ grid-template-columns: 280px minmax(0, 1fr);
134
+ width: 100%;
135
+ height: 100dvh;
136
+ transition: grid-template-columns 180ms ease;
137
+ }
138
+ body.sidebar-collapsed .app-shell { grid-template-columns: 56px minmax(0, 1fr); }
139
+
140
+ .session-sidebar {
141
+ position: relative;
142
+ z-index: 20;
143
+ display: flex;
144
+ min-height: 0;
145
+ flex-direction: column;
146
+ padding: 8px 10px;
147
+ overflow: hidden;
148
+ border-right: 1px solid var(--border);
149
+ background: var(--sidebar);
150
+ }
151
+ .sidebar-brand {
152
+ display: flex;
153
+ height: 44px;
154
+ align-items: center;
155
+ justify-content: space-between;
156
+ padding: 0 4px 0 6px;
157
+ }
158
+ .sidebar-brand strong, .landing-brand strong {
159
+ display: inline-flex;
160
+ align-items: center;
161
+ color: var(--text);
162
+ font-weight: 700;
163
+ line-height: 1;
164
+ }
165
+ .sidebar-brand strong { font-size: 18px; }
166
+ .pixel-mark { position: relative; display: inline-block; width: 21px; height: 21px; margin-left: 2px; }
167
+ .pixel-mark i { position: absolute; display: block; width: 6px; height: 6px; background: currentColor; }
168
+ .pixel-mark i:nth-child(1) { top: 0; left: 0; }
169
+ .pixel-mark i:nth-child(2) { top: 0; left: 5px; }
170
+ .pixel-mark i:nth-child(3) { top: 0; left: 10px; }
171
+ .pixel-mark i:nth-child(4) { top: 5px; left: 0; }
172
+ .pixel-mark i:nth-child(5) { top: 5px; left: 10px; }
173
+ .pixel-mark i:nth-child(6) { top: 10px; left: 0; }
174
+ .pixel-mark i:nth-child(7) { top: 10px; left: 5px; }
175
+ .pixel-mark i:nth-child(8) { top: 10px; left: 15px; }
176
+ .pixel-mark i:nth-child(9) { top: 15px; left: 0; }
177
+ .pixel-mark i:nth-child(10) { top: 15px; left: 15px; }
178
+
179
+ .collapse-button, .icon-button, .mobile-sidebar-button {
180
+ display: grid;
181
+ flex: 0 0 auto;
182
+ place-items: center;
183
+ border: 0;
184
+ background: transparent;
185
+ color: var(--muted);
186
+ }
187
+ .collapse-button { width: 30px; height: 30px; border-radius: 6px; }
188
+ .collapse-button:hover, .icon-button:hover, .mobile-sidebar-button:hover { background: var(--sidebar-hover); color: var(--text); }
189
+ .collapse-button svg { width: 18px; height: 18px; }
190
+ .icon-button { width: 28px; height: 28px; border-radius: 6px; }
191
+ .icon-button svg { width: 18px; height: 18px; }
192
+
193
+ .new-session-button {
194
+ display: flex;
195
+ width: calc(100% - 4px);
196
+ height: 38px;
197
+ flex: 0 0 auto;
198
+ align-items: center;
199
+ justify-content: center;
200
+ gap: 7px;
201
+ margin: 8px 2px 10px;
202
+ border: 1px solid var(--border-strong);
203
+ border-radius: 19px;
204
+ background: var(--page);
205
+ color: var(--text);
206
+ font-weight: 550;
207
+ }
208
+ .new-session-button:hover { background: var(--surface-hover); border-color: var(--border-strong); }
209
+ .new-session-button svg { width: 17px; height: 17px; flex: 0 0 auto; stroke-width: 1.7; }
210
+
211
+ .workspace-heading {
212
+ display: flex;
213
+ min-height: 32px;
214
+ align-items: center;
215
+ justify-content: space-between;
216
+ padding: 0 4px 0 8px;
217
+ color: var(--muted);
218
+ font-size: 11px;
219
+ font-weight: 650;
220
+ text-transform: uppercase;
221
+ }
222
+ .workspace-actions { display: flex; flex: 0 0 auto; }
223
+ .session-search { position: relative; display: block; min-width: 0; flex: 0 1 auto; width: 0; max-width: 0; margin: 0; opacity: 0; overflow: hidden; transform: translateX(10px) scaleX(.72); transform-origin: right center; transition: width 240ms cubic-bezier(.22, 1, .36, 1), max-width 240ms cubic-bezier(.22, 1, .36, 1), margin 200ms ease, opacity 130ms ease, transform 240ms cubic-bezier(.22, 1, .36, 1); pointer-events: none; }
224
+ .workspace-heading.is-searching .workspace-heading-label,
225
+ .workspace-heading.is-searching .workspace-actions { display: none; }
226
+ .workspace-heading.is-searching .session-search { width: 100%; max-width: 100%; margin-right: 4px; opacity: 1; transform: translateX(0) scaleX(1); pointer-events: auto; }
227
+ .session-search input {
228
+ width: 100%;
229
+ height: 32px;
230
+ padding: 0 30px 0 29px;
231
+ border: 1px solid var(--border);
232
+ border-radius: 16px;
233
+ outline: 0;
234
+ background: var(--input-surface);
235
+ color: var(--text);
236
+ font-size: 12px;
237
+ }
238
+ .session-search input::placeholder { color: var(--placeholder); }
239
+ .session-search input:hover { border-color: var(--border-strong); }
240
+ .session-search input:focus { border-color: var(--border-strong); background: var(--page); box-shadow: none; }
241
+ .session-search-icon { position: absolute; top: 9px; left: 9px; z-index: 1; width: 14px; height: 14px; color: var(--icon-muted); pointer-events: none; }
242
+ .session-search-clear { position: absolute; top: 4px; right: 4px; display: grid; width: 24px; height: 24px; place-items: center; padding: 0; border: 0; border-radius: 50%; background: transparent; color: var(--clear-muted); }
243
+ .session-search-clear .icon { width: 14px; height: 14px; stroke-width: 2; }
244
+ .session-search-clear:hover { background: var(--surface-selected); color: var(--text); }
245
+
246
+ .workspace-tree {
247
+ min-height: 0;
248
+ flex: 1 1 auto;
249
+ padding: 0 0 12px;
250
+ overflow-x: hidden;
251
+ overflow-y: auto;
252
+ color: var(--muted);
253
+ scrollbar-gutter: auto;
254
+ scrollbar-width: thin;
255
+ scrollbar-color: rgba(125, 132, 138, .45) transparent;
256
+ }
257
+ .workspace-group + .workspace-group { margin-top: 5px; }
258
+ .workspace-button, .session { width: 100%; min-width: 0; border: 0; border-radius: 6px; background: transparent; text-align: left; }
259
+ .workspace-button {
260
+ display: grid;
261
+ height: 34px;
262
+ grid-template-columns: 20px minmax(0, 1fr) 52px;
263
+ gap: 4px;
264
+ align-items: center;
265
+ padding: 0 4px;
266
+ color: var(--secondary-text);
267
+ cursor: pointer;
268
+ }
269
+ .workspace-button:hover, .session:hover { background: var(--sidebar-hover); }
270
+ .workspace-button:focus-visible, .session:focus-visible { outline-offset: -2px; }
271
+ .workspace-button strong {
272
+ min-width: 0;
273
+ overflow: hidden;
274
+ font-size: 14px;
275
+ font-weight: 600;
276
+ text-overflow: ellipsis;
277
+ white-space: nowrap;
278
+ }
279
+ .workspace-toggle, .workspace-action {
280
+ display: grid;
281
+ place-items: center;
282
+ padding: 0;
283
+ border: 0;
284
+ border-radius: 4px;
285
+ background: transparent;
286
+ color: var(--muted);
287
+ }
288
+ .workspace-toggle { width: 20px; height: 28px; }
289
+ .workspace-action { width: 24px; height: 28px; }
290
+ .workspace-toggle:hover, .workspace-action:hover { background: var(--hover-overlay); color: var(--text); }
291
+ .workspace-action .icon { width: 17px; height: 17px; }
292
+ .workspace-row-actions { display: flex; width: 52px; align-items: center; justify-content: flex-end; gap: 2px; }
293
+ .workspace-chevron { width: 12px; height: 12px; color: var(--subtle); transition: transform 140ms ease; }
294
+ .workspace-group.collapsed .workspace-chevron { transform: rotate(-90deg); }
295
+ .workspace-sessions { margin-top: 1px; }
296
+ .workspace-group.collapsed .workspace-sessions { display: none; }
297
+ .session-row {
298
+ position: relative;
299
+ display: flex;
300
+ min-width: 0;
301
+ align-items: center;
302
+ }
303
+ .session {
304
+ display: grid;
305
+ width: 100%;
306
+ height: 32px;
307
+ grid-template-columns: minmax(0, 1fr) auto;
308
+ gap: 8px;
309
+ align-items: center;
310
+ padding: 0 8px 0 29px;
311
+ color: var(--tertiary-text);
312
+ }
313
+ .session.active { background: var(--sidebar-active); color: var(--text); }
314
+ .session-title { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
315
+ .session-time { color: var(--subtle); font-size: 11.5px; font-variant-numeric: tabular-nums; }
316
+ .session-action {
317
+ position: absolute;
318
+ right: 5px;
319
+ display: grid;
320
+ width: 26px;
321
+ height: 26px;
322
+ place-items: center;
323
+ padding: 0;
324
+ border: 0;
325
+ border-radius: 6px;
326
+ background: var(--sidebar-hover);
327
+ color: var(--muted);
328
+ opacity: 0;
329
+ pointer-events: none;
330
+ transition: opacity 120ms ease;
331
+ }
332
+ .session-action .icon { width: 16px; height: 16px; }
333
+ .session-row:hover .session-action,
334
+ .session-row:focus-within .session-action { opacity: 1; pointer-events: auto; }
335
+ .session-row:hover .session-time,
336
+ .session-row:focus-within .session-time { visibility: hidden; }
337
+ .session-action:hover { background: var(--sidebar-active); color: var(--text); }
338
+ .workspace-sessions .empty, .workspace-tree > .empty { min-height: 32px; padding: 7px 10px 7px 29px; color: var(--subtle); font-size: 12px; }
339
+ .workspace-menu {
340
+ position: fixed;
341
+ z-index: 40;
342
+ width: 178px;
343
+ margin: 0;
344
+ padding: 4px;
345
+ border: 1px solid var(--border);
346
+ border-radius: 6px;
347
+ background: var(--page);
348
+ box-shadow: 0 10px 28px rgba(31, 37, 44, .16);
349
+ }
350
+ .workspace-menu::backdrop { display: none; }
351
+ .workspace-menu button {
352
+ display: block;
353
+ width: 100%;
354
+ height: 32px;
355
+ padding: 0 9px;
356
+ border: 0;
357
+ border-radius: 4px;
358
+ background: transparent;
359
+ text-align: left;
360
+ }
361
+ .workspace-menu button:hover { background: var(--surface-soft); }
362
+ .workspace-menu .danger-action { color: var(--error); }
363
+ .workspace-delete-dialog { width: min(380px, calc(100% - 32px)); padding: 0; border: 0; border-radius: 24px; background: var(--page); box-shadow: 0 20px 60px rgba(31, 37, 44, .2); color: var(--text); }
364
+ .workspace-delete-dialog::backdrop { background: rgba(20, 26, 32, .2); }
365
+ .workspace-delete-dialog form { display: grid; gap: 14px; padding: 28px 24px 20px; }
366
+ .workspace-delete-dialog strong { font-size: 16px; font-weight: 650; }
367
+ .workspace-delete-dialog p { margin: 0; color: var(--muted); font-size: 13px; line-height: 1.65; }
368
+ .workspace-delete-dialog .dialog-actions { margin-top: 6px; }
369
+ .workspace-delete-dialog .dialog-actions button { min-width: 64px; height: 36px; border-radius: 18px; }
370
+ .workspace-delete-dialog .dialog-actions .danger-action { border-color: var(--danger-border); color: var(--danger); background: transparent; }
371
+ .workspace-delete-dialog .dialog-actions .danger-action:hover { background: var(--danger-hover); }
372
+ .workspace-rename-dialog {
373
+ width: min(360px, calc(100% - 32px));
374
+ padding: 0;
375
+ border: 1px solid var(--border);
376
+ border-radius: 6px;
377
+ background: var(--page);
378
+ box-shadow: 0 18px 48px rgba(31, 37, 44, .2);
379
+ }
380
+ .workspace-rename-dialog::backdrop { background: rgba(20, 26, 32, .28); }
381
+ .workspace-rename-dialog form { display: grid; gap: 16px; padding: 18px; }
382
+ .workspace-rename-dialog strong { font-size: 14px; }
383
+ .workspace-rename-dialog input { width: 100%; height: 36px; padding: 0 10px; border: 1px solid var(--border-strong); border-radius: 5px; color: var(--text); }
384
+ .dialog-actions { display: flex; justify-content: flex-end; gap: 8px; }
385
+ .dialog-actions button { height: 32px; padding: 0 12px; border: 1px solid var(--border-strong); border-radius: 5px; background: var(--page); }
386
+ .dialog-actions #save-workspace-name { border-color: var(--text); background: var(--text); color: var(--inverse-text); }
387
+ body.sidebar-collapsed .session-sidebar { align-items: center; padding: 8px; }
388
+ body.sidebar-collapsed .sidebar-brand { position: relative; width: 40px; justify-content: center; padding: 0; }
389
+ body.sidebar-collapsed .brand-word, body.sidebar-collapsed .new-session-button span,
390
+ body.sidebar-collapsed .workspace-heading-label, body.sidebar-collapsed .workspace-tree,
391
+ body.sidebar-collapsed .session-search { display: none; }
392
+ body.sidebar-collapsed .sidebar-brand .collapse-button { position: absolute; inset: 7px 5px auto; z-index: 2; }
393
+ body.sidebar-collapsed .sidebar-brand .collapse-button .icon { display: none; }
394
+ body.sidebar-collapsed .sidebar-brand .collapse-button:hover .icon { display: block; }
395
+ body.sidebar-collapsed .sidebar-brand strong { pointer-events: none; }
396
+ body.sidebar-collapsed .sidebar-brand .pixel-mark { margin: 0; transition: opacity 120ms ease; }
397
+ body.sidebar-collapsed .sidebar-brand:has(.collapse-button:hover) .pixel-mark { opacity: 0; }
398
+ body.sidebar-collapsed .new-session-button { width: 36px; height: 36px; margin: 10px 0 12px; padding: 0; border-color: transparent; background: transparent; }
399
+ body.sidebar-collapsed .new-session-button:hover { background: var(--sidebar-hover); }
400
+ body.sidebar-collapsed .workspace-heading { width: 36px; min-height: 36px; justify-content: center; padding: 0; }
401
+ body.sidebar-collapsed .workspace-actions { flex-direction: column; gap: 4px; }
402
+ body.sidebar-collapsed .icon-button { width: 36px; height: 36px; }
403
+
404
+ .conversation-shell { position: relative; display: grid; min-width: 0; min-height: 0; grid-template-rows: minmax(0, 1fr) auto; background: transparent; }
405
+ .conversation-shell.landing { grid-template-rows: minmax(0, 1fr); }
406
+ .landing .conversation, .landing .composer-dock { grid-area: 1 / 1; }
407
+ .landing .conversation { pointer-events: none; }
408
+ .landing .composer-dock {
409
+ position: absolute;
410
+ top: calc(50% - 81px);
411
+ right: 0;
412
+ left: 0;
413
+ z-index: 1;
414
+ display: flex;
415
+ flex-direction: column;
416
+ align-items: stretch;
417
+ align-self: center;
418
+ width: 100%;
419
+ padding: 0 24px;
420
+ background: transparent;
421
+ }
422
+ .workbench-header {
423
+ min-width: 0;
424
+ align-items: center;
425
+ gap: 12px;
426
+ padding: 0 20px;
427
+ border-bottom: 1px solid var(--border);
428
+ background: var(--header-surface);
429
+ backdrop-filter: blur(8px);
430
+ -webkit-backdrop-filter: blur(8px);
431
+ }
432
+ .mobile-sidebar-button { display: none; width: 34px; height: 34px; border-radius: 6px; }
433
+ .mobile-sidebar-button svg { width: 19px; height: 19px; }
434
+ .session-header { display: flex; min-width: 0; flex: 1; flex-direction: column; }
435
+ .session-header strong, .session-header small { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
436
+ .session-header strong { font-size: 14px; font-weight: 650; }
437
+ .session-header small { color: var(--muted); font-size: 11px; }
438
+ .connection-state { display: inline-flex; align-items: center; gap: 6px; color: var(--healthy); font-size: 11px; }
439
+ .connection-state::before { width: 6px; height: 6px; border-radius: 50%; background: currentColor; content: ""; }
440
+ .connection-state.reconnecting { color: var(--reconnecting); }
441
+
442
+ .conversation { min-height: 0; overflow-y: auto; scroll-behavior: smooth; }
443
+ .landing .conversation { display: grid; place-items: center; }
444
+ .landing-welcome { padding: 0 24px; text-align: center; transform: translateY(-104px); }
445
+ .landing-brand { display: flex; align-items: center; justify-content: center; }
446
+ .landing-brand strong { align-items: flex-end; font-size: 34px; }
447
+ .landing-brand .pixel-mark { width: 36px; height: 36px; margin-left: 3px; }
448
+ .landing-brand .pixel-mark i { width: 9px; height: 9px; }
449
+ .landing-brand .pixel-mark i:nth-child(2) { left: 9px; }
450
+ .landing-brand .pixel-mark i:nth-child(3) { left: 18px; }
451
+ .landing-brand .pixel-mark i:nth-child(4) { top: 9px; }
452
+ .landing-brand .pixel-mark i:nth-child(5) { top: 9px; left: 18px; }
453
+ .landing-brand .pixel-mark i:nth-child(6) { top: 18px; }
454
+ .landing-brand .pixel-mark i:nth-child(7) { top: 18px; left: 9px; }
455
+ .landing-brand .pixel-mark i:nth-child(8) { top: 18px; left: 27px; }
456
+ .landing-brand .pixel-mark i:nth-child(9) { top: 27px; }
457
+ .landing-brand .pixel-mark i:nth-child(10) { top: 27px; left: 27px; }
458
+ .message-row { width: min(760px, calc(100% - 48px)); margin: 0 auto; padding: 18px 0; }
459
+ .message-row.user { display: flex; justify-content: flex-end; padding-top: 26px; }
460
+ .message-row.assistant { width: min(780px, calc(100% - 48px)); }
461
+ .message-row.detail-only { padding: 12px 0; }
462
+ .message-row.detail-only .message-details { margin: 0 auto; }
463
+ .message-content { min-width: 0; max-width: min(78%, 560px); }
464
+ .message-row.assistant .message-content { width: 100%; max-width: none; }
465
+ .message-row.assistant .message-details { width: min(760px, calc(100% - 4px)); margin-right: auto; margin-left: auto; }
466
+ .message-body { color: var(--text); font-size: 14px; line-height: 1.7; overflow-wrap: anywhere; white-space: pre-wrap; }
467
+ .message-row.user .message-body { padding: 10px 14px; border-radius: 18px 18px 4px 18px; background: var(--sidebar-active); color: var(--text); }
468
+ .message-body.markdown { white-space: normal; }
469
+ .message-body.markdown > :first-child { margin-top: 0; }
470
+ .message-body.markdown > :last-child { margin-bottom: 0; }
471
+ .message-body.markdown p { margin: 0 0 12px; }
472
+ .message-body.markdown h1, .message-body.markdown h2, .message-body.markdown h3,
473
+ .message-body.markdown h4, .message-body.markdown h5, .message-body.markdown h6 {
474
+ margin: 18px 0 8px;
475
+ color: var(--text);
476
+ font-weight: 650;
477
+ line-height: 1.3;
478
+ }
479
+ .message-body.markdown h1 { font-size: 1.45em; }
480
+ .message-body.markdown h2 { font-size: 1.3em; }
481
+ .message-body.markdown h3 { font-size: 1.15em; }
482
+ .message-body.markdown ul, .message-body.markdown ol { margin: 0 0 12px; padding-left: 24px; }
483
+ .message-body.markdown li + li { margin-top: 4px; }
484
+ .message-body.markdown blockquote { margin: 0 0 12px; padding: 2px 14px; border-left: 3px solid var(--border-strong); color: var(--muted); }
485
+ .message-body.markdown hr { margin: 18px 0; border: 0; border-top: 1px solid var(--border); }
486
+ .message-body.markdown a { color: var(--accent); text-decoration: underline; text-decoration-color: var(--link-underline); text-underline-offset: 2px; }
487
+ .message-body.markdown code { padding: 2px 5px; border-radius: 4px; background: var(--surface-selected); color: var(--secondary-text); font: .9em ui-monospace, SFMono-Regular, Menlo, monospace; }
488
+ .message-body.markdown pre { margin: 0 0 14px; overflow-x: auto; padding: 12px 14px; border: 1px solid var(--border); border-radius: 8px; background: var(--surface-code); }
489
+ .message-body.markdown pre code { padding: 0; background: transparent; color: var(--text); font-size: 12px; white-space: pre; }
490
+ .message-body.markdown table { width: 100%; margin: 0 0 14px; border-collapse: collapse; font-size: .95em; }
491
+ .message-body.markdown th, .message-body.markdown td { padding: 7px 9px; border: 1px solid var(--border); text-align: left; vertical-align: top; }
492
+ .message-body.markdown th { background: var(--surface-soft); font-weight: 650; }
493
+ .message-body.markdown input[type="checkbox"] { margin-right: 7px; accent-color: var(--accent); }
494
+ .message-details { width: min(760px, calc(100% - 48px)); margin: 4px auto; color: var(--muted); }
495
+ .message-details summary { display: flex; min-height: 34px; align-items: center; gap: 8px; padding: 5px 8px; border-radius: 7px; cursor: pointer; list-style: none; font-size: 13px; }
496
+ .message-details summary::-webkit-details-marker { display: none; }
497
+ .message-details summary:hover { background: var(--details-hover); }
498
+ .details-mark { width: 8px; height: 8px; flex: 0 0 auto; border-right: 1.5px solid currentColor; border-bottom: 1.5px solid currentColor; transform: rotate(-45deg); transition: transform 140ms ease; }
499
+ .message-details[open] .details-mark { transform: rotate(45deg); }
500
+ .details-title { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
501
+ .assistant-detail { margin: 2px 0 4px; }
502
+ .assistant-detail .details-body { max-height: 280px; }
503
+ .details-body { max-height: 360px; margin: 2px 0 0 24px; overflow: auto; padding: 12px 14px; border: 1px solid var(--border); border-radius: 8px; background: var(--details-surface); }
504
+ .tool-evidence { color: var(--muted); font: 12px/1.5 ui-monospace, SFMono-Regular, Menlo, monospace; overflow-wrap: anywhere; white-space: pre-wrap; }
505
+
506
+ .composer-dock {
507
+ display: flex;
508
+ flex-direction: column;
509
+ align-items: center;
510
+ gap: 8px;
511
+ padding: 12px 24px 22px;
512
+ background: linear-gradient(to bottom, var(--dock-start), var(--dock-end) 18px);
513
+ }
514
+ .composer {
515
+ position: relative;
516
+ display: flex;
517
+ width: min(780px, 100%);
518
+ min-height: 118px;
519
+ flex-direction: column;
520
+ margin: 0 auto;
521
+ padding: 13px 13px 10px;
522
+ border: 1px solid var(--border-strong);
523
+ border-radius: 18px;
524
+ background: var(--page);
525
+ box-shadow: 0 8px 26px rgba(53, 78, 117, .1);
526
+ }
527
+ .composer:focus-within { border-color: var(--warm-border); box-shadow: 0 0 0 2px color-mix(in srgb, var(--warm-border) 28%, transparent), 0 8px 26px rgba(0, 0, 0, .14); }
528
+ .composer.dormant { border-style: dashed; box-shadow: none; cursor: pointer; }
529
+ .composer.dormant:hover { border-color: var(--border-strong); }
530
+ .composer.dormant textarea { cursor: pointer; }
531
+ .composer textarea { width: 100%; min-width: 0; min-height: 52px; max-height: 220px; flex: 0 0 auto; padding: 0 2px; resize: none; overflow-y: hidden; border: 0; outline: 0; background: transparent; color: var(--text); font-size: 14px; line-height: 1.55; scrollbar-width: thin; scrollbar-color: rgba(125, 132, 138, .45) transparent; }
532
+ .composer textarea::placeholder { color: var(--subtle); }
533
+ .composer-toolbar { display: flex; min-width: 0; align-items: center; justify-content: flex-end; gap: 8px; margin-top: 7px; }
534
+ .conversation-running { display: flex; width: min(780px, calc(100% - 48px)); margin: 2px auto 18px; align-items: center; gap: 8px; color: var(--muted); font-size: 12px; }
535
+ .runtime-activity { display: flex; width: min(780px, calc(100% - 48px)); flex-wrap: wrap; gap: 6px; margin: 8px auto 14px; padding: 0; list-style: none; }
536
+ .runtime-activity-item { display: inline-flex; min-width: 0; max-width: 320px; align-items: center; gap: 6px; padding: 4px 9px; border: 1px solid var(--border); border-radius: 999px; background: var(--page); color: var(--muted); font-size: 11px; }
537
+ .runtime-activity-item strong { color: var(--text); font-weight: 600; }
538
+ .runtime-activity-item span { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
539
+ .runtime-activity-item small { color: var(--subtle); }
540
+ .conversation-running-dot { width: 8px; height: 8px; flex: 0 0 auto; border-radius: 50%; background: var(--accent); box-shadow: 0 0 0 0 rgba(40, 103, 178, .35); animation: conversation-pulse 1.5s ease-out infinite; }
541
+ @keyframes conversation-pulse { 70% { box-shadow: 0 0 0 6px rgba(40, 103, 178, 0); } 100% { box-shadow: 0 0 0 0 rgba(40, 103, 178, 0); } }
542
+ .model-picker-wrap { position: relative; min-width: 0; max-width: 48%; }
543
+ .model-picker { display: inline-flex; min-width: 150px; max-width: 100%; height: 34px; align-items: center; justify-content: space-between; gap: 8px; margin-right: 0; padding: 0 9px 0 10px; border: 1px solid transparent; border-radius: 8px; outline: 0; background: transparent; color: var(--muted); font-size: 13px; text-align: left; }
544
+ .model-picker:not(:disabled) { cursor: pointer; }
545
+ .model-picker:not(:disabled):hover, .model-picker[aria-expanded="true"] { border-color: var(--border); background: var(--surface-hover); color: var(--text); }
546
+ .model-picker:disabled { color: var(--subtle); cursor: default; }
547
+ .model-picker-value { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
548
+ .model-picker-chevron { width: 14px; height: 14px; flex: 0 0 auto; color: var(--subtle); transition: transform 140ms ease; }
549
+ .model-picker[aria-expanded="true"] .model-picker-chevron { transform: rotate(180deg); }
550
+ .model-menu { position: absolute; top: calc(100% + 6px); right: 0; z-index: 8; width: 240px; max-height: 300px; overflow-y: auto; padding: 5px; border: 1px solid var(--border); border-radius: 10px; background: var(--page); box-shadow: 0 12px 28px rgba(31, 37, 44, .16); scrollbar-width: thin; scrollbar-color: rgba(125, 132, 138, .45) transparent; }
551
+ .model-menu[hidden] { display: none; }
552
+ .model-menu button { display: flex; width: 100%; min-height: 34px; align-items: center; justify-content: space-between; gap: 10px; padding: 0 9px; border: 0; border-radius: 7px; background: transparent; color: var(--text); font-size: 13px; text-align: left; }
553
+ .model-menu button:hover, .model-menu button[aria-selected="true"] { background: var(--surface-selected); }
554
+ .model-menu-check { visibility: hidden; color: var(--text); font-size: 15px; }
555
+ .model-menu button[aria-selected="true"] .model-menu-check { visibility: visible; }
556
+ .workspace-tree::-webkit-scrollbar, .model-menu::-webkit-scrollbar, .composer textarea::-webkit-scrollbar { width: 6px; height: 6px; }
557
+ .workspace-tree::-webkit-scrollbar-track, .model-menu::-webkit-scrollbar-track, .composer textarea::-webkit-scrollbar-track { background: transparent; border: 0; }
558
+ .workspace-tree::-webkit-scrollbar-thumb, .model-menu::-webkit-scrollbar-thumb, .composer textarea::-webkit-scrollbar-thumb { border-radius: 999px; background: rgba(125, 132, 138, .45); }
559
+ .workspace-picker-row { display: flex; width: min(780px, 100%); min-width: 0; align-items: center; margin: 0 auto; padding-left: 15px; }
560
+ .workspace-picker { position: relative; display: inline-flex; width: fit-content; max-width: 100%; min-width: 0; height: 36px; align-items: center; justify-content: center; gap: 0; padding: 0 10px 0 0; padding-right: 28px; padding-left: 28px; border: 1px solid transparent; border-radius: 18px; background: transparent; color: var(--text); font-size: 13px; line-height: 1; text-align: center; transition: border-color 140ms ease, background 140ms ease, box-shadow 140ms ease; }
561
+ .workspace-picker:hover, .workspace-picker[aria-expanded="true"] { border-color: var(--warm-border); background: var(--sidebar-active); box-shadow: 0 3px 10px rgba(0, 0, 0, .1); }
562
+ .workspace-picker span { min-width: 0; overflow: hidden; text-align: center; text-overflow: ellipsis; white-space: nowrap; }
563
+ .workspace-symbol { position: absolute; left: 8px; width: 15px; height: 15px; }
564
+ .context-chevron { position: absolute; right: 8px; width: 13px; height: 13px; }
565
+ .workspace-picker-row { position: relative; }
566
+ .workspace-picker-menu { position: absolute; top: calc(100% + 6px); left: 0; z-index: 5; width: 225px; padding: 5px; border: 1px solid var(--border); border-radius: 12px; background: var(--page); box-shadow: 0 12px 28px rgba(31, 37, 44, .16); }
567
+ .workspace-picker-menu[hidden] { display: none; }
568
+ .workspace-picker-menu button { display: flex; width: 100%; height: 38px; align-items: center; gap: 8px; padding: 0 10px; border: 0; border-radius: 8px; background: transparent; color: var(--text); font-size: 12px; text-align: left; }
569
+ .workspace-picker-menu button:hover { background: var(--surface-soft); }
570
+ .workspace-picker-menu button[aria-selected="true"] { background: var(--surface-soft); }
571
+ .workspace-menu-icon { width: 16px; height: 16px; flex: 0 0 auto; color: var(--muted); }
572
+ .workspace-picker-menu .workspace-menu-check { visibility: hidden; margin-left: auto; font-size: 16px; }
573
+ .workspace-picker-menu button[aria-selected="true"] .workspace-menu-check { visibility: visible; }
574
+ .workspace-picker-menu .workspace-menu-add { margin-top: 4px; border-radius: 8px; color: var(--muted); }
575
+ .send-button { display: grid; width: 34px; height: 34px; flex: 0 0 auto; place-items: center; border: 0; border-radius: 50%; background: var(--warm-accent); color: var(--text); }
576
+ .send-button:hover { background: var(--warm-accent-hover); }
577
+ .send-button:disabled { background: var(--warm-accent-disabled); color: var(--subtle); }
578
+ .send-button svg { width: 17px; height: 17px; stroke-width: 2; }
579
+ .stop-button { display: grid; width: 34px; height: 34px; flex: 0 0 auto; place-items: center; border: 1px solid #d6cbc1; border-radius: 50%; background: #f7eee8; color: #8a3f32; }
580
+ .stop-button:hover { border-color: #c8b3a5; background: #f1e2d9; }
581
+ .stop-button:disabled { border-color: var(--border); background: #f3f1ed; color: var(--subtle); }
582
+ .stop-button[hidden] { display: none; }
583
+ .stop-button svg { width: 16px; height: 16px; fill: currentColor; stroke: none; }
584
+ .composer-hint { display: none; }
585
+ .composer-hint.status, .composer-hint.error, .composer-hint.connection { display: block; margin: 7px 2px 0; color: var(--muted); font-size: 11px; line-height: 1.35; }
586
+ .composer-hint.receipt { display: block; color: var(--subtle); }
587
+ .composer-hint.error { color: var(--error); }
588
+ .composer-hint.connection { color: #9a6700; }
589
+ .sidebar-scrim { display: none; }
590
+
591
+ @media (max-width: 760px) {
592
+ .app-shell, body.sidebar-collapsed .app-shell { grid-template-columns: 1fr; }
593
+ .session-sidebar {
594
+ position: fixed;
595
+ inset: 0 auto 0 0;
596
+ width: min(86vw, 300px);
597
+ transform: translateX(-100%);
598
+ box-shadow: 12px 0 32px rgba(31, 37, 44, .16);
599
+ transition: transform 180ms ease;
600
+ }
601
+ body.sidebar-open .session-sidebar { transform: translateX(0); }
602
+ body.sidebar-collapsed .session-sidebar { align-items: stretch; padding: 8px 10px; }
603
+ body.sidebar-collapsed .brand-word, body.sidebar-collapsed .workspace-heading-label,
604
+ body.sidebar-collapsed .workspace-tree, body.sidebar-collapsed .session-search,
605
+ body.sidebar-collapsed .new-session-button span { display: initial; }
606
+ body.sidebar-collapsed .sidebar-brand { width: auto; justify-content: space-between; padding: 0 4px 0 6px; }
607
+ body.sidebar-collapsed .sidebar-brand .collapse-button { position: static; }
608
+ body.sidebar-collapsed .sidebar-brand .collapse-button .icon { display: block; }
609
+ body.sidebar-collapsed .new-session-button { width: calc(100% - 4px); margin: 8px 2px 10px; }
610
+ body.sidebar-collapsed .workspace-heading { width: auto; justify-content: space-between; padding: 0 4px 0 8px; }
611
+ .sidebar-scrim { position: fixed; inset: 0; z-index: 10; border: 0; background: rgba(20, 26, 32, .28); }
612
+ body.sidebar-open .sidebar-scrim { display: block; }
613
+ .conversation-shell { grid-template-rows: minmax(0, 1fr) auto; }
614
+ .conversation-shell.landing { grid-template-rows: minmax(0, 1fr); }
615
+ .mobile-sidebar-button { display: grid; }
616
+ .connection-state { font-size: 0; }
617
+ .message-row, .message-details { width: calc(100% - 28px); }
618
+ .message-row.assistant { width: calc(100% - 24px); }
619
+ .conversation-running { width: calc(100% - 24px); }
620
+ .composer-dock { padding: 10px 12px 12px; }
621
+ .landing .composer-dock { top: calc(50% - 74px); padding: 0 12px; }
622
+ .landing-welcome { transform: translateY(-96px); }
623
+ .composer { min-height: 104px; }
624
+ .composer-hint { display: none; }
625
+ }
626
+
627
+ @media (prefers-reduced-motion: reduce) {
628
+ .app-shell, .session-sidebar, .workspace-chevron { transition: none; }
629
+ .conversation { scroll-behavior: auto; }
630
+ }
631
+
632
+ .composer-hint.status, .composer-hint.error, .composer-hint.connection { display: block; }
633
+
634
+ /* The conversation view should start with the actual messages. On narrow
635
+ screens keep only the sidebar trigger as an overlay so navigation remains
636
+ available without restoring the session header. */
637
+ .workbench-header {
638
+ display: none;
639
+ }
640
+
641
+ @media (max-width: 760px) {
642
+ .workbench-header {
643
+ position: absolute;
644
+ inset: 0;
645
+ z-index: 5;
646
+ display: block;
647
+ padding: 0;
648
+ border: 0;
649
+ background: transparent;
650
+ backdrop-filter: none;
651
+ -webkit-backdrop-filter: none;
652
+ pointer-events: none;
653
+ }
654
+ .workbench-header .session-header,
655
+ .workbench-header .connection-state {
656
+ display: none;
657
+ }
658
+ .workbench-header .mobile-sidebar-button {
659
+ position: fixed;
660
+ top: 12px;
661
+ left: 12px;
662
+ display: grid;
663
+ pointer-events: auto;
664
+ }
665
+ }
666
+
667
+ /* Keep the reference grid visible around the landing composer. */
668
+ .conversation-shell.landing .composer-dock {
669
+ background: transparent;
670
+ }
671
+
672
+ /* An existing session already belongs to its workspace. */
673
+ .conversation-shell:not(.landing) .workspace-picker-row {
674
+ display: none;
675
+ }
676
+
677
+ .conversation-shell:not(.landing) .model-menu {
678
+ top: auto;
679
+ bottom: calc(100% + 6px);
680
+ }