























@@ -432,6 +432,7 @@ describe("resolveDeliveryTarget", () => {
432432to: "user:123456789",
433433kind: "user",
434434source: "directory",
435+resolutionSource: "plugin",
435436});
436437437438const cfg = makeCfg({ bindings: [] });
@@ -588,6 +589,149 @@ describe("resolveDeliveryTarget", () => {
588589expect(result.threadId).toBeUndefined();
589590});
590591592+it("preserves plugin-canonical targets that begin with the selected channel prefix", async () => {
593+setMainSessionEntry(undefined);
594+const canonicalTarget = "Bncr:tgBot:-1003891624016:6278285192";
595+setActivePluginRegistry(
596+createTestRegistry([
597+{
598+pluginId: "bncr",
599+source: "test",
600+plugin: createOutboundTestPlugin({
601+id: "bncr",
602+outbound: createStubOutbound("Bncr"),
603+messaging: {
604+targetPrefixes: ["bncr"],
605+targetResolver: {
606+resolveTarget: async ({ input }) =>
607+input === canonicalTarget
608+ ? { to: canonicalTarget, kind: "group" as const, source: "normalized" as const }
609+ : null,
610+},
611+},
612+}),
613+},
614+]),
615+);
616+617+const result = await resolveDeliveryTarget(makeCfg({ bindings: [] }), AGENT_ID, {
618+channel: "bncr",
619+to: canonicalTarget,
620+});
621+622+expect(result.ok).toBe(true);
623+expect(result.to).toBe(canonicalTarget);
624+expect(result.threadId).toBeUndefined();
625+});
626+627+it("preserves plugin-canonical targets returned for aliases", async () => {
628+setMainSessionEntry(undefined);
629+const canonicalTarget = "Bncr:tgBot:-1003891624016:6278285192";
630+setActivePluginRegistry(
631+createTestRegistry([
632+{
633+pluginId: "bncr",
634+source: "test",
635+plugin: createOutboundTestPlugin({
636+id: "bncr",
637+outbound: createStubOutbound("Bncr"),
638+messaging: {
639+targetPrefixes: ["bncr"],
640+targetResolver: {
641+resolveTarget: async ({ input }) =>
642+input === "alerts"
643+ ? { to: canonicalTarget, kind: "group" as const, source: "normalized" as const }
644+ : null,
645+},
646+},
647+}),
648+},
649+]),
650+);
651+652+const result = await resolveDeliveryTarget(makeCfg({ bindings: [] }), AGENT_ID, {
653+channel: "bncr",
654+to: "alerts",
655+});
656+657+expect(result.ok).toBe(true);
658+expect(result.to).toBe(canonicalTarget);
659+expect(result.threadId).toBeUndefined();
660+});
661+662+it("still strips selected prefixes from generic normalized fallback targets", async () => {
663+setMainSessionEntry(undefined);
664+setActivePluginRegistry(
665+createTestRegistry([
666+{
667+pluginId: "alpha",
668+source: "test",
669+plugin: createOutboundTestPlugin({
670+id: "alpha",
671+outbound: createStubOutbound("Alpha"),
672+messaging: { targetPrefixes: ["alpha"] },
673+}),
674+},
675+]),
676+);
677+678+const result = await resolveDeliveryTarget(makeCfg({ bindings: [] }), AGENT_ID, {
679+channel: "alpha",
680+to: "alpha:room-a",
681+});
682+683+expect(result.ok).toBe(true);
684+expect(result.to).toBe("room-a");
685+expect(result.threadId).toBeUndefined();
686+});
687+688+it("uses plugin-resolved directory targets for route parsing", async () => {
689+setMainSessionEntry(undefined);
690+setActivePluginRegistry(
691+createTestRegistry([
692+{
693+pluginId: "alpha",
694+source: "test",
695+plugin: createOutboundTestPlugin({
696+id: "alpha",
697+outbound: createStubOutbound("Alpha"),
698+messaging: {
699+targetPrefixes: ["alpha"],
700+targetResolver: {
701+resolveTarget: async ({ input }) =>
702+input === "alice"
703+ ? { to: "user:123", kind: "user" as const, source: "directory" as const }
704+ : null,
705+},
706+resolveOutboundSessionRoute: ({ cfg, agentId, accountId, target }) => {
707+const isUser = target.startsWith("user:");
708+return buildChannelOutboundSessionRoute({
709+ cfg,
710+ agentId,
711+channel: "alpha",
712+ accountId,
713+peer: { kind: isUser ? "direct" : "channel", id: target },
714+chatType: isUser ? "direct" : "channel",
715+from: target,
716+to: isUser ? target : `channel:${target}`,
717+});
718+},
719+},
720+}),
721+},
722+]),
723+);
724+725+const result = await resolveDeliveryTarget(makeCfg({ bindings: [] }), AGENT_ID, {
726+channel: "alpha",
727+to: "alice",
728+});
729+730+expect(result.ok).toBe(true);
731+expect(result.to).toBe("user:123");
732+expect(result.threadId).toBeUndefined();
733+});
734+591735it("uses canonical route targets even when the route has no thread", async () => {
592736setMainSessionEntry(undefined);
593737setActivePluginRegistry(
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。