{artifact?.name ?? crumbLabel} · Electric Cherry {#if loadError}{/if} {#if loading}
Loading…
{:else if !artifact && !loadError} {:else if artifact} {@const a = artifact}
{#snippet crumbs()} {/snippet} {#if scopeComplete}
Scope saved. {scopeComplete.composed ? `Intended configuration may change on ${scopeComplete.count} eligible servers.` : scopeComplete.detached ? `Inventory tracking detached on ${scopeComplete.detached} servers; live files remain.` : `${scopeComplete.count} servers are in the old or new scope.`} Maintenance detects resulting drift and rebuilds eligible servers when automation is enabled. View drift recovery →
{/if} {#if latestVersion}

Latest {artifactVersionLabel(latestVersion, family)}

{latestVersion.notes || 'No version notes provided.'}

{#if runningBetaId !== null}{:else if editable && latestVersion.id !== a.current_version_id}{:else if latestVersion.id === a.current_version_id}Latest version is promoted{/if}
{/if} {#if runningBetaId}
Beta #{runningBetaId} is running for this {family}. Rollback or promote it before making changes.
{/if}

Details

{#if editable}
{/if}
Target file, scope, and eligible servers
Target file {a.target_rel_path}
Scope {scopeLabel(a)}
Eligible servers {#if !a.scope_type} Unscoped — deploy from a beta {:else if matchedServers.length === 0} No matching servers {:else} {#each matchedServers as name}{/each} {/if}
Promoted version {#if currentVersion} {artifactVersionLabel(currentVersion, family)} · {currentVersion.sha256.slice( 0, 8 )} Promoted {:else} Never promoted — test a version first {/if}
{#if installedVersions.length}
Recorded installed files · {installedVersions.length} servers

Last recorded file writes, not a verification of the currently running process.

{:else if family !== 'config'}

No installed file versions recorded. Eligibility does not mean a file is installed.

{/if} {#if a.kind === 'config' || a.kind === 'baseline'} load({ seedForm: false })} /> {/if}

Version history

{versions.length}
{#if versions.length === 0} {:else}
{#each versions.slice(0, limit) as v (v.id)}
{artifactVersionLabel(v, family)} {v.notes ?? ''} {#if v.source}GitHub · {v.source.asset_name} ↗{/if} {#if a.current_version_id === v.id} Promoted {:else} {#if editable && runningBetaId === null}{/if} {/if}
File detailsSHA-256: {v.sha256}Size: {v.size.toLocaleString()} bytes
{/each}
{/if}
{#if editable && family === 'plugin'}
load()} />
{/if} {#if editable}

Danger zone

{/if} {#if flash}{/if} {#if editable} (scopeReviewOpen = false)} oncancel={(event) => { if (updatingScope) event.preventDefault(); }} bind:this={scopeDialog} onclick={(e) => onDialogClick(scopeDialog, e)} >

Edit scope

(scopeMap = '')} options={gameOptions} disabled={updatingScope} /> {/if} {#if scopeType === 'map'} {#if family === 'script'} { versionManifest = versions; if (versionFile && !releaseVersion.trim()) releaseVersion = manifestVersion(versions, versionFile.name); }} /> {/if} {#if family === 'plugin' || family === 'script'} {/if}
{#if flash}{/if}
{/if}
{/if}