import { Code } from './code';
const CHAT_VIEW = 'div[id="workbench.panel.chat"]';
const CHAT_INPUT_EDITOR = `${CHAT_VIEW} .interactive-input-part .monaco-editor[role="code"]`;
const CHAT_INPUT_EDITOR_FOCUSED = `${CHAT_VIEW} .interactive-input-part .monaco-editor.focused[role="code"]`;
const CHAT_RESPONSE = `${CHAT_VIEW} .interactive-item-container.interactive-response`;
const CHAT_RESPONSE_COMPLETE = `${CHAT_RESPONSE}:not(.chat-response-loading)`;
const CHAT_FOOTER_DETAILS = `${CHAT_VIEW} .chat-footer-details`;
export class Chat {
constructor(private code: Code) { }
private get chatInputSelector(): string {
return `${CHAT_INPUT_EDITOR} ${!this.code.editContextEnabled ? 'textarea' : '.native-edit-context'}`;
}
async waitForChatView(): Promise<void> {
await this.code.waitForElement(CHAT_VIEW);
}
async waitForInputFocus(): Promise<void> {
await this.code.waitForElement(CHAT_INPUT_EDITOR_FOCUSED);
}
async sendMessage(message: string): Promise<void> {
await this.code.waitAndClick(CHAT_INPUT_EDITOR);
await this.waitForInputFocus();
const sanitizedMessage = message.replace(/\n/g, ' ');
await this.code.driver.currentPage.locator(this.chatInputSelector).pressSequentially(sanitizedMessage);
await this.code.dispatchKeybinding('enter', () => Promise.resolve());
}
async waitForResponse(retryCount?: number): Promise<void> {
await this.code.waitForElement(CHAT_RESPONSE, undefined, retryCount);
await this.code.waitForElement(CHAT_RESPONSE_COMPLETE, undefined, retryCount);
}
async waitForModelInFooter(): Promise<void> {
await this.code.waitForElements(CHAT_FOOTER_DETAILS, false, el => {
return el.some(el => {
const text = el && typeof el.textContent === 'string' ? el.textContent : '';
return !!text && text.length > 0;
});
});
}
}