From aaa81250bf2f9fdaf17c0807281c38802c5ae83b Mon Sep 17 00:00:00 2001 From: Gustavo Madeira Santana Date: Fri, 17 Apr 2026 00:52:14 -0400 Subject: [PATCH] Matrix: simplify subagent delivery origin --- .../matrix/src/matrix/subagent-hooks.ts | 65 +++++++++++-------- 1 file changed, 37 insertions(+), 28 deletions(-) diff --git a/extensions/matrix/src/matrix/subagent-hooks.ts b/extensions/matrix/src/matrix/subagent-hooks.ts index 61b9efe262c..05a3804cf20 100644 --- a/extensions/matrix/src/matrix/subagent-hooks.ts +++ b/extensions/matrix/src/matrix/subagent-hooks.ts @@ -1,5 +1,8 @@ import { DEFAULT_ACCOUNT_ID } from "openclaw/plugin-sdk/account-id"; -import { getSessionBindingService } from "openclaw/plugin-sdk/conversation-binding-runtime"; +import { + getSessionBindingService, + type SessionBindingRecord, +} from "openclaw/plugin-sdk/conversation-binding-runtime"; import type { OpenClawPluginApi } from "openclaw/plugin-sdk/core"; import { normalizeOptionalString } from "openclaw/plugin-sdk/text-runtime"; import { findMatrixAccountConfig, resolveMatrixBaseConfig } from "./account-config.js"; @@ -41,26 +44,23 @@ type MatrixSubagentDeliveryTargetEvent = { expectsCompletionMessage: boolean; }; +type MatrixDeliveryOrigin = { + channel: "matrix"; + accountId: string; + to: string; + threadId?: string; +}; + type SpawningResult = | { status: "ok"; threadBindingReady?: boolean; - deliveryOrigin?: { - channel: string; - accountId: string; - to: string; - threadId?: string; - }; + deliveryOrigin?: MatrixDeliveryOrigin; } | { status: "error"; error: string }; type DeliveryTargetResult = { - origin: { - channel: string; - accountId: string; - to: string; - threadId?: string; - }; + origin: MatrixDeliveryOrigin; }; function summarizeError(err: unknown): string { @@ -95,6 +95,28 @@ function resolveThreadBindingFlags( }; } +function resolveMatrixBindingThreadId(binding: SessionBindingRecord): string | undefined { + const { conversationId, parentConversationId } = binding.conversation; + return parentConversationId && parentConversationId !== conversationId + ? conversationId + : undefined; +} + +function resolveMatrixBindingDeliveryOrigin( + binding: SessionBindingRecord, + fallbackAccountId: string, +): MatrixDeliveryOrigin { + const boundRoomId = + binding.conversation.parentConversationId ?? binding.conversation.conversationId; + const threadId = resolveMatrixBindingThreadId(binding); + return { + channel: "matrix", + accountId: binding.conversation.accountId ?? fallbackAccountId, + to: `room:${boundRoomId}`, + ...(threadId ? { threadId } : {}), + }; +} + export async function handleMatrixSubagentSpawning( api: OpenClawPluginApi, event: MatrixSubagentSpawningEvent, @@ -176,24 +198,11 @@ export async function handleMatrixSubagentSpawning( boundBy: "system", }, }); - const boundRoomId = - binding.conversation.parentConversationId ?? binding.conversation.conversationId; - const threadId = - binding.conversation.parentConversationId && - binding.conversation.parentConversationId !== binding.conversation.conversationId - ? binding.conversation.conversationId - : undefined; - const result = { + return { status: "ok", threadBindingReady: true, - deliveryOrigin: { - channel: "matrix", - accountId: binding.conversation.accountId ?? accountId, - to: `room:${boundRoomId}`, - ...(threadId ? { threadId } : {}), - }, + deliveryOrigin: resolveMatrixBindingDeliveryOrigin(binding, accountId), } satisfies SpawningResult; - return result; } catch (err) { return { status: "error",