Repository navigation
Conversation
This comment was marked as outdated.
This comment was marked as outdated.
400ms 一次的 status 是几十字节的小请求,回环上一两毫秒就结束并归还连接。浏览器的 6 条是并行上限,只有 6 条同时未完成才排队。小请求占不住池,
20 秒的说法没有对照实验,也没有 status 的在途数与往返耗时。真要证明,得拿出出现超过 6 个未完成请求的记录。
无门时调用 |
开着暂停时按回车想插话,消息会进下一轮而不是作为插话放行:paused 靠轮询 同步,周期内按键会绕过门直接走官方提交。改为 host 经 $events 把 pause/status 推给浏览器,门状态变化当场 emit,状态即时;推送走 WebSocket,不占 HTTP 并发 连接。 通过往 dsh-api-remotes 的 API_REMOTE_FORWARDED_EVENTS 加一条转发规则实现。 该数组在 remoteEventSource(ctx) 里一次性 map 成监听,而它是 registerRemoteEvents 的入参、注册当刻就建流绑监听,故在 apply 里追加太晚;注入放在模块求值阶段, Loader 先 import 完全部插件模块再逐个 apply,必定赶在 api-remotes 之前。 - 拦截:只在 paused 时挂 document capture 拦裸 Enter 改走放行,未暂停不碰 按键,Enter 走官方 keymap,不覆盖用户配置的 busyEnter=steer。 - 回退:推送未建立时轮询按 enabled 分档,关着 5s、开着 400ms。 - 解析:从 argv[1]、execPath、cwd 三处解析,并向上找承载 api-remotes 的宿主包, 兼容 pnpm hoist 与 npm/yarn 的扁平、嵌套三种布局;解析不到静默降级轮询。
84d7f5b to
ea59edb
Compare
|
不好意思,原方案和论据都有问题,第4点已修。 要解决的问题
怎么改推送优先,轮询只做回退,删掉原来 400ms 轮询作为主路径。改为 host 经 效果
使用装完即用,无需启动配置。推送链路建立后状态即时、零轮询;若因模块解析失败未生效,自动降级到轮询(开关关着 5s、开着 400ms),功能完整。 风险
注入时机绑在「Loader 先 import 全部模块、再逐个 apply」这条装配顺序上。若上游改成边 import 边 apply,或把本插件排到 api-remotes 之后才求值,模块顶层的追加就赶不上那次 map——届时需要换手段(如自行注册事件源)。现在的 |
|
抱歉,这个 PR 我不打算合并。让你花了这些时间,尤其在你已经改过一轮之后才说,这点我很抱歉。 第一,方案方向和我这边正在进行的实现冲突,非常不凑巧。我已经把回车拦截改成开关开启期间常驻,每次回车都由主机裁决,没有暂停点但在跑就入队,turn 结束再补发。这个 PR 仍然是「只在暂停点挂着时挂拦截」,推送只是把暂停点挂上到客户端知道之间的窗口压小,并没有消掉。两边的拦截策略是互斥的,合并会把我这边的零盲窗退回去。 第二,注入方式动的是 dsh 内部非契约的 第三,PR 的说明和代码有几处对不上:body 写「enabled 时拦截常驻」,代码还是 |
背景与影响
原实现靠客户端轮询同步暂停状态,有两个实际代价:
(如权限预设切换、长轮询)争抢连接池,实测 commands/execute 排队可达 ~20s。
会绕过暂停门直接提交给 agent。
本 PR 后:推送链路存活时零轮询、状态即时;未注入(preload 缺失/解析失败)
时自动降级,功能完整、行为与不装插件一致,仅状态显示退化。暂停与放行零盲窗。
实现方式
dsh-api-remotes硬编码的allowlist,且装配时即绑定、运行期无法追加。新增 preload(
NODE_OPTIONS --require,零依赖)在进程最早期把pause/status注入该数组,进入官方转发;浏览器端经
ctx.remote.$on订阅。链路确认靠 status RPC 回推(一次性探针会因浏览器晚连接而丢失,不可用)。
放行,无门则重放官方提交。链路失效仅影响 UI 显示(3s 轮询兜底)。
验证
挂载要求
主进程启动注入
NODE_OPTIONS="--require=<dsh-pause>/lib/preload.cjs";未注入时插件功能完整,仅状态显示降级。
风险
API_REMOTE_FORWARDED_EVENTS是 dsh 内部非契约数据结构,上游改动需跟进;若 dsh 后续开放事件转发注册,可替换 preload 注入。