# retoor <retoor@molodetz.nl>
from __future__ import annotations
from ..actions.spec import Action, Param
def field(
name: str, description: str, required: bool = False, kind: str = "string"
) -> Param:
return Param(
name=name,
location="body",
description=description,
required=required,
type=kind,
)
SCHEDULE_FIELDS: tuple[Param, ...] = (
field(
"kind",
"Schedule type: 'once' (run a single time), 'interval' (repeat every N seconds), "
"or 'cron' (5-field cron expression).",
required=True,
),
field(
"run_at",
"For kind=once: absolute UTC time in ISO 8601, e.g. 2026-06-09T14:30:00.",
),
field(
"delay_seconds",
"For kind=once: run this many seconds from now.",
kind="integer",
),
field(
"every_seconds",
"For kind=interval: number of seconds between runs.",
kind="integer",
),
field(
"start_at",
"For kind=interval: optional ISO 8601 UTC time of the first run. "
"Defaults to one interval from now.",
),
field(
"cron",
"For kind=cron: a 5-field cron expression 'minute hour day-of-month month day-of-week'. "
"Supports *, ranges (1-5), lists (1,3,5) and steps (*/15).",
),
field(
"max_runs",
"Optional maximum number of executions; the task disables itself afterwards.",
kind="integer",
),
)
TASK_ACTIONS: tuple[Action, ...] = (
Action(
name="current_time",
method="LOCAL",
path="",
summary="Get the exact current UTC time, to the second",
description=(
"The CURRENT TIME line in the system prompt is rounded to the hour to stay "
"cache-friendly. Call this tool first whenever you need the precise current time - "
"in particular before computing any absolute run_at for create_task/update_task from "
"a relative phrase you cannot express via delay_seconds. For an ordinary relative "
"delay ('in 40 seconds', 'in 2 hours'), you do not need this: delay_seconds is applied "
"against the server's own clock at creation time and is always exact regardless."
),
handler="task",
requires_auth=False,
params=(),
),
Action(
name="create_task",
method="LOCAL",
path="",
summary="Queue a prompt to run autonomously on a schedule with full tool access",
description=(
"The prompt is executed later by a fresh agent that has every tool available, "
"running inside the current authenticated session."
),
handler="task",
requires_auth=False,
params=(
field(
"prompt",
"A complete, self-contained instruction the future agent will execute when the "
"task fires (it has no other context). Write an imperative command, not a "
"description: e.g. 'Create a post in the fun topic about raccoons with a short "
"funny text, then verify it appears.'",
required=True,
),
field("label", "Optional short human-readable label for the task."),
field(
"notify",
"Set true for a REMINDER: when the task fires, the user is sent an in-app "
"notification and live toast carrying the result, so it reaches them even when "
"the Devii terminal is closed. Leave false for silent background automation.",
kind="boolean",
),
*SCHEDULE_FIELDS,
),
),
Action(
name="list_tasks",
method="LOCAL",
path="",
summary="List queued tasks and their schedules and last results",
handler="task",
requires_auth=False,
params=(
field("enabled_only", "Only return enabled tasks.", kind="boolean"),
field(
"status", "Filter by status: pending, running, done, error, disabled."
),
),
),
Action(
name="get_task",
method="LOCAL",
path="",
summary="Get a single task including its full last result",
handler="task",
requires_auth=False,
params=(field("uid", "Uid of the task.", required=True),),
),
Action(
name="update_task",
method="LOCAL",
path="",
summary="Update a task's prompt, label, enabled state, or schedule",
description="Provide schedule fields together with kind to reschedule the task.",
handler="task",
requires_auth=False,
params=(
field("uid", "Uid of the task.", required=True),
field("prompt", "New prompt."),
field("label", "New label."),
field("enabled", "Enable or disable the task.", kind="boolean"),
field(
"notify",
"Enable or disable the in-app reminder notification when this task fires.",
kind="boolean",
),
field("kind", "New schedule type when rescheduling."),
field("run_at", "New absolute run time for kind=once."),
field("delay_seconds", "New relative delay for kind=once.", kind="integer"),
field("every_seconds", "New interval for kind=interval.", kind="integer"),
field("start_at", "New first-run time for kind=interval."),
field("cron", "New cron expression for kind=cron."),
field("max_runs", "New maximum number of executions.", kind="integer"),
),
),
Action(
name="delete_task",
method="LOCAL",
path="",
summary="Delete a queued task",
handler="task",
requires_auth=False,
params=(field("uid", "Uid of the task.", required=True),),
),
Action(
name="run_task_now",
method="LOCAL",
path="",
summary="Trigger a task to execute immediately on the next scheduler tick",
handler="task",
requires_auth=False,
params=(field("uid", "Uid of the task.", required=True),),
),
)