Tasks
Builder-declared AI tasks the end-user maps to a model and reasoning effort, 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 tasks in code; the end-user picks the model and reasoning effort each one runs at, on the Tasks screen in Settings.
Declaring a task
Tasks live in @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.",
},
];| Field | Purpose |
|---|---|
id | Stable id product code resolves the choice by, and the key a stored selection is saved under. |
label | The task's name on the Tasks screen. |
description | Optional one-line hint under the label. |
surfaces | Optional ("web" | "desktop")[] - which surfaces show the task. Omit to show it everywhere. |
aiTasks starts empty, so the Tasks entry stays out of the settings rail until you declare a task that targets the desktop.
The Tasks screen
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 opening 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 in the runtime's own task-override document - and per workspace with
multiTenantenabled. Nothing is written to your backend, and there is no account-wide override. - Sourced from this device: the picker offers what the Models screen lists - the connected coding CLIs. A task runs here, so credit-backed built-in models are never offered.
- No mapping: a task with no override runs on the device's default model.
Models
The desktop app's two model sources - your hosted models and the user's own coding CLIs - what the Models screen controls, and who pays for a run.
Chat
The desktop app's persisted chat - a multi-turn conversation on your hosted models or on the user's own coding CLI, as a full page and a side-panel tab.