clay-server 5.2.1-beta.2 → 5.3.0-beta.2

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 (154) hide show
  1. package/lib/clay-control-presentation-binding.js +5 -3
  2. package/lib/clay-product-control-tools.js +3 -3
  3. package/lib/clay-product-control.js +4 -2
  4. package/lib/clay-screen-controls.js +18 -3
  5. package/lib/clay-split-view-awareness.js +35 -0
  6. package/lib/clay-split-view-controls.js +122 -0
  7. package/lib/clay-split-view-input.js +20 -0
  8. package/lib/clay-split-view-render-proof.js +22 -0
  9. package/lib/pane-asset-manifest.js +63 -0
  10. package/lib/project-connection.js +19 -10
  11. package/lib/project-session-actions.js +1 -0
  12. package/lib/project-session-delete.js +2 -2
  13. package/lib/project-session-folders.js +1 -0
  14. package/lib/project-sessions.js +6 -1
  15. package/lib/project-split-view-document.js +33 -0
  16. package/lib/project-split-view-names.js +67 -0
  17. package/lib/project-split-view-organization.js +23 -0
  18. package/lib/project-split-views.js +479 -0
  19. package/lib/project-worker-conversation.js +222 -0
  20. package/lib/project-worker-creation-proposal.js +3 -4
  21. package/lib/project-worker-proposal.js +1 -1
  22. package/lib/project-worker-removal.js +101 -0
  23. package/lib/project.js +28 -1
  24. package/lib/public/app.js +32 -13
  25. package/lib/public/css/base.css +9 -0
  26. package/lib/public/css/filebrowser.css +0 -1
  27. package/lib/public/css/pane-header-controls.css +100 -0
  28. package/lib/public/css/pane.css +24 -41
  29. package/lib/public/css/popup-chat.css +123 -0
  30. package/lib/public/css/right-workbench.css +50 -18
  31. package/lib/public/css/session-folders.css +1 -1
  32. package/lib/public/css/split-view-layout.css +463 -0
  33. package/lib/public/css/split-view-worker-activity.css +97 -0
  34. package/lib/public/css/sticky-notes.css +13 -0
  35. package/lib/public/index.html +3 -3
  36. package/lib/public/modules/app-connection.js +4 -1
  37. package/lib/public/modules/app-favicon.js +1 -1
  38. package/lib/public/modules/app-messages.js +31 -9
  39. package/lib/public/modules/chat-render-runtime.js +54 -0
  40. package/lib/public/modules/clay-control-copy.js +3 -0
  41. package/lib/public/modules/clay-navigation-render.js +1 -1
  42. package/lib/public/modules/clay-owner-navigation.js +15 -5
  43. package/lib/public/modules/clay-split-view-screen.js +74 -0
  44. package/lib/public/modules/clay-tool-activity.js +5 -0
  45. package/lib/public/modules/command-palette.js +30 -28
  46. package/lib/public/modules/contextual-clay-session.js +26 -2
  47. package/lib/public/modules/contextual-clay.js +5 -2
  48. package/lib/public/modules/contextual-mate-sessions.js +2 -0
  49. package/lib/public/modules/filebrowser.js +6 -2
  50. package/lib/public/modules/generation-stop.js +7 -1
  51. package/lib/public/modules/knowledge-workbench-entry.js +43 -0
  52. package/lib/public/modules/markdown-view-mode.js +34 -0
  53. package/lib/public/modules/markdown.js +11 -0
  54. package/lib/public/modules/mate-knowledge-workbench.js +2 -7
  55. package/lib/public/modules/mate-sidebar.js +1 -1
  56. package/lib/public/modules/palette-clay-conversation.js +87 -0
  57. package/lib/public/modules/palette-render-helpers.js +25 -0
  58. package/lib/public/modules/pane-activation.js +46 -7
  59. package/lib/public/modules/pane-binding.js +12 -2
  60. package/lib/public/modules/pane-bridge.js +12 -3
  61. package/lib/public/modules/pane-deferred-bootstrap.js +32 -0
  62. package/lib/public/modules/pane-feature-assets.js +35 -0
  63. package/lib/public/modules/pane-file-bridge.js +8 -3
  64. package/lib/public/modules/pane-search-receipt.js +12 -0
  65. package/lib/public/modules/permission-control.js +6 -6
  66. package/lib/public/modules/popup-chat-rendering.js +244 -0
  67. package/lib/public/modules/project-activation.js +2 -2
  68. package/lib/public/modules/qrcode.js +12 -1
  69. package/lib/public/modules/right-workbench.js +68 -0
  70. package/lib/public/modules/search-hints.js +79 -0
  71. package/lib/public/modules/session-context-menu.js +35 -2
  72. package/lib/public/modules/session-folder-collapse.js +2 -1
  73. package/lib/public/modules/session-folder-context.js +24 -13
  74. package/lib/public/modules/session-folder-delete.js +18 -1
  75. package/lib/public/modules/session-folder-dnd.js +4 -1
  76. package/lib/public/modules/session-folder-layout.js +7 -6
  77. package/lib/public/modules/session-search-pane-state.js +30 -0
  78. package/lib/public/modules/session-search.js +53 -13
  79. package/lib/public/modules/sidebar-mobile.js +3 -3
  80. package/lib/public/modules/sidebar-projects.js +1 -0
  81. package/lib/public/modules/sidebar-session-folders-ui.js +3 -3
  82. package/lib/public/modules/sidebar-sessions.js +57 -24
  83. package/lib/public/modules/sidebar.js +20 -3
  84. package/lib/public/modules/split-group-helpers.js +1 -1
  85. package/lib/public/modules/split-group-restore.js +8 -11
  86. package/lib/public/modules/split-pair-ui.js +18 -0
  87. package/lib/public/modules/split-pane-header-state.js +45 -0
  88. package/lib/public/modules/split-pane-reconciler.js +23 -4
  89. package/lib/public/modules/split-pane-renderer.js +330 -23
  90. package/lib/public/modules/split-pane-retention.js +157 -0
  91. package/lib/public/modules/split-session-boundary.js +21 -0
  92. package/lib/public/modules/split-view-create-action.js +15 -0
  93. package/lib/public/modules/split-view-create-menu.js +83 -0
  94. package/lib/public/modules/split-view-create-request.js +23 -0
  95. package/lib/public/modules/split-view-layout-client.js +198 -0
  96. package/lib/public/modules/split-view-layout-icons.js +37 -0
  97. package/lib/public/modules/split-view-layout-scope.js +38 -0
  98. package/lib/public/modules/split-view-organization.js +73 -0
  99. package/lib/public/modules/split-view-presentation-close.js +35 -0
  100. package/lib/public/modules/split-view-presentation-drag.js +278 -0
  101. package/lib/public/modules/split-view-presentation-drop.js +57 -0
  102. package/lib/public/modules/split-view-presentation-lookup.js +44 -0
  103. package/lib/public/modules/split-view-presentation-renderer.js +494 -0
  104. package/lib/public/modules/split-view-presentations.js +498 -0
  105. package/lib/public/modules/split-view-shell-controls.js +28 -0
  106. package/lib/public/modules/split-view-sidebar-menu.js +42 -0
  107. package/lib/public/modules/split-view-sidebar-renderer.js +30 -0
  108. package/lib/public/modules/split-view-singleton.js +21 -0
  109. package/lib/public/modules/split-view-worker-activity.js +94 -0
  110. package/lib/public/modules/split-view-worker-controls.js +30 -0
  111. package/lib/public/modules/split-view-worker-removal.js +137 -0
  112. package/lib/public/modules/split-view-worker-scroll.js +57 -0
  113. package/lib/public/modules/split-view-worker-transcript.js +46 -0
  114. package/lib/public/modules/split-view-workers.js +418 -0
  115. package/lib/public/modules/split-view.js +61 -22
  116. package/lib/public/modules/sticky-notes.js +9 -2
  117. package/lib/public/modules/tools.js +25 -5
  118. package/lib/public/modules/workbench-layout-preference.js +76 -0
  119. package/lib/public/modules/worker-created-presentation.js +37 -0
  120. package/lib/public/pane-assets/app-2DRBYY3L.js +1 -0
  121. package/lib/public/pane-assets/chunk-4BM7UVNG.js +2 -0
  122. package/lib/public/pane-assets/chunk-6SM2WQJX.js +1 -0
  123. package/lib/public/pane-assets/chunk-7H36SUZA.js +2 -0
  124. package/lib/public/pane-assets/chunk-C4RVVYNT.js +1 -0
  125. package/lib/public/pane-assets/chunk-DGOFGEUK.js +1 -0
  126. package/lib/public/pane-assets/chunk-I57URYSL.js +1 -0
  127. package/lib/public/pane-assets/chunk-O6MQL6MR.js +167 -0
  128. package/lib/public/pane-assets/chunk-PO2JOHHW.js +1 -0
  129. package/lib/public/pane-assets/chunk-UMGHINOT.js +1 -0
  130. package/lib/public/pane-assets/manifest.json +553 -0
  131. package/lib/public/pane-assets/style-63EZCREE.css +1 -0
  132. package/lib/public/style.css +5 -1
  133. package/lib/server-owner-ui.js +6 -2
  134. package/lib/server-owner-view-observation.js +34 -0
  135. package/lib/server-palette.js +1 -0
  136. package/lib/server-pane-bootstrap.js +24 -0
  137. package/lib/server-settings.js +2 -0
  138. package/lib/server-static-assets.js +52 -0
  139. package/lib/server-workbench-layout-settings.js +56 -0
  140. package/lib/server.js +6 -45
  141. package/lib/session-activity-state.js +28 -0
  142. package/lib/session-list-delivery.js +17 -0
  143. package/lib/session-pair-turn-control.js +1 -6
  144. package/lib/session-search.js +3 -0
  145. package/lib/session-split-group-anchors.js +2 -2
  146. package/lib/session-split-group-roles.js +5 -8
  147. package/lib/session-split-group-v2-store.js +0 -3
  148. package/lib/sessions.js +16 -6
  149. package/lib/split-view-layout.js +132 -0
  150. package/lib/users-workbench-layout-preferences.js +33 -0
  151. package/lib/users.js +3 -0
  152. package/lib/workspace-query-service.js +1 -5
  153. package/lib/ws-schema.js +16 -0
  154. package/package.json +6 -3
@@ -0,0 +1,463 @@
1
+ /* Named Split views use the existing session-bound pane surfaces. */
2
+ .split-view-group-open, .split-view-group-more, .split-view-create-trigger,
3
+ .split-view-arrange button,
4
+ .split-view-worker-popover button, .split-pane-search,
5
+ .split-pane-info, .split-pane-sidebar,
6
+ .split-view-canvas .split-view-arrange-trigger {
7
+ appearance: none;
8
+ border: 0;
9
+ border-radius: 5px;
10
+ background: transparent;
11
+ color: var(--text-muted);
12
+ font-family: inherit;
13
+ cursor: pointer;
14
+ }
15
+ .split-view-group-open:hover, .split-view-group-more:hover,
16
+ .split-view-create-trigger:hover,
17
+ .split-view-arrange button:hover, .split-view-worker-popover button:hover,
18
+ .split-pane-search:hover, .split-view-canvas .split-view-arrange-trigger:hover {
19
+ background: var(--sidebar-hover);
20
+ color: var(--text);
21
+ }
22
+ .split-pane-info:hover, .split-pane-sidebar:hover {
23
+ background: var(--sidebar-hover);
24
+ color: var(--text);
25
+ }
26
+ .split-view-group button:focus-visible, .split-view-create-trigger:focus-visible,
27
+ .split-view-arrange button:focus-visible,
28
+ .split-view-worker-popover button:focus-visible, .split-view-worker-chip:focus-visible,
29
+ .split-pane-search:focus-visible, .split-view-arrange-trigger:focus-visible {
30
+ outline: 2px solid var(--accent);
31
+ outline-offset: -2px;
32
+ }
33
+ .split-pane-info:focus-visible, .split-pane-sidebar:focus-visible {
34
+ outline: 2px solid var(--accent);
35
+ outline-offset: -2px;
36
+ }
37
+ .split-view-arrange button:disabled { opacity: .45; cursor: default; }
38
+ .split-view-create-trigger {
39
+ display: flex;
40
+ align-items: center;
41
+ width: calc(100% - 16px);
42
+ min-height: 28px;
43
+ margin: 2px 8px 4px;
44
+ padding: 5px 8px;
45
+ font-size: 11px;
46
+ text-align: left;
47
+ }
48
+ .split-pane-search, .split-view-canvas .split-view-arrange-trigger,
49
+ .split-pane-info, .split-pane-sidebar,
50
+ .split-view-worker-popover-header button {
51
+ display: inline-flex;
52
+ align-items: center;
53
+ justify-content: center;
54
+ width: 24px;
55
+ height: 24px;
56
+ padding: 5px;
57
+ flex: 0 0 24px;
58
+ }
59
+ .split-pane-search svg, .split-pane-info svg, .split-pane-sidebar svg,
60
+ .split-view-worker-popover-header button svg { width: 14px; height: 14px; }
61
+ .split-pane-info { width: 20px; flex-basis: 20px; padding: 3px; }
62
+ .split-view-canvas .split-pane-header button[hidden] { display: none; }
63
+ .split-pane-sidebar { display: none; }
64
+ #layout.sidebar-collapsed .split-pane-sidebar:not([hidden]) { display: inline-flex; }
65
+ @media (max-width: 768px) { .split-pane-sidebar:not([hidden]) { display: inline-flex; } }
66
+ /* Session identity and actions live in the pane title bar. */
67
+ #main-column:has(#split-host.split-view-canvas.visible) > .title-bar-content { display: none; }
68
+ @media (max-width: 768px) {
69
+ #main-column:has(#split-host.split-view-canvas.visible) > .title-bar-content {
70
+ display: flex;
71
+ height: calc(36px + var(--safe-top));
72
+ justify-content: flex-end;
73
+ }
74
+ #main-column:has(#split-host.split-view-canvas.visible) > .title-bar-content > :not(.status),
75
+ #main-column:has(#split-host.split-view-canvas.visible) > .title-bar-content > .status > :not(#sticky-notes-toggle-btn):not(#shared-browser-toggle-btn):not(#terminal-toggle-btn) {
76
+ display: none;
77
+ }
78
+ }
79
+ #split-host.split-view-canvas.visible {
80
+ display: flex;
81
+ padding: 7px;
82
+ background: var(--bg-alt);
83
+ box-sizing: border-box;
84
+ }
85
+ .split-view-tree, .split-view-branch, .split-view-leaf {
86
+ min-width: 0;
87
+ min-height: 0;
88
+ width: 100%;
89
+ height: 100%;
90
+ }
91
+ .split-view-branch { display: flex; }
92
+ .split-view-branch[data-axis="vertical"] { flex-direction: column; }
93
+ .split-view-child { min-width: 0; min-height: 0; overflow: hidden; }
94
+ .split-view-leaf { display: flex; }
95
+ .split-view-canvas .split-pane {
96
+ border: 1px solid var(--border);
97
+ border-radius: 9px;
98
+ overflow: hidden;
99
+ container-type: inline-size;
100
+ }
101
+ .split-view-canvas .split-pane-header {
102
+ position: relative;
103
+ height: 33px;
104
+ padding: 0 8px;
105
+ gap: 5px;
106
+ user-select: none;
107
+ }
108
+ .split-view-canvas .split-pane-title {
109
+ min-width: 0;
110
+ flex: 1;
111
+ max-width: none;
112
+ font-size: 11px;
113
+ font-weight: 500;
114
+ overflow: hidden;
115
+ text-overflow: ellipsis;
116
+ white-space: nowrap;
117
+ }
118
+ .split-view-canvas .split-pane-header button { flex-shrink: 0; }
119
+ .split-view-canvas .split-pane-header button svg { width: 13px; height: 13px; }
120
+ .split-view-canvas .split-pane-header .split-pane-sidebar { order: -1; }
121
+ .split-view-canvas .split-pane-header .split-pane-info { order: 10; }
122
+ .split-view-canvas .split-pane-header .split-pane-close { order: 11; }
123
+ .split-view-canvas .split-pane-frame { flex: 1; min-height: 0; width: 100%; border: 0; }
124
+ .split-view-divider {
125
+ position: relative;
126
+ flex: 0 0 7px;
127
+ touch-action: none;
128
+ cursor: col-resize;
129
+ }
130
+ .split-view-branch[data-axis="vertical"] > .split-view-divider { cursor: row-resize; }
131
+ .split-view-divider::after {
132
+ content: '';
133
+ position: absolute;
134
+ inset: calc(50% - 16px) 3px;
135
+ border-radius: 2px;
136
+ background: var(--border);
137
+ }
138
+ .split-view-branch[data-axis="vertical"] > .split-view-divider::after {
139
+ inset: 3px calc(50% - 16px);
140
+ }
141
+ .split-view-divider:hover::after, .split-view-divider:focus-visible::after { background: var(--accent); }
142
+ body.split-view-resizing { user-select: none; }
143
+ body.split-view-resizing .split-pane-frame { pointer-events: none; }
144
+ .split-view-runtime {
145
+ display: flex;
146
+ align-items: center;
147
+ gap: 5px;
148
+ min-width: 0;
149
+ flex: 0 1 auto;
150
+ max-width: 38%;
151
+ padding: 0;
152
+ font-size: 10px;
153
+ color: var(--text-muted);
154
+ }
155
+ .split-view-runtime img { width: 14px; height: 14px; flex: 0 0 14px; }
156
+ .split-view-model {
157
+ min-width: 0;
158
+ padding: 1px 6px;
159
+ border: 1px solid var(--border-subtle);
160
+ border-radius: 9px;
161
+ background: var(--bg-alt);
162
+ line-height: 16px;
163
+ overflow: hidden;
164
+ text-overflow: ellipsis;
165
+ white-space: nowrap;
166
+ }
167
+ .split-view-runtime .split-view-branch-label { margin-left: auto; color: var(--text-dimmer); }
168
+ @container (max-width: 380px) {
169
+ .split-view-canvas .split-pane-header {
170
+ height: auto;
171
+ min-height: 55px;
172
+ padding: 4px 8px;
173
+ flex-wrap: wrap;
174
+ align-content: center;
175
+ gap: 4px;
176
+ }
177
+ .split-view-canvas .split-pane-title { flex: 1 0 70px; }
178
+ .split-view-canvas .split-view-runtime { flex: 0 1 auto; max-width: 55%; min-width: 48px; }
179
+ }
180
+ .split-view-workers {
181
+ display: flex;
182
+ align-items: center;
183
+ gap: 5px;
184
+ padding: 4px 11px;
185
+ min-height: 28px;
186
+ flex-shrink: 0;
187
+ overflow-x: auto;
188
+ scrollbar-width: thin;
189
+ }
190
+ .split-view-worker-chip {
191
+ display: inline-flex;
192
+ align-items: center;
193
+ gap: 5px;
194
+ height: 22px;
195
+ max-width: 260px;
196
+ padding: 3px 7px;
197
+ border: 1px solid var(--border-subtle);
198
+ border-radius: 5px;
199
+ background: var(--bg-alt);
200
+ color: var(--text-muted);
201
+ font-size: 10px;
202
+ flex-shrink: 0;
203
+ }
204
+ .split-view-worker-chip:hover, .split-view-worker-chip[aria-expanded="true"] {
205
+ color: var(--text-secondary);
206
+ border-color: var(--accent-20);
207
+ background: var(--accent-bg);
208
+ }
209
+ .split-view-worker-pill {
210
+ display: inline-flex;
211
+ align-items: center;
212
+ flex: 0 0 auto;
213
+ max-width: 284px;
214
+ height: 22px;
215
+ box-sizing: border-box;
216
+ border: 1px solid var(--border-subtle);
217
+ border-radius: 5px;
218
+ background: var(--bg-alt);
219
+ }
220
+ .split-view-worker-pill:focus-within { border-color: var(--accent-20); }
221
+ .split-view-worker-pill .split-view-worker-chip {
222
+ min-width: 0;
223
+ height: 20px;
224
+ flex: 0 1 auto;
225
+ border: 0;
226
+ border-radius: 4px 0 0 4px;
227
+ background: transparent;
228
+ }
229
+ .split-view-worker-remove {
230
+ display: inline-flex;
231
+ align-items: center;
232
+ justify-content: center;
233
+ flex: 0 0 20px;
234
+ width: 20px;
235
+ height: 20px;
236
+ padding: 0;
237
+ border: 0;
238
+ border-radius: 0 4px 4px 0;
239
+ background: transparent;
240
+ color: var(--text-dimmer);
241
+ cursor: pointer;
242
+ }
243
+ .split-view-worker-remove .lucide { width: 11px; height: 11px; }
244
+ .split-view-worker-remove:hover, .split-view-worker-remove.armed {
245
+ color: var(--error);
246
+ background: rgba(var(--overlay-rgb), .06);
247
+ }
248
+ .split-view-worker-remove:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
249
+ .split-view-worker-remove:disabled { opacity: .38; cursor: default; }
250
+ @media (pointer: coarse) {
251
+ .split-view-worker-pill { height: 32px; }
252
+ .split-view-worker-pill .split-view-worker-chip { height: 30px; }
253
+ .split-view-worker-remove { flex-basis: 28px; width: 28px; height: 30px; }
254
+ .split-view-worker-remove .lucide { width: 13px; height: 13px; }
255
+ }
256
+ .split-view-worker-vendor { width: 12px; height: 12px; flex: 0 0 12px; object-fit: contain; filter: grayscale(1); opacity: .65; }
257
+ .split-view-worker-name { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
258
+ .split-view-worker-identity { flex-shrink: 0; white-space: nowrap; }
259
+ .split-view-worker-generation { flex-shrink: 0; color: var(--text-dimmer); white-space: nowrap; }
260
+ .split-view-worker-controls {
261
+ appearance: none;
262
+ flex: 0 0 auto;
263
+ height: 22px;
264
+ margin-left: auto;
265
+ padding: 3px 6px;
266
+ border: 1px solid transparent;
267
+ border-radius: 5px;
268
+ background: transparent;
269
+ color: var(--text-muted);
270
+ font: inherit;
271
+ font-size: 10px;
272
+ cursor: pointer;
273
+ }
274
+ .split-view-worker-controls:hover { background: var(--sidebar-hover); color: var(--text); }
275
+ .split-view-worker-controls:focus-visible { outline: 2px solid var(--accent); outline-offset: -2px; }
276
+ .split-view-worker-dot { width: 5px; height: 5px; flex: 0 0 5px; border-radius: 50%; background: var(--text-dimmer); }
277
+ .split-view-worker-dot[data-state="working"] { background: var(--brand-green); }
278
+ .split-view-worker-dot[data-state="waiting"] { background: var(--brand-gold); }
279
+ @keyframes split-view-working { 0%, 100% { opacity: 1; } 50% { opacity: .35; } }
280
+ .split-view-group { margin: 2px 0 8px; }
281
+ .split-view-group-heading { display: flex; align-items: center; gap: 2px; min-height: 34px; border-radius: 6px; }
282
+ .split-view-group[data-active="true"] > .split-view-group-heading { background: var(--accent-bg); }
283
+ .split-view-group-open {
284
+ display: flex;
285
+ align-items: center;
286
+ gap: 7px;
287
+ flex: 1;
288
+ min-width: 0;
289
+ height: 32px;
290
+ padding: 5px 7px;
291
+ color: var(--text-secondary);
292
+ font-size: 12px;
293
+ text-align: left;
294
+ }
295
+ .split-view-group-open svg { width: 14px; height: 14px; flex-shrink: 0; }
296
+ .split-view-group-name { min-width: 0; flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
297
+ .split-view-group-count { font-size: 9px; color: var(--text-dimmer); }
298
+ .split-view-group-more { padding: 5px; color: var(--text-dimmer); }
299
+ .split-view-group-more svg { width: 13px; height: 13px; }
300
+ .split-view-star {
301
+ position: static;
302
+ transform: none;
303
+ display: inline-flex;
304
+ align-items: center;
305
+ justify-content: center;
306
+ flex: 0 0 18px;
307
+ width: 18px;
308
+ height: 18px;
309
+ padding: 0;
310
+ border: 0;
311
+ border-radius: 999px;
312
+ background: transparent;
313
+ color: var(--text-dimmer);
314
+ cursor: pointer;
315
+ opacity: 0;
316
+ pointer-events: none;
317
+ transition: opacity .15s ease, background .15s ease, color .15s ease;
318
+ }
319
+ .split-view-group-heading:hover .split-view-star,
320
+ .split-view-group-heading:focus-within .split-view-star {
321
+ opacity: .82;
322
+ pointer-events: auto;
323
+ }
324
+ .split-view-star:hover { opacity: 1; color: var(--text); background: rgba(var(--overlay-rgb), .08); }
325
+ .split-view-star.is-favorite { color: var(--accent); }
326
+ .split-view-star svg { width: 12px; height: 12px; display: block; }
327
+ .split-view-star.is-favorite svg { fill: currentColor; }
328
+ .split-view-group-children { margin-left: 10px; padding-left: 6px; border-left: 1px solid var(--border-subtle); }
329
+ .split-view-group-name-input {
330
+ flex: 1;
331
+ min-width: 0;
332
+ width: 100%;
333
+ height: 26px;
334
+ padding: 3px 5px;
335
+ border: 1px solid var(--accent);
336
+ border-radius: 4px;
337
+ background: var(--bg);
338
+ color: var(--text);
339
+ font: inherit;
340
+ font-size: 12px;
341
+ }
342
+ .split-view-group-error { padding: 3px 7px; font-size: 10px; color: var(--brand-gold); }
343
+ .split-view-arrange {
344
+ position: fixed;
345
+ z-index: 55;
346
+ padding: 5px;
347
+ border: 1px solid var(--border);
348
+ border-radius: 8px;
349
+ background: var(--bg-alt);
350
+ color: var(--text-secondary);
351
+ box-shadow: 0 7px 24px rgba(0, 0, 0, .18);
352
+ }
353
+ .split-view-arrange { width: min(280px, calc(100vw - 16px)); max-height: calc(100dvh - 16px); overflow-y: auto; }
354
+ .split-view-arrange-header { display: flex; align-items: center; gap: 6px; padding: 5px 6px 8px; font-size: 12px; }
355
+ .split-view-arrange-header strong { flex: 1; min-width: 0; }
356
+ .split-view-arrange-grid { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 3px; }
357
+ .split-view-arrange-grid button { min-height: 38px; font-size: 10px; padding: 5px; }
358
+ .split-view-arrange-grid button[data-preset], .split-view-arrange-grid button[data-position] {
359
+ display: flex;
360
+ flex-direction: column;
361
+ align-items: center;
362
+ justify-content: center;
363
+ gap: 5px;
364
+ min-height: 60px;
365
+ padding: 7px 3px;
366
+ }
367
+ .split-view-layout-icon { display: block; width: 36px; height: 24px; flex: 0 0 24px; }
368
+ .split-view-layout-icon rect { fill: var(--bg); stroke: var(--text-dimmer); stroke-width: 1; }
369
+ .split-view-layout-icon .split-view-layout-selected { fill: var(--accent-bg); stroke: var(--accent); }
370
+ .split-view-layout-label { line-height: 1.2; font-size: 10px; white-space: nowrap; }
371
+ .split-view-arrange button:disabled .split-view-layout-icon { opacity: .55; }
372
+ .split-view-arrange button[aria-pressed="true"] { background: var(--accent-bg); color: var(--accent); }
373
+ .split-view-drop-preview {
374
+ position: absolute;
375
+ z-index: 40;
376
+ pointer-events: none;
377
+ display: grid;
378
+ place-items: center;
379
+ border: 1px solid var(--accent);
380
+ border-radius: 8px;
381
+ background: var(--accent-bg);
382
+ color: var(--text);
383
+ font-size: 12px;
384
+ }
385
+ .split-view-drop-preview[data-blocked="true"] { border-color: var(--brand-gold); }
386
+ [data-split-view-drop="ready"] { outline: 1px solid var(--accent); outline-offset: -1px; background: var(--accent-bg); border-radius: 5px; }
387
+ [data-split-view-drop="blocked"] { outline: 1px solid var(--brand-gold); outline-offset: -1px; border-radius: 5px; }
388
+ .split-view-drag-ghost { position: fixed; z-index: 70; pointer-events: none; max-width: 230px; padding: 6px 9px; border: 1px solid var(--border); border-radius: 6px; background: var(--bg-alt); font-size: 11px; }
389
+ .split-view-worker-popover {
390
+ position: fixed;
391
+ z-index: 45;
392
+ display: flex;
393
+ flex-direction: column;
394
+ width: min(430px, calc(100vw - 20px));
395
+ height: min(440px, calc(100dvh - 24px));
396
+ overflow: hidden;
397
+ border: 1px solid var(--border);
398
+ border-radius: 10px;
399
+ background: var(--bg);
400
+ color: var(--text-secondary);
401
+ box-shadow: 0 10px 26px rgba(0, 0, 0, .22);
402
+ }
403
+ .split-view-worker-popover-header { display: flex; align-items: center; gap: 7px; min-height: 39px; padding: 7px 11px; }
404
+ .split-view-worker-popover-header strong { flex: 1; min-width: 0; font-size: 12px; }
405
+ .split-view-worker-popover-source { padding: 0 13px 10px; color: var(--text-dimmer); font-size: 10px; }
406
+ .split-view-worker-popover-body { flex: 1; min-height: 0; overflow: auto; padding: 14px; }
407
+ .split-view-worker-popover-body .message { display: block; margin: 0 0 18px; padding: 0; max-width: none; }
408
+ .split-view-worker-popover-body .author { display: block; margin-bottom: 4px; font-size: 11px; color: var(--text-muted); }
409
+ .split-view-worker-popover-body .message-body { white-space: normal; overflow-wrap: anywhere; font-size: 12px; line-height: 1.65; }
410
+ .split-view-worker-popover-body .message-body pre { white-space: pre-wrap; }
411
+ .split-view-worker-popover-body .worker-tool-message summary { cursor: pointer; font-size: 11px; }
412
+ .split-view-worker-popover-body .worker-tool-message { padding: 6px 8px; border-radius: 5px; background: var(--bg-alt); }
413
+ .split-view-worker-popover-footer { padding: 8px 13px; border-top: 1px solid var(--border-subtle); color: var(--text-dimmer); font-size: 10px; }
414
+ .split-view-worker-page-status { display: block; margin-top: 3px; line-height: 1.4; }
415
+ .split-view-worker-popover-footer button { margin-left: 8px; padding: 4px 6px; font-size: 10px; }
416
+ .split-view-worker-popover[hidden], .split-view-menu[hidden], .split-view-arrange[hidden], .split-view-workers[hidden], .split-view-drop-preview[hidden], .split-view-drag-ghost[hidden] { display: none; }
417
+ @media (prefers-reduced-motion: reduce) { .split-view-worker-dot[data-state="working"] { animation: none; } }
418
+ @media (pointer: coarse) { .split-view-worker-chip { min-height: 30px; } .split-view-divider { flex-basis: 10px; } }
419
+
420
+ /* Keep iframe nodes mounted while tree geometry changes around them. */
421
+ #split-host.split-view-canvas[data-positioned="true"].visible { display: block; }
422
+ .split-view-canvas[data-positioned="true"] > .split-pane {
423
+ position: absolute;
424
+ box-sizing: border-box;
425
+ margin: 0;
426
+ }
427
+ .split-view-canvas[data-positioned="true"] > .split-view-divider {
428
+ position: absolute;
429
+ z-index: 3;
430
+ }
431
+ .split-view-worker-popover-body:focus-visible { outline: 1px solid var(--accent); outline-offset: -3px; }
432
+ .split-view-canvas > .split-pane[hidden] { display: none; }
433
+ #split-host.split-view-canvas[data-preview-only="true"].visible {
434
+ position: absolute;
435
+ inset: 0;
436
+ z-index: 40;
437
+ pointer-events: none;
438
+ background: transparent;
439
+ }
440
+ .split-view-divider[data-axis="vertical"] { cursor: row-resize; }
441
+ .split-view-divider[data-axis="vertical"]::after { inset: 3px calc(50% - 16px); }
442
+ .split-view-arrange-context { padding: 0 4px 7px; }
443
+ .split-view-arrange [data-arrange-context] {
444
+ display: flex;
445
+ align-items: center;
446
+ width: 100%;
447
+ min-width: 0;
448
+ height: 29px;
449
+ padding: 4px 7px;
450
+ border: 1px solid var(--border);
451
+ border-radius: 5px;
452
+ background: var(--bg);
453
+ font-size: 11px;
454
+ text-align: left;
455
+ }
456
+ .split-view-arrange [data-arrange-context-title] { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
457
+ #split-view-arrange-context-list { max-height: 180px; overflow-y: auto; padding: 3px 0; }
458
+ #split-view-arrange-context-list button { display: block; width: 100%; min-height: 28px; padding: 5px 7px; text-align: left; font-size: 11px; }
459
+ #split-view-arrange-context-list [aria-selected="true"] { background: var(--accent-bg); color: var(--accent); }
460
+ .split-view-arrange [data-focus-layout] { width: 100%; min-height: 29px; margin-top: 5px; border-top: 1px solid var(--border-subtle); font-size: 11px; }
461
+
462
+ /* Light reflects received WebSocket output, independent of processing state. */
463
+ .split-view-worker-dot.io { background: var(--brand-green); box-shadow: 0 0 5px var(--brand-green); }
@@ -0,0 +1,97 @@
1
+ /* Compact recorded activity, adapted from the former Ask Clay transcript. */
2
+ .split-view-worker-popover .worker-activity-group {
3
+ min-width: 0;
4
+ margin: 8px 0 14px;
5
+ padding: 0;
6
+ border: 0;
7
+ border-radius: 0;
8
+ background: transparent;
9
+ }
10
+ .split-view-worker-popover .worker-activity-summary {
11
+ display: flex;
12
+ align-items: center;
13
+ gap: 6px;
14
+ width: 100%;
15
+ min-height: 24px;
16
+ padding: 0;
17
+ border: 0;
18
+ border-radius: 3px;
19
+ background: transparent;
20
+ color: var(--text-muted);
21
+ font: inherit;
22
+ font-size: 11px;
23
+ line-height: 1.5;
24
+ text-align: left;
25
+ list-style: none;
26
+ cursor: pointer;
27
+ }
28
+ .worker-activity-summary::-webkit-details-marker { display: none; }
29
+ .worker-activity-summary > svg { width: 13px; height: 13px; flex-shrink: 0; }
30
+ .worker-activity-summary > svg:first-child { color: var(--accent); }
31
+ .worker-activity-heading { font-weight: 600; }
32
+ .worker-activity-count { font-weight: 400; }
33
+ .worker-activity-summary > .worker-activity-chevron { margin-left: auto; transition: transform .14s ease; }
34
+ .worker-activity-summary[aria-expanded="true"] > .worker-activity-chevron { transform: rotate(180deg); }
35
+ .split-view-worker-popover .worker-activity-summary:disabled { cursor: default; }
36
+ .worker-activity-summary:disabled > .worker-activity-chevron { visibility: hidden; }
37
+ .worker-activity-summary strong { font-weight: 600; }
38
+ .worker-activity-summary small, .worker-activity-count { color: var(--text-dimmer); font-size: 10px; }
39
+ .split-view-worker-popover .worker-activity-summary:hover { background: transparent; color: var(--text); }
40
+ .worker-activity-summary:focus-visible, .worker-activity-evidence > summary:focus-visible {
41
+ outline: 2px solid var(--accent);
42
+ outline-offset: 2px;
43
+ }
44
+ .worker-activity-list { display: flex; flex-direction: column; gap: 3px; min-width: 0; padding-top: 3px; }
45
+ .split-view-worker-popover-body .worker-activity-item.worker-tool-message {
46
+ display: grid;
47
+ grid-template-columns: minmax(0, 1fr) auto;
48
+ align-items: start;
49
+ gap: 0 6px;
50
+ min-width: 0;
51
+ margin: 0;
52
+ padding: 2px 0;
53
+ border-radius: 0;
54
+ background: transparent;
55
+ color: var(--text-muted);
56
+ }
57
+ .split-view-worker-popover-body .worker-activity-item[hidden] { display: none; }
58
+ .worker-activity-row { display: flex; flex-wrap: wrap; align-items: baseline; gap: 0 6px; min-width: 0; min-height: 21px; }
59
+ .worker-activity-row > svg { align-self: flex-start; flex: 0 0 13px; width: 13px; height: 13px; margin-top: 3px; stroke-width: 1.8; }
60
+ .worker-activity-row > .worker-activity-status:last-child { flex-basis: 11px; width: 11px; height: 11px; margin-left: auto; }
61
+ .worker-activity-label { min-width: 0; font-size: 11px; font-weight: 500; line-height: 1.5; overflow-wrap: anywhere; }
62
+ .worker-activity-detail { min-width: 0; color: var(--text-dimmer); font-size: 10px; line-height: 1.5; overflow-wrap: anywhere; }
63
+ .worker-activity-item[data-phase="failed"] .worker-activity-row > svg { color: var(--error); }
64
+ .worker-activity-item[data-phase="returned"] .worker-activity-row > svg { color: var(--success); }
65
+ .worker-activity-evidence { min-width: 0; margin: 0; }
66
+ .worker-activity-evidence[open] { grid-column: 1 / -1; margin-left: 19px; }
67
+ .worker-activity-evidence > summary {
68
+ width: fit-content;
69
+ min-height: 20px;
70
+ color: var(--text-dimmer);
71
+ font-size: 10px;
72
+ line-height: 1.6;
73
+ cursor: pointer;
74
+ }
75
+ .worker-activity-evidence[open] > summary { color: var(--text-muted); }
76
+ .worker-activity-evidence pre {
77
+ max-height: 240px;
78
+ margin: 5px 0 7px;
79
+ padding: 7px 8px;
80
+ overflow: auto;
81
+ overscroll-behavior: contain;
82
+ border: 1px solid var(--border-subtle);
83
+ border-radius: 5px;
84
+ background: var(--bg-alt);
85
+ color: var(--text-secondary);
86
+ font-size: 11px;
87
+ line-height: 1.5;
88
+ white-space: pre-wrap;
89
+ overflow-wrap: anywhere;
90
+ }
91
+ @media (pointer: coarse) {
92
+ .split-view-worker-popover .worker-activity-summary,
93
+ .worker-activity-evidence > summary { min-height: 32px; }
94
+ }
95
+ @media (prefers-reduced-motion: reduce) {
96
+ .worker-activity-summary > .worker-activity-chevron { transition: none; }
97
+ }
@@ -39,6 +39,19 @@
39
39
  }
40
40
 
41
41
  #sticky-notes-toggle-btn .lucide { width: 15px; height: 15px; }
42
+ #sticky-notes-toggle-btn[hidden] { display: none !important; }
43
+ #sticky-notes-toggle-btn[aria-pressed="false"]::after {
44
+ content: "";
45
+ position: absolute;
46
+ top: 50%;
47
+ left: 50%;
48
+ width: 18px;
49
+ height: 1.5px;
50
+ border-radius: 1px;
51
+ background: currentColor;
52
+ transform: translate(-50%, -50%) rotate(45deg);
53
+ pointer-events: none;
54
+ }
42
55
  #sticky-notes-toggle-btn:hover { color: var(--text-secondary); background: rgba(var(--overlay-rgb),0.04); border-color: var(--border); }
43
56
  #sticky-notes-toggle-btn.active { color: var(--text); background: rgba(var(--overlay-rgb),0.06); border-color: var(--border); }
44
57
 
@@ -72,7 +72,7 @@ body { background: transparent; color: inherit; }
72
72
  </div>
73
73
  </div>
74
74
  </div>
75
- <button id="cmd-palette-btn" class="cmd-palette-searchbar" title="Search or ask Clay" aria-label="Search or ask Clay"><i data-lucide="search" aria-hidden="true"></i><span class="cmd-palette-searchbar-text">Search or ask Clay</span><kbd class="cmd-palette-searchbar-kbd"></kbd></button>
75
+ <button id="cmd-palette-btn" class="cmd-palette-searchbar" data-tip="Search conversations across all vendors.&#10;Ask Clay to find past work, reviews, decisions, and unfinished sessions." data-tip-suppress-when-open=".cmd-palette" aria-label="Search or ask Clay"><i data-lucide="search" aria-hidden="true"></i><span class="cmd-palette-searchbar-text">Search or ask Clay, like “What was I working on recently?”</span><kbd class="cmd-palette-searchbar-kbd"></kbd></button>
76
76
  <div class="top-bar-actions">
77
77
  <!-- Pill badges -->
78
78
  <div id="skip-perms-pill" class="top-bar-pill pill-error hidden"><i data-lucide="shield-off"></i> <span>Skip perms</span></div>
@@ -80,7 +80,7 @@ body { background: transparent; color: inherit; }
80
80
  <!-- Right workbench controls: same nodes and handlers as before; app JS returns them to the title bar on mobile. -->
81
81
  <button type="button" id="shared-browser-toggle-btn" class="hidden" title="Browser" aria-label="Browser" aria-controls="shared-browser-panel" aria-expanded="false" disabled><i data-lucide="globe"></i></button>
82
82
  <button id="terminal-toggle-btn" title="Terminal"><i data-lucide="square-terminal"></i><span id="terminal-count" class="hidden"></span></button>
83
- <button type="button" id="sticky-notes-toggle-btn" aria-label="Hide sticky notes" aria-pressed="false" title="Hide sticky notes"><i data-lucide="eye-off"></i></button>
83
+ <button type="button" id="sticky-notes-toggle-btn" aria-label="Hide sticky notes" aria-pressed="false" title="Hide sticky notes" hidden><i data-lucide="sticky-note"></i></button>
84
84
  <button id="notif-center-btn" title="Notifications"><i data-lucide="bell"></i><span id="notif-center-badge" class="notif-badge hidden">0</span></button>
85
85
  <button id="server-settings-btn" title="Settings" aria-label="Settings" aria-expanded="false"><i data-lucide="settings"></i></button>
86
86
  </div>
@@ -309,7 +309,7 @@ body { background: transparent; color: inherit; }
309
309
  <div class="session-permission-segmented">
310
310
  <button type="button" data-permission-mode="default" aria-label="Ask permissions" title="Ask permissions"><span class="permission-label">Ask</span><span class="permission-spinner" aria-hidden="true"></span></button>
311
311
  <button type="button" data-permission-mode="auto" aria-label="Auto permissions" title="Auto permissions"><span class="permission-label">Auto</span><span class="permission-spinner" aria-hidden="true"></span></button>
312
- <button type="button" data-permission-mode="bypassPermissions" aria-label="Skip permissions" title="Skip permissions"><span class="permission-label">Skip</span><span class="permission-spinner" aria-hidden="true"></span></button>
312
+ <button type="button" data-permission-mode="bypassPermissions" aria-label="YOLO permissions" title="YOLO permissions"><span class="permission-label">YOLO</span><span class="permission-spinner" aria-hidden="true"></span></button>
313
313
  </div>
314
314
  <span class="session-permission-status hidden" aria-live="polite"></span>
315
315
  </div>
@@ -345,7 +345,9 @@ export function connect() {
345
345
  var protocol = location.protocol === "https:" ? "wss:" : "ws:";
346
346
  var socketPath = store.get('wsPath');
347
347
  if (store.get('socketPath') && store.get('socketPath') !== socketPath) clearProjectSplitState();
348
- store.set({ socketPath: socketPath, activeProjectSlug: null, sessionActivatedProjectSlug: null, sessionListProjectSlug: null, splitGroupsProjectSlug: null });
348
+ store.set({ socketPath: socketPath, activeProjectSlug: null, sessionActivatedProjectSlug: null, sessionListProjectSlug: null, splitGroupsProjectSlug: null,
349
+ projectSplitViewSocketGeneration: (store.get('projectSplitViewSocketGeneration') || 0) + 1 });
350
+ if (store.get("paneMode") && typeof performance !== "undefined" && performance.mark) { performance.clearMarks("clay:socket-created"); performance.mark("clay:socket-created"); }
349
351
  var newWs = new WebSocket(protocol + "//" + location.host + socketPath);
350
352
  setWs(newWs);
351
353
  attemptSocket = newWs;
@@ -356,6 +358,7 @@ export function connect() {
356
358
  if (hasConnectedOnce && disconnectedAt) {
357
359
  console.log("[clay] WebSocket reconnected after " + (Date.now() - disconnectedAt) + "ms");
358
360
  }
361
+ if (store.get("paneMode") && typeof performance !== "undefined" && performance.mark) { performance.clearMarks("clay:socket-open"); performance.mark("clay:socket-open"); }
359
362
  disconnectedAt = 0;
360
363
  newWs.send(JSON.stringify({ type: "clay_ui_ready", version: 1 }));
361
364
  setStatus("connected");
@@ -139,7 +139,7 @@ export function blinkIO() {
139
139
 
140
140
  export function blinkSessionDot(sessionId) {
141
141
  // A favorite is on screen twice; blink every copy.
142
- var els = document.querySelectorAll('.session-item[data-session-id="' + sessionId + '"] .session-processing');
142
+ var els = document.querySelectorAll('.session-item[data-session-id="' + sessionId + '"] .session-processing, .split-view-worker-chip[data-worker-session-id="' + sessionId + '"] .split-view-worker-dot');
143
143
  if (!els.length) return;
144
144
  for (var i = 0; i < els.length; i++) els[i].classList.add("io");
145
145
  clearTimeout(sessionIoTimers[sessionId]);