| 404 | } |
| 405 | |
| 406 | func (h *shellHandler) ListBackgroundJobs(_ context.Context, _ map[string]any) (*tools.ToolCallResult, error) { |
| 407 | var output strings.Builder |
| 408 | output.WriteString("Background Jobs:\n\n") |
| 409 | |
| 410 | jobCount := 0 |
| 411 | h.jobs.Range(func(jobID string, job *backgroundJob) bool { |
| 412 | jobCount++ |
| 413 | status := job.status.Load() |
| 414 | elapsed := time.Since(job.startTime).Round(time.Second) |
| 415 | |
| 416 | fmt.Fprintf(&output, "ID: %s\n", jobID) |
| 417 | fmt.Fprintf(&output, " Command: %s\n", job.cmd) |
| 418 | fmt.Fprintf(&output, " Status: %s\n", statusToString(status)) |
| 419 | fmt.Fprintf(&output, " Runtime: %s\n", elapsed) |
| 420 | if status != statusRunning { |
| 421 | job.outputMu.RLock() |
| 422 | fmt.Fprintf(&output, " Exit Code: %d\n", job.exitCode) |
| 423 | job.outputMu.RUnlock() |
| 424 | } |
| 425 | output.WriteString("\n") |
| 426 | return true |
| 427 | }) |
| 428 | |
| 429 | if jobCount == 0 { |
| 430 | output.WriteString("No background jobs found.\n") |
| 431 | } |
| 432 | |
| 433 | return tools.ResultSuccess(output.String()), nil |
| 434 | } |
| 435 | |
| 436 | func (h *shellHandler) ViewBackgroundJob(_ context.Context, params ViewBackgroundJobArgs) (*tools.ToolCallResult, error) { |
| 437 | job, exists := h.jobs.Load(params.JobID) |