@naparnik/mcp 0.10.52 → 0.10.54

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/index.d.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  import { z } from 'zod/v4';
2
+ import { T as Tool, b as ToolContext, c as ToolResult, d as ToolInputSchema, M as McpResource, a as McpResourceItemContent } from './tool-1kGke9dT.js';
2
3
 
3
4
  interface NaparnikMcpConfig {
4
5
  apiKey: string;
@@ -119,379 +120,6 @@ declare class NaparnikApiClient {
119
120
  private parse;
120
121
  }
121
122
 
122
- /** Определение ресурса в MCP */
123
- interface McpResource {
124
- /** URI ресурса (уникальный идентификатор) */
125
- uri: string;
126
- /** Человекочитаемое имя */
127
- name: string;
128
- /** Описание ресурса (опционально) */
129
- description?: string;
130
- /** MIME-тип содержимого (опционально) */
131
- mimeType?: string;
132
- }
133
- /** Текстовое содержимое ресурса */
134
- interface McpResourceTextContent {
135
- uri: string;
136
- mimeType?: string;
137
- text: string;
138
- /** Метаданные расширений: у виджета MCP Apps здесь `ui.csp`, `ui.prefersBorder` */
139
- _meta?: Record<string, unknown>;
140
- }
141
- /** Бинарное содержимое ресурса */
142
- interface McpResourceBlobContent {
143
- uri: string;
144
- mimeType?: string;
145
- /** Base64-кодированные данные */
146
- blob: string;
147
- }
148
- /** Содержимое ресурса — текст или бинарные данные */
149
- type McpResourceItemContent = McpResourceTextContent | McpResourceBlobContent;
150
-
151
- /**
152
- * Типы и утилиты для инструментов агентного цикла.
153
- *
154
- * Порт из packages/agent-core/src/tools/tool.ts с расширениями:
155
- * - readOnly флаг для параллельного выполнения
156
- * - group — категория инструмента для фильтрации и UI
157
- * - emitProgress в ToolContext — стриминг прогресса без возврата из execute
158
- * - agentId в ToolContext — для мульти-агентных сценариев
159
- */
160
- /**
161
- * Примитивный тип JSON Schema для параметра инструмента.
162
- * Ограниченное подмножество JSON Schema — только то, что понимают LLM-провайдеры.
163
- */
164
- type JSONSchemaType = {
165
- type: 'string';
166
- description?: string;
167
- enum?: string[];
168
- /** Максимальная длина строки — защита от DoS через гигантский input. */
169
- maxLength?: number;
170
- /** Минимальная длина строки. */
171
- minLength?: number;
172
- } | {
173
- type: 'number';
174
- description?: string;
175
- } | {
176
- type: 'integer';
177
- description?: string;
178
- } | {
179
- type: 'boolean';
180
- description?: string;
181
- } | {
182
- type: 'array';
183
- items: JSONSchemaType;
184
- description?: string;
185
- } | {
186
- type: 'object';
187
- properties: Record<string, JSONSchemaType>;
188
- required?: string[];
189
- description?: string;
190
- /**
191
- * Разрешить произвольные ключи в объекте (валидный JSON Schema keyword).
192
- * Полезно для object-параметров с динамическими полями (params интеграций),
193
- * где нужно явно подсказать LLM что это словарь произвольных ключей.
194
- * При использовании совмещать с `properties: {}` для соответствия общему
195
- * стилю кодовой базы.
196
- */
197
- additionalProperties?: boolean;
198
- };
199
- /** Схема входных параметров инструмента (JSON Schema объект верхнего уровня) */
200
- interface ToolInputSchema {
201
- type: 'object';
202
- properties: Record<string, JSONSchemaType>;
203
- required?: string[];
204
- }
205
- /**
206
- * Контекст, передаваемый в каждый вызов инструмента.
207
- *
208
- * readFileTimestamps — критически важен для защиты от устаревших записей:
209
- * перед перезаписью файла инструменты write/edit проверяют, что файл был
210
- * прочитан в текущей сессии и не изменился с момента чтения.
211
- */
212
- interface ToolContext {
213
- /** Уникальный идентификатор текущей сессии */
214
- sessionId: string;
215
- /** Сигнал отмены — инструменты должны проверять его при длительных операциях */
216
- abortSignal?: AbortSignal;
217
- /** Среда выполнения — влияет на доступные операции */
218
- env: 'electron' | 'server' | 'test';
219
- /** Рабочая директория для файловых операций */
220
- workingDirectory?: string;
221
- /**
222
- * Временные метки последнего чтения файлов (путь → timestamp в мс).
223
- *
224
- * Заполняется инструментом чтения при каждом успешном обращении.
225
- * Инструменты записи и редактирования проверяют этот словарь перед записью,
226
- * чтобы обнаружить устаревшие правки (stale write detection).
227
- *
228
- * Ключ: абсолютный путь к файлу.
229
- * Значение: Date.now() в момент прочтения.
230
- */
231
- readFileTimestamps: Record<string, number>;
232
- /**
233
- * Содержимое прочитанных файлов (путь → текст).
234
- *
235
- * Опциональный словарь для post-compact restore — заполняется инструментами
236
- * чтения когда featureGates.postCompactRestore=true.
237
- * Позволяет postCompactRestore() восстановить содержимое без повторного чтения с диска.
238
- *
239
- * Ключ: абсолютный путь к файлу (совпадает с readFileTimestamps).
240
- * Значение: текстовое содержимое на момент последнего чтения.
241
- */
242
- readFileContents?: Record<string, string>;
243
- /**
244
- * Функция для эмиссии событий прогресса во время выполнения инструмента.
245
- * Позволяет стримить промежуточные результаты в UI без завершения execute().
246
- * Отсутствует, если потребитель не поддерживает стриминг прогресса.
247
- */
248
- emitProgress?: (content: string) => void;
249
- /**
250
- * Идентификатор агента в мульти-агентных сценариях.
251
- * Используется для изоляции состояния между агентами и корректного логирования.
252
- */
253
- agentId?: string;
254
- /**
255
- * Программа, которая нас позвала: `clientInfo` из рукопожатия MCP
256
- * («claude-ai», «codex-mcp-client»). Нужна отчёту о поломке
257
- * (`crash-report.ts`): одна и та же беда у Claude Desktop и у Codex — это
258
- * часто две разные беды. Нет — хост не представился.
259
- */
260
- host?: {
261
- name: string;
262
- version: string;
263
- };
264
- }
265
- /**
266
- * Текстовый блок в результате инструмента.
267
- * Используется внутри mixed-content для аннотаций к изображениям.
268
- */
269
- interface ToolTextBlock {
270
- type: 'text';
271
- text: string;
272
- }
273
- /**
274
- * Блок изображения в результате инструмента (vision support).
275
- *
276
- * Tool возвращает картинку «по-человечески»: base64 + mediaType.
277
- * Конвертация в нативный формат API провайдера (Anthropic source/Google inlineData/
278
- * OpenAI image_url) — обязанность нижележащего слоя (tool-dispatch + LLM provider).
279
- *
280
- * Используется для:
281
- * - чтения сканированных документов (vision fallback при отказе OCR)
282
- * - анализа скриншотов
283
- * - обработки фото с телефона пользователя
284
- */
285
- interface ToolImageBlock {
286
- type: 'image';
287
- /** Base64-кодированные данные изображения (без префикса data:...) */
288
- base64: string;
289
- /** MIME-тип — модели нужен корректный формат для декодирования */
290
- mediaType: 'image/jpeg' | 'image/png' | 'image/gif' | 'image/webp';
291
- }
292
- /**
293
- * Блок-ссылка на изображение в vision-cache (disk storage).
294
- *
295
- * Альтернатива ToolImageBlock когда vision-cache сконфигурирован
296
- * (`ctx.visionCache` есть). Tool пишет raw bytes в cache и возвращает
297
- * file_ref вместо inline base64. Это снимает нагрузку с RAM/БД/PHP:
298
- * tool_result в messages.content становится ~200 байт вместо ~500 KB.
299
- *
300
- * Раскрытие в base64 происходит непосредственно перед `provider.send()`
301
- * через `expandVisionRefs` в `super-agent-core/src/loop/query.ts`.
302
- *
303
- * @see super-agent-core/src/loop/vision-cache.ts
304
- */
305
- interface ToolImageRefBlock {
306
- type: 'image_ref';
307
- /** Относительный путь от rootPath: `<sessionId>/<sha256>.<ext>` */
308
- pathSuffix: string;
309
- mediaType: 'image/jpeg' | 'image/png' | 'image/gif' | 'image/webp';
310
- }
311
- /** Объединённый тип контентного блока в результате инструмента */
312
- type ToolContentBlock = ToolTextBlock | ToolImageBlock | ToolImageRefBlock;
313
- /**
314
- * Успешный результат инструмента.
315
- *
316
- * Может быть простой строкой (обычный случай) или массивом блоков text+image
317
- * для мультимодальных результатов (vision). Image-блоки требуются чтобы
318
- * модель могла «видеть» картинку, а не получать строку base64 в text-блоке.
319
- */
320
- interface ToolResultSuccess {
321
- type: 'success';
322
- content: string | ToolContentBlock[];
323
- /**
324
- * Данные для ВИДЖЕТА, мимо контекста модели.
325
- *
326
- * ⚠ РАЗДЕЛЕНИЕ НЕ РАДИ ПОРЯДКА, А РАДИ ДЕНЕГ И ТОЛКУ. Настоящий кадр ролика
327
- * в base64 весит восемь килобайт; три кадра — двадцать четыре, и модель
328
- * перечитывает их каждый ход, ничего в них не видя: base64 в тексте она
329
- * «посмотреть» не может. Картинки нужны ГЛАЗАМ человека, то есть форме, а
330
- * модели хватает названий словами. Уезжает как `structuredContent` в ответе
331
- * `tools/call` — так это и разведено в спеке MCP.
332
- */
333
- structured?: Record<string, unknown>;
334
- }
335
- /** Результат с ошибкой без машиночитаемого кода */
336
- interface ToolResultErrorBase {
337
- type: 'error';
338
- error: string;
339
- }
340
- /** Результат с ошибкой с машиночитаемым кодом */
341
- interface ToolResultErrorWithCode {
342
- type: 'error';
343
- error: string;
344
- /** Код ошибки для программной обработки (retry logic, UI, логирование) */
345
- code: string;
346
- }
347
- /** Результат с ошибкой — с кодом или без */
348
- type ToolResultError = ToolResultErrorBase | ToolResultErrorWithCode;
349
- /** Финальный результат выполнения инструмента */
350
- type ToolResult = ToolResultSuccess | ToolResultError;
351
- /**
352
- * Категория инструмента — для фильтрации, UI-группировки и политик доступа.
353
- * Аналог group:* из конфигурации OpenClaw.
354
- */
355
- type ToolGroup = 'fs' | 'runtime' | 'web' | 'memory' | 'knowledge' | 'ui' | 'system' | 'automation' | 'confirmation' | 'collaboration' | 'integration' | 'skill';
356
- /**
357
- * Универсальный интерфейс инструмента агента.
358
- *
359
- * Инструменты регистрируются в агентском цикле и вызываются моделью
360
- * по имени через механизм tool_use. Каждый инструмент описывает себя
361
- * через JSON Schema и реализует функцию execute.
362
- *
363
- * @example
364
- * ```typescript
365
- * const readFileTool: Tool = {
366
- * name: 'read_file',
367
- * description: 'Читает содержимое файла по указанному пути',
368
- * inputSchema: {
369
- * type: 'object',
370
- * properties: {
371
- * path: { type: 'string', description: 'Путь к файлу' }
372
- * },
373
- * required: ['path']
374
- * },
375
- * readOnly: true,
376
- * group: 'fs',
377
- * async execute(input, ctx) {
378
- * // ...
379
- * }
380
- * }
381
- * ```
382
- */
383
- interface Tool<TInput = any> {
384
- /** Уникальное имя инструмента (snake_case) */
385
- name: string;
386
- /** Человекочитаемое описание для модели */
387
- description: string;
388
- /**
389
- * Название по-русски — для ЧЕЛОВЕКА, в отличие от `description` для модели.
390
- * Уезжает хосту как `annotations.title` и показывается в настройках вместо
391
- * имени из кода: без него человек читает «Choose variant», решая, разрешать
392
- * ли инструмент.
393
- */
394
- title?: string;
395
- /** JSON Schema входных параметров */
396
- inputSchema: ToolInputSchema;
397
- /**
398
- * Флаг «только чтение».
399
- * readOnly-инструменты не изменяют внешнее состояние и могут выполняться
400
- * параллельно с другими readOnly-инструментами без риска конфликтов.
401
- * Агентский цикл использует этот флаг для параллельного выполнения.
402
- */
403
- readOnly?: boolean;
404
- /**
405
- * Переписывает то, что у человека уже есть.
406
- *
407
- * По умолчанию `false`, и это не оптимизм: монтаж кладёт НОВЫЙ файл рядом с
408
- * исходником, обновление держит прежнюю версию на диске, установка кладёт
409
- * недостающее в свою папку — ничего из этого не затирает чужого. `true`
410
- * ставится там, где вызов переписывает содержимое, которое человек считал
411
- * своим: например, готовый фильтр цвета в его паке стиля.
412
- */
413
- destructive?: boolean;
414
- /**
415
- * Виджет инструмента (MCP Apps): адрес `ui://…` ресурса, HTML которого хост
416
- * рисует в ленте вместо текстового ответа. Ресурс регистрируется на
417
- * сервере отдельно (`McpServer.addResource`); здесь только ссылка, и в
418
- * `tools/list` она уезжает как `_meta.ui.resourceUri`.
419
- */
420
- ui?: {
421
- resourceUri: string;
422
- };
423
- /**
424
- * Флаг «обратимое действие» — действие остаётся в рамках текущего диалога
425
- * с этим пользователем и не выходит наружу.
426
- *
427
- * `true` (по умолчанию) — безопасно вызывать без явного человеческого approve:
428
- * recall, web_search, view, create_file (в workspace), send_file_to_chat,
429
- * send_task_to_agent (внутреннему агенту), bash_tool (sandbox-изолирован),
430
- * integration_call с read-методами.
431
- *
432
- * `false` — действие выходит наружу и должно сопровождаться явной формулировкой
433
- * подтверждения от пользователя (через диалог) перед выполнением:
434
- * отправка наружу (письмо/SMS внешнему адресату), запись в CRM/ERP,
435
- * финансовые операции, удаление persistent данных.
436
- *
437
- * Используется для генерации списков в system prompt и (в будущем)
438
- * для автоматического enforcement в loop.
439
- */
440
- reversible?: boolean;
441
- /**
442
- * Группа инструмента — для фильтрации, UI-группировки и политик доступа.
443
- * Соответствует group:* из конфигурации OpenClaw sandbox.
444
- */
445
- group?: ToolGroup;
446
- /**
447
- * Флаг «отложенная загрузка схемы» (lazy tool loading).
448
- *
449
- * Если `true` — JSON Schema этого tool'а НЕ передаётся в LLM API в каждом
450
- * запросе. Модель видит только имя + 1-строчное описание в специальном
451
- * блоке `<deferred_tools>` системного промпта и подгружает полную схему
452
- * через ToolSearch tool когда нужно её вызвать.
453
- *
454
- * Используется для редких/тяжёлых tools чтобы экономить токены input'а:
455
- * - integration_call (динамический, описание ~жирное)
456
- * - browse_page (тяжёлый prompt)
457
- * - observer_*, credential_*, skill_* (admin-flow, редко)
458
- *
459
- * НЕ deferr'им: bash, view, read, write, edit, grep, glob, web_*,
460
- * todo_write, Task, ToolSearch, memory tools — это core.
461
- *
462
- * После вызова ToolSearch с `select:<name>` или релевантного keyword-search
463
- * — схема активируется на оставшийся срок жизни сессии (обычный tools[] payload).
464
- */
465
- isDeferred?: boolean;
466
- /**
467
- * Максимальный размер `tool_result.content` в символах ДО persistence-cap.
468
- *
469
- * Семантика 1-в-1 как у Claude Code 2.1.88 (`Tool.ts:466`):
470
- * - Эффективный порог = `min(maxResultSizeChars, DEFAULT_MAX_RESULT_SIZE_CHARS=50_000)`.
471
- * Tool может объявить **БОЛЬШЕ** 50K — глобальный cap всё равно применит 50K.
472
- * Tool может объявить **МЕНЬШЕ** 50K (например Grep 20K) — будет применён tool-specific лимит.
473
- * - `Infinity` = hard opt-out, никогда не persist (для FileRead/view —
474
- * нет смысла записывать файл во второй файл).
475
- * - `undefined` = поведение как 100_000 (clamp до 50K).
476
- *
477
- * Применяется в `maybePersistLargeToolResult` (слой A) сразу после
478
- * выполнения tool'а в `tool-dispatch.ts`, ДО того как tool_result попадёт
479
- * в messages history. Большие результаты пишутся на диск
480
- * `<rootPath>/<sessionId>/<tool_use_id>.{json,txt}`, в messages летит
481
- * preview ~2000 символов внутри `<persisted-output>` тегов.
482
- *
483
- * Подробности — `new-version/docs/claude-code-optimizations.md` (Слой A).
484
- */
485
- maxResultSizeChars?: number;
486
- /**
487
- * Выполняет инструмент с заданными параметрами.
488
- * @param input - Валидированные входные параметры
489
- * @param ctx - Контекст выполнения (сессия, сигнал отмены, среда, временные метки файлов)
490
- * @returns Результат выполнения или ошибка
491
- */
492
- execute(input: TInput, ctx: ToolContext): Promise<ToolResult>;
493
- }
494
-
495
123
  /**
496
124
  * «Не спи»: компьютер не засыпает, пока идёт наша работа, и ещё хвост после.
497
125
  *
@@ -677,7 +305,9 @@ declare class Engine {
677
305
  */
678
306
  private readonly awake;
679
307
  private passportCache;
680
- private versionAtStart;
308
+ private pinned;
309
+ /** Фоновые работы этого процесса, которые ещё идут: номер → версия, на которой заведены. */
310
+ private readonly live;
681
311
  private pythonChecked;
682
312
  constructor(env?: NodeJS.ProcessEnv,
683
313
  /**
@@ -714,24 +344,35 @@ declare class Engine {
714
344
  /** Папка версий движка: `<дом>/engine`. */
715
345
  versionsDir(): string;
716
346
  /**
717
- * Какая версия движка объявлена рабочей.
347
+ * Какая версия движка рабочая ДЛЯ СЛЕДУЮЩЕЙ ЗАДАЧИ.
718
348
  *
719
349
  * Обычный ТЕКСТОВЫЙ файл, а не симлинк: создание симлинка на Windows требует
720
350
  * режима разработчика или прав администратора, а строка в файле переносима и
721
351
  * переименовывается атомарно.
722
352
  *
723
- * ⚠ ЗАПОМИНАЕТСЯ НА ВСЮ ЖИЗНЬ ПРОЦЕССА, И ЭТО НЕСУЩЕЕ. Так работает обещание
724
- * «подмена начинки — только на старте»: обновление меняет файл `current`, а
725
- * запущенный процесс продолжает считать на той версии, с которой начал.
726
- * Читай мы файл каждый раз — задача, заведённая старой версией, дочитывалась
727
- * бы новой. У движка кэш по отпечаткам, и в отпечаток входит код шага: смесь
728
- * двух версий внутри одной задачи не упала бы, а тихо смешала результаты.
353
+ * ⚠ ВЕРСИЯ ЧИТАЕТСЯ НА СТАРТЕ КАЖДОЙ ЗАДАЧИ, А НЕ ОДИН РАЗ НА ПРОЦЕСС (решение
354
+ * владельца 2026-09-25: «зачем перезапускать Claude, если код просто
355
+ * скачался»). Движок — отдельный питон на каждую команду, и новой версии не
356
+ * нужен новый процесс оболочки. До 2026-09-25 версия запоминалась на всю жизнь
357
+ * процесса, и каждое обновление кончалось «перезапусти Claude».
358
+ *
359
+ * ⚠ НО ИДУЩАЯ ЗАДАЧА ДОИГРЫВАЕТ НА СВОЕЙ ВЕРСИИ, И ЭТО НЕСУЩЕЕ. У движка кэш
360
+ * по отпечаткам, и в отпечаток входит код шага: смесь двух версий внутри
361
+ * одной задачи не упала бы, а тихо смешала результаты. Пока жива фоновая
362
+ * работа, заведённая этим процессом (`background`), её опрос (`wait`) и её
363
+ * отказ зовут ту же версию; сменилась — подхватывается после неё.
729
364
  *
730
- * `freshVersion()` даёт незакэшированное значение — она нужна ровно двум местам:
731
- * самому обновлению и рассказу человеку о том, что новая версия уже готова и
732
- * подхватится после перезапуска.
365
+ * `freshVersion()` даёт то, что лежит в файле прямо сейчас, мимо задачи: оно
366
+ * нужно самому обновлению и новостям о версиях.
733
367
  */
734
368
  currentVersion(): string | null;
369
+ /**
370
+ * Идёт ли фоновая работа, заведённая этим процессом.
371
+ *
372
+ * Нужен двоим: версии движка (сменить её под живой задачей нельзя) и замене
373
+ * тела оболочки (`body-swap.ts`): тело меняется, только когда ничего не идёт.
374
+ */
375
+ busy(): boolean;
735
376
  /** Что записано в файле `current` прямо сейчас, мимо памяти процесса. */
736
377
  freshVersion(): string | null;
737
378
  /**
@@ -764,17 +405,6 @@ declare class Engine {
764
405
  * вместо того, чтобы объяснить человеку один недостающий шаг.
765
406
  */
766
407
  whyNoEngine(): string;
767
- /**
768
- * Забыть, где движок, — после того как мы его только что поставили.
769
- *
770
- * ⚠ БЕЗ ЭТОГО ПЕРВАЯ УСТАНОВКА НЕ ВИДНА САМОЙ СЕБЕ. `currentVersion`
771
- * запоминается на всю жизнь процесса нарочно (подмена начинки — только на
772
- * старте), и сразу после доставки следующий же вызов получил бы
773
- * закэшированное «версии нет» про версию, которую мы сами и разложили.
774
- * Здесь это не нарушает обещания: смешивать две версии внутри задачи нечем,
775
- * до этого момента версии не было вовсе.
776
- */
777
- forgetPlace(): void;
778
408
  /** Забыть ответ на вопрос «есть ли питон» — после того как мы его принесли. */
779
409
  forgetPython(): void;
780
410
  /** Python окружения пака — им считается монтаж. Может ещё не существовать. */
@@ -1255,6 +885,11 @@ declare class CrashReporter {
1255
885
  * новую полосу на каждый вызов; `variant_chosen` — потому что в Codex виджетов
1256
886
  * нет, выбор приходит словами, и звать запись модель должна сама.
1257
887
  *
888
+ * ⚠ С 2026-09-25 ИХ ДЕВЯТЬ: `install` отделён от `setup` (решение владельца).
889
+ * Окно хост привязывает к инструменту целиком, и проверка с установкой одной
890
+ * дверью давала четыре окна на одно «скачай», два из них — с сырым текстом
891
+ * движка. Проверка теперь без окна, установка — одна задача с полосой.
892
+ *
1258
893
  * ⚠ ДО 2026-09-18 ИХ БЫЛО ДВАДЦАТЬ ПЯТЬ, И ЭТО БЫЛО ДОРОГО НЕ КРАСОТОЙ. Каждое
1259
894
  * объявление модель перечитывает каждым ходом, а ход стоит 8–19 секунд
1260
895
  * (`docs/architecture.md` р. 26). Двадцать пять дверей к пятнадцати работам
@@ -1562,9 +1197,9 @@ declare class NaparnikConfigError extends NaparnikError {
1562
1197
  * годится ли она для новой начинки: разойдись она с пакетом, и в логах будет
1563
1198
  * стоять чужое число, а обновление начнёт считать оболочку не той.
1564
1199
  */
1565
- declare const VERSION = "0.10.52";
1200
+ declare const VERSION = "0.10.54";
1566
1201
  /** Как мы представляемся серверу Напарника. По нему в логах видно оболочку. */
1567
- declare const USER_AGENT = "naparnik-mcp/0.10.52";
1202
+ declare const USER_AGENT = "naparnik-mcp/0.10.54";
1568
1203
  /**
1569
1204
  * Самая старая начинка (движок монтажа), с которой эта оболочка работает.
1570
1205
  * Обновление начинки ниже этой версии не ставится, а выше — требует оболочки
package/dist/index.js CHANGED
@@ -1 +1 @@
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-CXFF4BPP.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, markChecked, markCurrent, parseEngineManifest, parseFailure, path, platformKey, previousVersion, probe, refusalFor, remove, rollback, tarEntries, tidyOld, timeToCheck, unpackArchive, withArgs } from './chunk-USWWD5M5.js';