@inetafrica/open-claudia 1.2.4 → 1.2.5

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.
Files changed (2) hide show
  1. package/bot.js +9 -40
  2. package/package.json +1 -1
package/bot.js CHANGED
@@ -7,44 +7,9 @@ const cron = require("node-cron");
7
7
  const Vault = require("./vault");
8
8
  const CONFIG_DIR = require("./config-dir");
9
9
 
10
- // ── Single instance lock ───────────────────────────────────────────
11
- const LOCK_FILE = path.join(CONFIG_DIR, "bot.lock");
12
-
13
- function acquireLock() {
14
- // Check if another instance is running
15
- if (fs.existsSync(LOCK_FILE)) {
16
- try {
17
- const pid = parseInt(fs.readFileSync(LOCK_FILE, "utf-8").trim(), 10);
18
- // Check if that PID is still alive
19
- process.kill(pid, 0); // throws if process doesn't exist
20
- console.error(`Another instance is running (PID ${pid}). Exiting.`);
21
- process.exit(1);
22
- } catch (e) {
23
- if (e.code === "ESRCH") {
24
- // Process is dead, stale lock — take over
25
- } else if (e.code === "EPERM") {
26
- // Process exists but we can't signal it
27
- console.error("Another instance is running. Exiting.");
28
- process.exit(1);
29
- } else {
30
- // Lock file is corrupt or unreadable — take over
31
- }
32
- }
33
- }
34
- fs.writeFileSync(LOCK_FILE, String(process.pid));
35
- }
36
-
37
- function releaseLock() {
38
- try {
39
- const pid = fs.readFileSync(LOCK_FILE, "utf-8").trim();
40
- if (pid === String(process.pid)) fs.unlinkSync(LOCK_FILE);
41
- } catch (e) {}
42
- }
43
-
44
- acquireLock();
45
- process.on("exit", releaseLock);
46
- process.on("SIGINT", () => { releaseLock(); process.exit(0); });
47
- process.on("SIGTERM", () => { releaseLock(); process.exit(0); });
10
+ // ── Graceful shutdown ──────────────────────────────────────────────
11
+ process.on("SIGINT", () => process.exit(0));
12
+ process.on("SIGTERM", () => process.exit(0));
48
13
 
49
14
  // ── Load Config from .env ───────────────────────────────────────────
50
15
  function loadEnv() {
@@ -112,6 +77,11 @@ let reconnectTimer = null;
112
77
  bot.on("polling_error", (err) => {
113
78
  const msg = err.message || "";
114
79
  console.error("Polling error:", msg);
80
+ // Another instance is already running — exit immediately
81
+ if (msg.includes("409 Conflict")) {
82
+ console.error("Another instance is polling. Exiting.");
83
+ process.exit(1);
84
+ }
115
85
  if (msg.includes("ETIMEDOUT") || msg.includes("ECONNRESET") || msg.includes("ENOTFOUND") || msg.includes("EFATAL")) {
116
86
  if (reconnectTimer) return; // Already scheduled
117
87
  console.log("Network lost. Reconnecting in 10s...");
@@ -830,8 +800,7 @@ bot.onText(/\/version$/, (msg) => {
830
800
  bot.onText(/\/restart$/, async (msg) => {
831
801
  if (!isOwner(msg)) return;
832
802
  await send("Going offline for a quick restart — back in a moment.");
833
- releaseLock();
834
- setTimeout(() => process.exit(0), 500);
803
+ setTimeout(() => process.exit(0), 1000);
835
804
  });
836
805
 
837
806
  bot.onText(/\/upgrade$/, async (msg) => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@inetafrica/open-claudia",
3
- "version": "1.2.4",
3
+ "version": "1.2.5",
4
4
  "description": "Your always-on AI coding assistant — Claude Code via Telegram",
5
5
  "main": "bot.js",
6
6
  "bin": {