kingkont 0.7.50 → 0.7.52

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/main.js CHANGED
@@ -576,7 +576,14 @@ ipcMain.handle('window:close', () => {
576
576
  // Renderer уведомляет нас об открытом проекте — нужно чтобы win.on('close')
577
577
  // решал: возврат в welcome или реальный quit.
578
578
  let projectOpen = false;
579
- ipcMain.on('project:state', (_e, isOpen) => { projectOpen = !!isOpen; });
579
+ ipcMain.on('project:state', (_e, isOpen) => {
580
+ const next = !!isOpen;
581
+ if (next === projectOpen) return;
582
+ projectOpen = next;
583
+ // Пересобираем меню — пункты «Новая сцена/персонаж/локация» и весь
584
+ // подпункт «Правка» должны переключить enabled-состояние.
585
+ buildMenu();
586
+ });
580
587
  ipcMain.handle('window:minimize', () => {
581
588
  if (!win || win.isDestroyed()) return;
582
589
  // На macOS hide() убирает окно но оставляет приложение в Dock —
@@ -636,14 +643,17 @@ function buildMenu() {
636
643
  {
637
644
  label: 'Новая сцена',
638
645
  accelerator: 'CmdOrCtrl+N',
646
+ enabled: projectOpen,
639
647
  click: () => trigger('#newEpisode'),
640
648
  },
641
649
  {
642
650
  label: 'Новый персонаж',
651
+ enabled: projectOpen,
643
652
  click: () => trigger('#newCharacter'),
644
653
  },
645
654
  {
646
655
  label: 'Новая локация',
656
+ enabled: projectOpen,
647
657
  click: () => trigger('#newLocation'),
648
658
  },
649
659
  { type: 'separator' },
@@ -666,14 +676,17 @@ function buildMenu() {
666
676
  },
667
677
  {
668
678
  label: 'Правка',
679
+ // Все пункты «Правка» имеют смысл только когда открыт проект —
680
+ // undo/redo относятся к canvas mutations, cut/copy/paste юзаются
681
+ // в нодах. На welcome/settings/updates окнах пункты disabled.
669
682
  submenu: [
670
- { label: 'Отменить', click: () => sendToRenderer('menu:undo') },
671
- { label: 'Повторить', click: () => sendToRenderer('menu:redo') },
683
+ { label: 'Отменить', enabled: projectOpen, click: () => sendToRenderer('menu:undo') },
684
+ { label: 'Повторить', enabled: projectOpen, click: () => sendToRenderer('menu:redo') },
672
685
  { type: 'separator' },
673
- { role: 'cut' },
674
- { role: 'copy' },
675
- { role: 'paste' },
676
- { role: 'selectAll' },
686
+ { role: 'cut', enabled: projectOpen },
687
+ { role: 'copy', enabled: projectOpen },
688
+ { role: 'paste', enabled: projectOpen },
689
+ { role: 'selectAll', enabled: projectOpen },
677
690
  ],
678
691
  },
679
692
  {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "kingkont",
3
- "version": "0.7.50",
3
+ "version": "0.7.52",
4
4
  "description": "KingKont \u00b7 Chatium \u2014 \u043d\u043e\u0434-\u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440 \u0441\u0446\u0435\u043d \u0441 AI-\u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0435\u0439 (\u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438/\u0432\u0438\u0434\u0435\u043e/\u0433\u043e\u043b\u043e\u0441/SFX/\u043c\u0443\u0437\u044b\u043a\u0430/\u0442\u0435\u043a\u0441\u0442)",
5
5
  "main": "main.js",
6
6
  "bin": {
package/renderer/board.js CHANGED
@@ -1136,19 +1136,14 @@ async function selectBoard(board) {
1136
1136
 
1137
1137
  // =============================================================================
1138
1138
  // External file watcher (FSAH polling).
1139
- // FSAH не имеет нативного file-watch API — поллим scene.json's lastModified.
1140
- // Если mtime новее чем lastDiskMtime (который мы обновляем при каждом своём
1141
- // write) — кто-то правил scene.json извне.
1139
+ // FSAH не имеет нативного file-watch API — поллим scene.json's lastModified
1140
+ // раз в EXTERNAL_POLL_MS. Если mtime новее чем lastDiskMtime (который мы
1141
+ // обновляем при каждом своём write) — кто-то правил scene.json извне.
1142
1142
  // • dirty=false → тихо перечитать и перерендерить
1143
1143
  // • dirty=true → confirm() «перечитать с диска? текущие правки утеряются»
1144
- //
1145
- // Интервал адаптивный: когда окно в фокусе — 300мс (юзер видит изменения
1146
- // от skill/CLI почти моментально, прогрессивно: добавил ноду — увидел).
1147
- // Когда вкладка скрыта — 3 сек (экономим CPU, юзер всё равно не смотрит).
1148
1144
  // =============================================================================
1149
1145
 
1150
- const EXTERNAL_POLL_MS_ACTIVE = 300;
1151
- const EXTERNAL_POLL_MS_HIDDEN = 3000;
1146
+ const EXTERNAL_POLL_MS = 3000;
1152
1147
  let _externalWatchTimer = null;
1153
1148
  let _externalReloadInFlight = false;
1154
1149
 
@@ -1163,23 +1158,11 @@ function stopExternalWatcher() {
1163
1158
  if (_externalWatchTimer) { clearInterval(_externalWatchTimer); _externalWatchTimer = null; }
1164
1159
  }
1165
1160
 
1166
- function _currentPollInterval() {
1167
- return document.hidden ? EXTERNAL_POLL_MS_HIDDEN : EXTERNAL_POLL_MS_ACTIVE;
1168
- }
1169
-
1170
1161
  function startExternalWatcher() {
1171
1162
  stopExternalWatcher();
1172
- _externalWatchTimer = setInterval(checkExternalChanges, _currentPollInterval());
1163
+ _externalWatchTimer = setInterval(checkExternalChanges, EXTERNAL_POLL_MS);
1173
1164
  }
1174
1165
 
1175
- // При смене visibility пересоздаём timer с новым интервалом.
1176
- document.addEventListener('visibilitychange', () => {
1177
- if (_externalWatchTimer) {
1178
- stopExternalWatcher();
1179
- _externalWatchTimer = setInterval(checkExternalChanges, _currentPollInterval());
1180
- }
1181
- });
1182
-
1183
1166
  async function checkExternalChanges() {
1184
1167
  if (_externalReloadInFlight) return;
1185
1168
  if (!state.currentBoard?.handle) { stopExternalWatcher(); return; }
package/skill/SKILL.md CHANGED
@@ -152,9 +152,9 @@ kingkont gen <project> <board> --kind=text --name=name \
152
152
 
153
153
  ## ⚠️ Изменения визуально — добавляй ноды по одной
154
154
 
155
- Если открыто приложение KingKont, оно поллит `scene.json` каждые 300мс
155
+ Если открыто приложение KingKont, оно поллит `scene.json` каждые 3 сек
156
156
  и автоматически перерисовывает холст когда обнаруживает внешнюю правку.
157
- Это значит **юзер видит каждую новую ноду как только ты её добавил**.
157
+ Это значит **юзер видит каждую новую ноду в течение нескольких секунд**.
158
158
 
159
159
  Поэтому когда нужно добавить несколько нод — **не батчи их в один скрипт**,
160
160
  запускай `kingkont add-node` (или `gen`) по одной команде за раз. Между
@@ -163,7 +163,7 @@ kingkont gen <project> <board> --kind=text --name=name \
163
163
  ✅ Хорошо (юзер видит появление каждой ноды):
164
164
  ```bash
165
165
  kingkont add-node <project> <board> --kind=text --name=intro --text="..."
166
- # (юзер видит ноду на холсте через ~300мс)
166
+ # (юзер видит ноду на холсте в течение нескольких секунд)
167
167
  kingkont add-node <project> <board> --kind=text --name=dialog --text="..."
168
168
  # (видит вторую)
169
169
  kingkont add-node <project> <board> --kind=text --name=outro --text="..."