We need a general purpose application that can be used for 80% of all use cases. When you think about it, all apps pretty much re-introduce the exact same features. Preferences, contacts, notifications, authentication, sharing, etc.
I want to use the exact same interface and language to order a package from China to my house, or to hail a cab to move me from work to home. I want the estimated ETA and cost prediction to be displayed the same. Tracking a package or the real-time location of a cab should be done through the same interface. I want to be notified the same way, whether it's my package or my cab that's late and/or has arrived. I want to pay for the package and cab ride the exact same way. Reviewing the received product and reviewing the cab driver, should be identical processes. I think the same should apply to pretty much any interaction, be it to ask my coffee machine to brew a cup, to be notified that my colleague will be late to a meeting, to pay for a meal, to review a movie, to schedule an appointment, to locate a friend.
My thesis is that all communication problems (which are what apps solve) are difference instances of the same one.
An app is not any tool. It's a language. We need to implement a general purpose language, and then all use it to interact with different agents/services.