Compare commits
5 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 6f076969ce | |||
| 37d4ebfc1c | |||
| 18223d5a26 | |||
| 6786a19953 | |||
| d10db1d667 |
@@ -258,6 +258,33 @@
|
||||
"{{id}}"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "todo-remind",
|
||||
"placements": [
|
||||
"agent",
|
||||
"cron"
|
||||
],
|
||||
"executionProfile": "async",
|
||||
"inputSchema": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"seconds": {
|
||||
"type": "number",
|
||||
"default": 3
|
||||
}
|
||||
}
|
||||
},
|
||||
"label": "到期提醒",
|
||||
"description": "在指定时间提醒到期的待办事项。",
|
||||
"entrypoint": {
|
||||
"type": "cli",
|
||||
"command": "remind",
|
||||
"args": [
|
||||
"--seconds",
|
||||
"{{seconds}}"
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -13,12 +13,11 @@
|
||||
|
||||
## 0.1 宿主入口定位
|
||||
|
||||
| 主能力(Action id / CLI) | 对话 | 数据管理 | 定时 | 不挂理由(若不挂) |
|
||||
|---------------------------|------|----------|------|--------------------|
|
||||
| `todo add` | 挂 | toolbar(新增按钮) | 不挂 | 定时无意义 |
|
||||
| `todo list` | 挂 | row | 不挂 | 定时无意义 |
|
||||
| `todo done`(Action `todo-done-row`) | 挂(短 CLI 直调) | row(「完成本行」按钮) | 不挂 | 定时无意义;batch 批量完成暂未声明 |
|
||||
| `todo delete` | 挂 | row + batch(删除) | 不挂 | 定时无意义 |
|
||||
| `todo done`(Action `todo-done-row`) | 挂(短 CLI 直调) | row(「完成」按钮) | 不挂 | 定时无意义;batch 批量完成暂未声明 |
|
||||
| `todo delete` | 挂 | row(「删除」按钮)) + batch(删除) | 不挂 | 定时无意义 |
|
||||
| `todo stats` | 挂 | toolbar(统计) | 不挂 | 定时无意义 |
|
||||
| `remind` | 挂 | toolbar | 挂 | 定时扫描到期/待办项并提醒 |
|
||||
| `init-db` | 不挂 | 不挂 | 不挂 | 宿主安装/更新时静默调用,不对用户暴露 |
|
||||
|
||||
@@ -69,7 +69,7 @@ async def _run_template_demo(target: Optional[str], input_id: Optional[str]) ->
|
||||
def cmd_run(target: Optional[str] = None, input_id: Optional[str] = None) -> int:
|
||||
"""通用任务执行入口模板。复制后请实现真实业务逻辑。"""
|
||||
log = _get_task_logger()
|
||||
task_type = "demo"
|
||||
task_type = "cmd_run"
|
||||
|
||||
with job_context(skill=SKILL_SLUG):
|
||||
log.info(
|
||||
@@ -261,33 +261,34 @@ def cmd_stats() -> int:
|
||||
# ---------------- async 任务范式(demo) ----------------
|
||||
|
||||
async def _run_remind_async(*, seconds: int) -> dict[str, Any]:
|
||||
"""模拟长耗时任务:每秒 emit 一次进度,最后 finish 终态。
|
||||
|
||||
真实平台会推送到任务中心 UI 并支持取消;本 demo 在 stdout 打印 JSON Lines。
|
||||
"""
|
||||
steps = max(1, int(seconds))
|
||||
for i in range(1, steps + 1):
|
||||
await interruptible_sleep(1)
|
||||
emit(f"提醒任务进度 {i}/{steps}", skill=SKILL_SLUG, stage="remind", progress=i, total=steps)
|
||||
# 真实业务在这里会查 todos 表挑出 due/pending 项发出提醒;demo 不做真实推送
|
||||
真实平台会推送到任务中心 UI 并支持取消;
|
||||
"""
|
||||
log = _get_task_logger()
|
||||
todos = todo_service.get_current_remind_todos()
|
||||
log.info("[task]remind todos count: %s", len(todos))
|
||||
for todo in todos:
|
||||
todo_service.mark_done(todo.id)
|
||||
log.info("[task]remind todos : %s", todo.title)
|
||||
emit(f"提醒待办 {todo.title}", skill=SKILL_SLUG, stage="remind")
|
||||
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:
|
||||
"""演示 async 任务编排。CLI 入口仍走同一内核;Agent 真实调度时
|
||||
通过 ``run_skill_action``(executionProfile: async)触发。"""
|
||||
log = _get_task_logger()
|
||||
task_type = "remind"
|
||||
task_type = "cron"
|
||||
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")
|
||||
try:
|
||||
result = asyncio.run(_run_remind_async(seconds=seconds))
|
||||
log.info("task_done task_type=%s status=ok", task_type)
|
||||
finish(
|
||||
status="ok",
|
||||
message=f"提醒任务完成,处理 {seconds} 秒",
|
||||
status="success",
|
||||
message=f"提醒任务完成",
|
||||
skill=SKILL_SLUG,
|
||||
stage="remind",
|
||||
**result,
|
||||
|
||||
@@ -157,6 +157,22 @@ def delete_todo(todo_id: int) -> bool:
|
||||
finally:
|
||||
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:
|
||||
"""简单统计:用于 ``todo stats`` 命令与 demo 报告。"""
|
||||
|
||||
Reference in New Issue
Block a user