clay-server 4.1.0-beta.8 → 4.1.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 (119) hide show
  1. package/lib/context-usage.js +47 -0
  2. package/lib/issues-mcp-server.js +1 -1
  3. package/lib/issues-service.js +3 -1
  4. package/lib/loop-registry-occurrence.js +1 -0
  5. package/lib/notes.js +20 -3
  6. package/lib/os-users.js +6 -0
  7. package/lib/project-connection.js +14 -3
  8. package/lib/project-file-path.js +13 -0
  9. package/lib/project-file-watch.js +19 -8
  10. package/lib/project-filesystem.js +10 -16
  11. package/lib/project-http.js +53 -48
  12. package/lib/project-logs-mcp-server.js +8 -8
  13. package/lib/project-logs-schema.js +1 -1
  14. package/lib/project-logs-service.js +46 -13
  15. package/lib/project-logs-store.js +17 -15
  16. package/lib/project-logs.js +70 -0
  17. package/lib/project-loop.js +1 -0
  18. package/lib/project-notifications.js +1 -1
  19. package/lib/project-pending-message-queue.js +71 -7
  20. package/lib/project-scheduled-messages.js +235 -52
  21. package/lib/project-scheduled-result-store.js +131 -0
  22. package/lib/project-scheduled-task-execution.js +35 -2
  23. package/lib/project-session-notes.js +11 -4
  24. package/lib/project-sessions.js +7 -0
  25. package/lib/project-user-message.js +72 -5
  26. package/lib/project.js +60 -5
  27. package/lib/public/app.js +27 -12
  28. package/lib/public/css/avatar-imprints.css +1 -1
  29. package/lib/public/css/command-palette.css +20 -0
  30. package/lib/public/css/git-panel.css +13 -12
  31. package/lib/public/css/git-placard.css +4 -4
  32. package/lib/public/css/input.css +0 -109
  33. package/lib/public/css/issues.css +78 -31
  34. package/lib/public/css/mobile-nav.css +7 -0
  35. package/lib/public/css/notifications-center.css +3 -3
  36. package/lib/public/css/pending-message-queue.css +3 -0
  37. package/lib/public/css/project-logs.css +15 -0
  38. package/lib/public/css/sidebar.css +7 -0
  39. package/lib/public/css/sticky-notes.css +29 -0
  40. package/lib/public/modules/app-connection.js +9 -1
  41. package/lib/public/modules/app-favicon.js +10 -0
  42. package/lib/public/modules/app-messages.js +49 -37
  43. package/lib/public/modules/app-notifications.js +2 -0
  44. package/lib/public/modules/app-panels.js +77 -23
  45. package/lib/public/modules/app-projects.js +3 -0
  46. package/lib/public/modules/app-rate-limit.js +148 -243
  47. package/lib/public/modules/avatar-imprint.js +25 -70
  48. package/lib/public/modules/avatar.js +12 -4
  49. package/lib/public/modules/chat-render-runtime.js +20 -2
  50. package/lib/public/modules/clay-issue-links.js +23 -2
  51. package/lib/public/modules/clay-log-links.js +11 -1
  52. package/lib/public/modules/context-view-preference.js +143 -0
  53. package/lib/public/modules/default-vendor.js +116 -0
  54. package/lib/public/modules/filebrowser-tabs.js +1 -0
  55. package/lib/public/modules/filebrowser.js +45 -18
  56. package/lib/public/modules/input.js +81 -20
  57. package/lib/public/modules/issues-render.js +36 -10
  58. package/lib/public/modules/issues.js +95 -13
  59. package/lib/public/modules/markdown.js +3 -1
  60. package/lib/public/modules/pane-bridge.js +14 -8
  61. package/lib/public/modules/pane-issue-bridge.js +27 -0
  62. package/lib/public/modules/pending-message-queue.js +43 -1
  63. package/lib/public/modules/permission-hints.js +13 -0
  64. package/lib/public/modules/profile.js +9 -9
  65. package/lib/public/modules/project-activation.js +49 -0
  66. package/lib/public/modules/project-logs-render.js +13 -3
  67. package/lib/public/modules/project-logs.js +45 -15
  68. package/lib/public/modules/right-workbench.js +44 -0
  69. package/lib/public/modules/scheduled-message-state.js +12 -36
  70. package/lib/public/modules/scheduled-result-client.js +33 -0
  71. package/lib/public/modules/scheduled-result-display.js +50 -0
  72. package/lib/public/modules/scheduled-result-notification.js +31 -0
  73. package/lib/public/modules/scheduled-task-presentation.js +15 -0
  74. package/lib/public/modules/scheduled-tasks.js +9 -21
  75. package/lib/public/modules/sidebar-mobile.js +51 -3
  76. package/lib/public/modules/sidebar-sessions.js +65 -5
  77. package/lib/public/modules/split-session-boundary.js +28 -0
  78. package/lib/public/modules/split-view.js +42 -7
  79. package/lib/public/modules/sticky-notes-browser.js +130 -18
  80. package/lib/public/modules/sticky-notes.js +2 -3
  81. package/lib/public/modules/terminal.js +4 -4
  82. package/lib/public/modules/thinking-lifecycle.js +4 -1
  83. package/lib/public/modules/tools.js +5 -1
  84. package/lib/scheduled-run-state.js +10 -2
  85. package/lib/scheduler.js +1 -0
  86. package/lib/sdk-bridge.js +97 -61
  87. package/lib/sdk-message-processor.js +44 -13
  88. package/lib/sdk-skill-discovery.js +6 -28
  89. package/lib/sdk-turn-queue.js +14 -0
  90. package/lib/server-context-view.js +53 -0
  91. package/lib/server-default-vendor.js +60 -0
  92. package/lib/server.js +23 -6
  93. package/lib/session-notes-mcp-server.js +3 -5
  94. package/lib/session-pair-factory.js +2 -2
  95. package/lib/session-pair-mcp-server.js +5 -4
  96. package/lib/session-title-generator.js +89 -0
  97. package/lib/session-title-policy.js +8 -2
  98. package/lib/sessions.js +26 -1
  99. package/lib/user-presence.js +6 -0
  100. package/lib/users-context-view-preferences.js +65 -0
  101. package/lib/users-default-vendor-preferences.js +80 -0
  102. package/lib/users.js +12 -0
  103. package/lib/ws-schema.js +11 -0
  104. package/lib/yoke/acp-agent-profiles.js +15 -2
  105. package/lib/yoke/adapters/acp.js +3 -2
  106. package/lib/yoke/adapters/antigravity.js +2 -2
  107. package/lib/yoke/adapters/claude-worker.js +11 -12
  108. package/lib/yoke/adapters/claude.js +75 -22
  109. package/lib/yoke/adapters/codex.js +216 -29
  110. package/lib/yoke/adapters/kiro.js +6 -5
  111. package/lib/yoke/claude-context-usage.js +57 -0
  112. package/lib/yoke/claude-message-correlation.js +31 -0
  113. package/lib/yoke/claude-model-switch.js +15 -0
  114. package/lib/yoke/index.js +5 -1
  115. package/lib/yoke/mcp-bridge-server.js +18 -5
  116. package/lib/yoke/session-skill-catalog.js +45 -0
  117. package/lib/yoke/skill-discovery.js +60 -20
  118. package/lib/yoke/vendor-registry.js +1 -1
  119. package/package.json +5 -7
@@ -25,7 +25,7 @@
25
25
  border-bottom: 1px solid var(--filebrowser-border);
26
26
  color: var(--text-secondary);
27
27
  font-size: 12px;
28
- font-weight: 700;
28
+ font-weight: 600;
29
29
  text-align: center;
30
30
  flex-shrink: 0;
31
31
  }
@@ -106,7 +106,7 @@
106
106
  }
107
107
 
108
108
  .git-repo-primary > svg { width: 15px; height: 15px; color: var(--accent); flex-shrink: 0; }
109
- .git-repo-name { color: var(--text); font-size: 12px; font-weight: 800; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
109
+ .git-repo-name { color: var(--text); font-size: 12px; font-weight: 600; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
110
110
  .git-branch-name { color: var(--text-muted); font-size: 11px; font-weight: 500; line-height: 1.3; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
111
111
 
112
112
  .git-badges { display: flex; gap: 4px; margin: 7px 0 0 22px; flex-wrap: wrap; }
@@ -117,7 +117,7 @@
117
117
  color: var(--text-dimmer);
118
118
  background: var(--bg);
119
119
  font-size: 9px;
120
- font-weight: 700;
120
+ font-weight: 500;
121
121
  letter-spacing: 0.02em;
122
122
  text-transform: uppercase;
123
123
  }
@@ -149,7 +149,7 @@
149
149
  background: var(--bg-alt);
150
150
  color: var(--text-muted);
151
151
  font-size: 11px;
152
- font-weight: 700;
152
+ font-weight: 500;
153
153
  display: inline-flex;
154
154
  align-items: center;
155
155
  justify-content: center;
@@ -160,7 +160,7 @@
160
160
  .git-action-btn:hover:not(:disabled) { border-color: var(--accent); color: var(--text); }
161
161
  .git-action-btn:disabled { opacity: 0.42; cursor: default; }
162
162
  .git-action-btn svg { width: 13px; height: 13px; }
163
- .git-sync-count { color: var(--accent); font-size: 10px; font-weight: 700; font-variant-numeric: tabular-nums; }
163
+ .git-sync-count { color: var(--accent); font-size: 10px; font-weight: 500; font-variant-numeric: tabular-nums; }
164
164
 
165
165
  .git-review-all {
166
166
  width: 100%;
@@ -180,6 +180,7 @@
180
180
  }
181
181
  .git-review-all:hover { border-color: var(--accent); background: color-mix(in srgb, var(--accent) 10%, var(--bg)); }
182
182
  .git-review-all > span { display: inline-flex; align-items: center; gap: 6px; }
183
+ .git-review-all strong { font-weight: 500; }
183
184
  .git-review-all svg { width: 12px; height: 12px; color: var(--accent); }
184
185
  .git-review-count { color: var(--text-dimmer); font-size: 9px; font-weight: 600; font-variant-numeric: tabular-nums; }
185
186
  .git-review-count svg { width: 9px; height: 9px; color: currentColor; }
@@ -201,12 +202,12 @@
201
202
  padding: 0 2px;
202
203
  color: var(--text-secondary);
203
204
  font-size: 10px;
204
- font-weight: 800;
205
+ font-weight: 600;
205
206
  letter-spacing: 0.055em;
206
207
  text-transform: uppercase;
207
208
  flex-shrink: 0;
208
209
  }
209
- .git-section-count { color: var(--text-dimmer); font-size: 9px; font-weight: 700; font-variant-numeric: tabular-nums; }
210
+ .git-section-count { color: var(--text-dimmer); font-size: 9px; font-weight: 500; font-variant-numeric: tabular-nums; }
210
211
  .git-section-header .git-action-btn { min-height: 22px; margin-left: auto; padding: 2px 7px; font-size: 9px; }
211
212
 
212
213
  .git-file-list {
@@ -239,7 +240,7 @@
239
240
  color: var(--text-dimmer);
240
241
  font-family: inherit;
241
242
  font-size: 9px;
242
- font-weight: 750;
243
+ font-weight: 600;
243
244
  line-height: 1;
244
245
  letter-spacing: -0.02em;
245
246
  }
@@ -247,7 +248,7 @@
247
248
  .git-file-status.conflicted { color: var(--danger, #d85b5b); }
248
249
  .git-file-main { min-width: 0; padding: 5px 2px; cursor: pointer; outline: none; }
249
250
  .git-file-main:focus-visible { border-radius: 4px; box-shadow: 0 0 0 1px var(--accent); }
250
- .git-file-name { color: var(--text); font-size: 11px; font-weight: 700; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
251
+ .git-file-name { color: var(--text); font-size: 11px; font-weight: 400; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
251
252
  .git-file-subline {
252
253
  display: flex;
253
254
  align-items: center;
@@ -257,7 +258,7 @@
257
258
  height: 14px;
258
259
  color: var(--text-dimmer);
259
260
  font-size: 9px;
260
- font-weight: 450;
261
+ font-weight: 400;
261
262
  line-height: 1.2;
262
263
  }
263
264
  .git-file-dir { min-width: 24px; flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
@@ -327,7 +328,7 @@
327
328
  justify-content: center;
328
329
  gap: 4px;
329
330
  font-size: 10px;
330
- font-weight: 550;
331
+ font-weight: 500;
331
332
  cursor: pointer;
332
333
  white-space: nowrap;
333
334
  }
@@ -405,7 +406,7 @@
405
406
  background: color-mix(in srgb, var(--accent) 8%, var(--bg));
406
407
  }
407
408
  .git-agent-commit-icon svg { width: 14px; height: 14px; }
408
- .git-agent-commit-copy strong { display: block; color: var(--text); font-size: 11px; line-height: 1.3; }
409
+ .git-agent-commit-copy strong { display: block; color: var(--text); font-size: 11px; font-weight: 600; line-height: 1.3; }
409
410
  .git-agent-commit-copy span:not(.git-agent-commit-icon) { display: block; color: var(--text-dimmer); font-size: 9px; line-height: 1.4; margin-top: 2px; }
410
411
  .git-agent-commit-btn { width: 100%; background: var(--accent); border-color: var(--accent); color: #fff; }
411
412
  .git-agent-commit-btn:hover:not(:disabled) { color: #fff; filter: brightness(1.05); }
@@ -45,7 +45,7 @@
45
45
  display: block;
46
46
  color: var(--text);
47
47
  font-size: 11px;
48
- font-weight: 700;
48
+ font-weight: 600;
49
49
  line-height: 1.3;
50
50
  overflow: hidden;
51
51
  text-overflow: ellipsis;
@@ -78,7 +78,7 @@
78
78
  background: var(--bg);
79
79
  color: var(--text-dimmer);
80
80
  font-size: 9px;
81
- font-weight: 700;
81
+ font-weight: 500;
82
82
  letter-spacing: 0.02em;
83
83
  text-transform: uppercase;
84
84
  white-space: nowrap;
@@ -94,7 +94,7 @@
94
94
  gap: 2px;
95
95
  color: var(--text-dimmer);
96
96
  font-size: 9px;
97
- font-weight: 600;
97
+ font-weight: 500;
98
98
  font-variant-numeric: tabular-nums;
99
99
  white-space: nowrap;
100
100
  }
@@ -133,7 +133,7 @@
133
133
  color: var(--text-dimmer);
134
134
  font-family: inherit;
135
135
  font-size: 9px;
136
- font-weight: 700;
136
+ font-weight: 500;
137
137
  letter-spacing: 0.02em;
138
138
  text-transform: uppercase;
139
139
  cursor: pointer;
@@ -1717,112 +1717,3 @@ body.tui-composer-active #config-chip-wrap {
1717
1717
  font-weight: 600;
1718
1718
  color: inherit;
1719
1719
  }
1720
-
1721
- /* Scheduled message bubble: accent-tinted user bubble */
1722
- .scheduled-msg-wrap .bubble {
1723
- background: color-mix(in srgb, var(--accent) 18%, var(--user-bubble, var(--bg-alt)));
1724
- border: 1px solid color-mix(in srgb, var(--accent) 35%, transparent);
1725
- }
1726
-
1727
- .scheduled-msg-wrap .msg-user-rewind-btn,
1728
- .scheduled-msg-wrap .msg-actions { display: none !important; }
1729
-
1730
- .scheduled-msg-meta {
1731
- display: flex;
1732
- align-items: center;
1733
- gap: 6px;
1734
- padding-right: 4px;
1735
- font-size: 12px;
1736
- color: var(--accent);
1737
- }
1738
-
1739
- .scheduled-msg-icon svg,
1740
- .scheduled-msg-icon .lucide {
1741
- width: 14px;
1742
- height: 14px;
1743
- }
1744
-
1745
- .scheduled-msg-countdown {
1746
- flex: 1;
1747
- }
1748
-
1749
-
1750
- /* Channel mode: scheduled badge in header row */
1751
- .scheduled-msg-badge {
1752
- display: inline-flex;
1753
- align-items: center;
1754
- gap: 5px;
1755
- padding: 3px 10px;
1756
- border-radius: 12px;
1757
- font-size: 12px;
1758
- font-weight: 600;
1759
- line-height: 1;
1760
- color: var(--accent);
1761
- background: color-mix(in srgb, var(--accent) 12%, transparent);
1762
- vertical-align: middle;
1763
- }
1764
- .scheduled-msg-badge svg,
1765
- .scheduled-msg-badge .lucide {
1766
- width: 13px;
1767
- height: 13px;
1768
- }
1769
- /* Scheduled message action links (shared by both modes) */
1770
- .scheduled-msg-actions {
1771
- display: inline-flex;
1772
- align-items: center;
1773
- gap: 6px;
1774
- margin-left: 4px;
1775
- }
1776
- .scheduled-msg-send-now {
1777
- padding: 0;
1778
- border: none;
1779
- background: none;
1780
- color: var(--accent);
1781
- font-size: 12px;
1782
- font-weight: 500;
1783
- font-family: inherit;
1784
- cursor: pointer;
1785
- transition: text-decoration 0.15s;
1786
- }
1787
- .scheduled-msg-send-now:hover {
1788
- text-decoration: underline;
1789
- }
1790
- .scheduled-msg-sep {
1791
- color: var(--text-dimmer);
1792
- font-size: 12px;
1793
- user-select: none;
1794
- }
1795
- .scheduled-msg-cancel {
1796
- padding: 0;
1797
- border: none;
1798
- background: none;
1799
- color: var(--text-dimmer);
1800
- font-size: 12px;
1801
- font-weight: 500;
1802
- font-family: inherit;
1803
- cursor: pointer;
1804
- transition: color 0.15s;
1805
- }
1806
- .scheduled-msg-cancel:hover {
1807
- color: var(--error);
1808
- }
1809
-
1810
- /* Channel mode: strip bubble box styling, render as plain text */
1811
- body.wide-view .scheduled-msg-wrap .bubble {
1812
- background: none;
1813
- border: none;
1814
- box-shadow: none;
1815
- padding: 0;
1816
- border-radius: 0;
1817
- }
1818
-
1819
- /* Channel mode: header alignment */
1820
- body.wide-view .scheduled-msg-wrap .dm-bubble-header {
1821
- display: flex;
1822
- align-items: center;
1823
- gap: 6px;
1824
- }
1825
- body.wide-view .scheduled-msg-wrap .scheduled-msg-countdown {
1826
- font-size: inherit;
1827
- color: inherit;
1828
- }
@@ -1,7 +1,20 @@
1
- #issues-panel { position: relative; width: 48%; max-width: 760px; min-width: 360px; height: calc(100% - 16px); margin: 8px; align-self: center; display: flex; flex-direction: column; background: var(--bg); color: var(--text); border: 1px solid var(--border); border-radius: 12px; overflow: hidden; flex-shrink: 0; }
1
+ #issues-panel { position: relative; width: 50%; max-width: 720px; min-width: 360px; height: calc(100% - 16px); margin: 8px 8px 8px 10px; min-height: 0; align-self: center; display: flex; flex-direction: column; background: var(--bg); color: var(--text); border: 1px solid var(--border); border-radius: 12px; overflow: hidden; flex-shrink: 0; }
2
+ @media (min-width: 1024px) {
3
+ #issues-panel {
4
+ box-shadow:
5
+ 4px 8px 18px rgba(var(--shadow-rgb), 0.14),
6
+ 2px 2px 4px rgba(var(--shadow-rgb), 0.08),
7
+ inset 0 1px 0 rgba(255, 255, 255, 0.04);
8
+ animation: workbench-panel-in 0.18s cubic-bezier(0.2, 0.8, 0.2, 1);
9
+ transition: max-width 0.2s ease, width 0.2s ease, box-shadow 0.2s ease;
10
+ }
11
+ }
12
+ @media (prefers-reduced-motion: reduce) {
13
+ #issues-panel { animation: none; }
14
+ }
2
15
  #issues-panel.hidden { display: none; }
3
16
  #issues-panel.issues-wide { width: 70%; max-width: 1200px; }
4
- #issues-panel.panel-fullscreen { width: 100%; max-width: none; height: 100%; margin: 0; }
17
+ #issues-panel.panel-fullscreen { width: 100%; max-width: none; min-width: 0; height: 100%; margin: 0; border: 0; border-radius: 0; box-shadow: none; animation: none; }
5
18
  #issues-panel header { height: 48px; box-sizing: border-box; display: flex; align-items: center; gap: 12px; padding: 0 16px; border-bottom: 1px solid var(--border-subtle); flex: 0 0 auto; }
6
19
  #issues-panel .issues-title { display: inline-flex; align-items: center; gap: 7px; font-weight: 700; }
7
20
  #issues-panel .issues-title .lucide { width: 15px; color: var(--accent); }
@@ -11,10 +24,10 @@
11
24
  #issues-panel .issues-icon-btn .lucide { width: 15px; }
12
25
  #issues-panel .issues-icon-btn.hidden { display: none; }
13
26
  #issues-panel .issues-icon-btn[aria-pressed="true"] { border-color: var(--accent); color: var(--accent); }
14
- #issues-panel button, #issues-panel input, #issues-panel textarea, #issues-panel select { font: inherit; color: inherit; background: var(--bg); border: 1px solid var(--border); border-radius: 6px; padding: 8px 10px; }
27
+ #issues-panel :where(button:not(.clayos-issue-link):not(.clayos-log-link), input, textarea, select) { font: inherit; color: inherit; background: var(--bg); border: 1px solid var(--border); border-radius: 6px; padding: 8px 10px; }
15
28
  #issues-panel button { cursor: pointer; }
16
- #issues-panel button:hover { background: var(--bg-hover, rgba(128,128,128,.12)); }
17
- #issues-panel button:disabled { opacity: .5; cursor: wait; }
29
+ #issues-panel button:not(.clayos-issue-link):not(.clayos-log-link):hover { background: var(--bg-hover, rgba(128,128,128,.12)); }
30
+ #issues-panel button:disabled { opacity: .5; cursor: default; }
18
31
  #issues-panel :focus-visible { outline: 2px solid var(--accent, #b98655); outline-offset: 2px; }
19
32
  .issues-filters { display: flex; align-items: center; flex-wrap: wrap; gap: 8px; padding: 12px 14px; border-bottom: 1px solid var(--border-subtle); background: color-mix(in srgb, var(--bg-alt) 72%, transparent); }
20
33
  .issues-search { flex: 1; min-width: 120px; 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); }
@@ -25,35 +38,44 @@
25
38
  .issues-notice { margin: 0; padding: 0 16px; font-size: 12px; color: var(--text-muted); }
26
39
  .issue-row { display: block; width: 100%; text-align: left; margin: 0; padding: 15px 18px 14px !important; border: 0 !important; border-bottom: 1px solid var(--border-subtle) !important; border-left: 2px solid transparent !important; border-radius: 0 !important; background: transparent !important; }
27
40
  .issue-row:hover { background: color-mix(in srgb, var(--accent) 5%, transparent) !important; border-left-color: var(--accent) !important; }
28
- .issue-row-head { display: flex; align-items: center; gap: 8px; margin-bottom: 7px; }
41
+ .issue-row-head { display: flex; align-items: baseline; flex-wrap: wrap; gap: 7px; }
29
42
  .issue-type { padding: 2px 7px; border-radius: 999px; background: rgba(var(--overlay-rgb), .08); color: var(--text-secondary); font-size: 10px; font-weight: 700; text-transform: uppercase; }
30
- .issue-row strong { display: block; font-size: 14px; }
43
+ .issue-row strong { flex: 1; min-width: 0; font-size: 14px; font-weight: 700; letter-spacing: -.01em; overflow-wrap: anywhere; }
31
44
  .issue-row p { margin: 7px 0 0; color: var(--text-secondary); font-size: 12.5px; line-height: 1.55; }
32
- .issue-row small, .issue-detail small { color: var(--text-muted); }
45
+
33
46
  .issue-row small { font-size: 10.5px; font-family: var(--font-mono); }
47
+ .issue-row-meta { display: flex; align-items: baseline; flex-wrap: wrap; gap: 8px; margin-top: 8px; color: var(--text-dimmer); font: 10.5px/1.5 var(--font-mono); }
48
+ .issue-row-meta .issue-status { font-family: var(--font-sans); }
34
49
  .issue-status { display: inline-flex; align-items: center; gap: 6px; font-size: 11px; letter-spacing: .03em; }
35
50
  .issue-status::before { content: ''; width: 7px; height: 7px; border: 1px solid currentColor; border-radius: 50%; }
36
- [data-status="in_progress"] { color: #bd923f; }
37
- [data-status="resolved"] { color: #479b77; }
38
- [data-status="closed"] { color: var(--text-muted); }
51
+ .issue-status[data-status="in_progress"] { color: #bd923f; }
52
+ .issue-status[data-status="resolved"] { color: #479b77; }
53
+ .issue-status[data-status="closed"] { color: var(--text-muted); }
39
54
  .issue-detail { max-width: 760px; margin: 0 auto; padding: 32px 28px 52px; }
40
- .issue-detail h2 { margin: 10px 0; font-family: var(--font-display); font-size: clamp(24px, 2.8vw, 34px); line-height: 1.12; }
41
- .issue-detail > p { font-size: 14px; line-height: 1.6; }
42
- .issue-detail > small { font-size: 11px; font-family: var(--font-mono); }
43
- .issue-detail .markdown-body { margin: 24px 0; }
44
- .issue-detail .markdown-body { font-size: 14px; line-height: 1.75; }
45
- .issue-detail section { margin-top: 24px; overflow-wrap: anywhere; }
46
- .issue-detail h3 { font-size: 12px; color: var(--text-muted); }
47
- #issues-panel .issue-discussion { border-top: 1px solid var(--border-subtle); }
48
- #issues-panel .issue-comment { padding: 12px 0; border-bottom: 1px solid var(--border-subtle); }
49
- #issues-panel .issue-comment-meta { color: var(--text-muted); font: 10.5px/1.4 var(--font-mono); }
50
- #issues-panel .issue-comment p { margin: 6px 0 0; font-size: 13px; line-height: 1.55; white-space: pre-wrap; overflow-wrap: anywhere; }
51
- #issues-panel .issue-comment small { display: block; margin-top: 7px; color: var(--text-dimmer); font-size: 11px; }
52
- #issues-panel .issue-discussion-empty { color: var(--text-muted); font-size: 13px; }
53
- #issues-panel #issue-comment-form { margin-top: 16px; }
54
- #issues-panel #issue-comment-form label { display: block; margin-bottom: 6px; color: var(--text-muted); font-size: 11px; }
55
- #issues-panel #issue-comment-input { width: 100%; box-sizing: border-box; min-height: 76px; resize: vertical; font-size: 13px; line-height: 1.55; }
56
- #issues-panel .issue-comment-status { min-height: 1.4em; margin: 6px 0; color: var(--text-muted); font-size: 11px; }
55
+ .issue-doc-chips { display: flex; align-items: center; flex-wrap: wrap; gap: 7px; margin-bottom: 10px; }
56
+ .issue-detail .issue-doc-title { margin: 0 0 10px; font-family: var(--font-display); font-size: clamp(24px, 2.8vw, 34px); letter-spacing: -.025em; line-height: 1.12; overflow-wrap: anywhere; }
57
+ .issue-doc-summary { color: var(--text-secondary); font-size: 14px; line-height: 1.6; }
58
+ .issue-detail .issue-doc-summary > p { margin: 0 0 13px; }
59
+ .issue-byline { margin: 0 0 18px; padding-bottom: 18px; border-bottom: 2px solid var(--border-subtle); color: var(--text-dimmer); font: 11px/1.6 var(--font-mono); overflow-wrap: anywhere; }
60
+ .issue-doc-body { margin: 24px 0 0; font-size: 14px; line-height: 1.75; overflow-wrap: anywhere; }
61
+ .issue-detail section { margin-top: 26px; overflow-wrap: anywhere; }
62
+ .issue-detail section h3 { margin: 0 0 12px; font-family: var(--font-display); font-size: 15px; color: var(--text); }
63
+ .issue-evidence { padding-top: 18px; border-top: 1px solid var(--border-subtle); font-size: 13px; line-height: 1.65; }
64
+ #issues-panel .issue-discussion { margin-top: 30px; padding-top: 18px; border-top: 1px solid var(--border-subtle); }
65
+ .issue-discussion h3 > span { margin-left: 4px; font: 11px var(--font-mono); color: var(--text-dimmer); }
66
+ #issues-panel .issue-comment { padding: 10px 12px; margin-bottom: 8px; border: 1px solid var(--border-subtle); border-radius: 9px; background: var(--bg-alt); }
67
+ .issue-comment-meta { margin-bottom: 5px; color: var(--text-dimmer); font: 10.5px/1.4 var(--font-mono); }
68
+ .issue-comment .markdown-body { font-size: 13px; line-height: 1.55; overflow-wrap: anywhere; }
69
+ .issue-comment .markdown-body > :first-child { margin-top: 0; }
70
+ .issue-comment .markdown-body > :last-child { margin-bottom: 0; }
71
+ .issue-comment-review { margin-top: 9px; padding: 8px 10px; border-left: 2px solid var(--accent); background: rgba(var(--overlay-rgb), .04); border-radius: 0 7px 7px 0; }
72
+ .issue-comment-review > span { display: block; margin-bottom: 5px; color: var(--text-dimmer); font: 10.5px var(--font-mono); }
73
+ .issue-discussion-empty { margin: 0; color: var(--text-dimmer); font-size: 12px; }
74
+ #issue-comment-form { display: grid; gap: 8px; margin-top: 18px; }
75
+ #issue-comment-form label { color: var(--text-secondary); font-size: 11px; font-weight: 700; text-transform: uppercase; letter-spacing: .06em; }
76
+ #issues-panel #issue-comment-input { width: 100%; box-sizing: border-box; min-height: 80px; resize: vertical; font-size: 13px; line-height: 1.55; border-radius: 8px; padding: 10px; background: var(--bg-alt); }
77
+ #issue-comment-form .issue-comment-status { min-height: 16px; margin: 0; color: var(--text-dimmer); font-size: 11px; }
78
+ .issue-comment-actions { display: flex; justify-content: flex-end; }
57
79
  #issues-panel .issues-delete-dialog { position: absolute; inset: 0; z-index: 2; display: grid; place-items: center; padding: 24px; background: rgba(0, 0, 0, .38); }
58
80
  #issues-panel .issues-delete-dialog.hidden { display: none; }
59
81
  #issues-panel .issues-delete-card { width: min(360px, 100%); box-sizing: border-box; padding: 22px; border: 1px solid var(--border); border-radius: 10px; background: var(--bg); box-shadow: 0 14px 40px rgba(0, 0, 0, .24); }
@@ -78,15 +100,16 @@
78
100
  .issues-content > h2 { padding: 0 28px; }
79
101
  .issues-content > h2 { margin: 0 0 10px; font-family: var(--font-display); font-size: 14px; line-height: 1.2; }
80
102
  .issues-history-note { margin: 0; padding: 14px 18px; border-bottom: 1px solid var(--border-subtle); color: var(--text-dimmer); font-size: 11px; font-family: var(--font-mono); }
81
- .clayos-issue-link { display: inline-flex; max-width: 100%; border: 1px solid var(--border); border-radius: 5px; background: var(--bg); color: inherit; font: inherit; font-size: .85em; padding: 2px 7px; cursor: pointer; vertical-align: baseline; overflow-wrap: anywhere; }
82
- @media (max-width: 1023px) { #issues-panel, #issues-panel.issues-wide { position: fixed; inset: 0; z-index: 150; width: 100%; max-width: none; min-width: 0; height: 100%; margin: 0; border-radius: 0; padding-top: var(--safe-top, 0px); padding-bottom: var(--safe-bottom, 0px); box-sizing: border-box; } #issues-panel button { min-height: 36px; } }
103
+
104
+ @media (max-width: 1023px) { #issues-panel, #issues-panel.issues-wide { position: fixed; inset: 0; z-index: 300; width: 100%; max-width: none; min-width: 0; height: 100%; margin: 0; border: 0; border-radius: 0; padding-top: var(--safe-top, 0px); padding-bottom: var(--safe-bottom, 0px); box-sizing: border-box; } #issues-panel button:not(.clayos-issue-link):not(.clayos-log-link) { min-height: 36px; } }
105
+ @media (max-width: 1023px) { #issues-panel [data-issues-wide], #issues-panel [data-issues-full] { display: none; } }
83
106
  @media (max-width: 390px) {
84
107
  #issues-panel header { gap: 4px; padding: 8px; }
85
108
  #issues-panel header button { padding: 7px; }
86
109
  #issues-panel [data-issues-wide], #issues-panel [data-issues-full] { display: none; }
87
110
  .issues-filters { display: grid; grid-template-columns: 1fr 1fr; padding: 8px; }
88
111
  .issues-filters .issues-search { grid-column: 1 / -1; width: 100%; box-sizing: border-box; }
89
- .issues-content { padding: 10px; }
112
+ .issues-content { padding: 0; }
90
113
  .issue-row { padding: 12px !important; }
91
114
  .issue-detail h2 { font-size: 20px; }
92
115
  }
@@ -99,3 +122,27 @@
99
122
  .issues-content > h2 { padding-right: 18px; padding-left: 18px; }
100
123
  .issue-detail { padding: 24px 18px 38px; }
101
124
  }
125
+
126
+ #issues-panel { font-family: var(--font-sans); font-size: 13px; }
127
+ #issues-panel .issues-title { font-size: 13px; }
128
+ .issues-notice:empty { display: none; }
129
+ .issues-notice:not(:empty) { padding: 10px 16px; border-bottom: 1px solid var(--border-subtle); line-height: 1.5; }
130
+ .issues-inline-update { display: inline-flex; align-items: center; gap: 7px; width: 100%; box-sizing: border-box; margin: 0 0 8px; padding: 7px 9px; border: 1px solid color-mix(in srgb, var(--accent) 35%, var(--border)); border-radius: 7px; background: color-mix(in srgb, var(--accent) 7%, transparent); color: var(--text-secondary); font-size: 11px; }
131
+ .issues-inline-update button { margin-left: auto; padding: 3px 8px !important; border-color: var(--accent) !important; color: var(--accent) !important; font-size: 11px !important; font-weight: 700; }
132
+ .issue-type { letter-spacing: .03em; flex-shrink: 0; }
133
+ #issues-panel .issue-actions { margin: 0 0 24px; gap: 6px; }
134
+ #issues-panel .issue-actions button, #issues-panel .issue-comment-actions button { display: inline-flex; align-items: center; justify-content: center; gap: 6px; padding: 7px 10px; border-radius: 7px; font-size: 11px; font-weight: 600; background: var(--bg-alt); color: var(--text-secondary); }
135
+ #issues-panel .issue-actions .lucide { width: 13px; height: 13px; }
136
+ #issues-panel button.issue-primary { border-color: var(--accent); background: var(--accent); color: #fff; }
137
+ #issues-panel button.issue-primary:hover { background: var(--accent-hover, var(--accent)); }
138
+ #issues-panel .issue-actions button.issue-danger { margin-left: auto; color: var(--danger); background: transparent; }
139
+ #issues-panel #issue-form .issue-actions { margin-top: 18px; }
140
+ #issues-panel.panel-fullscreen .issue-detail { padding: clamp(28px, 5vw, 64px); }
141
+ .issues-load-more { padding: 16px; text-align: center; }
142
+ #issues-panel .issues-filters select { height: 36px; max-width: 42%; }
143
+ @media (max-width: 480px) {
144
+ .issues-filters .issues-search { flex-basis: 100%; }
145
+ #issues-panel .issues-filters select { flex: 1; max-width: none; }
146
+ .issue-row-head strong { flex-basis: 100%; }
147
+ #issues-panel .issue-actions button.issue-danger { margin-left: 0; }
148
+ }
@@ -423,6 +423,13 @@
423
423
  .mobile-vendor-list .mobile-session-new-vendor:active {
424
424
  background: rgba(var(--overlay-rgb), 0.1);
425
425
  }
426
+ .mobile-vendor-row { display: flex; align-items: stretch; gap: 4px; }
427
+ .mobile-vendor-row .mobile-session-new-vendor { flex: 1 1 auto; min-width: 0; }
428
+ .mobile-vendor-set-default { border: 1px solid var(--border-subtle); border-radius: 8px; background: transparent; color: var(--text-dimmer); padding: 0 8px; font-size: 11px; white-space: nowrap; }
429
+ .mobile-vendor-set-default:active { background: rgba(var(--overlay-rgb), 0.1); }
430
+ .mobile-vendor-set-default:disabled { opacity: 0.55; }
431
+ .mobile-session-new-preference-status { padding: 4px 8px 8px; color: var(--error); font-size: 11px; }
432
+ .mobile-session-new-fallback-note { color: var(--text-muted); }
426
433
  .mobile-vendor-note {
427
434
  margin-left: auto;
428
435
  font-size: 12px;
@@ -181,7 +181,7 @@
181
181
  margin-top: 8px;
182
182
  }
183
183
  .notif-banner-allow, .notif-banner-always, .notif-banner-deny, .notif-banner-goto,
184
- .notif-banner-tui-open, .notif-banner-tui-goto {
184
+ .notif-banner-tui-open, .notif-banner-tui-goto, .notif-banner-result-open {
185
185
  padding: 4px 10px;
186
186
  border-radius: 6px;
187
187
  font-size: 11px;
@@ -191,11 +191,11 @@
191
191
  border: none;
192
192
  transition: opacity 0.15s, background 0.15s;
193
193
  }
194
- .notif-banner-tui-open {
194
+ .notif-banner-tui-open, .notif-banner-result-open {
195
195
  background: var(--accent, #6c5ce7);
196
196
  color: #fff;
197
197
  }
198
- .notif-banner-tui-open:hover { opacity: 0.85; }
198
+ .notif-banner-tui-open:hover, .notif-banner-result-open:hover { opacity: 0.85; }
199
199
  .notif-banner-tui-goto {
200
200
  background: var(--accent2);
201
201
  border: none;
@@ -134,6 +134,9 @@ button.pending-message-drag:active { cursor: grabbing; }
134
134
  .pending-message-meta { display: flex; gap: 8px; margin-top: 3px; color: var(--text-dimmer); font-size: 9px; line-height: 1.2; }
135
135
  .pending-message-meta span + span::before { content: "·"; margin-right: 8px; }
136
136
  .pending-message-sending { color: var(--accent); font-weight: 650; }
137
+ .pending-message-schedule-meta { display: flex; align-items: center; gap: 4px; margin-top: 4px; color: var(--accent); font-size: 10px; font-variant-numeric: tabular-nums; }
138
+ .pending-message-schedule-meta .lucide { width: 11px; height: 11px; }
139
+ .pending-message-chip.is-future { border-color: color-mix(in srgb, var(--accent) 35%, var(--border-subtle)); }
137
140
 
138
141
  .pending-message-actions { display: flex; align-items: center; gap: 1px; padding-right: 5px; }
139
142
  .pending-message-actions button { cursor: pointer; }
@@ -196,3 +196,18 @@
196
196
  .project-log-row { padding: 14px 14px 13px; }
197
197
  .project-log-document { padding: 24px 18px 38px; }
198
198
  }
199
+ .project-log-session-button {
200
+ align-self: flex-start;
201
+ display: inline-flex;
202
+ align-items: center;
203
+ gap: 6px;
204
+ margin: 0 0 16px;
205
+ border: 1px solid var(--border);
206
+ border-radius: 8px;
207
+ padding: 7px 10px;
208
+ background: var(--bg-alt);
209
+ color: var(--text);
210
+ cursor: pointer;
211
+ }
212
+
213
+ .project-log-session-button:hover { border-color: var(--accent); }
@@ -1464,6 +1464,13 @@
1464
1464
 
1465
1465
  /* --- New-session vendor picker --- */
1466
1466
  .session-new-menu { min-width: 200px; }
1467
+ .session-new-vendor-row { display: flex; align-items: stretch; }
1468
+ .session-new-vendor-row .session-new-vendor { flex: 1 1 auto; min-width: 0; }
1469
+ .session-new-set-default { border: 0; background: transparent; color: var(--text-dimmer); padding: 0 8px; font-size: 10px; cursor: pointer; }
1470
+ .session-new-set-default:hover { color: var(--text); background: rgba(var(--overlay-rgb), 0.05); }
1471
+ .session-new-set-default:disabled { opacity: 0.55; cursor: wait; }
1472
+ .session-new-preference-status { padding: 6px 10px; color: var(--error); font-size: 11px; }
1473
+ .session-new-fallback-note { color: var(--text-muted); border-bottom: 1px solid var(--border); }
1467
1474
 
1468
1475
  .session-ctx-sep {
1469
1476
  height: 1px;
@@ -764,6 +764,35 @@
764
764
  .notes-browser-card-action:hover { background: var(--bg-alt); color: var(--text); }
765
765
  .notes-browser-card-action:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
766
766
 
767
+ .notes-delete-dialog {
768
+ position: absolute;
769
+ inset: 0;
770
+ z-index: 2;
771
+ display: flex;
772
+ align-items: center;
773
+ justify-content: center;
774
+ padding: 24px;
775
+ background: rgba(var(--shadow-rgb), 0.28);
776
+ }
777
+ .notes-delete-dialog.hidden { display: none; }
778
+ .notes-delete-dialog-card {
779
+ width: min(420px, 100%);
780
+ padding: 20px;
781
+ border: 1px solid var(--border);
782
+ border-radius: 10px;
783
+ background: var(--bg);
784
+ box-shadow: 0 12px 36px rgba(var(--shadow-rgb), 0.24);
785
+ }
786
+ .notes-delete-dialog-card h2 { margin: 0 0 10px; font-size: 16px; }
787
+ .notes-delete-dialog-card p { margin: 8px 0; color: var(--text-secondary); font-size: 12px; }
788
+ .notes-delete-dialog-title { font-weight: 700; color: var(--text) !important; overflow-wrap: anywhere; }
789
+ .notes-delete-dialog-status { min-height: 18px; }
790
+ .notes-delete-dialog-actions { display: flex; justify-content: flex-end; gap: 8px; margin-top: 16px; }
791
+ .notes-delete-dialog-actions button { padding: 7px 12px; border: 1px solid var(--border); border-radius: 6px; background: var(--bg); color: var(--text); font: inherit; cursor: pointer; }
792
+ .notes-delete-dialog-actions button.danger { background: var(--danger, #b42318); border-color: var(--danger, #b42318); color: #fff; }
793
+ .notes-delete-dialog-actions button:disabled { opacity: 0.55; cursor: default; }
794
+ .notes-delete-dialog-actions button:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
795
+
767
796
  .notes-browser-card-body {
768
797
  flex: 1;
769
798
  font-size: 11.5px;
@@ -17,6 +17,9 @@ import { resumeHomeChat } from './home-mate-chat.js';
17
17
  import { requestHomeSurfacePreference } from './home-surface.js';
18
18
  import { isHomeDebatesSurface } from './home-sub-surface.js';
19
19
  import { beginDefaultAiConnection, requestDefaultAi } from './default-ai.js';
20
+ import { beginContextViewConnection, requestContextView } from './context-view-preference.js';
21
+ import { beginDefaultVendorConnection, requestDefaultVendor } from './default-vendor.js';
22
+ import { clearProjectSplitState } from './split-session-boundary.js';
20
23
 
21
24
  var reconnectTimer = null;
22
25
  var reconnectDelay = 1000;
@@ -233,7 +236,8 @@ export function connect() {
233
236
 
234
237
  var protocol = location.protocol === "https:" ? "wss:" : "ws:";
235
238
  var socketPath = store.get('wsPath');
236
- store.set({ socketPath: socketPath, activeProjectSlug: null, sessionActivatedProjectSlug: null });
239
+ if (store.get('socketPath') && store.get('socketPath') !== socketPath) clearProjectSplitState();
240
+ store.set({ socketPath: socketPath, activeProjectSlug: null, sessionActivatedProjectSlug: null, sessionListProjectSlug: null, splitGroupsProjectSlug: null });
237
241
  var newWs = new WebSocket(protocol + "//" + location.host + socketPath);
238
242
  setWs(newWs);
239
243
 
@@ -277,6 +281,10 @@ export function connect() {
277
281
  onConnected();
278
282
  beginDefaultAiConnection();
279
283
  requestDefaultAi();
284
+ beginDefaultVendorConnection();
285
+ requestDefaultVendor();
286
+ beginContextViewConnection();
287
+ requestContextView();
280
288
  };
281
289
 
282
290
  newWs.onclose = function (e) {
@@ -194,6 +194,16 @@ export function stopUrgentBlink() {
194
194
  }
195
195
 
196
196
  export function setActivity(text) {
197
+ var thinkingState = store.get('thinkingState');
198
+ if (text === "thinking" && thinkingState && thinkingState.active) {
199
+ // Live Thinking already owns the tail progress UI. Compaction and tool
200
+ // activity intentionally continue through so their distinct states show.
201
+ if (getActivityEl()) {
202
+ getActivityEl().remove();
203
+ setActivityEl(null);
204
+ }
205
+ return;
206
+ }
197
207
  if (text) {
198
208
  if (!getActivityEl()) {
199
209
  var _actEl = document.createElement("div");