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/README.md +51 -91
- package/bin/cli.js +49 -14
- package/lib/cli-sessions.js +3 -3
- package/lib/config.js +30 -4
- package/lib/daemon.js +28 -5
- package/lib/mates.js +61 -7
- package/lib/notes.js +20 -0
- package/lib/os-users.js +71 -2
- package/lib/project.js +850 -184
- package/lib/public/app.js +160 -16
- package/lib/public/css/mates.css +316 -2
- package/lib/public/css/mention.css +23 -0
- package/lib/public/css/mobile-nav.css +198 -0
- package/lib/public/css/overlays.css +23 -0
- package/lib/public/css/rewind.css +32 -0
- package/lib/public/css/title-bar.css +3 -0
- package/lib/public/css/user-settings.css +2 -2
- package/lib/public/index.html +64 -14
- package/lib/public/modules/command-palette.js +44 -4
- package/lib/public/modules/filebrowser.js +2 -0
- package/lib/public/modules/input.js +11 -3
- package/lib/public/modules/mate-knowledge.js +2 -0
- package/lib/public/modules/mate-memory.js +353 -0
- package/lib/public/modules/mention.js +77 -2
- package/lib/public/modules/notifications.js +0 -8
- package/lib/public/modules/server-settings.js +11 -4
- package/lib/public/modules/sidebar.js +284 -6
- package/lib/public/modules/theme.js +10 -12
- package/lib/public/modules/tools.js +84 -12
- package/lib/public/modules/user-settings.js +45 -12
- package/lib/sdk-bridge.js +114 -35
- package/lib/server.js +84 -6
- package/lib/sessions.js +4 -4
- package/lib/users.js +26 -0
- package/package.json +1 -1
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
|
-
|
|
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="
|
|
2193
|
-
'<
|
|
2194
|
-
'<span class="
|
|
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
|
-
|
|
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
|
-
|
|
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()
|
|
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 ---
|
package/lib/public/css/mates.css
CHANGED
|
@@ -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
|