diff --git a/theta-agent-linux-amd64 b/theta-agent-linux-amd64 index cb9c281..a53d1cb 100755 Binary files a/theta-agent-linux-amd64 and b/theta-agent-linux-amd64 differ diff --git a/websocket.go b/websocket.go index 2651ba8..feb36e2 100644 --- a/websocket.go +++ b/websocket.go @@ -139,7 +139,11 @@ func connectWebSocket(cm *ConfigManager, exec Executor) { func handleCommand(cm *ConfigManager, msg WSMessage, c MessageWriter, exec Executor) { cfg := cm.Get() - log.Printf("Received command: %s", msg.Type) + // Don't log the server's fire-and-forget heartbeat ack — it arrives every + // 60s and is not a command to act on; logging it is pure per-minute noise. + if msg.Type != "heartbeat_ack" { + log.Printf("Received command: %s", msg.Type) + } sendResponse := func(status string, message string) { resp, _ := json.Marshal(map[string]string{"status": status, "message": message}) diff --git a/websocket_test.go b/websocket_test.go index d55d597..9d4c2f1 100644 --- a/websocket_test.go +++ b/websocket_test.go @@ -51,6 +51,9 @@ func TestHandleCommand(t *testing.T) { expectedCmd []string expectedFile string expectedFileCont string + // heartbeat_ack (and any fire-and-forget ack) must be silently ignored — + // no response message, no command, no log noise. + expectedNoResponse bool }{ { name: "config command success", @@ -175,6 +178,16 @@ func TestHandleCommand(t *testing.T) { expectedStatus: "error", expectedCmd: nil, }, + { + name: "heartbeat_ack is silently ignored", + cfg: &Config{ + Capabilities: Capabilities{}, + }, + msg: WSMessage{ + Type: "heartbeat_ack", + }, + expectedNoResponse: true, + }, { name: "unknown command", cfg: &Config{ @@ -194,6 +207,16 @@ func TestHandleCommand(t *testing.T) { cm := &ConfigManager{current: tc.cfg} handleCommand(cm, tc.msg, mockConn, mockExec) + if tc.expectedNoResponse { + if len(mockConn.Messages) != 0 { + t.Fatalf("expected no response message, got %d: %v", len(mockConn.Messages), mockConn.Messages) + } + if len(mockExec.ExecutedCommands) > 0 { + t.Errorf("expected no commands to be executed, but got %v", mockExec.ExecutedCommands) + } + return + } + if len(mockConn.Messages) != 1 { t.Fatalf("expected 1 response message, got %d", len(mockConn.Messages)) }