@i14ks/ccv 0.16.0 → 0.16.1

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/bundle/ccv.mjs +19 -7
  2. package/package.json +1 -1
package/bundle/ccv.mjs CHANGED
@@ -5946,6 +5946,7 @@ var HandoffStore = class {
5946
5946
  return path18.join(this.#dir, `${sessionId}.json`);
5947
5947
  }
5948
5948
  };
5949
+ var SAME_WINDOW_MS = 5 * 6e4;
5949
5950
  var LimitStopState = class {
5950
5951
  #fired = {};
5951
5952
  #storePath;
@@ -5965,9 +5966,19 @@ var LimitStopState = class {
5965
5966
  this.#fired = {};
5966
5967
  }
5967
5968
  }
5968
- /** Окно `limit` уже сработало и ещё не сбросилось. */
5969
- fired(limit, now = Date.now()) {
5970
- return (this.#fired[limit] ?? 0) > now;
5969
+ /**
5970
+ * Окно `limit` со сроком сброса `resets` уже сработало и ещё не сбросилось.
5971
+ *
5972
+ * Срок сверяется с допуском: окно со сроком сброса дальше `SAME_WINDOW_MS`
5973
+ * от записанного — уже другое, даже если прежний срок не наступил (так
5974
+ * 7.10 новое окно до 21:20 пропустили, приняв его за сработавшее до 20:30).
5975
+ * `null` — срок не разобрать, сверять не с чем, решает только записанный.
5976
+ */
5977
+ fired(limit, resets, now = Date.now()) {
5978
+ const until = this.#fired[limit] ?? 0;
5979
+ if (until <= now)
5980
+ return false;
5981
+ return resets === null || Math.abs(resets - until) <= SAME_WINDOW_MS;
5971
5982
  }
5972
5983
  /** Запомнить срабатывание до `until` (момент сброса окна). */
5973
5984
  async mark(limit, until) {
@@ -5999,10 +6010,11 @@ function crossedLimit(usage, settings, fired, now = Date.now()) {
5999
6010
  for (const [limit, window, threshold] of checks) {
6000
6011
  if (!window || threshold <= 0 || window.utilization < threshold)
6001
6012
  continue;
6002
- if (fired(limit))
6013
+ const parsed = Date.parse(window.resetsAt);
6014
+ const resets = Number.isFinite(parsed) && parsed > now ? parsed : null;
6015
+ if (fired(limit, resets))
6003
6016
  continue;
6004
- const resets = Date.parse(window.resetsAt);
6005
- const until = Number.isFinite(resets) && resets > now ? resets : now + WINDOW_SPAN_MS[limit];
6017
+ const until = resets ?? now + WINDOW_SPAN_MS[limit];
6006
6018
  return { limit, window, until };
6007
6019
  }
6008
6020
  return null;
@@ -8313,7 +8325,7 @@ var HostServer = class {
8313
8325
  async #checkLimit(usage) {
8314
8326
  if (this.#limitStopping)
8315
8327
  return;
8316
- const hit = crossedLimit(usage, this.#settings.current, (limit) => this.#limitStop.fired(limit));
8328
+ const hit = crossedLimit(usage, this.#settings.current, (limit, resets) => this.#limitStop.fired(limit, resets));
8317
8329
  if (!hit)
8318
8330
  return;
8319
8331
  this.#limitStopping = true;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@i14ks/ccv",
3
- "version": "0.16.0",
3
+ "version": "0.16.1",
4
4
  "license": "UNLICENSED",
5
5
  "description": "GUI для Claude Code: сессии агента в каталогах проектов, дерево файлов и редактор рядом с разговором.",
6
6
  "homepage": "https://claudevisual.com",