Skip to main content

meerkat_schedule/
lib.rs

1#[cfg(target_arch = "wasm32")]
2pub mod tokio {
3    pub use tokio_with_wasm::alias::*;
4}
5
6#[cfg(not(target_arch = "wasm32"))]
7pub use ::tokio;
8
9mod driver;
10mod error;
11mod lifecycle;
12pub(crate) mod machines;
13mod service;
14mod store;
15mod surface;
16mod tool_surface;
17mod tools;
18mod trigger;
19mod types;
20
21pub use driver::{
22    DeliveryCompletion, DeliveryDispatch, DeliveryTerminal, ScheduleDriver, ScheduleDriverConfig,
23    ScheduleTargetDelivery, ScheduleTargetProbe, ScheduleTickReport, TargetProbeOutcome,
24};
25pub use error::{ScheduleDomainError, ScheduleStoreError};
26pub use lifecycle::{
27    AuthorizedOccurrenceWrite, AuthorizedScheduleWrite, ClaimedDispatchDisposition,
28    ClaimedDispatchVerdict, CompletionSupersessionDisposition, CompletionSupersessionVerdict,
29    LateCompletionResolutionClass, OccurrenceDueAction, OccurrenceLifecycleEffect,
30    OccurrenceLifecycleError, OccurrenceLifecycleInput, OccurrenceLifecycleMutator,
31    OccurrenceSupersessionAck, OccurrenceWritePrecondition, ScheduleLifecycleEffect,
32    ScheduleLifecycleError, ScheduleLifecycleInput, ScheduleLifecycleMutator,
33    ScheduleWritePrecondition, StaleCompletionArrivalTrigger,
34};
35pub use service::ScheduleService;
36pub use store::{
37    ClaimDueRequest, ClaimDueResult, DisabledScheduleStore, MemoryScheduleStore, OccurrenceFilter,
38    PendingSupersession, ScheduleFilter, ScheduleStore, ScheduleStoreKind,
39    apply_supersession_feedback,
40};
41pub use surface::wire_schedule_tools;
42pub use tool_surface::ScheduleToolSurface;
43pub use tools::{
44    CAPABILITY_UNAVAILABLE as SCHEDULE_TOOL_CAPABILITY_UNAVAILABLE,
45    CurrentSessionScheduleToolDispatcher, INVALID_ARGUMENTS as SCHEDULE_TOOL_INVALID_ARGUMENTS,
46    NOT_FOUND as SCHEDULE_TOOL_NOT_FOUND, ScheduleToolDispatcher, ScheduleToolError,
47    handle_schedule_tools_call, schedule_tools_list,
48};
49pub use trigger::{CronAuthoringSpec, next_due_after, occurrences_for_horizon};
50pub use types::{
51    CalendarFieldSpec, CalendarTriggerSpec, CreateScheduleRequest, DeliveryCompletionFailureReason,
52    DeliveryFailureReason, DeliveryReceipt, DeliveryReceiptStage, ForkContextSpec,
53    HelperOptionsSpec, IntervalTriggerSpec, MisfirePolicy, MissingTargetPolicy, MobTargetBinding,
54    Occurrence, OccurrenceFailureClass, OccurrenceId, OccurrenceOrdinal, OccurrencePhase,
55    OccurrenceTargetProbeOutcome, OverlapPolicy, ResolvedSpawnSnapshot, RuntimeCompletionOutcome,
56    RuntimeDeliveryOutcome, Schedule, ScheduleConfig, ScheduleId, SchedulePhase, ScheduleRevision,
57    ScheduleSpawnTooling, ScheduledMobAction, ScheduledMobBackendKind, ScheduledMobRuntimeMode,
58    ScheduledSessionAction, SessionMaterializationSpec, SessionTargetBinding, TargetBinding,
59    TriggerSpec, UpdateScheduleRequest,
60};
61
62pub const SCHEDULE_CAPABILITY_DISABLED_DESCRIPTION: &str = "config.tools.schedule_enabled is false";
63
64pub fn schedule_capability_enabled(config: &meerkat_core::Config) -> bool {
65    config.tools.schedule_enabled
66}
67
68pub const SCHEDULE_CAPABILITY_POLICY: meerkat_capabilities::FeatureCapabilityPolicy =
69    meerkat_capabilities::FeatureCapabilityPolicy::new(
70        schedule_capability_enabled,
71        SCHEDULE_CAPABILITY_DISABLED_DESCRIPTION,
72    );
73
74pub const fn schedule_capability_policy() -> meerkat_capabilities::FeatureCapabilityPolicy {
75    SCHEDULE_CAPABILITY_POLICY
76}
77
78inventory::submit! {
79    meerkat_capabilities::CapabilityRegistration {
80        id: meerkat_capabilities::CapabilityId::Schedule,
81        description: "Realm-scoped durable schedules and occurrence delivery",
82        scope: meerkat_capabilities::CapabilityScope::Universal,
83        requires_feature: None,
84        prerequisites: &[],
85        status_resolver: Some(|config| {
86            let policy = crate::schedule_capability_policy();
87            if policy.is_enabled(config) {
88                meerkat_capabilities::CapabilityStatus::Available
89            } else {
90                meerkat_capabilities::CapabilityStatus::DisabledByPolicy {
91                    description: policy.disabled_description().into(),
92                }
93            }
94        }),
95    }
96}
97
98#[cfg(feature = "skills")]
99inventory::submit! {
100    meerkat_skills::SkillRegistration {
101        id: "schedule-workflow",
102        name: "Schedule Workflow",
103        description: "How to author and inspect durable schedules from agent tools",
104        scope: meerkat_core::skills::SkillScope::Builtin,
105        requires_capabilities: &["schedule"],
106        body: include_str!("../skills/schedule-workflow/SKILL.md"),
107        extensions: &[],
108    }
109}
110
111#[doc(hidden)]
112#[cfg(feature = "machine-schema-exports")]
113pub mod machine_schema_exports {
114    pub fn schedule_lifecycle_schema() -> meerkat_machine_schema::MachineSchema {
115        meerkat_machine_schema::catalog::dsl::schedule_lifecycle_schema_metadata()
116            .attach_to(crate::machines::schedule_lifecycle::ScheduleLifecycleMachineState::schema())
117    }
118
119    pub fn occurrence_lifecycle_schema() -> meerkat_machine_schema::MachineSchema {
120        meerkat_machine_schema::catalog::dsl::occurrence_lifecycle_schema_metadata().attach_to(
121            crate::machines::occurrence_lifecycle::OccurrenceLifecycleMachineState::schema(),
122        )
123    }
124}