Spaces:
Running
Running
| import type { MsgContext } from "../../auto-reply/templating.js"; | |
| import type { SessionScope } from "./types.js"; | |
| import { | |
| buildAgentMainSessionKey, | |
| DEFAULT_AGENT_ID, | |
| normalizeMainKey, | |
| } from "../../routing/session-key.js"; | |
| import { normalizeE164 } from "../../utils.js"; | |
| import { resolveGroupSessionKey } from "./group.js"; | |
| // Decide which session bucket to use (per-sender vs global). | |
| export function deriveSessionKey(scope: SessionScope, ctx: MsgContext) { | |
| if (scope === "global") { | |
| return "global"; | |
| } | |
| const resolvedGroup = resolveGroupSessionKey(ctx); | |
| if (resolvedGroup) { | |
| return resolvedGroup.key; | |
| } | |
| const from = ctx.From ? normalizeE164(ctx.From) : ""; | |
| return from || "unknown"; | |
| } | |
| /** | |
| * Resolve the session key with a canonical direct-chat bucket (default: "main"). | |
| * All non-group direct chats collapse to this bucket; groups stay isolated. | |
| */ | |
| export function resolveSessionKey(scope: SessionScope, ctx: MsgContext, mainKey?: string) { | |
| const explicit = ctx.SessionKey?.trim(); | |
| if (explicit) { | |
| return explicit.toLowerCase(); | |
| } | |
| const raw = deriveSessionKey(scope, ctx); | |
| if (scope === "global") { | |
| return raw; | |
| } | |
| const canonicalMainKey = normalizeMainKey(mainKey); | |
| const canonical = buildAgentMainSessionKey({ | |
| agentId: DEFAULT_AGENT_ID, | |
| mainKey: canonicalMainKey, | |
| }); | |
| const isGroup = raw.includes(":group:") || raw.includes(":channel:"); | |
| if (!isGroup) { | |
| return canonical; | |
| } | |
| return `agent:${DEFAULT_AGENT_ID}:${raw}`; | |
| } | |