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.
@@ -86,7 +86,9 @@ export function initScheduler(_ctx) {
86
86
  if (panelOpen) {
87
87
  closeScheduler();
88
88
  } else {
89
- openScheduler();
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
- addSubmitting = true;
296
- addInput.value = "";
297
- addForm.classList.add("hidden");
298
- addTrigger.classList.remove("hidden");
299
- // Send wizard complete directly (skip modal)
300
- send({
301
- type: "ralph_wizard_complete",
302
- data: { name: task, task: task, maxIterations: 3, cron: null, source: "task" }
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
- var description = document.getElementById("sched-create-desc").value.trim();
2707
- var datePicker = document.getElementById("sched-create-date-picker");
2708
- var dateVal = datePicker ? datePicker.value : document.getElementById("sched-create-date").value;
2709
- var timeVal = document.getElementById("sched-create-time").value || "09:00";
2710
- var cron = buildCreateCron();
2711
-
2712
- // Build recurrence end info
2713
- var recurrenceEnd = null;
2714
- if (cron && createRecurrence === "custom" && createCustomConfirmed) {
2715
- if (createEndType === "until" && createEndDate) {
2716
- var ey = createEndDate.getFullYear();
2717
- var em = String(createEndDate.getMonth() + 1).padStart(2, "0");
2718
- var ed = String(createEndDate.getDate()).padStart(2, "0");
2719
- recurrenceEnd = { type: "until", date: ey + "-" + em + "-" + ed };
2720
- } else if (createEndType === "after" && createEndAfter > 0) {
2721
- recurrenceEnd = { type: "after", count: createEndAfter };
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
- var iterInput = document.getElementById("sched-create-iterations");
2726
- var maxIterations = iterInput ? (parseInt(iterInput.value, 10) || 3) : 3;
2727
- if (maxIterations < 1) maxIterations = 1;
2728
- if (maxIterations > 100) maxIterations = 100;
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
- send({
2731
- type: "schedule_create",
2732
- data: {
2733
- name: name,
2734
- taskId: taskId,
2735
- description: description,
2736
- date: dateVal,
2737
- time: timeVal,
2738
- allDay: false,
2739
- cron: cron,
2740
- enabled: cron ? true : false,
2741
- color: createColor,
2742
- recurrenceEnd: recurrenceEnd,
2743
- maxIterations: maxIterations,
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
- closeCreateModal();
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
- // On mobile, scroll the active tab into view
232
- if (isActive) {
233
- navItems[i].scrollIntoView({ behavior: "smooth", block: "nearest", inline: "center" });
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
- if (session.localId === sm.activeSessionId) {
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
- send({ type: "error", text: "Failed to load Claude SDK: " + (e.message || e) });
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
- send({ type: "error", text: "Failed to load Claude SDK: " + (e.message || e) });
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
- send({ type: "error", text: "Failed to start query: " + (e.message || e) });
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;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "clay-server",
3
- "version": "2.9.0",
3
+ "version": "2.9.2",
4
4
  "description": "Web UI for Claude Code. Any device. Push notifications.",
5
5
  "bin": {
6
6
  "clay-server": "./bin/cli.js",