← back to George Gmail
Fleet auto-responder: --daemon self-scheduling mode (pm2-managed, 3-min interval); UI on port 9768
e9fdf0f47feb966fdf5ece533879d0870ab04f5c · 2026-05-19 10:27:55 -0700 · Steve Abrams
Files touched
Diff
commit e9fdf0f47feb966fdf5ece533879d0870ab04f5c
Author: Steve Abrams <steve@designerwallcoverings.com>
Date: Tue May 19 10:27:55 2026 -0700
Fleet auto-responder: --daemon self-scheduling mode (pm2-managed, 3-min interval); UI on port 9768
---
fleet-autoresponder.js | 29 ++++++++++++++++++++++++++++-
1 file changed, 28 insertions(+), 1 deletion(-)
diff --git a/fleet-autoresponder.js b/fleet-autoresponder.js
index 8b8cafd..bee0f74 100644
--- a/fleet-autoresponder.js
+++ b/fleet-autoresponder.js
@@ -541,8 +541,35 @@ async function main() {
return results;
}
+// ─────────────────────────────────────────────────────────────────────────────
+// Daemon mode — `--daemon` keeps the process alive and runs main() on an
+// internal interval. This is the pm2-managed schedule: pm2 keeps the process
+// `online`, the process self-schedules. (pm2 cron_restart can't restart a
+// short-lived process that has already exited, so a long-lived loop is used.)
+// FLEET_INTERVAL_MS overrides the default 3-minute cadence.
+// ─────────────────────────────────────────────────────────────────────────────
+async function daemon() {
+ const intervalMs = parseInt(process.env.FLEET_INTERVAL_MS || String(3 * 60 * 1000), 10);
+ console.log(new Date().toISOString(),
+ `[fleet-autoresponder] daemon mode — running every ${Math.round(intervalMs / 1000)}s`);
+ let running = false;
+ const tick = async () => {
+ if (running) return; // never overlap runs
+ running = true;
+ try { await main(); }
+ catch (e) { console.error(new Date().toISOString(), '[fleet-autoresponder] tick error', e.message); }
+ finally { running = false; }
+ };
+ await tick(); // run immediately on boot
+ setInterval(tick, intervalMs); // …then every interval
+}
+
if (require.main === module) {
- main().catch(e => { console.error('[fleet-autoresponder] FATAL', e); process.exit(1); });
+ if (process.argv.includes('--daemon')) {
+ daemon();
+ } else {
+ main().catch(e => { console.error('[fleet-autoresponder] FATAL', e); process.exit(1); });
+ }
}
module.exports = {
main, recoverFleetDomain, safetyGate, buildReply, signoffName,
← 9c7a470 fleet-autoresponder UI: move port 9766→9768 (9766 reserved f
·
back to George Gmail
·
Fleet auto-responder: fix scan query (bare deliveredto:steve 2f343b5 →