feat: add DMG build script and enhance README with installation instructions and Start at Login feature
This commit is contained in:
@@ -1,5 +1,6 @@
|
||||
import AppKit
|
||||
import Foundation
|
||||
import ServiceManagement
|
||||
import SwiftUI
|
||||
|
||||
private let workspaceRoot = URL(fileURLWithPath: "/Users/david/Developer/fidelity-ai-workspace", isDirectory: true)
|
||||
@@ -27,6 +28,7 @@ final class ServiceStatusModel: ObservableObject {
|
||||
@Published private(set) var report: StatusReport?
|
||||
@Published private(set) var lastError: String?
|
||||
@Published private(set) var lanIP: String?
|
||||
@Published private(set) var loginItemStatus: SMAppService.Status = .notRegistered
|
||||
@Published private(set) var isRefreshing = false
|
||||
|
||||
let profile: String
|
||||
@@ -53,12 +55,42 @@ final class ServiceStatusModel: ObservableObject {
|
||||
let data = try await ServiceManager.run(["status", "--profile", profile, "--json"])
|
||||
report = try JSONDecoder().decode(StatusReport.self, from: data)
|
||||
lanIP = await NetworkInfo.primaryLANIP()
|
||||
loginItemStatus = SMAppService.mainApp.status
|
||||
lastError = nil
|
||||
} catch {
|
||||
lastError = String(describing: error)
|
||||
}
|
||||
}
|
||||
|
||||
var startAtLoginEnabled: Bool {
|
||||
loginItemStatus == .enabled
|
||||
}
|
||||
|
||||
var startAtLoginStatusText: String {
|
||||
switch loginItemStatus {
|
||||
case .enabled: "enabled"
|
||||
case .notRegistered: "off"
|
||||
case .notFound: "not found"
|
||||
case .requiresApproval: "requires approval"
|
||||
@unknown default: "unknown"
|
||||
}
|
||||
}
|
||||
|
||||
func setStartAtLogin(_ enabled: Bool) {
|
||||
do {
|
||||
if enabled {
|
||||
try SMAppService.mainApp.register()
|
||||
} else {
|
||||
try SMAppService.mainApp.unregister()
|
||||
}
|
||||
loginItemStatus = SMAppService.mainApp.status
|
||||
lastError = nil
|
||||
} catch {
|
||||
loginItemStatus = SMAppService.mainApp.status
|
||||
lastError = "Start at Login: \(error.localizedDescription)"
|
||||
}
|
||||
}
|
||||
|
||||
func startProfile() {
|
||||
runAction(["start", "--profile", profile])
|
||||
}
|
||||
@@ -219,6 +251,21 @@ struct ServiceMenuView: View {
|
||||
|
||||
ActionButton(title: "Open Project Knowledge", systemImage: "books.vertical", action: model.openProjectKnowledge)
|
||||
|
||||
Divider()
|
||||
VStack(alignment: .leading, spacing: 6) {
|
||||
Toggle(isOn: Binding(
|
||||
get: { model.startAtLoginEnabled },
|
||||
set: { model.setStartAtLogin($0) }
|
||||
)) {
|
||||
Label("Start at Login", systemImage: "poweron")
|
||||
}
|
||||
.toggleStyle(.switch)
|
||||
|
||||
Text("Login item: \(model.startAtLoginStatusText)")
|
||||
.font(.caption2)
|
||||
.foregroundStyle(.secondary)
|
||||
}
|
||||
|
||||
Divider()
|
||||
HStack {
|
||||
if let error = model.lastError {
|
||||
|
||||
Reference in New Issue
Block a user