Skip to main content

Manifest

Struct Manifest 

Source
pub struct Manifest {
    pub owner: String,
    pub name: String,
    pub version: String,
    pub description: String,
    pub exec: Exec,
    pub cli_zip: CliZip,
    pub viewer_zip: Option<String>,
    pub viewer_url: Option<String>,
    pub viewer_routes: Vec<ViewerRoute>,
    pub mcp_servers: Vec<McpServer>,
    pub daemon: bool,
}
Expand description

Declarative metadata a plugin ships with — the on-disk objectiveai.json at <base_dir>/plugins/<owner>/<name>/<version>/objectiveai.json. The CLI reads and writes this shape verbatim (install writes the fetched manifest exactly as authored); the plugins get wire response is a lean projection of it.

Fields§

§owner: String

GitHub <owner> segment of the source repo, written verbatim from the fetched manifest (forks land on disk with whatever owner they authored, not rewritten to the install coordinate).

§name: String

The plugin’s identifier (matches the <name> directory segment).

§version: String

Version string. Semver convention is recommended but not enforced — the host just displays whatever’s here.

§description: String

One-line description of what the plugin does. Surfaced in listings and the plugin’s --help-equivalent UI.

§exec: Exec

Per-OS exec command for the plugin’s cli side — the same shape tools use. The current platform’s vector is the program plus its leading arguments; the run’s args are appended, and the whole thing runs with CWD = <plugin dir>/cli/. Relative program paths resolve against that folder; bare names keep PATH-lookup semantics. An empty per-OS vector means viewer-only for that platform.

§cli_zip: CliZip

Per-OS cli bundle zip filenames. At install the current platform’s entry (when present) is downloaded and extracted into <plugin dir>/cli/ (the Self::exec working directory), the same way Self::viewer_zip extracts to viewer/. Required field; each per-OS entry is optional — absent means the exec needs nothing on disk for that platform (e.g. it invokes a PATH-resolved program, or the plugin is viewer-only).

§viewer_zip: Option<String>

GitHub-release asset filename for the plugin’s viewer UI bundle (a .zip whose root contains index.html plus assets). When absent, the plugin has no viewer tab from this source. Mutually exclusive with Self::viewer_url — validated by Self::validate.

§viewer_url: Option<String>

Remote URL the viewer’s iframe loads directly, instead of an on-disk bundle from Self::viewer_zip. The full URL is used as the iframe src= verbatim — query string, path, port, fragment all pass through. Must use https://, or http:// targeting localhost / 127.0.0.1 (development only).

Mutually exclusive with Self::viewer_zip. Self::viewer_routes apply to remote-URL viewers the same way they apply to zip-bundled viewers — the embedded axum server still hosts the declared routes; the iframe still receives the same postMessage protocol regardless of where its HTML/JS loaded from.

§viewer_routes: Vec<ViewerRoute>

HTTP routes the viewer exposes on behalf of this plugin. Each entry registers a handler at /plugin/<repository>/<path> on the viewer’s embedded axum server; a hit emits a PluginRequest { type, value } event to the React frontend, which dispatches to the plugin’s iframe via the postMessage bridge.

§mcp_servers: Vec<McpServer>

MCP servers the plugin wants the host to expose. Each entry has a name (the identifier agents reference via objectiveai_sdk::agent::ClientObjectiveaiMcpPluginEntry::mcp_servers) plus an authorization flag. Auth-requiring entries flag authorization = true; credentials are resolved by the host (env vars / config), not the manifest.

§daemon: bool

When true, the plugin participates in the per-state plugin daemon (daemon spawn): the daemon launches it as <exec> daemon begin (via the shared plugin executor) and keeps it resident. Host-internal — not surfaced on the plugins get wire projection. Skipped on serialization when false so non-daemon manifests stay lean.

Implementations§

Source§

impl Manifest

Source

pub fn has_viewer(&self) -> bool

Whether this plugin presents a viewer tab in the host. True iff either viewer source field — Self::viewer_zip or Self::viewer_url — is set.

Source

pub fn validate(&self) -> Result<(), &'static str>

Validate fields that can’t be enforced by serde alone: viewer_zip and viewer_url are mutually exclusive, and viewer_url (when present) must be https:// or http:// targeting localhost / 127.0.0.1. Called at every parse boundary (remote-fetched install, on-disk read) so a broken manifest can’t sneak through.

Trait Implementations§

Source§

impl Clone for Manifest

Source§

fn clone(&self) -> Manifest

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Manifest

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<'de> Deserialize<'de> for Manifest

Source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
Source§

impl From<Manifest> for ResponseManifest

Source§

fn from(m: Manifest) -> Self

Converts to this type from the input type.
Source§

impl JsonSchema for Manifest

Source§

fn schema_name() -> Cow<'static, str>

The name of the generated JSON Schema. Read more
Source§

fn schema_id() -> Cow<'static, str>

Returns a string that uniquely identifies the schema produced by this type. Read more
Source§

fn json_schema(generator: &mut SchemaGenerator) -> Schema

Generates a JSON Schema for this type. Read more
Source§

fn inline_schema() -> bool

Whether JSON Schemas generated for this type should be included directly in parent schemas, rather than being re-used where possible using the $ref keyword. Read more
Source§

impl PartialEq for Manifest

Source§

fn eq(&self, other: &Manifest) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 (const: unstable) · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
Source§

impl Serialize for Manifest

Source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where __S: Serializer,

Serialize this value into the given Serde serializer. Read more
Source§

impl StructuralPartialEq for Manifest

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> DeserializeOwned for T
where T: for<'de> Deserialize<'de>,

Source§

impl<T> DynClone for T
where T: Clone,

Source§

fn __clone_box(&self, _: Private) -> *mut ()

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> FromRef<T> for T
where T: Clone,

Source§

fn from_ref(input: &T) -> T

Converts to this type from a reference to the input type.
Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

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 more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

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
Source§

impl<T> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<T> Pointee for T

Source§

type Pointer = u32

Source§

fn debug( pointer: <T as Pointee>::Pointer, f: &mut Formatter<'_>, ) -> Result<(), Error>

Source§

impl<T> PolicyExt for T
where T: ?Sized,

Source§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: Sized + Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow only if self and other return Action::Follow. Read more
Source§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where T: Sized + Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow if either self or other returns Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> Serialize for T
where T: Serialize + ?Sized,

Source§

fn erased_serialize(&self, serializer: &mut dyn Serializer) -> Result<Ok, Error>

Source§

impl<T> ToAst for T

Source§

fn ast(self, begin: usize, end: usize) -> Spanned<Self>

Source§

impl<T> ToJmespath for T
where T: Serialize,

Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more