重新啟動後會保留哪些內容
| 狀態 | 儲存位置 | 重新啟動時的行為 |
|---|---|---|
| 對話記錄 | 各代理程式的 SQLite 資料庫 | 不受影響;工作階段會從儲存的逐字記錄繼續 |
| 中斷的主要工作階段回合 | 各代理程式的 SQLite 工作階段資料列與逐字記錄 | 啟動數秒後自動繼續 |
| 子代理程式執行 | SQLite(共用狀態資料庫) | 開機時還原登錄;中斷的執行會繼續 |
| 背景工作 | SQLite(共用狀態資料庫) | 開機時進行調整;復原孤立的執行或將其標示為遺失 |
| 佇列中的外送項目 | SQLite 傳送佇列 | 重新啟動後清空佇列;未傳送的回覆會重試 |
| 排程(cron)工作 | SQLite cron 儲存區 | 排程會保留;排程器在開機時重新啟用 |
| 重新啟動後續作業 | SQLite 重新啟動哨兵 | 將一次性後續作業分派至要求重新啟動的工作階段 |
正常重新啟動會先等待工作完成
要求重新啟動(openclaw gateway restart、需要
重新啟動的設定變更,或閘道更新)不會立即終止進行中的工作。
閘道會停止接受新工作,接著等待作用中的代理程式回合與
背景工作完成,最多等到排空時間上限(預設為 5 分鐘)。因此,大多數
重新啟動根本不會中斷任何工作。
只有無法在排空時間上限內完成的工作(或遭強制重新啟動或當機
中斷的任何執行)才會中止,而在此之前,每個
受影響的工作階段都會標記為待復原。
如何偵測中斷的工作
三種互補機制會標記回合尚未完成的工作階段:- **控制介面受理時:**對現有主要工作階段的一般文字回合,
閘道會附加使用者訊息、將工作階段標記為執行中,並在
傳回
started確認前,透過單一 SQLite 交易 記錄其僅限逐字記錄的傳送認領。 命令、附件、單回合覆寫、待處理傳送、先前的中止 提示、外掛擁有的工作階段,以及含有執行掛鉤的回合,仍會使用其 專用受理路徑。 - **關機時:**在重新啟動排空期間,所有具有作用中執行的工作階段 都會在執行中止前,於工作階段儲存區中寫入 復原標記。
- **啟動時:**閘道會掃描工作階段儲存區,尋找仍 宣告為執行中、但在新處理程序中沒有存活擁有者的工作階段。這可捕捉 未執行任何關機程式碼的嚴重當機與程序終止。同時也會清除過期的逐字記錄鎖定 檔案。
自動繼續
啟動數秒後,閘道會重新分派每個已標記的工作階段, 並附上合成系統訊息,告知代理程式先前的回合因 重新啟動而中斷,並要求從現有逐字記錄繼續。如果 最終回覆已產生但尚未傳送,其文字會包含在內, 讓代理程式能直接傳送,而不必重新執行工作。復原最多重試 3 次,並採用指數退避。每次重試都會重複使用同一個持久性分派 識別碼,因此模稜兩可的連線失敗不會讓同一項復原 啟動兩次。已完成及無法繼續的控制介面回合也會保留有界的持久性 冪等性墓碑,讓重新連線的寄件匣能移除這些項目,而不會 重新執行要求。 繼續之前,閘道會檢查逐字記錄尾端是否能安全地 接續。如果不能(例如,回合結束於過期的待處理 核准),便不會盲目地重新執行工作階段;代理程式會改為發布簡短 通知,要求使用者重新傳送上一個要求。對 WebChat 而言,該通知會 直接寫入工作階段記錄,因此重新連線後仍然可見。 OpenClaw 也能重建中斷的唯讀程式碼模式 工作。程式碼模式會將這些執行標記為可安全重新啟動,並在具有副作用的 目錄工具或外掛命名空間執行前拒絕它們。如果重新啟動發生在wait 控制項上,新閘道會根據逐字記錄重建回合,
並強制重建後的執行維持可安全重新啟動,即使
模型省略或清除該旗標也一樣。主機會將整個重建後的
回合篩選為經稽核的唯讀核心工具及明確可安全重播的外掛工具,
包括重新啟動後停用程式碼模式的情況。具有副作用的工作
仍會由重新傳送通知保護,以免發生重複寫入。
子代理程式
子代理程式執行會持久儲存在共用 SQLite 狀態資料庫中,因此 子代理程式登錄能跨處理程序保留。開機時會還原登錄,並使用原始工作情境 繼續中斷的子代理程式工作階段。 有兩項安全機制:- 超過 2 小時前中斷的執行會直接結束,而不會繼續,因此 關閉一整夜的閘道不會復活過期工作。
- 持續復原失敗的工作階段會標記為卡死墓碑,避免 復原無限循環。
背景工作
背景工作登錄以 SQLite 為後端, 會在開機時及定期進行調整:已完成執行所記錄的持久性結果 會被復原,而擁有者處理程序已消失的執行則會在 寬限期後標記為遺失,而不是永遠停滯。代理程式要求的重新啟動
當代理程式本身觸發重新啟動(套用設定變更、更新 閘道,或明確要求重新啟動)時,處理程序結束前會將重新啟動哨兵寫入 SQLite。開機後,閘道會將結果發布回 原始聊天,並分派一次性後續回合,讓 代理程式從中斷處精確接續,且使用相同頻道與討論串。安全機制與可觀測性
- **當機循環斷路器:**5 分鐘內發生 3 次非正常開機會觸發斷路器, 在下次開機時抑制自動啟動的周邊服務,避免當機的閘道 擴大問題。非正常開機時間窗排空後即會恢復。
- **指標:**復原活動會透過
Prometheus匯出為
openclaw_session_recovery_total與openclaw_session_recovery_age_seconds。 - **日誌:**復原決策會記錄在
main-session-restart-recovery與subagent-interrupted-resume子系統下。
不會繼續的內容
- 由於已有其他擁有者負責處理,因此排除於主要工作階段復原之外的 工作階段:子代理程式工作階段(子代理程式復原)、cron 工作階段( 排程器會依排程重新執行),以及由 ACP 管理的工作階段(由連線的 IDE 或用戶端負責繼續)。
- 無法從逐字記錄尾端安全接續的工作階段;這些工作階段會收到 上述重新傳送通知,而不會無聲地重新執行。
- 從未受理的工作:在排空時間窗內送達的訊息 會收到明確的重新啟動錯誤而遭拒絕,不會無聲地排入即將終止的 處理程序。