@naparnik/mcp 0.10.41 → 0.10.43

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,21 @@
1
1
  # Изменения @naparnik/mcp
2
2
 
3
+ ## 0.10.43 — 2026-09-24. Пять версий для пробного режима
4
+
5
+ Скажи «сделай ещё 5 для пробного режима» — после основного ролика монтаж
6
+ соберёт пять версий. Речь и резы те же, а движение, время вставок и их
7
+ места разные. Цвет меняется, только если попросишь.
8
+
9
+ Монтаж стал быстрее, а компьютер при этом не подвисает.
10
+
11
+ ## 0.10.42 — 2026-09-24. Карточка говорит проще
12
+
13
+ Под проверкой пять строк вместо десяти: монтаж, субтитры, графика и
14
+ анимация, замена фона, чистка голоса. Сверху сразу видно, всё ли готово
15
+ или сколько нужно скачать. Чтобы докачать, просто напиши «скачай».
16
+
17
+ Пока идёт установка, наверху написано, что ставится: «Ставлю субтитры».
18
+
3
19
  ## 0.10.41 — 2026-09-24. Новый файл из бота не выключает монтаж раньше времени
4
20
 
5
21
  Взяли в боте новый файл — прежняя установка работает, пока вы его не
@@ -673,6 +673,7 @@ function describeFailure(err) {
673
673
 
674
674
  // src/key-source.ts
675
675
  var KEY_SOURCE_BOT = "t.me/ai_montazh_bot";
676
+ var KEY_SOURCE_HANDLE = `@${KEY_SOURCE_BOT.split("/").pop() ?? ""}`;
676
677
  var WHERE_TO_GET_KEY = `\u041A\u043B\u044E\u0447 \u0432\u044B\u0434\u0430\u0451\u0442 \u0431\u043E\u0442 \u043F\u043E\u0434\u043F\u0438\u0441\u043A\u0438 ${KEY_SOURCE_BOT} \u2014 \u043D\u0430\u043F\u0438\u0448\u0438\u0442\u0435 \u0435\u043C\u0443 \xAB\u041F\u043E\u043B\u0443\u0447\u0438\u0442\u044C \u043A\u043B\u044E\u0447\xBB.`;
677
678
 
678
679
  // src/config.ts
@@ -727,9 +728,9 @@ function parsePositiveInt(raw, fallback) {
727
728
  }
728
729
 
729
730
  // src/version.ts
730
- var VERSION = "0.10.41";
731
+ var VERSION = "0.10.43";
731
732
  var USER_AGENT = `naparnik-mcp/${VERSION}`;
732
- var MIN_ENGINE = "2026.09.24-446";
733
+ var MIN_ENGINE = "2026.09.24-466";
733
734
  var LAUNCHER_PROTOCOL = 1;
734
735
 
735
736
  // src/contracts/sdk-headers.ts
@@ -15838,6 +15839,21 @@ function empty() {
15838
15839
  function startedJob(o) {
15839
15840
  return { ...empty(), id: o.id, what: o.what, ahead: o.ahead, message: o.message };
15840
15841
  }
15842
+ var INSTALL_TITLES = {
15843
+ all: "\u0421\u0442\u0430\u0432\u043B\u044E \u043C\u043E\u043D\u0442\u0430\u0436",
15844
+ check: "\u041F\u0440\u043E\u0432\u0435\u0440\u044F\u044E",
15845
+ python: "\u0421\u0442\u0430\u0432\u043B\u044E \u043C\u043E\u043D\u0442\u0430\u0436",
15846
+ ffmpeg: "\u0421\u0442\u0430\u0432\u043B\u044E \u043C\u043E\u043D\u0442\u0430\u0436",
15847
+ env: "\u0421\u0442\u0430\u0432\u043B\u044E \u043C\u043E\u043D\u0442\u0430\u0436",
15848
+ model: "\u0421\u0442\u0430\u0432\u043B\u044E \u0441\u0443\u0431\u0442\u0438\u0442\u0440\u044B",
15849
+ browser: "\u0421\u0442\u0430\u0432\u043B\u044E \u0433\u0440\u0430\u0444\u0438\u043A\u0443",
15850
+ cutout: "\u0421\u0442\u0430\u0432\u043B\u044E \u0437\u0430\u043C\u0435\u043D\u0443 \u0444\u043E\u043D\u0430",
15851
+ voice: "\u0421\u0442\u0430\u0432\u043B\u044E \u0447\u0438\u0441\u0442\u043A\u0443 \u0433\u043E\u043B\u043E\u0441\u0430"
15852
+ };
15853
+ function installTitle(step) {
15854
+ return INSTALL_TITLES[step] ?? "\u0421\u0442\u0430\u0432\u043B\u044E \u043C\u043E\u043D\u0442\u0430\u0436";
15855
+ }
15856
+ var INSTALL_HEAD = /^установка: (\S+)$/;
15841
15857
  var HEAD = /^Задание (\S+): ?(.*)$/;
15842
15858
  var BEHIND = /^Позади: (.+)$/;
15843
15859
  var NOW = /^Этап (\d+) из (\d+): (.+)$/;
@@ -15863,6 +15879,8 @@ function readJob(text2) {
15863
15879
  const job = empty();
15864
15880
  job.id = head2[1] ?? "";
15865
15881
  job.what = (head2[2] ?? "").trim();
15882
+ const install2 = INSTALL_HEAD.exec(job.what);
15883
+ if (install2 !== null) job.what = installTitle(install2[1] ?? "");
15866
15884
  let tail2 = null;
15867
15885
  for (const row of lines.slice(1)) {
15868
15886
  const line = row.trim();
@@ -16464,6 +16482,10 @@ function knowsJsonCheck(engineDir) {
16464
16482
  return false;
16465
16483
  }
16466
16484
  }
16485
+ var STATES = /* @__PURE__ */ new Set(["ok", "missing", "later"]);
16486
+ function megabytes(value) {
16487
+ return typeof value === "number" && value > 0 ? Math.round(value) : 0;
16488
+ }
16467
16489
  function readReadiness(stdout) {
16468
16490
  const lines = stdout.trim().split("\n");
16469
16491
  let raw;
@@ -16483,57 +16505,93 @@ function readReadiness(stdout) {
16483
16505
  name: part["name"],
16484
16506
  title: typeof part["title"] === "string" && part["title"] !== "" ? part["title"] : part["name"],
16485
16507
  ok: part["ok"] === true,
16486
- mb: typeof part["mb"] === "number" && part["mb"] > 0 ? Math.round(part["mb"]) : 0,
16508
+ mb: megabytes(part["mb"]),
16487
16509
  on_demand: part["on_demand"] === true,
16488
16510
  step: typeof part["step"] === "string" ? part["step"] : ""
16489
16511
  });
16490
16512
  }
16491
- return { words: data["words"], ready: data["ready"] === true, parts };
16513
+ let rows = null;
16514
+ if (Array.isArray(data["rows"])) {
16515
+ rows = [];
16516
+ for (const item of data["rows"]) {
16517
+ const row = item;
16518
+ if (row === null || typeof row !== "object" || typeof row["title"] !== "string") continue;
16519
+ const state = row["state"];
16520
+ if (typeof state !== "string" || !STATES.has(state)) continue;
16521
+ rows.push({ title: row["title"], state, mb: megabytes(row["mb"]) });
16522
+ }
16523
+ }
16524
+ return { words: data["words"], ready: data["ready"] === true, parts, rows };
16492
16525
  }
16493
16526
  var NOT_A_ROW = /* @__PURE__ */ new Set(["system"]);
16527
+ var TITLE_READY = "\u0412\u0441\u0451 \u0433\u043E\u0442\u043E\u0432\u043E \u2014 \u043C\u043E\u0436\u043D\u043E \u043D\u0430\u0447\u0438\u043D\u0430\u0442\u044C \u043C\u043E\u043D\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C :)";
16528
+ var TITLE_UNKNOWN = "\u041F\u0440\u043E\u0432\u0435\u0440\u044F\u044E, \u0447\u0442\u043E \u0443\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D\u043E";
16529
+ var TITLE_UPDATING = "\u041E\u0431\u043D\u043E\u0432\u043B\u044F\u044E \u043C\u043E\u043D\u0442\u0430\u0436";
16494
16530
  function weight(mb) {
16495
16531
  if (mb >= 1e3) return `${(mb / 1024).toFixed(1).replace(".", ",")} \u0413\u0411`;
16496
16532
  return `${mb} \u041C\u0411`;
16497
16533
  }
16534
+ function rowWords(state, mb) {
16535
+ if (state === "ok") return "\u0435\u0441\u0442\u044C";
16536
+ if (state === "later") return `\u0443\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u044E, \u0435\u0441\u043B\u0438 \u0434\u0430\u0448\u044C \u0441\u043E\u0433\u043B\u0430\u0441\u0438\u0435${mb ? ` \xB7 ${weight(mb)}` : ""}`;
16537
+ return mb ? `\u043D\u0435\u043E\u0431\u0445\u043E\u0434\u0438\u043C\u043E \u0441\u043A\u0430\u0447\u0430\u0442\u044C \xB7 ${weight(mb)}` : "\u043D\u0435 \u0445\u0432\u0430\u0442\u0430\u0435\u0442";
16538
+ }
16539
+ function firstPhrase(notes) {
16540
+ const paragraph = notes.trim().split(/\n\s*\n/)[0] ?? "";
16541
+ const plain = paragraph.replaceAll("*", "").replace(/^[#\s-]+/, "").replace(/\s+/g, " ").trim();
16542
+ const sentence = /^(.+?[.!?…])(?:\s|$)/.exec(plain);
16543
+ return (sentence?.[1] ?? plain).trim();
16544
+ }
16498
16545
  function refusalWords(status) {
16499
- if (status === 401) {
16500
- return `\u041A\u043B\u044E\u0447 \u043F\u043E\u0434\u043F\u0438\u0441\u043A\u0438 \u043D\u0435 \u043F\u0440\u0438\u043D\u044F\u0442 \u2014 \u043D\u043E\u0432\u044B\u0435 \u0432\u0435\u0440\u0441\u0438\u0438 \u043D\u0435 \u043F\u0440\u043E\u0432\u0435\u0440\u0438\u0442\u044C. \u0427\u0442\u043E \u0434\u0435\u043B\u0430\u0442\u044C: \u043D\u0430\u043F\u0438\u0448\u0438\u0442\u0435 \u0431\u043E\u0442\u0443 ${KEY_SOURCE_BOT} \xAB\u041F\u043E\u043B\u0443\u0447\u0438\u0442\u044C \u043A\u043B\u044E\u0447\xBB.`;
16501
- }
16502
- if (status === 403) {
16503
- return `\u041F\u043E\u0434\u043F\u0438\u0441\u043A\u0430 \u043A\u043E\u043D\u0447\u0438\u043B\u0430\u0441\u044C \u2014 \u043D\u043E\u0432\u044B\u0435 \u0432\u0435\u0440\u0441\u0438\u0438 \u043D\u0435 \u043F\u0440\u0438\u0445\u043E\u0434\u044F\u0442. \u0427\u0442\u043E \u0434\u0435\u043B\u0430\u0442\u044C: \u043F\u0440\u043E\u0434\u043B\u0438\u0442\u0435 \u0435\u0451 \u0443 \u0431\u043E\u0442\u0430 ${KEY_SOURCE_BOT}.`;
16504
- }
16546
+ if (status === 401) return `\u041A\u043B\u044E\u0447 \u043D\u0435 \u043F\u043E\u0434\u0445\u043E\u0434\u0438\u0442. \u0412\u043E\u0437\u044C\u043C\u0438 \u043D\u043E\u0432\u044B\u0439 \u0444\u0430\u0439\u043B \u0432 \u0442\u0435\u043B\u0435\u0433\u0440\u0430\u043C-\u0431\u043E\u0442\u0435 ${KEY_SOURCE_HANDLE}.`;
16547
+ if (status === 403) return `\u041F\u043E\u0434\u043F\u0438\u0441\u043A\u0430 \u0437\u0430\u043A\u043E\u043D\u0447\u0438\u043B\u0430\u0441\u044C. \u041F\u0440\u043E\u0434\u043B\u0438 \u0435\u0451 \u0432 \u0442\u0435\u043B\u0435\u0433\u0440\u0430\u043C-\u0431\u043E\u0442\u0435 ${KEY_SOURCE_HANDLE}.`;
16505
16548
  return "";
16506
16549
  }
16507
- function setupCard(o) {
16508
- const rows = (o.readiness?.parts ?? []).filter((part) => !NOT_A_ROW.has(part.name)).map((part) => ({
16550
+ function updateWords(shell, engine) {
16551
+ if (!shell?.fresh && !engine?.fresh) return "";
16552
+ const notes = shell?.fresh ? firstPhrase(shell.notes) : "";
16553
+ return [
16554
+ `\u0414\u043E\u0441\u0442\u0443\u043F\u043D\u0430 \u043D\u043E\u0432\u0430\u044F \u0432\u0435\u0440\u0441\u0438\u044F \u043C\u043E\u043D\u0442\u0430\u0436\u0451\u0440\u0430.${notes ? ` \u041F\u043E\u044F\u0432\u0438\u043B\u043E\u0441\u044C: ${notes}` : ""}`,
16555
+ "\u041E\u0431\u043D\u043E\u0432\u0438\u0442\u044C \u0434\u043E \u043D\u043E\u0432\u043E\u0439 \u0432\u0435\u0440\u0441\u0438\u0438?",
16556
+ "\u041F\u0440\u043E\u0441\u0442\u043E \u043D\u0430\u043F\u0438\u0448\u0438 \xAB\u043E\u0431\u043D\u043E\u0432\u0438\xBB."
16557
+ ].join("\n");
16558
+ }
16559
+ function cardRows(readiness) {
16560
+ const rows = readiness?.rows ?? (readiness?.parts ?? []).filter((part) => !NOT_A_ROW.has(part.name)).map((part) => ({
16509
16561
  title: part.title,
16510
16562
  state: part.ok ? "ok" : part.on_demand ? "later" : "missing",
16511
16563
  mb: part.ok ? 0 : part.mb
16512
16564
  }));
16565
+ return rows.map((row) => ({ ...row, mb: row.state === "ok" ? 0 : row.mb, say: rowWords(row.state, row.mb) }));
16566
+ }
16567
+ function setupCard(o) {
16568
+ const rows = cardRows(o.readiness);
16513
16569
  const missingMb = rows.filter((row) => row.state === "missing").reduce((all, row) => all + row.mb, 0);
16514
- const ready = o.readiness?.ready === true;
16515
- const fresh = [];
16516
- if (o.shell?.fresh) fresh.push(`\u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043D\u0438\u0435 ${o.shell.fresh}${o.shell.mb ? ` (${weight(o.shell.mb)})` : ""}`);
16517
- if (o.engine?.fresh) fresh.push(`\u0434\u0432\u0438\u0436\u043E\u043A ${o.engine.fresh}${o.engine.mb ? ` (${weight(o.engine.mb)})` : ""}`);
16518
- const update = fresh.length ? `\u0412\u044B\u0448\u043B\u043E \u043D\u043E\u0432\u043E\u0435: ${fresh.join(", ")}.` : "";
16519
- const trouble = refusalWords(o.shell?.status ?? 0) || refusalWords(o.engine?.status ?? 0);
16570
+ const ready = o.readiness === null ? false : o.readiness.rows !== null ? rows.every((row) => row.state !== "missing") : o.readiness.ready;
16571
+ let title;
16520
16572
  let next;
16521
- if (o.noEngine) next = "\u0414\u0432\u0438\u0436\u043A\u0430 \u043C\u043E\u043D\u0442\u0430\u0436\u0430 \u0435\u0449\u0451 \u043D\u0435\u0442. \u0421\u043A\u0430\u0436\u0438\u0442\u0435 \xAB\u043F\u043E\u0441\u0442\u0430\u0432\u044C\xBB \u2014 \u043E\u043D \u0441\u043A\u0430\u0447\u0430\u0435\u0442\u0441\u044F \u043F\u043E\u0441\u043B\u0435 \u0432\u0430\u0448\u0435\u0433\u043E \xAB\u0434\u0430\xBB.";
16522
- else if (o.noPython) next = "\u041D\u0443\u0436\u0435\u043D Python. \u0421\u043A\u0430\u0436\u0438\u0442\u0435 \xAB\u043F\u043E\u0441\u0442\u0430\u0432\u044C\xBB \u2014 \u043E\u043D \u0441\u043A\u0430\u0447\u0430\u0435\u0442\u0441\u044F \u043F\u043E\u0441\u043B\u0435 \u0432\u0430\u0448\u0435\u0433\u043E \xAB\u0434\u0430\xBB.";
16523
- else if (o.readiness === null) next = o.note ?? "";
16524
- else if (!ready) {
16525
- next = `\u0414\u043B\u044F \u043C\u043E\u043D\u0442\u0430\u0436\u0430 \u043D\u0435 \u0445\u0432\u0430\u0442\u0430\u0435\u0442${missingMb ? ` ${weight(missingMb)}` : " \u0447\u0430\u0441\u0442\u0438"}. \u0421\u043A\u0430\u0436\u0438\u0442\u0435 \xAB\u043F\u043E\u0441\u0442\u0430\u0432\u044C\xBB \u2014 \u0434\u043E\u043A\u0430\u0447\u0430\u0435\u0442\u0441\u044F \u043F\u043E\u0441\u043B\u0435 \u0432\u0430\u0448\u0435\u0433\u043E \xAB\u0434\u0430\xBB.`;
16526
- } else if (update !== "") next = "\u041C\u043E\u0436\u043D\u043E \u043C\u043E\u043D\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C. \u0421\u043A\u0430\u0436\u0438\u0442\u0435 \xAB\u043E\u0431\u043D\u043E\u0432\u0438\xBB \u2014 \u043D\u043E\u0432\u043E\u0435 \u0437\u0430\u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442 \u043F\u043E\u0441\u043B\u0435 \u043F\u0435\u0440\u0435\u0437\u0430\u043F\u0443\u0441\u043A\u0430.";
16527
- else next = "\u0412\u0441\u0451 \u043D\u0430 \u043C\u0435\u0441\u0442\u0435 \u2014 \u043C\u043E\u0436\u043D\u043E \u043C\u043E\u043D\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C.";
16573
+ if (o.noEngine || o.noPython) {
16574
+ title = "\u041D\u0435\u043E\u0431\u0445\u043E\u0434\u0438\u043C\u043E \u0441\u043A\u0430\u0447\u0430\u0442\u044C \u043C\u043E\u043D\u0442\u0430\u0436 \u0434\u043B\u044F \u043F\u043E\u043B\u043D\u043E\u0446\u0435\u043D\u043D\u043E\u0439 \u0440\u0430\u0431\u043E\u0442\u044B";
16575
+ next = `\u041D\u0430\u043F\u0438\u0448\u0438 \xAB\u0441\u043A\u0430\u0447\u0430\u0439\xBB \u2014 \u0441\u043A\u0430\u0447\u0430\u044E ${o.noEngine ? "\u043C\u043E\u043D\u0442\u0430\u0436" : "Python"}.`;
16576
+ } else if (o.readiness === null) {
16577
+ title = o.title ?? TITLE_UNKNOWN;
16578
+ next = o.note ?? "";
16579
+ } else if (!ready) {
16580
+ title = missingMb ? `\u041D\u0435\u043E\u0431\u0445\u043E\u0434\u0438\u043C\u043E \u0441\u043A\u0430\u0447\u0430\u0442\u044C ${weight(missingMb)} \u0434\u043B\u044F \u043F\u043E\u043B\u043D\u043E\u0446\u0435\u043D\u043D\u043E\u0439 \u0440\u0430\u0431\u043E\u0442\u044B` : "\u041D\u0435 \u0432\u0441\u0451 \u0433\u043E\u0442\u043E\u0432\u043E \u0434\u043B\u044F \u043F\u043E\u043B\u043D\u043E\u0446\u0435\u043D\u043D\u043E\u0439 \u0440\u0430\u0431\u043E\u0442\u044B";
16581
+ next = missingMb ? `\u041D\u0430\u043F\u0438\u0448\u0438 \xAB\u0441\u043A\u0430\u0447\u0430\u0439\xBB \u2014 \u0441\u043A\u0430\u0447\u0430\u044E ${weight(missingMb)}.` : "\u041D\u0430\u043F\u0438\u0448\u0438 \xAB\u0441\u043A\u0430\u0447\u0430\u0439\xBB \u2014 \u043F\u043E\u0441\u0442\u0430\u0432\u043B\u044E, \u0447\u0435\u0433\u043E \u043D\u0435 \u0445\u0432\u0430\u0442\u0430\u0435\u0442.";
16582
+ } else {
16583
+ title = TITLE_READY;
16584
+ next = "";
16585
+ }
16528
16586
  return {
16529
16587
  contract: SETUP_CONTRACT,
16530
- engine: o.engine?.installed ?? "",
16531
- shell: o.shellVersion,
16588
+ title,
16589
+ meta: `\u0432\u0435\u0440\u0441\u0438\u044F ${o.shellVersion}`,
16532
16590
  ready,
16533
16591
  rows,
16534
16592
  missingMb,
16535
- update,
16536
- trouble,
16593
+ update: updateWords(o.shell, o.engine),
16594
+ trouble: refusalWords(o.shell?.status ?? 0) || refusalWords(o.engine?.status ?? 0),
16537
16595
  next
16538
16596
  };
16539
16597
  }
@@ -16742,10 +16800,6 @@ function runbarWidgetHtml() {
16742
16800
  background: var(--note-dot);
16743
16801
  }
16744
16802
 
16745
- /* \u041F\u043E\u0437\u0430\u0434\u0438 \u0438 \u0434\u0430\u043B\u044C\u0448\u0435 \u2014 \u0442\u0438\u0445\u0438\u043C \u043A\u0435\u0433\u043B\u0435\u043C: \u044D\u0442\u043E \u0441\u043F\u0440\u0430\u0432\u043A\u0430, \u0430 \u043D\u0435 \u043E\u0442\u0432\u0435\u0442 \u043D\u0430 \xAB\u0433\u0434\u0435 \u044F \u0441\u0435\u0439\u0447\u0430\u0441\xBB. */
16746
- .side { margin: 10px 0 0; color: var(--ink-soft); font-size: 12.5px; line-height: 1.45; }
16747
- .side[hidden] { display: none; }
16748
- .side b { font-weight: 650; color: var(--ink); }
16749
16803
 
16750
16804
  /* \u2500\u2500\u2500 \u0428\u043A\u0430\u043B\u0430: \u0441\u043A\u043E\u043B\u044C\u043A\u043E \u0441\u043A\u0430\u0447\u0430\u043D\u043E, \u0441\u043A\u043E\u043B\u044C\u043A\u043E \u0433\u043E\u0442\u043E\u0432\u043E \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */
16751
16805
 
@@ -16787,6 +16841,8 @@ function runbarWidgetHtml() {
16787
16841
  .card[hidden] { display: none; }
16788
16842
  .card__meta { margin: 4px 0 0; color: var(--ink-soft); font-size: 12.5px; font-variant-numeric: tabular-nums; }
16789
16843
  .card__meta[hidden] { display: none; }
16844
+ /* \u041D\u043E\u0432\u043E\u0441\u0442\u044C \u043E \u0432\u0435\u0440\u0441\u0438\u0438 \u2014 \u0442\u0440\u0438 \u0441\u0442\u0440\u043E\u043A\u0438 \u0432\u043B\u0430\u0434\u0435\u043B\u044C\u0446\u0430: \u0447\u0442\u043E \u0432\u044B\u0448\u043B\u043E, \u0432\u043E\u043F\u0440\u043E\u0441, \u0447\u0442\u043E \u043D\u0430\u043F\u0438\u0441\u0430\u0442\u044C. */
16845
+ #cardUpdate { white-space: pre-line; }
16790
16846
  .parts { display: grid; gap: 2px 18px; margin: 14px 0 0; padding: 0; list-style: none; }
16791
16847
  .parts[hidden] { display: none; }
16792
16848
  .part {
@@ -16971,13 +17027,13 @@ function runbarWidgetHtml() {
16971
17027
  </head>
16972
17028
  <body>
16973
17029
  <div class="head">
16974
- <h2 id="what">\u0420\u0430\u0431\u043E\u0442\u0430\u044E</h2>
17030
+ <h2 id="what" hidden></h2>
16975
17031
  <span class="clock" id="clock" hidden></span>
16976
17032
  </div>
16977
17033
  <ol class="rail" id="rail" hidden></ol>
16978
17034
  <div class="now" id="now">
16979
17035
  <span>
16980
- <strong class="now__t" id="nowTitle">\u041D\u0430\u0447\u0438\u043D\u0430\u044E\u2026</strong>
17036
+ <strong class="now__t" id="nowTitle">\u041D\u0430\u0447\u0438\u043D\u0430\u044E</strong>
16981
17037
  <span class="now__c" id="nowLeft" hidden></span>
16982
17038
  </span>
16983
17039
  </div>
@@ -16995,8 +17051,6 @@ function runbarWidgetHtml() {
16995
17051
  <div class="note" id="cardTrouble" hidden></div>
16996
17052
  <p class="next" id="cardNext" hidden></p>
16997
17053
  </section>
16998
- <p class="side" id="behind" hidden></p>
16999
- <p class="side" id="ahead" hidden></p>
17000
17054
  <div class="end" id="end" hidden>
17001
17055
  <span class="end__m" aria-hidden="true"></span>
17002
17056
  <span class="end__x">
@@ -17153,7 +17207,9 @@ function runbarWidgetHtml() {
17153
17207
  byId('card').hidden = true;
17154
17208
  var ended = !working(data.status);
17155
17209
 
17156
- show('what', data.what || '\u0420\u0430\u0431\u043E\u0442\u0430\u044E');
17210
+ // \u26A0 \u041E\u0411\u0429\u0415\u0419 \u0417\u0410\u0413\u041B\u0423\u0428\u041A\u0418 \xAB\u0420\u0410\u0411\u041E\u0422\u0410\u042E\xBB \u041D\u0415\u0422 (\u0432\u043B\u0430\u0434\u0435\u043B\u0435\u0446 2026-09-24): \u0437\u0430\u0433\u043E\u043B\u043E\u0432\u043E\u043A \u2014 \u0441\u0440\u0430\u0437\u0443
17211
+ // \u043D\u0430\u0437\u0432\u0430\u043D\u0438\u0435 \u0440\u0430\u0431\u043E\u0442\u044B, \u0430 \u043D\u0435 \u0441\u043B\u043E\u0432\u043E, \u043A\u043E\u0442\u043E\u0440\u043E\u0435 \u043D\u0438\u0447\u0435\u0433\u043E \u043D\u0435 \u0433\u043E\u0432\u043E\u0440\u0438\u0442.
17212
+ show('what', data.what || '');
17157
17213
  var clock = byId('clock');
17158
17214
  if (clock) {
17159
17215
  clock.textContent = (ended ? '' : '\u0438\u0434\u0451\u0442 ') + howLong(data.sec);
@@ -17166,8 +17222,8 @@ function runbarWidgetHtml() {
17166
17222
  var now = byId('now');
17167
17223
  if (now) now.hidden = ended;
17168
17224
  if (!ended) {
17169
- var title = data.now || (data.status === 'waiting' ? '\u0416\u0434\u0443 \u043E\u0447\u0435\u0440\u0435\u0434\u0438' : '\u041D\u0430\u0447\u0438\u043D\u0430\u044E\u2026');
17170
- if (data.at && data.total) title = title + ' \xB7 \u044D\u0442\u0430\u043F ' + data.at + ' \u0438\u0437 ' + data.total;
17225
+ var title = data.now || (data.status === 'waiting' ? '\u0416\u0434\u0443, \u043F\u043E\u043A\u0430 \u0437\u0430\u043A\u043E\u043D\u0447\u0438\u0442\u0441\u044F \u0434\u0440\u0443\u0433\u0430\u044F \u0440\u0430\u0431\u043E\u0442\u0430' : '\u041D\u0430\u0447\u0438\u043D\u0430\u044E');
17226
+ if (data.at && data.total) title = title + ' \xB7 ' + data.at + ' \u0438\u0437 ' + data.total;
17171
17227
  show('nowTitle', title);
17172
17228
  show('nowLeft', data.left || '');
17173
17229
  var loading = download(data);
@@ -17179,11 +17235,9 @@ function runbarWidgetHtml() {
17179
17235
  byId('dl').hidden = true;
17180
17236
  }
17181
17237
 
17182
- // \xAB\u041F\u043E\u0437\u0430\u0434\u0438\xBB \u0438 \xAB\u0434\u0430\u043B\u044C\u0448\u0435\xBB \u043F\u0440\u0438\u0445\u043E\u0434\u044F\u0442 \u0441\u0442\u0440\u043E\u043A\u0430\u043C\u0438 \u0434\u0432\u0438\u0436\u043A\u0430 \u0446\u0435\u043B\u0438\u043A\u043E\u043C: \u0434\u0440\u043E\u0431\u0438\u0442\u044C \u0438\u0445 \u043F\u043E
17183
- // \u0437\u0430\u043F\u044F\u0442\u044B\u043C \u043D\u0435\u043B\u044C\u0437\u044F \u2014 \u0432 \u043D\u0430\u0437\u0432\u0430\u043D\u0438\u0438 \u044D\u0442\u0430\u043F\u0430 \u0437\u0430\u043F\u044F\u0442\u0430\u044F \u0431\u044B\u0432\u0430\u0435\u0442 (\xAB\u041F\u0440\u043E\u0432\u0435\u0440\u0438\u0442\u044C, \u0432\u0441\u0451 \u043B\u0438
17184
- // \u043D\u0430 \u043C\u0435\u0441\u0442\u0435\xBB), \u0438 \u043E\u0434\u0438\u043D \u044D\u0442\u0430\u043F \u043F\u043E\u043A\u0430\u0437\u0430\u043B\u0441\u044F \u0431\u044B \u0434\u0432\u0443\u043C\u044F \u043E\u0431\u0440\u0443\u0431\u043A\u0430\u043C\u0438.
17185
- side('behind', '\u041F\u043E\u0437\u0430\u0434\u0438: ', ended ? '' : data.behind);
17186
- side('ahead', '\u0414\u0430\u043B\u044C\u0448\u0435: ', ended ? '' : data.ahead);
17238
+ // \u26A0 \xAB\u041F\u041E\u0417\u0410\u0414\u0418\xBB \u0418 \xAB\u0414\u0410\u041B\u042C\u0428\u0415\xBB \u041D\u0415 \u0420\u0418\u0421\u0423\u042E\u0422\u0421\u042F (\u0432\u043B\u0430\u0434\u0435\u043B\u0435\u0446 2026-09-24): \u043F\u043E\u0434 \u043D\u0430\u0437\u0432\u0430\u043D\u0438\u0435\u043C
17239
+ // \u044D\u0442\u0430\u043F\u0430 \u0438 \u0448\u043A\u0430\u043B\u043E\u0439 \u043E\u043D\u0438 \u0431\u044B\u043B\u0438 \u0442\u0440\u0435\u0442\u044C\u0438\u043C \u0438 \u0447\u0435\u0442\u0432\u0451\u0440\u0442\u044B\u043C \u0440\u0430\u0441\u0441\u043A\u0430\u0437\u043E\u043C \u043E\u0431 \u043E\u0434\u043D\u043E\u043C \u0438 \u0442\u043E\u043C \u0436\u0435.
17240
+ // \u041E\u0442\u0447\u0451\u0442 \u0438\u0445 \u043F\u043E-\u043F\u0440\u0435\u0436\u043D\u0435\u043C\u0443 \u043D\u0435\u0441\u0451\u0442 \u2014 \u0441\u0442\u0440\u043E\u043A\u0438 \u043D\u0443\u0436\u043D\u044B \u043C\u043E\u0434\u0435\u043B\u0438, \u0430 \u043D\u0435 \u044D\u043A\u0440\u0430\u043D\u0443.
17187
17241
 
17188
17242
  if (ended) finish(data);
17189
17243
  else { byId('end').hidden = true; document.body.classList.remove('bad'); }
@@ -17254,7 +17308,7 @@ function runbarWidgetHtml() {
17254
17308
  job = null;
17255
17309
  document.body.classList.remove('gone');
17256
17310
  document.body.classList.remove('bad');
17257
- var hide = ['now', 'rail', 'msg', 'dl', 'behind', 'ahead', 'clock', 'end', 'note'];
17311
+ var hide = ['now', 'rail', 'msg', 'dl', 'clock', 'end', 'note'];
17258
17312
  for (var i = 0; i < hide.length; i++) { var el = byId(hide[i]); if (el) el.hidden = true; }
17259
17313
 
17260
17314
  var rows = data.rows || [];
@@ -17263,12 +17317,10 @@ function runbarWidgetHtml() {
17263
17317
  if (rows[j].state === 'ok') { ok++; need++; }
17264
17318
  else if (rows[j].state === 'missing') need++;
17265
17319
  }
17266
- show('what', data.ready ? '\u0412\u0441\u0451 \u0433\u043E\u0442\u043E\u0432\u043E \u043A \u043C\u043E\u043D\u0442\u0430\u0436\u0443' : (need > ok ? '\u0414\u043B\u044F \u043C\u043E\u043D\u0442\u0430\u0436\u0430 \u043D\u0435 \u0432\u0441\u0451 \u043D\u0430 \u043C\u0435\u0441\u0442\u0435' : '\u041C\u043E\u043D\u0442\u0430\u0436 \u043D\u0430 \u044D\u0442\u043E\u043C \u043A\u043E\u043C\u043F\u044C\u044E\u0442\u0435\u0440\u0435'));
17267
-
17268
- var meta = [];
17269
- if (data.engine) meta.push('\u0434\u0432\u0438\u0436\u043E\u043A ' + data.engine);
17270
- if (data.shell) meta.push('\u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043D\u0438\u0435 ' + data.shell);
17271
- show('cardMeta', meta.join(' \xB7 '));
17320
+ // \u0421\u043B\u043E\u0432\u0430 \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0438 \u043F\u0438\u0448\u0435\u0442 \u043E\u0431\u043E\u043B\u043E\u0447\u043A\u0430 (setup-card.ts), \u0437\u0434\u0435\u0441\u044C \u0438\u0445 \u0442\u043E\u043B\u044C\u043A\u043E \u0441\u0442\u0430\u0432\u044F\u0442
17321
+ // \u043D\u0430 \u043C\u0435\u0441\u0442\u043E: \u0437\u0430\u0433\u043E\u043B\u043E\u0432\u043E\u043A, \u0432\u0435\u0440\u0441\u0438\u044F, \u0441\u0442\u0440\u043E\u043A\u0438, \u043D\u043E\u0432\u043E\u0441\u0442\u044C, \u0447\u0442\u043E \u0434\u0430\u043B\u044C\u0448\u0435.
17322
+ show('what', data.title || '');
17323
+ show('cardMeta', data.meta || '');
17272
17324
 
17273
17325
  // \u0428\u043A\u0430\u043B\u0430 \u0433\u043E\u0442\u043E\u0432\u043D\u043E\u0441\u0442\u0438 \u2014 \u043F\u043E \u043E\u0431\u044F\u0437\u0430\u0442\u0435\u043B\u044C\u043D\u043E\u043C\u0443: \u0442\u043E, \u0447\u0442\u043E \u0432\u0441\u0442\u0430\u043D\u0435\u0442 \u043F\u043E \u043F\u0440\u043E\u0441\u044C\u0431\u0435, \u0434\u043E\u043B\u0435\u0439
17274
17326
  // \xAB\u043D\u0435 \u0433\u043E\u0442\u043E\u0432\u043E\xBB \u043D\u0435 \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044F, \u0438\u043D\u0430\u0447\u0435 \u0447\u0435\u043B\u043E\u0432\u0435\u043A \u0431\u0435\u0437 \u0441\u0443\u0431\u0442\u0438\u0442\u0440\u043E\u0432 \u043D\u0430\u0432\u0441\u0435\u0433\u0434\u0430 \u0432\u0438\u0434\u0435\u043B \u0431\u044B
@@ -17281,7 +17333,6 @@ function runbarWidgetHtml() {
17281
17333
  var b = document.createElement('b');
17282
17334
  b.textContent = '\u0413\u043E\u0442\u043E\u0432\u043E ' + ok + ' \u0438\u0437 ' + need;
17283
17335
  cap.appendChild(b);
17284
- if (data.missingMb) cap.appendChild(document.createTextNode(' \xB7 \u0434\u043E\u043A\u0430\u0447\u0430\u0442\u044C ' + weight(data.missingMb)));
17285
17336
  }
17286
17337
  cap.hidden = !need;
17287
17338
 
@@ -17300,9 +17351,7 @@ function runbarWidgetHtml() {
17300
17351
  li.appendChild(title);
17301
17352
  var w = document.createElement('span');
17302
17353
  w.className = 'part__w';
17303
- w.textContent = row.state === 'ok' ? '\u0441\u0442\u043E\u0438\u0442'
17304
- : row.state === 'later' ? ('\u043F\u043E \u043F\u0440\u043E\u0441\u044C\u0431\u0435' + (row.mb ? ' \xB7 ' + weight(row.mb) : ''))
17305
- : (row.mb ? weight(row.mb) : '\u043D\u0435\u0442');
17354
+ w.textContent = row.say || '';
17306
17355
  li.appendChild(w);
17307
17356
  list.appendChild(li);
17308
17357
  }
@@ -17315,18 +17364,6 @@ function runbarWidgetHtml() {
17315
17364
  reportSize();
17316
17365
  }
17317
17366
 
17318
- function side(id, label, text) {
17319
- var el = byId(id);
17320
- if (!el) return;
17321
- el.innerHTML = '';
17322
- if (!text) { el.hidden = true; return; }
17323
- var b = document.createElement('b');
17324
- b.textContent = label;
17325
- el.appendChild(b);
17326
- el.appendChild(document.createTextNode(text));
17327
- el.hidden = false;
17328
- }
17329
-
17330
17367
  /** \u041A\u043E\u043D\u0435\u0446 \u0440\u0430\u0431\u043E\u0442\u044B: \u0443\u0441\u043F\u0435\u0445 \u0441 \u043F\u0443\u0442\u0451\u043C \u043A \u0444\u0430\u0439\u043B\u0443 \u0438\u043B\u0438 \u043E\u0442\u043A\u0430\u0437 \u0441\u043B\u043E\u0432\u0430\u043C\u0438. */
17331
17368
  function finish(data) {
17332
17369
  var good = data.status === 'done';
@@ -17335,11 +17372,11 @@ function runbarWidgetHtml() {
17335
17372
 
17336
17373
  if (good) {
17337
17374
  show('endTitle', '\u0413\u043E\u0442\u043E\u0432\u043E \u0437\u0430 ' + howLong(data.sec));
17338
- show('endHint', data.file ? '\u0424\u0430\u0439\u043B \u043B\u0435\u0436\u0438\u0442 \u0443 \u0432\u0430\u0441 \u043D\u0430 \u043A\u043E\u043C\u043F\u044C\u044E\u0442\u0435\u0440\u0435:' : (data.outcome || ''));
17375
+ show('endHint', data.file ? '\u0420\u043E\u043B\u0438\u043A \u0433\u043E\u0442\u043E\u0432:' : (data.outcome || ''));
17339
17376
  show('path', data.file || '');
17340
17377
  } else {
17341
17378
  show('endTitle', data.status === 'aborted' ? '\u0420\u0430\u0431\u043E\u0442\u0430 \u043F\u0440\u0435\u0440\u0432\u0430\u043B\u0430\u0441\u044C' : '\u041D\u0435 \u043F\u043E\u043B\u0443\u0447\u0438\u043B\u043E\u0441\u044C');
17342
- show('endHint', data.trouble || '\u0414\u0432\u0438\u0436\u043E\u043A \u043D\u0435 \u043E\u0431\u044A\u044F\u0441\u043D\u0438\u043B, \u0447\u0442\u043E \u0441\u043B\u0443\u0447\u0438\u043B\u043E\u0441\u044C.');
17379
+ show('endHint', data.trouble || '\u0427\u0442\u043E-\u0442\u043E \u0441\u043B\u043E\u043C\u0430\u043B\u043E\u0441\u044C. \u041D\u0430\u043F\u0438\u0448\u0438 \u041A\u043B\u043E\u0434\u0443 \xAB\u0447\u0442\u043E \u0441\u043B\u0443\u0447\u0438\u043B\u043E\u0441\u044C\xBB.');
17343
17380
  show('path', '');
17344
17381
  }
17345
17382
  var warn = [];
@@ -17365,8 +17402,6 @@ function runbarWidgetHtml() {
17365
17402
  byId('now').hidden = true;
17366
17403
  byId('rail').hidden = true;
17367
17404
  byId('msg').hidden = true;
17368
- byId('behind').hidden = true;
17369
- byId('ahead').hidden = true;
17370
17405
  byId('clock').hidden = true;
17371
17406
  document.body.classList.add('bad');
17372
17407
  show('endTitle', '\u041D\u0435 \u043F\u043E\u043B\u0443\u0447\u0438\u043B\u043E\u0441\u044C');
@@ -17391,7 +17426,7 @@ function runbarWidgetHtml() {
17391
17426
  // \xAB\u0437\u0430\u043A\u0440\u044B\u0442\u043E\xBB, \u043F\u0440\u0438\u0448\u0435\u0434\u0448\u0430\u044F \u0441\u043B\u0435\u0434\u043E\u043C \u043D\u0430\u0441\u0442\u043E\u044F\u0449\u0430\u044F \u0437\u0430\u0434\u0430\u0447\u0430 (\u0445\u043E\u0441\u0442 \u0432\u043F\u0440\u0430\u0432\u0435 \u043F\u0440\u0438\u0441\u043B\u0430\u0442\u044C \u0434\u0432\u0430
17392
17427
  // \u0443\u0432\u0435\u0434\u043E\u043C\u043B\u0435\u043D\u0438\u044F \u043F\u043E\u0434\u0440\u044F\u0434) \u043E\u0441\u0442\u0430\u043B\u0430\u0441\u044C \u0431\u044B \u0431\u0435\u0437 \u043E\u043F\u0440\u043E\u0441\u0430 \u2014 \u043F\u043E\u043B\u043E\u0441\u0430 \u043F\u043E\u043A\u0430\u0437\u0430\u043B\u0430 \u0431\u044B \u043F\u0435\u0440\u0432\u044B\u0439
17393
17428
  // \u043A\u0430\u0434\u0440 \u0438 \u0437\u0430\u043C\u0435\u0440\u043B\u0430.
17394
- var all = ['now', 'rail', 'msg', 'dl', 'card', 'behind', 'ahead', 'clock', 'end', 'note', 'what'];
17429
+ var all = ['now', 'rail', 'msg', 'dl', 'card', 'clock', 'end', 'note', 'what'];
17395
17430
  for (var i = 0; i < all.length; i++) { var el = byId(all[i]); if (el) el.hidden = true; }
17396
17431
  document.body.classList.add('gone');
17397
17432
  reportSize();
@@ -17831,11 +17866,11 @@ ${EXTRAS_LATER}`), later]);
17831
17866
  });
17832
17867
  if ("refusal" in launch) return toolError(launch.refusal);
17833
17868
  return toolSuccess(
17834
- `\u0417\u0430\u0434\u0430\u0447\u0430 ${launch.id}: \u0443\u0441\u0442\u0430\u043D\u043E\u0432\u043A\u0430, \u0448\u0430\u0433 \xAB${step}\xBB.
17869
+ `\u0417\u0430\u0434\u0430\u0447\u0430 ${launch.id}: ${installTitle(step)} (\u0443\u0441\u0442\u0430\u043D\u043E\u0432\u043A\u0430, \u0448\u0430\u0433 \xAB${step}\xBB).
17835
17870
  \u0418\u0434\u0451\u0442 \u043D\u0430 \u043A\u043E\u043C\u043F\u044C\u044E\u0442\u0435\u0440\u0435 \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044F \u0438 \u043F\u0435\u0440\u0435\u0436\u0438\u0432\u0430\u0435\u0442 \u043F\u0435\u0440\u0435\u0437\u0430\u043F\u0443\u0441\u043A \u043F\u0440\u043E\u0433\u0440\u0430\u043C\u043C\u044B. \u041F\u043E\u0437\u043E\u0432\u0438 wait \u0441 job "${launch.id}" \u2014 \u043E\u043D \u043F\u043E\u0434\u043E\u0436\u0434\u0451\u0442 \u0438 \u043F\u043E \u0445\u043E\u0434\u0443 \u0440\u0430\u0441\u0441\u043A\u0430\u0436\u0435\u0442, \u0441\u043A\u043E\u043B\u044C\u043A\u043E \u0441\u043A\u0430\u0447\u0430\u043D\u043E \u0438 \u043E \u0447\u0451\u043C \u043D\u0430\u0434\u043E \u0441\u043F\u0440\u043E\u0441\u0438\u0442\u044C \u0447\u0435\u043B\u043E\u0432\u0435\u043A\u0430. \u041F\u0435\u0440\u0435\u0441\u043A\u0430\u0437\u044B\u0432\u0430\u0439 \u044D\u0442\u043E \u0447\u0435\u043B\u043E\u0432\u0435\u043A\u0443 \u0441\u0440\u0430\u0437\u0443, \u0430 \u043D\u0435 \u0432 \u043A\u043E\u043D\u0446\u0435. ${AWAY_NOTE}`,
17836
17871
  startedJob({
17837
17872
  id: launch.id,
17838
- what: `\u0443\u0441\u0442\u0430\u043D\u043E\u0432\u043A\u0430, \u0448\u0430\u0433 \xAB${step}\xBB`,
17873
+ what: installTitle(step),
17839
17874
  ahead: installLadder(step).join(" "),
17840
17875
  message: "\u0418\u0434\u0451\u0442 \u043C\u0438\u043D\u0443\u0442\u0430\u043C\u0438: \u043A\u0430\u0447\u0430\u0435\u0442\u0441\u044F \u0438 \u0441\u043E\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044F \u0442\u043E, \u0447\u0435\u043C \u043C\u043E\u043D\u0442\u0438\u0440\u0443\u0435\u0442\u0441\u044F \u0432\u0438\u0434\u0435\u043E."
17841
17876
  })
@@ -17859,7 +17894,8 @@ async function updateEngine(engine, consent, key, baseUrl, timeoutMs = ASKED_POI
17859
17894
  installed: engine.freshVersion(),
17860
17895
  fresh: decision.what === "nothing" ? null : decision.manifest.version,
17861
17896
  mb: decision.what === "nothing" ? 0 : Math.round(decision.manifest.bytes / 1024 / 1024),
17862
- status: outcome.ok ? 0 : outcome.status ?? 0
17897
+ status: outcome.ok ? 0 : outcome.status ?? 0,
17898
+ notes: ""
17863
17899
  });
17864
17900
  if (decision.what === "nothing") {
17865
17901
  const ownDir2 = engine.freshVersion();
@@ -17893,7 +17929,8 @@ async function updateShell(engine, consent, key, baseUrl, timeoutMs = ASKED_POIN
17893
17929
  installed,
17894
17930
  fresh: decision.what === "nothing" ? null : decision.manifest.version,
17895
17931
  mb: decision.what === "nothing" ? 0 : Math.round((decision.manifest.body?.bytes ?? 0) / 1024 / 1024),
17896
- status: outcome.ok ? 0 : outcome.status ?? 0
17932
+ status: outcome.ok ? 0 : outcome.status ?? 0,
17933
+ notes: decision.what === "nothing" ? "" : decision.manifest.notes ?? ""
17897
17934
  });
17898
17935
  if (decision.what === "nothing") {
17899
17936
  if (!outcome.ok) {
@@ -17925,6 +17962,7 @@ ${decision.manifest.notes}
17925
17962
  key: key ?? null
17926
17963
  }));
17927
17964
  }
17965
+ var UPDATES = /* @__PURE__ */ new Set(["all", "engine", "shell"]);
17928
17966
  var HEAVY_STEPS = {
17929
17967
  speech: "model",
17930
17968
  cutout: "cutout",
@@ -17934,7 +17972,7 @@ function setupTool(engine, passport, key, baseUrl) {
17934
17972
  return defineTool({
17935
17973
  name: "setup",
17936
17974
  title: "\u041F\u0440\u043E\u0432\u0435\u0440\u0438\u0442\u044C \u0438 \u043F\u043E\u0441\u0442\u0430\u0432\u0438\u0442\u044C \u0432\u0441\u0451 \u0434\u043B\u044F \u043C\u043E\u043D\u0442\u0430\u0436\u0430",
17937
- description: "\u0412\u0441\u0451, \u0447\u0435\u043C \u043C\u043E\u043D\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u043D\u0430 \u044D\u0442\u043E\u043C \u043A\u043E\u043C\u043F\u044C\u044E\u0442\u0435\u0440\u0435, \u2014 \u043E\u0434\u043D\u0438\u043C \u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442\u043E\u043C. \u0411\u0435\u0437 \u0430\u0440\u0433\u0443\u043C\u0435\u043D\u0442\u043E\u0432 \u041F\u0420\u041E\u0412\u0415\u0420\u042F\u0415\u0422 \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, \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 \u043A\u0430\u0440\u0442\u043E\u0447\u0435\u043A choose_variant, \u0447\u0435\u0439 \u0440\u0435\u0446\u0435\u043F\u0442 \u0438 \u0447\u0435\u0439 \u0441\u0442\u0438\u043B\u044C) \u0438 \u0432\u044B\u0448\u043B\u0430 \u043B\u0438 \u043D\u043E\u0432\u0430\u044F \u0432\u0435\u0440\u0441\u0438\u044F \u0434\u0432\u0438\u0436\u043A\u0430 \u0438\u043B\u0438 \u0441\u0430\u043C\u043E\u0433\u043E \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043D\u0438\u044F. \u0417\u043E\u0432\u0438 \u041F\u0415\u0420\u0412\u042B\u041C, \u0434\u043E \u043B\u044E\u0431\u043E\u0439 \u0440\u0430\u0431\u043E\u0442\u044B \u0441 \u0432\u0438\u0434\u0435\u043E, \u0438 \u0438\u0437 \u0441\u0432\u043E\u0435\u0439 \u043F\u0430\u043C\u044F\u0442\u0438 \u043E\u0431 \u044D\u0442\u043E\u043C \u043D\u0435 \u0440\u0430\u0441\u0441\u043A\u0430\u0437\u044B\u0432\u0430\u0439.\n\u0421\u0442\u0430\u0432\u0438\u0442 \u0438 \u043E\u0431\u043D\u043E\u0432\u043B\u044F\u0435\u0442 \u0441 what, \u043D\u043E \u0442\u043E\u043B\u044C\u043A\u043E \u043F\u043E\u0441\u043B\u0435 \xAB\u0434\u0430\xBB \u0447\u0435\u043B\u043E\u0432\u0435\u043A\u0430: \u0441\u043D\u0430\u0447\u0430\u043B\u0430 \u0441\u043A\u0430\u0436\u0438 \u0435\u043C\u0443 \u0441\u043B\u043E\u0432\u0430\u043C\u0438, \u0447\u0442\u043E \u043F\u043E\u0441\u0442\u0430\u0432\u0438\u0448\u044C \u0438 \u0441\u043A\u043E\u043B\u044C\u043A\u043E \u044D\u0442\u043E \u0432\u0435\u0441\u0438\u0442, \u043F\u043E\u0442\u043E\u043C \u0437\u043E\u0432\u0438 \u0441 \u0442\u0435\u043C \u0436\u0435 what \u0438 consent=true. \u0411\u0435\u0437 consent \u043D\u0438\u0447\u0435\u0433\u043E \u043D\u0435 \u043A\u0430\u0447\u0430\u0435\u0442\u0441\u044F \u2014 \u043F\u0440\u0438\u0434\u0443\u0442 \u0432\u0435\u0441 \u0438 \u0432\u043E\u043F\u0440\u043E\u0441. \u0422\u044F\u0436\u0451\u043B\u043E\u0435 \u0441\u0442\u0430\u0432\u0438\u0442\u0441\u044F \u0442\u043E\u043B\u044C\u043A\u043E \u043F\u043E\u0434 \u043F\u0440\u043E\u0441\u044C\u0431\u0443: \u043D\u0435 \u043F\u0440\u043E\u0441\u0438\u043B\u0438 \u0441\u0443\u0431\u0442\u0438\u0442\u0440\u044B \u2014 \u043D\u0435 \u0441\u0442\u0430\u0432\u044C speech, \u043D\u0435 \u043F\u0440\u043E\u0441\u0438\u043B\u0438 \u043D\u043E\u0432\u044B\u0439 \u0444\u043E\u043D \u2014 \u043D\u0435 \u0441\u0442\u0430\u0432\u044C cutout.\n\u0414\u043E\u043B\u0433\u0430\u044F \u0443\u0441\u0442\u0430\u043D\u043E\u0432\u043A\u0430 \u043E\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u043D\u043E\u043C\u0435\u0440\u043E\u043C \u0437\u0430\u0434\u0430\u0447\u0438 \u2014 \u0434\u043E\u0436\u0434\u0438\u0441\u044C \u0435\u0451 \u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442\u043E\u043C wait. \u041D\u043E\u0432\u0430\u044F \u0432\u0435\u0440\u0441\u0438\u044F \u0434\u0432\u0438\u0436\u043A\u0430 \u0438\u043B\u0438 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043D\u0438\u044F \u0437\u0430\u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442 \u043F\u043E\u0441\u043B\u0435 \u043F\u0435\u0440\u0435\u0437\u0430\u043F\u0443\u0441\u043A\u0430 \u041A\u043B\u043E\u0434\u0430 \u0438\u043B\u0438 Codex, \u0441\u043A\u0430\u0436\u0438 \u044D\u0442\u043E \u0447\u0435\u043B\u043E\u0432\u0435\u043A\u0443. \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. \u041F\u043E\u0434\u043F\u0438\u0441\u043A\u0430 \u043D\u0435 \u043D\u0443\u0436\u043D\u0430: \u0443\u0437\u043D\u0430\u0442\u044C, \u0437\u0430 \u0447\u0442\u043E \u043F\u043B\u0430\u0442\u044F\u0442, \u043C\u043E\u0436\u043D\u043E \u0434\u043E \u043E\u043F\u043B\u0430\u0442\u044B, \u0430 \u0441\u043A\u0430\u0447\u0438\u0432\u0430\u043D\u0438\u0435 \u0441\u0430\u043C\u043E \u0443\u043F\u0438\u0440\u0430\u0435\u0442\u0441\u044F \u0432 \u043A\u043B\u044E\u0447 \u043D\u0430 \u0440\u0430\u0437\u0434\u0430\u0447\u0435.",
17975
+ description: "\u0412\u0441\u0451, \u0447\u0435\u043C \u043C\u043E\u043D\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u043D\u0430 \u044D\u0442\u043E\u043C \u043A\u043E\u043C\u043F\u044C\u044E\u0442\u0435\u0440\u0435, \u2014 \u043E\u0434\u043D\u0438\u043C \u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442\u043E\u043C. \u0411\u0435\u0437 \u0430\u0440\u0433\u0443\u043C\u0435\u043D\u0442\u043E\u0432 \u041F\u0420\u041E\u0412\u0415\u0420\u042F\u0415\u0422 \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, \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 \u043A\u0430\u0440\u0442\u043E\u0447\u0435\u043A choose_variant, \u0447\u0435\u0439 \u0440\u0435\u0446\u0435\u043F\u0442 \u0438 \u0447\u0435\u0439 \u0441\u0442\u0438\u043B\u044C) \u0438 \u0432\u044B\u0448\u043B\u0430 \u043B\u0438 \u043D\u043E\u0432\u0430\u044F \u0432\u0435\u0440\u0441\u0438\u044F \u0434\u0432\u0438\u0436\u043A\u0430 \u0438\u043B\u0438 \u0441\u0430\u043C\u043E\u0433\u043E \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043D\u0438\u044F. \u0417\u043E\u0432\u0438 \u041F\u0415\u0420\u0412\u042B\u041C, \u0434\u043E \u043B\u044E\u0431\u043E\u0439 \u0440\u0430\u0431\u043E\u0442\u044B \u0441 \u0432\u0438\u0434\u0435\u043E, \u0438 \u0438\u0437 \u0441\u0432\u043E\u0435\u0439 \u043F\u0430\u043C\u044F\u0442\u0438 \u043E\u0431 \u044D\u0442\u043E\u043C \u043D\u0435 \u0440\u0430\u0441\u0441\u043A\u0430\u0437\u044B\u0432\u0430\u0439.\n\u0421\u0442\u0430\u0432\u0438\u0442 \u0438 \u043E\u0431\u043D\u043E\u0432\u043B\u044F\u0435\u0442 \u0441 what, \u043D\u043E \u0442\u043E\u043B\u044C\u043A\u043E \u043F\u043E\u0441\u043B\u0435 \xAB\u0434\u0430\xBB \u0447\u0435\u043B\u043E\u0432\u0435\u043A\u0430: \u0441\u043D\u0430\u0447\u0430\u043B\u0430 \u0441\u043A\u0430\u0436\u0438 \u0435\u043C\u0443 \u0441\u043B\u043E\u0432\u0430\u043C\u0438, \u0447\u0442\u043E \u043F\u043E\u0441\u0442\u0430\u0432\u0438\u0448\u044C \u0438 \u0441\u043A\u043E\u043B\u044C\u043A\u043E \u044D\u0442\u043E \u0432\u0435\u0441\u0438\u0442, \u043F\u043E\u0442\u043E\u043C \u0437\u043E\u0432\u0438 \u0441 \u0442\u0435\u043C \u0436\u0435 what \u0438 consent=true. \xAB\u0421\u043A\u0430\u0447\u0430\u0439\xBB \u0438 \xAB\u043E\u0431\u043D\u043E\u0432\u0438\xBB \u2014 \u0442\u043E \u0436\u0435 \xAB\u0434\u0430\xBB \u043D\u0430 \u0442\u043E, \u0447\u0442\u043E \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0430 \u043F\u0440\u043E\u0432\u0435\u0440\u043A\u0438 \u0443\u0436\u0435 \u043D\u0430\u0437\u0432\u0430\u043B\u0430 \u0441 \u0432\u0435\u0441\u043E\u043C: \u0437\u043E\u0432\u0438 what=all \u0441 consent=true. \u0411\u0435\u0437 consent \u043D\u0438\u0447\u0435\u0433\u043E \u043D\u0435 \u043A\u0430\u0447\u0430\u0435\u0442\u0441\u044F \u2014 \u043F\u0440\u0438\u0434\u0443\u0442 \u0432\u0435\u0441 \u0438 \u0432\u043E\u043F\u0440\u043E\u0441. \u0422\u044F\u0436\u0451\u043B\u043E\u0435 \u0441\u0442\u0430\u0432\u0438\u0442\u0441\u044F \u0442\u043E\u043B\u044C\u043A\u043E \u043F\u043E\u0434 \u043F\u0440\u043E\u0441\u044C\u0431\u0443: \u043D\u0435 \u043F\u0440\u043E\u0441\u0438\u043B\u0438 \u0441\u0443\u0431\u0442\u0438\u0442\u0440\u044B \u2014 \u043D\u0435 \u0441\u0442\u0430\u0432\u044C speech, \u043D\u0435 \u043F\u0440\u043E\u0441\u0438\u043B\u0438 \u043D\u043E\u0432\u044B\u0439 \u0444\u043E\u043D \u2014 \u043D\u0435 \u0441\u0442\u0430\u0432\u044C cutout.\n\u0414\u043E\u043B\u0433\u0430\u044F \u0443\u0441\u0442\u0430\u043D\u043E\u0432\u043A\u0430 \u043E\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u043D\u043E\u043C\u0435\u0440\u043E\u043C \u0437\u0430\u0434\u0430\u0447\u0438 \u2014 \u0434\u043E\u0436\u0434\u0438\u0441\u044C \u0435\u0451 \u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442\u043E\u043C wait. \u041D\u043E\u0432\u0430\u044F \u0432\u0435\u0440\u0441\u0438\u044F \u0434\u0432\u0438\u0436\u043A\u0430 \u0438\u043B\u0438 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043D\u0438\u044F \u0437\u0430\u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442 \u043F\u043E\u0441\u043B\u0435 \u043F\u0435\u0440\u0435\u0437\u0430\u043F\u0443\u0441\u043A\u0430 \u041A\u043B\u043E\u0434\u0430 \u0438\u043B\u0438 Codex, \u0441\u043A\u0430\u0436\u0438 \u044D\u0442\u043E \u0447\u0435\u043B\u043E\u0432\u0435\u043A\u0443. \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. \u041F\u043E\u0434\u043F\u0438\u0441\u043A\u0430 \u043D\u0435 \u043D\u0443\u0436\u043D\u0430: \u0443\u0437\u043D\u0430\u0442\u044C, \u0437\u0430 \u0447\u0442\u043E \u043F\u043B\u0430\u0442\u044F\u0442, \u043C\u043E\u0436\u043D\u043E \u0434\u043E \u043E\u043F\u043B\u0430\u0442\u044B, \u0430 \u0441\u043A\u0430\u0447\u0438\u0432\u0430\u043D\u0438\u0435 \u0441\u0430\u043C\u043E \u0443\u043F\u0438\u0440\u0430\u0435\u0442\u0441\u044F \u0432 \u043A\u043B\u044E\u0447 \u043D\u0430 \u0440\u0430\u0437\u0434\u0430\u0447\u0435.",
17938
17976
  // Полоса хода работы в ленте: установка качает десятки минут, и человек
17939
17977
  // видит, что качается и сколько уже скачано. ⚠ Ожидание задачи — у
17940
17978
  // отдельного инструмента `wait`, без полосы: полоса объявлена на
@@ -17983,9 +18021,12 @@ function setupTool(engine, passport, key, baseUrl) {
17983
18021
  const said = await answer(args, ctx?.emitProgress, news);
17984
18022
  return withCard(said, () => setupCard({
17985
18023
  readiness: null,
17986
- engine: news.engine ?? { installed: engine.freshVersion(), fresh: null, mb: 0, status: 0 },
18024
+ engine: news.engine ?? { installed: engine.freshVersion(), fresh: null, mb: 0, status: 0, notes: "" },
17987
18025
  shell: news.shell,
17988
18026
  note: firstLine(said),
18027
+ // Проверки здесь не было, а работа была: «Проверяю, что установлено»
18028
+ // над ответом «поставил новую версию» соврало бы о том, что идёт.
18029
+ ...args.consent === true && args.what !== void 0 && UPDATES.has(args.what) ? { title: TITLE_UPDATING } : {},
17989
18030
  shellVersion: VERSION
17990
18031
  }));
17991
18032
  }
@@ -18024,7 +18065,7 @@ async function lookAround(engine, model, key, baseUrl) {
18024
18065
  };
18025
18066
  const card = (said, o) => withCard(said, () => setupCard({
18026
18067
  readiness: o.readiness ?? null,
18027
- engine: engineNews ?? { installed: engine.freshVersion(), fresh: null, mb: 0, status: 0 },
18068
+ engine: engineNews ?? { installed: engine.freshVersion(), fresh: null, mb: 0, status: 0, notes: "" },
18028
18069
  shell: shellNews,
18029
18070
  ...o.noEngine === true ? { noEngine: true } : {},
18030
18071
  ...o.noPython === true ? { noPython: true } : {},
@@ -18118,12 +18159,17 @@ function wordsOf(content) {
18118
18159
  if (typeof content === "string") return content;
18119
18160
  return content.map((block) => block.type === "text" ? block.text : "").join("\n");
18120
18161
  }
18162
+ var TRIAL_AXES = ["motion", "timing", "place", "camera", "color"];
18163
+ var TRIALS_MAX = 10;
18121
18164
  async function startRender(engine, asked, key, tell) {
18122
18165
  const place = engine.place();
18123
18166
  if (place === null) return toolError(engine.whyNoEngine());
18124
18167
  const where = fileOrRefusal(asked.video);
18125
18168
  if ("refusal" in where) return toolError(where.refusal);
18126
- if (asked.onlyPauses !== true) return startDocumentRender(engine, where.path, key, tell);
18169
+ const trials = { variants: asked.variants, vary: asked.vary };
18170
+ if (asked.onlyPauses !== true) {
18171
+ return startDocumentRender(engine, where.path, key, tell, trials);
18172
+ }
18127
18173
  if (tell !== void 0) for (const line of PAUSES_LADDER) tell(line);
18128
18174
  const ask2 = { pauses: {} };
18129
18175
  if (asked.tempo !== void 0 && asked.tempo !== 1) ask2["tempo"] = asked.tempo;
@@ -18134,7 +18180,7 @@ async function startRender(engine, asked, key, tell) {
18134
18180
  if ("refusal" in agreement) return toolError(agreement.refusal);
18135
18181
  return startDocumentRender(engine, reel, key, tell);
18136
18182
  }
18137
- async function startDocumentRender(engine, reel, key, tell) {
18183
+ async function startDocumentRender(engine, reel, key, tell, trials = {}) {
18138
18184
  const place = engine.place();
18139
18185
  if (place === null) return toolError(engine.whyNoEngine());
18140
18186
  const trouble = await engine.pythonTrouble();
@@ -18143,8 +18189,14 @@ async function startDocumentRender(engine, reel, key, tell) {
18143
18189
  if (python === null) {
18144
18190
  return toolError("\u041E\u043A\u0440\u0443\u0436\u0435\u043D\u0438\u0435 \u043C\u043E\u043D\u0442\u0430\u0436\u0430 \u0435\u0449\u0451 \u043D\u0435 \u0443\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D\u043E. \u0427\u0442\u043E \u0434\u0435\u043B\u0430\u0442\u044C: \u043F\u043E\u0437\u043E\u0432\u0438 setup.");
18145
18191
  }
18146
- if (tell !== void 0) for (const line of RENDER_LADDER) tell(line);
18147
- const what = `\u043C\u043E\u043D\u0442\u0430\u0436 ${basename(reel)}`;
18192
+ const ladder = trials.variants === void 0 ? RENDER_LADDER : [...RENDER_LADDER, TRIALS_STEP];
18193
+ if (tell !== void 0) for (const line of ladder) tell(line);
18194
+ const what = trials.variants === void 0 ? `\u043C\u043E\u043D\u0442\u0430\u0436 ${basename(reel)}` : `\u043C\u043E\u043D\u0442\u0430\u0436 ${basename(reel)} \u0438 ${trials.variants} \u0432\u0435\u0440\u0441\u0438\u0439 \u0434\u043B\u044F \u043F\u0440\u043E\u0431\u043D\u043E\u0433\u043E \u0440\u0435\u0436\u0438\u043C\u0430`;
18195
+ const more = trials.variants === void 0 ? [] : [
18196
+ "--variants",
18197
+ String(trials.variants),
18198
+ ...trials.vary !== void 0 && trials.vary.length > 0 ? ["--vary", trials.vary.join(",")] : []
18199
+ ];
18148
18200
  const launch = await engine.background({
18149
18201
  place,
18150
18202
  executable: python,
@@ -18156,7 +18208,7 @@ async function startDocumentRender(engine, reel, key, tell) {
18156
18208
  "--what",
18157
18209
  what,
18158
18210
  "--command",
18159
- JSON.stringify({ tool: "render", args: {} })
18211
+ JSON.stringify({ tool: "render", args: trials })
18160
18212
  ],
18161
18213
  args: (id) => [
18162
18214
  place.consolePy,
@@ -18166,7 +18218,8 @@ async function startDocumentRender(engine, reel, key, tell) {
18166
18218
  "--pack",
18167
18219
  place.pack,
18168
18220
  "--job",
18169
- id
18221
+ id,
18222
+ ...more
18170
18223
  ],
18171
18224
  advice: "\u043F\u043E\u0437\u043E\u0432\u0438 setup \u2014 \u0441\u043A\u043E\u0440\u0435\u0435 \u0432\u0441\u0435\u0433\u043E, \u043E\u043A\u0440\u0443\u0436\u0435\u043D\u0438\u0435 \u043D\u0435\u043F\u043E\u043B\u043D\u043E\u0435"
18172
18225
  });
@@ -18177,7 +18230,7 @@ async function startDocumentRender(engine, reel, key, tell) {
18177
18230
  startedJob({
18178
18231
  id: launch.id,
18179
18232
  what,
18180
- ahead: RENDER_LADDER.join(" "),
18233
+ ahead: ladder.join(" "),
18181
18234
  message: "\u0420\u043E\u043B\u0438\u043A \u0441\u043E\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044F \u043D\u0430 \u043A\u043E\u043C\u043F\u044C\u044E\u0442\u0435\u0440\u0435 \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044F."
18182
18235
  })
18183
18236
  );
@@ -18186,6 +18239,7 @@ var RENDER_LADDER = [
18186
18239
  "\u041F\u0440\u043E\u0432\u0435\u0440\u044E, \u0447\u0442\u043E \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442 \u0441\u043E\u0433\u043B\u0430\u0441\u043E\u0432\u0430\u043D \u0438 \u043D\u0435 \u043F\u0440\u0430\u0432\u043B\u0435\u043D \u043C\u0438\u043C\u043E plan_edit.",
18187
18240
  "\u041F\u043E\u0441\u0447\u0438\u0442\u0430\u044E \u044D\u0444\u0444\u0435\u043A\u0442\u044B \u0438\u0441\u0445\u043E\u0434\u043D\u0438\u043A\u0430 (\u0432\u044B\u0440\u0435\u0437 \u0433\u0435\u0440\u043E\u044F, \u0448\u0443\u043C\u043E\u0434\u0430\u0432) \u0442\u0430\u043C, \u0433\u0434\u0435 \u0438\u0445 \u0432\u0438\u0434\u043D\u043E, \u2014 \u043F\u043E\u0442\u043E\u043C \u0441\u043E\u0431\u0435\u0440\u0443 \u043A\u0430\u0440\u0442\u0438\u043D\u043A\u0443 \u0438 \u0437\u0432\u0443\u043A."
18188
18241
  ];
18242
+ var TRIALS_STEP = "\u041F\u043E\u0442\u043E\u043C \u0441\u043E\u0431\u0435\u0440\u0443 \u0432\u0435\u0440\u0441\u0438\u0438 \u0434\u043B\u044F \u043F\u0440\u043E\u0431\u043D\u043E\u0433\u043E \u0440\u0435\u0436\u0438\u043C\u0430 \u043F\u043E \u043E\u0434\u043D\u043E\u0439: \u0440\u0435\u0447\u044C \u0438 \u0437\u0432\u0443\u043A \u0442\u0435 \u0436\u0435, \u0434\u0440\u0443\u0433\u043E\u0435 \u0434\u0432\u0438\u0436\u0435\u043D\u0438\u0435, \u043C\u0435\u0441\u0442\u0430 \u0438 \u043A\u0440\u0443\u043F\u043D\u043E\u0441\u0442\u044C.";
18189
18243
  async function followWork(engine, asked, pace = realPace, tell) {
18190
18244
  const ask2 = () => engine.command(["job", asked.job]);
18191
18245
  const seconds2 = waitSeconds(asked.seconds ?? WAIT_LIMIT_SECONDS);
@@ -18220,7 +18274,7 @@ function renderTool(engine, _passport, key) {
18220
18274
  return defineTool({
18221
18275
  name: "render",
18222
18276
  title: "\u0421\u043E\u0431\u0440\u0430\u0442\u044C \u0440\u043E\u043B\u0438\u043A",
18223
- description: '\u0421\u043E\u0431\u0438\u0440\u0430\u0435\u0442 \u0441\u043E\u0433\u043B\u0430\u0441\u043E\u0432\u0430\u043D\u043D\u044B\u0439 \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442 \u0440\u043E\u043B\u0438\u043A\u0430 \u043D\u0430 \u043A\u043E\u043C\u043F\u044C\u044E\u0442\u0435\u0440\u0435 \u0447\u0435\u043B\u043E\u0432\u0435\u043A\u0430: \u044D\u0444\u0444\u0435\u043A\u0442\u044B \u0438\u0441\u0445\u043E\u0434\u043D\u0438\u043A\u0430 (\u0432\u044B\u0440\u0435\u0437 \u0433\u0435\u0440\u043E\u044F, \u0448\u0443\u043C\u043E\u0434\u0430\u0432), \u043A\u0430\u0440\u0442\u0438\u043D\u043A\u0443, \u0437\u0432\u0443\u043A, \u0433\u043E\u0442\u043E\u0432\u044B\u0439 \u0444\u0430\u0439\u043B. \u0417\u043E\u0432\u0438 \u041F\u041E\u0421\u041B\u0415 \u0442\u043E\u0433\u043E, \u043A\u0430\u043A \u0447\u0435\u043B\u043E\u0432\u0435\u043A \u0441\u043A\u0430\u0437\u0430\u043B \xAB\u0434\u0430\xBB \u043D\u0430 \u0447\u0435\u0440\u043D\u043E\u0432\u0438\u043A \u0438\u0437 plan \u0438 \u0442\u044B \u0437\u0430\u043F\u0438\u0441\u0430\u043B \u044D\u0442\u043E plan_edit \u0441 {"op": "agree"}. \u0421\u043E\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044F \u0422\u041E\u041B\u042C\u041A\u041E \u0441\u043E\u0433\u043B\u0430\u0441\u043E\u0432\u0430\u043D\u043D\u044B\u0439 \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442, \u0438 \u0442\u043E\u043B\u044C\u043A\u043E \u0437\u0430\u043F\u0438\u0441\u0430\u043D\u043D\u044B\u0439 \u0447\u0435\u0440\u0435\u0437 plan_edit: \u0444\u0430\u0439\u043B, \u043F\u043E\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u043D\u044B\u0439 \u043C\u0438\u043C\u043E \u043D\u0435\u0433\u043E, \u0434\u0432\u0438\u0436\u043E\u043A \u043D\u0435 \u0441\u043E\u0431\u0435\u0440\u0451\u0442 \u2014 \xAB\u043F\u0440\u0438\u0448\u043B\u0438 \u043F\u0440\u0430\u0432\u043A\u0443 \u043E\u043F\u0435\u0440\u0430\u0446\u0438\u044F\u043C\u0438\xBB.\n\u041E\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u043D\u043E\u043C\u0435\u0440\u043E\u043C \u0437\u0430\u0434\u0430\u0447\u0438 \u2014 \u0434\u0430\u043B\u044C\u0448\u0435 wait, \u043E\u043D \u043F\u043E\u0434\u043E\u0436\u0434\u0451\u0442 \u0438 \u0440\u0430\u0441\u0441\u043A\u0430\u0436\u0435\u0442 \u0445\u043E\u0434. \u041F\u043E\u0432\u0442\u043E\u0440 \u0431\u0435\u0437 \u043F\u0440\u0430\u0432\u043E\u043A \u043E\u0442\u0434\u0430\u0451\u0442 \u0433\u043E\u0442\u043E\u0432\u043E\u0435 \u0441\u0440\u0430\u0437\u0443.\n\u041F\u0440\u043E\u0441\u044F\u0442 \xAB\u043F\u0440\u043E\u0441\u0442\u043E \u0443\u0431\u0435\u0440\u0438 \u043F\u0430\u0443\u0437\u044B\xBB \u2014 only_pauses=true \u0441 video: \u0447\u0435\u0440\u043D\u043E\u0432\u0438\u043A \u0441 \u043E\u0434\u043D\u0438\u043C\u0438 \u043F\u0430\u0443\u0437\u0430\u043C\u0438, \u0441\u043E\u0433\u043B\u0430\u0441\u0438\u0435 \u0438 \u0441\u0431\u043E\u0440\u043A\u0430 \u043E\u0434\u043D\u0438\u043C \u0432\u044B\u0437\u043E\u0432\u043E\u043C; tempo \u0440\u044F\u0434\u043E\u043C \u2014 \xAB\u0438 \u0443\u0441\u043A\u043E\u0440\u044C\xBB. \u041F\u0430\u0443\u0437\u044B \u0443\u0431\u0438\u0440\u0430\u044E\u0442\u0441\u044F \u043F\u043E \u0441\u043B\u043E\u0432\u0430\u043C, \u043F\u043E\u044D\u0442\u043E\u043C\u0443 \u043D\u0443\u0436\u043D\u0430 \u0440\u0430\u0441\u043F\u043E\u0437\u043D\u0430\u043D\u043D\u0430\u044F \u0440\u0435\u0447\u044C.\n\u0420\u0430\u0431\u043E\u0442\u0430 \u0438\u0434\u0451\u0442 \u043D\u0430 \u043A\u043E\u043C\u043F\u044C\u044E\u0442\u0435\u0440\u0435 \u0447\u0435\u043B\u043E\u0432\u0435\u043A\u0430, \u043A \u043D\u0430\u043C \u0432\u0438\u0434\u0435\u043E \u043D\u0435 \u0443\u0445\u043E\u0434\u0438\u0442 \u2014 \u043D\u0430\u0432\u0435\u0440\u0445 \u0438\u0434\u0451\u0442 \u0442\u043E\u043B\u044C\u043A\u043E \u043F\u0440\u043E\u0432\u0435\u0440\u043A\u0430 \u043F\u043E\u0434\u043F\u0438\u0441\u043A\u0438 \u043F\u043E \u043A\u043B\u044E\u0447\u0443.',
18277
+ description: '\u0421\u043E\u0431\u0438\u0440\u0430\u0435\u0442 \u0441\u043E\u0433\u043B\u0430\u0441\u043E\u0432\u0430\u043D\u043D\u044B\u0439 \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442 \u0440\u043E\u043B\u0438\u043A\u0430 \u043D\u0430 \u043A\u043E\u043C\u043F\u044C\u044E\u0442\u0435\u0440\u0435 \u0447\u0435\u043B\u043E\u0432\u0435\u043A\u0430: \u044D\u0444\u0444\u0435\u043A\u0442\u044B \u0438\u0441\u0445\u043E\u0434\u043D\u0438\u043A\u0430 (\u0432\u044B\u0440\u0435\u0437 \u0433\u0435\u0440\u043E\u044F, \u0448\u0443\u043C\u043E\u0434\u0430\u0432), \u043A\u0430\u0440\u0442\u0438\u043D\u043A\u0443, \u0437\u0432\u0443\u043A, \u0433\u043E\u0442\u043E\u0432\u044B\u0439 \u0444\u0430\u0439\u043B. \u0417\u043E\u0432\u0438 \u041F\u041E\u0421\u041B\u0415 \u0442\u043E\u0433\u043E, \u043A\u0430\u043A \u0447\u0435\u043B\u043E\u0432\u0435\u043A \u0441\u043A\u0430\u0437\u0430\u043B \xAB\u0434\u0430\xBB \u043D\u0430 \u0447\u0435\u0440\u043D\u043E\u0432\u0438\u043A \u0438\u0437 plan \u0438 \u0442\u044B \u0437\u0430\u043F\u0438\u0441\u0430\u043B \u044D\u0442\u043E plan_edit \u0441 {"op": "agree"}. \u0421\u043E\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044F \u0422\u041E\u041B\u042C\u041A\u041E \u0441\u043E\u0433\u043B\u0430\u0441\u043E\u0432\u0430\u043D\u043D\u044B\u0439 \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442, \u0438 \u0442\u043E\u043B\u044C\u043A\u043E \u0437\u0430\u043F\u0438\u0441\u0430\u043D\u043D\u044B\u0439 \u0447\u0435\u0440\u0435\u0437 plan_edit: \u0444\u0430\u0439\u043B, \u043F\u043E\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u043D\u044B\u0439 \u043C\u0438\u043C\u043E \u043D\u0435\u0433\u043E, \u0434\u0432\u0438\u0436\u043E\u043A \u043D\u0435 \u0441\u043E\u0431\u0435\u0440\u0451\u0442 \u2014 \xAB\u043F\u0440\u0438\u0448\u043B\u0438 \u043F\u0440\u0430\u0432\u043A\u0443 \u043E\u043F\u0435\u0440\u0430\u0446\u0438\u044F\u043C\u0438\xBB.\n\u041E\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u043D\u043E\u043C\u0435\u0440\u043E\u043C \u0437\u0430\u0434\u0430\u0447\u0438 \u2014 \u0434\u0430\u043B\u044C\u0448\u0435 wait, \u043E\u043D \u043F\u043E\u0434\u043E\u0436\u0434\u0451\u0442 \u0438 \u0440\u0430\u0441\u0441\u043A\u0430\u0436\u0435\u0442 \u0445\u043E\u0434. \u041F\u043E\u0432\u0442\u043E\u0440 \u0431\u0435\u0437 \u043F\u0440\u0430\u0432\u043E\u043A \u043E\u0442\u0434\u0430\u0451\u0442 \u0433\u043E\u0442\u043E\u0432\u043E\u0435 \u0441\u0440\u0430\u0437\u0443.\n\u041F\u0440\u043E\u0441\u044F\u0442 \xAB\u0441\u0434\u0435\u043B\u0430\u0439 \u0435\u0449\u0451 5 \u0434\u043B\u044F \u043F\u0440\u043E\u0431\u043D\u043E\u0433\u043E \u0440\u0435\u0436\u0438\u043C\u0430\xBB (Instagram) \u2014 variants=5: \u0441\u043D\u0430\u0447\u0430\u043B\u0430 \u043E\u0441\u043D\u043E\u0432\u043D\u043E\u0439 \u0440\u043E\u043B\u0438\u043A (\u0433\u043E\u0442\u043E\u0432\u044B\u0439 \u0432\u043E\u0437\u044C\u043C\u0451\u0442\u0441\u044F \u0441\u0440\u0430\u0437\u0443), \u043F\u043E\u0442\u043E\u043C \u0432\u0435\u0440\u0441\u0438\u0438 \u0440\u044F\u0434\u043E\u043C \u0441 \u043D\u0438\u043C \u0444\u0430\u0439\u043B\u0430\u043C\u0438 -trial-1\u2026-trial-5. \u0420\u0435\u0447\u044C, \u0440\u0435\u0437\u044B \u0438 \u0437\u0432\u0443\u043A \u0442\u0435 \u0436\u0435, \u043E\u0442\u043B\u0438\u0447\u0430\u044E\u0442\u0441\u044F \u0434\u0432\u0438\u0436\u0435\u043D\u0438\u0435, \u0432\u0440\u0435\u043C\u044F \u0432\u0441\u0442\u0430\u0432\u043E\u043A, \u043C\u0435\u0441\u0442\u0430 \u0438 \u043A\u0440\u0443\u043F\u043D\u043E\u0441\u0442\u044C; \u0446\u0432\u0435\u0442 \u2014 \u0442\u043E\u043B\u044C\u043A\u043E \u043A\u043E\u0433\u0434\u0430 \u0447\u0435\u043B\u043E\u0432\u0435\u043A \u0441\u043A\u0430\u0437\u0430\u043B \xAB\u0438 \u0446\u0432\u0435\u0442 \u0440\u0430\u0437\u043D\u044B\u0439\xBB: vary \u0441 color. \u041E\u0442\u0434\u0435\u043B\u044C\u043D\u043E\u0433\u043E \xAB\u0434\u0430\xBB \u043D\u0430 \u0432\u0435\u0440\u0441\u0438\u0438 \u043D\u0435 \u043D\u0443\u0436\u043D\u043E. \u041C\u0435\u043D\u044F\u0442\u044C\u0441\u044F \u043D\u0435\u0447\u0435\u043C\u0443 \u2014 \u0434\u0432\u0438\u0436\u043E\u043A \u0441\u043A\u0430\u0436\u0435\u0442, \u0441\u043A\u043E\u043B\u044C\u043A\u043E \u0432\u044B\u0448\u043B\u043E, \u0431\u043B\u0438\u0437\u043D\u0435\u0446\u043E\u0432 \u043D\u0435 \u0431\u0443\u0434\u0435\u0442.\n\u041F\u0440\u043E\u0441\u044F\u0442 \xAB\u043F\u0440\u043E\u0441\u0442\u043E \u0443\u0431\u0435\u0440\u0438 \u043F\u0430\u0443\u0437\u044B\xBB \u2014 only_pauses=true \u0441 video: \u0447\u0435\u0440\u043D\u043E\u0432\u0438\u043A \u0441 \u043E\u0434\u043D\u0438\u043C\u0438 \u043F\u0430\u0443\u0437\u0430\u043C\u0438, \u0441\u043E\u0433\u043B\u0430\u0441\u0438\u0435 \u0438 \u0441\u0431\u043E\u0440\u043A\u0430 \u043E\u0434\u043D\u0438\u043C \u0432\u044B\u0437\u043E\u0432\u043E\u043C; tempo \u0440\u044F\u0434\u043E\u043C \u2014 \xAB\u0438 \u0443\u0441\u043A\u043E\u0440\u044C\xBB. \u041F\u0430\u0443\u0437\u044B \u0443\u0431\u0438\u0440\u0430\u044E\u0442\u0441\u044F \u043F\u043E \u0441\u043B\u043E\u0432\u0430\u043C, \u043F\u043E\u044D\u0442\u043E\u043C\u0443 \u043D\u0443\u0436\u043D\u0430 \u0440\u0430\u0441\u043F\u043E\u0437\u043D\u0430\u043D\u043D\u0430\u044F \u0440\u0435\u0447\u044C.\n\u0420\u0430\u0431\u043E\u0442\u0430 \u0438\u0434\u0451\u0442 \u043D\u0430 \u043A\u043E\u043C\u043F\u044C\u044E\u0442\u0435\u0440\u0435 \u0447\u0435\u043B\u043E\u0432\u0435\u043A\u0430, \u043A \u043D\u0430\u043C \u0432\u0438\u0434\u0435\u043E \u043D\u0435 \u0443\u0445\u043E\u0434\u0438\u0442 \u2014 \u043D\u0430\u0432\u0435\u0440\u0445 \u0438\u0434\u0451\u0442 \u0442\u043E\u043B\u044C\u043A\u043E \u043F\u0440\u043E\u0432\u0435\u0440\u043A\u0430 \u043F\u043E\u0434\u043F\u0438\u0441\u043A\u0438 \u043F\u043E \u043A\u043B\u044E\u0447\u0443.',
18224
18278
  // Полоса хода работы: монтаж идёт минутами, и всё это время в ленте не
18225
18279
  // происходило бы ничего. ⚠ Ожидание — у `wait`, и полосы там нет: иначе
18226
18280
  // каждая проверка рисовала бы новую поверх этой.
@@ -18240,6 +18294,12 @@ function renderTool(engine, _passport, key) {
18240
18294
  ).optional(),
18241
18295
  style: external_exports.string().describe(
18242
18296
  "\u0422\u043E\u043B\u044C\u043A\u043E \u0432\u043C\u0435\u0441\u0442\u0435 \u0441 only_pauses: \u043F\u0430\u043F\u043A\u0430 \u043F\u0430\u043A\u0430 \u0444\u0438\u0440\u043C\u0435\u043D\u043D\u043E\u0433\u043E \u0441\u0442\u0438\u043B\u044F"
18297
+ ).optional(),
18298
+ variants: external_exports.number().int().min(1).max(TRIALS_MAX).describe(
18299
+ `\u0415\u0449\u0451 \u0441\u0442\u043E\u043B\u044C\u043A\u043E \u0432\u0435\u0440\u0441\u0438\u0439 \u0434\u043B\u044F \u043F\u0440\u043E\u0431\u043D\u043E\u0433\u043E \u0440\u0435\u0436\u0438\u043C\u0430 Instagram, 1\u2013${TRIALS_MAX}; \u043E\u0431\u044B\u0447\u043D\u043E 5`
18300
+ ).optional(),
18301
+ vary: external_exports.array(external_exports.enum(TRIAL_AXES)).describe(
18302
+ "\u0422\u043E\u043B\u044C\u043A\u043E \u0441 variants: \u0447\u0435\u043C \u0432\u0435\u0440\u0441\u0438\u0438 \u043E\u0442\u043B\u0438\u0447\u0430\u044E\u0442\u0441\u044F. \u0411\u0435\u0437 \u043D\u0435\u0433\u043E \u2014 \u0432\u0441\u0451, \u043A\u0440\u043E\u043C\u0435 \u0446\u0432\u0435\u0442\u0430 (color)"
18243
18303
  ).optional()
18244
18304
  }).check((ctx) => {
18245
18305
  const asked = ctx.value;
@@ -18255,7 +18315,15 @@ function renderTool(engine, _passport, key) {
18255
18315
  if (asked.video !== void 0 && asked.reel !== void 0) {
18256
18316
  say("\xABvideo\xBB \u0438 \xABreel\xBB \u2014 \u044D\u0442\u043E \u043E\u0434\u043D\u043E \u0438 \u0442\u043E \u0436\u0435 \u043C\u0435\u0441\u0442\u043E, \u043D\u0430\u0437\u0432\u0430\u043D\u043D\u043E\u0435 \u0434\u0432\u0430\u0436\u0434\u044B. \u041E\u0441\u0442\u0430\u0432\u044C \u043E\u0434\u043D\u043E", "reel");
18257
18317
  }
18258
- if (asked.only_pauses === true) return;
18318
+ if (asked.vary !== void 0 && asked.variants === void 0) {
18319
+ say("\xABvary\xBB \u2014 \u043E\u0441\u0438 \u0432\u0435\u0440\u0441\u0438\u0439: \u0431\u0435\u0437 variants \u0432\u0435\u0440\u0441\u0438\u0439 \u043D\u0435\u0442. \u041D\u0430\u0437\u043E\u0432\u0438, \u0441\u043A\u043E\u043B\u044C\u043A\u043E \u0438\u0445: variants=5", "vary");
18320
+ }
18321
+ if (asked.only_pauses === true) {
18322
+ if (asked.variants !== void 0) {
18323
+ say("\u0412\u0435\u0440\u0441\u0438\u0438 \u0434\u0435\u043B\u0430\u044E\u0442\u0441\u044F \u0438\u0437 \u0441\u043E\u0433\u043B\u0430\u0441\u043E\u0432\u0430\u043D\u043D\u043E\u0433\u043E \u043C\u043E\u043D\u0442\u0430\u0436\u0430, \u0430 \u043D\u0435 \u0438\u0437 \xAB\u0442\u043E\u043B\u044C\u043A\u043E \u043F\u0430\u0443\u0437\u044B\xBB. \u0421\u043D\u0430\u0447\u0430\u043B\u0430 \u0441\u043E\u0431\u0435\u0440\u0438 \u0440\u043E\u043B\u0438\u043A, \u043F\u043E\u0442\u043E\u043C render \u0441 reel \u0438 variants", "variants");
18324
+ }
18325
+ return;
18326
+ }
18259
18327
  const extra = ["tempo", "style"].filter((name) => asked[name] !== void 0);
18260
18328
  if (extra.length > 0) {
18261
18329
  say(
@@ -18271,7 +18339,9 @@ function renderTool(engine, _passport, key) {
18271
18339
  video: args.video ?? args.reel ?? "",
18272
18340
  onlyPauses: args.only_pauses,
18273
18341
  tempo: args.tempo,
18274
- style: args.style
18342
+ style: args.style,
18343
+ variants: args.variants,
18344
+ vary: args.vary
18275
18345
  },
18276
18346
  key,
18277
18347
  ctx?.emitProgress
package/dist/cli.js CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import { Engine, chooseBody, handOverToBody, VERSION, rollback, rollbackShell, remove, fromNpxCache, install, keyFromBlock, readConfig, ForeignBlockError, currentMachineFingerprint, CrashReporter, watchProcessCrashes, McpServer, buildAll, realPace, buildResources, StdioServerTransport, fromHost, WHERE_TO_GET_KEY, Wakefulness, systemBlocker, updateEngine, installStep, NaparnikApiClient, timeToCheck2, manifestUrlFor, fetchManifest, markChecked2, decide, shellDir, timeToCheck, bundleUrlFor, fetchShellManifest, markChecked, decideShell, installedShell, NaparnikConfigError } from './chunk-EOGD2CRG.js';
2
+ import { Engine, chooseBody, handOverToBody, VERSION, rollback, rollbackShell, remove, fromNpxCache, install, keyFromBlock, readConfig, ForeignBlockError, currentMachineFingerprint, CrashReporter, watchProcessCrashes, McpServer, buildAll, realPace, buildResources, StdioServerTransport, fromHost, WHERE_TO_GET_KEY, Wakefulness, systemBlocker, updateEngine, installStep, NaparnikApiClient, timeToCheck2, manifestUrlFor, fetchManifest, markChecked2, decide, shellDir, timeToCheck, bundleUrlFor, fetchShellManifest, markChecked, decideShell, installedShell, NaparnikConfigError } from './chunk-DQDZKXDU.js';
3
3
  import { fileURLToPath } from 'url';
4
4
  import { realpathSync, readFileSync } from 'fs';
5
5
 
package/dist/index.d.ts CHANGED
@@ -1534,9 +1534,9 @@ declare class NaparnikConfigError extends NaparnikError {
1534
1534
  * годится ли она для новой начинки: разойдись она с пакетом, и в логах будет
1535
1535
  * стоять чужое число, а обновление начнёт считать оболочку не той.
1536
1536
  */
1537
- declare const VERSION = "0.10.41";
1537
+ declare const VERSION = "0.10.43";
1538
1538
  /** Как мы представляемся серверу Напарника. По нему в логах видно оболочку. */
1539
- declare const USER_AGENT = "naparnik-mcp/0.10.41";
1539
+ declare const USER_AGENT = "naparnik-mcp/0.10.43";
1540
1540
  /**
1541
1541
  * Самая старая начинка (движок монтажа), с которой эта оболочка работает.
1542
1542
  * Обновление начинки ниже этой версии не ставится, а выше — требует оболочки
@@ -1573,7 +1573,7 @@ declare const USER_AGENT = "naparnik-mcp/0.10.41";
1573
1573
  * словами «раздача ещё не обновилась». Номер берётся из УЖЕ СОБРАННОГО
1574
1574
  * артефакта этой волны, а не сочиняется по календарю.
1575
1575
  */
1576
- declare const MIN_ENGINE = "2026.09.24-446";
1576
+ declare const MIN_ENGINE = "2026.09.24-466";
1577
1577
 
1578
1578
  /**
1579
1579
  * Что вышло из установки или отката — одними словами у начинки и у тела.
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- export { DEFAULT_HOME, DeliveryError, Engine, ForeignBlockError, INSIDE_PYTHON, INSTALL_STEPS, KEEP_COPIES, KEEP_VERSIONS, LONG_STEPS, MANIFEST_TIMEOUT_MS, MANIFEST_URL, MARKER, MIN_ENGINE, NaparnikApiClient, NaparnikAuthError, NaparnikClientError, NaparnikConfigError, NaparnikError, NaparnikInsufficientBalanceError, NaparnikScopeError, NaparnikServerError, NaparnikTimeoutError, PAUSE_HOURS, SERVER_NAME, SOURCES_FILE, START_SEC, TOOL_SEC, USER_AGENT, VERSION, buildAll, buildBlock, buildResources, compare, configPath, decide, defineTool, deploy, downloadFile, fetchManifest, fileOrRefusal, findBlock, fromNpxCache, inside, install, installPayload, installPython, jsonSchemaOf, keyInTable, lastLine, loadConfig, markChecked2 as markChecked, markCurrent, parseEngineManifest, parseFailure, path, platformKey, previousVersion, probe, pythonSource, refusalFor, remove, rollback, tarEntries, tidyOld, timeToCheck2 as timeToCheck, unpackArchive, withArgs } from './chunk-EOGD2CRG.js';
1
+ export { DEFAULT_HOME, DeliveryError, Engine, ForeignBlockError, INSIDE_PYTHON, INSTALL_STEPS, KEEP_COPIES, KEEP_VERSIONS, LONG_STEPS, MANIFEST_TIMEOUT_MS, MANIFEST_URL, MARKER, MIN_ENGINE, NaparnikApiClient, NaparnikAuthError, NaparnikClientError, NaparnikConfigError, NaparnikError, NaparnikInsufficientBalanceError, NaparnikScopeError, NaparnikServerError, NaparnikTimeoutError, PAUSE_HOURS, SERVER_NAME, SOURCES_FILE, START_SEC, TOOL_SEC, USER_AGENT, VERSION, buildAll, buildBlock, buildResources, compare, configPath, decide, defineTool, deploy, downloadFile, fetchManifest, fileOrRefusal, findBlock, fromNpxCache, inside, install, installPayload, installPython, jsonSchemaOf, keyInTable, lastLine, loadConfig, markChecked2 as markChecked, markCurrent, parseEngineManifest, parseFailure, path, platformKey, previousVersion, probe, pythonSource, refusalFor, remove, rollback, tarEntries, tidyOld, timeToCheck2 as timeToCheck, unpackArchive, withArgs } from './chunk-DQDZKXDU.js';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@naparnik/mcp",
3
- "version": "0.10.41",
3
+ "version": "0.10.43",
4
4
  "description": "MCP-сервер Напарника: монтаж вертикального видео на машине пользователя — паузы, субтитры, герой на новом фоне, звук. Видео никуда не уезжает.",
5
5
  "license": "SEE LICENSE IN LICENSE.md",
6
6
  "private": false,