clay-server 2.24.2 → 2.24.3-beta.2

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.
package/lib/project.js CHANGED
@@ -429,6 +429,7 @@ function createProjectContext(opts) {
429
429
  var _projModel = typeof opts.onGetProjectDefaultModel === "function" ? opts.onGetProjectDefaultModel(slug) : null;
430
430
  var _srvModel = typeof opts.onGetServerDefaultModel === "function" ? opts.onGetServerDefaultModel() : null;
431
431
  sm._savedDefaultModel = (_projModel && _projModel.model) || (_srvModel && _srvModel.model) || null;
432
+ if (sm._savedDefaultModel) sm.currentModel = sm._savedDefaultModel;
432
433
 
433
434
  // --- SDK bridge ---
434
435
  var sdk = createSDKBridge({
package/lib/public/app.js CHANGED
@@ -5609,6 +5609,14 @@ import { initDebate, handleDebatePreparing, handleDebateStarted, handleDebateRes
5609
5609
  if (d.user && d.user.id) myUserId = d.user.id;
5610
5610
  if (d.permissions) myPermissions = d.permissions;
5611
5611
  if (d.mustChangePin) showForceChangePinOverlay();
5612
+ // Single-user mode: clear user strip skeletons immediately (no presence message will arrive)
5613
+ if (!isMultiUserMode) {
5614
+ var usersContainer = document.getElementById("icon-strip-users");
5615
+ if (usersContainer) {
5616
+ usersContainer.innerHTML = "";
5617
+ usersContainer.classList.add("hidden");
5618
+ }
5619
+ }
5612
5620
  initCursorToggle();
5613
5621
  // Apply RBAC UI gating
5614
5622
  if (myPermissions) {
@@ -2648,6 +2648,63 @@ body.mate-dm-active .activity-inline:not(.mention-activity-bar):not(.mate-pre-ac
2648
2648
  }
2649
2649
 
2650
2650
  @media (max-width: 768px) {
2651
+ /* Mobile mate DM: revert user messages to default bubble layout */
2652
+ body.mate-dm-active .msg-user,
2653
+ body.mate-dm-active .msg-assistant {
2654
+ display: flex !important;
2655
+ flex-direction: column !important;
2656
+ align-items: initial !important;
2657
+ gap: initial !important;
2658
+ max-width: var(--content-width) !important;
2659
+ padding: 0 20px !important;
2660
+ margin: 0 auto 8px !important;
2661
+ border-radius: initial !important;
2662
+ }
2663
+ body.mate-dm-active .msg-user {
2664
+ align-items: flex-end !important;
2665
+ }
2666
+ body.mate-dm-active .msg-assistant {
2667
+ margin-bottom: 12px !important;
2668
+ padding: 4px 20px !important;
2669
+ }
2670
+ body.mate-dm-active .msg-user:hover {
2671
+ background: initial !important;
2672
+ }
2673
+ body.mate-dm-active .msg-user .dm-bubble-avatar-me {
2674
+ display: none !important;
2675
+ }
2676
+ body.mate-dm-active .msg-user .dm-bubble-content {
2677
+ align-items: flex-end !important;
2678
+ flex: initial !important;
2679
+ width: 100% !important;
2680
+ }
2681
+ body.mate-dm-active .msg-user .dm-bubble-header {
2682
+ display: none !important;
2683
+ }
2684
+ body.mate-dm-active .msg-user .bubble {
2685
+ background: var(--user-bubble) !important;
2686
+ border-radius: 20px 20px 4px 20px !important;
2687
+ padding: 12px 18px !important;
2688
+ max-width: 85% !important;
2689
+ width: fit-content !important;
2690
+ font-size: 15px !important;
2691
+ line-height: 1.55 !important;
2692
+ white-space: pre-wrap !important;
2693
+ word-wrap: break-word !important;
2694
+ }
2695
+ body.mate-dm-active .msg-user .msg-actions {
2696
+ display: flex !important;
2697
+ }
2698
+ body.mate-dm-active .msg-assistant .dm-bubble-content {
2699
+ flex: initial !important;
2700
+ width: 100% !important;
2701
+ }
2702
+ body.mate-dm-active .msg-assistant .md-content {
2703
+ background: initial !important;
2704
+ border-radius: initial !important;
2705
+ padding: initial !important;
2706
+ }
2707
+
2651
2708
  .mate-mobile-title:not(.hidden) {
2652
2709
  display: flex !important;
2653
2710
  }
@@ -1823,43 +1823,52 @@ body.wide-view .turn-meta {
1823
1823
  max-width: 100%;
1824
1824
  }
1825
1825
 
1826
- /* Mobile: force bubble layout regardless of user setting */
1826
+ /* Mobile: force bubble layout regardless of user setting (except mate mode) */
1827
1827
  @media (max-width: 768px) {
1828
- body.wide-view { --content-width: var(--content-width, 720px); }
1829
- body.wide-view .msg-user,
1830
- body.wide-view .msg-assistant {
1831
- display: revert;
1832
- flex-direction: revert;
1833
- align-items: revert;
1834
- gap: revert;
1835
- max-width: revert;
1836
- padding: revert;
1837
- margin: revert;
1838
- border-radius: revert;
1828
+ body.wide-view:not(.mate-dm-active) { --content-width: 720px; }
1829
+ body.wide-view:not(.mate-dm-active) .msg-user {
1830
+ display: flex;
1831
+ flex-direction: column;
1832
+ align-items: flex-end;
1833
+ gap: initial;
1834
+ max-width: var(--content-width);
1835
+ padding: 0 20px;
1836
+ margin: 0 auto 8px;
1837
+ border-radius: initial;
1838
+ justify-content: initial;
1839
+ }
1840
+ body.wide-view:not(.mate-dm-active) .msg-assistant {
1841
+ display: block;
1842
+ flex-direction: initial;
1843
+ align-items: initial;
1844
+ gap: initial;
1845
+ max-width: var(--content-width);
1846
+ padding: 4px 20px;
1847
+ margin: 0 auto 12px;
1848
+ border-radius: 12px;
1839
1849
  }
1840
- body.wide-view .msg-user:hover,
1841
- body.wide-view .msg-assistant:hover { background: revert; }
1842
- body.wide-view .msg-user { justify-content: revert; }
1843
- body.wide-view .msg-user .dm-bubble-avatar-me { order: revert; }
1844
- body.wide-view .msg-user .bubble {
1845
- background: revert;
1846
- border-radius: revert;
1847
- padding: revert;
1848
- max-width: revert;
1849
- font-size: revert;
1850
- line-height: revert;
1851
- white-space: revert;
1852
- word-wrap: revert;
1850
+ body.wide-view:not(.mate-dm-active) .msg-user:hover { background: initial; }
1851
+ body.wide-view:not(.mate-dm-active) .msg-assistant:hover { background: rgba(var(--overlay-rgb), 0.02); }
1852
+ body.wide-view:not(.mate-dm-active) .msg-user .dm-bubble-avatar-me { order: initial; }
1853
+ body.wide-view:not(.mate-dm-active) .msg-user .bubble {
1854
+ background: var(--user-bubble);
1855
+ border-radius: 20px 20px 4px 20px;
1856
+ padding: 12px 18px;
1857
+ max-width: 85%;
1858
+ font-size: 15px;
1859
+ line-height: 1.55;
1860
+ white-space: pre-wrap;
1861
+ word-wrap: break-word;
1853
1862
  }
1854
- body.wide-view .msg-user .msg-actions { align-self: revert; margin-left: revert; padding-top: revert; }
1855
- body.wide-view .msg-user .msg-actions .msg-action-time { display: revert; }
1856
- body.wide-view .msg-assistant .md-content {
1857
- background: revert;
1858
- border-radius: revert;
1859
- padding: revert;
1863
+ body.wide-view:not(.mate-dm-active) .msg-user .msg-actions { align-self: initial; margin-left: initial; padding-top: initial; }
1864
+ body.wide-view:not(.mate-dm-active) .msg-user .msg-actions .msg-action-time { display: initial; }
1865
+ body.wide-view:not(.mate-dm-active) .msg-assistant .md-content {
1866
+ background: initial;
1867
+ border-radius: initial;
1868
+ padding: initial;
1860
1869
  }
1861
- body.wide-view .thinking-item,
1862
- body.wide-view .tool-item,
1863
- body.wide-view .tool-group { max-width: revert; }
1864
- body.wide-view .turn-meta { max-width: revert; }
1870
+ body.wide-view:not(.mate-dm-active) .thinking-item,
1871
+ body.wide-view:not(.mate-dm-active) .tool-item,
1872
+ body.wide-view:not(.mate-dm-active) .tool-group { max-width: var(--content-width); }
1873
+ body.wide-view:not(.mate-dm-active) .turn-meta { max-width: var(--content-width); }
1865
1874
  }
@@ -1001,4 +1001,47 @@
1001
1001
  flex-shrink: 0;
1002
1002
  margin-left: auto;
1003
1003
  }
1004
+
1005
+ /* ---- Mobile mate DM: force bubble layout for user messages ---- */
1006
+ body.mate-dm-active .msg-user {
1007
+ display: flex !important;
1008
+ flex-direction: column !important;
1009
+ align-items: flex-end !important;
1010
+ gap: initial !important;
1011
+ max-width: 100% !important;
1012
+ padding: 0 20px !important;
1013
+ margin: 0 0 8px !important;
1014
+ border-radius: initial !important;
1015
+ justify-content: initial !important;
1016
+ }
1017
+ body.mate-dm-active .msg-user .dm-bubble-avatar-me {
1018
+ display: none !important;
1019
+ }
1020
+ body.mate-dm-active .msg-user .dm-bubble-content {
1021
+ display: flex !important;
1022
+ flex-direction: column !important;
1023
+ align-items: flex-end !important;
1024
+ flex: initial !important;
1025
+ width: 100% !important;
1026
+ }
1027
+ body.mate-dm-active .msg-user .dm-bubble-header {
1028
+ display: none !important;
1029
+ }
1030
+ body.mate-dm-active .msg-user .bubble {
1031
+ background: var(--user-bubble) !important;
1032
+ border-radius: 20px 20px 4px 20px !important;
1033
+ padding: 12px 18px !important;
1034
+ max-width: 85% !important;
1035
+ width: fit-content !important;
1036
+ font-size: 15px !important;
1037
+ line-height: 1.55 !important;
1038
+ white-space: pre-wrap !important;
1039
+ word-wrap: break-word !important;
1040
+ }
1041
+ body.mate-dm-active .msg-user .msg-actions {
1042
+ display: flex !important;
1043
+ }
1044
+ body.mate-dm-active .msg-user:hover {
1045
+ background: initial !important;
1046
+ }
1004
1047
  }
@@ -498,7 +498,7 @@
498
498
  /* Session unread badge */
499
499
  .session-unread-badge {
500
500
  position: absolute;
501
- right: 32px;
501
+ right: 8px;
502
502
  top: 50%;
503
503
  transform: translateY(-50%);
504
504
  min-width: 18px;
@@ -23,7 +23,28 @@
23
23
  (function(){try{var k="clay-theme-vars",v=localStorage.getItem(k),r=document.documentElement;if(v){var o=JSON.parse(v),p;for(p in o)r.style.setProperty(p,o[p]);var vt=localStorage.getItem(k.replace("-vars","-variant"));if(vt==="light"){r.classList.add("light-theme");r.classList.remove("dark-theme")}else{r.classList.add("dark-theme");r.classList.remove("light-theme")}var m=document.querySelector('meta[name="theme-color"]');if(m&&o["--bg"])m.setAttribute("content",o["--bg"])}else{var sl=window.matchMedia&&window.matchMedia("(prefers-color-scheme: light)").matches;if(sl){r.classList.add("light-theme");r.classList.remove("dark-theme")}}}catch(e){}})();
24
24
  </script>
25
25
  <script>if(window.navigator.standalone||window.matchMedia("(display-mode:standalone)").matches){document.documentElement.classList.add("pwa-standalone")}</script>
26
- <link rel="stylesheet" href="style.css">
26
+ <link rel="stylesheet" href="style.css?v=20260407">
27
+ <style>
28
+ @media(max-width:768px){
29
+ /* User messages: vertical stack, avatar on top, right-aligned */
30
+ body.wide-view:not(.mate-dm-active) .msg-user{flex-direction:column!important;align-items:flex-end!important;gap:4px!important;max-width:100%!important;padding:0 16px!important;margin:0 0 8px!important;justify-content:initial!important}
31
+ body.wide-view:not(.mate-dm-active) .msg-user .dm-bubble-avatar-me{order:-1!important}
32
+ body.wide-view:not(.mate-dm-active) .msg-user .dm-bubble-content{display:flex!important;flex-direction:column!important;align-items:flex-end!important;width:100%!important;flex:initial!important}
33
+ body.wide-view:not(.mate-dm-active) .msg-user .bubble{background:var(--user-bubble)!important;border-radius:20px 20px 4px 20px!important;padding:12px 18px!important;max-width:85%!important;width:fit-content!important;font-size:15px!important;line-height:1.55!important;white-space:pre-wrap!important;word-wrap:break-word!important}
34
+ body.wide-view:not(.mate-dm-active) .msg-user:hover{background:initial!important}
35
+ /* Assistant messages: row (avatar left), keep channel style */
36
+ body.wide-view:not(.mate-dm-active) .msg-assistant{max-width:100%!important;padding:4px 16px!important;margin:0 0 12px!important}
37
+ body.wide-view:not(.mate-dm-active) .msg-assistant .md-content{background:initial!important;border-radius:initial!important;padding:initial!important}
38
+ body.wide-view:not(.mate-dm-active) .thinking-item,
39
+ body.wide-view:not(.mate-dm-active) .tool-item,
40
+ body.wide-view:not(.mate-dm-active) .tool-group{max-width:100%!important}
41
+ body.wide-view:not(.mate-dm-active) .turn-meta{max-width:100%!important}
42
+ }
43
+ #ask-mate-btn::before{content:""!important;position:absolute!important;inset:0!important;background:linear-gradient(135deg,#4ecdc4 0%,#556bf7 33%,#a855f7 55%,#f857a6 78%,#ff6b6b 100%)!important;border-radius:inherit!important;opacity:0;transform:scale(0.3);transition:opacity 0.3s ease,transform 0.35s cubic-bezier(0.34,1.56,0.64,1);z-index:-1}
44
+ #ask-mate-btn:hover::before{opacity:1!important;transform:scale(1)!important}
45
+ #ask-mate-btn:hover{border-color:transparent!important;background:transparent!important;transform:translateY(-1px);box-shadow:0 2px 12px rgba(148,130,247,0.4)}
46
+ #ask-mate-btn:hover .ask-mate-label{background:none!important;-webkit-text-fill-color:#fff!important}
47
+ </style>
27
48
  </head>
28
49
  <body>
29
50
  <div id="layout">
@@ -4,7 +4,7 @@
4
4
  @import url("css/sidebar.css");
5
5
  @import url("css/overlays.css");
6
6
  @import url("css/menus.css");
7
- @import url("css/messages.css");
7
+ @import url("css/messages.css?v=20260407");
8
8
  @import url("css/rewind.css");
9
9
  @import url("css/input.css");
10
10
  @import url("css/filebrowser.css");
@@ -13,7 +13,7 @@
13
13
  @import url("css/server-settings.css");
14
14
  @import url("css/sticky-notes.css");
15
15
  @import url("css/skills.css");
16
- @import url("css/mobile-nav.css");
16
+ @import url("css/mobile-nav.css?v=20260407");
17
17
  @import url("css/loop.css");
18
18
  @import url("css/scheduler.css");
19
19
  @import url("css/scheduler-modal.css");
@@ -25,7 +25,7 @@
25
25
  @import url("css/admin.css");
26
26
  @import url("css/session-search.css");
27
27
  @import url("css/tooltip.css");
28
- @import url("css/mates.css");
28
+ @import url("css/mates.css?v=20260407");
29
29
  @import url("css/command-palette.css");
30
30
  @import url("css/mention.css");
31
31
  @import url("css/debate.css");
package/lib/public/sw.js CHANGED
@@ -1,4 +1,4 @@
1
- var CACHE_NAME = "clay-offline-v1";
1
+ var CACHE_NAME = "clay-offline-v2";
2
2
 
3
3
  self.addEventListener("install", function (event) {
4
4
  event.waitUntil(self.skipWaiting());
package/lib/sdk-bridge.js CHANGED
@@ -592,7 +592,21 @@ function createSDKBridge(opts) {
592
592
  suggestion: parsed.suggestion || "",
593
593
  });
594
594
 
595
- } else if (parsed.type && parsed.type !== "system" && parsed.type !== "user") {
595
+ } else if (parsed.type === "system") {
596
+ // Catch-all for unhandled system subtypes (e.g. hook-block errors).
597
+ // Extract any error text and surface it in the UI.
598
+ var sysText = parsed.error || parsed.message || parsed.text || "";
599
+ if (!sysText && Array.isArray(parsed.content)) {
600
+ sysText = parsed.content
601
+ .filter(function(c) { return c.type === "text"; })
602
+ .map(function(c) { return c.text; })
603
+ .join("\n");
604
+ }
605
+ if (sysText) {
606
+ console.log("[sdk-bridge] Unhandled system message (subtype=" + (parsed.subtype || "none") + "): " + sysText.substring(0, 200));
607
+ sendAndRecord(session, { type: "error", text: sysText });
608
+ }
609
+ } else if (parsed.type && parsed.type !== "user") {
596
610
  }
597
611
  }
598
612
 
@@ -1250,7 +1264,12 @@ function createSDKBridge(opts) {
1250
1264
  canAutoLogin: canAutoLogin,
1251
1265
  });
1252
1266
  } else {
1253
- sendAndRecord(session, { type: "error", text: "Claude process error: " + msg.error });
1267
+ var errText = msg.error || "Unknown error";
1268
+ // When stderr is empty, fall back to worker stderr buffer (covers hook failures at session start)
1269
+ if (!msg.stderr && worker._stderrBuf) {
1270
+ errText += "\n" + worker._stderrBuf.trim();
1271
+ }
1272
+ sendAndRecord(session, { type: "error", text: "Claude process error: " + errText });
1254
1273
  }
1255
1274
  sendAndRecord(session, { type: "done", code: 1 });
1256
1275
  if (pushModule) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "clay-server",
3
- "version": "2.24.2",
3
+ "version": "2.24.3-beta.2",
4
4
  "description": "Self-hosted Claude Code in your browser. Multi-session, multi-user, push notifications.",
5
5
  "bin": {
6
6
  "clay-server": "./bin/cli.js",