diff --git a/go.mod b/go.mod index 378e0486af06e8d46368e1e881b8f2f4dc35f243..9c32735f40c145b87ced8ddcc0b1c1f91f36dd36 100644 --- a/go.mod +++ b/go.mod @@ -15,27 +15,35 @@ require ( github.com/charmbracelet/bubbles/v2 v2.0.0-beta.1.0.20250820203609-601216f68ee2 github.com/charmbracelet/bubbletea/v2 v2.0.0-beta.5 github.com/charmbracelet/catwalk v0.8.1 + github.com/charmbracelet/colorprofile v0.3.2 github.com/charmbracelet/fang v0.4.3 github.com/charmbracelet/glamour/v2 v2.0.0-20250811143442-a27abb32f018 github.com/charmbracelet/lipgloss/v2 v2.0.0-beta.3.0.20250917201909-41ff0bf215ea github.com/charmbracelet/log/v2 v2.0.0-20250226163916-c379e29ff706 + github.com/charmbracelet/ultraviolet v0.0.0-20251017140847-d4ace4d6e731 github.com/charmbracelet/x/ansi v0.10.2 github.com/charmbracelet/x/exp/charmtone v0.0.0-20250708181618-a60a724ba6c3 github.com/charmbracelet/x/exp/golden v0.0.0-20250207160936-21c02780d27a github.com/charmbracelet/x/exp/ordered v0.1.0 + github.com/charmbracelet/x/exp/slice v0.0.0-20250904123553-b4e2667e5ad5 github.com/charmbracelet/x/powernap v0.0.0-20251015113943-25f979b54ad4 github.com/charmbracelet/x/term v0.2.1 + github.com/denisbrodbeck/machineid v1.0.1 github.com/disintegration/imageorient v0.0.0-20180920195336-8147d86e83ec github.com/google/uuid v1.6.0 github.com/invopop/jsonschema v0.13.0 github.com/joho/godotenv v1.5.1 + github.com/lucasb-eyer/go-colorful v1.3.0 github.com/modelcontextprotocol/go-sdk v1.0.0 github.com/muesli/termenv v0.16.0 github.com/ncruces/go-sqlite3 v0.29.1 github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 github.com/nxadm/tail v1.4.11 + github.com/openai/openai-go/v2 v2.7.1 + github.com/posthog/posthog-go v1.6.12 github.com/pressly/goose/v3 v3.25.0 github.com/qjebbs/go-jsons v1.0.0-alpha.4 + github.com/rivo/uniseg v0.4.7 github.com/sabhiram/go-gitignore v0.0.0-20210923224102-525f6e181f06 github.com/sahilm/fuzzy v0.1.1 github.com/spf13/cobra v1.10.1 @@ -45,8 +53,11 @@ require ( github.com/tidwall/sjson v1.2.5 github.com/zeebo/xxh3 v1.0.2 go.yaml.in/yaml/v4 v4.0.0-rc.2 + golang.org/x/sync v0.17.0 + golang.org/x/text v0.30.0 gopkg.in/dnaeon/go-vcr.v4 v4.0.6-0.20250923044825-7b4892dd3117 gopkg.in/natefinch/lumberjack.v2 v2.2.1 + mvdan.cc/sh/moreinterp v0.0.0-20250902163504-3cf4fd5717a5 mvdan.cc/sh/v3 v3.12.1-0.20250902163504-3cf4fd5717a5 ) @@ -77,16 +88,12 @@ require ( github.com/bahlo/generic-list-go v0.2.0 // indirect github.com/buger/jsonparser v1.1.1 // indirect github.com/charmbracelet/anthropic-sdk-go v0.0.0-20251024181547-21d6f3d9a904 // indirect - github.com/charmbracelet/colorprofile v0.3.2 github.com/charmbracelet/go-genai v0.0.0-20251021165952-9befde14ce97 // indirect - github.com/charmbracelet/ultraviolet v0.0.0-20251017140847-d4ace4d6e731 github.com/charmbracelet/x/cellbuf v0.0.14-0.20250811133356-e0c5dbe5ea4a // indirect - github.com/charmbracelet/x/exp/slice v0.0.0-20250904123553-b4e2667e5ad5 github.com/charmbracelet/x/json v0.2.0 // indirect github.com/charmbracelet/x/termios v0.1.1 // indirect github.com/charmbracelet/x/windows v0.2.2 // indirect github.com/davecgh/go-spew v1.1.1 // indirect - github.com/denisbrodbeck/machineid v1.0.1 github.com/disintegration/gift v1.1.2 // indirect github.com/dlclark/regexp2 v1.11.5 // indirect github.com/dustin/go-humanize v1.0.1 // indirect @@ -108,7 +115,6 @@ require ( github.com/klauspost/compress v1.18.0 // indirect github.com/klauspost/cpuid/v2 v2.0.9 // indirect github.com/klauspost/pgzip v1.2.6 // indirect - github.com/lucasb-eyer/go-colorful v1.3.0 github.com/mailru/easyjson v0.7.7 // indirect github.com/mattn/go-isatty v0.0.20 // indirect github.com/mattn/go-runewidth v0.0.17 // indirect @@ -121,11 +127,8 @@ require ( github.com/muesli/mango-pflag v0.1.0 // indirect github.com/muesli/roff v0.1.0 // indirect github.com/ncruces/julianday v1.0.0 // indirect - github.com/openai/openai-go/v2 v2.7.1 github.com/pierrec/lz4/v4 v4.1.22 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/posthog/posthog-go v1.6.12 - github.com/rivo/uniseg v0.4.7 github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 // indirect github.com/sethvargo/go-retry v0.3.0 // indirect github.com/sourcegraph/jsonrpc2 v0.2.1 // indirect @@ -153,10 +156,8 @@ require ( golang.org/x/image v0.27.0 // indirect golang.org/x/net v0.44.0 // indirect golang.org/x/oauth2 v0.32.0 // indirect - golang.org/x/sync v0.17.0 // indirect golang.org/x/sys v0.37.0 // indirect golang.org/x/term v0.35.0 // indirect - golang.org/x/text v0.30.0 golang.org/x/time v0.12.0 // indirect google.golang.org/api v0.239.0 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20250603155806-513f23925822 // indirect @@ -164,5 +165,4 @@ require ( google.golang.org/protobuf v1.36.10 // indirect gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect - mvdan.cc/sh/moreinterp v0.0.0-20250902163504-3cf4fd5717a5 ) diff --git a/internal/agent/coordinator.go b/internal/agent/coordinator.go index e6cdc70d9294dc2ef60ae31582490f4220f52620..ffcccf94d1448094f0c76fac5bcd7307b74b97fe 100644 --- a/internal/agent/coordinator.go +++ b/internal/agent/coordinator.go @@ -26,6 +26,7 @@ import ( "github.com/charmbracelet/crush/internal/message" "github.com/charmbracelet/crush/internal/permission" "github.com/charmbracelet/crush/internal/session" + "golang.org/x/sync/errgroup" "charm.land/fantasy/providers/anthropic" "charm.land/fantasy/providers/azure" @@ -63,6 +64,8 @@ type coordinator struct { currentAgent SessionAgent agents map[string]SessionAgent + + readyWg errgroup.Group } func NewCoordinator( @@ -106,6 +109,10 @@ func NewCoordinator( // Run implements Coordinator. func (c *coordinator) Run(ctx context.Context, sessionID string, prompt string, attachments ...message.Attachment) (*fantasy.AgentResult, error) { + if err := c.readyWg.Wait(); err != nil { + return nil, err + } + model := c.currentAgent.Model() maxTokens := model.CatwalkCfg.DefaultMaxTokens if model.ModelCfg.MaxTokens != 0 { @@ -300,14 +307,15 @@ func (c *coordinator) buildAgent(ctx context.Context, prompt *prompt.Prompt, age c.messages, nil, }) - go func() { + c.readyWg.Go(func() error { tools, err := c.buildTools(ctx, agent) if err != nil { - slog.Error("could not init agent tools", "err", err) - return + return err } result.SetTools(tools) - }() + return nil + }) + return result, nil }