register_callback/cancel_callback 落地:到点提醒工具 + 待定提醒渲染 #65

Merged
Yushu merged 2 commits from feature/63-register-callback into main 2026-07-25 01:55:27 +00:00
Member

Closes #63

What

新增两个 core 原生工具 register_callback(content, fire_at) / cancel_callback(callback_id),让用户可以直接说"半小时后提醒我关火"设一个到点提醒。复用 issue #52/#53-#56 已建好的 Callback 通用送回抽象,新增第二个触发源 trigger_source="user_reminder",验证这条管线确实不需要为新生产者改动既有代码。

实现要点

  • register_callback.py(新):parse_fire_at 纯函数解析/校验 fire_at(ISO8601、不带时区、必须晚于当前时间,均 fail-closed 拒绝);render_pending_reminders 纯函数把待定提醒渲染成声明性文本。
  • register_callback/cancel_callback 恒可见(不受渐进解锁门控),加入 RUN_LIMIT_EXEMPT_TOOL_NAMES
  • 新增静态 config 项 arise_max_pending_user_reminders(默认 10)限制单 chat 同时存在的 user_reminder 待定记录数,超限拒绝而不静默丢弃/覆盖最旧的一条。
  • 待定提醒渲染进冻结快照第七段(_full_frozen_snapshot),供模型跨轮次引用 callback_id 取消;task_completion 来源不参与这段渲染。
  • CallbackRecord/CallbackStoragePort/is_due/render_callback_directive/_callback_scan/_deliver_callback/RuntimeLoop.run_callback() 零改动——callback.py 完全不在本次 diff 里,e2e 测试直接验证这些既有模块无改动即可正确送回 user_reminder 记录。
  • cancel_callback 按 id 来源双重匹配,fail-closed 无操作,不会误伤 task_completion 来源正在待送回的记录。

Review

/code-review 两轴(Standards + Spec)已跑:

  • Standards:list_callbacks + 按 trigger_source 过滤的形状在四处重复,已收敛进 _list_callbacks_by_source 私有辅助;_full_frozen_snapshot 文档字符串补上新增的第七段。
  • Spec:补了一条 cancel_callback 跨 chat 隔离的直接测试(此前只被限额测试间接覆盖)。

Tests

29 个新测试(10 纯函数 + 14 RuntimeLoop 分发 + 5 e2e),全仓库 923 个测试全绿。

Closes #63 ## What 新增两个 core 原生工具 `register_callback(content, fire_at)` / `cancel_callback(callback_id)`,让用户可以直接说"半小时后提醒我关火"设一个到点提醒。复用 issue #52/#53-#56 已建好的 Callback 通用送回抽象,新增第二个触发源 `trigger_source="user_reminder"`,验证这条管线确实不需要为新生产者改动既有代码。 ## 实现要点 - `register_callback.py`(新):`parse_fire_at` 纯函数解析/校验 `fire_at`(ISO8601、不带时区、必须晚于当前时间,均 fail-closed 拒绝);`render_pending_reminders` 纯函数把待定提醒渲染成声明性文本。 - `register_callback`/`cancel_callback` 恒可见(不受渐进解锁门控),加入 `RUN_LIMIT_EXEMPT_TOOL_NAMES`。 - 新增静态 config 项 `arise_max_pending_user_reminders`(默认 10)限制单 chat 同时存在的 `user_reminder` 待定记录数,超限拒绝而不静默丢弃/覆盖最旧的一条。 - 待定提醒渲染进冻结快照第七段(`_full_frozen_snapshot`),供模型跨轮次引用 `callback_id` 取消;`task_completion` 来源不参与这段渲染。 - `CallbackRecord`/`CallbackStoragePort`/`is_due`/`render_callback_directive`/`_callback_scan`/`_deliver_callback`/`RuntimeLoop.run_callback()` 零改动——`callback.py` 完全不在本次 diff 里,e2e 测试直接验证这些既有模块无改动即可正确送回 `user_reminder` 记录。 - `cancel_callback` 按 id **和**来源双重匹配,fail-closed 无操作,不会误伤 `task_completion` 来源正在待送回的记录。 ## Review `/code-review` 两轴(Standards + Spec)已跑: - Standards:`list_callbacks` + 按 `trigger_source` 过滤的形状在四处重复,已收敛进 `_list_callbacks_by_source` 私有辅助;`_full_frozen_snapshot` 文档字符串补上新增的第七段。 - Spec:补了一条 `cancel_callback` 跨 chat 隔离的直接测试(此前只被限额测试间接覆盖)。 ## Tests 29 个新测试(10 纯函数 + 14 RuntimeLoop 分发 + 5 e2e),全仓库 923 个测试全绿。
Callback 抽象(issue #53)此前只有 task_completion 一种来源,本次新增
第二个真实生产者验证其确实与生产者无关:register_callback 登记提醒、
cancel_callback 按 id+来源精确撤销,per-chat 上限防止无界堆积,待定
提醒渲染进后续轮次的系统提示供模型跟进。
Standards review:list_callbacks+按 trigger_source 过滤这一形状在
runtime_loop.py 里出现四次,收敛进 _list_callbacks_by_source 私有辅助;
_full_frozen_snapshot 文档字符串补上新增的待定提醒第七段,此前仍写
"六段"。Spec review:cancel_callback 的跨 chat 隔离此前只被限额测试
间接覆盖,补一条直接断言的测试。
Yushu merged commit de7db87c0f into main 2026-07-25 01:55:27 +00:00
Yushu deleted branch feature/63-register-callback 2026-07-25 01:55:28 +00:00
Sign in to join this conversation.
No description provided.