pub struct ProcessExtension { /* private fields */ }Expand description
A running extension process communicating via JSON-RPC 2.0 over stdio.
Implementations§
Source§impl ProcessExtension
impl ProcessExtension
Sourcepub async fn force_shutdown(&self)
pub async fn force_shutdown(&self)
Abort the child transport immediately. Cancellation uses this rather than waiting for the per-call permit; draining pending responders releases every blocked call/producer.
pub async fn spawn( id: &str, command: &str, args: &[String], ) -> Result<ProcessExtension, String>
Sourcepub async fn spawn_with_cwd(
id: &str,
command: &str,
args: &[String],
cwd: Option<PathBuf>,
) -> Result<ProcessExtension, String>
pub async fn spawn_with_cwd( id: &str, command: &str, args: &[String], cwd: Option<PathBuf>, ) -> Result<ProcessExtension, String>
Spawn command with args and optional working directory.
Child stderr is captured and forwarded to debug tracing with the extension id so extension authors can inspect diagnostics without corrupting stdout.
Sourcepub fn with_restart_policy(self, policy: RestartPolicy) -> ProcessExtension
pub fn with_restart_policy(self, policy: RestartPolicy) -> ProcessExtension
Override the restart policy. Intended for tests.
pub fn restart_count(&self) -> usize
Sourcepub async fn set_permissions(&self, perms: PermissionSet)
pub async fn set_permissions(&self, perms: PermissionSet)
Public for tests: set the permission set used by inbound RPC handlers (e.g. memory.append). Called by the manager after manifest validation.
pub async fn initialize( &self, plugin_root: Option<PathBuf>, config: Value, ) -> Result<InitializeCapabilitiesResult, String>
Trait Implementations§
Source§impl ExtensionHandler for ProcessExtension
impl ExtensionHandler for ProcessExtension
Source§fn handle_no_spawn<'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,
ProcessExtension: 'async_trait,
fn handle_no_spawn<'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,
ProcessExtension: 'async_trait,
The worker path: one hook.handle on the running child only. No
spawn, no restart (call_no_spawn): a missing child or a dead
transport is a failed call, so Continue.
Source§fn lifecycle_snapshot(&self) -> Option<ExtensionLifecycle>
fn lifecycle_snapshot(&self) -> Option<ExtensionLifecycle>
Source§fn call_tool_for<'life0, 'life1, 'life2, 'life3, 'async_trait>(
&'life0 self,
name: &'life1 str,
input: Value,
session_id: Option<&'life2 str>,
cwd: Option<&'life3 Path>,
) -> Pin<Box<dyn Future<Output = Result<Value, String>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
'life3: 'async_trait,
ProcessExtension: 'async_trait,
fn call_tool_for<'life0, 'life1, 'life2, 'life3, 'async_trait>(
&'life0 self,
name: &'life1 str,
input: Value,
session_id: Option<&'life2 str>,
cwd: Option<&'life3 Path>,
) -> Pin<Box<dyn Future<Output = Result<Value, String>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
'life3: 'async_trait,
ProcessExtension: 'async_trait,
Source§fn call_tool_as<'life0, 'life1, 'life2, 'life3, 'life4, 'async_trait>(
&'life0 self,
name: &'life1 str,
input: Value,
session_id: Option<&'life2 str>,
cwd: Option<&'life3 Path>,
caller: Option<&'life4 Author>,
) -> Pin<Box<dyn Future<Output = Result<Value, String>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
'life3: 'async_trait,
'life4: 'async_trait,
ProcessExtension: 'async_trait,
fn call_tool_as<'life0, 'life1, 'life2, 'life3, 'life4, 'async_trait>(
&'life0 self,
name: &'life1 str,
input: Value,
session_id: Option<&'life2 str>,
cwd: Option<&'life3 Path>,
caller: Option<&'life4 Author>,
) -> Pin<Box<dyn Future<Output = Result<Value, String>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
'life3: 'async_trait,
'life4: 'async_trait,
ProcessExtension: 'async_trait,
Self::call_tool_for, naming the run that calls: caller is the
author of the calling run’s memory binding (None = the call’s
context has no binding), sent as tool.call params.caller so an
extension can tell a chat from each of its workers. What a registered
extension tool calls. Default: Self::call_tool_for, for a handler
that has no wire to put it on.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,
ProcessExtension: '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,
ProcessExtension: 'async_trait,
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,
ProcessExtension: '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,
ProcessExtension: 'async_trait,
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,
ProcessExtension: '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,
ProcessExtension: 'async_trait,
command.output notifications matching request_id and any
task.* notifications to sink. Returns the final response value. Read moreSource§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,
ProcessExtension: '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,
ProcessExtension: 'async_trait,
Source§fn get_info<'life0, 'async_trait>(
&'life0 self,
) -> Pin<Box<dyn Future<Output = Result<PluginInfo, String>> + Send + 'async_trait>>where
'life0: 'async_trait,
ProcessExtension: '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,
ProcessExtension: 'async_trait,
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,
ProcessExtension: '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,
ProcessExtension: 'async_trait,
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,
ProcessExtension: '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,
ProcessExtension: 'async_trait,
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,
ProcessExtension: '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,
ProcessExtension: 'async_trait,
Source§fn shutdown<'life0, 'async_trait>(
&'life0 self,
) -> Pin<Box<dyn Future<Output = ()> + Send + 'async_trait>>where
'life0: 'async_trait,
ProcessExtension: 'async_trait,
fn shutdown<'life0, 'async_trait>(
&'life0 self,
) -> Pin<Box<dyn Future<Output = ()> + Send + 'async_trait>>where
'life0: 'async_trait,
ProcessExtension: 'async_trait,
Source§fn subscribe_notifications<'life0, 'async_trait>(
&'life0 self,
) -> Pin<Box<dyn Future<Output = (usize, Receiver<NotificationFrame>)> + Send + 'async_trait>>where
'life0: 'async_trait,
ProcessExtension: '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,
ProcessExtension: 'async_trait,
None right away — effectively
a no-op for handler impls that don’t support notifications.Source§fn restart_count<'life0, 'async_trait>(
&'life0 self,
) -> Pin<Box<dyn Future<Output = usize> + Send + 'async_trait>>where
'life0: 'async_trait,
ProcessExtension: 'async_trait,
fn restart_count<'life0, 'async_trait>(
&'life0 self,
) -> Pin<Box<dyn Future<Output = usize> + Send + 'async_trait>>where
'life0: 'async_trait,
ProcessExtension: 'async_trait,
Source§fn health<'life0, 'async_trait>(
&'life0 self,
) -> Pin<Box<dyn Future<Output = ExtensionHealth> + Send + 'async_trait>>where
'life0: 'async_trait,
ProcessExtension: 'async_trait,
fn health<'life0, 'async_trait>(
&'life0 self,
) -> Pin<Box<dyn Future<Output = ExtensionHealth> + Send + 'async_trait>>where
'life0: 'async_trait,
ProcessExtension: 'async_trait,
Auto Trait Implementations§
impl !Freeze for ProcessExtension
impl !RefUnwindSafe for ProcessExtension
impl !UnwindSafe for ProcessExtension
impl Forget for ProcessExtension
impl Move for ProcessExtension
impl Send for ProcessExtension
impl Sync for ProcessExtension
impl Unpin for ProcessExtension
impl UnsafeUnpin for ProcessExtension
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
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>
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>
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)
&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)
&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> ⓘ
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> ⓘ
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