@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 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
@@ -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
@@ -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,CAElE"}
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
- return S.all("SELECT * FROM jobs ORDER BY id DESC LIMIT ?;", [e]);
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 &amp; 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 response = await fetch('/api/jobs', { headers: { accept: 'application/json' } });\n if (!response.ok) throw new Error(`Dashboard refresh failed: ${response.status}`);\n\n const data = await response.json();\n jobs.value = data.jobs;\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 onInit(() => {\n refreshTimer = setInterval(refreshJobs, 5000);\n });\n onDestroy(() => clearInterval(refreshTimer));\n\n return { jobs, lastUpdated, refreshError, 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";
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 &amp; 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({ jobs: e }));
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") return this.renderDashboardJobs(t);
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 = zo(await this.queue.listJobs(500)), n = this.secrets.redactText(Bo(t));
8174
- e.writeHead(200, { "Content-Type": "text/html; charset=utf-8" }), e.end(n);
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 t = zo(await this.queue.listJobs(500)), n = this.secrets.redactText(JSON.stringify({ jobs: t }));
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(n);
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
- }, Ho = d(v), Uo = class {
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 Ho(`docker stop -t 2 ${o}`).catch(() => {}), await Ho(`systemctl stop ${o}.service`).catch(() => {});
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
- }, Wo = class {
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 Go() {
8493
- let e = new Uo();
8494
- return await e.isSupported() ? (console.log("⚡ Selected Execution Driver: Systemd (cgroups enabled)"), e) : (console.log("📦 Selected Execution Driver: Standard Process (Fallback)"), new Wo());
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 Ko(e) {
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
- Jo.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);
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 qo = !!process.env.DEBUG, Jo = { isStopping: !1 };
8517
- function Yo(e, t, n, r) {
8518
- Jo.isStopping = !1;
8519
- let i = Array.from({ length: e }, (e, i) => Xo(`worker-${i + 1}`, t, n, r));
8520
- return Ko(i), i;
8521
- }
8522
- async function Xo(e, t, n, r) {
8523
- let i = await Go();
8524
- for (console.log(`[${e}] 🚀 Worker started. Driver: ${i.name}`); !Jo.isStopping;) try {
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 Zo({
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 Zo(e) {
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 = is(n, "running", u, l, m.env, h, s);
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 Qo({
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 as(t, r.reporters, g);
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 Qo(e, t) {
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 ts(s.env, l));
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 $o({
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 && (rs(c, p, u), t.durationMs = Date.now() - Date.parse(t.startedAt), await i.saveReport(o.id, t)), {
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 $o(e) {
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 qo && console.log(`⏩ Skipped step ${t.id} based on condition: ${t.if}`, r), {
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 ts(t.env, r), i = {
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 ? es({
8668
+ return t.eval ? ns({
8657
8669
  ...e,
8658
8670
  stepContext: i
8659
- }) : ns({
8671
+ }) : is({
8660
8672
  ...e,
8661
8673
  stepContext: i
8662
8674
  });
8663
8675
  } catch (e) {
8664
- return qo && console.error(`⏩ Failed to run step ${t.id}`, r, e), {
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 es(e) {
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 ts(e, t) {
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 ns(t) {
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 rs(e, t, n) {
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 is(e, t, n, r, i, a, o) {
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 as(e, t = [], n) {
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 os = class {
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
- }, ss = class {
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 cs(e) {
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 ls() {
8870
+ async function ds() {
8859
8871
  let { config: e, command: t } = await fe();
8860
- if (e || process.exit(1), t === "validate") return cs(e);
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 Vo.withPort({
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(), Yo(e.workers, r, n, e);
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
- ls().catch(console.error);
8890
+ ds().catch(console.error);
8879
8891
  //#endregion
8880
- export { Io as HtmlReporter, os as JsonFileReporter, ss as SlackReporter };
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
  */
@@ -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;IAI1C;;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"}
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"}
@@ -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;AAIpB,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;IAsC3B;;OAEG;YACW,aAAa;YAyBb,WAAW;IAwBzB,OAAO,CAAC,UAAU;YAiBJ,cAAc;IAyC5B;;OAEG;YACW,kBAAkB;IAehC;;OAEG;YACW,eAAe;YAOf,mBAAmB;IAUjC;;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"}
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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cloud-cli/on",
3
- "version": "1.8.0",
3
+ "version": "1.8.1",
4
4
  "description": "CLI entry point for the on plugin ecosystem.",
5
5
  "type": "module",
6
6
  "packageManager": "pnpm@10.30.3",