Skip to content

Commit 71d9e43

Browse files
committed
refact so many code
1 parent b0b2205 commit 71d9e43

File tree

108 files changed

+5141
-794
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

108 files changed

+5141
-794
lines changed

docs/architecture/runtime-governance.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
Current implementation design, including Mermaid diagrams for the refactored
44
runtime, is documented in `docs/architecture/runtime-refactor-design.md`.
55
Next-step refactor roadmap is documented in `docs/architecture/runtime-refactor-plan.md`.
6+
Execution progress is tracked in `docs/architecture/runtime-refactor-progress.md`.
67

78
## Runtime Topology
89
`cmd/larkrobot` 现在通过 `internal/runtime.App` 统一编排启动和关闭:
@@ -62,6 +63,7 @@ Next-step refactor roadmap is documented in `docs/architecture/runtime-refactor-
6263
| User identity | `OpenID` 优先,缺失时才 fallback |
6364
| Bot identity | `AppID + BotOpenID` |
6465
| Dynamic config | 业务运行时只能走 config manager / accessor |
66+
| Trace boundary | 每个 ingress handler 启动新的根 trace;该入口内 executor / `xhandler` / outbound side effects 继承同一 trace |
6567
| Background work | 默认通过 bounded executor 提交,不再直接裸 `go func` |
6668
| Health state | `ready / degraded / failed / disabled / stopped` |
6769
| Startup failures | critical fail-fast,optional degrade-and-continue |

docs/architecture/runtime-refactor-progress.md

Lines changed: 475 additions & 0 deletions
Large diffs are not rendered by default.

docs/todo_system_design.md

Lines changed: 207 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,10 +51,15 @@
5151

5252
- `create_schedule`
5353
- `list_schedules`
54+
- `query_schedule`
5455
- `delete_schedule`
5556
- `pause_schedule`
5657
- `resume_schedule`
5758

59+
补充说明:
60+
61+
- `list_schedules` / `query_schedule` 现在除了返回文本结果外,也会直接发送 schema v2 卡片,便于人工浏览和后续操作。
62+
5863
数据库表:
5964

6065
- `betago.scheduled_tasks`
@@ -74,6 +79,7 @@
7479
- `script/migrations/004_cleanup_legacy_todo_tables.sql`
7580
- `script/migrations/005_drop_legacy_cron_cmd_tasks.sql`
7681
- `script/migrations/007_add_bot_identity_to_tasks.sql`
82+
- `script/migrations/010_add_source_message_to_scheduled_tasks.sql`
7783

7884
说明:
7985

@@ -82,3 +88,204 @@
8288
- `004` 会清理已废弃的旧表
8389
- `005` 会删除已废弃的 `cron_cmd_tasks`
8490
- `007` 会为 `todo_items``scheduled_tasks` 增加 `app_id` / `bot_open_id`,用于多机器人隔离
91+
- `010` 会为 `scheduled_tasks` 增加 `source_message_id`,用于执行时回链到原始触发消息
92+
93+
## 2026-03-11 · 阶段进展 · Schedule 查询卡片交互补齐
94+
95+
### 方案
96+
97+
- `list_schedules` / `query_schedule` 的 schema v2 卡片携带可回放的 view state,卡片回调不依赖临时内存状态。
98+
- 每个 schedule 条目直接渲染操作按钮:`暂停` / `恢复` / `删除`,减少“先复制 ID 再输命令”的跳转成本。
99+
- 回调执行后按原视图重建卡片:列表视图保留 limit,查询视图保留 `id/name/status/type/tool_name` 过滤条件。
100+
101+
### 修改
102+
103+
- 新增 `internal/application/lark/schedule/card_action.go`
104+
- 定义 schedule 卡片动作 payload / parser
105+
- 定义 `TaskCardViewState`
106+
- 支持按原 view 重建卡片 payload
107+
- 更新 `internal/application/lark/schedule/card_view.go`
108+
- 每个 task 区块追加操作按钮
109+
- 继续复用统一 footer:`撤回` + `Trace`
110+
- 更新发卡入口
111+
- `internal/application/lark/schedule/func_call_tools.go`
112+
- `internal/application/lark/handlers/schedule_handler.go`
113+
- 更新回调注册
114+
- `internal/application/lark/cardaction/builtin.go`
115+
- 注册 `schedule.pause` / `schedule.resume` / `schedule.delete`
116+
117+
### 决策
118+
119+
- 单 ID 查询视图在删除成功后返回空卡片,而不是保留已失效条目。
120+
- 列表 / 过滤查询视图在动作成功后重新拉取当前 chat 下的数据,再按原过滤条件刷新,避免展示陈旧状态。
121+
122+
## 2026-03-11 · 阶段进展 · Schedule 管理命令补齐
123+
124+
### 方案
125+
126+
-`/schedule pause``/schedule resume``/schedule delete` 补齐到 slash command 层,避免只有 tool call 和卡片按钮可用。
127+
- 三条写路径统一加上 chat 作用域校验:只能操作当前群聊下的 schedule,避免跨群误删/误暂停。
128+
- 命令执行后直接回显单任务结果卡片,而不是只回一条文本,保持和 `query_schedule`、卡片回调一致的交互形态。
129+
130+
### 修改
131+
132+
- 更新 `internal/application/lark/handlers/schedule_handler.go`
133+
- 新增 `SchedulePause`
134+
- 新增 `ScheduleResume`
135+
- 新增 `ScheduleDelete`
136+
- 新增单任务结果卡片发送 helper
137+
- 更新 `internal/application/lark/command/command.go`
138+
- 注册 `schedule pause|resume|delete`
139+
- 更新 `internal/application/lark/schedule/card_action.go`
140+
- 新增 `GetTaskForChat(...)`
141+
- 更新 `internal/application/lark/schedule/func_call_tools.go`
142+
- `pause_schedule` / `resume_schedule` / `delete_schedule` 增加 chat 校验
143+
- 更新 `internal/application/lark/cardaction/builtin.go`
144+
- 卡片按钮回调执行前增加 chat 校验
145+
146+
### 决策
147+
148+
- 命令态的 delete 成功后,回显一个“空的单任务查询卡片”,明确告诉操作者该 ID 已不再可见。
149+
- “当前 chat 下不可见”统一按 not found 处理,不向用户泄露其他 chat 的 schedule 是否存在。
150+
151+
## 2026-03-11 · 阶段进展 · Schedule 创建命令补齐
152+
153+
### 方案
154+
155+
-`create_schedule` 的核心能力补到 `/schedule create`,让 slash command 也能直接创建 once / cron schedule。
156+
- 创建成功后直接回显单任务卡片,后续可以立即继续点 `暂停` / `删除`,减少二次查询。
157+
- CLI 侧参数尽量对齐 tool call:支持 `name/type/run_at/cron_expr/timezone/message/tool_name/tool_args/notify_*`
158+
159+
### 修改
160+
161+
- 更新 `internal/application/lark/handlers/schedule_handler.go`
162+
- 新增 `ScheduleCreateArgs`
163+
- 新增 `ScheduleCreate`
164+
- 复用 `schedule.CreateTaskRequest`
165+
- 更新 `internal/application/lark/schedule/func_call_tools.go`
166+
- 导出 `ParseScheduleTime(...)` 供 slash command 复用
167+
- 更新 `internal/application/lark/command/command.go`
168+
- 注册 `schedule create`
169+
- 更新测试
170+
- `internal/application/lark/handlers/schedule_handler_test.go`
171+
- `internal/application/lark/command/help_test.go`
172+
173+
### 决策
174+
175+
- 当前 `/schedule create` 优先走结构化参数,不额外包装自然语言 DSL,避免再造一层弱约束解析。
176+
- 创建成功后回显单任务查询卡片,而不是纯文本确认,保持管理体验一致。
177+
178+
## 2026-03-11 · 阶段进展 · Schedule 统一管理面板入口
179+
180+
### 方案
181+
182+
- 增加 `/schedule manage` 作为显式入口,语义上就是“打开当前群聊的 schedule 管理卡片”。
183+
- `manage` 默认限制在更适合人工浏览的数量级,避免首屏卡片过长。
184+
- 保留 `list` / `query` 作为更细粒度的读路径;`manage` 负责承接日常人工运维入口。
185+
186+
### 修改
187+
188+
- 更新 `internal/application/lark/handlers/schedule_handler.go`
189+
- 新增 `ScheduleManageArgs`
190+
- 新增 `ScheduleManage`
191+
- 更新 `internal/application/lark/command/command.go`
192+
- 注册 `schedule manage`
193+
- 更新测试
194+
- `internal/application/lark/handlers/schedule_handler_test.go`
195+
- `internal/application/lark/command/help_test.go`
196+
197+
### 决策
198+
199+
- `manage` 当前默认最多展示 20 条任务;更大范围的浏览继续走 `list --limit=...`
200+
- 面板本身继续复用已经具备动作按钮的列表卡,不再单独维护第二套“管理卡”布局。
201+
202+
## 2026-03-11 · 阶段进展 · 命令默认重定向收口
203+
204+
### 方案
205+
206+
- 把“无参数时跳到默认子命令”做成 `xcommand` 通用能力,而不是只给 `schedule` 做特判。
207+
- 仅给“存在明显默认落点”的命令组启用默认重定向,避免对多义命令组强行猜测。
208+
209+
### 修改
210+
211+
- 更新 `pkg/xcommand/base.go`
212+
- `Command` 新增默认子命令能力
213+
- 更新 `internal/application/lark/command/command.go`
214+
- `/schedule` 默认跳到 `manage`
215+
- `/config` 默认跳到 `list`
216+
- `/feature` 默认跳到 `list`
217+
- `/ratelimit` 默认跳到 `stats`
218+
- 更新测试
219+
- `pkg/xcommand/typed_test.go`
220+
221+
### 决策
222+
223+
- 当前没有给 `/word``/reply``/image``/stock``/debug` 做默认重定向:
224+
- `word/reply/image` 虽然有读取子命令,但“新增”和“查看”都常见,不够单义。
225+
- `stock``debug` 天然是多分支入口,不适合默认猜测。
226+
227+
## 2026-03-11 · 阶段进展 · Schedule 卡片支持原地刷新
228+
229+
### 方案
230+
231+
- 对 schedule 原生 schema v2 卡片补 `刷新` 按钮,直接复用卡片里的 view state 重建面板,不再依赖重新输入命令。
232+
- refresh 继续走 card action,同一张卡片上保留 `刷新` / `撤回` / `Trace` 三个统一 footer 按钮。
233+
- 单 ID 查询视图刷新时允许目标任务已不存在:这种情况下回显空结果卡,避免 toast 报错打断人工操作。
234+
235+
### 修改
236+
237+
- 更新 `internal/application/lark/schedule/card_action.go`
238+
- 新增 `schedule.view` payload builder / parser
239+
- 抽出共享 view state 解析
240+
- 更新 `internal/application/lark/schedule/card_view.go`
241+
- footer 注入 `刷新` payload
242+
- 更新 `internal/application/lark/cardaction/builtin.go`
243+
- 注册 `schedule.view`
244+
- refresh 时按原 view 重建卡片
245+
- 更新测试
246+
- `internal/application/lark/schedule/card_action_test.go`
247+
- `internal/application/lark/schedule/card_view_test.go`
248+
249+
### 决策
250+
251+
- refresh 不额外引入临时 session / cache key,直接把 view state 编码进 payload,保证回调幂等且可回放。
252+
- 删除后的单任务查询 refresh 返回空卡片,而不是报 not found,和 delete 后的回显策略保持一致。
253+
254+
## 2026-03-11 · 阶段进展 · Schedule 触发结果回到来源消息
255+
256+
### 方案
257+
258+
- 在创建 schedule 时记录来源 `msgID`,而不是只保留 `chat_id`
259+
- 调度执行时复用这条来源消息,优先以 reply 形式回包,让人工侧能直接看出“这是哪条消息触发出来的结果”。
260+
- reply 失败时再回落到 chat 直发,避免来源消息不可用时整条结果丢失。
261+
262+
### 修改
263+
264+
- 新增 `scheduled_tasks.source_message_id`
265+
- `/schedule create``create_schedule` 都会记录当前消息 ID
266+
- schedule 执行器会构造最小消息上下文,把 `message_id` 透传给 schedulable tools
267+
- `send_message`、兼容卡片/文本发送、错误通知都会优先回复来源消息
268+
- schedule 查询/管理卡片增加来源消息展示
269+
270+
### 决策
271+
272+
- 当前只持久化来源消息 ID,不做消息正文快照;来源定位和回复链路先闭环,消息内容追溯后续如有需要再单独设计。
273+
274+
## 2026-03-11 · 阶段进展 · Schedule 结果持久化改为对象引用
275+
276+
### 方案
277+
278+
- 不再把 MinIO presigned URL / 短链直接存进 `last_result`,而是存对象引用。
279+
- 卡片上的“查看结果”链接在每次卡片构建时重新签发 MinIO 临时下载链接,并立即转成 short link。
280+
- 结果对象迁移到独立 bucket `betago-schedule-results`,不再与历史 `cloudmusic` 内容混用。
281+
282+
### 修改
283+
284+
- `last_result` 现在存 `schedule-result://<object_key>` 形式的稳定引用
285+
- 卡片重建时会基于该引用现签 5 分钟 presigned URL,并转成 short link
286+
- schedule 卡片只渲染新引用格式;历史纯文本 / 旧短链结果不再兼容展示
287+
288+
### 决策
289+
290+
- 点击用的下载 URL 只需要短时有效,因此统一收口成 5 分钟;链接过期后通过刷新/重新查询卡片即可拿到新 short link。
291+
- 如果 MinIO 无法自动建新 bucket,需要由运维侧预先建好 `betago-schedule-results` 或授予建桶权限。

go.mod

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ require (
3333
github.com/pelletier/go-toml/v2 v2.2.4
3434
github.com/pkg/errors v0.9.1
3535
github.com/redis/go-redis/v9 v9.18.0
36+
github.com/rivo/uniseg v0.4.7
3637
github.com/satori/go.uuid v1.2.0
3738
github.com/smartystreets/goconvey v1.8.1
3839
github.com/tmc/langchaingo v0.1.14

go.sum

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -376,6 +376,8 @@ github.com/prometheus/procfs v0.19.2 h1:zUMhqEW66Ex7OXIiDkll3tl9a1ZdilUOd/F6ZXw4
376376
github.com/prometheus/procfs v0.19.2/go.mod h1:M0aotyiemPhBCM0z5w87kL22CxfcH05ZpYlu+b4J7mw=
377377
github.com/redis/go-redis/v9 v9.18.0 h1:pMkxYPkEbMPwRdenAzUNyFNrDgHx9U+DrBabWNfSRQs=
378378
github.com/redis/go-redis/v9 v9.18.0/go.mod h1:k3ufPphLU5YXwNTUcCRXGxUoF1fqxnhFQmscfkCoDA0=
379+
github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ=
380+
github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88=
379381
github.com/robfig/cron/v3 v3.0.1 h1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs=
380382
github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro=
381383
github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ=

0 commit comments

Comments
 (0)