#ifndef DIDACTYL_TRIGGER_MANAGER_H #define DIDACTYL_TRIGGER_MANAGER_H #include #include #include "config.h" #include "../nostr_core_lib/nostr_core/nostr_core.h" #define TRIGGER_DEFAULT_MAX_ACTIVE 16 #define TRIGGER_SKILL_SLUG_MAX 65 #define TRIGGER_SKILL_CONTENT_MAX 4096 #define TRIGGER_FILTER_JSON_MAX 2048 typedef enum { TRIGGER_ACTION_LLM = 0, TRIGGER_ACTION_TEMPLATE = 1 } trigger_action_type_t; typedef struct { char skill_slug[TRIGGER_SKILL_SLUG_MAX]; char skill_content[TRIGGER_SKILL_CONTENT_MAX]; char filter_json[TRIGGER_FILTER_JSON_MAX]; trigger_action_type_t action_type; int enabled; time_t last_fired; time_t last_seen_created_at; nostr_pool_subscription_t* subscription; void* subscription_ctx; } active_trigger_t; typedef struct trigger_manager { active_trigger_t* triggers; int count; int capacity; didactyl_config_t* cfg; pthread_mutex_t mutex; time_t last_poll_at; } trigger_manager_t; int trigger_manager_init(trigger_manager_t* mgr, didactyl_config_t* cfg); int trigger_manager_load_from_skills(trigger_manager_t* mgr); int trigger_manager_load_from_startup_events(trigger_manager_t* mgr); int trigger_manager_add(trigger_manager_t* mgr, const char* skill_slug, const char* content, const char* filter_json, trigger_action_type_t action_type, int enabled); int trigger_manager_remove(trigger_manager_t* mgr, const char* skill_slug); int trigger_manager_update(trigger_manager_t* mgr, const char* skill_slug, const char* content, const char* filter_json, trigger_action_type_t action_type, int enabled); int trigger_manager_active_count(trigger_manager_t* mgr); int trigger_manager_poll(trigger_manager_t* mgr); char* trigger_manager_status_json(trigger_manager_t* mgr); void trigger_manager_cleanup(trigger_manager_t* mgr); #endif