refactor: centralize reserved target error checks · openclaw/openclaw@57c07d7
zhangguiping
·
2026-06-25
·
via Recent Commits to openclaw:main
| Original file line number | Diff line number | Diff line change |
|---|
@@ -11,6 +11,7 @@ import type { OpenClawConfig } from "../../config/types.openclaw.js";
|
11 | 11 | import { formatErrorMessage } from "../../infra/errors.js"; |
12 | 12 | import { stripTargetProviderPrefix } from "../../infra/outbound/channel-target-prefix.js"; |
13 | 13 | import type { OutboundSessionRoute } from "../../infra/outbound/outbound-session.js"; |
| 14 | +import { isReservedTargetLiteralError } from "../../infra/outbound/target-errors.js"; |
14 | 15 | import type { ResolvedMessagingTarget } from "../../infra/outbound/target-resolver.js"; |
15 | 16 | import { tryResolveLoadedOutboundTarget } from "../../infra/outbound/targets-loaded.js"; |
16 | 17 | import { resolveSessionDeliveryTarget } from "../../infra/outbound/targets-session.js"; |
@@ -349,7 +350,7 @@ export async function resolveDeliveryTarget(
|
349 | 350 | allowFrom: effectiveAllowFrom, |
350 | 351 | }); |
351 | 352 | if (!docked.ok) { |
352 | | -if (!toCandidate || !docked.error.message.includes("Reserved target")) { |
| 353 | +if (!toCandidate || !isReservedTargetLiteralError(docked.error)) { |
353 | 354 | return { |
354 | 355 | ok: false, |
355 | 356 | channel, |
|
| Original file line number | Diff line number | Diff line change |
|---|
@@ -15,6 +15,7 @@ import {
|
15 | 15 | } from "../../utils/message-channel.js"; |
16 | 16 | import { resolveOutboundChannelPlugin } from "./channel-resolution.js"; |
17 | 17 | import { resolveOutboundSessionRoute } from "./outbound-session.js"; |
| 18 | +import { isReservedTargetLiteralError } from "./target-errors.js"; |
18 | 19 | import { resolveChannelTarget, type ResolvedMessagingTarget } from "./target-resolver.js"; |
19 | 20 | import type { OutboundTargetResolution } from "./targets.js"; |
20 | 21 | import { |
@@ -174,7 +175,7 @@ export async function resolveAgentDeliveryPlanWithSessionRoute(
|
174 | 175 | if (normalizedTarget.ok) { |
175 | 176 | sessionRouteTarget = normalizedTarget.to; |
176 | 177 | } else { |
177 | | -if (!normalizedTarget.error.message.includes("Reserved target")) { |
| 178 | +if (!isReservedTargetLiteralError(normalizedTarget.error)) { |
178 | 179 | return { ...plan, targetResolutionError: normalizedTarget.error }; |
179 | 180 | } |
180 | 181 | const resolvedTarget = await resolveChannelTarget({ |
|
| Original file line number | Diff line number | Diff line change |
|---|
@@ -3,8 +3,10 @@ import { describe, expect, it } from "vitest";
|
3 | 3 | import { |
4 | 4 | ambiguousTargetError, |
5 | 5 | ambiguousTargetMessage, |
| 6 | +isReservedTargetLiteralError, |
6 | 7 | missingTargetError, |
7 | 8 | missingTargetMessage, |
| 9 | +reservedTargetLiteralError, |
8 | 10 | unknownTargetError, |
9 | 11 | unknownTargetMessage, |
10 | 12 | } from "./target-errors.js"; |
@@ -69,4 +71,13 @@ describe("target error helpers", () => {
|
69 | 71 | "Hint: Use channel:123", |
70 | 72 | ); |
71 | 73 | }); |
| 74 | + |
| 75 | +it("identifies reserved target literal errors", () => { |
| 76 | +expect(isReservedTargetLiteralError(reservedTargetLiteralError("Telegram", "current"))).toBe( |
| 77 | +true, |
| 78 | +); |
| 79 | +expect(isReservedTargetLiteralError(new Error('Unknown target "current" for Telegram.'))).toBe( |
| 80 | +false, |
| 81 | +); |
| 82 | +}); |
72 | 83 | }); |
| Original file line number | Diff line number | Diff line change |
|---|
@@ -48,6 +48,10 @@ export function reservedTargetLiteralError(provider: string, raw: string, hint?:
|
48 | 48 | return new Error(reservedTargetLiteralMessage(provider, raw, hint)); |
49 | 49 | } |
50 | 50 | |
| 51 | +export function isReservedTargetLiteralError(error: Error): boolean { |
| 52 | +return error.message.includes("Reserved target"); |
| 53 | +} |
| 54 | + |
51 | 55 | function formatTargetHint(hint?: string, withLabel = false): string { |
52 | 56 | const normalized = hint?.trim(); |
53 | 57 | if (!normalized) { |
|
| Original file line number | Diff line number | Diff line change |
|---|
@@ -27,6 +27,7 @@ import {
|
27 | 27 | resolveOutboundChannelPlugin, |
28 | 28 | } from "./channel-resolution.js"; |
29 | 29 | import { resolveOutboundSessionRoute } from "./outbound-session.js"; |
| 30 | +import { isReservedTargetLiteralError } from "./target-errors.js"; |
30 | 31 | import { resolveChannelTarget, type ResolvedMessagingTarget } from "./target-resolver.js"; |
31 | 32 | import { |
32 | 33 | resolveOutboundTargetWithPlugin, |
@@ -361,7 +362,7 @@ export async function resolveHeartbeatDeliveryTargetWithSessionRoute(params: {
|
361 | 362 | })(); |
362 | 363 | if (targetResolution?.ok) { |
363 | 364 | routeResolvedTarget = targetResolution.target; |
364 | | -} else if (targetResolution?.error.message.includes("Reserved target")) { |
| 365 | +} else if (targetResolution && isReservedTargetLiteralError(targetResolution.error)) { |
365 | 366 | return buildNoHeartbeatDeliveryTarget({ |
366 | 367 | reason: "no-target", |
367 | 368 | accountId: delivery.accountId, |
|
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。