进程结构

外壳与引擎两层进程、它们之间的 JSON-RPC,以及一个引擎进程承载全部会话。

「核心概念」这一组讲 Klaus 内部怎么运转。日常使用不需要了解,理解限制和排查问题时有用。

Klaus 分成两层。外壳负责窗口、界面、系统集成和一切跟 macOS 打交道的事;引擎是一个独立子进程,负责与模型对话、调用工具、维护会话。两者通过标准输入输出上的 JSON-RPC 通信。

整个应用只启动一个引擎进程,所有会话、定时任务、频道消息共用它。引擎启动后有 20 秒完成握手,超时会被回收并在界面报错,下次操作时重新拉起。一个会话对应引擎里的一条线程,会话 id 会出现在磁盘上那份会话记录的文件名里(见数据都存在哪)。

一个进程承载全部会话,所以「引擎掉了怎么办」是必须回答的问题,有三层:

  • 断连恢复:连接断掉时正在跑的调用不会被永久挂着——待处理的请求会失败并报错,事件通道关闭时事件泵自己退出,客户端队列里没送出去的会重新投递。重新连上的是一个新的一代(generation),旧那一代迟到的事件会被按代号丢掉,不会串进新的对话里。界面上表现为侧栏那个红点:重连中,连上就消。
  • 重启后自动续跑:Klaus 自己记一份台账,写下「哪些会话在上次退出时还有没跑完的一轮」(更新重启、崩溃、你自己退出都算)。下次启动 5 秒后它读这份台账,逐条打开那些会话并接着跑没完成的那一轮,正在等的后台进程和子智能体由这一轮自己按正常工具流程重建。所以更新完重启不用你手动一条条点继续。频道消息起的会话不在这个范围里——没人在等它,重跑一遍等于重发一条消息。
  • 单条会话出问题不外溢:一条会话出错或卡住只影响它自己,其余会话照常。