on main help sign in
Merge remote-tracking branch 'origin/main' into list
08e0d2bKujtim Hoxha
README.md+2−2
@@ -116,9 +116,9 @@ Crush supports Model Context Protocol (MCP) servers through three transport type
116 },
116 },
117 "github": {
117 "github": {
118 "type": "http",
118 "type": "http",
119− "url": "https://api.githubcopilot.com/mcp/",
119+ "url": "https://example.com/mcp/",
120 "headers": {
120 "headers": {
121− "Authorization": "$(echo Bearer $GH_MCP_TOKEN)"
121+ "Authorization": "$(echo Bearer $EXAMPLE_MCP_TOKEN)"
122 }
122 }
123 },
123 },
124 "streaming-service": {
124 "streaming-service": {
go.mod+2−2
@@ -16,7 +16,7 @@ require (
16 github.com/charmbracelet/catwalk v0.3.1
16 github.com/charmbracelet/catwalk v0.3.1
17 github.com/charmbracelet/fang v0.3.1-0.20250711140230-d5ebb8c1d674
17 github.com/charmbracelet/fang v0.3.1-0.20250711140230-d5ebb8c1d674
18 github.com/charmbracelet/glamour/v2 v2.0.0-20250516160903-6f1e2c8f9ebe
18 github.com/charmbracelet/glamour/v2 v2.0.0-20250516160903-6f1e2c8f9ebe
19− github.com/charmbracelet/lipgloss/v2 v2.0.0-beta.3.0.20250716211347-10c048e36112
19+ github.com/charmbracelet/lipgloss/v2 v2.0.0-beta.3.0.20250721205738-ea66aa652ee0
20 github.com/charmbracelet/log/v2 v2.0.0-20250226163916-c379e29ff706
20 github.com/charmbracelet/log/v2 v2.0.0-20250226163916-c379e29ff706
21 github.com/charmbracelet/x/ansi v0.9.3
21 github.com/charmbracelet/x/ansi v0.9.3
22 github.com/charmbracelet/x/exp/charmtone v0.0.0-20250708181618-a60a724ba6c3
22 github.com/charmbracelet/x/exp/charmtone v0.0.0-20250708181618-a60a724ba6c3
@@ -40,7 +40,7 @@ require (
40 github.com/srwiley/rasterx v0.0.0-20220730225603-2ab79fcdd4ef
40 github.com/srwiley/rasterx v0.0.0-20220730225603-2ab79fcdd4ef
41 github.com/stretchr/testify v1.10.0
41 github.com/stretchr/testify v1.10.0
42 github.com/tidwall/sjson v1.2.5
42 github.com/tidwall/sjson v1.2.5
43− github.com/u-root/u-root v0.14.1-0.20250722142936-bf4e78a90dfc
43+ github.com/u-root/u-root v0.14.1-0.20250724181933-b01901710169
44 github.com/zeebo/xxh3 v1.0.2
44 github.com/zeebo/xxh3 v1.0.2
45 gopkg.in/natefinch/lumberjack.v2 v2.2.1
45 gopkg.in/natefinch/lumberjack.v2 v2.2.1
46 mvdan.cc/sh/v3 v3.11.0
46 mvdan.cc/sh/v3 v3.11.0
go.sum+4−4
@@ -80,8 +80,8 @@ github.com/charmbracelet/fang v0.3.1-0.20250711140230-d5ebb8c1d674 h1:+Cz+VfxD5D
80github.com/charmbracelet/fang v0.3.1-0.20250711140230-d5ebb8c1d674/go.mod h1:9gCUAHmVx5BwSafeyNr3GI0GgvlB1WYjL21SkPp1jyU=
80github.com/charmbracelet/fang v0.3.1-0.20250711140230-d5ebb8c1d674/go.mod h1:9gCUAHmVx5BwSafeyNr3GI0GgvlB1WYjL21SkPp1jyU=
81github.com/charmbracelet/glamour/v2 v2.0.0-20250516160903-6f1e2c8f9ebe h1:i6ce4CcAlPpTj2ER69m1DBeLZ3RRcHnKExuwhKa3GfY=
81github.com/charmbracelet/glamour/v2 v2.0.0-20250516160903-6f1e2c8f9ebe h1:i6ce4CcAlPpTj2ER69m1DBeLZ3RRcHnKExuwhKa3GfY=
82github.com/charmbracelet/glamour/v2 v2.0.0-20250516160903-6f1e2c8f9ebe/go.mod h1:p3Q+aN4eQKeM5jhrmXPMgPrlKbmc59rWSnMsSA3udhk=
82github.com/charmbracelet/glamour/v2 v2.0.0-20250516160903-6f1e2c8f9ebe/go.mod h1:p3Q+aN4eQKeM5jhrmXPMgPrlKbmc59rWSnMsSA3udhk=
83−github.com/charmbracelet/lipgloss/v2 v2.0.0-beta.3.0.20250716211347-10c048e36112 h1:SyZEoqRe2oiKZI+h93lgJYXtcBgcS/OsJIOYC7KbR7s=
83+github.com/charmbracelet/lipgloss/v2 v2.0.0-beta.3.0.20250721205738-ea66aa652ee0 h1:sWRGoSw/JsO2S4t2+fmmEkRbkOxphI0AxZkQPQVKWbs=
84−github.com/charmbracelet/lipgloss/v2 v2.0.0-beta.3.0.20250716211347-10c048e36112/go.mod h1:BXY7j7rZgAprFwzNcO698++5KTd6GKI6lU83Pr4o0r0=
84+github.com/charmbracelet/lipgloss/v2 v2.0.0-beta.3.0.20250721205738-ea66aa652ee0/go.mod h1:XIuqKpZTUXtVyeyiN1k9Tc/U7EzfaDnVc34feFHfBws=
85github.com/charmbracelet/log/v2 v2.0.0-20250226163916-c379e29ff706 h1:WkwO6Ks3mSIGnGuSdKl9qDSyfbYK50z2wc2gGMggegE=
85github.com/charmbracelet/log/v2 v2.0.0-20250226163916-c379e29ff706 h1:WkwO6Ks3mSIGnGuSdKl9qDSyfbYK50z2wc2gGMggegE=
86github.com/charmbracelet/log/v2 v2.0.0-20250226163916-c379e29ff706/go.mod h1:mjJGp00cxcfvD5xdCa+bso251Jt4owrQvuimJtVmEmM=
86github.com/charmbracelet/log/v2 v2.0.0-20250226163916-c379e29ff706/go.mod h1:mjJGp00cxcfvD5xdCa+bso251Jt4owrQvuimJtVmEmM=
87github.com/charmbracelet/ultraviolet v0.0.0-20250723145313-809e6f5b43a1 h1:tsw1mOuIEIKlmm614bXctvJ3aavaFhyPG+y+wrKtuKQ=
87github.com/charmbracelet/ultraviolet v0.0.0-20250723145313-809e6f5b43a1 h1:tsw1mOuIEIKlmm614bXctvJ3aavaFhyPG+y+wrKtuKQ=
@@ -261,8 +261,8 @@ github.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4=
261github.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=
261github.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=
262github.com/tidwall/sjson v1.2.5 h1:kLy8mja+1c9jlljvWTlSazM7cKDRfJuR/bOJhcY5NcY=
262github.com/tidwall/sjson v1.2.5 h1:kLy8mja+1c9jlljvWTlSazM7cKDRfJuR/bOJhcY5NcY=
263github.com/tidwall/sjson v1.2.5/go.mod h1:Fvgq9kS/6ociJEDnK0Fk1cpYF4FIW6ZF7LAe+6jwd28=
263github.com/tidwall/sjson v1.2.5/go.mod h1:Fvgq9kS/6ociJEDnK0Fk1cpYF4FIW6ZF7LAe+6jwd28=
264−github.com/u-root/u-root v0.14.1-0.20250722142936-bf4e78a90dfc h1:HjI/UCF4dRyzizePQrhGUSQvuU7z4tOqMqz6GRGlFCM=
264+github.com/u-root/u-root v0.14.1-0.20250724181933-b01901710169 h1:f4cp2yGKkMuGpCwAyNEjzcw8szgVXmemK/wfOu4l5gc=
265−github.com/u-root/u-root v0.14.1-0.20250722142936-bf4e78a90dfc/go.mod h1:/0Qr7qJeDwWxoKku2xKQ4Szc+SwBE3g9VE8jNiamsmc=
265+github.com/u-root/u-root v0.14.1-0.20250724181933-b01901710169/go.mod h1:/0Qr7qJeDwWxoKku2xKQ4Szc+SwBE3g9VE8jNiamsmc=
266github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e h1:JVG44RsyaB9T2KIHavMF/ppJZNG9ZpyihvCd0w101no=
266github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e h1:JVG44RsyaB9T2KIHavMF/ppJZNG9ZpyihvCd0w101no=
267github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e/go.mod h1:RbqR21r5mrJuqunuUZ/Dhy/avygyECGrLceyNeo4LiM=
267github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e/go.mod h1:RbqR21r5mrJuqunuUZ/Dhy/avygyECGrLceyNeo4LiM=
268github.com/yosida95/uritemplate/v3 v3.0.2 h1:Ed3Oyj9yrmi9087+NczuL5BwkIc4wvTb5zIM+UJPGz4=
268github.com/yosida95/uritemplate/v3 v3.0.2 h1:Ed3Oyj9yrmi9087+NczuL5BwkIc4wvTb5zIM+UJPGz4=
internal/config/load.go−34
@@ -10,7 +10,6 @@ import (
10 "runtime"
10 "runtime"
11 "slices"
11 "slices"
12 "strings"
12 "strings"
13− "sync"
14
13
15 "github.com/charmbracelet/catwalk/pkg/catwalk"
14 "github.com/charmbracelet/catwalk/pkg/catwalk"
16 "github.com/charmbracelet/crush/internal/csync"
15 "github.com/charmbracelet/crush/internal/csync"
@@ -78,8 +77,6 @@ func Load(workingDir string, debug bool) (*Config, error) {
78 return nil, fmt.Errorf("failed to configure providers: %w", err)
77 return nil, fmt.Errorf("failed to configure providers: %w", err)
79 }
78 }
80
79
81− go cfg.removeUnresponsiveProviders()
82−
83 if !cfg.IsConfigured() {
80 if !cfg.IsConfigured() {
84 slog.Warn("No providers configured")
81 slog.Warn("No providers configured")
85 return cfg, nil
82 return cfg, nil
@@ -92,37 +89,6 @@ func Load(workingDir string, debug bool) (*Config, error) {
92 return cfg, nil
89 return cfg, nil
93}
90}
94
91
95−func (c *Config) removeUnresponsiveProviders() {
96− slog.Info("Testing provider connections")
97− defer slog.Info("Provider connection tests completed")
98−
99− // Test provider connections in parallel
100− var wg sync.WaitGroup
101− testResults := csync.NewMap[string, bool]()
102− for _, p := range c.Providers.Seq2() {
103− if p.Type != catwalk.TypeOpenAI && p.Type != catwalk.TypeAnthropic {
104− continue
105− }
106− wg.Add(1)
107− go func(provider ProviderConfig) {
108− defer wg.Done()
109− err := provider.TestConnection(c.resolver)
110− testResults.Set(provider.ID, err == nil)
111− if err != nil {
112− slog.Error("Provider connection test failed", "provider", provider.ID, "error", err)
113− }
114− }(p)
115− }
116− wg.Wait()
117−
118− // Remove failed providers
119− for providerID, passed := range testResults.Seq2() {
120− if !passed {
121− c.Providers.Del(providerID)
122− }
123− }
124−}
125−
126func (c *Config) configureProviders(env env.Env, resolver VariableResolver, knownProviders []catwalk.Provider) error {
92func (c *Config) configureProviders(env env.Env, resolver VariableResolver, knownProviders []catwalk.Provider) error {
127 knownProviderNames := make(map[string]bool)
93 knownProviderNames := make(map[string]bool)
128 for _, p := range knownProviders {
94 for _, p := range knownProviders {
internal/tui/components/chat/splash/splash.go+2−4
@@ -495,9 +495,7 @@ func (s *splashCmp) View() string {
495 })
495 })
496
496
497 buttons := lipgloss.JoinHorizontal(lipgloss.Left, yesButton, " ", noButton)
497 buttons := lipgloss.JoinHorizontal(lipgloss.Left, yesButton, " ", noButton)
498− infoSection := s.infoSection()
499−
500− remainingHeight := s.height - lipgloss.Height(s.logoRendered) - (SplashScreenPaddingY * 2) - lipgloss.Height(infoSection)
498+ remainingHeight := s.height - lipgloss.Height(s.logoRendered) - (SplashScreenPaddingY * 2)
501
499
502 initContent := t.S().Base.AlignVertical(lipgloss.Bottom).PaddingLeft(1).Height(remainingHeight).Render(
500 initContent := t.S().Base.AlignVertical(lipgloss.Bottom).PaddingLeft(1).Height(remainingHeight).Render(
503 lipgloss.JoinVertical(
501 lipgloss.JoinVertical(
@@ -511,7 +509,7 @@ func (s *splashCmp) View() string {
511 content = lipgloss.JoinVertical(
509 content = lipgloss.JoinVertical(
512 lipgloss.Left,
510 lipgloss.Left,
513 s.logoRendered,
511 s.logoRendered,
514− infoSection,
512+ "",
515 initContent,
513 initContent,
516 )
514 )
517 } else {
515 } else {