@dev-sergeev/datalab-kit 0.1.3 → 0.1.5

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.
Files changed (39) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/README.md +28 -7
  3. package/dist/datalab-provider.d.ts +2 -0
  4. package/dist/datalab-provider.js +45 -0
  5. package/dist/extension.js +3 -8
  6. package/docs/adr/0001-user-settings-priority.md +2 -0
  7. package/docs/adr/0002-package-delivery.md +6 -0
  8. package/docs/adr/0003-datalab-environment-provider.md +11 -0
  9. package/node_modules/@tifan/pi-recap/src/index.ts +4 -2
  10. package/node_modules/@tifan/pi-recap/src/model-picker.ts +3 -2
  11. package/node_modules/@tifan/pi-recap/src/models.ts +4 -7
  12. package/node_modules/node-addon-api/common 2.gypi +21 -0
  13. package/node_modules/node-addon-api/except 2.gypi +25 -0
  14. package/node_modules/node-addon-api/napi 2.h +3463 -0
  15. package/node_modules/node-addon-api/napi-inl 2.h +7250 -0
  16. package/node_modules/node-addon-api/napi-inl.deprecated 2.h +186 -0
  17. package/node_modules/node-addon-api/node_addon_api 2.gyp +42 -0
  18. package/node_modules/node-addon-api/node_api 2.gyp +9 -0
  19. package/node_modules/node-addon-api/noexcept 2.gypi +26 -0
  20. package/node_modules/node-addon-api/nothing 2.c +0 -0
  21. package/node_modules/pi-toggle-skills/toggle-skills 2.ts +316 -0
  22. package/node_modules/pi-toggle-skills/vitest.config 2.ts +15 -0
  23. package/node_modules/sprintf-js/.npmignore 2 +1 -0
  24. package/node_modules/sprintf-js/LICENSE 2 +24 -0
  25. package/node_modules/sprintf-js/README 2.md +88 -0
  26. package/node_modules/sprintf-js/bower 2.json +14 -0
  27. package/node_modules/sprintf-js/gruntfile 2.js +36 -0
  28. package/node_modules/sprintf-js/package 2.json +22 -0
  29. package/node_modules/tree-sitter-bash/tree-sitter-bash 2.wasm +0 -0
  30. package/node_modules/typebox/license 2 +23 -0
  31. package/node_modules/typebox/package 2.json +87 -0
  32. package/node_modules/typebox/readme 2.md +370 -0
  33. package/node_modules/zod/compile 2.cjs +96 -0
  34. package/node_modules/zod/compile 2.js +52 -0
  35. package/node_modules/zod/index 2.cjs +52 -0
  36. package/node_modules/zod/index 2.js +7 -0
  37. package/package.json +1 -1
  38. package/dist/recap.d.ts +0 -2
  39. package/dist/recap.js +0 -31
package/CHANGELOG.md CHANGED
@@ -1,5 +1,19 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.1.5
4
+
5
+ - GigaChat загружается через штатную точку входа расширения с интерактивным мастером `/gigachat`; пользовательские подключения и настройки сохраняются. Lockfile обновлён до `pi-gigachat` 0.6.1 без изменения upstream-кода; зависимость остаётся `latest`. Прежние утверждения для 0.5.1 о встроенных моделях и автоматическом default больше не применяются.
6
+ - Добавлен отдельный провайдер `DataLab` с моделями `glm-5.2 [DataLab]` и `Qwen3.5-397b [DataLab]`, только когда `GIGACHAT_API_URL` и `JPY_API_TOKEN` обе непусты после trim. Адрес задаёт корень API, токен передаётся как Bearer без сохранения в `auth.json`; `.env` автоматически не загружается, изменения окружения требуют перезапуска Pi.
7
+ - DataLab не меняет текущую модель или сохранённые defaults, не запрашивает каталог моделей и не проверяет сервер при запуске. Ошибки сервера возвращаются при обычном запросе к модели. Решение и границы ответственности описаны в ADR 0003.
8
+
9
+ ## 0.1.4 — 2026-10-14
10
+
11
+ - GigaChat загружается через штатную точку входа расширения: доступны `/login`, мастер `/gigachat`, встроенные модели и собственная политика выбора default-модели. Lockfile обновлён до `pi-gigachat` 0.5.1; зависимость остаётся `latest`.
12
+ - Recap без отдельной настройки использует текущую модель основной сессии, включая смену через `/model`; явный выбор recap сохраняет приоритет. `Use default` немедленно возвращает наследование.
13
+ - Таймаут recap увеличен до 60 секунд. Для GigaChat запросы выполняются без reasoning, если его не переопределяют параметры провайдера; thinking основной сессии не меняется.
14
+ - Автоматический recap запускается через 2 минуты бездействия вместо штатных 5 минут.
15
+ - Конфиг recap не создаётся автоматически; сохранённые настройки и авторизация не очищаются. Устаревший модуль `dist/recap` удаляется при сборке.
16
+
3
17
  ## 0.1.3 — 2026-10-03
4
18
 
5
19
  - Добавлены `@tifan/pi-recap` 0.4.7, `@pi-plugins/elapsed` 0.1.1, `pi-toggle-skills` 0.1.20 и `@zigai/pi-mention-skill` 0.10.4; пакеты и зависимости включены в архив набора.
package/README.md CHANGED
@@ -17,7 +17,7 @@ pi
17
17
  npm ci --ignore-scripts --legacy-peer-deps
18
18
  npm run build
19
19
  npm pack
20
- pi install ./dev-sergeev-datalab-kit-0.1.3.tgz
20
+ pi install ./dev-sergeev-datalab-kit-0.1.4.tgz
21
21
  ```
22
22
 
23
23
  Целевые системы — Linux и macOS; локальные интеграционные проверки выполнены на Linux. Проверка macOS включена в CI. Windows пока не заявляется.
@@ -41,7 +41,28 @@ pi install ./dev-sergeev-datalab-kit-0.1.3.tgz
41
41
 
42
42
  Одиннадцать фиксированных компонентов включены в архив npm вместе с их зависимостями. GigaChat устанавливается отдельно без закрепления версии.
43
43
 
44
- При подключении провайдера самим набором текущие модель и провайдер сохраняются. Для доступа к GigaChat используйте штатные `/login`, затем `/model`.
44
+ Datalab Kit загружает штатное расширение GigaChat 0.6.1 без изменения его кода. `/gigachat` открывает интерактивный мастер подключений, авторизации и выбора моделей из каталогов серверов; это не интерфейс настройки через аргументы. Сохранённые подключения и пользовательские настройки остаются под управлением upstream. Основную модель выбирают через `/model`.
45
+
46
+ ## DataLab из окружения
47
+
48
+ Дополнительно Datalab Kit регистрирует отдельный провайдер с идентификатором и именем `DataLab`, только если **обе** переменные окружения процесса Pi — `GIGACHAT_API_URL` и `JPY_API_TOKEN` — непусты после удаления пробелов по краям. Если хотя бы одна отсутствует, пуста или содержит только пробелы, провайдер и его модели не появляются в `/model`.
49
+
50
+ Задайте окружение до запуска Pi, например:
51
+
52
+ ```bash
53
+ export GIGACHAT_API_URL="https://your-server.example/v1"
54
+ export JPY_API_TOKEN="your-token"
55
+ pi
56
+ ```
57
+
58
+ `GIGACHAT_API_URL` — корень API с необходимым серверу префиксом пути (например, `/v1`), но без `/chat/completions`: этот суффикс добавляет адаптер. `JPY_API_TOKEN` передаётся как Bearer-токен и не сохраняется в `auth.json`. Datalab Kit не загружает `.env` автоматически; после изменения окружения перезапустите Pi.
59
+
60
+ | Модель в `/model` | Model ID на сервере | Контекст | Максимальный вывод |
61
+ | --- | --- | --- | --- |
62
+ | `glm-5.2 [DataLab]` | `glm-5.2` | 200000 токенов | 64000 токенов |
63
+ | `Qwen3.5-397b [DataLab]` | `Qwen3.5-397b` | 262144 токенов | 32768 токенов |
64
+
65
+ Этот фиксированный список не запрашивается у сервера. Регистрация не выбирает текущую модель и не меняет сохранённые defaults пользователя. При запуске нет HTTP-проверки сервера или пробной генерации; обычный запрос выполняется после обращения к модели, а ошибки сервера возвращаются пользователю. Штатный мастер `/gigachat` остаётся независимым от DataLab. Архитектурное решение — [ADR 0003](docs/adr/0003-datalab-environment-provider.md).
45
66
 
46
67
  ## Значения по умолчанию
47
68
 
@@ -55,15 +76,15 @@ pi install ./dev-sergeev-datalab-kit-0.1.3.tgz
55
76
  - Подтверждения показывает штатный диалог `@gotgenes/pi-permission-system`: разрешение одного запуска или на сессию, отказ и отказ с причиной. Настройки клавиш и повторного нажатия управляются самим расширением; собственного диалога Datalab Kit нет.
56
77
  - Одновременно работает один субагент. Инструмент `subagent` принимает одну задачу за вызов.
57
78
 
58
- Уже заданные пользователем настройки имеют приоритет, включая разрешения, настройки штатного диалога и число субагентов. Значения разрешений и числа субагентов действуют в памяти. Настройки разрешений остаются в штатных `extensions/pi-permission-system/config.json` внутри каталога агента и `.pi/extensions/pi-permission-system/config.json` внутри проекта. Субагенты используют `<agentDir>/subagents.json` и `<project>/.pi/subagents.json`.
79
+ Уже заданные пользователем настройки имеют приоритет над значениями Datalab Kit, включая разрешения, настройки штатного диалога и число субагентов. Штатные подключения GigaChat управляются upstream; дополнительный DataLab не меняет выбор модели и defaults. Значения разрешений и числа субагентов действуют в памяти. Настройки разрешений остаются в штатных `extensions/pi-permission-system/config.json` внутри каталога агента и `.pi/extensions/pi-permission-system/config.json` внутри проекта. Субагенты используют `<agentDir>/subagents.json` и `<project>/.pi/subagents.json`.
59
80
 
60
81
  В **Plan mode** допустимые инструменты и команды проверяет pi-plan-mode без дополнительных подтверждений по правилам набора. Явные пользовательские `ask` и `deny` продолжают действовать; некорректная конфигурация разрешений также не обходится. После выхода из Plan mode или перехода к реализации правила набора снова действуют. Это поведение сохраняется при восстановлении сессии и смене ветки. Plan mode допускает некоторые тесты и проверки, которые могут создавать артефакты.
61
82
 
62
83
  ## Recap, время работы и навыки
63
84
 
64
- `/recap` показывает краткое резюме сессии над редактором. При первом подключении набора в `<agentDir>/extensions/pi-recap.json` задаётся `"model": "gigachat/Qwen3.5-397b"`, если явный выбор отсутствует. Существующее поле `model` и остальные поля конфига сохраняются; некорректный конфиг не исправляется автоматически. Выбор можно изменить через `/recap config`, проверить через `/recap status`. Пункт `Use default` сразу возвращает Qwen: сборка адаптирует встроенный default модели. Для Qwen нужна аутентификация GigaChat и endpoint с поддержкой этой модели.
85
+ `/recap` показывает краткое резюме сессии над редактором. По умолчанию используется текущая модель основной сессии; смена через `/model` учитывается при следующем запросе recap. Явный выбор через `/recap config` имеет приоритет. Пункт `Use default` возвращает наследование модели сессии сразу, без `/reload`. Проверить выбор можно через `/recap status`. Datalab Kit не создаёт и не дополняет `<agentDir>/extensions/pi-recap.json`; уже сохранённые настройки, включая Qwen от прежней версии набора, не очищаются автоматически. Если текущей модели или её авторизации нет, recap не переключается на другую модель.
65
86
 
66
- Recap не передаёт уровень reasoning; адаптер GigaChat использует `off`. Явные параметры тела запроса в настройках провайдера могут его переопределить. Таймаут запроса — штатные 4 секунды: конфиг recap его не меняет, а `GIGACHAT_TIMEOUT` не переопределяет явно заданный расширением лимит. Автоматическое резюме создаётся после 5 минут бездействия. Модель основной сессии выбирается независимо.
87
+ Таймаут запроса recap — 60 секунд; задержка автоматического резюме после бездействия — 2 минуты. Recap не наследует thinking основной сессии и не передаёт уровень reasoning: для GigaChat это означает `off`, не меняя режим основного чата. Явные параметры тела запроса провайдера могут переопределить это поведение. Для других провайдеров и моделей отключение reasoning зависит от возможностей их адаптеров. `GIGACHAT_TIMEOUT` не переопределяет явно переданный recap лимит.
67
88
 
68
89
  `elapsed` показывает время полного запроса в индикаторе `Working...`, включая все шаги агента и вызовы инструментов. Счётчик обнуляется для следующего запроса и исчезает после завершения. Работает только в TUI, не заменяет powerline footer и не требует настройки.
69
90
 
@@ -91,7 +112,7 @@ GigaChat обновляется независимо от версии набо
91
112
 
92
113
  Явно закреплённый пользователем источник GigaChat сохраняется. При удалении набора отдельная запись GigaChat остаётся; её можно удалить стандартным `pi remove npm:@dev-sergeev/pi-gigachat`. Установка с `-l` пока не проверена.
93
114
 
94
- Отдельная запись GigaChat загружается как самостоятельный пакет со своей политикой. В версии 0.4.0 он устанавливает основную модель Qwen при первой активации версии; это поведение самого провайдера, независимо от настройки recap. Datalab Kit не переписывает исходники самостоятельно установленного GigaChat.
115
+ GigaChat загружается через штатную точку входа как внутри набора, так и через отдельную запись пакета. Для 0.6.1 настройка подключений и моделей выполняется интерактивным `/gigachat`; прежние утверждения о встроенных GLM/Qwen и автоматическом default `gigachat/Qwen3.5-397b` относились к 0.5.1 и к этой версии неприменимы. Datalab Kit не переписывает исходники GigaChat, не очищает авторизацию или сохранённые подключения. Дополнительный провайдер DataLab не меняет текущую модель или defaults. Модель recap настраивается независимо.
95
116
 
96
117
  ## Разработка
97
118
 
@@ -102,6 +123,6 @@ npm run typecheck
102
123
  npm test
103
124
  ```
104
125
 
105
- `build` применяет проверяемые адаптации к локальным permission-system, plan-mode, subagents и значению default-модели recap перед упаковкой. Номера версий и единственность каждого места изменения проверяются; несовпадение завершает сборку с ошибкой. Адаптации не меняют глобально установленные пакеты. Интеграционный тест использует изолированный каталог агента и локальный реестр npm, устанавливает настоящий архив штатной командой Pi и проверяет штатное обновление.
126
+ `build` применяет проверяемые адаптации к локальным permission-system, plan-mode, subagents и recap перед упаковкой. Для recap адаптируются наследование модели сессии, подпись пункта `Use default` и таймаут 60 секунд; исходный конфиг пользователя не переписывается. Номера версий и единственность каждого места изменения проверяются; несовпадение завершает сборку с ошибкой. Устаревшие выходные модули удаляются. Адаптации не меняют глобально установленные пакеты. Интеграционный тест использует изолированный каталог агента и локальный реестр npm, устанавливает настоящий архив штатной командой Pi и проверяет штатное обновление.
106
127
 
107
128
  Тесты запускаются последовательно с `--liftoff-only`, чтобы оптимизирующая компиляция WASM-парсера bash не исчерпывала память в ограниченной среде CI. Параметр относится к тестовому процессу; запуск пользователя не меняется.
@@ -0,0 +1,2 @@
1
+ import type { ExtensionAPI } from '@earendil-works/pi-coding-agent';
2
+ export default function registerDataLab(pi: ExtensionAPI, extensionPath: string): Promise<void>;
@@ -0,0 +1,45 @@
1
+ import { createProvider } from '@earendil-works/pi-ai';
2
+ import { pathToFileURL } from 'node:url';
3
+ export default async function registerDataLab(pi, extensionPath) {
4
+ const baseUrl = process.env.GIGACHAT_API_URL?.trim();
5
+ const apiKey = process.env.JPY_API_TOKEN?.trim();
6
+ if (!baseUrl || !apiKey)
7
+ return;
8
+ // Pi may load an independently updated managed installation, not our dependency.
9
+ const { streamSimpleGigaChat } = await import(pathToFileURL(extensionPath).href);
10
+ const models = [
11
+ { id: 'glm-5.2', name: 'GLM 5.2', contextWindow: 200000, maxTokens: 64000 },
12
+ { id: 'Qwen3.5-397b', name: 'Qwen 3.5 397B', contextWindow: 262144, maxTokens: 32768 },
13
+ ].map(model => ({
14
+ ...model,
15
+ provider: 'DataLab',
16
+ api: 'gigachat-extension-api',
17
+ baseUrl,
18
+ input: ['text'],
19
+ reasoning: true,
20
+ thinkingLevelMap: { off: 'off', minimal: null, low: 'low', medium: 'medium', high: 'high', xhigh: null, max: null },
21
+ // Unknown USD prices; zero is not a free-tier claim.
22
+ cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
23
+ }));
24
+ const stream = (model, context, options = {}) => streamSimpleGigaChat(model, context, {
25
+ ...options,
26
+ apiKey,
27
+ // A saved credential or legacy GigaChat env must not redirect DataLab.
28
+ env: { ...options.env, GIGACHAT_BASE_URL: baseUrl },
29
+ });
30
+ pi.registerProvider(createProvider({
31
+ id: 'DataLab',
32
+ name: 'DataLab',
33
+ models,
34
+ auth: {
35
+ apiKey: {
36
+ name: 'JPY_API_TOKEN',
37
+ async resolve({ signal }) {
38
+ signal.throwIfAborted();
39
+ return { auth: { apiKey, baseUrl }, source: 'JPY_API_TOKEN' };
40
+ },
41
+ },
42
+ },
43
+ api: { stream, streamSimple: stream },
44
+ }));
45
+ }
package/dist/extension.js CHANGED
@@ -2,22 +2,17 @@ import { getAgentDir } from '@earendil-works/pi-coding-agent';
2
2
  import { fileURLToPath, pathToFileURL } from 'node:url';
3
3
  import { resolve } from 'node:path';
4
4
  import { gigaChatExtensionPath, hasConfiguredGigaChat, managedAgentDir, registerGigaChat } from './install.js';
5
- import { configureRecapDefault } from './recap.js';
5
+ import registerDataLab from './datalab-provider.js';
6
6
  export default async function datalabKit(pi) {
7
7
  const packageRoot = fileURLToPath(new URL('../', import.meta.url));
8
8
  const agentDir = getAgentDir();
9
- await configureRecapDefault(agentDir);
10
9
  const configured = await hasConfiguredGigaChat(agentDir);
10
+ await registerDataLab(pi, gigaChatExtensionPath(packageRoot));
11
11
  // On the first load, provide GigaChat immediately. Later Pi discovers the
12
12
  // standalone source itself, so the provider must not be registered twice.
13
13
  if (!configured) {
14
14
  const provider = await import(pathToFileURL(gigaChatExtensionPath(packageRoot)).href);
15
- // The standalone package also sets the main model on first activation.
16
- // The kit supplies only its provider, preserving the user's session choice.
17
- if (provider.gigachatProvider)
18
- pi.registerProvider(provider.gigachatProvider);
19
- else
20
- await provider.default(pi);
15
+ await provider.default(pi);
21
16
  }
22
17
  if (!configured && managedAgentDir(packageRoot) === resolve(agentDir)) {
23
18
  pi.on('session_start', async () => {
@@ -1,3 +1,5 @@
1
1
  # Пользовательские настройки имеют приоритет
2
2
 
3
3
  Datalab Kit поставляет настройки как значения по умолчанию, а уже заданные пользователем значения имеют приоритет, включая правила разрешений и предел числа субагентов. Выбрали этот подход вместо обязательного применения политики набора, чтобы установка готового набора дополняла конфигурацию пользователя и сохраняла его явные решения. Следствие: настройки набора не являются неизменяемыми ограничениями и могут быть переопределены пользователем.
4
+
5
+ Уточнение от 2026-10-12: приоритет относится к значениям, задаваемым самим Datalab Kit. Набор сохраняет штатное поведение `pi-gigachat`, включая собственное назначение модели по умолчанию этим пакетом; он может менять сохранённые настройки основной модели по своей политике. Datalab Kit не добавляет отдельного назначения модели и не очищает существующие конфиги recap или авторизацию.
@@ -14,6 +14,12 @@ Pi 0.85.1 загружает ресурсы из `pi.extensions`, но не пр
14
14
 
15
15
  Дополнение от 2026-10-02: схема доставки распространяется ещё на четыре фиксированных компонента — recap, elapsed, toggle-skills и mention-skill (всего одиннадцать). Recap получает Qwen через свой штатный конфиг при отсутствии явного выбора модели. Сборка также меняет только встроенное значение default-модели, чтобы штатный `Use default` возвращал Qwen без перезапуска; таймаут сохраняется. При подключении GigaChat самим набором используется экспорт `gigachatProvider`, чтобы standalone-обработчик провайдера не менял выбранную основную модель.
16
16
 
17
+ Пересмотр от 2026-10-12: назначения моделей со стороны набора отменены. Datalab Kit не создаёт конфиг recap и не подменяет его встроенную default-модель; сохранённые конфиги не очищаются. При подключении GigaChat вызывается штатная default-точка входа расширения вместо регистрации только `gigachatProvider`. Это сохраняет мастер `/gigachat`, авторизацию, встроенные модели и собственную инициализацию default-модели пакета. Решение принято вместо фильтрации моделей и подавления upstream-обработчиков: набор должен сохранять базовое поведение `pi-gigachat`, а не задавать ему вторую политику. Recap остаётся независимым от основной модели сессии; наследование не входит в изменение.
18
+
19
+ Пересмотр от 2026-10-14: пользователь согласовал наследование текущей модели основной сессии для recap при отсутствии отдельного выбора. Явный конфиг recap имеет приоритет, а `Use default` немедленно возвращает наследование. При отсутствии текущей модели или её авторизации другая модель автоматически не выбирается. Сборка адаптирует recap 0.4.7: разрешение default-модели через контекст сессии, подпись picker и таймаут 60 секунд. Конфиги пользователя не изменяются. Уровень thinking основной сессии не наследуется и не переключается; отсутствие request-level reasoning оставляет GigaChat в `off`, если параметры провайдера не переопределяют тело запроса. Штатное поведение самого `pi-gigachat` остаётся без изменений.
20
+
21
+ Дополнительное согласование от 2026-10-14: задержка автоматического recap после бездействия сокращена с 5 до 2 минут. Таймаут отдельного запроса остаётся 60 секунд.
22
+
17
23
  GigaChat остаётся зависимостью `latest`. При явной установке postinstall проверяет актуальную версию, устанавливает её в управляемый каталог Pi и добавляет незакреплённый источник. При первой активации расширение восстанавливает запись, которую установщик Pi мог затереть; загрузка не выполняет сетевых запросов. До появления отдельной записи провайдер подключается через расширение набора. После её появления его загружает Pi самостоятельно.
18
24
 
19
25
  ## Последствия и пределы
@@ -0,0 +1,11 @@
1
+ # ADR 0003: Отдельный провайдер DataLab из окружения
2
+
3
+ Status: accepted for implementation
4
+
5
+ В `pi-gigachat` 0.6.1 `/gigachat` — интерактивный мастер, а не программный интерфейс настройки через аргументы. Для подключения из окружения Datalab Kit владеет отдельным нативным провайдером с идентификатором и именем `DataLab`, повторно используя публичный stream/adapter upstream. Штатная точка входа GigaChat, мастер, сохранённые подключения и настройки пользователя остаются без изменений; код upstream не патчится и мастер не автоматизируется.
6
+
7
+ Провайдер регистрируется только при непустых после trim `GIGACHAT_API_URL` и `JPY_API_TOKEN` в окружении процесса Pi. URL задаёт корень API, включая нужный префикс вроде `/v1`, без `/chat/completions`; токен передаётся как Bearer и не сохраняется в `auth.json` или настройках. Окружение задаётся до запуска Pi, `.env` автоматически не загружается, новые значения требуют перезапуска. Регистрация не проверяет сервер и не выполняет пробных генераций: ошибки возвращаются при обычном запросе пользователя.
8
+
9
+ Datalab Kit задаёт только дополнительный фиксированный каталог: `glm-5.2 [DataLab]` (ID `glm-5.2`, контекст 200000, вывод 64000) и `Qwen3.5-397b [DataLab]` (ID `Qwen3.5-397b`, контекст 262144, вывод 32768), с reasoning maps соответствующих моделей upstream 0.5.1. Регистрация не выбирает текущую модель и не меняет сохранённые defaults.
10
+
11
+ Компромисс: набор отвечает за этот фиксированный каталог и совместимость с публичным адаптером, зато не зависит от автоматизации интерактивного мастера, не хранит секреты и не вводит собственный транспорт. Это ограниченно пересматривает запрет собственной политики моделей из [ADR 0002](0002-package-delivery.md) только для дополнительного DataLab; штатное поведение upstream и независимые настройки recap остаются вне этого пересмотра.
@@ -1,3 +1,5 @@
1
+ // Datalab Kit adaptation
2
+
1
3
  import type { AgentMessage } from "@earendil-works/pi-agent-core"
2
4
  import type { Message } from "@earendil-works/pi-ai"
3
5
  import type { AutocompleteItem } from "@earendil-works/pi-tui"
@@ -35,8 +37,8 @@ import {
35
37
  } from "./tui.js"
36
38
 
37
39
  const RECAP_MAX_TOKENS = 160
38
- const RECAP_REQUEST_TIMEOUT_MS = 4_000
39
- const AWAY_RECAP_DELAY_MS = 5 * 60 * 1_000
40
+ const RECAP_REQUEST_TIMEOUT_MS = 60_000
41
+ const AWAY_RECAP_DELAY_MS = 2 * 60 * 1_000
40
42
  const RECAP_ENTRY_TYPE = "pi-recap:state"
41
43
 
42
44
  interface PersistedRecapState {
@@ -1,3 +1,5 @@
1
+ // Datalab Kit adaptation
2
+
1
3
  import type { ExtensionContext, Theme } from "@earendil-works/pi-coding-agent"
2
4
  import {
3
5
  Input,
@@ -8,7 +10,6 @@ import {
8
10
  type Focusable,
9
11
  } from "@earendil-works/pi-tui"
10
12
  import {
11
- DEFAULT_RECAP_MODEL,
12
13
  formatRecapModelKey,
13
14
  type RecapModelPreference,
14
15
  } from "./models.js"
@@ -42,7 +43,7 @@ class RecapModelPicker implements Component, Focusable {
42
43
  this.items = [
43
44
  {
44
45
  label: "Use default",
45
- description: formatRecapModelKey(DEFAULT_RECAP_MODEL),
46
+ description: "Current session model",
46
47
  },
47
48
  ...models.map((model) => ({
48
49
  label: formatRecapModelKey(model),
@@ -40,11 +40,6 @@ export type ResolvedRecapModelAuth =
40
40
  readonly source: "configured" | "default"
41
41
  }
42
42
 
43
- export const DEFAULT_RECAP_MODEL: RecapModelPreference = {
44
- provider: "gigachat",
45
- id: "Qwen3.5-397b",
46
- }
47
-
48
43
  interface RecapConfig extends Record<string, unknown> {
49
44
  model?: unknown
50
45
  }
@@ -146,14 +141,16 @@ export async function getRecapModelAuth(
146
141
  }
147
142
  }
148
143
 
149
- const defaultAuth = await getModelAuth(ctx, DEFAULT_RECAP_MODEL)
144
+ const defaultAuth = ctx.model
145
+ ? await getModelAuth(ctx, ctx.model)
146
+ : undefined
150
147
  if (defaultAuth) {
151
148
  return { status: "ok", auth: defaultAuth, source: "default" }
152
149
  }
153
150
 
154
151
  return {
155
152
  status: "unauthenticated",
156
- model: DEFAULT_RECAP_MODEL,
153
+ model: ctx.model,
157
154
  source: "default",
158
155
  }
159
156
  }
@@ -0,0 +1,21 @@
1
+ {
2
+ 'variables': {
3
+ 'NAPI_VERSION%': "<!(node -p \"process.env.NAPI_VERSION || process.versions.napi\")",
4
+ 'disable_deprecated': "<!(node -p \"process.env['npm_config_disable_deprecated']\")"
5
+ },
6
+ 'conditions': [
7
+ ['NAPI_VERSION!=""', { 'defines': ['NAPI_VERSION=<@(NAPI_VERSION)'] } ],
8
+ ['NAPI_VERSION==2147483647', { 'defines': ['NAPI_EXPERIMENTAL', 'NODE_API_EXPERIMENTAL_NO_WARNING'] } ],
9
+ ['disable_deprecated=="true"', {
10
+ 'defines': ['NODE_ADDON_API_DISABLE_DEPRECATED']
11
+ }],
12
+ ['OS=="mac"', {
13
+ 'cflags+': ['-fvisibility=hidden'],
14
+ 'xcode_settings': {
15
+ 'OTHER_CFLAGS': ['-fvisibility=hidden']
16
+ }
17
+ }]
18
+ ],
19
+ 'cflags': [ '-Werror', '-Wall', '-Wextra', '-Wpedantic', '-Wunused-parameter' ],
20
+ 'cflags_cc': [ '-Werror', '-Wall', '-Wextra', '-Wpedantic', '-Wunused-parameter' ]
21
+ }
@@ -0,0 +1,25 @@
1
+ {
2
+ 'defines': [ 'NAPI_CPP_EXCEPTIONS' ],
3
+ 'cflags!': [ '-fno-exceptions' ],
4
+ 'cflags_cc!': [ '-fno-exceptions' ],
5
+ 'conditions': [
6
+ ["OS=='win'", {
7
+ "defines": [
8
+ "_HAS_EXCEPTIONS=1"
9
+ ],
10
+ "msvs_settings": {
11
+ "VCCLCompilerTool": {
12
+ "ExceptionHandling": 1,
13
+ 'EnablePREfast': 'true',
14
+ },
15
+ },
16
+ }],
17
+ ["OS=='mac'", {
18
+ 'xcode_settings': {
19
+ 'GCC_ENABLE_CPP_EXCEPTIONS': 'YES',
20
+ 'CLANG_CXX_LIBRARY': 'libc++',
21
+ 'MACOSX_DEPLOYMENT_TARGET': '10.7',
22
+ },
23
+ }],
24
+ ],
25
+ }