Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/components/CloudBackendPicker.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ export function CloudBackendPicker({
<div className="text-[12px] font-medium text-ink">Cloud backend</div>
<div className="mt-0.5 text-[11.5px] text-ink-secondary">
{value === "vps"
? "Auto only attaches to a VPS container that is already running — a stopped or missing one is never provisioned or started, and the bot quietly works as if no cloud computer existed. Choose Cloud to provision or start it. No interactive desktop tunnel is exposed."
? "Auto reuses a running VPS by default. Enable Start VPS automatically to let Auto create or wake its managed container, or choose Cloud to do it explicitly. Open the live desktop securely from the computer panel."
: "Box is the default hosted computer. Choose Self-hosted VPS to use your SSH-configured Linux Docker host."}
</div>
<div className="mt-2 flex overflow-hidden rounded-lg border border-hairline/40">
Expand Down
5 changes: 3 additions & 2 deletions src/components/ComputerPanel.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -591,11 +591,12 @@ export function ComputerPanel({ bot }: { bot: Bot }) {
}
} catch (e) {
fallbackTab?.close();
// Release the bot before waiting on best-effort tunnel cleanup. A sick
// SSH process must never leave the agent paused indefinitely.
if (tookControl) await requestControl("release").catch(() => {});
if (phase === "ready" && cloudBackend === "vps") {
await api(`/api/bots/${bot.id}/computer/viewer-close`, { method: "POST", body: "{}" }).catch(() => {});
}
// A failed viewer must not leave the bot's hands paused indefinitely.
if (tookControl) await requestControl("release").catch(() => {});
setError(e instanceof Error ? e.message : String(e));
} finally {
setPending(null);
Expand Down
Loading