9 Commits
Author SHA1 Message Date
weidu12123 3ea4f86d8b Update README.md 2026-10-19 15:25:57 +08:00
weidu12123 19a8aa3c36 docs: highlight Rust + GPUI native architecture in README 2026-10-19 00:43:41 +08:00
weidu12123 e89fd63001 docs: document the macOS downloads in the README 2026-10-18 12:24:58 +08:00
weidu12123 a3e79b97b6 feat: ship GPUI native client and fix SFTP session recovery
- Rebuild the GPUI client against the 1:1 UI spec with all six modules,
  terminal context menu, SSE reveal, system tray and standalone windows.
- Add an SFTP session self-healing layer: detect dead channels, drop the
  cached session, reconnect and retry across every file and transfer path.
- Add a terminal refresh button that recreates the pane in place, with
  proper loading and error feedback in both GPUI and the Web console.
- Route startup and autostart through vps-switch-gpui when it is present,
  and make repeated launches wake the existing window via a file lock.
- Strip debuginfo in release, add a GitHub Actions matrix workflow for
  macOS and Linux, and refresh the Windows installers and README.
2026-10-18 12:09:49 +08:00
weidu12123andClaude Opus 4.8 21e2f6e13d docs: state the desktop memory numbers without overselling them
The table listed "never opened the window" next to "closed to tray" without
saying what separates them, and the closing line claimed the tray state was
where the app spends most of its time -- implying the 5 MB figure applies
there. It does not.

The distinction is whether the WebView was ever created, not whether the window
is currently visible: hiding only drops it to WebView2's low memory level, so
after the first time the window is opened, closing to tray leaves ~180 MB
resident until the process restarts. Only an autostart instance that was never
opened sits at 5 MB.

Also note the cost of going further (destroying the WebView on hide): a reload
on reopen, and the open tabs are lost today because the frontend does not
persist its layout.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-10-16 22:53:46 +08:00
weidu12123andClaude Opus 4.8 4e1aebf26e fix: repair the issues found in the pre-release review
Backend:

- Downloading a file from the local host through the transfer engine always
  failed: the download branch had no LOCAL_HOST_ID case, so it opened SFTP
  against 127.0.0.1:0 (reproduced: "SSH 连接失败: 地址无效 (os error 10049)").
  The file browser's own download button goes through that path, so it was
  broken in the UI too. The local branch now reuses stream_upload_to_host,
  which already had one, keeping the temp-file/resume/SHA-256 guarantees.
- remove_item only refused the literal "/", so a Windows drive root listed by
  the file browser ("此电脑" returns "C:/") could be deleted recursively. New
  is_root_like() also covers drive roots, "." and "..", shared with
  compress_item, plus unit tests.
- dir_cache grew without bound; capped at 256 entries, oldest evicted first.
- ExecTaskManager capped task count but not buffered bytes: 60 running tasks
  could hold 120 MiB. Added a 32 MiB budget that evicts finished tasks only.
- Web sessions were only ever inserted, never expired, and every auth-settings
  save minted another one. Now a token->issued map with a 30-day TTL, pruned on
  every issue.

Frontend:

- A failed pane creation left the stage spinning "正在连接" forever (no retry,
  and the standalone window has no tab bar to escape through). The failure is
  now kept on the tab and rendered as an error with a retry button.
- The transfer-queue poller only cleared its 350 ms interval on success, so a
  401 or a backend restart left it polling ~3 req/s indefinitely.
- The MCP call detail fetch had no sequence guard, so clicking two rows quickly
  showed the wrong call's args and result.
- Only three call sites handled 401. Since the session table lives in memory,
  every daemon restart invalidates all sessions, so with auth enabled this is
  routine rather than an edge case. All protected requests now go through
  apiFetch and return to the login screen.
- check-update read data.message, which the backend never returns (it returns
  error), so failures only ever showed a bare "检查更新失败".

Docs: corrected the Claude Code setup commands (missing --transport http, and
x-vps-switch-key is not a header the server reads), fixed the Setup.exe PATH
claim, added measured memory numbers for both platforms, and added a
build-from-source section -- a clean clone cannot compile, since frontend/dist
is ignored while RustEmbed treats its absence as a hard error.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-10-16 22:34:52 +08:00
weidu12123 fa56ce6ced docs: add multi-OS and heterogeneous environment support section 2026-10-16 13:35:37 +08:00
weidu12123andClaude Opus 4.8 c050677760 docs: rewrite README with feature showcases, screenshots, and setup instructions
- State clear project definition as a lightweight VPS manager and MCP server.
- Add showcase sections for repository, terminal, SFTP/transfer, probe, and MCP audit.
- Include desensitized screenshots in docs/images/.
- Provide download links, Linux deployment commands, and Claude Code setup.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-10-16 12:47:11 +08:00
weidu12123 d2348d0c00 feat: initial commit of vps-switch core modules and desktop frontend 2026-10-13 16:36:22 +08:00