Merge pull request #1767 from escapade-mckv/prebuilt-agents

Prebuilt agents
This commit is contained in:
Bobbie 2025-10-01 22:58:31 +05:30 committed by GitHub
commit 7ff206157d
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 53 additions and 12 deletions

View File

@ -601,8 +601,8 @@ class WorkflowExecutor:
return available_tools return available_tools
async def _validate_workflow_execution(self, account_id: str) -> None: async def _validate_workflow_execution(self, account_id: str) -> None:
from core.billing import is_model_allowed, get_user_subscription_tier from core.billing import is_model_allowed
from billing.billing_integration import billing_integration from core.billing.billing_integration import billing_integration
client = await self._db.client client = await self._db.client
from core.ai_models import model_manager from core.ai_models import model_manager

View File

@ -357,6 +357,13 @@ export const SimplifiedScheduleConfig: React.FC<SimplifiedScheduleConfigProps> =
} }
}, [oneTimeDate, oneTimeHour, oneTimeMinute]); }, [oneTimeDate, oneTimeHour, oneTimeMinute]);
// Initialize recurring schedule on component mount if no preset is selected
useEffect(() => {
if (!selectedPreset && !config.cron_expression) {
handleRecurringScheduleChange();
}
}, []);
const handlePresetSelect = (presetId: string) => { const handlePresetSelect = (presetId: string) => {
const allPresets = [...QUICK_PRESETS, ...RECURRING_PRESETS]; const allPresets = [...QUICK_PRESETS, ...RECURRING_PRESETS];
const preset = allPresets.find(p => p.id === presetId); const preset = allPresets.find(p => p.id === presetId);
@ -384,17 +391,17 @@ export const SimplifiedScheduleConfig: React.FC<SimplifiedScheduleConfigProps> =
}; };
const generateCronFromRecurring = () => { const generateCronFromRecurring = () => {
const minute = selectedMinute; const minute = selectedMinute || '0';
const hour = selectedHour; const hour = selectedHour || '9';
switch (scheduleType) { switch (scheduleType) {
case 'daily': case 'daily':
return `${minute} ${hour} * * *`; return `${minute} ${hour} * * *`;
case 'weekly': case 'weekly':
const weekdays = selectedWeekdays.join(','); const weekdays = selectedWeekdays.length > 0 ? selectedWeekdays.join(',') : '1';
return `${minute} ${hour} * * ${weekdays}`; return `${minute} ${hour} * * ${weekdays}`;
case 'monthly': case 'monthly':
const monthDays = selectedMonthDays.join(','); const monthDays = selectedMonthDays.length > 0 ? selectedMonthDays.join(',') : '1';
return `${minute} ${hour} ${monthDays} * *`; return `${minute} ${hour} ${monthDays} * *`;
default: default:
return `${minute} ${hour} * * *`; return `${minute} ${hour} * * *`;
@ -403,6 +410,13 @@ export const SimplifiedScheduleConfig: React.FC<SimplifiedScheduleConfigProps> =
const handleRecurringScheduleChange = () => { const handleRecurringScheduleChange = () => {
const cronExpression = generateCronFromRecurring(); const cronExpression = generateCronFromRecurring();
console.log('Generated cron expression:', cronExpression, {
scheduleType,
selectedHour,
selectedMinute,
selectedWeekdays,
selectedMonthDays
});
onChange({ onChange({
...config, ...config,
cron_expression: cronExpression, cron_expression: cronExpression,
@ -418,14 +432,24 @@ export const SimplifiedScheduleConfig: React.FC<SimplifiedScheduleConfigProps> =
const newWeekdays = selectedWeekdays.includes(weekday) const newWeekdays = selectedWeekdays.includes(weekday)
? selectedWeekdays.filter(w => w !== weekday) ? selectedWeekdays.filter(w => w !== weekday)
: [...selectedWeekdays, weekday].sort(); : [...selectedWeekdays, weekday].sort();
setSelectedWeekdays(newWeekdays);
// Prevent deselecting all weekdays (must have at least one)
if (newWeekdays.length > 0) {
setSelectedWeekdays(newWeekdays);
setTimeout(() => handleRecurringScheduleChange(), 0);
}
}; };
const handleMonthDayToggle = (day: string) => { const handleMonthDayToggle = (day: string) => {
const newDays = selectedMonthDays.includes(day) const newDays = selectedMonthDays.includes(day)
? selectedMonthDays.filter(d => d !== day) ? selectedMonthDays.filter(d => d !== day)
: [...selectedMonthDays, day].sort((a, b) => parseInt(a) - parseInt(b)); : [...selectedMonthDays, day].sort((a, b) => parseInt(a) - parseInt(b));
setSelectedMonthDays(newDays);
// Prevent deselecting all month days (must have at least one)
if (newDays.length > 0) {
setSelectedMonthDays(newDays);
setTimeout(() => handleRecurringScheduleChange(), 0);
}
}; };
const generateCronFromOneTime = () => { const generateCronFromOneTime = () => {
@ -658,7 +682,18 @@ export const SimplifiedScheduleConfig: React.FC<SimplifiedScheduleConfigProps> =
{/* Schedule Type */} {/* Schedule Type */}
<div className="space-y-2"> <div className="space-y-2">
<Label className="text-sm">How often should this run?</Label> <Label className="text-sm">How often should this run?</Label>
<Select value={scheduleType} onValueChange={(value: 'daily' | 'weekly' | 'monthly') => setScheduleType(value)}> <Select value={scheduleType} onValueChange={(value: 'daily' | 'weekly' | 'monthly') => {
setScheduleType(value);
// Set appropriate defaults for the schedule type
if (value === 'weekly' && selectedWeekdays.length === 5) {
// If switching to weekly and currently have weekdays selected, set to just Monday
setSelectedWeekdays(['1']);
} else if (value === 'monthly' && selectedMonthDays.length !== 1) {
// If switching to monthly, set to first day of month
setSelectedMonthDays(['1']);
}
setTimeout(() => handleRecurringScheduleChange(), 0);
}}>
<SelectTrigger> <SelectTrigger>
<SelectValue /> <SelectValue />
</SelectTrigger> </SelectTrigger>
@ -674,7 +709,10 @@ export const SimplifiedScheduleConfig: React.FC<SimplifiedScheduleConfigProps> =
<div className="space-y-2"> <div className="space-y-2">
<Label className="text-sm">What time should it run?</Label> <Label className="text-sm">What time should it run?</Label>
<div className="flex gap-2 items-center"> <div className="flex gap-2 items-center">
<Select value={selectedHour} onValueChange={setSelectedHour}> <Select value={selectedHour} onValueChange={(value) => {
setSelectedHour(value);
setTimeout(() => handleRecurringScheduleChange(), 0);
}}>
<SelectTrigger className="w-20"> <SelectTrigger className="w-20">
<SelectValue /> <SelectValue />
</SelectTrigger> </SelectTrigger>
@ -687,7 +725,10 @@ export const SimplifiedScheduleConfig: React.FC<SimplifiedScheduleConfigProps> =
</SelectContent> </SelectContent>
</Select> </Select>
<span className="text-muted-foreground">:</span> <span className="text-muted-foreground">:</span>
<Select value={selectedMinute} onValueChange={setSelectedMinute}> <Select value={selectedMinute} onValueChange={(value) => {
setSelectedMinute(value);
setTimeout(() => handleRecurringScheduleChange(), 0);
}}>
<SelectTrigger className="w-20"> <SelectTrigger className="w-20">
<SelectValue /> <SelectValue />
</SelectTrigger> </SelectTrigger>

View File

@ -204,7 +204,7 @@ export function CustomAgentsSection({ onAgentSelect }: CustomAgentsSectionProps)
<div className="w-full"> <div className="w-full">
<TitleSection /> <TitleSection />
<div className="grid gap-4 pb-4 grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4"> <div className="grid gap-4 pb-4 grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4">
{templates.templates.slice(0, 4).map((template) => ( {templates.templates.map((template) => (
<UnifiedAgentCard <UnifiedAgentCard
key={template.template_id} key={template.template_id}
variant="dashboard" variant="dashboard"