




















@@ -197,54 +197,38 @@ export function buildGatewayCronService(params: {
197197return canonical;
198198};
199199200-const resolveCronWakeTarget = (opts?: { agentId?: string; sessionKey?: string | null }) => {
200+const resolveCronTarget = (opts?: {
201+agentId?: string | null;
202+sessionKey?: string | null;
203+preserveUntargeted?: boolean;
204+}) => {
201205const requestedAgentId =
202206typeof opts?.agentId === "string" && opts.agentId.trim()
203207 ? normalizeAgentId(opts.agentId)
204208 : undefined;
205209const requestedSessionKey =
206210typeof opts?.sessionKey === "string" && opts.sessionKey.trim() ? opts.sessionKey : undefined;
207-// Derive agentId from sessionKey only when the key is agent-prefixed
208-// (`agent:<id>:...`). For relative session keys like `discord:channel:ops`,
209-// `resolveAgentIdFromSessionKey` returns the literal `DEFAULT_AGENT_ID`
210-// ("main") regardless of cfg, which would route relative keys to the
211-// hardcoded "main" agent even on non-main-default deployments. Passing
212-// `undefined` lets `resolveCronAgent` fall back to the configured default
213-// agent so wake and enqueue resolve to the same target.
214-const parsedSessionKeyAgentId =
215-requestedSessionKey && parseAgentSessionKey(requestedSessionKey)
216- ? normalizeAgentId(resolveAgentIdFromSessionKey(requestedSessionKey))
217- : undefined;
218-const parsedSessionKey = requestedSessionKey
219- ? parseAgentSessionKey(requestedSessionKey)
220- : undefined;
221-const requestedOrDerived = requestedAgentId ?? parsedSessionKeyAgentId;
222-if (!requestedOrDerived && !requestedSessionKey) {
211+if (opts?.preserveUntargeted && !requestedAgentId && !requestedSessionKey) {
223212return { runtimeConfig: getRuntimeConfig(), agentId: undefined, sessionKey: undefined };
224213}
225-// For relative session keys (e.g. `discord:channel:ops`) we want the
226-// configured default agent's session, which `resolveCronAgent(undefined)`
227-// returns. For no-target wakes, the branch above preserves the existing
228-// heartbeat fanout/broadcast behavior by leaving agentId/sessionKey unset.
229-const { agentId: resolvedAgentId, cfg: runtimeConfig } = resolveCronAgent(requestedOrDerived);
230-const agentId = resolvedAgentId || undefined;
231-// If an agent-prefixed session key names an unconfigured agent, fall back
232-// to the configured default agent but keep the requested session suffix.
233-const sessionKeyForResolution =
234-!requestedAgentId &&
235-parsedSessionKey &&
236-agentId &&
237-normalizeAgentId(parsedSessionKey.agentId) !== normalizeAgentId(agentId)
238- ? parsedSessionKey.rest
239- : requestedSessionKey;
240-const sessionKey =
241-sessionKeyForResolution && agentId
242- ? resolveCronSessionKey({
243- runtimeConfig,
244- agentId,
245-requestedSessionKey: sessionKeyForResolution,
246-})
214+215+// Derive from canonical agent-prefixed keys only. Relative keys intentionally
216+// fall through to the configured default instead of hardcoding "main".
217+const derivedAgentId =
218+requestedSessionKey && parseAgentSessionKey(requestedSessionKey)
219+ ? resolveAgentIdFromSessionKey(requestedSessionKey)
247220 : undefined;
221+const { agentId: resolvedAgentId, cfg: runtimeConfig } = resolveCronAgent(
222+requestedAgentId ?? derivedAgentId,
223+);
224+const agentId = resolvedAgentId || undefined;
225+const sessionKey = agentId
226+ ? resolveCronSessionKey({
227+ runtimeConfig,
228+ agentId,
229+ requestedSessionKey,
230+})
231+ : undefined;
248232return { runtimeConfig, agentId, sessionKey };
249233};
250234@@ -304,41 +288,15 @@ export function buildGatewayCronService(params: {
304288 resolveSessionStorePath,
305289 sessionStorePath,
306290enqueueSystemEvent: (text, opts) => {
307-// When the caller passes only a sessionKey (e.g. `system event --session-key`),
308-// derive agentId from that key so a non-default agent's session is not silently
309-// rejected as foreign by resolveCronSessionKey and rerouted to the default agent.
310-// Only derive from agent-prefixed keys — for relative keys, let resolveCronAgent
311-// fall back to the configured default so we don't hardcode "main" on multi-agent
312-// deployments where main exists but isn't the default. (Mirrors the same fix in
313-// resolveCronWakeTarget above.)
314-const derivedAgentId =
315-opts?.agentId ??
316-(opts?.sessionKey && parseAgentSessionKey(opts.sessionKey)
317- ? resolveAgentIdFromSessionKey(opts.sessionKey)
318- : undefined);
319-const { agentId, cfg: runtimeConfig } = resolveCronAgent(derivedAgentId);
320-const parsedSessionKey = opts?.sessionKey ? parseAgentSessionKey(opts.sessionKey) : undefined;
321-// Mirror wake target resolution for unknown agent-prefixed keys:
322-// default agent, same requested session suffix.
323-const requestedSessionKey =
324-!opts?.agentId &&
325-parsedSessionKey &&
326-normalizeAgentId(parsedSessionKey.agentId) !== normalizeAgentId(agentId)
327- ? parsedSessionKey.rest
328- : opts?.sessionKey;
329-const sessionKey = resolveCronSessionKey({
330- runtimeConfig,
331- agentId,
332- requestedSessionKey,
333-});
291+const { sessionKey } = resolveCronTarget(opts);
334292enqueueSystemEvent(text, {
335293 sessionKey,
336294contextKey: opts?.contextKey,
337295trusted: opts?.trusted,
338296});
339297},
340298requestHeartbeat: (opts) => {
341-const { agentId, sessionKey } = resolveCronWakeTarget(opts);
299+const { agentId, sessionKey } = resolveCronTarget({ ...opts, preserveUntargeted: true });
342300requestHeartbeat({
343301source: opts?.source ?? "cron",
344302intent: opts?.intent ?? "event",
@@ -349,7 +307,10 @@ export function buildGatewayCronService(params: {
349307});
350308},
351309runHeartbeatOnce: async (opts) => {
352-const { runtimeConfig, agentId, sessionKey } = resolveCronWakeTarget(opts);
310+const { runtimeConfig, agentId, sessionKey } = resolveCronTarget({
311+ ...opts,
312+preserveUntargeted: true,
313+});
353314return await runHeartbeatOnce({
354315cfg: runtimeConfig,
355316source: opts?.source ?? "cron",
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。