GenerateSaaS

Tasks

Builder-declared AI tasks the end-user assigns a model and reasoning effort to, per task and per device - stored on their own machine.

A task is a named unit of AI work your product runs - "review this content", "summarize this thread". You declare the tasks in code; the end-user chooses which model and reasoning effort each one runs at, on the Tasks tab in Settings.

Declaring a task

Tasks live in the shared config module @repo/config/ai/tasks (aiTasks), which the desktop app reads:

// packages/config/src/ai/tasks.ts
export const aiTasks: AiTaskSpec[] = [
  {
    id: "verify-article",
    label: "Article verification",
    description: "Checks a draft before it publishes.",
  },
];
FieldPurpose
idStable id product code resolves the choice by, and the key a stored selection is saved under.
labelThe task's name on the Tasks tab.
descriptionAn optional one-line hint under the label.
surfacesOptional ("web" | "desktop")[] - which surfaces show the task. Omit it to show it everywhere.

A task with no user mapping runs on the device's default model until the user assigns one on the Tasks tab.

The array ships with a single inert demo task; the CLI strips it for buyer builds, so the Tasks tab stays hidden until you declare a task that targets the desktop.

The Tasks tab

Each declared desktop task is one row on this device: its label and description, the model it currently runs (an override, or the device default), a Change button that opens the model picker, and - once an override is set - a Use device default button that clears it.

  • Per device: a selection is a model key plus a reasoning effort, stored on THIS machine through the daemon's own task-override document (never on your backend). A task with no override runs the daemon's default model.
  • Sourced from the connected CLIs: the picker offers the same connected coding CLIs the Models tab lists - there is no hosted registry or account-wide override on the desktop.

Resolving a task

The selection lives on the device, in the daemon's own task-override document - the same one this tab writes, never on your backend. There is no shared web-side resolver: the desktop's per-task settings are entirely local to the device.

On this page