From 2f44046622bf4552b8b7bc66e6bd7a5339234501 Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Sun, 7 Dec 2025 05:24:54 +0100 Subject: [PATCH] chore(agent): start rpc worker at launch, fail if not running --- apps/macos/Sources/Clawdis/AgentRPC.swift | 15 +++++++-------- apps/macos/Sources/Clawdis/MenuBar.swift | 1 + 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/apps/macos/Sources/Clawdis/AgentRPC.swift b/apps/macos/Sources/Clawdis/AgentRPC.swift index 0460b1b0a..f187f30b9 100644 --- a/apps/macos/Sources/Clawdis/AgentRPC.swift +++ b/apps/macos/Sources/Clawdis/AgentRPC.swift @@ -14,8 +14,10 @@ actor AgentRPC { private struct RpcError: Error { let message: String } func send(text: String, thinking: String?, session: String) async -> (ok: Bool, text: String?, error: String?) { + guard process?.isRunning == true else { + return (false, nil, "rpc worker not running") + } do { - try await ensureRunning() let payload: [String: Any] = [ "type": "send", "text": text, @@ -54,8 +56,10 @@ actor AgentRPC { } func status() async -> (ok: Bool, error: String?) { + guard process?.isRunning == true else { + return (false, "rpc worker not running") + } do { - try await ensureRunning() let payload: [String: Any] = ["type": "status"] let data = try JSONSerialization.data(withJSONObject: payload) guard let stdinHandle else { throw RpcError(message: "stdin missing") } @@ -75,12 +79,7 @@ actor AgentRPC { // MARK: - Process lifecycle - private func ensureRunning() async throws { - if let process, process.isRunning { return } - try await start() - } - - private func start() async throws { + func start() async throws { let process = Process() process.executableURL = URL(fileURLWithPath: "/usr/bin/env") process.arguments = ["pnpm", "clawdis", "rpc"] diff --git a/apps/macos/Sources/Clawdis/MenuBar.swift b/apps/macos/Sources/Clawdis/MenuBar.swift index d5cfa4ef9..dd43c0834 100644 --- a/apps/macos/Sources/Clawdis/MenuBar.swift +++ b/apps/macos/Sources/Clawdis/MenuBar.swift @@ -426,6 +426,7 @@ final class AppDelegate: NSObject, NSApplicationDelegate, NSXPCListenerDelegate if let state { RelayProcessManager.shared.setActive(!state.isPaused) } + Task { try? await AgentRPC.shared.start() } self.startListener() self.scheduleFirstRunOnboardingIfNeeded()