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
@@ -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;
@@ -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)),
@@ -463,3 +463,55 @@ body.sticky-note-interacting .split-pane-frame {
463
463
  font-size: 13px;
464
464
  font-weight: 700;
465
465
  }
466
+
467
+ /* Driver-operated Split Worker surface.
468
+ ------------------------------------------------------------------
469
+ The composer is gone, so the region needs to read as "execution
470
+ surface", not "chat with a broken input". The whole treatment is one
471
+ line in the composer's own footprint: same content width, same
472
+ horizontal rhythm, deliberately shorter than the input it replaces so
473
+ the transcript gains the space rather than a warning banner taking it.
474
+
475
+ Utilitarian on purpose. A hairline top rule and a small steady dot
476
+ carry the state; there is no panel, no card, no icon set, no colour
477
+ alarm. The dot does not pulse — a standing condition should not
478
+ animate. Muted text, uppercase micro-label with wide tracking: it
479
+ reads as instrumentation, which is what it is. */
480
+ #input-area .worker-pane-status {
481
+ display: none;
482
+ align-items: center;
483
+ justify-content: center;
484
+ gap: 7px;
485
+ width: 100%;
486
+ max-width: var(--content-width);
487
+ margin: 0 auto;
488
+ padding: 9px 12px calc(9px + var(--safe-bottom, 0px));
489
+ border-top: 1px solid var(--border-subtle);
490
+ color: var(--text-dimmer);
491
+ font-family: inherit;
492
+ font-size: 10px;
493
+ font-weight: 600;
494
+ letter-spacing: 0.07em;
495
+ text-transform: uppercase;
496
+ user-select: none;
497
+ }
498
+ #input-area .worker-pane-status.visible { display: flex; }
499
+
500
+ .worker-pane-status-mark {
501
+ width: 5px;
502
+ height: 5px;
503
+ border-radius: 50%;
504
+ flex-shrink: 0;
505
+ background: var(--text-dimmer);
506
+ /* A faint halo so the dot reads as a live indicator at 5px rather than
507
+ as a stray period, without becoming a status "light". */
508
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--text-dimmer) 14%, transparent);
509
+ }
510
+
511
+ /* The composer is hidden rather than removed, so the transcript keeps its
512
+ scroll container and nothing reflows when a pair dissolves. */
513
+ body.worker-pane-locked #input-wrapper { display: none; }
514
+ body.worker-pane-locked #input-area {
515
+ padding-top: 0;
516
+ background: transparent;
517
+ }
@@ -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;