觀察執行
以人類身分透過 Viewer 監控執行中的工作流程,或以 Agent 身分透過 JSON 監控。
工作流程的撰寫、執行、觀察與審批都以命令形式提供 --json 輸出,因此驅動 Kilin 的既可以是終端機
前的人,也可以是監督其委派工作的外層 Agent 執行環境。非互動式安裝需要明確指定提供方,例如
kilin skills link --providers agents。Viewer 仍是面向人類的檢視介面,外層 Agent 可以透過
--json 啟動並監管其附著式 CLI 行程。
┌─────────────────────────────────────────────────────────────────┐
│ OUTER AGENT RUNTIME │
│ a person at a terminal · or Codex / Claude Code / a script │
└─────────────────────────────────────────────────────────────────┘
│ ▲
│ create kilin workflow init │ monitor runs list · runs show
│ update edit WORKFLOW.yaml │ track runs wait --json
│ start kilin run · kilin trigger │ inspect kilin ui
│ decide runs approve · runs reject │
▼ │
┌─────────────────────────────────────────────────────────────────┐
│ KILIN │
│ validate → compile → immutable revision → execute │
│ SQLite history · captured logs · JSONL event stream │
└─────────────────────────────────────────────────────────────────┘
│ ▲
│ spawns provider subprocesses │ results · logs · decisions
▼ │
┌─────────────────────────────────────────────────────────────────┐
│ INNER WORKFLOW — one run │
│ │
│ analyze ──▶ implement ──▶ [approval] ──▶ verify │
│ read_only workspace_write barrier read_only │
│ Claude Code Codex Codex │
└─────────────────────────────────────────────────────────────────┘外層執行環境始終位於執行之外。它無法伸手干預正在執行的節點,對 WORKFLOW.yaml 的任何修改也無法
改變本次執行所執行的內容,因為 Kilin 在第一個節點啟動前就已記錄了不可變修訂。
下面兩種檢視讀取的是同一份本機 SQLite 歷史,兩者都不是對方的簡化版本。
以人類身分
為正在執行的工作流程開啟 Viewer:
kilin ui change-review --cwd /absolute/path/to/projectViewer 只繫結數字形式的 127.0.0.1,連接埠由作業系統選擇。它呈現已編譯的圖、隨時間變化的節點狀態、
該工作流程識別與工作目錄下最新的 50 次執行、血緣關係、審批中繼資料、失敗資訊、有界的擷取輸出,
以及 Decision Packet。
載入時,Viewer 會開啟最相關的已儲存執行——優先是等待審批的執行,其次是執行中的執行,最後是 最新完成的執行——並選取最能解釋執行狀態的節點。沒有已儲存執行時,它保持目前定義視圖。所選執行、 節點、輸出串流與轉譯/原始視圖會保存在 URL 雜湊中,重新載入後即可恢復原位。
頂列提供 Refresh 控制項,它會立即請求目前狀態並重設輪詢退避。當擷取的輸出串流載入失敗時, 輸出面板會提供 Retry 控制項以再次請求該輸出串流,Refresh 也會再次請求它。當圖高於容納它的區域時, 工作流程狀態旁會出現 Expand 控制項,它會提高高度上限,讓分支較多的工作流程更少需要捲動; 該選擇會在輪詢期間保留,直到你再次收合。
Refresh 旁邊,在瀏覽器支援通知時會出現一個通知控制項。授予權限後,當某次執行在其分頁處於隱藏狀態 時開始等待核准,Viewer 會提醒你——它會為該次執行發出一則通知,點擊它即可回到那裡。隱藏的分頁 不會停止輪詢,而是降到十五秒的較低頻率,因此你在別處時到達的核准仍會被捕捉到;切回該分頁會立即 輪詢一次並恢復正常頻率。
選取某個節點時,圖會捲動到該節點,因此大型工作流程中位於可見區域下方或側邊的節點無需你手動捲動 即可進入視野。
迴圈節點的卡片始終保留 loop 字樣,並在某次迭代開始後補上迭代進度 loop · 2/3;在此之前
保留上限 loop · up to 3。選取它會把卡片
展開為一個容器,畫出最新已開始迭代的迴圈體管線——各迴圈體節點及其狀態、revise 回饋邊與 pass
出口——選取某個迴圈體節點即可檢視該次執行的證據。若選取的是更早迭代中的執行,則改為繪製那次迭代。
只有一個迴圈節點的工作流程會以展開狀態開啟。
Loop iterations 面板會列出每一次已記錄的迭代,並在首次迭代之前先給出迴圈體的節點名。
當執行停在審批節點時,Viewer 會顯示受保護的 Approve 與 Reject 按鈕,並同時給出等價的 CLI 命令。
可選的備註是多行輸入框:Enter 只會換行,只有 Approve 或 Reject 才會送出。
執行中的執行還會在等價的 kilin runs cancel 命令旁提供 Cancel run 按鈕。這兩項就是它全部的狀態
變更面,且是一個封閉集合:它不能編輯工作流程、啟動 provider 執行,也不能排程任務。加上 --no-open
可只列印啟動 URL 而不開啟瀏覽器;請將該 URL 視為憑證。
不使用瀏覽器時,同一份歷史也可以用文字檢視:
kilin runs list
kilin runs show <run-id>以 Agent 身分
內建執行 skill 會先驗證目前可見的 package;當請求者的瀏覽器可存取相同 loopback 時,它會將
kilin ui <id> --cwd <directory> --no-open --json 作為受管理的附著式行程啟動,並直接回傳
viewer.started URL。無論 run 成功或失敗,Viewer 都會保持執行,直到被停止或外層 Agent
工作階段結束。如果 Agent 在另一台機器上執行或無法保留該行程,它會使用請求者的本機專案路徑
回傳手動命令,不會聲稱遠端 127.0.0.1 URL 可存取。只有本機 Viewer 能存取同一份 Kilin 資料時,
它才會顯示相同的歷史紀錄。
kilin run --json 以每行一個 JSON 物件的形式串流輸出。每個事件都帶有 outputVersion: 1 與 type:
run.started · node.started · node.finished · approval.requested
approval.resolved · run.finished · error不必輪詢,直接阻塞等待執行下一次需要關注或進入終態:
kilin runs wait <run-id> --json控制方可以在第二個本機行程中記錄決策,同時執行仍附著於第一個行程,因此無需擷取終端機輸出:
kilin runs approve <run-id> <approval-node-id> --actor agent
kilin runs cancel <run-id>停止附著的 kilin run 行程本身也會停止該執行。SIGINT、SIGTERM 與 SIGHUP 都經由同一條取消路徑,
因此監督行程、容器停止、CI 取消或關閉終端機都會終止提供方行程樹,而不是讓它變成孤兒行程,命令以 130
結束。若某次執行被直接終止且無法清理,下一個在該目錄中工作的命令(包括再次執行 kilin run)
會在開始之前結束它遺留的行程。
失敗會帶有穩定的錯誤碼 —— NODE_TIMEOUT、LOOP_LIMIT_REACHED、APPROVAL_REJECTED 等 ——
因此監督方 Agent 可以依錯誤碼分支,而不必解析散文。runs list、runs show 與 workflow validate
同樣接受 --json。
監控不會揭露的內容
宣告的執行參數被刻意排除在生命週期事件、runs list、runs show 與 Viewer 之外。迴圈迭代依迭代分組,
但不會揭露參數、回饋、決策選項或結果值。
擷取的 stdout、stderr 與結果保留為資料目錄下的私有本機檔案,而非事件酬載。關於這些歷史可能包含 什麼,參見信任邊界;完整的參數面參見命令參考。