diff --git a/web/tests/serverlessWorkers.test.js b/web/tests/serverlessWorkers.test.js
index e502777..e1a40b9 100644
--- a/web/tests/serverlessWorkers.test.js
+++ b/web/tests/serverlessWorkers.test.js
@@ -279,7 +279,7 @@ describe("Runpod serverless worker panel", () => {
expect(formatServerlessStatus(status)).toBe(expected);
});
- it("keeps the serverless card compact while retaining its expanded settings", () => {
+ it("keeps status above a consistent endpoint info box and retains expanded settings", () => {
const ui = new DistributedUI();
const worker = {
id: "compact", name: "Used Car Inventory", type: "serverless", enabled: true,
@@ -295,13 +295,16 @@ describe("Runpod serverless worker panel", () => {
const card = ui.renderEntityCard("worker", worker, extension);
const collect = (element) => [element, ...(element.children || []).flatMap(collect)];
const info = collect(card).find((element) => element.classList.values.has("dist-worker-info"));
- expect(info.innerHTML).toContain("Runpod Serverless");
+ expect(info.innerHTML).not.toContain("Runpod Serverless");
expect(info.innerHTML).not.toMatch(/ep_private_id|jobs\/run|slots/);
expect(elements.get("serverless-status-compact").textContent).toBe("Queued");
expect(elements.get("endpoint-id-compact").value).toBe("ep_private_id");
expect(Number(elements.get("jobs-per-run-compact").value)).toBe(1);
expect(Number(elements.get("concurrency-compact").value)).toBe(1);
- expect(elements.has("controls-compact")).toBe(false);
+ const box = elements.get("controls-compact").children[0].children[0];
+ expect(box.textContent).toBe("Runpod Serverless endpoint");
+ expect(box.classList.values.has("dist-info-box")).toBe(true);
+ expect(box.style.cssText).toBe(ui.styles.infoBox);
expect(elements.get("status-compact").style.cssText).toContain("flex: 0 0 10px");
});
@@ -366,7 +369,10 @@ describe("Runpod serverless worker panel", () => {
},
};
- expect(controls).toBeNull();
+ const box = controls.children[0].children[0];
+ expect(box.textContent).toBe("Runpod Serverless endpoint");
+ expect(box.tagName).toBe("div");
+ expect(controls.children[0].children).toHaveLength(1);
await launchWorker(extension, worker.id);
await stopWorker(extension, worker.id);
await viewWorkerLog(extension, worker.id, true);
diff --git a/web/ui.js b/web/ui.js
index 6f81fbb..271a5e0 100644
--- a/web/ui.js
+++ b/web/ui.js
@@ -69,7 +69,7 @@ const cardConfigs = {
const isServerless = data.type === 'serverless';
if (isServerless) {
- return `${escapeWorkerInfo(data.name)}
Runpod Serverless`;
+ return `${escapeWorkerInfo(data.name)}`;
}
if (isCloud) {
@@ -573,8 +573,6 @@ export class DistributedUI {
createControlsSection(config, data, extension, isRemote) {
if (!config) return null;
- // Serverless has no direct-worker actions; its provider is already in the header.
- if (config.dynamic && data?.type === "serverless") return null;
const controlsDiv = document.createElement("div");
controlsDiv.id = `controls-${data?.id || 'master'}`;
@@ -605,7 +603,10 @@ export class DistributedUI {
}
controlsWrapper.appendChild(badge);
} else if (config.dynamic && data) {
- if (isRemote) {
+ if (data.type === 'serverless') {
+ // Match the master/remote footer without exposing direct-worker actions.
+ controlsWrapper.appendChild(this.createInfoBox("Runpod Serverless endpoint"));
+ } else if (isRemote) {
const isCloud = data.type === 'cloud';
const workerTypeText = isCloud ? "Cloud worker" : "Remote worker";
const workerTypeBadge = this.createInfoBox(workerTypeText);