Add universal forge, fusion disguise, remote deploy, and stability fixes.
Ship cross-platform spread kits and fusion ZIPs with per-OS launchers, one-liner dropper endpoints, Windows file disguise, and a large batch of wiring/bug fixes so agents connect reliably across a LAN test fleet.
This commit is contained in:
@@ -6,6 +6,29 @@ import { HelpTip, FieldHint } from '../components/HelpTip';
|
||||
import NeonCard from '../components/NeonCard/NeonCard';
|
||||
import './Pages.css';
|
||||
|
||||
/** Recursively merge `override` into `base`, preserving keys not in `override`. */
|
||||
function deepMerge<T extends object>(base: T, override: Partial<T>): T {
|
||||
const result = { ...base } as T;
|
||||
for (const key in override) {
|
||||
const val = override[key];
|
||||
const baseVal = base[key];
|
||||
if (
|
||||
val !== null &&
|
||||
val !== undefined &&
|
||||
typeof val === 'object' &&
|
||||
!Array.isArray(val) &&
|
||||
typeof baseVal === 'object' &&
|
||||
baseVal !== null &&
|
||||
!Array.isArray(baseVal)
|
||||
) {
|
||||
result[key] = deepMerge(baseVal as object, val as object) as T[typeof key];
|
||||
} else if (val !== undefined) {
|
||||
result[key] = val as T[typeof key];
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
export default function SettingsPage() {
|
||||
const [config, setConfig] = useState<ServerConfig | null>(null);
|
||||
const [serverInfo, setServerInfo] = useState<{ suggested_url: string; local_ips: string[] } | null>(null);
|
||||
@@ -98,7 +121,9 @@ export default function SettingsPage() {
|
||||
reader.onload = (evt) => {
|
||||
try {
|
||||
const data = JSON.parse(evt.target?.result as string);
|
||||
setConfig((prev) => (prev ? { ...prev, ...data } : prev));
|
||||
// Deep-merge so importing a partial config (e.g. only "pool" key) doesn't
|
||||
// wipe unrelated nested sections like "default_agent" or "mining".
|
||||
setConfig((prev) => (prev ? deepMerge(prev, data) : prev));
|
||||
setSaveMessage(`Loaded "${file.name}" — click Save Calibration to apply.`);
|
||||
} catch {
|
||||
setSaveMessage('Invalid JSON file.');
|
||||
|
||||
Reference in New Issue
Block a user