第五節 工作階段
工作階段(Session)是一次連貫的對話上下文。
5.1 持久化
AVL Code 會把每一條訊息持續追加到本機,斷電、關機、重新啟動都不會丟。每條訊息都有時間戳記與作者識別;工具呼叫、計畫修改、簽核結果也會以獨立卡片形式記錄,整條工作階段可作為完整的工程稽核材料。
5.2 工作階段操作
- 新增:工作階段分頁欄 → 新增,或快速鍵
⌘N/Ctrl+N。同一個工作區內最多只保留一條空白草稿:反復點 +、按 ⌘N、發/new都復用同一條,未發出第一條訊息前不會進側邊欄,避免堆出一串"新工作階段 1 / 2 / 3 …"幽靈草稿。 - 切換:點擊分頁,或在微信裡
/s <短id>,或在 命令面板(Cmd+K) 裡搜工作階段標題。 - 重命名:分頁右鍵 → 重命名。
- 智慧命名:未被手動改過名的工作階段,收到第一條 AI 回復後會自動讓 LLM 起一個簡短標題(預設啟用,可在 設置 → 上下文 關掉);手動改過名的工作階段永久豁免,不再被自動覆蓋。重命名對話框裡也有「智慧命名」按鈕,可隨時點一下重新增議。
- 歸檔:分頁右鍵 → 歸檔。歸檔後從主列表消失,可在 工作階段檔案 裡復原。
- 匯出 / 分享:分頁右鍵 → 分享,可儲存截圖、儲存 HTML、複製為 Markdown;「匯出工作階段 (.zsession)」則把整條工作階段打包成可遷移的歸檔文件。匯出的 HTML 與介面顯示一致:跟隨極簡密度檔(灰階細行 + 同類呼叫合並計數,失敗照常計入)、子代理以卡片呈現、使用者訊息氣泡按來源分色。
- 複製為新工作階段:以本工作階段為起點新增分支,原工作階段不變。
右鍵即可喚起選單:工作階段條目與上方兩處標題欄的 ⋯ 選單都可用滑鼠右鍵直接喚起,不必瞄準 ⋯ 按鈕;選單貼近視窗底部時不再被裁切,右鍵也不會連帶選中條目文字。
5.2.1 使用者訊息時間戳記
自己發出的訊息左側有一個時間戳記標籤,點擊在三種格式間循環:
| 格式 | 例 |
|---|---|
| 相對時間 | 剛才、3 分鐘前 |
| 工作階段內偏移 | +1m23s(相對首條訊息) |
| 絕對時間 | 14:32 |
不同工作階段各自記憶,互不影響。
5.3 訊息組成
一條對話由若乾"訊息卡片"組成:
- 使用者訊息
- 助手回復(串流繪製,可中途打斷)
- 工具呼叫(可折疊卡片,包含入參摘要、耗時、結果)
- 計畫 / 待辦更新(結構化展示,可獨立修改)
5.3.1 程式碼區塊:語法醒目顯示 + 一鍵複製
對話裡的 fenced 程式碼區塊(```)渲染為帶 header 的程式碼卡:
- 語法醒目顯示:基於 highlight.js(lib/common),按語言着色;未知語言走樸素轉義,不影響呈現。
- 語言標籤:右上角顯示該程式碼區塊的語言名(如
python/go/tsx)。 - 「複製」按鈕:右上角一鍵把整段程式碼複製到剪貼板,不用手動框選;成功時按鈕短暫變成「✓ 已複製」反饋。
- 行號 grid 保活:跨行 syntax span 內部按源行拆分後逐行配對,行號列與程式碼列始終對齊,不會因醒目顯示而錯位。
5.4 訊息流控制
- 助手執行中,輸入框右側的發送鍵變成 停止 按鈕 — 按下會同步終止主助手與所有派生子任務。
- 中途如果你想到補充內容,直接按 Enter 入隊 — 這條會在當前自然結束後合並行出,不會打斷當前回合。
- 助手輸出的工具呼叫卡片可以單獨點開 / 折疊 / 複製結果。
- 輸入框按 ↑ / ↓ 可回溯歷史輸入,執行過的
/斜槓命令也納入歷史(以規範化的/<名> <參數>形式),便於再次取用或改寫。
5.4.1 復述意圖:開工前先跟你對一遍目標
為避免「一上來就跑偏」,AVL Code 會在工作階段的第一條訊息上做一道輕量確認:AI 先復述一遍它理解的目標、說說打算怎麼做(多 Agent 模式下還會給一份「先拆任務 → 並行派子 Agent → 交還你驗收」的分階段計畫),等你點頭再動手。該功能預設啟用,可在 設置 → 智慧體 → 自省 關閉(開關:復述意圖)。
- 確認就在訊息流裡完成,不是彈窗,樣式和普通訊息一致。
- 預設 60 秒後自動開始;滑鼠停留在確認條上會暫停倒數計時,給你足夠時間看。
- 確認條上有三個選擇:
- 確認開始 — 採納 AI 的復述直接開乾;
- 修改 — 當場把復述改一改再發,目標和計畫都能改;
- 保留我的本意 — 不採納 AI 的復述,直接用你最初那條訊息繼續。
- 點「取消」會把你最初那條訊息原樣放回輸入框,不會丟,便於你補充或重寫後再發。
- 只在該問的時候問:僅對你親手輸入的首條訊息觸發(自動 / 程式觸發的不算),且只在這條開場訊息比較短(30 字以內)或比較簡單時才彈;寫得夠長夠清楚(多行、帶編號列表、或頓號 / 逗號等分隔符多於 3 個)就直接開乾、不打擾。
- 想對某條訊息手動重新對一遍意圖:在該訊息的操作選單選「分析意圖並從這裡重新開始」即可(無視上面的觸發條件,強制復述一次並從這裡重開);會先隱藏重新啟動點之後的訊息、把確認條放在其下方,便於你看清影響範圍。
- 選擇統計:確認 / 修改 / 保留本意 / 超時自動開始 / 取消各自的次數與字數會被記錄,在 設置 → 智慧體 → 自省 以表格呈現,便於你回看這道確認到底幫沒幫上忙。
5.5 "正在生成"區塊的視覺細節
- Token 數變化加滾動動效:串流過來的 token 計數不再硬跳,約 0.4 秒平滑插值到目標值;變化期間數字短暫變品牌藍並微微上抬。系統設置「減少動畫」時自動跳變不抖。
- 耗時按分級顯示:60 秒以內仍是
5s/12s這樣的簡短表達;超過 1 分鐘自動升級為1m 30s;超過 1 小時升級為2h 15m 30s。短任務零變化,只在長任務時升級單位。 - 上下文佔用圓環按佔用分檔變色:顯示當前上下文視窗佔用比例的圓環會隨佔用分檔變色 —— 達到 75% 變黃、達到 90% 變紅,更醒目地提示已接近上下文上限(該續跑 / 折疊了)。
5.5.0 訊息密度(正常 / 極簡)
設置 → 一般 → 訊息密度 提供兩檔(落盤欄位 message_density,預設 detailed);Header 快捷選單「顯示」分組的「訊息量」滑塊可一鍵切換,無需進設置頁:
| 檔位 | 行為 |
|---|---|
正常(detailed,預設) |
完整卡片 + 參數預覽 / argsSummary,零迴歸 |
極簡(compact) |
無卡片、灰階細行、最小 chrome;只壓縮過程渲染,你的提問與 AI 的本文回復照常完整顯示;不再壓縮行高 |
極簡檔下,過程內容自動歸並計數:
- 連續工具呼叫結果合並成一行,帶計數。
- 多段思考 + 工具呼叫合並成 「思考 N 次 · 工具 M 個」(數量變化帶 pop 動效)。
- 還在執行、暫時沒結果的工具呼叫合並成 「N 次工具呼叫嘗試」。
- 匯總行裡如果有失敗,用淺紅色標出 — 不刺眼但看得見。
切換檔位時滾動位置穩定、不抖動;舊的「收斂」檔(collapsed)自動遷移到「極簡」。
5.6 滾動與跟隨
- 生成期間預設自動跟隨底部。
- 一旦你向上滾動檢視歷史,「跳轉底部」按鈕出現 = 視為你主動滾走,自動跟隨停止。
- 生成中拖滾動條回看不再被釘住:AI 正在串流輸出時,想往上拖曳滾動條回看前文,過去常被自動跟隨同幀拽回底部、像「拖不動」;現在主動上拖會同步松開自動跟隨,讓你正常上滾檢視,需要時再回到底部繼續跟最新輸出。
- 你點「跳轉底部」或自己手動回到底部時,跟隨自然復原。
- 已堵住滾輪事件與串流 chunk 同幀的微秒級競態,不會再被反復打斷。
- 整列表高頻抖動修正:之前某些情況下訊息列表會上下快速抖動 / 跳動 — 根因是個別訊息的高度被反復重測。現在把已渲染過的高度快取下來(包括高度為 0 的情況),列表不再來回彈跳,滾動更穩。
- 「跳轉底部」一次到位:之前要點好幾次才能真正到底;現在改為持續校準直到內容高度(scrollHeight)穩定,一次就能穩穩停在底部,長工作階段首次開啟也不會出現「按鈕按了像沒反應」的多點情況。
- 快速重復點「發送」不再重發:加了同步的在途攔截,連點也只發一條。
5.6.2 長工作階段分頁按需載入
開啟很長的工作階段時先顯示最近一段,往上滾動再分段載入更早的訊息:
- 滾到頂端繼續上滾 → 自動載入上一頁,多頁載入時置中顯示進度提示。
- 底層做了行偏移索引(O(range) 不再 O(scan-from-line-1))+ 多頁之間按幀讓步 + 去重,長工作階段的首次開啟與上下滾動明顯更快、更跟手。
- 工作階段目錄的跳轉對尚未載入進視窗的更早訊息也能正確定位(自動先載入到該位置再滾過去)。
- 超大訊息預設不再"顯示折疊":之前為了性能會把過長的單條訊息折疊成摘要,現在預設完整展開,要折疊請到設置調整。
5.6.0 工作階段目錄與一鍵跳轉
工作階段標題左側新增工作階段導航按鈕(List 圖示),滑鼠點擊展開一個目錄 popover:
- 列出本工作階段每條使用者提問 — 每條取「首個非空行」作為標題,自動折疊多餘空白,超長截到 120 字元(帶 …)。
- 點擊某條 → 平滑滾動到該訊息並關閉 popover。
- 醒目顯示當前所在條(純灰階,樸素專業風)— 按當前視口內可見的使用者訊息實時判定,滾動時跟隨重新整理,末條也能正確選中,不再總停在第一條。
- 關閉方式:
Esc/ 點 popover 外 / 視窗 resize。 - 虛擬化安全:按
data-message-id定位(佔位訊息也帶該屬性且占正確高度),長工作階段也定位準確。 - 僅在工作階段裡有使用者提問可跳轉時才顯示,空工作階段不出現。
- 用瀏覽器 Popover API(
popover=manual+ top layer)渲染,不相依 z-index,不會被彈窗 / 抽屜等遮擋。
5.5.1 工作階段狀態條:隨視窗寬度換形態
文件變更 / 記憶 / 待辦 / 計畫 / 目標 / 引導 / 結果草稿 / 附加資料 / 建議任務 / 自檢門禁 等狀態條會按視窗寬度自動選擇呈現形態:
- 窄螢幕 — 輸入框上方橫排:多條並列在輸入框上方,寬度不夠時自動換行(優先填滿緊貼輸入框的那行、再往上疊),各條間距收攏,非底行的標籤還原成完整藥丸,不再被擠出螢幕或相互遮擋。點開為向上彈出的浮層。
- 寬螢幕 — 訊息區右上的縱向狀態疊:視窗夠寬時,這些條目改為在訊息區右上縱向排列,不再佔用輸入框上方的空間。點開為右側堆疊抽屜:不加遮罩、不擠壓本文,以整個狀態疊為錨,切換不同條目時抽屜位置保持穩定,並會按兩側可用空間自動選擇向左或向右展開。視窗特別寬時抽屜槽位固定預留,開合抽屜不會讓本文左右跳動。
訊息量設為「極簡」時恆用輸入框上方的橫排形態。切換形態只改變位置,不改變本文寬度。
5.6.1 工作階段附加目錄:讓 AI 臨時存取工作區之外的資料夾
輸入框「+」選單新增兩項:
| 入口 | 權限 |
|---|---|
| 附加目錄(只讀) | AI 可讀取該目錄下文件、列舉、搜尋;不能修改 |
| 附加目錄(讀寫) | 在只讀基礎上額外允許寫 / 刪 / 建立 |
典型用法:讓 AI 參考另一個專案的程式碼、把產出寫到指定目錄、跨工程協作等。
附加前有確認對話框,明確說明授予的是只讀還是讀寫權限;附加後出現 「附加路徑」條(窄螢幕在輸入框上方、寬螢幕在訊息區右上,見 §5.5.1),展示當前工作階段的附加目錄,可隨時移除。
作用域與安全:
- 附加只對當前工作階段生效,其它工作階段不受影響。
- 隨工作階段儲存,重新啟動後依然有效(後台自動重新生效,無需重新附加)。
- 放寬的只有文件讀寫口徑(讀 / 寫 / 搜尋 / 列舉),其餘安全政策不變。
- 附加目錄下的搜尋結果用絕對路徑標註,來源一目了然。
- 工作階段身份由系統在呼叫鏈裡注入,AI 自己無法偽造身份去冒用別的工作階段的附加權限。
統一的「附加資料」入口:工作階段附加的目錄 / 文件與工作區的樣本 / 附件已合並到同一個「附加資料」條統一管理,附加進度等狀態實時可感知。兩類語義清晰、各自處置:工作階段附加的項移除只是解掛、不刪原文件;工作區樣本 / 附件的刪除走行內二次確認,不易誤刪。文件有變更會自動重新整理(AI 改完文件後無需手動重載),目錄按多層樹狀呈現看得更清楚,並自動忽略 macOS 的特殊文件(如
.DS_Store、__MACOSX/等)。本機工作區文件加入附加資料時狀態顯示為「已就緒」(不再用「上傳 / 已上傳」誤導本機文件)——「上傳」只留給真正外發的場景(如提交反饋、上傳檢測);範圍(scope)徽標也改為可讀性更好的靛藍配色。
5.7 訊息內鏈接與檔案路徑可點
AI 回復裡的鏈接和檔案路徑現在都能點:
- 工作區內的檔案路徑 → 點開後用系統檔案管理員(Finder / 資源管理器)定位並選中該文件。
- 外部鏈接 → 用預設瀏覽器開啟。
- 反引號內聯程式碼裡的路徑(如
`src/main.go`)同樣可點,與普通鏈接共用一套識別與定位邏輯;普通內聯程式碼不受影響。 - 程式碼引用可點跳轉(接地證據可核對):AI 回答裡引用的程式碼位置、以及工具結果裡的「
文件:行」現在都能點 — 帶行號的工作區文件,點「檢視」會開啟源碼預覽並滾動到該行,不必自己去翻。這讓code.search/code.ask等給出的文件:行證據「看得見、可核對」。 - 點擊後就地彈出輕量浮動小工具條(主動作「檢視 / 開啟」+「複製」),非模態 — 點別處 / 滾動 / 按 Esc 即關。
- 工具條用瀏覽器 Popover API 渲染在頂層,從「關於」「發佈說明」「更新」等彈窗裡點鏈接也不會被遮擋。
- 路徑識別更精準:只把帶常見副檔名的字串(如
src/main.go、README.md)認作可點路徑;純目錄、無副檔名 / 未知副檔名的片段(如a/b、/etc/hosts)不再被誤標為可點。 - 僅 AI 回復生效:你自己發的訊息裡鏈接 / 路徑不再可點,避免誤觸;只有助手回復裡的鏈接和路徑才會被識別與提供工具條。
- 安全:危險協議(非
http(s))鏈接被攔截不放行;文件定位有工作區縱深校驗,不會越界到工作區外。
5.7.1 文件預覽抽屜
訊息流裡點文件鏈接,彈出的工具條在「檢視 / 開啟」「複製」旁多了 「預覽」 按鈕,就地看內容不必切到編輯器。
- 支持的文件類型遠不止 Markdown:常見源碼(Go / TypeScript / Python / Rust / Java / C·C++ / Ruby / PHP / Swift / Kotlin 等)、配置(YAML / TOML / JSON / INI / .env)、前端(HTML / CSS / Svelte / Vue / Astro)、指令碼(sh / bash / ps1 / bat)、文字與資料(md / txt / csv / tsv / xml / sql / diff)、圖片與常見二進制(png / jpg / svg / pdf / zip 等),以及
Dockerfile、Makefile、go.mod、.gitignore這類沒有副檔名的常見文件名。 - 源碼帶語法高亮,與訊息流裡的程式碼區塊同一套配色;本文特別大時(超過約 256 KB)不再著色,但行號與定位照常可用。文件路徑前會按格式顯示對應圖示,一眼分辨類型。
- 二進制文件以十六進制轉儲呈現(十六進制 + 字元對照,最多 64 KiB),不再顯示成亂碼。遠端工作區的二進制文件取不到原始位元組,此時會明確說明而不是給出假內容。
- 可預覽的範圍:先在工作區內查找,找不到再匹配當前工作階段附加的目錄 / 文件 —— 附加進來的文件同樣能預覽。不能預覽的路徑不會顯示「預覽」按鈕,避免點了沒反應。
- 呈現形態按視窗寬度自動選擇:外側空間足夠時常駐為右側側欄(不收窄本文);空間不足時退回浮層抽屜(寬
min(820px, 94vw)、不加遮罩),此時本文靠左側留白避讓,同樣不被收窄。 - 在文件內搜尋:抽屜裡可直接搜當前文件的內容,命中處高亮,顯示「第幾處 / 共幾處」,用「上一處 / 下一處」逐個跳轉,可切換是否區分大小寫。命中過多時只標出前若干處並給出提示。
- 大小:預覽本文上限 1 MiB(超出自動截斷並標註),適合速覽;要保全文請用「另存新檔」。
- 「另存新檔」按鈕(抽屜標頭):調系統儲存對話框,用 64 MiB 大上限讀取原始檔保全文,寫到你指定的位置;取消等於無操作。
- 程式碼區塊裡單獨一條文件路徑(文件存在時)也能點開預覽:渲染時非同步校驗該路徑是否存在,存在才升級為可點,避免點到不存在的文件。
按 ↑ 在輸入歷史裡回溯時,輸入框左上角顯示當前位置 N/N(最新 = 總數,最舊 = 1/N),不再"按了幾次 ↑ 自己也不知道翻到哪了"。草稿態 / 空歷史 / 越界一律不顯示。
回溯到某條歷史後直接鍵入或貼上 → 自動離開歷史態,改後內容當作最新草稿:之前在歷史態修改會讓人誤以為"這條歷史被改了",本版明確語義 — 編輯即新草稿,原歷史不動;再按 ↑ 仍先把當前草稿存起來,編輯內容不丟。
5.9 跨端接管
如果你已經綁定了微信通道:
- 手機上
/s <短id>即可繼續未完成的桌面工作階段。 - 桌面端工作階段也可以接管手機端發起的工作階段。
- 同一工作階段同時只允許一端"持有",另一端會自動同步顯示。
詳見第十九節「隨行通訊」。
