feat: thread poke / step ask — post-step interaction with agent sessions #142

Open
opened 2026-06-07 03:32:15 +00:00 by xiaoju · 1 comment
Owner

动机

协调者(人或 orchestrator agent)需要在 step 完成后与 agent session 交互,当前只能等 moderator 路由回来重跑,没有轻量级的干预手段。

两个新命令

thread poke — 追加指令,更新当前 step output

uwf thread poke <thread-id> -p "reviewer 漏检了 X,请补充"

语义: resume head step 的 agent session,发补充 prompt,输出覆盖当前 step。

  • 只能 poke 最新 step(head)
  • 用现有 continue(sessionId, message, store) 接口
  • poke 后 step 的 completedAtMs 更新
  • Moderator 不重新跑 — poke 不改变 thread 路由状态
  • --agent 可选,默认从 step detail 读上次用的 agent

step ask — 向任意历史 step 的 agent 提问,不影响 thread 状态

# 先找到要问的 step
uwf step list <thread-id>

# 对特定 step 提问
uwf step ask 3DDEFH0N2WMAD -p "为什么选 tar 不选 zip?"
uwf step ask 96P8A5SMF3A3B -p "动态 import 问题具体在哪行?"

# 追问同一个 step — 复用 fork
uwf step ask 3DDEFH0N2WMAD -p "那 gzip 压缩考虑过吗?"

语义: fork step 对应的 agent session,在 fork 上提问,回答输出到 stdout,不写 CAS step,不影响 thread 状态。

命令归属: ask 放在 step 子命令下(而非 thread),因为操作对象是具体的 step,与 step list/step show/step read/step fork 同级。工作流:step list 找到目标 step → step ask 提问。

设计要点:

  • step detail(CAS)里直接存了 sessionId,不需要走 session cache 查
  • Fork session 持久化 — 每个 step 的 ask fork 唯一,支持多轮追问:
    • 第一次 ask → fork 原始 session,持久化
    • 后续 ask → 复用已有 fork,追问有上下文
    • 不同 step 的 fork 互相独立
  • 同一个 role 跑了多次(developer 被 reject 后重跑),每次是不同的 step、不同的 session,用 step hash 无歧义

Fork cache 结构

# exec 原始 session(现有,不变)
threadId:role          → 原始 session

# ask fork(新增,按 step 粒度)
stepHash:ask           → fork session

Adapter 接口扩展

type AgentOptions = {
  name: string;
  run: AgentRunFn;
  continue: AgentContinueFn;
  // Phase 2 新增
  fork?: (sessionId: string) => Promise<string>;   // 返回 fork sessionId
  cleanup?: (sessionId: string) => Promise<void>;  // 清理(可选)
};
  • Claude Code: fork = 复制 session 文件
  • Hermes: fork = 复制 DB 对话记录到新 sessionId
  • 没有实现 fork 的 agent → fallback:新开 session + 注入 step detail 作为上下文

分期

  • Phase 1: thread poke — 用现有 continue 接口,改动小
  • Phase 2: step ask + fork — adapter 新增 fork 接口,fork cache 按 stepHash:ask 存储

小橘 🍊(NEKO Team)

## 动机 协调者(人或 orchestrator agent)需要在 step 完成后与 agent session 交互,当前只能等 moderator 路由回来重跑,没有轻量级的干预手段。 ## 两个新命令 ### `thread poke` — 追加指令,更新当前 step output ```bash uwf thread poke <thread-id> -p "reviewer 漏检了 X,请补充" ``` **语义:** resume head step 的 agent session,发补充 prompt,输出覆盖当前 step。 - 只能 poke 最新 step(head) - 用现有 `continue(sessionId, message, store)` 接口 - poke 后 step 的 `completedAtMs` 更新 - Moderator 不重新跑 — poke 不改变 thread 路由状态 - `--agent` 可选,默认从 step detail 读上次用的 agent ### `step ask` — 向任意历史 step 的 agent 提问,不影响 thread 状态 ```bash # 先找到要问的 step uwf step list <thread-id> # 对特定 step 提问 uwf step ask 3DDEFH0N2WMAD -p "为什么选 tar 不选 zip?" uwf step ask 96P8A5SMF3A3B -p "动态 import 问题具体在哪行?" # 追问同一个 step — 复用 fork uwf step ask 3DDEFH0N2WMAD -p "那 gzip 压缩考虑过吗?" ``` **语义:** fork step 对应的 agent session,在 fork 上提问,回答输出到 stdout,不写 CAS step,不影响 thread 状态。 **命令归属:** `ask` 放在 `step` 子命令下(而非 `thread`),因为操作对象是具体的 step,与 `step list`/`step show`/`step read`/`step fork` 同级。工作流:`step list` 找到目标 step → `step ask` 提问。 **设计要点:** - step detail(CAS)里直接存了 sessionId,不需要走 session cache 查 - **Fork session 持久化** — 每个 step 的 ask fork 唯一,支持多轮追问: - 第一次 ask → fork 原始 session,持久化 - 后续 ask → 复用已有 fork,追问有上下文 - 不同 step 的 fork 互相独立 - 同一个 role 跑了多次(developer 被 reject 后重跑),每次是不同的 step、不同的 session,用 step hash 无歧义 ## Fork cache 结构 ``` # exec 原始 session(现有,不变) threadId:role → 原始 session # ask fork(新增,按 step 粒度) stepHash:ask → fork session ``` ## Adapter 接口扩展 ```typescript type AgentOptions = { name: string; run: AgentRunFn; continue: AgentContinueFn; // Phase 2 新增 fork?: (sessionId: string) => Promise<string>; // 返回 fork sessionId cleanup?: (sessionId: string) => Promise<void>; // 清理(可选) }; ``` - Claude Code: fork = 复制 session 文件 - Hermes: fork = 复制 DB 对话记录到新 sessionId - 没有实现 fork 的 agent → fallback:新开 session + 注入 step detail 作为上下文 ## 分期 - **Phase 1: `thread poke`** — 用现有 `continue` 接口,改动小 - **Phase 2: `step ask` + fork** — adapter 新增 `fork` 接口,fork cache 按 `stepHash:ask` 存储 小橘 🍊(NEKO Team)
xiaoju changed title from feat: thread poke / thread ask — post-step interaction with agent sessions to feat: thread poke / step ask — post-step interaction with agent sessions 2026-06-07 03:36:26 +00:00
Author
Owner

拆分为子 issue

#142 整体太大,Claude Code 两轮都超时(121 turns / 73 turns),拆成 3 个独立 issue 按序推进:

Phase Issue 依赖
Phase 1 #144 thread poke
Phase 2a #145 AgentOptions fork 接口 #144
Phase 2b #146 step ask #145

每个 issue 独立走 solve-issue workflow,scope 足够小,Claude Code 单次能完成。

本 issue 作为 umbrella,三个子 issue 全部完成后关闭。

— 小橘 🍊(NEKO Team)

## 拆分为子 issue #142 整体太大,Claude Code 两轮都超时(121 turns / 73 turns),拆成 3 个独立 issue 按序推进: | Phase | Issue | 依赖 | |-------|-------|------| | Phase 1 | #144 `thread poke` | 无 | | Phase 2a | #145 `AgentOptions` fork 接口 | #144 | | Phase 2b | #146 `step ask` | #145 | 每个 issue 独立走 solve-issue workflow,scope 足够小,Claude Code 单次能完成。 本 issue 作为 umbrella,三个子 issue 全部完成后关闭。 — 小橘 🍊(NEKO Team)
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: shazhou/united-workforce#142