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.",
},
];| 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 tab. |
description | An optional one-line hint under the label. |
surfaces | Optional ("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.
Models
The desktop app's models are the user's own installed coding CLIs, connected through the companion daemon - no hosted model registry, no API-key management, no cloud provider catalog.
Chat
The side panel's persisted, on-device Chat tab - a multi-turn conversation with the user's chosen model, run by the companion daemon.