feat/6-file-dialogs
- One dedicated method per purpose: selectTargetFile (save .ti1), selectExistingTarget (ti1/ti2), selectProfileFile (icc/icm/mpp — never ti*, #172), selectSpectrumFile (.sp), selectDatasetFile (open-only ti3/txt/cgats/csv, #211), selectCsvSavePath, selectCalFile, selectDirectory. No shared generic picker API (#103/#210/#211). - Ti2Header: TARGET_INSTRUMENT / NUMBER_OF_SETS / NUMBER_OF_PAGES + sibling .ti1 detection; NUMBER_OF_FIELDS explicitly not patch count - TiffPreview: host-side TIFF→PNG thumbnail, 1200px max edge (#58) - ArtefactFiles: defaultWorkingDirectory, readBase64, appInfo - 7 new tests; 47/47 green Generated with [Devin](https://devin.ai) Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>