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:
parent
6e9b5071b0
commit
734f53fb37
1 changed files with 31 additions and 10 deletions
|
|
@ -671,7 +671,10 @@ func (t *ExecTool) runBackground(ctx context.Context, command, cwd string, ptyEn
|
||||||
SessionID: sessionID,
|
SessionID: sessionID,
|
||||||
Status: "running",
|
Status: "running",
|
||||||
}
|
}
|
||||||
data, _ := json.Marshal(resp)
|
data, err := json.Marshal(resp)
|
||||||
|
if err != nil {
|
||||||
|
return ErrorResult(err.Error())
|
||||||
|
}
|
||||||
return &ToolResult{
|
return &ToolResult{
|
||||||
ForLLM: string(data),
|
ForLLM: string(data),
|
||||||
ForUser: fmt.Sprintf("Session %s started", sessionID),
|
ForUser: fmt.Sprintf("Session %s started", sessionID),
|
||||||
|
|
@ -684,7 +687,10 @@ func (t *ExecTool) executeList() *ToolResult {
|
||||||
resp := ExecResponse{
|
resp := ExecResponse{
|
||||||
Sessions: sessions,
|
Sessions: sessions,
|
||||||
}
|
}
|
||||||
data, _ := json.Marshal(resp)
|
data, err := json.Marshal(resp)
|
||||||
|
if err != nil {
|
||||||
|
return ErrorResult(err.Error())
|
||||||
|
}
|
||||||
return &ToolResult{
|
return &ToolResult{
|
||||||
ForLLM: string(data),
|
ForLLM: string(data),
|
||||||
ForUser: fmt.Sprintf("%d active sessions", len(sessions)),
|
ForUser: fmt.Sprintf("%d active sessions", len(sessions)),
|
||||||
|
|
@ -711,7 +717,10 @@ func (t *ExecTool) executePoll(args map[string]any) *ToolResult {
|
||||||
Status: session.GetStatus(),
|
Status: session.GetStatus(),
|
||||||
ExitCode: session.GetExitCode(),
|
ExitCode: session.GetExitCode(),
|
||||||
}
|
}
|
||||||
data, _ := json.Marshal(resp)
|
data, err := json.Marshal(resp)
|
||||||
|
if err != nil {
|
||||||
|
return ErrorResult(err.Error())
|
||||||
|
}
|
||||||
return &ToolResult{
|
return &ToolResult{
|
||||||
ForLLM: string(data),
|
ForLLM: string(data),
|
||||||
IsError: false,
|
IsError: false,
|
||||||
|
|
@ -739,7 +748,10 @@ func (t *ExecTool) executeRead(args map[string]any) *ToolResult {
|
||||||
Output: output,
|
Output: output,
|
||||||
Status: session.GetStatus(),
|
Status: session.GetStatus(),
|
||||||
}
|
}
|
||||||
data, _ := json.Marshal(resp)
|
data, err := json.Marshal(resp)
|
||||||
|
if err != nil {
|
||||||
|
return ErrorResult(err.Error())
|
||||||
|
}
|
||||||
return &ToolResult{
|
return &ToolResult{
|
||||||
ForLLM: string(data),
|
ForLLM: string(data),
|
||||||
IsError: false,
|
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()))
|
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) {
|
if errors.Is(err, ErrSessionDone) {
|
||||||
return ErrorResult(fmt.Sprintf("process already exited with code %d", session.GetExitCode()))
|
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,
|
SessionID: sessionID,
|
||||||
Status: session.GetStatus(),
|
Status: session.GetStatus(),
|
||||||
}
|
}
|
||||||
respData, _ := json.Marshal(resp)
|
respData, err := json.Marshal(resp)
|
||||||
|
if err != nil {
|
||||||
|
return ErrorResult(err.Error())
|
||||||
|
}
|
||||||
return &ToolResult{
|
return &ToolResult{
|
||||||
ForLLM: string(respData),
|
ForLLM: string(respData),
|
||||||
IsError: false,
|
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()))
|
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))
|
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,
|
SessionID: sessionID,
|
||||||
Status: "done",
|
Status: "done",
|
||||||
}
|
}
|
||||||
data, _ := json.Marshal(resp)
|
data, err := json.Marshal(resp)
|
||||||
|
if err != nil {
|
||||||
|
return ErrorResult(err.Error())
|
||||||
|
}
|
||||||
return &ToolResult{
|
return &ToolResult{
|
||||||
ForLLM: string(data),
|
ForLLM: string(data),
|
||||||
ForUser: fmt.Sprintf("Session %s killed", sessionID),
|
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()))
|
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) {
|
if errors.Is(err, ErrSessionDone) {
|
||||||
return ErrorResult(fmt.Sprintf("process already exited with code %d", session.GetExitCode()))
|
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",
|
Status: "running",
|
||||||
Output: fmt.Sprintf("Sent keys: %v", keys),
|
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{
|
return &ToolResult{
|
||||||
ForLLM: string(respData),
|
ForLLM: string(respData),
|
||||||
IsError: false,
|
IsError: false,
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue