@nitra/cursor 9.3.0 → 9.4.0

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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # Changelog
2
2
 
3
+ ## [9.4.0] - 2026-06-14
4
+
5
+ ### Changed
6
+
7
+ - docgen: класифікація omlx-збоїв (transient/systemic/permanent) — ретрай ETIMEDOUT з backoff (2s→8s), circuit-breaker на systemic-каскад (3 підряд → abort, exit 2), permanent→skip; pre-send byte-guard (джерело > 0.5× контексту → instant-skip без LLM); scan поважає .gitignore; прибрано хардкод DEFAULT_OMLX_MODEL (fail-loud, модель через N_LOCAL_MIN_MODEL)
8
+
3
9
  ## [9.3.0] - 2026-06-14
4
10
 
5
11
  ### Added
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nitra/cursor",
3
- "version": "9.3.0",
3
+ "version": "9.4.0",
4
4
  "description": "CLI для завантаження cursor-правил (префікс n-) у локальний репозиторій",
5
5
  "keywords": [
6
6
  "cli",
@@ -363,6 +363,18 @@ function orchestratedDoc(facts, src, model, timeoutMs, { anchors = null, tempera
363
363
 
364
364
  /** Максимальний час генерації одного LLM-виклику. */
365
365
  const LOCAL_TIMEOUT_MS = 5 * 60 * 1000
366
+
367
+ /** Контекстне вікно локальної моделі в токенах (оцінка; override — N_CURSOR_DOCGEN_CTX). */
368
+ const DEFAULT_CONTEXT_TOKENS = 131072
369
+
370
+ /**
371
+ * Бюджет токенів на джерело: половина контекстного вікна (решта — факти/стиль/вихід).
372
+ * Перевищення → pre-send guard відсікає файл без жодного LLM-виклику.
373
+ * @returns {number} бюджет у токенах
374
+ */
375
+ function srcTokenBudget() {
376
+ return Math.floor((Number(env.N_CURSOR_DOCGEN_CTX) || DEFAULT_CONTEXT_TOKENS) * 0.5)
377
+ }
366
378
  /**
367
379
  * Дефолтна модель: N_CURSOR_DOCGEN_MODEL → resolveModel('min') (→ N_LOCAL_MIN_MODEL).
368
380
  * Без хардкод-fallback: модель налаштовує кожен локально (`N_LOCAL_MIN_MODEL`); якщо
@@ -384,6 +396,14 @@ export const DEFAULT_LOCAL_MODEL = env.N_CURSOR_DOCGEN_MODEL ?? resolveModel('mi
384
396
  */
385
397
  export function generateDoc(file, { model = DEFAULT_LOCAL_MODEL, threshold = QUALITY_THRESHOLD, existingMd = null } = {}) {
386
398
  const src = readFileSync(file, 'utf8')
399
+ // Pre-send guard: весь src вшивається у промпт як є (екстракт фактів його НЕ
400
+ // замінює). Для гігантів (vendored/генерат) це переповнює контекст → інстант-skip
401
+ // без LLM-виклику. Маркер «Prompt too long» → classifyOmlxError → permanent → skip.
402
+ const estTokens = Math.round(Buffer.byteLength(src, 'utf8') / 4)
403
+ const budget = srcTokenBudget()
404
+ if (estTokens > budget) {
405
+ throw new Error(`docgen pre-send guard: джерело ~${estTokens} токенів > бюджет ${budget} (0.5× контексту) — Prompt too long, skip`)
406
+ }
387
407
  const facts = extractFacts(src, file)
388
408
  const t0 = Date.now()
389
409
  llmMeter = { calls: 0, ms: 0 }