fix: expose heartbeat controls and harden mac CLI
This commit is contained in:
@@ -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:
|
||||
|
||||
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user