@dev-sergeev/datalab-kit 0.1.3 → 0.1.4
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 +8 -0
- package/README.md +7 -7
- package/dist/extension.js +1 -8
- package/docs/adr/0001-user-settings-priority.md +2 -0
- package/docs/adr/0002-package-delivery.md +6 -0
- package/node_modules/@tifan/pi-recap/src/index.ts +4 -2
- package/node_modules/@tifan/pi-recap/src/model-picker.ts +3 -2
- package/node_modules/@tifan/pi-recap/src/models.ts +4 -7
- package/node_modules/node-addon-api/common 2.gypi +21 -0
- package/node_modules/node-addon-api/except 2.gypi +25 -0
- package/node_modules/node-addon-api/napi 2.h +3463 -0
- package/node_modules/node-addon-api/napi-inl 2.h +7250 -0
- package/node_modules/node-addon-api/napi-inl.deprecated 2.h +186 -0
- package/node_modules/node-addon-api/node_addon_api 2.gyp +42 -0
- package/node_modules/node-addon-api/node_api 2.gyp +9 -0
- package/node_modules/node-addon-api/noexcept 2.gypi +26 -0
- package/node_modules/node-addon-api/nothing 2.c +0 -0
- package/node_modules/pi-toggle-skills/toggle-skills 2.ts +316 -0
- package/node_modules/pi-toggle-skills/vitest.config 2.ts +15 -0
- package/node_modules/sprintf-js/.npmignore 2 +1 -0
- package/node_modules/sprintf-js/LICENSE 2 +24 -0
- package/node_modules/sprintf-js/README 2.md +88 -0
- package/node_modules/sprintf-js/bower 2.json +14 -0
- package/node_modules/sprintf-js/gruntfile 2.js +36 -0
- package/node_modules/sprintf-js/package 2.json +22 -0
- package/node_modules/tree-sitter-bash/tree-sitter-bash 2.wasm +0 -0
- package/node_modules/typebox/license 2 +23 -0
- package/node_modules/typebox/package 2.json +87 -0
- package/node_modules/typebox/readme 2.md +370 -0
- package/node_modules/zod/compile 2.cjs +96 -0
- package/node_modules/zod/compile 2.js +52 -0
- package/node_modules/zod/index 2.cjs +52 -0
- package/node_modules/zod/index 2.js +7 -0
- package/package.json +1 -1
- package/dist/recap.d.ts +0 -2
- package/dist/recap.js +0 -31
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,13 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.1.4 — 2026-10-14
|
|
4
|
+
|
|
5
|
+
- GigaChat загружается через штатную точку входа расширения: доступны `/login`, мастер `/gigachat`, встроенные модели и собственная политика выбора default-модели. Lockfile обновлён до `pi-gigachat` 0.5.1; зависимость остаётся `latest`.
|
|
6
|
+
- Recap без отдельной настройки использует текущую модель основной сессии, включая смену через `/model`; явный выбор recap сохраняет приоритет. `Use default` немедленно возвращает наследование.
|
|
7
|
+
- Таймаут recap увеличен до 60 секунд. Для GigaChat запросы выполняются без reasoning, если его не переопределяют параметры провайдера; thinking основной сессии не меняется.
|
|
8
|
+
- Автоматический recap запускается через 2 минуты бездействия вместо штатных 5 минут.
|
|
9
|
+
- Конфиг recap не создаётся автоматически; сохранённые настройки и авторизация не очищаются. Устаревший модуль `dist/recap` удаляется при сборке.
|
|
10
|
+
|
|
3
11
|
## 0.1.3 — 2026-10-03
|
|
4
12
|
|
|
5
13
|
- Добавлены `@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.
|
|
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,7 @@ pi install ./dev-sergeev-datalab-kit-0.1.3.tgz
|
|
|
41
41
|
|
|
42
42
|
Одиннадцать фиксированных компонентов включены в архив npm вместе с их зависимостями. GigaChat устанавливается отдельно без закрепления версии.
|
|
43
43
|
|
|
44
|
-
|
|
44
|
+
Datalab Kit загружает штатное расширение GigaChat, не заменяя его регистрацию только провайдером. Сохраняются встроенные модели и собственная политика выбора модели пакета. Для авторизации используйте `/login` → GigaChat; `/gigachat` открывает мастер подключений, авторизации и выбора моделей из каталогов серверов. Основную модель выбирают через `/model`.
|
|
45
45
|
|
|
46
46
|
## Значения по умолчанию
|
|
47
47
|
|
|
@@ -55,15 +55,15 @@ pi install ./dev-sergeev-datalab-kit-0.1.3.tgz
|
|
|
55
55
|
- Подтверждения показывает штатный диалог `@gotgenes/pi-permission-system`: разрешение одного запуска или на сессию, отказ и отказ с причиной. Настройки клавиш и повторного нажатия управляются самим расширением; собственного диалога Datalab Kit нет.
|
|
56
56
|
- Одновременно работает один субагент. Инструмент `subagent` принимает одну задачу за вызов.
|
|
57
57
|
|
|
58
|
-
Уже заданные пользователем настройки имеют
|
|
58
|
+
Уже заданные пользователем настройки имеют приоритет над значениями Datalab Kit, включая разрешения, настройки штатного диалога и число субагентов. Собственная политика установки и выбора модели GigaChat остаётся штатной; подробнее ниже. Значения разрешений и числа субагентов действуют в памяти. Настройки разрешений остаются в штатных `extensions/pi-permission-system/config.json` внутри каталога агента и `.pi/extensions/pi-permission-system/config.json` внутри проекта. Субагенты используют `<agentDir>/subagents.json` и `<project>/.pi/subagents.json`.
|
|
59
59
|
|
|
60
60
|
В **Plan mode** допустимые инструменты и команды проверяет pi-plan-mode без дополнительных подтверждений по правилам набора. Явные пользовательские `ask` и `deny` продолжают действовать; некорректная конфигурация разрешений также не обходится. После выхода из Plan mode или перехода к реализации правила набора снова действуют. Это поведение сохраняется при восстановлении сессии и смене ветки. Plan mode допускает некоторые тесты и проверки, которые могут создавать артефакты.
|
|
61
61
|
|
|
62
62
|
## Recap, время работы и навыки
|
|
63
63
|
|
|
64
|
-
`/recap` показывает краткое резюме сессии над редактором.
|
|
64
|
+
`/recap` показывает краткое резюме сессии над редактором. По умолчанию используется текущая модель основной сессии; смена через `/model` учитывается при следующем запросе recap. Явный выбор через `/recap config` имеет приоритет. Пункт `Use default` возвращает наследование модели сессии сразу, без `/reload`. Проверить выбор можно через `/recap status`. Datalab Kit не создаёт и не дополняет `<agentDir>/extensions/pi-recap.json`; уже сохранённые настройки, включая Qwen от прежней версии набора, не очищаются автоматически. Если текущей модели или её авторизации нет, recap не переключается на другую модель.
|
|
65
65
|
|
|
66
|
-
Recap не передаёт уровень reasoning
|
|
66
|
+
Таймаут запроса recap — 60 секунд; задержка автоматического резюме после бездействия — 2 минуты. Recap не наследует thinking основной сессии и не передаёт уровень reasoning: для GigaChat это означает `off`, не меняя режим основного чата. Явные параметры тела запроса провайдера могут переопределить это поведение. Для других провайдеров и моделей отключение reasoning зависит от возможностей их адаптеров. `GIGACHAT_TIMEOUT` не переопределяет явно переданный recap лимит.
|
|
67
67
|
|
|
68
68
|
`elapsed` показывает время полного запроса в индикаторе `Working...`, включая все шаги агента и вызовы инструментов. Счётчик обнуляется для следующего запроса и исчезает после завершения. Работает только в TUI, не заменяет powerline footer и не требует настройки.
|
|
69
69
|
|
|
@@ -91,7 +91,7 @@ GigaChat обновляется независимо от версии набо
|
|
|
91
91
|
|
|
92
92
|
Явно закреплённый пользователем источник GigaChat сохраняется. При удалении набора отдельная запись GigaChat остаётся; её можно удалить стандартным `pi remove npm:@dev-sergeev/pi-gigachat`. Установка с `-l` пока не проверена.
|
|
93
93
|
|
|
94
|
-
|
|
94
|
+
GigaChat загружается со своей политикой как внутри набора, так и через отдельную запись пакета. В проверенной версии 0.5.1 встроены GLM и Qwen; собственная инициализация пакета назначает основной default `gigachat/Qwen3.5-397b`, с его штатными исключениями для сохранённых частных подключений и выбора сессии. Это может изменить ранее сохранённые `defaultProvider` и `defaultModel`; Datalab Kit не блокирует такое поведение и не переписывает исходники GigaChat. Авторизация и ранее сохранённые подключения не очищаются. Модель recap настраивается независимо.
|
|
95
95
|
|
|
96
96
|
## Разработка
|
|
97
97
|
|
|
@@ -102,6 +102,6 @@ npm run typecheck
|
|
|
102
102
|
npm test
|
|
103
103
|
```
|
|
104
104
|
|
|
105
|
-
`build` применяет проверяемые адаптации к локальным permission-system, plan-mode, subagents и
|
|
105
|
+
`build` применяет проверяемые адаптации к локальным permission-system, plan-mode, subagents и recap перед упаковкой. Для recap адаптируются наследование модели сессии, подпись пункта `Use default` и таймаут 60 секунд; исходный конфиг пользователя не переписывается. Номера версий и единственность каждого места изменения проверяются; несовпадение завершает сборку с ошибкой. Устаревшие выходные модули удаляются. Адаптации не меняют глобально установленные пакеты. Интеграционный тест использует изолированный каталог агента и локальный реестр npm, устанавливает настоящий архив штатной командой Pi и проверяет штатное обновление.
|
|
106
106
|
|
|
107
107
|
Тесты запускаются последовательно с `--liftoff-only`, чтобы оптимизирующая компиляция WASM-парсера bash не исчерпывала память в ограниченной среде CI. Параметр относится к тестовому процессу; запуск пользователя не меняется.
|
package/dist/extension.js
CHANGED
|
@@ -2,22 +2,15 @@ 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';
|
|
6
5
|
export default async function datalabKit(pi) {
|
|
7
6
|
const packageRoot = fileURLToPath(new URL('../', import.meta.url));
|
|
8
7
|
const agentDir = getAgentDir();
|
|
9
|
-
await configureRecapDefault(agentDir);
|
|
10
8
|
const configured = await hasConfiguredGigaChat(agentDir);
|
|
11
9
|
// On the first load, provide GigaChat immediately. Later Pi discovers the
|
|
12
10
|
// standalone source itself, so the provider must not be registered twice.
|
|
13
11
|
if (!configured) {
|
|
14
12
|
const provider = await import(pathToFileURL(gigaChatExtensionPath(packageRoot)).href);
|
|
15
|
-
|
|
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);
|
|
13
|
+
await provider.default(pi);
|
|
21
14
|
}
|
|
22
15
|
if (!configured && managedAgentDir(packageRoot) === resolve(agentDir)) {
|
|
23
16
|
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
|
## Последствия и пределы
|
|
@@ -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 =
|
|
39
|
-
const AWAY_RECAP_DELAY_MS =
|
|
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:
|
|
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 =
|
|
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:
|
|
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
|
+
}
|