kingkont 0.7.71 → 0.7.73

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.71",
3
+ "version": "0.7.73",
4
4
  "description": "KingKont · Chatium — нод-редактор сцен с AI-генерацией (картинки/видео/голос/SFX/музыка/текст)",
5
5
  "main": "main.js",
6
6
  "bin": {
package/renderer/board.js CHANGED
@@ -1092,10 +1092,15 @@ function askName(title, placeholder = '', initialValue = '', opts = {}) {
1092
1092
  document.body.append(overlay);
1093
1093
  setTimeout(() => { inp.focus(); inp.select(); }, 30);
1094
1094
  const close = (val) => { overlay.remove(); resolve(val); };
1095
+ // Различаем «отмена» (null) и «пустая строка» (''):
1096
+ // - Cancel button / Esc / mousedown overlay → null
1097
+ // - OK button / Enter → trimmed string (может быть '')
1098
+ // Это нужно для renameNode — юзер может ОЧИСТИТЬ имя, а это
1099
+ // отдельный случай от «передумал».
1095
1100
  cancel.addEventListener('click', () => close(null));
1096
- ok.addEventListener('click', () => close(inp.value.trim() || null));
1101
+ ok.addEventListener('click', () => close(inp.value.trim()));
1097
1102
  inp.addEventListener('keydown', e => {
1098
- if (e.key === 'Enter') { e.preventDefault(); close(inp.value.trim() || null); }
1103
+ if (e.key === 'Enter') { e.preventDefault(); close(inp.value.trim()); }
1099
1104
  if (e.key === 'Escape') { e.preventDefault(); close(null); }
1100
1105
  });
1101
1106
  overlay.addEventListener('mousedown', e => { if (e.target === overlay) close(null); });
@@ -942,7 +942,9 @@ function renderLocPickSelect() {
942
942
  function syncCharLocRows() {
943
943
  const showPicker = (state.genKind === 'image' || state.genKind === 'video');
944
944
  $('charsPickRow').style.display = showPicker ? '' : 'none';
945
- $('locPickRow').style.display = showPicker ? '' : 'none';
945
+ // «Из общего» теперь только для видео — для image юзер берёт референс
946
+ // через @-mention из «Эта сцена»/общих досок (так универсальнее).
947
+ $('locPickRow').style.display = state.genKind === 'video' ? '' : 'none';
946
948
  }
947
949
 
948
950
  // Авто-предвыбор: если открываем доску персонажа/локации — пометим её сразу
@@ -1916,20 +1918,16 @@ async function mutateNode(bKey, boardHandle, nodeId, mutator) {
1916
1918
  return;
1917
1919
  }
1918
1920
  }
1919
- // Иначе — на диск напрямую
1921
+ // Иначе — на диск напрямую. Передаём ПОЛНЫЙ meta (со всеми полями), а
1922
+ // не выдёргиваем подмножество — иначе settings/history wipe'аются на
1923
+ // каждое обновление ноды во время генерации (юзер видел: defaults
1924
+ // сцены пропадают после нескольких генераций).
1920
1925
  const meta = await loadBoardMetadata(boardHandle);
1921
1926
  const node = meta.nodes.find(n => n.id === nodeId);
1922
1927
  if (!node) return;
1923
1928
  mutator(node);
1924
1929
  syncHistorySlot(node);
1925
- await saveBoardMetadata(boardHandle, {
1926
- nodes: meta.nodes,
1927
- connections: meta.connections,
1928
- view: meta.view,
1929
- character: meta.character,
1930
- location: meta.location,
1931
- timeline: meta.timeline,
1932
- });
1930
+ await saveBoardMetadata(boardHandle, meta);
1933
1931
  }
1934
1932
 
1935
1933
  function updateJobsBadge() {
package/renderer/media.js CHANGED
@@ -1479,11 +1479,9 @@ async function rememberCharTones(charNameOrVoiceId, tones) {
1479
1479
  ch.commonTones = existing;
1480
1480
  ch.lastTones = cleaned;
1481
1481
  meta.character = ch;
1482
- await saveBoardMetadata(charInfo.handle, {
1483
- nodes: meta.nodes, connections: meta.connections,
1484
- view: meta.view, character: meta.character,
1485
- location: meta.location, timeline: meta.timeline,
1486
- });
1482
+ // Передаём ПОЛНЫЙ meta (а не подмножество) чтобы не wipe'нуть
1483
+ // settings/history на диске — см. фикс в generate.js mutateNode.
1484
+ await saveBoardMetadata(charInfo.handle, meta);
1487
1485
  charInfo.commonTones = existing;
1488
1486
  charInfo.lastTones = cleaned;
1489
1487
  if (added) console.log(`[tones] +${added} → ${charInfo.name}: ${cleaned.join(', ')}`);
@@ -1582,10 +1582,9 @@ async function saveCharacterReplicas(charInfo, replicas) {
1582
1582
  const meta = await loadBoardMetadata(charInfo.handle);
1583
1583
  if (!meta.character) meta.character = {};
1584
1584
  meta.character.replicas = replicas;
1585
- await saveBoardMetadata(charInfo.handle, {
1586
- nodes: meta.nodes, connections: meta.connections,
1587
- view: meta.view, character: meta.character, timeline: meta.timeline,
1588
- });
1585
+ // Передаём ПОЛНЫЙ meta (включая settings) — иначе wipe'нем defaults
1586
+ // и history персонажа (см. фикс mutateNode в generate.js).
1587
+ await saveBoardMetadata(charInfo.handle, meta);
1589
1588
  charInfo.replicas = replicas;
1590
1589
  }
1591
1590