{title} | Electric Cherry {#if loadError}{/if} {#if detail} {@const action = detail.deployment.action}
{#snippet crumbs()} {/snippet} {#snippet actions()} {#if detail?.deployment.rolled_back_by} {:else if writable && detail && action === 'promote' && !detail.fileContentsExpired && detail.servers.some((server) => !server.server_deleted_at)} {/if} {/snippet} {#if rollbackError}{/if}
Started {#if detail.deployment.beta_id}Source: Beta #{detail.deployment.beta_id}{/if} {#if detail.watchdogIncidentId}Source: Maintenance incident{/if}
Campaign details
{detail.deployment.id}{copyStatus}
{#if detail.deployment.finished_at}

Finished

{/if} {#if detail.deployment.triggered_by && detail.deployment.triggered_by !== 'ui'}

Triggered by {detail.deployment.triggered_by}

{/if}

{detail.watchdogIncidentId ? 'Maintenance rebuilds instance files with the latest promoted setup after checking that the server is safe to update.' : 'Changes wait for an empty server and rebuild capacity. Rollback snapshots are captured before servers rebuild with the requested files and verify health. Tested servers retain their pre-beta snapshots.'}

{#if detail.fileContentsExpired}

File contents have expired. File comparisons and rollback are unavailable.

{/if}

{counts.complete} of {detail.servers.length} servers complete

{loadError ? 'Updates interrupted' : 'Updates every 5s'}
{#if resumeError}{/if}

Servers

{#each filters as option} {@const count = option.value === 'all' ? detail.servers.length : counts[option.value]} {#if option.value !== 'inactive' || count || filter === option.value} {/if} {/each}
{#each visibleServers as { server: s, identity, status } (s.server)} {@const expanded = expandedServers.includes(s.server)} {:else} {/each}
ServerLobbyStatusActions
{#if s.server_deleted_at}{identity.map} {:else}{identity.map}{/if} {#if identity.game}{identity.game}{/if} {#if s.server_deleted_at}Deleted{/if} {identity.lobby ?? '—'} {status.label}
{#if s.restart_state === 'failed' && !s.server_deleted_at}Diagnose{/if}
{filter === 'all' ? 'No servers recorded.' : 'No servers in this status.'}
Files {uniqueFileCount} file{uniqueFileCount === 1 ? '' : 's'} across {byServer.size} server{byServer.size === 1 ? '' : 's'} {#if detail.files.length === 0} {:else} {#each [...byServer.entries()] as [srv, files] (srv)}

server.server === srv) ?.server_deleted_at} />

{#each files as f (f.id)} {/each}
{/each} {/if}
{#if diffError} {:else if diffLoading} {:else if openFile}{/if}
{:else if !loadError}
Loading…
{/if}