@vnejs/docs 0.2.20 → 0.2.22

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,6 +1,24 @@
1
1
  # Changelog
2
2
 
3
- Краткая история изменений плагинов и внешнего API. Версии — релизы пакета `@vnejs/docs`.
3
+ Краткая история изменений движка (плагины, helpers, packages, CLI и прочий runtime) и внешнего API. Версии — релизы пакета `@vnejs/docs`.
4
+
5
+ ## 0.2.22
6
+
7
+ - `scenario/fastforward` — цикл автоклика в модуле `fastforward.emit`; провал `CHECK` эмитит `STOP`. `isFastforwardOn` сбрасывается через `setValue(false)` в `init`, не на `SYSTEM.STARTED`. Визиты в `shared.fastforwardStorage`; диск в `fastforward.storage`. API: `shared.fastforwardStorage`, `EVENTS.FASTFORWARD.VISIT_ADD`, модули `fastforward.emit`, `fastforward.scenario`, `fastforward.storage`.
8
+ - `core/vendors` — события `UID`, `HASH`, `DATE`, `DEBOUNCE` сняты; остались `CLONE`, `SCREEN`. Вместо них: `crypto.randomUUID()`, `hashSha256`, `formatTimestamp`, `debounce`.
9
+ - `helpers/hash-sha256` — SHA-256 объекта: `hashSha256(value, maxLength?)`; ключи канонизируются. `maxLength` пока не передают.
10
+ - `helpers/format-timestamp` — `formatTimestamp({ ts, format })`; токены `YYYY`, `MM`, `DD`, `HH`, `mm`, `ss`.
11
+ - `helpers/debounce` — `debounce({ fn, wait, maxWait, leading, trailing })`.
12
+ - `core/logs`, `text/text`, `canvas/bg`, `canvas/video`, `views.screens/history` — uid через `crypto.randomUUID()`, не `VENDORS.UID`.
13
+ - `core/scenario`, `core/state`, `scenario/fastforward` — хеш строки / visits через `hashSha256`, не `VENDORS.HASH`.
14
+ - `views.screens/save` — дата и время слота через `formatTimestamp`, не `VENDORS.DATE`.
15
+ - `platform/electron` — сохранение state через `debounce`, не `VENDORS.DEBOUNCE`.
16
+
17
+ ## 0.2.21
18
+
19
+ - `core/media` — ошибка/timeout fetch не занимает слот semaphore и не кладёт битый blob в память; `GET` не ждёт вечно и возвращает `null` для отсутствующего или битого asset.
20
+ - `core/scenario` — `LABEL_GET` / `LINE_GET` завершаются, если предзагрузка одной строки упала.
21
+ - `cli/desktop` — закрытие последнего окна завершает Electron и на macOS (Steam не держит игру запущенной); Fastify закрывается на quit, если процесс не выходит — `app.exit(0)`. API: `runServer` возвращает `{ port, close }`, `runElectron` принимает `onBeforeQuit`.
4
22
 
5
23
  ## 0.2.20
6
24
 
package/README.md CHANGED
@@ -28,7 +28,7 @@ npm i @vnejs/docs
28
28
  - [Сценарий — guide](./scenario.guide/README.md) — синтаксис `.vne` и тематические гайды
29
29
  - [Сценарий — catalog](./scenario.catalog/README.md) — каталог `$` / `%` команд
30
30
  - [Архитектура](./architecture.md) — каталоги монорепы и их связи, mermaid-диаграммы
31
- - [Changelog](./CHANGELOG.md) — изменения плагинов и API по версиям `@vnejs/docs`
31
+ - [Changelog](./CHANGELOG.md) — изменения движка и API по версиям `@vnejs/docs`
32
32
 
33
33
  ## Быстрый ориентир по монорепе
34
34
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vnejs/docs",
3
- "version": "0.2.20",
3
+ "version": "0.2.22",
4
4
  "description": "VNEJS documentation for engine consumers and coding agents",
5
5
  "files": [
6
6
  "*.md",
@@ -8,14 +8,14 @@
8
8
 
9
9
  | Ключ | Строка | Смысл |
10
10
  |------|--------|-------|
11
- | `GET` | `vne:media:get` | Получить готовый медиа-элемент: из кэша или через цепочку load. |
11
+ | `GET` | `vne:media:get` | Получить готовый медиа-элемент: из кэша или через цепочку load. Битый или отсутствующий asset → `null`, без вечного wait. |
12
12
  | `SET` | `vne:media:set` | Положить готовый DOM-элемент в memory-подсистему media. |
13
- | `LOAD` | `vne:media:load` | Запуск загрузки по id/type/name с учётом semaphore и dedup через `LOAD_CHECK`. |
13
+ | `LOAD` | `vne:media:load` | Запуск загрузки по id/type/name с учётом semaphore и dedup через `LOAD_CHECK`. Слот очереди освобождается и при ошибке. |
14
14
  | `LOAD_CHECK` | `vne:media:load_check` | Проверить: уже в памяти, в процессе process или load. |
15
15
  | `LOAD_START` | `vne:media:load_start` | Начало загрузки asset (маркер lifecycle). |
16
16
  | `LOAD_END` | `vne:media:load_end` | Окончание загрузки asset (маркер lifecycle). |
17
17
  | `ERROR_NO_SRC` | `vne:media:error_no_src` | В манифесте нет src для запрошенного asset. |
18
- | `ERROR_FETCH` | `vne:media:error_fetch` | Ошибка fetch при загрузке blob. |
18
+ | `ERROR_FETCH` | `vne:media:error_fetch` | Ошибка fetch: сеть, HTTP не-ok, timeout. Битый blob в память не кладётся. |
19
19
  | `PROCESS` | `vne:media:process` | Скачать blob, создать `<img>` / `<audio>` / `<video>`, вызвать `SET`. |
20
20
  | `PROCESS_CHECK` | `vne:media:process_check` | Есть ли уже promise/результат process для `mediaId`. |
21
21
  | `MEMORY_GET` | `vne:media:memory_get` | Прокси к `MEMORY.GET` для namespace media. |
@@ -39,10 +39,10 @@
39
39
 
40
40
  | Модуль | Зона ответственности |
41
41
  |--------|----------------------|
42
- | `media.load` | Semaphore-gated load, dedup, делегирование в process/memory. |
43
- | `media.process` | Fetch blob и создание DOM-медиа. |
42
+ | `media.load` | Semaphore-gated load, dedup, делегирование в process/memory. Слот всегда освобождается (`finally`), даже если process reject. |
43
+ | `media.process` | Fetch blob и создание DOM-медиа. HTTP не-ok и timeout fetch → `ERROR_FETCH`, без `SET`. |
44
44
  | `media.memory` | REG в memory, монтирование элементов в скрытый `#media`. |
45
- | `media` | Высокоуровневый get/set. |
45
+ | `media` | Высокоуровневый get/set. `GET` возвращает `null`, если asset нет или не готов (битая картинка, error). |
46
46
  | `media.logs` | Логирование lifecycle media. |
47
47
 
48
48
  ## Близкие плагины
@@ -11,9 +11,9 @@
11
11
  | `EXEC` | `vne:scenario:exec` | Выполнить строку сценария: dispatch по module/block с line, args и keywords. |
12
12
  | `EXEC_DELAY` | `vne:scenario:exec_delay` | Отложить promise до завершения текущего exec (async-строки). |
13
13
  | `NEXT` | `vne:scenario:next` | Шаг вперёд по сценарию: выполнить текущую строку или завершить текущую метку. |
14
- | `LABEL_GET` | `vne:scenario:label_get` | Предзагрузка строк метки на глубину `deep` с приоритетом. |
14
+ | `LABEL_GET` | `vne:scenario:label_get` | Предзагрузка строк метки на глубину `deep` с приоритетом. Упавшая строка не блокирует метку. |
15
15
  | `LINE_LOAD` | `vne:scenario:line_load` | Условная предзагрузка одной строки (с учётом depth в memory). |
16
- | `LINE_GET` | `vne:scenario:line_get` | Получить и подготовить одну строку сценария по label и index. |
16
+ | `LINE_GET` | `vne:scenario:line_get` | Получить и подготовить одну строку сценария по label и index. Ошибка предзагрузки не оставляет промис висящим. |
17
17
  | `LINE_LOAD_REG` | `vne:scenario:line_load_reg` | Зарегистрировать обработчик предзагрузки строк для module/block. |
18
18
  | `LINE_EXEC_REG` | `vne:scenario:line_exec_reg` | Зарегистрировать обработчик выполнения строк для module/block. |
19
19
  | `LINES_GET` | `vne:scenario:lines_get` | Получить массив строк метки (JSON с хоста, кэш в memory). |
@@ -48,8 +48,8 @@
48
48
  | `scenario` | Главный цикл `NEXT`, exec строк, sync state. |
49
49
  | `scenario.autostart` | Дефолт `shared.shouldAutostartScenario`; на `SYSTEM.STARTED` — init label + `emitNext` при включённом флаге. |
50
50
  | `scenario.exec` | Dispatch `$module` / `%block`, registry handlers, `EXEC_DELAY`. |
51
- | `scenario.label` | `LABEL_GET`, preload меток; init label на `STATE.CLEAR`. |
52
- | `scenario.line` | `LINE_LOAD` / `LINE_GET`, registry preload handlers. |
51
+ | `scenario.label` | `LABEL_GET`, preload меток; init label на `STATE.CLEAR`. Одна упавшая строка не валит всю метку. |
52
+ | `scenario.line` | `LINE_LOAD` / `LINE_GET`, registry preload handlers. Executor `LINE_GET` всегда resolve. |
53
53
  | `scenario.lines` | Fetch `label/<path>.json` с `HOST` (например `label/prologue/1.json`). |
54
54
 
55
55
  ## Близкие плагины
@@ -10,7 +10,7 @@
10
10
 
11
11
  - Если `group` не передан — подставляется `_` (default group).
12
12
  - `key` может содержать `:` (например settings `vne:volume:common`).
13
- - `module` может содержать `.` (например `vars.global`, `fastforward.visits`).
13
+ - `module` может содержать `.` (например `vars.global`, `fastforward.storage`).
14
14
 
15
15
  Примеры:
16
16
 
@@ -18,7 +18,7 @@
18
18
  |-------|-----------------|
19
19
  | `{ module: "settings", key: "vne:volume:common" }` | `settings/_/vne:volume:common` |
20
20
  | `{ module: "save", group: "0", key: "3" }` | `save/0/3` |
21
- | `{ module: "fastforward.visits", group: "intro", key: "hash" }` | `fastforward.visits/intro/hash` |
21
+ | `{ module: "fastforward.storage", group: "intro", key: "hash" }` | `fastforward.storage/intro/hash` |
22
22
 
23
23
  ## Диск (desktop / Steam)
24
24
 
@@ -27,7 +27,7 @@
27
27
  | `_` или не задан | `{module}.json` |
28
28
  | любая другая | `{module}/{group}.json` |
29
29
 
30
- Примеры: `settings.json`, `save/0.json`, `save/autosave.json`, `fastforward.visits/intro.json`.
30
+ Примеры: `settings.json`, `save/0.json`, `save/autosave.json`, `fastforward.storage/intro.json`.
31
31
 
32
32
  ## События
33
33
 
@@ -2,18 +2,14 @@
2
2
 
3
3
  Пакет: `@vnejs/plugins.core.vendors` · namespace: `VENDORS`
4
4
 
5
- Обёртки над сторонними утилитами: clone, hash, uuid, debounce, дата, скриншот.
5
+ Обёртки над сторонними утилитами: clone, скриншот.
6
6
 
7
7
  ## События
8
8
 
9
9
  | Ключ | Строка | Смысл |
10
10
  |------|--------|-------|
11
- | `UID` | `vne:vendors:uid` | Сгенерировать уникальный идентификатор uuid4. |
12
- | `HASH` | `vne:vendors:hash` | MD5-хеш объекта (идентификация строки сценария, проверка сохранений). |
13
- | `DATE` | `vne:vendors:date` | Форматирование timestamp через dayjs. Payload: `{ ts?, format? }`. |
14
11
  | `CLONE` | `vne:vendors:clone` | Deep clone через lodash (state, stack, args). |
15
12
  | `SCREEN` | `vne:vendors:screen` | Скриншот DOM через html2canvas → webp data URL. Payload: `{ width?, height?, quality?, id? }`. |
16
- | `DEBOUNCE` | `vne:vendors:debounce` | Вернуть lodash-debounced функцию. Payload: `{ func?, wait?, options? }`. |
17
13
 
18
14
  ## Константы
19
15
 
@@ -31,7 +27,7 @@
31
27
 
32
28
  | Модуль | Зона ответственности |
33
29
  |--------|----------------------|
34
- | `vendors` | uid, hash, clone, debounce, date. |
30
+ | `vendors` | clone. |
35
31
  | `vendors.screen` | html2canvas screenshot; на init помечает media-элементы ignore. |
36
32
 
37
33
  ## Близкие плагины
@@ -15,11 +15,14 @@
15
15
  | `EMIT_CHECK` | `vne:fastforward:emit_check` | Инициировать действие или цикл. |
16
16
  | `CHECK` | `vne:fastforward:check` | Проверить состояние или наличие ресурса. |
17
17
  | `CHANGED` | `vne:fastforward:changed` | Зафиксировать изменение состояния. |
18
+ | `VISIT_ADD` | `vne:fastforward:visit_add` | Записать визит: `shared.fastforwardStorage` + стейт и `STORAGE.SET`. Payload: `key`, `group`, поля `SCENARIO.EXEC`. |
18
19
  | `CLEAR` | `vne:fastforward:clear` | Очистить накопленное состояние. |
19
20
 
20
21
  ## Константы
21
22
 
22
- Нет.
23
+ | Ключ | Смысл |
24
+ |------|--------|
25
+ | `SOURCE` | `"fastforward"` — ключ в SourcesSet соседних плагинов. |
23
26
 
24
27
  ## Параметры
25
28
 
@@ -37,12 +40,22 @@
37
40
  | `DELAY` (`vne:fastforward:delay`) | `number` | Настройка `vne:fastforward:delay` в `shared.settings`. |
38
41
  | `ENABLED` (`vne:fastforward:enabled`) | `boolean` | Включить или выключить функцию. |
39
42
 
43
+ ## Shared
44
+
45
+ | Поле | Тип | Смысл |
46
+ |------|-----|--------|
47
+ | `isFastforwardOn` | `boolean` | Режим прокрутки включён. В `init` модуля `fastforward` сбрасывается через `setValue(false)`; дальше — `START` / `STOP` / `TOGGLE`. |
48
+ | `fastforwardStorage` | `Set<string>` | Хеши уже просмотренных строк; наполняется из `STORAGE` в `init` модуля `fastforward.storage`. |
49
+
40
50
  ## Модули
41
51
 
42
52
  | Модуль | Зона ответственности |
43
53
  |--------|----------------------|
44
- | `fastforward` | Обрабатывает STOP, START, CHECK, TOGGLE, …. |
45
- | `fastforward.visits` | Визиты в `STORAGE`: `group` = label, `key` = hash; `GET_ALL` по module без group возвращает `label/hash`, при init hash берётся из хвоста ключа. На диске: `fastforward.visits/{label}.json`. |
54
+ | `fastforward` | `STOP`, `START`, `CHECK`, `TOGGLE`; в `init` — `setValue(false)`. |
55
+ | `fastforward.emit` | Цикл `EMIT` / `EMIT_CHECK`: `CHECK` → `INTERACT.EMIT`; провал `CHECK` → `STOP`. |
56
+ | `fastforward.scenario` | `SCENARIO.EXEC` → hash стейта `fastforward.visits` и `VISIT_ADD`. |
57
+ | `fastforward.visits` | `VISIT_ADD` пишет в `shared.fastforwardStorage` и снимок стейта. `CHECK` читает Set. |
58
+ | `fastforward.storage` | `VISIT_ADD` → `STORAGE.SET` с `module` = `this.name`. `GET_ALL` / `RM_ALL` / `CLEAR`. `group` = label, `key` = hash; при init hash берётся из хвоста ключа. На диске: `fastforward.storage/{label}.json`. |
46
59
 
47
60
  ## Близкие плагины
48
61
 
@@ -53,8 +66,6 @@
53
66
  - [settings.md](../core/settings.md) — `SETTINGS`: EVENTS.INIT
54
67
  - [state.md](../core/state.md) — `STATE`: EVENTS.CLEAR, EVENTS.SET
55
68
  - [storage.md](../core/storage.md) — `STORAGE`: EVENTS.GET_ALL, EVENTS.SET, EVENTS.RM_ALL
56
- - [system.md](../core/system.md) — `SYSTEM`: EVENTS.STARTED
57
- - [vendors.md](../core/vendors.md) — `VENDORS`: EVENTS.HASH
58
69
 
59
70
  ### Остальные
60
71