From 38f1387db17e0c02b04c754be199fd54f96d7b0b Mon Sep 17 00:00:00 2001 From: Owen Date: Tue, 21 Apr 2026 16:52:09 -0700 Subject: [PATCH 1/5] Update package lock --- package-lock.json | 71 +++-------------------------------------------- 1 file changed, 4 insertions(+), 67 deletions(-) diff --git a/package-lock.json b/package-lock.json index f5b422b89..0f391b19e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -44,7 +44,6 @@ "@tailwindcss/forms": "0.5.11", "@tanstack/react-query": "5.90.21", "@tanstack/react-table": "8.21.3", - "@xyflow/react": "^12.8.4", "arctic": "3.7.0", "axios": "1.13.5", "better-sqlite3": "11.9.1", @@ -8719,6 +8718,7 @@ "version": "3.0.7", "resolved": "https://registry.npmjs.org/@types/d3-drag/-/d3-drag-3.0.7.tgz", "integrity": "sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==", + "dev": true, "license": "MIT", "dependencies": { "@types/d3-selection": "*" @@ -8834,6 +8834,7 @@ "version": "3.0.11", "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-3.0.11.tgz", "integrity": "sha512-bhAXu23DJWsrI45xafYpkQ4NtcKMwWnAC/vKrd2l+nxMFuvOT3XMYTIj2opv8vq8AO5Yh7Qac/nSeP/3zjTK0w==", + "dev": true, "license": "MIT" }, "node_modules/@types/d3-shape": { @@ -8868,6 +8869,7 @@ "version": "3.0.9", "resolved": "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-3.0.9.tgz", "integrity": "sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg==", + "dev": true, "license": "MIT", "dependencies": { "@types/d3-selection": "*" @@ -8877,6 +8879,7 @@ "version": "3.0.8", "resolved": "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-3.0.8.tgz", "integrity": "sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==", + "dev": true, "license": "MIT", "dependencies": { "@types/d3-interpolate": "*", @@ -9680,38 +9683,6 @@ "win32" ] }, - "node_modules/@xyflow/react": { - "version": "12.8.4", - "resolved": "https://registry.npmjs.org/@xyflow/react/-/react-12.8.4.tgz", - "integrity": "sha512-bqUu4T5QSHiCFPkoH+b+LROKwQJdLvcjhGbNW9c1dLafCBRjmH1IYz0zPE+lRDXCtQ9kRyFxz3tG19+8VORJ1w==", - "license": "MIT", - "dependencies": { - "@xyflow/system": "0.0.68", - "classcat": "^5.0.3", - "zustand": "^4.4.0" - }, - "peerDependencies": { - "react": ">=17", - "react-dom": ">=17" - } - }, - "node_modules/@xyflow/system": { - "version": "0.0.68", - "resolved": "https://registry.npmjs.org/@xyflow/system/-/system-0.0.68.tgz", - "integrity": "sha512-QDG2wxIG4qX+uF8yzm1ULVZrcXX3MxPBoxv7O52FWsX87qIImOqifUhfa/TwsvLdzn7ic2DDBH1uI8TKbdNTYA==", - "license": "MIT", - "dependencies": { - "@types/d3-drag": "^3.0.7", - "@types/d3-interpolate": "^3.0.4", - "@types/d3-selection": "^3.0.10", - "@types/d3-transition": "^3.0.8", - "@types/d3-zoom": "^3.0.8", - "d3-drag": "^3.0.0", - "d3-interpolate": "^3.0.1", - "d3-selection": "^3.0.0", - "d3-zoom": "^3.0.0" - } - }, "node_modules/accepts": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", @@ -10564,12 +10535,6 @@ "url": "https://polar.sh/cva" } }, - "node_modules/classcat": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/classcat/-/classcat-5.0.5.tgz", - "integrity": "sha512-JhZUT7JFcQy/EzW605k/ktHtncoo9vnyW/2GspNYwFlN1C/WmjuV/xtS04e9SOkL2sTdw0VAZ2UGCcQ9lR6p6w==", - "license": "MIT" - }, "node_modules/cli-spinners": { "version": "2.9.2", "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", @@ -19881,34 +19846,6 @@ "peerDependencies": { "zod": "^3.25.0 || ^4.0.0" } - }, - "node_modules/zustand": { - "version": "4.5.7", - "resolved": "https://registry.npmjs.org/zustand/-/zustand-4.5.7.tgz", - "integrity": "sha512-CHOUy7mu3lbD6o6LJLfllpjkzhHXSBlX8B9+qPddUsIfeF5S/UZ5q0kmCsnRqT1UHFQZchNFDDzMbQsuesHWlw==", - "license": "MIT", - "dependencies": { - "use-sync-external-store": "^1.2.2" - }, - "engines": { - "node": ">=12.7.0" - }, - "peerDependencies": { - "@types/react": ">=16.8", - "immer": ">=9.0.6", - "react": ">=16.8" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "immer": { - "optional": true - }, - "react": { - "optional": true - } - } } } } From 09744cf2f0e772cab70e88f65daf810dd9ad542d Mon Sep 17 00:00:00 2001 From: Owen Date: Tue, 21 Apr 2026 16:52:26 -0700 Subject: [PATCH 2/5] Make paid feature --- src/components/UptimeAlertSection.tsx | 167 ++++++++++++++------------ 1 file changed, 90 insertions(+), 77 deletions(-) diff --git a/src/components/UptimeAlertSection.tsx b/src/components/UptimeAlertSection.tsx index f7647c977..038e740b2 100644 --- a/src/components/UptimeAlertSection.tsx +++ b/src/components/UptimeAlertSection.tsx @@ -31,6 +31,9 @@ import { createApiClient, formatAxiosError } from "@app/lib/api"; import { useEnvContext } from "@app/hooks/useEnvContext"; import { toast } from "@app/hooks/useToast"; import { orgQueries } from "@app/lib/queries"; +import { PaidFeaturesAlert } from "@app/components/PaidFeaturesAlert"; +import { usePaidStatus } from "@app/hooks/usePaidStatus"; +import { tierMatrix } from "@server/lib/billing/tierMatrix"; interface UptimeAlertSectionProps { orgId: string; @@ -49,6 +52,8 @@ export default function UptimeAlertSection({ }: UptimeAlertSectionProps) { const api = createApiClient(useEnvContext()); const queryClient = useQueryClient(); + const { isPaidUser } = usePaidStatus(); + const isPaid = isPaidUser(tierMatrix.alertingRules); const [open, setOpen] = useState(false); const [name, setName] = useState(`${siteId ? "Site" : "Resource"} ${startingName} Alert`); @@ -207,82 +212,90 @@ export default function UptimeAlertSection({
-
- - setName(e.target.value)} - placeholder="Alert name" - /> -
-
- - { - const next = - typeof newTags === "function" - ? newTags(userTags) - : newTags; - setUserTags(next as Tag[]); - }} - enableAutocomplete - autocompleteOptions={allUsers} - restrictTagsToAutocompleteOptions - allowDuplicates={false} - sortTags - /> -
-
- - { - const next = - typeof newTags === "function" - ? newTags(roleTags) - : newTags; - setRoleTags(next as Tag[]); - }} - enableAutocomplete - autocompleteOptions={allRoles} - restrictTagsToAutocompleteOptions - allowDuplicates={false} - sortTags - /> -
-
- - { - const next = - typeof newTags === "function" - ? newTags(emailTags) - : newTags; - setEmailTags(next as Tag[]); - }} - allowDuplicates={false} - sortTags - validateTag={(tag) => - /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(tag) - } - delimiterList={[",", "Enter"]} - /> -
+ +
+
+
+ + setName(e.target.value)} + placeholder="Alert name" + /> +
+
+ + { + const next = + typeof newTags === "function" + ? newTags(userTags) + : newTags; + setUserTags(next as Tag[]); + }} + enableAutocomplete + autocompleteOptions={allUsers} + restrictTagsToAutocompleteOptions + allowDuplicates={false} + sortTags + /> +
+
+ + { + const next = + typeof newTags === "function" + ? newTags(roleTags) + : newTags; + setRoleTags(next as Tag[]); + }} + enableAutocomplete + autocompleteOptions={allRoles} + restrictTagsToAutocompleteOptions + allowDuplicates={false} + sortTags + /> +
+
+ + { + const next = + typeof newTags === "function" + ? newTags(emailTags) + : newTags; + setEmailTags(next as Tag[]); + }} + allowDuplicates={false} + sortTags + validateTag={(tag) => + /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(tag) + } + delimiterList={[",", "Enter"]} + /> +
+
+
@@ -292,7 +305,7 @@ export default function UptimeAlertSection({ From 84346fc23e8e20f8c81af4d1f70262b9638924db Mon Sep 17 00:00:00 2001 From: Owen Date: Tue, 21 Apr 2026 16:52:35 -0700 Subject: [PATCH 3/5] Add missing header --- .../routers/healthChecks/getStatusHistory.ts | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/server/private/routers/healthChecks/getStatusHistory.ts b/server/private/routers/healthChecks/getStatusHistory.ts index 5b1ddcfb0..2fa596950 100644 --- a/server/private/routers/healthChecks/getStatusHistory.ts +++ b/server/private/routers/healthChecks/getStatusHistory.ts @@ -1,3 +1,16 @@ +/* + * This file is part of a proprietary work. + * + * Copyright (c) 2025-2026 Fossorial, Inc. + * All rights reserved. + * + * This file is licensed under the Fossorial Commercial License. + * You may not use this file except in compliance with the License. + * Unauthorized use, copying, modification, or distribution is strictly prohibited. + * + * This file is not licensed under the AGPLv3. + */ + import { Request, Response, NextFunction } from "express"; import { z } from "zod"; import { db, statusHistory } from "@server/db"; From 13afa90d28ef9d32c2be33a87c06e22899385ea6 Mon Sep 17 00:00:00 2001 From: Owen Date: Tue, 21 Apr 2026 17:02:21 -0700 Subject: [PATCH 4/5] Fix the linking out and deleting for target ones --- .../routers/healthChecks/listHealthChecks.ts | 3 +- src/components/HealthChecksTable.tsx | 35 +++++++++++++------ 2 files changed, 26 insertions(+), 12 deletions(-) diff --git a/server/private/routers/healthChecks/listHealthChecks.ts b/server/private/routers/healthChecks/listHealthChecks.ts index e156573e4..e87525a3f 100644 --- a/server/private/routers/healthChecks/listHealthChecks.ts +++ b/server/private/routers/healthChecks/listHealthChecks.ts @@ -17,7 +17,7 @@ import HttpCode from "@server/types/HttpCode"; import createHttpError from "http-errors"; import logger from "@server/logger"; import { OpenAPITags, registry } from "@server/openApi"; -import { and, eq, like, sql } from "drizzle-orm"; +import { and, eq, isNotNull, like, sql } from "drizzle-orm"; import { NextFunction, Request, Response } from "express"; import { z } from "zod"; import { fromError } from "zod-validation-error"; @@ -85,6 +85,7 @@ export async function listHealthChecks( const whereClause = and( eq(targetHealthCheck.orgId, orgId), + isNotNull(targetHealthCheck.hcMode), // filter out the null ones attached to targets query ? like( sql`LOWER(${targetHealthCheck.name})`, diff --git a/src/components/HealthChecksTable.tsx b/src/components/HealthChecksTable.tsx index 63b48c53a..510639b46 100644 --- a/src/components/HealthChecksTable.tsx +++ b/src/components/HealthChecksTable.tsx @@ -329,7 +329,7 @@ export default function HealthChecksTable({ { setSelected(r); setDeleteOpen(true); @@ -339,18 +339,31 @@ export default function HealthChecksTable({ {t("delete")} + - + {r.resourceId && r.resourceName && r.resourceNiceId ? ( + + + + ) : ( + + )} + ); } From 73a59bc1de643e922418ab4bec917618ce579ba0 Mon Sep 17 00:00:00 2001 From: Owen Date: Tue, 21 Apr 2026 17:23:36 -0700 Subject: [PATCH 5/5] Fix missing arg --- server/lib/certificates.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/server/lib/certificates.ts b/server/lib/certificates.ts index f5860ff3a..0b1688015 100644 --- a/server/lib/certificates.ts +++ b/server/lib/certificates.ts @@ -1,5 +1,6 @@ export async function getValidCertificatesForDomains( - domains: Set + domains: Set, + useCache: boolean ): Promise< Array<{ id: number;