(null);
@@ -50,6 +52,7 @@ export function VaultHealthChecklist({ onToast, title }: VaultHealthChecklistPro
try {
const next = await memoryTreeVaultHealthCheck();
setHealth(next);
+ setHostMatch(await resolveVaultHostMatch(next.host_os));
setError(null);
} catch (err) {
const message = err instanceof Error ? err.message : String(err);
@@ -69,6 +72,12 @@ export function VaultHealthChecklist({ onToast, title }: VaultHealthChecklistPro
return health.exists ? health.content_root_abs : dirname(health.content_root_abs);
}, [health]);
+ // #4278: the vault lives on the core host's filesystem. When this frontend
+ // runs on a different OS than the core, the path can't be opened/registered
+ // locally — disable the local-FS actions and explain why instead of firing a
+ // doomed reveal / deep link.
+ const crossHost = hostMatch ? !hostMatch.local : false;
+
const openObsidian = useCallback(() => {
if (!health?.content_root_abs) return;
void (async () => {
@@ -164,19 +173,28 @@ export function VaultHealthChecklist({ onToast, title }: VaultHealthChecklistPro
) : null}
+ {crossHost ? (
+
+ {t('crossHostVault.title')}{' '}
+ {t('crossHostVault.message').replace('{os}', hostMatch?.hostOs ?? '')}
+
+ ) : null}
+