跳至內容

終端機通道

終端機通道承載單一偽終端機 (pty) 程序的狀態 - shell、dev 伺服器、建置任務或其他長時間執行的指令。終端獨立於任何建立它們的工作階段,並且可以由用戶端或工作階段聲明。

有關終端機流的實作演練,請參閱終端指南

網址

<scheme>:/<id>

終端機 URI 的方案和路徑是由伺服器定義的。 RootState.terminals 所承載的輕量級終端機目錄通告每個即時終端機的 URI;用戶端訂閱終端機 URI 以取得其完整的狀態。

狀態

訂閱者收到 TerminalState 快照:

typescript
TerminalState {
  title: string
  cwd?: URI
  cols?: number
  rows?: number
  content: TerminalContentPart[]
  exitCode?: number
  claim: TerminalClaim
  supportsCommandDetection?: boolean
}

content 是鍵入部分的有序陣列。每個部分要麼是 unclassified(原始 VT 輸出),要麼是承載命令列、累積輸出、退出程式碼和持續時間的結構化 command 部分。有關零件形狀,請參閱端子指南

終端機 總是擁有 - claim 欄位記錄它是屬於用戶端還是工作階段。

生命週期

創造

createTerminal 是一個 JSON-RPC 請求,它會指派一個新的終端機,其中包含必要的初始宣告以及可選的名稱、cwd 和維度:

jsonc
// Client → Server
{
  "jsonrpc": "2.0",
  "id": 9,
  "method": "createTerminal",
  "params": {
    "channel": "ahp-terminal:/<id>",
    "claim": { "kind": "client", "clientId": "client-abc" },
    "name": "build",
    "cwd": "file:///workspace",
    "cols": 120,
    "rows": 30
  }
}

建立後,伺服器調度 root/terminalsChanged,以便 ahp-root:// 的訂閱者看到終端機目錄中的新條目,並且用戶端應訂閱終端機 URI 以接收完整的狀態。

處理

disposeTerminal 終止底層 pty(如果正在執行)並刪除終端機。伺服器調度 root/terminalsChanged 以反映新目錄。不存在「不釋放就釋放」的情況——當不再需要終端機時,它就會被釋放。

該通道上的方法和事件

本節列出了在上下文中解釋的連線方法 終端機 URI (ahp-terminal:/<id>)。

指令 (params.channel = "ahp-terminal:/<id>")

方法親切目的
createTerminal請求在選定的 URI 處建立帶有初始聲明的終端機。
disposeTerminal請求處理此終端機並終止其 pty(如果仍在執行)。

通知 (params.channel = "ahp-terminal:/<id>")

方法親切意義
action伺服器 → 用戶端通知終端機操作信封(terminal/* 操作有效負載)。
dispatchAction用戶端 → 伺服器通知調度終端機用戶端操作(terminal/inputterminal/resizedterminal/claimedterminal/titleChangedterminal/cleared)。
unsubscribe用戶端 → 伺服器通知停止接收此終端機通道的訊息。

行動

所有終端機範圍的操作信封都帶有 channel: "<terminal-uri>"。操作有效負載不攜帶自己的終端機 URI。

資料流

行動用戶端-可調度reducer 效果
terminal/data沒有追加到尾部內容部分
terminal/input是的無操作(伺服器轉送到 pty)

terminal/data 僅限 伺服器terminal/input 是一個 僅副作用 用戶端操作 - 用戶端調度鍵盤輸入,而伺服器將其轉送到 pty 行程。 reducer 不會修改 terminal/input 上的狀態;任何結果輸出稍後都會透過 terminal/data 到達。

::: 提示為什麼要進行兩個單獨的操作? 終端機 I/O 有意分為 terminal/input (用戶端 → pty) 和 terminal/data (pty → 用戶端),因為 標準預寫入協調對終端並不安全。 pty 是一個有狀態的、可變的過程-樂觀地應用輸入或預測輸出會產生不正確的狀態。透過將輸入保持為僅副作用操作並將輸出保持為伺服器權威,用戶端可以避免將終端機 I/O 視為正常狀態操作時可能出現的協調陷阱。 :::

命令檢測

Shell 整合終端可以宣布命令邊界:

行動用戶端-可調度reducer 效果
terminal/commandDetectionAvailable沒有supportsCommandDetection: true
terminal/commandExecuted沒有附加 command 部分,設定 supportsCommandDetection: true
terminal/commandFinished沒有將符合的 command 部分標記為完整,並包含退出代碼和持續時間

伺服器不得在 terminal/data 中包含 shell 整合轉義序列 — 它們必須在分派之前被剝離。用戶端在依賴指令邊界之前必須檢查 supportsCommandDetection

控制

行動用戶端-可調度reducer 效果
terminal/resized是的colsrows
terminal/claimed是的claim
terminal/titleChanged是的title
terminal/cwdChanged沒有cwd
terminal/exited沒有exitCode
terminal/cleared是的content 重設為 []

指令

目錄通知

RootState.terminals 上的輕量級終端機目錄透過 根通道 上的伺服器端 root/terminalsChanged 運算保持同步。終端機通道本身不會發出協定通知 - 僅發出操作信封。

以 MIT 授權發布。