grepmax 0.15.2 → 0.15.3

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.
@@ -97,6 +97,7 @@ class Daemon {
97
97
  this.lastOverflowMs = new Map();
98
98
  this.lastCatchupEndMs = new Map();
99
99
  this.projectLocks = new Map();
100
+ this.shutdownAbortControllers = new Set();
100
101
  this.llmServer = null;
101
102
  this.mlxChild = null;
102
103
  }
@@ -659,6 +660,7 @@ class Daemon {
659
660
  }
660
661
  const ac = new AbortController();
661
662
  conn.on("close", () => ac.abort());
663
+ this.shutdownAbortControllers.add(ac);
662
664
  this.vectorDb.pauseMaintenanceLoop();
663
665
  let lastProgressTime = 0;
664
666
  try {
@@ -681,7 +683,9 @@ class Daemon {
681
683
  });
682
684
  },
683
685
  });
684
- yield this.watchProject(root);
686
+ if (!this.shuttingDown) {
687
+ yield this.watchProject(root);
688
+ }
685
689
  (0, ipc_handler_1.writeDone)(conn, {
686
690
  ok: true,
687
691
  processed: result.processed,
@@ -696,6 +700,7 @@ class Daemon {
696
700
  (0, ipc_handler_1.writeDone)(conn, { ok: false, error: msg });
697
701
  }
698
702
  finally {
703
+ this.shutdownAbortControllers.delete(ac);
699
704
  (_a = this.vectorDb) === null || _a === void 0 ? void 0 : _a.resumeMaintenanceLoop();
700
705
  }
701
706
  }));
@@ -722,6 +727,7 @@ class Daemon {
722
727
  }
723
728
  const ac = new AbortController();
724
729
  conn.on("close", () => ac.abort());
730
+ this.shutdownAbortControllers.add(ac);
725
731
  this.vectorDb.pauseMaintenanceLoop();
726
732
  let lastProgressTime = 0;
727
733
  try {
@@ -760,13 +766,16 @@ class Daemon {
760
766
  (0, ipc_handler_1.writeDone)(conn, { ok: false, error: msg });
761
767
  }
762
768
  finally {
769
+ this.shutdownAbortControllers.delete(ac);
763
770
  (_a = this.vectorDb) === null || _a === void 0 ? void 0 : _a.resumeMaintenanceLoop();
764
- // Re-enable watcher
765
- try {
766
- yield this.watchProject(root);
767
- }
768
- catch (err) {
769
- console.error(`[daemon] Failed to re-watch ${path.basename(root)}:`, err);
771
+ // Re-enable watcher (skip if shutting down)
772
+ if (!this.shuttingDown) {
773
+ try {
774
+ yield this.watchProject(root);
775
+ }
776
+ catch (err) {
777
+ console.error(`[daemon] Failed to re-watch ${path.basename(root)}:`, err);
778
+ }
770
779
  }
771
780
  }
772
781
  }));
@@ -979,6 +988,16 @@ class Daemon {
979
988
  clearInterval(this.heartbeatInterval);
980
989
  if (this.idleInterval)
981
990
  clearInterval(this.idleInterval);
991
+ // Abort in-flight index/add operations so they exit promptly
992
+ for (const ac of this.shutdownAbortControllers) {
993
+ ac.abort();
994
+ }
995
+ // Wait for in-flight project operations to finish (they check shuttingDown/signal)
996
+ const pendingLocks = [...this.projectLocks.values()];
997
+ if (pendingLocks.length > 0) {
998
+ console.log(`[daemon] Waiting for ${pendingLocks.length} in-flight operation(s)...`);
999
+ yield Promise.allSettled(pendingLocks);
1000
+ }
982
1001
  // Close all processors
983
1002
  for (const processor of this.processors.values()) {
984
1003
  yield processor.close();
@@ -77,7 +77,7 @@ function withRegistryLock(fn) {
77
77
  }
78
78
  let release;
79
79
  try {
80
- release = proper_lockfile_1.default.lockSync(REGISTRY_PATH, { stale: 10000, retries: { retries: 3, minTimeout: 100 } });
80
+ release = proper_lockfile_1.default.lockSync(REGISTRY_PATH, { stale: 10000 });
81
81
  return fn();
82
82
  }
83
83
  finally {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "grepmax",
3
- "version": "0.15.2",
3
+ "version": "0.15.3",
4
4
  "author": "Robert Owens <78518764+reowens@users.noreply.github.com>",
5
5
  "homepage": "https://github.com/reowens/grepmax",
6
6
  "bugs": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "grepmax",
3
- "version": "0.15.2",
3
+ "version": "0.15.3",
4
4
  "description": "Semantic code search for Claude Code. Automatically indexes your project and provides intelligent search capabilities.",
5
5
  "author": {
6
6
  "name": "Robert Owens",