forked from wrenn/wrenn
Rename API routes /v1/sandboxes → /v1/capsules
This commit is contained in:
@ -77,7 +77,7 @@
|
||||
|
||||
// Delete confirmation
|
||||
let deleteTarget = $state<Host | null>(null);
|
||||
let deletePreviewSandboxes = $state<string[]>([]);
|
||||
let deletePreviewCapsules = $state<string[]>([]);
|
||||
let deletePreviewLoading = $state(false);
|
||||
let deleting = $state(false);
|
||||
let deleteError = $state<string | null>(null);
|
||||
@ -124,12 +124,12 @@
|
||||
async function openDeleteConfirm(host: Host) {
|
||||
deleteTarget = host;
|
||||
deleteError = null;
|
||||
deletePreviewSandboxes = [];
|
||||
deletePreviewCapsules = [];
|
||||
deletePreviewLoading = true;
|
||||
const preview = await getDeletePreview(host.id);
|
||||
deletePreviewLoading = false;
|
||||
if (preview.ok) {
|
||||
deletePreviewSandboxes = preview.data.sandbox_ids;
|
||||
deletePreviewCapsules = preview.data.sandbox_ids;
|
||||
}
|
||||
}
|
||||
|
||||
@ -137,7 +137,7 @@
|
||||
if (!deleteTarget) return;
|
||||
deleting = true;
|
||||
deleteError = null;
|
||||
const result = await deleteHost(deleteTarget.id, deletePreviewSandboxes.length > 0);
|
||||
const result = await deleteHost(deleteTarget.id, deletePreviewCapsules.length > 0);
|
||||
if (result.ok) {
|
||||
allHosts = allHosts.filter((h) => h.id !== deleteTarget!.id);
|
||||
deleteTarget = null;
|
||||
@ -627,10 +627,10 @@
|
||||
<svg class="animate-spin" width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M21 12a9 9 0 1 1-6.219-8.56"/></svg>
|
||||
Checking active capsules…
|
||||
</div>
|
||||
{:else if deletePreviewSandboxes.length > 0}
|
||||
{:else if deletePreviewCapsules.length > 0}
|
||||
<div class="mt-4 rounded-[var(--radius-input)] border border-[var(--color-amber)]/30 bg-[var(--color-amber)]/6 px-3 py-2.5">
|
||||
<p class="text-meta font-semibold text-[var(--color-amber)]">
|
||||
{deletePreviewSandboxes.length} active capsule{deletePreviewSandboxes.length === 1 ? '' : 's'} will be destroyed.
|
||||
{deletePreviewCapsules.length} active capsule{deletePreviewCapsules.length === 1 ? '' : 's'} will be destroyed.
|
||||
</p>
|
||||
<p class="mt-0.5 text-meta text-[var(--color-amber)]/70">
|
||||
All running workloads on this host will be terminated immediately.
|
||||
@ -661,7 +661,7 @@
|
||||
<svg class="animate-spin" width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M21 12a9 9 0 1 1-6.219-8.56"/></svg>
|
||||
Deleting…
|
||||
{:else}
|
||||
{deletePreviewSandboxes.length > 0 ? 'Force Delete' : 'Delete'}
|
||||
{deletePreviewCapsules.length > 0 ? 'Force Delete' : 'Delete'}
|
||||
{/if}
|
||||
</button>
|
||||
</div>
|
||||
|
||||
@ -9,14 +9,14 @@
|
||||
import FilesTab from '$lib/components/FilesTab.svelte';
|
||||
import TerminalTab from '$lib/components/TerminalTab.svelte';
|
||||
import {
|
||||
fetchSandboxMetrics,
|
||||
fetchCapsuleMetrics,
|
||||
METRIC_RANGES,
|
||||
METRIC_POLL_INTERVALS,
|
||||
type MetricRange,
|
||||
type MetricPoint
|
||||
} from '$lib/api/metrics';
|
||||
|
||||
const sandboxId: string = $page.params.id ?? '';
|
||||
const capsuleId: string = $page.params.id ?? '';
|
||||
|
||||
let capsule = $state<Capsule | null>(null);
|
||||
let capsuleLoading = $state(true);
|
||||
@ -96,7 +96,7 @@
|
||||
);
|
||||
|
||||
async function loadCapsule() {
|
||||
const result = await getCapsule(sandboxId);
|
||||
const result = await getCapsule(capsuleId);
|
||||
if (result.ok) {
|
||||
capsule = result.data;
|
||||
capsuleError = null;
|
||||
@ -108,7 +108,7 @@
|
||||
|
||||
async function loadMetrics() {
|
||||
if (!metricsAvailable) return;
|
||||
const result = await fetchSandboxMetrics(sandboxId, range);
|
||||
const result = await fetchCapsuleMetrics(capsuleId, range);
|
||||
if (result.ok) {
|
||||
points = result.data.points;
|
||||
metricsError = null;
|
||||
@ -441,7 +441,7 @@
|
||||
</script>
|
||||
|
||||
<svelte:head>
|
||||
<title>Wrenn — {sandboxId}</title>
|
||||
<title>Wrenn — {capsuleId}</title>
|
||||
</svelte:head>
|
||||
|
||||
<style>
|
||||
@ -575,11 +575,11 @@
|
||||
<!-- Tab content -->
|
||||
<!-- Terminal stays mounted so sessions survive tab switches -->
|
||||
<div class="flex flex-1 min-h-0" style:display={activeTab === 'terminal' ? 'flex' : 'none'}>
|
||||
<TerminalTab sandboxId={sandboxId} isRunning={capsule.status === 'running'} visible={activeTab === 'terminal'} />
|
||||
<TerminalTab capsuleId={capsuleId} isRunning={capsule.status === 'running'} visible={activeTab === 'terminal'} />
|
||||
</div>
|
||||
{#if activeTab === 'files'}
|
||||
<div class="anim-in flex flex-1 min-h-0" style="animation-delay: 0.05s">
|
||||
<FilesTab sandboxId={sandboxId} isRunning={capsule.status === 'running'} />
|
||||
<FilesTab capsuleId={capsuleId} isRunning={capsule.status === 'running'} />
|
||||
</div>
|
||||
{:else if activeTab === 'metrics'}
|
||||
<div
|
||||
@ -757,14 +757,14 @@
|
||||
|
||||
<SnapshotDialog
|
||||
open={showSnapshot}
|
||||
capsuleId={sandboxId}
|
||||
capsuleId={capsuleId}
|
||||
onclose={() => { showSnapshot = false; }}
|
||||
onsnapshot={() => { goto('/dashboard/capsules'); }}
|
||||
/>
|
||||
|
||||
<DestroyDialog
|
||||
open={showDestroy}
|
||||
capsuleId={sandboxId}
|
||||
capsuleId={capsuleId}
|
||||
onclose={() => { showDestroy = false; }}
|
||||
ondestroyed={() => { goto('/dashboard/capsules'); }}
|
||||
/>
|
||||
|
||||
@ -43,7 +43,7 @@
|
||||
|
||||
// Delete confirmation
|
||||
let deleteTarget = $state<Host | null>(null);
|
||||
let deletePreviewSandboxes = $state<string[]>([]);
|
||||
let deletePreviewCapsules = $state<string[]>([]);
|
||||
let deletePreviewLoading = $state(false);
|
||||
let deleting = $state(false);
|
||||
let deleteError = $state<string | null>(null);
|
||||
@ -97,12 +97,12 @@
|
||||
async function openDeleteConfirm(host: Host) {
|
||||
deleteTarget = host;
|
||||
deleteError = null;
|
||||
deletePreviewSandboxes = [];
|
||||
deletePreviewCapsules = [];
|
||||
deletePreviewLoading = true;
|
||||
const preview = await getDeletePreview(host.id);
|
||||
deletePreviewLoading = false;
|
||||
if (preview.ok) {
|
||||
deletePreviewSandboxes = preview.data.sandbox_ids;
|
||||
deletePreviewCapsules = preview.data.sandbox_ids;
|
||||
}
|
||||
}
|
||||
|
||||
@ -110,7 +110,7 @@
|
||||
if (!deleteTarget) return;
|
||||
deleting = true;
|
||||
deleteError = null;
|
||||
const result = await deleteHost(deleteTarget.id, deletePreviewSandboxes.length > 0);
|
||||
const result = await deleteHost(deleteTarget.id, deletePreviewCapsules.length > 0);
|
||||
if (result.ok) {
|
||||
hosts = hosts.filter((h) => h.id !== deleteTarget!.id);
|
||||
deleteTarget = null;
|
||||
@ -583,10 +583,10 @@
|
||||
<svg class="animate-spin" width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M21 12a9 9 0 1 1-6.219-8.56"/></svg>
|
||||
Checking active capsules…
|
||||
</div>
|
||||
{:else if deletePreviewSandboxes.length > 0}
|
||||
{:else if deletePreviewCapsules.length > 0}
|
||||
<div class="mt-4 rounded-[var(--radius-input)] border border-[var(--color-amber)]/20 bg-[var(--color-amber)]/5 px-3 py-2.5">
|
||||
<p class="text-meta font-semibold text-[var(--color-amber)]">
|
||||
{deletePreviewSandboxes.length} active capsule{deletePreviewSandboxes.length === 1 ? '' : 's'} will be destroyed.
|
||||
{deletePreviewCapsules.length} active capsule{deletePreviewCapsules.length === 1 ? '' : 's'} will be destroyed.
|
||||
</p>
|
||||
<p class="mt-0.5 text-meta text-[var(--color-amber)]/70">
|
||||
All running workloads on this host will be terminated immediately.
|
||||
@ -617,7 +617,7 @@
|
||||
<svg class="animate-spin" width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M21 12a9 9 0 1 1-6.219-8.56"/></svg>
|
||||
Deleting…
|
||||
{:else}
|
||||
{deletePreviewSandboxes.length > 0 ? 'Force Delete' : 'Delete Host'}
|
||||
{deletePreviewCapsules.length > 0 ? 'Force Delete' : 'Delete Host'}
|
||||
{/if}
|
||||
</button>
|
||||
</div>
|
||||
|
||||
Reference in New Issue
Block a user