cicy-desktop 2.1.134 → 2.1.135

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cicy-desktop",
3
- "version": "2.1.134",
3
+ "version": "2.1.135",
4
4
  "description": "CiCy - AI-powered operating system browser",
5
5
  "main": "src/main.js",
6
6
  "bin": {
@@ -121,6 +121,18 @@ function importTarball(dest, installDir) {
121
121
  });
122
122
  }
123
123
 
124
+ // `wsl --terminate <distro>`: stop the distro so the NEXT `wsl -d` cold-boots it
125
+ // clean. This is the fix for the「引擎没起来」-on-fresh-install failure: a distro
126
+ // straight out of `wsl --import` is frequently half-initialized / unresponsive,
127
+ // so startEngine's first `wsl -d` command times out, dockerd never launches, and
128
+ // its log is never even created (exactly what we saw on a new Windows user). A
129
+ // terminate + cold boot makes that first real command hit a clean distro.
130
+ function wslTerminate() {
131
+ return new Promise((resolve) => {
132
+ execFile("wsl", ["--terminate", DISTRO], { timeout: 30000, windowsHide: true }, () => resolve());
133
+ });
134
+ }
135
+
124
136
  async function installDistro({ emit } = {}) {
125
137
  // 1) Download the PRE-BAKED rootfs (Ubuntu+Docker+image baked in, ~444MB) with
126
138
  // a real progress bar. curl is ~10× faster than node's downloader on OSS.
@@ -147,7 +159,13 @@ async function installDistro({ emit } = {}) {
147
159
  await ensureWslKernel({ emit });
148
160
  await importTarball(dest, installDir);
149
161
  }
150
- // 3) Free the ~444MB package now that the distro has everything.
162
+ // 3) Force a clean cold boot. A freshly-imported distro is often wedged, so the
163
+ // next `wsl -d` (startEngine) would time out → dockerd never starts. Terminate
164
+ // now so that first real command boots a clean distro instead.
165
+ emit && emit({ phase: "container", status: "running", message: "重置运行环境(冷启动)…" });
166
+ try { await wslTerminate(); } catch {}
167
+
168
+ // 4) Free the ~444MB package now that the distro has everything.
151
169
  try { fs.unlinkSync(dest); } catch {}
152
170
  }
153
171
 
@@ -195,6 +213,7 @@ async function startEngine() {
195
213
  // attempts we hard-kill any half-dead daemon so the next launch is clean.
196
214
  for (let attempt = 1; attempt <= 3; attempt++) {
197
215
  const at0 = Date.now();
216
+ let launchErr = null;
198
217
  log.info(`[startEngine] attempt ${attempt}/3 — (re)launch dockerd + wait for socket`);
199
218
  try {
200
219
  await wslRun(
@@ -213,17 +232,24 @@ async function startEngine() {
213
232
  // cold again (a restart loop → 「引擎没起来」even though dockerd was fine).
214
233
  "for i in $(seq 1 120); do [ -S /var/run/docker.sock ] && docker version >/dev/null 2>&1 && break; sleep 1; done",
215
234
  { timeout: 150000 });
216
- } catch (e) { log.warn(`[startEngine] attempt ${attempt} launch/wait errored: ${e.message}`); }
235
+ } catch (e) { launchErr = e; log.warn(`[startEngine] attempt ${attempt} launch/wait errored: ${e.message}`); }
217
236
  if (await dockerEngineUp()) { log.info(`[startEngine] ✓ dockerd up on attempt ${attempt} (${((Date.now() - at0) / 1000).toFixed(1)}s)`); return true; }
218
237
  log.warn(`[startEngine] attempt ${attempt} dockerd still not up after ${((Date.now() - at0) / 1000).toFixed(1)}s`);
219
- // Not up after the wait. Only hard-reset when dockerd actually DIED (crash) —
220
- // if it's still alive it's just slow/mid-init, so leave it and let the next
221
- // attempt's wait loop keep polling instead of killing a healthy daemon.
222
- try {
223
- await wslRun(
224
- "if ! pgrep dockerd >/dev/null 2>&1; then rm -f /var/run/docker.pid /run/docker.pid /var/run/docker.sock /run/docker.sock; fi; sleep 1",
225
- { timeout: 15000 });
226
- } catch {}
238
+ // Reset between attempts. If the launch itself ERRORED (timeout = WSL wedged /
239
+ // unresponsive the post-import failure where the command can't even get into
240
+ // the distro), `wsl --terminate` so the next attempt cold-boots a CLEAN distro;
241
+ // clearing pid files inside a wedged WSL does nothing. Otherwise dockerd just
242
+ // died/is slow — clear stale runtime files only when it's actually gone.
243
+ if (launchErr) {
244
+ log.info(`[startEngine] launch errored → wsl --terminate for a clean cold boot`);
245
+ try { await wslTerminate(); } catch {}
246
+ } else {
247
+ try {
248
+ await wslRun(
249
+ "if ! pgrep dockerd >/dev/null 2>&1; then rm -f /var/run/docker.pid /run/docker.pid /var/run/docker.sock /run/docker.sock; fi; sleep 1",
250
+ { timeout: 15000 });
251
+ } catch {}
252
+ }
227
253
  }
228
254
  log.error("[startEngine] ✗ dockerd NOT up after 3 attempts");
229
255
  return false;