clay-server 2.19.0 → 2.20.0-beta.1

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/public/app.js CHANGED
@@ -5,6 +5,7 @@ import { renderMarkdown, highlightCodeBlocks, renderMermaidBlocks, closeMermaidM
5
5
  import { initSidebar, renderSessionList, handleSearchResults, updateSessionPresence, updatePageTitle, populateCliSessionList, renderIconStrip, renderSidebarPresence, initIconStrip, getEmojiCategories, renderUserStrip, setCurrentDmUser, updateDmBadge, updateSessionBadge, updateProjectBadge, closeDmUserPicker, spawnDustParticles, openMobileSheet, setMobileSheetMateData } from './modules/sidebar.js';
6
6
  import { initMateSidebar, showMateSidebar, hideMateSidebar, renderMateSessionList, updateMateSidebarProfile, handleMateSearchResults } from './modules/mate-sidebar.js';
7
7
  import { initMateKnowledge, requestKnowledgeList, renderKnowledgeList, handleKnowledgeContent, hideKnowledge } from './modules/mate-knowledge.js';
8
+ import { initMateMemory, renderMemoryList, hideMemory } from './modules/mate-memory.js';
8
9
  import { initRewind, setRewindMode, showRewindModal, clearPendingRewindUuid, addRewindButton } from './modules/rewind.js';
9
10
  import { initNotifications, showDoneNotification, playDoneSound, isNotifAlertEnabled, isNotifSoundEnabled } from './modules/notifications.js';
10
11
  import { initInput, clearPendingImages, handleInputSync, autoResize, builtinCommands, sendMessage, hasSendableContent } from './modules/input.js';
@@ -14,7 +15,7 @@ import { initTerminal, openTerminal, closeTerminal, resetTerminals, handleTermLi
14
15
  import { initStickyNotes, handleNotesList, handleNoteCreated, handleNoteUpdated, handleNoteDeleted, openArchive, closeArchive, isArchiveOpen, hideNotes, showNotes, isNotesVisible } from './modules/sticky-notes.js';
15
16
  import { initTheme, getThemeColor, getComputedVar, onThemeChange, getCurrentTheme } from './modules/theme.js';
16
17
  import { initTools, resetToolState, saveToolState, restoreToolState, renderAskUserQuestion, markAskUserAnswered, renderPermissionRequest, markPermissionResolved, markPermissionCancelled, renderElicitationRequest, markElicitationResolved, renderPlanBanner, renderPlanCard, handleTodoWrite, handleTaskCreate, handleTaskUpdate, startThinking, appendThinking, stopThinking, resetThinkingGroup, createToolItem, updateToolExecuting, updateToolResult, markAllToolsDone, addTurnMeta, enableMainInput, getTools, getPlanContent, setPlanContent, isPlanFilePath, getTodoTools, updateSubagentActivity, addSubagentToolEntry, markSubagentDone, updateSubagentProgress, initSubagentStop, closeToolGroup, removeToolFromGroup } from './modules/tools.js';
17
- import { initServerSettings, updateSettingsStats, updateSettingsModels, updateDaemonConfig, handleSetPinResult, handleKeepAwakeChanged, handleRestartResult, handleShutdownResult, handleSharedEnv, handleSharedEnvSaved, handleGlobalClaudeMdRead, handleGlobalClaudeMdWrite } from './modules/server-settings.js';
18
+ import { initServerSettings, updateSettingsStats, updateSettingsModels, updateDaemonConfig, handleSetPinResult, handleKeepAwakeChanged, handleAutoContinueChanged, handleRestartResult, handleShutdownResult, handleSharedEnv, handleSharedEnvSaved, handleGlobalClaudeMdRead, handleGlobalClaudeMdWrite } from './modules/server-settings.js';
18
19
  import { initProjectSettings, handleInstructionsRead, handleInstructionsWrite, handleProjectEnv, handleProjectEnvSaved, isProjectSettingsOpen, handleProjectSharedEnv, handleProjectSharedEnvSaved, handleProjectOwnerChanged } from './modules/project-settings.js';
19
20
  import { initSkills, handleSkillInstalled, handleSkillUninstalled } from './modules/skills.js';
20
21
  import { initScheduler, resetScheduler, handleLoopRegistryUpdated, handleScheduleRunStarted, handleScheduleRunFinished, handleLoopScheduled, openSchedulerToTab, isSchedulerOpen, closeScheduler, enterCraftingMode, exitCraftingMode, handleLoopRegistryFiles, getUpcomingSchedules } from './modules/scheduler.js';
@@ -762,14 +763,16 @@ import { initDebate, handleDebateStarted, handleDebateResumed, handleDebateTurn,
762
763
  if (resizeHandle) resizeHandle.classList.remove("dm-mode");
763
764
  hideMateSidebar();
764
765
  hideKnowledge();
766
+ hideMemory();
765
767
  if (isSchedulerOpen()) closeScheduler();
766
768
  disconnectMateWs();
767
769
  // Restore terminal button
768
770
  var termBtn = document.getElementById("terminal-toggle-btn");
769
771
  if (termBtn) termBtn.style.display = "";
770
- // Re-request session list from main project to refresh state
772
+ // Re-request session list and notes from main project to refresh state
771
773
  if (ws && ws.readyState === 1) {
772
774
  ws.send(JSON.stringify({ type: "switch_session", id: activeSessionId }));
775
+ ws.send(JSON.stringify({ type: "note_list_request" }));
773
776
  }
774
777
 
775
778
  // Reset DM header
@@ -923,6 +926,7 @@ import { initDebate, handleDebateStarted, handleDebateResumed, handleDebateTurn,
923
926
  // Intercept session_list for mate sidebar
924
927
  if (msg.type === "init" && msg.sessions) {
925
928
  renderMateSessionList(msg.sessions);
929
+ handlePaletteSessionSwitch();
926
930
  // Override title bar with mate name (not session/project title)
927
931
  if (dmTargetUser && dmTargetUser.isMate) {
928
932
  var mateDN = dmTargetUser.displayName || "New Mate";
@@ -952,6 +956,13 @@ import { initDebate, handleDebateStarted, handleDebateResumed, handleDebateTurn,
952
956
  if (msg.type === "knowledge_saved" || msg.type === "knowledge_deleted" || msg.type === "knowledge_promoted" || msg.type === "knowledge_depromoted") {
953
957
  return; // list update follows separately
954
958
  }
959
+ if (msg.type === "memory_list") {
960
+ renderMemoryList(msg.entries, msg.summary);
961
+ return;
962
+ }
963
+ if (msg.type === "memory_deleted") {
964
+ return; // list update follows separately
965
+ }
955
966
  // On done: scan DOM for [[MATE_READY: name]], update name, strip marker
956
967
  if (msg.type === "done" && dmTargetUser && dmTargetUser.isMate) {
957
968
  // Ensure last message is fully visible after rendering settles
@@ -1879,6 +1890,7 @@ import { initDebate, handleDebateStarted, handleDebateResumed, handleDebateTurn,
1879
1890
  initIconStrip(sidebarCtx);
1880
1891
  initMateSidebar(function () { return mateWs; });
1881
1892
  initMateKnowledge(function () { return mateWs; });
1893
+ initMateMemory(function () { return mateWs; }, { onShow: function () { hideKnowledge(); hideNotes(); } });
1882
1894
  initMateWizard(
1883
1895
  function (msg) { if (ws && ws.readyState === 1) ws.send(JSON.stringify(msg)); },
1884
1896
  function (mate) { handleMateCreatedInApp(mate); }
@@ -1886,7 +1898,7 @@ import { initDebate, handleDebateStarted, handleDebateResumed, handleDebateTurn,
1886
1898
 
1887
1899
  initCommandPalette({
1888
1900
  switchProject: function (slug) { switchProject(slug); },
1889
- currentSlug: function () { return currentSlug; },
1901
+ currentSlug: function () { return mateProjectSlug || currentSlug; },
1890
1902
  projectList: function () { return cachedProjects || []; },
1891
1903
  matesList: function () { return cachedMatesList || []; },
1892
1904
  allUsers: function () { return cachedAllUsers || []; },
@@ -2178,10 +2190,7 @@ import { initDebate, handleDebateStarted, handleDebateResumed, handleDebateTurn,
2178
2190
  removeMatePreThinking();
2179
2191
  var mateName = dmTargetUser ? (dmTargetUser.displayName || "Mate") : "Mate";
2180
2192
  var mateAvatar = document.body.dataset.mateAvatarUrl || "";
2181
- matePreThinkingTimer = setTimeout(function () {
2182
- matePreThinkingTimer = null;
2183
- doShowMatePreThinking(mateName, mateAvatar);
2184
- }, 1000);
2193
+ doShowMatePreThinking(mateName, mateAvatar);
2185
2194
  }
2186
2195
  function doShowMatePreThinking(mateName, mateAvatar) {
2187
2196
  matePreThinkingEl = document.createElement("div");
@@ -2189,9 +2198,10 @@ import { initDebate, handleDebateStarted, handleDebateResumed, handleDebateTurn,
2189
2198
  matePreThinkingEl.innerHTML =
2190
2199
  '<img class="dm-bubble-avatar dm-bubble-avatar-mate" src="' + escapeHtml(mateAvatar) + '" alt="" style="display:block">' +
2191
2200
  '<div class="dm-bubble-content">' +
2192
- '<div class="mate-thinking-row" style="display:flex">' +
2193
- '<span class="dm-bubble-name">' + escapeHtml(mateName) + '</span>' +
2194
- '<span class="mate-thinking-dots"><span></span><span></span><span></span></span>' +
2201
+ '<div class="dm-bubble-header"><span class="dm-bubble-name">' + escapeHtml(mateName) + '</span></div>' +
2202
+ '<div class="activity-inline mate-pre-activity">' +
2203
+ '<span class="activity-icon">' + iconHtml("sparkles") + '</span>' +
2204
+ '<span class="activity-text">' + randomThinkingVerb() + '...</span>' +
2195
2205
  '</div>' +
2196
2206
  '</div>';
2197
2207
  if (activityEl && activityEl.parentNode) {
@@ -2199,6 +2209,7 @@ import { initDebate, handleDebateStarted, handleDebateResumed, handleDebateTurn,
2199
2209
  } else {
2200
2210
  addToMessages(matePreThinkingEl);
2201
2211
  }
2212
+ refreshIcons();
2202
2213
  scrollToBottom();
2203
2214
  }
2204
2215
  function removeMatePreThinking() {
@@ -3479,6 +3490,98 @@ import { initDebate, handleDebateStarted, handleDebateResumed, handleDebateTurn,
3479
3490
  }
3480
3491
  }
3481
3492
 
3493
+ // --- Rate Limit Usage (top bar link to check usage + reset time) ---
3494
+
3495
+ var rateLimitUsageEl = null;
3496
+ var rateLimitResetState = {};
3497
+ var rateLimitTickTimer = null;
3498
+
3499
+ function formatResetTime(resetsAt) {
3500
+ if (!resetsAt) return "";
3501
+ var d = new Date(resetsAt);
3502
+ var now = new Date();
3503
+ var diff = resetsAt - now.getTime();
3504
+ if (diff <= 0) return "";
3505
+ var hrs = Math.floor(diff / 3600000);
3506
+ var mins = Math.floor((diff % 3600000) / 60000);
3507
+ if (hrs > 0) return hrs + "h " + mins + "m";
3508
+ return mins + "m";
3509
+ }
3510
+
3511
+ function rateLimitTypeShortLabel(type) {
3512
+ if (type === "five_hour") return "5h";
3513
+ if (type === "seven_day") return "7d";
3514
+ if (type === "seven_day_opus") return "7d opus";
3515
+ if (type === "seven_day_sonnet") return "7d sonnet";
3516
+ return type || "";
3517
+ }
3518
+
3519
+ function updateRateLimitUsage(msg) {
3520
+ if (msg.rateLimitType && msg.resetsAt) {
3521
+ rateLimitResetState[msg.rateLimitType] = { resetsAt: msg.resetsAt, status: msg.status };
3522
+ }
3523
+
3524
+ var topBarActions = document.querySelector("#top-bar .top-bar-actions");
3525
+ if (!topBarActions) return;
3526
+
3527
+ if (!rateLimitUsageEl) {
3528
+ rateLimitUsageEl = document.createElement("a");
3529
+ rateLimitUsageEl.id = "rate-limit-usage-link";
3530
+ rateLimitUsageEl.className = "top-bar-pill pill-dim usage-check-link";
3531
+ rateLimitUsageEl.href = "https://claude.ai/settings/usage";
3532
+ rateLimitUsageEl.target = "_blank";
3533
+ rateLimitUsageEl.rel = "noopener";
3534
+ rateLimitUsageEl.title = "Check usage on claude.ai";
3535
+ var ref = document.getElementById("skip-perms-pill");
3536
+ topBarActions.insertBefore(rateLimitUsageEl, ref);
3537
+ }
3538
+
3539
+ // Build label from available reset times
3540
+ var parts = [];
3541
+ var types = ["five_hour", "seven_day", "seven_day_opus", "seven_day_sonnet"];
3542
+ for (var i = 0; i < types.length; i++) {
3543
+ var entry = rateLimitResetState[types[i]];
3544
+ if (!entry || !entry.resetsAt) continue;
3545
+ var timeStr = formatResetTime(entry.resetsAt);
3546
+ if (!timeStr) continue;
3547
+ parts.push(rateLimitTypeShortLabel(types[i]) + " resets " + timeStr);
3548
+ }
3549
+
3550
+ var label = parts.length > 0 ? parts.join(" · ") : "Check usage";
3551
+ rateLimitUsageEl.innerHTML = iconHtml("activity") + '<span>' + label + '</span>' + iconHtml("external-link");
3552
+ refreshIcons();
3553
+
3554
+ // Start or stop live countdown tick
3555
+ if (parts.length > 0 && !rateLimitTickTimer) {
3556
+ rateLimitTickTimer = setInterval(tickRateLimitUsage, 30000);
3557
+ } else if (parts.length === 0 && rateLimitTickTimer) {
3558
+ clearInterval(rateLimitTickTimer);
3559
+ rateLimitTickTimer = null;
3560
+ }
3561
+ }
3562
+
3563
+ function tickRateLimitUsage() {
3564
+ if (!rateLimitUsageEl) return;
3565
+ var parts = [];
3566
+ var types = ["five_hour", "seven_day", "seven_day_opus", "seven_day_sonnet"];
3567
+ for (var i = 0; i < types.length; i++) {
3568
+ var entry = rateLimitResetState[types[i]];
3569
+ if (!entry || !entry.resetsAt) continue;
3570
+ var timeStr = formatResetTime(entry.resetsAt);
3571
+ if (!timeStr) { delete rateLimitResetState[types[i]]; continue; }
3572
+ parts.push(rateLimitTypeShortLabel(types[i]) + " resets " + timeStr);
3573
+ }
3574
+ if (parts.length === 0) {
3575
+ rateLimitUsageEl.innerHTML = iconHtml("activity") + '<span>Check usage</span>' + iconHtml("external-link");
3576
+ refreshIcons();
3577
+ if (rateLimitTickTimer) { clearInterval(rateLimitTickTimer); rateLimitTickTimer = null; }
3578
+ return;
3579
+ }
3580
+ var label = parts.join(" · ");
3581
+ rateLimitUsageEl.innerHTML = iconHtml("activity") + '<span>' + label + '</span>' + iconHtml("external-link");
3582
+ refreshIcons();
3583
+ }
3584
+
3482
3585
  function handleRateLimitEvent(msg) {
3483
3586
  var isRejected = msg.status === "rejected";
3484
3587
  var typeLabel = rateLimitTypeLabel(msg.rateLimitType);
@@ -3745,6 +3848,7 @@ import { initDebate, handleDebateStarted, handleDebateResumed, handleDebateTurn,
3745
3848
  }
3746
3849
  resetFileBrowser();
3747
3850
  closeArchive();
3851
+ hideMemory();
3748
3852
  if (isSchedulerOpen()) closeScheduler();
3749
3853
  resetScheduler(slug);
3750
3854
  currentSlug = slug;
@@ -4016,6 +4120,8 @@ import { initDebate, handleDebateStarted, handleDebateResumed, handleDebateTurn,
4016
4120
  updatePageTitle();
4017
4121
  if (msg.version) {
4018
4122
  setPaletteVersion(msg.version);
4123
+ var serverVersionEl = document.getElementById("settings-server-version");
4124
+ if (serverVersionEl) serverVersionEl.textContent = msg.version;
4019
4125
  }
4020
4126
  if (msg.projectOwnerId !== undefined) currentProjectOwnerId = msg.projectOwnerId;
4021
4127
  if (msg.osUsers !== undefined) isOsUsers = !!msg.osUsers;
@@ -4062,6 +4168,29 @@ import { initDebate, handleDebateStarted, handleDebateResumed, handleDebateTurn,
4062
4168
  }
4063
4169
  break;
4064
4170
 
4171
+ case "up_to_date":
4172
+ var utdBtn = $("settings-update-check");
4173
+ if (utdBtn) {
4174
+ utdBtn.innerHTML = "";
4175
+ var utdIcon = document.createElement("i");
4176
+ utdIcon.setAttribute("data-lucide", "check");
4177
+ utdBtn.appendChild(utdIcon);
4178
+ utdBtn.appendChild(document.createTextNode(" Up to date (v" + msg.version + ")"));
4179
+ utdBtn.disabled = true;
4180
+ refreshIcons();
4181
+ setTimeout(function () {
4182
+ utdBtn.innerHTML = "";
4183
+ var rwIcon = document.createElement("i");
4184
+ rwIcon.setAttribute("data-lucide", "refresh-cw");
4185
+ utdBtn.appendChild(rwIcon);
4186
+ utdBtn.appendChild(document.createTextNode(" Check for updates"));
4187
+ utdBtn.disabled = false;
4188
+ utdBtn.classList.remove("settings-btn-update-available");
4189
+ refreshIcons();
4190
+ }, 3000);
4191
+ }
4192
+ break;
4193
+
4065
4194
  case "update_started":
4066
4195
  var updNowBtn = $("update-now");
4067
4196
  if (updNowBtn) {
@@ -4285,14 +4414,16 @@ import { initDebate, handleDebateStarted, handleDebateResumed, handleDebateTurn,
4285
4414
  case "status":
4286
4415
  if (msg.status === "processing") {
4287
4416
  setStatus("processing");
4288
- setActivity(randomThinkingVerb() + "...");
4417
+ if (!(dmMode && dmTargetUser && dmTargetUser.isMate)) {
4418
+ setActivity(randomThinkingVerb() + "...");
4419
+ }
4289
4420
  }
4290
4421
  break;
4291
4422
 
4292
4423
  case "compacting":
4293
4424
  if (msg.active) {
4294
4425
  setActivity("Compacting conversation...");
4295
- } else {
4426
+ } else if (!(dmMode && dmTargetUser && dmTargetUser.isMate)) {
4296
4427
  setActivity(randomThinkingVerb() + "...");
4297
4428
  }
4298
4429
  break;
@@ -4308,7 +4439,9 @@ import { initDebate, handleDebateStarted, handleDebateResumed, handleDebateTurn,
4308
4439
 
4309
4440
  case "thinking_stop":
4310
4441
  stopThinking(msg.duration);
4311
- setActivity(randomThinkingVerb() + "...");
4442
+ if (!(dmMode && dmTargetUser && dmTargetUser.isMate)) {
4443
+ setActivity(randomThinkingVerb() + "...");
4444
+ }
4312
4445
  break;
4313
4446
 
4314
4447
  case "delta":
@@ -4393,7 +4526,7 @@ import { initDebate, handleDebateStarted, handleDebateResumed, handleDebateTurn,
4393
4526
  break;
4394
4527
 
4395
4528
  case "ask_user_answered":
4396
- markAskUserAnswered(msg.toolId);
4529
+ markAskUserAnswered(msg.toolId, msg.answers);
4397
4530
  stopUrgentBlink();
4398
4531
  break;
4399
4532
 
@@ -4488,8 +4621,8 @@ import { initDebate, handleDebateStarted, handleDebateResumed, handleDebateTurn,
4488
4621
  if (isNotifAlertEnabled() && !window._pushSubscription) showDoneNotification();
4489
4622
  if (isNotifSoundEnabled()) playDoneSound();
4490
4623
  }
4491
- // Enter schedule mode if rate limited
4492
- if (rateLimitResetsAt && rateLimitResetsAt > Date.now() && msg.code === 1) {
4624
+ // Enter schedule mode if rate limited (regardless of exit code)
4625
+ if (rateLimitResetsAt && rateLimitResetsAt > Date.now()) {
4493
4626
  enterScheduleMode();
4494
4627
  }
4495
4628
  break;
@@ -4522,6 +4655,10 @@ import { initDebate, handleDebateStarted, handleDebateResumed, handleDebateTurn,
4522
4655
  handleRateLimitEvent(msg);
4523
4656
  break;
4524
4657
 
4658
+ case "rate_limit_usage":
4659
+ updateRateLimitUsage(msg);
4660
+ break;
4661
+
4525
4662
  case "scheduled_message_queued":
4526
4663
  addScheduledMessageBubble(msg.text, msg.resetsAt);
4527
4664
  exitScheduleMode();
@@ -4987,6 +5124,11 @@ import { initDebate, handleDebateStarted, handleDebateResumed, handleDebateTurn,
4987
5124
  handleKeepAwakeChanged(msg);
4988
5125
  break;
4989
5126
 
5127
+ case "set_auto_continue_result":
5128
+ case "auto_continue_changed":
5129
+ handleAutoContinueChanged(msg);
5130
+ break;
5131
+
4990
5132
  case "restart_server_result":
4991
5133
  handleRestartResult(msg);
4992
5134
  break;
@@ -5309,6 +5451,8 @@ import { initDebate, handleDebateStarted, handleDebateResumed, handleDebateTurn,
5309
5451
  addUserMessage: addUserMessage,
5310
5452
  addCopyHandler: addCopyHandler,
5311
5453
  addToMessages: addToMessages,
5454
+ showImageModal: showImageModal,
5455
+ showPasteModal: showPasteModal,
5312
5456
  });
5313
5457
 
5314
5458
  // --- Debate module ---
@@ -22,7 +22,7 @@
22
22
  }
23
23
 
24
24
  .title-bar-content.mate-dm-active .status,
25
- .title-bar-content.mate-dm-active .status * {
25
+ .title-bar-content.mate-dm-active .status *:not(.rate-limit-popover) {
26
26
  color: rgba(255, 255, 255, 0.85) !important;
27
27
  }
28
28
 
@@ -966,6 +966,7 @@ body.mate-dm-active #layout.sidebar-collapsed .mate-collapsed-info {
966
966
 
967
967
  /* Sidebar file list */
968
968
  #mate-sidebar-knowledge.hidden,
969
+ #mate-sidebar-memory.hidden,
969
970
  #mate-sidebar-conversations.hidden {
970
971
  display: none;
971
972
  }
@@ -1139,6 +1140,312 @@ body.mate-dm-active #layout.sidebar-collapsed .mate-collapsed-info {
1139
1140
  color: var(--text-dimmer);
1140
1141
  }
1141
1142
 
1143
+ /* --- Memory panel --- */
1144
+ /* Memory viewer */
1145
+ @media (min-width: 1024px) {
1146
+ #mate-memory-viewer {
1147
+ width: 50%;
1148
+ max-width: 720px;
1149
+ min-width: 360px;
1150
+ border-left: 1px solid var(--border-subtle);
1151
+ display: flex;
1152
+ flex-direction: column;
1153
+ overflow: hidden;
1154
+ flex-shrink: 0;
1155
+ }
1156
+ #mate-memory-viewer.hidden { display: none; }
1157
+ }
1158
+ @media (max-width: 1023px) {
1159
+ #mate-memory-viewer {
1160
+ position: fixed;
1161
+ inset: 0;
1162
+ background: var(--bg);
1163
+ z-index: 1100;
1164
+ display: flex;
1165
+ flex-direction: column;
1166
+ overflow: hidden;
1167
+ }
1168
+ #mate-memory-viewer.hidden { display: none; }
1169
+ }
1170
+ .mate-memory-viewer-header {
1171
+ display: flex;
1172
+ align-items: center;
1173
+ gap: 8px;
1174
+ padding: 0 12px;
1175
+ border-bottom: none;
1176
+ flex-shrink: 0;
1177
+ min-height: 44px;
1178
+ }
1179
+ .mate-memory-danger-btn:hover {
1180
+ color: var(--error, #ff5555) !important;
1181
+ }
1182
+
1183
+ /* Tabs */
1184
+ .mate-memory-viewer-tabs {
1185
+ display: flex;
1186
+ gap: 0;
1187
+ padding: 0 12px;
1188
+ border-bottom: 1px solid var(--border-subtle);
1189
+ flex-shrink: 0;
1190
+ }
1191
+ .mate-memory-tab {
1192
+ padding: 8px 16px;
1193
+ font-size: 13px;
1194
+ font-weight: 500;
1195
+ color: var(--text-dimmer);
1196
+ background: none;
1197
+ border: none;
1198
+ border-bottom: 2px solid transparent;
1199
+ cursor: pointer;
1200
+ transition: color 0.15s, border-color 0.15s;
1201
+ }
1202
+ .mate-memory-tab:hover {
1203
+ color: var(--text-secondary);
1204
+ }
1205
+ .mate-memory-tab.active {
1206
+ color: var(--text);
1207
+ border-bottom-color: var(--accent, #6c5ce7);
1208
+ font-weight: 600;
1209
+ }
1210
+
1211
+ /* Tab bodies */
1212
+ .mate-memory-tab-body {
1213
+ flex: 1;
1214
+ overflow-y: auto;
1215
+ padding: 16px;
1216
+ }
1217
+ .mate-memory-tab-body.hidden {
1218
+ display: none;
1219
+ }
1220
+
1221
+ /* Summary tab */
1222
+ #mate-memory-summary-content h1 {
1223
+ font-size: 18px;
1224
+ font-weight: 700;
1225
+ margin: 0 0 12px;
1226
+ color: var(--text);
1227
+ }
1228
+ #mate-memory-summary-content h2 {
1229
+ font-size: 14px;
1230
+ font-weight: 600;
1231
+ margin: 16px 0 8px;
1232
+ color: var(--text);
1233
+ }
1234
+ #mate-memory-summary-content ul {
1235
+ margin: 0 0 8px;
1236
+ padding-left: 20px;
1237
+ }
1238
+ #mate-memory-summary-content li {
1239
+ font-size: 13px;
1240
+ color: var(--text-secondary);
1241
+ line-height: 1.6;
1242
+ margin-bottom: 2px;
1243
+ }
1244
+
1245
+ /* Digest list */
1246
+ .mate-memory-digest-list {
1247
+ display: flex;
1248
+ flex-direction: column;
1249
+ gap: 2px;
1250
+ }
1251
+ .mate-memory-digest-list.hidden {
1252
+ display: none;
1253
+ }
1254
+ .mate-memory-item {
1255
+ display: flex;
1256
+ flex-direction: column;
1257
+ gap: 2px;
1258
+ padding: 10px 12px;
1259
+ border-radius: 8px;
1260
+ cursor: pointer;
1261
+ transition: background 0.12s;
1262
+ }
1263
+ .mate-memory-item:hover {
1264
+ background: rgba(var(--overlay-rgb), 0.05);
1265
+ }
1266
+ .mate-memory-item-top {
1267
+ display: flex;
1268
+ align-items: center;
1269
+ gap: 6px;
1270
+ }
1271
+ .mate-memory-date {
1272
+ font-size: 11px;
1273
+ color: var(--text-dimmer);
1274
+ }
1275
+ .mate-memory-type-badge {
1276
+ font-size: 9px;
1277
+ text-transform: uppercase;
1278
+ letter-spacing: 0.5px;
1279
+ padding: 1px 5px;
1280
+ border-radius: 3px;
1281
+ background: rgba(var(--overlay-rgb), 0.08);
1282
+ color: var(--text-dimmer);
1283
+ }
1284
+ .mate-memory-tag {
1285
+ font-size: 9px;
1286
+ padding: 1px 5px;
1287
+ border-radius: 3px;
1288
+ background: rgba(var(--accent-rgb, 108, 92, 231), 0.1);
1289
+ color: var(--accent, #6c5ce7);
1290
+ }
1291
+ .mate-memory-delete-btn {
1292
+ margin-left: auto;
1293
+ background: none;
1294
+ border: none;
1295
+ color: var(--text-dimmer);
1296
+ cursor: pointer;
1297
+ padding: 2px;
1298
+ display: none;
1299
+ align-items: center;
1300
+ }
1301
+ .mate-memory-delete-btn svg { width: 13px; height: 13px; }
1302
+ .mate-memory-item:hover .mate-memory-delete-btn { display: flex; }
1303
+ .mate-memory-delete-btn:hover { color: var(--error, #ff5555); }
1304
+ .mate-memory-topic {
1305
+ font-size: 13px;
1306
+ font-weight: 600;
1307
+ color: var(--text);
1308
+ white-space: nowrap;
1309
+ overflow: hidden;
1310
+ text-overflow: ellipsis;
1311
+ }
1312
+ .mate-memory-position {
1313
+ font-size: 12px;
1314
+ color: var(--text-secondary);
1315
+ white-space: nowrap;
1316
+ overflow: hidden;
1317
+ text-overflow: ellipsis;
1318
+ }
1319
+ .mate-memory-empty {
1320
+ padding: 24px 12px;
1321
+ text-align: center;
1322
+ font-size: 13px;
1323
+ color: var(--text-dimmer);
1324
+ line-height: 1.6;
1325
+ }
1326
+
1327
+ /* Digest detail view */
1328
+ .mate-memory-digest-detail {
1329
+ display: flex;
1330
+ flex-direction: column;
1331
+ }
1332
+ .mate-memory-digest-detail.hidden {
1333
+ display: none;
1334
+ }
1335
+ .mate-memory-detail-header {
1336
+ display: flex;
1337
+ align-items: center;
1338
+ gap: 8px;
1339
+ padding-bottom: 12px;
1340
+ margin-bottom: 12px;
1341
+ border-bottom: 1px solid var(--border-subtle);
1342
+ }
1343
+ .mate-memory-detail-back {
1344
+ display: flex;
1345
+ align-items: center;
1346
+ gap: 4px;
1347
+ background: none;
1348
+ border: none;
1349
+ color: var(--text-secondary);
1350
+ cursor: pointer;
1351
+ font-size: 13px;
1352
+ padding: 4px 8px;
1353
+ border-radius: 6px;
1354
+ transition: background 0.12s;
1355
+ }
1356
+ .mate-memory-detail-back:hover {
1357
+ background: rgba(var(--overlay-rgb), 0.06);
1358
+ color: var(--text);
1359
+ }
1360
+ .mate-memory-detail-back svg { width: 14px; height: 14px; }
1361
+ .mate-memory-detail-delete {
1362
+ background: none;
1363
+ border: none;
1364
+ color: var(--text-dimmer);
1365
+ cursor: pointer;
1366
+ padding: 4px;
1367
+ display: flex;
1368
+ align-items: center;
1369
+ }
1370
+ .mate-memory-detail-delete svg { width: 15px; height: 15px; }
1371
+ .mate-memory-detail-body {
1372
+ padding: 0 4px;
1373
+ }
1374
+
1375
+ /* Memory detail fields */
1376
+ .mate-memory-detail {
1377
+ margin-bottom: 16px;
1378
+ }
1379
+ .mate-memory-detail-label {
1380
+ font-size: 10px;
1381
+ text-transform: uppercase;
1382
+ letter-spacing: 0.8px;
1383
+ color: var(--text-dimmer);
1384
+ margin-bottom: 4px;
1385
+ font-weight: 600;
1386
+ }
1387
+ .mate-memory-detail-value {
1388
+ font-size: 14px;
1389
+ color: var(--text);
1390
+ line-height: 1.5;
1391
+ white-space: pre-wrap;
1392
+ }
1393
+
1394
+ /* Memory delete confirmation */
1395
+ .mate-memory-confirm-overlay {
1396
+ position: fixed;
1397
+ inset: 0;
1398
+ background: rgba(0,0,0,0.5);
1399
+ z-index: 9999;
1400
+ display: flex;
1401
+ align-items: center;
1402
+ justify-content: center;
1403
+ }
1404
+ .mate-memory-confirm-dialog {
1405
+ background: var(--bg);
1406
+ border: 1px solid var(--border-subtle);
1407
+ border-radius: 10px;
1408
+ padding: 20px 24px;
1409
+ min-width: 260px;
1410
+ box-shadow: 0 8px 32px rgba(0,0,0,0.3);
1411
+ }
1412
+ .mate-memory-confirm-msg {
1413
+ font-size: 14px;
1414
+ color: var(--text);
1415
+ margin-bottom: 16px;
1416
+ text-align: center;
1417
+ }
1418
+ .mate-memory-confirm-actions {
1419
+ display: flex;
1420
+ gap: 8px;
1421
+ justify-content: flex-end;
1422
+ }
1423
+ .mate-memory-confirm-cancel {
1424
+ padding: 6px 16px;
1425
+ border-radius: 6px;
1426
+ border: 1px solid var(--border-subtle);
1427
+ background: none;
1428
+ color: var(--text);
1429
+ cursor: pointer;
1430
+ font-size: 13px;
1431
+ }
1432
+ .mate-memory-confirm-cancel:hover {
1433
+ background: rgba(var(--overlay-rgb), 0.06);
1434
+ }
1435
+ .mate-memory-confirm-delete {
1436
+ padding: 6px 16px;
1437
+ border-radius: 6px;
1438
+ border: none;
1439
+ background: var(--error, #ff5555);
1440
+ color: #fff;
1441
+ cursor: pointer;
1442
+ font-size: 13px;
1443
+ font-weight: 600;
1444
+ }
1445
+ .mate-memory-confirm-delete:hover {
1446
+ opacity: 0.85;
1447
+ }
1448
+
1142
1449
  /* Active file name in editor toolbar */
1143
1450
  .mate-knowledge-active-name {
1144
1451
  font-size: 14px;
@@ -1633,6 +1940,7 @@ body.mate-dm-active #layout.sidebar-collapsed .mate-collapsed-info {
1633
1940
  /* Match panel header heights to sidebar header (48px) */
1634
1941
  body.mate-dm-active .mate-knowledge-header-bar,
1635
1942
  body.mate-dm-active .mate-knowledge-viewer-header,
1943
+ body.mate-dm-active .mate-memory-viewer-header,
1636
1944
  body.mate-dm-active .scheduler-top-bar,
1637
1945
  body.mate-dm-active .notes-archive-header {
1638
1946
  height: 48px;
@@ -2130,11 +2438,17 @@ body.mate-dm-active .context-overflow-msg,
2130
2438
  body.mate-dm-active .sys-msg {
2131
2439
  display: none;
2132
2440
  }
2133
- body.mate-dm-active .activity-inline:not(.mention-activity-bar) {
2441
+ body.mate-dm-active .activity-inline:not(.mention-activity-bar):not(.mate-pre-activity):not(.mate-thinking-activity) {
2134
2442
  padding-left: 60px;
2135
2443
  margin-left: 0;
2136
2444
  margin-right: 0;
2137
2445
  }
2446
+ .mate-thinking > .dm-bubble-content > .mate-thinking-activity,
2447
+ .mate-thinking > .dm-bubble-content > .mate-pre-activity {
2448
+ margin: 4px 0 0;
2449
+ padding: 0;
2450
+ max-width: none;
2451
+ }
2138
2452
 
2139
2453
  /* ==========================================================================
2140
2454
  Mobile Mate DM Title Bar