fix(tools): handle json.Marshal errors in exec tool responses

Replace 7 instances of ignored json.Marshal errors with proper error handling. Previously, if marshaling an ExecResponse failed, a nil byte slice would be silently converted to an empty string in the LLM response. Now each site returns ErrorResult with the marshal error message.
This commit is contained in:
程智超0668000959
2026-06-03 17:37:33 +08:00
parent 6e9b5071b0
commit 734f53fb37
+31 -10
View File
@@ -671,7 +671,10 @@ func (t *ExecTool) runBackground(ctx context.Context, command, cwd string, ptyEn
SessionID: sessionID,
Status: "running",
}
data, _ := json.Marshal(resp)
data, err := json.Marshal(resp)
if err != nil {
return ErrorResult(err.Error())
}
return &ToolResult{
ForLLM: string(data),
ForUser: fmt.Sprintf("Session %s started", sessionID),
@@ -684,7 +687,10 @@ func (t *ExecTool) executeList() *ToolResult {
resp := ExecResponse{
Sessions: sessions,
}
data, _ := json.Marshal(resp)
data, err := json.Marshal(resp)
if err != nil {
return ErrorResult(err.Error())
}
return &ToolResult{
ForLLM: string(data),
ForUser: fmt.Sprintf("%d active sessions", len(sessions)),
@@ -711,7 +717,10 @@ func (t *ExecTool) executePoll(args map[string]any) *ToolResult {
Status: session.GetStatus(),
ExitCode: session.GetExitCode(),
}
data, _ := json.Marshal(resp)
data, err := json.Marshal(resp)
if err != nil {
return ErrorResult(err.Error())
}
return &ToolResult{
ForLLM: string(data),
IsError: false,
@@ -739,7 +748,10 @@ func (t *ExecTool) executeRead(args map[string]any) *ToolResult {
Output: output,
Status: session.GetStatus(),
}
data, _ := json.Marshal(resp)
data, err := json.Marshal(resp)
if err != nil {
return ErrorResult(err.Error())
}
return &ToolResult{
ForLLM: string(data),
IsError: false,
@@ -769,7 +781,7 @@ func (t *ExecTool) executeWrite(args map[string]any) *ToolResult {
return ErrorResult(fmt.Sprintf("process already exited with code %d", session.GetExitCode()))
}
if err := session.Write(data); err != nil {
if err = session.Write(data); err != nil {
if errors.Is(err, ErrSessionDone) {
return ErrorResult(fmt.Sprintf("process already exited with code %d", session.GetExitCode()))
}
@@ -780,7 +792,10 @@ func (t *ExecTool) executeWrite(args map[string]any) *ToolResult {
SessionID: sessionID,
Status: session.GetStatus(),
}
respData, _ := json.Marshal(resp)
respData, err := json.Marshal(resp)
if err != nil {
return ErrorResult(err.Error())
}
return &ToolResult{
ForLLM: string(respData),
IsError: false,
@@ -805,7 +820,7 @@ func (t *ExecTool) executeKill(args map[string]any) *ToolResult {
return ErrorResult(fmt.Sprintf("process already exited with code %d", session.GetExitCode()))
}
if err := session.Kill(); err != nil {
if err = session.Kill(); err != nil {
return ErrorResult(fmt.Sprintf("failed to kill session: %v", err))
}
@@ -815,7 +830,10 @@ func (t *ExecTool) executeKill(args map[string]any) *ToolResult {
SessionID: sessionID,
Status: "done",
}
data, _ := json.Marshal(resp)
data, err := json.Marshal(resp)
if err != nil {
return ErrorResult(err.Error())
}
return &ToolResult{
ForLLM: string(data),
ForUser: fmt.Sprintf("Session %s killed", sessionID),
@@ -1027,7 +1045,7 @@ func (t *ExecTool) executeSendKeys(args map[string]any) *ToolResult {
return ErrorResult(fmt.Sprintf("process already exited with code %d", session.GetExitCode()))
}
if err := session.Write(data); err != nil {
if err = session.Write(data); err != nil {
if errors.Is(err, ErrSessionDone) {
return ErrorResult(fmt.Sprintf("process already exited with code %d", session.GetExitCode()))
}
@@ -1039,7 +1057,10 @@ func (t *ExecTool) executeSendKeys(args map[string]any) *ToolResult {
Status: "running",
Output: fmt.Sprintf("Sent keys: %v", keys),
}
respData, _ := json.Marshal(resp)
respData, err := json.Marshal(resp)
if err != nil {
return ErrorResult(err.Error())
}
return &ToolResult{
ForLLM: string(respData),
IsError: false,