fix: robustere Chat-Panel-Oeffnung mit mehr Selektoren, Toolbar-Scan-Fallback und Diagnostik

Made-with: Cursor
This commit is contained in:
ValueOn AG 2026-03-07 01:07:57 +01:00
parent 9dae55ac8c
commit 2e7aa06edb
2 changed files with 87 additions and 10 deletions

View file

@ -46,16 +46,19 @@ export class ChatProcedure {
/**
* Open the chat panel and start monitoring messages.
*/
async enableChatMonitoring(): Promise<void> {
async enableChatMonitoring(): Promise<boolean> {
this._logger.info('Enabling chat monitoring...');
// Open chat panel
await this._openChatPanel();
// Wait for chat to load
await this._page.waitForTimeout(2000);
this._logger.info('Chat panel opened');
const isOpen = await this._isChatPanelOpen();
if (isOpen) {
this._logger.info('Chat panel opened successfully');
} else {
this._logger.warn('Chat panel could not be opened - chat send/receive will not work');
}
return isOpen;
}
/**
@ -125,23 +128,85 @@ export class ChatProcedure {
'button[data-tid="chat-button"]',
'button[aria-label*="Chat" i]',
'button[aria-label*="chat" i]',
'button[aria-label*="Unterhaltung" i]',
'button[aria-label*="Besprechungschat" i]',
'button[aria-label*="Meeting chat" i]',
'button[aria-label*="conversation" i]',
'#chat-button',
// New Teams: toolbar buttons with data-cid
'button[data-cid="chat-button"]',
'[data-tid="chat-button"]',
];
for (const selector of chatButtonSelectors) {
try {
const button = await this._page.$(selector);
if (button) {
const isVisible = await button.isVisible().catch(() => false);
if (!isVisible) continue;
await button.click();
this._logger.info(`Opened chat panel: ${selector}`);
return;
this._logger.info(`Opened chat panel via selector: ${selector}`);
await this._page.waitForTimeout(1500);
if (await this._isChatPanelOpen()) return;
this._logger.info(`Clicked ${selector} but panel not detected as open, continuing search`);
}
} catch {
// Continue
}
}
this._logger.warn('Could not find chat button - chat monitoring will not work');
// Fallback: find chat-like toolbar buttons by scanning all toolbar buttons
const toolbarFound = await this._page.evaluate(() => {
const allButtons = document.querySelectorAll(
'[data-tid*="toolbar"] button, [role="toolbar"] button, ' +
'#calling-unified-bar button, [data-tid="call-controls"] button, ' +
'button[data-tid]'
);
for (const btn of Array.from(allButtons) as HTMLElement[]) {
const label = (
btn.getAttribute('aria-label') || btn.getAttribute('title') ||
btn.innerText || ''
).toLowerCase();
if (
label.includes('chat') || label.includes('unterhaltung') ||
label.includes('besprechungschat') || label.includes('meeting chat') ||
label.includes('conversation')
) {
btn.click();
return `toolbar-scan: "${label}"`;
}
}
return null;
});
if (toolbarFound) {
this._logger.info(`Opened chat panel via ${toolbarFound}`);
await this._page.waitForTimeout(1500);
if (await this._isChatPanelOpen()) return;
}
// Log all toolbar buttons for diagnostics
const toolbarDiag = await this._page.evaluate(() => {
const btns = document.querySelectorAll(
'[data-tid*="toolbar"] button, [role="toolbar"] button, ' +
'#calling-unified-bar button, button[data-tid]'
);
return Array.from(btns).slice(0, 20).map((b) => {
const el = b as HTMLElement;
return {
tid: el.getAttribute('data-tid') || '',
label: el.getAttribute('aria-label') || '',
title: el.getAttribute('title') || '',
text: (el.innerText || '').substring(0, 40),
visible: el.offsetHeight > 0,
};
});
}).catch(() => []);
this._logger.warn(
`Could not find chat button - chat will not work. ` +
`Toolbar buttons found: ${JSON.stringify(toolbarDiag)}`
);
}
/**

View file

@ -1261,11 +1261,23 @@ export class BotOrchestrator {
private async _enableChat(): Promise<void> {
try {
this._chatProcedure!.setBotJoinedAt(Date.now());
await this._chatProcedure!.enableChatMonitoring();
const panelOpened = await this._chatProcedure!.enableChatMonitoring();
await this._chatProcedure!.subscribeToChatMessages();
this._logger.info('Chat monitoring enabled and subscribed');
this._logger.info(`Chat monitoring enabled (panel open: ${panelOpened})`);
if (!panelOpened) {
this._sendToGateway({
type: 'chatSendFailed',
sessionId: this._sessionId,
error: { reason: 'chat_panel_not_opened', text: 'Chat panel could not be opened during join' },
});
}
} catch (error) {
this._logger.warn('Could not enable chat monitoring:', error);
this._sendToGateway({
type: 'chatSendFailed',
sessionId: this._sessionId,
error: { reason: 'chat_init_error', text: String(error).substring(0, 200) },
});
}
}