Commit Graph
20 Commits
Author SHA1 Message Date
winewill 69207c4629 fix(desktop): harden installer rendering lifecycle and tests 2026-10-19 17:40:55 +08:00
winewill fb1bfd0e69 fix(desktop): smooth Windows installer rendering and caption controls 2026-10-19 16:32:48 +08:00
winewill c7ab529c34 fix(desktop): preserve recovery paths in installer dialogs 2026-10-14 20:11:41 +08:00
winewill 06e5024577 fix(desktop): bound expanded directory failure details 2026-10-14 19:58:21 +08:00
winewill 14819e2eb4 fix(desktop): retry Windows installer directory locks and report failures 2026-10-14 19:08:02 +08:00
winewill 30a7f8f787 Merge branch 'master' into fix/windows-installer-extract-diagnostics 2026-09-22 17:37:28 +08:00
winewill bed4a2b565 fix(desktop): address review of the extraction failure report
- Headline skips the archive path 7-Zip echoes before an open failure
  (also when the path contains spaces) and prefers the operation line.
- Raw process statuses such as 0xC0000005 are kept and printed in hex
  instead of being clamped to INT_MAX.
- The expanded panel excerpts the result and 7-Zip's own lines rather
  than the report header.
- The saved report keeps up to 16 MiB of output, records any cut, and
  trims a partial UTF-8 sequence before decoding.
- The details view no longer reads the UTF-8 log as ANSI; the test seam
  define and the zero-padded GetTime order are documented; the smoke
  asserts a year-first report name and normalizes -FrameLibrary.
- README names the real updater cache directory.
2026-09-22 14:30:56 +08:00
winewill ab62f09c22 fix(desktop): report Windows extraction failures with 7-Zip evidence
The installer showed "Failed to decompress files" and discarded 7-Zip's
error output, so a failure such as security software quarantining an
extracted file could not be told apart from a full disk or a broken
download.

- InstallerExtract returns negated Win32 errors for launch failures so
  they no longer collide with 7-Zip exit codes; 7-Zip writes UTF-8 errors.
- window-frame.dll composes a report (result, archive, destination,
  Windows version, full 7-Zip output), saves it under the updater cache
  directory, and presents a task dialog with the first error line, a
  collapsible bounded excerpt, and a Copy error details button. Silent
  installs keep only the report; a missing task dialog falls back to a
  message box.
- Unsigned Windows builds name their installer *-unsigned.exe so a
  shared file cannot pass for a release artifact; version discovery
  still counts them.
- The directory smoke asserts the saved report on a broken archive and
  smoke-windows.ps1 accepts the prepared DLL.

Refs #4893
2026-09-22 12:38:05 +08:00
winewill bc4e8bafe6 Merge remote-tracking branch 'origin/master' into feat/desktop-update-ui 2026-09-21 17:58:40 +08:00
winewill 0981cd5924 fix(desktop): harden the Windows uninstall data removal after review
Pinned directories are now opened with listing access so the handle takes
part in share checks and a rename or replacement of the directory under the
helper fails; a metadata-only handle did not participate. A DSH_HOME published
as an environment variable protects overlapping targets, and /KEEP_APP_DATA
retains data alongside --updated, matching the flags electron-builder passes
to an older uninstaller. The remover clears read-only attributes, keeps
deleting siblings after a locked file, and removes only ordinary empty scope
parents below %APPDATA% instead of an NSIS RMDir that would also unlink a
junction. The redundant un.DataInit extraction is gone.

The native regression now runs from the installer test driver and covers the
protected root, rename blocking, read-only and locked files and parent
removal; the uninstaller smoke uses a per-run scope, polls for the temp-copy
handoff, asserts InstallLocation after each silent install, and adds
/KEEP_APP_DATA and DSH_HOME-inside cases. The Agent Note keeps the topic's
2026-09-08 filename, states the amendment in the decision, and defers macOS.
2026-09-21 17:01:54 +08:00
winewill 93a65a9a94 feat(desktop): remove Electron data on Windows uninstall without a custom page
Product dropped Harness-home cleanup from the uninstaller, so the opt-in page,
its bilingual dialog, the uninstall.ini home record and the overlap check go
away. The uninstaller now always removes the Electron user-data directory,
the %APPDATA% product directory and the updater cache through the native
helper; the Harness home is never touched. Silent uninstalls remove the same
data, upgrades retain it, and a locked file is logged instead of stopping the
uninstall.

Electron derives user data from the scoped package name, so the removal
targets %APPDATA%\@deepseek-ai\dsh-desktop and removes the empty scope
directory afterwards. The previous fixture used an unscoped name and never
reached that directory; the fixture now uses a scoped package name.

The native uninstall smoke runs end to end on the development host after two
test fixes: the interactive uninstaller was launched hidden, which made every
control invisible to the text search, and the Chinese finish text matched
"已经从" instead of MUI's "已从你". The native remover regression is renamed
data-cleanup-test.exe because UAC installer detection demanded elevation from
the unmanifested uninstall-data-test.exe.
2026-09-21 15:14:44 +08:00
winewill dbbecd2461 feat(desktop): opt-in Windows uninstall data removal
The Windows uninstaller keeps every user file by default and adds a custom
page with unchecked options for desktop browser data and update caches, the
desktop plugin profile, and the complete Harness home. Selecting the whole
home requires a native warning that names the actual folder and the CLI
impact, defaults to Cancel, and forces the desktop child selection. Silent
and upgrade uninstalls never remove data, including through the legacy
--delete-app-data flag, which the adapted upstream template no longer honors.

Packaged Desktop records its resolved home in uninstall.ini under the
Electron user-data directory so a custom DSH_HOME is offered instead of the
default; a length field detects truncated NSIS reads and an invalid record
disables whole-home removal. The native remover in window-frame.dll rejects
protected roots and overlap with retained data, holds directory handles
during traversal, and unlinks reparse points without entering their targets.

Installation now also writes InstallLocation on the Windows uninstall entry,
which Explorer needs to associate the Start menu shortcut with this entry so
that the context-menu Uninstall launches the uninstaller directly instead of
opening the installed-apps list. The upstream template only records the
value under its private key.

Closes #3993
2026-09-21 14:22:39 +08:00
winewill 4df3de2075 fix(desktop): sharpen installer brand art and progress-page scaling
Re-render the four installer brand banners from the vector sources:
the badge follows the Figma spec (three-stop gradients, layered drop
shadows) and the whale no longer inherits shape-rendering=crispEdges,
which disabled anti-aliasing and left jagged edges. The wordmark now
reaches its design color instead of a soft #353638.

Draw the progress-page brand with high-quality bicubic interpolation
and half-pixel offset so the always-2x bitmap stays crisp when scaled
down at 96 DPI.
2026-09-21 12:02:49 +08:00
winewill c624c2eff0 fix(desktop): present installer welcome and package 0.1.6-alpha.1.20260916.2 2026-09-16 19:37:48 +08:00
winewill 4fa238bb5f fix(desktop): track extraction in directory installer 2026-09-11 16:43:51 +08:00
winewill 188f72cd58 fix(desktop): track installer work and complete progress smoothly 2026-09-11 16:23:10 +08:00
winewill 6cc34319e5 fix(desktop): align installer progress with worker stages 2026-09-11 16:23:08 +08:00
winewill 00ca76dd21 fix(desktop): keep installer progress and completion responsive 2026-09-11 16:22:47 +08:00
winewill 9255b08ed3 fix(desktop): preserve installer dependencies and validate keyboard navigation 2026-09-11 16:22:46 +08:00
winewill 52bc79284f feat(desktop): integrate native Windows installer design 2026-09-11 16:22:44 +08:00