{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)}

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

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

Details

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)} · {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.

    {#each installedVersions as installed}
  • {installed.server} · v{installed.version} · {$timeFormat.dateTime(installed.recordedAt)}
  • {/each}
{: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)} {v.notes ?? ''} {#if v.source}GitHub · {v.source.asset_name} ↗{/if} {#if a.current_version_id === v.id} Promoted {:else} {#if runningBetaId === null}{/if} {/if}
File detailsSHA-256: {v.sha256}Size: {v.size.toLocaleString()} bytes
{/each}
{/if}
{#if family === 'plugin'}
load()} />
{/if}

Danger zone

{#if flash}{/if} 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 === 'plugin'} {/if}
{#if flash}{/if}
{/if}