Add HR and productivity templates, remove drive.html
This commit is contained in:
parent
5adb6efec4
commit
c0e14819fe
7 changed files with 799 additions and 1043 deletions
1043
drive.html
1043
drive.html
File diff suppressed because it is too large
Load diff
35
hr/employee-engage.gbai/config.json
Normal file
35
hr/employee-engage.gbai/config.json
Normal file
|
|
@ -0,0 +1,35 @@
|
||||||
|
{
|
||||||
|
"name": "employee-engage",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"description": "Employee engagement surveys and sentiment analysis",
|
||||||
|
"author": "General Bots",
|
||||||
|
"category": "hr",
|
||||||
|
"tags": ["engagement", "surveys", "pulse", "sentiment", "feedback", "hr"],
|
||||||
|
"entry_dialog": "default.gbdialog",
|
||||||
|
"features": {
|
||||||
|
"engagement_surveys": true,
|
||||||
|
"pulse_checks": true,
|
||||||
|
"sentiment_analysis": true,
|
||||||
|
"anonymous_feedback": true,
|
||||||
|
"results_dashboard": true,
|
||||||
|
"ai_insights": true
|
||||||
|
},
|
||||||
|
"settings": {
|
||||||
|
"default_anonymous": true,
|
||||||
|
"pulse_frequency": "weekly",
|
||||||
|
"sentiment_threshold": 0.3,
|
||||||
|
"auto_escalate_negative": true,
|
||||||
|
"survey_reminder_days": 3
|
||||||
|
},
|
||||||
|
"permissions": {
|
||||||
|
"create_survey": ["hr", "admin"],
|
||||||
|
"view_results": ["hr", "admin", "manager"],
|
||||||
|
"submit_feedback": ["all"],
|
||||||
|
"manage_settings": ["admin"]
|
||||||
|
},
|
||||||
|
"integrations": {
|
||||||
|
"calendar": true,
|
||||||
|
"mail": true,
|
||||||
|
"analytics": true
|
||||||
|
}
|
||||||
|
}
|
||||||
185
hr/employee-engage.gbai/default.gbdialog
Normal file
185
hr/employee-engage.gbai/default.gbdialog
Normal file
|
|
@ -0,0 +1,185 @@
|
||||||
|
PARAM action AS STRING LIKE "survey" DESCRIPTION "Action to perform: survey, pulse, results, feedback"
|
||||||
|
PARAM survey_type AS STRING LIKE "engagement" DESCRIPTION "Survey type: engagement, pulse, onboarding, exit" OPTIONAL
|
||||||
|
PARAM anonymous AS BOOLEAN LIKE TRUE DESCRIPTION "Anonymous responses" OPTIONAL
|
||||||
|
|
||||||
|
DESCRIPTION "Employee engagement surveys and sentiment analysis"
|
||||||
|
|
||||||
|
SELECT CASE UCASE(action)
|
||||||
|
|
||||||
|
CASE "SURVEY"
|
||||||
|
survey_id = GUID()
|
||||||
|
survey_name = ASK "What is the name of this survey?"
|
||||||
|
target_audience = ASK "Who should receive this survey? (all, department, team, or comma-separated emails)"
|
||||||
|
|
||||||
|
questions = NEW ARRAY
|
||||||
|
adding_questions = TRUE
|
||||||
|
|
||||||
|
WHILE adding_questions
|
||||||
|
question_text = ASK "Enter survey question (or 'done' to finish):"
|
||||||
|
IF UCASE(question_text) = "DONE" THEN
|
||||||
|
adding_questions = FALSE
|
||||||
|
ELSE
|
||||||
|
question_type = ASK "Question type? (scale, choice, text, nps)"
|
||||||
|
|
||||||
|
WITH question
|
||||||
|
id = GUID()
|
||||||
|
text = question_text
|
||||||
|
type = question_type
|
||||||
|
END WITH
|
||||||
|
|
||||||
|
IF question_type = "scale" THEN
|
||||||
|
question.min_label = "Strongly Disagree"
|
||||||
|
question.max_label = "Strongly Agree"
|
||||||
|
question.scale = 5
|
||||||
|
END IF
|
||||||
|
|
||||||
|
IF question_type = "choice" THEN
|
||||||
|
options_text = ASK "Enter options (comma-separated):"
|
||||||
|
question.options = SPLIT(options_text, ",")
|
||||||
|
END IF
|
||||||
|
|
||||||
|
IF question_type = "nps" THEN
|
||||||
|
question.min_label = "Not Likely"
|
||||||
|
question.max_label = "Very Likely"
|
||||||
|
question.scale = 10
|
||||||
|
END IF
|
||||||
|
|
||||||
|
PUSH questions, question
|
||||||
|
END IF
|
||||||
|
END WHILE
|
||||||
|
|
||||||
|
WITH survey
|
||||||
|
id = survey_id
|
||||||
|
name = survey_name
|
||||||
|
type = survey_type
|
||||||
|
questions = questions
|
||||||
|
target = target_audience
|
||||||
|
anonymous = anonymous
|
||||||
|
status = "draft"
|
||||||
|
created_at = NOW()
|
||||||
|
END WITH
|
||||||
|
|
||||||
|
SAVE survey TO "surveys"
|
||||||
|
|
||||||
|
launch_now = ASK "Launch survey now? (yes/no)"
|
||||||
|
IF UCASE(launch_now) = "YES" THEN
|
||||||
|
survey.status = "active"
|
||||||
|
survey.launched_at = NOW()
|
||||||
|
SAVE survey TO "surveys"
|
||||||
|
TALK "Survey launched! Notifications sent to " + target_audience
|
||||||
|
ELSE
|
||||||
|
TALK "Survey saved as draft. Launch when ready from the dashboard."
|
||||||
|
END IF
|
||||||
|
|
||||||
|
CASE "PULSE"
|
||||||
|
pulse_id = GUID()
|
||||||
|
pulse_question = ASK "What quick question do you want to ask?"
|
||||||
|
pulse_frequency = ASK "How often? (daily, weekly, biweekly)"
|
||||||
|
|
||||||
|
WITH pulse
|
||||||
|
id = pulse_id
|
||||||
|
question = pulse_question
|
||||||
|
frequency = pulse_frequency
|
||||||
|
anonymous = TRUE
|
||||||
|
status = "active"
|
||||||
|
created_at = NOW()
|
||||||
|
responses = NEW ARRAY
|
||||||
|
END WITH
|
||||||
|
|
||||||
|
SAVE pulse TO "pulses"
|
||||||
|
TALK "Pulse check created. First pulse will be sent based on " + pulse_frequency + " schedule."
|
||||||
|
|
||||||
|
CASE "RESULTS"
|
||||||
|
surveys = FIND "surveys" WHERE status = "completed" OR status = "active"
|
||||||
|
|
||||||
|
IF LEN(surveys) = 0 THEN
|
||||||
|
TALK "No surveys with results found."
|
||||||
|
ELSE
|
||||||
|
survey_list = ""
|
||||||
|
FOR i = 0 TO LEN(surveys) - 1
|
||||||
|
survey_list = survey_list + (i + 1) + ". " + surveys[i].name + " (" + surveys[i].status + ")\n"
|
||||||
|
END FOR
|
||||||
|
|
||||||
|
selection = ASK "Select survey to view results:\n" + survey_list
|
||||||
|
selected_survey = surveys[INT(selection) - 1]
|
||||||
|
|
||||||
|
responses = FIND "responses" WHERE survey_id = selected_survey.id
|
||||||
|
|
||||||
|
total_responses = LEN(responses)
|
||||||
|
|
||||||
|
IF total_responses = 0 THEN
|
||||||
|
TALK "No responses yet for this survey."
|
||||||
|
ELSE
|
||||||
|
TALK "📊 Results for: " + selected_survey.name
|
||||||
|
TALK "Total responses: " + total_responses
|
||||||
|
|
||||||
|
FOR q = 0 TO LEN(selected_survey.questions) - 1
|
||||||
|
question = selected_survey.questions[q]
|
||||||
|
TALK "\n📋 " + question.text
|
||||||
|
|
||||||
|
IF question.type = "scale" OR question.type = "nps" THEN
|
||||||
|
sum = 0
|
||||||
|
FOR r = 0 TO LEN(responses) - 1
|
||||||
|
answer = responses[r].answers[q]
|
||||||
|
sum = sum + answer
|
||||||
|
END FOR
|
||||||
|
avg = sum / total_responses
|
||||||
|
TALK "Average: " + FORMAT(avg, "0.0") + " / " + question.scale
|
||||||
|
END IF
|
||||||
|
|
||||||
|
IF question.type = "choice" THEN
|
||||||
|
FOR opt = 0 TO LEN(question.options) - 1
|
||||||
|
count = 0
|
||||||
|
FOR r = 0 TO LEN(responses) - 1
|
||||||
|
IF responses[r].answers[q] = question.options[opt] THEN
|
||||||
|
count = count + 1
|
||||||
|
END IF
|
||||||
|
END FOR
|
||||||
|
pct = (count / total_responses) * 100
|
||||||
|
TALK question.options[opt] + ": " + FORMAT(pct, "0") + "%"
|
||||||
|
END FOR
|
||||||
|
END IF
|
||||||
|
END FOR
|
||||||
|
|
||||||
|
sentiment = ANALYZE SENTIMENT FROM responses
|
||||||
|
TALK "\n🎯 Overall Sentiment: " + sentiment.label + " (" + FORMAT(sentiment.score * 100, "0") + "% positive)"
|
||||||
|
END IF
|
||||||
|
END IF
|
||||||
|
|
||||||
|
CASE "FEEDBACK"
|
||||||
|
feedback_type = ASK "Feedback type? (anonymous, identified, suggestion)"
|
||||||
|
feedback_text = ASK "Enter your feedback:"
|
||||||
|
|
||||||
|
WITH feedback
|
||||||
|
id = GUID()
|
||||||
|
type = feedback_type
|
||||||
|
content = feedback_text
|
||||||
|
anonymous = (feedback_type = "anonymous")
|
||||||
|
sentiment = ANALYZE SENTIMENT FROM feedback_text
|
||||||
|
created_at = NOW()
|
||||||
|
END WITH
|
||||||
|
|
||||||
|
SAVE feedback TO "feedback"
|
||||||
|
|
||||||
|
TALK "Thank you for your feedback!"
|
||||||
|
|
||||||
|
IF feedback.sentiment.score < 0.3 THEN
|
||||||
|
TALK "We noticed this might be a concern. Would you like to speak with HR?"
|
||||||
|
escalate = ASK "Request HR follow-up? (yes/no)"
|
||||||
|
IF UCASE(escalate) = "YES" THEN
|
||||||
|
feedback.escalated = TRUE
|
||||||
|
feedback.escalated_at = NOW()
|
||||||
|
SAVE feedback TO "feedback"
|
||||||
|
TALK "HR has been notified and will follow up."
|
||||||
|
END IF
|
||||||
|
END IF
|
||||||
|
|
||||||
|
CASE ELSE
|
||||||
|
TALK "Employee Engagement System"
|
||||||
|
TALK "Available actions:"
|
||||||
|
TALK "• survey - Create and launch engagement surveys"
|
||||||
|
TALK "• pulse - Quick pulse checks"
|
||||||
|
TALK "• results - View survey results and analytics"
|
||||||
|
TALK "• feedback - Submit anonymous feedback"
|
||||||
|
|
||||||
|
END SELECT
|
||||||
51
hr/team-feedback.gbai/config.json
Normal file
51
hr/team-feedback.gbai/config.json
Normal file
|
|
@ -0,0 +1,51 @@
|
||||||
|
{
|
||||||
|
"name": "team-feedback",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"description": "Team feedback and pulse surveys for managers",
|
||||||
|
"author": "General Bots",
|
||||||
|
"category": "hr",
|
||||||
|
"tags": ["pulse", "feedback", "team", "manager", "surveys", "hr"],
|
||||||
|
"entry_dialog": "default.gbdialog",
|
||||||
|
"features": {
|
||||||
|
"pulse_surveys": true,
|
||||||
|
"team_health": true,
|
||||||
|
"sentiment_analysis": true,
|
||||||
|
"trend_tracking": true,
|
||||||
|
"action_items": true,
|
||||||
|
"ai_insights": true
|
||||||
|
},
|
||||||
|
"settings": {
|
||||||
|
"default_frequency": "weekly",
|
||||||
|
"anonymous_responses": true,
|
||||||
|
"alert_threshold": 3.0,
|
||||||
|
"trend_periods": 4,
|
||||||
|
"auto_remind": true,
|
||||||
|
"reminder_hours": 24
|
||||||
|
},
|
||||||
|
"templates": {
|
||||||
|
"wellbeing": {
|
||||||
|
"name": "Team Wellbeing",
|
||||||
|
"questions": 4
|
||||||
|
},
|
||||||
|
"workload": {
|
||||||
|
"name": "Workload Check",
|
||||||
|
"questions": 4
|
||||||
|
},
|
||||||
|
"collaboration": {
|
||||||
|
"name": "Collaboration Health",
|
||||||
|
"questions": 4
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"permissions": {
|
||||||
|
"create_pulse": ["manager", "hr", "admin"],
|
||||||
|
"view_results": ["manager", "hr", "admin"],
|
||||||
|
"respond": ["team_member"],
|
||||||
|
"manage_actions": ["manager", "hr", "admin"]
|
||||||
|
},
|
||||||
|
"integrations": {
|
||||||
|
"tasks": true,
|
||||||
|
"calendar": true,
|
||||||
|
"mail": true,
|
||||||
|
"analytics": true
|
||||||
|
}
|
||||||
|
}
|
||||||
219
hr/team-feedback.gbai/default.gbdialog
Normal file
219
hr/team-feedback.gbai/default.gbdialog
Normal file
|
|
@ -0,0 +1,219 @@
|
||||||
|
PARAM action AS STRING LIKE "pulse" DESCRIPTION "Action: pulse, review, insights, actions"
|
||||||
|
PARAM team_id AS STRING DESCRIPTION "Team identifier" OPTIONAL
|
||||||
|
PARAM period AS STRING LIKE "weekly" DESCRIPTION "Review period" OPTIONAL
|
||||||
|
|
||||||
|
DESCRIPTION "Team feedback and pulse surveys for managers"
|
||||||
|
|
||||||
|
SELECT CASE UCASE(action)
|
||||||
|
|
||||||
|
CASE "PULSE"
|
||||||
|
pulse_id = GUID()
|
||||||
|
pulse_name = ASK "Name this pulse check (e.g., 'Weekly Team Health'):"
|
||||||
|
|
||||||
|
template = ASK "Use template? (wellbeing, workload, collaboration, custom)"
|
||||||
|
|
||||||
|
questions = NEW ARRAY
|
||||||
|
|
||||||
|
IF template = "wellbeing" THEN
|
||||||
|
PUSH questions, { text: "How are you feeling about work this week?", type: "scale", scale: 5 }
|
||||||
|
PUSH questions, { text: "Do you feel supported by your team?", type: "scale", scale: 5 }
|
||||||
|
PUSH questions, { text: "Is your workload manageable?", type: "scale", scale: 5 }
|
||||||
|
PUSH questions, { text: "Any blockers or concerns?", type: "text" }
|
||||||
|
END IF
|
||||||
|
|
||||||
|
IF template = "workload" THEN
|
||||||
|
PUSH questions, { text: "How would you rate your current workload?", type: "scale", scale: 5 }
|
||||||
|
PUSH questions, { text: "Do you have clarity on priorities?", type: "scale", scale: 5 }
|
||||||
|
PUSH questions, { text: "Are deadlines realistic?", type: "scale", scale: 5 }
|
||||||
|
PUSH questions, { text: "What would help you be more productive?", type: "text" }
|
||||||
|
END IF
|
||||||
|
|
||||||
|
IF template = "collaboration" THEN
|
||||||
|
PUSH questions, { text: "How effective is team communication?", type: "scale", scale: 5 }
|
||||||
|
PUSH questions, { text: "Do you feel your input is valued?", type: "scale", scale: 5 }
|
||||||
|
PUSH questions, { text: "How well is the team working together?", type: "scale", scale: 5 }
|
||||||
|
PUSH questions, { text: "Suggestions for better collaboration?", type: "text" }
|
||||||
|
END IF
|
||||||
|
|
||||||
|
IF template = "custom" THEN
|
||||||
|
adding = TRUE
|
||||||
|
WHILE adding
|
||||||
|
q_text = ASK "Enter question (or 'done'):"
|
||||||
|
IF UCASE(q_text) = "DONE" THEN
|
||||||
|
adding = FALSE
|
||||||
|
ELSE
|
||||||
|
q_type = ASK "Type? (scale/text/choice)"
|
||||||
|
WITH q
|
||||||
|
text = q_text
|
||||||
|
type = q_type
|
||||||
|
scale = 5
|
||||||
|
END WITH
|
||||||
|
PUSH questions, q
|
||||||
|
END IF
|
||||||
|
END WHILE
|
||||||
|
END IF
|
||||||
|
|
||||||
|
frequency = ASK "Send frequency? (once, daily, weekly, biweekly, monthly)"
|
||||||
|
|
||||||
|
WITH pulse
|
||||||
|
id = pulse_id
|
||||||
|
name = pulse_name
|
||||||
|
template = template
|
||||||
|
questions = questions
|
||||||
|
frequency = frequency
|
||||||
|
team_id = team_id
|
||||||
|
anonymous = TRUE
|
||||||
|
status = "active"
|
||||||
|
created_at = NOW()
|
||||||
|
END WITH
|
||||||
|
|
||||||
|
SAVE pulse TO "team_pulses"
|
||||||
|
TALK "Pulse '" + pulse_name + "' created! First survey sends based on " + frequency + " schedule."
|
||||||
|
|
||||||
|
CASE "REVIEW"
|
||||||
|
pulses = FIND "team_pulses" WHERE team_id = team_id OR team_id = NULL
|
||||||
|
|
||||||
|
IF LEN(pulses) = 0 THEN
|
||||||
|
TALK "No pulse surveys found. Create one first with action=pulse"
|
||||||
|
ELSE
|
||||||
|
pulse_list = ""
|
||||||
|
FOR i = 0 TO LEN(pulses) - 1
|
||||||
|
pulse_list = pulse_list + (i + 1) + ". " + pulses[i].name + "\n"
|
||||||
|
END FOR
|
||||||
|
|
||||||
|
selection = ASK "Select pulse to review:\n" + pulse_list
|
||||||
|
selected = pulses[INT(selection) - 1]
|
||||||
|
|
||||||
|
responses = FIND "pulse_responses" WHERE pulse_id = selected.id
|
||||||
|
|
||||||
|
IF LEN(responses) = 0 THEN
|
||||||
|
TALK "No responses yet."
|
||||||
|
ELSE
|
||||||
|
TALK "📊 " + selected.name + " Results"
|
||||||
|
TALK "Responses: " + LEN(responses)
|
||||||
|
|
||||||
|
FOR q = 0 TO LEN(selected.questions) - 1
|
||||||
|
question = selected.questions[q]
|
||||||
|
TALK "\n" + question.text
|
||||||
|
|
||||||
|
IF question.type = "scale" THEN
|
||||||
|
sum = 0
|
||||||
|
FOR r = 0 TO LEN(responses) - 1
|
||||||
|
sum = sum + responses[r].answers[q]
|
||||||
|
END FOR
|
||||||
|
avg = sum / LEN(responses)
|
||||||
|
|
||||||
|
bar = ""
|
||||||
|
filled = INT(avg)
|
||||||
|
FOR b = 1 TO 5
|
||||||
|
IF b <= filled THEN
|
||||||
|
bar = bar + "█"
|
||||||
|
ELSE
|
||||||
|
bar = bar + "░"
|
||||||
|
END IF
|
||||||
|
END FOR
|
||||||
|
TALK bar + " " + FORMAT(avg, "0.0") + "/5"
|
||||||
|
|
||||||
|
IF avg < 3 THEN
|
||||||
|
TALK "⚠️ Area needs attention"
|
||||||
|
END IF
|
||||||
|
END IF
|
||||||
|
|
||||||
|
IF question.type = "text" THEN
|
||||||
|
TALK "Comments:"
|
||||||
|
FOR r = 0 TO LEN(responses) - 1
|
||||||
|
IF responses[r].answers[q] <> "" THEN
|
||||||
|
TALK "• " + responses[r].answers[q]
|
||||||
|
END IF
|
||||||
|
END FOR
|
||||||
|
END IF
|
||||||
|
END FOR
|
||||||
|
|
||||||
|
trend = FIND "pulse_trends" WHERE pulse_id = selected.id ORDER BY date DESC LIMIT 4
|
||||||
|
IF LEN(trend) > 1 THEN
|
||||||
|
TALK "\n📈 Trend (last 4 periods):"
|
||||||
|
FOR t = 0 TO LEN(trend) - 1
|
||||||
|
TALK trend[t].date + ": " + FORMAT(trend[t].avg_score, "0.0")
|
||||||
|
END FOR
|
||||||
|
END IF
|
||||||
|
END IF
|
||||||
|
END IF
|
||||||
|
|
||||||
|
CASE "INSIGHTS"
|
||||||
|
TALK "🔍 AI-Generated Team Insights"
|
||||||
|
|
||||||
|
responses = FIND "pulse_responses" WHERE team_id = team_id ORDER BY created_at DESC LIMIT 50
|
||||||
|
text_feedback = ""
|
||||||
|
FOR r = 0 TO LEN(responses) - 1
|
||||||
|
FOR a = 0 TO LEN(responses[r].answers) - 1
|
||||||
|
IF TYPEOF(responses[r].answers[a]) = "string" THEN
|
||||||
|
text_feedback = text_feedback + responses[r].answers[a] + " "
|
||||||
|
END IF
|
||||||
|
END FOR
|
||||||
|
END FOR
|
||||||
|
|
||||||
|
IF text_feedback <> "" THEN
|
||||||
|
themes = ANALYZE THEMES FROM text_feedback
|
||||||
|
sentiment = ANALYZE SENTIMENT FROM text_feedback
|
||||||
|
|
||||||
|
TALK "\n🎯 Key Themes:"
|
||||||
|
FOR t = 0 TO LEN(themes) - 1
|
||||||
|
TALK "• " + themes[t].topic + " (" + themes[t].count + " mentions)"
|
||||||
|
END FOR
|
||||||
|
|
||||||
|
TALK "\n😊 Team Sentiment: " + sentiment.label
|
||||||
|
TALK "Positive: " + FORMAT(sentiment.positive * 100, "0") + "%"
|
||||||
|
TALK "Neutral: " + FORMAT(sentiment.neutral * 100, "0") + "%"
|
||||||
|
TALK "Negative: " + FORMAT(sentiment.negative * 100, "0") + "%"
|
||||||
|
|
||||||
|
IF sentiment.negative > 0.3 THEN
|
||||||
|
TALK "\n⚠️ Elevated negative sentiment detected. Consider scheduling team discussion."
|
||||||
|
END IF
|
||||||
|
ELSE
|
||||||
|
TALK "Not enough feedback data for insights. Run more pulse surveys."
|
||||||
|
END IF
|
||||||
|
|
||||||
|
CASE "ACTIONS"
|
||||||
|
TALK "📋 Suggested Actions Based on Feedback"
|
||||||
|
|
||||||
|
low_scores = FIND "pulse_trends" WHERE avg_score < 3 AND team_id = team_id
|
||||||
|
|
||||||
|
IF LEN(low_scores) > 0 THEN
|
||||||
|
TALK "\nAreas needing attention:"
|
||||||
|
FOR s = 0 TO LEN(low_scores) - 1
|
||||||
|
TALK "• " + low_scores[s].question_text + " (Score: " + FORMAT(low_scores[s].avg_score, "0.0") + ")"
|
||||||
|
END FOR
|
||||||
|
|
||||||
|
create_action = ASK "Create action item? (yes/no)"
|
||||||
|
IF UCASE(create_action) = "YES" THEN
|
||||||
|
action_text = ASK "Describe the action:"
|
||||||
|
due_date = ASK "Due date (YYYY-MM-DD):"
|
||||||
|
owner = ASK "Owner (email):"
|
||||||
|
|
||||||
|
WITH action_item
|
||||||
|
id = GUID()
|
||||||
|
description = action_text
|
||||||
|
due = due_date
|
||||||
|
assigned_to = owner
|
||||||
|
team_id = team_id
|
||||||
|
source = "team_feedback"
|
||||||
|
status = "open"
|
||||||
|
created_at = NOW()
|
||||||
|
END WITH
|
||||||
|
|
||||||
|
SAVE action_item TO "action_items"
|
||||||
|
TALK "Action item created and assigned to " + owner
|
||||||
|
END IF
|
||||||
|
ELSE
|
||||||
|
TALK "No critical areas identified. Team health looks good!"
|
||||||
|
END IF
|
||||||
|
|
||||||
|
CASE ELSE
|
||||||
|
TALK "Team Feedback System"
|
||||||
|
TALK "Available actions:"
|
||||||
|
TALK "• pulse - Create quick team surveys"
|
||||||
|
TALK "• review - View pulse results"
|
||||||
|
TALK "• insights - AI-generated team insights"
|
||||||
|
TALK "• actions - Review and create action items"
|
||||||
|
|
||||||
|
END SELECT
|
||||||
52
productivity/broadcast.gbai/config.json
Normal file
52
productivity/broadcast.gbai/config.json
Normal file
|
|
@ -0,0 +1,52 @@
|
||||||
|
{
|
||||||
|
"name": "broadcast",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"description": "Internal communications and broadcast messaging",
|
||||||
|
"author": "General Bots",
|
||||||
|
"category": "productivity",
|
||||||
|
"tags": ["broadcast", "communications", "announcements", "campaigns", "newsletter"],
|
||||||
|
"entry_dialog": "default.gbdialog",
|
||||||
|
"features": {
|
||||||
|
"multi_channel": true,
|
||||||
|
"campaign_management": true,
|
||||||
|
"templates": true,
|
||||||
|
"scheduling": true,
|
||||||
|
"analytics": true,
|
||||||
|
"ai_content": true
|
||||||
|
},
|
||||||
|
"settings": {
|
||||||
|
"default_channels": ["email", "chat"],
|
||||||
|
"require_approval": false,
|
||||||
|
"track_opens": true,
|
||||||
|
"track_clicks": true,
|
||||||
|
"max_recipients": 10000
|
||||||
|
},
|
||||||
|
"channels": {
|
||||||
|
"email": {
|
||||||
|
"enabled": true,
|
||||||
|
"track_opens": true
|
||||||
|
},
|
||||||
|
"chat": {
|
||||||
|
"enabled": true,
|
||||||
|
"channel_name": "announcements"
|
||||||
|
},
|
||||||
|
"social": {
|
||||||
|
"enabled": false,
|
||||||
|
"platforms": ["linkedin"]
|
||||||
|
},
|
||||||
|
"sms": {
|
||||||
|
"enabled": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"permissions": {
|
||||||
|
"create_campaign": ["communications", "hr", "admin"],
|
||||||
|
"send_campaign": ["communications", "admin"],
|
||||||
|
"view_analytics": ["communications", "hr", "admin", "manager"],
|
||||||
|
"manage_templates": ["communications", "admin"]
|
||||||
|
},
|
||||||
|
"integrations": {
|
||||||
|
"mail": true,
|
||||||
|
"social": true,
|
||||||
|
"analytics": true
|
||||||
|
}
|
||||||
|
}
|
||||||
257
productivity/broadcast.gbai/default.gbdialog
Normal file
257
productivity/broadcast.gbai/default.gbdialog
Normal file
|
|
@ -0,0 +1,257 @@
|
||||||
|
PARAM action AS STRING LIKE "campaign" DESCRIPTION "Action: campaign, send, schedule, templates, analytics"
|
||||||
|
PARAM channel AS STRING LIKE "all" DESCRIPTION "Channel: all, email, chat, social, sms" OPTIONAL
|
||||||
|
PARAM audience AS STRING DESCRIPTION "Target audience" OPTIONAL
|
||||||
|
|
||||||
|
DESCRIPTION "Internal communications and broadcast messaging"
|
||||||
|
|
||||||
|
SELECT CASE UCASE(action)
|
||||||
|
|
||||||
|
CASE "CAMPAIGN"
|
||||||
|
campaign_id = GUID()
|
||||||
|
campaign_name = ASK "Campaign name:"
|
||||||
|
campaign_goal = ASK "Campaign goal (awareness, engagement, action):"
|
||||||
|
|
||||||
|
TALK "📢 Creating broadcast campaign: " + campaign_name
|
||||||
|
|
||||||
|
message_subject = ASK "Message subject/title:"
|
||||||
|
message_body = ASK "Message content (supports markdown):"
|
||||||
|
|
||||||
|
use_ai = ASK "Use AI to improve message? (yes/no)"
|
||||||
|
IF UCASE(use_ai) = "YES" THEN
|
||||||
|
tone = ASK "Desired tone? (professional, friendly, urgent, inspirational)"
|
||||||
|
improved = IMPROVE TEXT message_body WITH TONE tone
|
||||||
|
TALK "AI-improved version:"
|
||||||
|
TALK improved
|
||||||
|
use_improved = ASK "Use improved version? (yes/no)"
|
||||||
|
IF UCASE(use_improved) = "YES" THEN
|
||||||
|
message_body = improved
|
||||||
|
END IF
|
||||||
|
END IF
|
||||||
|
|
||||||
|
channels_input = ASK "Select channels (comma-separated: email, chat, social, sms, or 'all'):"
|
||||||
|
IF UCASE(channels_input) = "ALL" THEN
|
||||||
|
selected_channels = ["email", "chat", "social", "sms"]
|
||||||
|
ELSE
|
||||||
|
selected_channels = SPLIT(channels_input, ",")
|
||||||
|
END IF
|
||||||
|
|
||||||
|
audience_type = ASK "Audience? (all, department, role, group, custom)"
|
||||||
|
IF audience_type = "custom" THEN
|
||||||
|
audience_filter = ASK "Enter audience filter (emails or group name):"
|
||||||
|
ELSE
|
||||||
|
audience_filter = audience_type
|
||||||
|
END IF
|
||||||
|
|
||||||
|
WITH campaign
|
||||||
|
id = campaign_id
|
||||||
|
name = campaign_name
|
||||||
|
goal = campaign_goal
|
||||||
|
subject = message_subject
|
||||||
|
body = message_body
|
||||||
|
channels = selected_channels
|
||||||
|
audience = audience_filter
|
||||||
|
status = "draft"
|
||||||
|
created_at = NOW()
|
||||||
|
END WITH
|
||||||
|
|
||||||
|
SAVE campaign TO "broadcast_campaigns"
|
||||||
|
|
||||||
|
preview = ASK "Preview campaign? (yes/no)"
|
||||||
|
IF UCASE(preview) = "YES" THEN
|
||||||
|
TALK "📧 Subject: " + campaign.subject
|
||||||
|
TALK "📝 Body: " + campaign.body
|
||||||
|
TALK "📡 Channels: " + JOIN(campaign.channels, ", ")
|
||||||
|
TALK "👥 Audience: " + campaign.audience
|
||||||
|
END IF
|
||||||
|
|
||||||
|
TALK "Campaign saved. Use action=send or action=schedule to distribute."
|
||||||
|
|
||||||
|
CASE "SEND"
|
||||||
|
campaigns = FIND "broadcast_campaigns" WHERE status = "draft" OR status = "scheduled"
|
||||||
|
|
||||||
|
IF LEN(campaigns) = 0 THEN
|
||||||
|
TALK "No campaigns ready to send. Create one first with action=campaign"
|
||||||
|
ELSE
|
||||||
|
campaign_list = ""
|
||||||
|
FOR i = 0 TO LEN(campaigns) - 1
|
||||||
|
campaign_list = campaign_list + (i + 1) + ". " + campaigns[i].name + " (" + campaigns[i].status + ")\n"
|
||||||
|
END FOR
|
||||||
|
|
||||||
|
selection = ASK "Select campaign to send:\n" + campaign_list
|
||||||
|
selected = campaigns[INT(selection) - 1]
|
||||||
|
|
||||||
|
confirm = ASK "Send '" + selected.name + "' now to " + selected.audience + "? (yes/no)"
|
||||||
|
IF UCASE(confirm) = "YES" THEN
|
||||||
|
recipients = GET_RECIPIENTS(selected.audience)
|
||||||
|
sent_count = 0
|
||||||
|
|
||||||
|
FOR ch = 0 TO LEN(selected.channels) - 1
|
||||||
|
channel_name = selected.channels[ch]
|
||||||
|
|
||||||
|
IF channel_name = "email" THEN
|
||||||
|
SEND MAIL TO recipients SUBJECT selected.subject BODY selected.body
|
||||||
|
sent_count = sent_count + LEN(recipients)
|
||||||
|
END IF
|
||||||
|
|
||||||
|
IF channel_name = "chat" THEN
|
||||||
|
POST TO "internal_announcements" CONTENT selected.body
|
||||||
|
sent_count = sent_count + 1
|
||||||
|
END IF
|
||||||
|
|
||||||
|
IF channel_name = "social" THEN
|
||||||
|
POST TO "linkedin" CONTENT selected.body
|
||||||
|
sent_count = sent_count + 1
|
||||||
|
END IF
|
||||||
|
END FOR
|
||||||
|
|
||||||
|
selected.status = "sent"
|
||||||
|
selected.sent_at = NOW()
|
||||||
|
selected.recipients_count = sent_count
|
||||||
|
SAVE selected TO "broadcast_campaigns"
|
||||||
|
|
||||||
|
TALK "✅ Campaign sent successfully!"
|
||||||
|
TALK "Recipients reached: " + sent_count
|
||||||
|
ELSE
|
||||||
|
TALK "Send cancelled."
|
||||||
|
END IF
|
||||||
|
END IF
|
||||||
|
|
||||||
|
CASE "SCHEDULE"
|
||||||
|
campaigns = FIND "broadcast_campaigns" WHERE status = "draft"
|
||||||
|
|
||||||
|
IF LEN(campaigns) = 0 THEN
|
||||||
|
TALK "No draft campaigns to schedule."
|
||||||
|
ELSE
|
||||||
|
campaign_list = ""
|
||||||
|
FOR i = 0 TO LEN(campaigns) - 1
|
||||||
|
campaign_list = campaign_list + (i + 1) + ". " + campaigns[i].name + "\n"
|
||||||
|
END FOR
|
||||||
|
|
||||||
|
selection = ASK "Select campaign to schedule:\n" + campaign_list
|
||||||
|
selected = campaigns[INT(selection) - 1]
|
||||||
|
|
||||||
|
schedule_date = ASK "Schedule date (YYYY-MM-DD):"
|
||||||
|
schedule_time = ASK "Schedule time (HH:MM):"
|
||||||
|
schedule_tz = ASK "Timezone (e.g., America/New_York):"
|
||||||
|
|
||||||
|
selected.status = "scheduled"
|
||||||
|
selected.scheduled_for = schedule_date + "T" + schedule_time
|
||||||
|
selected.timezone = schedule_tz
|
||||||
|
SAVE selected TO "broadcast_campaigns"
|
||||||
|
|
||||||
|
TALK "📅 Campaign scheduled for " + schedule_date + " at " + schedule_time + " " + schedule_tz
|
||||||
|
|
||||||
|
CASE "TEMPLATES"
|
||||||
|
template_action = ASK "Templates action? (list, create, use)"
|
||||||
|
|
||||||
|
IF template_action = "list" THEN
|
||||||
|
templates = FIND "broadcast_templates"
|
||||||
|
IF LEN(templates) = 0 THEN
|
||||||
|
TALK "No templates found. Create one with templates action=create"
|
||||||
|
ELSE
|
||||||
|
TALK "📋 Available templates:"
|
||||||
|
FOR t = 0 TO LEN(templates) - 1
|
||||||
|
TALK (t + 1) + ". " + templates[t].name + " - " + templates[t].category
|
||||||
|
END FOR
|
||||||
|
END IF
|
||||||
|
END IF
|
||||||
|
|
||||||
|
IF template_action = "create" THEN
|
||||||
|
template_name = ASK "Template name:"
|
||||||
|
template_category = ASK "Category (announcement, newsletter, alert, event):"
|
||||||
|
template_subject = ASK "Subject template:"
|
||||||
|
template_body = ASK "Body template (use {{variable}} for placeholders):"
|
||||||
|
|
||||||
|
WITH template
|
||||||
|
id = GUID()
|
||||||
|
name = template_name
|
||||||
|
category = template_category
|
||||||
|
subject = template_subject
|
||||||
|
body = template_body
|
||||||
|
created_at = NOW()
|
||||||
|
END WITH
|
||||||
|
|
||||||
|
SAVE template TO "broadcast_templates"
|
||||||
|
TALK "Template saved!"
|
||||||
|
END IF
|
||||||
|
|
||||||
|
IF template_action = "use" THEN
|
||||||
|
templates = FIND "broadcast_templates"
|
||||||
|
IF LEN(templates) = 0 THEN
|
||||||
|
TALK "No templates available."
|
||||||
|
ELSE
|
||||||
|
template_list = ""
|
||||||
|
FOR t = 0 TO LEN(templates) - 1
|
||||||
|
template_list = template_list + (t + 1) + ". " + templates[t].name + "\n"
|
||||||
|
END FOR
|
||||||
|
|
||||||
|
selection = ASK "Select template:\n" + template_list
|
||||||
|
selected_template = templates[INT(selection) - 1]
|
||||||
|
|
||||||
|
TALK "Using template: " + selected_template.name
|
||||||
|
TALK "Subject: " + selected_template.subject
|
||||||
|
TALK "Body: " + selected_template.body
|
||||||
|
TALK "Run action=campaign to create a campaign using this template."
|
||||||
|
END IF
|
||||||
|
END IF
|
||||||
|
|
||||||
|
CASE "ANALYTICS"
|
||||||
|
period = ASK "Analytics period? (week, month, quarter, all)"
|
||||||
|
|
||||||
|
campaigns = FIND "broadcast_campaigns" WHERE status = "sent"
|
||||||
|
|
||||||
|
IF LEN(campaigns) = 0 THEN
|
||||||
|
TALK "No sent campaigns to analyze."
|
||||||
|
ELSE
|
||||||
|
total_sent = 0
|
||||||
|
total_opened = 0
|
||||||
|
total_clicked = 0
|
||||||
|
|
||||||
|
TALK "📊 Broadcast Analytics"
|
||||||
|
TALK "═══════════════════════════════════"
|
||||||
|
|
||||||
|
FOR c = 0 TO LEN(campaigns) - 1
|
||||||
|
campaign = campaigns[c]
|
||||||
|
opens = campaign.opens_count
|
||||||
|
clicks = campaign.clicks_count
|
||||||
|
sent = campaign.recipients_count
|
||||||
|
|
||||||
|
IF opens = NULL THEN opens = 0
|
||||||
|
IF clicks = NULL THEN clicks = 0
|
||||||
|
IF sent = NULL THEN sent = 0
|
||||||
|
|
||||||
|
total_sent = total_sent + sent
|
||||||
|
total_opened = total_opened + opens
|
||||||
|
total_clicked = total_clicked + clicks
|
||||||
|
|
||||||
|
open_rate = 0
|
||||||
|
IF sent > 0 THEN
|
||||||
|
open_rate = (opens / sent) * 100
|
||||||
|
END IF
|
||||||
|
|
||||||
|
TALK "\n📢 " + campaign.name
|
||||||
|
TALK " Sent: " + sent + " | Opens: " + opens + " (" + FORMAT(open_rate, "0") + "%)"
|
||||||
|
END FOR
|
||||||
|
|
||||||
|
TALK "\n═══════════════════════════════════"
|
||||||
|
TALK "TOTALS"
|
||||||
|
TALK "Campaigns: " + LEN(campaigns)
|
||||||
|
TALK "Messages sent: " + total_sent
|
||||||
|
|
||||||
|
overall_open_rate = 0
|
||||||
|
IF total_sent > 0 THEN
|
||||||
|
overall_open_rate = (total_opened / total_sent) * 100
|
||||||
|
END IF
|
||||||
|
TALK "Overall open rate: " + FORMAT(overall_open_rate, "0") + "%"
|
||||||
|
END IF
|
||||||
|
|
||||||
|
CASE ELSE
|
||||||
|
TALK "📢 Broadcast Communication System"
|
||||||
|
TALK "Available actions:"
|
||||||
|
TALK "• campaign - Create a new broadcast campaign"
|
||||||
|
TALK "• send - Send a campaign immediately"
|
||||||
|
TALK "• schedule - Schedule a campaign for later"
|
||||||
|
TALK "• templates - Manage message templates"
|
||||||
|
TALK "• analytics - View campaign performance"
|
||||||
|
|
||||||
|
END SELECT
|
||||||
Loading…
Add table
Reference in a new issue