nightshift-mcp 2.1.2 → 2.2.0

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.
@@ -56,4 +56,22 @@ export declare function ensureDaemonRunning(projectPath: string, options?: Omit<
56
56
  wasStarted: boolean;
57
57
  error?: string;
58
58
  }>;
59
+ /**
60
+ * Install a watchdog cron job that monitors the daemon and restarts it if the heartbeat goes stale.
61
+ * - Linux/Mac: adds a crontab entry (every 2 minutes)
62
+ * - Windows: creates a scheduled task (every 2 minutes)
63
+ *
64
+ * The watchdog is tagged with the project path so it can be identified and removed later.
65
+ */
66
+ export declare function installWatchdog(projectPath: string): {
67
+ success: boolean;
68
+ error?: string;
69
+ };
70
+ /**
71
+ * Remove the watchdog cron job for a project.
72
+ */
73
+ export declare function removeWatchdog(projectPath: string): {
74
+ success: boolean;
75
+ error?: string;
76
+ };
59
77
  //# sourceMappingURL=daemon-manager.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"daemon-manager.d.ts","sourceRoot":"","sources":["../src/daemon-manager.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAOH,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAE7D;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,YAAY,CAgDjE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAY7D;AAED,MAAM,WAAW,kBAAkB;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CA2LzF;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CA4CpF;AAED;;;GAGG;AACH,wBAAsB,mBAAmB,CACvC,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE,IAAI,CAAC,kBAAkB,EAAE,aAAa,CAAM,GACpD,OAAO,CAAC;IACT,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,OAAO,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC,CAgCD"}
1
+ {"version":3,"file":"daemon-manager.d.ts","sourceRoot":"","sources":["../src/daemon-manager.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAQH,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAE7D;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,YAAY,CAgDjE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAY7D;AAED,MAAM,WAAW,kBAAkB;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CA+LzF;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CA6CpF;AAED;;;GAGG;AACH,wBAAsB,mBAAmB,CACvC,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE,IAAI,CAAC,kBAAkB,EAAE,aAAa,CAAM,GACpD,OAAO,CAAC;IACT,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,OAAO,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC,CAgCD;AAqDD;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAsDzF;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAoCxF"}
@@ -6,8 +6,9 @@
6
6
  */
7
7
  import * as fs from "fs";
8
8
  import * as path from "path";
9
- import { spawnSync } from "child_process";
10
- import { isProcessRunning, killProcess } from "./platform.js";
9
+ import { spawnSync, execSync } from "child_process";
10
+ import { fileURLToPath } from "url";
11
+ import { isProcessRunning, isWindows, killProcess } from "./platform.js";
11
12
  /**
12
13
  * Get the daemon lock file path for a project
13
14
  */
@@ -115,6 +116,8 @@ export async function startDaemon(options) {
115
116
  const timestamp = Date.now();
116
117
  const logFile = path.join(robotChatDir, `daemon-${timestamp}.log`);
117
118
  const wrapperFile = path.join(robotChatDir, `daemon-starter-${timestamp}.mjs`);
119
+ const ownDistDir = path.dirname(fileURLToPath(import.meta.url));
120
+ const ownDaemonPath = path.join(ownDistDir, "daemon.js");
118
121
  // Find the daemon entry point
119
122
  // It could be installed globally or locally
120
123
  const daemonScript = `
@@ -129,6 +132,8 @@ const args = ${JSON.stringify(args)};
129
132
  // Try to find the daemon module
130
133
  // First check if nightshift-mcp is installed globally or locally
131
134
  const possiblePaths = [
135
+ // Package's own dist/ directory (most reliable)
136
+ ${JSON.stringify(ownDaemonPath)},
132
137
  // Local node_modules
133
138
  path.join(projectPath, "node_modules", "nightshift-mcp", "dist", "daemon.js"),
134
139
  // If we're running from within the nightshift-mcp package itself
@@ -287,8 +292,9 @@ export function stopDaemon(projectPath) {
287
292
  if (isProcessRunning(status.pid)) {
288
293
  killProcess(status.pid, true);
289
294
  }
290
- // Clean up lock file
295
+ // Clean up lock file and watchdog
291
296
  cleanupStaleLock(projectPath);
297
+ removeWatchdog(projectPath);
292
298
  return { success: true };
293
299
  }
294
300
  catch (err) {
@@ -330,4 +336,146 @@ export async function ensureDaemonRunning(projectPath, options = {}) {
330
336
  error: finalResult.error,
331
337
  };
332
338
  }
339
+ // ============================================
340
+ // Watchdog Cron
341
+ // ============================================
342
+ const WATCHDOG_TAG = "nightshift-watchdog";
343
+ /**
344
+ * Get a unique cron tag for this project (used to identify and clean up the entry)
345
+ */
346
+ function getWatchdogTag(projectPath) {
347
+ // Use a hash-like suffix from the project path to avoid collisions
348
+ const hash = projectPath.replace(/[^a-zA-Z0-9]/g, "").slice(-20);
349
+ return `${WATCHDOG_TAG}-${hash}`;
350
+ }
351
+ /**
352
+ * Build the watchdog shell command that checks heartbeat and restarts daemon if stale.
353
+ * This is a self-contained one-liner that runs via cron/schtasks.
354
+ */
355
+ function buildWatchdogCommand(projectPath) {
356
+ const heartbeatFile = path.join(projectPath, ".robot-chat", "daemon-heartbeat").replace(/\\/g, "/");
357
+ const lockFile = path.join(projectPath, ".robot-chat", "daemon.lock").replace(/\\/g, "/");
358
+ const ownDistDir = path.dirname(fileURLToPath(import.meta.url)).replace(/\\/g, "/");
359
+ const daemonJs = path.join(ownDistDir, "daemon.js").replace(/\\/g, "/");
360
+ if (isWindows) {
361
+ // PowerShell script for Windows schtasks
362
+ // Checks heartbeat age, restarts daemon if stale (>5 min) or missing
363
+ return `powershell -NoProfile -Command "` +
364
+ `$hb='${heartbeatFile}'; $lock='${lockFile}'; ` +
365
+ `if (Test-Path $lock) { ` +
366
+ `if (Test-Path $hb) { ` +
367
+ `$age=(New-TimeSpan (Get-Item $hb).LastWriteTime).TotalMinutes; ` +
368
+ `if ($age -gt 5) { node '${daemonJs}' --verbose } ` +
369
+ `} else { node '${daemonJs}' --verbose } ` +
370
+ `}"`;
371
+ }
372
+ // Unix: check heartbeat file age, restart daemon if stale (>300s) or lock exists without heartbeat
373
+ return `if [ -f "${lockFile}" ]; then ` +
374
+ `if [ -f "${heartbeatFile}" ]; then ` +
375
+ `age=$(( $(date +%s) - $(stat -c %Y "${heartbeatFile}" 2>/dev/null || stat -f %m "${heartbeatFile}" 2>/dev/null) )); ` +
376
+ `if [ "$age" -gt 300 ]; then ` +
377
+ `ROBOT_CHAT_PROJECT_PATH="${projectPath}" node "${daemonJs}" --verbose & ` +
378
+ `fi; ` +
379
+ `else ` +
380
+ `ROBOT_CHAT_PROJECT_PATH="${projectPath}" node "${daemonJs}" --verbose & ` +
381
+ `fi; ` +
382
+ `fi`;
383
+ }
384
+ /**
385
+ * Install a watchdog cron job that monitors the daemon and restarts it if the heartbeat goes stale.
386
+ * - Linux/Mac: adds a crontab entry (every 2 minutes)
387
+ * - Windows: creates a scheduled task (every 2 minutes)
388
+ *
389
+ * The watchdog is tagged with the project path so it can be identified and removed later.
390
+ */
391
+ export function installWatchdog(projectPath) {
392
+ const tag = getWatchdogTag(projectPath);
393
+ const command = buildWatchdogCommand(projectPath);
394
+ try {
395
+ if (isWindows) {
396
+ // Windows: use schtasks
397
+ const taskName = tag;
398
+ // Remove existing task if present (ignore errors)
399
+ try {
400
+ execSync(`schtasks /Delete /TN "${taskName}" /F`, {
401
+ stdio: "ignore",
402
+ windowsHide: true,
403
+ });
404
+ }
405
+ catch {
406
+ // Task didn't exist, that's fine
407
+ }
408
+ // Create scheduled task that runs every 2 minutes
409
+ execSync(`schtasks /Create /TN "${taskName}" /SC MINUTE /MO 2 /TR "${command}" /F`, { stdio: "ignore", windowsHide: true });
410
+ }
411
+ else {
412
+ // Unix: add crontab entry
413
+ let existingCrontab = "";
414
+ try {
415
+ existingCrontab = execSync("crontab -l 2>/dev/null", { encoding: "utf-8" });
416
+ }
417
+ catch {
418
+ // No existing crontab
419
+ }
420
+ // Remove any existing watchdog entry for this project
421
+ const lines = existingCrontab.split("\n").filter(line => !line.includes(tag));
422
+ // Add new entry (every 2 minutes)
423
+ lines.push(`*/2 * * * * ${command} # ${tag}`);
424
+ // Write back
425
+ const newCrontab = lines.filter(l => l.trim()).join("\n") + "\n";
426
+ execSync(`echo "${newCrontab.replace(/"/g, '\\"')}" | crontab -`, {
427
+ encoding: "utf-8",
428
+ stdio: ["pipe", "ignore", "ignore"],
429
+ });
430
+ }
431
+ return { success: true };
432
+ }
433
+ catch (err) {
434
+ return {
435
+ success: false,
436
+ error: `Failed to install watchdog: ${err instanceof Error ? err.message : String(err)}`,
437
+ };
438
+ }
439
+ }
440
+ /**
441
+ * Remove the watchdog cron job for a project.
442
+ */
443
+ export function removeWatchdog(projectPath) {
444
+ const tag = getWatchdogTag(projectPath);
445
+ try {
446
+ if (isWindows) {
447
+ try {
448
+ execSync(`schtasks /Delete /TN "${tag}" /F`, {
449
+ stdio: "ignore",
450
+ windowsHide: true,
451
+ });
452
+ }
453
+ catch {
454
+ // Task didn't exist
455
+ }
456
+ }
457
+ else {
458
+ let existingCrontab = "";
459
+ try {
460
+ existingCrontab = execSync("crontab -l 2>/dev/null", { encoding: "utf-8" });
461
+ }
462
+ catch {
463
+ return { success: true }; // No crontab at all
464
+ }
465
+ const lines = existingCrontab.split("\n").filter(line => !line.includes(tag));
466
+ const newCrontab = lines.filter(l => l.trim()).join("\n") + "\n";
467
+ execSync(`echo "${newCrontab.replace(/"/g, '\\"')}" | crontab -`, {
468
+ encoding: "utf-8",
469
+ stdio: ["pipe", "ignore", "ignore"],
470
+ });
471
+ }
472
+ return { success: true };
473
+ }
474
+ catch (err) {
475
+ return {
476
+ success: false,
477
+ error: `Failed to remove watchdog: ${err instanceof Error ? err.message : String(err)}`,
478
+ };
479
+ }
480
+ }
333
481
  //# sourceMappingURL=daemon-manager.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"daemon-manager.js","sourceRoot":"","sources":["../src/daemon-manager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"daemon-manager.js","sourceRoot":"","sources":["../src/daemon-manager.ts"],"names":[],"mappings":"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"}
package/dist/daemon.d.ts CHANGED
@@ -45,6 +45,7 @@ export declare class NightShiftDaemon {
45
45
  private log;
46
46
  private acquireLock;
47
47
  private releaseLock;
48
+ private writeHeartbeat;
48
49
  private startWatchers;
49
50
  private stopWatchers;
50
51
  private restartWatchers;
@@ -69,6 +70,8 @@ export declare class NightShiftDaemon {
69
70
  consecutiveFailures: number;
70
71
  }>;
71
72
  private reconcile;
73
+ private visionGenerationInProgress;
74
+ private checkVisionGeneration;
72
75
  private getNextAgent;
73
76
  private spawnAgentForStory;
74
77
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"daemon.d.ts","sourceRoot":"","sources":["../src/daemon.ts"],"names":[],"mappings":";AACA;;;;;GAKG;AASH,OAAO,EAKL,KAAK,SAAS,EACf,MAAM,oBAAoB,CAAC;AAS5B,UAAU,YAAY;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,gBAAgB,EAAE,MAAM,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;IAChB,eAAe,EAAE,MAAM,CAAC;IACxB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAmBD,KAAK,WAAW,GAAG,QAAQ,GAAG,MAAM,GAAG,WAAW,CAAC;AAiBnD,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,KAAK,CAAe;IAC5B,OAAO,CAAC,IAAI,CAAc;IAC1B,OAAO,CAAC,QAAQ,CAAkB;IAClC,OAAO,CAAC,EAAE,CAAe;IAGzB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,YAAY,CAAwC;IAC5D,OAAO,CAAC,WAAW,CAAsC;IACzD,OAAO,CAAC,WAAW,CAA+C;IAClE,OAAO,CAAC,eAAe,CAAmB;IAC1C,OAAO,CAAC,UAAU,CAAK;IAGvB,OAAO,CAAC,UAAU,CAA6B;IAC/C,OAAO,CAAC,WAAW,CAA6B;IAChD,OAAO,CAAC,eAAe,CAAQ;IAG/B,OAAO,CAAC,gBAAgB,CAA+B;IACvD,OAAO,CAAC,cAAc,CAA0C;IAGhE,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,MAAM,CAAuB;gBAEzB,MAAM,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG;QAAE,WAAW,EAAE,MAAM,CAAA;KAAE;IA0BnE,OAAO,CAAC,GAAG;IAwBX,OAAO,CAAC,WAAW;IAmCnB,OAAO,CAAC,WAAW;IAkBnB,OAAO,CAAC,aAAa;IAgCrB,OAAO,CAAC,YAAY;IAWpB,OAAO,CAAC,eAAe;IAMvB,OAAO,CAAC,QAAQ;YAkBF,YAAY;YAKZ,aAAa;YAwBb,cAAc;IA2B5B,OAAO,CAAC,kBAAkB;IAuB1B,OAAO,CAAC,kBAAkB;IAsC1B,OAAO,CAAC,kBAAkB;IAyB1B;;;OAGG;IACH,OAAO,CAAC,eAAe;IA0CvB,OAAO,CAAC,YAAY;IAOpB,OAAO,CAAC,gBAAgB;IAexB,gBAAgB,IAAI,MAAM,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,WAAW,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,mBAAmB,EAAE,MAAM,CAAA;KAAE,CAAC;YAiB9G,SAAS;IA6CvB,OAAO,CAAC,YAAY;YAQN,kBAAkB;IA4BhC;;;;OAIG;YACW,mBAAmB;IA+JjC;;OAEG;IACH,OAAO,CAAC,uBAAuB;IA+B/B;;OAEG;YACW,wBAAwB;IAkEtC,OAAO,CAAC,gBAAgB;IAgCxB,OAAO,CAAC,YAAY;YAaN,WAAW;IA2CzB,OAAO,CAAC,cAAc;IAmBtB,OAAO,CAAC,aAAa;IAQrB,OAAO,CAAC,gBAAgB;IAUxB,OAAO,CAAC,eAAe;YAOT,WAAW;IAgDnB,KAAK;IA0CL,QAAQ;CAuBf"}
1
+ {"version":3,"file":"daemon.d.ts","sourceRoot":"","sources":["../src/daemon.ts"],"names":[],"mappings":";AACA;;;;;GAKG;AASH,OAAO,EAKL,KAAK,SAAS,EACf,MAAM,oBAAoB,CAAC;AAU5B,UAAU,YAAY;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,gBAAgB,EAAE,MAAM,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;IAChB,eAAe,EAAE,MAAM,CAAC;IACxB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAmBD,KAAK,WAAW,GAAG,QAAQ,GAAG,MAAM,GAAG,WAAW,CAAC;AAiBnD,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,KAAK,CAAe;IAC5B,OAAO,CAAC,IAAI,CAAc;IAC1B,OAAO,CAAC,QAAQ,CAAkB;IAClC,OAAO,CAAC,EAAE,CAAe;IAGzB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,YAAY,CAAwC;IAC5D,OAAO,CAAC,WAAW,CAAsC;IACzD,OAAO,CAAC,WAAW,CAA+C;IAClE,OAAO,CAAC,eAAe,CAAmB;IAC1C,OAAO,CAAC,UAAU,CAAK;IAGvB,OAAO,CAAC,UAAU,CAA6B;IAC/C,OAAO,CAAC,WAAW,CAA6B;IAChD,OAAO,CAAC,eAAe,CAAQ;IAG/B,OAAO,CAAC,gBAAgB,CAA+B;IACvD,OAAO,CAAC,cAAc,CAA0C;IAGhE,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,MAAM,CAAuB;gBAEzB,MAAM,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG;QAAE,WAAW,EAAE,MAAM,CAAA;KAAE;IA0BnE,OAAO,CAAC,GAAG;IAwBX,OAAO,CAAC,WAAW;IAmCnB,OAAO,CAAC,WAAW;IAcnB,OAAO,CAAC,cAAc;IAoBtB,OAAO,CAAC,aAAa;IAgCrB,OAAO,CAAC,YAAY;IAWpB,OAAO,CAAC,eAAe;IAMvB,OAAO,CAAC,QAAQ;YAkBF,YAAY;YAKZ,aAAa;YAwBb,cAAc;IA2B5B,OAAO,CAAC,kBAAkB;IAuB1B,OAAO,CAAC,kBAAkB;IAsC1B,OAAO,CAAC,kBAAkB;IAyB1B;;;OAGG;IACH,OAAO,CAAC,eAAe;IA0CvB,OAAO,CAAC,YAAY;IAOpB,OAAO,CAAC,gBAAgB;IAexB,gBAAgB,IAAI,MAAM,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,WAAW,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,mBAAmB,EAAE,MAAM,CAAA;KAAE,CAAC;YAiB9G,SAAS;IAqEvB,OAAO,CAAC,0BAA0B,CAAS;YAE7B,qBAAqB;IAwBnC,OAAO,CAAC,YAAY;YAQN,kBAAkB;IA4BhC;;;;OAIG;YACW,mBAAmB;IA+JjC;;OAEG;IACH,OAAO,CAAC,uBAAuB;IA+B/B;;OAEG;YACW,wBAAwB;IAkEtC,OAAO,CAAC,gBAAgB;IAgCxB,OAAO,CAAC,YAAY;YAaN,WAAW;IA2CzB,OAAO,CAAC,cAAc;IAmBtB,OAAO,CAAC,aAAa;IAQrB,OAAO,CAAC,gBAAgB;IAUxB,OAAO,CAAC,eAAe;YAOT,WAAW;IAiDnB,KAAK;IAoDL,QAAQ;CAyBf"}
package/dist/daemon.js CHANGED
@@ -15,6 +15,7 @@ import { spawnAgent, spawnAgentBackground, getAvailableAgents, } from "./agent-s
15
15
  import { killProcess, isProcessRunning, getNightshiftCliCommand } from "./platform.js";
16
16
  import { NightShiftDB } from "./database.js";
17
17
  import { resolveExecutablePipeline } from "./pipeline.js";
18
+ import { checkVisionThreshold } from "./vision.js";
18
19
  // ============================================
19
20
  // Daemon Class
20
21
  // ============================================
@@ -132,6 +133,22 @@ export class NightShiftDaemon {
132
133
  // Ignore cleanup errors
133
134
  }
134
135
  }
136
+ writeHeartbeat(status = "alive") {
137
+ try {
138
+ const heartbeatFile = path.join(this.config.projectPath, ".robot-chat", "daemon-heartbeat");
139
+ const data = JSON.stringify({
140
+ pid: process.pid,
141
+ timestamp: new Date().toISOString(),
142
+ status,
143
+ activeAgents: this.activeAgents.size,
144
+ availableAgents: this.availableAgents,
145
+ });
146
+ fs.writeFileSync(heartbeatFile, data, "utf-8");
147
+ }
148
+ catch {
149
+ // Ignore heartbeat write errors
150
+ }
151
+ }
135
152
  // ============================================
136
153
  // File Watchers
137
154
  // ============================================
@@ -409,14 +426,34 @@ export class NightShiftDaemon {
409
426
  const activeCount = this.activeAgents.size;
410
427
  // Check if all complete
411
428
  if (incomplete.length === 0) {
412
- this.log("info", "🎉 All stories complete!");
429
+ // Before shutting down, check if vision auto-generation can create more work
430
+ const generated = await this.checkVisionGeneration();
431
+ if (generated) {
432
+ // New stories were added — re-reconcile to pick them up
433
+ await this.reconcile();
434
+ return;
435
+ }
436
+ this.log("info", "All stories complete!");
437
+ this.chat.writeMessage({
438
+ agent: "NightShift",
439
+ type: "READY_TO_TEST",
440
+ content: "All stories complete. Daemon shutting down.",
441
+ });
413
442
  await this.shutdown();
414
443
  return;
415
444
  }
416
- // Find orphaned stories (incomplete but not assigned)
445
+ // Check vision threshold — generate more stories if running low
446
+ // (only for non-empty states; the all-complete case is handled above)
447
+ const workableIncomplete = incomplete.filter(s => !s.tags?.includes("pending_approval"));
448
+ if (workableIncomplete.length > 0 && workableIncomplete.length < 5) {
449
+ // Don't block reconciliation — run vision check in background
450
+ this.checkVisionGeneration().catch(err => this.log("error", "Vision generation failed", { error: String(err) }));
451
+ }
452
+ // Find orphaned stories (incomplete, not assigned, not pending approval)
417
453
  const assignedIds = new Set(this.activeAgents.keys());
418
454
  const orphaned = incomplete.filter(s => !assignedIds.has(s.id) &&
419
- !this.isQuarantined(s.id));
455
+ !this.isQuarantined(s.id) &&
456
+ !s.tags?.includes("pending_approval"));
420
457
  // Spawn agents for orphaned stories up to concurrency limit
421
458
  const slotsAvailable = this.config.maxConcurrentAgents - activeCount;
422
459
  const toSpawn = orphaned.slice(0, slotsAvailable);
@@ -427,6 +464,26 @@ export class NightShiftDaemon {
427
464
  this.log("info", `Status: ${incomplete.length} incomplete, ${activeCount} active, ${orphaned.length} orphaned`);
428
465
  }
429
466
  // ============================================
467
+ // Vision Auto-Generation
468
+ // ============================================
469
+ visionGenerationInProgress = false;
470
+ async checkVisionGeneration() {
471
+ // Prevent concurrent generation
472
+ if (this.visionGenerationInProgress)
473
+ return false;
474
+ this.visionGenerationInProgress = true;
475
+ try {
476
+ const generated = await checkVisionThreshold(this.config.projectPath, this.ralph, this.chat);
477
+ if (generated) {
478
+ this.log("info", "Vision auto-generation added new stories to PRD");
479
+ }
480
+ return generated;
481
+ }
482
+ finally {
483
+ this.visionGenerationInProgress = false;
484
+ }
485
+ }
486
+ // ============================================
430
487
  // Agent Management
431
488
  // ============================================
432
489
  getNextAgent() {
@@ -826,6 +883,7 @@ ${progress ? progress.substring(0, 2000) : "No progress file yet."}
826
883
  }
827
884
  // 4. Reconcile state
828
885
  await this.reconcile();
886
+ this.writeHeartbeat();
829
887
  }
830
888
  // ============================================
831
889
  // Lifecycle
@@ -837,11 +895,21 @@ ${progress ? progress.substring(0, 2000) : "No progress file yet."}
837
895
  this.log("error", "Could not acquire lock - another daemon may be running");
838
896
  process.exit(1);
839
897
  }
840
- // Check available agents
841
- this.availableAgents = await getAvailableAgents();
842
- const configuredAgents = this.config.agents.filter(a => this.availableAgents.includes(a));
898
+ // Check available agents (retry for detached process context where PATH may propagate slowly)
899
+ let configuredAgents = [];
900
+ for (let attempt = 1; attempt <= 3; attempt++) {
901
+ this.availableAgents = await getAvailableAgents();
902
+ configuredAgents = this.config.agents.filter(a => this.availableAgents.includes(a));
903
+ if (configuredAgents.length > 0)
904
+ break;
905
+ this.log("warn", `No agents found on attempt ${attempt}/3, retrying in 5s...`);
906
+ if (attempt < 3) {
907
+ await new Promise(resolve => setTimeout(resolve, 5000));
908
+ }
909
+ }
843
910
  if (configuredAgents.length === 0) {
844
- this.log("error", "No configured agents are available");
911
+ this.log("error", "No configured agents are available after 3 attempts");
912
+ this.releaseLock();
845
913
  process.exit(1);
846
914
  }
847
915
  this.availableAgents = configuredAgents;
@@ -854,6 +922,7 @@ ${progress ? progress.substring(0, 2000) : "No progress file yet."}
854
922
  // Start health check (fallback)
855
923
  this.startHealthCheck();
856
924
  this.log("info", "Daemon started successfully");
925
+ this.writeHeartbeat();
857
926
  this.log("info", `Health check interval: ${this.config.healthCheckInterval / 1000}s`);
858
927
  this.log("info", `Max concurrent agents: ${this.config.maxConcurrentAgents}`);
859
928
  // Initial reconciliation
@@ -870,6 +939,7 @@ ${progress ? progress.substring(0, 2000) : "No progress file yet."}
870
939
  this.debounceTimers.clear();
871
940
  // Stop watchers
872
941
  this.stopWatchers();
942
+ this.writeHeartbeat("shutdown");
873
943
  // Release lock
874
944
  this.releaseLock();
875
945
  // Close database
@@ -882,6 +952,16 @@ ${progress ? progress.substring(0, 2000) : "No progress file yet."}
882
952
  // CLI Entry Point
883
953
  // ============================================
884
954
  async function main() {
955
+ // Global crash handlers — ensure failures are NEVER silent
956
+ process.on("uncaughtException", (err) => {
957
+ console.error(`[${new Date().toISOString()}] UNCAUGHT EXCEPTION:`, err);
958
+ process.exit(1);
959
+ });
960
+ process.on("unhandledRejection", (reason) => {
961
+ console.error(`[${new Date().toISOString()}] UNHANDLED REJECTION:`, reason);
962
+ process.exit(1);
963
+ });
964
+ console.log(`[${new Date().toISOString()}] NightShift daemon process starting (PID: ${process.pid})`);
885
965
  const args = process.argv.slice(2);
886
966
  // Parse arguments
887
967
  const projectPath = process.env.ROBOT_CHAT_PROJECT_PATH || process.cwd();
@@ -930,6 +1010,7 @@ Environment:
930
1010
  process.exit(0);
931
1011
  }
932
1012
  }
1013
+ console.log(`[${new Date().toISOString()}] Config: project=${projectPath} verbose=${verbose} dryRun=${dryRun} maxAgents=${maxConcurrentAgents} healthCheck=${healthCheckInterval}ms`);
933
1014
  const daemon = new NightShiftDaemon({
934
1015
  projectPath,
935
1016
  verbose,
@@ -942,11 +1023,25 @@ Environment:
942
1023
  setInterval(() => { }, 30000);
943
1024
  }
944
1025
  // Run if executed directly
1026
+ // NOTE: npm bin shims are symlinks, so process.argv[1] (symlink) won't match
1027
+ // import.meta.url (real path after resolution). We must resolve both through
1028
+ // symlinks before comparing.
945
1029
  const normalizedImportPath = fileURLToPath(import.meta.url).replace(/\\/g, "/");
946
- const normalizedArgvPath = process.argv[1]
1030
+ let normalizedArgvPath = process.argv[1]
947
1031
  ? path.resolve(process.argv[1]).replace(/\\/g, "/")
948
1032
  : "";
949
- const isMain = normalizedImportPath === normalizedArgvPath;
1033
+ // Resolve symlinks so npx/npm bin shim paths match the real file
1034
+ let resolvedArgvPath = "";
1035
+ try {
1036
+ if (process.argv[1]) {
1037
+ resolvedArgvPath = fs.realpathSync(path.resolve(process.argv[1])).replace(/\\/g, "/");
1038
+ }
1039
+ }
1040
+ catch {
1041
+ // realpathSync can fail if path doesn't exist; ignore
1042
+ }
1043
+ const isMain = normalizedImportPath === normalizedArgvPath ||
1044
+ normalizedImportPath === resolvedArgvPath;
950
1045
  if (isMain) {
951
1046
  main().catch((err) => {
952
1047
  console.error("Fatal error:", err);