Replies: 1 comment 2 replies
|
在 master(c291e7961)逐条核实了你帖子的源码定位,全部成立:
现状盘点:无排空路径、5s 宽限硬编码、无 restart。你的三个期望方向(opt-in drain 钩子 / 可配宽限 / restart 命令)都要维护者定语义,但原语现成:cancel+whenIdle 已是 drain 可挂的位置( |
2 replies
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
背景
DSH 是常驻进程(
dsh web),同一进程内可能同时挂着多个会话。要让配置/插件改动生效(改settings.yaml、装插件等),目前只能重启进程;而重启会打断同进程内所有会话在途的 turn。用户侧表现:
turn/end {interrupted})ToolOutcomeUnknownError / TOOL_OUTCOME_UNKNOWN墓碑本身没问题 ——
interruptedTurnClosers()的善后是对的。问题是在途工作没有任何被救回的机会。隔离复现
用独立
DSH_HOME的 headless 实例(不碰任何现有实例、不开端口):DSH_HOME=/tmp/dsh-repro-home dsh --profile headless \ "必须用 bash 工具执行:sleep 40; echo done > marker.txt"等
tool/call落盘后(约 6s)发SIGTERM:SIGTERM→ 进程退出marker.txt未生成tool/calltool/resultTOOL_OUTCOME_UNKNOWN/turn/end interrupted源码定位
apps/cli/src/process-shutdown.tsPROCESS_SHUTDOWN_TIMEOUT_MS = 5_000—— dispose 的上限interrupt(code)→start(code, /* forceAfterDispose */ true)—— dispose 完成后立即process.exitinterrupt;shutdown()只被 cmdline 使用packages/core/agent-loop/src/index.ts—— dispose 时:所以 0.16 秒退出不是因为宽限被绕过,而是因为 dispose 主动取消在途工作,随后立即退出。 5 秒是 dispose 的天花板,这个场景根本用不到它。
我认为这是设计选择,不是 bug
apps/cli/tests/process-shutdown.spec.ts里有明确断言:第一个信号触发 dispose(drain),第二个信号才强制退出。这套语义是被测试固定下来的。所以这里提的不是"写错了",而是缺一个能力。
期望(都希望是 opt-in,不改现有默认行为)
cancel;dsh restart之类的显式优雅重启入口 —— 用户想让新配置生效时,不必 resort tokill -TERM。补充
interruptedTurnClosers()善后机制很好,本 proposal 只是希望在它之前多一层机会。All reactions