pub struct LazyExtensionHandler { /* private fields */ }Expand description
Lazy ExtensionHandler for deferred hook/provider/user capabilities
(Task 20 Commit C). Registered/subscribed at load WITHOUT a process;
the first AUTHORIZED use (a matching hook event delivered by the
permission-checked HookBus subscription, a selected provider
complete/stream, or an explicit user sidecar/command/settings action)
single-flights through the SAME per-plugin lease manager — starting
and exact-validating the child once. Discovery, load, search, and
diagnostics never acquire.
Implementations§
Source§impl LazyExtensionHandler
impl LazyExtensionHandler
pub fn new( plugin: &str, manager: Arc<ExtensionRuntimeManager>, ) -> LazyExtensionHandler
Trait Implementations§
Source§impl Debug for LazyExtensionHandler
impl Debug for LazyExtensionHandler
Source§impl ExtensionHandler for LazyExtensionHandler
impl ExtensionHandler for LazyExtensionHandler
Source§fn handle<'life0, 'life1, 'async_trait>(
&'life0 self,
event: &'life1 HookEvent,
) -> Pin<Box<dyn Future<Output = HookResult> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
LazyExtensionHandler: 'async_trait,
fn handle<'life0, 'life1, 'async_trait>(
&'life0 self,
event: &'life1 HookEvent,
) -> Pin<Box<dyn Future<Output = HookResult> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
LazyExtensionHandler: 'async_trait,
Handle a hook event. Returns the handler’s decision.
Source§fn call_tool<'life0, 'life1, 'async_trait>(
&'life0 self,
_name: &'life1 str,
_input: Value,
) -> Pin<Box<dyn Future<Output = Result<Value, String>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
LazyExtensionHandler: 'async_trait,
fn call_tool<'life0, 'life1, 'async_trait>(
&'life0 self,
_name: &'life1 str,
_input: Value,
) -> Pin<Box<dyn Future<Output = Result<Value, String>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
LazyExtensionHandler: 'async_trait,
Call an extension-provided tool.
Source§fn provider_complete<'life0, 'async_trait>(
&'life0 self,
params: ProviderCompleteParams,
) -> Pin<Box<dyn Future<Output = Result<ProviderCompleteResult, String>> + Send + 'async_trait>>where
'life0: 'async_trait,
LazyExtensionHandler: 'async_trait,
fn provider_complete<'life0, 'async_trait>(
&'life0 self,
params: ProviderCompleteParams,
) -> Pin<Box<dyn Future<Output = Result<ProviderCompleteResult, String>> + Send + 'async_trait>>where
'life0: 'async_trait,
LazyExtensionHandler: 'async_trait,
Complete a chat request through an extension-provided model provider.
Source§fn provider_stream<'life0, 'async_trait>(
&'life0 self,
params: ProviderCompleteParams,
sink: Sender<ProviderStreamEvent>,
) -> Pin<Box<dyn Future<Output = Result<ProviderCompleteResult, String>> + Send + 'async_trait>>where
'life0: 'async_trait,
LazyExtensionHandler: 'async_trait,
fn provider_stream<'life0, 'async_trait>(
&'life0 self,
params: ProviderCompleteParams,
sink: Sender<ProviderStreamEvent>,
) -> Pin<Box<dyn Future<Output = Result<ProviderCompleteResult, String>> + Send + 'async_trait>>where
'life0: 'async_trait,
LazyExtensionHandler: 'async_trait,
Stream a chat request through an extension-provided model provider. Read more
Source§fn invoke_command<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
command: &'life1 str,
args: Vec<String>,
request_id: &'life2 str,
sink: InvokeEventSink,
) -> Pin<Box<dyn Future<Output = Result<Value, String>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
LazyExtensionHandler: 'async_trait,
fn invoke_command<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
command: &'life1 str,
args: Vec<String>,
request_id: &'life2 str,
sink: InvokeEventSink,
) -> Pin<Box<dyn Future<Output = Result<Value, String>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
LazyExtensionHandler: 'async_trait,
Invoke a plugin-registered interactive slash command. The handler must
forward
command.output notifications matching request_id and any
task.* notifications to sink. Returns the final response value. Read moreSource§fn get_info<'life0, 'async_trait>(
&'life0 self,
) -> Pin<Box<dyn Future<Output = Result<PluginInfo, String>> + Send + 'async_trait>>where
'life0: 'async_trait,
LazyExtensionHandler: 'async_trait,
fn get_info<'life0, 'async_trait>(
&'life0 self,
) -> Pin<Box<dyn Future<Output = Result<PluginInfo, String>> + Send + 'async_trait>>where
'life0: 'async_trait,
LazyExtensionHandler: 'async_trait,
Fetch optional plugin capability/build/model information.
Source§fn sidecar_spawn_args<'life0, 'async_trait>(
&'life0 self,
) -> Pin<Box<dyn Future<Output = Result<SidecarSpawnArgs, String>> + Send + 'async_trait>>where
'life0: 'async_trait,
LazyExtensionHandler: 'async_trait,
fn sidecar_spawn_args<'life0, 'async_trait>(
&'life0 self,
) -> Pin<Box<dyn Future<Output = Result<SidecarSpawnArgs, String>> + Send + 'async_trait>>where
'life0: 'async_trait,
LazyExtensionHandler: 'async_trait,
Ask the plugin to supply sidecar spawn arguments. Used by the
modality-neutral sidecar bootstrap path (see
crate::sidecar::spawn); plugins that don’t host a sidecar
should leave the default Err in place. Core treats the
returned [SidecarSpawnArgs::args] as opaque.Source§fn settings_editor_open<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
category: &'life1 str,
field: &'life2 str,
) -> Pin<Box<dyn Future<Output = Result<Value, String>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
LazyExtensionHandler: 'async_trait,
fn settings_editor_open<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
category: &'life1 str,
field: &'life2 str,
) -> Pin<Box<dyn Future<Output = Result<Value, String>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
LazyExtensionHandler: 'async_trait,
Open a plugin-owned custom settings editor and return its initial render payload.
Source§fn settings_editor_key<'life0, 'life1, 'life2, 'life3, 'async_trait>(
&'life0 self,
category: &'life1 str,
field: &'life2 str,
key: &'life3 str,
) -> Pin<Box<dyn Future<Output = Result<Value, String>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
'life3: 'async_trait,
LazyExtensionHandler: 'async_trait,
fn settings_editor_key<'life0, 'life1, 'life2, 'life3, 'async_trait>(
&'life0 self,
category: &'life1 str,
field: &'life2 str,
key: &'life3 str,
) -> Pin<Box<dyn Future<Output = Result<Value, String>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
'life3: 'async_trait,
LazyExtensionHandler: 'async_trait,
Forward a keypress to the active plugin-owned custom settings editor.
Source§fn settings_editor_commit<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
category: &'life1 str,
field: &'life2 str,
value: Value,
) -> Pin<Box<dyn Future<Output = Result<Value, String>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
LazyExtensionHandler: 'async_trait,
fn settings_editor_commit<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
category: &'life1 str,
field: &'life2 str,
value: Value,
) -> Pin<Box<dyn Future<Output = Result<Value, String>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
LazyExtensionHandler: 'async_trait,
Ask the plugin to commit a custom editor value selected by the UI.
Source§fn shutdown<'life0, 'async_trait>(
&'life0 self,
) -> Pin<Box<dyn Future<Output = ()> + Send + 'async_trait>>where
'life0: 'async_trait,
LazyExtensionHandler: 'async_trait,
fn shutdown<'life0, 'async_trait>(
&'life0 self,
) -> Pin<Box<dyn Future<Output = ()> + Send + 'async_trait>>where
'life0: 'async_trait,
LazyExtensionHandler: 'async_trait,
Gracefully shut down the extension.
Source§fn health<'life0, 'async_trait>(
&'life0 self,
) -> Pin<Box<dyn Future<Output = ExtensionHealth> + Send + 'async_trait>>where
'life0: 'async_trait,
LazyExtensionHandler: 'async_trait,
fn health<'life0, 'async_trait>(
&'life0 self,
) -> Pin<Box<dyn Future<Output = ExtensionHealth> + Send + 'async_trait>>where
'life0: 'async_trait,
LazyExtensionHandler: 'async_trait,
Current health state of this handler.
Source§fn lifecycle_snapshot(&self) -> Option<ExtensionLifecycle>
fn lifecycle_snapshot(&self) -> Option<ExtensionLifecycle>
Observe the actual serving runtime without waiting for locks or RPC I/O. Read more
Source§fn subscribe_notifications<'life0, 'async_trait>(
&'life0 self,
) -> Pin<Box<dyn Future<Output = (usize, Receiver<NotificationFrame>)> + Send + 'async_trait>>where
'life0: 'async_trait,
Self: 'async_trait,
fn subscribe_notifications<'life0, 'async_trait>(
&'life0 self,
) -> Pin<Box<dyn Future<Output = (usize, Receiver<NotificationFrame>)> + Send + 'async_trait>>where
'life0: 'async_trait,
Self: 'async_trait,
Subscribe to raw JSON-RPC notifications from this extension.
Returns a monotonic subscription id (for unsubscribing) and a
receiver that yields every notification frame. The default
implementation returns a channel whose sender is immediately
dropped, so the receiver yields
None right away — effectively
a no-op for handler impls that don’t support notifications.Auto Trait Implementations§
impl Freeze for LazyExtensionHandler
impl RefUnwindSafe for LazyExtensionHandler
impl Send for LazyExtensionHandler
impl Sync for LazyExtensionHandler
impl Unpin for LazyExtensionHandler
impl UnsafeUnpin for LazyExtensionHandler
impl UnwindSafe for LazyExtensionHandler
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more
Source§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
Source§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Convert
Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>. Box<dyn Any> can
then be further downcast into Box<ConcreteType> where ConcreteType implements Trait.Source§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Convert
Rc<Trait> (where Trait: Downcast) to Rc<Any>. Rc<Any> can then be
further downcast into Rc<ConcreteType> where ConcreteType implements Trait.Source§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
Convert
&Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &Any’s vtable from &Trait’s.Source§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
Convert
&mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &mut Any’s vtable from &mut Trait’s.Source§impl<T> DowncastSync for T
impl<T> DowncastSync for T
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
Source§fn in_current_span(self) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
Converts
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
Converts
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more