@naparnik/mcp 0.10.47 → 0.10.50

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/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, reportInstallFaults, 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-PT34EZZ7.js';
2
+ import { Engine, chooseBody, handOverToBody, VERSION, rollback, rollbackShell, remove, fromNpxCache, install, keyFromBlock, readConfig, ForeignBlockError, currentMachineFingerprint, CrashReporter, watchProcessCrashes, McpServer, buildAll, realPace, buildResources, StdioServerTransport, reportInstallFaults, 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-DH5ID6CT.js';
3
3
  import { fileURLToPath } from 'url';
4
4
  import { realpathSync, readFileSync } from 'fs';
5
5
 
package/dist/index.d.ts CHANGED
@@ -576,18 +576,6 @@ declare class Wakefulness {
576
576
  private light;
577
577
  }
578
578
 
579
- /**
580
- * Где внутри распакованной портативной сборки лежит сам интерпретатор.
581
- *
582
- * ⚠ ТРИ ВАРИАНТА, А НЕ ДВА, И РОВНО ТЕ ЖЕ, ЧТО У ДВИЖКА. Источник правды —
583
- * `engine/shell-contract.json` → `portable_python.inside`: оттуда их берёт и
584
- * питон (`engine/setup/python_finder.py`). Копия здесь неизбежна — питон мы
585
- * ищем ДО того, как есть чем запустить питон, — но прошлая копия знала два
586
- * варианта из трёх: на сборке, где внутри лежит только `bin/python`, движок
587
- * питон видел, а сервер MCP нет. Правится сначала JSON, потом сюда; расхождение
588
- * ловит тест границы (`engine.test.ts`) сверкой с этим JSON.
589
- */
590
- declare const INSIDE_PYTHON: string[];
591
579
  /** Дом по умолчанию — ровно тот же литерал, что в `engine/kit/home.py`. */
592
580
  declare const DEFAULT_HOME = "~/.naparnik";
593
581
  /**
@@ -792,54 +780,30 @@ declare class Engine {
792
780
  /** Python окружения пака — им считается монтаж. Может ещё не существовать. */
793
781
  packPython(): string | null;
794
782
  /**
795
- * Портативный python, который движок доставил сам (шаг «python» установки).
783
+ * Питон по замку начинки (`engine/deps.lock.json`), если он уже в хранилище.
796
784
  *
797
- * ⚠ ЗНАТЬ ПРО НЕГО ОБЯЗАНА И ЭТА СТОРОНА. Он лежит в `<дом>/bin/python` и в
798
- * PATH не попадает намеренно — PATH человека мы не трогаем. Пропусти его
799
- * здесь, и получится: установка принесла питон, окружение на нём собралось,
800
- * а сервер MCP по-прежнему зовёт системный «python», которого нет или
801
- * который заглушка из Microsoft Store.
785
+ * ⚠ ТОЛЬКО СВОЙ. До 2026-09-24 здесь был «python3» из PATH на случай, когда
786
+ * своего нет, а окружение новой версии собиралось перебором «свой → базовый
787
+ * питон рабочей версии → системный». Claude Desktop подсунул питон Xcode 3.9,
788
+ * тот не собрал окружение, и обновление у владельца не вставало целый день.
789
+ * Решение владельца — «как node_modules»: свой питон по замку, чужого нет.
802
790
  */
803
- ourPython(): string | null;
791
+ ourPython(place?: EnginePlace | null): string | null;
804
792
  /**
805
- * Python для команд движка.
793
+ * Python для команд движка: окружение пака, а пока его нет — свой питон по
794
+ * замку. Нет ни того, ни другого — путь, которого нет: `pythonTrouble`
795
+ * ответит словами «позови setup», а не «spawn python3 ENOENT».
806
796
  *
807
- * Окружения пака может не быть вовсе — именно это и проверяет `check_setup`,
808
- * поэтому запускать проверку его питоном нельзя: получилась бы курица и
809
- * яйцо. Команды движка написаны на голой стандартной библиотеке и идут
810
- * системным python'ом, когда своего ещё нет.
797
+ * ⚠ «python3» ИЗ PATH — ТОЛЬКО ПРИ `NAPARNIK_SYSTEM_TOOLS=1`: так тесты и
798
+ * разработка гоняют движок из исходников без хранилища (та же переменная у
799
+ * движка, `engine/media/ffmpeg.py`). У покупателя её нет.
811
800
  */
812
801
  enginePython(): string;
813
- /** Python подготовки кандидата — намеренно без fallback на venv старого пака. */
814
- bootstrapPython(): string;
815
802
  /**
816
- * Чем собирать окружение новой версии — по порядку, до первого, кто сумеет.
817
- *
818
- * ⚠ БАЗОВЫЙ ПИТОН РАБОЧЕЙ ВЕРСИИ СТОИТ ВПЕРЕДИ «python3» ИЗ PATH, И ЭТО
819
- * ПОЧИНКА, А НЕ ВКУС. Claude Desktop на маке запускает нас без
820
- * `/opt/homebrew/bin` в PATH, и «python3» там — `/usr/bin/python3`, питон
821
- * Xcode 3.9. Он собирает venv только ссылками («This build of python cannot
822
- * create venvs without using symlinks»), а ссылка на интерпретатор вне версии
823
- * не проходит сверку `candidateVenvTrouble`. Обновление 2026.09.24-467 у
824
- * владельца встало ровно на этом, хотя рабочая версия собрана Homebrew 3.14
825
- * копиями и работает. Движок при первой установке ищет питон сам
826
- * (`setup/python_finder.py`) и пишет, какой взял, в `pyvenv.cfg` окружения —
827
- * этот и берём: он уже однажды собрал здесь рабочее окружение копиями.
828
- *
829
- * ⚠ НЕ ПИТОН САМОГО VENV. Окружение старой версии удаляется уборкой после
830
- * обновления, и кандидат, собранный его питоном, остался бы без интерпретатора
831
- * (`engine-candidate.test.ts`). База из `pyvenv.cfg` лежит вне версий.
832
- */
833
- bootstrapPythons(): string[];
834
- /**
835
- * Базовый интерпретатор окружения рабочей версии — из её `pyvenv.cfg`.
836
- *
837
- * `home` раньше `executable`: у Homebrew `executable` указывает в папку
838
- * конкретного выпуска (`Cellar/python@3.14/3.14.7/…`), и после `brew upgrade`
839
- * её уже нет, а `home` (`/opt/homebrew/opt/python@3.14/bin`) переживает
840
- * обновление. Нет файла или записанного питона на диске — `null`.
803
+ * Принести питон замка ЭТОГО кандидата (или взять уже лежащий) — им движок
804
+ * кандидата доводит до замка всё остальное (`env-install --step env`).
841
805
  */
842
- workingBasePython(): string | null;
806
+ bringPython(place: EnginePlace, report?: (text: string) => void): Promise<string>;
843
807
  /** Python ровно названного кандидата, а не текущей версии. */
844
808
  candidatePython(place: EnginePlace): string | null;
845
809
  /**
@@ -860,12 +824,7 @@ declare class Engine {
860
824
  * Весь движок (включая проверку и установку) идёт через запуск python'а.
861
825
  * Когда его нет, `execFile` бросает ENOENT, и клиентской нейросети
862
826
  * доставалось «spawn python3 ENOENT» — текст, из которого человеку не понять
863
- * ничего. Шаг «python», написанный ровно для этого случая, при этом
864
- * недостижим по устройству: он сам запускается python'ом.
865
- *
866
- * На Windows есть отдельная беда: в PATH лежит заглушка Microsoft Store —
867
- * `python` там есть, он печатает рекламу магазина и выходит с кодом 9009.
868
- * Поэтому проверяем не наличие файла, а ответ на вопрос о версии.
827
+ * ничего. Проверяем не наличие файла, а ответ на вопрос о версии.
869
828
  */
870
829
  pythonTrouble(): Promise<string | null>;
871
830
  /**
@@ -1452,21 +1411,6 @@ interface StepOutcome {
1452
1411
  interface FirstInstallTestHooks {
1453
1412
  afterPublishRename?(): void;
1454
1413
  }
1455
- /** Где внутри начинки лежит общая таблица источников питона. */
1456
- declare const SOURCES_FILE = "python-sources.json";
1457
- interface PythonSource {
1458
- url: string;
1459
- sha256: string;
1460
- mb: number;
1461
- }
1462
- /**
1463
- * Ключ платформы ровно в том виде, в каком его пишет питон:
1464
- * `platform.system()`-`platform.machine()`. Совпадение обязано быть точным —
1465
- * таблица одна на две стороны.
1466
- */
1467
- declare function platformKey(os?: NodeJS.Platform, arch?: string): string | null;
1468
- /** Прочитать таблицу питона из установленной начинки. */
1469
- declare function pythonSource(engineDir: string, key?: string | null): PythonSource | null;
1470
1414
  /**
1471
1415
  * Доставить начинку, когда движка нет вовсе.
1472
1416
  *
@@ -1478,17 +1422,44 @@ declare function installPayload(engine: Engine, opts: {
1478
1422
  manifestUrl: string;
1479
1423
  key?: string | undefined;
1480
1424
  }, hooks?: FirstInstallTestHooks): Promise<StepOutcome>;
1425
+
1426
+ declare const LOCK_FILE = "deps.lock.json";
1427
+ interface LockArchive {
1428
+ url: string;
1429
+ sha256: string;
1430
+ bytes: number;
1431
+ }
1432
+ /** Питон замка для этой машины: откуда качать и куда положить. */
1433
+ interface LockedPython {
1434
+ version: string;
1435
+ archive: LockArchive;
1436
+ /** Папка в хранилище: `<дом>/deps/python/<версия>-<сумма>`. */
1437
+ folder: string;
1438
+ /** Интерпретатор внутри папки. */
1439
+ executable: string;
1440
+ }
1481
1441
  /**
1482
- * Доставить портативный python, когда системного нет.
1442
+ * Ключ строки замка ровно в том виде, в каком его пишет питон:
1443
+ * `platform.system()-platform.machine()`.
1444
+ */
1445
+ declare function platformKey(os?: NodeJS.Platform, arch?: string): string | null;
1446
+ /** `<версия>-<8 знаков суммы каждого архива>` — имя папки в хранилище, как у движка. */
1447
+ declare function depFolderName(entry: {
1448
+ version: string;
1449
+ archives: Array<{
1450
+ sha256: string;
1451
+ }>;
1452
+ }): string;
1453
+ /** Прочитать строку питона из замка начинки; нет замка или сборки под машину — null. */
1454
+ declare function lockedPython(engineDir: string, home: string, key?: string | null): LockedPython | null;
1455
+ /**
1456
+ * Принести питон замка в хранилище, если его там ещё нет; вернуть путь к нему.
1483
1457
  *
1484
- * ⚠ ЭТО НЕ ДУБЛЬ ШАГА «python» ДВИЖКА, А ЕГО ЕДИНСТВЕННЫЙ ДОСТУПНЫЙ ПУТЬ НА
1485
- * ЧИСТОЙ МАШИНЕ. Как только питон появился, шаг движка снова работает и делает
1486
- * ровно то же самое — оттуда и таблица источников, и место установки.
1458
+ * Папка появляется целиком: распаковка — в соседнюю `.partial-<pid>`, потом
1459
+ * переименование. Лежит уже — сеть не трогаем вовсе: «версию питона не подняли
1460
+ * — используем уже скачанную».
1487
1461
  */
1488
- declare function installPython(engine: Engine, opts: {
1489
- consent: boolean;
1490
- version?: string;
1491
- }): Promise<StepOutcome>;
1462
+ declare function bringPython(python: LockedPython, report?: (text: string) => void): Promise<string>;
1492
1463
 
1493
1464
  /**
1494
1465
  * Иерархия ошибок клиента Напарника.
@@ -1590,9 +1561,9 @@ declare class NaparnikConfigError extends NaparnikError {
1590
1561
  * годится ли она для новой начинки: разойдись она с пакетом, и в логах будет
1591
1562
  * стоять чужое число, а обновление начнёт считать оболочку не той.
1592
1563
  */
1593
- declare const VERSION = "0.10.47";
1564
+ declare const VERSION = "0.10.50";
1594
1565
  /** Как мы представляемся серверу Напарника. По нему в логах видно оболочку. */
1595
- declare const USER_AGENT = "naparnik-mcp/0.10.47";
1566
+ declare const USER_AGENT = "naparnik-mcp/0.10.50";
1596
1567
  /**
1597
1568
  * Самая старая начинка (движок монтажа), с которой эта оболочка работает.
1598
1569
  * Обновление начинки ниже этой версии не ставится, а выше — требует оболочки
@@ -1629,7 +1600,7 @@ declare const USER_AGENT = "naparnik-mcp/0.10.47";
1629
1600
  * словами «раздача ещё не обновилась». Номер берётся из УЖЕ СОБРАННОГО
1630
1601
  * артефакта этой волны, а не сочиняется по календарю.
1631
1602
  */
1632
- declare const MIN_ENGINE = "2026.09.24-466";
1603
+ declare const MIN_ENGINE = "2026.09.24-478";
1633
1604
 
1634
1605
  /**
1635
1606
  * Что вышло из установки или отката — одними словами у начинки и у тела.
@@ -1896,4 +1867,4 @@ declare function install(n: Settings): Outcome;
1896
1867
  /** Убрать наш блок и ничего кроме него. */
1897
1868
  declare function remove(env?: NodeJS.ProcessEnv): Outcome;
1898
1869
 
1899
- export { type ArgsSchema, type CheckedTool, type CommandOutcome, DEFAULT_HOME, type Decision, DeliveryError, Engine, type EngineManifest, type EnginePlace, ForeignBlockError, INSIDE_PYTHON, INSTALL_STEPS, type InstallOutcome, KEEP_COPIES, KEEP_VERSIONS, LONG_STEPS, MANIFEST_TIMEOUT_MS, MANIFEST_URL, MARKER, MIN_ENGINE, type ManifestOutcome, NaparnikApiClient, NaparnikAuthError, NaparnikClientError, NaparnikConfigError, NaparnikError, NaparnikInsufficientBalanceError, type NaparnikMcpConfig, NaparnikScopeError, NaparnikServerError, NaparnikTimeoutError, type Outcome, PAUSE_HOURS, type PackPassport, SERVER_NAME, SOURCES_FILE, START_SEC, type Settings, TOOL_SEC, type Trial, USER_AGENT, type UpdateDeps, VERSION, buildAll, buildBlock, buildResources, compare, configPath, decide, defineTool, deploy, downloadFile, fetchManifest, fileOrRefusal, findBlock, fromNpxCache, inside, install, installPayload, installPython, jsonSchemaOf, keyInTable, lastLine, loadConfig, markChecked, markCurrent, parseEngineManifest, parseFailure, path, platformKey, previousVersion, probe, pythonSource, refusalFor, remove, rollback, tarEntries, tidyOld, timeToCheck, unpackArchive, withArgs };
1870
+ export { type ArgsSchema, type CheckedTool, type CommandOutcome, DEFAULT_HOME, type Decision, DeliveryError, Engine, type EngineManifest, type EnginePlace, ForeignBlockError, INSTALL_STEPS, type InstallOutcome, KEEP_COPIES, KEEP_VERSIONS, LOCK_FILE, LONG_STEPS, MANIFEST_TIMEOUT_MS, MANIFEST_URL, MARKER, MIN_ENGINE, type ManifestOutcome, NaparnikApiClient, NaparnikAuthError, NaparnikClientError, NaparnikConfigError, NaparnikError, NaparnikInsufficientBalanceError, type NaparnikMcpConfig, NaparnikScopeError, NaparnikServerError, NaparnikTimeoutError, type Outcome, PAUSE_HOURS, type PackPassport, SERVER_NAME, START_SEC, type Settings, TOOL_SEC, type Trial, USER_AGENT, type UpdateDeps, 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 };
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-PT34EZZ7.js';
1
+ 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, markChecked2 as markChecked, markCurrent, parseEngineManifest, parseFailure, path, platformKey, previousVersion, probe, refusalFor, remove, rollback, tarEntries, tidyOld, timeToCheck2 as timeToCheck, unpackArchive, withArgs } from './chunk-DH5ID6CT.js';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@naparnik/mcp",
3
- "version": "0.10.47",
3
+ "version": "0.10.50",
4
4
  "description": "MCP-сервер Напарника: монтаж вертикального видео на машине пользователя — паузы, субтитры, герой на новом фоне, звук. Видео никуда не уезжает.",
5
5
  "license": "SEE LICENSE IN LICENSE.md",
6
6
  "private": false,