runtime: unify worker creation path
This commit is contained in:
@@ -1,32 +1,9 @@
|
||||
use crate::execution::WorkerExecutionStatus;
|
||||
use crate::identity::{RuntimeId, WorkerId, WorkerRef};
|
||||
use crate::interaction::WorkerInput;
|
||||
use serde::{Deserialize, Serialize};
|
||||
|
||||
/// Intent supplied when a Worker is created.
|
||||
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
|
||||
#[serde(tag = "kind", rename_all = "snake_case")]
|
||||
pub enum WorkerIntent {
|
||||
Assistant {
|
||||
#[serde(default, skip_serializing_if = "Option::is_none")]
|
||||
purpose: Option<String>,
|
||||
},
|
||||
Task {
|
||||
objective: String,
|
||||
},
|
||||
Role {
|
||||
role: String,
|
||||
#[serde(default, skip_serializing_if = "Option::is_none")]
|
||||
purpose: Option<String>,
|
||||
},
|
||||
}
|
||||
|
||||
impl Default for WorkerIntent {
|
||||
fn default() -> Self {
|
||||
Self::Assistant { purpose: None }
|
||||
}
|
||||
}
|
||||
|
||||
/// Profile selector boundary. This is a selector, not a resolved config bundle.
|
||||
/// Profile selector boundary. This is a selector, not a resolved config bundle.
|
||||
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
|
||||
#[serde(tag = "kind", content = "value", rename_all = "snake_case")]
|
||||
pub enum ProfileSelector {
|
||||
@@ -48,77 +25,21 @@ pub struct ConfigBundleRef {
|
||||
pub digest: String,
|
||||
}
|
||||
|
||||
/// Requested capability name plus optional human-readable reason.
|
||||
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
|
||||
pub struct CapabilityRequest {
|
||||
pub name: String,
|
||||
#[serde(default, skip_serializing_if = "Option::is_none")]
|
||||
pub reason: Option<String>,
|
||||
}
|
||||
|
||||
impl CapabilityRequest {
|
||||
pub fn named(name: impl Into<String>) -> Self {
|
||||
Self {
|
||||
name: name.into(),
|
||||
reason: None,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Opaque workspace reference supplied by a caller.
|
||||
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
|
||||
pub struct WorkspaceRef {
|
||||
pub name: String,
|
||||
pub reference: String,
|
||||
}
|
||||
|
||||
/// Opaque mount reference supplied by a caller.
|
||||
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
|
||||
pub struct MountRef {
|
||||
pub name: String,
|
||||
pub reference: String,
|
||||
}
|
||||
|
||||
/// Worker creation request for the catalog/lifecycle API.
|
||||
/// Canonical Runtime Worker creation request.
|
||||
///
|
||||
/// Browser/product launch semantics are resolved by a backend before this
|
||||
/// request is built. The request contains only durable Runtime identity inputs:
|
||||
/// a backend-decided profile selector, a previously synced ConfigBundle identity,
|
||||
/// and optional initial user input that is committed in the same transaction as
|
||||
/// Worker catalog/transcript persistence. It carries no cwd/workspace path, tool
|
||||
/// scope, credential, socket/session path, raw config body, or execution binding
|
||||
/// internals.
|
||||
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
|
||||
pub struct CreateWorkerRequest {
|
||||
pub intent: WorkerIntent,
|
||||
pub profile: ProfileSelector,
|
||||
pub config_bundle: ConfigBundleRef,
|
||||
#[serde(default, skip_serializing_if = "Option::is_none")]
|
||||
pub config_bundle: Option<ConfigBundleRef>,
|
||||
#[serde(default, skip_serializing_if = "Vec::is_empty")]
|
||||
pub requested_capabilities: Vec<CapabilityRequest>,
|
||||
#[serde(default, skip_serializing_if = "Vec::is_empty")]
|
||||
pub workspace_refs: Vec<WorkspaceRef>,
|
||||
#[serde(default, skip_serializing_if = "Vec::is_empty")]
|
||||
pub mount_refs: Vec<MountRef>,
|
||||
}
|
||||
|
||||
impl Default for CreateWorkerRequest {
|
||||
fn default() -> Self {
|
||||
Self {
|
||||
intent: WorkerIntent::default(),
|
||||
profile: ProfileSelector::default(),
|
||||
config_bundle: None,
|
||||
requested_capabilities: Vec::new(),
|
||||
workspace_refs: Vec::new(),
|
||||
mount_refs: Vec::new(),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl CreateWorkerRequest {
|
||||
/// Create a tools-less Worker using runtime-local default resources.
|
||||
pub fn tools_less(intent: WorkerIntent, profile: ProfileSelector) -> Self {
|
||||
Self {
|
||||
intent,
|
||||
profile,
|
||||
config_bundle: None,
|
||||
requested_capabilities: Vec::new(),
|
||||
workspace_refs: Vec::new(),
|
||||
mount_refs: Vec::new(),
|
||||
}
|
||||
}
|
||||
pub initial_input: Option<WorkerInput>,
|
||||
}
|
||||
|
||||
/// Worker lifecycle status for the in-memory embedded runtime.
|
||||
@@ -144,10 +65,8 @@ pub struct WorkerSummary {
|
||||
pub worker_id: WorkerId,
|
||||
pub status: WorkerStatus,
|
||||
pub execution: WorkerExecutionStatus,
|
||||
pub intent: WorkerIntent,
|
||||
pub profile: ProfileSelector,
|
||||
pub requested_capability_count: usize,
|
||||
pub has_config_bundle: bool,
|
||||
pub config_bundle: ConfigBundleRef,
|
||||
pub transcript_len: usize,
|
||||
pub last_event_id: u64,
|
||||
}
|
||||
@@ -160,16 +79,8 @@ pub struct WorkerDetail {
|
||||
pub worker_id: WorkerId,
|
||||
pub status: WorkerStatus,
|
||||
pub execution: WorkerExecutionStatus,
|
||||
pub intent: WorkerIntent,
|
||||
pub profile: ProfileSelector,
|
||||
#[serde(default, skip_serializing_if = "Option::is_none")]
|
||||
pub config_bundle: Option<ConfigBundleRef>,
|
||||
#[serde(default, skip_serializing_if = "Vec::is_empty")]
|
||||
pub requested_capabilities: Vec<CapabilityRequest>,
|
||||
#[serde(default, skip_serializing_if = "Vec::is_empty")]
|
||||
pub workspace_refs: Vec<WorkspaceRef>,
|
||||
#[serde(default, skip_serializing_if = "Vec::is_empty")]
|
||||
pub mount_refs: Vec<MountRef>,
|
||||
pub config_bundle: ConfigBundleRef,
|
||||
pub transcript_len: usize,
|
||||
pub last_event_id: u64,
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user