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>
91 lines
2.3 KiB
Go
91 lines
2.3 KiB
Go
package main
|
|
|
|
import (
|
|
"embed"
|
|
"log"
|
|
"log/slog"
|
|
"os"
|
|
"path/filepath"
|
|
|
|
wraithapp "github.com/vstockwell/wraith/internal/app"
|
|
"github.com/wailsapp/wails/v3/pkg/application"
|
|
)
|
|
|
|
// version is set at build time via -ldflags "-X main.version=..."
|
|
var version = "dev"
|
|
|
|
//go:embed all:frontend/dist
|
|
var assets embed.FS
|
|
|
|
func main() {
|
|
// Set up file logging so we can debug without a console window
|
|
if logFile := setupFileLogging(); logFile != nil {
|
|
defer logFile.Close()
|
|
}
|
|
slog.Info("starting Wraith", "version", version)
|
|
|
|
wraith, err := wraithapp.New(version)
|
|
if err != nil {
|
|
log.Fatalf("failed to initialize: %v", err)
|
|
}
|
|
|
|
app := application.New(application.Options{
|
|
Name: "Wraith",
|
|
Description: "SSH + RDP + SFTP Desktop Client",
|
|
Services: []application.Service{
|
|
application.NewService(wraith),
|
|
application.NewService(wraith.Connections),
|
|
application.NewService(wraith.Themes),
|
|
application.NewService(wraith.Settings),
|
|
application.NewService(wraith.SSH),
|
|
application.NewService(wraith.SFTP),
|
|
application.NewService(wraith.RDP),
|
|
application.NewService(wraith.Updater),
|
|
},
|
|
Assets: application.AssetOptions{
|
|
Handler: application.BundledAssetFileServer(assets),
|
|
},
|
|
})
|
|
|
|
// Wire Wails app reference for event emission (SSH output → frontend)
|
|
wraith.SetWailsApp(app)
|
|
|
|
app.Window.NewWithOptions(application.WebviewWindowOptions{
|
|
Title: "Wraith",
|
|
Width: 1400,
|
|
Height: 900,
|
|
URL: "/",
|
|
BackgroundColour: application.NewRGBA(13, 17, 23, 255),
|
|
})
|
|
|
|
if err := app.Run(); err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
}
|
|
|
|
// setupFileLogging configures slog to write to %APPDATA%\Wraith\wraith.log (Windows)
|
|
// or ~/.local/share/wraith/wraith.log (macOS/Linux). Returns the file handle for deferred close.
|
|
func setupFileLogging() *os.File {
|
|
var logDir string
|
|
if appData := os.Getenv("APPDATA"); appData != "" {
|
|
logDir = filepath.Join(appData, "Wraith")
|
|
} else if home, err := os.UserHomeDir(); err == nil {
|
|
logDir = filepath.Join(home, ".local", "share", "wraith")
|
|
} else {
|
|
return nil
|
|
}
|
|
|
|
os.MkdirAll(logDir, 0755)
|
|
logPath := filepath.Join(logDir, "wraith.log")
|
|
|
|
f, err := os.OpenFile(logPath, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
|
|
if err != nil {
|
|
return nil
|
|
}
|
|
|
|
handler := slog.NewTextHandler(f, &slog.HandlerOptions{Level: slog.LevelDebug})
|
|
slog.SetDefault(slog.New(handler))
|
|
log.SetOutput(f)
|
|
return f
|
|
}
|