feat: add action registry with code-based action definitions

Includes 17 actions with:
- Allowed roles
- Required/optional fields
- AI action costs
- Backend handlers
- Confirmation requirements
This commit is contained in:
Tracewebstudio Dev 2026-06-14 19:28:12 +02:00
parent e947e248e2
commit fced248dfc
2 changed files with 373 additions and 0 deletions

372
src/actions/mod.rs Normal file
View file

@ -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<String>,
pub requires_login: bool,
pub requires_verification: bool,
pub requires_confirmation: bool,
pub required_fields: Vec<String>,
pub optional_fields: Vec<String>,
pub feature_code: String,
pub ai_action_cost: i32,
pub uses_llm: bool,
pub backend_handler: String,
}
pub fn get_action_registry() -> Vec<ActionDefinition> {
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<ActionDefinition> {
get_action_registry()
.into_iter()
.find(|a| a.action_code == action_code)
}
pub fn get_actions_for_role(role: &str) -> Vec<ActionDefinition> {
get_action_registry()
.into_iter()
.filter(|a| a.allowed_roles.contains(&role.to_string()))
.collect()
}

View file

@ -1,3 +1,4 @@
mod actions;
mod chat; mod chat;
mod config; mod config;
mod cover_letter; mod cover_letter;