Show WhatsApp channel peer next to Agent Preset in session header (4.9.1-ops.20).

Plugins inject conversation.session.header.actions; resolve sessionId back to the bound chat and render nickname/phone or group title.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
oliver 2026-09-05 19:10:07 +08:00
parent 2718586fda
commit 37742043a9
15 changed files with 852 additions and 326 deletions

View file

@ -158,6 +158,7 @@ export async function createProductionController(ctx, config = {}, internals = {
workspaces,
stateFor,
agentPresetCatalog,
channel: 'whatsapp',
});
const supervisor = createSupervisor({
channel: 'whatsapp',

View file

@ -32,6 +32,7 @@ export const WHATSAPP_ENDPOINTS = Object.freeze({
setWorkspace: SET_WORKSPACE_ENDPOINT,
setAgentPreset: SET_AGENT_PRESET_ENDPOINT,
setContextEnhancement: SET_CONTEXT_ENHANCEMENT_ENDPOINT,
resolveChannelPeer: 'bot.session.channel-peer',
});
export const WHATSAPP_RPC_ENDPOINTS = Object.freeze(Object.values(WHATSAPP_ENDPOINTS));
@ -99,6 +100,13 @@ function payloadFailure(endpoint, payload) {
return validContextEnhancementPayload(payload)
? null : '请提交有效的上下文增强设置。';
}
if (endpoint === WHATSAPP_ENDPOINTS.resolveChannelPeer) {
return exactKeys(payload, ['sessionId'])
&& typeof payload.sessionId === 'string'
&& payload.sessionId.trim()
&& payload.sessionId.trim().length <= 256
? null : 'bot.session.channel-peer requires a sessionId.';
}
return 'Unknown WhatsApp endpoint.';
}
@ -252,6 +260,11 @@ export function createWhatsappRpcHandler(controller, { encodeQr = qrDataUrl } =
payload.groupSessionScope,
(status) => publicStatus(status, cachedEncode),
);
} else if (endpoint === WHATSAPP_ENDPOINTS.resolveChannelPeer) {
if (typeof controller.resolveChannelPeer !== 'function') {
throw new Error('Channel peer resolve is unavailable');
}
value = await controller.resolveChannelPeer(payload.sessionId.trim());
} else {
value = await publicStatus(await controller.deleteBot(payload.botId), cachedEncode);
}