diff --git a/package-lock.json b/package-lock.json
index ad7f30b..a22e1ca 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -64,6 +64,7 @@
"@vitejs/plugin-react": "^5.1.1",
"@vitest/coverage-v8": "^4.0.14",
"@vitest/ui": "^4.0.14",
+ "baseline-browser-mapping": "^2.8.32",
"eslint": "^9.39.1",
"eslint-config-next": "^16.0.5",
"jsdom": "^27.2.0",
@@ -5203,9 +5204,9 @@
"license": "MIT"
},
"node_modules/baseline-browser-mapping": {
- "version": "2.8.31",
- "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.31.tgz",
- "integrity": "sha512-a28v2eWrrRWPpJSzxc+mKwm0ZtVx/G8SepdQZDArnXYU/XS+IF6mp8aB/4E+hH1tyGCoDo3KlUCdlSxGDsRkAw==",
+ "version": "2.8.32",
+ "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.32.tgz",
+ "integrity": "sha512-OPz5aBThlyLFgxyhdwf/s2+8ab3OvT7AdTNvKHBwpXomIYeXqpUUuT8LrdtxZSsWJ4R4CU1un4XGh5Ez3nlTpw==",
"dev": true,
"license": "Apache-2.0",
"bin": {
diff --git a/package.json b/package.json
index 79d5a6e..aa4a159 100644
--- a/package.json
+++ b/package.json
@@ -27,7 +27,6 @@
"dependencies": {
"@prisma/adapter-better-sqlite3": "^7.0.1",
"@prisma/client": "^7.0.1",
- "better-sqlite3": "^12.4.6",
"@radix-ui/react-dropdown-menu": "^2.1.16",
"@radix-ui/react-slot": "^1.2.4",
"@t3-oss/env-nextjs": "^0.13.8",
@@ -43,6 +42,7 @@
"@xterm/xterm": "^5.5.0",
"axios": "^1.13.2",
"bcryptjs": "^3.0.3",
+ "better-sqlite3": "^12.4.6",
"class-variance-authority": "^0.7.1",
"clsx": "^2.1.1",
"cron-validator": "^1.4.0",
@@ -80,6 +80,7 @@
"@vitejs/plugin-react": "^5.1.1",
"@vitest/coverage-v8": "^4.0.14",
"@vitest/ui": "^4.0.14",
+ "baseline-browser-mapping": "^2.8.32",
"eslint": "^9.39.1",
"eslint-config-next": "^16.0.5",
"jsdom": "^27.2.0",
@@ -88,9 +89,9 @@
"prettier-plugin-tailwindcss": "^0.7.1",
"prisma": "^7.0.1",
"tailwindcss": "^4.1.17",
+ "tsx": "^4.19.4",
"typescript": "^5.9.3",
"typescript-eslint": "^8.48.0",
- "tsx": "^4.19.4",
"vitest": "^4.0.14"
},
"ct3aMetadata": {
@@ -103,4 +104,4 @@
"overrides": {
"prismjs": "^1.30.0"
}
-}
\ No newline at end of file
+}
diff --git a/src/app/_components/InstalledScriptsTab.tsx b/src/app/_components/InstalledScriptsTab.tsx
index 4799a31..a10e8cb 100644
--- a/src/app/_components/InstalledScriptsTab.tsx
+++ b/src/app/_components/InstalledScriptsTab.tsx
@@ -709,6 +709,8 @@ export function InstalledScriptsTab() {
return;
}
+ const containerType = script.is_vm ? "VM" : "LXC";
+
setConfirmationModal({
isOpen: true,
variant: "simple",
@@ -718,7 +720,7 @@ export function InstalledScriptsTab() {
setControllingScriptId(script.id);
setLoadingModal({
isOpen: true,
- action: `${action === "start" ? "Starting" : "Stopping"} container ${script.container_id}...`,
+ action: `${action === "start" ? "Starting" : "Stopping"} ${containerType}...`,
});
void controlContainerMutation.mutate({ id: script.id, action });
setConfirmationModal(null);
diff --git a/src/app/_components/LoadingModal.tsx b/src/app/_components/LoadingModal.tsx
index 9a06d3c..f3c642e 100644
--- a/src/app/_components/LoadingModal.tsx
+++ b/src/app/_components/LoadingModal.tsx
@@ -16,7 +16,7 @@ interface LoadingModalProps {
export function LoadingModal({
isOpen,
- action: _action,
+ action,
logs = [],
isComplete = false,
title,
@@ -64,6 +64,11 @@ export function LoadingModal({
)}
+ {/* Action text - displayed prominently */}
+ {action && (
+
{action}
+ )}
+
{/* Static title text */}
{title && {title}
}
diff --git a/src/server/api/routers/installedScripts.ts b/src/server/api/routers/installedScripts.ts
index 96c516f..02f416e 100644
--- a/src/server/api/routers/installedScripts.ts
+++ b/src/server/api/routers/installedScripts.ts
@@ -458,14 +458,118 @@ async function isVM(scriptId: number, containerId: string, serverId: number | nu
);
});
- // If LXC config exists, it's an LXC container
- return !lxcConfigExists; // Return true if it's a VM (neither config exists defaults to false/LXC)
+
+ return false; // Always LXC since VM config doesn't exist
} catch (error) {
console.error('Error determining container type:', error);
return false; // Default to LXC on error
}
}
+// Helper function to batch detect container types for all containers on a server
+// Returns a Map of container_id -> isVM (true for VM, false for LXC)
+async function batchDetectContainerTypes(server: Server): Promise