|
|
@@ -5,7 +5,7 @@ use crate::compact::{
|
|
|
compact_session, estimate_session_tokens, CompactionConfig, CompactionResult,
|
|
|
};
|
|
|
use crate::config::RuntimeFeatureConfig;
|
|
|
-use crate::hooks::{HookAbortSignal, HookRunResult, HookRunner};
|
|
|
+use crate::hooks::{HookAbortSignal, HookProgressReporter, HookRunResult, HookRunner};
|
|
|
use crate::permissions::{
|
|
|
PermissionContext, PermissionOutcome, PermissionPolicy, PermissionPrompter,
|
|
|
};
|
|
|
@@ -100,6 +100,7 @@ pub struct ConversationRuntime<C, T> {
|
|
|
usage_tracker: UsageTracker,
|
|
|
hook_runner: HookRunner,
|
|
|
hook_abort_signal: HookAbortSignal,
|
|
|
+ hook_progress_reporter: Option<Box<dyn HookProgressReporter>>,
|
|
|
}
|
|
|
|
|
|
impl<C, T> ConversationRuntime<C, T>
|
|
|
@@ -171,6 +172,77 @@ where
|
|
|
self
|
|
|
}
|
|
|
|
|
|
+ fn run_pre_tool_use_hook(&mut self, tool_name: &str, input: &str) -> HookRunResult {
|
|
|
+ if let Some(reporter) = self.hook_progress_reporter.as_mut() {
|
|
|
+ self.hook_runner.run_pre_tool_use_with_context(
|
|
|
+ tool_name,
|
|
|
+ input,
|
|
|
+ Some(&self.hook_abort_signal),
|
|
|
+ Some(reporter.as_mut()),
|
|
|
+ )
|
|
|
+ } else {
|
|
|
+ self.hook_runner.run_pre_tool_use_with_context(
|
|
|
+ tool_name,
|
|
|
+ input,
|
|
|
+ Some(&self.hook_abort_signal),
|
|
|
+ None,
|
|
|
+ )
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ fn run_post_tool_use_hook(
|
|
|
+ &mut self,
|
|
|
+ tool_name: &str,
|
|
|
+ input: &str,
|
|
|
+ output: &str,
|
|
|
+ is_error: bool,
|
|
|
+ ) -> HookRunResult {
|
|
|
+ if let Some(reporter) = self.hook_progress_reporter.as_mut() {
|
|
|
+ self.hook_runner.run_post_tool_use_with_context(
|
|
|
+ tool_name,
|
|
|
+ input,
|
|
|
+ output,
|
|
|
+ is_error,
|
|
|
+ Some(&self.hook_abort_signal),
|
|
|
+ Some(reporter.as_mut()),
|
|
|
+ )
|
|
|
+ } else {
|
|
|
+ self.hook_runner.run_post_tool_use_with_context(
|
|
|
+ tool_name,
|
|
|
+ input,
|
|
|
+ output,
|
|
|
+ is_error,
|
|
|
+ Some(&self.hook_abort_signal),
|
|
|
+ None,
|
|
|
+ )
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ fn run_post_tool_use_failure_hook(
|
|
|
+ &mut self,
|
|
|
+ tool_name: &str,
|
|
|
+ input: &str,
|
|
|
+ output: &str,
|
|
|
+ ) -> HookRunResult {
|
|
|
+ if let Some(reporter) = self.hook_progress_reporter.as_mut() {
|
|
|
+ self.hook_runner.run_post_tool_use_failure_with_context(
|
|
|
+ tool_name,
|
|
|
+ input,
|
|
|
+ output,
|
|
|
+ Some(&self.hook_abort_signal),
|
|
|
+ Some(reporter.as_mut()),
|
|
|
+ )
|
|
|
+ } else {
|
|
|
+ self.hook_runner.run_post_tool_use_failure_with_context(
|
|
|
+ tool_name,
|
|
|
+ input,
|
|
|
+ output,
|
|
|
+ Some(&self.hook_abort_signal),
|
|
|
+ None,
|
|
|
+ )
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
#[allow(clippy::too_many_lines)]
|
|
|
pub fn run_turn(
|
|
|
&mut self,
|
|
|
@@ -314,77 +386,6 @@ where
|
|
|
})
|
|
|
}
|
|
|
|
|
|
- fn run_pre_tool_use_hook(&mut self, tool_name: &str, input: &str) -> HookRunResult {
|
|
|
- if let Some(reporter) = self.hook_progress_reporter.as_mut() {
|
|
|
- self.hook_runner.run_pre_tool_use_with_context(
|
|
|
- tool_name,
|
|
|
- input,
|
|
|
- Some(&self.hook_abort_signal),
|
|
|
- Some(reporter.as_mut()),
|
|
|
- )
|
|
|
- } else {
|
|
|
- self.hook_runner.run_pre_tool_use_with_context(
|
|
|
- tool_name,
|
|
|
- input,
|
|
|
- Some(&self.hook_abort_signal),
|
|
|
- None,
|
|
|
- )
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- fn run_post_tool_use_hook(
|
|
|
- &mut self,
|
|
|
- tool_name: &str,
|
|
|
- input: &str,
|
|
|
- output: &str,
|
|
|
- is_error: bool,
|
|
|
- ) -> HookRunResult {
|
|
|
- if let Some(reporter) = self.hook_progress_reporter.as_mut() {
|
|
|
- self.hook_runner.run_post_tool_use_with_context(
|
|
|
- tool_name,
|
|
|
- input,
|
|
|
- output,
|
|
|
- is_error,
|
|
|
- Some(&self.hook_abort_signal),
|
|
|
- Some(reporter.as_mut()),
|
|
|
- )
|
|
|
- } else {
|
|
|
- self.hook_runner.run_post_tool_use_with_context(
|
|
|
- tool_name,
|
|
|
- input,
|
|
|
- output,
|
|
|
- is_error,
|
|
|
- Some(&self.hook_abort_signal),
|
|
|
- None,
|
|
|
- )
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- fn run_post_tool_use_failure_hook(
|
|
|
- &mut self,
|
|
|
- tool_name: &str,
|
|
|
- input: &str,
|
|
|
- output: &str,
|
|
|
- ) -> HookRunResult {
|
|
|
- if let Some(reporter) = self.hook_progress_reporter.as_mut() {
|
|
|
- self.hook_runner.run_post_tool_use_failure_with_context(
|
|
|
- tool_name,
|
|
|
- input,
|
|
|
- output,
|
|
|
- Some(&self.hook_abort_signal),
|
|
|
- Some(reporter.as_mut()),
|
|
|
- )
|
|
|
- } else {
|
|
|
- self.hook_runner.run_post_tool_use_failure_with_context(
|
|
|
- tool_name,
|
|
|
- input,
|
|
|
- output,
|
|
|
- Some(&self.hook_abort_signal),
|
|
|
- None,
|
|
|
- )
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
#[must_use]
|
|
|
pub fn compact(&self, config: CompactionConfig) -> CompactionResult {
|
|
|
compact_session(&self.session, config)
|