npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@qlzt/dsh-api-terminal-controller

v0.2.1-alpha.3

Published

Session-owned interactive terminals with shell discovery, screen recovery and typed Remote control

Readme


description: "用户交互式终端:执行环境默认 shell、有界屏幕恢复和类型化 Remote 控制。" kind: "package-reference"

@deepseek-ai/dsh-api-terminal-controller

English | 中文

概述

从 Web 侧栏在 Session 当前工作目录打开执行环境的默认 shell。重新连接已有进程,并关闭 provider 管理的完整进程范围。终端输出不进入 Agent 对话记录。保留终端会占用进程和有界屏幕缓存。

目录


使用此包

Web bundle 将此包与 subprocess provider、working-directory 服务、sandbox policy 和 Typert Gateway 一起挂载。remote.terminal 提供 environment、shells、list、create、retain、follow、write、resize、rename 和 close;每个操作均按 Session 标识限定范围。列表直接读取 Host 保留的终端,因此查看离线 Session 不会激活 Agent,也不会产生恢复错误。

Shell 探测结果首先列出执行环境声明的默认 shell。仅当 provider 未声明默认值时,才在 POSIX 使用 /bin/sh,在 Windows 使用 cmd.exe。可选的 shell profile 通过可执行路径 path、显示名称 name 和参数 args(默认 [])覆盖这一选择。选择器还会通过执行 provider 探测 shellCandidates,并省略确定未找到的候选。同一可执行文件名(不区分大小写,忽略 .exe)只列出最早的一项,因为 PATH 查找可能经由其他目录找到默认 shell,例如 merged-/usr 系统上 /bin/bash 对应的 /usr/bin/bash。创建请求接受探测返回的 shellPath 并再次验证;解析或传输失败会直接报告,不启动其他 shell。环境查询读取当前目录和限制,不校验文件系统或解析 shell,因此目录或默认 shell 不可用时仍可重新连接已有进程。POSIX 自动 profile 以交互模式启动,PowerShell 使用 -NoLogo,补全和启动配置仍由 shell 提供。新终端启动前通过工作目录服务校验当前目录,并采用该服务的恢复行为。已有终端保留其进程目录。用户终端使用执行环境中系统用户的权限,独立于 Agent 的沙箱模式和审批策略。操作系统和容器的限制仍然生效;DSH 不提升用户权限。Subprocess provider 继续清除环境中的凭据变量。

| 配置 | 默认值 | 含义 | |---|---|---| | shell | 省略 | 使用执行环境默认 shell,或指定一个 profile | | shellCandidates | zsh、bash、fish、pwsh、powershell、cmd | 已安装时供用户选择的额外可执行名称或路径 | | maxTerminals | 8 | 每个 Session 保留的终端和创建请求上限 | | maxCols、maxRows | 500、200 | PTY 最大尺寸 | | scrollback | 1000 | 屏幕历史行数 | | maxBufferedBytes | 2097152 | 单个订阅者的输出排队上限 | | maxInputBytes | 65536 | 单次输入请求的字节上限 | | disposeGraceMs | 1000 | provider 终止宽限期,单位毫秒 | | unattendedTimeoutMs | 7200000 | 无窗口持有且持续确认空闲后开始清理的时长;0 禁用自动回收 | | activityPollIntervalMs | 30000 | 无窗口持有时的活动观察间隔 | | cleanupRetryMs | 60000 | 清理失败后的重试间隔 |

任何已连接窗口中的打开标签页都会持有其终端,包括隐藏标签和非当前 Session。最后一个持有关系消失后,只有明确确认空闲的时间才计入回收期限。运行中、停止、等待输入和后台执行的任务都会受到保护;活动状态未知时清除空闲截止时间。任务完成后重新给予完整宽限期。Host 使用单调时钟,在清理前重新检查持有关系和当前活动;观察间隔超过轮询周期的两倍时丢弃旧证据。时间字段使用毫秒和安全整数,轮询及重试间隔必须为正数。

了解实现

Host 通过 ctx.subprocess.spawnTerminal 创建 TERM=xterm-256color 的终端,不启动桌面终端应用。流式 UTF-8 解码保留跨块字符和开头的 BOM,并在 EOF 将不完整的尾部字节替换为替代字符。控制请求走 Gateway,follow 使用其复用的 Remote stream。Headless xterm 和序列化 addon 在此前输出写入后生成初始屏幕,后续增量携带单调序号。过慢的订阅者明确失败;重新连接恢复当前屏幕。

最新连接持有输入和尺寸控制权。断开连接只释放输入权,不结束进程。显式关闭等待进程清理和最后输出;清理失败时保留资源以便重试。Session 记住已关闭的标识并拒绝迟到或重复的创建请求,包括关闭到达时仍在进行的创建。新终端使用新标识。取消创建且清理失败时,已分配的进程仍有所有者。Session owner 和 controller 卸载也会终止所拥有的进程。改变 Session 的沙箱模式时,用户终端继续以原有权限运行。控制权转移或进程退出后被拒绝的输入和尺寸请求保留输出连接并禁用输入,不重发被拒绝的输入。

Client 在分配前将每条 Session/内容与终端身份的关联保存到独立的 localStorage key dsh.terminal.binding.v1.*。内容身份全局唯一;布局内的 tab id 只标识活动视图 occurrence。逐条记录的写入和删除会保留其他窗口的关联。恢复视图复用该身份;侧栏 terminal provider 先恢复自己的视图,再查询尚无视图的 Host 终端。新视图可以创建进程,恢复视图在目标缺失时显示错误,不创建替代进程。显式关闭先保存清理请求,再删除关联。当前进程元数据和屏幕内容由 Host 提供,不保存在浏览器中。Client 模型在浏览器完成屏幕解析后确认帧,按序发送输入,并忽略旧连接迟到的响应。Client 自产错误携带本地化键。插件卸载等待活跃及先前断开的输出流结束,不关闭 Host 进程。

独立的 retain(sessionId, id, signal) Remote 流确认窗口持有关系,不激活 Agent、发送屏幕输出、转移输入权或创建进程。终端 provider 提供侧栏的完整打开标签清单,Client 将其与自己保存的身份取交集。同一窗口中的重复 occurrence 共用一个持有流;孤立的旧关联不会保活任何终端。恢复输出连接前必须等待当前持有关系确认。传输取消只释放对应的物理流代次;插件卸载等待全部持有流结束。清理失败时保留所有权并重试,不重新接受连接,也不重新计算空闲宽限期。

新视图自动启动,使用开始页明确选中的 shell,或上次选择且仍可用的 shell。上次选择的路径保存在当前站点 localStorage 的 dsh.terminal.shell 中。默认启动通过 Host 探测验证保存的路径,不可用时回到当前默认项。开始页在打开标签页前记录选择,每个新标签页保留自己的 shell 路径和分配身份。存储失败不影响启动。恢复已有终端既不读取这一偏好,也不探测 shell。

关闭时先保存未完成的清理请求并释放标签页,再在后台等待 Host 清理。失败时提供重试通知。每个请求使用独立的终端 ID localStorage key,清理成功或收到明确的 session/not-found 响应后删除;启动时重试已保存的请求。传输失败时保留请求。清理请求独立于标签关联和侧栏布局持久化。浏览器存储不可用时,内存中的清理仍可工作,但刷新后无法恢复该请求。

延伸阅读

模型体验

间接影响由工作目录恢复拥有:创建终端可能更新目录用户上下文,终端输出仍不进入模型历史。

KV 缓存影响

目录恢复追加用户上下文,不替换 system-prompt 前缀;终端输出仍不进入模型请求。

已知限制与延期工作

  • 浏览器刷新保留进程和屏幕;Host 或 Session owner 卸载不保留。不提供持久终端恢复或自动重启 shell。 已退出的终端仍计入 maxTerminals;关闭不用的标签页可释放其屏幕和名额。
  • 原生 PTY 可用性和进程树清理保证由 subprocess provider 决定。找到可执行文件并不保证 PTY 分配成功。
  • 自动回收依赖 provider 支持的 shell 活动观察。不支持的 shell、自定义启动参数和不确定的进程观察可能让资源一直保留到明确关闭或 owner 卸载。运行中的命令没有强制最长执行时间。
  • 屏幕恢复只保留有界历史,不保留完整记录。同一时刻只有一个连接可输入或调整尺寸。

开发备注

无。