@@ -1155,7 +1155,8 @@ ${commonRules}`;
11551155 </div>
11561156 </div>
11571157 <div style="display:flex;gap:4px;margin-top:6px">
1158- <button id="btnLaunchEngine" style="background:#22c55e;flex:1">� 一键连接</button>
1158+ <button id="btnLaunchEngine" style="background:#22c55e;flex:1">🚀 一键启动引擎</button>
1159+ <button id="btnStopEngine" class="hidden" style="background:#ef4444;flex:1">⏹ 断开引擎</button>
11591160 </div>
11601161 </div>
11611162
@@ -1528,67 +1529,54 @@ ${commonRules}`;
15281529
15291530 // 检查引擎
15301531 const btnLaunchEngine = document.getElementById("btnLaunchEngine");
1532+ const btnStopEngine = document.getElementById("btnStopEngine");
15311533 let isStarting = false; // 是否处于「正在启动中」状态
15321534 let engineFound = false; // 引擎是否已连接成功(防止重复检查)
1533- let engineConnected = false; // 当前是否已连接
15341535 let launchTimeoutId = null; // 防止多次点击导致旧 timer 覆盖按钮状态
15351536 document.getElementById("btnCheckEngine").addEventListener("click", () => {
15361537 vscode.postMessage({ command: "checkEngine" });
15371538 });
15381539
1539- // 单按钮:连接时点击=断开,断开时点击=连接
1540+ // 一键启动引擎
15401541 btnLaunchEngine.addEventListener("click", () => {
1541- if (engineConnected) {
1542- // 已连接 → 断开
1543- isStarting = false;
1544- wasConnected = false;
1545- engineFound = false;
1546- engineConnected = false;
1547- vscode.postMessage({ command: "stopEngine" });
1548- btnLaunchEngine.textContent = "⏳ 断开中...";
1549- btnLaunchEngine.style.background = "#6b7280";
1550- btnLaunchEngine.disabled = true;
1551- addLog("正在断开引擎...", "info");
1552- setTimeout(() => {
1553- btnLaunchEngine.textContent = "🔗 一键连接";
1554- btnLaunchEngine.style.background = "#22c55e";
1555- btnLaunchEngine.disabled = false;
1556- }, 2000);
1557- } else {
1558- // 未连接 → 启动
1559- isStarting = true;
1560- engineFound = false;
1561- vscode.postMessage({ command: "launchEngine" });
1562- btnLaunchEngine.textContent = "⏳ 启动中...";
1563- btnLaunchEngine.style.background = "#6b7280";
1564- btnLaunchEngine.disabled = true;
1565- addLog("正在启动引擎,请稍候...", "info");
1566-
1567- // 清除旧 timer,防止多次点击互相干扰
1568- if (launchTimeoutId) { clearTimeout(launchTimeoutId); launchTimeoutId = null; }
1569-
1570- // 每 3s 检查一次,最多 8 次(24s)
1571- let checkCount = 0;
1572- function doCheck() {
1573- if (engineFound || !isStarting) { return; }
1574- checkCount++;
1542+ isStarting = true;
1543+ engineFound = false;
1544+ vscode.postMessage({ command: "launchEngine" });
1545+ btnLaunchEngine.classList.add("hidden");
1546+ btnStopEngine.classList.remove("hidden");
1547+ btnStopEngine.textContent = "⏹ 断开引擎";
1548+ btnStopEngine.disabled = false;
1549+ addLog("正在启动引擎,请稍候(最长约25秒)...", "info");
1550+
1551+ // 清除旧 timer,防止多次点击互相干扰
1552+ if (launchTimeoutId) { clearTimeout(launchTimeoutId); launchTimeoutId = null; }
1553+
1554+ // 分别在 8s / 16s / 25s 重试检查连接,连接成功后停止后续检查
1555+ const delays = [8000, 16000, 25000];
1556+ function scheduleCheck(idx) {
1557+ if (idx >= delays.length || engineFound) { return; }
1558+ launchTimeoutId = setTimeout(() => {
1559+ if (engineFound) { return; }
15751560 vscode.postMessage({ command: "checkEngine" });
1576- if (checkCount < 8) {
1577- launchTimeoutId = setTimeout(doCheck, 3000);
1578- } else {
1579- launchTimeoutId = setTimeout(() => {
1580- if (!engineFound) {
1581- isStarting = false;
1582- btnLaunchEngine.textContent = "🔗 一键连接";
1583- btnLaunchEngine.style.background = "#22c55e";
1584- btnLaunchEngine.disabled = false;
1585- addLog("引擎启动超时,请检查环境后重试", "error");
1586- }
1587- }, 1000);
1588- }
1589- }
1590- launchTimeoutId = setTimeout(doCheck, 3000);
1561+ scheduleCheck(idx + 1);
1562+ }, delays[idx] - (idx > 0 ? delays[idx - 1] : 0));
15911563 }
1564+ scheduleCheck(0);
1565+ });
1566+
1567+ // 断开引擎
1568+ btnStopEngine.addEventListener("click", () => {
1569+ isStarting = false;
1570+ wasConnected = false;
1571+ engineFound = false;
1572+ vscode.postMessage({ command: "stopEngine" });
1573+ btnStopEngine.textContent = "⏳ 断开中...";
1574+ btnStopEngine.disabled = true;
1575+ addLog("正在断开引擎...", "info");
1576+ setTimeout(() => {
1577+ btnLaunchEngine.classList.remove("hidden");
1578+ btnStopEngine.classList.add("hidden");
1579+ }, 2000);
15921580 });
15931581
15941582 let pendingBlueprintRun = null;
@@ -1935,28 +1923,26 @@ ${commonRules}`;
19351923 if (data.connected) {
19361924 isStarting = false;
19371925 engineFound = true;
1938- engineConnected = true;
19391926 statusDot.className = "status-dot connected";
19401927 engineStatus.textContent = "v" + (data.version || "?");
1941- btnLaunchEngine.textContent = "⏹ 断开";
1942- btnLaunchEngine.style.background = "#ef4444";
1943- btnLaunchEngine.disabled = false;
1928+ btnLaunchEngine.classList.add("hidden");
1929+ btnStopEngine.classList.remove("hidden");
1930+ btnStopEngine.textContent = "⏹ 断开引擎";
1931+ btnStopEngine.disabled = false;
19441932 if (!wasConnected) {
19451933 wasConnected = true;
19461934 addLog("引擎连接成功 | v" + data.version, "success");
19471935 vscode.postMessage({ command: "scanBlueprints" });
19481936 }
19491937 } else {
1950- engineConnected = false;
19511938 statusDot.className = "status-dot disconnected";
19521939 engineStatus.textContent = isStarting ? "启动中..." : "未连接";
1953- btnLaunchEngine.textContent = isStarting ? "⏳ 启动中..." : "🔗 一键连接";
1954- btnLaunchEngine.style.background = isStarting ? "#6b7280" : "#22c55e";
1955- btnLaunchEngine.disabled = isStarting;
19561940 if (!isStarting) {
1941+ btnLaunchEngine.classList.remove("hidden");
1942+ btnStopEngine.classList.add("hidden");
19571943 wasConnected = false;
19581944 }
1959- addLog(isStarting ? "引擎尚未就绪,继续等待..." : "引擎未连接,点击「一键连接 」按钮启动", isStarting ? "warn" : "error");
1945+ addLog(isStarting ? "引擎尚未就绪,继续等待..." : "引擎未连接,点击「🚀 一键启动引擎 」按钮启动", isStarting ? "warn" : "error");
19601946 }
19611947 }
19621948
0 commit comments