From 675420013db49e420db97e0ae984ac8b6ccadfe0 Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Fri, 2 Jan 2026 19:58:38 +0000 Subject: [PATCH] fix(macos): resolve gateway launch args --- .../Clawdis/GatewayLaunchAgentManager.swift | 32 +++++++++++++++---- 1 file changed, 25 insertions(+), 7 deletions(-) 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)