kingkont 0.7.67 → 0.7.69

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "kingkont",
3
- "version": "0.7.67",
3
+ "version": "0.7.69",
4
4
  "description": "KingKont · Chatium — нод-редактор сцен с AI-генерацией (картинки/видео/голос/SFX/музыка/текст)",
5
5
  "main": "main.js",
6
6
  "bin": {
package/renderer/board.js CHANGED
@@ -799,7 +799,18 @@ function _dpReadList() {
799
799
  return out;
800
800
  }
801
801
 
802
+ // Cleanup от предыдущего вызова openDefaultPromptsDialog, чтобы handler'ы
803
+ // не накапливались. Накопление было настоящим багом: если юзер закрывал
804
+ // dialog через Esc (а не «Отмена»), handler'ы оставались привязанными к
805
+ // старому item; в следующем открытии для ДРУГОЙ сцены клик Save срабатывал
806
+ // для обоих item'ов одновременно — дефолты сохранялись в обе сцены.
807
+ let _dpDialogCleanup = null;
808
+
802
809
  async function openDefaultPromptsDialog(kind, item) {
810
+ // Снимаем handler'ы прошлого открытия (если осталось).
811
+ if (typeof _dpDialogCleanup === 'function') _dpDialogCleanup();
812
+ _dpDialogCleanup = null;
813
+
803
814
  const isActive = state.currentBoard?.kind === kind && state.currentBoard.name === item.name;
804
815
  let metaSettings;
805
816
  if (isActive) {
@@ -823,8 +834,8 @@ async function openDefaultPromptsDialog(kind, item) {
823
834
  document.getElementById('defaultPromptsModal').classList.remove('hidden');
824
835
  setTimeout(() => list.querySelector('textarea')?.focus(), 30);
825
836
 
826
- // Save / Cancel / Add — навешиваем фрешевые handler'ы removeEventListener
827
- // на close, чтобы при следующем openDefaultPromptsDialog не накапливались).
837
+ // Save / Cancel / Add — handler'ы привязаны к ЭТОМУ конкретному item
838
+ // через замыкание. Cleanup гарантирует что прошлые handler'ы уже сняты.
828
839
  const saveBtn = document.getElementById('dpSave');
829
840
  const cancelBtn = document.getElementById('dpCancel');
830
841
  const addBtn = document.getElementById('dpAdd');
@@ -833,6 +844,7 @@ async function openDefaultPromptsDialog(kind, item) {
833
844
  saveBtn.removeEventListener('click', onSave);
834
845
  cancelBtn.removeEventListener('click', onCancel);
835
846
  addBtn.removeEventListener('click', onAdd);
847
+ _dpDialogCleanup = null;
836
848
  };
837
849
  const onAdd = () => {
838
850
  list.appendChild(_dpRenderItem({ id: crypto.randomUUID(), text: '', kinds: ['image'], enabled: true }));
@@ -858,6 +870,9 @@ async function openDefaultPromptsDialog(kind, item) {
858
870
  saveBtn.addEventListener('click', onSave);
859
871
  cancelBtn.addEventListener('click', onCancel);
860
872
  addBtn.addEventListener('click', onAdd);
873
+ // Сохраняем cleanup чтобы вызвать при закрытии через Esc или повторном
874
+ // openDefaultPromptsDialog (см. строку выше).
875
+ _dpDialogCleanup = cleanup;
861
876
  }
862
877
 
863
878
  // Переименовать board (папку): создать новую папку с тем же именем, перенести
@@ -287,6 +287,13 @@ async function ensureApiKey(forKind) {
287
287
  async function openGenModal(kind) {
288
288
  if (!await ensureApiKey(kind)) return;
289
289
  if (!state.currentBoard) return;
290
+ // Чистим стейт от прошлого regenerate'а (если юзер закрыл его modal через
291
+ // Esc, а не «Отмена» — глобальный Esc-handler не сбрасывает state).
292
+ // Без этого следующий submit принял бы текущую сессию за regenerate
293
+ // прошлой ноды и сгенерил бы туда вместо создания новой.
294
+ state.regenerateTarget = null;
295
+ state.pendingConnectionFrom = null;
296
+ state.sourceRef = null;
290
297
  state.genKind = kind;
291
298
  document.querySelectorAll('#genModal [data-kind]').forEach(b =>
292
299
  b.classList.toggle('active', b.dataset.kind === kind));
@@ -404,6 +404,10 @@ function closeAddMenuOnOutside(e) {
404
404
  }
405
405
 
406
406
  async function openGenerateForRef(fromNode, clientX, clientY, forceKind) {
407
+ // Чистим стейт от прошлого regenerate'а (см. комментарий в
408
+ // openGenModal — то же самое для anchor-drag flow).
409
+ state.regenerateTarget = null;
410
+ // pendingConnectionFrom выставится ниже, sourceRef — тоже.
407
411
  // forceKind — если из anchor-drop меню юзер выбрал конкретный тип.
408
412
  if (forceKind) {
409
413
  if (!await ensureApiKey(forceKind)) return;