objectiveai_cli/command/tasks/
mod.rs1use std::pin::Pin;
5
6use futures::{Stream, StreamExt};
7use objectiveai_sdk::cli::command::tasks::{Request, ResponseItem};
8
9use crate::context::Context;
10use crate::error::Error;
11
12pub mod list;
13pub mod run;
14pub mod schedule;
15
16pub(crate) async fn resolve_target(
20 db: &crate::db::Pool,
21 target: objectiveai_sdk::cli::command::tasks::list::Target,
22 default_parent: &str,
23) -> Result<String, Error> {
24 use crate::db::tags;
25 use objectiveai_sdk::cli::command::tasks::list::Target;
26 match target {
27 Target::Me => Ok(default_parent.to_string()),
28 Target::Direct {
29 parent_agent_instance_hierarchy,
30 agent_instance,
31 } => {
32 let parent = parent_agent_instance_hierarchy
33 .unwrap_or_else(|| default_parent.to_string());
34 Ok(format!("{parent}/{agent_instance}"))
35 }
36 Target::Tag { agent_tag } => match tags::lookup(db, &agent_tag).await? {
37 tags::LookupState::Bound {
38 agent_instance_hierarchy,
39 } => Ok(agent_instance_hierarchy),
40 tags::LookupState::Grouped {
41 tag_group_id,
42 parent_agent_instance_hierarchy,
43 ..
44 } => Err(Error::TagGrouped {
45 tag: agent_tag,
46 tag_group_id,
47 parent_agent_instance_hierarchy,
48 }),
49 tags::LookupState::Absent => Err(Error::TagNotFound(agent_tag)),
50 },
51 }
52}
53
54type ItemStream = Pin<Box<dyn Stream<Item = Result<ResponseItem, Error>> + Send>>;
55
56fn once<T: Send + 'static>(
57 item: Result<T, Error>,
58) -> Pin<Box<dyn Stream<Item = Result<T, Error>> + Send>> {
59 Box::pin(futures::stream::once(async move { item }))
60}
61
62pub async fn execute(ctx: &Context, request: Request) -> Result<ItemStream, Error> {
63 let stream: ItemStream = match request {
64 Request::Schedule(req) => {
65 let value = schedule::execute(ctx, req).await?;
66 once(Ok(ResponseItem::Schedule(value)))
67 }
68 Request::ScheduleRequestSchema(req) => {
69 let value = schedule::request_schema::execute(ctx, req).await?;
70 once(Ok(ResponseItem::ScheduleRequestSchema(value)))
71 }
72 Request::ScheduleResponseSchema(req) => {
73 let value = schedule::response_schema::execute(ctx, req).await?;
74 once(Ok(ResponseItem::ScheduleResponseSchema(value)))
75 }
76 Request::List(req) => {
77 let inner = list::execute(ctx, req).await?;
78 Box::pin(inner.map(|r| r.map(ResponseItem::List)))
79 }
80 Request::ListRequestSchema(req) => {
81 let value = list::request_schema::execute(ctx, req).await?;
82 once(Ok(ResponseItem::ListRequestSchema(value)))
83 }
84 Request::ListResponseSchema(req) => {
85 let value = list::response_schema::execute(ctx, req).await?;
86 once(Ok(ResponseItem::ListResponseSchema(value)))
87 }
88 Request::Run(req) => {
89 let inner = run::execute(ctx, req).await?;
90 Box::pin(inner.map(|r| r.map(ResponseItem::Run)))
91 }
92 Request::RunRequestSchema(req) => {
93 let value = run::request_schema::execute(ctx, req).await?;
94 once(Ok(ResponseItem::RunRequestSchema(value)))
95 }
96 Request::RunResponseSchema(req) => {
97 let value = run::response_schema::execute(ctx, req).await?;
98 once(Ok(ResponseItem::RunResponseSchema(value)))
99 }
100 };
101 Ok(stream)
102}