




















@@ -1,30 +1,91 @@
1-import type { OpenClawPluginApi } from "openclaw/plugin-sdk/core";
2-import { RemindSchema, executeRemind } from "../../engine/tools/remind-logic.js";
3-import type { RemindParams } from "../../engine/tools/remind-logic.js";
1+import { callGatewayTool } from "openclaw/plugin-sdk/agent-harness-runtime";
2+import type {
3+AnyAgentTool,
4+OpenClawPluginApi,
5+OpenClawPluginToolContext,
6+} from "openclaw/plugin-sdk/core";
7+import { RemindSchema, executeScheduledRemind } from "../../engine/tools/remind-logic.js";
8+import type { RemindCronAction, RemindParams } from "../../engine/tools/remind-logic.js";
49import { getRequestContext } from "../../engine/utils/request-context.js";
5106-export function registerRemindTool(api: OpenClawPluginApi): void {
7-api.registerTool(
8-{
9-name: "qqbot_remind",
10-label: "QQBot Reminder",
11-description:
12-"Create, list, and remove QQ reminders. " +
13-"Use simple parameters without manually building cron JSON.\n" +
14-"Create: action=add, content=message, time=schedule (to is optional, " +
15-"resolved automatically from the current conversation)\n" +
16-"List: action=list\n" +
17-"Remove: action=remove, jobId=job id from list\n" +
18-'Time examples: "5m", "1h", "0 8 * * *"',
19-parameters: RemindSchema,
20-async execute(_toolCallId, params) {
21-const ctx = getRequestContext();
22-return executeRemind(params as RemindParams, {
23-fallbackTo: ctx?.target,
24-fallbackAccountId: ctx?.accountId,
25-});
26-},
11+type CronGatewayCaller = (params: RemindCronAction) => Promise<unknown>;
12+13+type RemindToolDeps = {
14+callCron: CronGatewayCaller;
15+};
16+17+const DEFAULT_GATEWAY_TIMEOUT_MS = 60_000;
18+19+function unexpectedCronParams(params: never): never {
20+throw new Error(`Unsupported reminder cron action: ${JSON.stringify(params)}`);
21+}
22+23+const defaultDeps: RemindToolDeps = {
24+callCron: async (params) => {
25+switch (params.action) {
26+case "list":
27+return await callGatewayTool("cron.list", { timeoutMs: DEFAULT_GATEWAY_TIMEOUT_MS }, {});
28+case "remove":
29+return await callGatewayTool(
30+"cron.remove",
31+{ timeoutMs: DEFAULT_GATEWAY_TIMEOUT_MS },
32+{ jobId: params.jobId },
33+);
34+case "add":
35+return await callGatewayTool(
36+"cron.add",
37+{ timeoutMs: DEFAULT_GATEWAY_TIMEOUT_MS },
38+{ job: params.job },
39+);
40+}
41+return unexpectedCronParams(params);
42+},
43+};
44+45+export function createRemindTool(
46+toolContext: OpenClawPluginToolContext = {},
47+deps: RemindToolDeps = defaultDeps,
48+): AnyAgentTool {
49+return {
50+name: "qqbot_remind",
51+label: "QQBot Reminder",
52+ownerOnly: true,
53+description:
54+"Create, list, and remove QQ reminders. " +
55+"This tool schedules Gateway cron jobs directly; do not call the cron tool after it succeeds.\n" +
56+"Create: action=add, content=message, time=schedule (to is optional, " +
57+"resolved automatically from the current conversation)\n" +
58+"List: action=list\n" +
59+"Remove: action=remove, jobId=job id from list\n" +
60+'Time examples: "5m", "1h", "0 8 * * *"',
61+parameters: RemindSchema,
62+async execute(_toolCallId, params) {
63+if (toolContext.senderIsOwner !== true) {
64+return {
65+content: [
66+{
67+type: "text" as const,
68+text: JSON.stringify({
69+error: "QQ reminders require an owner-authorized sender.",
70+}),
71+},
72+],
73+details: { error: "QQ reminders require an owner-authorized sender." },
74+};
75+}
76+const ctx = getRequestContext();
77+return await executeScheduledRemind(
78+params as RemindParams,
79+{
80+fallbackTo: ctx?.target ?? toolContext.deliveryContext?.to,
81+fallbackAccountId: ctx?.accountId ?? toolContext.deliveryContext?.accountId,
82+},
83+deps.callCron,
84+);
2785},
28-{ name: "qqbot_remind" },
29-);
86+};
87+}
88+89+export function registerRemindTool(api: OpenClawPluginApi): void {
90+api.registerTool((ctx) => createRemindTool(ctx), { name: "qqbot_remind" });
3091}
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。