// main.js import { createPanel } from './scripts/panel.js'; import { handleCommand, COMMANDS } from './scripts/commands.js'; import { initVoice } from './scripts/voice.js'; import { translateToCommand } from './scripts/ai.js'; const init = async () => { const ui = createPanel(); let spaceTimer = null; let isRecording = false; // 统一定义 UI 更新引用,方便 handleCommand 调用 const uiRefs = { updateStatus: (text) => { const statusText = document.getElementById("statusText"); if (statusText) { statusText.innerText = text; statusText.style.color = "#409eff"; // 使用蓝色区分对话与就绪状态 } } }; async function startProcess(text) { if (!text) return; ui.setLoading(true); try { // 无论是否本地匹配,统一走 translateToCommand 以获取对话回复 // 如果你希望本地极速响应,可以在此保留逻辑,但建议统一走 AI 获取 const aiResult = await translateToCommand(text); if (aiResult) { handleCommand(aiResult, uiRefs); } } catch (err) { console.error("处理流程错误:", err); uiRefs.updateStatus("处理指令时出错"); } finally { ui.setLoading(false); } } const voiceCtrl = initVoice(document.getElementById("automation-ai-panel"), (text) => { ui.input.value = text; startProcess(text); }); // 按钮触发录音 ui.btn.onclick = () => { if (!isRecording) { voiceCtrl.start(); ui.setRecording(true); isRecording = true; setTimeout(() => { if (isRecording) { voiceCtrl.stop(); ui.setRecording(false); isRecording = false; } }, 4000); // 按钮模式延长到 4s,确保说话完整 } }; // 空格长按触发录音 window.addEventListener("keydown", (e) => { if (e.code === "Space" && e.target.tagName !== "INPUT" && e.target.tagName !== "TEXTAREA") { if (spaceTimer || isRecording) return; spaceTimer = setTimeout(() => { if (voiceCtrl.supportSpeech) { voiceCtrl.start(); ui.setRecording(true); isRecording = true; } }, 500); } }); window.addEventListener("keyup", (e) => { if (e.code === "Space") { if (spaceTimer) { clearTimeout(spaceTimer); spaceTimer = null; } if (isRecording) { setTimeout(() => { voiceCtrl.stop(); ui.setRecording(false); isRecording = false; }, 200); e.preventDefault(); } } }); // 输入框回车触发 ui.input.onkeydown = (e) => { if (e.key === "Enter") { const val = ui.input.value; ui.input.value = ""; startProcess(val); } }; }; if (document.readyState === "complete") init(); else window.addEventListener("load", init);