feat: match fleet to blueprint targets exactly

Add an optional exact blueprint mode with keep/create/remove previews, atomic queueing, cancellation of unstarted excess creations, and persistent dependencies for safe port reuse. Track removals alongside creations and preserve fill mode as the default.

Validation: type check, production build, and 103 deployment tests passed. The full suite has one telemetry assertion failure also reproduced on the previous commit.

Fixes #42
This commit is contained in:
2026-09-27 13:36:08 -04:00
parent 1aa7f15371
commit 0b0e5b5bdb
13 changed files with 517 additions and 83 deletions
+8 -1
View File
@@ -32,11 +32,16 @@ export interface BlueprintSummary {
totalServers: number;
}
export type CollectionMode = 'fill' | 'exact';
export interface CollectionPreview {
id: string;
expiresAt: string;
blueprintName: string;
launchConcurrency: number;
mode: CollectionMode;
retainedServers: string[];
removals: { name: string; reason: string }[];
entries: { count: number; existing: number; missing: number; existingServers: string[];
coverage: { name: string; health: string; href: string }[]; recipe: LaunchRecipeSummary }[];
servers: { entryIndex: number; name: string | null; port: number | null; hasSavedKey: boolean }[];
@@ -55,12 +60,14 @@ export interface CollectionSummary {
queued: number;
provisioning: number;
verifying: number;
mode: CollectionMode;
}
export interface CollectionDetail {
collection: CollectionSummary;
retainedServers: string[];
queue: { concurrency: number; active: { id: string; server: string; state: string; stage: string }[]; queued: number };
servers: { id: string; server: string; port: number; map_slug: string; state: string; stage: string;
servers: { id: string; server: string; action: 'create' | 'destroy'; port: number | null; map_slug: string | null; state: string; stage: string;
started_at: string; finished_at: string | null; error: string | null; server_exists: number; queuePosition: number | null }[];
}