- {preview}
+
+
+ Final Prompt
+
+
+ {finalPrompt}
+
+
+ {previewError && (
+
+ {previewError}
+
+ )}
+
+ {preview && (
+
+
+ Generated Message
+
+
+ {preview}
+
+
)}
diff --git a/frontend/src/pages/EditTaskPage.tsx b/frontend/src/pages/EditTaskPage.tsx
index d3f8a24..cd251e7 100644
--- a/frontend/src/pages/EditTaskPage.tsx
+++ b/frontend/src/pages/EditTaskPage.tsx
@@ -4,6 +4,7 @@ import { Link, useNavigate, useParams } from 'react-router-dom'
import { getEntity } from '../api/entitiesApi'
import {
activateTask,
+ buildTaskPreviewPrompt,
deleteTask,
generateTaskPreview,
getTask,
@@ -115,6 +116,7 @@ export default function EditTaskPage() {
const [cronParts, setCronParts] = useState(DEFAULT_CRON_PARTS)
const [taskForm, setTaskForm] = useState(DEFAULT_TASK_FORM)
const [preview, setPreview] = useState('')
+ const [previewError, setPreviewError] = useState('')
const { data: entity, isLoading: isLoadingEntity } = useQuery({
queryKey: ['entity', entityId],
@@ -184,7 +186,18 @@ export default function EditTaskPage() {
const previewMutation = useMutation({
mutationFn: generateTaskPreview,
+ onMutate: () => {
+ setPreview('')
+ setPreviewError('')
+ },
onSuccess: (value) => setPreview(value),
+ onError: (error) => {
+ setPreviewError(
+ error instanceof Error
+ ? error.message
+ : 'Unable to generate a test message from the local model.'
+ )
+ },
})
const canSubmit = useMemo(() => {
@@ -192,6 +205,25 @@ export default function EditTaskPage() {
return Boolean(taskForm.name.trim() && taskForm.prompt.trim() && hasFilledCronParts)
}, [cronParts, taskForm.name, taskForm.prompt])
+ const currentTask = useMemo(
+ () => ({
+ entityId,
+ name: taskForm.name,
+ prompt: taskForm.prompt,
+ scheduleCron: taskForm.scheduleCron,
+ emailLookback: taskForm.emailLookback,
+ }),
+ [entityId, taskForm.emailLookback, taskForm.name, taskForm.prompt, taskForm.scheduleCron]
+ )
+
+ const finalPrompt = useMemo(() => {
+ if (!entity) {
+ return 'Entity details unavailable.'
+ }
+
+ return buildTaskPreviewPrompt(entity, currentTask)
+ }, [currentTask, entity])
+
const applyCronParts = (nextCronParts: CronParts) => {
setCronParts(nextCronParts)
setTaskForm((prev) => ({ ...prev, scheduleCron: buildCron(nextCronParts) }))
@@ -402,13 +434,8 @@ export default function EditTaskPage() {
type="button"
onClick={() => {
if (!canSubmit) return
- previewMutation.mutate({
- entityId,
- name: taskForm.name,
- prompt: taskForm.prompt,
- scheduleCron: taskForm.scheduleCron,
- emailLookback: taskForm.emailLookback,
- })
+ if (!entity) return
+ previewMutation.mutate({ entity, task: currentTask })
}}
disabled={!canSubmit || previewMutation.isPending}
className="rounded-md border border-cyan-500 px-3 py-2 text-sm font-medium text-cyan-300 hover:bg-cyan-500/10 disabled:opacity-50"
@@ -416,10 +443,30 @@ export default function EditTaskPage() {
{previewMutation.isPending ? 'Generating…' : 'Generate Test Message'}
- {preview && (
-
- {preview}
+
+
+ Final Prompt
+
+
+ {finalPrompt}
+
+
+ {previewError && (
+
+ {previewError}
+
+ )}
+
+ {preview && (
+
+
+ Generated Message
+
+
+ {preview}
+
+
)}