clay-server 5.3.0-beta.5 → 5.3.0-beta.7

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 (185) hide show
  1. package/lib/clay-product-control-tools.js +2 -2
  2. package/lib/clay-product-control.js +1 -1
  3. package/lib/clay-screen-controls.js +1 -0
  4. package/lib/clay-split-view-awareness.js +5 -2
  5. package/lib/clay-split-view-controls.js +14 -7
  6. package/lib/clay-split-view-input.js +5 -4
  7. package/lib/clay-split-view-render-proof.js +14 -4
  8. package/lib/clay-view-workspace-input.js +71 -0
  9. package/lib/project-admin-overview.js +22 -11
  10. package/lib/project-background-tasks.js +76 -0
  11. package/lib/project-connection.js +1 -1
  12. package/lib/project-file-history.js +11 -9
  13. package/lib/project-file-watch.js +26 -7
  14. package/lib/project-filesystem.js +5 -4
  15. package/lib/project-sessions.js +12 -5
  16. package/lib/project-shared-browser.js +7 -3
  17. package/lib/project-split-view-document.js +16 -2
  18. package/lib/project-split-views.js +27 -297
  19. package/lib/project-user-message.js +4 -3
  20. package/lib/project-vendor-login.js +2 -2
  21. package/lib/project-view-input.js +11 -0
  22. package/lib/project-view-pair.js +26 -0
  23. package/lib/project-view-store.js +348 -0
  24. package/lib/project-view-terminal-binding.js +16 -0
  25. package/lib/project-view-workspace.js +126 -0
  26. package/lib/project-worker-conversation.js +5 -0
  27. package/lib/project.js +1 -0
  28. package/lib/public/app.js +9 -0
  29. package/lib/public/css/contextual-clay.css +2 -1
  30. package/lib/public/css/issues.css +3 -0
  31. package/lib/public/css/mate-conversation.css +1 -1
  32. package/lib/public/css/pane.css +5 -1
  33. package/lib/public/css/pending-message-queue.css +24 -19
  34. package/lib/public/css/project-admin-overview.css +42 -13
  35. package/lib/public/css/right-workbench.css +0 -1
  36. package/lib/public/css/scheduled-tasks.css +7 -0
  37. package/lib/public/css/shared-browser.css +31 -8
  38. package/lib/public/css/split-view-layout.css +129 -10
  39. package/lib/public/css/tool-pane.css +124 -0
  40. package/lib/public/index.html +6 -6
  41. package/lib/public/modules/agent-message-bubbles.js +96 -0
  42. package/lib/public/modules/app-header.js +6 -0
  43. package/lib/public/modules/app-messages.js +26 -9
  44. package/lib/public/modules/background-task-previews.js +8 -0
  45. package/lib/public/modules/background-task-viewer.js +97 -0
  46. package/lib/public/modules/background-tasks-ui.js +34 -125
  47. package/lib/public/modules/chat-bubble-renderer.js +11 -5
  48. package/lib/public/modules/clay-file-links.js +2 -1
  49. package/lib/public/modules/clay-split-view-screen.js +6 -3
  50. package/lib/public/modules/clay-tool-pane-screen.js +35 -0
  51. package/lib/public/modules/contextual-clay-geometry.js +7 -3
  52. package/lib/public/modules/file-history-snapshot.js +12 -0
  53. package/lib/public/modules/file-pane-entrypoints.js +55 -0
  54. package/lib/public/modules/file-pane-history.js +78 -0
  55. package/lib/public/modules/file-pane-instances.js +140 -0
  56. package/lib/public/modules/file-pane-links.js +41 -0
  57. package/lib/public/modules/file-pane-render.js +48 -0
  58. package/lib/public/modules/file-pane-review.js +26 -0
  59. package/lib/public/modules/file-pane-toolbar.js +54 -0
  60. package/lib/public/modules/file-viewer-source.js +70 -0
  61. package/lib/public/modules/filebrowser.js +43 -82
  62. package/lib/public/modules/git-panel.js +5 -0
  63. package/lib/public/modules/issues.js +3 -4
  64. package/lib/public/modules/linear-panel.js +2 -2
  65. package/lib/public/modules/mate-knowledge-workbench.js +10 -6
  66. package/lib/public/modules/notifications.js +4 -1
  67. package/lib/public/modules/pane-activation.js +7 -3
  68. package/lib/public/modules/pane-binding.js +5 -1
  69. package/lib/public/modules/pane-browser-bridge.js +6 -2
  70. package/lib/public/modules/pane-browser-transport.js +110 -0
  71. package/lib/public/modules/pane-header-tooltips.js +32 -0
  72. package/lib/public/modules/pending-message-queue-drag.js +69 -0
  73. package/lib/public/modules/pending-message-queue.js +3 -33
  74. package/lib/public/modules/permission-control.js +6 -5
  75. package/lib/public/modules/plantuml-preview.js +12 -12
  76. package/lib/public/modules/project-admin-overview.js +125 -10
  77. package/lib/public/modules/project-grouping.js +9 -0
  78. package/lib/public/modules/right-workbench.js +34 -15
  79. package/lib/public/modules/scheduled-tasks.js +7 -6
  80. package/lib/public/modules/server-settings-controls.js +33 -4
  81. package/lib/public/modules/session-folder-toolbar.js +1 -1
  82. package/lib/public/modules/session-tool-item.js +86 -0
  83. package/lib/public/modules/settings-select.js +2 -1
  84. package/lib/public/modules/shared-browser-tabs.js +37 -21
  85. package/lib/public/modules/shared-browser.js +69 -9
  86. package/lib/public/modules/sidebar-projects.js +1 -10
  87. package/lib/public/modules/split-pane-renderer.js +1 -0
  88. package/lib/public/modules/split-session-empty-pane.js +47 -0
  89. package/lib/public/modules/split-view-create-menu.js +74 -65
  90. package/lib/public/modules/split-view-drag-preview.js +90 -0
  91. package/lib/public/modules/split-view-layout-client.js +1 -1
  92. package/lib/public/modules/split-view-layout-scope.js +4 -0
  93. package/lib/public/modules/split-view-picker-actions.js +71 -0
  94. package/lib/public/modules/split-view-picker-render.js +81 -0
  95. package/lib/public/modules/split-view-presentation-drag.js +36 -13
  96. package/lib/public/modules/split-view-presentation-drop.js +21 -18
  97. package/lib/public/modules/split-view-presentation-renderer.js +22 -17
  98. package/lib/public/modules/split-view-presentations.js +25 -33
  99. package/lib/public/modules/split-view-worker-activity.js +2 -2
  100. package/lib/public/modules/split-view-worker-transcript.js +70 -33
  101. package/lib/public/modules/split-view-workers.js +6 -4
  102. package/lib/public/modules/split-view.js +9 -2
  103. package/lib/public/modules/sticky-notes-browser.js +2 -2
  104. package/lib/public/modules/terminal-viewport.js +14 -0
  105. package/lib/public/modules/terminal.js +49 -23
  106. package/lib/public/modules/theme-palette.js +177 -0
  107. package/lib/public/modules/theme.js +2 -180
  108. package/lib/public/modules/tool-pane-chrome.js +88 -0
  109. package/lib/public/modules/tool-pane-drag.js +134 -0
  110. package/lib/public/modules/tool-pane-layout.js +95 -0
  111. package/lib/public/modules/tool-pane-legacy.js +60 -0
  112. package/lib/public/modules/tool-pane-tree.js +51 -0
  113. package/lib/public/modules/tools.js +5 -89
  114. package/lib/public/modules/tooltip.js +32 -6
  115. package/lib/public/modules/view-legacy-coordinates.js +16 -0
  116. package/lib/public/modules/view-mutations.js +24 -0
  117. package/lib/public/modules/view-pair-presentation.js +74 -0
  118. package/lib/public/modules/view-pair-validation.js +12 -0
  119. package/lib/public/modules/view-presentation-state.js +37 -0
  120. package/lib/public/modules/view-workspace-controller.js +210 -0
  121. package/lib/public/modules/view-workspace-state.js +103 -0
  122. package/lib/public/modules/view-workspace-validation.js +47 -0
  123. package/lib/public/modules/wireframe-workbench.js +13 -2
  124. package/lib/public/modules/workbench-layout-preference.js +12 -5
  125. package/lib/public/modules/workbench-panels.js +21 -0
  126. package/lib/public/modules/worker-message-previews.js +39 -0
  127. package/lib/public/pane-assets/app-5W6KJXK5.js +1 -0
  128. package/lib/public/pane-assets/chunk-2IJUTAB6.js +2 -0
  129. package/lib/public/pane-assets/chunk-6QFLYOVY.js +1 -0
  130. package/lib/public/pane-assets/chunk-7OVNC5HT.js +1 -0
  131. package/lib/public/pane-assets/chunk-BQN7B62H.js +3 -0
  132. package/lib/public/pane-assets/chunk-EMLN2Y7L.js +1 -0
  133. package/lib/public/pane-assets/chunk-ENPAHXLB.js +1 -0
  134. package/lib/public/pane-assets/chunk-EPBGGZRT.js +1 -0
  135. package/lib/public/pane-assets/chunk-EYTE56IA.js +1 -0
  136. package/lib/public/pane-assets/chunk-FQTNR4ZS.js +1 -0
  137. package/lib/public/pane-assets/chunk-JIV7O5GN.js +1 -0
  138. package/lib/public/pane-assets/chunk-L6LSA5WI.js +1 -0
  139. package/lib/public/pane-assets/chunk-M57UIGZV.js +1 -0
  140. package/lib/public/pane-assets/chunk-MGTFTEJP.js +1 -0
  141. package/lib/public/pane-assets/chunk-MMG6MYCN.js +1 -0
  142. package/lib/public/pane-assets/chunk-MZLMEXMW.js +1 -0
  143. package/lib/public/pane-assets/chunk-OG3E5SVA.js +166 -0
  144. package/lib/public/pane-assets/chunk-R7QVVFUG.js +1 -0
  145. package/lib/public/pane-assets/chunk-RGAFZ3T2.js +1 -0
  146. package/lib/public/pane-assets/chunk-RNDRURMF.js +1 -0
  147. package/lib/public/pane-assets/chunk-SJOT74VW.js +2 -0
  148. package/lib/public/pane-assets/chunk-SJTGHIN5.js +1 -0
  149. package/lib/public/pane-assets/chunk-SLMAFKI2.js +1 -0
  150. package/lib/public/pane-assets/chunk-U3I5KY3B.js +1 -0
  151. package/lib/public/pane-assets/chunk-UPXU2IPC.js +1 -0
  152. package/lib/public/pane-assets/chunk-VEBYD7TL.js +1 -0
  153. package/lib/public/pane-assets/chunk-VZ2OKDAO.js +1 -0
  154. package/lib/public/pane-assets/chunk-XBHYNXXT.js +1 -0
  155. package/lib/public/pane-assets/manifest.json +438 -381
  156. package/lib/public/pane-assets/style-BSKKK54Q.css +1 -0
  157. package/lib/public/style.css +1 -0
  158. package/lib/sdk-message-processor.js +5 -2
  159. package/lib/server-storage.js +27 -3
  160. package/lib/server-workbench-layout-settings.js +3 -3
  161. package/lib/server.js +4 -2
  162. package/lib/sessions.js +1 -1
  163. package/lib/split-view-layout.js +11 -7
  164. package/lib/storage-usage.js +29 -7
  165. package/lib/terminal-manager.js +2 -2
  166. package/lib/users-workbench-layout-preferences.js +14 -4
  167. package/lib/workbench-window-layout.js +30 -0
  168. package/lib/worker-message-previews.js +50 -0
  169. package/lib/ws-schema.js +1 -1
  170. package/lib/yoke/adapters/claude-worker.js +8 -0
  171. package/lib/yoke/adapters/claude.js +17 -2
  172. package/lib/yoke/claude-task-reader.js +94 -0
  173. package/lib/yoke/interface.js +1 -0
  174. package/package.json +1 -1
  175. package/lib/public/pane-assets/app-6H5S2Y3Z.js +0 -1
  176. package/lib/public/pane-assets/chunk-3QV5SDC4.js +0 -1
  177. package/lib/public/pane-assets/chunk-4FM3U3DW.js +0 -1
  178. package/lib/public/pane-assets/chunk-7GZH3FZY.js +0 -1
  179. package/lib/public/pane-assets/chunk-AGJTF5WQ.js +0 -1
  180. package/lib/public/pane-assets/chunk-DGOFGEUK.js +0 -1
  181. package/lib/public/pane-assets/chunk-I57URYSL.js +0 -1
  182. package/lib/public/pane-assets/chunk-NPKRTUNG.js +0 -2
  183. package/lib/public/pane-assets/chunk-VGA2Y3D2.js +0 -2
  184. package/lib/public/pane-assets/chunk-WKO3T75E.js +0 -167
  185. package/lib/public/pane-assets/style-TSRDU54Z.css +0 -1
@@ -1,10 +1,9 @@
1
1
  #pending-message-queue {
2
2
  margin: 0 7px 8px;
3
- padding: 8px;
4
- border: 1px solid color-mix(in srgb, var(--border) 82%, var(--accent));
5
- border-radius: 13px;
6
- background: color-mix(in srgb, var(--bg-alt) 74%, transparent);
7
- box-shadow: inset 3px 0 0 color-mix(in srgb, var(--accent) 70%, transparent);
3
+ padding: 4px;
4
+ border: 1px solid var(--border);
5
+ border-radius: 8px;
6
+ background: var(--bg-alt);
8
7
  }
9
8
 
10
9
  #pending-message-queue.hidden { display: none; }
@@ -14,15 +13,14 @@
14
13
  align-items: center;
15
14
  justify-content: space-between;
16
15
  min-height: 24px;
17
- padding: 0 3px 6px 8px;
16
+ padding: 0 5px 2px 8px;
18
17
  }
19
18
 
20
19
  .pending-message-eyebrow {
21
20
  color: var(--text-muted);
22
21
  font-size: 10px;
23
- font-weight: 700;
24
- letter-spacing: 0.11em;
25
- text-transform: uppercase;
22
+ font-weight: 550;
23
+ letter-spacing: 0.01em;
26
24
  }
27
25
 
28
26
  .pending-message-count {
@@ -62,7 +60,7 @@
62
60
  .pending-message-list {
63
61
  display: flex;
64
62
  flex-direction: column;
65
- gap: 5px;
63
+ gap: 0;
66
64
  max-height: min(230px, 28vh);
67
65
  overflow-y: auto;
68
66
  overscroll-behavior: contain;
@@ -71,27 +69,30 @@
71
69
 
72
70
  .pending-message-chip {
73
71
  display: grid;
74
- grid-template-columns: 22px 24px minmax(0, 1fr) auto;
72
+ grid-template-columns: 16px 24px minmax(0, 1fr) auto;
75
73
  align-items: center;
76
74
  flex: 0 0 auto;
77
75
  min-height: 46px;
78
- border: 1px solid var(--border-subtle);
79
- border-radius: 10px;
80
- background: color-mix(in srgb, var(--bg) 90%, var(--bg-alt));
76
+ position: relative;
77
+ border: 1px solid transparent;
78
+ border-radius: 5px;
79
+ background: transparent;
81
80
  transition: border-color 120ms ease, background 120ms ease, transform 120ms ease;
82
81
  }
83
82
 
84
- .pending-message-chip:hover { border-color: var(--border); }
83
+ .pending-message-chip + .pending-message-chip { border-top-color: var(--border-subtle); }
84
+ .pending-message-chip:hover { background: rgba(var(--overlay-rgb), 0.035); }
85
85
  .pending-message-chip.is-claimed { background: color-mix(in srgb, var(--accent) 5%, var(--bg)); }
86
86
  .pending-message-chip.is-dragging { opacity: 0.62; transform: scale(0.992); }
87
- .pending-message-chip.is-drop-target { border-color: var(--accent); background: color-mix(in srgb, var(--accent) 8%, var(--bg)); }
87
+ .pending-message-chip.is-drop-target::before { content: ""; position: absolute; top: -1px; left: 4px; right: 4px; height: 2px; border-radius: 2px; background: var(--accent); }
88
+ .pending-message-chip.is-drop-target.is-drop-after::before { top: auto; bottom: -1px; }
89
+ #pending-message-queue.is-reordering { cursor: grabbing; user-select: none; }
88
90
 
89
91
  .pending-message-number {
90
92
  align-self: stretch;
91
93
  display: flex;
92
94
  align-items: center;
93
95
  justify-content: center;
94
- border-right: 1px solid var(--border-subtle);
95
96
  color: var(--text-dimmer);
96
97
  font-size: 10px;
97
98
  font-variant-numeric: tabular-nums;
@@ -119,6 +120,10 @@ button.pending-message-drag:active { cursor: grabbing; }
119
120
  .pending-message-chip.is-claimed .pending-message-drag .lucide { animation: spin 1.2s linear infinite; }
120
121
 
121
122
  .pending-message-content { min-width: 0; padding: 7px 7px 7px 3px; overflow: visible; }
123
+ .pending-message-content:has(> .pending-message-image-strip) { display: grid; grid-template-columns: auto minmax(0, 1fr); column-gap: 9px; align-items: center; }
124
+ .pending-message-content > .pending-message-image-strip { grid-column: 1; grid-row: 1 / 4; margin: 0; min-height: 0; max-width: 86px; flex-wrap: nowrap; overflow-x: auto; }
125
+ .pending-message-content:has(> .pending-message-image-strip) > :not(.pending-message-image-strip) { grid-column: 2; }
126
+ .pending-message-content > .pending-message-image-strip .pending-message-image-thumb { width: 30px; height: 30px; flex: 0 0 30px; }
122
127
  .pending-message-preview { overflow: hidden; color: var(--text); font-size: 12px; line-height: 1.3; text-overflow: ellipsis; white-space: nowrap; }
123
128
  .pending-message-image-strip,
124
129
  .pending-message-image-editor { display: flex; flex-wrap: wrap; gap: 5px; min-height: 36px; margin-top: 6px; align-items: center; }
@@ -179,10 +184,10 @@ button.pending-message-drag:active { cursor: grabbing; }
179
184
  .pending-message-edit-actions button:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
180
185
 
181
186
  @media (max-width: 600px) {
182
- #pending-message-queue { margin: 0 3px 6px; padding: 6px; border-radius: 12px; }
187
+ #pending-message-queue { margin: 0 3px 6px; padding: 4px; border-radius: 8px; }
183
188
  .pending-message-head { padding-left: 6px; }
184
189
  .pending-message-list { max-height: min(196px, 24vh); }
185
- .pending-message-chip { grid-template-columns: 20px 28px minmax(0, 1fr) auto; min-height: 44px; }
190
+ .pending-message-chip { grid-template-columns: 16px 28px minmax(0, 1fr) auto; min-height: 44px; }
186
191
  .pending-message-drag { width: 28px; height: 34px; }
187
192
  .pending-message-actions button { width: 30px; height: 34px; }
188
193
  .pending-message-meta { gap: 5px; }
@@ -1,13 +1,42 @@
1
- .project-admin-overview { overflow: auto; padding: 8px; }
2
- .project-admin-canvas { width: 100%; min-height: 100%; padding: 24px; border: 1px solid var(--border); border-radius: 8px; background: var(--bg); }
3
- .project-admin-canvas h1 { font-size: 20px; margin: 0 0 16px; }
4
- .project-admin-canvas h2 { font-size: 16px; }
5
- .project-admin-canvas [role="tablist"] { display: flex; gap: 4px; border-bottom: 1px solid var(--border); padding-bottom: 8px; }
6
- .project-admin-canvas [role="tab"] { height: 32px; padding: 0 12px; border: 1px solid var(--border); border-radius: 8px; color: inherit; background: transparent; cursor: pointer; }
7
- .project-admin-canvas [aria-selected="true"] { background: #5857fc; color: white; }
8
- .project-admin-canvas :focus-visible { outline: 2px solid #5857fc; outline-offset: 2px; }
9
- .project-admin-canvas dl { display: grid; grid-template-columns: 110px 1fr; gap: 12px; margin: 24px 0; font-size: 13px; }
10
- .project-admin-canvas dd { margin: 0; }
11
- .project-admin-canvas p { max-width: 640px; line-height: 1.6; font-size: 14px; }
12
- .project-admin-secondary { opacity: .65; }
13
- @media (max-width: 600px) { .project-admin-canvas { padding: 16px; } }
1
+ #main-area.project-admin-overview { display: block; overflow: auto; min-width: 0; padding: 8px; }
2
+ .project-admin-canvas { min-height: 100%; padding: 24px; border: 1px solid var(--border); border-radius: 8px; background: var(--bg); }
3
+ .project-admin-heading { display: flex; align-items: center; justify-content: space-between; gap: 16px; max-width: 1000px; margin-bottom: 22px; }
4
+ .project-admin-canvas h1 { font-size: 22px; font-weight: 600; margin: 0; overflow-wrap: anywhere; }
5
+ .project-admin-canvas h2 { font-size: 13px; font-weight: 600; margin: 0; }
6
+ .project-admin-eyebrow, .project-admin-role { color: var(--text-muted); font-size: 11px; }
7
+ .project-admin-canvas .project-admin-eyebrow { margin: 0 0 5px; font-size: 11px; }
8
+ .project-admin-role { margin-left: auto; padding-right: 16px; }
9
+ .project-admin-access-badge { flex-shrink: 0; border: 1px solid var(--border); border-radius: 5px; padding: 5px 8px; color: var(--text-muted); font-size: 11px; }
10
+ .project-admin-canvas [role="tablist"] { display: flex; gap: 18px; border-bottom: 1px solid var(--border); max-width: 1000px; }
11
+ .project-admin-canvas [role="tab"] { height: 32px; padding: 0 2px; border: 0; border-bottom: 2px solid transparent; border-radius: 0; color: var(--text-muted); background: transparent; cursor: pointer; font: inherit; font-size: 12px; }
12
+ .project-admin-canvas [role="tab"][aria-selected="true"] { color: var(--text); border-bottom-color: var(--accent); }
13
+ .project-admin-page :focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
14
+ .project-admin-facts { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 22px 28px; margin: 24px 0 28px; max-width: 1000px; }
15
+ .project-admin-facts dt, .project-admin-metrics dt { font-size: 11px; color: var(--text-muted); margin-bottom: 6px; }
16
+ .project-admin-facts dd { font-size: 13px; margin: 0; overflow-wrap: anywhere; }
17
+ .project-admin-canvas p { line-height: 1.6; font-size: 12px; color: var(--text-secondary); }
18
+ #project-admin-parent { margin: 6px 0 0; font-size: 11px; color: var(--text-muted); }
19
+ .project-admin-storage { border-top: 1px solid var(--border); border-bottom: 1px solid var(--border); padding: 18px 0; max-width: 1000px; }
20
+ .project-admin-section-heading { display: flex; align-items: center; justify-content: space-between; gap: 12px; margin-bottom: 18px; }
21
+ .project-admin-section-heading button { height: 28px; border: 1px solid var(--border); border-radius: 6px; padding: 0 9px; font: inherit; font-size: 11px; background: var(--bg-alt); color: var(--text-secondary); cursor: pointer; }
22
+ .project-admin-section-heading button:hover { background: var(--sidebar-hover); }
23
+ .project-admin-section-heading button:disabled { opacity: .55; cursor: wait; }
24
+ .project-admin-metrics { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 18px; margin: 0 0 16px; }
25
+ .project-admin-metrics dd { font-size: 19px; font-weight: 500; margin: 0; font-variant-numeric: tabular-nums; overflow-wrap: anywhere; }
26
+ .project-admin-canvas #usage-status { margin: 8px 0 4px; font-size: 11px; }
27
+ .project-admin-canvas .project-admin-secondary { font-size: 11px; color: var(--text-muted); max-width: 720px; margin: 4px 0 0; }
28
+ .project-admin-notice { padding-top: 22px; max-width: 680px; }
29
+ .project-admin-notice h2 { color: var(--text-muted); }
30
+ .project-admin-notice p { margin: 6px 0; }
31
+ .project-admin-rail-header { position: relative; }
32
+ .project-admin-page #icon-strip { padding-bottom: 12px; }
33
+ .project-admin-page #icon-strip .icon-strip-home { margin-bottom: 0; }
34
+ @media (max-width: 700px) {
35
+ .project-admin-canvas { padding: 16px; }
36
+ .project-admin-heading { align-items: flex-start; flex-direction: column; gap: 10px; margin-bottom: 16px; }
37
+ .project-admin-facts { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 18px; }
38
+ .project-admin-metrics { grid-template-columns: repeat(2, minmax(0, 1fr)); }
39
+ .project-admin-metrics dd { font-size: 17px; }
40
+ .project-admin-role { font-size: 10px; }
41
+ .project-admin-page #icon-strip { display: flex; width: 60px; }
42
+ }
@@ -75,7 +75,6 @@
75
75
  #main-panels > [data-workbench-placement="docked"] :is(.terminal-header, .file-viewer-tabbar, .shared-browser-viewport) {
76
76
  background: var(--bg);
77
77
  }
78
- #main-panels > #terminal-container[data-workbench-placement="docked"] #terminal-body { background: var(--bg); }
79
78
  }
80
79
  @media (max-width: 1023px) {
81
80
  #main-panels > [data-workbench-placement="docked"][data-workbench-active="false"] { display: none !important; }
@@ -29,6 +29,13 @@
29
29
  .scheduled-tasks-create-menu button:hover, .scheduled-tasks-create-menu button:focus-visible { outline: 0; background: var(--bg-alt); }
30
30
  .scheduled-task-default-ai { display: flex; align-items: center; justify-content: space-between; gap: 12px; padding: 9px 14px; border-bottom: 1px solid var(--border-subtle); background: var(--bg-alt); color: var(--text-dimmer); font-size: 11px; }
31
31
  .scheduled-task-default-ai button { border: 0; background: transparent; color: var(--accent); font: inherit; font-weight: 700; cursor: pointer; }
32
+ .scheduled-tasks-toolbar { display: flex; align-items: center; gap: 12px; padding: 5px 8px; border-bottom: 1px solid var(--border-subtle); background: var(--bg-alt); flex-shrink: 0; }
33
+ .scheduled-tasks-toolbar .scheduled-task-default-ai { flex: 1; min-width: 0; gap: 8px; padding: 0; border: 0; flex-wrap: wrap; }
34
+ .scheduled-tasks-toolbar .scheduled-task-default-ai span { flex: 1; min-width: 120px; }
35
+ .scheduled-tasks-toolbar .scheduled-task-default-ai button { padding: 0; white-space: nowrap; }
36
+ .scheduled-tasks-toolbar .scheduled-tasks-create-group { height: 24px; }
37
+ .scheduled-tasks-toolbar .scheduled-tasks-new { height: 24px; gap: 4px; padding: 0 7px; font-size: 11px; font-weight: 500; border-radius: 5px 0 0 5px; }
38
+ .scheduled-tasks-toolbar .scheduled-tasks-new-menu { height: 24px; width: 23px; border-radius: 0 5px 5px 0; }
32
39
  .scheduled-tasks-list { flex: 1; min-height: 0; overflow-y: auto; }
33
40
  .scheduled-task-row { border-bottom: 1px solid var(--border-subtle); border-left: 2px solid transparent; }
34
41
  .scheduled-task-row:not(.paused) { border-left-color: var(--brand-green); }
@@ -107,14 +107,37 @@
107
107
  .shared-browser-pointer i { position: absolute; left: -12px; top: -12px; width: 30px; height: 30px; border: 2px solid #a59dff; border-radius: 50%; opacity: 0; }
108
108
  @media (prefers-reduced-motion: reduce) { .shared-browser-pointer { transition: none; } }
109
109
 
110
- .shared-browser-tabs { display: flex; gap: 4px; align-items: center; overflow-x: auto; flex-shrink: 0; padding: 6px 8px 0; border-bottom: 1px solid var(--border); }
111
- .shared-browser-tab { display: flex; align-items: center; min-width: 100px; max-width: 210px; border-radius: 7px 7px 0 0; background: var(--bg-alt); }
112
- .shared-browser-tab:has([aria-selected="true"]) { box-shadow: inset 0 -2px var(--accent); background: var(--bg-surface, var(--bg-alt)); }
113
- .shared-browser-tab [role="tab"] { min-width: 0; gap: 8px; font-size: 11px; padding: 9px 8px; }
114
- .shared-browser-tab [role="tab"] span { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
115
- .shared-browser-tab small { font-size: 9px; color: var(--text-muted); }
116
- .shared-browser-tab [aria-selected="true"] small { color: var(--accent); }
117
- .shared-browser-tab > button:last-child { padding: 5px; font-size: 15px; color: var(--text-muted); }
110
+ /* Tabs sit on the pane's top edge; the selected face joins the address toolbar. */
111
+ .shared-browser-tabs { display: flex; align-items: center; gap: 3px; min-width: 0; padding: 4px 6px 0; background: var(--bg-alt); flex: 1 1 auto; }
112
+ .shared-browser-tab-list { display: flex; align-items: stretch; min-width: 0; overflow-x: auto; scrollbar-width: none; overscroll-behavior-x: contain; }
113
+ .shared-browser-tab-list::-webkit-scrollbar { display: none; }
114
+ .shared-browser-tab { position: relative; display: flex; align-items: center; flex: 0 1 160px; width: 160px; min-width: 84px; max-width: 180px; height: 29px; padding: 0 4px; border-radius: 8px 8px 0 0; color: var(--text-muted); }
115
+ .shared-browser-tab::after { content: ''; position: absolute; right: -1px; top: 7px; height: 14px; width: 1px; background: var(--border); }
116
+ .shared-browser-tab:has([aria-selected="true"]), .shared-browser-tab:hover { background: var(--bg); color: var(--text); }
117
+ .shared-browser-tab:has([aria-selected="true"]) { z-index: 1; }
118
+ .shared-browser-tab:has([aria-selected="true"])::after, .shared-browser-tab:has(+ .shared-browser-tab [aria-selected="true"])::after { display: none; }
119
+ .shared-browser-panel .shared-browser-tab [role="tab"] { flex: 1; min-width: 0; height: 27px; gap: 6px; padding: 0 5px; border-radius: 5px; font-size: 11px; font-weight: 400; color: inherit; }
120
+ .shared-browser-panel .shared-browser-tab [role="tab"]:hover { background: transparent; }
121
+ .shared-browser-tab-label { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
122
+ .shared-browser-tab [role="tab"] svg { width: 12px; height: 12px; color: var(--text-muted); }
123
+ .shared-browser-tab[data-phase="ended"] [role="tab"] svg { opacity: .45; }
124
+ .shared-browser-panel .shared-browser-tab-close { flex: 0 0 18px; width: 18px; height: 18px; padding: 3px; border-radius: 50%; color: var(--text-muted); }
125
+ .shared-browser-panel .shared-browser-tab-close svg { width: 11px; height: 11px; }
126
+ .shared-browser-panel .shared-browser-tab-close:hover { background: rgba(var(--overlay-rgb), .1); color: var(--text); }
127
+ .shared-browser-panel .shared-browser-new-tab { flex: 0 0 23px; width: 23px; height: 23px; margin-bottom: 3px; padding: 4px; border-radius: 50%; color: var(--text-muted); }
128
+ .shared-browser-panel .shared-browser-new-tab:hover { background: rgba(var(--overlay-rgb), .08); }
129
+ .tool-pane-header.browser-pane-header { flex-wrap: nowrap; height: 33px; min-height: 33px; padding: 0 6px; gap: 4px; border-bottom: 0; background: var(--bg-alt); align-items: center; }
130
+ .browser-pane-header > .tool-pane-kind { padding: 0 3px; }
131
+ .browser-pane-header > .tool-pane-kind .split-view-model, .browser-pane-header > .tool-pane-title { display: none; }
132
+ .browser-pane-header > .shared-browser-tabs { align-self: stretch; padding: 4px 0 0; flex-shrink: 1; }
133
+ .browser-pane-header > .split-pane-drag-space { flex: 1 0 12px; min-width: 12px; }
134
+ .browser-pane-header > .shared-browser-window { flex-shrink: 0; }
135
+ .shared-browser-panel .shared-browser-address { min-height: 40px; box-sizing: border-box; padding: 5px 7px; background: var(--bg); }
136
+ .shared-browser-panel .shared-browser-address button { width: 27px; height: 27px; flex-shrink: 0; padding: 5px; border-radius: 50%; }
137
+ .shared-browser-panel .shared-browser-address input { height: 28px; box-sizing: border-box; border-radius: 14px; padding: 4px 11px; border-color: transparent; }
138
+ .shared-browser-panel .shared-browser-address input:focus { outline: 2px solid var(--accent); outline-offset: -1px; }
139
+ .browser-settings-open .shared-browser-tabs { display: none; }
140
+ .browser-settings-open .browser-pane-header > .tool-pane-title { display: block; }
118
141
 
119
142
  #shared-browser-toggle-btn[aria-expanded="true"] { color: var(--text); background: rgba(var(--overlay-rgb), .06); }
120
143
 
@@ -79,7 +79,6 @@
79
79
  #split-host.split-view-canvas.visible {
80
80
  display: flex;
81
81
  padding: 7px;
82
- background: var(--bg-alt);
83
82
  box-sizing: border-box;
84
83
  }
85
84
  .split-view-tree, .split-view-branch, .split-view-leaf {
@@ -107,8 +106,10 @@
107
106
  }
108
107
  .split-view-canvas .split-pane-title {
109
108
  min-width: 0;
110
- flex: 1;
109
+ flex: 0 1 auto;
111
110
  max-width: none;
111
+ padding: 0;
112
+ margin-left: 0;
112
113
  font-size: 11px;
113
114
  font-weight: 500;
114
115
  overflow: hidden;
@@ -174,7 +175,7 @@ body.split-view-resizing .split-pane-frame { pointer-events: none; }
174
175
  align-content: center;
175
176
  gap: 4px;
176
177
  }
177
- .split-view-canvas .split-pane-title { flex: 1 0 70px; }
178
+ .split-view-canvas .split-pane-title { flex: 0 1 auto; }
178
179
  .split-view-canvas .split-view-runtime { flex: 0 1 auto; max-width: 55%; min-width: 48px; }
179
180
  }
180
181
  .split-view-workers {
@@ -404,13 +405,23 @@ body.split-view-resizing .split-pane-frame { pointer-events: none; }
404
405
  .split-view-worker-popover-header strong { flex: 1; min-width: 0; font-size: 12px; }
405
406
  .split-view-worker-popover-source { padding: 0 13px 10px; color: var(--text-dimmer); font-size: 10px; }
406
407
  .split-view-worker-popover-body { flex: 1; min-height: 0; overflow: auto; padding: 14px; }
407
- .split-view-worker-popover-body .message { display: flex; flex-direction: column; align-items: stretch; 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 pre { max-height: 280px; overflow: auto; white-space: pre-wrap; overflow-wrap: anywhere; }
412
- .split-view-worker-popover-body .worker-tool-message summary { cursor: pointer; font-size: 13px; }
413
- .split-view-worker-popover-body .worker-tool-message { padding: 6px 8px; border-radius: 5px; background: var(--bg-alt); }
408
+ /* Use session anatomy unchanged; only transcript typography is reduced. */
409
+ .readonly-session-transcript { --content-width: 100%; font-size: 12px; }
410
+ .readonly-session-transcript .md-content,
411
+ .readonly-session-transcript .msg-user .bubble,
412
+ body.wide-view .readonly-session-transcript .msg-user .bubble,
413
+ .readonly-session-transcript .dm-bubble-name,
414
+ .readonly-session-transcript .tool-name,
415
+ .readonly-session-transcript .tool-desc,
416
+ .readonly-session-transcript .tool-group-label { font-size: 12px; }
417
+ .readonly-session-transcript .dm-bubble-time,
418
+ .readonly-session-transcript .tool-subtitle,
419
+ .readonly-session-transcript .tool-subtitle-text,
420
+ .readonly-session-transcript .clay-tool-evidence-label { font-size: 9.6px; }
421
+ .readonly-session-transcript .tool-result-block,
422
+ .readonly-session-transcript .tool-result-block pre { font-size: 10.4px; }
423
+ .readonly-session-transcript .clay-tool-technical-name,
424
+ .readonly-session-transcript .msg-copy-hint { font-size: 8.8px; }
414
425
  .split-view-worker-popover-footer { padding: 8px 13px; border-top: 1px solid var(--border-subtle); color: var(--text-dimmer); font-size: 10px; }
415
426
  .split-view-worker-page-status { display: block; margin-top: 3px; line-height: 1.4; }
416
427
  .split-view-worker-popover-footer button { margin-left: 8px; padding: 4px 6px; font-size: 10px; }
@@ -462,3 +473,111 @@ body.split-view-resizing .split-pane-frame { pointer-events: none; }
462
473
 
463
474
  /* Light reflects received WebSocket output, independent of processing state. */
464
475
  .split-view-worker-dot.io { background: var(--brand-green); box-shadow: 0 0 5px var(--brand-green); }
476
+
477
+ /* Header whitespace is a handle; text and controls retain their own actions. */
478
+ .split-pane-drag-space { flex: 1 1 12px; min-width: 12px; align-self: stretch; cursor: grab; touch-action: none; }
479
+ .split-view-canvas .split-pane-header { cursor: grab; touch-action: none; }
480
+ .split-view-canvas .split-pane-header[data-pane-loading="true"] { cursor: default; }
481
+ body.is-dragging .split-pane-header, body.is-dragging .split-pane-drag-space { cursor: grabbing; }
482
+ .split-view-canvas.split-view-drag-preview > .split-pane,
483
+ .split-view-canvas.split-view-drag-preview > .split-view-divider,
484
+ .split-view-canvas.split-view-drag-preview > .split-view-drop-preview {
485
+ transition: left 280ms cubic-bezier(.2,.75,.25,1), top 280ms cubic-bezier(.2,.75,.25,1),
486
+ width 280ms cubic-bezier(.2,.75,.25,1), height 280ms cubic-bezier(.2,.75,.25,1);
487
+ }
488
+ .split-view-canvas.split-view-drag-preview > .split-view-divider { pointer-events: none; opacity: .35; }
489
+ .split-view-canvas.split-view-drag-preview > .split-view-drop-preview { background: transparent; }
490
+ @media (prefers-reduced-motion: reduce) {
491
+ .split-view-canvas.split-view-drag-preview > .split-pane,
492
+ .split-view-canvas.split-view-drag-preview > .split-view-divider,
493
+ .split-view-canvas.split-view-drag-preview > .split-view-drop-preview { transition: none; }
494
+ }
495
+
496
+ .split-view-canvas > .split-pane.split-pane-drag-source { opacity: .72; }
497
+
498
+ /* A shared tint marks the moving window without altering its content theme. */
499
+ :is(.split-pane-drag-source, .tool-pane-drag-source)::after {
500
+ content: "";
501
+ position: absolute;
502
+ inset: 0;
503
+ z-index: 20;
504
+ border-radius: inherit;
505
+ background: color-mix(in srgb, var(--accent) 16%, transparent);
506
+ box-shadow: inset 0 0 0 1px var(--accent-20);
507
+ pointer-events: none;
508
+ }
509
+
510
+ /* Native tasks use the same compact conversation affordance as Split Workers. */
511
+ .background-task-tabs { border-bottom: 1px solid var(--border-subtle); }
512
+ .background-task-tabs .split-view-worker-name { max-width: 220px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
513
+ .background-task-viewer { top: 42px; right: 12px; width: min(640px, calc(100vw - 24px)); max-height: calc(100dvh - 58px); }
514
+ .background-task-viewer .split-view-worker-popover-body > pre { white-space: pre-wrap; overflow-wrap: anywhere; font-size: 12px; }
515
+ .background-task-viewer [hidden] { display: none; }
516
+ .background-task-ambient { opacity: .65; }
517
+
518
+ .agent-message-bubble {
519
+ position: fixed; z-index: 60; box-sizing: border-box; padding: 10px 12px;
520
+ border: 1px solid var(--border); border-radius: 9px; background: var(--bg);
521
+ color: var(--text); box-shadow: 0 5px 16px rgba(0, 0, 0, .16);
522
+ font-size: 12px; line-height: 1.55; white-space: pre-wrap; overflow-wrap: anywhere;
523
+ pointer-events: none; max-height: 180px;
524
+ }
525
+ .agent-message-bubble::before {
526
+ content: ''; position: absolute; top: -5px; left: var(--bubble-tip-x, 20px); width: 8px; height: 8px;
527
+ background: var(--bg); border-left: 1px solid var(--border); border-top: 1px solid var(--border); transform: rotate(45deg);
528
+ }
529
+ .agent-message-bubble[data-live="true"] { animation: agent-message-fade 7s linear forwards; }
530
+ .agent-message-bubble[data-held="true"] { opacity: 1 !important; }
531
+ @keyframes agent-message-fade { from { opacity: 1; } to { opacity: 0; } }
532
+ @media (prefers-reduced-motion: reduce) { .agent-message-bubble[data-live="true"] { animation: none; } }
533
+
534
+ .agent-message-bubble-text { display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical; overflow: hidden; }
535
+
536
+ /* Shared compact, anchored session insertion picker. */
537
+ .split-session-picker { padding: 5px; color: var(--text); }
538
+ .split-session-picker[data-stage="direction"] { width: min(212px, calc(100vw - 16px)); }
539
+ .split-session-picker[data-stage="sessions"] { width: min(360px, calc(100vw - 16px)); }
540
+ .split-session-directions { display: flex; flex-direction: column; gap: 2px; }
541
+ .split-session-directions button { display: flex; align-items: center; gap: 8px; height: 29px; padding: 4px 8px; text-align: left; font-size: 12px; }
542
+ .split-session-picker svg { width: 15px; height: 15px; flex-shrink: 0; }
543
+ .split-session-search { display: flex; align-items: center; gap: 7px; margin: 0 4px 5px; padding: 5px 7px; border: 1px solid var(--border); border-radius: 6px; background: var(--bg); }
544
+ .split-session-search:focus-within { outline: 2px solid var(--accent); outline-offset: -1px; }
545
+ .split-session-search input { width: 100%; min-width: 0; border: 0; padding: 0; background: transparent; color: var(--text); font: inherit; font-size: 13px; outline: 0; }
546
+ .split-session-section { padding: 7px 8px 4px; font-size: 10px; color: var(--text-muted); }
547
+ .split-session-results { max-height: min(260px, 35dvh); overflow-y: auto; }
548
+ .split-session-picker .split-session-result { display: flex; align-items: center; width: 100%; min-height: 34px; gap: 8px; padding: 6px 8px; font-size: 12px; text-align: left; }
549
+ .split-session-result img { width: 16px; height: 16px; border-radius: 4px; flex-shrink: 0; }
550
+ .split-session-result-title { min-width: 0; flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
551
+ .split-session-result small { font-size: 10px; color: var(--text-muted); flex-shrink: 0; }
552
+ .split-session-move { display: block; overflow: hidden; text-overflow: ellipsis; }
553
+ .split-session-new { margin-top: 5px; border-top: 1px solid var(--border-subtle); }
554
+ .split-session-vendors { display: flex; flex-wrap: wrap; gap: 5px; padding: 4px 7px 7px; }
555
+ .split-session-vendors button { display: flex; align-items: center; justify-content: center; height: 30px; min-width: 30px; padding: 5px; border: 1px solid var(--border); border-radius: 6px; }
556
+ .split-session-vendors img { width: 20px; height: 20px; }
557
+ .split-session-empty { padding: 8px; font-size: 11px; color: var(--text-muted); }
558
+ .split-session-status { margin: 0; padding: 0 7px; font-size: 11px; color: var(--text-secondary); }
559
+ .split-session-hint { display: block; border-top: 1px solid var(--border-subtle); padding: 6px 7px 2px; font-size: 10px; color: var(--text-muted); }
560
+
561
+ .agent-message-bubble-text { white-space: normal; max-height: 55.8px; }
562
+ .agent-message-bubble-text p { margin: 0 0 4px; }
563
+ .agent-message-bubble-text > :last-child { margin-bottom: 0; }
564
+ .agent-message-bubble-text :is(ul, ol) { margin: 3px 0; padding-left: 18px; }
565
+ .agent-message-bubble-text code { font-size: 11px; background: var(--bg-alt); border-radius: 3px; padding: 1px 3px; }
566
+ .agent-message-bubble-text pre { margin: 4px 0; white-space: pre-wrap; overflow-wrap: anywhere; }
567
+ .agent-message-bubble-text pre code { padding: 0; }
568
+ .agent-message-bubble-text blockquote { margin: 4px 0; padding-left: 8px; border-left: 2px solid var(--border); }
569
+
570
+ /* A split reserves its destination before a session is selected. */
571
+ .split-session-empty-pane { position: absolute; display: flex; flex-direction: column; min-width: 0; min-height: 0; border: 1px solid var(--border); border-radius: 8px; overflow: hidden; background: var(--bg); }
572
+ .split-session-empty-body { flex: 1; min-width: 0; min-height: 0; display: flex; align-items: safe center; justify-content: center; padding: 16px; overflow: auto; }
573
+ .split-session-empty-body > .split-session-picker { position: relative; flex: 0 1 360px; width: 360px; min-width: 0; max-width: 100%; max-height: 100%; margin: auto 0; display: flex; flex-direction: column; }
574
+ .split-session-empty-body .split-session-results { flex: 1 1 auto; min-height: 36px; max-height: 220px; }
575
+ .split-session-empty-body .split-view-arrange-header, .split-session-empty-body .split-session-search, .split-session-empty-body .split-session-section, .split-session-empty-body .split-session-vendors, .split-session-empty-body .split-session-status, .split-session-empty-body .split-session-hint { flex-shrink: 0; }
576
+ .split-session-reserved-divider { position: absolute; pointer-events: none; }
577
+ @media (max-width: 700px) { .split-session-empty-body { padding: 8px; } }
578
+ .split-session-empty-body > .split-session-picker[hidden] { display: none; }
579
+
580
+ .agent-message-bubble-meta { display: flex; align-items: center; gap: 6px; margin-bottom: 6px; color: var(--text-muted); font-size: 10px; line-height: 16px; white-space: nowrap; }
581
+ .agent-message-bubble-avatar { width: 16px; height: 16px; border-radius: 4px; object-fit: contain; flex: none; }
582
+ .agent-message-bubble-vendor { overflow: hidden; text-overflow: ellipsis; }
583
+ .agent-message-bubble-time { margin-left: auto; flex: none; font-variant-numeric: tabular-nums; }
@@ -0,0 +1,124 @@
1
+ /* All registered tool windows share the session pane's shell and density. */
2
+ .tool-pane-header { height: 33px; min-height: 33px; padding: 0 8px; gap: 5px; user-select: none; }
3
+ .tool-pane-header .tool-pane-title { flex: 0 1 auto; max-width: 55%; font-size: 11px; font-weight: 500; padding: 0; margin: 0; cursor: default; }
4
+ .tool-pane-kind { display: inline-flex; align-items: center; gap: 5px; flex-shrink: 0; }
5
+ .tool-pane-kind svg { width: 14px; height: 14px; color: var(--text-muted); }
6
+ .tool-pane-header :is(.terminal-header-actions, .file-viewer-window-actions, .shared-browser-window) { display: flex; align-items: center; margin-left: 0; gap: 2px; }
7
+ .tool-pane-header :is(.terminal-header-actions, .file-viewer-window-actions, .shared-browser-window, .workbench-pane-actions) button { width: 24px; height: 24px; padding: 4px; border-radius: 5px; }
8
+ .tool-pane-header button svg { width: 13px; height: 13px; }
9
+ .tool-pane-header .workbench-layout-toggle { width: 24px !important; height: 24px !important; flex-basis: 24px !important; }
10
+ .tool-pane-header .workbench-layout-toggle svg { width: 13px !important; height: 13px !important; }
11
+ /* Tabs use the compact inset pills of the Split Worker row. */
12
+ .tool-pane-tab-row {
13
+ display: flex; align-items: center; gap: 5px; padding: 4px 11px; min-height: 30px; height: auto;
14
+ flex-shrink: 0; overflow-x: auto; background: var(--bg); border-bottom: 0; scrollbar-width: thin;
15
+ }
16
+ .tool-pane-tab-row .terminal-tabs, .tool-pane-tab-row .file-viewer-tabs { display: flex; gap: 5px; min-width: 0; overflow: auto; border: 0; }
17
+ .tool-pane-tab-row :is(.terminal-tab, .file-viewer-tab) {
18
+ display: inline-flex; align-items: center; flex: 0 0 auto; gap: 5px; min-width: 0; max-width: 284px;
19
+ height: 22px; min-height: 22px; padding: 0 6px; border: 1px solid var(--border-subtle); border-radius: 5px;
20
+ background: var(--bg-alt); color: var(--text-muted); font-size: 11px; line-height: 20px;
21
+ }
22
+ .tool-pane-tab-row :is(.terminal-tab.active, .file-viewer-tab.active) { border-color: var(--accent-20); background: var(--accent-bg); color: var(--text-secondary); }
23
+ .tool-pane-tab-row :is(.terminal-tab-more, .file-viewer-tab-close) { width: 20px; height: 20px; padding: 0; border: 0; background: transparent; color: var(--text-dimmer); }
24
+ .tool-pane-tab-row .terminal-tab-more svg { width: 11px; height: 11px; }
25
+ .tool-pane-tab-row .terminal-new-tab-btn { height: 22px; width: 22px; padding: 3px; flex-shrink: 0; }
26
+ @media (min-width: 1024px) {
27
+ #main-panels > :is(#terminal-container, #shared-browser-panel, #file-viewer, .file-instance, .workbench-pane-shell).tool-pane-window[data-workbench-placement="docked"]:not(.panel-fullscreen) {
28
+ position: absolute; inset: auto; flex: none; min-width: 0; max-width: none; margin: 0; align-self: auto;
29
+ z-index: 4; container-type: inline-size; box-sizing: border-box; border: 1px solid var(--border); border-radius: 9px;
30
+ background: var(--bg); box-shadow: none; animation: none;
31
+ transition: left 280ms cubic-bezier(.2,.75,.25,1), top 280ms cubic-bezier(.2,.75,.25,1), width 280ms cubic-bezier(.2,.75,.25,1), height 280ms cubic-bezier(.2,.75,.25,1);
32
+ }
33
+ .tool-pane-window > .tool-pane-header { cursor: grab; touch-action: none; }
34
+ .tool-pane-window .shared-browser-viewport { min-height: 0; }
35
+ .tool-pane-window [data-action="wide"], .tool-pane-window #file-viewer-wide { display: none; }
36
+ .tool-pane-drag-source { opacity: .72; }
37
+ body.tool-pane-dragging, body.tool-pane-dragging .tool-pane-header { cursor: grabbing; user-select: none; }
38
+ }
39
+ @media (prefers-reduced-motion: reduce) {
40
+ #main-panels > :is(#terminal-container, #shared-browser-panel, #file-viewer, .file-instance, .workbench-pane-shell).tool-pane-window[data-workbench-placement="docked"]:not(.panel-fullscreen) { transition: none; }
41
+ }
42
+
43
+ @container (max-width: 380px) {
44
+ .tool-pane-header { height: auto; min-height: 55px; padding: 4px 8px; flex-wrap: wrap; align-content: center; gap: 4px; }
45
+ .tool-pane-header .tool-pane-kind { max-width: 55%; }
46
+ }
47
+
48
+ .tool-pane-header ~ .shared-browser-header[hidden] { display: none; }
49
+
50
+ /* Expanded tool windows retain the same inset frame as a focused session. */
51
+ @media (min-width: 1024px) {
52
+ #main-panels > :is(#terminal-container, #shared-browser-panel, #file-viewer, .file-instance, .workbench-pane-shell).panel-fullscreen {
53
+ inset: 7px !important;
54
+ width: calc(100% - 14px) !important;
55
+ height: calc(100% - 14px) !important;
56
+ max-width: none;
57
+ max-height: none !important;
58
+ min-width: 0;
59
+ margin: 0;
60
+ box-sizing: border-box;
61
+ border: 1px solid var(--border);
62
+ border-radius: 9px;
63
+ container-type: inline-size;
64
+ }
65
+ }
66
+
67
+ /* Independent Files panes use the same shell; only the content owns scrolling. */
68
+ .file-instance { position: absolute; right: 8px; top: 8px; bottom: 8px; width: min(50%, 720px); min-width: 300px; display: flex; flex-direction: column; overflow: hidden; z-index: 20; background: var(--bg); border: 1px solid var(--border); border-radius: 9px; box-shadow: 0 8px 28px #0002; }
69
+ .file-instance.hidden { display: none; }
70
+ .file-instance .tool-pane-header { height: 33px; min-height: 33px; flex-wrap: nowrap; }
71
+ .file-instance .tool-pane-title { max-width: none; flex-shrink: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
72
+ .file-instance button { color: var(--text-secondary); background: transparent; border: 1px solid transparent; border-radius: 5px; cursor: pointer; }
73
+ .file-instance button:hover { background: var(--bg-alt); }
74
+ .file-instance button:focus-visible { outline: 2px solid var(--accent); outline-offset: -2px; }
75
+ .file-instance button[aria-pressed="true"] { color: var(--accent); background: var(--accent-bg); border-color: var(--accent-20); }
76
+ .file-instance button:disabled { opacity: .4; cursor: default; }
77
+ .file-instance-toolbar { display: flex; gap: 4px; padding: 4px 8px; border-bottom: 1px solid var(--border-subtle); flex-shrink: 0; }
78
+ .file-instance-toolbar button { font-size: 11px; height: 24px; padding: 2px 7px; }
79
+ .file-instance-toolbar button:last-child { margin-left: auto; }
80
+ .file-instance-toolbar svg { width: 14px; height: 14px; }
81
+ .file-instance-more { position: absolute; right: 8px; top: 65px; z-index: 30; min-width: 160px; padding: 4px; border: 1px solid var(--border); border-radius: 7px; background: var(--bg); box-shadow: 0 5px 20px #0003; }
82
+ .file-instance-more button { display: block; width: 100%; text-align: left; padding: 5px 8px; font-size: 12px; }
83
+ .file-instance-history { display: block; width: 100%; padding: 8px; text-align: left; }
84
+ .file-instance .file-viewer-body { flex: 1; min-height: 0; }
85
+ .file-instance .file-viewer-body > img { max-width: 100%; }
86
+ @media (max-width: 1023px) { .file-instance { position: fixed; inset: 0; width: 100%; min-width: 0; border-radius: 0; z-index: 300; } }
87
+
88
+ .file-instance-more.hidden { display: none; }
89
+ .file-instance.panel-fullscreen { z-index: 310; }
90
+ @media (max-width: 1023px) {
91
+ .file-instance { inset: 0 !important; width: 100% !important; height: 100% !important; max-height: none !important; }
92
+ }
93
+
94
+ /* A focused conversation owns the canvas; the saved dock layout is retained. */
95
+ #main-panels.view-session-focused > .tool-pane-window:not(.panel-fullscreen) { visibility: hidden; pointer-events: none; }
96
+
97
+ /* Workbench content stays owned by its module; this shared shell owns geometry. */
98
+ .workbench-pane-actions { display: flex; align-items: center; gap: 2px; margin-left: 0; flex-shrink: 0; }
99
+ #main-panels > .workbench-pane-shell > .tool-pane-header { display: flex; flex-wrap: nowrap; height: 33px; min-height: 33px; padding: 0 8px; gap: 5px; }
100
+ .workbench-pane-shell > .tool-pane-header > [class$="-subtitle"] { display: none; }
101
+ .workbench-pane-shell > .tool-pane-header > .split-pane-drag-space { flex: 1; min-width: 12px; align-self: stretch; }
102
+ @media (min-width: 1024px) {
103
+ #main-panels > .workbench-pane-shell[data-workbench-placement="overlay"]:not(.panel-fullscreen) {
104
+ position: absolute; top: 8px; bottom: 8px; right: 8px; left: auto;
105
+ width: min(50%, 720px); min-width: 300px; max-width: none; margin: 0;
106
+ max-height: none; border: 1px solid var(--border); border-radius: 9px;
107
+ box-shadow: 0 8px 28px #0002; z-index: 20;
108
+ }
109
+ #main-panels > .workbench-pane-shell.tool-pane-window:not(.panel-fullscreen) [aria-label^="Widen"] { display: none; }
110
+ }
111
+
112
+ @media (min-width: 1024px) {
113
+ #main-panels > .workbench-pane-shell[data-workbench-placement="overlay"]:not(.panel-fullscreen):has([aria-label^="Widen"][aria-pressed="true"]) { width: 80%; }
114
+ }
115
+
116
+ #main-panels > .workbench-pane-shell > .tool-pane-header .workbench-pane-actions { display: flex; align-items: center; gap: 2px; margin-left: 0; }
117
+ #main-panels > .workbench-pane-shell > .tool-pane-header .workbench-pane-actions button { min-width: 24px; width: 24px; height: 24px; padding: 4px; border: 0; border-radius: 5px; background: transparent; }
118
+ #main-panels > .workbench-pane-shell > .tool-pane-header button svg { width: 13px; height: 13px; }
119
+ #main-panels > .workbench-pane-shell > .tool-pane-header .tool-pane-title { flex: 0 1 auto; min-width: 0; overflow: hidden; white-space: nowrap; text-overflow: ellipsis; font-size: 11px; font-weight: 500; }
120
+ #main-panels > .workbench-pane-shell > .tool-pane-header .workbench-pane-actions button:hover { background: var(--sidebar-hover); color: var(--text); }
121
+ #main-panels > .workbench-pane-shell > .tool-pane-header .workbench-pane-actions button:focus-visible { outline: 2px solid var(--accent); outline-offset: -2px; }
122
+ #main-panels > .workbench-pane-shell > .tool-pane-header .workbench-pane-actions button[aria-pressed="true"] { background: var(--accent-bg); color: var(--accent); }
123
+
124
+ .file-instance:not([data-workbench-placement="docked"]) [data-action="pin"] { display: none; }
@@ -75,8 +75,8 @@ body { background: transparent; color: inherit; }
75
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
- <div id="skip-perms-pill" class="top-bar-pill pill-error hidden"><i data-lucide="shield-off"></i> <span>Skip perms</span></div>
79
- <div id="client-count" class="top-bar-pill pill-accent hidden"><i data-lucide="users"></i> <span id="client-count-text"></span></div>
78
+ <div id="skip-perms-pill" class="top-bar-pill pill-error hidden" data-tip="Permission prompts are skipped"><i data-lucide="shield-off"></i> <span>Skip perms</span></div>
79
+ <div id="client-count" class="top-bar-pill pill-accent hidden" data-tip="Browsers connected to this project"><i data-lucide="users"></i> <span id="client-count-text"></span></div>
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><span class="shared-browser-count hidden" aria-hidden="true"></span></button>
82
82
  <button id="terminal-toggle-btn" title="Terminal"><i data-lucide="square-terminal"></i><span id="terminal-count" class="hidden"></span></button>
@@ -307,9 +307,9 @@ body { background: transparent; color: inherit; }
307
307
  <button id="header-info-btn" type="button" title="Session info"><i data-lucide="info"></i></button>
308
308
  <div id="header-full-access-btn" class="session-permission-control hidden" role="group" aria-label="Session permission mode">
309
309
  <div class="session-permission-segmented">
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
- <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="YOLO permissions" title="YOLO permissions"><span class="permission-label">YOLO</span><span class="permission-spinner" aria-hidden="true"></span></button>
310
+ <button type="button" data-permission-mode="default" aria-label="Ask permissions" data-tip="Ask before tool actions that need permission. Previously allowed actions can run without asking again."><span class="permission-label">Ask</span><span class="permission-spinner" aria-hidden="true"></span></button>
311
+ <button type="button" data-permission-mode="auto" aria-label="Auto permissions" data-tip="Let the runtime assess tool actions and approve them automatically when allowed. Some actions may still need your permission."><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="YOLO permissions" data-tip="Run tools, file changes and commands without asking for permission. Clay access restrictions still apply."><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>
@@ -704,7 +704,7 @@ body { background: transparent; color: inherit; }
704
704
  <button class="terminal-new-tab-btn" id="terminal-new-tab" title="New tab"><i data-lucide="plus"></i></button>
705
705
  <div class="terminal-header-actions">
706
706
  <button class="file-viewer-btn" id="terminal-fullscreen" title="Toggle fullscreen"><i data-lucide="maximize-2"></i></button>
707
- <button class="file-viewer-btn" id="terminal-close" title="Hide panel"><i data-lucide="minus"></i></button>
707
+ <button class="file-viewer-btn" id="terminal-close" title="Close terminal pane" aria-label="Close terminal pane"><i data-lucide="x"></i></button>
708
708
  </div>
709
709
  </div>
710
710
  <div id="terminal-toolbar" class="term-toolbar hidden">