fix: expose heartbeat controls and harden mac CLI

This commit is contained in:
Peter Steinberger
2025-12-12 23:33:12 +00:00
parent 3b72ed6e1a
commit 8846ffec64
7 changed files with 171 additions and 12 deletions

View File

@@ -111,8 +111,8 @@ final class ControlChannel: ObservableObject {
}
func lastHeartbeat() async throws -> ControlHeartbeatEvent? {
// Heartbeat removed in new protocol
nil
let data = try await self.request(method: "last-heartbeat")
return try JSONDecoder().decode(ControlHeartbeatEvent?.self, from: data)
}
func request(
@@ -219,6 +219,13 @@ final class ControlChannel: ObservableObject {
AgentEventStore.shared.append(agent)
self.routeWorkActivity(from: agent)
}
case let .event(evt) where evt.event == "heartbeat":
if let payload = evt.payload,
let heartbeat = try? GatewayPayloadDecoding.decode(payload, as: ControlHeartbeatEvent.self),
let data = try? JSONEncoder().encode(heartbeat)
{
NotificationCenter.default.post(name: .controlHeartbeat, object: data)
}
case let .event(evt) where evt.event == "shutdown":
self.state = .degraded("gateway shutdown")
case .snapshot:

View File

@@ -491,6 +491,7 @@ struct ClawdisCLI {
shutdown(fd, SHUT_WR)
var data = Data()
let decoder = JSONDecoder()
var buffer = [UInt8](repeating: 0, count: 8192)
let bufSize = buffer.count
while true {
@@ -501,14 +502,20 @@ struct ClawdisCLI {
until: deadline,
timeoutSeconds: timeoutSeconds)
let n = buffer.withUnsafeMutableBytes { read(fd, $0.baseAddress!, bufSize) }
if n > 0 { data.append(buffer, count: n); continue }
if n > 0 {
data.append(buffer, count: n)
if let resp = try? decoder.decode(Response.self, from: data) {
return resp
}
continue
}
if n == 0 { break }
if n == -1, errno == EINTR { continue }
if n == -1, errno == EAGAIN { continue }
throw POSIXError(POSIXErrorCode(rawValue: errno) ?? .EIO)
}
guard !data.isEmpty else { throw POSIXError(.ECONNRESET) }
return try JSONDecoder().decode(Response.self, from: data)
return try decoder.decode(Response.self, from: data)
}
private static func rpcTimeoutSeconds(for request: Request) -> TimeInterval {