check my understand: 1) if LLM didn't use tool calls, assistantMessage get pushed into agent._state.messages and it will be the latest message in agent._state.messages. then _agentLoop() can pick it as the output to outputChannel 2) if LLM use tool calls but toolResultBatch.terminate is false, assistantMessageToolCall