clay-server 2.9.0 → 2.9.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/bin/cli.js +47 -30
- package/lib/pages.js +18 -17
- package/lib/project.js +77 -63
- package/lib/public/app.js +250 -72
- package/lib/public/css/base.css +3 -0
- package/lib/public/css/filebrowser.css +8 -1
- package/lib/public/css/home-hub.css +1 -1
- package/lib/public/css/input.css +4 -0
- package/lib/public/css/menus.css +1 -44
- package/lib/public/css/messages.css +1 -0
- package/lib/public/css/mobile-nav.css +2 -2
- package/lib/public/css/overlays.css +175 -16
- package/lib/public/css/scheduler.css +1 -0
- package/lib/public/css/server-settings.css +37 -34
- package/lib/public/css/title-bar.css +0 -7
- package/lib/public/index.html +63 -22
- package/lib/public/manifest.json +2 -2
- package/lib/public/modules/notifications.js +15 -103
- package/lib/public/modules/scheduler.js +55 -48
- package/lib/public/modules/server-settings.js +13 -4
- package/lib/sdk-bridge.js +4 -6
- package/package.json +1 -1
|
@@ -86,7 +86,9 @@ export function initScheduler(_ctx) {
|
|
|
86
86
|
if (panelOpen) {
|
|
87
87
|
closeScheduler();
|
|
88
88
|
} else {
|
|
89
|
-
|
|
89
|
+
ctx.requireClayRalph(function () {
|
|
90
|
+
openScheduler();
|
|
91
|
+
});
|
|
90
92
|
}
|
|
91
93
|
});
|
|
92
94
|
}
|
|
@@ -292,16 +294,18 @@ function ensurePanel() {
|
|
|
292
294
|
if (addSubmitting) return;
|
|
293
295
|
var task = addInput.value.trim();
|
|
294
296
|
if (!task) { addInput.focus(); return; }
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
297
|
+
ctx.requireClayRalph(function () {
|
|
298
|
+
addSubmitting = true;
|
|
299
|
+
addInput.value = "";
|
|
300
|
+
addForm.classList.add("hidden");
|
|
301
|
+
addTrigger.classList.remove("hidden");
|
|
302
|
+
// Send wizard complete directly (skip modal)
|
|
303
|
+
send({
|
|
304
|
+
type: "ralph_wizard_complete",
|
|
305
|
+
data: { name: task, task: task, maxIterations: 3, cron: null, source: "task" }
|
|
306
|
+
});
|
|
307
|
+
setTimeout(function () { addSubmitting = false; }, 1000);
|
|
303
308
|
});
|
|
304
|
-
setTimeout(function () { addSubmitting = false; }, 1000);
|
|
305
309
|
}
|
|
306
310
|
|
|
307
311
|
// Calendar controls
|
|
@@ -2703,48 +2707,51 @@ function submitCreateSchedule() {
|
|
|
2703
2707
|
if (taskBtn) taskBtn.classList.add("invalid");
|
|
2704
2708
|
return;
|
|
2705
2709
|
}
|
|
2706
|
-
|
|
2707
|
-
|
|
2708
|
-
|
|
2709
|
-
|
|
2710
|
-
|
|
2711
|
-
|
|
2712
|
-
|
|
2713
|
-
|
|
2714
|
-
|
|
2715
|
-
|
|
2716
|
-
|
|
2717
|
-
|
|
2718
|
-
|
|
2719
|
-
|
|
2720
|
-
|
|
2721
|
-
|
|
2710
|
+
|
|
2711
|
+
ctx.requireClayRalph(function () {
|
|
2712
|
+
var description = document.getElementById("sched-create-desc").value.trim();
|
|
2713
|
+
var datePicker = document.getElementById("sched-create-date-picker");
|
|
2714
|
+
var dateVal = datePicker ? datePicker.value : document.getElementById("sched-create-date").value;
|
|
2715
|
+
var timeVal = document.getElementById("sched-create-time").value || "09:00";
|
|
2716
|
+
var cron = buildCreateCron();
|
|
2717
|
+
|
|
2718
|
+
// Build recurrence end info
|
|
2719
|
+
var recurrenceEnd = null;
|
|
2720
|
+
if (cron && createRecurrence === "custom" && createCustomConfirmed) {
|
|
2721
|
+
if (createEndType === "until" && createEndDate) {
|
|
2722
|
+
var ey = createEndDate.getFullYear();
|
|
2723
|
+
var em = String(createEndDate.getMonth() + 1).padStart(2, "0");
|
|
2724
|
+
var ed = String(createEndDate.getDate()).padStart(2, "0");
|
|
2725
|
+
recurrenceEnd = { type: "until", date: ey + "-" + em + "-" + ed };
|
|
2726
|
+
} else if (createEndType === "after" && createEndAfter > 0) {
|
|
2727
|
+
recurrenceEnd = { type: "after", count: createEndAfter };
|
|
2728
|
+
}
|
|
2722
2729
|
}
|
|
2723
|
-
}
|
|
2724
2730
|
|
|
2725
|
-
|
|
2726
|
-
|
|
2727
|
-
|
|
2728
|
-
|
|
2731
|
+
var iterInput = document.getElementById("sched-create-iterations");
|
|
2732
|
+
var maxIterations = iterInput ? (parseInt(iterInput.value, 10) || 3) : 3;
|
|
2733
|
+
if (maxIterations < 1) maxIterations = 1;
|
|
2734
|
+
if (maxIterations > 100) maxIterations = 100;
|
|
2729
2735
|
|
|
2730
|
-
|
|
2731
|
-
|
|
2732
|
-
|
|
2733
|
-
|
|
2734
|
-
|
|
2735
|
-
|
|
2736
|
-
|
|
2737
|
-
|
|
2738
|
-
|
|
2739
|
-
|
|
2740
|
-
|
|
2741
|
-
|
|
2742
|
-
|
|
2743
|
-
|
|
2744
|
-
|
|
2745
|
-
|
|
2736
|
+
send({
|
|
2737
|
+
type: "schedule_create",
|
|
2738
|
+
data: {
|
|
2739
|
+
name: name,
|
|
2740
|
+
taskId: taskId,
|
|
2741
|
+
description: description,
|
|
2742
|
+
date: dateVal,
|
|
2743
|
+
time: timeVal,
|
|
2744
|
+
allDay: false,
|
|
2745
|
+
cron: cron,
|
|
2746
|
+
enabled: cron ? true : false,
|
|
2747
|
+
color: createColor,
|
|
2748
|
+
recurrenceEnd: recurrenceEnd,
|
|
2749
|
+
maxIterations: maxIterations,
|
|
2750
|
+
},
|
|
2751
|
+
});
|
|
2746
2752
|
|
|
2747
|
-
|
|
2753
|
+
closeCreateModal();
|
|
2754
|
+
});
|
|
2748
2755
|
}
|
|
2749
2756
|
|
|
2750
2757
|
// --- Cron parser (client-side) ---
|
|
@@ -68,6 +68,14 @@ export function initServerSettings(appCtx) {
|
|
|
68
68
|
});
|
|
69
69
|
}
|
|
70
70
|
|
|
71
|
+
// Mobile dropdown nav
|
|
72
|
+
var navDropdown = document.getElementById("settings-nav-dropdown");
|
|
73
|
+
if (navDropdown) {
|
|
74
|
+
navDropdown.addEventListener("change", function () {
|
|
75
|
+
switchSection(this.value);
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
|
|
71
79
|
// Copyable command blocks
|
|
72
80
|
var copyables = settingsEl.querySelectorAll(".settings-copyable");
|
|
73
81
|
for (var c = 0; c < copyables.length; c++) {
|
|
@@ -228,10 +236,11 @@ function switchSection(sectionName) {
|
|
|
228
236
|
for (var i = 0; i < navItems.length; i++) {
|
|
229
237
|
var isActive = navItems[i].dataset.section === sectionName;
|
|
230
238
|
navItems[i].classList.toggle("active", isActive);
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
239
|
+
}
|
|
240
|
+
// Sync mobile dropdown
|
|
241
|
+
var navDropdown = document.getElementById("settings-nav-dropdown");
|
|
242
|
+
if (navDropdown && navDropdown.value !== sectionName) {
|
|
243
|
+
navDropdown.value = sectionName;
|
|
235
244
|
}
|
|
236
245
|
for (var j = 0; j < sections.length; j++) {
|
|
237
246
|
var isActive2 = sections[j].dataset.section === sectionName;
|
package/lib/sdk-bridge.js
CHANGED
|
@@ -111,9 +111,7 @@ function createSDKBridge(opts) {
|
|
|
111
111
|
if (parsed.session_id && !session.cliSessionId) {
|
|
112
112
|
session.cliSessionId = parsed.session_id;
|
|
113
113
|
sm.saveSessionFile(session);
|
|
114
|
-
|
|
115
|
-
send({ type: "session_id", cliSessionId: session.cliSessionId });
|
|
116
|
-
}
|
|
114
|
+
sendAndRecord(session, { type: "session_id", cliSessionId: session.cliSessionId });
|
|
117
115
|
} else if (parsed.session_id) {
|
|
118
116
|
session.cliSessionId = parsed.session_id;
|
|
119
117
|
}
|
|
@@ -704,7 +702,7 @@ function createSDKBridge(opts) {
|
|
|
704
702
|
try {
|
|
705
703
|
sdk = await getSDK();
|
|
706
704
|
} catch (e) {
|
|
707
|
-
|
|
705
|
+
sendAndRecord(session, { type: "error", text: "Failed to load Claude SDK: " + (e.message || e) });
|
|
708
706
|
throw e;
|
|
709
707
|
}
|
|
710
708
|
var mq = createMessageQueue();
|
|
@@ -738,7 +736,7 @@ function createSDKBridge(opts) {
|
|
|
738
736
|
} catch (e) {
|
|
739
737
|
session.isProcessing = false;
|
|
740
738
|
onProcessingChanged();
|
|
741
|
-
|
|
739
|
+
sendAndRecord(session, { type: "error", text: "Failed to load Claude SDK: " + (e.message || e) });
|
|
742
740
|
sendAndRecord(session, { type: "done", code: 1 });
|
|
743
741
|
sm.broadcastSessionList();
|
|
744
742
|
return;
|
|
@@ -831,7 +829,7 @@ function createSDKBridge(opts) {
|
|
|
831
829
|
session.queryInstance = null;
|
|
832
830
|
session.messageQueue = null;
|
|
833
831
|
session.abortController = null;
|
|
834
|
-
|
|
832
|
+
sendAndRecord(session, { type: "error", text: "Failed to start query: " + (e.message || e) });
|
|
835
833
|
sendAndRecord(session, { type: "done", code: 1 });
|
|
836
834
|
sm.broadcastSessionList();
|
|
837
835
|
return;
|