@naparnik/mcp 0.10.70 → 0.10.72

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
@@ -21,6 +21,23 @@
21
21
  про сам монтаж. Отсюда берутся «что нового» при обновлении, недельная
22
22
  сводка в боте и пост в клубе.
23
23
 
24
+ ## 0.10.72 — 2026-09-26 — исправление. Обновления приходят в тот же час
25
+
26
+ Новая версия теперь ставится сама в течение пары минут после выхода, пока вы
27
+ работаете, — даже если вы только смотрите и спрашиваете. На «обнови» Claude и
28
+ ChatGPT ставят свежее, а не говорят «новых нет».
29
+
30
+ ## 0.10.71 — 2026-09-26 — новое. Подскажет, что ещё сделать
31
+
32
+ Попросите одно — Claude и ChatGPT сделают это и сразу подскажут, что ещё
33
+ улучшит ролик. Решаете вы.
34
+
35
+ ## монтаж — 2026-09-26 — новое. Предлагает, что ещё сделать
36
+
37
+ Попросили только субтитры — Напарник сделает субтитры и назовёт, что ещё
38
+ пойдёт ролику: убрать дубли, добавить музыку, графику, наезды. У каждого
39
+ пункта причина из вашего ролика. Без вашего «да» ничего лишнего не ставит.
40
+
24
41
  ## 0.10.70 — 2026-09-26 — исправление. Карточки вида — вместе с черновиком
25
42
 
26
43
  Claude и ChatGPT больше не спрашивают заранее про все разделы подряд.
@@ -770,7 +770,7 @@ function parsePositiveInt(raw, fallback) {
770
770
  }
771
771
 
772
772
  // src/version.ts
773
- var VERSION = "0.10.70";
773
+ var VERSION = "0.10.72";
774
774
  var USER_AGENT = `naparnik-mcp/${VERSION}`;
775
775
  var MIN_ENGINE = "2026.09.24-478";
776
776
  var LAUNCHER_PROTOCOL = 1;
@@ -2291,9 +2291,10 @@ var HOW_MONTAGE_WORKS = `
2291
2291
  2. \u0421\u0442\u0440\u0430\u043D\u0438\u0446\u044B \u0437\u0430\u0434\u0430\u0447\u0438 \u043F\u0440\u043E\u0447\u0442\u0438 plan \u0441 read \u0414\u041E \u043E\u0442\u0432\u0435\u0442\u0430.
2292
2292
  3. plan \u0441 video \u2014 \u0427\u0415\u0420\u041D\u041E\u0412\u0418\u041A: \u043F\u0435\u0440\u0435\u0441\u043A\u0430\u0436\u0438 \u041F\u041E\u0421\u0422\u0420\u041E\u0427\u041D\u041E \u0438 \u043E\u0431\u0441\u0443\u0434\u0438, \u043F\u0440\u0430\u0432\u043A\u0438 \u2014
2293
2293
  plan_edit. \u041F\u0440\u043E\u0441\u044C\u0431\u0430 \u043F\u0440\u043E \u043E\u0434\u043D\u043E \u2014 ask \u0435\u0451 \u0440\u0430\u0437\u0434\u0435\u043B\u0430\u043C\u0438 \u0438\u043B\u0438 {}
2294
- (\u0441\u043B\u043E\u0432\u043E, \u043E\u0433\u043E\u0432\u043E\u0440\u043A\u0430 \u2014 {"speech":{}}).
2295
- 4. \u0421\u0442\u0438\u043B\u044C \u0432\u0441\u0442\u0440\u043E\u0435\u043D\u043D\u044B\u0439 \u2014 \u0441\u0440\u0430\u0437\u0443 \u0441 \u0447\u0435\u0440\u043D\u043E\u0432\u0438\u043A\u043E\u043C \u0441\u043F\u0440\u043E\u0441\u0438 \u0444\u043E\u0440\u043C\u043E\u0439 \u043D\u0430\u0437\u0432\u0430\u043D\u043D\u043E\u0435 \u0438\u043C:
2296
- choose_variant(questions=[\u0440\u0430\u0437\u0434\u0435\u043B\u044B]); \u043F\u0440\u043E\u0447\u0435\u0435 \u0438 \u0441\u0432\u043E\u0439 \u0441\u0442\u0438\u043B\u044C \u2014 \u0444\u0440\u0430\u0437\u043E\u0439.
2294
+ (\u0441\u043B\u043E\u0432\u043E, \u043E\u0433\u043E\u0432\u043E\u0440\u043A\u0430 \u2014 {"speech":{}}); \u0412\u0421\u0415\u0413\u0414\u0410 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0438 \u0443\u043C\u0435\u0441\u0442\u043D\u043E\u0435 \u0438\u0437
2295
+ \u0447\u0435\u0440\u043D\u043E\u0432\u0438\u043A\u0430 \u0441 \u043F\u0440\u0438\u0447\u0438\u043D\u043E\u0439 \u2014 \u0440\u0435\u0448\u0430\u0435\u0442 \u0447\u0435\u043B\u043E\u0432\u0435\u043A.
2296
+ 4. \u0421\u0442\u0438\u043B\u044C \u0432\u0441\u0442\u0440\u043E\u0435\u043D\u043D\u044B\u0439 \u2014 \u0441\u0440\u0430\u0437\u0443 \u0441 \u0447\u0435\u0440\u043D\u043E\u0432\u0438\u043A\u043E\u043C \u0441\u043F\u0440\u043E\u0441\u0438 \u0444\u043E\u0440\u043C\u043E\u0439 \u0438\u0437 \u043D\u0435\u0433\u043E:
2297
+ choose_variant(questions=[\u0440\u0430\u0437\u0434\u0435\u043B\u044B]); \u0441\u0432\u043E\u0439 \u0441\u0442\u0438\u043B\u044C \u2014 \u0444\u0440\u0430\u0437\u043E\u0439.
2297
2298
  \u0411\u0435\u0437 \u043A\u0430\u0440\u0442\u043E\u0447\u0435\u043A \u2014 \u0441\u043B\u043E\u0432\u0430\u043C\u0438 \u0441 \u043D\u043E\u043C\u0435\u0440\u0430\u043C\u0438. \u041D\u0438\u0447\u0435\u0433\u043E \u2014 variant_chosen \u0441 keep=true.
2298
2299
  \u0421\u0442\u0438\u043B\u044C \u0441\u0432\u043E\u0439 \u2014 \u043D\u0435 \u0441\u043F\u0440\u0430\u0448\u0438\u0432\u0430\u0439.
2299
2300
  5. \u0411\u0435\u0437 \xAB\u0434\u0430\xBB \u043D\u0435 \u0441\u043E\u0431\u0438\u0440\u0430\u0439; \u0441\u043A\u0430\u0437\u0430\u043B \u2014 plan_edit \u0441 agree, \u043F\u043E\u0442\u043E\u043C render:
@@ -2301,13 +2302,13 @@ choose_variant(questions=[\u0440\u0430\u0437\u0434\u0435\u043B\u044B]); \u043F\u
2301
2302
  6. \u041F\u0440\u0430\u0432\u043A\u0430 \u0436\u0434\u0451\u0442 \u043F\u0435\u0447\u0430\u0442\u044C (stamps), \u0438\u043D\u0430\u0447\u0435 plan_edit \u043E\u0442\u043A\u0430\u0436\u0435\u0442 \u0438 \u043F\u0440\u0438\u0448\u043B\u0451\u0442 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0443.
2302
2303
  7. \u0422\u044F\u0436\u0451\u043B\u043E\u0435 (\u0432\u044B\u0440\u0435\u0437 \u0433\u0435\u0440\u043E\u044F, \u0440\u0430\u0441\u043F\u043E\u0437\u043D\u0430\u0432\u0430\u043D\u0438\u0435 \u0440\u0435\u0447\u0438) \u2014 \u041F\u041E \u041F\u0420\u041E\u0421\u042C\u0411\u0415, \u0432\u0435\u0441 \u0438\u0437 setup.
2303
2304
  \xAB\u0414\u0430\xBB, \xAB\u043E\u0431\u043D\u043E\u0432\u0438\xBB \u2014 \u041E\u0414\u0418\u041D install, \u0434\u0430\u043B\u044C\u0448\u0435 wait.
2304
- 8. \u041D\u0435\u0442 \u0433\u043E\u0442\u043E\u0432\u043E\u0433\u043E \u2014 \u0441\u0432\u043E\u0451 \u043F\u0430\u043A\u0435\u0442\u043E\u043C \u0438\u043B\u0438 \u0448\u0430\u0433\u043E\u043C \u0432 \u043F\u0430\u043F\u043A\u0443 \u0440\u043E\u043B\u0438\u043A\u0430, \u043D\u0435 \u0441\u043A\u0440\u0438\u043F\u0442\u043E\u043C;
2305
- \u0441\u0434\u0435\u043B\u0430\u043B \u2014 remember \u0438 notes. \u0421\u0432\u043E\u0451 \u0434\u043E\u043B\u0433\u043E\u0435 \u2014 \u0441\u043F\u0435\u0440\u0432\u0430 stay_awake.
2305
+ 8. \u041D\u0435\u0442 \u0433\u043E\u0442\u043E\u0432\u043E\u0433\u043E \u2014 \u0441\u0432\u043E\u0451 \u043F\u0430\u043A\u0435\u0442\u043E\u043C \u0438\u043B\u0438 \u0448\u0430\u0433\u043E\u043C, \u043D\u0435 \u0441\u043A\u0440\u0438\u043F\u0442\u043E\u043C;
2306
+ \u0441\u0434\u0435\u043B\u0430\u043B \u2014 remember \u0438 notes. \u0414\u043E\u043B\u0433\u043E\u0435 \u2014 \u0441\u043F\u0435\u0440\u0432\u0430 stay_awake.
2306
2307
 
2307
- \u041B\u044E\u0431\u0430\u044F \u0440\u0430\u0431\u043E\u0442\u0430, \u0438 \u0447\u0443\u0436\u0430\u044F, \u2014 \u043F\u043B\u0430\u043D \u0432 \u0447\u0435\u043A-\u043B\u0438\u0441\u0442\u0435 (TaskUpdate);
2308
+ \u041B\u044E\u0431\u0430\u044F \u0440\u0430\u0431\u043E\u0442\u0430 \u2014 \u0447\u0435\u043A-\u043B\u0438\u0441\u0442\u043E\u043C (TaskUpdate);
2308
2309
  \u043F\u0435\u0440\u0435\u0441\u043A\u0430\u0437\u044B\u0432\u0430\u0439, \u0447\u0442\u043E \u0441\u0435\u0439\u0447\u0430\u0441 \u0438 \u0441\u043A\u043E\u043B\u044C\u043A\u043E \u0436\u0434\u0430\u0442\u044C. \u041C\u043E\u043B\u0447\u0430\u043D\u0438\u0435 \u2014 \xAB\u0437\u0430\u0432\u0438\u0441\u043B\u043E\xBB.
2309
- \u0421\u043F\u0440\u0430\u0432\u043E\u0447\u043D\u0438\u043A \u0433\u043E\u0434\u0438\u0442\u0441\u044F \u0438 \u0431\u0435\u0437 \u0440\u043E\u043B\u0438\u043A\u0430: \u043F\u0440\u0435\u0437\u0435\u043D\u0442\u0430\u0446\u0438\u044F.
2310
- \u041D\u0435 \u0432\u044B\u0434\u0443\u043C\u044B\u0432\u0430\u0439; \u0432\u0440\u0435\u043C\u044F \u2014 \u043E\u0442 \u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442\u0430; \u043A\u0430\u043A \u0443\u0441\u0442\u0440\u043E\u0435\u043D\u043E \u2014 \u043D\u0435 \u0440\u0430\u0441\u0441\u043A\u0430\u0437\u044B\u0432\u0430\u0439.
2310
+ \u0421\u043F\u0440\u0430\u0432\u043E\u0447\u043D\u0438\u043A \u2014 \u0438 \u0431\u0435\u0437 \u0440\u043E\u043B\u0438\u043A\u0430: \u043F\u0440\u0435\u0437\u0435\u043D\u0442\u0430\u0446\u0438\u044F.
2311
+ \u041D\u0435 \u0432\u044B\u0434\u0443\u043C\u044B\u0432\u0430\u0439; \u0432\u0440\u0435\u043C\u044F \u2014 \u043E\u0442 \u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442\u0430; \u043A\u0430\u043A \u0443\u0441\u0442\u0440\u043E\u0435\u043D\u043E \u2014 \u043C\u043E\u043B\u0447\u0438.
2311
2312
  `.trim();
2312
2313
  function notConfiguredInstructions(problem, detail) {
2313
2314
  const diagnosis = problem === "missing_key" ? "\u041A\u043B\u044E\u0447 \u0434\u043E\u0441\u0442\u0443\u043F\u0430 \u043D\u0435 \u0437\u0430\u0434\u0430\u043D." : `\u041A\u043B\u044E\u0447 \u0437\u0430\u0434\u0430\u043D, \u043D\u043E \u0432\u044B\u0433\u043B\u044F\u0434\u0438\u0442 \u043D\u0435\u043F\u0440\u0430\u0432\u0438\u043B\u044C\u043D\u043E. ${detail}`;
@@ -2384,16 +2385,22 @@ var LapseMemory = class {
2384
2385
  /**
2385
2386
  * Спросить сервер фоном. Беду глотаем: наша авария не имеет права ни ронять
2386
2387
  * старт, ни объявлять человеку «подписка кончилась».
2388
+ *
2389
+ * Отдаёт попутные сведения о выложенных версиях (`info`): тем же вопросом
2390
+ * любой вызов узнаёт, не вышло ли новое (`update-nudge.ts`,
2391
+ * `createReleaseWatch`), — второго запроса к серверу это не заводит.
2387
2392
  */
2388
2393
  learn(client) {
2389
2394
  this.#askedAt = Date.now();
2390
- this.#asking = client.postMontage(SDK_SUBSCRIPTION_STATUS_PATH, {}, {
2395
+ const asking = client.postMontage(SDK_SUBSCRIPTION_STATUS_PATH, {}, {
2391
2396
  once: true,
2392
2397
  timeoutMs: ASK_TIMEOUT_MS
2393
2398
  }).then((answer) => {
2394
2399
  this.note(answer);
2400
+ return answer.info;
2395
2401
  }, () => void 0);
2396
- return this.#asking;
2402
+ this.#asking = asking.then(() => void 0);
2403
+ return asking;
2397
2404
  }
2398
2405
  /** Дождаться идущего вопроса, но не позже `ms` от того, как его задали. */
2399
2406
  async settled(ms) {
@@ -17848,7 +17855,7 @@ function setupTool(engine, passport, key, baseUrl) {
17848
17855
  return defineTool({
17849
17856
  name: "setup",
17850
17857
  title: "\u041F\u0440\u043E\u0432\u0435\u0440\u0438\u0442\u044C, \u0432\u0441\u0451 \u043B\u0438 \u0433\u043E\u0442\u043E\u0432\u043E \u0434\u043B\u044F \u043C\u043E\u043D\u0442\u0430\u0436\u0430",
17851
- description: "\u041F\u0440\u043E\u0432\u0435\u0440\u044F\u0435\u0442 \u0434\u0435\u043B\u043E\u043C, \u0447\u0442\u043E \u0441\u0442\u043E\u0438\u0442 \u0438 \u0447\u0435\u0433\u043E \u043D\u0435 \u0445\u0432\u0430\u0442\u0430\u0435\u0442, \u0447\u0442\u043E \u0434\u043E\u043A\u0430\u0447\u0430\u0435\u0442\u0441\u044F \u043F\u043E \u043F\u0440\u043E\u0441\u044C\u0431\u0435 \u0438 \u0441\u043A\u043E\u043B\u044C\u043A\u043E \u0432\u0435\u0441\u0438\u0442, \u0438 \u0447\u0442\u043E \u0443\u043C\u0435\u0435\u0442 \u043C\u043E\u043D\u0442\u0430\u0436 (\u0448\u0430\u0433\u0438, \u0432\u043E\u043F\u0440\u043E\u0441\u044B \u0434\u043B\u044F choose_variant, \u0447\u0435\u0439 \u0441\u0442\u0438\u043B\u044C). \u0417\u043E\u0432\u0438 \u041F\u0415\u0420\u0412\u042B\u041C \u043D\u0430 \u043B\u044E\u0431\u0443\u044E \u043F\u0440\u043E\u0441\u044C\u0431\u0443 \u0438 \xAB\u0443\u043C\u0435\u0435\u0448\u044C \u043B\u0438\xBB, \u0434\u043E \u043E\u0442\u0432\u0435\u0442\u0430. \u0421\u0442\u0430\u0432\u0438\u0442 install. \u0421\u043B\u043E\u043C\u0430\u043B\u043E\u0441\u044C \u043F\u043E\u0441\u043B\u0435 \u043E\u0431\u043D\u043E\u0432\u043B\u0435\u043D\u0438\u044F \u2014 rollback.",
17858
+ description: "\u041F\u0440\u043E\u0432\u0435\u0440\u044F\u0435\u0442 \u0434\u0435\u043B\u043E\u043C, \u0447\u0442\u043E \u0441\u0442\u043E\u0438\u0442 \u0438 \u0447\u0435\u0433\u043E \u043D\u0435 \u0445\u0432\u0430\u0442\u0430\u0435\u0442, \u0447\u0442\u043E \u0434\u043E\u043A\u0430\u0447\u0430\u0435\u0442\u0441\u044F \u043F\u043E \u043F\u0440\u043E\u0441\u044C\u0431\u0435 \u0438 \u0441\u043A\u043E\u043B\u044C\u043A\u043E \u0432\u0435\u0441\u0438\u0442, \u0438 \u0447\u0442\u043E \u0443\u043C\u0435\u0435\u0442 \u043C\u043E\u043D\u0442\u0430\u0436 (\u0448\u0430\u0433\u0438, \u0432\u043E\u043F\u0440\u043E\u0441\u044B \u0434\u043B\u044F choose_variant, \u0447\u0435\u0439 \u0441\u0442\u0438\u043B\u044C). \u0417\u043E\u0432\u0438 \u041F\u0415\u0420\u0412\u042B\u041C \u043D\u0430 \u043B\u044E\u0431\u0443\u044E \u043F\u0440\u043E\u0441\u044C\u0431\u0443 \u0438 \xAB\u0443\u043C\u0435\u0435\u0448\u044C \u043B\u0438\xBB, \u0434\u043E \u043E\u0442\u0432\u0435\u0442\u0430. \u0421\u0442\u0430\u0432\u0438\u0442 install. \u0412\u044B\u0448\u043B\u0430 \u043B\u0438 \u043D\u043E\u0432\u0430\u044F \u0432\u0435\u0440\u0441\u0438\u044F, \u041D\u0415 \u0441\u043C\u043E\u0442\u0440\u0438\u0442: \xAB\u043E\u0431\u043D\u043E\u0432\u0438\xBB \u2014 install \u0441 what=all. \u0421\u043B\u043E\u043C\u0430\u043B\u043E\u0441\u044C \u043F\u043E\u0441\u043B\u0435 \u043E\u0431\u043D\u043E\u0432\u043B\u0435\u043D\u0438\u044F \u2014 rollback.",
17852
17859
  args: external_exports.object({
17853
17860
  model: fromList(
17854
17861
  passport?.["models"],
@@ -17884,12 +17891,12 @@ ${INSTALL_HINT}`);
17884
17891
 
17885
17892
  ${INSTALL_HINT}`);
17886
17893
  }
17887
- var INSTALL_HINT = "\u0421\u0442\u0430\u0432\u0438\u0442 install \u2014 \u0442\u043E\u043B\u044C\u043A\u043E \u043F\u043E\u0441\u043B\u0435 \xAB\u0434\u0430\xBB \u0447\u0435\u043B\u043E\u0432\u0435\u043A\u0430 \u043D\u0430 \u043D\u0430\u0437\u0432\u0430\u043D\u043D\u043E\u0435 \u0441 \u0432\u0435\u0441\u043E\u043C: what=all \u2014 \u0432\u0441\u0451 \u043E\u0431\u044F\u0437\u0430\u0442\u0435\u043B\u044C\u043D\u043E\u0435 \u0438 \u043D\u043E\u0432\u044B\u0435 \u0432\u0435\u0440\u0441\u0438\u0438; speech, cutout, voice \u2014 \u0442\u044F\u0436\u0451\u043B\u043E\u0435 \u043F\u043E \u043F\u0440\u043E\u0441\u044C\u0431\u0435. \u0413\u0434\u0435 \u043D\u0430\u043F\u0438\u0441\u0430\u043D\u043E \xABsetup \u0441 what=\u2026\xBB, \u0437\u043E\u0432\u0438 install \u0441 \u0442\u0435\u043C \u0436\u0435 what.";
17894
+ var INSTALL_HINT = "\u042D\u0442\u0430 \u043F\u0440\u043E\u0432\u0435\u0440\u043A\u0430 \u043D\u0435 \u0441\u043C\u043E\u0442\u0440\u0438\u0442, \u0432\u044B\u0448\u043B\u0430 \u043B\u0438 \u043D\u043E\u0432\u0430\u044F \u0432\u0435\u0440\u0441\u0438\u044F. \u041F\u043E\u043F\u0440\u043E\u0441\u0438\u043B\u0438 \xAB\u043E\u0431\u043D\u043E\u0432\u0438\xBB \u0438\u043B\u0438 \xAB\u0435\u0441\u0442\u044C \u043B\u0438 \u043D\u043E\u0432\u0435\u0435\xBB \u2014 \u043F\u043E\u0437\u043E\u0432\u0438 install \u0441 what=all: \u043E\u043D \u0441\u043F\u0440\u043E\u0441\u0438\u0442 \u0440\u0430\u0437\u0434\u0430\u0447\u0443 \u0438 \u043F\u043E\u0441\u0442\u0430\u0432\u0438\u0442 \u0441\u0432\u0435\u0436\u0435\u0435.\n\u0421\u0442\u0430\u0432\u0438\u0442 install \u2014 \u0442\u043E\u043B\u044C\u043A\u043E \u043F\u043E\u0441\u043B\u0435 \xAB\u0434\u0430\xBB \u0447\u0435\u043B\u043E\u0432\u0435\u043A\u0430 \u043D\u0430 \u043D\u0430\u0437\u0432\u0430\u043D\u043D\u043E\u0435 \u0441 \u0432\u0435\u0441\u043E\u043C: what=all \u2014 \u0432\u0441\u0451 \u043E\u0431\u044F\u0437\u0430\u0442\u0435\u043B\u044C\u043D\u043E\u0435 \u0438 \u043D\u043E\u0432\u044B\u0435 \u0432\u0435\u0440\u0441\u0438\u0438; speech, cutout, voice \u2014 \u0442\u044F\u0436\u0451\u043B\u043E\u0435 \u043F\u043E \u043F\u0440\u043E\u0441\u044C\u0431\u0435. \u0413\u0434\u0435 \u043D\u0430\u043F\u0438\u0441\u0430\u043D\u043E \xABsetup \u0441 what=\u2026\xBB, \u0437\u043E\u0432\u0438 install \u0441 \u0442\u0435\u043C \u0436\u0435 what.";
17888
17895
  function installTool(engine, passport, key, baseUrl) {
17889
17896
  return defineTool({
17890
17897
  name: "install",
17891
17898
  title: "\u041F\u043E\u0441\u0442\u0430\u0432\u0438\u0442\u044C \u0434\u043B\u044F \u043C\u043E\u043D\u0442\u0430\u0436\u0430",
17892
- description: "\u0421\u0442\u0430\u0432\u0438\u0442 \u0438 \u043E\u0431\u043D\u043E\u0432\u043B\u044F\u0435\u0442 \u2014 \u0442\u043E\u043B\u044C\u043A\u043E \u043F\u043E\u0441\u043B\u0435 \xAB\u0434\u0430\xBB \u0447\u0435\u043B\u043E\u0432\u0435\u043A\u0430 \u043D\u0430 \u0442\u043E, \u0447\u0442\u043E \u043D\u0430\u0437\u0432\u0430\u043B\u0430 \u043F\u0440\u043E\u0432\u0435\u0440\u043A\u0430 setup \u0441 \u0432\u0435\u0441\u043E\u043C. \u041E\u0442\u0432\u0435\u0442 \u2014 \u043D\u043E\u043C\u0435\u0440 \u0437\u0430\u0434\u0430\u0447\u0438: \u0436\u0434\u0438 wait. \u041F\u043E\u0432\u0442\u043E\u0440\u043D\u044B\u0439 \u0432\u044B\u0437\u043E\u0432 \u0432\u0435\u0440\u043D\u0451\u0442 \u0442\u0443 \u0436\u0435 \u0437\u0430\u0434\u0430\u0447\u0443.",
17899
+ description: "\u0421\u0442\u0430\u0432\u0438\u0442 \u0438 \u043E\u0431\u043D\u043E\u0432\u043B\u044F\u0435\u0442 \u2014 \u0442\u043E\u043B\u044C\u043A\u043E \u043F\u043E\u0441\u043B\u0435 \xAB\u0434\u0430\xBB \u0447\u0435\u043B\u043E\u0432\u0435\u043A\u0430 \u043D\u0430 \u0442\u043E, \u0447\u0442\u043E \u043D\u0430\u0437\u0432\u0430\u043B\u0430 \u043F\u0440\u043E\u0432\u0435\u0440\u043A\u0430 setup \u0441 \u0432\u0435\u0441\u043E\u043C. \xAB\u041E\u0431\u043D\u043E\u0432\u0438\xBB, \xAB\u0435\u0441\u0442\u044C \u043B\u0438 \u043D\u043E\u0432\u0435\u0435\xBB \u2014 what=all: \u0441\u043F\u0440\u043E\u0441\u0438\u0442 \u0440\u0430\u0437\u0434\u0430\u0447\u0443 \u0438 \u043F\u043E\u0441\u0442\u0430\u0432\u0438\u0442 \u0441\u0432\u0435\u0436\u0435\u0435, setup \u043E \u0432\u0435\u0440\u0441\u0438\u044F\u0445 \u043D\u0435 \u0437\u043D\u0430\u0435\u0442. \u041E\u0442\u0432\u0435\u0442 \u2014 \u043D\u043E\u043C\u0435\u0440 \u0437\u0430\u0434\u0430\u0447\u0438: \u0436\u0434\u0438 wait. \u041F\u043E\u0432\u0442\u043E\u0440\u043D\u044B\u0439 \u0432\u044B\u0437\u043E\u0432 \u0432\u0435\u0440\u043D\u0451\u0442 \u0442\u0443 \u0436\u0435 \u0437\u0430\u0434\u0430\u0447\u0443.",
17893
17900
  ui: { resourceUri: RUNBAR_RESOURCE_URI },
17894
17901
  args: external_exports.object({
17895
17902
  what: external_exports.enum(["all", "speech", "cutout", "voice"]).describe(
@@ -18755,6 +18762,8 @@ function orNull(value, max) {
18755
18762
  }
18756
18763
 
18757
18764
  // src/update-nudge.ts
18765
+ var NEWS_EVERY_MS = 2 * 60 * 1e3;
18766
+ var RETRY_SAME_MS = 30 * 60 * 1e3;
18758
18767
  function usable2(value) {
18759
18768
  return typeof value === "string" && value !== "";
18760
18769
  }
@@ -18768,7 +18777,8 @@ function createUpdateNudge(parts = {}) {
18768
18777
  const update = parts.update ?? (() => {
18769
18778
  processHook?.();
18770
18779
  });
18771
- const asked = /* @__PURE__ */ new Set();
18780
+ const clock = parts.clock ?? Date.now;
18781
+ const asked = /* @__PURE__ */ new Map();
18772
18782
  return (info) => {
18773
18783
  if (info === null || typeof info !== "object") return null;
18774
18784
  const safely = (read, fallback) => {
@@ -18783,13 +18793,47 @@ function createUpdateNudge(parts = {}) {
18783
18793
  const newEngine = usable2(info.engine) && engineNow !== null && info.engine !== engineNow ? info.engine : "";
18784
18794
  if (newShell === "" && newEngine === "") return null;
18785
18795
  const seen = `${newShell}|${newEngine}`;
18786
- if (asked.has(seen)) return null;
18787
- asked.add(seen);
18796
+ const now = clock();
18797
+ const was = asked.get(seen);
18798
+ if (was !== void 0 && now - was < RETRY_SAME_MS) return null;
18799
+ asked.set(seen, now);
18788
18800
  update();
18789
18801
  return null;
18790
18802
  };
18791
18803
  }
18792
18804
  var processUpdateNudge = createUpdateNudge();
18805
+ function createReleaseWatch(parts) {
18806
+ const clock = parts.clock ?? Date.now;
18807
+ const nudge = parts.nudge ?? processUpdateNudge;
18808
+ let askedAt = null;
18809
+ let asking = null;
18810
+ return {
18811
+ poke() {
18812
+ if (asking !== null) return asking;
18813
+ const now = clock();
18814
+ if (askedAt !== null && now - askedAt < NEWS_EVERY_MS) return Promise.resolve();
18815
+ askedAt = now;
18816
+ asking = parts.ask().then((info) => {
18817
+ nudge(info);
18818
+ }, () => void 0).finally(() => {
18819
+ asking = null;
18820
+ });
18821
+ return asking;
18822
+ }
18823
+ };
18824
+ }
18825
+ function withReleaseWatch(watch) {
18826
+ return (tool) => {
18827
+ const original = tool.execute.bind(tool);
18828
+ return {
18829
+ ...tool,
18830
+ execute(input, ...rest) {
18831
+ void watch.poke();
18832
+ return original(input, ...rest);
18833
+ }
18834
+ };
18835
+ };
18836
+ }
18793
18837
  var TRIAL_AXES = ["motion", "timing", "place", "camera", "color"];
18794
18838
  var TRIALS_MAX = 10;
18795
18839
  async function startRender(engine, asked, key, tell) {
@@ -23115,7 +23159,15 @@ function buildAll(client, engine, passport, key, baseUrl, pace = realPace, awake
23115
23159
  // того как решит монтировать своим кодом. Описка отбивается раньше — ей блок ни к чему.
23116
23160
  // Привычки работы (`habits.ts`) — под блоком подписки: кончилась подписка —
23117
23161
  // первым она читает это, а не «заведи шаги».
23118
- ].map(withSubscription(client)).map(withHabits()).map(withLapse()).map(withArgs).map(withCrashReport(crashes)).map(withWakefulness(awake)).map(withCallLog(engine.home()));
23162
+ //
23163
+ // ⚠ СТОРОЖ НОВЫХ ВЕРСИЙ — НА ЛЮБОМ ВЫЗОВЕ И СНАРУЖИ СВЕРКИ (`update-nudge.ts`).
23164
+ // Беда владельца 2026-09-26: новость о версии ездила только ответом подписки
23165
+ // ПЛАТНОГО вызова, а он звал `setup` и `plan` без видео — и новое не вставало
23166
+ // часами. Снаружи сверки — потому что и отбитый вызов был ходом модели.
23167
+ // Без ключа спрашивать нечем: ответ был бы отказом.
23168
+ ].map(withSubscription(client)).map(withHabits()).map(withLapse()).map(withArgs).map(withReleaseWatch(createReleaseWatch({
23169
+ ask: key === void 0 || key === "" ? async () => void 0 : () => processLapse.learn(client)
23170
+ }))).map(withCrashReport(crashes)).map(withWakefulness(awake)).map(withCallLog(engine.home()));
23119
23171
  }
23120
23172
  function buildResources() {
23121
23173
  return [chooseResource(), runbarResource()];
package/dist/cli.js CHANGED
@@ -15,7 +15,7 @@
15
15
  // партитуры и свои рабочие файлы, монтируй, смотри любое видео, которое дал
16
16
  // владелец, в том числе чужое. На «что ты умеешь» отвечай спокойно: ЧТО файл
17
17
  // умеет — можно, КАК он это делает — нет.
18
- import { Engine, chooseBody, handOverToBody, VERSION, rollback, rollbackShell, remove, fromNpxCache, install, keyFromBlock, readConfig, ForeignBlockError, McpServer, watchProcessCrashes, reportInstallFaults, noteInstallFault, StdioServerTransport, startupInstructions, processLapse, fromHost, WHERE_TO_GET_KEY, Wakefulness, systemBlocker, updateEngine, installStep, currentMachineFingerprint, CrashReporter, whenNewerReleased, buildAll, realPace, buildResources, shellDir, describeFailure, compare, toolError, NaparnikApiClient, ownSetupJobRunning, forModel, installedShell, startSetupJob, TITLE_UPDATE, runUpdate, setupJobDone, reportJobFaults, setupJobEnding, NaparnikConfigError, installMissing } from './chunk-EGCZKU2L.js';
18
+ import { Engine, chooseBody, handOverToBody, VERSION, rollback, rollbackShell, remove, fromNpxCache, install, keyFromBlock, readConfig, ForeignBlockError, McpServer, watchProcessCrashes, reportInstallFaults, noteInstallFault, StdioServerTransport, startupInstructions, processLapse, fromHost, WHERE_TO_GET_KEY, Wakefulness, systemBlocker, updateEngine, installStep, currentMachineFingerprint, CrashReporter, whenNewerReleased, buildAll, realPace, buildResources, shellDir, describeFailure, compare, toolError, NaparnikApiClient, ownSetupJobRunning, forModel, installedShell, startSetupJob, TITLE_UPDATE, runUpdate, setupJobDone, reportJobFaults, setupJobEnding, NaparnikConfigError, installMissing } from './chunk-FSL45XXQ.js';
19
19
  import { realpathSync, readFileSync } from 'fs';
20
20
  import { join } from 'path';
21
21
  import { fileURLToPath, pathToFileURL } from 'url';
package/dist/index.d.ts CHANGED
@@ -1229,9 +1229,9 @@ declare class NaparnikConfigError extends NaparnikError {
1229
1229
  * годится ли она для новой начинки: разойдись она с пакетом, и в логах будет
1230
1230
  * стоять чужое число, а обновление начнёт считать оболочку не той.
1231
1231
  */
1232
- declare const VERSION = "0.10.70";
1232
+ declare const VERSION = "0.10.72";
1233
1233
  /** Как мы представляемся серверу Напарника. По нему в логах видно оболочку. */
1234
- declare const USER_AGENT = "naparnik-mcp/0.10.70";
1234
+ declare const USER_AGENT = "naparnik-mcp/0.10.72";
1235
1235
  /**
1236
1236
  * Самая старая начинка (движок монтажа), с которой эта оболочка работает.
1237
1237
  * Обновление начинки ниже этой версии не ставится, а выше — требует оболочки
package/dist/index.js CHANGED
@@ -14,4 +14,4 @@
14
14
  // партитуры и свои рабочие файлы, монтируй, смотри любое видео, которое дал
15
15
  // владелец, в том числе чужое. На «что ты умеешь» отвечай спокойно: ЧТО файл
16
16
  // умеет — можно, КАК он это делает — нет.
17
- export { DEFAULT_HOME, DeliveryError, Engine, ForeignBlockError, INSTALL_STEPS, KEEP_COPIES, KEEP_VERSIONS, LOCK_FILE, LONG_STEPS, MANIFEST_TIMEOUT_MS, MANIFEST_URL, MARKER, MIN_ENGINE, NaparnikApiClient, NaparnikAuthError, NaparnikClientError, NaparnikConfigError, NaparnikError, NaparnikInsufficientBalanceError, NaparnikScopeError, NaparnikServerError, NaparnikTimeoutError, PAUSE_HOURS, SERVER_NAME, START_SEC, TOOL_SEC, USER_AGENT, VERSION, bringPython, buildAll, buildBlock, buildResources, compare, configPath, decide, defineTool, depFolderName, deploy, downloadFile, fetchManifest, fileOrRefusal, findBlock, fromNpxCache, inside, install, installPayload, jsonSchemaOf, keyInTable, lastLine, loadConfig, lockedPython, markChecked, markCurrent, parseEngineManifest, parseFailure, path, platformKey, previousVersion, probe, refusalFor, remove, rollback, tarEntries, tidyOld, timeToCheck, unpackArchive, withArgs } from './chunk-EGCZKU2L.js';
17
+ export { DEFAULT_HOME, DeliveryError, Engine, ForeignBlockError, INSTALL_STEPS, KEEP_COPIES, KEEP_VERSIONS, LOCK_FILE, LONG_STEPS, MANIFEST_TIMEOUT_MS, MANIFEST_URL, MARKER, MIN_ENGINE, NaparnikApiClient, NaparnikAuthError, NaparnikClientError, NaparnikConfigError, NaparnikError, NaparnikInsufficientBalanceError, NaparnikScopeError, NaparnikServerError, NaparnikTimeoutError, PAUSE_HOURS, SERVER_NAME, START_SEC, TOOL_SEC, USER_AGENT, VERSION, bringPython, buildAll, buildBlock, buildResources, compare, configPath, decide, defineTool, depFolderName, deploy, downloadFile, fetchManifest, fileOrRefusal, findBlock, fromNpxCache, inside, install, installPayload, jsonSchemaOf, keyInTable, lastLine, loadConfig, lockedPython, markChecked, markCurrent, parseEngineManifest, parseFailure, path, platformKey, previousVersion, probe, refusalFor, remove, rollback, tarEntries, tidyOld, timeToCheck, unpackArchive, withArgs } from './chunk-FSL45XXQ.js';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@naparnik/mcp",
3
- "version": "0.10.70",
3
+ "version": "0.10.72",
4
4
  "description": "MCP-сервер Напарника: монтаж вертикального видео на машине пользователя — паузы, субтитры, герой на новом фоне, звук. Видео никуда не уезжает.",
5
5
  "license": "SEE LICENSE IN LICENSE.md",
6
6
  "private": false,