fix(config): enable nomad_micron_wasm in configuration and UI settings

This commit is contained in:
Ivan
2026-05-03 21:10:29 -05:00
parent 56665dd301
commit aeceb30d67
15 changed files with 154 additions and 27 deletions
+11
View File
@@ -13110,6 +13110,15 @@ class ReticulumMeshChat:
self.config.nomad_micron_wasm_enabled.set(
self._parse_bool(data["nomad_micron_wasm_enabled"]),
)
if not self.config.nomad_micron_wasm_enabled.get():
self.config.nomad_micron_default_engine.set("js")
if "nomad_micron_default_engine" in data:
if self.config.nomad_micron_wasm_enabled.get():
raw = str(data["nomad_micron_default_engine"] or "").strip().lower()
self.config.nomad_micron_default_engine.set(
"wasm" if raw == "wasm" else "js"
)
if "nomad_default_page_path" in data:
from meshchatx.src.backend.page_node import is_allowed_page_filename
@@ -14592,6 +14601,8 @@ class ReticulumMeshChat:
"nomad_render_html_enabled": ctx.config.nomad_render_html_enabled.get(),
"nomad_render_plaintext_enabled": ctx.config.nomad_render_plaintext_enabled.get(),
"nomad_micron_wasm_enabled": ctx.config.nomad_micron_wasm_enabled.get(),
"nomad_micron_default_engine": ctx.config.nomad_micron_default_engine.get()
or "js",
"nomad_default_page_path": ctx.config.nomad_default_page_path.get(),
"local_message_auto_delete_enabled": ctx.config.local_message_auto_delete_enabled.get(),
"local_message_auto_delete_value": ctx.config.local_message_auto_delete_value.get(),
+6 -1
View File
@@ -463,7 +463,12 @@ class ConfigManager:
self.nomad_micron_wasm_enabled = self.BoolConfig(
self,
"nomad_micron_wasm_enabled",
False,
True,
)
self.nomad_micron_default_engine = self.StringConfig(
self,
"nomad_micron_default_engine",
"js",
)
self.nomad_default_page_path = self.StringConfig(
self,
@@ -273,21 +273,25 @@ export default {
return isMicronWasmBundled() && (GlobalState.config || {}).nomad_micron_wasm_enabled === true;
},
nomadMicronWasmActive() {
const engineWasm = (GlobalState.config?.nomad_micron_default_engine || "js") === "wasm";
return (
this.nomadMicronWasmFeatureEffective &&
this.nomadMicronWasmReady === true &&
typeof globalThis.micronConvert === "function"
typeof globalThis.micronConvert === "function" &&
engineWasm
);
},
nomadRenderOptions() {
const c = GlobalState.config || {};
const hash = this.viewingArchive?.destination_hash || null;
const engineWasm = (c.nomad_micron_default_engine || "js") === "wasm";
return {
renderMarkdown: c.nomad_render_markdown_enabled !== false,
renderHtml: c.nomad_render_html_enabled !== false,
renderPlaintext: c.nomad_render_plaintext_enabled !== false,
nomadDestinationHash: hash,
nomad_micron_wasm_use: this.nomadMicronWasmFeatureEffective && this.nomadMicronWasmReady === true,
nomad_micron_wasm_use:
this.nomadMicronWasmFeatureEffective && this.nomadMicronWasmReady === true && engineWasm,
};
},
selectedNode() {
@@ -391,6 +395,16 @@ export default {
}
);
this.$watch(
() => GlobalState.config?.nomad_micron_default_engine,
() => {
const a = this.viewingArchive;
if (a) {
this.renderedContent = this.renderFullContent(a);
}
}
);
if (isMicronWasmBundled() && GlobalState.config?.nomad_micron_wasm_enabled === true) {
preloadNomadMicronWasm().then((ok) => {
this.nomadMicronWasmReady = ok === true;
@@ -163,14 +163,15 @@
<button
class="flex-1 rounded px-2 py-1 text-[10px] font-bold transition-colors"
:class="
!GlobalState.config.nomad_micron_wasm_enabled
(GlobalState.config.nomad_micron_default_engine || 'js') === 'js'
? 'bg-blue-600 text-white dark:bg-blue-500'
: 'bg-[var(--mc-surface-hover)] text-[var(--mc-text-secondary)] hover:bg-[var(--mc-border-strong)]'
"
:disabled="!GlobalState.config.nomad_micron_wasm_enabled"
@click.stop="
!GlobalState.config.nomad_micron_wasm_enabled
(GlobalState.config.nomad_micron_default_engine || 'js') === 'js'
? null
: toggleMicronWasm()
: applyNomadMicronDefaultEngine('js')
"
>
JS
@@ -178,12 +179,15 @@
<button
class="flex-1 rounded px-2 py-1 text-[10px] font-bold transition-colors"
:class="
GlobalState.config.nomad_micron_wasm_enabled
(GlobalState.config.nomad_micron_default_engine || 'js') === 'wasm'
? 'bg-blue-600 text-white dark:bg-blue-500'
: 'bg-[var(--mc-surface-hover)] text-[var(--mc-text-secondary)] hover:bg-[var(--mc-border-strong)]'
"
:disabled="!GlobalState.config.nomad_micron_wasm_enabled"
@click.stop="
GlobalState.config.nomad_micron_wasm_enabled ? null : toggleMicronWasm()
(GlobalState.config.nomad_micron_default_engine || 'js') === 'wasm'
? null
: applyNomadMicronDefaultEngine('wasm')
"
>
WASM
@@ -292,14 +296,14 @@
</DropDownMenuItem>
<DropDownMenuItem
v-if="showMicronRendererInMobileMenu"
@click="applyNomadMicronWasmEnabled(false)"
@click="applyNomadMicronDefaultEngine('js')"
>
<MaterialDesignIcon icon-name="language-javascript" class="size-5" />
<span>{{ $t("nomadnet.renderer_menu_js") }}</span>
</DropDownMenuItem>
<DropDownMenuItem
v-if="showMicronRendererInMobileMenu"
@click="applyNomadMicronWasmEnabled(true)"
@click="applyNomadMicronDefaultEngine('wasm')"
>
<MaterialDesignIcon icon-name="memory" class="size-5" />
<span>{{ $t("nomadnet.renderer_menu_wasm") }}</span>
@@ -677,20 +681,24 @@ export default {
return "https://git.quad4.io/Go-Libs/micron-parser-go";
},
nomadMicronWasmActive() {
const engineWasm = (GlobalState.config?.nomad_micron_default_engine || "js") === "wasm";
return (
this.nomadMicronWasmFeatureEffective &&
this.nomadMicronWasmReady === true &&
typeof globalThis.micronConvert === "function"
typeof globalThis.micronConvert === "function" &&
engineWasm
);
},
nomadRenderOptions() {
const c = GlobalState.config || {};
const engineWasm = (c.nomad_micron_default_engine || "js") === "wasm";
return {
renderMarkdown: c.nomad_render_markdown_enabled !== false,
renderHtml: c.nomad_render_html_enabled !== false,
renderPlaintext: c.nomad_render_plaintext_enabled !== false,
nomadDestinationHash: this.selectedNode?.destination_hash || null,
nomad_micron_wasm_use: this.nomadMicronWasmFeatureEffective && this.nomadMicronWasmReady === true,
nomad_micron_wasm_use:
this.nomadMicronWasmFeatureEffective && this.nomadMicronWasmReady === true && engineWasm,
};
},
/**
@@ -726,7 +734,9 @@ export default {
micronGoRelease,
};
}
const wasmPreferred = this.nomadMicronWasmFeatureEffective;
const wasmPreferred =
this.nomadMicronWasmFeatureEffective &&
(GlobalState.config?.nomad_micron_default_engine || "js") === "wasm";
if (wasmPreferred && !this.nomadMicronWasmReady) {
return {
label: this.$t("nomadnet.renderer_chip_micron_js"),
@@ -903,6 +913,19 @@ export default {
}
);
this.$watch(
() => GlobalState.config?.nomad_micron_default_engine,
() => {
if (this.nodePageContent && this.nodePagePath && this.nodePagePath.toLowerCase().endsWith(".mu")) {
const content = this.nodePageContent;
this.nodePageContent = null;
this.$nextTick(() => {
this.nodePageContent = content;
});
}
}
);
if (isMicronWasmBundled() && GlobalState.config?.nomad_micron_wasm_enabled === true) {
preloadNomadMicronWasm().then((ok) => {
this.nomadMicronWasmReady = ok === true;
@@ -973,23 +996,20 @@ export default {
}
return content.startsWith("Failed loading page:");
},
async toggleMicronWasm() {
async applyNomadMicronDefaultEngine(engine) {
if (!isMicronWasmBundled()) {
return;
}
await this.applyNomadMicronWasmEnabled(!GlobalState.config.nomad_micron_wasm_enabled);
},
async applyNomadMicronWasmEnabled(useWasm) {
if (!isMicronWasmBundled()) {
if (!GlobalState.config?.nomad_micron_wasm_enabled) {
return;
}
const newValue = Boolean(useWasm);
if (Boolean(GlobalState.config?.nomad_micron_wasm_enabled) === newValue) {
const next = engine === "wasm" ? "wasm" : "js";
if ((GlobalState.config?.nomad_micron_default_engine || "js") === next) {
return;
}
try {
const next = await patchServerConfig({ nomad_micron_wasm_enabled: newValue }, window.api);
mergeGlobalConfig(next);
const cfg = await patchServerConfig({ nomad_micron_default_engine: next }, window.api);
mergeGlobalConfig(cfg);
if (this.nodePageContent && this.nodePagePath && this.nodePagePath.toLowerCase().endsWith(".mu")) {
const content = this.nodePageContent;
this.nodePageContent = null;
@@ -998,7 +1018,7 @@ export default {
});
}
} catch (e) {
console.error("Failed to update Micron WASM preference", e);
console.error("Failed to update Micron default engine", e);
ToastUtils.error(this.$t("nomadnet.renderer_setting_failed"));
}
},
@@ -901,6 +901,29 @@
</span>
</span>
</label>
<div
v-if="micronWasmBundledInBuild && config.nomad_micron_wasm_enabled"
class="space-y-2 rounded-lg border border-gray-200 bg-gray-50/80 p-3 dark:border-zinc-700 dark:bg-zinc-900/50"
>
<div class="text-sm font-medium text-gray-900 dark:text-gray-100">
{{ $t("settings.nomad_micron_default_engine_title") }}
</div>
<p class="text-xs text-gray-600 dark:text-gray-400">
{{ $t("settings.nomad_micron_default_engine_desc") }}
</p>
<select
:value="config.nomad_micron_default_engine === 'wasm' ? 'wasm' : 'js'"
class="input-field max-w-xl"
@change="onNomadMicronDefaultEngineSelect($event)"
>
<option value="js">
{{ $t("settings.nomad_micron_default_engine_option_js") }}
</option>
<option value="wasm">
{{ $t("settings.nomad_micron_default_engine_option_wasm") }}
</option>
</select>
</div>
<div v-if="micronWasmBundledInBuild" class="mt-2">
<button
type="button"
@@ -2619,7 +2642,8 @@ export default {
nomad_render_markdown_enabled: true,
nomad_render_html_enabled: true,
nomad_render_plaintext_enabled: true,
nomad_micron_wasm_enabled: false,
nomad_micron_wasm_enabled: true,
nomad_micron_default_engine: "js",
nomad_default_page_path: "/page/index.mu",
local_message_auto_delete_enabled: false,
local_message_auto_delete_value: 30,
@@ -2773,6 +2797,8 @@ export default {
"index.mu",
"index.html",
"default page",
"settings.nomad_micron_default_engine_title",
"settings.nomad_micron_default_engine_desc",
],
crawler: ["Discovery", "Smart Crawler", "crawler", "crawl", "retries", "delay", "concurrent"],
csp: [
@@ -3605,6 +3631,23 @@ export default {
console.log(e);
}
},
async onNomadMicronDefaultEngineSelect(ev) {
const v = ev.target.value === "wasm" ? "wasm" : "js";
const prev = this.config.nomad_micron_default_engine === "wasm" ? "wasm" : "js";
if (v === prev) {
return;
}
try {
const newConfig = await patchServerConfig({ nomad_micron_default_engine: v }, window.api);
this.config = newConfig;
normalizeConfigColors(this.config);
this.syncLxmfTransferLimitInputs();
} catch (e) {
ev.target.value = prev;
ToastUtils.error(this.$t("common.save_failed"));
console.log(e);
}
},
onMicronWasmOverrideSaved() {},
async onNomadDefaultPagePathChange() {
await this.updateConfig(
+2 -1
View File
@@ -24,7 +24,8 @@ const globalState = reactive({
nomad_render_markdown_enabled: true,
nomad_render_html_enabled: true,
nomad_render_plaintext_enabled: true,
nomad_micron_wasm_enabled: false,
nomad_micron_wasm_enabled: true,
nomad_micron_default_engine: "js",
nomad_default_page_path: "/page/index.mu",
ui_transparency: 0,
ui_glass_enabled: true,
+4
View File
@@ -2571,6 +2571,10 @@
"nomad_micron_wasm_desc_before_link": "Optional WASM renderer (",
"nomad_micron_wasm_link_label": "micron-parser-go",
"nomad_micron_wasm_desc_after_link": ") für Nomad Network-Seiten. Wenn ausgeschaltet oder nicht unterstützt, wird die Standardversion verwendet.",
"nomad_micron_default_engine_title": "Standard-Micron-Renderer (.mu)",
"nomad_micron_default_engine_desc": "JavaScript ist die Voreinstellung. WebAssembly nutzt micron-parser-go, wenn die obige Option aktiv ist und das Modul geladen wurde.",
"nomad_micron_default_engine_option_js": "JavaScript (micron-parser)",
"nomad_micron_default_engine_option_wasm": "WebAssembly (micron-parser-go)",
"micron_wasm_update_open_btn": "WASM-Engine aktualisieren…",
"micron_wasm_update_modal_title": "Micron-WASM-Engine",
"micron_wasm_update_active_label": "Aktive Überschreibung",
+5 -1
View File
@@ -1348,7 +1348,11 @@
"nomad_micron_wasm_title": "Micron (WASM)",
"nomad_micron_wasm_desc_before_link": "Use a faster engine (",
"nomad_micron_wasm_link_label": "micron-parser-go",
"nomad_micron_wasm_desc_after_link": ") for Nomad Network pages. If turned off or unsupported, it falls back to the standard version.",
"nomad_micron_wasm_desc_after_link": "). When on, the WebAssembly build can load and be updated in settings. When off, Micron uses JavaScript only. Pick the default renderer below; you can still switch from the Nomad browser toolbar.",
"nomad_micron_default_engine_title": "Default Micron renderer (.mu)",
"nomad_micron_default_engine_desc": "JavaScript is the default. WebAssembly uses micron-parser-go when the engine above is enabled and the module has loaded.",
"nomad_micron_default_engine_option_js": "JavaScript (micron-parser)",
"nomad_micron_default_engine_option_wasm": "WebAssembly (micron-parser-go)",
"micron_wasm_update_open_btn": "Update WASM engine…",
"micron_wasm_update_modal_title": "Micron WASM engine",
"micron_wasm_update_active_label": "Active override",
+4
View File
@@ -1349,6 +1349,10 @@
"nomad_micron_wasm_desc_before_link": "Optional WASM renderer (",
"nomad_micron_wasm_link_label": "micron-parser-go",
"nomad_micron_wasm_desc_after_link": "): faster when supported; falls back to bundled JS. Off keeps JS only.",
"nomad_micron_default_engine_title": "Default Micron renderer (.mu)",
"nomad_micron_default_engine_desc": "JavaScript is the default. WebAssembly uses micron-parser-go when the engine above is enabled and the module has loaded.",
"nomad_micron_default_engine_option_js": "JavaScript (micron-parser)",
"nomad_micron_default_engine_option_wasm": "WebAssembly (micron-parser-go)",
"micron_wasm_update_open_btn": "Actualizar motor WASM…",
"micron_wasm_update_modal_title": "Motor Micron WASM",
"micron_wasm_update_active_label": "Anulación activa",
+4
View File
@@ -1349,6 +1349,10 @@
"nomad_micron_wasm_desc_before_link": "Optional WASM renderer (",
"nomad_micron_wasm_link_label": "micron-parser-go",
"nomad_micron_wasm_desc_after_link": "): faster when supported; falls back to bundled JS. Off keeps JS only.",
"nomad_micron_default_engine_title": "Default Micron renderer (.mu)",
"nomad_micron_default_engine_desc": "JavaScript is the default. WebAssembly uses micron-parser-go when the engine above is enabled and the module has loaded.",
"nomad_micron_default_engine_option_js": "JavaScript (micron-parser)",
"nomad_micron_default_engine_option_wasm": "WebAssembly (micron-parser-go)",
"micron_wasm_update_open_btn": "Mettre à jour le moteur WASM…",
"micron_wasm_update_modal_title": "Moteur Micron WASM",
"micron_wasm_update_active_label": "Remplacement actif",
+4
View File
@@ -1401,6 +1401,10 @@
"nomad_micron_wasm_desc_before_link": "Optional WASM renderer (",
"nomad_micron_wasm_link_label": "micron-parser-go",
"nomad_micron_wasm_desc_after_link": ") per le pagine Nomad Network. Se disattivata o non supportata, viene usata la versione standard.",
"nomad_micron_default_engine_title": "Motore Micron predefinito (.mu)",
"nomad_micron_default_engine_desc": "JavaScript è il predefinito. WebAssembly usa micron-parser-go quando il motore sopra è attivo e il modulo è caricato.",
"nomad_micron_default_engine_option_js": "JavaScript (micron-parser)",
"nomad_micron_default_engine_option_wasm": "WebAssembly (micron-parser-go)",
"micron_wasm_update_open_btn": "Aggiorna motore WASM…",
"micron_wasm_update_modal_title": "Motore Micron WASM",
"micron_wasm_update_active_label": "Sostituzione attiva",
+4
View File
@@ -1349,6 +1349,10 @@
"nomad_micron_wasm_desc_before_link": "Optional WASM renderer (",
"nomad_micron_wasm_link_label": "micron-parser-go",
"nomad_micron_wasm_desc_after_link": ") voor Nomad Network-pagina's. Als dit is uitgeschakeld of niet wordt ondersteund, wordt de standaardversie gebruikt.",
"nomad_micron_default_engine_title": "Standaard Micron-renderer (.mu)",
"nomad_micron_default_engine_desc": "JavaScript is de standaard. WebAssembly gebruikt micron-parser-go wanneer de engine hierboven aan staat en de module geladen is.",
"nomad_micron_default_engine_option_js": "JavaScript (micron-parser)",
"nomad_micron_default_engine_option_wasm": "WebAssembly (micron-parser-go)",
"micron_wasm_update_open_btn": "WASM-engine bijwerken…",
"micron_wasm_update_modal_title": "Micron WASM-engine",
"micron_wasm_update_active_label": "Actieve overschrijving",
+4
View File
@@ -2571,6 +2571,10 @@
"nomad_micron_wasm_desc_before_link": "Optional WASM renderer (",
"nomad_micron_wasm_link_label": "micron-parser-go",
"nomad_micron_wasm_desc_after_link": ") для страниц Nomad Network. Если выключено или не поддерживается, используется стандартная версия.",
"nomad_micron_default_engine_title": "Рендерер Micron по умолчанию (.mu)",
"nomad_micron_default_engine_desc": "По умолчанию используется JavaScript. WebAssembly (micron-parser-go) — если включён движок выше и модуль загружен.",
"nomad_micron_default_engine_option_js": "JavaScript (micron-parser)",
"nomad_micron_default_engine_option_wasm": "WebAssembly (micron-parser-go)",
"micron_wasm_update_open_btn": "Обновить движок WASM…",
"micron_wasm_update_modal_title": "Движок Micron WASM",
"micron_wasm_update_active_label": "Активное переопределение",
+4
View File
@@ -1349,6 +1349,10 @@
"nomad_micron_wasm_desc_before_link": "Optional WASM renderer (",
"nomad_micron_wasm_link_label": "micron-parser-go",
"nomad_micron_wasm_desc_after_link": "): faster when supported; falls back to bundled JS. Off keeps JS only.",
"nomad_micron_default_engine_title": "Default Micron renderer (.mu)",
"nomad_micron_default_engine_desc": "JavaScript is the default. WebAssembly uses micron-parser-go when the engine above is enabled and the module has loaded.",
"nomad_micron_default_engine_option_js": "JavaScript (micron-parser)",
"nomad_micron_default_engine_option_wasm": "WebAssembly (micron-parser-go)",
"micron_wasm_update_open_btn": "更新 WASM 引擎…",
"micron_wasm_update_modal_title": "Micron WASM 引擎",
"micron_wasm_update_active_label": "当前覆盖",
@@ -123,7 +123,8 @@ export function buildFullServerConfig(overrides = {}) {
nomad_render_markdown_enabled: true,
nomad_render_html_enabled: true,
nomad_render_plaintext_enabled: true,
nomad_micron_wasm_enabled: false,
nomad_micron_wasm_enabled: true,
nomad_micron_default_engine: "js",
nomad_default_page_path: "/page/index.mu",
gitea_base_url: "https://git.quad4.io",
...overrides,