clay-server 3.8.1 → 4.0.0-beta.10

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 (222) hide show
  1. package/lib/ask-user-mcp-server.js +5 -119
  2. package/lib/background-task-timing.js +105 -0
  3. package/lib/builtin-mates.js +6 -6
  4. package/lib/claude-hook-installer.js +15 -0
  5. package/lib/clay-history-mcp-server.js +62 -297
  6. package/lib/daemon.js +23 -1
  7. package/lib/debate-model-selection.js +119 -0
  8. package/lib/home-debate-tool-policy.js +164 -0
  9. package/lib/home-response-notifications.js +26 -0
  10. package/lib/knowledge-import.js +436 -0
  11. package/lib/knowledge-record-store.js +188 -0
  12. package/lib/knowledge-search.js +224 -0
  13. package/lib/mate-creation-mcp-server.js +55 -0
  14. package/lib/mate-knowledge-mcp-server.js +151 -0
  15. package/lib/mate-knowledge-migration.js +283 -0
  16. package/lib/mate-knowledge-service.js +488 -0
  17. package/lib/mate-knowledge-sync.js +482 -0
  18. package/lib/mate-ready-creation.js +95 -0
  19. package/lib/mates.js +2 -0
  20. package/lib/notes.js +2 -1
  21. package/lib/project-ask-user.js +64 -0
  22. package/lib/project-capsule-catalog.js +101 -0
  23. package/lib/project-connection.js +17 -0
  24. package/lib/project-debate-proposal.js +133 -17
  25. package/lib/project-debate.js +214 -110
  26. package/lib/project-delegated-follow-up.js +84 -0
  27. package/lib/project-delegated-session.js +53 -0
  28. package/lib/project-filesystem.js +7 -9
  29. package/lib/project-knowledge.js +23 -0
  30. package/lib/project-logs-comments.js +137 -0
  31. package/lib/project-logs-mcp-server.js +290 -0
  32. package/lib/project-logs-query.js +167 -0
  33. package/lib/project-logs-root.js +67 -0
  34. package/lib/project-logs-schema.js +259 -0
  35. package/lib/project-logs-service.js +357 -0
  36. package/lib/project-logs-snapshot.js +202 -0
  37. package/lib/project-logs-store.js +498 -0
  38. package/lib/project-logs-versioning.js +128 -0
  39. package/lib/project-logs.js +347 -0
  40. package/lib/project-mate-creation-proposal.js +120 -0
  41. package/lib/project-mate-interaction.js +14 -0
  42. package/lib/project-mate-knowledge.js +110 -0
  43. package/lib/project-memory.js +36 -7
  44. package/lib/project-models.js +157 -32
  45. package/lib/project-session-notes.js +2 -2
  46. package/lib/project-session-pair.js +8 -8
  47. package/lib/project-sessions.js +66 -51
  48. package/lib/project-vendor-login.js +414 -0
  49. package/lib/project-worker-proposal.js +25 -25
  50. package/lib/project-workspace-query.js +144 -0
  51. package/lib/project.js +433 -102
  52. package/lib/public/app.js +109 -48
  53. package/lib/public/css/avatar-imprints.css +0 -1
  54. package/lib/public/css/base.css +4 -0
  55. package/lib/public/css/capsule-ui.css +389 -0
  56. package/lib/public/css/command-palette.css +306 -6
  57. package/lib/public/css/home-capsule-library.css +243 -0
  58. package/lib/public/css/home-capsule-source.css +192 -0
  59. package/lib/public/css/home-debate-live.css +146 -0
  60. package/lib/public/css/home-debate-planning.css +125 -0
  61. package/lib/public/css/home-debates-archive.css +281 -0
  62. package/lib/public/css/home-hub.css +896 -405
  63. package/lib/public/css/home-mate-creation.css +34 -0
  64. package/lib/public/css/home-mate-model-picker.css +131 -0
  65. package/lib/public/css/home-mate-settings.css +344 -0
  66. package/lib/public/css/home-session-actions.css +265 -0
  67. package/lib/public/css/home-sidebar.css +667 -0
  68. package/lib/public/css/icon-strip.css +1 -2
  69. package/lib/public/css/input.css +79 -25
  70. package/lib/public/css/mates.css +7 -34
  71. package/lib/public/css/pane.css +1 -1
  72. package/lib/public/css/playbook.css +0 -80
  73. package/lib/public/css/project-logs.css +234 -0
  74. package/lib/public/css/scheduler.css +1 -1
  75. package/lib/public/css/sticky-notes.css +53 -117
  76. package/lib/public/css/tui-attention.css +0 -44
  77. package/lib/public/css/workspace-assignment.css +45 -0
  78. package/lib/public/fonts/source-serif-4/LICENSE.md +93 -0
  79. package/lib/public/fonts/source-serif-4/SourceSerif4Caption-Semibold.ttf.woff2 +0 -0
  80. package/lib/public/index.html +96 -74
  81. package/lib/public/modules/app-connection.js +100 -5
  82. package/lib/public/modules/app-dm.js +43 -160
  83. package/lib/public/modules/app-home-hub.js +328 -585
  84. package/lib/public/modules/app-message-cards.js +242 -0
  85. package/lib/public/modules/app-message-router.js +84 -0
  86. package/lib/public/modules/app-messages.js +124 -38
  87. package/lib/public/modules/app-notifications.js +8 -119
  88. package/lib/public/modules/app-panels.js +43 -2
  89. package/lib/public/modules/app-projects.js +9 -1
  90. package/lib/public/modules/app-rendering.js +21 -602
  91. package/lib/public/modules/avatar-imprint.js +11 -8
  92. package/lib/public/modules/background-tasks-ui.js +139 -16
  93. package/lib/public/modules/chat-bubble-renderer.js +152 -0
  94. package/lib/public/modules/chat-render-runtime.js +198 -0
  95. package/lib/public/modules/command-palette.js +225 -436
  96. package/lib/public/modules/dm-render.js +82 -0
  97. package/lib/public/modules/home-capsule-creation-intent.js +31 -0
  98. package/lib/public/modules/home-capsule-library.js +146 -0
  99. package/lib/public/modules/home-capsule-source.js +383 -0
  100. package/lib/public/modules/home-chat-identity.js +35 -0
  101. package/lib/public/modules/home-chat-scroll.js +77 -0
  102. package/lib/public/modules/home-chat-stream-state.js +34 -0
  103. package/lib/public/modules/home-composer-focus.js +25 -0
  104. package/lib/public/modules/home-conversations-sheet.js +179 -0
  105. package/lib/public/modules/home-debate-activity.js +48 -0
  106. package/lib/public/modules/home-debate-controls.js +295 -0
  107. package/lib/public/modules/home-debate-launch.js +41 -0
  108. package/lib/public/modules/home-debate-live.js +284 -0
  109. package/lib/public/modules/home-debate-models.js +73 -0
  110. package/lib/public/modules/home-debate-planning.js +335 -0
  111. package/lib/public/modules/home-debates-archive.js +279 -0
  112. package/lib/public/modules/home-dock-resize.js +74 -0
  113. package/lib/public/modules/home-dock.js +446 -0
  114. package/lib/public/modules/home-mate-chat.js +496 -0
  115. package/lib/public/modules/home-mate-creation.js +109 -0
  116. package/lib/public/modules/home-mate-model-picker.js +281 -0
  117. package/lib/public/modules/home-mate-selection.js +38 -0
  118. package/lib/public/modules/home-mate-settings-menu.js +131 -0
  119. package/lib/public/modules/home-mate-settings.js +383 -0
  120. package/lib/public/modules/home-session-actions.js +373 -0
  121. package/lib/public/modules/home-session-model-confirmation.js +13 -0
  122. package/lib/public/modules/home-shell.js +9 -0
  123. package/lib/public/modules/home-sidebar-chat-list.js +63 -0
  124. package/lib/public/modules/home-sidebar.js +165 -0
  125. package/lib/public/modules/home-sub-surface.js +19 -0
  126. package/lib/public/modules/home-surface-boot.js +68 -0
  127. package/lib/public/modules/home-surface.js +141 -0
  128. package/lib/public/modules/home-tools.js +271 -0
  129. package/lib/public/modules/markdown.js +50 -2
  130. package/lib/public/modules/mate-management.js +86 -0
  131. package/lib/public/modules/mate-sidebar.js +0 -8
  132. package/lib/public/modules/mate-wizard.js +0 -7
  133. package/lib/public/modules/mention.js +17 -19
  134. package/lib/public/modules/pane-bridge.js +9 -0
  135. package/lib/public/modules/profile.js +4 -5
  136. package/lib/public/modules/project-logs-ambient.js +238 -0
  137. package/lib/public/modules/project-logs-render.js +359 -0
  138. package/lib/public/modules/project-logs.js +328 -0
  139. package/lib/public/modules/project-settings.js +34 -28
  140. package/lib/public/modules/project-switcher.js +11 -5
  141. package/lib/public/modules/project-workspace-assignment.js +23 -0
  142. package/lib/public/modules/scheduler.js +17 -3
  143. package/lib/public/modules/search-clay-chat.js +402 -0
  144. package/lib/public/modules/server-settings.js +14 -12
  145. package/lib/public/modules/session-actions.js +1 -1
  146. package/lib/public/modules/sidebar-mates.js +56 -552
  147. package/lib/public/modules/sidebar-mobile.js +12 -73
  148. package/lib/public/modules/sidebar-presence.js +37 -0
  149. package/lib/public/modules/sidebar-sessions.js +25 -1
  150. package/lib/public/modules/split-pair-ui.js +13 -13
  151. package/lib/public/modules/split-view.js +7 -0
  152. package/lib/public/modules/sticky-notes.js +106 -53
  153. package/lib/public/modules/tool-input-composition.js +48 -0
  154. package/lib/public/modules/tool-llm-status.js +167 -0
  155. package/lib/public/modules/tool-palette.js +76 -4
  156. package/lib/public/modules/tool-renderer-advanced.js +285 -0
  157. package/lib/public/modules/tool-renderer-chart.js +158 -0
  158. package/lib/public/modules/tool-renderer-semantics.js +35 -0
  159. package/lib/public/modules/tool-renderer.js +464 -0
  160. package/lib/public/modules/tool-runtime.js +309 -0
  161. package/lib/public/modules/tool-ui-evaluator.js +97 -0
  162. package/lib/public/modules/tool-ui-tree.js +21 -0
  163. package/lib/public/modules/tui-attention.js +10 -0
  164. package/lib/public/modules/user-settings.js +16 -23
  165. package/lib/public/modules/vendor-login.js +287 -0
  166. package/lib/public/modules/worker-proposal.js +2 -2
  167. package/lib/public/modules/workspace-assignment-card.js +149 -0
  168. package/lib/public/modules/workspace-assignment-routing.js +4 -0
  169. package/lib/public/style.css +14 -2
  170. package/lib/runtime-env.js +65 -0
  171. package/lib/sdk-bridge.js +120 -32
  172. package/lib/sdk-message-processor.js +34 -13
  173. package/lib/server-home-capsule-creation.js +36 -0
  174. package/lib/server-home-chat-events.js +287 -0
  175. package/lib/server-home-chat.js +518 -0
  176. package/lib/server-home-clay-entry.js +65 -0
  177. package/lib/server-home-clay-session-links.js +26 -0
  178. package/lib/server-home-debate-planning.js +214 -0
  179. package/lib/server-home-debates.js +137 -0
  180. package/lib/server-home-mate-creation.js +261 -0
  181. package/lib/server-home-models.js +241 -0
  182. package/lib/server-home-preferences.js +61 -0
  183. package/lib/server-mates.js +37 -0
  184. package/lib/server-tools.js +377 -0
  185. package/lib/server.js +166 -59
  186. package/lib/session-pair-mcp-server.js +6 -6
  187. package/lib/sessions.js +22 -4
  188. package/lib/tool-capsule-source.js +142 -0
  189. package/lib/tool-control-mcp-server.js +126 -0
  190. package/lib/tool-llm.js +48 -0
  191. package/lib/tool-storage.js +77 -0
  192. package/lib/tool-ui-spec-advanced.js +82 -0
  193. package/lib/tool-ui-spec.js +261 -0
  194. package/lib/tools-registry.js +286 -0
  195. package/lib/users-home-dock-preferences.js +77 -0
  196. package/lib/users-home-surface-preferences.js +99 -0
  197. package/lib/users-preferences.js +4 -7
  198. package/lib/users.js +12 -0
  199. package/lib/whats-new-content.js +3 -3
  200. package/lib/workspace-assignment-service.js +420 -0
  201. package/lib/workspace-query-mcp-server.js +154 -0
  202. package/lib/workspace-query-service.js +492 -0
  203. package/lib/ws-schema.js +107 -12
  204. package/lib/yoke/adapters/acp.js +2 -1
  205. package/lib/yoke/adapters/antigravity.js +2 -1
  206. package/lib/yoke/adapters/claude-worker.js +11 -4
  207. package/lib/yoke/adapters/claude.js +141 -46
  208. package/lib/yoke/adapters/codex.js +79 -11
  209. package/lib/yoke/adapters/kiro.js +2 -1
  210. package/lib/yoke/claude-user-input.js +38 -0
  211. package/lib/yoke/codex-app-server.js +20 -2
  212. package/lib/yoke/codex-background-tasks.js +8 -2
  213. package/lib/yoke/codex-user-input.js +64 -0
  214. package/lib/yoke/complete-once.js +164 -0
  215. package/lib/yoke/index.js +5 -1
  216. package/lib/yoke/interface.js +19 -0
  217. package/lib/yoke/mcp-bridge-server.js +2 -6
  218. package/lib/yoke/user-input.js +254 -0
  219. package/package.json +4 -3
  220. package/lib/public/css/home-chat.css +0 -380
  221. package/lib/public/modules/home-chat.js +0 -438
  222. package/lib/server-clay-home.js +0 -245
@@ -667,49 +667,103 @@
667
667
  position: relative;
668
668
  }
669
669
 
670
+ /* Sidebar session-row badge. Formerly shared its rule with the composer's
671
+ background-tasks chip; it is standalone now that the composer bar no longer
672
+ uses a filled numeric badge. */
673
+ .session-background-task-count {
674
+ display: inline-flex;
675
+ align-items: center;
676
+ justify-content: center;
677
+ min-width: 16px;
678
+ height: 16px;
679
+ padding: 0 4px;
680
+ border-radius: 8px;
681
+ background: var(--accent);
682
+ color: var(--bg);
683
+ font-size: 10px;
684
+ font-weight: 700;
685
+ }
686
+
687
+ /* --- Background tasks status line (above the composer) ---
688
+ Reads as a calm status line that belongs to the input surface: subtle
689
+ border, no fill, muted text. Progress is conveyed by the animated dots
690
+ rather than by color or size. */
670
691
  .background-tasks-bar {
671
692
  max-width: var(--content-width);
672
- margin: 0 auto 8px;
673
- border: 1px solid var(--border);
674
- border-radius: 8px;
675
- background: var(--input-bg);
693
+ margin: 0 auto 6px;
694
+ border: 1px solid var(--border-subtle);
695
+ border-radius: 10px;
696
+ background: transparent;
676
697
  overflow: hidden;
698
+ transition: border-color .15s ease, background-color .15s ease;
699
+ }
700
+
701
+ .background-tasks-bar:hover,
702
+ .background-tasks-bar.expanded {
703
+ border-color: var(--border);
704
+ background: var(--input-bg);
677
705
  }
678
706
 
679
707
  .background-tasks-toggle {
680
708
  width: 100%;
681
709
  display: flex;
682
710
  align-items: center;
683
- gap: 7px;
684
- padding: 8px 10px;
711
+ gap: 9px;
712
+ padding: 7px 11px;
685
713
  border: 0;
686
714
  background: transparent;
687
- color: var(--text-secondary);
715
+ color: var(--text-muted);
688
716
  cursor: pointer;
689
717
  font: inherit;
718
+ font-size: 12px;
690
719
  text-align: left;
691
720
  }
692
721
 
693
- .background-tasks-chip, .session-background-task-count {
694
- display: inline-flex;
695
- align-items: center;
696
- justify-content: center;
697
- min-width: 16px;
698
- height: 16px;
699
- padding: 0 4px;
700
- border-radius: 8px;
701
- background: var(--accent);
702
- color: var(--bg);
703
- font-size: 10px;
704
- font-weight: 700;
722
+ .background-tasks-toggle:hover { color: var(--text-secondary); }
723
+ .background-tasks-toggle:focus-visible { outline: 2px solid var(--accent); outline-offset: -2px; border-radius: 10px; }
724
+
725
+ .background-tasks-summary { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
726
+
727
+ /* Quiet three-dot activity indicator. Same motion as the Home debate dots
728
+ (home-debate-planning.css) but muted instead of accent-colored, since this
729
+ is ambient status rather than something asking to be read. */
730
+ .background-tasks-activity { display: inline-flex; align-items: center; gap: 3px; color: var(--text-muted); flex: none; }
731
+ .background-tasks-activity i { width: 4px; height: 4px; border-radius: 50%; background: currentColor; animation: background-tasks-pulse 1.4s ease-in-out infinite; }
732
+ .background-tasks-activity i:nth-child(2) { animation-delay: .18s; }
733
+ .background-tasks-activity i:nth-child(3) { animation-delay: .36s; }
734
+ @keyframes background-tasks-pulse { 0%, 70%, 100% { opacity: .28; } 35% { opacity: .95; } }
735
+
736
+ .background-tasks-chevron { display: inline-flex; flex: none; color: var(--text-muted); transition: transform .15s ease; }
737
+ .background-tasks-chevron i { width: 14px; height: 14px; }
738
+ .background-tasks-bar.expanded .background-tasks-chevron { transform: rotate(90deg); }
739
+
740
+ .background-tasks-list { padding: 0 11px 7px; }
741
+ .background-task-row { display: flex; align-items: center; gap: 9px; padding: 7px 0; border-top: 1px solid var(--border-subtle); font-size: 12px; }
742
+ .background-task-icon { display: inline-flex; flex: none; color: var(--text-muted); }
743
+ .background-task-icon i { width: 13px; height: 13px; }
744
+ .background-task-description { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: var(--text-secondary); }
745
+ /* Housekeeping group: visible so the user can see what Clay runs on its own,
746
+ but subordinate to the work they actually asked for. */
747
+ .background-tasks-section-label { padding: 9px 0 1px; border-top: 1px solid var(--border-subtle); color: var(--text-muted); font-size: 10px; font-weight: 600; letter-spacing: .07em; text-transform: uppercase; }
748
+ .background-tasks-section-label + .background-task-row { border-top: 0; }
749
+ .background-task-row.ambient .background-task-description { color: var(--text-muted); }
750
+ .background-task-row.ambient .background-task-icon { opacity: .7; }
751
+ .background-task-meta { display: inline-flex; align-items: center; gap: 7px; flex: none; color: var(--text-muted); }
752
+ .background-task-type { font-size: 11px; }
753
+ .background-task-elapsed { font-variant-numeric: tabular-nums; font-size: 11px; min-width: 44px; text-align: right; }
754
+ .background-task-stop { flex: none; border: 1px solid var(--border-subtle); border-radius: 6px; padding: 3px 8px; background: transparent; color: var(--text-muted); cursor: pointer; font: inherit; font-size: 11px; }
755
+ .background-task-stop:hover { color: var(--text); border-color: var(--border); }
756
+ .background-task-stop:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
757
+
758
+ @media (prefers-reduced-motion: reduce) {
759
+ .background-tasks-activity i { animation: none; opacity: .7; }
760
+ .background-tasks-bar, .background-tasks-chevron { transition: none; }
705
761
  }
706
762
 
707
- .background-tasks-list { padding: 0 10px 8px; }
708
- .background-task-row { display: flex; align-items: center; gap: 8px; padding: 6px 0; border-top: 1px solid var(--border-subtle); }
709
- .background-task-description { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
710
- .background-task-type { padding: 2px 6px; border-radius: 5px; background: var(--code-bg); color: var(--text-muted); font-size: 11px; }
711
- .background-task-stop { border: 1px solid var(--border); border-radius: 5px; padding: 3px 7px; background: transparent; color: var(--text-secondary); cursor: pointer; font: inherit; font-size: 12px; }
712
- .background-task-stop:hover { color: var(--text); border-color: var(--text-muted); }
763
+ @media (max-width: 600px) {
764
+ .background-task-meta { gap: 5px; }
765
+ .background-task-type { display: none; }
766
+ }
713
767
 
714
768
  #input-row {
715
769
  display: flex;
@@ -2,8 +2,7 @@
2
2
  .mate-sidebar-avatar,
3
3
  .mate-collapsed-avatar,
4
4
  .dm-bubble-avatar,
5
- .dm-bubble-avatar-me,
6
- .home-hub-mate-avatar {
5
+ .dm-bubble-avatar-me {
7
6
  image-rendering: -webkit-optimize-contrast;
8
7
  image-rendering: smooth;
9
8
  -webkit-backface-visibility: hidden;
@@ -502,17 +501,11 @@
502
501
  background: var(--border, #333);
503
502
  }
504
503
 
505
- /* === Mate avatar in user strip: squircle + desaturate === */
504
+ /* Mate colors are muted in the generated source; custom images stay intact. */
506
505
  .icon-strip-mate .icon-strip-user-avatar {
507
506
  border-radius: 8px;
508
- filter: saturate(0.65);
509
- }
510
- .icon-strip-mate:hover .icon-strip-user-avatar,
511
- .icon-strip-mate.mention-active .icon-strip-user-avatar {
512
- filter: saturate(1);
513
507
  }
514
508
  .icon-strip-mate.active .icon-strip-user-avatar {
515
- filter: saturate(1);
516
509
  box-shadow: 0 0 0 2px var(--accent);
517
510
  border-radius: 8px;
518
511
  }
@@ -2916,31 +2909,11 @@ body.mate-dm-active .activity-inline:not(.mention-activity-bar):not(.mate-pre-ac
2916
2909
  }
2917
2910
  }
2918
2911
 
2919
- /* === Mates UI gate === */
2920
- /* body.mates-disabled is set when the user flips the Mates toggle off in
2921
- User Settings → Mates. body.is-multi-user is set when the deploy hosts
2922
- more than one user. Single-user collapses the whole Mates surface;
2923
- multi-user keeps Mates-adjacent containers visible (they still host
2924
- other users) but greys out and disables the Mates-specific bits. */
2925
-
2926
- /* Always hide pure-Mates UI: rotating switch hint, individual mate
2927
- avatars in the icon strip, the home-hub mates strip, and the
2928
- "Ask Mate" button in the chat input. These never contain anything
2929
- but mates, so they collapse in both modes. */
2930
- body.mates-disabled .icon-strip-mate,
2931
- body.mates-disabled #icon-strip-hint-mate,
2932
- body.mates-disabled #home-hub-mates,
2933
- body.mates-disabled #ask-mate-btn {
2934
- display: none !important;
2935
- }
2936
-
2937
- /* Single-user only: collapse the whole icon-strip mate wrapper since it
2938
- shares space with the user-strip but has no other users to display in
2939
- single-user mode. The DM picker stays visible in both modes so the
2940
- user always has a way to discover the toggle (single-user can't reach
2941
- the picker today since the + button lives inside the wrapper, but if
2942
- that ever changes the same disabled UX applies). */
2943
- body.mates-disabled:not(.is-multi-user) #icon-strip-mate-section {
2912
+ /* === Project Mate DM gate === */
2913
+ /* This preference hides only legacy/project-local Mate DM shortcuts.
2914
+ Home, Mate mentions, creation, debates, and memory remain available. */
2915
+ body.project-mate-dms-disabled .icon-strip-mate,
2916
+ body.project-mate-dms-disabled #icon-strip-hint-mate {
2944
2917
  display: none !important;
2945
2918
  }
2946
2919
 
@@ -135,7 +135,7 @@ body.pane-mode #input-area {
135
135
  }
136
136
 
137
137
  .split-pair-role-driver { color: var(--accent); background: color-mix(in srgb, var(--accent) 13%, transparent); }
138
- .split-pair-role-worker { color: var(--text-secondary); background: var(--bg-alt); }
138
+ .split-pair-role-split-worker { color: var(--text-secondary); background: var(--bg-alt); }
139
139
 
140
140
  /* Pair roles are status labels. Control remains with the Driver through MCP. */
141
141
 
@@ -175,90 +175,10 @@
175
175
  color: var(--text);
176
176
  }
177
177
 
178
- /* --- Hub playbook cards --- */
179
- .hub-playbooks {
180
- animation: hubCardIn 0.4s ease 0.20s both;
181
- }
182
- .hub-playbooks-grid {
183
- display: flex;
184
- gap: 8px;
185
- flex-wrap: wrap;
186
- }
187
- .hub-playbook-card {
188
- display: flex;
189
- align-items: center;
190
- gap: 10px;
191
- padding: 10px 14px;
192
- background: rgba(var(--overlay-rgb), 0.03);
193
- border: 1px solid var(--border-subtle);
194
- border-radius: 10px;
195
- cursor: pointer;
196
- transition: background 0.15s, border-color 0.15s;
197
- flex: 1;
198
- min-width: 180px;
199
- }
200
- .hub-playbook-card:hover {
201
- background: rgba(var(--overlay-rgb), 0.07);
202
- border-color: var(--accent);
203
- }
204
- .hub-playbook-card.completed {
205
- background: rgba(76, 175, 80, 0.08);
206
- border-color: rgba(76, 175, 80, 0.25);
207
- }
208
- .hub-playbook-card.completed:hover {
209
- background: rgba(76, 175, 80, 0.14);
210
- border-color: rgba(76, 175, 80, 0.4);
211
- }
212
- .hub-playbook-card-icon {
213
- font-size: 18px;
214
- flex-shrink: 0;
215
- }
216
- .hub-playbook-card-body {
217
- flex: 1;
218
- min-width: 0;
219
- }
220
- .hub-playbook-card-title {
221
- font-size: 13px;
222
- font-weight: 600;
223
- color: var(--text);
224
- }
225
- .hub-playbook-card-desc {
226
- font-size: 11px;
227
- color: var(--text-dimmer);
228
- overflow: hidden;
229
- text-overflow: ellipsis;
230
- white-space: nowrap;
231
- }
232
- .hub-playbook-card-check {
233
- color: var(--success);
234
- font-size: 14px;
235
- flex-shrink: 0;
236
- }
237
-
238
- /* --- Tip "Try it" button (inline after text) --- */
239
- .hub-tip-try {
240
- display: inline;
241
- padding: 0;
242
- border: none;
243
- background: none;
244
- color: var(--accent);
245
- font-size: inherit;
246
- font-weight: 600;
247
- cursor: pointer;
248
- margin-left: 6px;
249
- font-family: inherit;
250
- }
251
- .hub-tip-try:hover {
252
- background: var(--accent-12);
253
- }
254
-
255
178
  /* --- Mobile --- */
256
179
  @media (max-width: 768px) {
257
180
  .playbook-modal {
258
181
  width: 95vw;
259
182
  border-radius: 12px;
260
183
  }
261
- .hub-playbook-card {
262
- min-width: 140px;
263
- }
264
184
  }
@@ -0,0 +1,234 @@
1
+ /* Project Logs — restrained, factual project ledger. */
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
+ /* --- Ambient edge handle ---------------------------------------------
98
+ A slim notch on the right workbench boundary, offered only where a real
99
+ pointer can hover. Touch keeps the explicit toolbar route. */
100
+ @media (min-width: 1024px) {
101
+ .project-logs-handle {
102
+ position: absolute;
103
+ top: 50%;
104
+ right: 0;
105
+ transform: translateY(-50%);
106
+ width: 14px;
107
+ height: 88px;
108
+ padding: 0;
109
+ display: flex;
110
+ align-items: center;
111
+ justify-content: center;
112
+ border: 1px solid var(--border);
113
+ border-right: 0;
114
+ border-radius: 8px 0 0 8px;
115
+ background: var(--bg-alt);
116
+ cursor: pointer;
117
+ z-index: 40;
118
+ transition: width 0.16s ease, background 0.16s ease;
119
+ }
120
+ .project-logs-handle:hover,
121
+ .project-logs-handle:focus-visible { width: 18px; background: var(--bg); }
122
+ .project-logs-handle:focus-visible { outline: 2px solid var(--accent); outline-offset: -2px; }
123
+ .project-logs-handle.hidden { display: none; }
124
+ .project-logs-handle-notch {
125
+ width: 3px;
126
+ height: 34px;
127
+ border-radius: 999px;
128
+ background: var(--border);
129
+ transition: background 0.16s ease, height 0.16s ease;
130
+ }
131
+ .project-logs-handle:hover .project-logs-handle-notch { background: var(--text-dimmer); }
132
+ /* Unread: a brighter notch, no motion of its own. */
133
+ .project-logs-handle.has-unread .project-logs-handle-notch { background: var(--accent); height: 46px; }
134
+ }
135
+
136
+ /* Touch and narrow viewports never depend on hover. */
137
+ @media (max-width: 1023px) {
138
+ .project-logs-handle { display: none; }
139
+ }
140
+
141
+ /* A preview is the same pane, revealed but uncommitted. */
142
+ #project-logs-panel.project-logs-previewing { box-shadow: 0 0 0 1px var(--accent), 4px 8px 24px rgba(var(--shadow-rgb), 0.2); }
143
+
144
+ /* --- Unread cues --- */
145
+ #project-logs-btn.project-logs-unread { color: var(--accent); }
146
+ #project-logs-count { background: var(--accent); color: #fff; }
147
+
148
+ @keyframes project-logs-pulse {
149
+ 0% { box-shadow: 0 0 0 0 color-mix(in srgb, var(--accent) 45%, transparent); }
150
+ 70% { box-shadow: 0 0 0 7px transparent; }
151
+ 100% { box-shadow: 0 0 0 0 transparent; }
152
+ }
153
+ .project-logs-pulse { animation: project-logs-pulse 1.1s ease-out 2; }
154
+
155
+ /* Reduced motion keeps the static unread marker and drops every flourish. */
156
+ @media (prefers-reduced-motion: reduce) {
157
+ .project-logs-pulse { animation: none; }
158
+ .project-logs-handle { transition: none; }
159
+ .project-logs-handle-notch { transition: none; }
160
+ }
161
+
162
+ /* --- Ledger toolbar --- */
163
+ .project-logs-toolbar { display: flex; align-items: center; gap: 8px; padding: 10px 12px; border-bottom: 1px solid var(--border-subtle); flex: 0 0 auto; }
164
+ .project-logs-toolbar.hidden { display: none; }
165
+ .project-logs-search { flex: 1; min-width: 0; height: 32px; display: flex; align-items: center; gap: 7px; padding: 0 9px; border: 1px solid var(--border); border-radius: 7px; background: var(--bg-alt); color: var(--text-dimmer); }
166
+ .project-logs-search .lucide { width: 14px; flex: 0 0 auto; }
167
+ .project-logs-search input { width: 100%; border: 0; outline: 0; background: transparent; color: var(--text); font: inherit; font-size: 12px; }
168
+ .project-logs-filter { height: 32px; max-width: 42%; padding: 0 8px; border: 1px solid var(--border); border-radius: 7px; background: var(--bg-alt); color: var(--text-secondary); font: inherit; font-size: 12px; cursor: pointer; }
169
+
170
+ /* --- Ledger list: full pane, chronological, commit-history feel --- */
171
+ .project-logs-list { flex: 1; min-height: 0; overflow-y: auto; padding: 4px 0; }
172
+ .project-logs-list.hidden { display: none; }
173
+ .project-log-row { width: 100%; display: block; padding: 12px 14px; border: 0; border-bottom: 1px solid var(--border-subtle); background: transparent; color: inherit; text-align: left; cursor: pointer; }
174
+ .project-log-row:hover { background: rgba(var(--overlay-rgb), 0.05); }
175
+ .project-log-row:last-child { border-bottom: 0; }
176
+ .project-log-row-head { display: flex; align-items: baseline; gap: 7px; flex-wrap: wrap; }
177
+ .project-log-row-title { flex: 1; min-width: 0; font-size: 13px; font-weight: 650; color: var(--text); }
178
+ .project-log-row-summary { margin: 5px 0 0; color: var(--text-secondary); font-size: 12px; line-height: 1.5; }
179
+ .project-log-row-meta { margin-top: 6px; color: var(--text-dimmer); font-size: 10.5px; font-family: var(--font-mono); }
180
+ .project-logs-list-empty { padding: 32px 20px; color: var(--text-dimmer); font-size: 12px; text-align: center; line-height: 1.6; }
181
+
182
+ /* Category chip and priority signal. Categories are project-defined, so the
183
+ chip is deliberately neutral: no per-category selectors and no exhaustive
184
+ class list, because the vocabulary is not known at build time. Priority
185
+ carries the only stable colour, since urgency is a fixed scale. */
186
+ .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; }
187
+ .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; }
188
+ .project-log-priority[data-priority="important"] { background: color-mix(in srgb, #f5a524 18%, transparent); color: #f5a524; }
189
+ .project-log-priority[data-priority="urgent"] { background: color-mix(in srgb, #e5484d 20%, transparent); color: #e5484d; }
190
+
191
+ /* --- Entry detail: full pane, replaces the list --- */
192
+ .project-logs-detail { flex: 1; min-width: 0; min-height: 0; overflow-y: auto; }
193
+ .project-logs-detail.hidden { display: none; }
194
+ .project-log-document { max-width: 820px; margin: 0 auto; padding: 22px 22px 40px; }
195
+ #project-logs-panel.panel-fullscreen .project-log-document { padding: clamp(28px, 5vw, 64px); }
196
+ .project-log-doc-chips { display: flex; align-items: center; gap: 7px; margin-bottom: 10px; }
197
+ .project-log-document h1 { margin: 0 0 8px; color: var(--text); font-family: var(--font-display); font-size: clamp(20px, 2.4vw, 28px); line-height: 1.2; }
198
+ .project-log-doc-summary { margin: 0 0 10px; color: var(--text-secondary); font-size: 13px; line-height: 1.55; }
199
+ .project-log-byline { margin: 0 0 18px; padding-bottom: 16px; border-bottom: 1px solid var(--border-subtle); color: var(--text-dimmer); font-size: 11px; font-family: var(--font-mono); }
200
+ .project-log-markdown { line-height: 1.65; }
201
+
202
+ /* --- Discussion --- */
203
+ .project-log-discussion { margin-top: 30px; padding-top: 18px; border-top: 1px solid var(--border-subtle); }
204
+ .project-log-discussion h2 { margin: 0 0 12px; color: var(--text); font-family: var(--font-display); font-size: 15px; }
205
+ .project-log-discussion-empty { margin: 0; color: var(--text-dimmer); font-size: 12px; }
206
+ .project-log-comment { padding: 10px 12px; margin-bottom: 8px; border: 1px solid var(--border-subtle); border-radius: 9px; background: var(--bg-alt); }
207
+ .project-log-comment-meta { margin: 0 0 5px; color: var(--text-dimmer); font-size: 10.5px; font-family: var(--font-mono); }
208
+ .project-log-comment-body { margin: 0; color: var(--text); font-size: 13px; line-height: 1.55; white-space: pre-wrap; }
209
+ .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; }
210
+ .project-log-comment-status-badge[data-status="incorporated"] { background: color-mix(in srgb, var(--brand-green) 16%, transparent); color: var(--brand-green); }
211
+ .project-log-comment-status-badge[data-status="clarification-needed"] { background: color-mix(in srgb, #f5a524 18%, transparent); color: #f5a524; }
212
+ .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; }
213
+ .project-log-comment-response-meta { margin: 0 0 4px; color: var(--text-dimmer); font-size: 10.5px; font-family: var(--font-mono); }
214
+ .project-log-comment-response-body { margin: 0; color: var(--text); font-size: 12.5px; line-height: 1.55; white-space: pre-wrap; }
215
+ .project-log-history { margin-top: 26px; padding-top: 16px; border-top: 1px solid var(--border-subtle); }
216
+ .project-log-history h2 { margin: 0 0 10px; color: var(--text); font-family: var(--font-display); font-size: 14px; }
217
+ .project-log-history-list { margin: 0; padding: 0; list-style: none; display: grid; gap: 5px; }
218
+ .project-log-history-row { display: flex; align-items: baseline; gap: 8px; font-size: 11.5px; }
219
+ .project-log-history-label { flex: 0 0 auto; color: var(--text-dimmer); font-family: var(--font-mono); font-weight: 700; }
220
+ .project-log-history-text { color: var(--text-secondary); }
221
+ .project-log-history-reason { color: var(--text-dimmer); font-style: italic; }
222
+ .project-log-comment-form { display: grid; gap: 8px; margin-top: 18px; }
223
+ .project-log-comment-form label { color: var(--text-secondary); font-size: 11px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.06em; }
224
+ .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; }
225
+ .project-log-comment-form textarea:focus { outline: 2px solid color-mix(in srgb, var(--accent) 35%, transparent); border-color: var(--accent); }
226
+ .project-log-comment-status { min-height: 16px; margin: 0; color: var(--text-dimmer); font-size: 11px; }
227
+ .project-log-comment-actions { display: flex; justify-content: flex-end; }
228
+ .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; }
229
+ .project-log-comment-actions button.primary { border-color: var(--accent); background: var(--accent); color: #fff; }
230
+
231
+ @media (max-width: 768px) {
232
+ .project-logs-subtitle { display: none; }
233
+ .project-log-document { padding: 18px 16px 32px; }
234
+ }
@@ -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;