use serde::{Deserialize, Serialize};
use super::command::TaskUpdate;
use super::root::{WorkflowNode, WorkflowSpec};
use super::scalar::{AttemptId, CallId, EffectId, HandleId, TaskId};
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(tag = "kind", rename_all = "snake_case")]
pub enum SyscallRequest {
SubmitWorkflow(SubmitWorkflowRequest),
AppendWorkflowNodes(AppendWorkflowNodesRequest),
ActivateSkill(ActivateSkillRequest),
UpdateTask(UpdateTaskRequest),
RequestMemoryWrite(RequestMemoryWriteRequest),
RequestMemoryQuery(RequestMemoryQueryRequest),
SendMessage(SendMessageRequest),
PublishChannel(PublishChannelRequest),
ReceiveMailbox(ReceiveMailboxRequest),
ReceiveChannel(ReceiveChannelRequest),
ReadObject(ReadObjectRequest),
PageIn(PageInRequest),
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct SubmitWorkflowRequest {
pub spec: WorkflowSpec,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct AppendWorkflowNodesRequest {
pub nodes: Vec<WorkflowNode>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct ActivateSkillRequest {
pub name: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub lease_turns: Option<u32>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct UpdateTaskRequest {
pub update: TaskUpdate,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct RequestMemoryWriteRequest {
pub proposal: MemoryWriteProposal,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct MemoryWriteProposal {
pub name: String,
pub kind: MemoryKind,
pub content: String,
#[serde(default, skip_serializing_if = "String::is_empty")]
pub description: String,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub evidence_refs: Vec<String>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum MemoryKind {
User,
Feedback,
Project,
Reference,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct RequestMemoryQueryRequest {
pub query: MemoryQueryProposal,
}
#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct MemoryQueryProposal {
#[serde(default, skip_serializing_if = "String::is_empty")]
pub text: String,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub kinds: Vec<MemoryKind>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub limit: Option<u32>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct PageInRequest {
pub handle_id: HandleId,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct SendMessageRequest {
pub message_id: String,
pub to: TaskId,
pub message_kind: String,
pub payload_handle: HandleId,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub ttl_turns: Option<u32>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct PublishChannelRequest {
pub channel_id: String,
pub message_id: String,
pub subscribers: Vec<TaskId>,
pub message_kind: String,
pub payload_handle: HandleId,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub ttl_turns: Option<u32>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct ReceiveMailboxRequest {
#[serde(default = "default_receive_limit")]
pub limit: u32,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct ReceiveChannelRequest {
pub channel_id: String,
}
fn default_receive_limit() -> u32 {
16
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct ReadObjectRequest {
pub object_id: u32,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(tag = "kind", rename_all = "snake_case")]
pub enum SyscallCausation {
ProviderTool(ProviderToolCausation),
ChildAttempt(ChildAttemptCausation),
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct ProviderToolCausation {
pub provider_effect_id: EffectId,
pub call_id: CallId,
pub task_id: TaskId,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct ChildAttemptCausation {
pub task_id: TaskId,
pub attempt_id: AttemptId,
pub request_seq: u32,
}