clay-server 4.0.0-beta.8 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (185) hide show
  1. package/lib/capsule-display-floor.js +51 -0
  2. package/lib/capsule-frame-server.js +255 -0
  3. package/lib/capsule-mate-turn.js +105 -0
  4. package/lib/capsule-pig-logic.js +300 -0
  5. package/lib/capsule-server-runtimes.js +39 -0
  6. package/lib/capsules/pig/display.js +198 -0
  7. package/lib/capsules/pig/manifest.json +9 -0
  8. package/lib/capsules/pig/ui.json +84 -0
  9. package/lib/config.js +25 -1
  10. package/lib/daemon-projects.js +13 -8
  11. package/lib/daemon.js +127 -14
  12. package/lib/git-cli.js +95 -1
  13. package/lib/knowledge-import.js +436 -0
  14. package/lib/knowledge-record-store.js +188 -0
  15. package/lib/knowledge-search.js +240 -0
  16. package/lib/mate-knowledge-mcp-server.js +151 -0
  17. package/lib/mate-knowledge-migration.js +283 -0
  18. package/lib/mate-knowledge-service.js +488 -0
  19. package/lib/mate-knowledge-sync.js +482 -0
  20. package/lib/migrate-single-user.js +2 -0
  21. package/lib/notes-lifecycle.js +149 -0
  22. package/lib/notes.js +60 -3
  23. package/lib/os-users.js +3 -1
  24. package/lib/project-capsule-catalog.js +9 -1
  25. package/lib/project-capsule-turn.js +96 -0
  26. package/lib/project-connection.js +15 -1
  27. package/lib/project-file-history.js +223 -0
  28. package/lib/project-file-watch.js +77 -49
  29. package/lib/project-filesystem.js +31 -220
  30. package/lib/project-http.js +15 -1
  31. package/lib/project-knowledge.js +22 -0
  32. package/lib/project-log-context.js +172 -0
  33. package/lib/project-log-feedback-delivery.js +118 -0
  34. package/lib/project-logs-comments.js +137 -0
  35. package/lib/project-logs-context-state.js +42 -0
  36. package/lib/project-logs-mcp-server.js +328 -0
  37. package/lib/project-logs-query.js +185 -0
  38. package/lib/project-logs-root.js +75 -0
  39. package/lib/project-logs-schema.js +259 -0
  40. package/lib/project-logs-service.js +463 -0
  41. package/lib/project-logs-snapshot.js +205 -0
  42. package/lib/project-logs-store.js +495 -0
  43. package/lib/project-logs-versioning.js +132 -0
  44. package/lib/project-logs.js +400 -0
  45. package/lib/project-mate-interaction.js +14 -0
  46. package/lib/project-mate-knowledge.js +110 -0
  47. package/lib/project-memory.js +22 -0
  48. package/lib/project-message-delivery.js +70 -0
  49. package/lib/project-pair-lifecycle.js +460 -0
  50. package/lib/project-request-access.js +66 -0
  51. package/lib/project-session-handoff.js +1 -1
  52. package/lib/project-session-notes.js +64 -13
  53. package/lib/project-session-pair.js +159 -146
  54. package/lib/project-session-spawn.js +1 -1
  55. package/lib/project-sessions.js +58 -13
  56. package/lib/project-user-message.js +53 -4
  57. package/lib/project-worker-permission.js +430 -0
  58. package/lib/project-worker-proposal.js +208 -62
  59. package/lib/project.js +185 -6
  60. package/lib/public/app.js +63 -35
  61. package/lib/public/css/admin.css +2 -2
  62. package/lib/public/css/capsule-ui.css +38 -0
  63. package/lib/public/css/command-palette.css +19 -9
  64. package/lib/public/css/git-placard.css +154 -0
  65. package/lib/public/css/home-hub.css +4 -0
  66. package/lib/public/css/home-session-actions.css +66 -0
  67. package/lib/public/css/home-sidebar.css +66 -0
  68. package/lib/public/css/input.css +84 -3
  69. package/lib/public/css/messages.css +40 -1
  70. package/lib/public/css/mobile-nav.css +80 -0
  71. package/lib/public/css/notifications-center.css +67 -0
  72. package/lib/public/css/pane.css +97 -10
  73. package/lib/public/css/project-logs.css +198 -0
  74. package/lib/public/css/scheduler.css +1 -1
  75. package/lib/public/css/session-actions.css +16 -101
  76. package/lib/public/css/sidebar.css +103 -0
  77. package/lib/public/css/sticky-notes.css +237 -229
  78. package/lib/public/css/worker-proposal.css +36 -3
  79. package/lib/public/index.html +43 -11
  80. package/lib/public/modules/admin.js +8 -8
  81. package/lib/public/modules/app-connection.js +124 -6
  82. package/lib/public/modules/app-home-hub.js +12 -8
  83. package/lib/public/modules/app-message-cards.js +2 -1
  84. package/lib/public/modules/app-messages.js +92 -11
  85. package/lib/public/modules/app-misc.js +2 -14
  86. package/lib/public/modules/app-notifications.js +11 -7
  87. package/lib/public/modules/app-panels.js +3 -2
  88. package/lib/public/modules/app-projects.js +56 -18
  89. package/lib/public/modules/app-rendering.js +1 -0
  90. package/lib/public/modules/capsule-preference.js +44 -0
  91. package/lib/public/modules/chat-bubble-renderer.js +1 -1
  92. package/lib/public/modules/clay-log-links.js +70 -0
  93. package/lib/public/modules/command-palette.js +52 -15
  94. package/lib/public/modules/context-sources.js +0 -3
  95. package/lib/public/modules/git-agent-sessions.js +85 -0
  96. package/lib/public/modules/git-panel.js +111 -84
  97. package/lib/public/modules/git-placard.js +161 -0
  98. package/lib/public/modules/home-chat-empty-state.js +39 -0
  99. package/lib/public/modules/home-chat-identity.js +9 -0
  100. package/lib/public/modules/home-conversations-sheet.js +102 -48
  101. package/lib/public/modules/home-mate-chat.js +15 -35
  102. package/lib/public/modules/home-session-actions.js +6 -0
  103. package/lib/public/modules/home-sidebar-chat-list.js +101 -41
  104. package/lib/public/modules/home-sidebar.js +7 -0
  105. package/lib/public/modules/home-surface-boot.js +7 -3
  106. package/lib/public/modules/home-tool-frame.js +182 -0
  107. package/lib/public/modules/home-tools.js +138 -1
  108. package/lib/public/modules/input.js +38 -7
  109. package/lib/public/modules/markdown.js +2 -0
  110. package/lib/public/modules/mate-sidebar.js +0 -8
  111. package/lib/public/modules/message-delivery.js +97 -0
  112. package/lib/public/modules/paste-modal.js +84 -0
  113. package/lib/public/modules/project-activation.js +45 -0
  114. package/lib/public/modules/project-logs-render.js +405 -0
  115. package/lib/public/modules/project-logs.js +461 -0
  116. package/lib/public/modules/project-removal-target.js +26 -0
  117. package/lib/public/modules/scheduler.js +17 -3
  118. package/lib/public/modules/session-actions.js +29 -105
  119. package/lib/public/modules/session-hierarchy.js +54 -0
  120. package/lib/public/modules/sidebar-mobile.js +40 -15
  121. package/lib/public/modules/sidebar-session-hierarchy.js +214 -0
  122. package/lib/public/modules/sidebar-sessions.js +77 -11
  123. package/lib/public/modules/sidebar.js +17 -5
  124. package/lib/public/modules/split-group-helpers.js +8 -0
  125. package/lib/public/modules/split-pair-ui.js +15 -4
  126. package/lib/public/modules/split-view.js +5 -2
  127. package/lib/public/modules/split-worker-runtime.js +24 -0
  128. package/lib/public/modules/sticky-note-markdown.js +5 -0
  129. package/lib/public/modules/sticky-notes-browser.js +326 -0
  130. package/lib/public/modules/sticky-notes-card.js +360 -0
  131. package/lib/public/modules/sticky-notes-editor.js +291 -0
  132. package/lib/public/modules/sticky-notes-shared.js +90 -0
  133. package/lib/public/modules/sticky-notes.js +170 -946
  134. package/lib/public/modules/thinking-lifecycle.js +175 -0
  135. package/lib/public/modules/thinking-summary.js +28 -0
  136. package/lib/public/modules/thinking-view.js +75 -0
  137. package/lib/public/modules/tool-palette-order.js +143 -0
  138. package/lib/public/modules/tool-palette-overlays.js +159 -0
  139. package/lib/public/modules/tool-palette.js +21 -188
  140. package/lib/public/modules/tools.js +31 -123
  141. package/lib/public/modules/update-snooze.js +169 -0
  142. package/lib/public/modules/user-settings.js +4 -0
  143. package/lib/public/modules/worker-pane-lock.js +176 -0
  144. package/lib/public/modules/worker-proposal-state.js +16 -0
  145. package/lib/public/modules/worker-proposal.js +49 -20
  146. package/lib/public/style.css +3 -1
  147. package/lib/sdk-bridge.js +135 -46
  148. package/lib/sdk-message-processor.js +36 -19
  149. package/lib/server-experimental-settings.js +49 -0
  150. package/lib/server-global-ws.js +11 -0
  151. package/lib/server-home-chat-events.js +31 -1
  152. package/lib/server-home-chat.js +27 -4
  153. package/lib/server-home-clay-entry.js +1 -1
  154. package/lib/server-home-clay-session-links.js +34 -5
  155. package/lib/server-settings.js +5 -0
  156. package/lib/server-tools.js +127 -9
  157. package/lib/server.js +137 -22
  158. package/lib/session-driver-eligibility.js +38 -0
  159. package/lib/session-driver-orchestration.js +31 -0
  160. package/lib/session-hygiene.js +3 -0
  161. package/lib/session-notes-mcp-server.js +25 -5
  162. package/lib/session-pair-factory.js +247 -0
  163. package/lib/session-pair-mcp-server.js +46 -8
  164. package/lib/session-pair-prompts.js +79 -0
  165. package/lib/session-pair-turn-control.js +153 -0
  166. package/lib/session-provenance.js +119 -0
  167. package/lib/session-spawn-mcp-server.js +1 -1
  168. package/lib/session-split-groups.js +4 -1
  169. package/lib/session-title-policy.js +60 -0
  170. package/lib/session-visibility.js +41 -0
  171. package/lib/sessions.js +57 -10
  172. package/lib/tools-registry.js +89 -10
  173. package/lib/update-snooze.js +437 -0
  174. package/lib/users-experimental-preferences.js +30 -0
  175. package/lib/users-permissions.js +6 -6
  176. package/lib/users.js +22 -16
  177. package/lib/workspace-query-access.js +102 -0
  178. package/lib/workspace-query-service.js +24 -17
  179. package/lib/worktree.js +25 -38
  180. package/lib/ws-schema.js +38 -7
  181. package/lib/yoke/adapters/claude-worker.js +16 -6
  182. package/lib/yoke/adapters/claude.js +12 -0
  183. package/lib/yoke/adapters/codex.js +24 -14
  184. package/lib/yoke/vendor-registry.js +1 -1
  185. package/package.json +2 -2
@@ -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 {
@@ -1270,6 +1350,7 @@
1270
1350
  Attach (files/images -> path injection) and voice input stay available. */
1271
1351
  body.tui-composer-active #schedule-btn,
1272
1352
  body.tui-composer-active #ask-mate-btn,
1353
+ body.tui-composer-active .composer-session-action,
1273
1354
  body.tui-composer-active #active-vendor-indicator,
1274
1355
  body.tui-composer-active #config-chip-wrap {
1275
1356
  display: none !important;
@@ -693,6 +693,8 @@ pre.mermaid-error {
693
693
 
694
694
  .thinking-header {
695
695
  display: inline-flex;
696
+ max-width: 100%;
697
+ box-sizing: border-box;
696
698
  align-items: center;
697
699
  gap: 6px;
698
700
  cursor: pointer;
@@ -726,9 +728,44 @@ pre.mermaid-error {
726
728
  .thinking-label {
727
729
  font-size: 13px;
728
730
  color: var(--text-muted);
731
+ min-width: 0;
732
+ overflow: hidden;
733
+ text-overflow: ellipsis;
734
+ white-space: nowrap;
729
735
  }
730
736
 
737
+ .thinking-live .thinking-header {
738
+ padding: 6px 0;
739
+ background: transparent;
740
+ border-radius: 0;
741
+ }
742
+
743
+ .thinking-live .thinking-chevron { display: none; }
744
+
745
+ .thinking-live .thinking-label {
746
+ background: linear-gradient(100deg, var(--text-muted) 40%, var(--text-dimmer) 50%, var(--text-muted) 60%);
747
+ background-size: 300% 100%;
748
+ background-clip: text;
749
+ -webkit-background-clip: text;
750
+ color: transparent;
751
+ animation: thinking-summary-shimmer 2.8s ease-in-out infinite;
752
+ }
753
+
754
+ @keyframes thinking-summary-shimmer {
755
+ from { background-position: 100% 0; }
756
+ to { background-position: 0% 0; }
757
+ }
758
+
759
+ @media (prefers-reduced-motion: reduce) {
760
+ .thinking-live .thinking-label { animation: none; background: none; color: var(--text-muted); }
761
+ }
762
+
763
+ .thinking-header[aria-disabled="true"] { cursor: default; }
764
+ .thinking-header:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
765
+ .thinking-item .thinking-spinner { display: none; }
766
+
731
767
  .thinking-duration {
768
+ flex-shrink: 0;
732
769
  color: var(--text-dimmer);
733
770
  font-size: 12px;
734
771
  }
@@ -753,7 +790,7 @@ pre.mermaid-error {
753
790
  font-size: 13px;
754
791
  line-height: 1.55;
755
792
  color: var(--text-muted);
756
- white-space: pre-wrap;
793
+ white-space: normal;
757
794
  word-break: break-word;
758
795
  max-height: 300px;
759
796
  overflow-y: auto;
@@ -762,6 +799,8 @@ pre.mermaid-error {
762
799
  }
763
800
 
764
801
  .thinking-item.expanded .thinking-content { display: block; }
802
+ .thinking-content > :first-child { margin-top: 0; }
803
+ .thinking-content > :last-child { margin-bottom: 0; }
765
804
 
766
805
  /* ==========================================================================
767
806
  Tool Items
@@ -612,6 +612,86 @@
612
612
  font-weight: 600;
613
613
  }
614
614
 
615
+ .mobile-driver-header {
616
+ display: flex;
617
+ align-items: center;
618
+ }
619
+
620
+ .mobile-driver-header > .mobile-session-item {
621
+ min-width: 0;
622
+ flex: 1;
623
+ }
624
+
625
+ .mobile-driver-toggle {
626
+ width: 32px;
627
+ height: 44px;
628
+ padding: 0;
629
+ border: 0;
630
+ border-radius: 8px;
631
+ display: inline-flex;
632
+ align-items: center;
633
+ justify-content: center;
634
+ color: var(--text-dimmer);
635
+ background: transparent;
636
+ }
637
+
638
+ .mobile-driver-toggle .lucide,
639
+ .mobile-orphan-toggle .lucide {
640
+ width: 15px;
641
+ height: 15px;
642
+ transition: transform 0.15s ease;
643
+ }
644
+
645
+ .mobile-driver-toggle[aria-expanded="true"] .lucide,
646
+ .mobile-orphan-toggle[aria-expanded="true"] .lucide {
647
+ transform: rotate(90deg);
648
+ }
649
+
650
+ .mobile-worker-children {
651
+ margin-left: 16px;
652
+ padding-left: 12px;
653
+ border-left: 1px solid color-mix(in srgb, var(--text-dimmer) 24%, transparent);
654
+ }
655
+
656
+ .mobile-worker-item {
657
+ min-height: 43px;
658
+ padding-block: 9px;
659
+ }
660
+
661
+ .mobile-worker-generation {
662
+ flex-shrink: 0;
663
+ padding: 2px 6px;
664
+ border-radius: 999px;
665
+ color: var(--text-dimmer);
666
+ background: rgba(var(--overlay-rgb), 0.04);
667
+ font-size: 10px;
668
+ font-weight: 650;
669
+ }
670
+
671
+ .mobile-worker-generation.current {
672
+ color: var(--success);
673
+ background: color-mix(in srgb, var(--success) 10%, transparent);
674
+ }
675
+
676
+ .mobile-orphan-toggle {
677
+ width: 100%;
678
+ min-height: 42px;
679
+ padding: 8px 12px;
680
+ border: 0;
681
+ border-radius: 9px;
682
+ display: flex;
683
+ align-items: center;
684
+ gap: 9px;
685
+ color: var(--text-dimmer);
686
+ background: transparent;
687
+ font: inherit;
688
+ text-align: left;
689
+ }
690
+
691
+ .mobile-orphan-toggle span:first-of-type {
692
+ flex: 1;
693
+ }
694
+
615
695
  .mobile-session-title {
616
696
  flex: 1;
617
697
  display: inline-flex;