

























@@ -13,7 +13,11 @@ import {
1313type CronDeliveryPlan,
1414resolveCronDeliveryPlan,
1515} from "./delivery-plan.js";
16-import { resolveDeliveryTarget } from "./isolated-agent/delivery-target.js";
16+import {
17+resolveDeliveryTarget,
18+type DeliveryTargetResolution,
19+} from "./isolated-agent/delivery-target.js";
20+import { resolveCronNotificationSessionKey } from "./session-target.js";
1721import type { CronMessageChannel } from "./types.js";
18221923export {
@@ -27,65 +31,143 @@ export {
2731const FAILURE_NOTIFICATION_TIMEOUT_MS = 30_000;
2832const cronDeliveryLogger = getChildLogger({ subsystem: "cron-delivery" });
293334+export type CronAnnounceTarget = {
35+channel?: string;
36+to?: string;
37+accountId?: string;
38+sessionKey?: string;
39+};
40+41+type SuccessfulDeliveryTarget = Extract<DeliveryTargetResolution, { ok: true }>;
42+43+async function resolveCronAnnounceDelivery(params: {
44+cfg: OpenClawConfig;
45+agentId: string;
46+jobId: string;
47+target: CronAnnounceTarget;
48+}): Promise<
49+| {
50+ok: true;
51+resolvedTarget: SuccessfulDeliveryTarget;
52+session: ReturnType<typeof buildOutboundSessionContext>;
53+identity: ReturnType<typeof resolveAgentOutboundIdentity>;
54+}
55+| { ok: false; error: Error }
56+> {
57+const resolvedTarget = await resolveDeliveryTarget(params.cfg, params.agentId, {
58+channel: params.target.channel as CronMessageChannel | undefined,
59+to: params.target.to,
60+accountId: params.target.accountId,
61+sessionKey: params.target.sessionKey,
62+});
63+64+if (!resolvedTarget.ok) {
65+return { ok: false, error: resolvedTarget.error };
66+}
67+68+const identity = resolveAgentOutboundIdentity(params.cfg, params.agentId);
69+const session = buildOutboundSessionContext({
70+cfg: params.cfg,
71+agentId: params.agentId,
72+sessionKey: resolveCronNotificationSessionKey({
73+jobId: params.jobId,
74+sessionKey: params.target.sessionKey,
75+}),
76+});
77+78+return {
79+ok: true,
80+ resolvedTarget,
81+ session,
82+ identity,
83+};
84+}
85+86+async function deliverCronAnnouncePayload(params: {
87+deps: CliDeps;
88+cfg: OpenClawConfig;
89+delivery: {
90+resolvedTarget: SuccessfulDeliveryTarget;
91+session: ReturnType<typeof buildOutboundSessionContext>;
92+identity: ReturnType<typeof resolveAgentOutboundIdentity>;
93+};
94+message: string;
95+abortSignal: AbortSignal;
96+}): Promise<void> {
97+await deliverOutboundPayloads({
98+cfg: params.cfg,
99+channel: params.delivery.resolvedTarget.channel,
100+to: params.delivery.resolvedTarget.to,
101+accountId: params.delivery.resolvedTarget.accountId,
102+threadId: params.delivery.resolvedTarget.threadId,
103+payloads: [{ text: params.message }],
104+session: params.delivery.session,
105+identity: params.delivery.identity,
106+bestEffort: false,
107+deps: createOutboundSendDeps(params.deps),
108+abortSignal: params.abortSignal,
109+});
110+}
111+112+export async function sendCronAnnouncePayloadStrict(params: {
113+deps: CliDeps;
114+cfg: OpenClawConfig;
115+agentId: string;
116+jobId: string;
117+target: CronAnnounceTarget;
118+message: string;
119+abortSignal: AbortSignal;
120+}): Promise<void> {
121+const delivery = await resolveCronAnnounceDelivery(params);
122+if (!delivery.ok) {
123+throw delivery.error;
124+}
125+await deliverCronAnnouncePayload({
126+deps: params.deps,
127+cfg: params.cfg,
128+ delivery,
129+message: params.message,
130+abortSignal: params.abortSignal,
131+});
132+}
133+30134export async function sendFailureNotificationAnnounce(
31135deps: CliDeps,
32136cfg: OpenClawConfig,
33137agentId: string,
34138jobId: string,
35-target: { channel?: string; to?: string; accountId?: string; sessionKey?: string },
139+target: CronAnnounceTarget,
36140message: string,
37141): Promise<void> {
38-const resolvedTarget = await resolveDeliveryTarget(cfg, agentId, {
39-channel: target.channel as CronMessageChannel | undefined,
40-to: target.to,
41-accountId: target.accountId,
42-sessionKey: target.sessionKey,
43-});
142+const delivery = await resolveCronAnnounceDelivery({ cfg, agentId, jobId, target });
4414345-if (!resolvedTarget.ok) {
144+if (!delivery.ok) {
46145cronDeliveryLogger.warn(
47-{ error: resolvedTarget.error.message },
146+{ error: delivery.error.message },
48147"cron: failed to resolve failure destination target",
49148);
50149return;
51150}
5215153-const identity = resolveAgentOutboundIdentity(cfg, agentId);
54-const deliverySessionKey =
55-typeof target.sessionKey === "string" && target.sessionKey.trim()
56- ? target.sessionKey.trim()
57- : `cron:${jobId}:failure`;
58-const session = buildOutboundSessionContext({
59- cfg,
60- agentId,
61-sessionKey: deliverySessionKey,
62-});
63-64152const abortController = new AbortController();
65153const timeout = setTimeout(() => {
66154abortController.abort();
67155}, FAILURE_NOTIFICATION_TIMEOUT_MS);
6815669157try {
70-await deliverOutboundPayloads({
158+await deliverCronAnnouncePayload({
159+ deps,
71160 cfg,
72-channel: resolvedTarget.channel,
73-to: resolvedTarget.to,
74-accountId: resolvedTarget.accountId,
75-threadId: resolvedTarget.threadId,
76-payloads: [{ text: message }],
77- session,
78- identity,
79-bestEffort: false,
80-deps: createOutboundSendDeps(deps),
161+ delivery,
162+ message,
81163abortSignal: abortController.signal,
82164});
83165} catch (err) {
84166cronDeliveryLogger.warn(
85167{
86168err: formatErrorMessage(err),
87-channel: resolvedTarget.channel,
88-to: resolvedTarget.to,
169+channel: delivery.resolvedTarget.channel,
170+to: delivery.resolvedTarget.to,
89171},
90172"cron: failure destination announce failed",
91173);
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。