diff --git a/internal/llm/agent/mcp-tools.go b/internal/llm/agent/mcp-tools.go index baeac3f2546c9668d6d34dec49f9fef5cde4bf8e..181f32b7280faf3eb36040d2ebecf3f892350f53 100644 --- a/internal/llm/agent/mcp-tools.go +++ b/internal/llm/agent/mcp-tools.go @@ -377,30 +377,35 @@ func createAndInitializeClient(ctx context.Context, name string, m config.MCPCon } }) + // XXX: ideally we should be able to use context.WithTimeout here, but, + // the SSE MCP client will start failing once that context is canceled. timeout := mcpTimeout(m) - initCtx, cancel := context.WithTimeout(ctx, timeout) - defer cancel() + mcpCtx, cancel := context.WithCancel(ctx) + cancelTimer := time.AfterFunc(timeout, cancel) - if err := c.Start(initCtx); err != nil { + if err := c.Start(mcpCtx); err != nil { updateMCPState(name, MCPStateError, maybeTimeoutErr(err, timeout), nil, 0) slog.Error("error starting mcp client", "error", err, "name", name) _ = c.Close() + cancel() return nil, err } - if _, err := c.Initialize(initCtx, mcpInitRequest); err != nil { + if _, err := c.Initialize(mcpCtx, mcpInitRequest); err != nil { updateMCPState(name, MCPStateError, maybeTimeoutErr(err, timeout), nil, 0) slog.Error("error initializing mcp client", "error", err, "name", name) _ = c.Close() + cancel() return nil, err } + cancelTimer.Stop() slog.Info("Initialized mcp client", "name", name) return c, nil } func maybeTimeoutErr(err error, timeout time.Duration) error { - if errors.Is(err, context.DeadlineExceeded) { + if errors.Is(err, context.Canceled) { return fmt.Errorf("timed out after %s", timeout) } return err diff --git a/internal/tui/components/dialogs/models/keys.go b/internal/tui/components/dialogs/models/keys.go index ef4a6228b839c43a3862e251999dadf81dd6403f..4ec1a487e865981edc0be5852bb6c044ddf04c1f 100644 --- a/internal/tui/components/dialogs/models/keys.go +++ b/internal/tui/components/dialogs/models/keys.go @@ -19,7 +19,7 @@ func DefaultKeyMap() KeyMap { return KeyMap{ Select: key.NewBinding( key.WithKeys("enter", "ctrl+y"), - key.WithHelp("enter", "confirm"), + key.WithHelp("enter", "choose"), ), Next: key.NewBinding( key.WithKeys("down", "ctrl+n"), @@ -35,7 +35,7 @@ func DefaultKeyMap() KeyMap { ), Close: key.NewBinding( key.WithKeys("esc", "alt+esc"), - key.WithHelp("esc", "cancel"), + key.WithHelp("esc", "exit"), ), } } diff --git a/internal/tui/components/dialogs/sessions/keys.go b/internal/tui/components/dialogs/sessions/keys.go index bc7ec1ba9f83915caee9189504abf0b07bd4a24b..73c50899f7ae7da3655fc8a3e3a3dd34c4c22f95 100644 --- a/internal/tui/components/dialogs/sessions/keys.go +++ b/internal/tui/components/dialogs/sessions/keys.go @@ -15,7 +15,7 @@ func DefaultKeyMap() KeyMap { return KeyMap{ Select: key.NewBinding( key.WithKeys("enter", "tab", "ctrl+y"), - key.WithHelp("enter", "confirm"), + key.WithHelp("enter", "choose"), ), Next: key.NewBinding( key.WithKeys("down", "ctrl+n"), @@ -27,7 +27,7 @@ func DefaultKeyMap() KeyMap { ), Close: key.NewBinding( key.WithKeys("esc", "alt+esc"), - key.WithHelp("esc", "cancel"), + key.WithHelp("esc", "exit"), ), } }