chore: auto release commit (2026-09-11 16:25:24)
All checks were successful
技能自动化发布 / release (push) Successful in 6s

This commit is contained in:
2026-09-11 16:25:24 +08:00
parent 6786a19953
commit 18223d5a26
3 changed files with 53 additions and 13 deletions

View File

@@ -258,6 +258,32 @@
"{{id}}" "{{id}}"
] ]
} }
},
{
"id": "todo-remind",
"placements": [
"agent",
"cron"
],
"executionProfile": "async",
"inputSchema": {
"type": "object",
"properties": {
"seconds": {
"type": "number",
"default": 3
}
}
},
"label": "到期提醒",
"description": "在指定时间提醒到期的待办事项。",
"entrypoint": {
"type": "cli",
"command": "todo",
"args": [
"remind"
]
}
} }
] ]
} }

View File

@@ -261,33 +261,31 @@ def cmd_stats() -> int:
# ---------------- async 任务范式(demo) ---------------- # ---------------- async 任务范式(demo) ----------------
async def _run_remind_async(*, seconds: int) -> dict[str, Any]: async def _run_remind_async(*, seconds: int) -> dict[str, Any]:
"""模拟长耗时任务:每秒 emit 一次进度,最后 finish 终态。
真实平台会推送到任务中心 UI 并支持取消;本 demo 在 stdout 打印 JSON Lines。
""" """
steps = max(1, int(seconds)) 真实平台会推送到任务中心 UI 并支持取消;
for i in range(1, steps + 1): """
await interruptible_sleep(1) todos = todo_service.get_current_remind_todos()
emit(f"提醒任务进度 {i}/{steps}", skill=SKILL_SLUG, stage="remind", progress=i, total=steps) for todo in todos:
# 真实业务在这里会查 todos 表挑出 due/pending 项发出提醒;demo 不做真实推送 todo_service.mark_done(todo.id)
emit(f"提醒待办 {todo.title}", skill=SKILL_SLUG, stage="remind")
summary = todo_service.stats() summary = todo_service.stats()
return {"remind": True, "duration_seconds": steps, "stats": summary} return {"remind": True, "duration_seconds": len(todos), "stats": summary}
def cmd_remind(*, seconds: int = 3) -> int: def cmd_remind(*, seconds: int = 3) -> int:
"""演示 async 任务编排。CLI 入口仍走同一内核;Agent 真实调度时 """演示 async 任务编排。CLI 入口仍走同一内核;Agent 真实调度时
通过 ``run_skill_action``(executionProfile: async)触发。""" 通过 ``run_skill_action``(executionProfile: async)触发。"""
log = _get_task_logger() log = _get_task_logger()
task_type = "remind" task_type = "cron"
with job_context(skill=SKILL_SLUG): with job_context(skill=SKILL_SLUG):
log.info("task_start task_type=%s stage=remind seconds=%s", task_type, seconds) log.info("task_start task_type=%s stage=remind", task_type)
emit("开始执行提醒任务", skill=SKILL_SLUG, stage="remind") emit("开始执行提醒任务", skill=SKILL_SLUG, stage="remind")
try: try:
result = asyncio.run(_run_remind_async(seconds=seconds)) result = asyncio.run(_run_remind_async(seconds=seconds))
log.info("task_done task_type=%s status=ok", task_type) log.info("task_done task_type=%s status=ok", task_type)
finish( finish(
status="ok", status="success",
message=f"提醒任务完成,处理 {seconds} 秒", message=f"提醒任务完成",
skill=SKILL_SLUG, skill=SKILL_SLUG,
stage="remind", stage="remind",
**result, **result,

View File

@@ -157,6 +157,22 @@ def delete_todo(todo_id: int) -> bool:
finally: finally:
conn.close() conn.close()
def get_current_remind_todos() -> list[Todo]:
"""获取当前需要提醒的待办。"""
now = _now()
conn = get_conn()
try:
cur = conn.cursor()
cur.execute(
"SELECT id, title, status, priority, due_at, created_at, updated_at "
"FROM todos WHERE due_at <= ? AND status = ?",
(int(now / 60) * 60 + 59, STATUS_PENDING),
)
rows = cur.fetchall()
return [Todo(*row) for row in rows]
finally:
conn.close()
def stats() -> dict: def stats() -> dict:
"""简单统计:用于 ``todo stats`` 命令与 demo 报告。""" """简单统计:用于 ``todo stats`` 命令与 demo 报告。"""