Add a non-blocking, async `ask_user` tool in addition to the blocking `ask_user`
- Dominant language
- Shell
- Stars
- 11.2k
- Forks
- 1.9k
- Avg merge
- 14h 16m
- Merged PRs (30d)
- 6
Description
### Describe the feature or problem you'd like to solve
Instead of making every ask_user blocking, give instructions to the agent to do all it can without input and ask questions as they come up using a non-blocking request and have a tab (like Current/*Requests*/Sessions etc.) or queue (liked /queue where I can go into it and select a question to answer and when it is collapsed I see there is a queue near the text input) where I can take my time to do input and agent is not blocked while it waits for me.
### Proposed solution
Sometimes I want the AI to solve all the problems it can without waiting on input. Sometimes I give it a big green pasture and ask it to solve it and then leave for a few minutes come back and see its asking some clarifying question about a tiny edge case, but it's blocking progress. It can't build the basic service skeleton because it needs to know how to handle one specific edge case. I would rather it by default builds what it can without my input and can ask questions as it goes and they get queued up and I can answer them at my leisure. When it is done doing all it can, it should convert the async questions into blocking questions if it needs to, but as I get to them, I can answer them and it can keep working on any that have been answered. That said, sometimes it does need to present a blocking question if the answer will fundamentally change all subsequent parts.
I like this over Autopilot which just tells the Agent to pick whatever the crap it wants which somehow often includes doing something really stupid. But if I don't use Autopilot it feels like it needs me to hand hold it through every decision and it can't do anything on it's own until I give it a big pep talk and approve it's every concern.
### Example prompts or workflows
### Example: Building a new service
- Agent: does some work and realizes that there is a major ambiguity in one of the http methods
- Agent: [ask_user_async] "How do you want to resolve this issue? A or B or C?"
- Agent: keeps working on the other 95% of the service that is straightforward
- User: [sometime later] "Do option B"
- Agent: finishes whatever task it was on and sees the user has responded. Picks up option B work
### Example: When to use blocking/sync ask_user
- Agent: [ask_user (not async)] "Do you want to use framework A or framework B". This is a major architectural decision that blocks other decisions so it should not be done async
### Example: Building a game
- Agent: builds a few subsystems, has questions about how the next one interfaces with existing ones. Still has three other subsystems to implement
- Agent: [ask_user_async] "How do you want to handle inventory..."
- Agent: starts working on other subsystems and in one notices another issue about inventory
- Agent: [ask_user_async]: "And what about this case with the inventory"
- Agent: does all the work it can do without user input. Takes the queued messages and either rewrites as one ask_user or just converts most pressing one to be blocking ask_user. Latter is easier so let's assume that.
- User: responds to new blocking question
- Agent: starts working
- User: responds to second "queued" request
- Agent: finishes first and auto picks up second and eventually finishes everything.
### Additional context
I think its important that we help make it as easy as possible for AI to do what it safely can without needing to go full-blown autopilot or needing to always be present to nudge the agent along. I think some people want to use either of those options but most are probably in the middle. Giving more tools to the middle group will improve their experience. I can add custom instructions to tell the agent what it should consider blocking vs not and your instructions should just indicate that blockers get ask_user and non-blocking get ask_user_async.
Contributor guide
Research direction
No files or tests are named. Start by locating the existing blocking `ask_user` tool and its request-handling entry point, then review how the proposed `ask_user_async` requests could appear in the queue or Requests/Sessions view. Done means async questions can be queued while work continues, answered later, and converted to blocking input when necessary.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- shell
- Domain
- cli
- Issue type
- Feature
- Difficulty
- 5/5
- Estimated time
- Over a week
- Activity status
- Active
- Clarity
- Mostly clear
- Newbie friendliness
- 35/100