Replies: 2 comments
|
分析到位,jobs 只在生命周期事件推送、subagent 列表是拉取式,远端/移动端用户的进度感知就断了。官方补中推之前,OS 层可以兜一半:任务完成/待处理确认走系统弹窗 + 提示音 + 托盘角标,人不在页面、甚至页面冻结时也能被叫回来——我们 dsh-windows-notify 就是干这个的,也欢迎一起给「job progress 事件公开化」提诉求:https://github.com/Sutera-Diffusus/dsh-windows-notify |
|
你这份源码定位(jobs 只在四个生命周期点调 一、这是"没有 host → client 推送通道"的一个具体案例#1289 提的是一条通用的 你这两条正是它的两个实例:jobs 有推送但只在生命周期点(运行中零帧),subagent 列表干脆没有推送帧。 我可以给一份第一手佐证:我维护 pi2dsh(Pi 生态兼容层),它在 DSH Web 里有自己的一半。因为拿不到推送,我们的代码里写着这个: // 产品层的 MCP 管理页
const timer = window.setInterval(() => { void pull() }, 4000)
// 侧边会话面板(要跟一个正在跑的子会话)
const timer = window.setInterval(() => { void pull() }, 2000)第二个 2000ms 就是你说的那件事——要看一个正在跑的子会话的进展,除了每 2 秒问一次没有别的办法。这两个数字没有任何依据,纯粹是"再快太费、再慢太钝"猜出来的。而且我们源码里还有一行注释:"The panel polls; a cached answer would freeze the thread mid-turn"——拿不到"变了"这个信号,连缓存都不敢做。 建议两边互相引一下:你有源码级的症状证明,#1289 有通用解法,合起来比各自单独强。 二、一个措辞建议:别要"周期性快照",要"变化事件"你的期望里有这么一条:
这两个是很不一样的东西,我建议把重点放在后者:
这么提的好处是它不需要新机制、不需要新帧类型、不需要定周期——只是让一个已经存在的通知机制覆盖它本来就该覆盖的状态变化。评审面前,"补一个漏掉的调用点"比"加一条周期性推送"好过太多。 (subagent 那半确实需要新东西——那边连帧都没有。所以你这帖其实是两个不同大小的诉求,值得在正文里明确区分:一个是补调用点,一个是新增推送面。) 三、@Sutera-Diffusus 那条兜底方向对,但注意它兜的是另一半系统通知能在"人不在页面"时把人叫回来,这确实有用,而且和推送不冲突。但要说清楚它兜不到你这帖的核心场景:你描述的是「人正盯着页面,任务在跑,界面冻在创建时的状态」——用户在场。这种情况下 OS 通知不响(因为还没 settle),响了也没用(他已经在看了)。 两者是互补的:通知解决"我不在的时候别错过",推送解决"我在看的时候能看到"。 建议在原帖里点一下这个区分,免得讨论滑向"装个通知插件就行了"。 边界与利益相关我们不修 DSH 自家组件—— 利益相关:我维护 pi2dsh,是这条推送通道的直接受益者——它落地的当天,上面那两个 |
Uh oh!
There was an error while loading. Please reload this page.
Environment
Bug
The task list (session header background jobs + sidebar subagent list) freezes at the state it had when the first task was created while tasks are running. It only catches up after a task settles or after a page refresh. No real-time progress / status changes are visible during execution.
Root cause (from source)
1.
session/jobsframes are only pushed on lifecycle events — never mid-run.In
packages/jobs/jobs-local/src/index.ts,notifyChanged(job.owner)is called only at:kill()(line 226)settle()— completion/failure (line 428)job.detailis only assigned insettle()(line 419); duringrunningit staysundefined. There is no progress event and no periodic snapshot. The frontendJobListAction.tsxonly refreshes fromsession/jobsframes (plus a local 1s clock for elapsed time), so the UI stays frozen at the creation-time state for the whole run.2. Sidebar subagent list is pull-only.
In
packages/client/runtime/src/client/sessions/manager.ts,refreshSubagents()is invoked only on session selection / subagent selection (lines 200, 218). There is no push frame for subagent status in api-proxy, so the list does not refresh while work is in progress.Expected
session/jobssnapshots during long-running jobs, or adetail/progress update event from the jobs seam.Impact
For long-running tasks (multi-minute bash / agent work), remote users (mobile) cannot see any progress; the UI appears stuck until the task settles or the page is reloaded.
All reactions