檔案與資料夾
OAR 把它擁有的一切都放在一個資料夾裡,也就是狀態資料夾:設定檔、存有你對話的資料庫、記錄,以及上傳的檔案。本頁說明這個資料夾在哪裡、裡面有什麼、哪些部分可以刪除、哪些存有機密,以及中繼會自行移除什麼。有些資料根本不在狀態資料夾中:每個供應商都把自己的 session 資料和登入資訊放在自己的資料夾裡。
狀態資料夾 #
| 安裝方式 | 狀態資料夾 |
|---|---|
安裝程式或 npm install -g,macOS、Linux 和 WSL |
~/. |
安裝程式或 npm install -g,Windows |
%APPDATA%\ |
設定了 OAR_ 的全域安裝 |
它指定的資料夾 |
| Git 檢出 | 在檢出目錄內:server/、server/、server/、server/ |
npm install -g 和 oar update 會取代套件,但絕不會動到狀態資料夾。OAR_ 必須在你執行 oar 的每個 shell 中設定,否則指令會去預設資料夾找;見環境變數。oar doctor 會印出正在使用的路徑:狀態資料夾、設定檔、資料庫及其大小。安裝中也列出了每種安裝方式的相同路徑。
有三個環境變數可以搬移單一部分:COPILOT_ 搬移設定檔,COPILOT_ 搬移資料目錄(資料庫、鎖定檔和上傳的檔案),COPILOT_ 搬移記錄資料夾。在 config. 中,key data 也能搬移資料目錄;環境變數優先。相對路徑的 data 從 config. 所在的資料夾算起。
0.9.14 新增 上傳的檔案也跟著資料目錄走:<data。舊版本留在 server/ 中的上傳檔案,或某次搬移複製到狀態資料夾 uploads/ 中的檔案,仍會在原處讀取。
0.9.14 新增 全域安裝的中繼不論怎麼啟動,都會使用狀態資料夾的資料目錄:oar start、Linux 服務、兩種 Windows 自動啟動模式,以及搭配 OAR 擴充功能的單純 gh copilot。如果 config. 中有先前自動啟動的中繼使用過的 data,資料會從那裡複製一次,該資料夾則維持原樣。
0.9.14 之前:Windows 自動啟動與 gh copilot
到 0.9.13 為止,兩個 Windows 自動啟動項目,以及單純的 gh copilot 所啟動的中繼,都只設定了設定檔(gh copilot 連這個都沒有)。它們啟動的中繼會把資料庫、鎖定檔、上傳的檔案和記錄放在已安裝套件資料夾內的 server\、server\ 和 server\ 中,而 npm install -g 和 oar update 會取代這個資料夾。更新到 0.9.14 時,會在 npm 移除這些資料之前先複製它們;見升級說明。
在 macOS 和 Linux 上,中繼會讓資料目錄只有你能讀取(模式 700),並讓設定檔和資料庫檔案只有擁有者能存取(模式 600)。
搬移舊安裝 #
在專案改名之前,狀態存放在 git 檢出的 server/ 資料夾中,而檢出的啟動器所用的設定檔和記錄則在 ~/.(有設定時為 $XDG_;Windows:%LOCALAPPDATA%\)。全域安裝會在第一次執行 oar setup 或 oar copilot 時,把該資料夾中的設定檔和記錄複製到狀態資料夾一次。oar start 不會搬移。要匯入某個檢出的狀態(其中包括它的資料庫):
oar setup --migrate-from /home/dev/projects/old-oar
指定的資料夾是檢出目錄本身,而不是它的 server/ 資料夾。會發生的事:
- 它會複製資料庫(連同其
-wal和-shm檔案)、設定檔、原本在data/中的 Cursor agent 存放區(只在有資料庫時)、uploads資料夾,以及 50 MB 以下的logs資料夾。 - 它絕不會更動來源。滿意之後,請自行刪除舊資料夾。
- 只要還有中繼從來源執行,它就會拒絕,並說明原因。
- 複製的結果要先經過檢查才算數:資料庫必須通過 SQLite 的完整性檢查,且對話和訊息的數量必須相同。否則它會移除它複製的內容(0.9.14 新增 不再是整個狀態資料夾),並留下一則訊息。
- 0.9.14 新增 它絕不覆寫。狀態資料夾中已有的
config.會保留。安裝程式的中繼所建立的空資料庫會被移到json backups/(請先停止中繼:oar stop);如果資料庫中已有對話,它會拒絕,並說明你該改做什麼。在複製資料庫期間,它會持有中繼的鎖定,所以這段時間不會有中繼在上面啟動。 - 它會把一份回執寫到
backups/,並在狀態資料夾中寫入標記檔MIGRATION. md .。migrated
安裝程式之後 0.9.14 新增
只有真正複製之後才會寫入標記,而且你用 --migrate- 指定的資料夾一律會被搬移,並附上一行說明複製了什麼,或為什麼什麼都沒複製。所以即使安裝程式已經執行過 oar setup,這個選項也能用。同一個資料夾第二次只會告訴你它已經搬過了。在 0.9.14 之前,第一次 oar setup 或 oar copilot 即使沒有東西可匯入也會寫入標記,之後的 --migrate- 就會一聲不響地什麼都不做。
0.9.14 新增 搬移過來的上傳檔案會放在 data/,中繼從那裡讀取;Cursor agent 存放區則放在 data/,中繼預設從那裡讀取。先前某次搬移留在狀態資料夾 uploads/ 中的上傳檔案,會在下次中繼啟動時合併到 data/;不會覆寫或刪除任何東西。檢出目錄中以符號連結連到的資料夾,會被複製成真正的資料夾。
裡面有什麼 #
路徑相對於狀態資料夾。「可以安全刪除」的意思是之後中繼仍能運作;這不代表你不會失去任何東西。
| 路徑 | 內容 | 可以安全刪除嗎? |
|---|---|---|
config. |
連接埠、存取範圍、存取 token、計時器,以及選用的 tunnel 和預覽。見 config.json | 請先停止中繼。oar setup 會寫入一個新的,並附帶新 token,這會讓每個裝置都登出。其中的 tunnel 設定會遺失 |
data/ |
資料庫:你的對話和設定。見資料庫 | 不行:這是你的歷史紀錄。請先備份 |
data/、data/ |
資料庫的預寫式記錄及其索引,在中繼執行時存在 | 絕不能單獨刪除。只能與 copilot. 一起刪除 |
data/ |
每個上傳或貼上的附件一個檔案,以其 SHA-256 雜湊命名,所以同一個檔案只存一次。寫入上傳檔案期間會有一個 <sha256>.<pid>.<number>. 檔案 |
不要手動刪除:資料庫參照這些檔案,用過其中某個檔案的對話會顯示附件遺失。中繼會移除沒用到的檔案,見保留期限 |
data/ |
每個資料夾一個中繼的鎖定檔,見每個資料目錄一個中繼 | 只在沒有中繼執行時 |
data/ |
0.9.14 新增 每個 Cursor 對話一個資料夾:存放它的 agent 的狀態。見狀態資料夾之外 | 使用 Cursor 期間不行:沒有存放區的對話會得到一個新的 agent |
data/ |
0.9.17 新增 DeepSeek 對話的 Claude Code 狀態:projects/ 底下的對話紀錄和 session 資料夾、每個 Claude Code 處理程序留下的東西(sessions/、session-、shell-)、Claude Code 自己的設定,以及 oar-——中繼對每次 Claude Code 啟動的紀錄,刪除時用它來找到正確的 shell 快照。沒有 Claude 登入資訊。只有你能讀取(macOS 和 Linux 上為模式 700)。刪除 DeepSeek 對話會移除屬於它的部分,見保留期限 |
使用 DeepSeek 對話期間不行:它們的 Claude Code session 在這裡。worker 啟動時會重新建立這個資料夾 |
data/ |
0.9.19 新增 中繼的堆積接近上限時寫出的堆積快照(*.),見中繼記憶體耗盡。只有你能讀取(macOS 和 Linux 上為模式 700)。快照中包含存取 token 和 API 金鑰 |
可以。中繼從不刪除快照:每個快照讀完後請刪除 |
data/ |
0.9.14 新增 舊版本存放在套件內的資料,由更新在 npm 移除套件之前複製到這裡。中繼會在下次啟動時接手 | 中繼把它接手之後(relay- 中出現 [data] Brought over the database …) |
backups/<time>/ |
0.9.14 新增 中繼以它接手的較新資料庫取代掉的資料庫;也包括搬移時移到一旁的空資料庫 | 確定不再需要之後 |
data/ |
執行中的中繼啟動時所用的連接埠和 token,在變更了它們的 oar setup 與套用變更的重新啟動之間保留。會自行移除 |
可以 |
logs/、logs/ |
oar start 或 oar copilot 自行啟動中繼時印出的內容,分別是標準輸出和錯誤。只有在 oar 自行啟動中繼時才會寫入;服務和在終端機中執行的中繼不會寫入 |
可以。它們永不輪替,會一直變大 |
logs/ |
中繼主控台的副本,每行附時間戳記,每個中繼都會寫入 | 可以 |
logs/ |
某個 session worker 的輸出,見記錄 | 可以 |
logs/ |
某個 session 的工具設定。其中沒有機密 | 可以。該 session 的 worker 啟動時,中繼會寫入一個新的 |
logs/、logs/ |
由 Copilot 擴充功能引擎的擴充功能寫入 | 可以 |
npm/ |
OAR 套件,當 npm 的全域資料夾需要 root 權限、安裝程式因此把它放在這裡時 | 使用這個安裝期間不行。它就是程式本身 |
runtime/ |
OAR 自己的 Node.js,當機器上沒有夠新的版本時 | oar 以它執行期間不行 |
logs/ |
0.9.15 新增 oar uninstall 之後 npm 的執行結果,以及 npm 留下的任何隱藏 . 資料夾。使用 --purge 時,它改寫到系統的暫存資料夾 |
可以 |
oar-、oar-(Windows) |
開機任務執行的啟動器,以及 OAR 註冊的任務定義。見自動啟動 | 中繼設為開機時啟動期間不行。oar autostart off 會移除兩者 |
*.、*.、<task>.(Windows) |
0.9.15 新增 被 oar autostart --replace 取代的手動建立自動啟動項目的副本,以及切換失敗時放回去的任務的副本:啟動器、Startup 項目、任務匯出的 XML(schtasks / 可以把它放回去)。OAR 產生的項目的副本,會在切換成功後刪除 |
可以,只要你不想再要回那個項目 |
backups/、. |
搬移的回執和標記 | 回執:可以。標記:請保留,否則從先前設定資料夾進行的自動搬移可能會再執行一次 |
在狀態資料夾之外,安裝程式的 oar 啟動器位於 ~/.(僅限它安裝到 ~/. 的情況),Linux 服務則是 ~/.。移除它們的方法見移除 OAR。0.9.15 新增 oar uninstall 會移除服務和套件,並讓狀態資料夾維持原樣;oar uninstall --purge 會在你輸入 delete 之後刪除它。
git 檢出把相同的檔案放在 server/ 中。生成的圖片不在狀態資料夾中,見狀態資料夾之外。
資料庫 #
資料庫是一個 SQLite 檔案:copilot.。中繼會在第一次啟動時建立它。其中存放的就是你會稱為「你的資料」的東西:
- 對話及其訊息,連同對話紀錄、附件的索引和釘選訊息
- 訊息佇列、排入佇列和等待中的訊息,以及 agent 提出的問題
- 你在網頁介面中變更的中繼設定(全 App 開關、供應商設定、保留期限選擇、更新偏好、模型清單)
- OpenAI、Cursor 和 0.9.17 新增 DeepSeek 的 API 金鑰(如果你輸入了)
- 配對的中繼及其 token,以及監看 session 的訂閱,不論 session 在此中繼還是在配對的中繼上
- 你裝置的網頁推播訂閱,以及中繼的推播金鑰
- 分享對話的連結
- subagent 和工作流程的紀錄,以及每個對話的活動和思考
- 上傳檔案的索引,以及哪些訊息使用它們
- Check Usage(檢查用量)中方案用量計的用量快照,以及 0.9.17 新增 DeepSeek 卡片所計算的內容:每個模型、每天 DeepSeek 回合的 token 和搜尋次數、每個 DeepSeek session 最後回報的合計,以及它的進度條所依據的餘額讀數
- 圖片對話:它們的操作,以及生成圖片之間的連結
- 預覽卡片
每次中繼啟動時,資料庫遷移都會自行執行。它們會建立缺少的部分並新增欄位,再次執行也不會改變任何東西。你不需要執行它們,也無法略過它們。
備份 #
OAR 沒有備份指令。資料庫以 SQLite 的預寫式(write-ahead)模式執行,所以最近的變更可能還在它旁邊的 -wal 檔案中。要備份它:
- 用
oar stop停止中繼。 - 把
copilot.,以及db copilot.和db- wal copilot.(如果存在)一起複製。db- shm - 再次啟動中繼。
要還原時,先停止中繼,然後把複製的檔案原樣放回去。不要在中繼執行時單獨複製 copilot.,也不要把某個資料庫檔案和另一份副本的 -wal 檔案混在一起。備份中含有你的 API 金鑰和 token,見機密存放在哪裡;請像保護狀態資料夾一樣保護它。
記錄 #
| 檔案 | 寫入者 | 輪替 |
|---|---|---|
relay- |
中繼,一律寫入 | 達到 5 MB 時,檔案會變成 relay-,較舊的依序移到 . 和 .,最舊的會被捨棄。記錄行中的存取 token 會顯示為 [token]。OAR_ 會關閉這個檔案 |
server.、server- |
oar start 或 oar copilot 的 shell,在它於背景啟動中繼時 |
無 |
worker-<session>. |
每個 Node session worker(Claude、Claude Cloud、Cursor、Grok、0.9.17 新增 DeepSeek 和 Copilot SDK 引擎),在 worker 重新啟動之間持續附加 | 每次啟動時,超過 10 MB 的檔案會變成 worker-<session>.,取代前一個。已刪除對話的檔案會保留 |
ext- |
Copilot 擴充功能引擎的擴充功能 | 無 |
Copilot 擴充功能引擎沒有 worker 記錄:它就是 Copilot CLI 自己的終端機。以 systemd 服務執行的中繼也會寫入 journal,見自動啟動中繼。
以 npm start 啟動的 git 檢出把記錄放在 server/。以 oar start 或 oar copilot 啟動的則放在 ~/.(Windows:%LOCALAPPDATA%\),除非 COPILOT_ 指定了另一個資料夾。
機密存放在哪裡 #
| 機密 | 存放位置 |
|---|---|
| 存取 token | config.,以明文存放。請像對待密碼一樣對待這個檔案、它的副本,以及登入網址(?token=)。瀏覽器會把它當作登入 cookie 保存 30 天。中繼的鎖定檔只保存它的雜湊 |
先前的存取 token(在 oar setup 與重新啟動之間) |
data/,以明文存放,只有你能讀取;會自行移除 |
| Cloudflare tunnel token(受管理的 tunnel) | config. 中的 key cloudflared,或環境變數 COPILOT_ |
| OpenAI API 金鑰 | 資料庫。面板不會再顯示它,也不會傳送到瀏覽器 |
| Cursor API 金鑰 | 資料庫,方式相同 |
| DeepSeek API 金鑰 | 0.9.17 新增 資料庫,方式相同(設定 deepseek_)。中繼只會把它傳送到 DeepSeek 的基礎 URL,也只會交給 DeepSeek 對話的 worker。見 DeepSeek |
| 配對的中繼的 token | 資料庫。絕不會傳送到瀏覽器或 agent。使用此中繼自己 token 的配對不會儲存任何 token |
| 分享對話連結的 token | 資料庫 |
| 網頁推播金鑰和裝置訂閱 | 資料庫 |
| 堆積快照 | 0.9.19 新增 data/:中繼記憶體中的所有內容,包括存取 token 和 API 金鑰。絕不要原樣分享。見中繼記憶體耗盡 |
| Claude 登入 | Claude CLI 在中繼機器上自己的資料夾:~/.,或 CLAUDE_ 中的資料夾。中繼不儲存任何登入資訊。Claude Cloud 讀取同一個登入,並保存在記憶體中。DeepSeek 對話不使用它 |
| Grok 登入 | Grok CLI 自己的資料夾:~/. |
| GitHub Copilot 登入 | Copilot CLI 在中繼機器上自己的登入 |
當 worker 在 tmux 下啟動時,中繼會把它的供應商金鑰(OpenAI、Cursor 或 0.9.17 新增 DeepSeek 的金鑰,或是來自中繼環境、給 Claude Cloud 或 0.9.17 新增 Claude worker 用的 CLAUDE_)寫入系統暫存資料夾中的一個暫存檔,只有你能讀取。worker 的 shell 讀取一次後就會刪除它。每個 worker 只會拿到它自己供應商的金鑰。
保留期限 #
中繼會自行移除以下項目。除非你刪除對話,否則不會刪除其他任何東西。
| 項目 | 規則 |
|---|---|
| 未使用的上傳檔案 | 沒有任何訊息或草稿參照的檔案,在超過 24 小時後會被移除。檢查會在中繼啟動時執行,之後每 6 小時一次。沒有對應的設定。刪除對話也會移除只有它使用的檔案 |
| Subagent 紀錄 | 已完成 subagent 的工具輸入和結果,會在 Keep sub-agent tool output(保留 subagent 的工具輸出)所設的天數後移除,這個設定在 Settings → General(設定 → 一般)中:7、14、30 或 90 天,或 Always(永久)。預設為 90。思考、回覆、註記和每次呼叫的單行摘要會保留。檢查會在啟動後 30 秒、每天一次,以及你變更設定後 5 秒執行。資料庫檔案不會縮小;SQLite 會重複使用釋出的空間 |
| 用於監看 session 的中繼事件 | 已交給監看對話的事件,會在 2 小時後移除。已結束的訂閱會在 7 天後移除。詳見監看 session。清理每 10 分鐘執行一次 |
| 配對的中繼尚未取得的事件 | 每個訂閱保留最新的 500 個,且都不超過 7 天;7 天內沒有人取得的訂閱會結束。提問和錯誤最後才會被捨棄。見遠端中繼 |
relay- |
達到 5 MB 時輪替,並保留三個較舊的檔案,見記錄 |
worker-<session>. |
啟動時超過 10 MB 就移到 .。沒有任何機制會移除已刪除對話的記錄 |
| 生成的圖片 | 絕不會因為時間久了而移除。刪除對話會刪除它的圖片 |
| 鎖定檔 | 中繼停止時移除。當機後,下一次啟動會取代它,見每個資料目錄一個中繼 |
刪除對話會從資料庫中移除它的訊息、佇列項目、提問和 subagent 紀錄,以及屬於它的 Claude 對話紀錄和生成的圖片。0.9.17 新增 對 DeepSeek 對話,還會在 data/ 中移除對話紀錄、session 的資料夾、它已停止的 Claude Code 留下的東西(它的註冊資訊、hook 環境和 shell 快照),以及沒有其他 session 使用時的專案資料夾;並從資料庫中移除它的 session 最後回報的合計。它加到 DeepSeek 卡片合計和每日數字中的部分會保留。每個供應商自己保存的內容見下一節。
狀態資料夾之外 #
| 項目 | 位置 |
|---|---|
| Claude 對話紀錄和 session 資料夾 | 在 Claude 設定資料夾(~/.,或 CLAUDE_)的 projects 底下。刪除對話會刪除它的對話紀錄。見 Claude。0.9.17 新增 DeepSeek 對話則把它們的放在資料目錄中:上面的 data/ |
| GitHub Copilot session 狀態 | ~/.,或 COPILOT_ 中的資料夾 |
| OpenAI Image 對話的圖片 | 在 Copilot 的 session-state 資料夾中,對話底下的 <session>/。見 OpenAI |
| Cursor agent 存放區 | 0.9.14 新增 每個對話一個資料夾,位於中繼資料目錄的 cursor- 中(~/.、%APPDATA%\),或位於 CURSOR_ 指定的資料夾。全域安裝時在狀態資料夾中;列在這裡是因為較早的版本把它們放在別處。見 Cursor |
| Grok CLI 及其登入 | ~/. |
| Copilot 擴充功能包裝程式 | ~/.,由 oar copilot 或 oar copilot --install- 寫入。0.9.15 新增 如果它是 OAR 為這個安裝寫入的那一個,oar uninstall 會移除它 |
| Claude Cloud | 磁碟上沒有任何東西。雲端 session 在 Anthropic 執行;結果會以推送的分支傳回 |
| 暫存檔案 | 上面提到的短暫存在的供應商金鑰檔案,位於系統的暫存資料夾 |
在 0.9.14 之前,Cursor 存放區預設位於套件資料夾內的 server/,而更新會取代這個資料夾,所以對話可能會失去它儲存的 agent 並得到一個新的(見 Cursor)。存放區仍在舊位置的對話會繼續在那裡使用它;兩個位置都有存放區的對話,會使用最後變更的那一個;不會搬移或刪除任何東西。
你的 agent 的工作成果,也就是你專案資料夾中的檔案,完全在 OAR 的儲存空間之外。
每個資料目錄一個中繼 #
中繼啟動時會在資料目錄中建立 relay-,停止時移除它。這個檔案存放中繼的處理程序編號、它的 token 的雜湊,以及它的啟動時間。
如果第一個中繼正在執行時,第二個中繼在同一個資料目錄上啟動,第二個會印出一行訊息並結束,0.9.14 新增 結束代碼為 78(之前為 1),Linux 服務不會重試這個代碼:
Relay already running (pid=4242, startedAt=2026-01-05T09:12:40.000Z; lock /home/dev/.oar/data/relay-server.lock). It is held by relay process 4242: oar stop, or end process 4242.
如果看到的是 Relay appears to be owned by another live process 而不是 Relay already running,表示執行中的中繼使用另一個 token。當無法確認持有者是中繼時,提示會是 If no relay is running, end process 4242 or delete the lock.。oar start 在 The relay did not come up 之後會印出相同的提示。第一個中繼不會受到影響。當實際執行的中繼不是你預期的那一個時,訊息會一直停在待處理狀態;oar doctor 會顯示正在使用的設定檔和資料庫。
當機或斷電後,鎖定檔會被留下。0.9.14 新增 如果鎖定是在上次開機之前建立的,或者它的處理程序編號現在屬於一個在它之後才啟動的處理程序,這個鎖定就是過時的:下一次啟動會把它移到一旁,記錄 Recovered stale singleton lock,然後接手鎖定。這不再依據時鐘判斷,所以時鐘跳動不會讓執行中的中繼看起來像已經消失,兩個同時回收同一個鎖定的啟動也不會都執行起來。無法讀取的鎖定(斷電留下的空鎖定)會再讀取一次,並視為已被持有,除非它的時間相差超過 10 秒。oar start 不再移除這個版本寫入的鎖定;當中繼的連接埠上沒有任何回應時,它仍會移除舊版本寫入的鎖定。
兩個中繼只要有各自的資料目錄和連接埠,就可以同時執行。oar 如何找到中繼,見 oar 指令;重新啟動會保留什麼,見重新啟動與繼續。