From d96cc8268923d98424d8283fa747560e78301d32 Mon Sep 17 00:00:00 2001 From: Arnav K Date: Tue, 13 Jan 2026 22:48:23 +0530 Subject: [PATCH 01/13] Add API handler for expose service status checks --- api/index.ts | 107 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 107 insertions(+) create mode 100644 api/index.ts diff --git a/api/index.ts b/api/index.ts new file mode 100644 index 0000000000..7ebb2c219d --- /dev/null +++ b/api/index.ts @@ -0,0 +1,107 @@ +import { readFileSync } from "node:fs" +import { join } from "node:path" +import type { StatusCheck } from "../lib/types" + +interface ServiceStatus { + service: string + status: "ok" | "error" + error?: string + lastChecked: string +} + +interface ApiResponse { + timestamp: string + services: ServiceStatus[] +} + +const VALID_SERVICES = [ + "registry-api", + "autorouting-api", + "freerouting-cluster", + "jlcsearch-api", + "registry_bundling", + "fly_registry_api", + "compile_api", + "svg_service", + "png_service", + "browser_preview", + "tscircuit_package", + "usercode_api", +] + +function getLatestStatuses(): StatusCheck | null { + const filePath = join(process.cwd(), "statuses.jsonl") + const content = readFileSync(filePath, "utf-8") + const lines = content.trim().split("\n").filter(Boolean) + if (lines.length === 0) return null + return JSON.parse(lines[lines.length - 1]) +} + +export default function handler(req: Request): Response { + const url = new URL(req.url) + const service = url.searchParams.get("service") + + const latestStatus = getLatestStatuses() + + if (!latestStatus) { + return new Response(JSON.stringify({ error: "No status data available" }), { + status: 404, + headers: { "Content-Type": "application/json" }, + }) + } + + if (service) { + if (!VALID_SERVICES.includes(service)) { + return new Response( + JSON.stringify({ + error: "Invalid service", + validServices: VALID_SERVICES, + }), + { status: 400, headers: { "Content-Type": "application/json" } }, + ) + } + + const serviceData = latestStatus.checks.find((c) => c.service === service) + + if (!serviceData) { + return new Response( + JSON.stringify({ + error: `Service '${service}' not found in latest check`, + }), + { status: 404, headers: { "Content-Type": "application/json" } }, + ) + } + + const response: ApiResponse = { + timestamp: latestStatus.timestamp, + services: [ + { + service: serviceData.service, + status: serviceData.status, + ...(serviceData.error && { error: serviceData.error }), + lastChecked: latestStatus.timestamp, + }, + ], + } + + return new Response(JSON.stringify(response), { + status: 200, + headers: { "Content-Type": "application/json" }, + }) + } + + const response: ApiResponse = { + timestamp: latestStatus.timestamp, + services: latestStatus.checks.map((c) => ({ + service: c.service, + status: c.status, + ...(c.error && { error: c.error }), + lastChecked: latestStatus.timestamp, + })), + } + + return new Response(JSON.stringify(response), { + status: 200, + headers: { "Content-Type": "application/json" }, + }) +} From f2e92d387826add662b8b3870c78b8d428da727c Mon Sep 17 00:00:00 2001 From: Arnav K Date: Tue, 13 Jan 2026 22:52:15 +0530 Subject: [PATCH 02/13] f --- api/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/index.ts b/api/index.ts index 7ebb2c219d..7d5ce2eaa5 100644 --- a/api/index.ts +++ b/api/index.ts @@ -38,7 +38,7 @@ function getLatestStatuses(): StatusCheck | null { } export default function handler(req: Request): Response { - const url = new URL(req.url) + const url = new URL('https://status.tscircuit.com' + req.url) const service = url.searchParams.get("service") const latestStatus = getLatestStatuses() From 8b2b62f2bab219c8024f50e24c09b53debe20771 Mon Sep 17 00:00:00 2001 From: Arnav K Date: Tue, 13 Jan 2026 22:54:38 +0530 Subject: [PATCH 03/13] last fucking try --- api/index.ts | 8 ++++++-- vercel.json | 7 +++++++ 2 files changed, 13 insertions(+), 2 deletions(-) create mode 100644 vercel.json diff --git a/api/index.ts b/api/index.ts index 7d5ce2eaa5..704f19ccde 100644 --- a/api/index.ts +++ b/api/index.ts @@ -1,7 +1,11 @@ import { readFileSync } from "node:fs" -import { join } from "node:path" +import { dirname, join } from "node:path" +import { fileURLToPath } from "node:url" import type { StatusCheck } from "../lib/types" +const __filename = fileURLToPath(import.meta.url) +const __dirname = dirname(__filename) + interface ServiceStatus { service: string status: "ok" | "error" @@ -30,7 +34,7 @@ const VALID_SERVICES = [ ] function getLatestStatuses(): StatusCheck | null { - const filePath = join(process.cwd(), "statuses.jsonl") + const filePath = join(__dirname, "..", "statuses.jsonl") const content = readFileSync(filePath, "utf-8") const lines = content.trim().split("\n").filter(Boolean) if (lines.length === 0) return null diff --git a/vercel.json b/vercel.json new file mode 100644 index 0000000000..1446679e6a --- /dev/null +++ b/vercel.json @@ -0,0 +1,7 @@ +{ + "functions": { + "api/index.ts": { + "includeFiles": "statuses.jsonl" + } + } +} From 480621526aaab539c98ff0c2a99968175eaa4695 Mon Sep 17 00:00:00 2001 From: Arnav K Date: Tue, 13 Jan 2026 22:57:34 +0530 Subject: [PATCH 04/13] fff --- api/index.ts | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/api/index.ts b/api/index.ts index 704f19ccde..110c73b06f 100644 --- a/api/index.ts +++ b/api/index.ts @@ -34,20 +34,34 @@ const VALID_SERVICES = [ ] function getLatestStatuses(): StatusCheck | null { + console.log("[getLatestStatuses] __dirname:", __dirname) const filePath = join(__dirname, "..", "statuses.jsonl") + console.log("[getLatestStatuses] filePath:", filePath) const content = readFileSync(filePath, "utf-8") + console.log("[getLatestStatuses] content length:", content.length) const lines = content.trim().split("\n").filter(Boolean) + console.log("[getLatestStatuses] lines count:", lines.length) if (lines.length === 0) return null - return JSON.parse(lines[lines.length - 1]) + const parsed = JSON.parse(lines[lines.length - 1]) + console.log("[getLatestStatuses] parsed timestamp:", parsed.timestamp) + return parsed } +export const maxDuration = 60; + export default function handler(req: Request): Response { + console.log("[handler] Request received:", req.url) const url = new URL('https://status.tscircuit.com' + req.url) + console.log("[handler] Parsed URL:", url.toString()) const service = url.searchParams.get("service") + console.log("[handler] Service param:", service) + console.log("[handler] Fetching latest statuses...") const latestStatus = getLatestStatuses() + console.log("[handler] Got latestStatus:", latestStatus ? "yes" : "null") if (!latestStatus) { + console.log("[handler] No status data, returning 404") return new Response(JSON.stringify({ error: "No status data available" }), { status: 404, headers: { "Content-Type": "application/json" }, @@ -55,7 +69,9 @@ export default function handler(req: Request): Response { } if (service) { + console.log("[handler] Filtering for service:", service) if (!VALID_SERVICES.includes(service)) { + console.log("[handler] Invalid service, returning 400") return new Response( JSON.stringify({ error: "Invalid service", @@ -66,8 +82,10 @@ export default function handler(req: Request): Response { } const serviceData = latestStatus.checks.find((c) => c.service === service) + console.log("[handler] Found serviceData:", serviceData ? "yes" : "null") if (!serviceData) { + console.log("[handler] Service not found in checks, returning 404") return new Response( JSON.stringify({ error: `Service '${service}' not found in latest check`, @@ -88,12 +106,14 @@ export default function handler(req: Request): Response { ], } + console.log("[handler] Returning single service response") return new Response(JSON.stringify(response), { status: 200, headers: { "Content-Type": "application/json" }, }) } + console.log("[handler] Building all services response") const response: ApiResponse = { timestamp: latestStatus.timestamp, services: latestStatus.checks.map((c) => ({ @@ -104,6 +124,7 @@ export default function handler(req: Request): Response { })), } + console.log("[handler] Returning all services response, count:", response.services.length) return new Response(JSON.stringify(response), { status: 200, headers: { "Content-Type": "application/json" }, From 2ffc3dd91ef9266cf8e0cddf39623909834a442a Mon Sep 17 00:00:00 2001 From: Arnav K Date: Tue, 13 Jan 2026 23:04:45 +0530 Subject: [PATCH 05/13] u76jjnm --- api/index.ts | 19 ++++++++++--------- latest_statuses.jsonl | 2 ++ scripts/run-checks-and-write-log.ts | 6 ++++++ vercel.json | 2 +- 4 files changed, 19 insertions(+), 10 deletions(-) create mode 100644 latest_statuses.jsonl diff --git a/api/index.ts b/api/index.ts index 110c73b06f..7cd42430c0 100644 --- a/api/index.ts +++ b/api/index.ts @@ -35,23 +35,21 @@ const VALID_SERVICES = [ function getLatestStatuses(): StatusCheck | null { console.log("[getLatestStatuses] __dirname:", __dirname) - const filePath = join(__dirname, "..", "statuses.jsonl") + const filePath = join(__dirname, "..", "latest_statuses.jsonl") console.log("[getLatestStatuses] filePath:", filePath) - const content = readFileSync(filePath, "utf-8") + const content = readFileSync(filePath, "utf-8").trim() console.log("[getLatestStatuses] content length:", content.length) - const lines = content.trim().split("\n").filter(Boolean) - console.log("[getLatestStatuses] lines count:", lines.length) - if (lines.length === 0) return null - const parsed = JSON.parse(lines[lines.length - 1]) + if (!content) return null + const parsed = JSON.parse(content) console.log("[getLatestStatuses] parsed timestamp:", parsed.timestamp) return parsed } -export const maxDuration = 60; +export const maxDuration = 60 export default function handler(req: Request): Response { console.log("[handler] Request received:", req.url) - const url = new URL('https://status.tscircuit.com' + req.url) + const url = new URL("https://status.tscircuit.com" + req.url) console.log("[handler] Parsed URL:", url.toString()) const service = url.searchParams.get("service") console.log("[handler] Service param:", service) @@ -124,7 +122,10 @@ export default function handler(req: Request): Response { })), } - console.log("[handler] Returning all services response, count:", response.services.length) + console.log( + "[handler] Returning all services response, count:", + response.services.length, + ) return new Response(JSON.stringify(response), { status: 200, headers: { "Content-Type": "application/json" }, diff --git a/latest_statuses.jsonl b/latest_statuses.jsonl new file mode 100644 index 0000000000..b466913a41 --- /dev/null +++ b/latest_statuses.jsonl @@ -0,0 +1,2 @@ +{"timestamp":"2026-01-13T17:02:07.085Z","checks":[{"service":"registry-api","status":"ok"},{"service":"autorouting-api","status":"ok"},{"service":"freerouting-cluster","status":"ok"},{"service":"jlcsearch-api","status":"error","error":"JLC Search API Health Check Failed"},{"service":"registry_bundling","status":"ok"},{"service":"fly_registry_api","status":"ok"},{"service":"compile_api","status":"ok"},{"service":"svg_service","status":"ok"},{"service":"png_service","status":"ok"},{"service":"browser_preview","status":"error","error":"Browser Preview Health Check Failed"},{"service":"tscircuit_package","status":"error","error":"tscircuit package health check failed: Command failed: tscircuit build ./index.tsx --ignore-errors"},{"service":"usercode_api","status":"error","error":"Usercode job timed out"}]} +~ \ No newline at end of file diff --git a/scripts/run-checks-and-write-log.ts b/scripts/run-checks-and-write-log.ts index b8d2ddda78..7d058a66a6 100644 --- a/scripts/run-checks-and-write-log.ts +++ b/scripts/run-checks-and-write-log.ts @@ -77,6 +77,12 @@ async function runChecksAndWriteLog() { // Append to statuses.jsonl fs.appendFileSync("./statuses.jsonl", `${JSON.stringify(statusCheck)}\n`) + // Write latest status to separate file for API consumption + fs.writeFileSync( + "./latest_statuses.jsonl", + `${JSON.stringify(statusCheck)}\n`, + ) + // Limit to 2 weeks of logs const twoWeeksAgo = new Date() twoWeeksAgo.setDate(twoWeeksAgo.getDate() - 14) diff --git a/vercel.json b/vercel.json index 1446679e6a..ce5a2fc79d 100644 --- a/vercel.json +++ b/vercel.json @@ -1,7 +1,7 @@ { "functions": { "api/index.ts": { - "includeFiles": "statuses.jsonl" + "includeFiles": "latest_statuses.jsonl" } } } From 2145bad00b2fe8265a6be4df93895241eaf21e8b Mon Sep 17 00:00:00 2001 From: Arnav K Date: Tue, 13 Jan 2026 23:06:56 +0530 Subject: [PATCH 06/13] k --- latest_statuses.jsonl | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/latest_statuses.jsonl b/latest_statuses.jsonl index b466913a41..2de354cc45 100644 --- a/latest_statuses.jsonl +++ b/latest_statuses.jsonl @@ -1,2 +1 @@ -{"timestamp":"2026-01-13T17:02:07.085Z","checks":[{"service":"registry-api","status":"ok"},{"service":"autorouting-api","status":"ok"},{"service":"freerouting-cluster","status":"ok"},{"service":"jlcsearch-api","status":"error","error":"JLC Search API Health Check Failed"},{"service":"registry_bundling","status":"ok"},{"service":"fly_registry_api","status":"ok"},{"service":"compile_api","status":"ok"},{"service":"svg_service","status":"ok"},{"service":"png_service","status":"ok"},{"service":"browser_preview","status":"error","error":"Browser Preview Health Check Failed"},{"service":"tscircuit_package","status":"error","error":"tscircuit package health check failed: Command failed: tscircuit build ./index.tsx --ignore-errors"},{"service":"usercode_api","status":"error","error":"Usercode job timed out"}]} -~ \ No newline at end of file +{"timestamp":"2026-01-13T17:02:07.085Z","checks":[{"service":"registry-api","status":"ok"},{"service":"autorouting-api","status":"ok"},{"service":"freerouting-cluster","status":"ok"},{"service":"jlcsearch-api","status":"error","error":"JLC Search API Health Check Failed"},{"service":"registry_bundling","status":"ok"},{"service":"fly_registry_api","status":"ok"},{"service":"compile_api","status":"ok"},{"service":"svg_service","status":"ok"},{"service":"png_service","status":"ok"},{"service":"browser_preview","status":"error","error":"Browser Preview Health Check Failed"},{"service":"tscircuit_package","status":"error","error":"tscircuit package health check failed: Command failed: tscircuit build ./index.tsx --ignore-errors"},{"service":"usercode_api","status":"error","error":"Usercode job timed out"}]} \ No newline at end of file From 845043e8f75f83aa663091cba15f6807f44fc7b9 Mon Sep 17 00:00:00 2001 From: Arnav K Date: Tue, 13 Jan 2026 23:10:00 +0530 Subject: [PATCH 07/13] j --- api/index.ts | 44 +++++++++++++------------------------------- bun.lockb | Bin 10294 -> 63772 bytes package.json | 1 + 3 files changed, 14 insertions(+), 31 deletions(-) diff --git a/api/index.ts b/api/index.ts index 7cd42430c0..4b8144c55e 100644 --- a/api/index.ts +++ b/api/index.ts @@ -1,6 +1,7 @@ import { readFileSync } from "node:fs" import { dirname, join } from "node:path" import { fileURLToPath } from "node:url" +import type { VercelRequest, VercelResponse } from "@vercel/node" import type { StatusCheck } from "../lib/types" const __filename = fileURLToPath(import.meta.url) @@ -45,13 +46,9 @@ function getLatestStatuses(): StatusCheck | null { return parsed } -export const maxDuration = 60 - -export default function handler(req: Request): Response { +export default function handler(req: VercelRequest, res: VercelResponse) { console.log("[handler] Request received:", req.url) - const url = new URL("https://status.tscircuit.com" + req.url) - console.log("[handler] Parsed URL:", url.toString()) - const service = url.searchParams.get("service") + const service = req.query.service as string | undefined console.log("[handler] Service param:", service) console.log("[handler] Fetching latest statuses...") @@ -60,23 +57,17 @@ export default function handler(req: Request): Response { if (!latestStatus) { console.log("[handler] No status data, returning 404") - return new Response(JSON.stringify({ error: "No status data available" }), { - status: 404, - headers: { "Content-Type": "application/json" }, - }) + return res.status(404).json({ error: "No status data available" }) } if (service) { console.log("[handler] Filtering for service:", service) if (!VALID_SERVICES.includes(service)) { console.log("[handler] Invalid service, returning 400") - return new Response( - JSON.stringify({ - error: "Invalid service", - validServices: VALID_SERVICES, - }), - { status: 400, headers: { "Content-Type": "application/json" } }, - ) + return res.status(400).json({ + error: "Invalid service", + validServices: VALID_SERVICES, + }) } const serviceData = latestStatus.checks.find((c) => c.service === service) @@ -84,12 +75,9 @@ export default function handler(req: Request): Response { if (!serviceData) { console.log("[handler] Service not found in checks, returning 404") - return new Response( - JSON.stringify({ - error: `Service '${service}' not found in latest check`, - }), - { status: 404, headers: { "Content-Type": "application/json" } }, - ) + return res.status(404).json({ + error: `Service '${service}' not found in latest check`, + }) } const response: ApiResponse = { @@ -105,10 +93,7 @@ export default function handler(req: Request): Response { } console.log("[handler] Returning single service response") - return new Response(JSON.stringify(response), { - status: 200, - headers: { "Content-Type": "application/json" }, - }) + return res.status(200).json(response) } console.log("[handler] Building all services response") @@ -126,8 +111,5 @@ export default function handler(req: Request): Response { "[handler] Returning all services response, count:", response.services.length, ) - return new Response(JSON.stringify(response), { - status: 200, - headers: { "Content-Type": "application/json" }, - }) + return res.status(200).json(response) } diff --git a/bun.lockb b/bun.lockb index ddbe4a7d6e43cafab1508f31e77a3ad16d740d78..cebbfc66c843b0280610631010e96d021905b4d6 100755 GIT binary patch literal 63772 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 delta 1780 zcmdT_Z%k8H6u}DZECQhg>6U>Z zX1akobGD&GL}$Wqf8ayILdHzM5I-=@k|lG2WFIEeY%&KMW`SkVo%7l^wy*oPlic?^ z=iYP9efPd|e((Hm;%BAr$dAwYrEeCB=gWnq{=!r%oGPBL$(|qB6^I%CWhLj{vU$+T z6fvLiq<7lQ5reTnusYZpV9bdVv5XyU@m1FbQSZiKK-1) zB7w0)#M(e07;5%06VB_=7R5+>DWZh-dx(bpsO*U@pc9Kjn`;@{hwd%b_!RD$y10Cz-w~~YZ!AY+ViR=e6$A4j)F}(JPZxILAq0hZ%p4nK_eoA zPYcpJ@qOuwDDqDv@3lB+JqZWd>v50}l8qOu?2v{?@*mLtuRt>X7q5-?kCGOiaUB!D z5p=^)u@O!N-8>d%f*yG3X(Q}tb#n>cYW0Bb86(_B%Ls{e9vDNbwa(4sA-~N7ukJEJ zf18^p!cT1;z7~p(c=$RvhtDMV6`$*2Z@Y&l!zFxffE9e2pe*F!DR3opns-C~YmcB* z(im&%n-2T%m6EaEW1*@JSJL#8NbxJ}N-2*#Q<&^T$zRe3OesrUVK=T{e39aN@tJ$XfUXf|zOb!AioUrd@T zDz#qyq{L&@JU#URhpHthY+dqkX(# Date: Tue, 13 Jan 2026 23:18:05 +0530 Subject: [PATCH 08/13] f --- api/index.ts | 19 ------------------- 1 file changed, 19 deletions(-) diff --git a/api/index.ts b/api/index.ts index 4b8144c55e..119f0213f9 100644 --- a/api/index.ts +++ b/api/index.ts @@ -35,35 +35,24 @@ const VALID_SERVICES = [ ] function getLatestStatuses(): StatusCheck | null { - console.log("[getLatestStatuses] __dirname:", __dirname) const filePath = join(__dirname, "..", "latest_statuses.jsonl") - console.log("[getLatestStatuses] filePath:", filePath) const content = readFileSync(filePath, "utf-8").trim() - console.log("[getLatestStatuses] content length:", content.length) if (!content) return null const parsed = JSON.parse(content) - console.log("[getLatestStatuses] parsed timestamp:", parsed.timestamp) return parsed } export default function handler(req: VercelRequest, res: VercelResponse) { - console.log("[handler] Request received:", req.url) const service = req.query.service as string | undefined - console.log("[handler] Service param:", service) - console.log("[handler] Fetching latest statuses...") const latestStatus = getLatestStatuses() - console.log("[handler] Got latestStatus:", latestStatus ? "yes" : "null") if (!latestStatus) { - console.log("[handler] No status data, returning 404") return res.status(404).json({ error: "No status data available" }) } if (service) { - console.log("[handler] Filtering for service:", service) if (!VALID_SERVICES.includes(service)) { - console.log("[handler] Invalid service, returning 400") return res.status(400).json({ error: "Invalid service", validServices: VALID_SERVICES, @@ -71,10 +60,8 @@ export default function handler(req: VercelRequest, res: VercelResponse) { } const serviceData = latestStatus.checks.find((c) => c.service === service) - console.log("[handler] Found serviceData:", serviceData ? "yes" : "null") if (!serviceData) { - console.log("[handler] Service not found in checks, returning 404") return res.status(404).json({ error: `Service '${service}' not found in latest check`, }) @@ -92,11 +79,9 @@ export default function handler(req: VercelRequest, res: VercelResponse) { ], } - console.log("[handler] Returning single service response") return res.status(200).json(response) } - console.log("[handler] Building all services response") const response: ApiResponse = { timestamp: latestStatus.timestamp, services: latestStatus.checks.map((c) => ({ @@ -107,9 +92,5 @@ export default function handler(req: VercelRequest, res: VercelResponse) { })), } - console.log( - "[handler] Returning all services response, count:", - response.services.length, - ) return res.status(200).json(response) } From da66a2526b99a501a5acb2157fd41c9a5cc149a3 Mon Sep 17 00:00:00 2001 From: Arnav K Date: Tue, 13 Jan 2026 23:43:56 +0530 Subject: [PATCH 09/13] Delete vercel.json --- vercel.json | 7 ------- 1 file changed, 7 deletions(-) delete mode 100644 vercel.json diff --git a/vercel.json b/vercel.json deleted file mode 100644 index ce5a2fc79d..0000000000 --- a/vercel.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "functions": { - "api/index.ts": { - "includeFiles": "latest_statuses.jsonl" - } - } -} From 77b2a2a8ddefd227385b95179c14daab68e33a0c Mon Sep 17 00:00:00 2001 From: Arnav K Date: Tue, 13 Jan 2026 23:44:08 +0530 Subject: [PATCH 10/13] Delete api/index.ts --- api/index.ts | 96 ---------------------------------------------------- 1 file changed, 96 deletions(-) delete mode 100644 api/index.ts diff --git a/api/index.ts b/api/index.ts deleted file mode 100644 index 119f0213f9..0000000000 --- a/api/index.ts +++ /dev/null @@ -1,96 +0,0 @@ -import { readFileSync } from "node:fs" -import { dirname, join } from "node:path" -import { fileURLToPath } from "node:url" -import type { VercelRequest, VercelResponse } from "@vercel/node" -import type { StatusCheck } from "../lib/types" - -const __filename = fileURLToPath(import.meta.url) -const __dirname = dirname(__filename) - -interface ServiceStatus { - service: string - status: "ok" | "error" - error?: string - lastChecked: string -} - -interface ApiResponse { - timestamp: string - services: ServiceStatus[] -} - -const VALID_SERVICES = [ - "registry-api", - "autorouting-api", - "freerouting-cluster", - "jlcsearch-api", - "registry_bundling", - "fly_registry_api", - "compile_api", - "svg_service", - "png_service", - "browser_preview", - "tscircuit_package", - "usercode_api", -] - -function getLatestStatuses(): StatusCheck | null { - const filePath = join(__dirname, "..", "latest_statuses.jsonl") - const content = readFileSync(filePath, "utf-8").trim() - if (!content) return null - const parsed = JSON.parse(content) - return parsed -} - -export default function handler(req: VercelRequest, res: VercelResponse) { - const service = req.query.service as string | undefined - - const latestStatus = getLatestStatuses() - - if (!latestStatus) { - return res.status(404).json({ error: "No status data available" }) - } - - if (service) { - if (!VALID_SERVICES.includes(service)) { - return res.status(400).json({ - error: "Invalid service", - validServices: VALID_SERVICES, - }) - } - - const serviceData = latestStatus.checks.find((c) => c.service === service) - - if (!serviceData) { - return res.status(404).json({ - error: `Service '${service}' not found in latest check`, - }) - } - - const response: ApiResponse = { - timestamp: latestStatus.timestamp, - services: [ - { - service: serviceData.service, - status: serviceData.status, - ...(serviceData.error && { error: serviceData.error }), - lastChecked: latestStatus.timestamp, - }, - ], - } - - return res.status(200).json(response) - } - - const response: ApiResponse = { - timestamp: latestStatus.timestamp, - services: latestStatus.checks.map((c) => ({ - service: c.service, - status: c.status, - ...(c.error && { error: c.error }), - lastChecked: latestStatus.timestamp, - })), - } - - return res.status(200).json(response) -} From d8f2042f7a595619dc0ecaa927b0a03df674e6b2 Mon Sep 17 00:00:00 2001 From: Arnav K Date: Tue, 13 Jan 2026 23:44:29 +0530 Subject: [PATCH 11/13] Discard changes to package.json --- package.json | 1 - 1 file changed, 1 deletion(-) diff --git a/package.json b/package.json index b98cd29817..1558e4450c 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,6 @@ "@types/bun": "latest", "@types/react": "^18.3.12", "@types/react-dom": "^18.3.1", - "@vercel/node": "^5.5.17", "ky": "^1.7.2", "react": "^18.3.1", "react-dom": "^18.3.1" From 86f4ca13477f07256b9a9848cae022a14fddef10 Mon Sep 17 00:00:00 2001 From: Arnav K Date: Tue, 13 Jan 2026 23:44:43 +0530 Subject: [PATCH 12/13] Delete latest_statuses.jsonl --- latest_statuses.jsonl | 1 - 1 file changed, 1 deletion(-) delete mode 100644 latest_statuses.jsonl diff --git a/latest_statuses.jsonl b/latest_statuses.jsonl deleted file mode 100644 index 2de354cc45..0000000000 --- a/latest_statuses.jsonl +++ /dev/null @@ -1 +0,0 @@ -{"timestamp":"2026-01-13T17:02:07.085Z","checks":[{"service":"registry-api","status":"ok"},{"service":"autorouting-api","status":"ok"},{"service":"freerouting-cluster","status":"ok"},{"service":"jlcsearch-api","status":"error","error":"JLC Search API Health Check Failed"},{"service":"registry_bundling","status":"ok"},{"service":"fly_registry_api","status":"ok"},{"service":"compile_api","status":"ok"},{"service":"svg_service","status":"ok"},{"service":"png_service","status":"ok"},{"service":"browser_preview","status":"error","error":"Browser Preview Health Check Failed"},{"service":"tscircuit_package","status":"error","error":"tscircuit package health check failed: Command failed: tscircuit build ./index.tsx --ignore-errors"},{"service":"usercode_api","status":"error","error":"Usercode job timed out"}]} \ No newline at end of file From b9101960fd6e569c8d894f86b72ae997cb49aeea Mon Sep 17 00:00:00 2001 From: Arnav K Date: Tue, 13 Jan 2026 23:45:31 +0530 Subject: [PATCH 13/13] f --- bun.lock | 69 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ bun.lockb | Bin 63772 -> 0 bytes 2 files changed, 69 insertions(+) create mode 100644 bun.lock delete mode 100755 bun.lockb diff --git a/bun.lock b/bun.lock new file mode 100644 index 0000000000..6adcd66cf7 --- /dev/null +++ b/bun.lock @@ -0,0 +1,69 @@ +{ + "lockfileVersion": 1, + "workspaces": { + "": { + "name": "status", + "devDependencies": { + "@biomejs/biome": "^1.9.4", + "@types/bun": "latest", + "@types/react": "^18.3.12", + "@types/react-dom": "^18.3.1", + "ky": "^1.7.2", + "react": "^18.3.1", + "react-dom": "^18.3.1", + }, + "peerDependencies": { + "typescript": "^5.0.0", + }, + }, + }, + "packages": { + "@biomejs/biome": ["@biomejs/biome@1.9.4", "", { "optionalDependencies": { "@biomejs/cli-darwin-arm64": "1.9.4", "@biomejs/cli-darwin-x64": "1.9.4", "@biomejs/cli-linux-arm64": "1.9.4", "@biomejs/cli-linux-arm64-musl": "1.9.4", "@biomejs/cli-linux-x64": "1.9.4", "@biomejs/cli-linux-x64-musl": "1.9.4", "@biomejs/cli-win32-arm64": "1.9.4", "@biomejs/cli-win32-x64": "1.9.4" }, "bin": { "biome": "bin/biome" } }, "sha512-1rkd7G70+o9KkTn5KLmDYXihGoTaIGO9PIIN2ZB7UJxFrWw04CZHPYiMRjYsaDvVV7hP1dYNRLxSANLaBFGpog=="], + + "@biomejs/cli-darwin-arm64": ["@biomejs/cli-darwin-arm64@1.9.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-bFBsPWrNvkdKrNCYeAp+xo2HecOGPAy9WyNyB/jKnnedgzl4W4Hb9ZMzYNbf8dMCGmUdSavlYHiR01QaYR58cw=="], + + "@biomejs/cli-darwin-x64": ["@biomejs/cli-darwin-x64@1.9.4", "", { "os": "darwin", "cpu": "x64" }, "sha512-ngYBh/+bEedqkSevPVhLP4QfVPCpb+4BBe2p7Xs32dBgs7rh9nY2AIYUL6BgLw1JVXV8GlpKmb/hNiuIxfPfZg=="], + + "@biomejs/cli-linux-arm64": ["@biomejs/cli-linux-arm64@1.9.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-fJIW0+LYujdjUgJJuwesP4EjIBl/N/TcOX3IvIHJQNsAqvV2CHIogsmA94BPG6jZATS4Hi+xv4SkBBQSt1N4/g=="], + + "@biomejs/cli-linux-arm64-musl": ["@biomejs/cli-linux-arm64-musl@1.9.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-v665Ct9WCRjGa8+kTr0CzApU0+XXtRgwmzIf1SeKSGAv+2scAlW6JR5PMFo6FzqqZ64Po79cKODKf3/AAmECqA=="], + + "@biomejs/cli-linux-x64": ["@biomejs/cli-linux-x64@1.9.4", "", { "os": "linux", "cpu": "x64" }, "sha512-lRCJv/Vi3Vlwmbd6K+oQ0KhLHMAysN8lXoCI7XeHlxaajk06u7G+UsFSO01NAs5iYuWKmVZjmiOzJ0OJmGsMwg=="], + + "@biomejs/cli-linux-x64-musl": ["@biomejs/cli-linux-x64-musl@1.9.4", "", { "os": "linux", "cpu": "x64" }, "sha512-gEhi/jSBhZ2m6wjV530Yy8+fNqG8PAinM3oV7CyO+6c3CEh16Eizm21uHVsyVBEB6RIM8JHIl6AGYCv6Q6Q9Tg=="], + + "@biomejs/cli-win32-arm64": ["@biomejs/cli-win32-arm64@1.9.4", "", { "os": "win32", "cpu": "arm64" }, "sha512-tlbhLk+WXZmgwoIKwHIHEBZUwxml7bRJgk0X2sPyNR3S93cdRq6XulAZRQJ17FYGGzWne0fgrXBKpl7l4M87Hg=="], + + "@biomejs/cli-win32-x64": ["@biomejs/cli-win32-x64@1.9.4", "", { "os": "win32", "cpu": "x64" }, "sha512-8Y5wMhVIPaWe6jw2H+KlEm4wP/f7EW3810ZLmDlrEEy5KvBsb9ECEfu/kMWD484ijfQ8+nIi0giMgu9g1UAuuA=="], + + "@types/bun": ["@types/bun@1.2.13", "", { "dependencies": { "bun-types": "1.2.13" } }, "sha512-u6vXep/i9VBxoJl3GjZsl/BFIsvML8DfVDO0RYLEwtSZSp981kEO1V5NwRcO1CPJ7AmvpbnDCiMKo3JvbDEjAg=="], + + "@types/node": ["@types/node@22.15.17", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-wIX2aSZL5FE+MR0JlvF87BNVrtFWf6AE6rxSE9X7OwnVvoyCQjpzSRJ+M87se/4QCkCiebQAqrJ0y6fwIyi7nw=="], + + "@types/prop-types": ["@types/prop-types@15.7.14", "", {}, "sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ=="], + + "@types/react": ["@types/react@18.3.21", "", { "dependencies": { "@types/prop-types": "*", "csstype": "^3.0.2" } }, "sha512-gXLBtmlcRJeT09/sI4PxVwyrku6SaNUj/6cMubjE6T6XdY1fDmBL7r0nX0jbSZPU/Xr0KuwLLZh6aOYY5d91Xw=="], + + "@types/react-dom": ["@types/react-dom@18.3.7", "", { "peerDependencies": { "@types/react": "^18.0.0" } }, "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ=="], + + "bun-types": ["bun-types@1.2.13", "", { "dependencies": { "@types/node": "*" } }, "sha512-rRjA1T6n7wto4gxhAO/ErZEtOXyEZEmnIHQfl0Dt1QQSB4QV0iP6BZ9/YB5fZaHFQ2dwHFrmPaRQ9GGMX01k9Q=="], + + "csstype": ["csstype@3.1.3", "", {}, "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="], + + "js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="], + + "ky": ["ky@1.8.1", "", {}, "sha512-7Bp3TpsE+L+TARSnnDpk3xg8Idi8RwSLdj6CMbNWoOARIrGrbuLGusV0dYwbZOm4bB3jHNxSw8Wk/ByDqJEnDw=="], + + "loose-envify": ["loose-envify@1.4.0", "", { "dependencies": { "js-tokens": "^3.0.0 || ^4.0.0" }, "bin": "cli.js" }, "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q=="], + + "react": ["react@18.3.1", "", { "dependencies": { "loose-envify": "^1.1.0" } }, "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ=="], + + "react-dom": ["react-dom@18.3.1", "", { "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.2" }, "peerDependencies": { "react": "^18.3.1" } }, "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw=="], + + "scheduler": ["scheduler@0.23.2", "", { "dependencies": { "loose-envify": "^1.1.0" } }, "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ=="], + + "typescript": ["typescript@5.8.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ=="], + + "undici-types": ["undici-types@6.21.0", "", {}, "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ=="], + } +} diff --git a/bun.lockb b/bun.lockb deleted file mode 100755 index cebbfc66c843b0280610631010e96d021905b4d6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 63772 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