clay-server 2.27.0-beta.7 → 2.27.0-beta.9

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.
@@ -534,6 +534,8 @@ function attachDebate(ctx) {
534
534
  ctx.sm.switchSession(setupSession.localId, null, ctx.hydrateImageRefs);
535
535
  debate.setupSessionId = setupSession.localId;
536
536
  debate.setupStartedAt = setupSession.loop.startedAt;
537
+ // Share debate state with setup session so confirm_brief works from either
538
+ setupSession._debate = debate;
537
539
 
538
540
  // Build DM conversation context for the moderator
539
541
  var dmContext = msg.dmContext || "";
@@ -719,6 +721,13 @@ function attachDebate(ctx) {
719
721
  ctx.send({ type: "mention_processing", mateId: mateId, active: active });
720
722
  }
721
723
 
724
+ // Persist a debate message to session history and send to clients
725
+ function debateSendAndRecord(session, msg) {
726
+ session.history.push(msg);
727
+ ctx.sm.appendToSessionFile(session, msg);
728
+ ctx.sendToSession(session.localId, msg);
729
+ }
730
+
722
731
  // --- Live debate ---
723
732
 
724
733
  function startDebateLive(session) {
@@ -769,7 +778,7 @@ function attachDebate(ctx) {
769
778
 
770
779
  // Signal moderator's first turn
771
780
  debateMateProcessing(debate.moderatorId, true);
772
- ctx.sendToSession(debateSession.localId, {
781
+ debateSendAndRecord(debateSession, {
773
782
  type: "debate_turn",
774
783
  mateId: debate.moderatorId,
775
784
  mateName: moderatorProfile.name,
@@ -796,7 +805,7 @@ function attachDebate(ctx) {
796
805
  },
797
806
  onDelta: function (delta) {
798
807
  if (debateSession._debate && debateSession._debate.phase !== "ended") {
799
- ctx.sendToSession(debateSession.localId, { type: "debate_stream", mateId: debate.moderatorId, mateName: moderatorProfile.name, delta: delta });
808
+ debateSendAndRecord(debateSession, { type: "debate_stream", mateId: debate.moderatorId, mateName: moderatorProfile.name, delta: delta });
800
809
  }
801
810
  },
802
811
  onDone: function (fullText) {
@@ -904,7 +913,7 @@ function attachDebate(ctx) {
904
913
 
905
914
  // Notify clients of new turn
906
915
  debateMateProcessing(mateId, true);
907
- ctx.sendToSession(session.localId, {
916
+ debateSendAndRecord(session, {
908
917
  type: "debate_turn",
909
918
  mateId: mateId,
910
919
  mateName: profile.name,
@@ -924,7 +933,7 @@ function attachDebate(ctx) {
924
933
  onDelta: function (delta) {
925
934
  if (session._debate && session._debate.phase !== "ended") {
926
935
  debate._currentTurnText += delta;
927
- ctx.sendToSession(session.localId, { type: "debate_stream", mateId: mateId, mateName: profile.name, delta: delta });
936
+ debateSendAndRecord(session, { type: "debate_stream", mateId: mateId, mateName: profile.name, delta: delta });
928
937
  }
929
938
  },
930
939
  onDone: function (fullText) {
@@ -1069,7 +1078,7 @@ function attachDebate(ctx) {
1069
1078
 
1070
1079
  // Notify clients of moderator turn
1071
1080
  debateMateProcessing(debate.moderatorId, true);
1072
- ctx.sendToSession(session.localId, {
1081
+ debateSendAndRecord(session, {
1073
1082
  type: "debate_turn",
1074
1083
  mateId: debate.moderatorId,
1075
1084
  mateName: moderatorProfile.name,
@@ -1099,7 +1108,7 @@ function attachDebate(ctx) {
1099
1108
  },
1100
1109
  onDelta: function (delta) {
1101
1110
  if (session._debate && session._debate.phase !== "ended") {
1102
- ctx.sendToSession(session.localId, { type: "debate_stream", mateId: debate.moderatorId, mateName: moderatorProfile.name, delta: delta });
1111
+ debateSendAndRecord(session, { type: "debate_stream", mateId: debate.moderatorId, mateName: moderatorProfile.name, delta: delta });
1103
1112
  }
1104
1113
  },
1105
1114
  onDone: function (fullText) {
@@ -1166,7 +1175,7 @@ function attachDebate(ctx) {
1166
1175
  debate.turnInProgress = true;
1167
1176
  var moderatorProfile = ctx.getMateProfile(debate.mateCtx, debate.moderatorId);
1168
1177
 
1169
- ctx.sendToSession(session.localId, {
1178
+ debateSendAndRecord(session, {
1170
1179
  type: "debate_turn",
1171
1180
  mateId: debate.moderatorId,
1172
1181
  mateName: moderatorProfile.name,
@@ -1205,7 +1214,7 @@ function attachDebate(ctx) {
1205
1214
  debate.turnInProgress = true;
1206
1215
  var moderatorProfile = ctx.getMateProfile(debate.mateCtx, debate.moderatorId);
1207
1216
 
1208
- ctx.sendToSession(session.localId, {
1217
+ debateSendAndRecord(session, {
1209
1218
  type: "debate_turn",
1210
1219
  mateId: debate.moderatorId,
1211
1220
  mateName: moderatorProfile.name,
@@ -1236,7 +1245,7 @@ function attachDebate(ctx) {
1236
1245
  },
1237
1246
  onDelta: function (delta) {
1238
1247
  if (session._debate && session._debate.phase !== "ended") {
1239
- ctx.sendToSession(session.localId, { type: "debate_stream", mateId: debate.moderatorId, mateName: moderatorProfile.name, delta: delta });
1248
+ debateSendAndRecord(session, { type: "debate_stream", mateId: debate.moderatorId, mateName: moderatorProfile.name, delta: delta });
1240
1249
  }
1241
1250
  },
1242
1251
  onDone: function (fullText) {
@@ -1285,7 +1294,7 @@ function attachDebate(ctx) {
1285
1294
  var moderatorProfile = ctx.getMateProfile(debate.mateCtx, debate.moderatorId);
1286
1295
 
1287
1296
  debateMateProcessing(debate.moderatorId, true);
1288
- ctx.sendToSession(session.localId, {
1297
+ debateSendAndRecord(session, {
1289
1298
  type: "debate_turn",
1290
1299
  mateId: debate.moderatorId,
1291
1300
  mateName: moderatorProfile.name,
@@ -1475,7 +1484,7 @@ function attachDebate(ctx) {
1475
1484
 
1476
1485
  debate.turnInProgress = true;
1477
1486
  debateMateProcessing(debate.moderatorId, true);
1478
- ctx.sendToSession(session.localId, {
1487
+ debateSendAndRecord(session, {
1479
1488
  type: "debate_turn",
1480
1489
  mateId: debate.moderatorId,
1481
1490
  mateName: moderatorProfile.name,
@@ -1523,7 +1532,7 @@ function attachDebate(ctx) {
1523
1532
  },
1524
1533
  onDelta: function (delta) {
1525
1534
  if (session._debate && session._debate.phase !== "ended") {
1526
- ctx.sendToSession(session.localId, { type: "debate_stream", mateId: debate.moderatorId, mateName: moderatorProfile.name, delta: delta });
1535
+ debateSendAndRecord(session, { type: "debate_stream", mateId: debate.moderatorId, mateName: moderatorProfile.name, delta: delta });
1527
1536
  }
1528
1537
  },
1529
1538
  onDone: function (fullText) {
package/lib/public/app.js CHANGED
@@ -5518,11 +5518,7 @@ import { initDebate, handleDebatePreparing, handleDebateStarted, handleDebateRes
5518
5518
 
5519
5519
  case "debate_turn_done":
5520
5520
  if (msg.round) updateDebateRound(msg.round);
5521
- if (replayingHistory) {
5522
- renderDebateTurnDone(msg);
5523
- } else {
5524
- handleDebateTurnDone(msg);
5525
- }
5521
+ handleDebateTurnDone(msg);
5526
5522
  break;
5527
5523
 
5528
5524
  case "debate_hand_raised":
@@ -1225,16 +1225,33 @@ function renderDebateBriefCard(msg, resolved) {
1225
1225
  topicHtml += '<div class="debate-brief-context">' + escapeHtml(msg.context) + '</div>';
1226
1226
  }
1227
1227
 
1228
- topicHtml += '<div class="debate-brief-moderator">' +
1229
- iconHtml("mic") + ' <strong>Moderator:</strong> ' + escapeHtml(msg.moderatorName || "Unknown") +
1230
- '</div>';
1228
+ // Resolve mate avatars from matesList
1229
+ var mates = ctx.matesList ? ctx.matesList() : [];
1230
+ var mateMap = {};
1231
+ for (var mi = 0; mi < mates.length; mi++) {
1232
+ mateMap[mates[mi].id] = mates[mi];
1233
+ }
1234
+
1235
+ var modMate = msg.moderatorId ? mateMap[msg.moderatorId] : null;
1236
+ var modAvatarSrc = modMate ? mateAvatarUrl(modMate, 24) : "";
1237
+ topicHtml += '<div class="debate-brief-moderator" style="display:flex;align-items:center;gap:8px;">' +
1238
+ iconHtml("mic") + ' <strong>Moderator:</strong> ';
1239
+ if (modAvatarSrc) {
1240
+ topicHtml += '<img src="' + escapeHtml(modAvatarSrc) + '" width="24" height="24" style="border-radius:50%;flex-shrink:0;">';
1241
+ }
1242
+ topicHtml += escapeHtml(msg.moderatorName || "Unknown") + '</div>';
1231
1243
 
1232
1244
  topicHtml += '<div class="debate-brief-panelists-label">' + iconHtml("users") + ' <strong>Panelists:</strong></div>';
1233
1245
  topicHtml += '<div class="debate-brief-panelists">';
1234
1246
  if (msg.panelists) {
1235
1247
  for (var i = 0; i < msg.panelists.length; i++) {
1236
1248
  var p = msg.panelists[i];
1237
- topicHtml += '<div class="debate-brief-panelist">';
1249
+ var mate = p.mateId ? mateMap[p.mateId] : null;
1250
+ var avatarSrc = mate ? mateAvatarUrl(mate, 24) : "";
1251
+ topicHtml += '<div class="debate-brief-panelist" style="display:flex;align-items:center;gap:8px;">';
1252
+ if (avatarSrc) {
1253
+ topicHtml += '<img src="' + escapeHtml(avatarSrc) + '" width="24" height="24" style="border-radius:50%;flex-shrink:0;">';
1254
+ }
1238
1255
  topicHtml += '<span class="debate-brief-panelist-name">' + escapeHtml(p.name || "Unknown") + '</span>';
1239
1256
  if (p.role) {
1240
1257
  topicHtml += '<span class="debate-brief-panelist-role">' + escapeHtml(p.role) + '</span>';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "clay-server",
3
- "version": "2.27.0-beta.7",
3
+ "version": "2.27.0-beta.9",
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",