# 定时任务执行位置

## 一、调度器启动位置

- CLI 模式（main.py）：`start_cron(root, core_config)` — web_mode=False
- Web 模式（web/server.py）：`start_cron(_root, _core_config, web_mode=True)`

## 二、调度循环架构

```
主进程
  ├─ 主线程: 用户交互 (CLI) / Flask (Web)
  └─ daemon 线程: cron-scheduler (心跳 5s)
       ├─ 扫描 users/<name>/tasks/*.json → 匹配时间 → 执行任务
       ├─ run_forget() → 清理过期临时记忆 (每 60s)
       └─ run_auto_improve_trigger() → 被动记忆提取 (每 3600s)
```

## 三、定时任务执行（两种模式）

### CLI 模式 — 子进程
```
cron 线程 → subprocess.run(start.py --user xxx --prompt "任务" --once)
  → 新进程执行一轮对话 → stdout 输出 → 退出
```

### Web 模式 — 进程内
```
cron 线程 → 进程内直接执行
  → create_provider → ChatManager → run_chat_turn → 归档
```

## 四、三种后台活动汇总

| 活动 | 触发者 | 执行方式 |
|------|--------|----------|
| 定时任务 | cron 匹配时间 | CLI: subprocess / Web: 进程内 |
| 临时记忆清理 | cron 每 60s | os.remove() |
| 被动 auto_improve | cron 每 3600s | provider.respond() → 写临时文件 |

## 五、并发安全

| 操作 | 是否加锁 |
|------|----------|
| 定时任务执行 | ✅ get_user_lock |
| Web 对话请求 | ✅ 通过 session |
| run_forget() | ❌ 无锁 |
| run_auto_improve_trigger() | ❌ 无锁 |

## 六、任务结果推送

cron 执行完成 → task 有 source 字段 → enqueue_message() → 推送到 QQ/Telegram

## 七、任务存储格式

```
users/<name>/tasks/<id>.json
{
  "id": "abc123",
  "type": "daily|once|recurring",
  "time": "09:00",
  "command": "每日新闻摘要",
  "user": "username",
  "source": {"platform": "onebot", "chat_type": "private", "chat_id": "12345"}
}
```
