diff --git a/src/lib/components/KenerNav.svelte b/src/lib/components/KenerNav.svelte
index 22362c87..b5e44764 100644
--- a/src/lib/components/KenerNav.svelte
+++ b/src/lib/components/KenerNav.svelte
@@ -43,7 +43,11 @@
style="border-radius: var(--radius-3xl)"
>
{#if item.iconURL}
-
+
{/if}
{item.name}
diff --git a/src/lib/components/MinuteGrid.svelte b/src/lib/components/MinuteGrid.svelte
index d2d8e405..f2fa7505 100644
--- a/src/lib/components/MinuteGrid.svelte
+++ b/src/lib/components/MinuteGrid.svelte
@@ -307,11 +307,12 @@
{#if hoveredMinute}
- {$formatDate(hoveredMinute.data.timestamp, "HH:mm")} -
- {$t(hoveredMinute.data.status)}
+
+ {$t(hoveredMinute.data.status)} @ {$formatDate(hoveredMinute.data.timestamp, "HH:mm")}
+
{/if}
diff --git a/src/lib/components/MonitorOverview.svelte b/src/lib/components/MonitorOverview.svelte
index 58c85a25..b5e3c27d 100644
--- a/src/lib/components/MonitorOverview.svelte
+++ b/src/lib/components/MonitorOverview.svelte
@@ -15,6 +15,8 @@
import { getEndOfDayAtTz } from "$lib/client/datetime";
import { formatDate } from "$lib/stores/datetime";
import clientResolver from "$lib/client/resolver.js";
+ import { ArrowDown } from "@lucide/svelte";
+ import MonitorBar from "./MonitorBar.svelte";
interface Props {
monitorTag: string;
class?: string;
diff --git a/src/lib/components/StatusBarCalendar.svelte b/src/lib/components/StatusBarCalendar.svelte
index acc62d56..943ac10a 100644
--- a/src/lib/components/StatusBarCalendar.svelte
+++ b/src/lib/components/StatusBarCalendar.svelte
@@ -365,14 +365,14 @@
{#if hoveredBar}
{$t(GetStatusSummary(hoveredBar.data))}
- @
+ @
{$formatDate(hoveredBar.data.ts, "d MMM yyyy")}
{#if hoveredBar.data.avgLatency > 0}
- |
+ |
{ParseLatency(hoveredBar.data.avgLatency)}
{/if}
diff --git a/src/lib/server/queues/alertingQueue.ts b/src/lib/server/queues/alertingQueue.ts
index a619c8d6..31465d8d 100644
--- a/src/lib/server/queues/alertingQueue.ts
+++ b/src/lib/server/queues/alertingQueue.ts
@@ -315,6 +315,13 @@ export const push = async (monitor_tag: string, ts: number, status: string, opti
if (!options) {
options = {};
}
+ options.removeOnComplete = {
+ age: 300, // keep up to 5 minutes
+ count: 100, // keep up to 100 jobs
+ };
+ options.removeOnFail = {
+ age: 24 * 3600, // keep up to 24 hours
+ };
const queue = getQueue();
addWorker();
diff --git a/src/lib/server/queues/emailQueue.ts b/src/lib/server/queues/emailQueue.ts
index fc845cb0..1cbdf81a 100644
--- a/src/lib/server/queues/emailQueue.ts
+++ b/src/lib/server/queues/emailQueue.ts
@@ -71,6 +71,13 @@ export const push = async (jobData: EmailJobData, options?: JobsOptions) => {
if (!options) {
options = {};
}
+ options.removeOnComplete = {
+ age: 300, // keep up to 5 minutes
+ count: 100, // keep up to 100 jobs
+ };
+ options.removeOnFail = {
+ age: 24 * 3600, // keep up to 24 hours
+ };
const queue = getQueue();
addWorker();
diff --git a/src/lib/server/queues/monitorExecuteQueue.ts b/src/lib/server/queues/monitorExecuteQueue.ts
index 376c9350..f107ff60 100644
--- a/src/lib/server/queues/monitorExecuteQueue.ts
+++ b/src/lib/server/queues/monitorExecuteQueue.ts
@@ -195,6 +195,13 @@ export const push = async (monitor: MonitorRecordTyped, ts: number, options?: Jo
id: deDupId,
};
}
+ options.removeOnComplete = {
+ age: 3600, // keep up to 1 hour
+ count: 1000, // keep up to 1000 jobs
+ };
+ options.removeOnFail = {
+ age: 24 * 3600, // keep up to 24 hours
+ };
const queue = getQueue();
addWorker();
await queue.add(
diff --git a/src/lib/server/queues/monitorResponseQueue.ts b/src/lib/server/queues/monitorResponseQueue.ts
index a007c225..7df399bd 100644
--- a/src/lib/server/queues/monitorResponseQueue.ts
+++ b/src/lib/server/queues/monitorResponseQueue.ts
@@ -76,6 +76,13 @@ export const push = async (monitorTag: string, ts: number, result: MonitoringRes
id: deDupId,
};
}
+ options.removeOnComplete = {
+ age: 300, // keep up to 5 minutes
+ count: 100, // keep up to 100 jobs
+ };
+ options.removeOnFail = {
+ age: 24 * 3600, // keep up to 24 hours
+ };
const queue = getQueue();
addWorker();
await queue.add(
diff --git a/src/lib/server/queues/subscriberQueue.ts b/src/lib/server/queues/subscriberQueue.ts
index 5cbc21cc..323ec12e 100644
--- a/src/lib/server/queues/subscriberQueue.ts
+++ b/src/lib/server/queues/subscriberQueue.ts
@@ -93,7 +93,16 @@ export const push = async (variables: SubscriptionVariableMap, options?: JobsOpt
if (!options) {
options = {};
}
-
+ if (!options) {
+ options = {};
+ }
+ options.removeOnComplete = {
+ age: 300, // keep up to 5 minutes
+ count: 100, // keep up to 100 jobs
+ };
+ options.removeOnFail = {
+ age: 24 * 3600, // keep up to 24 hours
+ };
const queue = getQueue();
addWorker();
diff --git a/src/lib/server/schedulers/appScheduler.ts b/src/lib/server/schedulers/appScheduler.ts
index bf4fb3ae..a4fba3c4 100644
--- a/src/lib/server/schedulers/appScheduler.ts
+++ b/src/lib/server/schedulers/appScheduler.ts
@@ -87,6 +87,13 @@ export const start = async (options?: JobSchedulerTemplateOptions) => {
if (!options) {
options = {};
}
+ options.removeOnComplete = {
+ age: 300, // keep up to 5 minutes
+ count: 100, // keep up to 100 jobs
+ };
+ options.removeOnFail = {
+ age: 24 * 3600, // keep up to 24 hours
+ };
const queue = getQueue();
addWorker();
diff --git a/src/lib/server/schedulers/maintenanceScheduler.ts b/src/lib/server/schedulers/maintenanceScheduler.ts
index 862112fb..346e2b63 100644
--- a/src/lib/server/schedulers/maintenanceScheduler.ts
+++ b/src/lib/server/schedulers/maintenanceScheduler.ts
@@ -137,7 +137,13 @@ export const start = async (options?: JobSchedulerTemplateOptions) => {
if (!options) {
options = {};
}
-
+ options.removeOnComplete = {
+ age: 300, // keep up to 5 minutes
+ count: 100, // keep up to 100 jobs
+ };
+ options.removeOnFail = {
+ age: 24 * 3600, // keep up to 24 hours
+ };
const queue = getQueue();
addWorker();
diff --git a/src/lib/server/schedulers/monitorSchedulers.ts b/src/lib/server/schedulers/monitorSchedulers.ts
index 7fc45607..90756c3b 100644
--- a/src/lib/server/schedulers/monitorSchedulers.ts
+++ b/src/lib/server/schedulers/monitorSchedulers.ts
@@ -46,6 +46,16 @@ export const addJobToSchedulerQueue = async (
if (!monitor.cron) {
throw new Error("Monitor cron expression is undefined");
}
+ if (!options) {
+ options = {};
+ }
+ options.removeOnComplete = {
+ age: 300, // keep up to 5 minutes
+ count: 100, // keep up to 100 jobs
+ };
+ options.removeOnFail = {
+ age: 24 * 3600, // keep up to 24 hours
+ };
const queue = getQueue(minNumOfWorkers);
await queue.upsertJobScheduler(
id,
diff --git a/src/routes/(docs)/docs/DocsSidebar.svelte b/src/routes/(docs)/docs/DocsSidebar.svelte
index b519b777..7179b917 100644
--- a/src/routes/(docs)/docs/DocsSidebar.svelte
+++ b/src/routes/(docs)/docs/DocsSidebar.svelte
@@ -44,7 +44,7 @@
let expandedGroups = $state([]);
let expandedPages = $state([]);
- let prevSlug = $state(currentSlug);
+ let prevSlug = $state("");
// Auto-expand when navigating to a different page (not when manually toggling)
$effect(() => {
@@ -102,7 +102,7 @@