| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859 |
- package tools
- import (
- "context"
- _ "embed"
- "fmt"
- "charm.land/fantasy"
- "github.com/charmbracelet/crush/internal/shell"
- )
- const (
- JobKillToolName = "job_kill"
- )
- //go:embed job_kill.md
- var jobKillDescription []byte
- type JobKillParams struct {
- ShellID string `json:"shell_id" description:"The ID of the background shell to terminate"`
- }
- type JobKillResponseMetadata struct {
- ShellID string `json:"shell_id"`
- Command string `json:"command"`
- Description string `json:"description"`
- }
- func NewJobKillTool() fantasy.AgentTool {
- return fantasy.NewAgentTool(
- JobKillToolName,
- string(jobKillDescription),
- func(ctx context.Context, params JobKillParams, call fantasy.ToolCall) (fantasy.ToolResponse, error) {
- if params.ShellID == "" {
- return fantasy.NewTextErrorResponse("missing shell_id"), nil
- }
- bgManager := shell.GetBackgroundShellManager()
- bgShell, ok := bgManager.Get(params.ShellID)
- if !ok {
- return fantasy.NewTextErrorResponse(fmt.Sprintf("background shell not found: %s", params.ShellID)), nil
- }
- metadata := JobKillResponseMetadata{
- ShellID: params.ShellID,
- Command: bgShell.Command,
- Description: bgShell.Description,
- }
- err := bgManager.Kill(params.ShellID)
- if err != nil {
- return fantasy.NewTextErrorResponse(err.Error()), nil
- }
- result := fmt.Sprintf("Background shell %s terminated successfully", params.ShellID)
- return fantasy.WithResponseMetadata(fantasy.NewTextResponse(result), metadata), nil
- })
- }
|