-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
等待交互...
@@ -1266,32 +1824,83 @@
const toggle = document.getElementById('element2-copilot-toggle');
const recordButton = document.getElementById('element2-copilot-record');
+ const senderRecordButton = document.getElementById('element2-copilot-record-sender');
const videoRecordButton = document.getElementById('element2-copilot-record-video');
const urlInput = document.getElementById('element2-copilot-url');
const assistantInput = document.getElementById('element2-copilot-assistant');
- const sendAudioInput = document.getElementById('element2-copilot-send-audio');
- const sendVideoInput = document.getElementById('element2-copilot-send-video');
- sendAudioInput.checked = shouldSendAudioToAi();
- sendVideoInput.checked = shouldSendVideoToAi();
- sendAudioInput.addEventListener('change', () => {
- writeBoolSetting(AUDIO_UPLINK_STORAGE_KEY, sendAudioInput.checked);
- log(`AI audio uplink setting: ${sendAudioInput.checked ? 'on' : 'off'}`);
+ const usernameInput = document.getElementById('element2-copilot-username');
+ const passwordInput = document.getElementById('element2-copilot-password');
+ const audioModeInput = document.getElementById('element2-copilot-audio-mode');
+ const audioTrackInput = document.getElementById('element2-copilot-audio-track');
+ const videoModeInput = document.getElementById('element2-copilot-video-mode');
+ const videoTrackInput = document.getElementById('element2-copilot-video-track');
+ const senderModeInput = document.getElementById('element2-copilot-sender-mode');
+ const senderInput = document.getElementById('element2-copilot-sender');
+ audioModeInput.value = audioSelectionMode;
+ audioModeInput.addEventListener('change', () => {
+ writeAudioSelectionMode(audioModeInput.value);
+ if (audioSelectionMode === 'manual') {
+ manualAudioTrackId = selectedRemoteAudio?.id || selectableAudioItems()[0]?.track.id || null;
+ }
+ selectRemoteAudio('mode-change');
+ log(`AI input selection mode: ${audioSelectionMode}`);
});
- sendVideoInput.addEventListener('change', () => {
- writeBoolSetting(VIDEO_UPLINK_STORAGE_KEY, sendVideoInput.checked);
- log(`AI video uplink setting: ${sendVideoInput.checked ? 'on' : 'off'}`);
+ audioTrackInput.addEventListener('change', () => {
+ manualAudioTrackId = audioTrackInput.value || null;
+ selectRemoteAudio('manual-select');
+ log(`manual AI input track: ${manualAudioTrackId || 'none'}`);
+ });
+ videoModeInput.value = videoSelectionMode;
+ videoModeInput.addEventListener('change', () => {
+ writeVideoSelectionMode(videoModeInput.value);
+ if (videoSelectionMode === 'manual') {
+ manualVideoTrackId = selectedRemoteVideo?.id || selectableVideoItems()[0]?.track.id || null;
+ }
+ videoTrackSelectSignature = '';
+ selectRemoteVideo('video-mode-change');
+ log(`AI video selection mode: ${videoSelectionMode}`);
+ });
+ videoTrackInput.addEventListener('change', () => {
+ manualVideoTrackId = videoTrackInput.value || null;
+ selectRemoteVideo('manual-video-select');
+ log(`manual AI video track: ${manualVideoTrackId || 'none'}`);
+ });
+ senderModeInput.value = senderSelectionMode;
+ senderModeInput.addEventListener('change', async () => {
+ writeSenderSelectionMode(senderModeInput.value);
+ if (senderSelectionMode === 'manual') {
+ const selectedItem = Array.from(businessSenders.values()).find((item) => item.sender === selectedBusinessSender);
+ manualSenderId = selectedItem?.id || selectableSenderItems()[0]?.id || null;
+ }
+ await changeBusinessSender('sender-mode-change');
+ log(`business sender selection mode: ${senderSelectionMode}`);
+ });
+ senderInput.addEventListener('change', async () => {
+ manualSenderId = senderInput.value || null;
+ await changeBusinessSender('manual-sender-select');
+ log(`manual business sender: ${manualSenderId || 'none'}`);
});
recordButton.addEventListener('click', toggleInputRecording);
+ senderRecordButton.addEventListener('click', toggleSenderRecording);
videoRecordButton.addEventListener('click', toggleVideoRecording);
toggle.addEventListener('click', async () => {
if (!isAiTakeover && !assistantInput.value.trim()) {
alert('请先填写助手 ID。');
return;
}
+ if (!isAiTakeover && (!usernameInput.value.trim() || !passwordInput.value)) {
+ alert('请填写管理员用户名和密码。');
+ return;
+ }
isAiTakeover = !isAiTakeover;
updateModeButton();
if (isAiTakeover) {
- const connected = await connectAi(urlInput.value.trim(), assistantInput.value.trim());
+ const connected = await connectAi(
+ urlInput.value.trim(),
+ assistantInput.value.trim(),
+ usernameInput.value.trim(),
+ passwordInput.value,
+ );
if (connected) {
await attachAiOutputToBusiness();
} else {
@@ -1305,7 +1914,11 @@
});
updateModeButton();
updateRecordButton();
+ updateSenderRecordButton();
updateVideoRecordButton();
+ selectRemoteAudio('panel-ready');
+ selectRemoteVideo('panel-ready');
+ selectBusinessSender('panel-ready');
updateGateLabel();
}
@@ -1324,6 +1937,7 @@
setTimeout(renderPanelSoon, 3000);
window.addEventListener('beforeunload', () => {
if (inputRecorder?.state === 'recording') stopInputRecording();
+ if (senderRecorder?.state === 'recording') senderRecorder.stop();
if (videoRecorder?.state === 'recording') stopVideoRecording();
});
})();