前言¶
給智能體跑命令,最常見的做法是調一次 exec,把標準輸出拿回來。這條路上有幾個繞不開的問題:程序不會進入交互模式,npm run dev、python 這類需要 TTY 的東西跑不起來;長任務只能等結束,看不到過程;一旦遇到密碼提示,密碼明文進了對話上下文;人和模型也無法同時用同一個 shell。
本文介紹的插件 AyanamiiRei/agent-interactive-terminal 就是把終端做成一個有身份、有屏幕、有相位、有租約的資源。維護者是 AyanamiiRei,版本 0.6.9,MIT 協議,分類爲客戶端,星標還很少(目錄頁記爲 2)。
這是什麼¶
一句話:在 DeepSeek Harness 裏提供有狀態的 PTY 終端會話,模型讀的是一份離散的屏幕快照,而不是一條字節流。
它打包了八個 terminal_* 工具、一塊實時共享的 xterm 面板,以及不經過模型上下文的密碼交接。倉庫自述 73 個測試在 Linux 的 Node 20/22 上通過,設計細節見 docs/design.zh.md。
它不依賴任何智能體框架,TerminalRegistry、terminal_* 工具都可以單獨拿到自己的運行時裏用。
核心功能¶
屏幕快照,而不是字節流¶
模型讀到的是渲染後的文本屏幕,附上相位和狀態行。寫是動作,等是查詢,狀態是事實,三者分開。屏幕只有一份,兩種投影:給模型的是文本,給瀏覽器的是序列化 ANSI。
八個工具¶
| 工具 | 作用 |
|---|---|
terminal_open |
打開會話,返回 id、狀態行和初始屏幕 |
terminal_send |
寫入文本(默認回車提交),並等待結算 |
terminal_wait |
只等待,不寫入 |
terminal_snapshot |
讀取屏幕或輸出尾部,可按版本號取增量 |
terminal_key |
按下具名按鍵,如 ctrl-c、enter、page-down |
terminal_resize |
調整終端尺寸 |
terminal_close |
關閉會話並清理進程樹 |
terminal_list |
列出會話、相位、尺寸和目錄 |
人和 agent 共用同一塊屏幕¶
桌面端會話標題欄出現終端圖標,點開後右側是 xterm 面板,會話標籤按當前順序編號,中鍵關閉。鍵盤歸屬規則是:人敲鍵即接管,停手幾秒自動交回;agent 的寫入在這段時間排隊,上邊欄顯示排隊命令和取消按鈕,交還後按順序執行。
訪問級別分三檔:collaborate(協作)、observe(只讀)、sealed(讀寫都斷開,列表裏只剩脫敏記錄)。只讀和斷開都會拒絕排隊,並返回不同的錯誤。授權在會話創建時給定,由服務端執行,不是前端丟按鍵。
密碼不經過模型¶
遇到密碼提示時,wait 返回 human_required 並掛起 agent,由人通過 session.write(secret, { origin: 'human' }) 回答,密碼不進入模型上下文。倉庫已實現密鑰注入和審計。
另有工具策略開關:默認交互式優先,也可切換爲一次性命令優先或強制交互式(後者會隱藏 agent 的 bash),還有“主動使用交互式終端”開關,讓 REPL 任務先進入 python 等交互環境。
平臺支持¶
優先使用 Unix shell(zsh/bash)。Linux 和 macOS 直接使用本機 zsh/bash,macOS 未設置 $SHELL 時默認 /bin/zsh。Windows 自動尋找 wsl.exe,可用時在 WSL 裏啓動 zsh(沒裝 zsh 就用 bash),並把生成的 rc 翻譯成 WSL 路徑;找不到 WSL 時退回 PowerShell 7、Windows PowerShell 或 cmd.exe。手動選 zsh/bash 但沒有 WSL 會明確報錯。原生 PowerShell/cmd 沒有提示符標記,等待會退回屏幕內容和輸出靜默判斷,精度不如 WSL。
主題、字體、光標、快捷鍵、回滾、響鈴、複製粘貼、租約超時都在終端設置裏,主題默認跟隨 DSH,也可固定成某一套調色板。
安裝與啓用¶
需要 Node.js 20+ 和用於編譯 node-pty 的 C++ 工具鏈。
在 DSH 的 Plugins → Discover 裏添加市場索引:
https://raw.githubusercontent.com/AyanamiiRei/agent-interactive-terminal/main/plugin-market.json
搜索 agent-interactive-terminal 安裝,或在 Add plugin 裏直接填 Git 規格。首次安裝要批准 node-pty 的構建腳本;升級到新版本後重啓一次 DSH。
也可以手動構建:
git clone https://github.com/AyanamiiRei/agent-interactive-terminal.git
cd agent-interactive-terminal
npm install
npm run build
典型用法¶
倉庫自帶三個入口,適合先驗證行爲再接進 DSH。
npm run demo -- "git status" # 一條命令,看模型拿到的屏幕和狀態行
npm run demo # 交互循環:/snap、/wait、/key、/resize、/quit
npm run attach # 瀏覽器 attach 示例,打開終端裏打印的地址
在代碼裏直接用 TerminalRegistry:
import { TerminalRegistry } from 'agent-interactive-terminal'
const sessions = new TerminalRegistry({ maxSessions: 2 })
const session = await sessions.open({ name: 'build', cols: 100, rows: 30 })
await session.write('npm run dev')
const result = await session.wait({ match: ['ready in'], timeoutMs: 60_000 })
console.log(result.outcome, result.view.text)
session.takeOver()
await session.write('y', { origin: 'human' })
session.handBack()
await session.close()
也可以把 createTerminalTools(registry) 交給自己的模型運行時,不一定要跑在 DSH 裏。
適用場景與注意¶
適合這幾類需求:需要讓 agent 驅動交互式程序(REPL、腳手架、交互式安裝器);任務時長不確定、需要看過程而不是等結果;需要人和 agent 輪流操作同一個 shell;需要把密碼這類敏感輸入留在模型上下文之外。
幾點要注意:
- 插件以當前 DSH 進程的權限運行,能讀到什麼、能執行什麼就等於 DSH 的權限範圍,安裝前應通讀倉庫源碼和許可證(MIT)。
- 首次安裝要批准
node-pty構建腳本,屬於原生模塊編譯,屬於正常動作,但要自己確認過。 npm run attach的瀏覽器示例只綁定127.0.0.1、沒有鑑權,僅供本地演示,不要暴露到網絡上。- 倉庫自述尚未實現:審計之外的打碼區間、空閒會話回收、fish 集成,細節見
ROADMAP.md。
結尾¶
這套做法的價值在於把終端從“執行一條命令”升級成“會話級資源”:屏幕可讀、按鍵可控、等待有條件、密碼可隔離、人和 agent 能共享。倉庫規模還小(目錄頁記爲 2 顆星、版本 0.6.9),但覆蓋的路徑是完整的,先跑 npm run demo 就能確認是否符合你的流程。
- 目錄頁:https://www.skillhub.cn/plugins/AyanamiiRei/agent-interactive-terminal
- GitHub:https://github.com/AyanamiiRei/agent-interactive-terminal