@tt-a1i/openpi 0.6.0 → 0.7.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 (60) hide show
  1. package/README.md +13 -11
  2. package/SETUP.md +2 -2
  3. package/THIRD_PARTY_NOTICES.md +242 -0
  4. package/extensions/ai-providers/README.md +12 -6
  5. package/extensions/ai-providers/cursor/connect-frame-reader.ts +76 -0
  6. package/extensions/ai-providers/cursor/input-images.ts +2 -3
  7. package/extensions/ai-providers/cursor/proto.ts +218 -11
  8. package/extensions/ai-providers/cursor/protobuf.ts +12 -2
  9. package/extensions/ai-providers/cursor/provider.ts +280 -37
  10. package/extensions/ai-providers/cursor/tool-bridge.ts +68 -0
  11. package/extensions/ai-providers/index.ts +3 -3
  12. package/extensions/file-mutation-display/index.ts +13 -9
  13. package/extensions/shared/agent-transcript.ts +3 -2
  14. package/extensions/shared/child-session.ts +14 -0
  15. package/extensions/subagents/index.ts +20 -3
  16. package/extensions/subagents/src/agent-types.ts +5 -17
  17. package/extensions/subagents/src/backends/pi.ts +70 -59
  18. package/extensions/subagents/src/backends/tool-preview.ts +29 -0
  19. package/extensions/subagents/src/manager.ts +2 -71
  20. package/extensions/subagents/src/prompt.ts +2 -2
  21. package/extensions/subagents/src/runtime.ts +10 -3
  22. package/extensions/web/index.ts +69 -5
  23. package/extensions/workflows/artifacts.ts +362 -23
  24. package/extensions/workflows/dashboard.ts +141 -21
  25. package/extensions/workflows/index.ts +62 -20
  26. package/extensions/workflows/progress-projection.ts +7 -1
  27. package/extensions/workflows/runner.ts +5 -162
  28. package/extensions/workflows/sandbox.ts +4 -0
  29. package/package.json +28 -4
  30. package/skills/subagents/REFERENCE.md +6 -7
  31. package/skills/subagents/SKILL.md +1 -1
  32. package/skills/workflows/REFERENCE.md +3 -1
  33. package/web/dist/app.js +87 -0
  34. package/web/dist/favicon.svg +9 -0
  35. package/web/dist/index.html +15 -0
  36. package/web/dist/styles.css +3 -0
  37. package/web/host/web-host.ts +6 -9
  38. package/web/ui/index.html +3 -131
  39. package/web/ui/public/favicon.svg +9 -0
  40. package/web/ui/src/app/App.tsx +134 -0
  41. package/web/ui/src/app/providers.tsx +38 -0
  42. package/web/ui/src/components/Markdown.tsx +58 -0
  43. package/web/ui/src/components/OpenPiLogo.tsx +41 -0
  44. package/web/ui/src/features/activity/ActivityBar.tsx +120 -0
  45. package/web/ui/src/features/composer/Composer.tsx +237 -0
  46. package/web/ui/src/features/sessions/SessionSidebar.tsx +418 -0
  47. package/web/ui/src/features/transcript/Transcript.tsx +860 -0
  48. package/web/ui/src/i18n.ts +159 -0
  49. package/web/ui/src/lib/format.ts +57 -0
  50. package/web/ui/src/main.tsx +16 -0
  51. package/web/ui/src/protocol/client.ts +199 -0
  52. package/web/ui/src/protocol/event-stream.ts +88 -0
  53. package/web/ui/src/store/web-store.ts +926 -0
  54. package/web/ui/src/styles.css +420 -0
  55. package/web/ui/tsconfig.json +12 -0
  56. package/web/ui/vite-env.d.ts +1 -0
  57. package/web/vite.config.mjs +21 -1
  58. package/web/host/static-assets.ts +0 -4
  59. package/web/ui/app.js +0 -1700
  60. package/web/ui/styles.css +0 -680
package/web/ui/styles.css DELETED
@@ -1,680 +0,0 @@
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
- }