refactor(agent): clarify turn lifecycle event names

This commit is contained in:
_Kerman
2026-07-27 17:38:42 +08:00
parent 7d5cc498d3
commit 52174e32cb
67 changed files with 180 additions and 176 deletions

View File

@@ -1,6 +1,6 @@
# Bilingual-pair consistency record (docs/i18n/README.md): the git blob hash of each
# side as of the last confirmed-consistent state. Both languages carry equal authority;
# after editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write
README.md: 3a08f900b6a2c36c44a3703eb3a13aff1d746d00
README.zh.md: 837c2afb7f3e68e13e46de2745d0cbe8919d254b
# pnpm run verify-translation-pairing --write packages/hooks/hooks-codex/README.md
README.md: fd57762c6fb91e0ea47ec57c30bf9850bc488a33
README.zh.md: 367d6acd0fec486cb0f9fb50023ad2ed4cca7217

View File

@@ -46,7 +46,7 @@ The hooks themselves run in the agent's session workspace: for the agent-scoped
| `UserPromptSubmit` | `agent/prompt-submit` (waterfall) | `block` (exit 2) → `PromptDecision.block`; additionalContext-only → delegate via `next()` then prepend a separately sourced context to downstream `additionalContexts` |
| `PreToolUse` | `tools/pre-execute` (waterfall) | `block``PreToolDecision.deny` (no `allow`/`ask`) |
| `PostToolUse` | `tools/post-execute` (waterfall) | `block``block` with feedback; additionalContext-only → delegate via `next()` then prepend a separately sourced context to the downstream decision; Code Mode defers sub-call contexts until the outer `run_code` result |
| `Stop` | `agent/stopping` (serial) | a blocking Stop hook feeds its reason through `steer()`, forcing another step |
| `Stop` | `agent/turn-stopping` (serial) | a blocking Stop hook feeds its reason through `steer()`, forcing another step |
A tool call's payload carries the real `tool_name` (the same value the matcher tests) and Codex's `tool_input: { command }` shape (the `command` arg when present, else `''`). The matcher subject is the tool name (`PreToolUse`/`PostToolUse`) or the session source (`SessionStart`); `UserPromptSubmit`/`Stop` ignore matchers.

View File

@@ -46,7 +46,7 @@ hook 本身会在 agent 的会话工作区中运行:对 agent scope 点,桥
| `UserPromptSubmit` | `agent/prompt-submit`waterfall | `block`(退出码 2`PromptDecision.block`;仅 additionalContext → 通过 `next()` 委托,再将一个单独标记源的上下文前置到下游 `additionalContexts` |
| `PreToolUse` | `tools/pre-execute`waterfall | `block``PreToolDecision.deny`(没有 `allow``ask` |
| `PostToolUse` | `tools/post-execute`waterfall | `block` → 带反馈的 `block`;仅 additionalContext → 通过 `next()` 委托再将一个单独标记源的上下文前置到下游决策Code Mode 将子调用上下文延迟到外层 `run_code` 结果 |
| `Stop` | `agent/stopping`serial | 阻塞 Stop hook 通过 `steer()` 送入其原因,强制再执行一步 |
| `Stop` | `agent/turn-stopping`serial | 阻塞 Stop hook 通过 `steer()` 送入其原因,强制再执行一步 |
工具调用的 payload 携带真实 `tool_name`matcher 测试的相同值)与 Codex `tool_input: { command }` 形状(存在 `command` arg 时使用该值,否则使用 `''`。matcher subject 是工具名称(`PreToolUse``PostToolUse`)或会话源(`SessionStart``UserPromptSubmit``Stop` 忽略 matcher。

View File

@@ -252,7 +252,7 @@ export function apply(ctx: Context, config: Config): void {
// TODO(stop-loop-guard): Codex supplies `stop_hook_active` so a Stop hook can
// avoid continuing the same turn indefinitely. It is always false here, so an
// unconditionally blocking hook force-continues every step until it self-limits.
ctx.on('agent/stopping', async (agent, turn, signal): Promise<void> => {
ctx.on('agent/turn-stopping', async (agent, turn, signal): Promise<void> => {
const merged = await runPoint('Stop', '', { ...turnBase(ctx, agent, 'Stop', model), stop_hook_active: false, last_assistant_message: null }, { agent, turn, signal })
/* jscpd:ignore-end */
if (merged.decision === 'deny') {