@cartanova/qgrid-cli 1.1.3 → 1.1.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.
@@ -35,10 +35,15 @@ var ClaudePool = class {
35
35
  active: !this.quotaExhausted.has(token)
36
36
  }));
37
37
  }
38
+ rrIndex = 0;
38
39
  selectWorker() {
39
40
  const candidates = [...this.workers.entries()].filter(([token]) => !this.quotaExhausted.has(token)).flatMap(([, workers]) => workers);
40
41
  if (candidates.length === 0) return null;
41
- return candidates.reduce((best, w) => w.getQueueDepth() < best.getQueueDepth() ? w : best);
42
+ const minDepth = Math.min(...candidates.map((w) => w.getQueueDepth()));
43
+ const idle = candidates.filter((w) => w.getQueueDepth() === minDepth);
44
+ const picked = idle[this.rrIndex % idle.length];
45
+ this.rrIndex++;
46
+ return picked ?? null;
42
47
  }
43
48
  async query(input, timeoutMs) {
44
49
  const triedTokens = /* @__PURE__ */ new Set();
@@ -106,4 +111,4 @@ function getPool() {
106
111
  //#endregion
107
112
  export { ClaudePool, getPool, initPool };
108
113
 
109
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9vbC5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXBwbGljYXRpb24vcWdyaWQvcG9vbC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENsYXVkZVBvb2wg4oCUIOupgO2LsCDthqDtgbAg7ZSE66Gc7IS47IqkIO2SgC5cbiAqXG4gKiAyLWxheWVyIOyVhO2CpO2FjeyymDogQ2xhdWRlUG9vbCDihpIgV29ya2VyIChmbGF0KVxuICogLSBNYXA8dG9rZW4sIFdvcmtlcltdPuuhnCDthqDtgbDrs4Qg7JuM7LukIOq0gOumrCAo7JuQ67O4IO2GoO2BsOydtCDtgqQpXG4gKiAtIGxlYXN0LXF1ZXVlLWRlcHRoIOudvOyasO2MhVxuICogLSDtiKzrqoXtlZwg7L+87YSwIGZhaWxvdmVyIChRdW90YUVycm9yIOyLnCDri6Trpbgg7Yag7YGw7Jy866GcIOyekOuPmSDsnqzsi5zrj4QpXG4gKiAtIOybjOy7pCDqtIDrpqzrp4wg64u064u5IChEQiDsnZjsobQg7JeG7J2MKVxuICovXG5pbXBvcnQgdHlwZSB7IENsaVJlc3VsdCwgUG9vbENvbmZpZywgUXVlcnlJbnB1dCwgVG9rZW5TdGF0cyB9IGZyb20gXCIuL3FncmlkLnR5cGVzXCI7XG5pbXBvcnQgeyBRdW90YUVycm9yIH0gZnJvbSBcIi4vcWdyaWQudHlwZXNcIjtcbmltcG9ydCB7IFdvcmtlciwgdHlwZSBXb3JrZXJDb25maWcgfSBmcm9tIFwiLi93b3JrZXJcIjtcblxuZXhwb3J0IGNsYXNzIENsYXVkZVBvb2wge1xuICB3b3JrZXJzID0gbmV3IE1hcDxzdHJpbmcsIFdvcmtlcltdPigpO1xuICB0b2tlbk5hbWVzID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbiAgcXVvdGFFeGhhdXN0ZWQgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgcmVxdWVzdENvdW50cyA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG4gIGxhc3RVc2VkVG9rZW4gPSBcIlwiO1xuICBsYXN0VXNlZFdvcmtlckluZGV4ID0gMDtcbiAgc2l6ZTogbnVtYmVyO1xuICBtb2RlbDogc3RyaW5nO1xuICB0aW1lb3V0OiBudW1iZXI7XG4gIGN3ZDogc3RyaW5nO1xuICBtYXhDYWxsczogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKGNvbmZpZzogUG9vbENvbmZpZykge1xuICAgIHRoaXMuc2l6ZSA9IGNvbmZpZy5zaXplID8/IDM7XG4gICAgdGhpcy5tb2RlbCA9IGNvbmZpZy5tb2RlbCA/PyBcInNvbm5ldFwiO1xuICAgIHRoaXMudGltZW91dCA9IGNvbmZpZy50aW1lb3V0ID8/IDMwMF8wMDA7XG4gICAgdGhpcy5jd2QgPSBjb25maWcuY3dkID8/IFwiL3RtcC9xZ3JpZFwiO1xuICAgIHRoaXMubWF4Q2FsbHMgPSBjb25maWcubWF4Q2FsbHMgPz8gNTAwO1xuXG4gICAgY29uZmlnLnRva2Vucy5mb3JFYWNoKCh7IHRva2VuLCBuYW1lIH0pID0+IHtcbiAgICAgIHRoaXMuY3JlYXRlV29ya2Vycyh0b2tlbiwgbmFtZSk7XG4gICAgfSk7XG4gIH1cblxuICBnZXRMYXN0VXNlZFdvcmtlck5hbWUoKTogc3RyaW5nIHtcbiAgICBjb25zdCBiYXNlTmFtZSA9IHRoaXMudG9rZW5OYW1lcy5nZXQodGhpcy5sYXN0VXNlZFRva2VuKSA/PyBcIlVua25vd25cIjtcbiAgICByZXR1cm4gYCR7YmFzZU5hbWV9LSR7dGhpcy5sYXN0VXNlZFdvcmtlckluZGV4fWA7XG4gIH1cblxuICBnZXRTdGF0cygpOiBUb2tlblN0YXRzW10ge1xuICAgIHJldHVybiBbLi4udGhpcy53b3JrZXJzLmtleXMoKV0ubWFwKCh0b2tlbikgPT4gKHtcbiAgICAgIHRva2VuLFxuICAgICAgbmFtZTogdGhpcy50b2tlbk5hbWVzLmdldCh0b2tlbikgPz8gXCJVbmtub3duXCIsXG4gICAgICByZXF1ZXN0czogdGhpcy5yZXF1ZXN0Q291bnRzLmdldCh0b2tlbikgPz8gMCxcbiAgICAgIGFjdGl2ZTogIXRoaXMucXVvdGFFeGhhdXN0ZWQuaGFzKHRva2VuKSxcbiAgICB9KSk7XG4gIH1cblxuICBzZWxlY3RXb3JrZXIoKTogV29ya2VyIHwgbnVsbCB7XG4gICAgY29uc3QgY2FuZGlkYXRlcyA9IFsuLi50aGlzLndvcmtlcnMuZW50cmllcygpXVxuICAgICAgLmZpbHRlcigoW3Rva2VuXSkgPT4gIXRoaXMucXVvdGFFeGhhdXN0ZWQuaGFzKHRva2VuKSlcbiAgICAgIC5mbGF0TWFwKChbLCB3b3JrZXJzXSkgPT4gd29ya2Vycyk7XG5cbiAgICBpZiAoY2FuZGlkYXRlcy5sZW5ndGggPT09IDApIHJldHVybiBudWxsO1xuXG4gICAgcmV0dXJuIGNhbmRpZGF0ZXMucmVkdWNlKChiZXN0LCB3KSA9PiAody5nZXRRdWV1ZURlcHRoKCkgPCBiZXN0LmdldFF1ZXVlRGVwdGgoKSA/IHcgOiBiZXN0KSk7XG4gIH1cblxuICBhc3luYyBxdWVyeShpbnB1dDogUXVlcnlJbnB1dCwgdGltZW91dE1zPzogbnVtYmVyKTogUHJvbWlzZTxDbGlSZXN1bHQ+IHtcbiAgICBjb25zdCB0cmllZFRva2VucyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIGNvbnN0IHdvcmtlciA9IHRoaXMuc2VsZWN0V29ya2VyKCk7XG4gICAgICBpZiAoIXdvcmtlcikge1xuICAgICAgICB0aHJvdyBuZXcgUXVvdGFFcnJvcihcIkFsbCB0b2tlbnMgZXhoYXVzdGVkXCIpO1xuICAgICAgfVxuXG4gICAgICBpZiAodHJpZWRUb2tlbnMuaGFzKHdvcmtlci50b2tlbklkKSkge1xuICAgICAgICB0aHJvdyBuZXcgUXVvdGFFcnJvcihcIkFsbCB0b2tlbnMgZXhoYXVzdGVkXCIpO1xuICAgICAgfVxuXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB3b3JrZXIucXVlcnkoaW5wdXQsIHRpbWVvdXRNcyk7XG4gICAgICAgIHRoaXMubGFzdFVzZWRUb2tlbiA9IHdvcmtlci50b2tlbklkO1xuICAgICAgICBjb25zdCB0b2tlbldvcmtlcnMgPSB0aGlzLndvcmtlcnMuZ2V0KHdvcmtlci50b2tlbklkKTtcbiAgICAgICAgdGhpcy5sYXN0VXNlZFdvcmtlckluZGV4ID0gdG9rZW5Xb3JrZXJzID8gdG9rZW5Xb3JrZXJzLmluZGV4T2Yod29ya2VyKSArIDEgOiAwO1xuICAgICAgICB0aGlzLnJlcXVlc3RDb3VudHMuc2V0KHdvcmtlci50b2tlbklkLCAodGhpcy5yZXF1ZXN0Q291bnRzLmdldCh3b3JrZXIudG9rZW5JZCkgPz8gMCkgKyAxKTtcblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGlmIChlcnIgaW5zdGFuY2VvZiBRdW90YUVycm9yKSB7XG4gICAgICAgICAgdGhpcy5xdW90YUV4aGF1c3RlZC5hZGQod29ya2VyLnRva2VuSWQpO1xuICAgICAgICAgIHRyaWVkVG9rZW5zLmFkZCh3b3JrZXIudG9rZW5JZCk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGtpbGwoKTogdm9pZCB7XG4gICAgWy4uLnRoaXMud29ya2Vycy52YWx1ZXMoKV0uZmxhdCgpLmZvckVhY2goKHcpID0+IHtcbiAgICAgIHcua2lsbCgpO1xuICAgIH0pO1xuICB9XG5cbiAgY3JlYXRlV29ya2Vycyh0b2tlbjogc3RyaW5nLCBuYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAodGhpcy53b3JrZXJzLmhhcyh0b2tlbikpIHJldHVybjtcblxuICAgIHRoaXMudG9rZW5OYW1lcy5zZXQodG9rZW4sIG5hbWUpO1xuICAgIGNvbnN0IHdvcmtlckNvbmZpZzogV29ya2VyQ29uZmlnID0ge1xuICAgICAgdG9rZW4sXG4gICAgICBtb2RlbDogdGhpcy5tb2RlbCxcbiAgICAgIHRpbWVvdXQ6IHRoaXMudGltZW91dCxcbiAgICAgIGN3ZDogdGhpcy5jd2QsXG4gICAgICBtYXhDYWxsczogdGhpcy5tYXhDYWxscyxcbiAgICB9O1xuICAgIGNvbnN0IHdvcmtlcnMgPSBBcnJheS5mcm9tKHsgbGVuZ3RoOiB0aGlzLnNpemUgfSwgKCkgPT4gbmV3IFdvcmtlcih3b3JrZXJDb25maWcpKTtcbiAgICB0aGlzLndvcmtlcnMuc2V0KHRva2VuLCB3b3JrZXJzKTtcbiAgICB0aGlzLnJlcXVlc3RDb3VudHMuc2V0KHRva2VuLCAwKTtcbiAgfVxuXG4gIGRlc3Ryb3lXb3JrZXJzKHRva2VuOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCB3b3JrZXJzID0gdGhpcy53b3JrZXJzLmdldCh0b2tlbik7XG4gICAgaWYgKCF3b3JrZXJzKSByZXR1cm47XG5cbiAgICB3b3JrZXJzLmZvckVhY2goKHcpID0+IHtcbiAgICAgIHcua2lsbCgpO1xuICAgIH0pO1xuICAgIHRoaXMud29ya2Vycy5kZWxldGUodG9rZW4pO1xuICAgIHRoaXMudG9rZW5OYW1lcy5kZWxldGUodG9rZW4pO1xuICAgIHRoaXMucXVvdGFFeGhhdXN0ZWQuZGVsZXRlKHRva2VuKTtcbiAgICB0aGlzLnJlcXVlc3RDb3VudHMuZGVsZXRlKHRva2VuKTtcbiAgfVxufVxuXG4vLyBQb29sIOyLseq4gO2EtCDqtIDrpqxcbmxldCBwb29sOiBDbGF1ZGVQb29sIHwgbnVsbCA9IG51bGw7XG5cbmV4cG9ydCBmdW5jdGlvbiBpbml0UG9vbCh0b2tlbnM6IHsgdG9rZW46IHN0cmluZzsgbmFtZTogc3RyaW5nIH1bXSk6IENsYXVkZVBvb2wge1xuICBwb29sID0gbmV3IENsYXVkZVBvb2woeyB0b2tlbnMgfSk7XG4gIHJldHVybiBwb29sO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UG9vbCgpOiBDbGF1ZGVQb29sIHtcbiAgaWYgKCFwb29sKSB0aHJvdyBuZXcgRXJyb3IoXCJQb29sIG5vdCBpbml0aWFsaXplZC4gQ2FsbCBpbml0UG9vbCgpIGZpcnN0LlwiKTtcbiAgcmV0dXJuIHBvb2w7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7QUFhQSxJQUFh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
114
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9vbC5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXBwbGljYXRpb24vcWdyaWQvcG9vbC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENsYXVkZVBvb2wg4oCUIOupgO2LsCDthqDtgbAg7ZSE66Gc7IS47IqkIO2SgC5cbiAqXG4gKiAyLWxheWVyIOyVhO2CpO2FjeyymDogQ2xhdWRlUG9vbCDihpIgV29ya2VyIChmbGF0KVxuICogLSBNYXA8dG9rZW4sIFdvcmtlcltdPuuhnCDthqDtgbDrs4Qg7JuM7LukIOq0gOumrCAo7JuQ67O4IO2GoO2BsOydtCDtgqQpXG4gKiAtIGxlYXN0LXF1ZXVlLWRlcHRoIOudvOyasO2MhVxuICogLSDtiKzrqoXtlZwg7L+87YSwIGZhaWxvdmVyIChRdW90YUVycm9yIOyLnCDri6Trpbgg7Yag7YGw7Jy866GcIOyekOuPmSDsnqzsi5zrj4QpXG4gKiAtIOybjOy7pCDqtIDrpqzrp4wg64u064u5IChEQiDsnZjsobQg7JeG7J2MKVxuICovXG5pbXBvcnQgdHlwZSB7IENsaVJlc3VsdCwgUG9vbENvbmZpZywgUXVlcnlJbnB1dCwgVG9rZW5TdGF0cyB9IGZyb20gXCIuL3FncmlkLnR5cGVzXCI7XG5pbXBvcnQgeyBRdW90YUVycm9yIH0gZnJvbSBcIi4vcWdyaWQudHlwZXNcIjtcbmltcG9ydCB7IFdvcmtlciwgdHlwZSBXb3JrZXJDb25maWcgfSBmcm9tIFwiLi93b3JrZXJcIjtcblxuZXhwb3J0IGNsYXNzIENsYXVkZVBvb2wge1xuICB3b3JrZXJzID0gbmV3IE1hcDxzdHJpbmcsIFdvcmtlcltdPigpO1xuICB0b2tlbk5hbWVzID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbiAgcXVvdGFFeGhhdXN0ZWQgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgcmVxdWVzdENvdW50cyA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG4gIGxhc3RVc2VkVG9rZW4gPSBcIlwiO1xuICBsYXN0VXNlZFdvcmtlckluZGV4ID0gMDtcbiAgc2l6ZTogbnVtYmVyO1xuICBtb2RlbDogc3RyaW5nO1xuICB0aW1lb3V0OiBudW1iZXI7XG4gIGN3ZDogc3RyaW5nO1xuICBtYXhDYWxsczogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKGNvbmZpZzogUG9vbENvbmZpZykge1xuICAgIHRoaXMuc2l6ZSA9IGNvbmZpZy5zaXplID8/IDM7XG4gICAgdGhpcy5tb2RlbCA9IGNvbmZpZy5tb2RlbCA/PyBcInNvbm5ldFwiO1xuICAgIHRoaXMudGltZW91dCA9IGNvbmZpZy50aW1lb3V0ID8/IDMwMF8wMDA7XG4gICAgdGhpcy5jd2QgPSBjb25maWcuY3dkID8/IFwiL3RtcC9xZ3JpZFwiO1xuICAgIHRoaXMubWF4Q2FsbHMgPSBjb25maWcubWF4Q2FsbHMgPz8gNTAwO1xuXG4gICAgY29uZmlnLnRva2Vucy5mb3JFYWNoKCh7IHRva2VuLCBuYW1lIH0pID0+IHtcbiAgICAgIHRoaXMuY3JlYXRlV29ya2Vycyh0b2tlbiwgbmFtZSk7XG4gICAgfSk7XG4gIH1cblxuICBnZXRMYXN0VXNlZFdvcmtlck5hbWUoKTogc3RyaW5nIHtcbiAgICBjb25zdCBiYXNlTmFtZSA9IHRoaXMudG9rZW5OYW1lcy5nZXQodGhpcy5sYXN0VXNlZFRva2VuKSA/PyBcIlVua25vd25cIjtcbiAgICByZXR1cm4gYCR7YmFzZU5hbWV9LSR7dGhpcy5sYXN0VXNlZFdvcmtlckluZGV4fWA7XG4gIH1cblxuICBnZXRTdGF0cygpOiBUb2tlblN0YXRzW10ge1xuICAgIHJldHVybiBbLi4udGhpcy53b3JrZXJzLmtleXMoKV0ubWFwKCh0b2tlbikgPT4gKHtcbiAgICAgIHRva2VuLFxuICAgICAgbmFtZTogdGhpcy50b2tlbk5hbWVzLmdldCh0b2tlbikgPz8gXCJVbmtub3duXCIsXG4gICAgICByZXF1ZXN0czogdGhpcy5yZXF1ZXN0Q291bnRzLmdldCh0b2tlbikgPz8gMCxcbiAgICAgIGFjdGl2ZTogIXRoaXMucXVvdGFFeGhhdXN0ZWQuaGFzKHRva2VuKSxcbiAgICB9KSk7XG4gIH1cblxuICBwcml2YXRlIHJySW5kZXggPSAwO1xuXG4gIHNlbGVjdFdvcmtlcigpOiBXb3JrZXIgfCBudWxsIHtcbiAgICBjb25zdCBjYW5kaWRhdGVzID0gWy4uLnRoaXMud29ya2Vycy5lbnRyaWVzKCldXG4gICAgICAuZmlsdGVyKChbdG9rZW5dKSA9PiAhdGhpcy5xdW90YUV4aGF1c3RlZC5oYXModG9rZW4pKVxuICAgICAgLmZsYXRNYXAoKFssIHdvcmtlcnNdKSA9PiB3b3JrZXJzKTtcblxuICAgIGlmIChjYW5kaWRhdGVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIG51bGw7XG5cbiAgICBjb25zdCBtaW5EZXB0aCA9IE1hdGgubWluKC4uLmNhbmRpZGF0ZXMubWFwKCh3KSA9PiB3LmdldFF1ZXVlRGVwdGgoKSkpO1xuICAgIGNvbnN0IGlkbGUgPSBjYW5kaWRhdGVzLmZpbHRlcigodykgPT4gdy5nZXRRdWV1ZURlcHRoKCkgPT09IG1pbkRlcHRoKTtcbiAgICBjb25zdCBwaWNrZWQgPSBpZGxlW3RoaXMucnJJbmRleCAlIGlkbGUubGVuZ3RoXTtcbiAgICB0aGlzLnJySW5kZXgrKztcbiAgICByZXR1cm4gcGlja2VkID8/IG51bGw7XG4gIH1cblxuICBhc3luYyBxdWVyeShpbnB1dDogUXVlcnlJbnB1dCwgdGltZW91dE1zPzogbnVtYmVyKTogUHJvbWlzZTxDbGlSZXN1bHQ+IHtcbiAgICBjb25zdCB0cmllZFRva2VucyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIGNvbnN0IHdvcmtlciA9IHRoaXMuc2VsZWN0V29ya2VyKCk7XG4gICAgICBpZiAoIXdvcmtlcikge1xuICAgICAgICB0aHJvdyBuZXcgUXVvdGFFcnJvcihcIkFsbCB0b2tlbnMgZXhoYXVzdGVkXCIpO1xuICAgICAgfVxuXG4gICAgICBpZiAodHJpZWRUb2tlbnMuaGFzKHdvcmtlci50b2tlbklkKSkge1xuICAgICAgICB0aHJvdyBuZXcgUXVvdGFFcnJvcihcIkFsbCB0b2tlbnMgZXhoYXVzdGVkXCIpO1xuICAgICAgfVxuXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB3b3JrZXIucXVlcnkoaW5wdXQsIHRpbWVvdXRNcyk7XG4gICAgICAgIHRoaXMubGFzdFVzZWRUb2tlbiA9IHdvcmtlci50b2tlbklkO1xuICAgICAgICBjb25zdCB0b2tlbldvcmtlcnMgPSB0aGlzLndvcmtlcnMuZ2V0KHdvcmtlci50b2tlbklkKTtcbiAgICAgICAgdGhpcy5sYXN0VXNlZFdvcmtlckluZGV4ID0gdG9rZW5Xb3JrZXJzID8gdG9rZW5Xb3JrZXJzLmluZGV4T2Yod29ya2VyKSArIDEgOiAwO1xuICAgICAgICB0aGlzLnJlcXVlc3RDb3VudHMuc2V0KHdvcmtlci50b2tlbklkLCAodGhpcy5yZXF1ZXN0Q291bnRzLmdldCh3b3JrZXIudG9rZW5JZCkgPz8gMCkgKyAxKTtcblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGlmIChlcnIgaW5zdGFuY2VvZiBRdW90YUVycm9yKSB7XG4gICAgICAgICAgdGhpcy5xdW90YUV4aGF1c3RlZC5hZGQod29ya2VyLnRva2VuSWQpO1xuICAgICAgICAgIHRyaWVkVG9rZW5zLmFkZCh3b3JrZXIudG9rZW5JZCk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGtpbGwoKTogdm9pZCB7XG4gICAgWy4uLnRoaXMud29ya2Vycy52YWx1ZXMoKV0uZmxhdCgpLmZvckVhY2goKHcpID0+IHtcbiAgICAgIHcua2lsbCgpO1xuICAgIH0pO1xuICB9XG5cbiAgY3JlYXRlV29ya2Vycyh0b2tlbjogc3RyaW5nLCBuYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAodGhpcy53b3JrZXJzLmhhcyh0b2tlbikpIHJldHVybjtcblxuICAgIHRoaXMudG9rZW5OYW1lcy5zZXQodG9rZW4sIG5hbWUpO1xuICAgIGNvbnN0IHdvcmtlckNvbmZpZzogV29ya2VyQ29uZmlnID0ge1xuICAgICAgdG9rZW4sXG4gICAgICBtb2RlbDogdGhpcy5tb2RlbCxcbiAgICAgIHRpbWVvdXQ6IHRoaXMudGltZW91dCxcbiAgICAgIGN3ZDogdGhpcy5jd2QsXG4gICAgICBtYXhDYWxsczogdGhpcy5tYXhDYWxscyxcbiAgICB9O1xuICAgIGNvbnN0IHdvcmtlcnMgPSBBcnJheS5mcm9tKHsgbGVuZ3RoOiB0aGlzLnNpemUgfSwgKCkgPT4gbmV3IFdvcmtlcih3b3JrZXJDb25maWcpKTtcbiAgICB0aGlzLndvcmtlcnMuc2V0KHRva2VuLCB3b3JrZXJzKTtcbiAgICB0aGlzLnJlcXVlc3RDb3VudHMuc2V0KHRva2VuLCAwKTtcbiAgfVxuXG4gIGRlc3Ryb3lXb3JrZXJzKHRva2VuOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCB3b3JrZXJzID0gdGhpcy53b3JrZXJzLmdldCh0b2tlbik7XG4gICAgaWYgKCF3b3JrZXJzKSByZXR1cm47XG5cbiAgICB3b3JrZXJzLmZvckVhY2goKHcpID0+IHtcbiAgICAgIHcua2lsbCgpO1xuICAgIH0pO1xuICAgIHRoaXMud29ya2Vycy5kZWxldGUodG9rZW4pO1xuICAgIHRoaXMudG9rZW5OYW1lcy5kZWxldGUodG9rZW4pO1xuICAgIHRoaXMucXVvdGFFeGhhdXN0ZWQuZGVsZXRlKHRva2VuKTtcbiAgICB0aGlzLnJlcXVlc3RDb3VudHMuZGVsZXRlKHRva2VuKTtcbiAgfVxufVxuXG4vLyBQb29sIOyLseq4gO2EtCDqtIDrpqxcbmxldCBwb29sOiBDbGF1ZGVQb29sIHwgbnVsbCA9IG51bGw7XG5cbmV4cG9ydCBmdW5jdGlvbiBpbml0UG9vbCh0b2tlbnM6IHsgdG9rZW46IHN0cmluZzsgbmFtZTogc3RyaW5nIH1bXSk6IENsYXVkZVBvb2wge1xuICBwb29sID0gbmV3IENsYXVkZVBvb2woeyB0b2tlbnMgfSk7XG4gIHJldHVybiBwb29sO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UG9vbCgpOiBDbGF1ZGVQb29sIHtcbiAgaWYgKCFwb29sKSB0aHJvdyBuZXcgRXJyb3IoXCJQb29sIG5vdCBpbml0aWFsaXplZC4gQ2FsbCBpbml0UG9vbCgpIGZpcnN0LlwiKTtcbiAgcmV0dXJuIHBvb2w7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7QUFhQSxJQUFhLGFBQWIsTUFBd0I7Q0FDdEIsMEJBQVUsSUFBSSxLQUF1QjtDQUNyQyw2QkFBYSxJQUFJLEtBQXFCO0NBQ3RDLGlDQUFpQixJQUFJLEtBQWE7Q0FDbEMsZ0NBQWdCLElBQUksS0FBcUI7Q0FDekMsZ0JBQWdCO0NBQ2hCLHNCQUFzQjtDQUN0QjtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBRUEsWUFBWSxRQUFvQjtBQUM5QixPQUFLLE9BQU8sT0FBTyxRQUFRO0FBQzNCLE9BQUssUUFBUSxPQUFPLFNBQVM7QUFDN0IsT0FBSyxVQUFVLE9BQU8sV0FBVztBQUNqQyxPQUFLLE1BQU0sT0FBTyxPQUFPO0FBQ3pCLE9BQUssV0FBVyxPQUFPLFlBQVk7QUFFbkMsU0FBTyxPQUFPLFNBQVMsRUFBRSxPQUFPLFdBQVc7QUFDekMsUUFBSyxjQUFjLE9BQU8sS0FBSztJQUMvQjs7Q0FHSix3QkFBZ0M7QUFFOUIsU0FBTyxHQURVLEtBQUssV0FBVyxJQUFJLEtBQUssY0FBYyxJQUFJLFVBQ3pDLEdBQUcsS0FBSzs7Q0FHN0IsV0FBeUI7QUFDdkIsU0FBTyxDQUFDLEdBQUcsS0FBSyxRQUFRLE1BQU0sQ0FBQyxDQUFDLEtBQUssV0FBVztHQUM5QztHQUNBLE1BQU0sS0FBSyxXQUFXLElBQUksTUFBTSxJQUFJO0dBQ3BDLFVBQVUsS0FBSyxjQUFjLElBQUksTUFBTSxJQUFJO0dBQzNDLFFBQVEsQ0FBQyxLQUFLLGVBQWUsSUFBSSxNQUFNO0dBQ3hDLEVBQUU7O0NBR0wsVUFBa0I7Q0FFbEIsZUFBOEI7RUFDNUIsTUFBTSxhQUFhLENBQUMsR0FBRyxLQUFLLFFBQVEsU0FBUyxDQUFDLENBQzNDLFFB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
@@ -50,6 +50,8 @@ export class ClaudePool {
50
50
  }));
51
51
  }
52
52
 
53
+ private rrIndex = 0;
54
+
53
55
  selectWorker(): Worker | null {
54
56
  const candidates = [...this.workers.entries()]
55
57
  .filter(([token]) => !this.quotaExhausted.has(token))
@@ -57,7 +59,11 @@ export class ClaudePool {
57
59
 
58
60
  if (candidates.length === 0) return null;
59
61
 
60
- return candidates.reduce((best, w) => (w.getQueueDepth() < best.getQueueDepth() ? w : best));
62
+ const minDepth = Math.min(...candidates.map((w) => w.getQueueDepth()));
63
+ const idle = candidates.filter((w) => w.getQueueDepth() === minDepth);
64
+ const picked = idle[this.rrIndex % idle.length];
65
+ this.rrIndex++;
66
+ return picked ?? null;
61
67
  }
62
68
 
63
69
  async query(input: QueryInput, timeoutMs?: number): Promise<CliResult> {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cartanova/qgrid-cli",
3
- "version": "1.1.3",
3
+ "version": "1.1.5",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "https://github.com/cartanova-ai/qgrid"
@@ -32,6 +32,7 @@
32
32
  "commander": "^13.0.0",
33
33
  "date-fns": "^4.1.0",
34
34
  "dotenv": "^16",
35
+ "fastify": "^4",
35
36
  "ioredis": "^5.8.2",
36
37
  "knex": "^3.1.0",
37
38
  "pg": "^8.16.3",