Skip to content

fix: code quality, resource cleanup, and duplicate code extraction#98

Open
Misaka477 wants to merge 1 commit into
stepfun-ai:mainfrom
Misaka477:fix/code-quality-resource-cleanup
Open

fix: code quality, resource cleanup, and duplicate code extraction#98
Misaka477 wants to merge 1 commit into
stepfun-ai:mainfrom
Misaka477:fix/code-quality-resource-cleanup

Conversation

@Misaka477

@Misaka477 Misaka477 commented Jul 4, 2026

Copy link
Copy Markdown

Summary

Five code quality improvements covering deduplication, resource cleanup, and state validation.

Changes

  1. B2: fingerprint LRU — replaces Set.clear() with LRU eviction (deletes oldest entry) when the approved tool fingerprint cache exceeds the cap.

  2. B5: agent-team AbortSignal — rewrites sleep() to accept and handle an optional AbortSignal, consistent with the existing agent-loop.ts implementation.

  3. B12: duplicate code extraction — extracts shared safeParse to parsers.ts, and normalizeToolArguments/stableStringify/sortRecursively to packages/utils/src/json.ts, eliminating identical copies across agent-loop.ts and runtime.ts.

  4. B13: state-machine transition validation — adds a transition matrix (ALLOWED_TRANSITIONS) so AgentStateMachine.transition() rejects invalid state changes with a clear error.

  5. B14: coding-bridge listener cleanup — refactors AbortController listener pattern to ensure cleanup via { once: true } on the abort path and implicit GC cleanup on normal completion.

Verification

@github-actions github-actions Bot added area/core packages/core area/realtime packages/realtime + extensions/realtime-* area/utils packages/utils labels Jul 4, 2026
@ZouR-Ma

ZouR-Ma commented Jul 17, 2026

Copy link
Copy Markdown
Collaborator

这批改动里 B2(指纹缓存从"满了清空"改成逐条驱逐)和 B12(把 normalizeToolArguments/stableStringify 收敛到 @step-cli/utilssafeParse 收敛到 parsers.ts)是实打实的改进,方向和依赖关系都对,我们想要。但有两个必须处理的问题,其中第一个是致命的:

  1. (必须)B13 的转移矩阵和真实执行流矛盾,合入后每次 agent 运行第一步就会抛错。 currentState 初始是 prepare_context,而 agent-loop 的第一个 transition 是 goal_startagent-loop.ts:238)——矩阵里 prepare_context 的允许列表没有它,直接抛 Invalid state transition。同样,before_model_request_hooksagent-loop.ts:807 进入)和 context_compactionagent-loop.ts:883 进入)在矩阵里没有任何入边。1474 个单测发现不了,是因为没有用例把 loop 的真实调用序列接到状态机上。请按 agent-loop 的实际调用序列重建矩阵,并补一条"按真实序列依次 transition 断言不抛"的用例;或者把 B13 拆出本 PR 单独讨论。验收标准:新用例通过、现有测试不回归。
  2. (必须)B5 与它声称对齐的 agent-loop 实现相反。 agent-loop 的 sleepagent-loop.ts:1051)在计时器正常完成时会移除 abort 监听;你加的版本没有——带 signal 的 sleep 正常结束都会在 signal 上留一个死监听,长寿命 signal 反复 sleep 就是 #94 描述的累积模式。另外 agent-team 里目前没有任何调用方传 signal,新参数实际是死代码——请照抄 agent-loop 的清理逻辑,并至少给一个真实调用方接上 signal,否则 #85 并没有被真正修复。
  3. (小)transition()this.currentState = input.state; 出现了两次,请清掉一个。

一个不卡合入但建议处理的点:B14 实际没有改变行为——原代码已经是 { once: true },abort 路径本来就自动清理;真正会留监听的是"任务正常完成、abort 未触发"的路径,改后依然如此。要么在 Promise.race 落定后主动移除监听把它真修掉,要么把这部分从 PR 里去掉,避免 #93 被一个未生效的改动关闭。

流程上说明:测试矩阵没跑是因为首次贡献者的 workflow 需要维护者批准,不是你的问题;上面两处修完、push 上来,我们批准 workflow 让三平台跑绿。另外你这三个 PR(#96/#97/#98)之间有文件重叠(state-machine.ts#97 完全同区域),建议自己定好合入顺序,先进的那个合完其余 rebase。改完 @ 我们。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area/core packages/core area/realtime packages/realtime + extensions/realtime-* area/utils packages/utils

Projects

None yet

2 participants