1use crate::agent::AgentOutput;
6use crate::app::{AgentToolRef, RequestContext, SubjectContext};
7use crate::codec::host_service::{HostServiceChannel, connect_host_service, plain_channel};
8use crate::codec::workflow::{
9 from_wire_get_workflow_provider_run_events_response,
10 from_wire_get_workflow_provider_run_output_response,
11 from_wire_list_workflow_provider_definitions_response,
12 from_wire_list_workflow_provider_runs_response, from_wire_signal_workflow_run_response,
13 from_wire_workflow_definition, from_wire_workflow_event, from_wire_workflow_run,
14 to_wire_apply_workflow_provider_definition_request,
15 to_wire_cancel_workflow_provider_run_request,
16 to_wire_delete_workflow_provider_definition_request,
17 to_wire_deliver_workflow_provider_event_request,
18 to_wire_get_workflow_provider_definition_request,
19 to_wire_get_workflow_provider_run_events_request,
20 to_wire_get_workflow_provider_run_output_request, to_wire_get_workflow_provider_run_request,
21 to_wire_list_workflow_provider_definitions_request,
22 to_wire_list_workflow_provider_runs_request,
23 to_wire_set_workflow_provider_activation_paused_request,
24 to_wire_set_workflow_provider_definition_paused_request,
25 to_wire_signal_or_start_workflow_provider_run_request,
26 to_wire_signal_workflow_provider_run_request, to_wire_start_workflow_provider_run_request,
27};
28use crate::generated::v1;
29use crate::rpc_support::GestaltError;
30
31pub type WorkflowRunStatus = i32;
33
34pub mod workflow_run_status {
36 pub const WORKFLOW_RUN_STATUS_UNSPECIFIED: i32 = 0;
38 pub const WORKFLOW_RUN_STATUS_PENDING: i32 = 1;
40 pub const WORKFLOW_RUN_STATUS_RUNNING: i32 = 2;
42 pub const WORKFLOW_RUN_STATUS_SUCCEEDED: i32 = 3;
44 pub const WORKFLOW_RUN_STATUS_FAILED: i32 = 4;
46 pub const WORKFLOW_RUN_STATUS_CANCELED: i32 = 5;
48}
49
50pub type WorkflowStepStatus = i32;
52
53pub mod workflow_step_status {
55 pub const WORKFLOW_STEP_STATUS_UNSPECIFIED: i32 = 0;
57 pub const WORKFLOW_STEP_STATUS_PENDING: i32 = 1;
59 pub const WORKFLOW_STEP_STATUS_RUNNING: i32 = 2;
61 pub const WORKFLOW_STEP_STATUS_SKIPPED: i32 = 3;
63 pub const WORKFLOW_STEP_STATUS_SUCCEEDED: i32 = 4;
65 pub const WORKFLOW_STEP_STATUS_FAILED: i32 = 5;
67 pub const WORKFLOW_STEP_STATUS_UNKNOWN: i32 = 6;
69}
70
71#[derive(Clone, Debug, Default, PartialEq)]
73pub struct ApplyWorkflowProviderDefinitionRequest {
74 pub provider_name: String,
76 pub spec: Option<WorkflowDefinitionSpec>,
78 pub idempotency_key: String,
80 pub requested_by_subject_id: String,
82 pub context: Option<RequestContext>,
84}
85
86#[derive(Clone, Debug, Default, PartialEq)]
88pub struct BoundWorkflowTarget {
89 pub steps: Vec<WorkflowStep>,
91}
92
93#[derive(Clone, Debug, Default, PartialEq)]
95pub struct CancelWorkflowProviderRunRequest {
96 pub run_id: String,
98 pub reason: String,
100 pub context: Option<RequestContext>,
102}
103
104#[derive(Clone, Debug, Default, PartialEq)]
106pub struct DeleteWorkflowProviderDefinitionRequest {
107 pub definition_id: String,
109 pub context: Option<RequestContext>,
111}
112
113#[derive(Clone, Debug, Default, PartialEq)]
115pub struct DeliverWorkflowProviderEventRequest {
116 pub app_name: String,
118 pub event: Option<WorkflowEvent>,
120 pub delivered_by_subject_id: String,
122 pub provider_name: String,
124 pub context: Option<RequestContext>,
126}
127
128#[derive(Clone, Debug, Default, PartialEq)]
130pub struct GetWorkflowProviderDefinitionRequest {
131 pub definition_id: String,
133 pub context: Option<RequestContext>,
135}
136
137#[derive(Clone, Debug, Default, PartialEq)]
139pub struct GetWorkflowProviderRunEventsRequest {
140 pub run_id: String,
142 pub context: Option<RequestContext>,
144}
145
146#[derive(Clone, Debug, Default, PartialEq)]
148pub struct GetWorkflowProviderRunEventsResponse {
149 pub events: Vec<WorkflowRunEvent>,
151}
152
153#[derive(Clone, Debug, Default, PartialEq)]
155pub struct GetWorkflowProviderRunOutputRequest {
156 pub run_id: String,
158 pub context: Option<RequestContext>,
160}
161
162#[derive(Clone, Debug, Default, PartialEq)]
164pub struct GetWorkflowProviderRunOutputResponse {
165 pub output: Option<serde_json::Value>,
167}
168
169#[derive(Clone, Debug, Default, PartialEq)]
171pub struct GetWorkflowProviderRunRequest {
172 pub run_id: String,
174 pub context: Option<RequestContext>,
176}
177
178#[derive(Clone, Debug, Default, PartialEq)]
180pub struct ListWorkflowProviderDefinitionsRequest {
181 pub context: Option<RequestContext>,
183}
184
185#[derive(Clone, Debug, Default, PartialEq)]
187pub struct ListWorkflowProviderDefinitionsResponse {
188 pub definitions: Vec<WorkflowDefinition>,
190}
191
192#[derive(Clone, Debug, Default, PartialEq)]
194pub struct ListWorkflowProviderRunsRequest {
195 pub page_size: i32,
197 pub page_token: String,
199 pub status: WorkflowRunStatus,
201 pub target_app: String,
203 pub context: Option<RequestContext>,
205}
206
207#[derive(Clone, Debug, Default, PartialEq)]
209pub struct ListWorkflowProviderRunsResponse {
210 pub runs: Vec<WorkflowRun>,
212 pub next_page_token: String,
214}
215
216#[derive(Clone, Debug, Default, PartialEq)]
218pub struct SetWorkflowProviderActivationPausedRequest {
219 pub definition_id: String,
221 pub activation_id: String,
223 pub paused: bool,
225 pub requested_by_subject_id: String,
227 pub context: Option<RequestContext>,
229}
230
231#[derive(Clone, Debug, Default, PartialEq)]
233pub struct SetWorkflowProviderDefinitionPausedRequest {
234 pub definition_id: String,
236 pub paused: bool,
238 pub requested_by_subject_id: String,
240 pub context: Option<RequestContext>,
242}
243
244#[derive(Clone, Debug, Default, PartialEq)]
246pub struct SignalOrStartWorkflowProviderRunRequest {
247 pub workflow_key: String,
249 pub idempotency_key: String,
251 pub created_by_subject_id: String,
253 pub signal: Option<WorkflowSignal>,
255 pub provider_name: String,
257 pub definition_id: String,
259 pub run_as: Option<SubjectContext>,
261 pub input: Option<serde_json::Map<String, serde_json::Value>>,
263 pub expected_definition_generation: i64,
265 pub context: Option<RequestContext>,
267}
268
269#[derive(Clone, Debug, Default, PartialEq)]
271pub struct SignalWorkflowProviderRunRequest {
272 pub run_id: String,
274 pub signal: Option<WorkflowSignal>,
276 pub context: Option<RequestContext>,
278}
279
280#[derive(Clone, Debug, Default, PartialEq)]
282pub struct SignalWorkflowRunResponse {
283 pub run: Option<WorkflowRun>,
285 pub signal: Option<WorkflowSignal>,
287 pub started_run: bool,
289 pub workflow_key: String,
291}
292
293#[derive(Clone, Debug, Default, PartialEq)]
295pub struct StartWorkflowProviderRunRequest {
296 pub idempotency_key: String,
298 pub created_by_subject_id: String,
300 pub workflow_key: String,
302 pub provider_name: String,
304 pub definition_id: String,
306 pub run_as: Option<SubjectContext>,
308 pub input: Option<serde_json::Map<String, serde_json::Value>>,
310 pub expected_definition_generation: i64,
312 pub context: Option<RequestContext>,
314}
315
316#[allow(clippy::enum_variant_names, clippy::large_enum_variant)]
318#[derive(Clone, Debug, PartialEq)]
319pub enum WorkflowActivationTrigger {
320 Schedule(WorkflowScheduleActivation),
322 Event(WorkflowEventActivation),
324}
325
326#[derive(Clone, Debug, Default, PartialEq)]
328pub struct WorkflowActivation {
329 pub id: String,
331 pub input: Option<WorkflowValue>,
333 pub paused: bool,
335 pub trigger: Option<WorkflowActivationTrigger>,
337}
338
339#[derive(Clone, Debug, Default, PartialEq)]
341pub struct WorkflowAgentMessage {
342 pub role: String,
344 pub text: Option<WorkflowText>,
346 pub metadata: Option<serde_json::Map<String, serde_json::Value>>,
348}
349
350#[derive(Clone, Debug, Default, PartialEq)]
352pub struct WorkflowArray {
353 pub values: Vec<WorkflowValue>,
355}
356
357#[derive(Clone, Debug, Default, PartialEq)]
359pub struct WorkflowDefinition {
360 pub id: String,
362 pub generation: i64,
364 pub target: Option<BoundWorkflowTarget>,
366 pub activations: Vec<WorkflowActivation>,
368 pub paused: bool,
370 pub created_by_subject_id: String,
372 pub created_at: Option<std::time::SystemTime>,
374 pub updated_at: Option<std::time::SystemTime>,
376 pub provider_name: String,
378 pub run_as: Option<SubjectContext>,
380}
381
382#[derive(Clone, Debug, Default, PartialEq)]
384pub struct WorkflowDefinitionSpec {
385 pub id: String,
387 pub target: Option<BoundWorkflowTarget>,
389 pub activations: Vec<WorkflowActivation>,
391 pub paused: bool,
393 pub run_as: Option<SubjectContext>,
395}
396
397#[derive(Clone, Debug, Default, PartialEq)]
399pub struct WorkflowEvent {
400 pub id: String,
402 pub source: String,
404 pub spec_version: String,
406 pub r#type: String,
408 pub subject: String,
410 pub time: Option<std::time::SystemTime>,
412 pub datacontenttype: String,
414 pub data: Option<serde_json::Map<String, serde_json::Value>>,
416 pub extensions: std::collections::BTreeMap<String, serde_json::Value>,
418}
419
420#[derive(Clone, Debug, Default, PartialEq)]
422pub struct WorkflowEventActivation {
423 pub r#match: Option<WorkflowEventMatch>,
425}
426
427#[derive(Clone, Debug, Default, PartialEq)]
429pub struct WorkflowEventMatch {
430 pub r#type: String,
432 pub source: String,
434 pub subject: String,
436}
437
438#[derive(Clone, Debug, Default, PartialEq)]
440pub struct WorkflowEventTriggerInvocation {
441 pub activation_id: String,
443 pub event: Option<WorkflowEvent>,
445}
446
447#[derive(Clone, Debug, Default, PartialEq)]
449pub struct WorkflowManualTrigger {}
450
451#[derive(Clone, Debug, Default, PartialEq)]
453pub struct WorkflowObject {
454 pub fields: std::collections::BTreeMap<String, WorkflowValue>,
456}
457
458#[derive(Clone, Debug, Default, PartialEq)]
460pub struct WorkflowPathSource {
461 pub path: String,
463}
464
465#[derive(Clone, Debug, Default, PartialEq)]
467pub struct WorkflowRun {
468 pub id: String,
470 pub status: WorkflowRunStatus,
472 pub target: Option<BoundWorkflowTarget>,
474 pub trigger: Option<WorkflowRunTrigger>,
476 pub created_at: Option<std::time::SystemTime>,
478 pub started_at: Option<std::time::SystemTime>,
480 pub completed_at: Option<std::time::SystemTime>,
482 pub status_message: String,
484 pub output: Option<serde_json::Value>,
486 pub created_by_subject_id: String,
488 pub workflow_key: String,
490 pub provider_name: String,
492 pub definition_id: String,
494 pub run_as: Option<SubjectContext>,
496 pub input: Option<serde_json::Map<String, serde_json::Value>>,
498 pub definition_generation: i64,
500 pub current_step_id: String,
502 pub steps: Vec<WorkflowStepExecution>,
504}
505
506#[derive(Clone, Debug, Default, PartialEq)]
508pub struct WorkflowRunEvent {
509 pub id: String,
511 pub run_id: String,
513 pub step_id: String,
515 pub r#type: String,
517 pub data: Option<serde_json::Map<String, serde_json::Value>>,
519 pub created_at: Option<std::time::SystemTime>,
521}
522
523#[allow(clippy::enum_variant_names, clippy::large_enum_variant)]
525#[derive(Clone, Debug, PartialEq)]
526pub enum WorkflowRunTriggerKind {
527 Manual(WorkflowManualTrigger),
529 Schedule(WorkflowScheduleTrigger),
531 Event(WorkflowEventTriggerInvocation),
533}
534
535#[derive(Clone, Debug, Default, PartialEq)]
537pub struct WorkflowRunTrigger {
538 pub kind: Option<WorkflowRunTriggerKind>,
540}
541
542#[derive(Clone, Debug, Default, PartialEq)]
544pub struct WorkflowScheduleActivation {
545 pub cron: String,
547 pub timezone: String,
549}
550
551#[derive(Clone, Debug, Default, PartialEq)]
553pub struct WorkflowScheduleTrigger {
554 pub activation_id: String,
556 pub scheduled_for: Option<std::time::SystemTime>,
558}
559
560#[derive(Clone, Debug, Default, PartialEq)]
562pub struct WorkflowSignal {
563 pub id: String,
565 pub name: String,
567 pub payload: Option<serde_json::Map<String, serde_json::Value>>,
569 pub metadata: Option<serde_json::Map<String, serde_json::Value>>,
571 pub created_by_subject_id: String,
573 pub created_at: Option<std::time::SystemTime>,
575 pub idempotency_key: String,
577 pub sequence: i64,
579}
580
581#[allow(clippy::enum_variant_names, clippy::large_enum_variant)]
583#[derive(Clone, Debug, PartialEq)]
584pub enum WorkflowStepAction {
585 App(WorkflowStepAppCall),
587 Agent(WorkflowStepAgentTurn),
589}
590
591#[derive(Clone, Debug, Default, PartialEq)]
593pub struct WorkflowStep {
594 pub id: String,
596 pub inputs: std::collections::BTreeMap<String, WorkflowValue>,
598 pub when: Option<WorkflowStepWhen>,
600 pub timeout_seconds: i32,
602 pub metadata: Option<serde_json::Map<String, serde_json::Value>>,
604 pub action: Option<WorkflowStepAction>,
606}
607
608#[derive(Clone, Debug, Default, PartialEq)]
610pub struct WorkflowStepAgentTurn {
611 pub provider: String,
613 pub model: String,
615 pub session_key: String,
617 pub prompt: Option<WorkflowText>,
619 pub messages: Vec<WorkflowAgentMessage>,
621 pub tools: Vec<AgentToolRef>,
623 pub output: Option<AgentOutput>,
625 pub model_options: Option<serde_json::Map<String, serde_json::Value>>,
627}
628
629#[derive(Clone, Debug, Default, PartialEq)]
631pub struct WorkflowStepAppCall {
632 pub name: String,
634 pub operation: String,
636 pub input: Option<WorkflowValue>,
638 pub connection: String,
640 pub instance: String,
642 pub credential_mode: String,
644}
645
646#[derive(Clone, Debug, Default, PartialEq)]
648pub struct WorkflowStepAttempt {
649 pub id: String,
651 pub status: WorkflowStepStatus,
653 pub idempotency_key: String,
655 pub input: Option<serde_json::Value>,
657 pub output: Option<serde_json::Value>,
659 pub status_message: String,
661 pub started_at: Option<std::time::SystemTime>,
663 pub completed_at: Option<std::time::SystemTime>,
665}
666
667#[derive(Clone, Debug, Default, PartialEq)]
669pub struct WorkflowStepExecution {
670 pub step_id: String,
672 pub status: WorkflowStepStatus,
674 pub attempts: Vec<WorkflowStepAttempt>,
676 pub input: Option<serde_json::Value>,
678 pub output: Option<serde_json::Value>,
680 pub status_message: String,
682 pub skip_reason: String,
684 pub started_at: Option<std::time::SystemTime>,
686 pub completed_at: Option<std::time::SystemTime>,
688}
689
690#[derive(Clone, Debug, Default, PartialEq)]
692pub struct WorkflowStepInputSource {
693 pub step_id: String,
695 pub path: String,
697}
698
699#[derive(Clone, Debug, Default, PartialEq)]
701pub struct WorkflowStepOutputSource {
702 pub step_id: String,
704 pub path: String,
706}
707
708#[derive(Clone, Debug, Default, PartialEq)]
710pub struct WorkflowStepWhen {
711 pub value: Option<WorkflowValue>,
713 pub equals: Option<serde_json::Value>,
715}
716
717#[derive(Clone, Debug, Default, PartialEq)]
719pub struct WorkflowText {
720 pub template: String,
722}
723
724#[allow(clippy::enum_variant_names, clippy::large_enum_variant)]
726#[derive(Clone, Debug, PartialEq)]
727pub enum WorkflowValueKind {
728 Literal(serde_json::Value),
730 Object(WorkflowObject),
732 Array(WorkflowArray),
734 Template(WorkflowText),
736 Input(WorkflowPathSource),
738 Signal(WorkflowPathSource),
740 StepOutput(WorkflowStepOutputSource),
742 StepInput(WorkflowStepInputSource),
744}
745
746#[derive(Clone, Debug, Default, PartialEq)]
748pub struct WorkflowValue {
749 pub kind: Option<WorkflowValueKind>,
751}
752
753pub struct Workflow {
755 inner: v1::workflow_client::WorkflowClient<HostServiceChannel>,
756 timeout: Option<std::time::Duration>,
757 context: Option<RequestContext>,
758}
759
760impl Workflow {
761 pub fn new(channel: tonic::transport::Channel) -> Self {
763 Self {
764 inner: v1::workflow_client::WorkflowClient::new(plain_channel(channel)),
765 timeout: None,
766 context: None,
767 }
768 }
769
770 pub fn with_timeout(mut self, timeout: std::time::Duration) -> Self {
773 self.timeout = Some(timeout);
774 self
775 }
776
777 pub fn with_context(mut self, context: RequestContext) -> Self {
780 self.context = Some(context);
781 self
782 }
783
784 pub async fn connect() -> Result<Self, GestaltError> {
786 Self::connect_named("").await
787 }
788
789 pub async fn connect_named(name: &str) -> Result<Self, GestaltError> {
791 Ok(Self {
792 inner: v1::workflow_client::WorkflowClient::new(
793 connect_host_service("workflow", name).await?,
794 ),
795 timeout: None,
796 context: None,
797 })
798 }
799
800 pub async fn apply_definition(
802 &mut self,
803 provider_name: String,
804 idempotency_key: String,
805 spec: Option<WorkflowDefinitionSpec>,
806 ) -> Result<WorkflowDefinition, GestaltError> {
807 let request = ApplyWorkflowProviderDefinitionRequest {
808 provider_name,
809 idempotency_key,
810 spec,
811 context: self.context.clone(),
812 ..Default::default()
813 };
814 let mut tonic_request =
815 tonic::Request::new(to_wire_apply_workflow_provider_definition_request(request));
816 if let Some(timeout) = self.timeout {
817 tonic_request.set_timeout(timeout);
818 }
819 let response = self.inner.apply_definition(tonic_request).await?;
820 Ok(from_wire_workflow_definition(response.into_inner()))
821 }
822
823 pub async fn apply_definition_raw(
825 &mut self,
826 request: ApplyWorkflowProviderDefinitionRequest,
827 ) -> Result<WorkflowDefinition, GestaltError> {
828 let mut request = request;
829 if request.context.is_none() {
830 request.context = self.context.clone();
831 }
832 let mut tonic_request =
833 tonic::Request::new(to_wire_apply_workflow_provider_definition_request(request));
834 if let Some(timeout) = self.timeout {
835 tonic_request.set_timeout(timeout);
836 }
837 let response = self.inner.apply_definition(tonic_request).await?;
838 Ok(from_wire_workflow_definition(response.into_inner()))
839 }
840
841 pub async fn get_definition(
843 &mut self,
844 definition_id: String,
845 ) -> Result<WorkflowDefinition, GestaltError> {
846 let request = GetWorkflowProviderDefinitionRequest {
847 definition_id,
848 context: self.context.clone(),
849 };
850 let mut tonic_request =
851 tonic::Request::new(to_wire_get_workflow_provider_definition_request(request));
852 if let Some(timeout) = self.timeout {
853 tonic_request.set_timeout(timeout);
854 }
855 let response = self.inner.get_definition(tonic_request).await?;
856 Ok(from_wire_workflow_definition(response.into_inner()))
857 }
858
859 pub async fn get_definition_raw(
861 &mut self,
862 request: GetWorkflowProviderDefinitionRequest,
863 ) -> Result<WorkflowDefinition, GestaltError> {
864 let mut request = request;
865 if request.context.is_none() {
866 request.context = self.context.clone();
867 }
868 let mut tonic_request =
869 tonic::Request::new(to_wire_get_workflow_provider_definition_request(request));
870 if let Some(timeout) = self.timeout {
871 tonic_request.set_timeout(timeout);
872 }
873 let response = self.inner.get_definition(tonic_request).await?;
874 Ok(from_wire_workflow_definition(response.into_inner()))
875 }
876
877 pub async fn list_definitions(
879 &mut self,
880 request: ListWorkflowProviderDefinitionsRequest,
881 ) -> Result<Vec<WorkflowDefinition>, GestaltError> {
882 let mut request = request;
883 if request.context.is_none() {
884 request.context = self.context.clone();
885 }
886 let mut tonic_request =
887 tonic::Request::new(to_wire_list_workflow_provider_definitions_request(request));
888 if let Some(timeout) = self.timeout {
889 tonic_request.set_timeout(timeout);
890 }
891 let response = from_wire_list_workflow_provider_definitions_response(
892 self.inner
893 .list_definitions(tonic_request)
894 .await?
895 .into_inner(),
896 );
897 Ok(response.definitions)
898 }
899
900 pub async fn list_definitions_raw(
902 &mut self,
903 request: ListWorkflowProviderDefinitionsRequest,
904 ) -> Result<ListWorkflowProviderDefinitionsResponse, GestaltError> {
905 let mut request = request;
906 if request.context.is_none() {
907 request.context = self.context.clone();
908 }
909 let mut tonic_request =
910 tonic::Request::new(to_wire_list_workflow_provider_definitions_request(request));
911 if let Some(timeout) = self.timeout {
912 tonic_request.set_timeout(timeout);
913 }
914 let response = self.inner.list_definitions(tonic_request).await?;
915 Ok(from_wire_list_workflow_provider_definitions_response(
916 response.into_inner(),
917 ))
918 }
919
920 pub async fn set_definition_paused(
922 &mut self,
923 definition_id: String,
924 paused: bool,
925 ) -> Result<WorkflowDefinition, GestaltError> {
926 let request = SetWorkflowProviderDefinitionPausedRequest {
927 definition_id,
928 paused,
929 context: self.context.clone(),
930 ..Default::default()
931 };
932 let mut tonic_request = tonic::Request::new(
933 to_wire_set_workflow_provider_definition_paused_request(request),
934 );
935 if let Some(timeout) = self.timeout {
936 tonic_request.set_timeout(timeout);
937 }
938 let response = self.inner.set_definition_paused(tonic_request).await?;
939 Ok(from_wire_workflow_definition(response.into_inner()))
940 }
941
942 pub async fn set_definition_paused_raw(
944 &mut self,
945 request: SetWorkflowProviderDefinitionPausedRequest,
946 ) -> Result<WorkflowDefinition, GestaltError> {
947 let mut request = request;
948 if request.context.is_none() {
949 request.context = self.context.clone();
950 }
951 let mut tonic_request = tonic::Request::new(
952 to_wire_set_workflow_provider_definition_paused_request(request),
953 );
954 if let Some(timeout) = self.timeout {
955 tonic_request.set_timeout(timeout);
956 }
957 let response = self.inner.set_definition_paused(tonic_request).await?;
958 Ok(from_wire_workflow_definition(response.into_inner()))
959 }
960
961 pub async fn set_activation_paused(
963 &mut self,
964 definition_id: String,
965 activation_id: String,
966 paused: bool,
967 ) -> Result<WorkflowDefinition, GestaltError> {
968 let request = SetWorkflowProviderActivationPausedRequest {
969 definition_id,
970 activation_id,
971 paused,
972 context: self.context.clone(),
973 ..Default::default()
974 };
975 let mut tonic_request = tonic::Request::new(
976 to_wire_set_workflow_provider_activation_paused_request(request),
977 );
978 if let Some(timeout) = self.timeout {
979 tonic_request.set_timeout(timeout);
980 }
981 let response = self.inner.set_activation_paused(tonic_request).await?;
982 Ok(from_wire_workflow_definition(response.into_inner()))
983 }
984
985 pub async fn set_activation_paused_raw(
987 &mut self,
988 request: SetWorkflowProviderActivationPausedRequest,
989 ) -> Result<WorkflowDefinition, GestaltError> {
990 let mut request = request;
991 if request.context.is_none() {
992 request.context = self.context.clone();
993 }
994 let mut tonic_request = tonic::Request::new(
995 to_wire_set_workflow_provider_activation_paused_request(request),
996 );
997 if let Some(timeout) = self.timeout {
998 tonic_request.set_timeout(timeout);
999 }
1000 let response = self.inner.set_activation_paused(tonic_request).await?;
1001 Ok(from_wire_workflow_definition(response.into_inner()))
1002 }
1003
1004 pub async fn delete_definition(&mut self, definition_id: String) -> Result<(), GestaltError> {
1006 let request = DeleteWorkflowProviderDefinitionRequest {
1007 definition_id,
1008 context: self.context.clone(),
1009 };
1010 let mut tonic_request =
1011 tonic::Request::new(to_wire_delete_workflow_provider_definition_request(request));
1012 if let Some(timeout) = self.timeout {
1013 tonic_request.set_timeout(timeout);
1014 }
1015 self.inner.delete_definition(tonic_request).await?;
1016 Ok(())
1017 }
1018
1019 pub async fn delete_definition_raw(
1021 &mut self,
1022 request: DeleteWorkflowProviderDefinitionRequest,
1023 ) -> Result<(), GestaltError> {
1024 let mut request = request;
1025 if request.context.is_none() {
1026 request.context = self.context.clone();
1027 }
1028 let mut tonic_request =
1029 tonic::Request::new(to_wire_delete_workflow_provider_definition_request(request));
1030 if let Some(timeout) = self.timeout {
1031 tonic_request.set_timeout(timeout);
1032 }
1033 self.inner.delete_definition(tonic_request).await?;
1034 Ok(())
1035 }
1036
1037 #[allow(clippy::too_many_arguments)]
1039 pub async fn start_run(
1040 &mut self,
1041 idempotency_key: String,
1042 workflow_key: String,
1043 provider_name: String,
1044 definition_id: String,
1045 expected_definition_generation: i64,
1046 run_as: Option<SubjectContext>,
1047 input: Option<serde_json::Map<String, serde_json::Value>>,
1048 ) -> Result<WorkflowRun, GestaltError> {
1049 let request = StartWorkflowProviderRunRequest {
1050 idempotency_key,
1051 workflow_key,
1052 provider_name,
1053 definition_id,
1054 expected_definition_generation,
1055 run_as,
1056 input,
1057 context: self.context.clone(),
1058 ..Default::default()
1059 };
1060 let mut tonic_request =
1061 tonic::Request::new(to_wire_start_workflow_provider_run_request(request));
1062 if let Some(timeout) = self.timeout {
1063 tonic_request.set_timeout(timeout);
1064 }
1065 let response = self.inner.start_run(tonic_request).await?;
1066 Ok(from_wire_workflow_run(response.into_inner()))
1067 }
1068
1069 pub async fn start_run_raw(
1071 &mut self,
1072 request: StartWorkflowProviderRunRequest,
1073 ) -> Result<WorkflowRun, GestaltError> {
1074 let mut request = request;
1075 if request.context.is_none() {
1076 request.context = self.context.clone();
1077 }
1078 let mut tonic_request =
1079 tonic::Request::new(to_wire_start_workflow_provider_run_request(request));
1080 if let Some(timeout) = self.timeout {
1081 tonic_request.set_timeout(timeout);
1082 }
1083 let response = self.inner.start_run(tonic_request).await?;
1084 Ok(from_wire_workflow_run(response.into_inner()))
1085 }
1086
1087 pub async fn list_runs(
1089 &mut self,
1090 page_size: i32,
1091 page_token: String,
1092 status: WorkflowRunStatus,
1093 target_app: String,
1094 ) -> Result<ListWorkflowProviderRunsResponse, GestaltError> {
1095 let request = ListWorkflowProviderRunsRequest {
1096 page_size,
1097 page_token,
1098 status,
1099 target_app,
1100 context: self.context.clone(),
1101 };
1102 let mut tonic_request =
1103 tonic::Request::new(to_wire_list_workflow_provider_runs_request(request));
1104 if let Some(timeout) = self.timeout {
1105 tonic_request.set_timeout(timeout);
1106 }
1107 let response = self.inner.list_runs(tonic_request).await?;
1108 Ok(from_wire_list_workflow_provider_runs_response(
1109 response.into_inner(),
1110 ))
1111 }
1112
1113 pub async fn list_runs_raw(
1115 &mut self,
1116 request: ListWorkflowProviderRunsRequest,
1117 ) -> Result<ListWorkflowProviderRunsResponse, GestaltError> {
1118 let mut request = request;
1119 if request.context.is_none() {
1120 request.context = self.context.clone();
1121 }
1122 let mut tonic_request =
1123 tonic::Request::new(to_wire_list_workflow_provider_runs_request(request));
1124 if let Some(timeout) = self.timeout {
1125 tonic_request.set_timeout(timeout);
1126 }
1127 let response = self.inner.list_runs(tonic_request).await?;
1128 Ok(from_wire_list_workflow_provider_runs_response(
1129 response.into_inner(),
1130 ))
1131 }
1132
1133 pub async fn get_run(&mut self, run_id: String) -> Result<WorkflowRun, GestaltError> {
1135 let request = GetWorkflowProviderRunRequest {
1136 run_id,
1137 context: self.context.clone(),
1138 };
1139 let mut tonic_request =
1140 tonic::Request::new(to_wire_get_workflow_provider_run_request(request));
1141 if let Some(timeout) = self.timeout {
1142 tonic_request.set_timeout(timeout);
1143 }
1144 let response = self.inner.get_run(tonic_request).await?;
1145 Ok(from_wire_workflow_run(response.into_inner()))
1146 }
1147
1148 pub async fn get_run_raw(
1150 &mut self,
1151 request: GetWorkflowProviderRunRequest,
1152 ) -> Result<WorkflowRun, GestaltError> {
1153 let mut request = request;
1154 if request.context.is_none() {
1155 request.context = self.context.clone();
1156 }
1157 let mut tonic_request =
1158 tonic::Request::new(to_wire_get_workflow_provider_run_request(request));
1159 if let Some(timeout) = self.timeout {
1160 tonic_request.set_timeout(timeout);
1161 }
1162 let response = self.inner.get_run(tonic_request).await?;
1163 Ok(from_wire_workflow_run(response.into_inner()))
1164 }
1165
1166 pub async fn get_run_events(
1168 &mut self,
1169 run_id: String,
1170 ) -> Result<Vec<WorkflowRunEvent>, GestaltError> {
1171 let request = GetWorkflowProviderRunEventsRequest {
1172 run_id,
1173 context: self.context.clone(),
1174 };
1175 let mut tonic_request =
1176 tonic::Request::new(to_wire_get_workflow_provider_run_events_request(request));
1177 if let Some(timeout) = self.timeout {
1178 tonic_request.set_timeout(timeout);
1179 }
1180 let response = from_wire_get_workflow_provider_run_events_response(
1181 self.inner.get_run_events(tonic_request).await?.into_inner(),
1182 );
1183 Ok(response.events)
1184 }
1185
1186 pub async fn get_run_events_raw(
1188 &mut self,
1189 request: GetWorkflowProviderRunEventsRequest,
1190 ) -> Result<GetWorkflowProviderRunEventsResponse, GestaltError> {
1191 let mut request = request;
1192 if request.context.is_none() {
1193 request.context = self.context.clone();
1194 }
1195 let mut tonic_request =
1196 tonic::Request::new(to_wire_get_workflow_provider_run_events_request(request));
1197 if let Some(timeout) = self.timeout {
1198 tonic_request.set_timeout(timeout);
1199 }
1200 let response = self.inner.get_run_events(tonic_request).await?;
1201 Ok(from_wire_get_workflow_provider_run_events_response(
1202 response.into_inner(),
1203 ))
1204 }
1205
1206 pub async fn get_run_output(
1208 &mut self,
1209 run_id: String,
1210 ) -> Result<Option<serde_json::Value>, GestaltError> {
1211 let request = GetWorkflowProviderRunOutputRequest {
1212 run_id,
1213 context: self.context.clone(),
1214 };
1215 let mut tonic_request =
1216 tonic::Request::new(to_wire_get_workflow_provider_run_output_request(request));
1217 if let Some(timeout) = self.timeout {
1218 tonic_request.set_timeout(timeout);
1219 }
1220 let response = from_wire_get_workflow_provider_run_output_response(
1221 self.inner.get_run_output(tonic_request).await?.into_inner(),
1222 );
1223 Ok(response.output)
1224 }
1225
1226 pub async fn get_run_output_raw(
1228 &mut self,
1229 request: GetWorkflowProviderRunOutputRequest,
1230 ) -> Result<GetWorkflowProviderRunOutputResponse, GestaltError> {
1231 let mut request = request;
1232 if request.context.is_none() {
1233 request.context = self.context.clone();
1234 }
1235 let mut tonic_request =
1236 tonic::Request::new(to_wire_get_workflow_provider_run_output_request(request));
1237 if let Some(timeout) = self.timeout {
1238 tonic_request.set_timeout(timeout);
1239 }
1240 let response = self.inner.get_run_output(tonic_request).await?;
1241 Ok(from_wire_get_workflow_provider_run_output_response(
1242 response.into_inner(),
1243 ))
1244 }
1245
1246 pub async fn cancel_run(
1248 &mut self,
1249 run_id: String,
1250 reason: String,
1251 ) -> Result<WorkflowRun, GestaltError> {
1252 let request = CancelWorkflowProviderRunRequest {
1253 run_id,
1254 reason,
1255 context: self.context.clone(),
1256 };
1257 let mut tonic_request =
1258 tonic::Request::new(to_wire_cancel_workflow_provider_run_request(request));
1259 if let Some(timeout) = self.timeout {
1260 tonic_request.set_timeout(timeout);
1261 }
1262 let response = self.inner.cancel_run(tonic_request).await?;
1263 Ok(from_wire_workflow_run(response.into_inner()))
1264 }
1265
1266 pub async fn cancel_run_raw(
1268 &mut self,
1269 request: CancelWorkflowProviderRunRequest,
1270 ) -> Result<WorkflowRun, GestaltError> {
1271 let mut request = request;
1272 if request.context.is_none() {
1273 request.context = self.context.clone();
1274 }
1275 let mut tonic_request =
1276 tonic::Request::new(to_wire_cancel_workflow_provider_run_request(request));
1277 if let Some(timeout) = self.timeout {
1278 tonic_request.set_timeout(timeout);
1279 }
1280 let response = self.inner.cancel_run(tonic_request).await?;
1281 Ok(from_wire_workflow_run(response.into_inner()))
1282 }
1283
1284 pub async fn signal_run(
1286 &mut self,
1287 run_id: String,
1288 signal: Option<WorkflowSignal>,
1289 ) -> Result<SignalWorkflowRunResponse, GestaltError> {
1290 let request = SignalWorkflowProviderRunRequest {
1291 run_id,
1292 signal,
1293 context: self.context.clone(),
1294 };
1295 let mut tonic_request =
1296 tonic::Request::new(to_wire_signal_workflow_provider_run_request(request));
1297 if let Some(timeout) = self.timeout {
1298 tonic_request.set_timeout(timeout);
1299 }
1300 let response = self.inner.signal_run(tonic_request).await?;
1301 Ok(from_wire_signal_workflow_run_response(
1302 response.into_inner(),
1303 ))
1304 }
1305
1306 pub async fn signal_run_raw(
1308 &mut self,
1309 request: SignalWorkflowProviderRunRequest,
1310 ) -> Result<SignalWorkflowRunResponse, GestaltError> {
1311 let mut request = request;
1312 if request.context.is_none() {
1313 request.context = self.context.clone();
1314 }
1315 let mut tonic_request =
1316 tonic::Request::new(to_wire_signal_workflow_provider_run_request(request));
1317 if let Some(timeout) = self.timeout {
1318 tonic_request.set_timeout(timeout);
1319 }
1320 let response = self.inner.signal_run(tonic_request).await?;
1321 Ok(from_wire_signal_workflow_run_response(
1322 response.into_inner(),
1323 ))
1324 }
1325
1326 #[allow(clippy::too_many_arguments)]
1328 pub async fn signal_or_start_run(
1329 &mut self,
1330 workflow_key: String,
1331 idempotency_key: String,
1332 provider_name: String,
1333 definition_id: String,
1334 expected_definition_generation: i64,
1335 signal: Option<WorkflowSignal>,
1336 run_as: Option<SubjectContext>,
1337 input: Option<serde_json::Map<String, serde_json::Value>>,
1338 ) -> Result<SignalWorkflowRunResponse, GestaltError> {
1339 let request = SignalOrStartWorkflowProviderRunRequest {
1340 workflow_key,
1341 idempotency_key,
1342 provider_name,
1343 definition_id,
1344 expected_definition_generation,
1345 signal,
1346 run_as,
1347 input,
1348 context: self.context.clone(),
1349 ..Default::default()
1350 };
1351 let mut tonic_request = tonic::Request::new(
1352 to_wire_signal_or_start_workflow_provider_run_request(request),
1353 );
1354 if let Some(timeout) = self.timeout {
1355 tonic_request.set_timeout(timeout);
1356 }
1357 let response = self.inner.signal_or_start_run(tonic_request).await?;
1358 Ok(from_wire_signal_workflow_run_response(
1359 response.into_inner(),
1360 ))
1361 }
1362
1363 pub async fn signal_or_start_run_raw(
1365 &mut self,
1366 request: SignalOrStartWorkflowProviderRunRequest,
1367 ) -> Result<SignalWorkflowRunResponse, GestaltError> {
1368 let mut request = request;
1369 if request.context.is_none() {
1370 request.context = self.context.clone();
1371 }
1372 let mut tonic_request = tonic::Request::new(
1373 to_wire_signal_or_start_workflow_provider_run_request(request),
1374 );
1375 if let Some(timeout) = self.timeout {
1376 tonic_request.set_timeout(timeout);
1377 }
1378 let response = self.inner.signal_or_start_run(tonic_request).await?;
1379 Ok(from_wire_signal_workflow_run_response(
1380 response.into_inner(),
1381 ))
1382 }
1383
1384 pub async fn deliver_event(
1386 &mut self,
1387 event: Option<WorkflowEvent>,
1388 options: WorkflowDeliverEventOptions,
1389 ) -> Result<WorkflowEvent, GestaltError> {
1390 let request = DeliverWorkflowProviderEventRequest {
1391 event,
1392 app_name: options.app_name,
1393 provider_name: options.provider_name,
1394 context: self.context.clone(),
1395 ..Default::default()
1396 };
1397 let mut tonic_request =
1398 tonic::Request::new(to_wire_deliver_workflow_provider_event_request(request));
1399 if let Some(timeout) = self.timeout {
1400 tonic_request.set_timeout(timeout);
1401 }
1402 let response = self.inner.deliver_event(tonic_request).await?;
1403 Ok(from_wire_workflow_event(response.into_inner()))
1404 }
1405
1406 pub async fn deliver_event_raw(
1408 &mut self,
1409 request: DeliverWorkflowProviderEventRequest,
1410 ) -> Result<WorkflowEvent, GestaltError> {
1411 let mut request = request;
1412 if request.context.is_none() {
1413 request.context = self.context.clone();
1414 }
1415 let mut tonic_request =
1416 tonic::Request::new(to_wire_deliver_workflow_provider_event_request(request));
1417 if let Some(timeout) = self.timeout {
1418 tonic_request.set_timeout(timeout);
1419 }
1420 let response = self.inner.deliver_event(tonic_request).await?;
1421 Ok(from_wire_workflow_event(response.into_inner()))
1422 }
1423}
1424
1425#[derive(Clone, Debug, Default)]
1428pub struct WorkflowDeliverEventOptions {
1429 pub app_name: String,
1431 pub provider_name: String,
1433}