Commit Graph

61 Commits

Author SHA1 Message Date
Vantz Stockwell
bce77e0932 feat: wire SFTP CWD following — listen for OSC 7 events + inject shell hook
All checks were successful
Build & Sign Wraith / Build Windows + Sign (push) Successful in 1m2s
Two missing halves of CWD tracking:

1. Frontend: useSftp now listens for ssh:cwd:{sessionId} Wails events
   and calls navigateTo() when followTerminal is enabled (default: on).

2. Backend: re-added shell integration injection with stty -echo to
   suppress visible command output. Leading space keeps it out of
   shell history. Handles both bash (PROMPT_COMMAND) and zsh (precmd).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-17 14:00:24 -04:00
Vantz Stockwell
c953659852 fix: CI release tag_name must include v prefix to match git tag
Release was created with tag_name "0.8.1" but the git tag is "v0.8.1".
This caused an orphan release that /releases/latest couldn't find via
the real tag. Now uses "v${VERSION}" so the Release references the
actual pushed tag.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-17 13:56:21 -04:00
Vantz Stockwell
ea53ca42f0 fix: wire Settings update button — was a console.log stub
All checks were successful
Build & Sign Wraith / Build Windows + Sign (push) Successful in 1m5s
The "click to download" button in Settings > About only logged to
console. Now calls DownloadUpdate + ApplyUpdate via Wails bindings,
matching the working flow in StatusBar.vue. Added "downloading" state
with spinner.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-17 13:54:43 -04:00
Vantz Stockwell
c31563c8c6 fix: remove shell integration injection — echoes visibly in terminal
All checks were successful
Build & Sign Wraith / Build Windows + Sign (push) Successful in 1m1s
The CWD tracking PROMPT_COMMAND/precmd injection wrote raw escape
sequences to stdin that echoed back to the user. Removed until we
have a non-echoing mechanism (e.g., second SSH channel or .bashrc
modification). CWD tracking still works passively for shells that
already emit OSC 7 sequences.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-17 13:50:10 -04:00
Vantz Stockwell
6729eb5b80 feat: wire 4 backend services — host key verification, CWD tracking, session manager, workspace restore
U-1: Replace ssh.InsecureIgnoreHostKey() with TOFU (Trust On First Use) host
key verification via HostKeyStore. New keys auto-store, matching keys accept
silently, CHANGED keys reject with MITM warning. Added DeleteHostKey() for
legitimate re-key scenarios.

U-2: Wire CWDTracker per SSH session. readLoop() now processes OSC 7 escape
sequences, strips them from terminal output, and emits ssh:cwd:{sessionID}
Wails events on directory changes. Shell integration commands (bash/zsh
PROMPT_COMMAND) injected after connection.

U-3: Session manager now tracks all SSH and RDP sessions via CreateWithID()
which accepts the service-level UUID instead of generating a new one.
ConnectSSH, ConnectSSHWithPassword, ConnectRDP register sessions;
DisconnectSession and RDPDisconnect remove them. ConnectedAt timestamp set.

U-4: WorkspaceService instantiated in New(), clean shutdown flag managed on
startup/exit, workspace state auto-saved on every session open/close.
Frontend-facing proxy methods exposed: SaveWorkspace, LoadWorkspace,
MarkCleanShutdown, WasCleanShutdown, GetSessionCWD.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-17 13:41:58 -04:00
Vantz Stockwell
a6db3ddfa4 feat: fix 6 frontend issues (F-1, F-5, F-6, F-7, F-10, F-11)
F-1 (Theme Application): Theme selection now applies to all active xterm.js
terminals at runtime via session store reactive propagation. TerminalView
watches sessionStore.activeTheme and calls terminal.options.theme = {...}.

F-5 (Tab Badges): isRootUser() now checks session.username, connection
options JSON, and connection tags — no longer hardcoded to false.

F-6 (Keyboard Shortcuts): Added Ctrl+W (close tab), Ctrl+Tab / Ctrl+Shift+Tab
(next/prev tab), Ctrl+1–9 (tab by index), Ctrl+B (toggle sidebar). Input
field guard prevents shortcuts from firing while typing.

F-7 (Status Bar Dimensions): StatusBar now reads live cols×rows from
sessionStore.activeDimensions. TerminalView hooks onResize to call
sessionStore.setTerminalDimensions(). Falls back to "120×40" until first resize.

F-10 (Multiple Sessions): Removed the "already connected" early-return guard.
Multiple SSH/RDP sessions to the same host are now allowed. Disambiguated tab
names auto-generated: "Asgard", "Asgard (2)", "Asgard (3)", etc.

F-11 (First-Run MobaConf): onMounted checks connectionStore.connections.length
after loadAll(). If empty, shows a dialog offering to import from MobaXTerm.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-17 13:41:28 -04:00
Vantz Stockwell
9d19147568 chore: remove unused deps, add connection_history migration, wire plugin registry
- Remove naive-ui and @xterm/addon-webgl from frontend deps — neither is
  imported anywhere in frontend/src; the entire UI is hand-rolled Tailwind
  and the terminal uses only FitAddon/SearchAddon/WebLinksAddon (22 packages
  removed, 0 vulnerabilities)
- Add 003_connection_history.sql migration — CREATE TABLE IF NOT EXISTS so
  it is safe and idempotent on existing databases; tracks per-connection
  session duration for frequency/history analytics
- Wire MobaConfImporter into the plugin registry in app.New() so the
  registry is no longer empty at runtime; ImportMobaConf continues to call
  the importer directly (GetImporter key is "MobaXTerm", not "mobaconf")

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-17 13:39:44 -04:00
Vantz Stockwell
68e3e38d75 feat(sftp): wire toolbar buttons and live transfer progress panel
- S-1 Upload: hidden file input, FileReader reads as text, calls SFTP.WriteFile, refreshes listing
- S-2 Download: calls SFTP.ReadFile, creates Blob, triggers browser download via temporary <a> element
- S-3 Delete: confirm() dialog, calls SFTP.Delete, clears selection, refreshes listing
- S-4 New Folder: prompt() dialog, calls SFTP.Mkdir with full path, refreshes listing
- S-5 Transfer Progress: new useTransfers composable (module-level singleton) tracks active
  transfers; TransferProgress consumes it directly — no prop threading required
- Added single-click selection state to file entries; download/delete buttons dim when no
  valid selection exists

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-17 13:39:28 -04:00
Vantz Stockwell
2ae628c858 feat: MobaXTerm-style clipboard — select to copy, right-click to paste
All checks were successful
Build & Sign Wraith / Build Windows + Sign (push) Successful in 1m3s
Highlight text auto-copies to clipboard via onSelectionChange. Right-click
on terminal pastes from clipboard by writing to SSH stdin. Disables
xterm.js default right-click word-select behavior.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-17 13:32:57 -04:00
Vantz Stockwell
b7742b0247 docs: fired XO audit — spec vs reality gap analysis
Full codebase audit against the 983-line design spec. Documents what
works, what's implemented but unwired, what's missing, bugs found and
fixed, unused dependencies, and recommended priority fix order.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-17 13:26:03 -04:00
Vantz Stockwell
05776b7eb6 fix: streaming UTF-8 decoder + rAF write batching for terminal performance
All checks were successful
Build & Sign Wraith / Build Windows + Sign (push) Successful in 1m6s
Three fixes:

1. Streaming TextDecoder: a single TextDecoder instance with {stream: true}
   persists across events. Split multi-byte UTF-8 sequences at Go read()
   boundaries are now buffered and decoded correctly across chunks.

2. requestAnimationFrame batching: incoming SSH data is accumulated and
   flushed to xterm.js once per frame instead of on every Wails event.
   Eliminates the laggy typewriter effect when output arrives in small
   chunks (which is normal for SSH PTY output).

3. PTY baud rate: bumped TTY_OP_ISPEED/OSPEED from 14400 (modem speed)
   to 115200. Some remote PTYs throttle output to match the declared rate.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-17 13:22:50 -04:00
Vantz Stockwell
9fce0b6c1e fix: UTF-8 terminal rendering — atob() decodes as Latin-1, not UTF-8
All checks were successful
Build & Sign Wraith / Build Windows + Sign (push) Successful in 1m5s
atob() returns a "binary string" where each byte is a Latin-1 char code.
Multi-byte UTF-8 sequences (box-drawing, em dashes, arrows) were split
into separate Latin-1 codepoints, producing mojibake. Now reconstructs
the raw byte array and decodes via TextDecoder('utf-8') before writing
to xterm.js.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-17 13:00:29 -04:00
Vantz Stockwell
1d61b1faf2 refactor: remove Claude AI copilot panel — will be replaced with embedded terminal
All checks were successful
Build & Sign Wraith / Build Windows + Sign (push) Successful in 1m10s
Gutted the copilot panel, OAuth integration, and AI service registration.
The copilot component files are left in place for future reference but
disconnected from the UI. The replacement will be an embedded local
terminal running `claude` with MCP tools for Wraith session access.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-17 12:58:31 -04:00
Vantz Stockwell
e1517daf9a fix: updater download — pass full UpdateInfo object, not just version string
All checks were successful
Build & Sign Wraith / Build Windows + Sign (push) Successful in 1m4s
DownloadUpdate expects *UpdateInfo (with downloadUrl), not a version string.
Frontend was passing latestVersion which caused a silent deserialization failure.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-17 12:51:18 -04:00
Vantz Stockwell
e916d5942b feat: "Use Claude Code Token" button — imports credentials.json as OAuth fallback
All checks were successful
Build & Sign Wraith / Build Windows + Sign (push) Successful in 1m5s
Reads %USERPROFILE%\.claude\.credentials.json (or ~/.claude/.credentials.json),
extracts the access and refresh tokens, stores them encrypted in Wraith's vault.
Works when Wraith's own OAuth exchange fails. If Claude Code is authenticated
on the same machine, Wraith piggybacks on the existing token.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-17 12:48:30 -04:00
Vantz Stockwell
9e1b8d7b61 fix: match Claude Code's OAuth params exactly — add code=true and full scopes
All checks were successful
Build & Sign Wraith / Build Windows + Sign (push) Successful in 1m3s
Claude Code sends code=true param and requests all 5 scopes:
org:create_api_key user:profile user:inference user:sessions:claude_code
user:mcp_servers. Wraith was only requesting user:inference and missing
the code=true flag, which likely caused the token exchange rejection.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-17 12:38:35 -04:00
Vantz Stockwell
4d198e9014 fix: create Gitea Release in CI + updater uses releases/latest API
All checks were successful
Build & Sign Wraith / Build Windows + Sign (push) Successful in 1m3s
CI now creates a proper Gitea Release after uploading packages. The
updater queries /api/v1/repos/{owner}/{repo}/releases/latest which
requires a Release object (not just a tag). Previous tags won't have
releases — the updater will start working from this build forward.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-17 12:30:45 -04:00
Vantz Stockwell
4af90bb80d fix: switch updater from packages API to releases API for version check
All checks were successful
Build & Sign Wraith / Build Windows + Sign (push) Successful in 1m5s
Gitea's generic package list endpoint wasn't returning 200. Switched to
/api/v1/repos/{owner}/{repo}/releases/latest which is the standard
Gitea releases API. Download URLs still use the packages registry.
Repo is now public — no auth token needed for version checks.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-17 12:26:31 -04:00
Vantz Stockwell
8b0289d133 fix: updater API URL — remove /v1/ prefix, Gitea uses /api/packages/ not /api/v1/packages/
All checks were successful
Build & Sign Wraith / Build Windows + Sign (push) Successful in 1m6s
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-17 12:22:24 -04:00
Vantz Stockwell
c782fcc2c3 fix: add updater API response logging to diagnose update check failures
All checks were successful
Build & Sign Wraith / Build Windows + Sign (push) Successful in 1m3s
Logs the raw API response body and status from Gitea package API,
plus parsed version count and current version comparison. This will
show exactly why updates aren't being detected.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-17 12:18:31 -04:00
Vantz Stockwell
af629fa373 fix: add username field to SSH key credential form — was missing entirely
All checks were successful
Build & Sign Wraith / Build Windows + Sign (push) Successful in 1m3s
Root cause of pubkey auth failure: SSH key credentials had no username,
so ConnectSSH defaulted to "root" and the server rejected the key.
The SSH key form in ConnectionEditDialog only had Name, PEM, Passphrase.
Added Username field between Name and PEM.

Delete your existing SSH key credentials and re-create them with the
correct username.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-17 12:15:08 -04:00
Vantz Stockwell
ddd214d6d8 feat: add file logging to %APPDATA%\Wraith\wraith.log for headless debugging
All checks were successful
Build & Sign Wraith / Build Windows + Sign (push) Successful in 1m5s
slog now writes to wraith.log instead of stdout. Debug-level logging enabled.
ConnectSSH and UpdateConnection log credential resolution details. This lets
us diagnose the pubkey auth issue without needing a console window.

Check: %APPDATA%\Wraith\wraith.log after attempting a connection.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-17 12:09:56 -04:00
Vantz Stockwell
9338fef0c2 fix: auto-switch sidebar to SFTP on SSH connect + credential debug logging
All checks were successful
Build & Sign Wraith / Build Windows + Sign (push) Successful in 1m4s
Sidebar automatically switches from Connections to SFTP tab when an SSH
session becomes active. Added slog debug output to ConnectSSH showing
credentialID, vault state, and loaded credential details to diagnose
pubkey auth failures.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-17 11:54:21 -04:00
Vantz Stockwell
999f8f0539 fix: OAuth token exchange — try JSON then form-encoded, show actual error in browser
All checks were successful
Build & Sign Wraith / Build Windows + Sign (push) Successful in 1m2s
The callback page now shows the real error message instead of a generic
"Failed to exchange" message. Token exchange tries JSON Content-Type first
(matching Claude Code's pattern) with form-encoded fallback. Full response
body logged for debugging.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-17 11:48:54 -04:00
Vantz Stockwell
8362a50460 fix: SSH terminal [Object Object] — Wails v3 Events.On receives event object, not raw data
All checks were successful
Build & Sign Wraith / Build Windows + Sign (push) Successful in 1m6s
Events.On callback gets a CustomEvent with .data property, not the base64
string directly. Added multi-format extraction with debug logging for
unexpected shapes.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-17 11:46:00 -04:00
Vantz Stockwell
16d105e1fb fix: add credential delete button + fix OAuth token exchange error display
All checks were successful
Build & Sign Wraith / Build Windows + Sign (push) Successful in 1m4s
Delete button appears next to credential dropdown when a credential is
selected. Confirms before deleting, refreshes list after.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-17 11:42:27 -04:00
Vantz Stockwell
901d9c257d fix: SSH key double-base64 encoding — PEM was corrupted during storage
All checks were successful
Build & Sign Wraith / Build Windows + Sign (push) Successful in 1m3s
Root cause: frontend btoa() encoded the PEM before sending to Go []byte
parameter. Wails already base64-encodes []byte over JSON bridge, so the
vault stored base64(base64(pem)) — garbage. Fix: Go method now accepts
string, frontend sends raw PEM. Keys must be re-added after this update.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-17 11:39:24 -04:00
Vantz Stockwell
163af456b4 fix: SSH password prompt on auth failure, version from Go backend, visible errors
All checks were successful
Build & Sign Wraith / Build Windows + Sign (push) Successful in 1m5s
- ConnectSSH returns NO_CREDENTIALS error when no credential is stored
- Frontend catches auth failures and prompts for username/password
- ConnectSSHWithPassword method for ad-hoc password auth
- Version loaded from Go backend (build-time -ldflags) in settings + unlock screen
- Connection errors shown as alert() instead of silent console.error
- Added UpdateService.CurrentVersion() and WraithApp.GetVersion()

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-17 11:38:08 -04:00
Vantz Stockwell
b46c20b0d0 feat: wire all remaining stubs — settings, SFTP, RDP, credentials, FreeRDP callbacks
All checks were successful
Build & Sign Wraith / Build Windows + Sign (push) Successful in 1m4s
Four-agent parallel deployment:

1. Settings persistence — all 5 settings wired to SettingsService.Set/Get,
   theme picker persists, update check calls real UpdateService, external
   links use Browser.OpenURL, SFTP file open/save calls real service,
   Quick Connect creates real connection + session, exit uses Wails quit

2. SSH key management — credential dropdown in ConnectionEditDialog,
   collapsible "Add New Credential" panel with password/SSH key modes,
   CredentialService proxied through WraithApp (vault-locked guard),
   new CreateSSHKeyCredential method for atomic key+credential creation

3. RDP frontend wiring — useRdp.ts calls real RDPGetFrame/SendMouse/
   SendKey/SendClipboard via Wails bindings, ConnectRDP on WraithApp
   resolves credentials and builds RDPConfig, session store handles
   RDP protocol, frame pipeline uses polling at 30fps

4. FreeRDP3 callback registration — PostConnect and BitmapUpdate callbacks
   via syscall.NewCallback, GDI mode for automatic frame decoding,
   freerdp_context_new() call added, settings/input/context pointers
   extracted from struct offsets, BGRA→RGBA channel swap in frame copy,
   event loop fixed to pass context not instance

11 files changed. Zero build errors.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-17 11:25:03 -04:00
Vantz Stockwell
df23cecdbd fix: wire connection CRUD, add Group+/Host+ buttons, fix vault stubs
All checks were successful
Build & Sign Wraith / Build Windows + Sign (push) Successful in 1m5s
- Delete connection/group now calls real Go backend (was local array splice)
- Duplicate connection calls ConnectionService.CreateConnection
- Rename group calls new ConnectionService.RenameGroup method
- Added Group+ and Host+ buttons to sidebar header
- Vault change password wired to real unlock/create flow
- Export/import vault shows helpful path info instead of stub alert

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-17 11:08:40 -04:00
Vantz Stockwell
5704923b01 chore: add wraith-logo.ico for installer and shortcuts
All checks were successful
Build & Sign Wraith / Build Windows + Sign (push) Successful in 1m4s
2026-03-17 10:55:14 -04:00
Vantz Stockwell
2cfb2c0b3b fix: use wraith-logo.ico for installer icon and desktop shortcuts
Some checks failed
Build & Sign Wraith / Build Windows + Sign (push) Failing after 43s
Replaces default NSIS icon with the Wraith ghost logo. Icon included
in install directory for Start Menu and Desktop shortcut references.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-17 10:51:06 -04:00
Vantz Stockwell
8572e6e7ea fix: wire SSH/SFTP/terminal to real Go backend — kill all stubs
Critical path wired end-to-end:
- ConnectSSH on WraithApp resolves credentials from vault, builds auth methods
- SSH output handler emits Wails events (base64) to frontend
- useTerminal.ts forwards keystrokes to SSHService.Write, resize to SSHService.Resize
- useTerminal.ts listens for ssh:data:{sessionId} events and writes to xterm.js
- session.store.ts connect() calls real Go ConnectSSH, not mock
- useSftp.ts calls real SFTPService.List instead of hardcoded mock data
- SFTP client auto-registered on SSH connection via pkg/sftp
- DisconnectSession cleans up both SSH and SFTP

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-17 10:49:21 -04:00
Vantz Stockwell
e5c69106c5 fix: wire auto-updater to real Go backend — check, download, install via Wails bindings
All checks were successful
Build & Sign Wraith / Build Windows + Sign (push) Successful in 1m3s
2026-03-17 10:30:09 -04:00
Vantz Stockwell
75afa70155 fix: OAuth redirect URI must use localhost not 127.0.0.1 + wire vault/connections/import to Go backend
All checks were successful
Build & Sign Wraith / Build Windows + Sign (push) Successful in 1m4s
2026-03-17 10:28:48 -04:00
Vantz Stockwell
a1dce82d99 fix: wire vault persistence, connection loading, and MobaXterm import to real Go backend
Replace all TODO stubs in frontend stores with real Wails Call.ByName
bindings. The app store now calls WraithApp.IsFirstRun/CreateVault/Unlock
so vault state persists across launches. The connection store loads from
ConnectionService.ListConnections/ListGroups instead of hardcoded mock
data. The import dialog calls a new WraithApp.ImportMobaConf method that
parses the file, creates groups and connections in SQLite, and stores
host keys. ConnectionEditDialog also uses real Go CRUD calls. MainLayout
loads connections on mount after vault unlock.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-17 10:27:50 -04:00
Vantz Stockwell
fbd2fd4f80 feat: wire real Claude API — OAuth login + live chat via Wails bindings
All checks were successful
Build & Sign Wraith / Build Windows + Sign (push) Successful in 1m2s
Replace mock responses in the XO copilot panel with real Wails binding
calls to the Go AIService backend:

- StartLogin now opens the browser via pkg/browser.OpenURL
- SendMessage returns ChatResponse (text + tool call results) instead of
  bare error, fixing the tool-call accumulation bug in messageLoop
- Add GetModel/SetModel methods for frontend model switching
- Frontend useCopilot composable calls Go via Call.ByName from
  @wailsio/runtime, with conversation auto-creation, auth checks, and
  error display in the chat panel
- Store defaults to isAuthenticated=false; panel checks auth on mount
- CopilotSettings syncs model changes and logout to the backend

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-17 10:22:07 -04:00
Vantz Stockwell
f22fbe14fa feat: auto-updater — check Gitea packages for new versions, download + install
All checks were successful
Build & Sign Wraith / Build Windows + Sign (push) Successful in 1m5s
Add internal/updater package with UpdateService that queries the Gitea
generic-package API for newer releases, downloads the installer with
SHA256 verification, and launches it to apply the update. Includes
semver comparison (CompareVersions) and comprehensive test coverage
with httptest-based mock servers.

Wire UpdateService into WraithApp (app.go accepts version param) and
register as a Wails service in main.go. Frontend StatusBar shows a
blue pill notification when an update is available; SettingsModal About
section displays the current version and a "Check for Updates" button
with idle/checking/found/up-to-date/error states.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-17 10:11:50 -04:00
Vantz Stockwell
d07ac7ce3b fix: hide console window (-H windowsgui) + wire settings/import/edit dialogs
All checks were successful
Build & Sign Wraith / Build Windows + Sign (push) Successful in 1m5s
- Add -H windowsgui ldflags so wraith.exe launches without a terminal
- Wire Settings gear button to new SettingsModal component
- Wire Import dialog to File menu and Command Palette
- Wire Connection Edit dialog to File menu, Command Palette, and context menu
- Add File menu to toolbar (New Connection, Import, Settings, Exit)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-17 10:03:56 -04:00
Vantz Stockwell
473a25cf2a fix: wire settings modal, import dialog, and connection edit into the UI
- Settings button (gear icon) now opens SettingsModal with General, Terminal, Vault, About sections
- File menu added to toolbar with New Connection, Import MobaXTerm, Settings, Exit
- Command Palette "Settings" action now opens the settings modal
- Command Palette "New SSH/RDP Connection" actions now open ConnectionEditDialog
- ConnectionEditDialog mounted in MainLayout for File menu / palette access
- All Wails binding calls left as TODO with mock behavior

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-17 10:03:17 -04:00
Vantz Stockwell
5cdb96ffb8 fix: run makensis from dist/ so File directives find the binaries
All checks were successful
Build & Sign Wraith / Build Windows + Sign (push) Successful in 1m2s
2026-03-17 09:47:17 -04:00
Vantz Stockwell
bd050b17c4 feat: NSIS installer — single signed setup.exe with Start Menu + Desktop shortcuts
Some checks failed
Build & Sign Wraith / Build Windows + Sign (push) Failing after 48s
- Installs to Program Files\Wraith\
- Creates Start Menu and Desktop shortcuts
- Registers uninstaller in Add/Remove Programs
- Installer itself is EV code-signed

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-17 09:45:40 -04:00
Vantz Stockwell
a9d61e2a0e fix: upgrade Node to 22 if <20 — Tailwind CSS v4 requires Node 20+
All checks were successful
Build & Sign Wraith / Build Windows + Sign (push) Successful in 1m25s
2026-03-17 09:41:44 -04:00
Vantz Stockwell
855ee71e18 fix: stub out FreeRDP unwind/debug.c with empty implementations instead of deleting
Some checks failed
Build & Sign Wraith / Build Windows + Sign (push) Failing after 36s
2026-03-17 09:40:24 -04:00
Vantz Stockwell
ad4f23dc1a fix: surgically remove unwind source from FreeRDP before build — dlfcn.h incompatible with MinGW
Some checks failed
Build & Sign Wraith / Build Windows + Sign (push) Failing after 17s
2026-03-17 09:39:22 -04:00
Vantz Stockwell
64113e5eef fix: nuke cached FreeRDP source/build dirs before fresh download and configure
Some checks failed
Build & Sign Wraith / Build Windows + Sign (push) Failing after 20s
2026-03-17 09:37:22 -04:00
Vantz Stockwell
695fabfeaf fix: rm -rf build dir before cmake configure — stale cache ignoring WITH_UNWIND=OFF
Some checks failed
Build & Sign Wraith / Build Windows + Sign (push) Failing after 20s
2026-03-17 09:35:19 -04:00
Vantz Stockwell
c2e7f8336b fix: disable unwind/pcsc/smartcard in FreeRDP — dlfcn.h not available in MinGW
Some checks failed
Build & Sign Wraith / Build Windows + Sign (push) Failing after 17s
2026-03-17 09:34:23 -04:00
Vantz Stockwell
39dc29b048 fix: force CFLAGS=-w via env + add verbose output on FreeRDP build failure
Some checks failed
Build & Sign Wraith / Build Windows + Sign (push) Failing after 18s
2026-03-17 09:33:13 -04:00
Vantz Stockwell
3deb2d6be3 fix: suppress all FreeRDP warnings (-w) — we don't own this code, just need the DLLs
Some checks failed
Build & Sign Wraith / Build Windows + Sign (push) Failing after 18s
2026-03-17 09:32:03 -04:00