mirror of https://github.com/kortix-ai/suna.git
Merge pull request #1767 from escapade-mckv/prebuilt-agents
Prebuilt agents
This commit is contained in:
commit
7ff206157d
|
@ -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
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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"
|
||||||
|
|
Loading…
Reference in New Issue