Files
AetherForge/server/web/src/help/forgeMissionWizard.ts

101 lines
2.8 KiB
TypeScript

import type { OperationModeId } from './forgeOperationModes';
import type { SpreadProfileId } from './spreadProfiles';
export const MISSION_WIZARD_STEPS = ['mode', 'profile', 'launch'] as const;
export type MissionWizardStep = (typeof MISSION_WIZARD_STEPS)[number];
export const MISSION_WIZARD_STEP_LABELS: Record<MissionWizardStep, string> = {
mode: 'Mode',
profile: 'Profile',
launch: 'Launch',
};
export type MissionOperationChip = 'ghost' | 'loud' | 'spread' | 'avsafe';
export interface MissionOperationChipDef {
id: MissionOperationChip;
label: string;
color: string;
modeId: OperationModeId;
blurb: string;
}
export const MISSION_OPERATION_CHIPS: MissionOperationChipDef[] = [
{
id: 'ghost',
label: 'Ghost',
color: '#6b8cff',
modeId: 'ghost_walk',
blurb: 'Stealth on, hidden display, garble — minimal LAN footprint',
},
{
id: 'loud',
label: 'Loud',
color: '#ff5c5c',
modeId: 'open_flame',
blurb: 'Visible console, logging on — lab testing and debugging',
},
{
id: 'spread',
label: 'Spread',
color: '#ff8c3a',
modeId: 'wildfire',
blurb: 'Universal spread kit + LAN/USB autospread — seed the fleet',
},
{
id: 'avsafe',
label: 'AV-Safe',
color: '#22d3a8',
modeId: 'av_safe',
blurb: 'In-process XMR only — no GPU exe download, no spread/hollow',
},
];
export function operationModeForChip(chip: MissionOperationChip): OperationModeId {
return MISSION_OPERATION_CHIPS.find((c) => c.id === chip)?.modeId ?? 'ghost_walk';
}
export function missionChipForMode(mode: OperationModeId): MissionOperationChip {
if (mode === 'av_safe') return 'avsafe';
if (mode === 'open_flame') return 'loud';
if (mode === 'wildfire' || mode === 'crucible_storm') return 'spread';
return 'ghost';
}
export function wizardStepIndex(step: MissionWizardStep): number {
return MISSION_WIZARD_STEPS.indexOf(step);
}
export function nextWizardStep(step: MissionWizardStep): MissionWizardStep | null {
const idx = wizardStepIndex(step);
if (idx < 0 || idx >= MISSION_WIZARD_STEPS.length - 1) return null;
return MISSION_WIZARD_STEPS[idx + 1];
}
export function prevWizardStep(step: MissionWizardStep): MissionWizardStep | null {
const idx = wizardStepIndex(step);
if (idx <= 0) return null;
return MISSION_WIZARD_STEPS[idx - 1];
}
export function canAdvanceWizardStep(
step: MissionWizardStep,
chip: MissionOperationChip,
_spreadProfile: SpreadProfileId | '',
): boolean {
if (step === 'mode') return !!chip;
if (step === 'profile') return true;
return false;
}
export function wizardPillStatus(
pill: MissionWizardStep,
current: MissionWizardStep,
): 'pending' | 'active' | 'done' {
const pillIdx = wizardStepIndex(pill);
const curIdx = wizardStepIndex(current);
if (pillIdx < curIdx) return 'done';
if (pillIdx === curIdx) return 'active';
return 'pending';
}