@cloud-cli/on 1.8.0 → 1.8.1
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/README.md +1 -0
- package/dist/dashboard.d.ts +1 -1
- package/dist/dashboard.d.ts.map +1 -1
- package/dist/on.js +71 -59
- package/dist/queue.d.ts +1 -1
- package/dist/queue.d.ts.map +1 -1
- package/dist/server.d.ts.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -250,6 +250,7 @@ The Ingress Gateway listens for incoming HTTP requests and serves the live web U
|
|
|
250
250
|
| ---------- | ------------------ | -------------------------------------------------------------------------------------- |
|
|
251
251
|
| **`POST`** | `/webhooks/github` | Webhook endpoint for GitHub events. Applies GitHub filters and evaluates `on.github.if`. |
|
|
252
252
|
| **`GET`** | `/runs` | **Dashboard:** Live dark-mode monitoring page listing recent jobs and worker health. |
|
|
253
|
+
| **`GET`** | `/api/jobs?afterId=<id>&beforeId=<id>&limit=<n>` | Dashboard jobs with exclusive lower and upper ID cursors and a limit from 1 to 500 (default 50). |
|
|
253
254
|
| **`GET`** | `/runs/:jobId` | **Job Report:** Interactive HTML trace view with step timings and terminal log output. |
|
|
254
255
|
|
|
255
256
|
### Dashboard Features
|
package/dist/dashboard.d.ts
CHANGED
|
@@ -7,5 +7,5 @@ export interface DashboardJob {
|
|
|
7
7
|
updatedAt: string;
|
|
8
8
|
}
|
|
9
9
|
export declare function toDashboardJobs(rows: any[]): DashboardJob[];
|
|
10
|
-
export declare function generateDashboardHtml(jobs: DashboardJob[]): string;
|
|
10
|
+
export declare function generateDashboardHtml(jobs: DashboardJob[], hasMore?: boolean): string;
|
|
11
11
|
//# sourceMappingURL=dashboard.d.ts.map
|
package/dist/dashboard.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dashboard.d.ts","sourceRoot":"","sources":["../src/dashboard.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,YAAY,EAAE,CAS3D;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,YAAY,EAAE,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"dashboard.d.ts","sourceRoot":"","sources":["../src/dashboard.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,YAAY,EAAE,CAS3D;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,YAAY,EAAE,EAAE,OAAO,UAAQ,GAAG,MAAM,CAEnF"}
|
package/dist/on.js
CHANGED
|
@@ -4491,8 +4491,11 @@ var pi = class {
|
|
|
4491
4491
|
async getJob(e) {
|
|
4492
4492
|
return S.get("SELECT * FROM jobs WHERE id = ?", [e]);
|
|
4493
4493
|
}
|
|
4494
|
-
async listJobs(e = 50) {
|
|
4495
|
-
|
|
4494
|
+
async listJobs(e = 50, t, n) {
|
|
4495
|
+
let r = [], i = [];
|
|
4496
|
+
t !== void 0 && (r.push("id > ?"), i.push(t)), n !== void 0 && (r.push("id < ?"), i.push(n));
|
|
4497
|
+
let a = r.length ? ` WHERE ${r.join(" AND ")}` : "";
|
|
4498
|
+
return S.all(`SELECT * FROM jobs${a} ORDER BY id DESC LIMIT ?;`, [...i, e]);
|
|
4496
4499
|
}
|
|
4497
4500
|
async saveReport(e, t) {
|
|
4498
4501
|
await S.run("UPDATE jobs SET report = ?, updated_at = CURRENT_TIMESTAMP WHERE id = ?", [JSON.stringify(t), e]);
|
|
@@ -8029,7 +8032,7 @@ var Po = "<!DOCTYPE html>\n<html lang=\"en\" class=\"dark\">\n<head>\n <meta ch
|
|
|
8029
8032
|
}
|
|
8030
8033
|
return n;
|
|
8031
8034
|
}
|
|
8032
|
-
}, Ro = "<!DOCTYPE html>\n<html lang=\"en\" class=\"dark\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>Workflow Engine Dashboard</title>\n <script type=\"importmap\">\n { \"imports\": { \"@li3/\": \"https://cdn.li3.dev/@li3/\" } }\n <\/script>\n</head>\n<body class=\"bg-gray-950 text-gray-100 min-h-screen p-4 md:p-6 font-sans\">\n <template app>\n <main class=\"max-w-6xl mx-auto space-y-6\">\n <header class=\"flex flex-col sm:flex-row sm:items-center justify-between gap-3 border-b border-gray-800 pb-4\">\n <div>\n <h1 class=\"text-2xl font-bold text-white\">Runner Engine Status</h1>\n <p class=\"text-xs text-gray-400\">Live Job Queue & Execution Traces</p>\n </div>\n <div class=\"flex items-center gap-3 text-xs font-mono\">\n <span class=\"text-gray-500\">Updated {{ lastUpdated }}</span>\n <span\n class=\"px-3 py-1 rounded-full border\"\n bind-class=\"{\n 'bg-emerald-500/10.text-emerald-400.border-emerald-500/20': !refreshError,\n 'bg-rose-500/10.text-rose-400.border-rose-500/20': refreshError\n }\"\n >\n {{ refreshError ? 'Refresh failed' : 'System operational' }}\n </span>\n </div>\n </header>\n\n <section class=\"bg-gray-900 border border-gray-800 rounded-xl overflow-hidden hidden md:block\">\n <table class=\"w-full text-left text-sm\">\n <thead class=\"bg-gray-800/50 text-gray-400 text-xs uppercase font-mono border-b border-gray-800\">\n <tr>\n <th class=\"py-3 px-4\">Job ID</th>\n <th class=\"py-3 px-4\">Workflow</th>\n <th class=\"py-3 px-4\">Status</th>\n <th class=\"py-3 px-4 hidden xl:table-cell\">Worker</th>\n <th class=\"py-3 px-4 hidden lg:table-cell\">Created At</th>\n <th class=\"py-3 px-4 text-right\">Action</th>\n </tr>\n </thead>\n <tbody>\n <template for=\"job of jobs\">\n <tr class=\"border-b border-gray-800 hover:bg-gray-800/40 transition\">\n <td class=\"py-3 px-4 font-mono text-indigo-400\">\n <a attr-href=\"'/runs/' + job.id\" class=\"hover:underline\">#{{ job.id }}</a>\n </td>\n <td class=\"py-3 px-4 font-medium text-white\">{{ job.workflowId }}</td>\n <td class=\"py-3 px-4\">\n <span\n class=\"px-2.5 py-0.5 rounded-full text-xs font-semibold\"\n bind-class=\"{\n 'bg-emerald-500/10.text-emerald-400': job.status === 'success',\n 'bg-rose-500/10.text-rose-400': job.status === 'failed',\n 'bg-indigo-500/10.text-indigo-400.animate-pulse': job.status === 'running',\n 'bg-gray-500/10.text-gray-400': !['success', 'failed', 'running'].includes(job.status)\n }\"\n >\n {{ upper(job.status) }}\n </span>\n </td>\n <td class=\"py-3 px-4 hidden xl:table-cell text-xs font-mono text-gray-400\">{{ job.workerId || '-' }}</td>\n <td class=\"py-3 px-4 hidden lg:table-cell text-xs text-gray-400\">{{ job.createdAt }}</td>\n <td class=\"py-3 px-4 text-right whitespace-nowrap\">\n <a attr-href=\"'/runs/' + job.id\" class=\"text-xs bg-gray-800 hover:bg-gray-700 text-gray-200 px-3 py-1 rounded border border-gray-700\">View Trace</a>\n </td>\n </tr>\n </template>\n </tbody>\n </table>\n <template if=\"!jobs.length\">\n <div class=\"p-8 text-center text-gray-500\">No jobs recorded yet.</div>\n </template>\n </section>\n\n <section class=\"md:hidden bg-gray-900 border border-gray-800 rounded-xl divide-y divide-gray-800 overflow-hidden\">\n <template for=\"job of jobs\">\n <article class=\"p-4 bg-gray-900/60\">\n <div class=\"flex items-start justify-between gap-3\">\n <div class=\"min-w-0\">\n <div class=\"flex items-center gap-2\">\n <span\n class=\"w-2.5 h-2.5 rounded-full shrink-0\"\n bind-class=\"{\n 'bg-emerald-400': job.status === 'success',\n 'bg-rose-400': job.status === 'failed',\n 'bg-indigo-400.animate-pulse': job.status === 'running',\n 'bg-gray-500': !['success', 'failed', 'running'].includes(job.status)\n }\"\n ></span>\n <h2 class=\"font-medium text-white truncate\">{{ job.workflowId }}</h2>\n </div>\n <p class=\"mt-1 pl-[18px] text-xs font-mono text-gray-400\">#{{ job.id }} · {{ upper(job.status) }}</p>\n </div>\n <a attr-href=\"'/runs/' + job.id\" class=\"shrink-0 text-xs bg-gray-800 hover:bg-gray-700 text-gray-300 px-2.5 py-1 rounded border border-gray-700\">Trace</a>\n </div>\n </article>\n </template>\n <template if=\"!jobs.length\">\n <div class=\"p-8 text-center text-gray-500\">No jobs recorded yet.</div>\n </template>\n </section>\n </main>\n\n <script setup>\n import { onDestroy, onInit, ref } from '@li3/web';\n\n export default function setup() {\n const jobs = ref([]);\n const lastUpdated = ref('now');\n const refreshError = ref(false);\n let refreshTimer;\n let refreshing = false;\n\n const upper = (value) => String(value || '').toUpperCase();\n const refreshJobs = async () => {\n if (refreshing) return;\n refreshing = true;\n\n try {\n const
|
|
8035
|
+
}, Ro = "<!DOCTYPE html>\n<html lang=\"en\" class=\"dark\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>Workflow Engine Dashboard</title>\n <script type=\"importmap\">\n { \"imports\": { \"@li3/\": \"https://cdn.li3.dev/@li3/\" } }\n <\/script>\n</head>\n<body class=\"bg-gray-950 text-gray-100 min-h-screen p-4 md:p-6 font-sans\">\n <template app>\n <main class=\"max-w-6xl mx-auto space-y-6\">\n <header class=\"flex flex-col sm:flex-row sm:items-center justify-between gap-3 border-b border-gray-800 pb-4\">\n <div>\n <h1 class=\"text-2xl font-bold text-white\">Runner Engine Status</h1>\n <p class=\"text-xs text-gray-400\">Live Job Queue & Execution Traces</p>\n </div>\n <div class=\"flex items-center gap-3 text-xs font-mono\">\n <span class=\"text-gray-500\">Updated {{ lastUpdated }}</span>\n <span\n class=\"px-3 py-1 rounded-full border\"\n bind-class=\"{\n 'bg-emerald-500/10.text-emerald-400.border-emerald-500/20': !refreshError,\n 'bg-rose-500/10.text-rose-400.border-rose-500/20': refreshError\n }\"\n >\n {{ refreshError ? 'Refresh failed' : 'System operational' }}\n </span>\n </div>\n </header>\n\n <section class=\"bg-gray-900 border border-gray-800 rounded-xl overflow-hidden hidden md:block\">\n <table class=\"w-full text-left text-sm\">\n <thead class=\"bg-gray-800/50 text-gray-400 text-xs uppercase font-mono border-b border-gray-800\">\n <tr>\n <th class=\"py-3 px-4\">Job ID</th>\n <th class=\"py-3 px-4\">Workflow</th>\n <th class=\"py-3 px-4\">Status</th>\n <th class=\"py-3 px-4 hidden xl:table-cell\">Worker</th>\n <th class=\"py-3 px-4 hidden lg:table-cell\">Created At</th>\n <th class=\"py-3 px-4 text-right\">Action</th>\n </tr>\n </thead>\n <tbody>\n <template for=\"job of jobs\">\n <tr class=\"border-b border-gray-800 hover:bg-gray-800/40 transition\">\n <td class=\"py-3 px-4 font-mono text-indigo-400\">\n <a attr-href=\"'/runs/' + job.id\" class=\"hover:underline\">#{{ job.id }}</a>\n </td>\n <td class=\"py-3 px-4 font-medium text-white\">{{ job.workflowId }}</td>\n <td class=\"py-3 px-4\">\n <span\n class=\"px-2.5 py-0.5 rounded-full text-xs font-semibold\"\n bind-class=\"{\n 'bg-emerald-500/10.text-emerald-400': job.status === 'success',\n 'bg-rose-500/10.text-rose-400': job.status === 'failed',\n 'bg-indigo-500/10.text-indigo-400.animate-pulse': job.status === 'running',\n 'bg-gray-500/10.text-gray-400': !['success', 'failed', 'running'].includes(job.status)\n }\"\n >\n {{ upper(job.status) }}\n </span>\n </td>\n <td class=\"py-3 px-4 hidden xl:table-cell text-xs font-mono text-gray-400\">{{ job.workerId || '-' }}</td>\n <td class=\"py-3 px-4 hidden lg:table-cell text-xs text-gray-400\">{{ job.createdAt }}</td>\n <td class=\"py-3 px-4 text-right whitespace-nowrap\">\n <a attr-href=\"'/runs/' + job.id\" class=\"text-xs bg-gray-800 hover:bg-gray-700 text-gray-200 px-3 py-1 rounded border border-gray-700\">View Trace</a>\n </td>\n </tr>\n </template>\n </tbody>\n </table>\n <template if=\"!jobs.length\">\n <div class=\"p-8 text-center text-gray-500\">No jobs recorded yet.</div>\n </template>\n </section>\n\n <section class=\"md:hidden bg-gray-900 border border-gray-800 rounded-xl divide-y divide-gray-800 overflow-hidden\">\n <template for=\"job of jobs\">\n <article class=\"p-4 bg-gray-900/60\">\n <div class=\"flex items-start justify-between gap-3\">\n <div class=\"min-w-0\">\n <div class=\"flex items-center gap-2\">\n <span\n class=\"w-2.5 h-2.5 rounded-full shrink-0\"\n bind-class=\"{\n 'bg-emerald-400': job.status === 'success',\n 'bg-rose-400': job.status === 'failed',\n 'bg-indigo-400.animate-pulse': job.status === 'running',\n 'bg-gray-500': !['success', 'failed', 'running'].includes(job.status)\n }\"\n ></span>\n <h2 class=\"font-medium text-white truncate\">{{ job.workflowId }}</h2>\n </div>\n <p class=\"mt-1 pl-[18px] text-xs font-mono text-gray-400\">#{{ job.id }} · {{ upper(job.status) }}</p>\n </div>\n <a attr-href=\"'/runs/' + job.id\" class=\"shrink-0 text-xs bg-gray-800 hover:bg-gray-700 text-gray-300 px-2.5 py-1 rounded border border-gray-700\">Trace</a>\n </div>\n </article>\n </template>\n <template if=\"!jobs.length\">\n <div class=\"p-8 text-center text-gray-500\">No jobs recorded yet.</div>\n </template>\n </section>\n\n <template if=\"hasMore\">\n <div class=\"flex justify-center\">\n <button\n class=\"px-4 py-2 text-sm text-gray-200 bg-gray-800 hover:bg-gray-700 border border-gray-700 rounded-lg\"\n on-click=\"loadMore()\"\n >\n {{ loadingMore ? 'Loading...' : 'Load more' }}\n </button>\n </div>\n </template>\n </main>\n\n <script setup>\n import { onDestroy, onInit, ref } from '@li3/web';\n\n export default function setup() {\n const jobs = ref([]);\n const lastUpdated = ref('now');\n const refreshError = ref(false);\n const hasMore = ref(false);\n const loadingMore = ref(false);\n let refreshTimer;\n let refreshing = false;\n\n const upper = (value) => String(value || '').toUpperCase();\n const terminalStatuses = new Set(['success', 'failed', 'cancelled']);\n const refreshJobs = async () => {\n if (refreshing) return;\n refreshing = true;\n\n try {\n const activeIds = jobs.value\n .filter((job) => !terminalStatuses.has(job.status))\n .map((job) => Number(job.id));\n const knownIds = jobs.value.map((job) => Number(job.id));\n const afterId = activeIds.length\n ? Math.max(0, Math.min(...activeIds) - 1)\n : knownIds.length\n ? Math.max(...knownIds)\n : null;\n const url = afterId === null ? '/api/jobs?limit=500' : `/api/jobs?afterId=${afterId}&limit=500`;\n const response = await fetch(url, { headers: { accept: 'application/json' } });\n if (!response.ok) throw new Error(`Dashboard refresh failed: ${response.status}`);\n\n const data = await response.json();\n const merged = new Map(jobs.value.map((job) => [job.id, job]));\n for (const job of data.jobs) merged.set(job.id, job);\n jobs.value = Array.from(merged.values()).sort((a, b) => Number(b.id) - Number(a.id));\n lastUpdated.value = new Date().toLocaleTimeString();\n refreshError.value = false;\n } catch (error) {\n console.error(error);\n refreshError.value = true;\n } finally {\n refreshing = false;\n }\n };\n\n const loadMore = async () => {\n if (loadingMore.value || !hasMore.value || !jobs.value.length) return;\n loadingMore.value = true;\n\n try {\n const beforeId = Math.min(...jobs.value.map((job) => Number(job.id)));\n const response = await fetch(`/api/jobs?beforeId=${beforeId}`, {\n headers: { accept: 'application/json' },\n });\n if (!response.ok) throw new Error(`Loading older jobs failed: ${response.status}`);\n\n const data = await response.json();\n const merged = new Map(jobs.value.map((job) => [job.id, job]));\n for (const job of data.jobs) merged.set(job.id, job);\n jobs.value = Array.from(merged.values()).sort((a, b) => Number(b.id) - Number(a.id));\n hasMore.value = data.hasMore;\n } catch (error) {\n console.error(error);\n refreshError.value = true;\n } finally {\n loadingMore.value = false;\n }\n };\n\n onInit(() => {\n refreshTimer = setInterval(refreshJobs, 5000);\n });\n onDestroy(() => clearInterval(refreshTimer));\n\n return { jobs, lastUpdated, refreshError, hasMore, loadingMore, loadMore, upper };\n }\n <\/script>\n <script state>__DASHBOARD_STATE__<\/script>\n </template>\n\n <script type=\"module\">import '@li3/web';<\/script>\n <script src=\"https://cdn.tailwindcss.com\"><\/script>\n</body>\n</html>\n";
|
|
8033
8036
|
//#endregion
|
|
8034
8037
|
//#region src/dashboard.ts
|
|
8035
8038
|
function zo(e) {
|
|
@@ -8042,12 +8045,15 @@ function zo(e) {
|
|
|
8042
8045
|
updatedAt: e.updated_at
|
|
8043
8046
|
}));
|
|
8044
8047
|
}
|
|
8045
|
-
function Bo(e) {
|
|
8046
|
-
return Ro.replace("__DASHBOARD_STATE__", () => No({
|
|
8048
|
+
function Bo(e, t = !1) {
|
|
8049
|
+
return Ro.replace("__DASHBOARD_STATE__", () => No({
|
|
8050
|
+
jobs: e,
|
|
8051
|
+
hasMore: t
|
|
8052
|
+
}));
|
|
8047
8053
|
}
|
|
8048
8054
|
//#endregion
|
|
8049
8055
|
//#region src/server.ts
|
|
8050
|
-
var Vo = class e {
|
|
8056
|
+
var Vo = 50, Ho = 500, Uo = class e {
|
|
8051
8057
|
server;
|
|
8052
8058
|
preprocessors = /* @__PURE__ */ new Map();
|
|
8053
8059
|
workflows = [];
|
|
@@ -8069,7 +8075,10 @@ var Vo = class e {
|
|
|
8069
8075
|
async handleRequest(e, t) {
|
|
8070
8076
|
let n = new p(e.url || "/", `${e.headers["x-forwarded-proto"] || "http"}://${e.headers["x-forwarded-host"] || e.headers.host}`);
|
|
8071
8077
|
if (e.method === "GET" && (n.pathname === "/runs" || n.pathname === "/")) return this.renderDashboard(t);
|
|
8072
|
-
if (e.method === "GET" && n.pathname === "/api/jobs")
|
|
8078
|
+
if (e.method === "GET" && n.pathname === "/api/jobs") {
|
|
8079
|
+
let e = n.searchParams.get("afterId"), r = n.searchParams.get("beforeId"), i = n.searchParams.get("limit"), a = e === null ? void 0 : Number(e), o = r === null ? void 0 : Number(r), s = i === null ? Vo : Number(i);
|
|
8080
|
+
return a !== void 0 && (!Number.isSafeInteger(a) || a < 0) ? (t.writeHead(400, { "Content-Type": "application/json; charset=utf-8" }), t.end(JSON.stringify({ error: "afterId must be a non-negative integer" }))) : o !== void 0 && (!Number.isSafeInteger(o) || o < 1) ? (t.writeHead(400, { "Content-Type": "application/json; charset=utf-8" }), t.end(JSON.stringify({ error: "beforeId must be a positive integer" }))) : !Number.isSafeInteger(s) || s < 1 || s > Ho ? (t.writeHead(400, { "Content-Type": "application/json; charset=utf-8" }), t.end(JSON.stringify({ error: `limit must be an integer from 1 to ${Ho}` }))) : this.renderDashboardJobs(t, s, a, o);
|
|
8081
|
+
}
|
|
8073
8082
|
if (e.method === "GET" && n.pathname.startsWith("/runs/")) {
|
|
8074
8083
|
let e = n.pathname.replace("/runs/", "");
|
|
8075
8084
|
return this.renderRunDetails(e, t);
|
|
@@ -8170,15 +8179,18 @@ var Vo = class e {
|
|
|
8170
8179
|
this.secrets.reload(), console.log("🔄 SecretStore reloaded successfully without downtime!"), t.writeHead(200, { "Content-Type": "application/json" }), t.end(JSON.stringify({ message: "Secrets reloaded successfully" }));
|
|
8171
8180
|
}
|
|
8172
8181
|
async renderDashboard(e) {
|
|
8173
|
-
let t =
|
|
8174
|
-
e.writeHead(200, { "Content-Type": "text/html; charset=utf-8" }), e.end(
|
|
8182
|
+
let t = await this.queue.listJobs(51), n = zo(t.slice(0, Vo)), r = this.secrets.redactText(Bo(n, t.length > Vo));
|
|
8183
|
+
e.writeHead(200, { "Content-Type": "text/html; charset=utf-8" }), e.end(r);
|
|
8175
8184
|
}
|
|
8176
|
-
async renderDashboardJobs(e) {
|
|
8177
|
-
let
|
|
8185
|
+
async renderDashboardJobs(e, t, n, r) {
|
|
8186
|
+
let i = await this.queue.listJobs(t + 1, n, r), a = zo(i.slice(0, t)), o = this.secrets.redactText(JSON.stringify({
|
|
8187
|
+
jobs: a,
|
|
8188
|
+
hasMore: i.length > t
|
|
8189
|
+
}));
|
|
8178
8190
|
e.writeHead(200, {
|
|
8179
8191
|
"Cache-Control": "no-store",
|
|
8180
8192
|
"Content-Type": "application/json; charset=utf-8"
|
|
8181
|
-
}), e.end(
|
|
8193
|
+
}), e.end(o);
|
|
8182
8194
|
}
|
|
8183
8195
|
async renderRunDetails(e, t) {
|
|
8184
8196
|
let n = await this.queue.getJob(e);
|
|
@@ -8241,7 +8253,7 @@ var Vo = class e {
|
|
|
8241
8253
|
});
|
|
8242
8254
|
});
|
|
8243
8255
|
}
|
|
8244
|
-
},
|
|
8256
|
+
}, Wo = d(v), Go = class {
|
|
8245
8257
|
name = "systemd";
|
|
8246
8258
|
async isSupported() {
|
|
8247
8259
|
try {
|
|
@@ -8364,7 +8376,7 @@ var Vo = class e {
|
|
|
8364
8376
|
cancel: async () => {
|
|
8365
8377
|
d = !0;
|
|
8366
8378
|
try {
|
|
8367
|
-
t.image && await
|
|
8379
|
+
t.image && await Wo(`docker stop -t 2 ${o}`).catch(() => {}), await Wo(`systemctl stop ${o}.service`).catch(() => {});
|
|
8368
8380
|
} catch {}
|
|
8369
8381
|
},
|
|
8370
8382
|
logFilePath: i
|
|
@@ -8374,7 +8386,7 @@ var Vo = class e {
|
|
|
8374
8386
|
let t = await g(e, "utf-8"), n = t.includes("Running as unit: ") ? t.indexOf("\n") + 1 : 0, r = t.includes("Finished with result: ") ? t.lastIndexOf("Finished with result: ") : t.length;
|
|
8375
8387
|
return t.slice(n, r);
|
|
8376
8388
|
}
|
|
8377
|
-
},
|
|
8389
|
+
}, Ko = class {
|
|
8378
8390
|
name = "standard-process";
|
|
8379
8391
|
async isSupported() {
|
|
8380
8392
|
return !0;
|
|
@@ -8489,13 +8501,13 @@ var Vo = class e {
|
|
|
8489
8501
|
};
|
|
8490
8502
|
//#endregion
|
|
8491
8503
|
//#region src/drivers/index.ts
|
|
8492
|
-
async function
|
|
8493
|
-
let e = new
|
|
8494
|
-
return await e.isSupported() ? (console.log("⚡ Selected Execution Driver: Systemd (cgroups enabled)"), e) : (console.log("📦 Selected Execution Driver: Standard Process (Fallback)"), new
|
|
8504
|
+
async function qo() {
|
|
8505
|
+
let e = new Go();
|
|
8506
|
+
return await e.isSupported() ? (console.log("⚡ Selected Execution Driver: Systemd (cgroups enabled)"), e) : (console.log("📦 Selected Execution Driver: Standard Process (Fallback)"), new Ko());
|
|
8495
8507
|
}
|
|
8496
8508
|
//#endregion
|
|
8497
8509
|
//#region src/signals.ts
|
|
8498
|
-
async function
|
|
8510
|
+
async function Jo(e) {
|
|
8499
8511
|
let t = !1;
|
|
8500
8512
|
async function n(n) {
|
|
8501
8513
|
if (!t) {
|
|
@@ -8503,7 +8515,7 @@ async function Ko(e) {
|
|
|
8503
8515
|
console.error("⚠️ Graceful shutdown timed out after 10s. Forcing exit!"), process.exit(1);
|
|
8504
8516
|
}, 1e4).unref();
|
|
8505
8517
|
try {
|
|
8506
|
-
|
|
8518
|
+
Xo.isStopping = !0, e.length > 0 && (console.log("⚙️ Waiting for active worker jobs to drain..."), await Promise.allSettled(e)), console.log("✨ Engine stopped cleanly. Goodbye!"), process.exit(0);
|
|
8507
8519
|
} catch (e) {
|
|
8508
8520
|
console.error("❌ Error during graceful shutdown:", e.message), process.exit(1);
|
|
8509
8521
|
}
|
|
@@ -8513,21 +8525,21 @@ async function Ko(e) {
|
|
|
8513
8525
|
}
|
|
8514
8526
|
//#endregion
|
|
8515
8527
|
//#region src/worker.ts
|
|
8516
|
-
var
|
|
8517
|
-
function
|
|
8518
|
-
|
|
8519
|
-
let i = Array.from({ length: e }, (e, i) =>
|
|
8520
|
-
return
|
|
8521
|
-
}
|
|
8522
|
-
async function
|
|
8523
|
-
let i = await
|
|
8524
|
-
for (console.log(`[${e}] 🚀 Worker started. Driver: ${i.name}`); !
|
|
8528
|
+
var Yo = !!process.env.DEBUG, Xo = { isStopping: !1 };
|
|
8529
|
+
function Zo(e, t, n, r) {
|
|
8530
|
+
Xo.isStopping = !1;
|
|
8531
|
+
let i = Array.from({ length: e }, (e, i) => Qo(`worker-${i + 1}`, t, n, r));
|
|
8532
|
+
return Jo(i), i;
|
|
8533
|
+
}
|
|
8534
|
+
async function Qo(e, t, n, r) {
|
|
8535
|
+
let i = await qo();
|
|
8536
|
+
for (console.log(`[${e}] 🚀 Worker started. Driver: ${i.name}`); !Xo.isStopping;) try {
|
|
8525
8537
|
let a = await t.claimNextJob();
|
|
8526
8538
|
if (!a) {
|
|
8527
8539
|
await new Promise((e) => setTimeout(e, 2e3));
|
|
8528
8540
|
continue;
|
|
8529
8541
|
}
|
|
8530
|
-
await
|
|
8542
|
+
await $o({
|
|
8531
8543
|
workerId: e,
|
|
8532
8544
|
job: a,
|
|
8533
8545
|
queue: t,
|
|
@@ -8540,7 +8552,7 @@ async function Xo(e, t, n, r) {
|
|
|
8540
8552
|
}
|
|
8541
8553
|
console.log(`[${e}] 🛑 Worker loop stopped cleanly.`);
|
|
8542
8554
|
}
|
|
8543
|
-
async function
|
|
8555
|
+
async function $o(e) {
|
|
8544
8556
|
let { workerId: t, job: n, config: r, secrets: i, queue: o } = e;
|
|
8545
8557
|
console.log(`\n[${t}] 📦 Claimed Job #${n.id} (Workflow: ${n.workflow_id})`);
|
|
8546
8558
|
let s = typeof n.payload == "string" ? JSON.parse(n.payload) : n.payload, c = s.steps || [], l = s.inputs || {}, u = Date.now(), d = a.join(r.storagePath, `job-${n.id}`), f = a.join(d, "logs"), p = a.join(d, "wd"), m = {
|
|
@@ -8557,20 +8569,20 @@ async function Zo(e) {
|
|
|
8557
8569
|
durationMs: 0,
|
|
8558
8570
|
outputs: {},
|
|
8559
8571
|
logContent: ""
|
|
8560
|
-
})), g =
|
|
8572
|
+
})), g = os(n, "running", u, l, m.env, h, s);
|
|
8561
8573
|
await o.saveReport(n.id, g);
|
|
8562
|
-
let { cancelled: _, failed: v } = await
|
|
8574
|
+
let { cancelled: _, failed: v } = await es({
|
|
8563
8575
|
payload: s,
|
|
8564
8576
|
steps: c,
|
|
8565
8577
|
executionContext: m,
|
|
8566
8578
|
...e
|
|
8567
8579
|
}, g), y = _ ? "cancelled" : v ? "failed" : "success";
|
|
8568
|
-
g.status = y, g.durationMs = Date.now() - u, g.finishedAt = (/* @__PURE__ */ new Date()).toISOString(), await o.completeJob(n.id, y, g), console.log(`[${t}] ✅ Job #${n.id} completed as: ${y}`), await
|
|
8580
|
+
g.status = y, g.durationMs = Date.now() - u, g.finishedAt = (/* @__PURE__ */ new Date()).toISOString(), await o.completeJob(n.id, y, g), console.log(`[${t}] ✅ Job #${n.id} completed as: ${y}`), await ss(t, r.reporters, g);
|
|
8569
8581
|
}
|
|
8570
|
-
async function
|
|
8582
|
+
async function es(e, t) {
|
|
8571
8583
|
let { driver: n, workerId: r, queue: i, config: a, job: o, payload: s, steps: c, executionContext: l } = e, u = t.steps, d = !1, f = !1, p = 0;
|
|
8572
8584
|
try {
|
|
8573
|
-
s.env && Object.assign(l.env, await
|
|
8585
|
+
s.env && Object.assign(l.env, await rs(s.env, l));
|
|
8574
8586
|
for (let e = 0; e < c.length; e++) {
|
|
8575
8587
|
let s = c[e], m = (/* @__PURE__ */ new Date()).toISOString();
|
|
8576
8588
|
u[e] = {
|
|
@@ -8584,7 +8596,7 @@ async function Qo(e, t) {
|
|
|
8584
8596
|
startedAt: m,
|
|
8585
8597
|
finishedAt: void 0
|
|
8586
8598
|
}, t.durationMs = Date.now() - Date.parse(t.startedAt), await i.saveReport(o.id, t);
|
|
8587
|
-
let h = await
|
|
8599
|
+
let h = await ts({
|
|
8588
8600
|
workerId: r,
|
|
8589
8601
|
jobId: o.id,
|
|
8590
8602
|
step: s,
|
|
@@ -8624,22 +8636,22 @@ async function Qo(e, t) {
|
|
|
8624
8636
|
} catch (e) {
|
|
8625
8637
|
console.log("🛑 Step failed", e), d = !0;
|
|
8626
8638
|
}
|
|
8627
|
-
return p < c.length && (
|
|
8639
|
+
return p < c.length && (as(c, p, u), t.durationMs = Date.now() - Date.parse(t.startedAt), await i.saveReport(o.id, t)), {
|
|
8628
8640
|
failed: d,
|
|
8629
8641
|
cancelled: f,
|
|
8630
8642
|
stepReports: u
|
|
8631
8643
|
};
|
|
8632
8644
|
}
|
|
8633
|
-
async function
|
|
8645
|
+
async function ts(e) {
|
|
8634
8646
|
let { step: t, stepIndex: n, executionContext: r } = e;
|
|
8635
|
-
if (t.id ||= `step-${n}`, t.name ||= t.id, t.if && !await ko.evaluateConditions(t.if, r)) return
|
|
8647
|
+
if (t.id ||= `step-${n}`, t.name ||= t.id, t.if && !await ko.evaluateConditions(t.if, r)) return Yo && console.log(`⏩ Skipped step ${t.id} based on condition: ${t.if}`, r), {
|
|
8636
8648
|
failed: !1,
|
|
8637
8649
|
cancelled: !1,
|
|
8638
8650
|
skipped: !0,
|
|
8639
8651
|
report: null
|
|
8640
8652
|
};
|
|
8641
8653
|
try {
|
|
8642
|
-
let n = await
|
|
8654
|
+
let n = await rs(t.env, r), i = {
|
|
8643
8655
|
jobId: String(e.jobId),
|
|
8644
8656
|
step: t,
|
|
8645
8657
|
command: t.run,
|
|
@@ -8653,15 +8665,15 @@ async function $o(e) {
|
|
|
8653
8665
|
WORKING_DIR: r.workingDir
|
|
8654
8666
|
}
|
|
8655
8667
|
};
|
|
8656
|
-
return t.eval ?
|
|
8668
|
+
return t.eval ? ns({
|
|
8657
8669
|
...e,
|
|
8658
8670
|
stepContext: i
|
|
8659
|
-
}) :
|
|
8671
|
+
}) : is({
|
|
8660
8672
|
...e,
|
|
8661
8673
|
stepContext: i
|
|
8662
8674
|
});
|
|
8663
8675
|
} catch (e) {
|
|
8664
|
-
return
|
|
8676
|
+
return Yo && console.error(`⏩ Failed to run step ${t.id}`, r, e), {
|
|
8665
8677
|
failed: !0,
|
|
8666
8678
|
cancelled: !1,
|
|
8667
8679
|
skipped: !1,
|
|
@@ -8669,7 +8681,7 @@ async function $o(e) {
|
|
|
8669
8681
|
};
|
|
8670
8682
|
}
|
|
8671
8683
|
}
|
|
8672
|
-
async function
|
|
8684
|
+
async function ns(e) {
|
|
8673
8685
|
let { queue: t, stepContext: n, executionContext: r } = e, { jobId: i, step: a } = n, o = Date.now(), s = a.id, c = a.name;
|
|
8674
8686
|
try {
|
|
8675
8687
|
let e = await ko.evaluateExpression(a.eval, r);
|
|
@@ -8715,12 +8727,12 @@ async function es(e) {
|
|
|
8715
8727
|
};
|
|
8716
8728
|
}
|
|
8717
8729
|
}
|
|
8718
|
-
async function
|
|
8730
|
+
async function rs(e, t) {
|
|
8719
8731
|
let n = {};
|
|
8720
8732
|
if (e) for (let [r, i] of Object.entries(e)) n[r] = String(await ko.evaluateValue(i, t));
|
|
8721
8733
|
return n;
|
|
8722
8734
|
}
|
|
8723
|
-
async function
|
|
8735
|
+
async function is(t) {
|
|
8724
8736
|
let { workerId: n, jobId: r, stepContext: i, executionContext: a, driver: o, queue: s } = t, { step: c } = i, l = c.id, u = c.name, d;
|
|
8725
8737
|
try {
|
|
8726
8738
|
d = o.execute(i);
|
|
@@ -8765,7 +8777,7 @@ async function ns(t) {
|
|
|
8765
8777
|
}
|
|
8766
8778
|
};
|
|
8767
8779
|
}
|
|
8768
|
-
function
|
|
8780
|
+
function as(e, t, n) {
|
|
8769
8781
|
for (let r = t; r < e.length; r++) {
|
|
8770
8782
|
let t = e[r], i = t.id || `step-${r}`;
|
|
8771
8783
|
n[r] = {
|
|
@@ -8779,7 +8791,7 @@ function rs(e, t, n) {
|
|
|
8779
8791
|
};
|
|
8780
8792
|
}
|
|
8781
8793
|
}
|
|
8782
|
-
function
|
|
8794
|
+
function os(e, t, n, r, i, a, o) {
|
|
8783
8795
|
return {
|
|
8784
8796
|
jobId: String(e.id),
|
|
8785
8797
|
parentId: String(e.parentId || ""),
|
|
@@ -8798,7 +8810,7 @@ function is(e, t, n, r, i, a, o) {
|
|
|
8798
8810
|
})
|
|
8799
8811
|
};
|
|
8800
8812
|
}
|
|
8801
|
-
async function
|
|
8813
|
+
async function ss(e, t = [], n) {
|
|
8802
8814
|
!Array.isArray(t) || t.length === 0 || (console.log(`[${e}] 📢 Dispatching execution report to ${t.length} reporter(s)...`), await Promise.allSettled(t.map(async (t) => {
|
|
8803
8815
|
try {
|
|
8804
8816
|
await t.report(n);
|
|
@@ -8809,7 +8821,7 @@ async function as(e, t = [], n) {
|
|
|
8809
8821
|
}
|
|
8810
8822
|
//#endregion
|
|
8811
8823
|
//#region src/reporters/json-file.reporter.ts
|
|
8812
|
-
var
|
|
8824
|
+
var cs = class {
|
|
8813
8825
|
name = "json-file";
|
|
8814
8826
|
outputDir;
|
|
8815
8827
|
constructor(e) {
|
|
@@ -8820,7 +8832,7 @@ var os = class {
|
|
|
8820
8832
|
let n = a.join(this.outputDir, `run-${t.jobId}.json`);
|
|
8821
8833
|
e.writeFileSync(n, JSON.stringify(t, null, 2), "utf-8"), console.log(`📊 Execution report saved to: ${n}`);
|
|
8822
8834
|
}
|
|
8823
|
-
},
|
|
8835
|
+
}, ls = class {
|
|
8824
8836
|
name = "slack";
|
|
8825
8837
|
webhookUrl = "";
|
|
8826
8838
|
token = "";
|
|
@@ -8847,7 +8859,7 @@ var os = class {
|
|
|
8847
8859
|
};
|
|
8848
8860
|
//#endregion
|
|
8849
8861
|
//#region src/index.ts
|
|
8850
|
-
function
|
|
8862
|
+
function us(e) {
|
|
8851
8863
|
console.log("🔍 Validating Workflows in:", e.workflows);
|
|
8852
8864
|
let t = new di(e.workflows), n = r(e.workflows).filter((e) => e.endsWith(".yml") || e.endsWith(".yaml"));
|
|
8853
8865
|
for (let e of n) {
|
|
@@ -8855,13 +8867,13 @@ function cs(e) {
|
|
|
8855
8867
|
console.log(` ✅ ${e} -> Valid! (${n.length} job matrix variant(s) generated)`);
|
|
8856
8868
|
}
|
|
8857
8869
|
}
|
|
8858
|
-
async function
|
|
8870
|
+
async function ds() {
|
|
8859
8871
|
let { config: e, command: t } = await fe();
|
|
8860
|
-
if (e || process.exit(1), t === "validate") return
|
|
8872
|
+
if (e || process.exit(1), t === "validate") return us(e);
|
|
8861
8873
|
let n = new mi("./.env"), r = new pi(process.env.WORKER_NAME || "cli");
|
|
8862
8874
|
switch (t) {
|
|
8863
8875
|
case "start-server":
|
|
8864
|
-
console.log("🌐 Starting Ingress Gateway..."), await r.init(), await
|
|
8876
|
+
console.log("🌐 Starting Ingress Gateway..."), await r.init(), await Uo.withPort({
|
|
8865
8877
|
config: e,
|
|
8866
8878
|
queue: r,
|
|
8867
8879
|
secrets: n,
|
|
@@ -8870,11 +8882,11 @@ async function ls() {
|
|
|
8870
8882
|
});
|
|
8871
8883
|
break;
|
|
8872
8884
|
case "start-workers":
|
|
8873
|
-
console.log(`⚙️ Starting ${e.workers} Worker Loop(s)...`), await r.init(),
|
|
8885
|
+
console.log(`⚙️ Starting ${e.workers} Worker Loop(s)...`), await r.init(), Zo(e.workers, r, n, e);
|
|
8874
8886
|
break;
|
|
8875
8887
|
default: console.error(`❌ Unknown command: '${t}'`), de(), process.exit(1);
|
|
8876
8888
|
}
|
|
8877
8889
|
}
|
|
8878
|
-
|
|
8890
|
+
ds().catch(console.error);
|
|
8879
8891
|
//#endregion
|
|
8880
|
-
export { Io as HtmlReporter,
|
|
8892
|
+
export { Io as HtmlReporter, cs as JsonFileReporter, ls as SlackReporter };
|
package/dist/queue.d.ts
CHANGED
|
@@ -32,7 +32,7 @@ export declare class QueueManager {
|
|
|
32
32
|
/**
|
|
33
33
|
* List recent jobs for dashboard status monitoring
|
|
34
34
|
*/
|
|
35
|
-
listJobs(limit?: number): Promise<any[]>;
|
|
35
|
+
listJobs(limit?: number, afterId?: number, beforeId?: number): Promise<any[]>;
|
|
36
36
|
/**
|
|
37
37
|
* Save lightweight summary report (NO heavy logs in this JSON!)
|
|
38
38
|
*/
|
package/dist/queue.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"queue.d.ts","sourceRoot":"","sources":["../src/queue.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,uBAAuB,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEvF,qBAAa,YAAY;IACX,OAAO,CAAC,QAAQ;gBAAR,QAAQ,EAAE,MAAM;IAE9B,IAAI;IAKV;;;OAGG;IACG,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,cAAc,CAAC,EAAE,MAAM;IAkB9E;;;OAGG;IACG,YAAY,IAAI,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;IAwB/C;;OAEG;IACG,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,MAAM,EAAE,SAAS;IAInD,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,uBAAuB,GAAG,OAAO,CAAC,IAAI,CAAC;IAStG,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAiBvC;;OAEG;IACG,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAKrD,cAAc;IAMd,YAAY;IAoClB;;OAEG;IACG,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAIlD;;OAEG;IACG,QAAQ,CAAC,KAAK,SAAK,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"queue.d.ts","sourceRoot":"","sources":["../src/queue.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,uBAAuB,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEvF,qBAAa,YAAY;IACX,OAAO,CAAC,QAAQ;gBAAR,QAAQ,EAAE,MAAM;IAE9B,IAAI;IAKV;;;OAGG;IACG,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,cAAc,CAAC,EAAE,MAAM;IAkB9E;;;OAGG;IACG,YAAY,IAAI,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;IAwB/C;;OAEG;IACG,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,MAAM,EAAE,SAAS;IAInD,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,uBAAuB,GAAG,OAAO,CAAC,IAAI,CAAC;IAStG,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAiBvC;;OAEG;IACG,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAKrD,cAAc;IAMd,YAAY;IAoClB;;OAEG;IACG,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAIlD;;OAEG;IACG,QAAQ,CAAC,KAAK,SAAK,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAiB/E;;OAEG;IACG,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,MAAM,EAAE,uBAAuB,GAAG,OAAO,CAAC,IAAI,CAAC;IAOxF,2DAA2D;IACrD,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAU5F;;OAEG;IACG,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAS1E"}
|
package/dist/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAEV,mBAAmB,EACnB,oBAAoB,EAGrB,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAEV,mBAAmB,EACnB,oBAAoB,EAGrB,MAAM,YAAY,CAAC;AAOpB,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,aAAa,CAA0C;IAC/D,OAAO,CAAC,SAAS,CAA4B;IAC7C,OAAO,CAAC,KAAK,CAAe;IAC5B,OAAO,CAAC,OAAO,CAAc;IAC7B,OAAO,CAAC,UAAU,CAAS;WAEd,QAAQ,CAAC,OAAO,EAAE,oBAAoB,GAAG;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE;gBAK1D,OAAO,EAAE,oBAAoB;IAczC,oBAAoB,CAAC,YAAY,EAAE,mBAAmB;YAIxC,aAAa;IA0D3B;;OAEG;YACW,aAAa;YAyBb,WAAW;IAwBzB,OAAO,CAAC,UAAU;YAiBJ,cAAc;IAyC5B;;OAEG;YACW,kBAAkB;IAehC;;OAEG;YACW,eAAe;YAQf,mBAAmB;IAWjC;;OAEG;YACW,gBAAgB;IAkC9B,OAAO,CAAC,kBAAkB;YA0BZ,gBAAgB;IAa9B,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IAStC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAQ5B"}
|