@naparnik/mcp 0.10.15 → 0.10.18

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,23 @@
1
1
  # Изменения @naparnik/mcp
2
2
 
3
+ ## 0.10.18 — 2026-09-23. Для вас ничего не поменялось
4
+
5
+ В пояснениях расширения поправлено, откуда оно берёт шаги установки и место
6
+ портативного Python. Монтаж идёт как раньше.
7
+
8
+ ## 0.10.17 — 2026-09-23. Для вас ничего не поменялось
9
+
10
+ Внутри движка форма выбора, проверки, каталог умений, командная строка и
11
+ общий код монтажа разложены по своим папкам, и в пояснениях расширения
12
+ поправлены ссылки на них. Монтаж идёт как раньше, только первый после
13
+ обновления — дольше обычного, один раз.
14
+
15
+ ## 0.10.16 — 2026-09-23. Для вас ничего не поменялось
16
+
17
+ Внутри движка стиль, звук, герой, запись экрана и установка разложены по своим
18
+ папкам, и в пояснениях расширения поправлены ссылки на них. Монтаж идёт как
19
+ раньше, только первый после обновления — дольше обычного, один раз.
20
+
3
21
  ## 0.10.15 — 2026-09-23. Для вас ничего не поменялось
4
22
 
5
23
  Внутри движка файлы разложены по папкам, и в пояснениях расширения поправлены
package/README.md CHANGED
@@ -227,7 +227,7 @@ Desktop подставляет незаполненное поле настро
227
227
  портативная сборка в `<дом>/bin/python` → системный. Список мест внутри
228
228
  портативной сборки существует в двух копиях (иначе питон не найти, не имея
229
229
  питона) и сверяется тестом `src/engine.test.ts`, который читает
230
- `client/engine/env.py`.
230
+ `client/engine/media/ffmpeg.py`.
231
231
 
232
232
  ## Оболочка и начинка обновляются порознь
233
233
 
@@ -720,7 +720,7 @@ function parsePositiveInt(raw, fallback) {
720
720
  }
721
721
 
722
722
  // src/version.ts
723
- var VERSION = "0.10.15";
723
+ var VERSION = "0.10.18";
724
724
  var USER_AGENT = `naparnik-mcp/${VERSION}`;
725
725
  var MIN_ENGINE = "2026.09.19-355";
726
726
  var LAUNCHER_PROTOCOL = 1;
@@ -1155,7 +1155,7 @@ var LONG_STEPS = /* @__PURE__ */ new Set([
1155
1155
  "model",
1156
1156
  // ⚠ Распознавание речи, вырез героя и чистка голоса весят вместе больше
1157
1157
  // двух гигабайт, и с 2026-09-10 НИ ОДИН из них не входит в `all` (решение
1158
- // владельца, `install.py`, `SEPARATE_JOBS`). Зовут их поимённо и по просьбе,
1158
+ // владельца, `setup/install.py`, `SEPARATE_JOBS`). Зовут их поимённо и по просьбе,
1159
1159
  // а ждать по ним столько же, сколько раньше ждали модель речи.
1160
1160
  "cutout",
1161
1161
  "voice",
@@ -17195,7 +17195,7 @@ function planTool(engine, key) {
17195
17195
  "\u041F\u0430\u043F\u043A\u0430 \u043F\u0430\u043A\u0430 \u0444\u0438\u0440\u043C\u0435\u043D\u043D\u043E\u0433\u043E \u0441\u0442\u0438\u043B\u044F: \u0447\u0435\u0440\u043D\u043E\u0432\u0438\u043A \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044F \u0442\u0430\u043A, \u043A\u0430\u043A \u0435\u0433\u043E \u043F\u043E\u0442\u043E\u043C \u0441\u043E\u0431\u0435\u0440\u0443\u0442"
17196
17196
  ).optional(),
17197
17197
  // ⚠ ТАБЛИЦЫ ВКУСА НАЗВАНЫ ПРИМЕРОМ НАРОЧНО. Дверь к ним открыта движком
17198
- // (`engine/skills.py`, корень `taste`), но модель о них не узнает ниоткуда:
17198
+ // (`engine/catalog/handbook.py`, корень `taste`), но модель о них не узнает ниоткуда:
17199
17199
  // черновик называет их не всегда, а решение владельца 2026-09-18 разрешило
17200
17200
  // ей писать план ролика целиком — и числа для него она обязана брать из
17201
17201
  // наших замеров, а не из головы. Про «по одной-две за вызов» сказано тут
@@ -18762,7 +18762,7 @@ function chooseWidgetHtml() {
18762
18762
  \u0412\u042B\u0421\u041E\u0422\u042B \u0421\u0410\u041C\u041E\u0419 \u0420\u0410\u041C\u041A\u0418, \u2014 \u0430 \u0440\u0430\u043C\u043A\u0430 \u043E\u0431\u044A\u044F\u0432\u043B\u0435\u043D\u0430 \u043C\u0435\u0440\u043D\u044B\u043C \u044F\u0449\u0438\u043A\u043E\u043C (container-type).
18763
18763
  \u041F\u0440\u043E\u0446\u0435\u043D\u0442\u044B \u043E\u0442 \u0448\u0438\u0440\u0438\u043D\u044B \u0442\u0443\u0442 \u043D\u0435 \u0433\u043E\u0434\u044F\u0442\u0441\u044F: \u043A\u0430\u0434\u0440 9:16, \u0438 \u043F\u043E \u0433\u043E\u0440\u0438\u0437\u043E\u043D\u0442\u0430\u043B\u0438 \u0441
18764
18764
  \u0432\u0435\u0440\u0442\u0438\u043A\u0430\u043B\u044C\u044E \u043E\u043D\u0438 \u0440\u0430\u0437\u043D\u044B\u0435.
18765
- \u26A0 \u0422\u0415\u041D\u042C, \u0410 \u041D\u0415 \u041E\u0411\u0412\u041E\u0414\u041A\u0410: \u0432 \u0440\u043E\u043B\u0438\u043A\u0435 \u043F\u043E\u0434 \u0441\u0442\u0440\u043E\u043A\u043E\u0439 \u043C\u044F\u0433\u043A\u0438\u0439 \u043E\u0440\u0435\u043E\u043B (engine/halo.py),
18765
+ \u26A0 \u0422\u0415\u041D\u042C, \u0410 \u041D\u0415 \u041E\u0411\u0412\u041E\u0414\u041A\u0410: \u0432 \u0440\u043E\u043B\u0438\u043A\u0435 \u043F\u043E\u0434 \u0441\u0442\u0440\u043E\u043A\u043E\u0439 \u043C\u044F\u0433\u043A\u0438\u0439 \u043E\u0440\u0435\u043E\u043B (engine/look/halo.py),
18766
18766
  \u0438 \u043F\u0440\u0435\u0432\u044C\u044E \u043E\u0431\u044F\u0437\u0430\u043D\u043E \u043F\u043E\u043A\u0430\u0437\u044B\u0432\u0430\u0442\u044C \u0442\u043E \u0436\u0435 \u2014 \u043E\u0431\u0432\u043E\u0434\u043A\u0430 \u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044F \u043A\u0430\u043A \u0441\u0430\u043C\u043E\u0434\u0435\u043B\u043A\u0430. */
18767
18767
  .stage__frame { container-type: size; }
18768
18768
  /* \u26A0 \u0425\u041E\u041B\u0421\u0422 \u041B\u041E\u0416\u0418\u0422\u0421\u042F \u041F\u041E\u0412\u0415\u0420\u0425 \u041A\u0410\u0414\u0420\u0410, \u0410 \u041D\u0415 \u0412\u041C\u0415\u0421\u0422\u041E \u041D\u0415\u0413\u041E. \u041F\u043E\u043A\u0430 \u0444\u0438\u043B\u044C\u0442\u0440 \u043D\u0435 \u0432\u044B\u0431\u0440\u0430\u043D \u0438
@@ -18791,7 +18791,7 @@ function chooseWidgetHtml() {
18791
18791
  line-height: 1;
18792
18792
  /* \u26A0 \u0422\u0415\u041D\u042C \u041C\u042F\u0413\u041A\u0410\u042F \u0418 \u041F\u041E\u0427\u0422\u0418 \u041F\u0420\u041E\u0417\u0420\u0410\u0427\u041D\u0410\u042F, \u0410 \u041D\u0415 \u041E\u0411\u0412\u041E\u0414\u041A\u0410 \u041F\u041E\u0414 \u0412\u0418\u0414\u041E\u041C \u0422\u0415\u041D\u0418. \u041F\u043B\u043E\u0442\u043D\u044B\u0435
18793
18793
  \u0441\u043B\u043E\u0438 \u0447\u0438\u0442\u0430\u043B\u0438\u0441\u044C \u043A\u0430\u043A \u043A\u043E\u043D\u0442\u0443\u0440 \u0432\u043E\u043A\u0440\u0443\u0433 \u0431\u0443\u043A\u0432 \u2014 \u0440\u043E\u0432\u043D\u043E \u0442\u043E, \u0447\u0435\u0433\u043E \u0432 \u0440\u043E\u043B\u0438\u043A\u0435 \u043D\u0435\u0442:
18794
- \u0434\u0432\u0438\u0436\u043E\u043A \u043A\u043B\u0430\u0434\u0451\u0442 \u0447\u0435\u0442\u044B\u0440\u0435 \u0440\u0430\u0437\u043C\u044B\u0442\u044B\u0445 \u0441\u043B\u043E\u044F \u0441 \u043C\u0430\u043B\u043E\u0439 \u0441\u0438\u043B\u043E\u0439 (engine/halo.py).
18794
+ \u0434\u0432\u0438\u0436\u043E\u043A \u043A\u043B\u0430\u0434\u0451\u0442 \u0447\u0435\u0442\u044B\u0440\u0435 \u0440\u0430\u0437\u043C\u044B\u0442\u044B\u0445 \u0441\u043B\u043E\u044F \u0441 \u043C\u0430\u043B\u043E\u0439 \u0441\u0438\u043B\u043E\u0439 (engine/look/halo.py).
18795
18795
  \u041F\u0440\u0430\u0432\u043B\u0435\u043D\u043E \u0434\u0432\u0430\u0436\u0434\u044B \u043F\u043E \u043E\u0442\u0431\u0440\u0430\u043A\u043E\u0432\u043A\u0435 \u0432\u043B\u0430\u0434\u0435\u043B\u044C\u0446\u0430 (2026-09-13 \u0438 2026-09-15:
18796
18796
  \xAB\u0442\u0435\u043D\u0438 \u0441\u043B\u0438\u0448\u043A\u043E\u043C \u0437\u0430\u043C\u0435\u0442\u043D\u044B\u0435, \u043D\u0430\u0434\u043E \u0431\u043E\u043B\u044C\u0448\u0435 \u043F\u0440\u043E\u0437\u0440\u0430\u0447\u043D\u043E\u0441\u0442\u0438\xBB). */
18797
18797
  text-shadow:
@@ -19656,7 +19656,7 @@ function chooseWidgetHtml() {
19656
19656
  }
19657
19657
 
19658
19658
  // \u0421\u043B\u0443\u0436\u0435\u0431\u043D\u044B\u0435 \u0441\u043B\u043E\u0432\u0430 \u0433\u043B\u0430\u0432\u043D\u044B\u043C\u0438 \u043D\u0435 \u0431\u044B\u0432\u0430\u044E\u0442 \u2014 \u0442\u043E \u0436\u0435 \u043F\u0440\u0430\u0432\u0438\u043B\u043E, \u0447\u0442\u043E \u0432 \u0434\u0432\u0438\u0436\u043A\u0435
19659
- // (lib/layout.py \u0432 \u043F\u0430\u043A\u0435): \xAB\u0427\u0422\u041E\u0411\u042B\xBB \u0432\u043E \u0432\u0435\u0441\u044C \u043A\u0430\u0434\u0440 \u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044F \u043A\u0430\u043A \u043E\u0448\u0438\u0431\u043A\u0430 \u0432\u0451\u0440\u0441\u0442\u043A\u0438.
19659
+ // (lib/captions/layout.py \u0432 \u043F\u0430\u043A\u0435): \xAB\u0427\u0422\u041E\u0411\u042B\xBB \u0432\u043E \u0432\u0435\u0441\u044C \u043A\u0430\u0434\u0440 \u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044F \u043A\u0430\u043A \u043E\u0448\u0438\u0431\u043A\u0430 \u0432\u0451\u0440\u0441\u0442\u043A\u0438.
19660
19660
  var SMALL_WORDS = (' \u0430 \u043D\u043E \u0438 \u0438\u043B\u0438 \u0434\u0430 \u0436\u0435 \u043B\u0438 \u0431\u044B \u043D\u0435 \u043D\u0438 \u0432 \u0432\u043E \u043D\u0430 \u0437\u0430 \u043D\u0430\u0434 \u043F\u043E\u0434 \u043E\u0442 \u0434\u043E \u043F\u043E \u0438\u0437 \u0443 \u043A \u0441 \u0441\u043E \u043E \u043E\u0431 '
19661
19661
  + '\u043F\u0440\u043E \u0434\u043B\u044F \u043F\u0440\u0438 \u0431\u0435\u0437 \u0447\u0435\u0440\u0435\u0437 \u043C\u0435\u0436\u0434\u0443 \u0442\u043E \u0442\u043E\u0442 \u0442\u0430 \u0442\u0435 \u044D\u0442\u043E \u044D\u0442\u0438 \u044D\u0442\u043E\u0442 \u043A\u0430\u043A \u0447\u0442\u043E \u0447\u0435\u043C \u0447\u0442\u043E\u0431\u044B \u0435\u0441\u043B\u0438 \u043A\u043E\u0433\u0434\u0430 \u0433\u0434\u0435 '
19662
19662
  + '\u0442\u0430\u043C \u0442\u0443\u0442 \u0443\u0436\u0435 \u0435\u0449\u0451 \u0435\u0449\u0435 \u0432\u043E\u0442 \u0442\u0430\u043A \u0432\u044B \u0442\u044B \u043C\u044B \u043E\u043D \u043E\u043D\u0430 \u043E\u043D\u0438 \u044F \u043C\u043D\u0435 \u0442\u0435\u0431\u0435 ').split(' ');
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, McpServer, buildAll, buildResources, StdioServerTransport, fromHost, WHERE_TO_GET_KEY, updateEngine, installStep, NaparnikApiClient, timeToCheck2, manifestUrlFor, fetchManifest, markChecked2, decide, shellDir, timeToCheck, bundleUrlFor, fetchShellManifest, markChecked, decideShell, installedShell, NaparnikConfigError } from './chunk-ZXASWNOE.js';
2
+ import { Engine, chooseBody, handOverToBody, VERSION, rollback, rollbackShell, remove, fromNpxCache, install, keyFromBlock, readConfig, ForeignBlockError, currentMachineFingerprint, McpServer, buildAll, buildResources, StdioServerTransport, fromHost, WHERE_TO_GET_KEY, updateEngine, installStep, NaparnikApiClient, timeToCheck2, manifestUrlFor, fetchManifest, markChecked2, decide, shellDir, timeToCheck, bundleUrlFor, fetchShellManifest, markChecked, decideShell, installedShell, NaparnikConfigError } from './chunk-O7XB7YJ5.js';
3
3
  import { fileURLToPath } from 'url';
4
4
  import { realpathSync, readFileSync } from 'fs';
5
5
 
package/dist/index.d.ts CHANGED
@@ -122,12 +122,13 @@ declare class NaparnikApiClient {
122
122
  /**
123
123
  * Где внутри распакованной портативной сборки лежит сам интерпретатор.
124
124
  *
125
- * ⚠ ТРИ ВАРИАНТА, А НЕ ДВА, И РОВНО ТЕ ЖЕ, ЧТО У ДВИЖКА
126
- * (`engine/env.py` → `_INSIDE_PYTHON`). Копия здесь неизбежна — питон мы
125
+ * ⚠ ТРИ ВАРИАНТА, А НЕ ДВА, И РОВНО ТЕ ЖЕ, ЧТО У ДВИЖКА. Источник правды —
126
+ * `engine/shell-contract.json` → `portable_python.inside`: оттуда их берёт и
127
+ * питон (`engine/setup/python_finder.py`). Копия здесь неизбежна — питон мы
127
128
  * ищем ДО того, как есть чем запустить питон, — но прошлая копия знала два
128
129
  * варианта из трёх: на сборке, где внутри лежит только `bin/python`, движок
129
- * питон видел, а сервер MCP нет. Обе стороны сверяет тест границы
130
- * (`engine.test.ts`), и он читает питоновский исходник, а не повторяет список.
130
+ * питон видел, а сервер MCP нет. Правится сначала JSON, потом сюда; расхождение
131
+ * ловит тест границы (`engine.test.ts`) сверкой с этим JSON.
131
132
  */
132
133
  declare const INSIDE_PYTHON: string[];
133
134
  /** Дом по умолчанию — ровно тот же литерал, что в `engine/kit/home.py`. */
@@ -146,12 +147,13 @@ declare const LONG_STEPS: Set<string>;
146
147
  /**
147
148
  * Все шаги установки, которые понимает движок.
148
149
  *
149
- * ⚠ ЭТО ЗЕРКАЛО `install.py` → `STEPS`, и оно уже один раз разошлось: движок печатал
150
+ * ⚠ ЭТО ЗЕРКАЛО `STEPS` движка, и оно уже один раз разошлось: движок печатал
150
151
  * «Шаг установки „вырез“», а здешний список о таком шаге не знал — клиент
151
152
  * оказывался в тупике, потому что инструмент не принимал значение, которое
152
- * движок сам же и назвал. Правится сверху вниз: сначала `install.py` → `STEPS`,
153
- * потом сюда. Расхождение сторожит `engine.test.ts` — он читает питоновский
154
- * исходник, а не повторяет список.
153
+ * движок сам же и назвал. Источник правды — `engine/shell-contract.json` →
154
+ * `install_steps`: оттуда `STEPS` берёт и `setup/install.py`. Правится сверху
155
+ * вниз: сначала JSON, потом сюда. Расхождение сторожит `engine.test.ts` сверкой
156
+ * с этим JSON.
155
157
  */
156
158
  declare const INSTALL_STEPS: string[];
157
159
  /**
@@ -162,12 +164,12 @@ declare const INSTALL_STEPS: string[];
162
164
  * прибита строкой "scripts/edit.py".
163
165
  */
164
166
  /**
165
- * ⚠ КЛЮЧИ РУССКИЕ, ПОТОМУ ЧТО ЭТО ОТВЕТ ПИТОНА, А НЕ НАШ ОБЪЕКТ. Паспорт
166
- * печатает движок монтажа (`pack.json` и команда паспорта), и имена полей — его.
167
- * Переименование здесь ничего не меняет на той стороне: оболочка просто
168
- * перестала бы находить поля и объявила бы «паспорт не прочитан» на каждом
169
- * запуске. Обе стороны сверяет тест границы (`engine.test.ts`), и он читает
170
- * питоновский исходник, а не повторяет список.
167
+ * ⚠ ИМЕНА ПОЛЕЙ — ОТВЕТ ПИТОНА, А НЕ НАШ ОБЪЕКТ. Паспорт печатает движок
168
+ * монтажа (`engine/passport.py` → `as_json`, команда `pack-description`), и
169
+ * имена полей — его. Переименование здесь ничего не меняет на той стороне:
170
+ * оболочка просто перестала бы находить поля и объявила бы «паспорт не
171
+ * прочитан» на каждом запуске. Поля, несущие имена, сверяет с настоящими
172
+ * `pack.json` и рецептом `tool-declaration.test.ts`.
171
173
  */
172
174
  interface PackPassport {
173
175
  'name': string;
@@ -1307,9 +1309,9 @@ declare class NaparnikConfigError extends NaparnikError {
1307
1309
  * годится ли она для новой начинки: разойдись она с пакетом, и в логах будет
1308
1310
  * стоять чужое число, а обновление начнёт считать оболочку не той.
1309
1311
  */
1310
- declare const VERSION = "0.10.15";
1312
+ declare const VERSION = "0.10.18";
1311
1313
  /** Как мы представляемся серверу Напарника. По нему в логах видно оболочку. */
1312
- declare const USER_AGENT = "naparnik-mcp/0.10.15";
1314
+ declare const USER_AGENT = "naparnik-mcp/0.10.18";
1313
1315
  /**
1314
1316
  * Самая старая начинка (движок монтажа), с которой эта оболочка работает.
1315
1317
  * Обновление начинки ниже этой версии не ставится, а выше — требует оболочки
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-ZXASWNOE.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-O7XB7YJ5.js';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@naparnik/mcp",
3
- "version": "0.10.15",
3
+ "version": "0.10.18",
4
4
  "description": "MCP-сервер Напарника: монтаж вертикального видео на машине пользователя — паузы, субтитры, герой на новом фоне, звук. Видео никуда не уезжает.",
5
5
  "license": "SEE LICENSE IN LICENSE.md",
6
6
  "private": false,