




















@@ -5,7 +5,7 @@ import fs from "node:fs";
55import path from "node:path";
66import process from "node:process";
77import { pathToFileURL } from "node:url";
8-import { isRestartRelevantRunNodePath, runNodeWatchedPaths } from "./run-node.mjs";
8+import { isRestartRelevantRunNodePath, runNodeWatchedPaths } from "./run-node-watch-paths.mjs";
991010const WATCH_NODE_RUNNER = "scripts/run-node.mjs";
1111const WATCH_RESTART_SIGNAL = "SIGTERM";
@@ -255,19 +255,6 @@ const releaseWatchLock = (lockHandle) => {
255255 * }} [params]
256256 */
257257export async function runWatchMain(params = {}) {
258-let createWatcher = params.createWatcher;
259-if (!createWatcher) {
260-try {
261-const chokidarModule = await (params.loadChokidar ?? loadChokidar)();
262-createWatcher = (watchPaths, options) => chokidarModule.watch(watchPaths, options);
263-} catch (err) {
264-if (isInvalidPackageConfigError(err)) {
265-printFriendlyWatchStartupError(err);
266-}
267-throw err;
268-}
269-}
270-271258const deps = {
272259spawn: params.spawn ?? spawn,
273260process: params.process ?? process,
@@ -278,7 +265,8 @@ export async function runWatchMain(params = {}) {
278265sleep: params.sleep ?? sleep,
279266signalProcess: params.signalProcess ?? ((pid, signal) => process.kill(pid, signal)),
280267lockDisabled: params.lockDisabled === true,
281- createWatcher,
268+createWatcher: params.createWatcher,
269+loadChokidar: params.loadChokidar ?? loadChokidar,
282270watchPaths: params.watchPaths ?? runNodeWatchedPaths,
283271};
284272@@ -293,7 +281,7 @@ export async function runWatchMain(params = {}) {
293281childEnv.OPENCLAW_WATCH_COMMAND = deps.args.join(" ");
294282}
295283296-return await new Promise((resolve) => {
284+return await new Promise((resolve, reject) => {
297285let settled = false;
298286let shuttingDown = false;
299287let restartRequested = false;
@@ -357,6 +345,38 @@ export async function runWatchMain(params = {}) {
357345settle(1);
358346};
359347348+const rejectWatcherStartupError = (err) => {
349+if (settled) {
350+return;
351+}
352+settled = true;
353+shuttingDown = true;
354+if (watchProcess && typeof watchProcess.kill === "function") {
355+watchProcess.kill(WATCH_RESTART_SIGNAL);
356+}
357+releaseWatchLock(lockHandle);
358+watcher?.close?.().catch?.(() => {});
359+if (onSigInt) {
360+deps.process.off("SIGINT", onSigInt);
361+}
362+if (onSigTerm) {
363+deps.process.off("SIGTERM", onSigTerm);
364+}
365+reject(err);
366+};
367+368+const resolveCreateWatcher = async () => {
369+try {
370+const chokidarModule = await deps.loadChokidar();
371+return (watchPaths, options) => chokidarModule.watch(watchPaths, options);
372+} catch (err) {
373+if (isInvalidPackageConfigError(err)) {
374+printFriendlyWatchStartupError(err);
375+}
376+throw err;
377+}
378+};
379+360380const runAutoDoctorAndRestart = () => {
361381autoDoctorAttempted = true;
362382logWatcher(
@@ -405,8 +425,11 @@ export async function runWatchMain(params = {}) {
405425}
406426};
407427408-const startWatcher = () => {
409-watcher = deps.createWatcher(deps.watchPaths, {
428+const attachWatcher = (createWatcher) => {
429+if (settled) {
430+return;
431+}
432+watcher = createWatcher(deps.watchPaths, {
410433ignoreInitial: true,
411434ignored: (watchPath, stats) =>
412435isIgnoredWatchPath(watchPath, deps.cwd, deps.watchPaths, stats),
@@ -417,6 +440,14 @@ export async function runWatchMain(params = {}) {
417440watcher.on("error", handleWatcherError);
418441};
419442443+const startWatcher = () => {
444+if (deps.createWatcher) {
445+attachWatcher(deps.createWatcher);
446+return;
447+}
448+void resolveCreateWatcher().then(attachWatcher).catch(rejectWatcherStartupError);
449+};
450+420451onSigInt = () => {
421452shuttingDown = true;
422453if (watchProcess && typeof watchProcess.kill === "function") {
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。