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.
- package/README.md +364 -379
- package/dist/daemon-manager.d.ts +18 -0
- package/dist/daemon-manager.d.ts.map +1 -1
- package/dist/daemon-manager.js +151 -3
- package/dist/daemon-manager.js.map +1 -1
- package/dist/daemon.d.ts +3 -0
- package/dist/daemon.d.ts.map +1 -1
- package/dist/daemon.js +104 -9
- package/dist/daemon.js.map +1 -1
- package/dist/orchestrator.d.ts.map +1 -1
- package/dist/orchestrator.js +5 -3
- package/dist/orchestrator.js.map +1 -1
- package/dist/tools/agents.d.ts.map +1 -1
- package/dist/tools/agents.js +8 -5
- package/dist/tools/agents.js.map +1 -1
- package/dist/tools/prd.d.ts +2 -0
- package/dist/tools/prd.d.ts.map +1 -1
- package/dist/tools/prd.js +120 -0
- package/dist/tools/prd.js.map +1 -1
- package/dist/vision.d.ts +67 -0
- package/dist/vision.d.ts.map +1 -0
- package/dist/vision.js +315 -0
- package/dist/vision.js.map +1 -0
- package/package.json +1 -1
package/dist/daemon-manager.d.ts
CHANGED
|
@@ -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;
|
|
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"}
|
package/dist/daemon-manager.js
CHANGED
|
@@ -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 {
|
|
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":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC1C,OAAO,EAAE,gBAAgB,EAAa,WAAW,EAAE,MAAM,eAAe,CAAC;AAUzE;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,WAAmB;IACnD,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,aAAa,EAAE,aAAa,CAAC,CAAC;AAC9D,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,WAAmB;IACjD,MAAM,QAAQ,GAAG,iBAAiB,CAAC,WAAW,CAAC,CAAC;IAEhD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7B,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IAC5B,CAAC;IAED,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;QAC1D,MAAM,GAAG,GAAG,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QAElC,IAAI,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;YACf,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,QAAQ;gBACR,KAAK,EAAE,0BAA0B;aAClC,CAAC;QACJ,CAAC;QAED,MAAM,OAAO,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC;QAEtC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,oCAAoC;YACpC,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,GAAG;gBACH,QAAQ;gBACR,KAAK,EAAE,uCAAuC;aAC/C,CAAC;QACJ,CAAC;QAED,kDAAkD;QAClD,MAAM,KAAK,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACpC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC;QAE/D,OAAO;YACL,OAAO,EAAE,IAAI;YACb,GAAG;YACH,QAAQ;YACR,MAAM;SACP,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO;YACL,OAAO,EAAE,KAAK;YACd,QAAQ;YACR,KAAK,EAAE,4BAA4B,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE;SACtF,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,WAAmB;IAClD,MAAM,QAAQ,GAAG,iBAAiB,CAAC,WAAW,CAAC,CAAC;IAEhD,IAAI,CAAC;QACH,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC5B,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;YACxB,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAgBD;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,OAA2B;IAC3D,MAAM,EAAE,WAAW,EAAE,OAAO,GAAG,KAAK,EAAE,SAAS,GAAG,CAAC,EAAE,mBAAmB,GAAG,IAAI,EAAE,GAAG,OAAO,CAAC;IAE5F,2BAA2B;IAC3B,MAAM,MAAM,GAAG,eAAe,CAAC,WAAW,CAAC,CAAC;IAC5C,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,OAAO;YACL,OAAO,EAAE,IAAI;YACb,GAAG,EAAE,MAAM,CAAC,GAAG;YACf,cAAc,EAAE,IAAI;SACrB,CAAC;IACJ,CAAC;IAED,gCAAgC;IAChC,IAAI,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QACpC,gBAAgB,CAAC,WAAW,CAAC,CAAC;IAChC,CAAC;IAED,sCAAsC;IACtC,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;IAC3D,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QACjC,EAAE,CAAC,SAAS,CAAC,YAAY,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAClD,CAAC;IAED,yBAAyB;IACzB,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,IAAI,OAAO,EAAE,CAAC;QACZ,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACzB,CAAC;IACD,IAAI,SAAS,EAAE,CAAC;QACd,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;IAC/C,CAAC;IACD,IAAI,mBAAmB,EAAE,CAAC;QACxB,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,mBAAmB,CAAC,CAAC;IACnD,CAAC;IAED,iDAAiD;IACjD,kDAAkD;IAClD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC7B,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,UAAU,SAAS,MAAM,CAAC,CAAC;IACnE,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,kBAAkB,SAAS,MAAM,CAAC,CAAC;IAE/E,8BAA8B;IAC9B,4CAA4C;IAC5C,MAAM,YAAY,GAAG;;;;;sBAKD,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC;kBAC/B,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;eAC1B,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8DlC,CAAC;IAEA,IAAI,CAAC;QACH,2BAA2B;QAC3B,EAAE,CAAC,aAAa,CAAC,WAAW,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC;QAErD,0CAA0C;QAC1C,oFAAoF;QACpF,oFAAoF;QACpF,2FAA2F;QAC3F,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,WAAW,CAAC,EAAE;YAC9C,GAAG,EAAE,WAAW;YAChB,GAAG,EAAE;gBACH,GAAG,OAAO,CAAC,GAAG;gBACd,uBAAuB,EAAE,WAAW;aACrC;YACD,QAAQ,EAAE,OAAO;YACjB,WAAW,EAAE,IAAI;SAClB,CAAC,CAAC;QAEH,0BAA0B;QAC1B,IAAI,CAAC;YACH,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;QAC7B,CAAC;QAAC,MAAM,CAAC;YACP,wBAAwB;QAC1B,CAAC;QAED,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YACjB,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,2BAA2B,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE;aACzD,CAAC;QACJ,CAAC;QAED,0BAA0B;QAC1B,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC;YACrC,IAAI,MAAM,EAAE,CAAC;gBACX,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;gBAClC,IAAI,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,GAAG,EAAE,CAAC;oBACjC,OAAO;wBACL,OAAO,EAAE,IAAI;wBACb,GAAG,EAAE,MAAM,CAAC,GAAG;qBAChB,CAAC;gBACJ,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,6DAA6D;QAC/D,CAAC;QAED,kEAAkE;QAClE,6DAA6D;QAC7D,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,CAAC,EAAE,OAAO,EAAE,EAAE,CAAC;YAC7C,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;YACzD,MAAM,SAAS,GAAG,eAAe,CAAC,WAAW,CAAC,CAAC;YAC/C,IAAI,SAAS,CAAC,OAAO,EAAE,CAAC;gBACtB,OAAO;oBACL,OAAO,EAAE,IAAI;oBACb,GAAG,EAAE,SAAS,CAAC,GAAG;iBACnB,CAAC;YACJ,CAAC;QACH,CAAC;QAED,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,wDAAwD;SAChE,CAAC;IAEJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,0BAA0B,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE;SACpF,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,WAAmB;IAC5C,MAAM,MAAM,GAAG,eAAe,CAAC,WAAW,CAAC,CAAC;IAE5C,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,iCAAiC;QACjC,IAAI,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;YACtD,gBAAgB,CAAC,WAAW,CAAC,CAAC;QAChC,CAAC;QACD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC3B,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;QAChB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC;IACnD,CAAC;IAED,IAAI,CAAC;QACH,wEAAwE;QACxE,WAAW,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAE/B,qCAAqC;QACrC,IAAI,QAAQ,GAAG,CAAC,CAAC;QACjB,OAAO,QAAQ,GAAG,EAAE,IAAI,gBAAgB,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;YACrD,kCAAkC;YAClC,MAAM,MAAM,GAAG,IAAI,iBAAiB,CAAC,CAAC,CAAC,CAAC;YACxC,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC;YACpC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;YAC9B,QAAQ,EAAE,CAAC;QACb,CAAC;QAED,8BAA8B;QAC9B,IAAI,gBAAgB,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;YACjC,WAAW,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAChC,CAAC;QAED,qBAAqB;QACrB,gBAAgB,CAAC,WAAW,CAAC,CAAC;QAE9B,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC3B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,0BAA0B,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE;SACpF,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,WAAmB,EACnB,UAAmD,EAAE;IAOrD,MAAM,MAAM,GAAG,eAAe,CAAC,WAAW,CAAC,CAAC;IAE5C,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,OAAO;YACL,OAAO,EAAE,IAAI;YACb,GAAG,EAAE,MAAM,CAAC,GAAG;YACf,UAAU,EAAE,KAAK;SAClB,CAAC;IACJ,CAAC;IAED,gCAAgC;IAChC,IAAI,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QACpC,gBAAgB,CAAC,WAAW,CAAC,CAAC;IAChC,CAAC;IAED,mBAAmB;IACnB,MAAM,WAAW,GAAG,MAAM,WAAW,CAAC,EAAE,WAAW,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC;IAEnE,IAAI,WAAW,CAAC,OAAO,EAAE,CAAC;QACxB,OAAO;YACL,OAAO,EAAE,IAAI;YACb,GAAG,EAAE,WAAW,CAAC,GAAG;YACpB,UAAU,EAAE,CAAC,WAAW,CAAC,cAAc;SACxC,CAAC;IACJ,CAAC;IAED,OAAO;QACL,OAAO,EAAE,KAAK;QACd,UAAU,EAAE,KAAK;QACjB,KAAK,EAAE,WAAW,CAAC,KAAK;KACzB,CAAC;AACJ,CAAC"}
|
|
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
|
/**
|
package/dist/daemon.d.ts.map
CHANGED
|
@@ -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;
|
|
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
|
-
|
|
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
|
-
//
|
|
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
|
-
|
|
842
|
-
|
|
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
|
-
|
|
1030
|
+
let normalizedArgvPath = process.argv[1]
|
|
947
1031
|
? path.resolve(process.argv[1]).replace(/\\/g, "/")
|
|
948
1032
|
: "";
|
|
949
|
-
|
|
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);
|