diff --git a/src/actions/mod.rs b/src/actions/mod.rs new file mode 100644 index 0000000..d16d264 --- /dev/null +++ b/src/actions/mod.rs @@ -0,0 +1,372 @@ +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct ActionDefinition { + pub action_code: String, + pub intent: String, + pub allowed_roles: Vec, + pub requires_login: bool, + pub requires_verification: bool, + pub requires_confirmation: bool, + pub required_fields: Vec, + pub optional_fields: Vec, + pub feature_code: String, + pub ai_action_cost: i32, + pub uses_llm: bool, + pub backend_handler: String, +} + +pub fn get_action_registry() -> Vec { + vec![ + ActionDefinition { + action_code: "search_kb".to_string(), + intent: "search_kb".to_string(), + allowed_roles: vec![ + "COMPANY".to_string(), + "JOB_SEEKER".to_string(), + "CUSTOMER".to_string(), + "PHOTOGRAPHER".to_string(), + "MAKEUP_ARTIST".to_string(), + "TUTOR".to_string(), + "DEVELOPER".to_string(), + "VIDEO_EDITOR".to_string(), + "GRAPHIC_DESIGNER".to_string(), + "SOCIAL_MEDIA_MANAGER".to_string(), + "FITNESS_TRAINER".to_string(), + "CATERING_SERVICES".to_string(), + "UGC_CONTENT_CREATOR".to_string(), + ], + requires_login: true, + requires_verification: false, + requires_confirmation: false, + required_fields: vec!["query".to_string()], + optional_fields: vec![], + feature_code: "search_kb".to_string(), + ai_action_cost: 0, + uses_llm: false, + backend_handler: "kb.search".to_string(), + }, + ActionDefinition { + action_code: "generate_job_description".to_string(), + intent: "generate_job_description".to_string(), + allowed_roles: vec!["COMPANY".to_string()], + requires_login: true, + requires_verification: true, + requires_confirmation: false, + required_fields: vec!["role_title".to_string()], + optional_fields: vec![ + "seniority".to_string(), + "department".to_string(), + "employment_type".to_string(), + "required_skills".to_string(), + "responsibilities".to_string(), + ], + feature_code: "generate_job_description".to_string(), + ai_action_cost: 2, + uses_llm: true, + backend_handler: "ai.generate_job_description".to_string(), + }, + ActionDefinition { + action_code: "create_job_draft".to_string(), + intent: "create_job_draft".to_string(), + allowed_roles: vec!["COMPANY".to_string()], + requires_login: true, + requires_verification: true, + requires_confirmation: true, + required_fields: vec![ + "job_title".to_string(), + "location".to_string(), + "experience".to_string(), + ], + optional_fields: vec![ + "salary".to_string(), + "job_type".to_string(), + "skills".to_string(), + "description".to_string(), + ], + feature_code: "create_job_draft".to_string(), + ai_action_cost: 2, + uses_llm: true, + backend_handler: "jobs.create_draft".to_string(), + }, + ActionDefinition { + action_code: "fill_company_profile_form".to_string(), + intent: "fill_company_profile_form".to_string(), + allowed_roles: vec!["COMPANY".to_string()], + requires_login: true, + requires_verification: false, + requires_confirmation: true, + required_fields: vec![], + optional_fields: vec![ + "company_name".to_string(), + "industry".to_string(), + "location".to_string(), + "description".to_string(), + ], + feature_code: "fill_company_profile_form".to_string(), + ai_action_cost: 1, + uses_llm: true, + backend_handler: "company.fill_profile".to_string(), + }, + ActionDefinition { + action_code: "improve_company_profile".to_string(), + intent: "improve_company_profile".to_string(), + allowed_roles: vec!["COMPANY".to_string()], + requires_login: true, + requires_verification: true, + requires_confirmation: true, + required_fields: vec!["current_description".to_string()], + optional_fields: vec![], + feature_code: "improve_company_profile".to_string(), + ai_action_cost: 2, + uses_llm: true, + backend_handler: "company.improve_profile".to_string(), + }, + ActionDefinition { + action_code: "improve_resume_summary".to_string(), + intent: "improve_resume_summary".to_string(), + allowed_roles: vec!["JOB_SEEKER".to_string()], + requires_login: true, + requires_verification: false, + requires_confirmation: true, + required_fields: vec!["current_summary".to_string()], + optional_fields: vec!["target_role".to_string()], + feature_code: "improve_resume_summary".to_string(), + ai_action_cost: 2, + uses_llm: true, + backend_handler: "job_seeker.improve_resume".to_string(), + }, + ActionDefinition { + action_code: "generate_cover_letter".to_string(), + intent: "generate_cover_letter".to_string(), + allowed_roles: vec!["JOB_SEEKER".to_string()], + requires_login: true, + requires_verification: false, + requires_confirmation: false, + required_fields: vec!["job_title".to_string()], + optional_fields: vec![ + "company_name".to_string(), + "applicant_skills".to_string(), + "tone".to_string(), + ], + feature_code: "generate_cover_letter".to_string(), + ai_action_cost: 2, + uses_llm: true, + backend_handler: "ai.generate_cover_letter".to_string(), + }, + ActionDefinition { + action_code: "improve_jobseeker_profile".to_string(), + intent: "improve_jobseeker_profile".to_string(), + allowed_roles: vec!["JOB_SEEKER".to_string()], + requires_login: true, + requires_verification: false, + requires_confirmation: true, + required_fields: vec!["current_content".to_string()], + optional_fields: vec!["profile_type".to_string()], + feature_code: "improve_jobseeker_profile".to_string(), + ai_action_cost: 2, + uses_llm: true, + backend_handler: "job_seeker.improve_profile".to_string(), + }, + ActionDefinition { + action_code: "create_customer_requirement_draft".to_string(), + intent: "create_customer_requirement_draft".to_string(), + allowed_roles: vec!["CUSTOMER".to_string()], + requires_login: true, + requires_verification: false, + requires_confirmation: true, + required_fields: vec!["service_type".to_string()], + optional_fields: vec![ + "event_type".to_string(), + "location".to_string(), + "date".to_string(), + "budget".to_string(), + "description".to_string(), + ], + feature_code: "create_requirement_draft".to_string(), + ai_action_cost: 2, + uses_llm: true, + backend_handler: "customers.create_requirement".to_string(), + }, + ActionDefinition { + action_code: "improve_requirement_description".to_string(), + intent: "improve_requirement_description".to_string(), + allowed_roles: vec!["CUSTOMER".to_string()], + requires_login: true, + requires_verification: false, + requires_confirmation: true, + required_fields: vec!["current_description".to_string()], + optional_fields: vec![], + feature_code: "improve_requirement".to_string(), + ai_action_cost: 2, + uses_llm: true, + backend_handler: "customers.improve_requirement".to_string(), + }, + ActionDefinition { + action_code: "improve_professional_profile".to_string(), + intent: "improve_professional_profile".to_string(), + allowed_roles: vec![ + "PHOTOGRAPHER".to_string(), + "MAKEUP_ARTIST".to_string(), + "TUTOR".to_string(), + "DEVELOPER".to_string(), + "VIDEO_EDITOR".to_string(), + "GRAPHIC_DESIGNER".to_string(), + "SOCIAL_MEDIA_MANAGER".to_string(), + "FITNESS_TRAINER".to_string(), + "CATERING_SERVICES".to_string(), + "UGC_CONTENT_CREATOR".to_string(), + ], + requires_login: true, + requires_verification: false, + requires_confirmation: true, + required_fields: vec!["current_description".to_string()], + optional_fields: vec!["specialization".to_string()], + feature_code: "improve_professional_profile".to_string(), + ai_action_cost: 2, + uses_llm: true, + backend_handler: "professional.improve_profile".to_string(), + }, + ActionDefinition { + action_code: "generate_service_description".to_string(), + intent: "generate_service_description".to_string(), + allowed_roles: vec![ + "PHOTOGRAPHER".to_string(), + "MAKEUP_ARTIST".to_string(), + "TUTOR".to_string(), + "DEVELOPER".to_string(), + "VIDEO_EDITOR".to_string(), + "GRAPHIC_DESIGNER".to_string(), + "SOCIAL_MEDIA_MANAGER".to_string(), + "FITNESS_TRAINER".to_string(), + "CATERING_SERVICES".to_string(), + "UGC_CONTENT_CREATOR".to_string(), + ], + requires_login: true, + requires_verification: true, + requires_confirmation: false, + required_fields: vec![ + "service_type".to_string(), + "experience".to_string(), + "location".to_string(), + ], + optional_fields: vec![ + "specialization".to_string(), + "pricing".to_string(), + "availability".to_string(), + ], + feature_code: "generate_service_description".to_string(), + ai_action_cost: 2, + uses_llm: true, + backend_handler: "professional.generate_service".to_string(), + }, + ActionDefinition { + action_code: "request_professional_contact".to_string(), + intent: "request_professional_contact".to_string(), + allowed_roles: vec![ + "PHOTOGRAPHER".to_string(), + "MAKEUP_ARTIST".to_string(), + "TUTOR".to_string(), + "DEVELOPER".to_string(), + "VIDEO_EDITOR".to_string(), + "GRAPHIC_DESIGNER".to_string(), + "SOCIAL_MEDIA_MANAGER".to_string(), + "FITNESS_TRAINER".to_string(), + "CATERING_SERVICES".to_string(), + "UGC_CONTENT_CREATOR".to_string(), + ], + requires_login: true, + requires_verification: true, + requires_confirmation: false, + required_fields: vec!["requirement_id".to_string()], + optional_fields: vec![], + feature_code: "request_contact".to_string(), + ai_action_cost: 0, + uses_llm: false, + backend_handler: "leads.request_contact".to_string(), + }, + ActionDefinition { + action_code: "support_ticket_summary".to_string(), + intent: "support_ticket_summary".to_string(), + allowed_roles: vec!["ADMIN".to_string(), "EMPLOYEE".to_string()], + requires_login: true, + requires_verification: true, + requires_confirmation: false, + required_fields: vec!["ticket_id".to_string()], + optional_fields: vec![], + feature_code: "support_ticket_summary".to_string(), + ai_action_cost: 1, + uses_llm: true, + backend_handler: "support.summarize_ticket".to_string(), + }, + ActionDefinition { + action_code: "explain_plan_limits".to_string(), + intent: "explain_plan_limits".to_string(), + allowed_roles: vec![ + "COMPANY".to_string(), + "JOB_SEEKER".to_string(), + "CUSTOMER".to_string(), + "PHOTOGRAPHER".to_string(), + "MAKEUP_ARTIST".to_string(), + "TUTOR".to_string(), + "DEVELOPER".to_string(), + "VIDEO_EDITOR".to_string(), + "GRAPHIC_DESIGNER".to_string(), + "SOCIAL_MEDIA_MANAGER".to_string(), + "FITNESS_TRAINER".to_string(), + "CATERING_SERVICES".to_string(), + "UGC_CONTENT_CREATOR".to_string(), + ], + requires_login: true, + requires_verification: false, + requires_confirmation: false, + required_fields: vec![], + optional_fields: vec![], + feature_code: "explain_plan_limits".to_string(), + ai_action_cost: 0, + uses_llm: false, + backend_handler: "ai.explain_plan".to_string(), + }, + ActionDefinition { + action_code: "check_ai_pack_balance".to_string(), + intent: "check_ai_pack_balance".to_string(), + allowed_roles: vec![ + "COMPANY".to_string(), + "JOB_SEEKER".to_string(), + "CUSTOMER".to_string(), + "PHOTOGRAPHER".to_string(), + "MAKEUP_ARTIST".to_string(), + "TUTOR".to_string(), + "DEVELOPER".to_string(), + "VIDEO_EDITOR".to_string(), + "GRAPHIC_DESIGNER".to_string(), + "SOCIAL_MEDIA_MANAGER".to_string(), + "FITNESS_TRAINER".to_string(), + "CATERING_SERVICES".to_string(), + "UGC_CONTENT_CREATOR".to_string(), + ], + requires_login: true, + requires_verification: false, + requires_confirmation: false, + required_fields: vec![], + optional_fields: vec![], + feature_code: "check_ai_balance".to_string(), + ai_action_cost: 0, + uses_llm: false, + backend_handler: "ai.check_balance".to_string(), + }, + ] +} + +pub fn get_action(action_code: &str) -> Option { + get_action_registry() + .into_iter() + .find(|a| a.action_code == action_code) +} + +pub fn get_actions_for_role(role: &str) -> Vec { + get_action_registry() + .into_iter() + .filter(|a| a.allowed_roles.contains(&role.to_string())) + .collect() +} diff --git a/src/main.rs b/src/main.rs index 67c241e..abc2f56 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,3 +1,4 @@ +mod actions; mod chat; mod config; mod cover_letter;