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
@@ -319,6 +319,73 @@
319
319
  .notif-banner-update-now:hover { opacity: 0.85; }
320
320
  .notif-banner-update-now:disabled { opacity: 0.6; cursor: default; }
321
321
 
322
+ /* Snooze: the quiet sibling of "Update now". Same button metrics so the two
323
+ sit on one row, but a bordered surface instead of the accent fill, because
324
+ postponing should never read as the primary action. */
325
+ .notif-banner-snooze { position: relative; display: inline-flex; }
326
+ .notif-banner-snooze-btn {
327
+ display: inline-flex;
328
+ align-items: center;
329
+ gap: 4px;
330
+ padding: 4px 10px;
331
+ border-radius: 6px;
332
+ font-size: 11px;
333
+ font-weight: 600;
334
+ font-family: inherit;
335
+ cursor: pointer;
336
+ border: 1px solid rgba(var(--overlay-rgb), 0.22);
337
+ background: transparent;
338
+ color: inherit;
339
+ opacity: 0.85;
340
+ transition: opacity 0.15s, border-color 0.15s;
341
+ }
342
+ .notif-banner-snooze-btn:hover { opacity: 1; border-color: rgba(var(--overlay-rgb), 0.4); }
343
+ .notif-banner-snooze-btn:focus-visible {
344
+ outline: none;
345
+ opacity: 1;
346
+ border-color: var(--accent, #6c5ce7);
347
+ box-shadow: 0 0 0 2px rgba(var(--overlay-rgb), 0.18);
348
+ }
349
+ .notif-banner-snooze-btn .lucide { width: 11px; height: 11px; }
350
+
351
+ .notif-banner-snooze-menu {
352
+ position: absolute;
353
+ bottom: calc(100% + 4px);
354
+ left: 0;
355
+ z-index: 5;
356
+ min-width: 116px;
357
+ padding: 4px;
358
+ display: flex;
359
+ flex-direction: column;
360
+ gap: 1px;
361
+ border-radius: 8px;
362
+ border: 1px solid rgba(var(--overlay-rgb), 0.16);
363
+ background: var(--bg-alt, #20201d);
364
+ box-shadow: 0 8px 22px rgba(var(--shadow-rgb), 0.32);
365
+ }
366
+ .notif-banner-snooze-item {
367
+ padding: 5px 8px;
368
+ border: 0;
369
+ border-radius: 5px;
370
+ background: transparent;
371
+ color: inherit;
372
+ font-family: inherit;
373
+ font-size: 11px;
374
+ font-weight: 500;
375
+ text-align: left;
376
+ cursor: pointer;
377
+ }
378
+ .notif-banner-snooze-item:hover { background: rgba(var(--overlay-rgb), 0.1); }
379
+ .notif-banner-snooze-item:focus-visible {
380
+ outline: none;
381
+ background: rgba(var(--overlay-rgb), 0.14);
382
+ box-shadow: inset 0 0 0 1px var(--accent, #6c5ce7);
383
+ }
384
+
385
+ @media (prefers-reduced-motion: reduce) {
386
+ .notif-banner-snooze-btn { transition: none; }
387
+ }
388
+
322
389
  .light-theme .notif-banner-clear-all {
323
390
  background:
324
391
  linear-gradient(180deg, rgba(255,255,255,0.54), rgba(255,255,255,0.28)),
@@ -104,6 +104,49 @@ body.pane-mode #input-area {
104
104
  flex-shrink: 0;
105
105
  }
106
106
 
107
+ .split-pane-header.has-worker-runtime {
108
+ flex-wrap: nowrap;
109
+ }
110
+
111
+ .split-pane-header.has-worker-runtime .split-pane-context {
112
+ order: 1;
113
+ }
114
+
115
+ .split-pane-header.has-worker-runtime .split-pane-close {
116
+ order: 2;
117
+ flex-shrink: 0;
118
+ }
119
+
120
+ .split-worker-runtime {
121
+ flex: 0 1 auto;
122
+ min-width: 0;
123
+ display: flex;
124
+ align-items: center;
125
+ gap: 8px;
126
+ font-size: 11px;
127
+ line-height: 18px;
128
+ white-space: nowrap;
129
+ }
130
+
131
+ .split-worker-runtime-model {
132
+ min-width: 0;
133
+ overflow: hidden;
134
+ text-overflow: ellipsis;
135
+ white-space: nowrap;
136
+ color: var(--text);
137
+ font-weight: 600;
138
+ }
139
+
140
+ .split-worker-runtime-thinking {
141
+ min-width: 0;
142
+ overflow: hidden;
143
+ text-overflow: ellipsis;
144
+ padding: 0 6px;
145
+ border-radius: 4px;
146
+ background: var(--bg-alt);
147
+ color: var(--text-secondary);
148
+ }
149
+
107
150
  .split-pane-title {
108
151
  flex: 0 1 auto;
109
152
  max-width: 46%;
@@ -192,8 +235,7 @@ body.pane-mode #input-area {
192
235
  @keyframes pair-divider-flow-left { 0%, 100% { transform: translateX(3px); opacity: 0.65; } 50% { transform: translateX(-3px); opacity: 1; } }
193
236
  @keyframes pair-status-pulse { 50% { opacity: 0.55; } }
194
237
 
195
- /* Worker-pane composer notice: shown while this pane's session processes a
196
- delegated turn. Informational only -- the composer stays enabled. */
238
+ /* Worker activity notice shown while this pane processes a delegated task. */
197
239
  .pane-delegation-notice {
198
240
  display: none;
199
241
  align-items: center;
@@ -202,7 +244,7 @@ body.pane-mode #input-area {
202
244
  max-width: var(--content-width);
203
245
  margin: 0 auto;
204
246
  padding: 4px 10px;
205
- border-radius: 8px 8px 0 0;
247
+ border-radius: 8px;
206
248
  background: color-mix(in srgb, var(--accent) 8%, var(--bg));
207
249
  color: var(--text-secondary);
208
250
  font-size: 11px;
@@ -210,13 +252,6 @@ body.pane-mode #input-area {
210
252
  transition: box-shadow 0.2s;
211
253
  }
212
254
  .pane-delegation-notice.visible { display: flex; }
213
- .pane-delegation-notice.visible:has(+ #input-wrapper #input-row:focus-within) {
214
- box-shadow: 0 0 0 1px var(--border);
215
- clip-path: inset(-1px -1px 0 -1px);
216
- }
217
- .pane-delegation-notice.visible + #input-wrapper #input-row {
218
- border-radius: 0 0 8px 8px;
219
- }
220
255
  .pane-delegation-notice::before {
221
256
  content: "";
222
257
  width: 6px;
@@ -463,3 +498,55 @@ body.sticky-note-interacting .split-pane-frame {
463
498
  font-size: 13px;
464
499
  font-weight: 700;
465
500
  }
501
+
502
+ /* Driver-operated Split Worker surface.
503
+ ------------------------------------------------------------------
504
+ The composer is gone, so the region needs to read as "execution
505
+ surface", not "chat with a broken input". The whole treatment is one
506
+ line in the composer's own footprint: same content width, same
507
+ horizontal rhythm, deliberately shorter than the input it replaces so
508
+ the transcript gains the space rather than a warning banner taking it.
509
+
510
+ Utilitarian on purpose. A hairline top rule and a small steady dot
511
+ carry the state; there is no panel, no card, no icon set, no colour
512
+ alarm. The dot does not pulse — a standing condition should not
513
+ animate. Muted text, uppercase micro-label with wide tracking: it
514
+ reads as instrumentation, which is what it is. */
515
+ #input-area .worker-pane-status {
516
+ display: none;
517
+ align-items: center;
518
+ justify-content: center;
519
+ gap: 7px;
520
+ width: 100%;
521
+ max-width: var(--content-width);
522
+ margin: 0 auto;
523
+ padding: 9px 12px calc(9px + var(--safe-bottom, 0px));
524
+ border-top: 1px solid var(--border-subtle);
525
+ color: var(--text-dimmer);
526
+ font-family: inherit;
527
+ font-size: 10px;
528
+ font-weight: 600;
529
+ letter-spacing: 0.07em;
530
+ text-transform: uppercase;
531
+ user-select: none;
532
+ }
533
+ #input-area .worker-pane-status.visible { display: flex; }
534
+
535
+ .worker-pane-status-mark {
536
+ width: 5px;
537
+ height: 5px;
538
+ border-radius: 50%;
539
+ flex-shrink: 0;
540
+ background: var(--text-dimmer);
541
+ /* A faint halo so the dot reads as a live indicator at 5px rather than
542
+ as a stray period, without becoming a status "light". */
543
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--text-dimmer) 14%, transparent);
544
+ }
545
+
546
+ /* The composer is hidden rather than removed, so the transcript keeps its
547
+ scroll container and nothing reflows when a pair dissolves. */
548
+ body.worker-pane-locked #input-wrapper { display: none; }
549
+ body.worker-pane-locked #input-area {
550
+ padding-top: 0;
551
+ background: transparent;
552
+ }
@@ -0,0 +1,198 @@
1
+ /* Project Logs — a restrained editorial ledger, designed for close reading. */
2
+
3
+ /* Wide screens: bounded workbench window beside #app, matching the geometry of
4
+ the document viewer and the terminal. */
5
+ @media (min-width: 1024px) {
6
+ #project-logs-panel {
7
+ width: 50%;
8
+ max-width: 720px;
9
+ min-width: 360px;
10
+ height: calc(100% - 16px);
11
+ min-height: 0;
12
+ align-self: center;
13
+ margin: 8px 8px 8px 10px;
14
+ border: 1px solid var(--border);
15
+ border-radius: 12px;
16
+ background: var(--bg);
17
+ display: flex;
18
+ flex-direction: column;
19
+ overflow: hidden;
20
+ flex-shrink: 0;
21
+ box-shadow:
22
+ 4px 8px 18px rgba(var(--shadow-rgb), 0.14),
23
+ 2px 2px 4px rgba(var(--shadow-rgb), 0.08),
24
+ inset 0 1px 0 rgba(255, 255, 255, 0.04);
25
+ animation: workbench-panel-in 0.18s cubic-bezier(0.2, 0.8, 0.2, 1);
26
+ transition: max-width 0.2s ease, width 0.2s ease, box-shadow 0.2s ease;
27
+ }
28
+ #project-logs-panel.hidden { display: none; }
29
+ #project-logs-panel.project-logs-wide {
30
+ width: 70%;
31
+ max-width: 1200px;
32
+ }
33
+ #project-logs-panel.panel-fullscreen {
34
+ width: 100%;
35
+ max-width: none;
36
+ min-width: 0;
37
+ height: 100%;
38
+ margin: 0;
39
+ border: 0;
40
+ border-radius: 0;
41
+ box-shadow: none;
42
+ animation: none;
43
+ }
44
+ }
45
+
46
+ @media (prefers-reduced-motion: reduce) {
47
+ #project-logs-panel { animation: none; }
48
+ }
49
+
50
+ /* Narrow screens: full overlay, like the other workbench tools. */
51
+ @media (max-width: 1023px) {
52
+ #project-logs-panel {
53
+ position: fixed;
54
+ top: 0;
55
+ left: 0;
56
+ right: 0;
57
+ bottom: 0;
58
+ padding-top: var(--safe-top);
59
+ padding-bottom: var(--safe-bottom);
60
+ background: var(--bg);
61
+ z-index: 300;
62
+ display: flex;
63
+ flex-direction: column;
64
+ overflow: hidden;
65
+ }
66
+ #project-logs-panel.hidden { display: none; }
67
+ /* Sizing controls are meaningless in the overlay presentation. */
68
+ #project-logs-wide,
69
+ #project-logs-fullscreen { display: none; }
70
+ }
71
+ .project-logs-topbar {
72
+ height: 48px;
73
+ display: flex;
74
+ align-items: center;
75
+ gap: 12px;
76
+ padding: 0 16px;
77
+ border-bottom: 1px solid var(--border-subtle);
78
+ flex: 0 0 auto;
79
+ }
80
+ .project-logs-title { display: inline-flex; align-items: center; gap: 7px; font-weight: 700; color: var(--text); }
81
+ .project-logs-title .lucide { width: 15px; color: var(--accent); }
82
+ .project-logs-subtitle { flex: 1; color: var(--text-dimmer); font-size: 12px; }
83
+ .project-logs-icon-btn {
84
+ border: 1px solid var(--border);
85
+ border-radius: 7px;
86
+ background: var(--bg-alt);
87
+ color: var(--text-secondary);
88
+ font: inherit;
89
+ cursor: pointer;
90
+ }
91
+ .project-logs-icon-btn { width: 30px; height: 30px; display: inline-flex; align-items: center; justify-content: center; flex: 0 0 auto; }
92
+ .project-logs-icon-btn.hidden { display: none; }
93
+ .project-logs-icon-btn .lucide { width: 15px; }
94
+ .project-logs-icon-btn[aria-pressed="true"] { border-color: var(--accent); color: var(--accent); }
95
+ .project-logs-icon-btn:disabled { opacity: 0.4; cursor: default; }
96
+ .project-logs-window-actions { display: inline-flex; align-items: center; gap: 6px; }
97
+ /* The explicit tool button is the only discovery affordance. */
98
+ #project-logs-btn.project-logs-unread { color: var(--accent); }
99
+ #project-logs-count { background: var(--accent); color: #fff; }
100
+
101
+ /* --- Ledger toolbar --- */
102
+ .project-logs-toolbar { display: flex; align-items: center; gap: 8px; padding: 12px 14px; border-bottom: 1px solid var(--border-subtle); flex: 0 0 auto; background: color-mix(in srgb, var(--bg-alt) 72%, transparent); }
103
+ .project-logs-toolbar.hidden { display: none; }
104
+ .project-logs-search { flex: 1; min-width: 0; height: 36px; display: flex; align-items: center; gap: 8px; padding: 0 10px; border: 1px solid var(--border); border-radius: 6px; background: var(--bg); color: var(--text-dimmer); }
105
+ .project-logs-search .lucide { width: 14px; flex: 0 0 auto; }
106
+ .project-logs-search input { width: 100%; border: 0; outline: 0; background: transparent; color: var(--text); font: inherit; font-size: 12px; }
107
+ .project-logs-search:focus-within, .project-logs-filter:focus-visible { outline: 2px solid color-mix(in srgb, var(--accent) 35%, transparent); border-color: var(--accent); }
108
+ .project-logs-filter { height: 36px; max-width: 180px; padding: 0 8px; border: 1px solid var(--border); border-radius: 6px; background: var(--bg); color: var(--text-secondary); font: inherit; font-size: 12px; cursor: pointer; }
109
+ .project-logs-context-filter { max-width: 148px; }
110
+ .project-log-context-chip { display: inline-flex; align-items: center; min-height: 22px; padding: 2px 7px; border-radius: 999px; background: var(--bg-alt); color: var(--text-secondary); font-size: 11px; font-weight: 600; }
111
+ .project-log-context-chip[data-status="archived"] { opacity: .72; }
112
+ .project-log-context-chip[data-status="merged"] { color: var(--success, #2f8f57); }
113
+
114
+ /* --- Ledger list: full pane, chronological, commit-history feel --- */
115
+ .project-logs-list { flex: 1; min-height: 0; overflow-y: auto; padding: 8px 0 18px; }
116
+ .project-logs-list.hidden { display: none; }
117
+ .project-log-row { width: 100%; display: block; padding: 15px 18px 14px; border: 0; border-bottom: 1px solid var(--border-subtle); border-left: 2px solid transparent; background: transparent; color: inherit; text-align: left; cursor: pointer; transition: background 0.14s ease, border-color 0.14s ease; }
118
+ .project-log-row:hover { background: color-mix(in srgb, var(--accent) 5%, transparent); border-left-color: var(--accent); }
119
+ .project-log-row:focus-visible { outline: 2px solid var(--accent); outline-offset: -3px; }
120
+ .project-log-row:last-child { border-bottom: 0; }
121
+ .project-log-row-head { display: flex; align-items: baseline; gap: 7px; flex-wrap: wrap; }
122
+ .project-log-row-title { flex: 1; min-width: 0; font-size: 14px; font-weight: 700; letter-spacing: -0.01em; color: var(--text); }
123
+ .project-log-row-summary { margin: 7px 0 0; color: var(--text-secondary); font-size: 12.5px; line-height: 1.55; }
124
+ .project-log-row-meta { margin-top: 8px; color: var(--text-dimmer); font-size: 10.5px; font-family: var(--font-mono); }
125
+ .project-logs-list-empty { max-width: 320px; margin: 54px auto; padding: 20px; border-top: 1px solid var(--border); border-bottom: 1px solid var(--border); color: var(--text-dimmer); font-size: 12px; text-align: center; line-height: 1.7; }
126
+ .project-logs-list[aria-busy="true"] .project-logs-list-empty { color: var(--text-secondary); font-family: var(--font-mono); }
127
+
128
+ /* Category chip and priority signal. Categories are project-defined, so the
129
+ chip is deliberately neutral: no per-category selectors and no exhaustive
130
+ class list, because the vocabulary is not known at build time. Priority
131
+ carries the only stable colour, since urgency is a fixed scale. */
132
+ .project-log-chip { flex: 0 0 auto; max-width: 14em; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; padding: 2px 7px; border-radius: 999px; background: rgba(var(--overlay-rgb), 0.08); color: var(--text-secondary); font-size: 10px; font-weight: 700; letter-spacing: 0.03em; text-transform: uppercase; }
133
+ .project-log-priority { flex: 0 0 auto; padding: 2px 6px; border-radius: 5px; font-size: 10px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.03em; }
134
+ .project-log-priority[data-priority="important"] { background: color-mix(in srgb, #f5a524 18%, transparent); color: #f5a524; }
135
+ .project-log-priority[data-priority="urgent"] { background: color-mix(in srgb, #e5484d 20%, transparent); color: #e5484d; }
136
+
137
+ /* --- Entry detail: full pane, replaces the list --- */
138
+ .project-logs-detail { flex: 1; min-width: 0; min-height: 0; overflow-y: auto; }
139
+ .project-logs-detail.hidden { display: none; }
140
+ .project-log-document { max-width: 760px; margin: 0 auto; padding: 32px 28px 52px; }
141
+ #project-logs-panel.panel-fullscreen .project-log-document { padding: clamp(28px, 5vw, 64px); }
142
+ .project-log-doc-chips { display: flex; align-items: center; gap: 7px; margin-bottom: 10px; }
143
+ .project-log-document h1 { margin: 0 0 10px; color: var(--text); font-family: var(--font-display); font-size: clamp(24px, 2.8vw, 34px); letter-spacing: -0.025em; line-height: 1.12; }
144
+ .project-log-doc-summary { margin: 0 0 13px; color: var(--text-secondary); font-size: 14px; line-height: 1.6; }
145
+ .project-log-byline { margin: 0 0 25px; padding-bottom: 18px; border-bottom: 2px solid var(--border-subtle); color: var(--text-dimmer); font-size: 11px; font-family: var(--font-mono); }
146
+ .project-log-delete-button { display: inline-flex; align-items: center; gap: 6px; margin: -11px 0 24px; padding: 6px 9px; border: 1px solid color-mix(in srgb, var(--danger) 45%, var(--border)); border-radius: 7px; background: transparent; color: var(--danger); font: inherit; font-size: 11px; font-weight: 700; cursor: pointer; }
147
+ .project-log-delete-button .lucide { width: 13px; }
148
+ .project-log-markdown { font-size: 14px; line-height: 1.75; }
149
+
150
+ .project-log-delete-dialog { position: fixed; inset: 0; z-index: 420; display: flex; align-items: center; justify-content: center; padding: 20px; background: rgba(var(--shadow-rgb), 0.5); }
151
+ .project-log-delete-dialog.hidden { display: none; }
152
+ .project-log-delete-dialog-card { width: min(420px, 100%); padding: 20px; border: 1px solid var(--border); border-radius: 12px; background: var(--bg); box-shadow: 0 18px 50px rgba(var(--shadow-rgb), 0.3); }
153
+ .project-log-delete-dialog-card h2 { margin: 0 0 9px; color: var(--text); font-family: var(--font-display); font-size: 18px; }
154
+ .project-log-delete-dialog-card p { margin: 0; color: var(--text-secondary); font-size: 13px; line-height: 1.55; }
155
+ .project-log-delete-dialog-title { margin-top: 9px !important; color: var(--text) !important; font-weight: 700; overflow-wrap: anywhere; }
156
+ .project-log-delete-dialog-status { min-height: 17px; margin-top: 11px !important; color: var(--danger) !important; font-size: 11px !important; }
157
+ .project-log-delete-dialog-actions { display: flex; justify-content: flex-end; gap: 8px; margin-top: 14px; }
158
+ .project-log-delete-dialog-actions button { padding: 7px 12px; border: 1px solid var(--border); border-radius: 7px; background: var(--bg-alt); color: var(--text-secondary); font: inherit; font-size: 12px; font-weight: 700; cursor: pointer; }
159
+ .project-log-delete-dialog-actions button.danger { border-color: var(--danger); background: var(--danger); color: #fff; }
160
+ .project-log-delete-dialog-actions button:disabled { opacity: 0.5; cursor: default; }
161
+
162
+ /* --- Discussion --- */
163
+ .project-log-discussion { margin-top: 30px; padding-top: 18px; border-top: 1px solid var(--border-subtle); }
164
+ .project-log-discussion h2 { margin: 0 0 12px; color: var(--text); font-family: var(--font-display); font-size: 15px; }
165
+ .project-log-discussion-empty { margin: 0; color: var(--text-dimmer); font-size: 12px; }
166
+ .project-log-comment { padding: 10px 12px; margin-bottom: 8px; border: 1px solid var(--border-subtle); border-radius: 9px; background: var(--bg-alt); }
167
+ .project-log-comment-meta { margin: 0 0 5px; color: var(--text-dimmer); font-size: 10.5px; font-family: var(--font-mono); }
168
+ .project-log-comment-body { margin: 0; color: var(--text); font-size: 13px; line-height: 1.55; white-space: pre-wrap; }
169
+ .project-log-comment-status-badge { display: inline-block; margin-top: 7px; padding: 2px 7px; border-radius: 999px; background: rgba(var(--overlay-rgb), 0.08); color: var(--text-dimmer); font-size: 10px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.03em; }
170
+ .project-log-comment-status-badge[data-status="incorporated"] { background: color-mix(in srgb, var(--brand-green) 16%, transparent); color: var(--brand-green); }
171
+ .project-log-comment-status-badge[data-status="clarification-needed"] { background: color-mix(in srgb, #f5a524 18%, transparent); color: #f5a524; }
172
+ .project-log-comment-response { margin-top: 9px; padding: 8px 10px; border-left: 2px solid var(--accent); background: rgba(var(--overlay-rgb), 0.04); border-radius: 0 7px 7px 0; }
173
+ .project-log-comment-response-meta { margin: 0 0 4px; color: var(--text-dimmer); font-size: 10.5px; font-family: var(--font-mono); }
174
+ .project-log-comment-response-body { margin: 0; color: var(--text); font-size: 12.5px; line-height: 1.55; white-space: pre-wrap; }
175
+ .project-log-history { margin-top: 26px; padding-top: 16px; border-top: 1px solid var(--border-subtle); }
176
+ .project-log-history h2 { margin: 0 0 10px; color: var(--text); font-family: var(--font-display); font-size: 14px; }
177
+ .project-log-history-list { margin: 0; padding: 0; list-style: none; display: grid; gap: 5px; }
178
+ .project-log-history-row { display: flex; align-items: baseline; gap: 8px; font-size: 11.5px; }
179
+ .project-log-history-label { flex: 0 0 auto; color: var(--text-dimmer); font-family: var(--font-mono); font-weight: 700; }
180
+ .project-log-history-text { color: var(--text-secondary); }
181
+ .project-log-history-reason { color: var(--text-dimmer); font-style: italic; }
182
+ .project-log-comment-form { display: grid; gap: 8px; margin-top: 18px; }
183
+ .project-log-comment-form label { color: var(--text-secondary); font-size: 11px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.06em; }
184
+ .project-log-comment-form textarea { width: 100%; min-height: 80px; padding: 10px; border: 1px solid var(--border); border-radius: 8px; background: var(--bg-alt); color: var(--text); font: inherit; font-size: 13px; line-height: 1.55; resize: vertical; box-sizing: border-box; }
185
+ .project-log-comment-form textarea:focus { outline: 2px solid color-mix(in srgb, var(--accent) 35%, transparent); border-color: var(--accent); }
186
+ .project-log-comment-status { min-height: 16px; margin: 0; color: var(--text-dimmer); font-size: 11px; }
187
+ .project-log-comment-actions { display: flex; justify-content: flex-end; }
188
+ .project-log-comment-actions button { padding: 7px 14px; border: 1px solid var(--border); border-radius: 7px; background: var(--bg-alt); color: var(--text-secondary); font: inherit; font-weight: 700; font-size: 12px; cursor: pointer; }
189
+ .project-log-comment-actions button.primary { border-color: var(--accent); background: var(--accent); color: #fff; }
190
+
191
+ @media (max-width: 768px) {
192
+ .project-logs-subtitle { display: none; }
193
+ .project-logs-topbar { gap: 8px; padding: 0 12px; }
194
+ .project-logs-toolbar { padding: 10px 12px; }
195
+ .project-logs-filter { max-width: 42%; }
196
+ .project-log-row { padding: 14px 14px 13px; }
197
+ .project-log-document { padding: 24px 18px 38px; }
198
+ }
@@ -6,7 +6,7 @@
6
6
  #scheduler-panel {
7
7
  position: absolute;
8
8
  inset: 0;
9
- z-index: 40;
9
+ z-index: 240;
10
10
  background: var(--bg);
11
11
  display: flex;
12
12
  flex-direction: column;
@@ -1,119 +1,34 @@
1
- #header-session-actions-btn {
1
+ .composer-session-action {
2
2
  display: inline-flex;
3
3
  align-items: center;
4
4
  justify-content: center;
5
- gap: 6px;
6
- width: auto;
7
- height: 28px;
5
+ width: 36px;
6
+ height: 36px;
8
7
  margin: 0;
9
- padding: 0 9px;
10
- border: 1px solid var(--border-subtle);
11
- border-radius: 8px;
12
- background: color-mix(in srgb, var(--brand-indigo) 5%, var(--bg));
13
- color: var(--text-secondary);
8
+ padding: 0;
9
+ border: 0;
10
+ border-radius: 50%;
11
+ background: transparent;
12
+ color: var(--text-muted);
14
13
  cursor: pointer;
15
14
  flex-shrink: 0;
16
15
  font: inherit;
17
- font-size: 11px;
18
- font-weight: 650;
19
- white-space: nowrap;
20
- transition: color 0.15s, background 0.15s, border-color 0.15s;
16
+ transition: color 0.15s, background 0.15s, opacity 0.15s;
21
17
  }
22
18
 
23
- #header-session-actions-btn:hover,
24
- #header-session-actions-btn[aria-expanded="true"] {
19
+ .composer-session-action:hover:not(:disabled) {
25
20
  color: var(--text);
26
- background: color-mix(in srgb, var(--brand-indigo) 9%, var(--bg));
27
- border-color: color-mix(in srgb, var(--brand-indigo) 32%, var(--border));
21
+ background: rgba(var(--overlay-rgb), 0.06);
28
22
  }
29
23
 
30
- #header-session-actions-btn:focus { outline: none; }
31
- #header-session-actions-btn:focus-visible {
32
- border-color: color-mix(in srgb, var(--link) 48%, var(--border));
24
+ .composer-session-action:focus { outline: none; }
25
+ .composer-session-action:focus-visible {
33
26
  box-shadow: 0 0 0 2px color-mix(in srgb, var(--link) 18%, transparent);
34
27
  }
35
28
 
36
- #header-session-actions-btn.hidden { display: none; }
37
- #header-session-actions-btn .lucide:first-child {
38
- width: 14px;
39
- height: 14px;
40
- color: color-mix(in srgb, var(--brand-indigo) 78%, var(--text));
41
- }
42
-
43
- #header-session-actions-btn .session-actions-trigger-chevron {
44
- width: 13px;
45
- height: 13px;
46
- transition: transform 0.16s ease;
47
- }
48
-
49
- #header-session-actions-btn[aria-expanded="true"] .session-actions-trigger-chevron {
50
- transform: rotate(180deg);
51
- }
52
-
53
- .session-actions-menu {
54
- position: fixed;
55
- z-index: 10020;
56
- width: min(300px, calc(100vw - 16px));
57
- padding: 6px;
58
- border: 1px solid var(--border);
59
- border-radius: 12px;
60
- background: color-mix(in srgb, var(--bg) 96%, transparent);
61
- box-shadow: 0 14px 38px rgba(var(--shadow-rgb), 0.32), 0 2px 8px rgba(var(--shadow-rgb), 0.2);
62
- backdrop-filter: blur(18px);
63
- }
64
-
65
- .session-actions-row {
66
- width: 100%;
67
- border: 0;
68
- background: transparent;
69
- color: var(--text);
70
- font: inherit;
71
- text-align: left;
72
- cursor: pointer;
73
- }
74
-
75
- .session-actions-row {
76
- display: grid;
77
- grid-template-columns: 30px minmax(0, 1fr) 16px;
78
- align-items: center;
79
- gap: 8px;
80
- min-height: 54px;
81
- padding: 7px 8px;
82
- border-radius: 8px;
83
- }
84
-
85
- .session-actions-row:hover { background: var(--bg-alt); }
86
- .session-actions-row.is-primary {
87
- background: color-mix(in srgb, var(--brand-indigo) 6%, transparent);
88
- }
89
- .session-actions-row.is-primary:hover {
90
- background: color-mix(in srgb, var(--brand-indigo) 10%, transparent);
91
- }
92
- .session-actions-row.is-primary .session-actions-row-icon {
93
- border-color: transparent;
94
- background: var(--brand-indigo);
95
- color: var(--brand-paper);
96
- }
97
- .session-actions-row:disabled { cursor: default; opacity: 0.42; }
98
- .session-actions-row:disabled:hover { background: transparent; }
99
-
100
- .session-actions-row-icon {
101
- display: grid;
102
- place-items: center;
103
- width: 28px;
104
- height: 28px;
105
- border: 1px solid var(--border-subtle);
106
- border-radius: 8px;
107
- background: rgba(var(--overlay-rgb), 0.035);
108
- color: color-mix(in srgb, var(--accent2) 38%, var(--text-secondary));
109
- }
110
-
111
- .session-actions-row-icon .lucide { width: 15px; height: 15px; }
112
- .session-actions-row-copy { display: flex; min-width: 0; flex-direction: column; gap: 2px; }
113
- .session-actions-row-copy strong { font-size: 12px; font-weight: 750; }
114
- .session-actions-row-copy > span { color: var(--text-muted); font-size: 11px; line-height: 1.35; }
115
- .session-actions-row-chevron { color: var(--text-muted); }
116
- .session-actions-row-chevron .lucide { width: 13px; height: 13px; }
29
+ .composer-session-action.hidden { display: none; }
30
+ .composer-session-action:disabled { cursor: default; opacity: 0.32; }
31
+ .composer-session-action .lucide { width: 20px; height: 20px; }
117
32
 
118
33
  .handoff-modal { width: min(420px, calc(100vw - 32px)); }
119
34
  .handoff-modal-desc { margin: -10px 0 14px; color: var(--text-dimmer); font-size: 12px; line-height: 1.45; }
@@ -926,6 +926,109 @@
926
926
  transition: opacity 0.15s;
927
927
  }
928
928
 
929
+ .session-driver-hierarchy {
930
+ position: relative;
931
+ }
932
+
933
+ .session-driver-header {
934
+ display: flex;
935
+ align-items: center;
936
+ }
937
+
938
+ .session-driver-header > .session-item {
939
+ min-width: 0;
940
+ flex: 1;
941
+ padding-left: 0;
942
+ }
943
+
944
+ .session-driver-toggle {
945
+ width: 18px;
946
+ height: 24px;
947
+ padding: 0;
948
+ border: 0;
949
+ border-radius: 5px;
950
+ display: inline-flex;
951
+ align-items: center;
952
+ justify-content: center;
953
+ flex-shrink: 0;
954
+ color: var(--text-dimmer);
955
+ background: transparent;
956
+ cursor: pointer;
957
+ }
958
+
959
+ .session-driver-toggle:hover,
960
+ .session-driver-toggle:focus-visible,
961
+ .session-orphan-toggle:hover,
962
+ .session-orphan-toggle:focus-visible {
963
+ color: var(--text);
964
+ background: rgba(var(--overlay-rgb), 0.05);
965
+ outline: none;
966
+ }
967
+
968
+ .session-driver-toggle .lucide,
969
+ .session-orphan-toggle .lucide {
970
+ width: 13px;
971
+ height: 13px;
972
+ transition: transform 0.15s ease;
973
+ }
974
+
975
+ .session-driver-toggle[aria-expanded="true"] .lucide,
976
+ .session-orphan-toggle[aria-expanded="true"] .lucide {
977
+ transform: rotate(90deg);
978
+ }
979
+
980
+ .session-worker-children {
981
+ margin-left: 17px;
982
+ padding-left: 8px;
983
+ border-left: 1px solid color-mix(in srgb, var(--text-dimmer) 22%, transparent);
984
+ }
985
+
986
+ .session-worker-item {
987
+ height: 33px;
988
+ border-radius: 7px;
989
+ }
990
+
991
+ .session-worker-generation,
992
+ .session-worker-count {
993
+ flex-shrink: 0;
994
+ padding: 1px 5px;
995
+ border-radius: 999px;
996
+ color: var(--text-dimmer);
997
+ background: rgba(var(--overlay-rgb), 0.04);
998
+ font-size: 9px;
999
+ font-weight: 650;
1000
+ letter-spacing: 0.02em;
1001
+ }
1002
+
1003
+ .session-worker-generation.current {
1004
+ color: var(--success);
1005
+ background: color-mix(in srgb, var(--success) 10%, transparent);
1006
+ }
1007
+
1008
+ .session-orphan-toggle {
1009
+ width: 100%;
1010
+ height: 32px;
1011
+ padding: 0 9px 0 4px;
1012
+ border: 0;
1013
+ border-radius: 8px;
1014
+ display: flex;
1015
+ align-items: center;
1016
+ gap: 7px;
1017
+ color: var(--text-dimmer);
1018
+ background: transparent;
1019
+ cursor: pointer;
1020
+ font: inherit;
1021
+ text-align: left;
1022
+ }
1023
+
1024
+ .session-orphan-title {
1025
+ flex: 1;
1026
+ overflow: hidden;
1027
+ text-overflow: ellipsis;
1028
+ white-space: nowrap;
1029
+ font-size: 12px;
1030
+ }
1031
+
929
1032
  .split-group-text {
930
1033
  display: flex;
931
1034
  align-items: center;