# 计划任务系统

<cite>
**本文引用的文件**
- [src/app/api/cron-engine/route.ts](file://src/app/api/cron-engine/route.ts)
- [src/app/api/cron-tasks/route.ts](file://src/app/api/cron-tasks/route.ts)
- [src/app/api/cron-tasks/[id]/route.ts](file://src/app/api/cron-tasks/[id]/route.ts)
- [src/app/api/cron-tasks/[id]/execute/route.ts](file://src/app/api/cron-tasks/[id]/execute/route.ts)
- [src/app/api/task-executions/route.ts](file://src/app/api/task-executions/route.ts)
- [src/lib/cron/engine.ts](file://src/lib/cron/engine.ts)
- [src/lib/cron/executor.ts](file://src/lib/cron/executor.ts)
- [src/lib/cron/cron-parser.ts](file://src/lib/cron/cron-parser.ts)
- [src/lib/db.ts](file://src/lib/db.ts)
- [src/lib/types.ts](file://src/lib/types.ts)
- [src/hooks/use-cron-tasks.ts](file://src/hooks/use-cron-tasks.ts)
- [src/hooks/use-task-executions.ts](file://src/hooks/use-task-executions.ts)
- [src/components/views/schedule-view.tsx](file://src/components/views/schedule-view.tsx)
</cite>

## 目录
1. [简介](#简介)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构总览](#架构总览)
5. [详细组件分析](#详细组件分析)
6. [依赖关系分析](#依赖关系分析)
7. [性能考量](#性能考量)
8. [故障排查指南](#故障排查指南)
9. [结论](#结论)
10. [附录：API与界面使用指南](#附录api与界面使用指南)

## 简介
本文件系统性阐述Forge的计划任务系统，覆盖CRON表达式解析、任务调度引擎、执行队列与并发控制、任务生命周期管理（创建/编辑/删除/执行）、可视化调度界面、执行历史与监控、心跳检查与通知、以及性能优化策略。目标是帮助用户高效地创建、管理与监控各类自动化任务。

## 项目结构
计划任务系统由三层组成：
- 前端界面层：提供可视化调度界面与任务管理交互。
- 后端API层：提供REST接口用于任务与执行记录的增删改查、引擎启停、即时执行等。
- 引擎与执行层：负责CRON匹配、并发控制、任务执行、会话创建、IM通知与执行记录落库。

```mermaid
graph TB
subgraph "前端"
UI["ScheduleView 组件<br/>useCronTasks/useTaskExecutions 钩子"]
end
subgraph "后端API"
API_TASKS["/api/cron-tasks<br/>GET/POST"]
API_TASK["/api/cron-tasks/[id]<br/>GET/PATCH/DELETE"]
API_EXECUTE["/api/cron-tasks/[id]/execute<br/>POST"]
API_ENGINE["/api/cron-engine<br/>GET/POST"]
API_EXEC_LOG["/api/task-executions<br/>GET/POST"]
end
subgraph "引擎与执行"
ENGINE["CronEngine 单例<br/>定时扫描/并发控制"]
EXECUTOR["TaskExecutor<br/>心跳/代理/技能/自定义提示词"]
CRON_MATCH["CronParser.matchesCron"]
DB["SQLite 数据库<br/>cron_tasks/task_executions"]
end
UI --> API_TASKS
UI --> API_ENGINE
UI --> API_EXECUTE
UI --> API_EXEC_LOG
API_TASKS --> DB
API_TASK --> DB
API_EXECUTE --> EXECUTOR
API_ENGINE --> ENGINE
ENGINE --> CRON_MATCH
ENGINE --> EXECUTOR
EXECUTOR --> DB
ENGINE --> DB
```

**图表来源**
- [src/components/views/schedule-view.tsx](file://src/components/views/schedule-view.tsx)
- [src/hooks/use-cron-tasks.ts](file://src/hooks/use-cron-tasks.ts)
- [src/hooks/use-task-executions.ts](file://src/hooks/use-task-executions.ts)
- [src/app/api/cron-tasks/route.ts](file://src/app/api/cron-tasks/route.ts)
- [src/app/api/cron-tasks/[id]/route.ts](file://src/app/api/cron-tasks/[id]/route.ts)
- [src/app/api/cron-tasks/[id]/execute/route.ts](file://src/app/api/cron-tasks/[id]/execute/route.ts)
- [src/app/api/cron-engine/route.ts](file://src/app/api/cron-engine/route.ts)
- [src/app/api/task-executions/route.ts](file://src/app/api/task-executions/route.ts)
- [src/lib/cron/engine.ts](file://src/lib/cron/engine.ts)
- [src/lib/cron/executor.ts](file://src/lib/cron/executor.ts)
- [src/lib/cron/cron-parser.ts](file://src/lib/cron/cron-parser.ts)
- [src/lib/db.ts](file://src/lib/db.ts)

**章节来源**
- [src/components/views/schedule-view.tsx](file://src/components/views/schedule-view.tsx)
- [src/hooks/use-cron-tasks.ts](file://src/hooks/use-cron-tasks.ts)
- [src/hooks/use-task-executions.ts](file://src/hooks/use-task-executions.ts)
- [src/app/api/cron-tasks/route.ts](file://src/app/api/cron-tasks/route.ts)
- [src/app/api/cron-tasks/[id]/route.ts](file://src/app/api/cron-tasks/[id]/route.ts)
- [src/app/api/cron-tasks/[id]/execute/route.ts](file://src/app/api/cron-tasks/[id]/execute/route.ts)
- [src/app/api/cron-engine/route.ts](file://src/app/api/cron-engine/route.ts)
- [src/app/api/task-executions/route.ts](file://src/app/api/task-executions/route.ts)
- [src/lib/cron/engine.ts](file://src/lib/cron/engine.ts)
- [src/lib/cron/executor.ts](file://src/lib/cron/executor.ts)
- [src/lib/cron/cron-parser.ts](file://src/lib/cron/cron-parser.ts)
- [src/lib/db.ts](file://src/lib/db.ts)

## 核心组件
- 调度引擎（CronEngine）：单例定时器，每分钟扫描一次启用的任务，基于CRON表达式匹配决定是否执行；通过集合避免同一任务并发执行。
- 执行器（TaskExecutor）：根据任务类型（心跳/运行代理/运行技能/自定义提示词）执行，并创建会话、写入消息、可选IM通知。
- CRON解析器（CronParser）：支持通配符、步进、范围与多值组合的简单CRON匹配。
- 数据库（SQLite）：存储任务元数据与执行历史，含索引优化查询。
- 前端钩子与视图：提供任务列表、心跳配置、执行历史筛选与分页加载、即时执行与引擎启停操作。

**章节来源**
- [src/lib/cron/engine.ts](file://src/lib/cron/engine.ts)
- [src/lib/cron/executor.ts](file://src/lib/cron/executor.ts)
- [src/lib/cron/cron-parser.ts](file://src/lib/cron/cron-parser.ts)
- [src/lib/db.ts](file://src/lib/db.ts)
- [src/hooks/use-cron-tasks.ts](file://src/hooks/use-cron-tasks.ts)
- [src/hooks/use-task-executions.ts](file://src/hooks/use-task-executions.ts)
- [src/components/views/schedule-view.tsx](file://src/components/views/schedule-view.tsx)

## 架构总览
下图展示从用户操作到任务执行与结果记录的全链路：

```mermaid
sequenceDiagram
participant U as "用户"
participant V as "ScheduleView"
participant H as "React Hooks"
participant API as "后端API"
participant ENG as "CronEngine"
participant EXE as "TaskExecutor"
participant DB as "SQLite"
U->>V : 启动/停止引擎/创建/编辑/删除/立即执行
V->>H : 触发对应操作
H->>API : 发起HTTP请求
API->>ENG : GET/POST 控制引擎状态
API->>EXE : POST 立即执行任务
ENG->>ENG : 每分钟tick扫描任务
ENG->>EXE : 匹配成功则执行
EXE->>DB : 创建会话/写入消息
EXE->>DB : 写入执行记录
API->>DB : 查询任务/执行记录
DB-->>API : 返回数据
API-->>H : 返回响应
H-->>V : 更新UI
```

**图表来源**
- [src/components/views/schedule-view.tsx](file://src/components/views/schedule-view.tsx)
- [src/hooks/use-cron-tasks.ts](file://src/hooks/use-cron-tasks.ts)
- [src/hooks/use-task-executions.ts](file://src/hooks/use-task-executions.ts)
- [src/app/api/cron-engine/route.ts](file://src/app/api/cron-engine/route.ts)
- [src/app/api/cron-tasks/[id]/execute/route.ts](file://src/app/api/cron-tasks/[id]/execute/route.ts)
- [src/lib/cron/engine.ts](file://src/lib/cron/engine.ts)
- [src/lib/cron/executor.ts](file://src/lib/cron/executor.ts)
- [src/lib/db.ts](file://src/lib/db.ts)

## 详细组件分析

### 调度引擎（CronEngine）
- 定时策略：启动后立即检查，随后每60秒触发一次tick。
- 并发控制：维护正在执行的任务ID集合，若某任务已在执行则跳过本轮。
- 任务筛选：仅对启用且有有效CRON表达式的任务进行匹配。
- 执行后处理：记录执行结果与会话ID，更新任务最近执行时间与结果；对“一次性”CRON（指定日期+月份）自动禁用。
- 自启动：若存在启用任务，引擎在首次获取时自动启动。

```mermaid
flowchart TD
Start(["tick 开始"]) --> Load["读取所有启用任务"]
Load --> ForEach{"遍历任务"}
ForEach --> |无| End(["结束"])
ForEach --> |有| Skip{"是否正在执行?"}
Skip --> |是| ForEach
Skip --> |否| Match{"CRON匹配当前时间?"}
Match --> |否| ForEach
Match --> |是| Run["异步执行任务"]
Run --> Record["写入执行记录/更新任务字段"]
Record --> OneTime{"是否一次性任务?"}
OneTime --> |是| Disable["禁用该任务"]
OneTime --> |否| ForEach
Disable --> ForEach
```

**图表来源**
- [src/lib/cron/engine.ts](file://src/lib/cron/engine.ts)

**章节来源**
- [src/lib/cron/engine.ts](file://src/lib/cron/engine.ts)

### CRON表达式解析（CronParser）
- 支持格式：分钟 小时 月内日 月 星期
- 支持语法：*, N, N-M, N,M, */S, N-M/S
- 匹配逻辑：按字段拆分，逐个判断是否满足当前时间值。

```mermaid
flowchart TD
S(["输入表达式与时间"]) --> Split["按空格拆分为5段"]
Split --> Len{"长度==5?"}
Len --> |否| False["返回不匹配"]
Len --> |是| FieldLoop["逐字段匹配"]
FieldLoop --> Wildcard{"*?"}
Wildcard --> |是| Next["继续下一个字段"]
Wildcard --> |否| ParseSeg["解析分段: 多值/范围/步进"]
ParseSeg --> CheckVal["检查当前值是否命中"]
CheckVal --> |是| Next
CheckVal --> |否| False
Next --> Done{"全部字段匹配?"}
Done --> |是| True["返回匹配"]
Done --> |否| False
```

**图表来源**
- [src/lib/cron/cron-parser.ts](file://src/lib/cron/cron-parser.ts)

**章节来源**
- [src/lib/cron/cron-parser.ts](file://src/lib/cron/cron-parser.ts)

### 任务执行器（TaskExecutor）
- 心跳任务：读取工作区内的HEARTBEAT.md清单，执行后根据结果判定OK/ALERT，必要时通过IM通道发送告警。
- 运行代理：根据任务配置选择项目或全局代理文件，构造系统提示词与用户消息，创建会话并执行。
- 运行技能：读取技能文件内容作为系统提示词，执行后可通知。
- 自定义提示词：直接以任务动作作为用户消息，执行后可通知。
- 会话与消息：每次执行创建持久化会话并在消息表中写入用户与助手消息块，便于在聊天界面查看。
- IM通知：通过桥接层与适配器向绑定的聊天通道投递消息。

```mermaid
sequenceDiagram
participant E as "CronEngine"
participant X as "TaskExecutor"
participant FS as "工作区文件系统"
participant DB as "SQLite"
participant IM as "IM桥接层"
E->>X : executeTask(task)
alt 心跳任务
X->>FS : 读取 HEARTBEAT.md
X->>X : 构造系统提示词与用户消息
X->>DB : 创建会话/写入消息
X->>IM : 可选发送告警
else 运行代理/技能/自定义
X->>FS : 读取代理/技能/动作
X->>DB : 创建会话/写入消息
X->>IM : 可选发送通知
end
X-->>E : 返回状态/结果/会话ID
```

**图表来源**
- [src/lib/cron/executor.ts](file://src/lib/cron/executor.ts)
- [src/lib/db.ts](file://src/lib/db.ts)

**章节来源**
- [src/lib/cron/executor.ts](file://src/lib/cron/executor.ts)

### 任务与执行记录API
- 任务管理
  - GET /api/cron-tasks：按工作区过滤返回任务列表，包含心跳任务。
  - POST /api/cron-tasks：创建新任务，自动启动引擎（如尚未启动）。
  - GET /api/cron-tasks/[id]：按ID查询任务详情。
  - PATCH /api/cron-tasks/[id]：允许更新名称、CRON、动作、类型、代理/技能名、工作区、启用状态、配置、最后执行时间与结果等字段；启用任务时自动启动引擎。
  - DELETE /api/cron-tasks/[id]：删除任务（心跳任务不可删除）。
- 即时执行
  - POST /api/cron-tasks/[id]/execute：触发任务立即执行，记录执行与任务最后执行信息。
- 执行历史
  - GET /api/task-executions：支持按任务ID、工作区、类型（心跳/普通）、状态（OK/ALERT/ERROR）与分页参数查询；支持按类型/状态筛选。
  - POST /api/task-executions：手动插入执行记录并同步更新任务最后执行信息。

```mermaid
sequenceDiagram
participant C as "客户端"
participant API as "后端API"
participant DB as "SQLite"
C->>API : POST /api/cron-tasks
API->>DB : 插入任务
API-->>C : 返回新建任务
C->>API : PATCH /api/cron-tasks/[id]
API->>DB : 更新任务字段
API-->>C : 返回更新后的任务
C->>API : POST /api/cron-tasks/[id]/execute
API->>DB : 记录执行/更新任务
API-->>C : 返回执行状态与结果
C->>API : GET /api/task-executions?task_id=...
API->>DB : 查询执行记录
API-->>C : 返回分页结果
```

**图表来源**
- [src/app/api/cron-tasks/route.ts](file://src/app/api/cron-tasks/route.ts)
- [src/app/api/cron-tasks/[id]/route.ts](file://src/app/api/cron-tasks/[id]/route.ts)
- [src/app/api/cron-tasks/[id]/execute/route.ts](file://src/app/api/cron-tasks/[id]/execute/route.ts)
- [src/app/api/task-executions/route.ts](file://src/app/api/task-executions/route.ts)
- [src/lib/db.ts](file://src/lib/db.ts)

**章节来源**
- [src/app/api/cron-tasks/route.ts](file://src/app/api/cron-tasks/route.ts)
- [src/app/api/cron-tasks/[id]/route.ts](file://src/app/api/cron-tasks/[id]/route.ts)
- [src/app/api/cron-tasks/[id]/execute/route.ts](file://src/app/api/cron-tasks/[id]/execute/route.ts)
- [src/app/api/task-executions/route.ts](file://src/app/api/task-executions/route.ts)
- [src/lib/db.ts](file://src/lib/db.ts)

### 可视化调度界面（ScheduleView）
- 引擎控制：显示引擎运行状态，支持启停。
- 心跳任务：展示心跳任务的启用状态、检查间隔、通知渠道、最近执行时间与结果；支持“立即检查”。
- 任务表格：列出非心跳任务，支持启用/禁用、编辑、删除。
- 执行历史：按类型与状态筛选，支持分页加载，点击可跳转到对应会话。
- 表单：可视化CRON频率选择器（一次性/分钟/小时/日/周/月），动作类型选择（运行代理/运行技能/自定义提示词），并支持从工作区/全局加载代理与技能列表。

```mermaid
classDiagram
class ScheduleView {
+引擎启停
+心跳配置
+任务列表
+执行历史筛选
+表单可视化CRON
}
class useCronTasks {
+创建/更新/删除任务
+立即执行
+刷新任务
}
class useTaskExecutions {
+分页加载
+类型/状态筛选
+刷新执行
}
ScheduleView --> useCronTasks : "依赖"
ScheduleView --> useTaskExecutions : "依赖"
```

**图表来源**
- [src/components/views/schedule-view.tsx](file://src/components/views/schedule-view.tsx)
- [src/hooks/use-cron-tasks.ts](file://src/hooks/use-cron-tasks.ts)
- [src/hooks/use-task-executions.ts](file://src/hooks/use-task-executions.ts)

**章节来源**
- [src/components/views/schedule-view.tsx](file://src/components/views/schedule-view.tsx)
- [src/hooks/use-cron-tasks.ts](file://src/hooks/use-cron-tasks.ts)
- [src/hooks/use-task-executions.ts](file://src/hooks/use-task-executions.ts)

## 依赖关系分析
- 引擎依赖CRON解析器进行时间匹配，依赖执行器执行任务，依赖数据库写入执行记录与更新任务状态。
- 执行器依赖工作区文件系统读取代理/技能/心跳清单，依赖数据库创建会话与消息，依赖IM桥接层发送通知。
- 前端钩子依赖API完成任务与执行记录的CRUD与分页加载。
- 数据库提供任务与执行记录的持久化，包含必要的索引以提升查询性能。

```mermaid
graph LR
Engine["CronEngine"] --> Parser["CronParser"]
Engine --> Executor["TaskExecutor"]
Engine --> DB["SQLite"]
Executor --> DB
Executor --> FS["工作区文件系统"]
Executor --> IM["IM桥接层"]
Hooks["React Hooks"] --> API["后端API"]
API --> DB
UI["ScheduleView"] --> Hooks
```

**图表来源**
- [src/lib/cron/engine.ts](file://src/lib/cron/engine.ts)
- [src/lib/cron/executor.ts](file://src/lib/cron/executor.ts)
- [src/lib/cron/cron-parser.ts](file://src/lib/cron/cron-parser.ts)
- [src/lib/db.ts](file://src/lib/db.ts)
- [src/hooks/use-cron-tasks.ts](file://src/hooks/use-cron-tasks.ts)
- [src/hooks/use-task-executions.ts](file://src/hooks/use-task-executions.ts)
- [src/components/views/schedule-view.tsx](file://src/components/views/schedule-view.tsx)

**章节来源**
- [src/lib/cron/engine.ts](file://src/lib/cron/engine.ts)
- [src/lib/cron/executor.ts](file://src/lib/cron/executor.ts)
- [src/lib/cron/cron-parser.ts](file://src/lib/cron/cron-parser.ts)
- [src/lib/db.ts](file://src/lib/db.ts)
- [src/hooks/use-cron-tasks.ts](file://src/hooks/use-cron-tasks.ts)
- [src/hooks/use-task-executions.ts](file://src/hooks/use-task-executions.ts)
- [src/components/views/schedule-view.tsx](file://src/components/views/schedule-view.tsx)

## 性能考量
- 定时粒度：引擎每60秒扫描一次，平衡了实时性与CPU占用。
- 并发控制：通过集合避免同一任务并发执行，减少资源争用与重复开销。
- 数据库优化：执行记录表对(task_id, executed_at)建立索引，提升按任务与时间排序的查询效率。
- 分页加载：执行历史默认每页20条，最大500条，支持偏移分页，降低单次响应体积。
- 会话持久化：每次执行创建会话与消息，便于后续检索，但需注意消息表外键级联删除带来的维护成本。

[本节为通用性能建议，无需特定文件引用]

## 故障排查指南
- 引擎未运行
  - 检查引擎状态接口返回值；确认是否已创建启用任务导致自动启动。
  - 通过引擎启停接口尝试手动启动/停止。
- 任务未执行
  - 确认任务处于启用状态且CRON表达式有效；检查引擎是否在运行。
  - 查看执行历史中是否有错误记录，定位具体失败原因。
- 心跳任务异常
  - 检查工作区是否存在HEARTBEAT.md；确认通知渠道已正确配置且已绑定聊天。
- 即时执行失败
  - 使用“立即执行”接口查看错误信息；检查任务配置（工作区、代理/技能/动作）是否正确。
- 执行历史为空
  - 确认筛选条件（任务ID/工作区/类型/状态）是否过于严格；尝试清空筛选或增加上限。

**章节来源**
- [src/app/api/cron-engine/route.ts](file://src/app/api/cron-engine/route.ts)
- [src/app/api/cron-tasks/[id]/execute/route.ts](file://src/app/api/cron-tasks/[id]/execute/route.ts)
- [src/app/api/task-executions/route.ts](file://src/app/api/task-executions/route.ts)
- [src/lib/cron/executor.ts](file://src/lib/cron/executor.ts)

## 结论
Forge的计划任务系统以简洁可靠的CRON解析与单例引擎为核心，结合任务并发控制、会话持久化与IM通知能力，提供了从创建到监控的完整闭环。前端界面直观易用，后端API稳定可靠，适合在本地或私有环境中部署与扩展。

[本节为总结性内容，无需特定文件引用]

## 附录：API与界面使用指南

### 可视化调度界面操作
- 启动/停止引擎：在界面顶部切换引擎运行状态。
- 心跳任务配置：设置检查间隔（5m/15m/30m/1h/6h/24h）、通知渠道（Telegram/飞书/Discord）、编辑HEARTBEAT.md清单。
- 创建/编辑任务：通过可视化CRON选择器与动作类型选择器快速生成CRON表达式与任务配置。
- 删除任务：仅普通任务可删除，心跳任务不可删除。
- 立即执行：对任意任务执行“立即执行”，查看结果与会话ID。
- 执行历史：按类型（心跳/普通）与状态（OK/ALERT/ERROR）筛选，支持分页加载。

**章节来源**
- [src/components/views/schedule-view.tsx](file://src/components/views/schedule-view.tsx)

### API参考

- 获取引擎状态
  - 方法：GET
  - 路径：/api/cron-engine
  - 响应：running: boolean
- 启停引擎
  - 方法：POST
  - 路径：/api/cron-engine
  - 请求体：{ action: "start" | "stop" }
  - 响应：running: boolean
- 查询任务列表
  - 方法：GET
  - 路径：/api/cron-tasks
  - 查询参数：workspace_id（可选）
  - 响应：任务数组（包含心跳任务）
- 创建任务
  - 方法：POST
  - 路径：/api/cron-tasks
  - 请求体：任务字段（名称、CRON、动作、类型、代理/技能名、工作区、启用状态、配置等）
  - 响应：新建任务对象（状态码201）
- 查询单个任务
  - 方法：GET
  - 路径：/api/cron-tasks/[id]
  - 响应：任务对象
- 更新任务
  - 方法：PATCH
  - 路径：/api/cron-tasks/[id]
  - 请求体：允许字段（名称、CRON、动作、类型、代理/技能名、工作区、启用状态、配置、最后执行时间与结果等）
  - 响应：更新后的任务对象
- 删除任务
  - 方法：DELETE
  - 路径：/api/cron-tasks/[id]
  - 响应：{ ok: true }
- 立即执行任务
  - 方法：POST
  - 路径：/api/cron-tasks/[id]/execute
  - 响应：{ status, result, sessionId }
- 查询执行历史
  - 方法：GET
  - 路径：/api/task-executions
  - 查询参数：task_id（可选）、workspace_id（可选）、limit（1~500，默认20）、offset（默认0）、type（heartbeat/cron）、status（ok/alert/error）
  - 响应：执行记录数组
- 新增执行记录
  - 方法：POST
  - 路径：/api/task-executions
  - 请求体：{ task_id, task_name?, result?, status?, session_id? }
  - 响应：新增执行记录对象

**章节来源**
- [src/app/api/cron-engine/route.ts](file://src/app/api/cron-engine/route.ts)
- [src/app/api/cron-tasks/route.ts](file://src/app/api/cron-tasks/route.ts)
- [src/app/api/cron-tasks/[id]/route.ts](file://src/app/api/cron-tasks/[id]/route.ts)
- [src/app/api/cron-tasks/[id]/execute/route.ts](file://src/app/api/cron-tasks/[id]/execute/route.ts)
- [src/app/api/task-executions/route.ts](file://src/app/api/task-executions/route.ts)

### 数据模型与索引
- 任务表（cron_tasks）
  - 字段：id, name, schedule, action, action_type, agent_name, skill_name, workspace_id, enabled, is_heartbeat, config, last_run_at, last_run_result, created_at, updated_at
  - 约束：action_type枚举校验
- 执行记录表（task_executions）
  - 字段：id, task_id, task_name, result, status, session_id, executed_at
  - 索引：task_id, executed_at DESC
- 类型定义
  - 任务类型：CronTask/CronTaskRow
  - 执行类型：TaskExecution
  - 动作类型：run-agent/run-skill/custom-prompt
  - 状态类型：ok/alert/error

**章节来源**
- [src/lib/db.ts](file://src/lib/db.ts)
- [src/lib/types.ts](file://src/lib/types.ts)