The ?? Syntax
Inline intent → editable text → you stay in control. Hash never executes without your approval.
Three patterns
1. Full command generation
?? <prompt>
# → find . -name "*.go" -mtime 0
2. Pipe transforms
cmd | ?? <prompt>
# → Analysis: Connection refused on port 80...
3. Inline fill
cmd ?? <prompt> or --flag=?? <prompt>
# → git log --format="%h %s"
find . -name ?? all test files
# → find . -name "*_test.go"
Turn-by-turn conversations
A full ?? <prompt> request doesn't have to end after one answer. When the agent's response ends in a question, Hash automatically opens a conversation prompt so you can reply:
Is the query mostly reads, or does the table also see heavy writes?
╭─ conversation Enter sends · Esc/Ctrl+C leaves · /exit ends
│ you › mostly reads, writes are batched at night
│ agent › Then a covering index fits: CREATE INDEX ... ON orders (user_id, created_at)
Each reply is sent as a new turn in the same agent session, so the agent keeps its context. You can also redirect mid-conversation ("pause that and list my kubernetes contexts"), and the agent can request tool calls as usual.
Replying when there's no question
If the response doesn't end in a question, Hash shows the normal confirmation hints with a reply action: [Enter: done] [Tab: copy] [r: reply] [Esc: cancel]. Press r to continue the conversation anyway.
Leaving a conversation
- Press
EscorCtrl+C, or submit an empty line - Type
/exit - Natural exits work too: "done", "quit", "that's all", "never mind"
Command suggestions still go through the run/edit/cancel flow, and pipe transforms (cmd | ??) stay single-turn.
Detection order
??at line start → full command| ??(pipe with space) → pipe transform|??(pipe no space) → pipe transform??mid-line → inline completion??after text (like=??) → inline completion
When NOT to use ??
- For simple commands you know — just type them
- When offline with no local agent configured
- For destructive commands — always review carefully