clay-server 4.0.0-beta.2 → 4.0.0-beta.21

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 (177) hide show
  1. package/lib/background-task-timing.js +105 -0
  2. package/lib/capsule-display-floor.js +51 -0
  3. package/lib/capsule-frame-server.js +255 -0
  4. package/lib/capsule-mate-turn.js +105 -0
  5. package/lib/capsule-pig-logic.js +300 -0
  6. package/lib/capsule-server-runtimes.js +39 -0
  7. package/lib/capsules/pig/display.js +198 -0
  8. package/lib/capsules/pig/manifest.json +9 -0
  9. package/lib/capsules/pig/ui.json +84 -0
  10. package/lib/config.js +25 -1
  11. package/lib/daemon-projects.js +13 -8
  12. package/lib/daemon.js +127 -14
  13. package/lib/git-cli.js +95 -1
  14. package/lib/knowledge-import.js +436 -0
  15. package/lib/knowledge-record-store.js +188 -0
  16. package/lib/knowledge-search.js +240 -0
  17. package/lib/mate-knowledge-mcp-server.js +151 -0
  18. package/lib/mate-knowledge-migration.js +283 -0
  19. package/lib/mate-knowledge-service.js +488 -0
  20. package/lib/mate-knowledge-sync.js +482 -0
  21. package/lib/migrate-single-user.js +2 -0
  22. package/lib/notes-lifecycle.js +149 -0
  23. package/lib/notes.js +60 -3
  24. package/lib/os-users.js +3 -1
  25. package/lib/project-capsule-catalog.js +9 -1
  26. package/lib/project-capsule-turn.js +96 -0
  27. package/lib/project-connection.js +14 -1
  28. package/lib/project-http.js +15 -1
  29. package/lib/project-knowledge.js +22 -0
  30. package/lib/project-log-context.js +172 -0
  31. package/lib/project-log-feedback-delivery.js +118 -0
  32. package/lib/project-logs-comments.js +137 -0
  33. package/lib/project-logs-context-state.js +42 -0
  34. package/lib/project-logs-mcp-server.js +328 -0
  35. package/lib/project-logs-query.js +185 -0
  36. package/lib/project-logs-root.js +75 -0
  37. package/lib/project-logs-schema.js +259 -0
  38. package/lib/project-logs-service.js +463 -0
  39. package/lib/project-logs-snapshot.js +205 -0
  40. package/lib/project-logs-store.js +495 -0
  41. package/lib/project-logs-versioning.js +132 -0
  42. package/lib/project-logs.js +400 -0
  43. package/lib/project-mate-interaction.js +14 -0
  44. package/lib/project-mate-knowledge.js +110 -0
  45. package/lib/project-memory.js +22 -0
  46. package/lib/project-message-delivery.js +70 -0
  47. package/lib/project-pair-lifecycle.js +460 -0
  48. package/lib/project-session-handoff.js +1 -1
  49. package/lib/project-session-notes.js +64 -13
  50. package/lib/project-session-pair.js +159 -146
  51. package/lib/project-session-spawn.js +1 -1
  52. package/lib/project-sessions.js +58 -13
  53. package/lib/project-user-message.js +53 -4
  54. package/lib/project-vendor-login.js +20 -3
  55. package/lib/project-worker-permission.js +430 -0
  56. package/lib/project-worker-proposal.js +208 -62
  57. package/lib/project.js +178 -6
  58. package/lib/public/app.js +58 -35
  59. package/lib/public/css/admin.css +2 -2
  60. package/lib/public/css/capsule-ui.css +38 -0
  61. package/lib/public/css/command-palette.css +19 -9
  62. package/lib/public/css/git-placard.css +154 -0
  63. package/lib/public/css/home-hub.css +4 -0
  64. package/lib/public/css/home-session-actions.css +66 -0
  65. package/lib/public/css/home-sidebar.css +66 -0
  66. package/lib/public/css/input.css +163 -28
  67. package/lib/public/css/mobile-nav.css +80 -0
  68. package/lib/public/css/notifications-center.css +67 -0
  69. package/lib/public/css/pane.css +52 -0
  70. package/lib/public/css/project-logs.css +198 -0
  71. package/lib/public/css/scheduler.css +1 -1
  72. package/lib/public/css/session-actions.css +16 -101
  73. package/lib/public/css/sidebar.css +103 -0
  74. package/lib/public/css/sticky-notes.css +237 -229
  75. package/lib/public/css/worker-proposal.css +34 -1
  76. package/lib/public/index.html +45 -11
  77. package/lib/public/modules/admin.js +8 -8
  78. package/lib/public/modules/app-connection.js +109 -4
  79. package/lib/public/modules/app-home-hub.js +19 -7
  80. package/lib/public/modules/app-message-cards.js +2 -1
  81. package/lib/public/modules/app-messages.js +84 -7
  82. package/lib/public/modules/app-misc.js +2 -14
  83. package/lib/public/modules/app-notifications.js +11 -7
  84. package/lib/public/modules/app-panels.js +46 -4
  85. package/lib/public/modules/app-projects.js +13 -8
  86. package/lib/public/modules/app-rendering.js +1 -0
  87. package/lib/public/modules/background-tasks-ui.js +139 -16
  88. package/lib/public/modules/capsule-preference.js +44 -0
  89. package/lib/public/modules/chat-bubble-renderer.js +1 -1
  90. package/lib/public/modules/clay-log-links.js +70 -0
  91. package/lib/public/modules/command-palette.js +52 -15
  92. package/lib/public/modules/context-sources.js +0 -3
  93. package/lib/public/modules/git-agent-sessions.js +85 -0
  94. package/lib/public/modules/git-panel.js +111 -84
  95. package/lib/public/modules/git-placard.js +161 -0
  96. package/lib/public/modules/home-chat-empty-state.js +39 -0
  97. package/lib/public/modules/home-chat-identity.js +9 -0
  98. package/lib/public/modules/home-conversations-sheet.js +102 -48
  99. package/lib/public/modules/home-mate-chat.js +15 -35
  100. package/lib/public/modules/home-session-actions.js +6 -0
  101. package/lib/public/modules/home-sidebar-chat-list.js +101 -41
  102. package/lib/public/modules/home-sidebar.js +7 -0
  103. package/lib/public/modules/home-tool-frame.js +182 -0
  104. package/lib/public/modules/home-tools.js +138 -1
  105. package/lib/public/modules/input.js +38 -7
  106. package/lib/public/modules/markdown.js +2 -0
  107. package/lib/public/modules/mate-sidebar.js +0 -8
  108. package/lib/public/modules/message-delivery.js +97 -0
  109. package/lib/public/modules/paste-modal.js +84 -0
  110. package/lib/public/modules/project-logs-render.js +405 -0
  111. package/lib/public/modules/project-logs.js +461 -0
  112. package/lib/public/modules/project-removal-target.js +26 -0
  113. package/lib/public/modules/scheduler.js +17 -3
  114. package/lib/public/modules/session-actions.js +29 -105
  115. package/lib/public/modules/session-hierarchy.js +54 -0
  116. package/lib/public/modules/sidebar-mobile.js +40 -15
  117. package/lib/public/modules/sidebar-session-hierarchy.js +214 -0
  118. package/lib/public/modules/sidebar-sessions.js +77 -11
  119. package/lib/public/modules/sidebar.js +17 -5
  120. package/lib/public/modules/split-group-helpers.js +8 -0
  121. package/lib/public/modules/split-view.js +5 -2
  122. package/lib/public/modules/sticky-note-markdown.js +5 -0
  123. package/lib/public/modules/sticky-notes-browser.js +326 -0
  124. package/lib/public/modules/sticky-notes-card.js +360 -0
  125. package/lib/public/modules/sticky-notes-editor.js +291 -0
  126. package/lib/public/modules/sticky-notes-shared.js +90 -0
  127. package/lib/public/modules/sticky-notes.js +170 -946
  128. package/lib/public/modules/tool-palette-order.js +143 -0
  129. package/lib/public/modules/tool-palette-overlays.js +159 -0
  130. package/lib/public/modules/tool-palette.js +21 -188
  131. package/lib/public/modules/tools.js +21 -1
  132. package/lib/public/modules/update-snooze.js +169 -0
  133. package/lib/public/modules/user-settings.js +4 -0
  134. package/lib/public/modules/worker-pane-lock.js +176 -0
  135. package/lib/public/modules/worker-proposal-state.js +16 -0
  136. package/lib/public/modules/worker-proposal.js +49 -12
  137. package/lib/public/style.css +3 -1
  138. package/lib/sdk-bridge.js +132 -46
  139. package/lib/sdk-message-processor.js +60 -14
  140. package/lib/server-experimental-settings.js +49 -0
  141. package/lib/server-global-ws.js +11 -0
  142. package/lib/server-home-chat-events.js +31 -1
  143. package/lib/server-home-chat.js +27 -4
  144. package/lib/server-home-clay-entry.js +1 -1
  145. package/lib/server-home-clay-session-links.js +34 -5
  146. package/lib/server-settings.js +5 -0
  147. package/lib/server-tools.js +127 -9
  148. package/lib/server.js +124 -18
  149. package/lib/session-driver-eligibility.js +38 -0
  150. package/lib/session-driver-orchestration.js +31 -0
  151. package/lib/session-hygiene.js +3 -0
  152. package/lib/session-notes-mcp-server.js +25 -5
  153. package/lib/session-pair-factory.js +247 -0
  154. package/lib/session-pair-mcp-server.js +46 -8
  155. package/lib/session-pair-prompts.js +79 -0
  156. package/lib/session-pair-turn-control.js +153 -0
  157. package/lib/session-provenance.js +119 -0
  158. package/lib/session-spawn-mcp-server.js +1 -1
  159. package/lib/session-split-groups.js +4 -1
  160. package/lib/session-title-policy.js +60 -0
  161. package/lib/session-visibility.js +39 -0
  162. package/lib/sessions.js +61 -11
  163. package/lib/tools-registry.js +89 -10
  164. package/lib/update-snooze.js +437 -0
  165. package/lib/users-experimental-preferences.js +30 -0
  166. package/lib/users-permissions.js +2 -2
  167. package/lib/users.js +22 -16
  168. package/lib/workspace-query-access.js +102 -0
  169. package/lib/workspace-query-service.js +24 -17
  170. package/lib/worktree.js +25 -38
  171. package/lib/ws-schema.js +38 -7
  172. package/lib/yoke/adapters/claude-worker.js +16 -6
  173. package/lib/yoke/adapters/claude.js +81 -4
  174. package/lib/yoke/adapters/codex.js +63 -15
  175. package/lib/yoke/codex-background-tasks.js +8 -2
  176. package/lib/yoke/vendor-registry.js +1 -1
  177. package/package.json +3 -3
@@ -384,6 +384,44 @@ textarea.tool-input { min-height: 92px; resize: vertical; }
384
384
  .tool-pagination { flex-wrap: wrap; justify-content: flex-start; }
385
385
  }
386
386
 
387
+ /* Capsule engagement note in the Mate transcript: a quiet system line, not a
388
+ speech bubble, because no one typed it. */
389
+ .home-capsule-turn-note {
390
+ align-self: center;
391
+ margin: 6px auto;
392
+ padding: 3px 12px;
393
+ border-radius: 999px;
394
+ background: color-mix(in srgb, var(--text-muted) 10%, transparent);
395
+ color: var(--text-muted);
396
+ font-size: 11.5px;
397
+ text-align: center;
398
+ }
399
+
400
+ /* Rich Display frame: the additive sandboxed element above the floor. */
401
+ /* There is no global .hidden utility, so the capsule surfaces scope their own:
402
+ the frame stays invisible until its bridge reports ready, the floor hides
403
+ behind the toggle, and a cleared error leaves the screen. */
404
+ .home-tool-frame-wrap.hidden,
405
+ .home-tool-frame-toggle.hidden,
406
+ .home-tool-display.hidden,
407
+ .home-tool-error.hidden { display: none; }
408
+ .home-tool-frame-wrap { width: 100%; }
409
+ .home-tool-frame { display: block; width: 100%; min-height: 0; border: 0; border-radius: 10px; background: var(--bg); }
410
+ .home-tool-frame-toggle {
411
+ display: block; margin: 6px 0 0 auto; padding: 3px 10px;
412
+ border: 1px solid var(--border-subtle); border-radius: 999px;
413
+ background: transparent; color: var(--text-muted); font-size: 11px; cursor: pointer;
414
+ }
415
+ .home-tool-frame-toggle:hover { color: var(--text); border-color: var(--accent); }
416
+
417
+ /* Host-side attribution flash when the other seat's act changes state. */
418
+ @keyframes capsule-remote-act-flash {
419
+ 0% { box-shadow: 0 0 0 2px var(--accent); }
420
+ 100% { box-shadow: 0 0 0 2px transparent; }
421
+ }
422
+ .capsule-remote-act { animation: capsule-remote-act-flash 0.8s ease-out; }
423
+
387
424
  @media (prefers-reduced-motion: reduce) {
388
425
  .tool-button, .tool-input, .tool-select { transition: none; }
426
+ .capsule-remote-act { animation: none; }
389
427
  }
@@ -486,7 +486,8 @@ body.mate-dm-active .search-clay-transcript .search-clay-message-user .bubble,
486
486
  .search-clay-activity-item small { color: var(--text-dimmer); font-size: 10px; line-height: 1.35; }
487
487
  @keyframes searchClaySpin { to { transform: rotate(360deg); } }
488
488
 
489
- .clayos-session-link {
489
+ .clayos-session-link,
490
+ .clayos-log-link {
490
491
  display: inline-flex;
491
492
  align-items: center;
492
493
  gap: 6px;
@@ -503,7 +504,8 @@ body.mate-dm-active .search-clay-transcript .search-clay-message-user .bubble,
503
504
  vertical-align: middle;
504
505
  cursor: pointer;
505
506
  }
506
- .clayos-session-link::before {
507
+ .clayos-session-link::before,
508
+ .clayos-log-link::before {
507
509
  content: "\2197";
508
510
  display: grid;
509
511
  place-items: center;
@@ -514,13 +516,21 @@ body.mate-dm-active .search-clay-transcript .search-clay-message-user .bubble,
514
516
  color: var(--accent);
515
517
  font-size: 12px;
516
518
  }
517
- .clayos-session-link > span { font-weight: 620; }
518
- .clayos-session-link > small { color: var(--text-muted); font-size: 10px; }
519
- .clayos-session-link:hover { border-color: color-mix(in srgb, var(--accent) 52%, var(--border)); background: color-mix(in srgb, var(--accent) 11%, var(--bg-alt)); }
520
- .clayos-session-link:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
521
- .clayos-session-link.is-loading { opacity: 0.62; cursor: progress; }
522
- .clayos-session-link.is-loading::before { animation: searchClaySpin 1.2s linear infinite; }
523
- .clayos-session-link.is-error { border-color: color-mix(in srgb, var(--warning) 48%, var(--border)); }
519
+ .clayos-log-link::before { content: "\2261"; }
520
+ .clayos-session-link > span,
521
+ .clayos-log-link > span { font-weight: 620; }
522
+ .clayos-session-link > small,
523
+ .clayos-log-link > small { color: var(--text-muted); font-size: 10px; }
524
+ .clayos-session-link:hover,
525
+ .clayos-log-link:hover { border-color: color-mix(in srgb, var(--accent) 52%, var(--border)); background: color-mix(in srgb, var(--accent) 11%, var(--bg-alt)); }
526
+ .clayos-session-link:focus-visible,
527
+ .clayos-log-link:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
528
+ .clayos-session-link.is-loading,
529
+ .clayos-log-link.is-loading { opacity: 0.62; cursor: progress; }
530
+ .clayos-session-link.is-loading::before,
531
+ .clayos-log-link.is-loading::before { animation: searchClaySpin 1.2s linear infinite; }
532
+ .clayos-session-link.is-error,
533
+ .clayos-log-link.is-error { border-color: color-mix(in srgb, var(--warning) 48%, var(--border)); }
524
534
 
525
535
  .search-clay-pending {
526
536
  align-self: flex-start;
@@ -0,0 +1,154 @@
1
+ /* Repository placard — the always-visible Git block directly under the tool
2
+ strip. Refined utilitarian: it borrows the panel's own surface tokens and
3
+ type scale so it reads as part of the sidebar chrome, and stays visually
4
+ subordinate to the tool tiles above it while remaining legible at a glance.
5
+ No new palette, no card shadow, no dashboard framing. */
6
+
7
+ .git-placard {
8
+ display: grid;
9
+ grid-template-columns: minmax(0, 1fr) auto;
10
+ align-items: center;
11
+ gap: 6px;
12
+ margin: 2px 8px 0;
13
+ padding: 7px 7px 7px 8px;
14
+ border: 1px solid var(--border-subtle);
15
+ border-radius: 8px;
16
+ background: var(--bg-alt);
17
+ cursor: pointer;
18
+ font-family: "Pretendard", "Twemoji", system-ui, -apple-system, BlinkMacSystemFont, sans-serif;
19
+ }
20
+
21
+ .git-placard.hidden { display: none; }
22
+ .git-placard:hover { border-color: var(--border); }
23
+
24
+ .git-placard-body { min-width: 0; }
25
+
26
+ .git-placard-identity {
27
+ display: flex;
28
+ align-items: center;
29
+ gap: 6px;
30
+ min-width: 0;
31
+ }
32
+
33
+ .git-placard-glyph {
34
+ display: inline-flex;
35
+ align-items: center;
36
+ justify-content: center;
37
+ flex-shrink: 0;
38
+ color: var(--accent);
39
+ }
40
+ .git-placard-glyph svg { width: 13px; height: 13px; }
41
+
42
+ .git-placard-names { display: block; min-width: 0; }
43
+
44
+ .git-placard-repo {
45
+ display: block;
46
+ color: var(--text);
47
+ font-size: 11px;
48
+ font-weight: 700;
49
+ line-height: 1.3;
50
+ overflow: hidden;
51
+ text-overflow: ellipsis;
52
+ white-space: nowrap;
53
+ }
54
+
55
+ .git-placard-branch {
56
+ display: block;
57
+ color: var(--text-muted);
58
+ font-size: 10px;
59
+ font-weight: 500;
60
+ line-height: 1.35;
61
+ overflow: hidden;
62
+ text-overflow: ellipsis;
63
+ white-space: nowrap;
64
+ }
65
+
66
+ .git-placard-meta {
67
+ display: flex;
68
+ align-items: center;
69
+ gap: 4px;
70
+ flex-wrap: wrap;
71
+ margin: 5px 0 0 19px;
72
+ }
73
+
74
+ .git-placard-badge {
75
+ padding: 1px 5px;
76
+ border: 1px solid var(--border-subtle);
77
+ border-radius: 999px;
78
+ background: var(--bg);
79
+ color: var(--text-dimmer);
80
+ font-size: 9px;
81
+ font-weight: 700;
82
+ letter-spacing: 0.02em;
83
+ text-transform: uppercase;
84
+ white-space: nowrap;
85
+ }
86
+ .git-placard-badge-warn {
87
+ border-color: color-mix(in srgb, var(--warning) 38%, var(--border-subtle));
88
+ color: var(--warning);
89
+ }
90
+
91
+ .git-placard-stat {
92
+ display: inline-flex;
93
+ align-items: center;
94
+ gap: 2px;
95
+ color: var(--text-dimmer);
96
+ font-size: 9px;
97
+ font-weight: 600;
98
+ font-variant-numeric: tabular-nums;
99
+ white-space: nowrap;
100
+ }
101
+ .git-placard-stat svg { width: 9px; height: 9px; }
102
+ .git-placard-stat-active { color: var(--text-muted); }
103
+ .git-placard-stat-warn { color: var(--error); }
104
+
105
+ .git-placard-remote {
106
+ display: flex;
107
+ align-items: center;
108
+ gap: 4px;
109
+ margin: 4px 0 0 19px;
110
+ color: var(--text-dimmer);
111
+ font-size: 9px;
112
+ min-width: 0;
113
+ }
114
+ .git-placard-remote svg { width: 9px; height: 9px; flex-shrink: 0; }
115
+ .git-placard-remote span {
116
+ overflow: hidden;
117
+ text-overflow: ellipsis;
118
+ white-space: nowrap;
119
+ }
120
+
121
+ /* The single focusable control in the block. Everything else is a pointer
122
+ convenience that forwards here, so keyboard users get one stop and one
123
+ action rather than a row of ambiguous targets. */
124
+ .git-placard-more {
125
+ display: inline-flex;
126
+ align-items: center;
127
+ gap: 2px;
128
+ align-self: center;
129
+ padding: 3px 5px;
130
+ border: 1px solid var(--border-subtle);
131
+ border-radius: 6px;
132
+ background: var(--bg);
133
+ color: var(--text-dimmer);
134
+ font-family: inherit;
135
+ font-size: 9px;
136
+ font-weight: 700;
137
+ letter-spacing: 0.02em;
138
+ text-transform: uppercase;
139
+ cursor: pointer;
140
+ transition: color 140ms ease, border-color 140ms ease;
141
+ }
142
+ .git-placard-more svg { width: 10px; height: 10px; }
143
+ .git-placard:hover .git-placard-more,
144
+ .git-placard-more:hover { color: var(--text-muted); border-color: var(--border); }
145
+ .git-placard-more:focus-visible {
146
+ outline: none;
147
+ border-color: var(--accent);
148
+ box-shadow: 0 0 0 2px var(--accent-25);
149
+ color: var(--text);
150
+ }
151
+
152
+ @media (prefers-reduced-motion: reduce) {
153
+ .git-placard-more { transition: none; }
154
+ }
@@ -12,6 +12,10 @@ body.home-active #sidebar-overlay,
12
12
  body.home-active .title-bar-content,
13
13
  body.home-active #user-island { display: none !important; }
14
14
 
15
+ body.capsules-disabled #home-tools-btn,
16
+ body.capsules-disabled #home-dock-divider,
17
+ body.capsules-disabled #home-tool-workbench { display: none !important; }
18
+
15
19
  body.home-active #main-area { border: 0; border-radius: 0; }
16
20
 
17
21
  body.home-surface-boot-pending #connect-overlay.hidden {
@@ -22,6 +22,72 @@
22
22
  .home-sidebar-recent-item .home-sidebar-recent-row:hover,
23
23
  .home-conversations-sheet-item .home-conversations-sheet-row:hover { background: transparent; }
24
24
 
25
+ .home-conversations-driver-header {
26
+ display: flex;
27
+ align-items: stretch;
28
+ }
29
+
30
+ .home-conversations-driver-header > .home-conversations-sheet-item {
31
+ min-width: 0;
32
+ flex: 1;
33
+ }
34
+
35
+ .home-conversations-driver-toggle {
36
+ width: 32px;
37
+ padding: 0;
38
+ border: 0;
39
+ border-radius: 8px;
40
+ display: inline-flex;
41
+ align-items: center;
42
+ justify-content: center;
43
+ flex-shrink: 0;
44
+ color: var(--text-dimmer);
45
+ background: transparent;
46
+ cursor: pointer;
47
+ }
48
+
49
+ .home-conversations-driver-toggle:hover,
50
+ .home-conversations-driver-toggle:focus-visible {
51
+ color: var(--text);
52
+ background: rgba(var(--overlay-rgb), 0.05);
53
+ outline: none;
54
+ }
55
+
56
+ .home-conversations-driver-toggle .lucide {
57
+ width: 14px;
58
+ height: 14px;
59
+ transition: transform 0.15s ease;
60
+ }
61
+
62
+ .home-conversations-driver-toggle[aria-expanded="true"] .lucide {
63
+ transform: rotate(90deg);
64
+ }
65
+
66
+ .home-conversations-driver-header:not(:has(.home-conversations-sheet-item)) .home-conversations-driver-toggle {
67
+ width: 100%;
68
+ min-height: 38px;
69
+ padding: 0 10px;
70
+ justify-content: flex-start;
71
+ gap: 9px;
72
+ font: inherit;
73
+ font-size: 11px;
74
+ text-align: left;
75
+ }
76
+
77
+ .home-conversations-driver-header:not(:has(.home-conversations-sheet-item)) .home-conversations-driver-toggle span:first-of-type {
78
+ flex: 1;
79
+ }
80
+
81
+ .home-conversations-worker-children {
82
+ margin-left: 16px;
83
+ padding-left: 10px;
84
+ border-left: 1px solid color-mix(in srgb, var(--text-dimmer) 22%, transparent);
85
+ }
86
+
87
+ .home-conversations-worker-item .home-conversations-sheet-row {
88
+ padding-block: 8px;
89
+ }
90
+
25
91
  .home-sidebar-recent-row:focus-visible,
26
92
  .home-conversations-sheet-row:focus-visible {
27
93
  position: relative;
@@ -478,6 +478,72 @@
478
478
  line-height: 1.45;
479
479
  }
480
480
 
481
+ .home-sidebar-driver-header {
482
+ display: flex;
483
+ align-items: stretch;
484
+ }
485
+
486
+ .home-sidebar-driver-header > .home-sidebar-recent-item {
487
+ min-width: 0;
488
+ flex: 1;
489
+ }
490
+
491
+ .home-sidebar-driver-toggle {
492
+ width: 27px;
493
+ padding: 0;
494
+ border: 0;
495
+ border-radius: 7px;
496
+ display: inline-flex;
497
+ align-items: center;
498
+ justify-content: center;
499
+ flex-shrink: 0;
500
+ color: var(--text-dimmer);
501
+ background: transparent;
502
+ cursor: pointer;
503
+ }
504
+
505
+ .home-sidebar-driver-toggle:hover,
506
+ .home-sidebar-driver-toggle:focus-visible {
507
+ color: var(--text);
508
+ background: rgba(var(--overlay-rgb), 0.05);
509
+ outline: none;
510
+ }
511
+
512
+ .home-sidebar-driver-toggle .lucide {
513
+ width: 13px;
514
+ height: 13px;
515
+ transition: transform 0.15s ease;
516
+ }
517
+
518
+ .home-sidebar-driver-toggle[aria-expanded="true"] .lucide {
519
+ transform: rotate(90deg);
520
+ }
521
+
522
+ .home-sidebar-worker-children {
523
+ margin-left: 13px;
524
+ padding-left: 8px;
525
+ border-left: 1px solid color-mix(in srgb, var(--text-dimmer) 22%, transparent);
526
+ }
527
+
528
+ .home-sidebar-worker-item .home-sidebar-recent-row {
529
+ min-height: 38px;
530
+ }
531
+
532
+ .home-sidebar-orphan-toggle {
533
+ width: 100%;
534
+ min-height: 34px;
535
+ padding: 0 8px;
536
+ justify-content: flex-start;
537
+ gap: 7px;
538
+ font: inherit;
539
+ font-size: 11px;
540
+ text-align: left;
541
+ }
542
+
543
+ .home-sidebar-orphan-toggle span:first-of-type {
544
+ flex: 1;
545
+ }
546
+
481
547
  .home-sidebar-expand {
482
548
  position: absolute;
483
549
  top: 8px;
@@ -52,11 +52,32 @@
52
52
  background: var(--bg-alt);
53
53
  border: 1px solid var(--border);
54
54
  border-radius: 10px;
55
- padding: 6px 10px;
55
+ padding: 0;
56
56
  font-size: 12px;
57
57
  max-width: 200px;
58
58
  }
59
59
 
60
+ .pasted-chip-open {
61
+ display: inline-flex;
62
+ align-items: center;
63
+ gap: 6px;
64
+ min-width: 0;
65
+ padding: 6px 4px 6px 10px;
66
+ border: 0;
67
+ background: transparent;
68
+ color: inherit;
69
+ cursor: pointer;
70
+ }
71
+
72
+ .pasted-chip-open:hover .pasted-chip-preview,
73
+ .pasted-chip-open:focus-visible .pasted-chip-preview { color: var(--text); }
74
+
75
+ .pasted-chip-open:focus-visible,
76
+ .pasted-chip-remove:focus-visible {
77
+ outline: 2px solid var(--accent);
78
+ outline-offset: 1px;
79
+ }
80
+
60
81
  .pasted-chip-preview {
61
82
  color: var(--text-muted);
62
83
  overflow: hidden;
@@ -87,6 +108,7 @@
87
108
  cursor: pointer;
88
109
  padding: 0;
89
110
  flex-shrink: 0;
111
+ margin-right: 6px;
90
112
  }
91
113
 
92
114
  .pasted-chip-remove .lucide { width: 12px; height: 12px; }
@@ -156,6 +178,59 @@
156
178
  min-height: 0;
157
179
  }
158
180
 
181
+ .paste-modal-editor,
182
+ .paste-modal-footer { display: none; }
183
+
184
+ .paste-modal-editing .paste-modal-body { display: none; }
185
+
186
+ .paste-modal-editing .paste-modal-editor {
187
+ display: block;
188
+ width: 100%;
189
+ min-height: min(52vh, 420px);
190
+ resize: vertical;
191
+ border: 0;
192
+ border-radius: 0;
193
+ outline: 0;
194
+ padding: 16px 20px;
195
+ background: var(--bg);
196
+ color: var(--text-secondary);
197
+ font-family: "Roboto Mono", monospace;
198
+ font-size: 13px;
199
+ line-height: 1.55;
200
+ }
201
+
202
+ .paste-modal-editing .paste-modal-editor:focus {
203
+ box-shadow: inset 0 0 0 2px color-mix(in srgb, var(--accent) 55%, transparent);
204
+ }
205
+
206
+ .paste-modal-editing .paste-modal-footer {
207
+ display: flex;
208
+ justify-content: flex-end;
209
+ gap: 8px;
210
+ padding: 12px 16px;
211
+ border-top: 1px solid var(--border-subtle);
212
+ }
213
+
214
+ .paste-modal-cancel,
215
+ .paste-modal-save {
216
+ border: 1px solid var(--border);
217
+ border-radius: 8px;
218
+ padding: 7px 12px;
219
+ font: inherit;
220
+ cursor: pointer;
221
+ }
222
+
223
+ .paste-modal-cancel {
224
+ background: transparent;
225
+ color: var(--text-secondary);
226
+ }
227
+
228
+ .paste-modal-save {
229
+ border-color: var(--accent);
230
+ background: var(--accent);
231
+ color: var(--accent-text, white);
232
+ }
233
+
159
234
  /* --- File chips (input preview) --- */
160
235
  .file-chip {
161
236
  display: inline-flex;
@@ -286,9 +361,11 @@
286
361
  #context-sources-add {
287
362
  display: inline-flex;
288
363
  align-items: center;
289
- gap: 3px;
364
+ justify-content: center;
365
+ position: relative;
366
+ width: 36px;
290
367
  height: 36px;
291
- padding: 0 10px;
368
+ padding: 0;
292
369
  border-radius: 18px;
293
370
  border: none;
294
371
  background: transparent;
@@ -322,6 +399,9 @@
322
399
  font-size: 10px;
323
400
  font-weight: 700;
324
401
  line-height: 1;
402
+ position: absolute;
403
+ top: 0;
404
+ right: -1px;
325
405
  }
326
406
 
327
407
  .context-chip {
@@ -667,49 +747,103 @@
667
747
  position: relative;
668
748
  }
669
749
 
750
+ /* Sidebar session-row badge. Formerly shared its rule with the composer's
751
+ background-tasks chip; it is standalone now that the composer bar no longer
752
+ uses a filled numeric badge. */
753
+ .session-background-task-count {
754
+ display: inline-flex;
755
+ align-items: center;
756
+ justify-content: center;
757
+ min-width: 16px;
758
+ height: 16px;
759
+ padding: 0 4px;
760
+ border-radius: 8px;
761
+ background: var(--accent);
762
+ color: var(--bg);
763
+ font-size: 10px;
764
+ font-weight: 700;
765
+ }
766
+
767
+ /* --- Background tasks status line (above the composer) ---
768
+ Reads as a calm status line that belongs to the input surface: subtle
769
+ border, no fill, muted text. Progress is conveyed by the animated dots
770
+ rather than by color or size. */
670
771
  .background-tasks-bar {
671
772
  max-width: var(--content-width);
672
- margin: 0 auto 8px;
673
- border: 1px solid var(--border);
674
- border-radius: 8px;
675
- background: var(--input-bg);
773
+ margin: 0 auto 6px;
774
+ border: 1px solid var(--border-subtle);
775
+ border-radius: 10px;
776
+ background: transparent;
676
777
  overflow: hidden;
778
+ transition: border-color .15s ease, background-color .15s ease;
779
+ }
780
+
781
+ .background-tasks-bar:hover,
782
+ .background-tasks-bar.expanded {
783
+ border-color: var(--border);
784
+ background: var(--input-bg);
677
785
  }
678
786
 
679
787
  .background-tasks-toggle {
680
788
  width: 100%;
681
789
  display: flex;
682
790
  align-items: center;
683
- gap: 7px;
684
- padding: 8px 10px;
791
+ gap: 9px;
792
+ padding: 7px 11px;
685
793
  border: 0;
686
794
  background: transparent;
687
- color: var(--text-secondary);
795
+ color: var(--text-muted);
688
796
  cursor: pointer;
689
797
  font: inherit;
798
+ font-size: 12px;
690
799
  text-align: left;
691
800
  }
692
801
 
693
- .background-tasks-chip, .session-background-task-count {
694
- display: inline-flex;
695
- align-items: center;
696
- justify-content: center;
697
- min-width: 16px;
698
- height: 16px;
699
- padding: 0 4px;
700
- border-radius: 8px;
701
- background: var(--accent);
702
- color: var(--bg);
703
- font-size: 10px;
704
- font-weight: 700;
802
+ .background-tasks-toggle:hover { color: var(--text-secondary); }
803
+ .background-tasks-toggle:focus-visible { outline: 2px solid var(--accent); outline-offset: -2px; border-radius: 10px; }
804
+
805
+ .background-tasks-summary { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
806
+
807
+ /* Quiet three-dot activity indicator. Same motion as the Home debate dots
808
+ (home-debate-planning.css) but muted instead of accent-colored, since this
809
+ is ambient status rather than something asking to be read. */
810
+ .background-tasks-activity { display: inline-flex; align-items: center; gap: 3px; color: var(--text-muted); flex: none; }
811
+ .background-tasks-activity i { width: 4px; height: 4px; border-radius: 50%; background: currentColor; animation: background-tasks-pulse 1.4s ease-in-out infinite; }
812
+ .background-tasks-activity i:nth-child(2) { animation-delay: .18s; }
813
+ .background-tasks-activity i:nth-child(3) { animation-delay: .36s; }
814
+ @keyframes background-tasks-pulse { 0%, 70%, 100% { opacity: .28; } 35% { opacity: .95; } }
815
+
816
+ .background-tasks-chevron { display: inline-flex; flex: none; color: var(--text-muted); transition: transform .15s ease; }
817
+ .background-tasks-chevron i { width: 14px; height: 14px; }
818
+ .background-tasks-bar.expanded .background-tasks-chevron { transform: rotate(90deg); }
819
+
820
+ .background-tasks-list { padding: 0 11px 7px; }
821
+ .background-task-row { display: flex; align-items: center; gap: 9px; padding: 7px 0; border-top: 1px solid var(--border-subtle); font-size: 12px; }
822
+ .background-task-icon { display: inline-flex; flex: none; color: var(--text-muted); }
823
+ .background-task-icon i { width: 13px; height: 13px; }
824
+ .background-task-description { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: var(--text-secondary); }
825
+ /* Housekeeping group: visible so the user can see what Clay runs on its own,
826
+ but subordinate to the work they actually asked for. */
827
+ .background-tasks-section-label { padding: 9px 0 1px; border-top: 1px solid var(--border-subtle); color: var(--text-muted); font-size: 10px; font-weight: 600; letter-spacing: .07em; text-transform: uppercase; }
828
+ .background-tasks-section-label + .background-task-row { border-top: 0; }
829
+ .background-task-row.ambient .background-task-description { color: var(--text-muted); }
830
+ .background-task-row.ambient .background-task-icon { opacity: .7; }
831
+ .background-task-meta { display: inline-flex; align-items: center; gap: 7px; flex: none; color: var(--text-muted); }
832
+ .background-task-type { font-size: 11px; }
833
+ .background-task-elapsed { font-variant-numeric: tabular-nums; font-size: 11px; min-width: 44px; text-align: right; }
834
+ .background-task-stop { flex: none; border: 1px solid var(--border-subtle); border-radius: 6px; padding: 3px 8px; background: transparent; color: var(--text-muted); cursor: pointer; font: inherit; font-size: 11px; }
835
+ .background-task-stop:hover { color: var(--text); border-color: var(--border); }
836
+ .background-task-stop:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
837
+
838
+ @media (prefers-reduced-motion: reduce) {
839
+ .background-tasks-activity i { animation: none; opacity: .7; }
840
+ .background-tasks-bar, .background-tasks-chevron { transition: none; }
705
841
  }
706
842
 
707
- .background-tasks-list { padding: 0 10px 8px; }
708
- .background-task-row { display: flex; align-items: center; gap: 8px; padding: 6px 0; border-top: 1px solid var(--border-subtle); }
709
- .background-task-description { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
710
- .background-task-type { padding: 2px 6px; border-radius: 5px; background: var(--code-bg); color: var(--text-muted); font-size: 11px; }
711
- .background-task-stop { border: 1px solid var(--border); border-radius: 5px; padding: 3px 7px; background: transparent; color: var(--text-secondary); cursor: pointer; font: inherit; font-size: 12px; }
712
- .background-task-stop:hover { color: var(--text); border-color: var(--text-muted); }
843
+ @media (max-width: 600px) {
844
+ .background-task-meta { gap: 5px; }
845
+ .background-task-type { display: none; }
846
+ }
713
847
 
714
848
  #input-row {
715
849
  display: flex;
@@ -1216,6 +1350,7 @@
1216
1350
  Attach (files/images -> path injection) and voice input stay available. */
1217
1351
  body.tui-composer-active #schedule-btn,
1218
1352
  body.tui-composer-active #ask-mate-btn,
1353
+ body.tui-composer-active .composer-session-action,
1219
1354
  body.tui-composer-active #active-vendor-indicator,
1220
1355
  body.tui-composer-active #config-chip-wrap {
1221
1356
  display: none !important;