跳转到内容

模块 II——实时运行与会话

模块 II 是 estate 的实时运行视图:每个 agent 会话此刻在做什么、它的实时 token 和成本 总量、一个派生的 Claude Code 状态,以及一条可重建的时间线。模块 I(清点)物化的是持久的 estate,而模块 II 则在同一条观测流之上为每个会话维护一个实时运行叠加层——并且只展示 该流如实承载的内容。

Olivares 0.4 还会在 提供商配置文件 下把官方提供商 CLI 作为自有子进程启动。该受管路径是同一模块。它不替代叠加层,也不合并两个 宣布同一提供商会话 id 的主目录(CHANGELOG.md [26.9.0] B1/B2)。

模块 II 是一个由总线驱动的 Core 层模块,与清点同级。它维护一份按每个会话的外部引用作键的 实时记录,由协作式的观测流构建——从不轮询、从不编造。每个会话它跟踪:

  • 当前动作(最后使用的工具)以及它所触及的资源/模式;
  • 实时 token 与成本总量,读自成本采样(规范的成本账本和 FinOps 是模块 XI,不在此处—— 这里只是实时数字);
  • 一个派生的 Claude Code 状态(cc_state);以及
  • 一条时间线,每个被观测到的事件按摄取顺序追加于其上。

本模块注册了两个按租户限定的实体。sessions.live 持有每个会话的实时记录——当前 动作/资源/模式、模型引用、实时输入/输出 token、实时成本、事件与工具调用计数,以及首次/最后 事件时间戳。sessions.timeline 为每个事件持有一行可回放记录,按摄取排序。没有存储的生命周期 列:协作式流不携带任何结束或失败信号,因此唯一如实的存活性信号是派生的 cc_state。

cc_state 在读取时从事件新近度派生——active / idle / ended——并在连接器触发该 发现项时翻转为静默规避(silent-evasion)状态(它从不由模块自身写入)。读取在模块路由下提供 (实时列表、单个会话、按会话的时间线)外加一条实时 SSE 流;每次读取都需要会话读取权限,且 打开该流会被自动审计。SSE 通道是严格按租户隔离的(一个客户端只接收其授权租户的快照), 且是尽力而为的(慢速客户端会丢弃中间帧并获取下一帧——摄取从不阻塞)。

提供商配置文件是某一执行环境上一个已配置提供商实例的持久身份:驱动程序、 环境和规范的 config_home / user_home。它不是已认证的提供商账户。注册、 重命名、停用/启用和退役位于 /v1/m/sessions/provider-profiles。路径只出现在 管理员 configuration 读取上。启动会命名 provider_profile_ref;服务器解析 homes,并在 spawn 前把非秘密快照持久化到该 run(CHANGELOG.md [26.9.0] B1; web/src/features/agentops/types.ts)。

观测折叠进其 channel 的实时行,由服务器从主机盖章的源登记计算 (CHANGELOG.md [26.9.0] B2):

Channel Meaning
legacy no registration
observed a source dedicated to a profile by a binding approved at host admission for the exact applied revision
source a known registration with no verifiable profile
managed a run the plane launched; the only row carrying canonical_sid and run_ref

每一实时行公开 live_ref 和 attribution。两个宣告同一提供商会话 id 的 home 是两行、两条时间线。用 GET /v1/m/sessions/live/by-id/{live_ref} (及其 timeline / stream / runs 查询)读取一行。裸外部 id 路由仍在,且是 legacy:只回答 legacy 行。

驱动程序在每个节点启动时注册。启动会话时,引擎先使用最新的已验证托管安装, 再查找自身 PATH 中的 CLI。OLIVARES_SESSION_RUNTIME_CLAUDE_BIN、_CODEX_BIN、 _GROK_BIN 和 _OPENCODE_BIN 显式覆盖此查找过程(见 配置)。 找不到可执行文件时,引擎会拒绝启动。配置文件认证、启动策略等其他就绪检查仍然适用。 操作步骤:运行提供商会话。

受管运行的生命周期与重启边界

Section titled “受管运行的生命周期与重启边界”

Sessions 是内核模块:即使它不在已保存的模块选择中,也会继续运行。关闭可选模块不会重置会话数据。

/v1/m/sessions/runs 下的受管运行 API 与 olivares session 使用同一个运行时。读取运行需要 sessions:run:read;启动、输入、停止和 resume 需要 sessions:run:write。viewer 可以读取运行, 而不被允许停止它。租户和工作区权限仍适用于每个运行。

终端窗口
olivares session ls -o json
olivares session show <session> -o json
olivares session send <session> "continue the task"
olivares session stop <session>
olivares session resume <session>

一条消息可以携带图片。olivares session send <session> --attach shot.png "what is wrong here?" 以及控制台编辑器(粘贴、拖放或回形针)会把每个 PNG、JPEG、WebP 或 GIF 与会话一起存储, 每条消息最多四张,每张最大 3.75 MB,然后与文本一起发送;消息必须有文本,所以只有图片不会被发送 (CLI 和编辑器会要求补充文本)。Claude Code 接收图片内容块,Codex 接收它自己的图片输入; 没有图片输入的工具会在任何内容发出之前按名称拒绝该消息。API 是 POST /v1/m/sessions/runs/{ref}/attachments(图片,base64)、GET .../attachments/{id}, 以及 .../input 上的 attachments。图片位于数据目录下,按租户和会话存放,并随会话一起移除。

已停止的运行、其提供商配置文件和工作区引用以及生命周期事件在引擎重启后仍然存在。 Resume 会为现有运行启动一个新的自有子进程。实时 attach 输出是内存中的有界环;保留的运行元数据和 生命周期事件不承诺持久化的对话记录。录制策略与工具自身的 resume 支持仍是独立的要求。

它消费什么(以及它派生什么)

Section titled “它消费什么(以及它派生什么)”

模块 II 消费与清点相同的最小数据观测流——edge.observed、 cost.sampled 和 finding.reported。只有发起方为会话的边才产生实时运行;与某会话关联的 成本采样会累加到实时 token/成本数字(此处不写入任何 CostRecord);以会话为主体的发现项会被 标注,而一个反规避发现项会标记规避状态。有两个字段是从这些相同信号中实时派生的:agent_ref 派生自某会话的归属 agent,而 summary 派生自一个上下文压实(取证性)发现项,其标题按契约是 摘要安全的——从不是 LLM 编造的摘要。