:operation.state==='warning'?`${actionLabels[operation.action]} completed with warnings`
:operation.state==='warning'?`${actionLabels[operation.action]} completed with warnings`
:progress?.blocker?.message??operation.stage;
:progress?.blocker?.message??operation.stage;
letdescription: string;
letdescription: string|null;
if(detail.canResumeCleanup)description='The remote deployment was deleted. Resume the remaining local cleanup without repeating container removal.';
if(detail.canResumeCleanup)description='The remote deployment was deleted. Resume the remaining local cleanup without repeating container removal.';
elseif(detail.canResumeRebuild)description='The remote deployment was deleted. Resume local cleanup, then create a fresh instance in the reserved server slot.';
elseif(detail.canResumeRebuild)description='The remote deployment was deleted. Resume local cleanup, then create a fresh instance in the reserved server slot.';
elseif(detail.canResumeVerification)description='Resume readiness checks for the existing instance. An unhealthy container may continue through this operation’s remaining restart and rebuild recovery steps.';
elseif(detail.canResumeVerification)description='Resume readiness checks for the existing instance. An unhealthy container may continue through this operation’s remaining restart and rebuild recovery steps.';
@@ -152,11 +152,7 @@ export function provisioningOutcome(detail: ProvisioningDetail) {
?'The remote response was uncertain. Inspect the recorded result and server before requesting another operation.'
?'The remote response was uncertain. Inspect the recorded result and server before requesting another operation.'
:'Review the recorded failure and execution evidence before submitting another operation.';
:'Review the recorded failure and execution evidence before submitting another operation.';
elseif(operation.state==='warning')description='The operation finished. Review the recorded warnings below for any remaining issue.';
elseif(operation.state==='warning')description='The operation finished. Review the recorded warnings below for any remaining issue.';
'Admin override enabled for this operation. Provisioning will proceed without player safety checks when the remaining requirements are met.',{confirmed: true});
'Admin override enabled for this operation. Provisioning will proceed without player safety checks when the remaining requirements are met.',{confirmed: true});
message:`Stop remaining work and health checks for ${serverTitle(deployment.server)} (${deployment.server}). Changes already made are not undone. Commands already sent to the host may still finish.`,
message:`Stop this launch and delete the container and instance files for ${serverTitle(deployment.server)} (${deployment.server}), even if player status is unknown or players have joined. Shared game files are kept. The key returns to its game pool after removal is confirmed.`,
confirmLabel:'Cancel creation and remove server',danger: true
{#ifdetail.safetyOverride}<divclass="warnings"><h3>Admin override enabled</h3><p>Player safety checks bypassed for this operation. Confirmed by {detail.safetyOverride.actorName} · {@renderdateTime(detail.safetyOverride.confirmedAt)}.</p></div>{/if}
{#ifdetail.safetyOverride}<divclass="warnings"><h3>Admin override enabled</h3><p>Player safety checks bypassed for this operation. Confirmed by {detail.safetyOverride.actorName} · {@renderdateTime(detail.safetyOverride.confirmedAt)}.</p></div>{/if}
{#ifcanOverride}<div><Buttonvariant="danger"disabled={!!view.busy||!!detail.safetyOverrideUnavailableReason}loading={view.busy==='override'}onclick={overrideSafety}>Adminoverride…</Button><pclass="action-help">{detail.safetyOverrideUnavailableReason??'Confirm to bypass player safety checks for this operation.'}</p></div>{/if}
{#ifdetail.canResumeVerification}<Buttonvariant="primary"loading={view.busy==='resume'}disabled={!!view.busy}onclick={()=>controller.act('resume','Health verification requested. An unhealthy container may continue through this operation’s remaining recovery steps.')}>Resumehealthverification</Button>{/if}
{#ifdetail.canResumeVerification}<Buttonvariant="primary"loading={view.busy==='resume'}disabled={!!view.busy}onclick={()=>controller.act('resume','Health verification requested. An unhealthy container may continue through this operation’s remaining recovery steps.')}>Resumehealthverification</Button>{/if}
{#ifdetail.canRetryWithRebuild}<div><Buttonvariant="primary"loading={view.busy==='retry-rebuild'}disabled={!!view.busy}onclick={retryWithRebuild}>Retrywithrebuild</Button><pclass="action-help">Starts a new rebuild for the same lobby and port. Deletes instance files and uses the latest promoted setup.</p></div>{/if}
{#ifdetail.canResumeRebuild}<Buttonvariant="primary"loading={view.busy==='resume'}disabled={!!view.busy}onclick={()=>controller.act('resume','Rebuild cleanup requested. Fresh creation waits for local cleanup to finish.')}>Resumerebuildcleanup</Button>{/if}
{#ifdetail.canResumeRebuild}<Buttonvariant="primary"loading={view.busy==='resume'}disabled={!!view.busy}onclick={()=>controller.act('resume','Rebuild cleanup requested. Fresh creation waits for local cleanup to finish.')}>Resumerebuildcleanup</Button>{/if}
{#ifdetail.canResumeCleanup}<Buttonvariant="primary"loading={view.busy==='resume'}disabled={!!view.busy}onclick={()=>controller.act('resume','Local cleanup requested. Remote container deletion will not be repeated.')}>Resumecleanup</Button>{/if}
{#ifdetail.canResumeCleanup}<Buttonvariant="primary"loading={view.busy==='resume'}disabled={!!view.busy}onclick={()=>controller.act('resume','Local cleanup requested. Remote container deletion will not be repeated.')}>Resumecleanup</Button>{/if}
{#ifdetail.canCancel}<div><Buttondisabled={!!view.busy}loading={view.busy==='cancel'}onclick={()=>controller.act('cancel','Operation cancelled. Already-submitted commands may finish; no further steps will be started.')}>Canceloperation</Button><pclass="action-help">Stops remaining work and health checks. Changes already made are not undone.</p></div>{/if}
{#ifdetail.canCancelCreation}<div><Buttonvariant="danger"disabled={!!view.busy}loading={view.busy==='cancel-creation'}onclick={()=>controller.act('cancel-creation','Creation cancelled. Follow cleanup below until removal is confirmed.')}>Cancelcreationandremoveserver</Button><pclass="action-help">Stops this launch and deletes its container and instance files, even if player status is unknown or players have joined. Shared game files are kept. The key returns to its game pool after removal is confirmed.</p></div>{/if}
{#ifdetail.progress?.recovery}<divclass="recovery-note"><strong>{detail.progress.recovery.state==='held'?'Recovery remains in progress':detail.progress.recovery.state==='released'?'Recovery capacity released':detail.progress.recovery.state==='transferred'?'Recovery transferred':'Recovery state not confirmed'}</strong><p>{detail.progress.recovery.message}</p><span>Recorded {@renderdateTime(detail.progress.recovery.at)}</span>{#ifdetail.progress.recovery.operationId&&detail.progress.recovery.operationId!==deployment.id}<ahref={`/provisioning/${encodeURIComponent(detail.progress.recovery.operationId)}`}>Viewrecoveryoperation→</a>{/if}</div>{/if}
{#ifdetail.progress?.recovery}<divclass="recovery-note"><strong>{detail.progress.recovery.state==='held'?'Recovery remains in progress':detail.progress.recovery.state==='released'?'Recovery capacity released':detail.progress.recovery.state==='transferred'?'Recovery transferred':'Recovery state not confirmed'}</strong><p>{detail.progress.recovery.message}</p><span>Recorded {@renderdateTime(detail.progress.recovery.at)}</span>{#ifdetail.progress.recovery.operationId&&detail.progress.recovery.operationId!==deployment.id}<ahref={`/provisioning/${encodeURIComponent(detail.progress.recovery.operationId)}`}>Viewrecoveryoperation→</a>{/if}</div>{/if}
{#each detail.workerActivity as work (work.key)}<li><strong>{work.label}</strong><span>{elapsedTime(work.startedAt, Date.parse(detail.generatedAt))}</span></li>{/each}
{#each detail.workerActivity as work (work.key)}<li><strong>{work.label}</strong><span>{elapsedTime(work.startedAt, Date.parse(detail.generatedAt))}</span></li>{/each}
</ul>{:else}<p>Waiting for the next provisioning pass.</p>{/if}
</ul>{:else}<p>Waiting for the next provisioning pass.</p>{/if}
</div></Card>
</div></Card>
{/if}
{/if}
{#if detail.sources.length || detail.collection}<Card as="section" padding="md" ariaLabel="Related work"><div class="context-section"><h2>Related work</h2><p>The requesting work may have further checks after this operation finishes.</p><ul class="related">
{#each detail.sources as source (`${source.kind}:${source.source_id}`)}<li>{#if source.href}<a href={source.href}>{source.label}</a>{:else}<strong>{source.label}</strong><span>Source record no longer available</span>{/if}</li>{/each}
{#each detail.sources as source (`${source.kind}:${source.source_id}`)}<li>{#if source.href}<a href={source.href}>{source.label}</a>{:else}<strong>{source.label}</strong><span>Source record no longer available</span>{/if}</li>{/each}
{#each detail.capacity.pools as pool (pool.kind)}<div class="capacity-pool"><div class="capacity-heading"><strong>{pool.kind === 'startup' ? 'Startup slots' : 'Restart recovery slots'}</strong><span>{pool.used} / {pool.limit} in use</span></div>
{#each detail.capacity.pools as pool (pool.kind)}<div class="capacity-pool"><div class="capacity-heading"><strong>{pool.kind === 'startup' ? 'Startup slots' : 'Restart recovery slots'}</strong><span>{pool.used} / {pool.limit} in use</span></div>
{#if pool.ownsSlot}<p>This operation holds a slot.</p>{/if}
{#if pool.ownsSlot}<p>This operation holds a slot.</p>{/if}
{#if pool.requestOrder !== null}<p>Request order: {pool.requestOrder}. Eligible requests may pass blocked work; this is not a guaranteed start order.</p>{/if}
{#if pool.requestOrder !== null}<p title="Eligible requests may pass blocked work; this is not a guaranteed start order.">Request order: {pool.requestOrder}</p>{/if}
{#if pool.holders.length}<details><summary>Current slot holders</summary><ul>{#each pool.holders as holder}<li>{#if holder.id}<a href={`/provisioning/${encodeURIComponent(holder.id)}`}>{serverTitle(holder.server)}</a>{:else}<span>{serverTitle(holder.server)} · operation not recorded</span>{/if}</li>{/each}</ul></details>{/if}
{#if pool.holders.length}<details><summary>Current slot holders</summary><ul>{#each pool.holders as holder}<li>{#if holder.id}<a href={`/provisioning/${encodeURIComponent(holder.id)}`}>{serverTitle(holder.server)}</a>{:else}<span>{serverTitle(holder.server)} · operation not recorded</span>{/if}</li>{/each}</ul></details>{/if}
{:else}<p>{['create', 'rebuild'].includes(deployment.action) ? 'No launch recipe was recorded for this operation.' : 'This operation uses the existing instance. No new launch files were selected.'}</p>{/if}
{:else}<p>No launch recipe was recorded for this operation.</p>{/if}
it('newer unknown readiness evidence supersedes an old completion checkpoint',()=>{
it('newer unknown readiness evidence supersedes an old completion checkpoint',()=>{
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.