[object Object]

← 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 →