# 任務執行

同一 session 的任務如何並行、如何取消，以及中斷的工作如何續行。

## Per-session 併發

`MaxSessionTasks`（`NumCPU × 4`）限制單一 session 可同時執行的 `Execute()` 呼叫數。任務會**先**發布 ToriiDB online marker 並登記取消函式，才去競爭並行空位，因此排隊中的任務仍可見、可取消，而不是隱形地卡住。marker 的 TTL 為 60 秒、每 55 秒續期，被砍掉或崩潰的行程靠過期自行下線，不需檢查 PID。此值為套件常數，不從 `config.json` 讀取。

## 取消執行

取消是**逐任務**而非逐 session：`POST /v1/session/:id/cancel/:task_hash` 停止單一執行中的任務（`{"cancelled": true}`）；該 task hash 不在本行程執行中時，會記錄一筆取消事件並回傳 `{"cancelled": false, "stale": true}`。原本的 `once_id` 識別碼已改為 task hash。工具確認另以 `POST /v1/session/:id/confirm/:confirm_hash` 回覆，`confirm_hash` 取自確認事件。刻意不提供「全部取消」的變體，因此可在不影響同 session 其他任務的前提下丟棄某個長跑任務。在 TUI 中，執行期間按 `Esc` 會對當前任務開啟取消確認 popup。

## 續行中斷的工作

停在 `ask_user` 或確認上的執行會留下待決任務。`GET /v1/session/:id/task` 只列出真正可續行者：執行中的 run 每 55 秒刷新 ToriiDB 的 `action:<session_id>:<task_hash>`（TTL 60 秒），因此被關閉視窗或被砍行程遺留的任務會在一分鐘內出現在清單中，而仍在處理中的任務不會。以 `POST .../resume` 回答，或以 `DELETE .../:task_hash` 丟棄。TUI 中對應 `/pending`。

已完成的執行同樣可查：`GET /v1/session/:id/task/history` 以 `task_hash`、`end_at`、`objective`、`model`、`reasoning` 列出（可選 `keyword` 過濾），`GET .../:task_hash/history` 以 `content` 回傳單次執行的完整 action 記錄。
