Add tool use to the orchestrator (#4)
Add tool use without sandboxing. Currently available tools are list dir, read file, write file and exec bash. Reviewed-on: #4 Co-authored-by: Drew Galbraith <drew@tiramisu.one> Co-committed-by: Drew Galbraith <drew@tiramisu.one>
This commit is contained in:
parent
6b85ff3cb8
commit
797d7564b7
20 changed files with 1822 additions and 129 deletions
|
|
@ -13,6 +13,8 @@ pub(super) enum LoopControl {
|
|||
Quit,
|
||||
/// The user ran `:clear`; wipe the conversation.
|
||||
ClearHistory,
|
||||
/// The user responded to a tool approval prompt.
|
||||
ToolApproval { tool_use_id: String, approved: bool },
|
||||
}
|
||||
|
||||
/// Map a key event to a [`LoopControl`] signal, mutating `state` as a side-effect.
|
||||
|
|
@ -23,6 +25,29 @@ pub(super) fn handle_key(key: Option<KeyEvent>, state: &mut AppState) -> Option<
|
|||
let key = key?;
|
||||
// Clear any transient status error on the next keypress.
|
||||
state.status_error = None;
|
||||
|
||||
// If a tool approval is pending, intercept y/n before normal key handling.
|
||||
if let Some(approval) = &state.pending_approval {
|
||||
let tool_use_id = approval.tool_use_id.clone();
|
||||
match key.code {
|
||||
KeyCode::Char('y') | KeyCode::Char('Y') => {
|
||||
state.pending_approval = None;
|
||||
return Some(LoopControl::ToolApproval {
|
||||
tool_use_id,
|
||||
approved: true,
|
||||
});
|
||||
}
|
||||
KeyCode::Char('n') | KeyCode::Char('N') => {
|
||||
state.pending_approval = None;
|
||||
return Some(LoopControl::ToolApproval {
|
||||
tool_use_id,
|
||||
approved: false,
|
||||
});
|
||||
}
|
||||
_ => return None, // ignore other keys while approval pending
|
||||
}
|
||||
}
|
||||
|
||||
// Ctrl+C quits from any mode.
|
||||
if key.modifiers.contains(KeyModifiers::CONTROL) && key.code == KeyCode::Char('c') {
|
||||
return Some(LoopControl::Quit);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue