diff --git a/apps/macos/Sources/Clawdis/GatewayLaunchAgentManager.swift b/apps/macos/Sources/Clawdis/GatewayLaunchAgentManager.swift
index eeee7f344..1bbee4d14 100644
--- a/apps/macos/Sources/Clawdis/GatewayLaunchAgentManager.swift
+++ b/apps/macos/Sources/Clawdis/GatewayLaunchAgentManager.swift
@@ -17,6 +17,26 @@ enum GatewayLaunchAgentManager {
"\(bundlePath)/Contents/Resources/Relay"
}
+ private static func gatewayProgramArguments(bundlePath: String, port: Int, bind: String) -> [String] {
+#if DEBUG
+ let projectRoot = CommandResolver.projectRoot()
+ if let localBin = CommandResolver.projectClawdisExecutable(projectRoot: projectRoot) {
+ return [localBin, "gateway", "--port", "\(port)", "--bind", bind]
+ }
+ if let entry = CommandResolver.gatewayEntrypoint(in: projectRoot),
+ case let .success(runtime) = CommandResolver.runtimeResolution()
+ {
+ return CommandResolver.makeRuntimeCommand(
+ runtime: runtime,
+ entrypoint: entry,
+ subcommand: "gateway",
+ extraArgs: ["--port", "\(port)", "--bind", bind])
+ }
+#endif
+ let gatewayBin = self.gatewayExecutablePath(bundlePath: bundlePath)
+ return [gatewayBin, "gateway-daemon", "--port", "\(port)", "--bind", bind]
+ }
+
static func status() async -> Bool {
guard FileManager.default.fileExists(atPath: self.plistURL.path) else { return false }
let result = await self.runLaunchctl(["print", "gui/\(getuid())/\(gatewayLaunchdLabel)"])
@@ -58,11 +78,11 @@ enum GatewayLaunchAgentManager {
}
private static func writePlist(bundlePath: String, port: Int) {
- let gatewayBin = self.gatewayExecutablePath(bundlePath: bundlePath)
let relayDir = self.relayDir(bundlePath: bundlePath)
let preferredPath = ([relayDir] + CommandResolver.preferredPaths())
.joined(separator: ":")
let bind = self.preferredGatewayBind() ?? "loopback"
+ let programArguments = self.gatewayProgramArguments(bundlePath: bundlePath, port: port, bind: bind)
let token = self.preferredGatewayToken()
let password = self.preferredGatewayPassword()
var envEntries = """
@@ -85,6 +105,9 @@ enum GatewayLaunchAgentManager {
\(escapedPassword)
"""
}
+ let argsXml = programArguments
+ .map { "\(self.escapePlistValue($0))" }
+ .joined(separator: "\n ")
let plist = """
@@ -94,12 +117,7 @@ enum GatewayLaunchAgentManager {
\(gatewayLaunchdLabel)
ProgramArguments
- \(gatewayBin)
- gateway-daemon
- --port
- \(port)
- --bind
- \(bind)
+ \(argsXml)
WorkingDirectory
\(FileManager.default.homeDirectoryForCurrentUser.path)